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