ts-pantry 0.10.11 → 0.10.13

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 (56) hide show
  1. package/dist/bin/cli.js +9 -8
  2. package/dist/chunk-0xfx7txg.js +1 -0
  3. package/dist/{chunk-22yfeqn3.js → chunk-4qa9dfjs.js} +3 -3
  4. package/dist/chunk-ax2wz06f.js +313 -0
  5. package/dist/{chunk-xzyv7d5n.js → chunk-byp71bz1.js} +1 -1
  6. package/dist/{chunk-58tv7cc0.js → chunk-c0pn1x0j.js} +1 -1
  7. package/dist/chunk-c7csvans.js +2 -0
  8. package/dist/{chunk-0knvy8da.js → chunk-dnw4x7bh.js} +1 -1
  9. package/dist/{chunk-t3d44dpr.js → chunk-hk7ns20y.js} +1 -1
  10. package/dist/{chunk-2pdwb50x.js → chunk-jkfbbcs7.js} +1 -1
  11. package/dist/{chunk-6e7x6std.js → chunk-py3ymxjf.js} +1 -1
  12. package/dist/{chunk-f1bj0d0n.js → chunk-qyfapvcb.js} +2 -2
  13. package/dist/chunk-sa2nn9dg.js +1 -0
  14. package/dist/chunk-tbgzzd68.js +1 -0
  15. package/dist/{chunk-9h0h2rjw.js → chunk-wavfc3dt.js} +1 -1
  16. package/dist/{chunk-jrr4wpkp.js → chunk-wcn78wgj.js} +1 -1
  17. package/dist/{chunk-3zr85kfx.js → chunk-wzw3xbn2.js} +2 -2
  18. package/dist/{chunk-rvwbbg4d.js → chunk-zg4d4yqd.js} +1 -1
  19. package/dist/packages/anthropic.com/claude-code.d.ts +1 -1
  20. package/dist/packages/apps/cursorcom.d.ts +1 -1
  21. package/dist/packages/apps/discordcom.d.ts +1 -1
  22. package/dist/packages/apps/raycastcom.d.ts +1 -1
  23. package/dist/packages/apps/rectangleapp.d.ts +1 -1
  24. package/dist/packages/apps/zeddev.d.ts +1 -1
  25. package/dist/packages/aux4io.d.ts +1 -1
  26. package/dist/packages/certbotefforg.d.ts +1 -1
  27. package/dist/packages/cnqueryio.d.ts +1 -1
  28. package/dist/packages/denoland.d.ts +1 -1
  29. package/dist/packages/depotdev.d.ts +1 -1
  30. package/dist/packages/dozzledev.d.ts +1 -1
  31. package/dist/packages/dprintdev.d.ts +1 -1
  32. package/dist/packages/flyio.d.ts +1 -1
  33. package/dist/packages/github.com/ggerganov/llama.cpp.d.ts +1 -1
  34. package/dist/packages/github.com/shaka-project/shaka-packager.d.ts +1 -1
  35. package/dist/packages/libgeosorg.d.ts +1 -1
  36. package/dist/packages/materializecom.d.ts +1 -1
  37. package/dist/packages/misejdxdev.d.ts +1 -1
  38. package/dist/packages/nginxorg.d.ts +1 -1
  39. package/dist/packages/ohmyposhdev.d.ts +1 -1
  40. package/dist/packages/opencodeai.d.ts +1 -1
  41. package/dist/packages/openshiftcom.d.ts +1 -1
  42. package/dist/packages/pnpmio.d.ts +1 -1
  43. package/dist/packages/prefixdev.d.ts +1 -1
  44. package/dist/packages/projenio.d.ts +1 -1
  45. package/dist/packages/rucio.cern.ch/rucio-client.d.ts +1 -1
  46. package/dist/packages/traefikio.d.ts +1 -1
  47. package/dist/packages/tursotech.d.ts +1 -1
  48. package/dist/packages/werfio.d.ts +1 -1
  49. package/dist/packages/ziglangorg.d.ts +1 -1
  50. package/dist/src/index.js +1 -1
  51. package/dist/src/testing/index.js +1 -0
  52. package/package.json +4 -3
  53. package/dist/chunk-ax48nzbg.js +0 -1
  54. package/dist/chunk-exna5ztv.js +0 -2
  55. package/dist/chunk-wk0mrxvx.js +0 -1
  56. package/dist/chunk-zb7ytjww.js +0 -313
