ts-pantry 0.10.12 → 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.
- package/dist/bin/cli.js +3 -3
- package/dist/{chunk-858cxz72.js → chunk-ax2wz06f.js} +44 -44
- package/dist/chunk-c7csvans.js +2 -0
- package/dist/{chunk-ep3zp05s.js → chunk-hk7ns20y.js} +1 -1
- package/dist/chunk-sa2nn9dg.js +1 -0
- package/dist/{chunk-h23sa5s2.js → chunk-tbgzzd68.js} +1 -1
- package/dist/{chunk-0cc7ytd6.js → chunk-wzw3xbn2.js} +1 -1
- package/dist/packages/anthropic.com/claude-code.d.ts +1 -1
- package/dist/packages/apps/cursorcom.d.ts +1 -1
- package/dist/packages/apps/discordcom.d.ts +1 -1
- package/dist/packages/apps/raycastcom.d.ts +1 -1
- package/dist/packages/apps/rectangleapp.d.ts +1 -1
- package/dist/packages/apps/zeddev.d.ts +1 -1
- package/dist/packages/aux4io.d.ts +1 -1
- package/dist/packages/certbotefforg.d.ts +1 -1
- package/dist/packages/cnqueryio.d.ts +1 -1
- package/dist/packages/denoland.d.ts +1 -1
- package/dist/packages/depotdev.d.ts +1 -1
- package/dist/packages/dozzledev.d.ts +1 -1
- package/dist/packages/github.com/ggerganov/llama.cpp.d.ts +1 -1
- package/dist/packages/github.com/shaka-project/shaka-packager.d.ts +1 -1
- package/dist/packages/materializecom.d.ts +1 -1
- package/dist/packages/misejdxdev.d.ts +1 -1
- package/dist/packages/nginxorg.d.ts +1 -1
- package/dist/packages/ohmyposhdev.d.ts +1 -1
- package/dist/packages/opencodeai.d.ts +1 -1
- package/dist/packages/openshiftcom.d.ts +1 -1
- package/dist/packages/pnpmio.d.ts +1 -1
- package/dist/packages/prefixdev.d.ts +1 -1
- package/dist/packages/projenio.d.ts +1 -1
- package/dist/packages/rucio.cern.ch/rucio-client.d.ts +1 -1
- package/dist/packages/traefikio.d.ts +1 -1
- package/dist/packages/tursotech.d.ts +1 -1
- package/dist/packages/ziglangorg.d.ts +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/testing/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-jypchrvb.js +0 -2
- package/dist/chunk-tzzpsd63.js +0 -1
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import{Ab as yX}from"./chunk-jkfbbcs7.js";import{Ib as
|
|
2
|
-
`)}function
|
|
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
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
|
|
5
|
-
`)}function
|
|
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
|
|
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 c4(Q,X="src/packages"){try{let $;if(Q.includes("/"))$=RQ.join(X,`${Q}.ts`);else{let z=`${Q.replace(/\./g,"")}.ts`;$=RQ.join(X,z)}if(!JQ.existsSync($))return[];let Z=JQ.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-h23sa5s2.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&&WQ(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&&WQ(U,$)>=0})[0]||null}if(X.startsWith(">=")){let $=X.slice(2).trim();return Q.filter((W)=>WQ(W,$)>=0)[0]||null}if(X.startsWith(">")){let $=X.slice(1).trim();return Q.filter((W)=>WQ(W,$)>0)[0]||null}if(X.startsWith("<=")){let $=X.slice(2).trim();return Q.filter((W)=>WQ(W,$)<=0)[0]||null}if(X.startsWith("<")){let $=X.slice(1).trim();return Q.filter((W)=>WQ(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 WQ(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 CQ=null;async function Y0(){if(CQ)return CQ;return CQ=(await import("./chunk-h23sa5s2.js").catch(()=>import("./src/index.js"))).packages,CQ}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 EQ(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):(.+)$/),w=!!q,B=q?q[2]:_,I=q?q[1]:void 0;if(w&&(!J||U&&I!==U))return null;let C=B,T="latest",j="*",R=B.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:w,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:_})=>EQ(_,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 dQ(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(WQ(_.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 MX(Q,X={}){let{verbose:$=!1}=X;if($)console.log(`Parsing dependency file: ${Q}`);let Z=IQ(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 EQ(Y.name,X)}));for(let Y of H)W.push(...Y);if($)console.log(`Total dependencies found (before deduplication): ${W.length}`);let U=await dQ(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=RQ.extname(Q);if(J===".yaml"||J===".yml"){let Y=W0(Q);if(Y.services)U.services=Y.services}return U}function l4(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=RQ.join(Q,Z);if(JQ.existsSync(W))$.push(W)}return $}import*as S from"node:fs";import*as v from"node:path";import*as s from"node:os";import*as mQ from"node:https";import*as cQ from"node:http";import{execFileSync as MQ}from"node:child_process";function SQ(){let Q=process.env.XDG_DATA_HOME,X=Q&&Q.length>0?Q:v.join(s.homedir(),".local","share");return v.join(X,"pantry","global","bin")}function lQ(){let Q=s.platform(),X=s.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 FX(Q,X,$,Z){S.mkdirSync($,{recursive:!0});let W=null;for(let H of X){let U=v.join(Q,H);if(!S.existsSync(U))U=v.join(Q,"bin",H);if(!S.existsSync(U)){if(W){let Y=v.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=v.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||lQ(),W=BQ[Q];if(!W)throw Error(`Unknown package: ${Q}. Supported: ${Object.keys(BQ).join(", ")}`);if(/^[\^~>=<]/.test(X))X=await O0(Q,X);else if(X==="latest"||X==="*"||!X)X=await wQ(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||v.join(process.cwd(),"pantry"),U=v.join(H,".bin"),J=v.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=v.join(J,Y[0]),z=v.join(J,"bin",Y[0]);if(S.existsSync(G)||S.existsSync(z)){if(!$.quiet)console.log(` ✓ ${Q}@${X} (cached)`);if($.createBinLinks!==!1)FX(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(v.join(s.tmpdir(),"pantry-")),_=v.join(L,`archive.${K}`);try{await AX(O,_,10,$.quiet??!1);let q=v.join(L,"extracted");S.mkdirSync(q,{recursive:!0}),await _0(_,q,K);let w=q,B=W.getArchivePrefix?.(X,Z);if(B){let C=v.join(q,B);if(S.existsSync(C))w=C;else{let j=S.readdirSync(q).find((R)=>S.statSync(v.join(q,R)).isDirectory());if(j)w=v.join(q,j)}}if(S.mkdirSync(J,{recursive:!0}),q0(w,J),Z.os!=="windows")for(let C of Y){let T=v.join(J,C);if(S.existsSync(T))S.chmodSync(T,493);let j=v.join(J,"bin",C);if(S.existsSync(j))S.chmodSync(j,493)}if($.createBinLinks!==!1)FX(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:SQ();S.mkdirSync(W,{recursive:!0});let H=[];for(let U of X){let J=v.join(Q,U);if(!S.existsSync(J))J=v.join(Q,"bin",U);if(!S.existsSync(J))continue;let Y=v.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 wQ(Q){if(Q==="bun.sh"){let $=(await HQ("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 HQ("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 HQ("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 HQ("https://api.github.com/repos/mail-os/mail/releases/latest").catch(()=>null))?.tag_name?.replace(/^v/,"")||"";if($)return $;let W=((await HQ("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-h23sa5s2.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 HQ("https://ziglang.org/download/index.json")).master?.version;if($&&$.startsWith(Q))return $}catch{}return null}async function O0(Q,X){let $;try{let U=Q.replace(/[^a-z0-9]/gi,"").toLowerCase(),{packages:J}=await import("./chunk-h23sa5s2.js").catch(()=>import("./src/index.js"));$=J[U]?.versions||[]}catch{$=[]}if($.length===0)return wQ(Q);let Z=X.match(/^([~^>=<]+)(\d+(?:\.\d+){0,10})/);if(!Z)return wQ(Q);let W=Z[1],H=Z[2].split(".").map(Number);for(let U of $){if(U.includes("-")&&!Z[2].includes("-"))continue;let J=U.split(".").map(Number);if(W==="^"){if(H[0]===0){if(J[0]===H[0]&&J[1]===H[1]&&(J[2]||0)>=(H[2]||0))return U}else if(J[0]===H[0]&&(J[1]>H[1]||J[1]===H[1]&&(J[2]||0)>=(H[2]||0)))return U}else if(W==="~"){if(J[0]===H[0]&&J[1]===H[1]&&(J[2]||0)>=(H[2]||0))return U}else if(W===">="){if(J[0]>H[0]||J[0]===H[0]&&J[1]>H[1]||J[0]===H[0]&&J[1]===H[1]&&(J[2]||0)>=(H[2]||0))return U}}return console.warn(`No version matching ${X} found for ${Q}, falling back to latest`),wQ(Q)}function AX(Q,X,$=10,Z=!1){return new Promise((W,H)=>{let U=S.createWriteStream(X),J=Q.startsWith("https")?mQ.get:cQ.get,Y=!Z&&process.stderr.isTTY,G=Date.now(),z=0,O=0,K=0,L=60000,_=J(Q,(B)=>{if(B.statusCode&&B.statusCode>=300&&B.statusCode<400&&B.headers.location){U.close();try{S.unlinkSync(X)}catch{}if($<=0)return H(Error(`Too many redirects for ${Q}`));return AX(B.headers.location,X,$-1,Z).then(W,H)}if(!B.statusCode||B.statusCode<200||B.statusCode>=300){U.close();try{S.unlinkSync(X)}catch{}return H(Error(`HTTP ${B.statusCode||"unknown"} downloading ${Q}`))}let I=B.headers["content-length"];if(I)O=Number.parseInt(I,10)||0;B.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`)}}),B.pipe(U),B.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",(B)=>{U.close();try{S.unlinkSync(X)}catch{}H(B)});let q=setInterval(()=>{if(Date.now()-G>L)clearInterval(q),_.destroy(Error(`Download stalled (no data for ${L/1000}s): ${Q}`))},5000),w=()=>clearInterval(q);U.once("finish",w),U.once("error",w),_.once("error",w)})}async function _0(Q,X,$){if($==="zip")if(process.platform==="win32")MQ("powershell",["-NoProfile","-Command","Expand-Archive","-Path",Q,"-DestinationPath",X,"-Force"],{stdio:"pipe"});else MQ("unzip",["-o","-q",Q,"-d",X],{stdio:"pipe"});else if($==="tar.xz")MQ("tar",["xJf",Q,"-C",X],{stdio:"pipe"});else if($==="tar.gz")MQ("tar",["xzf",Q,"-C",X],{stdio:"pipe"});else throw Error(`Unsupported archive format: ${$}`)}function q0(Q,X){S.cpSync(Q,X,{recursive:!0})}function HQ(Q,X=5){return new Promise(($,Z)=>{let W=Q.startsWith("https")?mQ.get:cQ.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 HQ(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 w0(Q){return Q in BQ}function o4(){return Object.keys(BQ)}function i4(Q){let X=BQ[Q];if(!X)return;let $=lQ();return X.getBinaries($)[0]}import*as g from"node:fs";import*as xQ from"node:os";import*as UQ from"node:path";var VQ="# >>> pantry shell-init >>>",AQ="# <<< pantry shell-init <<<";function NQ(){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=xQ.homedir();switch(Q){case"zsh":{let $=process.env.ZDOTDIR;return UQ.join($&&$.length>0?$:X,".zshrc")}case"bash":{if(xQ.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??SQ();if((Q.shell??NQ())==="fish")return[VQ,`if test -d "${X}"`,` set -gx PATH "${X}" $PATH`,"end",AQ,""].join(`
|
|
8
|
-
`);return[
|
|
9
|
-
`)}function
|
|
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
10
|
`)?`
|
|
11
11
|
|
|
12
12
|
`:`
|
|
13
|
-
`;return g.appendFileSync($,H+Z),{rcFile:$,shell:X,changed:!0}}function
|
|
14
|
-
`);return g.writeFileSync($,J+U),{rcFile:$,shell:X,changed:!0}}import A from"node:fs";import F from"node:path";import d from"node:process";var PX=F.join(d.cwd(),"src","packages"),nQ=F.join(d.cwd(),"docs");var zQ={};async function tQ(Q){try{let X=Q||F.join(d.cwd(),"src","packages"),$=F.join(X,"index.ts");if(A.existsSync($)){console.log("Using generated index file for package mapping...");let H=await import(F.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(F.join(U,z.name));else if(z.isDirectory()&&!z.name.startsWith(".")){let O=F.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=F.isAbsolute(H)?H:F.join(X,H),J=A.readFileSync(U,"utf-8"),Y=F.basename(H,".ts"),G=J.match(/domain:\s*['"]([^'"]*)['"]\s*as const/),z=G?G[1]:PQ(Y),O=t(z),K=j0(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 j0(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],M=E.match(/'([^']*)'/g);if(M)return M.map((V)=>V.replace(/'/g,""));if(M=E.match(/"([^"]*)"/g),M)return M.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"),w=H("companions"),B=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:w,dependencies:B,versions:I,fullPath:_,aliases:C}}catch($){return console.error(`Error extracting package data for ${X}:`,$),null}}function T0(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 vX(Q){if(zQ[Q])return zQ[Q];return Q.replace(/\W/g,"_")}function uX(Q){return Q.toLowerCase()}function bQ(Q,X,$){try{let Z=X||PX,W=$||F.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=R0(Q),H=C0(Q);return{packageVarName:W,typeName:H}}}function C0(Q){if(zQ[Q]){let Z=zQ[Q];return`${Z.charAt(0).toUpperCase()}${Z.slice(1)}Package`}let $=uX(Q).replace(/\W/g,"");return`${$.charAt(0).toUpperCase()}${$.slice(1)}Package`}function R0(Q){if(zQ[Q])return`${zQ[Q]}Package`;return`${uX(Q).replace(/\W/g,"")}Package`}function I0(Q,X){let{typeName:$}=bQ(Q,X);return $}function E0(Q,X){let{packageVarName:$}=bQ(Q,X);return $}async function oQ(Q){try{console.log("\uD83D\uDD27 Generating package index...");let X=Q||PX,$=F.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(F.join(U,z.name));else if(z.isDirectory()&&!z.name.startsWith(".")){let O=F.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
|
|
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
15
|
// Do not edit this file directly
|
|
16
16
|
|
|
17
17
|
export interface Pantry {
|
|
@@ -28,14 +28,14 @@ export const packages: Packages = pantry
|
|
|
28
28
|
|
|
29
29
|
`,U=`export interface Pantry {
|
|
30
30
|
`,J=`export const pantry: Pantry = {
|
|
31
|
-
`,Y=new Set,G=new Set,z=Z.sort();for(let q of z)try{let
|
|
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
32
|
`;else H+=`import { ${T} as ${j} } from './${C}'
|
|
33
|
-
`;let E=
|
|
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
34
|
`,J+=` ${V}: ${j},
|
|
35
|
-
`;let b=A.readFileSync(q,"utf-8").match(/domain:\s*['"]([^'"]*)['"]\s*as const/),
|
|
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
36
|
`,J+=` ${y}: ${j},
|
|
37
|
-
`}}}catch(
|
|
38
|
-
`,J+=` ${I}: ${
|
|
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
39
|
`,Y.add(q)}}U+=`}
|
|
40
40
|
|
|
41
41
|
`,J+=`}
|
|
@@ -46,21 +46,21 @@ ${U}export type Packages = Pantry
|
|
|
46
46
|
${J}export const packages: Packages = pantry
|
|
47
47
|
|
|
48
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
|
|
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
50
|
* Auto-generated aliases for pantry packages
|
|
51
51
|
*/
|
|
52
52
|
|
|
53
53
|
`;U+=`export const aliases: Record<string, string> = {
|
|
54
54
|
`;let J=Object.entries(H).sort((Y,G)=>Y[0].localeCompare(G[0]));for(let[Y,G]of J)U+=` '${Y}': '${G}',
|
|
55
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
|
|
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
57
|
`).map(($)=>$.trimEnd()).join(`
|
|
58
|
-
`);return X=
|
|
58
|
+
`);return X=A0(X),X=X.replace(/\n{3,}/g,`
|
|
59
59
|
|
|
60
60
|
`),X=`${X.trimEnd()}
|
|
61
|
-
`,X}function aQ(Q){return
|
|
61
|
+
`,X}function aQ(Q){return V0(Q)}function A0(Q){let X=Q.split(`
|
|
62
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
|
|
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,"{{").replace(/\}\}/g,"}}");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,"{{")};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
64
|
|
|
65
65
|
This comprehensive catalog lists all ${G.size}+ packages available in ts-pantry, organized by category.
|
|
66
66
|
|
|
@@ -74,15 +74,15 @@ Each package can be accessed using \`getPackage(name)\` or directly via \`pantry
|
|
|
74
74
|
|
|
75
75
|
## Table of Contents
|
|
76
76
|
|
|
77
|
-
`,L=(_)=>{if($[_])return{domainVarName:_,pkg:$[_]};let q=Z[_];if(q){let
|
|
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
78
|
`}),K+=`
|
|
79
|
-
`;for(let[_,q]of Object.entries(W)){let
|
|
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
80
|
|
|
81
|
-
`,K+=`${
|
|
81
|
+
`,K+=`${w.length} packages in this category
|
|
82
82
|
|
|
83
83
|
`,K+=`| Package | Description | Programs | Versions | Install |
|
|
84
84
|
`,K+=`|---------|-------------|----------|----------|----------|
|
|
85
|
-
`;for(let{domainVarName:I,pkg:C}of
|
|
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,"{{").replace(/\}\}/g,"}}")).join(", ")})`:"",R=C.programs.slice(0,3).map((N)=>N.replace(/\{\{/g,"{{").replace(/\}\}/g,"}}")).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,"{{").replace(/\}\}/g,"}}").replace(/\x27/g,"'").replace(/"/g,""").replace(/</g,"<").replace(/>/g,">").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,"{{").replace(/\}\}/g,"}}");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
86
|
`}catch(T){let j=C.domain||C.fullPath||"unknown";console.error(`Error processing ${j}:`,T),K+=`| **${j}** | Error retrieving package information | - | - | - |
|
|
87
87
|
`}K+=`
|
|
88
88
|
`}return K+=`## Usage Examples
|
|
@@ -156,7 +156,7 @@ Each package includes:
|
|
|
156
156
|
## Contributing
|
|
157
157
|
|
|
158
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
|
|
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,"{{").replace(/\}\}/g,"}}");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,"{{")},K=O(J.name||Y),L=O(z).replace(/\s+/g," "),_=`# ${K}
|
|
160
160
|
|
|
161
161
|
${L?`> ${L}`:""}
|
|
162
162
|
|
|
@@ -192,7 +192,7 @@ This package can also be accessed using these aliases:
|
|
|
192
192
|
<details>
|
|
193
193
|
<summary>Show all ${J.versions.length} versions</summary>
|
|
194
194
|
|
|
195
|
-
`;let j=new Map,R=[];J.versions.forEach((E)=>{let
|
|
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
196
|
`}),_+=`
|
|
197
197
|
</details>
|
|
198
198
|
|
|
@@ -210,16 +210,16 @@ pantry install ${Y}@${J.versions[0]}
|
|
|
210
210
|
This package depends on:
|
|
211
211
|
|
|
212
212
|
`,J.dependencies.forEach((j)=>{_+=`- \`${j}\`
|
|
213
|
-
`});if(J.companions&&J.companions.length>0){let j=J.companions.filter((R)=>!
|
|
213
|
+
`});if(J.companions&&J.companions.length>0){let j=J.companions.filter((R)=>!N0(R));if(j.length>0)_+=`
|
|
214
214
|
## Related Packages
|
|
215
215
|
|
|
216
216
|
These packages work well with ${J.name||Y}:
|
|
217
217
|
|
|
218
|
-
`,j.forEach((R)=>{let E=
|
|
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
219
|
`;else _+=`- [\`${R}\`](${x})
|
|
220
|
-
`}else{let V=NX(R,E,Z),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
221
|
`;else _+=`- [\`${R}\`](${x})
|
|
222
|
-
`}})}let q=
|
|
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
223
|
## Usage Examples
|
|
224
224
|
|
|
225
225
|
\`\`\`typescript
|
|
@@ -237,12 +237,12 @@ console.log(\`Programs: \${pkg.programs.join(', ')}\`)
|
|
|
237
237
|
|
|
238
238
|
- [Package Source](${J.packageYmlUrl||`https://github.com/pantry-pm/pantry/tree/main/projects/${Y}/package.yml`})
|
|
239
239
|
- [Homepage](${J.homepageUrl||"#"})
|
|
240
|
-
- [Back to Package Catalog](${
|
|
240
|
+
- [Back to Package Catalog](${w})
|
|
241
241
|
|
|
242
242
|
---
|
|
243
243
|
|
|
244
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
|
|
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
246
|
|
|
247
247
|
${O.length} packages in this category
|
|
248
248
|
|
|
@@ -250,21 +250,21 @@ ${Y==="Programming Languages"?"Popular programming languages and their runtimes
|
|
|
250
250
|
|
|
251
251
|
## Packages
|
|
252
252
|
|
|
253
|
-
`;O.forEach(({domainVarName:q,pkg:
|
|
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,"{{").replace(/\}\}/g,"}}");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,"{{")},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
254
|
|
|
255
255
|
${R?`${R}`:""}
|
|
256
256
|
|
|
257
|
-
**Programs**: ${
|
|
257
|
+
**Programs**: ${B.programs&&B.programs.length>0?B.programs.map((F)=>I(F)).join(", "):"None specified"}
|
|
258
258
|
|
|
259
|
-
**Install**: \`${hX(
|
|
259
|
+
**Install**: \`${hX(B)}\`
|
|
260
260
|
|
|
261
261
|
---
|
|
262
262
|
|
|
263
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
|
|
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
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=
|
|
267
|
-
// Last updated: ${$}`);A.writeFileSync(Q,Z),console.log("✅ Updated dependencies.ts timestamp")}catch(Q){console.error("Error updating dependencies.ts:",Q)}}async function
|
|
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
268
|
Usage: bun run src/generate.ts [command] [options]
|
|
269
269
|
|
|
270
270
|
Commands:
|
|
@@ -279,11 +279,11 @@ Examples:
|
|
|
279
279
|
bun run src/generate.ts docs ./custom-docs
|
|
280
280
|
bun run src/generate.ts all
|
|
281
281
|
bun run src/generate.ts all ./custom-docs
|
|
282
|
-
`);break}}catch(Q){console.error("\uD83D\uDCA5 Error during generation:",Q),
|
|
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
|
|
284
|
-
`),{directives:$}=
|
|
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:
|
|
286
|
-
`),u.writeFileSync(k.join(J,o(W)),Z),u.writeFileSync(k.join(J,o($)),X);for(let G of H)u.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}]};u.writeFileSync(k.join(Q,"index.json"),JSON.stringify(Y))}function YX(Q,X,$,Z,W){let H=`${Q}.stage-${process.pid}`;u.rmSync(H,{recursive:!0,force:!0}),u.mkdirSync(H,{recursive:!0});try{let U=`${o($)}.json`;u.writeFileSync(k.join(H,U),X);let J=[];for(let G of Z){let z=o(G.diffId);u.mkdirSync(k.join(H,z),{recursive:!0}),u.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}];u.writeFileSync(k.join(H,"manifest.json"),JSON.stringify(Y)),u.mkdirSync(k.dirname(Q),{recursive:!0}),u.rmSync(Q,{force:!0}),lX("tar",["-cf",Q,"-C",H,"."],{stdio:"pipe",maxBuffer:536870912})}finally{u.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 p0}from"node:child_process";import{createHash as n0}from"node:crypto";import LQ from"node:fs";import iX from"node:https";import o0 from"node:path";import i from"node:process";var QQ=(i.env.PANTRY_REGISTRY_URL||"https://registry.pantry.dev").replace(/\/$/,""),nX="registry-1.docker.io",i0=[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 r(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 r(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=LQ.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"?QQ:`https://${Q}`;if(Z===QQ)return i.env.PANTRY_REGISTRY_TOKEN||i.env.PANTRY_TOKEN||void 0;let W=await r(`${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=i.env.DOCKER_USERNAME,O=i.env.DOCKER_PASSWORD||i.env.DOCKER_TOKEN;if(z&&O)G.Authorization=`Basic ${Buffer.from(`${z}:${O}`).toString("base64")}`;let K=await r(Y.toString(),{headers:G});if(K.status!==200)return;let L=JSON.parse(K.body.toString());return L.token||L.access_token}function r0(Q){if(!Q.implicitRegistry&&Q.registry){let X=QQ.includes(Q.registry);return[{base:X?QQ:`https://${Q.registry}`,hostKey:X?"pantry":Q.registry}]}return[{base:QQ,hostKey:"pantry"},{base:`https://${nX}`,hostKey:nX}]}async function oX(Q,X,$,Z){let W={Accept:i0};if(Z)W.Authorization=`Bearer ${Z}`;return r(`${Q}/v2/${X}/manifests/${$}`,{headers:W})}async function GX(Q,X,$={}){let Z=rX(Q),W=$.platform?.split("/")[0]||"linux",H=$.platform?.split("/")[1]||(i.arch==="arm64"?"arm64":"amd64");LQ.mkdirSync(X,{recursive:!0});let U;for(let{base:J,hostKey:Y}of r0(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=e(O.body),_=G?{Authorization:`Bearer ${G}`}:{},q=K.config.digest,w=await r(`${J}/v2/${Z.repository}/blobs/${q}`,{headers:_});if(w.status!==200)throw Error(`${J}: config blob HTTP ${w.status}`);let B=JSON.parse(w.body.toString()),I=[],C=B.rootfs?.diff_ids||[];for(let T=0;T<K.layers.length;T++){let j=K.layers[T],R=o0.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:B,layers:I,source:J}}catch(G){U=G}throw Error(`Failed to pull ${Q}: ${U?.message||"unknown error"}`)}async function s0(Q){let X=(Q.registry||QQ).replace(/\/$/,""),$=X===QQ?"pantry":new URL(X).hostname,Z=await tX($,Q.repository,"push,pull"),W=Z?{Authorization:`Bearer ${Z}`}:{},H=async(Y,G)=>{if((await r(`${X}/v2/${Q.repository}/blobs/${Y}`,{method:"HEAD",headers:W})).status===200)return;let O=await r(`${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 r(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,LQ.readFileSync(Q.layers[Y].path))}let U=e(Q.manifestBytes),J=await r(`${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 t0(Q,X){let $=n0("sha256");return $.update(LQ.readFileSync(Q)),`sha256:${$.digest("hex")}`===X}function zX(Q,X){LQ.mkdirSync(X,{recursive:!0}),p0("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 XQ(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 hQ(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 e0(Q,X,$){let Z=$.startsWith("/")?$:P.posix.join(X,$);return P.join(Q,Z)}function Q4(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 X4(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=Q4(Q.runMode),{os:Y,architecture:G}=pX(Q.platform),z=D.mkdtempSync(P.join(a0.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(),w="",B=new Map;for(let N of Z.globalArgs){let[y,c]=hQ(N.args)[0]??[];if(y)B.set(y,Q.buildArgs?.[y]??c??"")}for(let N of W){let y=aX();for(let[ZQ,l]of B)y.args.set(ZQ,l);let c=P.join(z,`stage-${N.index}`);D.mkdirSync(c,{recursive:!0});let $Q=XQ(N.baseImage,y);if(U(`[stage ${N.index}${N.name?` ${N.name}`:""}] FROM ${$Q}`),$Q==="scratch");else if(K.has($Q))D.cpSync(K.get($Q),c,{recursive:!0});else{let ZQ=await GX($Q,O,{platform:Q.platform,quiet:H});for(let _Q of ZQ.layers)zX(_Q.path,c);let l=ZQ.config.config||{};for(let _Q of l.Env||[]){let kQ=_Q.indexOf("=");if(kQ!==-1)y.env.set(_Q.slice(0,kQ),_Q.slice(kQ+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 ${ZQ.source}`)}for(let ZQ of N.instructions)$4(ZQ,y,c,{context:X,contextEntries:_,stageRootfs:K,runMode:J,matcher:L,log:U});if(N.name)K.set(N.name,c);q=y,w=c}U("packaging image layer...");let I=WX(w,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:M,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 m=P.join(b,"oci-layout");D.mkdirSync(m,{recursive:!0}),UX(m,E,M,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 ${M}`);try{D.rmSync(z,{recursive:!0,force:!0})}catch{}return{imageId:M,tags:x,archivePath:h,ociLayoutPath:m,config:T,layers:[I],configBytes:j,configDigest:R,manifestBytes:E,manifestMediaType:V.mediaType}}function $4(Q,X,$,Z){let W=XQ(Q.args,X);switch(Q.instruction){case"ENV":{for(let[H,U]of hQ(Q.args))X.env.set(H,XQ(U,X));break}case"ARG":{let[H,U]=hQ(Q.args)[0]??[];if(H&&!X.args.has(H))X.args.set(H,U?XQ(U,X):"");break}case"LABEL":{for(let[H,U]of hQ(Q.args))X.labels.set(H,XQ(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=a(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=a(Q.args);if(H)X.shell=H;break}case"ENTRYPOINT":{let H=a(Q.args);X.entrypoint=H??[...X.shell,W];break}case"CMD":{let H=a(Q.args);X.cmd=H??[...X.shell,W];break}case"COPY":case"ADD":{Z4(Q,X,$,Z);break}case"RUN":{W4(Q,X,$,Z);break}case"MAINTAINER":{X.labels.set("maintainer",W.trim());break}default:Z.log(` (skipping unsupported instruction: ${Q.instruction})`)}}function Z4(Q,X,$,Z){let H=a(Q.args)??XQ(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=e0($,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((w)=>!w.isDir&&w.relPath===K);if(_){let w=z?P.join(G,P.basename(K)):G;OX(_.absPath,w);continue}let q=Z.contextEntries.filter((w)=>w.relPath!==K&&(L===""?!0:w.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 w of q){let B=L===""?w.relPath:w.relPath.slice(L.length),I=P.join(G,B);if(w.isDir)D.mkdirSync(I,{recursive:!0});else OX(w.absPath,I)}}}function W4(Q,X,$,Z){if(Z.runMode==="skip"){Z.log(` RUN (skipped): ${Q.args}`);return}let W=a(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; ${XQ(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),XQ(Q.args,X)],{cwd:U,stdio:"inherit",env:H})}import jQ from"node:fs";import eX from"node:path";var J4=`# .freezer — pantry's home-themed .dockerignore.
|
|
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
287
|
# Anything matched here is kept OUT of the build context (and the image).
|
|
288
288
|
# Dependencies are reinstalled inside the image, so never ship them.
|
|
289
289
|
node_modules
|
|
@@ -310,4 +310,4 @@ temp
|
|
|
310
310
|
coverage
|
|
311
311
|
.ts-cloud
|
|
312
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
|
|
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};
|