@@ -0,0 +1,313 @@
1
+ import{Ab as yX}from"./chunk-jkfbbcs7.js";import{Ib as a,Kb as yQ}from"./chunk-qyfapvcb.js";import{$b as CX,Ub as LX,Vb as jX,Yb as TX,Zb as kQ,bc as RX,cc as IX,dc as fQ}from"./chunk-wzw3xbn2.js";import{ic as z4}from"./chunk-c7csvans.js";import{jc as qQ,kc as X0}from"./chunk-dnw4x7bh.js";import{oc as n}from"./chunk-ghzc37v7.js";import Z0 from"node:process";X0();import _X from"node:process";function qX(Q){return Q in qQ}function $0(Q){if(!Q.includes(".")||Q.startsWith(".")||Q.endsWith("."))return!1;if(/^v?\d+(\.\d+){0,10}$/.test(Q))return!1;return/^[a-z0-9][\w.\-/]*$/i.test(Q)}function _4(Q){return qX(Q)||$0(Q)}function q4(Q){return["darwin","linux","windows"].includes(Q)}function B4(Q){return["x86_64","aarch64","armv7l","i686"].includes(Q)}function BX(){return Object.keys(qQ)}function w4(){return Object.values(qQ)}function L4(Q){if(qX(Q))return{originalName:Q,resolvedDomain:qQ[Q],isAlias:!0};return{originalName:Q,resolvedDomain:Q,isAlias:!1}}function j4(Q){let X=Q.lastIndexOf("@");if(X===-1)return{name:Q};let $=Q.slice(0,X),Z=Q.slice(X+1);return{name:$,version:Z,versionSpec:Z}}function T4(Q,X){return X?`${Q}@${X}`:Q}function jQ(){let Q=_X.platform,X=_X.arch,$,Z,W=!0;switch(Q){case"darwin":$="darwin";break;case"linux":$="linux";break;case"win32":$="windows";break;default:$="linux",W=!1}switch(X){case"x64":Z="x86_64";break;case"arm64":Z="aarch64";break;case"arm":Z="armv7l";break;case"ia32":Z="i686";break;default:Z="x86_64",W=!1}return{platform:$,architecture:Z,isSupported:W}}function C4(Q,X="latest",$){let Z=$||jQ(),W;switch(Z.platform){case"darwin":W="tar.xz";break;case"linux":W="tar.xz";break;case"windows":W="zip";break;default:W="tar.xz"}return{packageName:Q,version:X,platform:Z.platform,architecture:Z.architecture,format:W}}var R4={LATEST:"latest",ANY:"*"},wX={RUNTIME:["nodejs.org","python.org","go.dev","rust-lang.org"],BUILD_TOOLS:["cmake.org","ninja-build.org","gradle.org","maven.apache.org"],DATABASES:["postgresql.org","mysql.com","redis.io","mongodb.com"],EDITORS:["neovim.io","vim.org","code.visualstudio.com"],CLI_TOOLS:["cli.github.com","curl.se","wget.gnu.org","jq.dev"]};function I4(Q){return wX[Q]}function E4(Q,X){return wX[X].includes(Q)}function F4(Q){return Q}function M4(Q,X){return[Q,X]}function S4(Q){return Q}async function b4(Q){try{let X=await kQ(Q);if(!X)return{success:!1,error:`Package '${Q}' not found. Use 'search' to find available packages.`};return{success:!0,data:X}}catch(X){return{success:!1,error:`Failed to get package info: ${X}`}}}async function y4(Q){try{if(!Q||Q.trim().length===0)return{success:!1,error:"Search term cannot be empty"};return{success:!0,data:await CX(Q.trim())}}catch(X){return{success:!1,error:`Search failed: ${X}`}}}async function P4(Q=20){try{return{success:!0,data:(await RX(Q)).slice(0,Q)}}catch(X){return{success:!1,error:`Failed to list popular packages: ${X}`}}}async function D4(Q=20){try{return{success:!0,data:await IX(Q)}}catch(X){return{success:!1,error:`Failed to list active packages: ${X}`}}}function u4(){try{return{success:!0,data:BX()}}catch(Q){return{success:!1,error:`Failed to list aliases: ${Q}`}}}async function v4(Q){try{let X=await fQ(Q);if(!X.isValid)return{success:!1,error:X.error};return{success:!0,data:{packageName:X.packageName,version:X.version,isValid:!0}}}catch(X){return{success:!1,error:`Validation failed: ${X}`}}}async function h4(Q){try{let X=await fQ(Q);if(!X.isValid)return{success:!1,error:X.error};let $=X.packageName,Z=X.version||"latest",W=await TX($,Z);if(!W)return{success:!1,error:`Could not resolve version '${Z}' for package '${$}'`};let H=await kQ($);if(!H)return{success:!1,error:`Package '${$}' not found`};let U=jQ(),J={packageName:$,resolvedVersion:W,platform:U.platform,architecture:U.architecture,dependencies:H.dependencies,companions:H.companions,installCommand:`pkgx install ${$}@${W}`},Y=[];if(!U.isSupported)Y.push(`Platform ${U.platform}/${U.architecture} may not be fully supported`);if(H.dependencies.length>0)Y.push(`This package has ${H.dependencies.length} dependencies that will also be installed`);return{success:!0,data:J,warnings:Y.length>0?Y:void 0}}catch(X){return{success:!1,error:`Failed to create install plan: ${X}`}}}async function k4(Q){try{let X=await LX(Q);if(!X)return{success:!1,error:`Package '${Q}' not found`};let $=await jX(Q);return{success:!0,data:{latest:X,total:$.length,versions:$}}}catch(X){return{success:!1,error:`Failed to get version info: ${X}`}}}function f4(Q){let X=[`Package: ${Q.name}`,`Domain: ${Q.domain}`,`Description: ${Q.description}`,`Latest Version: ${Q.latestVersion}`,`Total Versions: ${Q.totalVersions}`];if(Q.programs.length>0)X.push(`Programs: ${Q.programs.join(", ")}`);if(Q.dependencies.length>0)X.push(`Dependencies: ${Q.dependencies.join(", ")}`);if(Q.companions.length>0)X.push(`Companions: ${Q.companions.join(", ")}`);return X.join(`
2
+ `)}function g4(Q){if(Q.length===0)return"No packages found matching your search.";let X=[`Found ${Q.length} package(s):
3
+ `];for(let $ of Q)X.push(`${$.name} (${$.domain})`),X.push(` ${$.description}`),X.push(` Latest: ${$.latestVersion} (${$.totalVersions} versions available)`),X.push("");return X.join(`
4
+ `)}function m4(Q){let X=[`Installation Plan for ${Q.packageName}@${Q.resolvedVersion}`,`Platform: ${Q.platform}/${Q.architecture}`,`Command: ${Q.installCommand}`];if(Q.dependencies.length>0)X.push(`Dependencies: ${Q.dependencies.join(", ")}`);if(Q.companions.length>0)X.push(`Companions: ${Q.companions.join(", ")}`);return X.join(`
5
+ `)}function d4(){try{let Q=jQ();return{success:!0,data:{platform:Q.platform,architecture:Q.architecture,isSupported:Q.isSupported,nodeVersion:Z0.version}}}catch(Q){return{success:!1,error:`Failed to get system info: ${Q}`}}}import HQ from"node:fs";import CQ from"node:path";function RQ(Q){if(!HQ.existsSync(Q))throw Error(`Dependency file not found: ${Q}`);let X=HQ.readFileSync(Q,"utf-8"),$=[],Z=X.split(`
6
+ `),W=!1,H=!1,U=0;for(let J of Z){let Y=J.trim();if(!Y||Y.startsWith("#"))continue;if(J.match(/^(dependencies|deps):\s*$/)){W=!0,H=!1,U=J.search(/\S/);continue}if(J.match(/^global:\s*true\s*$/)||J.match(/^global:\s*$/)&&!W){H=!0;continue}if(J.match(/^\w+:/)&&!J.includes(" ")&&W&&U===0){W=!1;continue}if(W||H){if(J.match(/^\s+(dependencies|deps):\s*$/))continue;let G=J.indexOf(":");if(G>0){let z=J.substring(0,G).trim(),O=J.substring(G+1).trim();if(z&&O){let K=z,L=O.replace(/^['"]|['"]$/g,"");if(K==="global"||K==="dependencies"||K==="deps")continue;let _=L,q=L;if(L.startsWith("^"))_=L.substring(1),q=L;else if(L.startsWith("~"))_=L.substring(1),q=L;else if(L.startsWith(">=")||L.startsWith("<=")||L.startsWith(">")||L.startsWith("<")){let B=/^([><=]+)/.exec(L);if(B){let w=B[1];_=L.substring(w.length).trim(),q=L}}else if(L==="*"||L==="latest")_="latest",q="*";else _=L,q=`@${L}`;$.push({name:K,version:_,constraint:q,isOsSpecific:!1})}}}}return $}function W0(Q){if(!HQ.existsSync(Q))throw Error(`Dependency file not found: ${Q}`);let X=HQ.readFileSync(Q,"utf-8"),$=RQ(Q),Z;try{let W=typeof Bun<"u"&&Bun.YAML?Bun.YAML.parse(X):J0(X);if(W?.services){let H=Array.isArray(W.services.autoStart)?W.services.autoStart.map((U)=>String(U)):[];if(H.length>0)Z={enabled:W.services.enabled===!0,autoStart:H}}}catch{}return{dependencies:$,services:Z}}function J0(Q){let X={},$=Q.split(`
7
+ `),Z=!1,W=!1,H=[],U=!1;for(let J of $){let Y=J.trim();if(!Y||Y.startsWith("#"))continue;if(J.match(/^services:\s*$/)){Z=!0,W=!1;continue}if(Z&&!J.startsWith(" ")&&!J.startsWith("\t")&&!Y.startsWith("-")){if(Y!=="services:"){Z=!1,W=!1;continue}}if(Z){if(Y.startsWith("enabled:")){U=Y.includes("true");continue}if(Y.match(/^autoStart:\s*$/)){W=!0;continue}if(W&&Y.startsWith("- ")){let G=Y.slice(2).trim();if(G)H.push(G)}}}if(H.length>0)X.services={enabled:U,autoStart:H};return X}async function n4(Q,X="src/packages"){try{let $;if(Q.includes("/"))$=CQ.join(X,`${Q}.ts`);else{let z=`${Q.replace(/\./g,"")}.ts`;$=CQ.join(X,z)}if(!HQ.existsSync($))return[];let Z=HQ.readFileSync($,"utf-8"),W=Z.indexOf("versions:");if(W===-1)return[];let H=Z.substring(W),U=H.indexOf("["),J=H.indexOf("] as const");if(U===-1||J===-1)return[];let G=H.substring(U+1,J).match(/'([^']+)'/g);if(!G)return[];return G.map((z)=>z.replace(/'/g,""))}catch{return[]}}async function H0(Q){try{let{packages:X}=await import("./chunk-tbgzzd68.js").catch(()=>import("./src/index.js")),$=Q.replace(/[^a-z0-9]/gi,"").toLowerCase(),Z=X[$];if(!Z){let W=Object.values(X);Z=W.find((H)=>H.domain===Q)||W.find((H)=>Array.isArray(H.aliases)&&H.aliases.includes(Q))}if(Z&&Z.versions&&Array.isArray(Z.versions))return Z.versions;return[]}catch{return[]}}async function EX(Q,X){let $=await H0(Q);if($.length===0)return X.split("#")[0].trim().replace(/^[@^~>=<]+/,"")||"latest";let Z=X.split("#")[0].trim();if(Z==="*"||Z==="latest")return $[0];if(Z.startsWith("@")){let H=Z.slice(1);return $.includes(H)?H:$[0]}return U0($,Z)||$[0]}function U0(Q,X){if(X.startsWith("^")){let $=X.slice(1),[Z]=YQ($);return Q.filter((H)=>{let[U]=YQ(H);return U===Z&&JQ(H,$)>=0})[0]||null}if(X.startsWith("~")){let $=X.slice(1),[Z,W]=YQ($);return Q.filter((U)=>{let[J,Y]=YQ(U);return J===Z&&Y===W&&JQ(U,$)>=0})[0]||null}if(X.startsWith(">=")){let $=X.slice(2).trim();return Q.filter((W)=>JQ(W,$)>=0)[0]||null}if(X.startsWith(">")){let $=X.slice(1).trim();return Q.filter((W)=>JQ(W,$)>0)[0]||null}if(X.startsWith("<=")){let $=X.slice(2).trim();return Q.filter((W)=>JQ(W,$)<=0)[0]||null}if(X.startsWith("<")){let $=X.slice(1).trim();return Q.filter((W)=>JQ(W,$)<0)[0]||null}if(X.startsWith("=")){let $=X.slice(1).trim();return Q.includes($)?$:null}return Q.includes(X)?X:null}function YQ(Q){let X=Q.split(".").map(($)=>{let Z=$.match(/^\d+/);return Z?Number.parseInt(Z[0],10):0});return[X[0]||0,X[1]||0,X[2]||0]}function JQ(Q,X){if(Q==="latest"&&X!=="latest")return 1;if(X==="latest"&&Q!=="latest")return-1;if(Q==="latest"&&X==="latest")return 0;let $=Q.split("#")[0].trim(),Z=X.split("#")[0].trim(),[W,H,U]=YQ($),[J,Y,G]=YQ(Z);if(W>J)return 1;if(W<J)return-1;if(H>Y)return 1;if(H<Y)return-1;if(U>G)return 1;if(U<G)return-1;return 0}var TQ=null;async function Y0(){if(TQ)return TQ;return TQ=(await import("./chunk-tbgzzd68.js").catch(()=>import("./src/index.js"))).packages,TQ}async function G0(Q){try{let X=await Y0(),$=X[Q];if($)return{dependencies:$.dependencies||[],companions:$.companions||[]};let Z=Q.replace(/[^a-z0-9]/gi,"").toLowerCase(),W=X[Z];if(W)return{dependencies:W.dependencies||[],companions:W.companions||[]};let U=Object.values(X).find((J)=>J.domain===Q);if(U)return{dependencies:U.dependencies||[],companions:U.companions||[]};return null}catch(X){return console.warn(`Failed to load package data for ${Q}: ${X}`),null}}async function IQ(Q,X={},$=new Set,Z=0){let{maxDepth:W=10,verbose:H=!1,targetOs:U,includeOsSpecific:J=!0}=X;if(Z>W){if(H)console.warn(` Warning: max dependency depth (${W}) exceeded for ${Q}`);return[]}if($.has(Q))return[];if($.add(Q),H)console.log(`${" ".repeat(Z)}Resolving dependencies for: ${Q}`);let Y=[];try{let z=function(_){let q=_.match(/^(linux|darwin|windows):(.+)$/),B=!!q,w=q?q[2]:_,I=q?q[1]:void 0;if(B&&(!J||U&&I!==U))return null;let C=w,T="latest",j="*",R=w.match(/^(@?[^@^~>=<]+(?:\/[^@^~>=<]+)?)([@^~>=<].+)?$/);if(R){if(C=R[1],R[2]){let E=R[2];if(E.startsWith("@"))T=E.substring(1),j=E;else j=E,T=E.replace(/^\D*/,"")}}return{dep:{name:C,version:T,constraint:j,isOsSpecific:B,os:I},pkgName:C}},G=await G0(Q),K=[...G?.dependencies||[],...G?.companions||[]].map(z).filter((_)=>_!==null);for(let{dep:_}of K)Y.push(_);let L=await Promise.allSettled(K.map(({pkgName:_})=>IQ(_,X,$,Z+1)));for(let _ of L)if(_.status==="fulfilled")Y.push(..._.value);else if(H)console.warn(` Warning: transitive dependency resolution failed: ${_.reason}`)}catch(G){if(H)console.warn(`${" ".repeat(Z)}Warning: Could not resolve dependencies for ${Q}: ${G}`)}return Y}async function gQ(Q,X={}){let $=new Map,Z=[],W={linux:[],darwin:[],windows:[]};for(let J of Q){if(!$.has(J.name))$.set(J.name,[]);if($.get(J.name).push(J),J.isOsSpecific&&J.os)W[J.os].push(J)}let H=[],U=[];for(let[J,Y]of $)if(Y.length===1){let G=await EX(J,Y[0].constraint),z={...Y[0],version:G};H.push(z),U.push(J)}else{let G=Y.map((_)=>_.version),z=[...new Set(G)];if(z.length>1)Z.push({package:J,versions:z});let O=await Promise.all(Y.map(async(_)=>({..._,resolvedVersion:await EX(J,_.constraint)}))),K=O[0];for(let _ of O.slice(1))if(K.constraint==="*"&&_.constraint!=="*")K=_;else if(K.constraint!=="*"&&_.constraint==="*");else if(JQ(_.resolvedVersion,K.resolvedVersion)>0)K=_;let L={...K,version:K.resolvedVersion};delete L.resolvedVersion,H.push(L),U.push(J)}return{allDependencies:H,uniquePackages:U,conflicts:Z,osSpecificDeps:W}}async function FX(Q,X={}){let{verbose:$=!1}=X;if($)console.log(`Parsing dependency file: ${Q}`);let Z=RQ(Q);if($)console.log(`Found ${Z.length} direct dependencies`);let W=[...Z],H=await Promise.all(Z.map(async(Y)=>{if($)console.log(`Resolving transitive dependencies for: ${Y.name}`);return IQ(Y.name,X)}));for(let Y of H)W.push(...Y);if($)console.log(`Total dependencies found (before deduplication): ${W.length}`);let U=await gQ(W,X);if($){if(console.log(`Unique packages after deduplication: ${U.uniquePackages.length}`),U.conflicts.length>0)console.log(`Version conflicts found: ${U.conflicts.length}`)}let J=CQ.extname(Q);if(J===".yaml"||J===".yml"){let Y=W0(Q);if(Y.services)U.services=Y.services}return U}function o4(Q){let X=["deps.yaml","deps.yml","dependencies.yaml","dependencies.yml","pkgx.yaml","pkgx.yml",".deps.yaml",".deps.yml"],$=[];for(let Z of X){let W=CQ.join(Q,Z);if(HQ.existsSync(W))$.push(W)}return $}import*as S from"node:fs";import*as u from"node:path";import*as t from"node:os";import*as mQ from"node:https";import*as dQ from"node:http";import{execFileSync as EQ}from"node:child_process";function MQ(){let Q=process.env.XDG_DATA_HOME,X=Q&&Q.length>0?Q:u.join(t.homedir(),".local","share");return u.join(X,"pantry","global","bin")}function cQ(){let Q=t.platform(),X=t.arch();return{os:Q==="darwin"?"darwin":Q==="win32"?"windows":"linux",arch:X==="arm64"?"aarch64":"x86_64"}}var BQ={"github.com/mail-os/mail":{getDownloadUrl(Q,X){if(X.os!=="linux"||X.arch!=="x86_64")throw Error("github.com/mail-os/mail currently publishes linux-x86_64 release binaries");let $={darwin:"macos",linux:"linux",windows:"windows"},Z=`mail-${X.arch}-${$[X.os]}`;return`https://github.com/mail-os/mail/releases/download/v${Q}/${Z}.tar.gz`},getArchiveFormat(){return"tar.gz"},getBinaries(Q){let X={darwin:"macos",linux:"linux",windows:"windows"};return[`mail-${Q.arch}-${X[Q.os]}`,"mail"]}},"ziglang.org":{getDownloadUrl(Q,X){let $={x86_64:"x86_64",aarch64:"aarch64"},Z={darwin:"macos",linux:"linux",windows:"windows"},W=$[X.arch],H=Z[X.os],U=X.os==="windows"?"zip":"tar.xz";if(Q.includes("-dev"))return`https://ziglang.org/builds/zig-${W}-${H}-${Q}.${U}`;return`https://ziglang.org/download/${Q}/zig-${W}-${H}-${Q}.${U}`},getArchiveFormat(Q){return Q.os==="windows"?"zip":"tar.xz"},getBinaries(Q){return Q.os==="windows"?["zig.exe"]:["zig"]},getArchivePrefix(Q,X){let $={x86_64:"x86_64",aarch64:"aarch64"},Z={darwin:"macos",linux:"linux",windows:"windows"};return`zig-${$[X.arch]}-${Z[X.os]}-${Q}`}},"bun.sh":{getDownloadUrl(Q,X){let $={"darwin-aarch64":"darwin-aarch64","darwin-x86_64":"darwin-x64","linux-aarch64":"linux-aarch64","linux-x86_64":"linux-x64","windows-x86_64":"windows-x64"},Z=`${X.os}-${X.arch}`,W=$[Z]||"linux-x64";return`https://github.com/oven-sh/bun/releases/download/bun-v${Q}/bun-${W}.zip`},getArchiveFormat(){return"zip"},getBinaries(Q){return Q.os==="windows"?["bun.exe"]:["bun","bunx"]},getArchivePrefix(Q,X){let $={"darwin-aarch64":"bun-darwin-aarch64","darwin-x86_64":"bun-darwin-x64","linux-aarch64":"bun-linux-aarch64","linux-x86_64":"bun-linux-x64","windows-x86_64":"bun-windows-x64"},Z=`${X.os}-${X.arch}`,W=$[Z];if(!W)throw Error(`Unsupported platform for bun: ${Z}`);return W}},"nodejs.org":{getDownloadUrl(Q,X){let $={darwin:"darwin",linux:"linux",windows:"win"},Z={x86_64:"x64",aarch64:"arm64"},W=X.os==="windows"?"zip":"tar.xz";return`https://nodejs.org/dist/v${Q}/node-v${Q}-${$[X.os]}-${Z[X.arch]}.${W}`},getArchiveFormat(Q){return Q.os==="windows"?"zip":"tar.xz"},getBinaries(Q){return Q.os==="windows"?["node.exe","npm.cmd","npx.cmd"]:["node","npm","npx"]},getArchivePrefix(Q,X){let $={darwin:"darwin",linux:"linux",windows:"win"},Z={x86_64:"x64",aarch64:"arm64"};return`node-v${Q}-${$[X.os]}-${Z[X.arch]}`}}};function MX(Q,X,$,Z){S.mkdirSync($,{recursive:!0});let W=null;for(let H of X){let U=u.join(Q,H);if(!S.existsSync(U))U=u.join(Q,"bin",H);if(!S.existsSync(U)){if(W){let Y=u.join($,H);try{S.unlinkSync(Y)}catch{}if(Z.os==="windows")S.copyFileSync(W,Y);else S.symlinkSync(W,Y)}continue}if(!W)W=U;let J=u.join($,H);try{S.unlinkSync(J)}catch{}if(Z.os==="windows")S.copyFileSync(U,J);else S.symlinkSync(U,J)}}async function VX(Q,X,$={}){let Z=$.platform||cQ(),W=BQ[Q];if(!W)throw Error(`Unknown package: ${Q}. Supported: ${Object.keys(BQ).join(", ")}`);if(/^[\^~>=<]/.test(X))X=await B0(Q,X);else if(X==="latest"||X==="*"||!X)X=await lQ(Q);else if(Q==="ziglang.org"&&X.endsWith("-dev")){let q=await K0(X);if(q)X=q}if(!X)throw Error(`Could not resolve a concrete version for ${Q} (got empty string from resolver)`);let H=$.installDir||u.join(process.cwd(),"pantry"),U=u.join(H,".bin"),J=u.join(H,Q.replace(/\./g,"-"),X),Y=W.getBinaries(Z);if(Y.length===0)throw Error(`No binaries defined for ${Q} on ${Z.os}-${Z.arch}`);let G=u.join(J,Y[0]),z=u.join(J,"bin",Y[0]);if(S.existsSync(G)||S.existsSync(z)){if(!$.quiet)console.log(` ✓ ${Q}@${X} (cached)`);if($.createBinLinks!==!1)MX(J,Y,U,Z);let q=SX(J,Y,Z,$);return{name:Q,version:X,installPath:J,binaries:Y,globalLinks:q}}let O=W.getDownloadUrl(X,Z),K=W.getArchiveFormat(Z);if(!$.quiet)console.log(` → ${Q}@${X} from ${new URL(O).hostname}`);let L=S.mkdtempSync(u.join(t.tmpdir(),"pantry-")),_=u.join(L,`archive.${K}`);try{await AX(O,_,10,$.quiet??!1);let q=u.join(L,"extracted");S.mkdirSync(q,{recursive:!0}),await w0(_,q,K);let B=q,w=W.getArchivePrefix?.(X,Z);if(w){let C=u.join(q,w);if(S.existsSync(C))B=C;else{let j=S.readdirSync(q).find((R)=>S.statSync(u.join(q,R)).isDirectory());if(j)B=u.join(q,j)}}if(S.mkdirSync(J,{recursive:!0}),L0(B,J),Z.os!=="windows")for(let C of Y){let T=u.join(J,C);if(S.existsSync(T))S.chmodSync(T,493);let j=u.join(J,"bin",C);if(S.existsSync(j))S.chmodSync(j,493)}if($.createBinLinks!==!1)MX(J,Y,U,Z);if(!$.quiet)console.log(` ✓ ${Q}@${X}`);let I=SX(J,Y,Z,$);return{name:Q,version:X,installPath:J,binaries:Y,globalLinks:I}}finally{try{S.rmSync(L,{recursive:!0,force:!0})}catch{}}}function SX(Q,X,$,Z){if(!Z.globalBin)return[];let W=typeof Z.globalBin==="string"?Z.globalBin:MQ();S.mkdirSync(W,{recursive:!0});let H=[];for(let U of X){let J=u.join(Q,U);if(!S.existsSync(J))J=u.join(Q,"bin",U);if(!S.existsSync(J))continue;let Y=u.join(W,U);try{S.unlinkSync(Y)}catch{}if($.os==="windows")S.copyFileSync(J,Y);else S.symlinkSync(J,Y);H.push(Y)}if(!Z.quiet&&H.length>0)console.log(` → linked ${H.length} binary(ies) into ${W}`);return H}async function z0(Q,X={}){return Promise.all(Q.map(($)=>VX($.domain,$.version,X)))}async function lQ(Q){if(Q==="bun.sh"){let $=(await i("https://api.github.com/repos/oven-sh/bun/releases/latest").catch(()=>null))?.tag_name?.replace(/^bun-v/,"")||"";if($)return $;let Z=await FQ(Q);if(Z)return Z;throw Error("Failed to resolve latest bun.sh version (GitHub API unreachable, no bundled metadata)")}if(Q==="ziglang.org"){let $=(await i("https://ziglang.org/download/index.json").catch(()=>null))?.master?.version;if($)return $;let Z=await FQ(Q);if(Z)return Z;throw Error("Failed to resolve latest ziglang.org version")}if(Q==="nodejs.org"){let $=await i("https://nodejs.org/dist/index.json").catch(()=>null)||[],W=($.find((U)=>U.lts)?.version||$[0]?.version||"").replace(/^v/,"");if(W)return W;let H=await FQ(Q);if(H)return H;throw Error("Failed to resolve latest nodejs.org version")}if(Q==="github.com/mail-os/mail"){let $=(await i("https://api.github.com/repos/mail-os/mail/releases/latest").catch(()=>null))?.tag_name?.replace(/^v/,"")||"";if($)return $;let W=((await i("https://api.github.com/repos/mail-os/mail/tags?per_page=1").catch(()=>null))?.[0]?.name||"").replace(/^v/,"");if(W)return W;let H=await FQ(Q);if(H)return H;throw Error("Failed to resolve latest github.com/mail-os/mail version")}throw Error(`Cannot resolve latest version for ${Q}`)}async function FQ(Q){try{let X=Q.replace(/[^a-z0-9]/gi,"").toLowerCase(),{packages:$}=await import("./chunk-tbgzzd68.js").catch(()=>import("./src/index.js")),W=$[X]?.versions||[];return W.find((H)=>!H.includes("-"))||W[0]||""}catch{return""}}async function K0(Q){try{let $=(await i("https://ziglang.org/download/index.json")).master?.version;if($&&$.startsWith(Q))return $}catch{}return null}function O0(Q,X,$,Z){if(Q.includes("-")&&!Z.includes("-"))return!1;let W=Q.split(".").map(Number);if(W.some(Number.isNaN))return!1;let[H,U,J]=[W[0]||0,W[1]||0,W[2]||0],[Y,G,z]=[$[0]||0,$[1]||0,$[2]||0];if(X==="^"){if(Y===0)return H===0&&U===G&&J>=z;return H===Y&&(U>G||U===G&&J>=z)}if(X==="~")return H===Y&&U===G&&J>=z;if(X===">=")return H>Y||H===Y&&U>G||H===Y&&U===G&&J>=z;return!1}async function _0(Q){if(Q==="bun.sh")return(await i("https://api.github.com/repos/oven-sh/bun/releases?per_page=100").catch(()=>null)||[]).map((Z)=>(Z.tag_name||"").replace(/^bun-v/,"")).filter(Boolean);if(Q==="nodejs.org")return(await i("https://nodejs.org/dist/index.json").catch(()=>null)||[]).map((Z)=>(Z.version||"").replace(/^v/,"")).filter(Boolean);return[]}function q0(Q,X){let $=Q.split(".").map(Number),Z=X.split(".").map(Number);for(let W=0;W<Math.max($.length,Z.length);W++){let H=(Z[W]||0)-($[W]||0);if(H)return H}return 0}async function B0(Q,X){let $=X.match(/^([~^>=<]+)(\d+(?:\.\d+){0,10})/);if(!$)return lQ(Q);let Z=$[1],W=$[2],H=W.split(".").map(Number),U;try{let G=Q.replace(/[^a-z0-9]/gi,"").toLowerCase(),{packages:z}=await import("./chunk-tbgzzd68.js").catch(()=>import("./src/index.js"));U=z[G]?.versions||[]}catch{U=[]}let J=await _0(Q),Y=[...new Set([...J,...U])].sort(q0);for(let G of Y)if(O0(G,Z,H,W))return G;throw Error(`No version of ${Q} satisfies "${X}" (checked ${Y.length} version${Y.length===1?"":"s"}${Y.length>0?`, newest ${Y[0]}`:""}).`)}function AX(Q,X,$=10,Z=!1){return new Promise((W,H)=>{let U=S.createWriteStream(X),J=Q.startsWith("https")?mQ.get:dQ.get,Y=!Z&&process.stderr.isTTY,G=Date.now(),z=0,O=0,K=0,L=60000,_=J(Q,(w)=>{if(w.statusCode&&w.statusCode>=300&&w.statusCode<400&&w.headers.location){U.close();try{S.unlinkSync(X)}catch{}if($<=0)return H(Error(`Too many redirects for ${Q}`));return AX(w.headers.location,X,$-1,Z).then(W,H)}if(!w.statusCode||w.statusCode<200||w.statusCode>=300){U.close();try{S.unlinkSync(X)}catch{}return H(Error(`HTTP ${w.statusCode||"unknown"} downloading ${Q}`))}let I=w.headers["content-length"];if(I)O=Number.parseInt(I,10)||0;w.on("data",(C)=>{if(G=Date.now(),z+=C.length,Y&&G-K>200){K=G;let T=(z/1048576).toFixed(1);if(O>0){let j=(O/1048576).toFixed(1),R=Math.floor(z/O*100);process.stderr.write(`\r ${T}/${j} MB (${R}%)`)}else process.stderr.write(`\r ${T} MB`)}}),w.pipe(U),w.on("error",(C)=>{U.close();try{S.unlinkSync(X)}catch{}H(C)}),U.on("finish",()=>{if(U.close(),Y&&K>0)process.stderr.write("\r\x1B[K");W()}),U.on("error",(C)=>{try{S.unlinkSync(X)}catch{}H(C)})});_.on("error",(w)=>{U.close();try{S.unlinkSync(X)}catch{}H(w)});let q=setInterval(()=>{if(Date.now()-G>L)clearInterval(q),_.destroy(Error(`Download stalled (no data for ${L/1000}s): ${Q}`))},5000),B=()=>clearInterval(q);U.once("finish",B),U.once("error",B),_.once("error",B)})}async function w0(Q,X,$){if($==="zip")if(process.platform==="win32")EQ("powershell",["-NoProfile","-Command","Expand-Archive","-Path",Q,"-DestinationPath",X,"-Force"],{stdio:"pipe"});else EQ("unzip",["-o","-q",Q,"-d",X],{stdio:"pipe"});else if($==="tar.xz")EQ("tar",["xJf",Q,"-C",X],{stdio:"pipe"});else if($==="tar.gz")EQ("tar",["xzf",Q,"-C",X],{stdio:"pipe"});else throw Error(`Unsupported archive format: ${$}`)}function L0(Q,X){S.cpSync(Q,X,{recursive:!0})}function i(Q,X=5){return new Promise(($,Z)=>{let W=Q.startsWith("https")?mQ.get:dQ.get,H={"User-Agent":"pantry-installer",Accept:"application/json"};if(Q.includes("api.github.com")){let J=process.env.GITHUB_TOKEN||process.env.GH_TOKEN;if(J)H.Authorization=`Bearer ${J}`}let U=W(Q,{headers:H,timeout:30000},(J)=>{if(J.statusCode&&J.statusCode>=300&&J.statusCode<400&&J.headers.location){if(X<=0)return Z(Error(`Too many redirects for ${Q}`));return i(J.headers.location,X-1).then($,Z)}if(!J.statusCode||J.statusCode<200||J.statusCode>=300)return Z(Error(`HTTP ${J.statusCode||"unknown"} fetching ${Q}`));let Y="";J.on("data",(G)=>Y+=G),J.on("end",()=>{try{$(JSON.parse(Y))}catch(G){Z(G)}})});U.on("error",Z),U.on("timeout",()=>{U.destroy(),Z(Error(`Request timed out: ${Q}`))})})}function j0(Q){return Q in BQ}function s4(){return Object.keys(BQ)}function t4(Q){let X=BQ[Q];if(!X)return;let $=cQ();return X.getBinaries($)[0]}import*as g from"node:fs";import*as AQ from"node:os";import*as UQ from"node:path";var SQ="# >>> pantry shell-init >>>",VQ="# <<< pantry shell-init <<<";function xQ(){let Q=process.env.SHELL??"";if(Q.endsWith("/zsh")||Q==="zsh")return"zsh";if(Q.endsWith("/bash")||Q==="bash")return"bash";if(Q.endsWith("/fish")||Q==="fish")return"fish";return"unknown"}function pQ(Q){let X=AQ.homedir();switch(Q){case"zsh":{let $=process.env.ZDOTDIR;return UQ.join($&&$.length>0?$:X,".zshrc")}case"bash":{if(AQ.platform()==="darwin"){let $=UQ.join(X,".bash_profile");if(g.existsSync($))return $}return UQ.join(X,".bashrc")}case"fish":return UQ.join(X,".config","fish","config.fish");case"unknown":return null}}function xX(Q={}){let X=Q.globalBin??MQ();if((Q.shell??xQ())==="fish")return[SQ,`if test -d "${X}"`,` set -gx PATH "${X}" $PATH`,"end",VQ,""].join(`
8
+ `);return[SQ,`if [ -d "${X}" ] && [[ ":$PATH:" != *":${X}:"* ]]; then`,` export PATH="${X}:$PATH"`,"fi",VQ,""].join(`
9
+ `)}function T0(Q={}){let X=Q.shell??xQ(),$=pQ(X);if(!$)throw Error(`Could not detect a supported shell (got SHELL=${process.env.SHELL??"<unset>"}). Run \`ts-pantry shell-init\` and copy the printed snippet into your rc file manually.`);let Z=xX({...Q,shell:X}),W="";if(g.existsSync($)){if(W=g.readFileSync($,"utf-8"),W.includes(SQ))return{rcFile:$,shell:X,changed:!1}}else g.mkdirSync(UQ.dirname($),{recursive:!0});let H=W.length>0&&!W.endsWith(`
10
+ `)?`
11
+
12
+ `:`
13
+ `;return g.appendFileSync($,H+Z),{rcFile:$,shell:X,changed:!0}}function C0(Q={}){let X=Q.shell??xQ(),$=pQ(X);if(!$||!g.existsSync($))return{rcFile:$??"<none>",shell:X,changed:!1};let Z=g.readFileSync($,"utf-8"),W=Z.indexOf(SQ);if(W===-1)return{rcFile:$,shell:X,changed:!1};let H=Z.indexOf(VQ,W);if(H===-1)return{rcFile:$,shell:X,changed:!1};let U=Z.slice(H+VQ.length).replace(/^\n/,""),J=Z.slice(0,W).replace(/\n+$/,`
14
+ `);return g.writeFileSync($,J+U),{rcFile:$,shell:X,changed:!0}}import A from"node:fs";import M from"node:path";import m from"node:process";var PX=M.join(m.cwd(),"src","packages"),nQ=M.join(m.cwd(),"docs");var zQ={};async function tQ(Q){try{let X=Q||M.join(m.cwd(),"src","packages"),$=M.join(X,"index.ts");if(A.existsSync($)){console.log("Using generated index file for package mapping...");let H=await import(M.resolve($)),U=H.pantry||H.packages;if(U)return console.log(`Successfully loaded ${Object.keys(U).length} packages from index`),U}console.log("Index file not found, falling back to direct file reading...");let Z={};if(!A.existsSync(X))return console.log(`Packages directory does not exist: ${X}`),Z;let W=[];try{let H=function(U,J=""){let Y=[],G=A.readdirSync(U,{withFileTypes:!0});for(let z of G)if(z.isFile()&&z.name.endsWith(".ts")&&z.name!=="index.ts"&&z.name!=="aliases.ts")Y.push(M.join(U,z.name));else if(z.isDirectory()&&!z.name.startsWith(".")){let O=M.join(U,z.name),K=J?`${J}/${z.name}`:z.name;Y.push(...H(O,K))}return Y};W=H(X),console.log(`Found ${W.length} package files`)}catch(H){console.error(`Error reading packages directory ${X}:`,H),W=[]}console.log(`Reading package data from ${W.length} files...`);for(let H of W)try{let U=M.isAbsolute(H)?H:M.join(X,H),J=A.readFileSync(U,"utf-8"),Y=M.basename(H,".ts"),G=J.match(/domain:\s*['"]([^'"]*)['"]\s*as const/),z=G?G[1]:yQ(Y),O=a(z),K=R0(J,z);if(K)Z[O]=K,console.log(`Loaded package data for ${z} -> ${O}`)}catch(U){console.error(`Error processing file ${H}:`,U)}return console.log(`Successfully loaded ${Object.keys(Z).length} packages`),Z}catch(X){return console.error("Error importing pantry:",X),{}}}function R0(Q,X){try{let $=Q.match(/domain:\s*['"]([^'"]*)['"]\s*as const/),Z=$?$[1]:X;if(!Q.match(/export const \w+Package = \{([\s\S]*?)\}/))return console.warn(`Could not find package object in file for ${Z}`),null;let H=(T)=>{let j=new RegExp(`${T}:\\s*\\[(.*?)\\]\\s*as const`,"s"),R=Q.match(j);if(!R)return[];let E=R[1],F=E.match(/'([^']*)'/g);if(F)return F.map((V)=>V.replace(/'/g,""));if(F=E.match(/"([^"]*)"/g),F)return F.map((V)=>V.replace(/"/g,""));return[]},U=(T)=>{let R=new RegExp(`${T}:\\s*'([^']*)'\\s*as const`),E=Q.match(R);if(E)return E[1].replace(/\\'/g,"'").replace(/\\\\/g,"\\");if(R=new RegExp(`${T}:\\s*'([^']*)'`),E=Q.match(R),E)return E[1].replace(/\\'/g,"'").replace(/\\\\/g,"\\");return""},J=U("name")||Z,Y=U("description")||`A package from ${Z}`,G=U("packageYmlUrl")||"",z=U("homepageUrl")||"",O=U("githubUrl")||"",K=U("installCommand")||"",L=U("pantryInstallCommand")||`pantry install ${Z}`,_=U("fullPath")||Z,q=H("programs"),B=H("companions"),w=H("dependencies"),I=H("versions"),C=H("aliases");return{name:J,domain:Z,description:Y,packageYmlUrl:G,homepageUrl:z,githubUrl:O,installCommand:K,pantryInstallCommand:L,programs:q,companions:B,dependencies:w,versions:I,fullPath:_,aliases:C}}catch($){return console.error(`Error extracting package data for ${X}:`,$),null}}function I0(Q,X){let $=["cli","app","tool","server","client","api","lib","core","sdk","dev","bin"];if($.includes(Q.toLowerCase()))return!1;if(Q===X)return!1;let Z=X.replace(/\./g,"");if(Q===Z)return!1;if(Q.includes("--")||Q.includes("$SHELL")||Q.includes("curl")||Q.includes("sh <("))return!1;if(Q.includes(" -- ")||Q.includes(" -i")||Q.includes("+")&&Q.includes(" "))return!1;if(X.includes("/")){let H=X.split("/"),U=H[H.length-1];if($.includes(U.toLowerCase())&&Q===U)return!1}let W=["go","js","py","rb","sh","vi","cc","gc","jq","awk","sed","mc","gh"];if(Q.length<3&&!W.includes(Q.toLowerCase()))return!1;if(/^[\d.]+$/.test(Q)&&/^\d/.test(Q))return!1;if(!/[a-z]/i.test(Q))return!1;if(Q.includes("{{")||Q.includes("}}"))return!1;if(Q.includes("version.major")||Q.includes("version.minor")||Q.includes("version"))return!1;return!0}function DX(){return{"Programming Languages":["node","python","go","rust","ruby","julia","lua","luajit","php","crystal","nim","kotlin","scala","swift","zig","v","dart","ghc","ocaml","clojure","erl","elixir","R","perl","tcl","dmd","tinygo"],"Artificial Intelligence":["ollama","huggingface","openai","f2py","kaggle","jupyter","llm","stable-diffusion-webui","open-interpreter","interpreter","GPT Engineer","gPTEngineer","auto-gpt","autogpt","metagpt","MetaGPT","elizaOS","eliza","openplayground","chatblade","aichat"],Databases:["psql","mysql","mongod","mongos","mongosh","redis","sqlite3","duckdb","surreal","etcd","turso","mariadb","influx","clickhouse","neo4j","cassandra","couchdb","elasticsearch","opensearch","memcached","valkey","postgrest","litecli","edgedb","dgraph"],"Web Development":["vite","next","astro","vitepress","laravel","symfony","django","flask","fastapi","rails","spring","express","tailwindcss","svelte","ng","react","vue","nx","nuxt"],DevOps:["docker","compose","podman","kubectl","minikube","kustomize","helm","terraform","terragrunt","jenkins-lts","vault","consul","nomad","packer","ansible","ansible-lint","argocd","flux","lima","k3d","kind","tofu","atlantis","terratag","tflint","tfupdate","cfn-lint","infracost"],"Container & Kubernetes Tools":["docker","podman","kubectl","minikube","kustomize","helm","helmfile","stern","hubble","cilium","kube-linter","kubeshark","kubectl-cnpg","k9s","kubectx","kubecm","kubectl-krew","skaffold","tilt","linkerd","vcluster","istioctl","velero","kubeconform","kubebuilder","operator-sdk"],"Monitoring & Observability":["prometheus","grafana","datadog","newrelic","kibana","jaeger","zipkin","sentry","steampipe","logdy","loki","tempo","allure"],"Build Tools & Automation":["cmake","ninja","meson","scons","make","bazel","gradle","mvn","ant","task","just","autoconf","automake","pkg-config","vcpkg","buildctl","buildkit","earthly","buildifier","pants","scie-pants"],"Package Managers":["npm","npx","yarn","pnpm","bun","pip","pipenv","poetry","conda","bundler","cargo","composer","pod","nuget","brew","port","pkgx","mise","asdf","nixpacks","corepack","luarocks","rye","pdm"],"Editors & IDEs":["nvim","vim","emacs","code","vscode cli","micro","nano","alacritty","wezterm","helix"],"CLI Tools & Utilities":["ripgrep","rg","tree-sitter","fzf","bat","lsd","exa","eza","fd","fd-find","sed","awk","grep","find","jq","yq","tree","watch","htop","btop","bottom","tmux","screen","starship","oh-my-posh","fish","zsh","bash","curl","wget","ripgrep-all","rga","hyperfine","dust","du-dust","duf","ncdu","tokei","loc","delta","git-delta","difftastic","diff-so-fancy","gdu","procs","bandwhich","grex","choose","sd","dog","drill","xh","httpie","curlie"],Networking:["nginx","httpd","caddy","traefik","curl","wget","httpie","cloudflared","openssh","rsync","mosh"],"Security & Cryptography":["OpenSSL","gpg","gpg-tui","vault","bw","op","1Password CLI","1password_cli","mkcert","certbot","age","yubikey-agent","snyk","trivy","tfsec","checkov","git-crypt"],Multimedia:["ffmpeg","vips","mpv","yt-dlp","streamlink","gifsicle","exiftool","optipng","imagemagick"],"Graphics Libraries":["libsdlorg","libsdlorgsdl_image","openglorg","vulkanlunarcom","mesa3dorg","freeglutfileio","glewsourceforge","glmgtrucnet","cairographicsorg","opencvorg","vtkorg","ogre3dorg","irrlichtorg"],"Gaming & Game Development":["unitycom","unrealenginecom","godotengineorg","libsdlorg","love2dorg","rayliborg","allegro5org","defoldcom","constructnet","gamemakerio","cocos2dxorg","lutrisnet","steampipecom","epicgamescom"],"Cloud Platforms":["awsamazoncom","cloudgooglecom","azuremicrosoftcom","digitaloceancom","linodecom","vultrcom","hetznercom","cloudflarecom","netlifycom","vercelcom","herokucom","railwayapp","rendercom","flyio","planetscalecom","supabasecomcli","firebasecom","localstackcloudcli"],"Mobile Development":["reactnativedev","flutterdev","xamarincom","ionicio","cordovaapacheorg","capacitorjscom","nativescriptorg","expodev","fastlanetools","appiumio","androidcomcmdlinetools","gradleorg"],Testing:["jestjsio","mochajsorg","cypressio","seleniumdev","playwrightdev","puppeteerdev","testcafeio","pytestorg","unittestpythonorg","rspecinfo","junitorg","testngorg","webdriverio","vitestdev","avajs","jasminegjscom","karmatestrunnerorg"],Cryptocurrency:["bitcoinorg","ethereumorg","solanacom","getfoundrysh","racoonorg","elementsprojectorg","githubcom10gicvanitygenplusplus","ghostscriptcom","polkadotnetwork","avalanchenetwork","chainlinkcom","cardanoorg"],"Financial Tools":["raccoinorg","gnucashorg","ledgercliorg","beancountgooglecodecom","plaintextaccountingorg","quickencom","mintcom","ynabcom"],"Documentation & Text Processing":["pandocorg","texliveorg","latexprojectorg","asciidocorg","asciidoctororg","sphinxdocorg","mkdocsorg","gitbookcom","githubiohugohugorg","jekyllrb","docsifyjs","rustlangorgmdbook","typstapp","tectonic_typesettinggithubio","maaslalanicomslides"],"System Administration":["systemdio","crongnuorg","rsyncsambaorg","opensshcom","sudows","tmuxgithubcom","gnuorgscreen","htopdev","iostat","psmisc","procpsng","straceio","ltraceorg","lsofio","tcpdumporg","logrotateorg","monitoringpluginsorg"],"Scientific Computing":["numpyorg","scipyorg","pandasdataorg","matplotliborg","seabornpydataorg","plotlycom","jupyterorg","anacondacom","rorg","rstudiocom","octaveorg","matlabcom","mathematicawolframcom","sagemath","maxima","gnuplotorg","paravieworg","vtk"],"Embedded & IoT":["arduino","platformio","espressifcom","raspberrypiorg","mbed","freedosorg","qemuorg","openocdorg","stlink","jlinkorg","modbus","zigbeeorg","gpiozeropythonorg"],"Version Control":["git","gh","gitlab"],"Other Utilities":[]}}function uX(Q){if(zQ[Q])return zQ[Q];return Q.replace(/\W/g,"_")}function vX(Q){return Q.toLowerCase()}function NQ(Q,X,$){try{let Z=X||PX,W=$||M.join(Z,`${Q}.ts`),H=A.readFileSync(W,"utf-8"),U=H.match(/export const (\w+) = \{/),J=U?U[1]:`${Q.replace(/\W/g,"")}Package`,Y=H.match(/export type (\w+) = typeof/),G=Y?Y[1]:`${J.charAt(0).toUpperCase()}${J.slice(1)}`;return{packageVarName:J,typeName:G}}catch(Z){console.warn(`Could not read package file ${$||`${Q}.ts`}, using fallback naming:`,Z);let W=F0(Q),H=E0(Q);return{packageVarName:W,typeName:H}}}function E0(Q){if(zQ[Q]){let Z=zQ[Q];return`${Z.charAt(0).toUpperCase()}${Z.slice(1)}Package`}let $=vX(Q).replace(/\W/g,"");return`${$.charAt(0).toUpperCase()}${$.slice(1)}Package`}function F0(Q){if(zQ[Q])return`${zQ[Q]}Package`;return`${vX(Q).replace(/\W/g,"")}Package`}function M0(Q,X){let{typeName:$}=NQ(Q,X);return $}function S0(Q,X){let{packageVarName:$}=NQ(Q,X);return $}async function oQ(Q){try{console.log("\uD83D\uDD27 Generating package index...");let X=Q||PX,$=M.resolve(X,"index.ts");if(!A.existsSync(X))console.log(`Creating packages directory: ${X}`),A.mkdirSync(X,{recursive:!0});if(!A.existsSync(X))return console.error(`Failed to create packages directory: ${X}`),null;let Z=[];try{let H=function(U,J=""){let Y=[],G=A.readdirSync(U,{withFileTypes:!0});for(let z of G)if(z.isFile()&&z.name.endsWith(".ts")&&z.name!=="index.ts"&&z.name!=="aliases.ts")Y.push(M.join(U,z.name));else if(z.isDirectory()&&!z.name.startsWith(".")){let O=M.join(U,z.name),K=J?`${J}/${z.name}`:z.name;Y.push(...H(O,K))}return Y};Z=H(X),console.log(`Found ${Z.length} package files`)}catch(H){console.error(`Error reading packages directory ${X}:`,H),Z=[]}let W=`// Auto-generated package index
15
+ // Do not edit this file directly
16
+
17
+ export interface Pantry {
18
+ }
19
+
20
+ export type Packages = Pantry
21
+
22
+ export const pantry: Pantry = {
23
+ }
24
+
25
+ export const packages: Packages = pantry
26
+ `;if(Z.length>0){console.log(`Processing ${Z.length} package files...`);let H=`// Auto-generated package index
27
+ // Do not edit this file directly
28
+
29
+ `,U=`export interface Pantry {
30
+ `,J=`export const pantry: Pantry = {
31
+ `,Y=new Set,G=new Set,z=Z.sort();for(let q of z)try{let B=M.basename(q,".ts"),w=uX(B),C=M.relative(X,q).replace(/\.ts$/,"").replace(/\\/g,"/"),{packageVarName:T}=NQ(B,X,q),j=T,R=1;while(G.has(j))j=`${T}${R}`,R++;if(G.add(j),j===T)H+=`import { ${T} } from './${C}'
32
+ `;else H+=`import { ${T} as ${j} } from './${C}'
33
+ `;let E=w,F=1;while(Y.has(E))E=`${w}${F}`,F++;Y.add(E);let V=/^\d/.test(E)||!/^[a-z_$][\w$]*$/i.test(E)?`'${E}'`:E;U+=` ${V}: typeof ${j}
34
+ `,J+=` ${V}: ${j},
35
+ `;let b=A.readFileSync(q,"utf-8").match(/domain:\s*['"]([^'"]*)['"]\s*as const/),d=b?b[1]:"";if(d){let f=a(d);if(f!==E){let h=f,N=1;while(Y.has(h))h=`${f}${N}`,N++;Y.add(h);let y=/^\d/.test(h)||!/^[a-z_$][\w$]*$/i.test(h)?`'${h}'`:h;U+=` ${y}: typeof ${j}
36
+ `,J+=` ${y}: ${j},
37
+ `}}}catch(B){console.error(`Error processing file ${q}:`,B)}let O=await PQ(X),K=new Map;for(let q of z)try{let w=A.readFileSync(q,"utf-8").match(/domain:\s*['"]([^'"]*)['"]\s*as const/),I=w?w[1]:"";if(I){let C=M.basename(q,".ts"),{packageVarName:T}=NQ(C,X,q),j=T,R=1;while(G.has(j)&&j!==T)j=`${T}${R}`,R++;K.set(I,j)}}catch(B){console.error(`Error processing file for alias mapping ${q}:`,B)}for(let[q,B]of Object.entries(O).sort((w,I)=>w[0].localeCompare(I[0]))){let w=K.get(B);if(w){let I=/^\d/.test(q)||!/^[a-z_$][\w$]*$/i.test(q)?`'${q}'`:q;if(Y.has(q)){let C=I.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),T=new RegExp(`^\\s*${C}:\\s*typeof\\s+\\w+\\s*$`,"gm"),j=new RegExp(`^\\s*${C}:\\s*\\w+,\\s*$`,"gm");U=U.replace(T,""),J=J.replace(j,"")}U+=` ${I}: typeof ${w}
38
+ `,J+=` ${I}: ${w},
39
+ `,Y.add(q)}}U+=`}
40
+
41
+ `,J+=`}
42
+
43
+ `,W=`${H}
44
+ ${U}export type Packages = Pantry
45
+
46
+ ${J}export const packages: Packages = pantry
47
+
48
+ export * from './aliases'
49
+ `}try{A.writeFileSync($,W),console.log(`Successfully generated ${$}`)}catch(H){return console.error(`Error writing index file ${$}:`,H),null}if(!A.existsSync($))return console.error(`Index file was not created: ${$}`),null;return $}catch(X){return console.error("Error generating index file:",X),null}}async function PQ(Q){let X={};console.log("Generating aliases from package files (avoiding circular dependency)");let $=Q||M.join(m.cwd(),"src","packages");if(!A.existsSync($))return console.log(`Packages directory does not exist: ${$}`),X;function Z(U,J=""){let Y=[],G=A.readdirSync(U,{withFileTypes:!0});for(let z of G)if(z.isFile()&&z.name.endsWith(".ts")&&z.name!=="index.ts"&&z.name!=="aliases.ts")Y.push(M.join(U,z.name));else if(z.isDirectory()&&!z.name.startsWith(".")){let O=M.join(U,z.name),K=J?`${J}/${z.name}`:z.name;Y.push(...Z(O,K))}return Y}let W=Z($).sort();console.log(`Found ${W.length} package files`);for(let U of W)try{let J=U,Y=A.readFileSync(J,"utf-8"),G=M.basename(U,".ts"),z=Y.match(/domain:\s*['"]([^'"]*)['"]\s*as const/),O=z?z[1]:yQ(G),K=Y.match(/name:\s*['"]([^'"]*)['"]\s*as const/),L=K?K[1]:"";if(L&&L!==O&&I0(L,O))if(!X[L])X[L]=O,console.log(`Auto-generated alias: ${L} -> ${O}`);else console.log(`Skipped auto-generated alias ${L} -> ${O} (already exists as ${X[L]})`);let _=Y.match(/aliases:\s*\[([\s\S]*?)\]/);if(_&&_[1]){let q=_[1].match(/["']([^"']*)["']/g);if(q)for(let B of q){let w=B.replace(/["']/g,"");if(!(!w||w.includes("--")||w.includes("$SHELL")||w.includes("curl")||w.includes("sh <(")||w.includes(" -- ")||w.includes(" -i")||w.includes("+")&&w.includes(" ")||w.includes("{{")||w.includes("}}")||w.includes("version.major")||w.includes("version.minor")||w===O))if(!X[w])X[w]=O,console.log(`Found explicit alias ${w} -> ${O}`);else console.log(`Skipped explicit alias ${w} -> ${O} (already exists as ${X[w]})`);else console.log(`Filtered out invalid alias: ${w} for ${O}`)}}if(O==="aws.amazon.com/cli"){if(!X.aws)X.aws=O,console.log(`Added AWS CLI alias: aws -> ${O}`);if(!X["aws/cli"])X["aws/cli"]=O,console.log(`Added AWS CLI path alias: aws/cli -> ${O}`)}if(O==="aws.amazon.com/cdk"){if(!X["aws/cdk"])X["aws/cdk"]=O,console.log(`Added AWS CDK path alias: aws/cdk -> ${O}`)}}catch(J){console.error(`Error extracting aliases from ${U}:`,J)}let H=yX();for(let[U,J]of Object.entries(H))if(!X[U])X[U]=J,console.log(`Added alias override: ${U} -> ${J}`);else{let Y=X[U];X[U]=J,console.log(`Overrode alias ${U}: ${Y} -> ${J}`)}return X}async function iQ(Q){try{let X=await PQ(Q),$=Q?M.resolve(Q):M.resolve(m.cwd(),"src","packages"),Z=M.resolve($,"aliases.ts"),W=M.dirname(Z);if(!A.existsSync(W))A.mkdirSync(W,{recursive:!0});let H=X,U=`/**
50
+ * Auto-generated aliases for pantry packages
51
+ */
52
+
53
+ `;U+=`export const aliases: Record<string, string> = {
54
+ `;let J=Object.entries(H).sort((Y,G)=>Y[0].localeCompare(G[0]));for(let[Y,G]of J)U+=` '${Y}': '${G}',
55
+ `;return U+=`}
56
+ `,A.writeFileSync(Z,U),console.log(`Successfully generated ${Z} with ${J.length} aliases`),Z}catch(X){return console.error("Error generating aliases file:",X),""}}function V0(Q){let X=Q.split(`
57
+ `).map(($)=>$.trimEnd()).join(`
58
+ `);return X=A0(X),X=X.replace(/\n{3,}/g,`
59
+
60
+ `),X=`${X.trimEnd()}
61
+ `,X}function aQ(Q){return V0(Q)}function A0(Q){let X=Q.split(`
62
+ `),$=!1;return X.map((Z)=>{if(Z.trimStart().startsWith("```"))return $=!$,Z;if($)return Z;return Z.replace(/(?<!\]\()(?<!\()(?<!<)(https?:\/\/[^\s)>\]]+)/g,(W,H,U)=>{if(U>0&&Z[U-1]==="<")return W;let J=Z.slice(0,U);if(/\]\($/.test(J))return W;if((J.match(/`/g)||[]).length%2===1)return W;return`<${W}>`})}).join(`
63
+ `)}function x0(Q){if(["undefined","null","true","false","var","let","const","function","class","if","else","for","while","do","switch","case","default","break","continue","return","try","catch","finally","throw","new","this","super","import","export","from","as","typeof","instanceof","in","of","delete","void","async","await","yield","static","extends","implements","interface","type","enum","namespace","module","declare","abstract","public","private","protected","readonly","get","set"].includes(Q.toLowerCase()))return!1;let $=["go","rust","zig","nim","dart","julia","scala","kotlin","swift","node","bun","lato","open-sans","source-code-pro","roboto","inter","hack","fira-code","cascadia-code","jetbrains-mono","jetbrains-mono-nerd-font","meslo-lg-nerd-font"];if(!Q.includes(".")&&!$.includes(Q.toLowerCase()))return!1;if(!Q||Q.trim().length===0)return!1;if(!/^[\w.\-/]+$/.test(Q))return!1;return!0}function N0(Q){if(/^[A-Z][A-Z0-9_]*(?:\^|$)/.test(Q))return!0;return[/^linux$/,/^darwin$/,/^ompi_.*flags/i,/^perl5lib/i,/^gsettings-desktop-schemas$/,/^curl\.se\/ca-certs$/,/^openssh\.com$/].some(($)=>$.test(Q))}function GQ(Q){if(!x0(Q.domain))return!0;if(!Q.description)return!0;return["Go home.","Crafters of fine Open Source products","Package information for","pantry package","Loading...","Please wait...","Package information available in the pantry registry."].some(($)=>Q.description.includes($))}function hX(Q){let X=(Z)=>{if(!Q.versions||Q.versions.length===0)return Z.replace(/\{\{/g,"&lbrace;&lbrace;").replace(/\}\}/g,"&rbrace;&rbrace;");let W=Q.versions[0],H=W.split("."),U=H[0]||"",J=H[1]||"",Y=H[2]||"",G=J?`${U}.${J}`:U;return Z.replace(/\{\{\s*version\.marketing\s*\}\}/g,G).replace(/\{\{\s*version\.major\s*\}\}/g,U).replace(/\{\{\s*version\.minor\s*\}\}/g,J).replace(/\{\{\s*version\.patch\s*\}\}/g,Y).replace(/\{\{\s*version\.raw\s*\}\}/g,W).replace(/\{\{\s*version\s*\}\}/g,W).replace(/\{\{(?![^}]*\}\})/g,"&lbrace;&lbrace;")};if(Q.pantryInstallCommand){let Z=Q.pantryInstallCommand.match(/pantry install (.+)/);if(Z){let W=Z[1];if(Q.aliases&&Q.aliases.length>0){let H=[...Q.aliases].sort((J,Y)=>J.length-Y.length);return`pantry install ${X(H[0])}`}if(Q.aliases&&Q.aliases.some((H)=>H.toLowerCase()===W.toLowerCase()))return`pantry install ${X(W.toLowerCase())}`;return X(Q.pantryInstallCommand)}}if(Q.installCommand)return X(Q.installCommand);let $=Q.domain;if(Q.aliases&&Q.aliases.length>0)$=[...Q.aliases].sort((W,H)=>W.length-H.length)[0];return $=X($),`pantry install ${$}`}async function b0(Q,X){let $=await tQ(X),Z=await PQ(X),W=DX(),H=M.resolve(Q,"package-catalog.md"),U={},J=0;for(let[_,q]of Object.entries($))if(!GQ(q))U[_]=q;else J++,console.log(`Excluding package ${q.domain||_} (placeholder data)`);console.log(`Filtered out ${J} packages with placeholder data`);let Y=new Set,G=new Map;for(let[_,q]of Object.entries(U)){let B=q.domain;if(!Y.has(B))G.set(B,q),Y.add(B)}let z=new Set;Object.values(W).forEach((_)=>{_.forEach((q)=>z.add(q))});let O=[];if(G.forEach((_,q)=>{if(!z.has(q))O.push(q)}),O.length>0)W["Other Utilities"]=O;let K=`# Package Catalog
64
+
65
+ This comprehensive catalog lists all ${G.size}+ packages available in ts-pantry, organized by category.
66
+
67
+ Each package can be accessed using \`getPackage(name)\` or directly via \`pantry.domain\`.
68
+
69
+ ## Quick Stats
70
+
71
+ - **Total Packages**: ${G.size}
72
+ - **Categories**: ${Object.keys(W).length}
73
+ - **Last Updated**: ${new Date().toISOString()}
74
+
75
+ ## Table of Contents
76
+
77
+ `,L=(_)=>{if($[_])return{domainVarName:_,pkg:$[_]};let q=Z[_];if(q){let B=a(q);if($[B])return{domainVarName:B,pkg:$[B]}}return null};Object.keys(W).forEach((_)=>{let q=_.toLowerCase().replace(/[^a-z0-9]+/g,"-"),B=W[_],w=new Map;B.forEach((C)=>{let T=L(C);if(T&&!GQ(T.pkg)){let j=T.pkg.domain||T.pkg.fullPath||"unknown";if(!w.has(j))w.set(j,T);else{let R=w.get(j);if(T.domainVarName.length<R.domainVarName.length||T.domainVarName.length===R.domainVarName.length&&T.domainVarName<R.domainVarName)w.set(j,T)}}});let I=w.size;if(I>0)K+=`- [${_}](#${q}) (${I} packages)
78
+ `}),K+=`
79
+ `;for(let[_,q]of Object.entries(W)){let B=new Map;q.forEach((I)=>{let C=L(I);if(C&&!GQ(C.pkg)){let T=C.pkg.domain||C.pkg.fullPath||"unknown";if(!B.has(T))B.set(T,C);else{let j=B.get(T);if(C.domainVarName.length<j.domainVarName.length||C.domainVarName.length===j.domainVarName.length&&C.domainVarName<j.domainVarName)B.set(T,C)}}});let w=Array.from(B.values()).sort((I,C)=>(I.pkg.domain||I.domainVarName).localeCompare(C.pkg.domain||C.domainVarName));if(w.length===0)continue;K+=`## ${_}
80
+
81
+ `,K+=`${w.length} packages in this category
82
+
83
+ `,K+=`| Package | Description | Programs | Versions | Install |
84
+ `,K+=`|---------|-------------|----------|----------|----------|
85
+ `;for(let{domainVarName:I,pkg:C}of w)try{let T=C.domain||C.fullPath||"unknown",j=C.aliases?` (${C.aliases.map((N)=>N.replace(/\{\{/g,"&lbrace;&lbrace;").replace(/\}\}/g,"&rbrace;&rbrace;")).join(", ")})`:"",R=C.programs.slice(0,3).map((N)=>N.replace(/\{\{/g,"&lbrace;&lbrace;").replace(/\}\}/g,"&rbrace;&rbrace;")).join(", ");if(C.programs.length>3)R+=`, ... (+${C.programs.length-3})`;if(C.programs.length===0)R="-";let E=C.versions?.length||0,F=C.versions?.[0]||"latest",V=E>0?`${F} (+${E-1})`:"latest",x=C.description.replace(/\s+/g," ").replace(/\{\{/g,"&lbrace;&lbrace;").replace(/\}\}/g,"&rbrace;&rbrace;").replace(/\x27/g,"&#39;").replace(/"/g,"&quot;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\|/g,"\\|");if(x.length>100)x=`${x.substring(0,97)}...`;let b=C.name||T;if(C.aliases&&C.aliases.length>0)b=[...C.aliases].sort((y,c)=>y.length-c.length)[0];b=b.replace(/\{\{/g,"&lbrace;&lbrace;").replace(/\}\}/g,"&rbrace;&rbrace;");let d=`\`pantry install ${b}\``,f;if(T.includes("."))if(T.startsWith("github.com/")&&T.includes("/")){let y=T.replace("github.com/","").split("/");if(y.length>=2){let c=y[0],ZQ=y.slice(1).join("-");f=`./packages/github.com/${c}/${ZQ}.md`}else f=`./packages/${bQ(T,I)}.md`}else f=`./packages/${T}/index.md`;else f=`./packages/${bQ(T,I)}.md`;let h=`| **[${T}](${f})**${j} | ${x} | ${R} | ${V} | ${d} |`.replace(/\r?\n/g," ").replace(/\s+/g," ");K+=`${h}
86
+ `}catch(T){let j=C.domain||C.fullPath||"unknown";console.error(`Error processing ${j}:`,T),K+=`| **${j}** | Error retrieving package information | - | - | - |
87
+ `}K+=`
88
+ `}return K+=`## Usage Examples
89
+
90
+ ### Basic Usage
91
+
92
+ \`\`\`typescript
93
+ import { getPackage, pantry } from 'ts-pantry'
94
+
95
+ // Get a package by domain
96
+ const nodePackage = pantry.nodejsorg
97
+
98
+ // Get a package by alias
99
+ const nodeByAlias = getPackage('node')
100
+
101
+ // Access package properties
102
+ console.log(\`Package: \${nodePackage.name} - \${nodePackage.description}\`)
103
+ console.log(\`Install: \${nodePackage.installCommand}\`)
104
+ console.log(\`Programs: \${nodePackage.programs.join(', ')}\`)
105
+ \`\`\`
106
+
107
+ ### Advanced Usage
108
+
109
+ \`\`\`typescript
110
+ // Find packages by category
111
+ const databases = [
112
+ pantry.postgresqlorg,
113
+ pantry.mysqlcom,
114
+ pantry.redisio,
115
+ pantry.mongodbcom
116
+ ]
117
+
118
+ // Get all available versions
119
+ const nodeVersions = pantry.nodejsorg.versions
120
+ console.log(\`Node.js versions: \${nodeVersions.slice(0, 5).join(', ')}...\`)
121
+
122
+ // Check dependencies
123
+ const nodeDeps = pantry.nodejsorg.dependencies
124
+ console.log(\`Node.js dependencies: \${nodeDeps.join(', ')}\`)
125
+ \`\`\`
126
+
127
+ ### Installation Examples
128
+
129
+ \`\`\`bash
130
+ # Install using pantry
131
+ pantry install node
132
+ pantry install python
133
+ pantry install rust
134
+
135
+ # Install specific versions
136
+ pantry install node@20
137
+ pantry install python@3.11
138
+
139
+ # Install multiple packages
140
+ pantry install node python rust
141
+ \`\`\`
142
+
143
+ ## Package Information
144
+
145
+ Each package includes:
146
+
147
+ - **Name**: Short identifier for the package
148
+ - **Domain**: Full domain identifier
149
+ - **Description**: What the package does
150
+ - **Programs**: Executable programs provided
151
+ - **Versions**: Available versions
152
+ - **Dependencies**: Required dependencies
153
+ - **Companions**: Related packages
154
+ - **Install Command**: How to install with pantry
155
+
156
+ ## Contributing
157
+
158
+ To add or update packages, see the [pantry repository](https://github.com/pantry-pm/pantry).
159
+ `,await A.promises.writeFile(H,aQ(K)),H}function NX(Q,X,$){if(Q.includes("."))if(Q.startsWith("github.com/")){let W=Q.replace("github.com/","").split("/");if(W.length>=2){let H=W[0],U=W.slice(1).join("-");return M.join($,"github.com",H,`${U}.md`)}else{let H=W[0];return M.join($,"github.com",H,"index.md")}}else return M.join($,Q,"index.md");else return M.join($,`${bQ(Q,X)}.md`)}function bQ(Q,X){let $=(Q||X).toLowerCase();if(/^\d/.test($))$=`pkg-${$}`;return $.replace(/[^\w-]/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"")}async function y0(Q,X){let $=await tQ(X),Z=M.join(Q,"packages");if(!A.existsSync(Z))A.mkdirSync(Z,{recursive:!0});let W=[],H=new Map;for(let[U,J]of Object.entries($)){if(GQ(J)){console.log(`Skipping package page for ${J.domain||U} (placeholder data)`);continue}let Y=J.domain;if(!H.has(Y))H.set(Y,{domainVarName:U,pkg:J});else{let G=H.get(Y);if(U.length<G.domainVarName.length||U.length===G.domainVarName.length&&U<G.domainVarName)H.set(Y,{domainVarName:U,pkg:J}),console.log(`Replaced ${G.domainVarName} with ${U} for domain ${Y}`)}}for(let{domainVarName:U,pkg:J}of H.values())try{let Y=J.domain||J.fullPath||U,G;if(Y.includes("."))if(Y.startsWith("github.com/")){let R=Y.replace("github.com/","").split("/");if(R.length>=2){let E=R[0],F=R.slice(1).join("-"),V=M.join(Z,"github.com",E);if(!A.existsSync(V))A.mkdirSync(V,{recursive:!0});G=M.join(V,`${F}.md`)}else{let E=R[0],F=M.join(Z,"github.com",E);if(!A.existsSync(F))A.mkdirSync(F,{recursive:!0});G=M.join(F,"index.md")}}else{let j=M.join(Z,Y);if(!A.existsSync(j))A.mkdirSync(j,{recursive:!0});G=M.join(j,"index.md")}else G=M.join(Z,`${bQ(Y,U)}.md`);let z=J.description||"",O=(j)=>{if(!J.versions||J.versions.length===0)return j.replace(/\{\{/g,"&lbrace;&lbrace;").replace(/\}\}/g,"&rbrace;&rbrace;");let R=J.versions[0],E=R.split("."),F=E[0]||"",V=E[1]||"",x=E[2]||"",b=V?`${F}.${V}`:F;return j.replace(/\{\{\s*version\.marketing\s*\}\}/g,b).replace(/\{\{\s*version\.major\s*\}\}/g,F).replace(/\{\{\s*version\.minor\s*\}\}/g,V).replace(/\{\{\s*version\.patch\s*\}\}/g,x).replace(/\{\{\s*version\.raw\s*\}\}/g,R).replace(/\{\{\s*version\s*\}\}/g,R).replace(/\{\{(?![^}]*\}\})/g,"&lbrace;&lbrace;")},K=O(J.name||Y),L=O(z).replace(/\s+/g," "),_=`# ${K}
160
+
161
+ ${L?`> ${L}`:""}
162
+
163
+ ## Package Information
164
+
165
+ - **Domain**: \`${Y}\`
166
+ - **Name**: \`${K}\`
167
+ - **Homepage**: ${J.homepageUrl||"Not specified"}
168
+ - **Source**: [View on GitHub](${J.packageYmlUrl||`https://github.com/pantry-pm/pantry/tree/main/projects/${Y}/package.yml`})
169
+
170
+ ## Installation
171
+
172
+ \`\`\`bash
173
+ # Install with pantry
174
+ ${hX(J)}
175
+ \`\`\`
176
+
177
+ ## Programs
178
+
179
+ This package provides the following executable programs:
180
+
181
+ `;if(J.programs&&J.programs.length>0)J.programs.forEach((j)=>{let R=O(j);_+=`- \`${R}\`
182
+ `});else _+=`No programs specified.
183
+ `;if(J.aliases&&J.aliases.length>0)_+=`
184
+ ## Aliases
185
+
186
+ This package can also be accessed using these aliases:
187
+
188
+ `,J.aliases.forEach((j)=>{let R=O(j);_+=`- \`${R}\`
189
+ `});if(J.versions&&J.versions.length>0){_+=`
190
+ ## Available Versions
191
+
192
+ <details>
193
+ <summary>Show all ${J.versions.length} versions</summary>
194
+
195
+ `;let j=new Map,R=[];J.versions.forEach((E)=>{let F=E.split("."),V=F.length>=2?`${F[0]}.${F[1]}`:F[0];if(!j.has(V))j.set(V,[]),R.push(V);j.get(V).push(E)}),R.forEach((E)=>{let F=j.get(E);_+=`- ${F.map((V)=>`\`${V}\``).join(", ")}
196
+ `}),_+=`
197
+ </details>
198
+
199
+ **Latest Version**: \`${J.versions[0]}\`
200
+
201
+ ### Install Specific Version
202
+
203
+ \`\`\`bash
204
+ # Install a specific version
205
+ pantry install ${Y}@${J.versions[0]}
206
+ \`\`\`
207
+ `}if(J.dependencies&&J.dependencies.length>0)_+=`
208
+ ## Dependencies
209
+
210
+ This package depends on:
211
+
212
+ `,J.dependencies.forEach((j)=>{_+=`- \`${j}\`
213
+ `});if(J.companions&&J.companions.length>0){let j=J.companions.filter((R)=>!N0(R));if(j.length>0)_+=`
214
+ ## Related Packages
215
+
216
+ These packages work well with ${J.name||Y}:
217
+
218
+ `,j.forEach((R)=>{let E=a(R),F=$[E];if(F&&!GQ(F)){let V=NX(R,E,Z),x=M.relative(M.dirname(G),V).replace(/\\/g,"/"),b=F.description?.trim();if(b)_+=`- [\`${R}\`](${x}) - ${b}
219
+ `;else _+=`- [\`${R}\`](${x})
220
+ `}else{let V=NX(R,E,Z),x=M.relative(M.dirname(G),V).replace(/\\/g,"/"),b=F?.description?.trim()||"Package not available";if(b&&b!=="Package not available")_+=`- [\`${R}\`](${x}) - ${b}
221
+ `;else _+=`- [\`${R}\`](${x})
222
+ `}})}let q=M.dirname(Z),w=`${M.relative(M.dirname(G),q)}/package-catalog.md`.replace(/\\/g,"/"),I=J.aliases&&J.aliases.length>0?J.aliases[0]:J.name||a(Y),T=/[^\w$]/.test(I)||/^\d/.test(I)?`pantry['${I}']`:`pantry.${I}`;_+=`
223
+ ## Usage Examples
224
+
225
+ \`\`\`typescript
226
+ import { pantry } from 'ts-pantry'
227
+
228
+ // Access this package
229
+ const pkg = ${T}
230
+
231
+ console.log(\`Package: \${pkg.name}\`)
232
+ console.log(\`Description: \${pkg.description}\`)
233
+ console.log(\`Programs: \${pkg.programs.join(', ')}\`)
234
+ \`\`\`
235
+
236
+ ## Links
237
+
238
+ - [Package Source](${J.packageYmlUrl||`https://github.com/pantry-pm/pantry/tree/main/projects/${Y}/package.yml`})
239
+ - [Homepage](${J.homepageUrl||"#"})
240
+ - [Back to Package Catalog](${w})
241
+
242
+ ---
243
+
244
+ > Auto-generated from package data.
245
+ `,await A.promises.writeFile(G,aQ(_)),W.push(G)}catch(Y){console.error(`Error generating page for ${U}:`,Y)}return W}async function P0(Q,X){let $=await tQ(X),Z=await PQ(X),W=DX(),H=M.join(Q,"categories");if(!A.existsSync(H))A.mkdirSync(H,{recursive:!0});let U=[],J=(Y)=>{if($[Y])return{domainVarName:Y,pkg:$[Y]};if(Z[Y]){let G=Z[Y],z=a(G);if($[z])return{domainVarName:z,pkg:$[z]}}return null};for(let[Y,G]of Object.entries(W)){let z=new Map;G.forEach((q)=>{let B=J(q);if(B&&!GQ(B.pkg)){let w=B.pkg.domain||B.pkg.fullPath||"unknown";if(!z.has(w))z.set(w,B);else{let I=z.get(w);if(B.domainVarName.length<I.domainVarName.length||B.domainVarName.length===I.domainVarName.length&&B.domainVarName<I.domainVarName)z.set(w,B)}}});let O=Array.from(z.values()).sort((q,B)=>(q.pkg.domain||q.domainVarName).localeCompare(B.pkg.domain||B.domainVarName));if(O.length===0)continue;let K=`${Y.toLowerCase().replace(/[^a-z0-9]+/g,"-")}.md`,L=M.join(H,K),_=`# ${Y}
246
+
247
+ ${O.length} packages in this category
248
+
249
+ ${Y==="Programming Languages"?"Popular programming languages and their runtimes available through pantry.":Y==="Databases"?"Database systems and data storage solutions.":Y==="Development Tools"?"Development environments, editors, and programming tools.":Y==="Build Tools"?"Build systems, compilers, and development infrastructure.":Y==="DevOps"?"Tools for deployment, orchestration, and infrastructure management.":Y==="Multimedia"?"Audio, video, and image processing tools.":Y==="Security"?"Security tools, encryption, and authentication systems.":Y==="Networking"?"Network tools, protocols, and communication software.":Y==="CLI Tools & Utilities"?"Command-line utilities and system tools.":`Packages related to ${Y.toLowerCase()}.`}
250
+
251
+ ## Packages
252
+
253
+ `;O.forEach(({domainVarName:q,pkg:B})=>{let w=B.domain||B.fullPath||"unknown",I=(F)=>{if(!B.versions||B.versions.length===0)return F.replace(/\{\{/g,"&lbrace;&lbrace;").replace(/\}\}/g,"&rbrace;&rbrace;");let V=B.versions[0],x=V.split("."),b=x[0]||"",d=x[1]||"",f=x[2]||"",h=d?`${b}.${d}`:b;return F.replace(/\{\{\s*version\.marketing\s*\}\}/g,h).replace(/\{\{\s*version\.major\s*\}\}/g,b).replace(/\{\{\s*version\.minor\s*\}\}/g,d).replace(/\{\{\s*version\.patch\s*\}\}/g,f).replace(/\{\{\s*version\.raw\s*\}\}/g,V).replace(/\{\{\s*version\s*\}\}/g,V).replace(/\{\{(?![^}]*\}\})/g,"&lbrace;&lbrace;")},C=[];if(B.name&&B.name!==w)C.push(B.name);if(B.aliases&&B.aliases.length>0)C.push(...B.aliases);let T=C.length>0?` (${C.join(", ")})`:"",j=B.description||"",R=I(j).replace(/\s+/g," "),E;if(w.includes("."))if(w.startsWith("github.com/")&&w.includes("/")){let V=w.replace("github.com/","").split("/");if(V.length>=2){let x=V[0],b=V.slice(1).join("-");E=`../packages/github.com/${x}/${b}.md`}else{let x=q.toLowerCase();if(/^\d/.test(x))x=`pkg-${x}`;x=x.replace(/[^\w-]/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,""),E=`../packages/${x}.md`}}else E=`../packages/${w}/index.md`;else{let F=q.toLowerCase();if(/^\d/.test(F))F=`pkg-${F}`;F=F.replace(/[^\w-]/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,""),E=`../packages/${F}.md`}_+=`### [${w}](${E})${T}
254
+
255
+ ${R?`${R}`:""}
256
+
257
+ **Programs**: ${B.programs&&B.programs.length>0?B.programs.map((F)=>I(F)).join(", "):"None specified"}
258
+
259
+ **Install**: \`${hX(B)}\`
260
+
261
+ ---
262
+
263
+ `}),_+=`[← Back to Package Catalog](../package-catalog.md)
264
+ `,await A.promises.writeFile(L,aQ(_)),U.push(L)}return U}async function rQ(Q=nQ,X){console.log("\uD83D\uDE80 Generating comprehensive package documentation...");try{if(!A.existsSync(Q))A.mkdirSync(Q,{recursive:!0});console.log("\uD83D\uDCDA Generating package catalog...");let $=await b0(Q,X);console.log(`✅ Generated: ${$}`),console.log("\uD83D\uDCC4 Generating individual package pages...");let Z=await y0(Q,X);console.log(`✅ Generated ${Z.length} package pages`),console.log("\uD83D\uDCC2 Generating category pages...");let W=await P0(Q,X);console.log(`✅ Generated ${W.length} category pages`),console.log(`
265
+ \uD83C\uDF89 Documentation generation complete!`),console.log(`\uD83D\uDCCD Output directory: ${Q}`),console.log(`\uD83D\uDCCA Total files generated: ${1+Z.length+W.length}`),console.log(`
266
+ Files generated:`),console.log(`- Package catalog: ${$}`),console.log(`- Package pages: ${Z.length} files in docs/packages/`),console.log(`- Category pages: ${W.length} files in docs/categories/`)}catch($){throw console.error("❌ Error generating documentation:",$),$}}async function sQ(){try{console.log("\uD83C\uDFAF Updating Dependencies type timestamp...");let Q=M.join(m.cwd(),"src","dependencies.ts");if(!A.existsSync(Q)){console.log("dependencies.ts not found, skipping update");return}let X=A.readFileSync(Q,"utf-8"),$=new Date().toISOString(),Z=X.replace(/\/\/ Auto-generated precise dependency types/,`// Auto-generated precise dependency types
267
+ // Last updated: ${$}`);A.writeFileSync(Q,Z),console.log("✅ Updated dependencies.ts timestamp")}catch(Q){console.error("Error updating dependencies.ts:",Q)}}async function D0(){try{let Q=m.argv.slice(2);switch(Q[0]||"index"){case"index":{if(console.log("\uD83D\uDD27 Generating package index..."),!await oQ())console.error("❌ Failed to generate index"),m.exit(1);if(console.log("\uD83C\uDFF7️ Generating aliases..."),!await iQ())console.error("❌ Failed to generate aliases"),m.exit(1);console.log("\uD83C\uDFAF Updating PackageVersionMap..."),await sQ(),console.log("✨ Index and aliases generation completed successfully!");break}case"docs":{let $=Q[1]||nQ;console.log(`\uD83D\uDCDA Generating documentation to ${$}...`),await rQ($),console.log("✨ Documentation generation completed successfully!");break}case"all":{if(console.log("\uD83D\uDE80 Generating everything..."),console.log("\uD83D\uDD27 Generating package index..."),!await oQ())console.error("❌ Failed to generate index"),m.exit(1);if(console.log("\uD83C\uDFF7️ Generating aliases..."),!await iQ())console.error("❌ Failed to generate aliases"),m.exit(1);console.log("\uD83C\uDFAF Updating PackageVersionMap..."),await sQ();let W=Q[1]||nQ;console.log(`\uD83D\uDCDA Generating documentation to ${W}...`),await rQ(W),console.log("✨ All generation completed successfully!");break}default:console.log(`
268
+ Usage: bun run src/generate.ts [command] [options]
269
+
270
+ Commands:
271
+ index Generate package index and aliases (default)
272
+ docs [output-dir] Generate documentation (default: ./docs)
273
+ all [output-dir] Generate everything (index, aliases, and docs)
274
+
275
+ Examples:
276
+ bun run src/generate.ts
277
+ bun run src/generate.ts index
278
+ bun run src/generate.ts docs
279
+ bun run src/generate.ts docs ./custom-docs
280
+ bun run src/generate.ts all
281
+ bun run src/generate.ts all ./custom-docs
282
+ `);break}}catch(Q){console.error("\uD83D\uDCA5 Error during generation:",Q),m.exit(1)}}var bX=m.argv[1]?.replace(/\\/g,"/"),u0=bX?.endsWith("/generate.ts")||bX==="generate.ts";if(u0)D0();import OQ from"node:fs";import v0 from"node:os";import KQ from"node:path";import DQ from"node:process";async function h0(Q,X={}){let{targetOs:$=DQ.platform==="darwin"?"darwin":DQ.platform==="win32"?"windows":"linux",includeOsSpecific:Z=!0,maxDepth:W=10,verbose:H=!1}=X,U=await FX(Q,{targetOs:$,includeOsSpecific:Z,maxDepth:W,verbose:H}),J=RQ(Q),Y=U.allDependencies.map((K)=>({name:K.name,version:K.version,constraint:K.constraint,isOsSpecific:K.isOsSpecific,os:K.os})),z=`pantry install ${J.map((K)=>K.name).join(" ")}`,O=U.conflicts.map((K)=>{let L=Y.find((_)=>_.name===K.package);return{package:K.package,versions:K.versions,resolved:L?.version||"latest"}});return{packages:Y,directCount:J.length,totalCount:Y.length,conflicts:O,pantryCommand:z}}async function _5(Q,X={}){let $=OQ.mkdtempSync(KQ.join(v0.tmpdir(),"pantry-deps-")),Z=KQ.join($,"deps.yaml");try{return OQ.writeFileSync(Z,Q,{encoding:"utf-8",mode:384}),await h0(Z,X)}finally{try{OQ.rmSync($,{recursive:!0,force:!0})}catch{}}}async function q5(Q,X={}){let{targetOs:$=DQ.platform==="darwin"?"darwin":DQ.platform==="win32"?"windows":"linux",includeOsSpecific:Z=!0,maxDepth:W=10}=X,H=await IQ(Q,{targetOs:$,includeOsSpecific:Z,maxDepth:W});return H.unshift({name:Q,version:"latest",constraint:"*",isOsSpecific:!1}),(await gQ(H,{targetOs:$,includeOsSpecific:Z,maxDepth:W})).allDependencies.map((J)=>({name:J.name,version:J.version,constraint:J.constraint,isOsSpecific:J.isOsSpecific,os:J.os}))}function B5(Q,X="pantry"){if(X==="pkgx")return`pkgx install ${Q.join(" ")}`;return`pantry install ${Q.join(" ")}`}function w5(Q){let X=[],$=KQ.join(Q,"pantry");try{let H=OQ.readdirSync($,{withFileTypes:!0});for(let U of H){if(!U.isDirectory())continue;if(U.name.startsWith("@")){let J=KQ.join($,U.name);try{let Y=OQ.readdirSync(J,{withFileTypes:!0});for(let G of Y){if(!G.isDirectory())continue;let z=`${U.name}/${G.name}`,O=KQ.join(J,G.name,"package.json"),K=kX(O);X.push({name:z,version:K,isWorkspace:z.startsWith("@stacksjs/"),isScoped:!0})}}catch{}}else{let J=KQ.join($,U.name,"package.json"),Y=kX(J);X.push({name:U.name,version:Y,isWorkspace:!1,isScoped:!1})}}}catch{}X.sort((H,U)=>H.name.localeCompare(U.name));let Z=X.filter((H)=>H.isWorkspace).length,W=X.length-Z;return{packages:X,thirdPartyCount:W,workspaceCount:Z,totalCount:X.length}}function kX(Q){try{let X=OQ.readFileSync(Q,"utf-8");return JSON.parse(X).version||"0.0.0"}catch{return"0.0.0"}}z4();function j5(Q){return Q}function T5(Q){return Q}var C5={baseUrl:"https://dist.pkgx.dev"};function R5(Q){return Q}import{execFileSync as KX}from"node:child_process";import D from"node:fs";import X4 from"node:os";import P from"node:path";import uQ from"node:process";import k0 from"node:fs";import fX from"node:path";function eQ(Q,X){let $=fX.resolve(Q),Z=[],W=X.rules.some((U)=>U.negated);function H(U,J){let Y;try{Y=k0.readdirSync(U,{withFileTypes:!0})}catch{return}for(let G of Y){let z=J?`${J}/${G.name}`:G.name,O=fX.join(U,G.name),K=G.isSymbolicLink(),L=G.isDirectory()&&!K,_=X.ignores(z);if(L){if(_&&!W)continue;if(!_)Z.push({relPath:z,absPath:O,isDir:!0,isSymlink:!1});H(O,z)}else{if(_)continue;Z.push({relPath:z,absPath:O,isDir:!1,isSymlink:K})}}}return H($,""),Z.sort((U,J)=>U.relPath<J.relPath?-1:U.relPath>J.relPath?1:0),Z}var f0=new Set(["FROM","RUN","CMD","LABEL","MAINTAINER","EXPOSE","ENV","ADD","COPY","ENTRYPOINT","VOLUME","USER","WORKDIR","ARG","ONBUILD","STOPSIGNAL","HEALTHCHECK","SHELL"]);function g0(Q){let X={},$=0;for(;$<Q.length;$++){let W=Q[$].trim();if(W==="")continue;let H=/^#\s*([a-z][a-z0-9_-]*)\s*=\s*(.+?)\s*$/i.exec(W);if(!H)break;X[H[1].toLowerCase()]=H[2]}return{directives:X,bodyStart:0}}function m0(Q,X){let $=Q.split(`
283
+ `),Z=[],W="",H=0,U=new RegExp(`${X==="\\"?"\\\\":"`"}\\s*$`);for(let J=0;J<$.length;J++){let Y=$[J].replace(/\r$/,""),G=W!=="";if(!G&&Y.trim().startsWith("#"))continue;if(!G)H=J+1;if(U.test(Y)){Y=Y.replace(U,""),W+=Y;continue}if(W+=Y,W.trim()!=="")Z.push({text:W,line:H});W=""}if(W.trim()!=="")Z.push({text:W,line:H});return Z}function d0(Q){let X={},$=Q.trimStart(),Z=/^--([a-z][a-z0-9-]*)=("[^"]*"|'[^']*'|\S+)\s*/i,W=Z.exec($);while(W){let H=W[2];if(H.startsWith('"')&&H.endsWith('"')||H.startsWith("'")&&H.endsWith("'"))H=H.slice(1,-1);X[W[1]]=H,$=$.slice(W[0].length),W=Z.exec($)}return{flags:X,rest:$.trim()}}function QX(Q){let X=Q.split(`
284
+ `),{directives:$}=g0(X),Z=$.escape==="`"?"`":"\\",W=m0(Q,Z),H=[],U=[],J=[],Y;for(let{text:G,line:z}of W){let O=G.trim();if(O==="")continue;let K=O.search(/\s/),L=(K===-1?O:O.slice(0,K)).toUpperCase(),_=K===-1?"":O.slice(K+1).trim();if(!f0.has(L)){let I={instruction:L,args:_,flags:{},line:z};if(H.push(I),Y)Y.instructions.push(I);continue}let{flags:q,rest:B}=d0(_),w={instruction:L,args:B,flags:q,line:z};if(H.push(w),L==="FROM"){let I=c0(B,q,J.length);J.push(I),Y=I;continue}if(!Y){if(L==="ARG")U.push(w);continue}Y.instructions.push(w)}return{directives:$,globalArgs:U,stages:J,instructions:H}}function c0(Q,X,$){let Z=Q.split(/\s+/),W=Z[0]??"scratch",H,U=Z.findIndex((J)=>J.toUpperCase()==="AS");if(U!==-1&&Z[U+1])H=Z[U+1];return{name:H,baseImage:W,platform:X.platform,index:$,instructions:[]}}function e(Q){let X=Q.trim();if(!X.startsWith("["))return;try{let $=JSON.parse(X);if(Array.isArray($)&&$.every((Z)=>typeof Z==="string"))return $}catch{}return}function XX(Q,X){if(!X)return Q.stages;let $=Q.stages.findIndex((Z)=>Z.name===X);if($===-1)throw Error(`Build target stage "${X}" not found`);return Q.stages.slice(0,$+1)}import gX from"node:fs";import $X from"node:path";var l0=[".freezer",".dockerignore"];function mX(Q){let X=Q.trim();if(X=X.replace(/\\/g,"/"),X.startsWith("/"))X=X.slice(1);if(X.endsWith("/"))X=X.slice(0,-1);let Z="^";for(let W=0;W<X.length;W++){let H=X[W];if(H==="*")if(X[W+1]==="*"){if(W++,X[W+1]==="/")W++;Z+=".*"}else Z+="[^/]*";else if(H==="?")Z+="[^/]";else if(".+^${}()|[]".includes(H))Z+=`\\${H}`;else Z+=H}return Z+="(?:/.*)?$",new RegExp(Z)}function dX(Q){let X=[];for(let $ of Q.split(`
285
+ `)){let Z=$.replace(/\r$/,"").trim();if(Z===""||Z.startsWith("#"))continue;let W=Z,H=!1;if(W.startsWith("!"))H=!0,W=W.slice(1).trim();if(W==="")continue;X.push({pattern:W,negated:H,regex:mX(W)})}return X}function cX(Q){return{rules:Q,ignores(X){let $=X.replace(/\\/g,"/").replace(/^\.\//,"").replace(/^\/+/,""),Z=!1;for(let W of Q)if(W.regex.test($))Z=!W.negated;return Z}}}function ZX(Q,X){let $="",Z,W=X&&$X.resolve(X)!==$X.resolve(Q)?[Q,X]:[Q];Q:for(let Y of W)for(let G of l0){let z=$X.join(Y,G);if(gX.existsSync(z)){$=gX.readFileSync(z,"utf8"),Z=G;break Q}}let H=dX($),U=[".freezer",".dockerignore",".git"];for(let Y of U)if(!H.some((G)=>G.pattern===Y||G.negated&&G.pattern===Y))H.unshift({pattern:Y,negated:!1,regex:mX(Y)});let J=cX(H);return J.sourceFile=Z,J}import{execFileSync as lX}from"node:child_process";import{createHash as p0}from"node:crypto";import v from"node:fs";import k from"node:path";import{gzipSync as n0}from"node:zlib";var p={manifest:"application/vnd.oci.image.manifest.v1+json",manifestList:"application/vnd.oci.image.index.v1+json",config:"application/vnd.oci.image.config.v1+json",layerGzip:"application/vnd.oci.image.layer.v1.tar+gzip",dockerManifest:"application/vnd.docker.distribution.manifest.v2+json",dockerManifestList:"application/vnd.docker.distribution.manifest.list.v2+json",dockerConfig:"application/vnd.docker.container.image.v1+json",dockerLayerGzip:"application/vnd.docker.image.rootfs.diff.tar.gzip"};function QQ(Q){return`sha256:${p0("sha256").update(Q).digest("hex")}`}function o(Q){return Q.startsWith("sha256:")?Q.slice(7):Q}function o0(Q){let X=k.join(Q,"..",`.layer-${process.pid}-${Date.now()}.tar`);try{return lX("tar",["-cf",X,"--numeric-owner","-C",Q,"."],{stdio:"pipe",maxBuffer:536870912}),v.readFileSync(X)}finally{if(v.existsSync(X))v.rmSync(X,{force:!0})}}function WX(Q,X){let $=o0(Q),Z=QQ($),W=n0($,{level:6}),H=QQ(W);v.mkdirSync(X,{recursive:!0});let U=k.join(X,`${o(H)}.tar.gz`),J=k.join(X,`${o(Z)}.tar`);return v.writeFileSync(U,W),v.writeFileSync(J,$),{digest:H,diffId:Z,size:W.length,path:U,tarPath:J}}function JX(Q){let X=Buffer.from(JSON.stringify(Q));return{bytes:X,digest:QQ(X)}}function HX(Q,X,$){let Z=$.map((U)=>({mediaType:p.layerGzip,digest:U.digest,size:U.size})),W={schemaVersion:2,mediaType:p.manifest,config:{mediaType:p.config,digest:Q,size:X},layers:Z},H=Buffer.from(JSON.stringify(W));return{manifest:W,bytes:H,digest:QQ(H)}}function UX(Q,X,$,Z,W,H,U){let J=k.join(Q,"blobs","sha256");v.mkdirSync(J,{recursive:!0}),v.writeFileSync(k.join(Q,"oci-layout"),`${JSON.stringify({imageLayoutVersion:"1.0.0"})}
286
+ `),v.writeFileSync(k.join(J,o(W)),Z),v.writeFileSync(k.join(J,o($)),X);for(let G of H)v.copyFileSync(G.path,k.join(J,o(G.digest)));let Y={schemaVersion:2,mediaType:p.manifestList,manifests:[{mediaType:p.manifest,digest:$,size:X.length,annotations:U.length?{"org.opencontainers.image.ref.name":U[0]}:void 0}]};v.writeFileSync(k.join(Q,"index.json"),JSON.stringify(Y))}function YX(Q,X,$,Z,W){let H=`${Q}.stage-${process.pid}`;v.rmSync(H,{recursive:!0,force:!0}),v.mkdirSync(H,{recursive:!0});try{let U=`${o($)}.json`;v.writeFileSync(k.join(H,U),X);let J=[];for(let G of Z){let z=o(G.diffId);v.mkdirSync(k.join(H,z),{recursive:!0}),v.copyFileSync(G.tarPath,k.join(H,z,"layer.tar")),J.push(`${z}/layer.tar`)}let Y=[{Config:U,RepoTags:W.length?W:void 0,Layers:J}];v.writeFileSync(k.join(H,"manifest.json"),JSON.stringify(Y)),v.mkdirSync(k.dirname(Q),{recursive:!0}),v.rmSync(Q,{force:!0}),lX("tar",["-cf",Q,"-C",H,"."],{stdio:"pipe",maxBuffer:536870912})}finally{v.rmSync(H,{recursive:!0,force:!0})}}function pX(Q){let X=process.arch==="arm64"?"arm64":process.arch==="x64"?"amd64":process.arch;if(!Q)return{os:"linux",architecture:X};let[$,Z]=Q.split("/");return{os:$||"linux",architecture:Z||X}}import{execFileSync as i0}from"node:child_process";import{createHash as r0}from"node:crypto";import wQ from"node:fs";import iX from"node:https";import s0 from"node:path";import r from"node:process";var XQ=(r.env.PANTRY_REGISTRY_URL||"https://registry.pantry.dev").replace(/\/$/,""),nX="registry-1.docker.io",t0=[p.manifest,p.manifestList,p.dockerManifest,p.dockerManifestList].join(", ");function rX(Q){let X=Q,$,Z=X.indexOf("@");if(Z!==-1)$=X.slice(Z+1),X=X.slice(0,Z);let W=X.indexOf("/"),H="",U=X,J=!0;if(W!==-1){let O=X.slice(0,W);if(O==="localhost"||O.includes(".")||O.includes(":"))H=O,U=X.slice(W+1),J=!1}let Y=U,G="latest",z=U.lastIndexOf(":");if(z!==-1&&!U.slice(z).includes("/"))Y=U.slice(0,z),G=U.slice(z+1);if(J&&!Y.includes("/"))Y=`library/${Y}`;return{registry:H,repository:Y,tag:G,digest:$,implicitRegistry:J}}function s(Q,X={}){let{method:$="GET",headers:Z={},body:W,maxRedirects:H=5}=X;return new Promise((U,J)=>{let Y=new URL(Q),G=iX.request({method:$,hostname:Y.hostname,port:Y.port||443,path:Y.pathname+Y.search,headers:{"User-Agent":"pantry-container",...Z},timeout:60000},(z)=>{let O=z.statusCode||0;if(O>=300&&O<400&&z.headers.location&&H>0){let L=new URL(z.headers.location,Q).toString();z.resume();let _={...Z};if(new URL(L).hostname!==Y.hostname)delete _.Authorization;return s(L,{method:$,headers:_,body:W,maxRedirects:H-1}).then(U,J)}let K=[];z.on("data",(L)=>K.push(L)),z.on("end",()=>U({status:O,headers:z.headers,body:Buffer.concat(K)}))});if(G.on("error",J),G.on("timeout",()=>{G.destroy(),J(Error(`timeout: ${Q}`))}),W)G.write(W);G.end()})}function sX(Q,X,$={},Z=5){return new Promise((W,H)=>{let U=new URL(Q),J=iX.get({hostname:U.hostname,port:U.port||443,path:U.pathname+U.search,headers:{"User-Agent":"pantry-container",...$},timeout:120000},(Y)=>{let G=Y.statusCode||0;if(G>=300&&G<400&&Y.headers.location&&Z>0){Y.resume();let K=new URL(Y.headers.location,Q).toString(),L={...$};if(new URL(K).hostname!==U.hostname)delete L.Authorization;return sX(K,X,L,Z-1).then(W,H)}if(G<200||G>=300)return Y.resume(),H(Error(`HTTP ${G} downloading ${Q}`));let z=wQ.createWriteStream(X),O=0;Y.on("data",(K)=>{O+=K.length}),Y.pipe(z),z.on("finish",()=>z.close(()=>W(O))),z.on("error",H)});J.on("error",H),J.on("timeout",()=>{J.destroy(),H(Error(`timeout: ${Q}`))})})}async function tX(Q,X,$){let Z=Q==="pantry"?XQ:`https://${Q}`;if(Z===XQ)return r.env.PANTRY_REGISTRY_TOKEN||r.env.PANTRY_TOKEN||void 0;let W=await s(`${Z}/v2/`);if(W.status!==401)return;let H=String(W.headers["www-authenticate"]||""),U=/realm="([^"]+)"/.exec(H)?.[1],J=/service="([^"]+)"/.exec(H)?.[1];if(!U)return;let Y=new URL(U);if(J)Y.searchParams.set("service",J);Y.searchParams.set("scope",`repository:${X}:${$}`);let G={},z=r.env.DOCKER_USERNAME,O=r.env.DOCKER_PASSWORD||r.env.DOCKER_TOKEN;if(z&&O)G.Authorization=`Basic ${Buffer.from(`${z}:${O}`).toString("base64")}`;let K=await s(Y.toString(),{headers:G});if(K.status!==200)return;let L=JSON.parse(K.body.toString());return L.token||L.access_token}function a0(Q){if(!Q.implicitRegistry&&Q.registry){let X=XQ.includes(Q.registry);return[{base:X?XQ:`https://${Q.registry}`,hostKey:X?"pantry":Q.registry}]}return[{base:XQ,hostKey:"pantry"},{base:`https://${nX}`,hostKey:nX}]}async function oX(Q,X,$,Z){let W={Accept:t0};if(Z)W.Authorization=`Bearer ${Z}`;return s(`${Q}/v2/${X}/manifests/${$}`,{headers:W})}async function GX(Q,X,$={}){let Z=rX(Q),W=$.platform?.split("/")[0]||"linux",H=$.platform?.split("/")[1]||(r.arch==="arm64"?"arm64":"amd64");wQ.mkdirSync(X,{recursive:!0});let U;for(let{base:J,hostKey:Y}of a0(Z))try{let G=await tX(Y,Z.repository,"pull"),z=Z.digest||Z.tag,O=await oX(J,Z.repository,z,G);if(O.status===404||O.status===401){U=Error(`${J}: HTTP ${O.status} for ${Z.repository}:${z}`);continue}if(O.status!==200)throw Error(`${J}: manifest HTTP ${O.status}`);let K=JSON.parse(O.body.toString());if(K.manifests&&Array.isArray(K.manifests)){let T=K.manifests.find((j)=>j.platform?.os===W&&j.platform?.architecture===H)||K.manifests.find((j)=>j.platform?.architecture===H)||K.manifests[0];if(!T)throw Error("no matching platform in image index");if(O=await oX(J,Z.repository,T.digest,G),O.status!==200)throw Error(`${J}: platform manifest HTTP ${O.status}`);K=JSON.parse(O.body.toString())}let L=QQ(O.body),_=G?{Authorization:`Bearer ${G}`}:{},q=K.config.digest,B=await s(`${J}/v2/${Z.repository}/blobs/${q}`,{headers:_});if(B.status!==200)throw Error(`${J}: config blob HTTP ${B.status}`);let w=JSON.parse(B.body.toString()),I=[],C=w.rootfs?.diff_ids||[];for(let T=0;T<K.layers.length;T++){let j=K.layers[T],R=s0.join(X,`${o(j.digest)}.tar.gz`);if(!$.quiet)console.error(` ↓ layer ${T+1}/${K.layers.length} ${j.digest.slice(0,19)}…`);let E=await sX(`${J}/v2/${Z.repository}/blobs/${j.digest}`,R,_);I.push({digest:j.digest,diffId:C[T]||"",path:R,size:E})}return{manifest:K,manifestDigest:L,config:w,layers:I,source:J}}catch(G){U=G}throw Error(`Failed to pull ${Q}: ${U?.message||"unknown error"}`)}async function e0(Q){let X=(Q.registry||XQ).replace(/\/$/,""),$=X===XQ?"pantry":new URL(X).hostname,Z=await tX($,Q.repository,"push,pull"),W=Z?{Authorization:`Bearer ${Z}`}:{},H=async(Y,G)=>{if((await s(`${X}/v2/${Q.repository}/blobs/${Y}`,{method:"HEAD",headers:W})).status===200)return;let O=await s(`${X}/v2/${Q.repository}/blobs/uploads/`,{method:"POST",headers:W});if(O.status!==202)throw Error(`push: upload start HTTP ${O.status} for ${Q.repository}`);let K=String(O.headers.location||""),L=new URL(K,X);L.searchParams.set("digest",Y);let _=await s(L.toString(),{method:"PUT",headers:{...W,"Content-Type":"application/octet-stream"},body:G});if(_.status!==201)throw Error(`push: blob PUT HTTP ${_.status}`)};if(!Q.quiet)console.error(" ↑ config");await H(Q.configDigest,Q.configBytes);for(let Y=0;Y<Q.layers.length;Y++){if(!Q.quiet)console.error(` ↑ layer ${Y+1}/${Q.layers.length}`);await H(Q.layers[Y].digest,wQ.readFileSync(Q.layers[Y].path))}let U=QQ(Q.manifestBytes),J=await s(`${X}/v2/${Q.repository}/manifests/${Q.tag}`,{method:"PUT",headers:{...W,"Content-Type":Q.manifestMediaType},body:Q.manifestBytes});if(J.status!==201&&J.status!==200)throw Error(`push: manifest PUT HTTP ${J.status}`);return{ref:`${X.replace(/^https?:\/\//,"")}/${Q.repository}:${Q.tag}`,digest:U}}function Q4(Q,X){let $=r0("sha256");return $.update(wQ.readFileSync(Q)),`sha256:${$.digest("hex")}`===X}function zX(Q,X){wQ.mkdirSync(X,{recursive:!0}),i0("tar",["xzf",Q,"-C",X],{stdio:"pipe",maxBuffer:536870912})}function aX(){return{env:new Map,args:new Map,workdir:"/",labels:new Map,exposed:new Set,volumes:new Set,shell:["/bin/sh","-c"]}}function $Q(Q,X){let $=(Z)=>X.args.get(Z)??X.env.get(Z)??"";return Q.replace(/\$\{([A-Z0-9_]+)\}/gi,(Z,W)=>$(W)).replace(/\$([A-Z0-9_]+)/gi,(Z,W)=>$(W))}function vQ(Q){let X=[];if(/^\s*[A-Z0-9_]+=/i.test(Q)){let $=/([A-Z0-9_]+)=("(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\S+)/gi,Z=$.exec(Q);while(Z){let W=Z[2];if(W.startsWith('"')&&W.endsWith('"')||W.startsWith("'")&&W.endsWith("'"))W=W.slice(1,-1);X.push([Z[1],W]),Z=$.exec(Q)}}else{let $=Q.search(/\s/);if($!==-1)X.push([Q.slice(0,$),Q.slice($+1).trim()])}return X}function $4(Q,X,$){let Z=$.startsWith("/")?$:P.posix.join(X,$);return P.join(Q,Z)}function Z4(Q){if(Q&&Q!=="auto")return Q;let X=uQ.platform==="linux",$=typeof uQ.getuid==="function"&&uQ.getuid()===0;return X&&$?"chroot":"host"}function OX(Q,X){let $=D.lstatSync(Q);if($.isSymbolicLink()){let Z=D.readlinkSync(Q);D.mkdirSync(P.dirname(X),{recursive:!0}),D.rmSync(X,{force:!0}),D.symlinkSync(Z,X)}else if($.isDirectory())D.mkdirSync(X,{recursive:!0}),D.cpSync(Q,X,{recursive:!0});else D.mkdirSync(P.dirname(X),{recursive:!0}),D.copyFileSync(Q,X)}async function W4(Q){let X=P.resolve(Q.context),$=Q.dockerfile?P.resolve(Q.dockerfile):P.join(X,"Dockerfile");if(!D.existsSync($))throw Error(`Dockerfile not found: ${$}`);let Z=QX(D.readFileSync($,"utf8")),W=XX(Z,Q.target);if(W.length===0)throw Error("Dockerfile has no FROM instruction");let H=Q.quiet??!1,U=(N)=>{if(!H)console.error(N)},J=Z4(Q.runMode),{os:Y,architecture:G}=pX(Q.platform),z=D.mkdtempSync(P.join(X4.tmpdir(),"pantry-build-")),O=P.join(z,"blobs");D.mkdirSync(O,{recursive:!0});let K=new Map,L=ZX(X,P.dirname($)),_=eQ(X,L),q=aX(),B="",w=new Map;for(let N of Z.globalArgs){let[y,c]=vQ(N.args)[0]??[];if(y)w.set(y,Q.buildArgs?.[y]??c??"")}for(let N of W){let y=aX();for(let[WQ,l]of w)y.args.set(WQ,l);let c=P.join(z,`stage-${N.index}`);D.mkdirSync(c,{recursive:!0});let ZQ=$Q(N.baseImage,y);if(U(`[stage ${N.index}${N.name?` ${N.name}`:""}] FROM ${ZQ}`),ZQ==="scratch");else if(K.has(ZQ))D.cpSync(K.get(ZQ),c,{recursive:!0});else{let WQ=await GX(ZQ,O,{platform:Q.platform,quiet:H});for(let _Q of WQ.layers)zX(_Q.path,c);let l=WQ.config.config||{};for(let _Q of l.Env||[]){let hQ=_Q.indexOf("=");if(hQ!==-1)y.env.set(_Q.slice(0,hQ),_Q.slice(hQ+1))}if(l.WorkingDir)y.workdir=l.WorkingDir;if(l.Entrypoint)y.entrypoint=l.Entrypoint;if(l.Cmd)y.cmd=l.Cmd;if(l.User)y.user=l.User;U(` pulled base from ${WQ.source}`)}for(let WQ of N.instructions)J4(WQ,y,c,{context:X,contextEntries:_,stageRootfs:K,runMode:J,matcher:L,log:U});if(N.name)K.set(N.name,c);q=y,B=c}U("packaging image layer...");let I=WX(B,O),C=new Date().toISOString(),T={architecture:G,os:Y,created:C,config:{User:q.user,ExposedPorts:q.exposed.size?Object.fromEntries([...q.exposed].map((N)=>[N,{}])):void 0,Env:[...q.env].map(([N,y])=>`${N}=${y}`),Entrypoint:q.entrypoint,Cmd:q.cmd,Volumes:q.volumes.size?Object.fromEntries([...q.volumes].map((N)=>[N,{}])):void 0,WorkingDir:q.workdir!=="/"?q.workdir:void 0,Labels:q.labels.size?Object.fromEntries(q.labels):void 0,StopSignal:q.stopSignal},rootfs:{type:"layers",diff_ids:[I.diffId]},history:[{created:C,created_by:"pantry build",comment:"flattened image"}]},{bytes:j,digest:R}=JX(T),{bytes:E,digest:F,manifest:V}=HX(R,j.length,[I]),x=Q.tags??[],b=Q.outputDir?P.resolve(Q.outputDir):P.join(X,".pantry","images");D.mkdirSync(b,{recursive:!0});let d=P.join(b,"oci-layout");D.mkdirSync(d,{recursive:!0}),UX(d,E,F,j,R,[I],x);let f=`${(x[0]||"image").replace(/[/:]/g,"_")}.tar`,h=P.join(b,f);YX(h,j,R,[I],x),U(`built ${F}`);try{D.rmSync(z,{recursive:!0,force:!0})}catch{}return{imageId:F,tags:x,archivePath:h,ociLayoutPath:d,config:T,layers:[I],configBytes:j,configDigest:R,manifestBytes:E,manifestMediaType:V.mediaType}}function J4(Q,X,$,Z){let W=$Q(Q.args,X);switch(Q.instruction){case"ENV":{for(let[H,U]of vQ(Q.args))X.env.set(H,$Q(U,X));break}case"ARG":{let[H,U]=vQ(Q.args)[0]??[];if(H&&!X.args.has(H))X.args.set(H,U?$Q(U,X):"");break}case"LABEL":{for(let[H,U]of vQ(Q.args))X.labels.set(H,$Q(U,X));break}case"WORKDIR":{let H=W.startsWith("/")?W:P.posix.join(X.workdir,W);X.workdir=H,D.mkdirSync(P.join($,H),{recursive:!0});break}case"USER":{X.user=W.trim();break}case"EXPOSE":{for(let H of W.split(/\s+/).filter(Boolean))X.exposed.add(H.includes("/")?H:`${H}/tcp`);break}case"VOLUME":{let U=e(Q.args)??W.split(/\s+/).filter(Boolean);for(let J of U)X.volumes.add(J);break}case"STOPSIGNAL":{X.stopSignal=W.trim();break}case"SHELL":{let H=e(Q.args);if(H)X.shell=H;break}case"ENTRYPOINT":{let H=e(Q.args);X.entrypoint=H??[...X.shell,W];break}case"CMD":{let H=e(Q.args);X.cmd=H??[...X.shell,W];break}case"COPY":case"ADD":{H4(Q,X,$,Z);break}case"RUN":{U4(Q,X,$,Z);break}case"MAINTAINER":{X.labels.set("maintainer",W.trim());break}default:Z.log(` (skipping unsupported instruction: ${Q.instruction})`)}}function H4(Q,X,$,Z){let H=e(Q.args)??$Q(Q.args,X).split(/\s+/).filter(Boolean);if(H.length<2)return;let U=H[H.length-1],J=H.slice(0,-1),Y=Q.flags.from,G=$4($,X.workdir,U),z=U.endsWith("/")||J.length>1;if(Y&&Z.stageRootfs.has(Y)){let O=Z.stageRootfs.get(Y);if(z)D.mkdirSync(G,{recursive:!0});for(let K of J){let L=P.join(O,K);if(!D.existsSync(L)){Z.log(` COPY --from: source not found, skipping: ${K}`);continue}let _=z?P.join(G,P.basename(K)):G;OX(L,_)}return}for(let O of J){let K=O.replace(/^\.\/?/,"").replace(/\/+$/,""),L=K===""?"":`${K}/`,_=Z.contextEntries.find((B)=>!B.isDir&&B.relPath===K);if(_){let B=z?P.join(G,P.basename(K)):G;OX(_.absPath,B);continue}let q=Z.contextEntries.filter((B)=>B.relPath!==K&&(L===""?!0:B.relPath.startsWith(L)));if(q.length===0){Z.log(` COPY: source not found or empty, skipping: ${O}`);continue}D.mkdirSync(G,{recursive:!0});for(let B of q){let w=L===""?B.relPath:B.relPath.slice(L.length),I=P.join(G,w);if(B.isDir)D.mkdirSync(I,{recursive:!0});else OX(B.absPath,I)}}}function U4(Q,X,$,Z){if(Z.runMode==="skip"){Z.log(` RUN (skipped): ${Q.args}`);return}let W=e(Q.args),H={...uQ.env,...Object.fromEntries(X.env)},U=P.join($,X.workdir);if(D.mkdirSync(U,{recursive:!0}),Z.runMode==="chroot"){let J=W?W:[...X.shell,`cd ${X.workdir} 2>/dev/null; ${$Q(Q.args,X)}`];Z.log(` RUN ${W?W.join(" "):Q.args}`),KX("chroot",[$,...J],{stdio:"inherit",env:H});return}if(Z.log(` RUN (host) ${W?W.join(" "):Q.args}`),W)KX(W[0],W.slice(1),{cwd:U,stdio:"inherit",env:H});else KX(X.shell[0],[...X.shell.slice(1),$Q(Q.args,X)],{cwd:U,stdio:"inherit",env:H})}import LQ from"node:fs";import eX from"node:path";var Y4=`# .freezer — pantry's home-themed .dockerignore.
287
+ # Anything matched here is kept OUT of the build context (and the image).
288
+ # Dependencies are reinstalled inside the image, so never ship them.
289
+ node_modules
290
+ **/node_modules
291
+ pantry
292
+ **/pantry
293
+
294
+ # VCS / CI / local noise
295
+ .git
296
+ .github
297
+ .cache
298
+ **/.cache
299
+ tmp
300
+ temp
301
+ **/*.log
302
+ .DS_Store
303
+
304
+ # Local-only env overlays — runtime config is provided at run time
305
+ .env.local
306
+ .env.*.local
307
+
308
+ # Build artifacts the image rebuilds or doesn't need
309
+ .pantry
310
+ coverage
311
+ .ts-cloud
312
+ `;function Q0(Q){let X=Q.baseImage??"oven/bun:1.3.10",$=Q.workdir??"/app",Z=Q.installCommand??"bun install --frozen-lockfile",W=Q.port??3000,H=Q.startCommand??["bun","start"],U={APP_ENV:"production",NODE_ENV:"production",PORT:String(W),...Q.env??{}},J=[];if(J.push("# Generated by `pantry container:generate` — native, depless container support."),J.push("# Build with: pantry build -t <name> . (no Docker daemon required)"),J.push(`FROM ${X} AS base`),J.push(`WORKDIR ${$}`),J.push(""),J.push("# Bring in the source (filtered by .freezer) and install deps in-image so"),J.push("# the build context / release stays small."),J.push("COPY . ."),J.push(`RUN ${Z}`),Q.buildCommand)J.push(`RUN ${Q.buildCommand}`);J.push(""),J.push("# Many base images run as a non-root user but COPY lands as root; hand"),J.push("# ownership over so the app can write caches/manifests/logs at boot."),J.push(`RUN chown -R bun:bun ${$} || true`),J.push("USER bun"),J.push("");for(let[Y,G]of Object.entries(U))J.push(`ENV ${Y}=${G}`);return J.push(""),J.push(`EXPOSE ${W}/tcp`),J.push(`CMD ${JSON.stringify(H)}`),J.push(""),J.join(`
313
+ `)}function G4(Q){LQ.mkdirSync(Q.outDir,{recursive:!0});let X=eX.join(Q.outDir,Q.dockerfileName??"Dockerfile"),$=eX.join(Q.outDir,".freezer"),Z=!1,W=!1;if(Q.force||!LQ.existsSync(X))LQ.writeFileSync(X,Q0(Q)),Z=!0;if(Q.force||!LQ.existsSync($))LQ.writeFileSync($,Y4),W=!0;return{dockerfilePath:X,freezerPath:$,wroteDockerfile:Z,wroteFreezer:W}}export{qX as a,$0 as b,_4 as c,q4 as d,B4 as e,BX as f,w4 as g,L4 as h,j4 as i,T4 as j,C4 as k,R4 as l,wX as m,I4 as n,E4 as o,F4 as p,M4 as q,S4 as r,b4 as s,y4 as t,P4 as u,D4 as v,u4 as w,v4 as x,h4 as y,k4 as z,f4 as A,g4 as B,m4 as C,d4 as D,RQ as E,W0 as F,n4 as G,EX as H,JQ as I,IQ as J,gQ as K,FX as L,o4 as M,MQ as N,cQ as O,VX as P,z0 as Q,lQ as R,j0 as S,s4 as T,t4 as U,xQ as V,pQ as W,xX as X,T0 as Y,C0 as Z,uX as _,M0 as $,S0 as aa,oQ as ba,iQ as ca,rQ as da,sQ as ea,h0 as fa,_5 as ga,q5 as ha,B5 as ia,w5 as ja,j5 as ka,T5 as la,C5 as ma,R5 as na,eQ as oa,QX as pa,e as qa,XX as ra,dX as sa,cX as ta,ZX as ua,p as va,QQ as wa,o as xa,WX as ya,JX as za,HX as Aa,UX as Ba,YX as Ca,XQ as Da,rX as Ea,GX as Fa,e0 as Ga,Q4 as Ha,zX as Ia,W4 as Ja,Q0 as Ka,G4 as La};
@@ -1 +1 @@
1
- import{db as a,eb as b,fb as c,gb as d,hb as e,ib as f,jb as g}from"./chunk-58tv7cc0.js";import"./chunk-ghzc37v7.js";export{g as updateApp,d as scanInstalledApps,c as isNewerVersion,e as fetchDesktopCatalogue,f as checkAppUpdates,a as SYSTEM_APPS,b as MAS_APPS};
1
+ import{Ma as a,Na as b,Oa as c,Pa as d,Qa as e,Ra as f,Sa as g}from"./chunk-c0pn1x0j.js";import"./chunk-ghzc37v7.js";export{g as updateApp,d as scanInstalledApps,c as isNewerVersion,e as fetchDesktopCatalogue,f as checkAppUpdates,a as SYSTEM_APPS,b as MAS_APPS};
@@ -1,3 +1,3 @@
1
1
  import{execSync as $}from"node:child_process";import Z from"node:fs";import x from"node:os";import F from"node:path";var Y=process.env.PANTRY_REGISTRY_URL||"https://registry.pantry.dev",D={"Logi Options+":"logitech.com/options-plus",logioptionsplus:"logitech.com/options-plus","Logi Options Plus":"logitech.com/options-plus",logioptionsplus_installer:"logitech.com/options-plus"},y=new Set(["Safari","Numbers","Pages","Keynote","GarageBand","iMovie","Color Picker","Simulator","Simulator (Watch)","Preview","TextEdit","Automator","Font Book","Migration Assistant","Photo Booth","System Preferences","System Settings","Disk Utility","Terminal","Activity Monitor","Console","Grapher","Script Editor","Time Machine","Photos","Mail","Calendar","Contacts","Reminders","Notes","Maps","Messages","FaceTime","Books","News","Stocks","Weather","Home","Podcasts","Music","TV","Voice Memos","Freeform","Shortcuts","Chess","Dictionary","Stickies","Image Capture","Xcode"]),N=new Set(["Xcode","Numbers","Pages","Keynote","GarageBand","iMovie","Things3","Grammarly for Safari","AdBlock","HP Smart","Audible","Mini Motorways","Snake.io+","WhatsApp Messenger","Honey","Wappalyzer"]);function A(H,J){if(!H||!J||H===J)return!1;if(J==="?")return!!H;let L=(B)=>B.replace(/[,+].*/g,"").replace(/-.*$/,"").split(".").map((K)=>Number.parseInt(K,10)||0),j=L(H),q=L(J);for(let B=0;B<Math.max(j.length,q.length);B++){let K=j[B]||0,Q=q[B]||0;if(K>Q)return!0;if(K<Q)return!1}return!1}function T(H){return H.toLowerCase().replace(/[^a-z0-9]/g,"")}function S(H="/Applications"){if(process.platform!=="darwin")return[];let J=[];if(!Z.existsSync(H))return J;let L=Z.readdirSync(H).filter((j)=>j.endsWith(".app"));for(let j of L){let q=j.replace(/\.app$/,""),B=`${H}/${j}`,K="?",Q;try{let W=`${B}/Contents/Info.plist`;if(Z.existsSync(W)){let X=$(`/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" "${W}" 2>/dev/null`,{timeout:5000,encoding:"utf-8"}).trim();if(X)K=X;try{Q=$(`/usr/libexec/PlistBuddy -c "Print :CFBundleIdentifier" "${W}" 2>/dev/null`,{timeout:5000,encoding:"utf-8"}).trim()||void 0}catch{}}}catch{}J.push({name:q,version:K,path:B,bundleId:Q})}return J}async function P(){try{let H=await fetch(`${Y}/desktop-apps`);if(!H.ok)return[];let J=await H.json();return(J.apps??J??[]).filter((j)=>j&&j.domain).map((j)=>({domain:j.domain,label:j.label??j.name??j.domain,version:j.version??null,platforms:j.platforms}))}catch{return[]}}function R(H,J){let L=D[H];if(L){let q=J.find((B)=>B.domain===L);if(q)return q}let j=T(H);return J.find((q)=>T(q.label)===j||T(q.domain.replace(/\.(com|app|io|net|dev|org|ai|so|rest|fr)$/,""))===j)??null}async function u(H){let J=H||S(),L=await P(),j=[];for(let q of J){let B="unknown",K=null,Q=!1,W=null;if(y.has(q.name))B="system";else{let X=R(q.name,L);if(X)B="pantry",W=X.domain,K=X.version,Q=!!K&&A(K,q.version);else if(N.has(q.name))B="mas"}j.push({name:q.name,currentVersion:q.version,latestVersion:K,updateAvailable:Q,source:B,domain:W})}return j.sort((q,B)=>{if(q.updateAvailable&&!B.updateAvailable)return-1;if(!q.updateAvailable&&B.updateAvailable)return 1;return q.name.localeCompare(B.name)}),j}async function m(H){if(process.platform!=="darwin")return{success:!1,error:"Desktop app updates are macOS-only"};try{let J=await P(),L=R(H,J);if(!L)return{success:!1,error:`"${H}" is not a pantry-published desktop app`};let j=L.domain,q=await fetch(`${Y}/binaries/${encodeURI(j)}/metadata.json`);if(!q.ok)return{success:!1,error:`no registry metadata for ${j}`};let B=await q.json(),K=B.latestVersion,Q=x.arch()==="arm64"?"darwin-arm64":"darwin-x86-64",W=B.versions?.[K]?.platforms??{},X=W[Q]??W["darwin-arm64"]??W["darwin-x86-64"];if(!X?.tarball)return{success:!1,error:`no ${Q} build published for ${j}@${K}`};let k=`${Y}/${String(X.tarball).replace(/^\/?/,"")}`,z=Z.mkdtempSync(F.join(x.tmpdir(),"pantry-app-"));try{let w=F.join(z,"pkg.tar.gz"),C=await fetch(k);if(!C.ok)return{success:!1,error:`failed to download ${k} (${C.status})`};Z.writeFileSync(w,Buffer.from(await C.arrayBuffer()));let U=F.join(z,"x");Z.mkdirSync(U,{recursive:!0}),$(`tar -xzf "${w}" -C "${U}"`,{timeout:120000});let _=(V,E)=>{for(let O of Z.readdirSync(V,{withFileTypes:!0})){if(!O.isDirectory())continue;let g=F.join(V,O.name);if(O.name.endsWith(".app"))return g;if(E>0){let I=_(g,E-1);if(I)return I}}return null},G=_(U,3);if(!G)return{success:!1,error:`tarball for ${j} contained no .app bundle`};let M=`/Applications/${F.basename(G)}`;return $(`rm -rf "${M}"`,{timeout:30000}),$(`ditto "${G}" "${M}"`,{timeout:120000}),$(`xattr -dr com.apple.quarantine "${M}" 2>/dev/null || true`,{timeout:30000}),{success:!0,version:K}}finally{try{Z.rmSync(z,{recursive:!0,force:!0})}catch{}}}catch(J){return{success:!1,error:(J?.message||"Update failed").toString().trim().split(`
2
2
  `).pop()}}}
3
- export{y as db,N as eb,A as fb,S as gb,P as hb,u as ib,m as jb};
3
+ export{y as Ma,N as Na,A as Oa,S as Pa,P as Qa,u as Ra,m as Sa};