ts-pantry 0.11.19 → 0.11.21
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 +560 -58
- package/dist/packages/github.com/ggerganov/llama.cpp.d.ts +1 -1
- package/dist/packages/github.com/router-for-me/CLIProxyAPI.d.ts +1 -1
- package/dist/packages/github.com/tw93/mole.d.ts +1 -1
- package/dist/packages/mailpitaxllentorg.d.ts +1 -1
- package/dist/packages/ohmyposhdev.d.ts +1 -1
- package/dist/packages/projenio.d.ts +1 -1
- package/dist/packages/railwayapp.d.ts +1 -1
- package/dist/packages/sourceware.org/libffi.d.ts +1 -1
- package/dist/packages/ziglangorg.d.ts +1 -1
- package/dist/src/index.js +502 -1
- package/dist/src/testing/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-00fdav9e.js +0 -1
- package/dist/chunk-1fq654qh.js +0 -2
- package/dist/chunk-1h1r72jc.js +0 -313
- package/dist/chunk-4svjvh9y.js +0 -1
- package/dist/chunk-57kwfk9c.js +0 -2
- package/dist/chunk-5cxd7nd8.js +0 -3
- package/dist/chunk-6ze4brdb.js +0 -1
- package/dist/chunk-7dxexqk4.js +0 -2
- package/dist/chunk-9d4jsxqb.js +0 -1
- package/dist/chunk-eketndff.js +0 -2
- package/dist/chunk-eyk9nwn4.js +0 -11
- package/dist/chunk-f1gbsg8z.js +0 -1
- package/dist/chunk-fjdg5yvk.js +0 -1
- package/dist/chunk-fv0x8qv2.js +0 -2
- package/dist/chunk-h2mtxt0d.js +0 -1
- package/dist/chunk-kw6vvwkh.js +0 -2
- package/dist/chunk-mm22ceze.js +0 -141
- package/dist/chunk-mq7cybgp.js +0 -2
- package/dist/chunk-sbnjmp1y.js +0 -1
- package/dist/chunk-t0k284nq.js +0 -42
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{createRequire as h}from"node:module";var{defineProperty:q,getOwnPropertyNames:Y,getOwnPropertyDescriptor:Z}=Object,a=Object.prototype.hasOwnProperty;function I(s){return this[s]}var ys=(s)=>{var o=(z??=new WeakMap).get(s),t;if(o)return o;if(o=q({},"__esModule",{value:!0}),s&&typeof s==="object"||typeof s==="function"){for(var n of Y(s))if(!a.call(o,n))q(o,n,{get:I.bind(s,n),enumerable:!(t=Z(s,n))||t.enumerable})}return z.set(s,o),o},z;var W=(s)=>s;function _(s,o){this[s]=W.bind(null,o)}var ls=(s,o)=>{for(var t in o)q(s,t,{get:o[t],enumerable:!0,configurable:!0,set:_.bind(o,t)})};var y=(s,o)=>()=>(s&&(o=s(s=0)),o);var Cs=h(import.meta.url);import{execSync as m}from"node:child_process";function p(){if(B)return;B=!0;let s=()=>{for(let o of l)try{m(`pantry stop ${o}`,{stdio:"ignore",timeout:1e4})}catch{}l.clear()};process.on("exit",s),process.on("SIGINT",()=>{s(),process.exit(130)}),process.on("SIGTERM",()=>{s(),process.exit(143)})}function C(s,o=!1){let t={encoding:"utf-8",timeout:30000,stdio:o?"pipe":["pipe","pipe","pipe"]};return m(`pantry ${s}`,t)}function v(s){let o=s.match(/Name:\s+(\S+)/)?.[1]??"",t=/Status:\s+running/i.test(s),n=s.match(/Port:\s+(\d+)/),r=s.match(/PID:\s+(\d+)/),x=s.match(/Data Dir:\s+(.+)/);return{name:o,running:t,port:n?Number.parseInt(n[1],10):null,pid:r?Number.parseInt(r[1],10):null,dataDir:x?x[1].trim():null}}class e{config;_startedByUs=!1;constructor(s){this.config={name:s.name,port:s.port??0,readyTimeoutMs:s.readyTimeoutMs??15000,pollIntervalMs:s.pollIntervalMs??200,quiet:s.quiet??!0}}static isAvailable(){try{return m("pantry --version",{stdio:"ignore",timeout:5000}),!0}catch{return!1}}status(){try{let s=C(`inspect ${this.config.name}`,!0);return v(s)}catch{return{name:this.config.name,running:!1,port:null,pid:null,dataDir:null}}}isRunning(){return this.status().running}getPort(){return this.status().port}async start(){if(p(),this.isRunning())return this.status();return C(`start ${this.config.name}`,this.config.quiet),this._startedByUs=!0,l.add(this.config.name),await this.waitReady(),this.status()}async stop(){if(!this._startedByUs)return;try{C(`stop ${this.config.name}`,this.config.quiet)}catch{}l.delete(this.config.name),this._startedByUs=!1}async forceStop(){try{C(`stop ${this.config.name}`,this.config.quiet)}catch{}l.delete(this.config.name),this._startedByUs=!1}async ensureRunning(){if(this.isRunning())return this.status();return this.start()}async waitReady(){let s=Date.now()+this.config.readyTimeoutMs;while(Date.now()<s){if(this.isRunning())return;await new Promise((o)=>setTimeout(o,this.config.pollIntervalMs))}throw Error(`Service '${this.config.name}' did not become ready within ${this.config.readyTimeoutMs}ms`)}}var l,B=!1;var w=y(()=>{l=new Set});async function M(s){let o=await F.ensureRunning();return{port:s?.port??o.port??5432,host:s?.host??"localhost",database:s?.database??"postgres",username:s?.username??process.env.USER??"postgres"}}async function i(){await F.stop()}function E(s){let o=null;return{get connection(){if(!o)throw Error("Postgres not started. Ensure beforeAll has run.");return o},beforeAll:async()=>{o=await M(s)},afterAll:async()=>{await i(),o=null}}}async function j(s,o){let t=await M(o);try{return await s(t)}finally{if(o?.stopAfter!==!1)await i()}}var F;var G=y(()=>{w();F=new e({name:"postgres"})});async function A(s){let o=await H.ensureRunning(),t=s?.port??o.port??6379,n=s?.host??"localhost";return{port:t,host:n,url:`redis://${n}:${t}`}}async function T(){await H.stop()}function f(s){let o=null;return{get connection(){if(!o)throw Error("Redis not started. Ensure beforeAll has run.");return o},beforeAll:async()=>{o=await A(s)},afterAll:async()=>{await T(),o=null}}}async function k(s,o){let t=await A(o);try{return await s(t)}finally{if(o?.stopAfter!==!1)await T()}}var H;var J=y(()=>{w();H=new e({name:"redis"})});async function b(s){let o=await K.ensureRunning();return{port:s?.port??o.port??3306,host:s?.host??"localhost",database:s?.database??"test",username:s?.username??"root"}}async function P(){await K.stop()}function S(s){let o=null;return{get connection(){if(!o)throw Error("MySQL not started. Ensure beforeAll has run.");return o},beforeAll:async()=>{o=await b(s)},afterAll:async()=>{await P(),o=null}}}async function D(s,o){let t=await b(o);try{return await s(t)}finally{if(o?.stopAfter!==!1)await P()}}var K;var N=y(()=>{w();K=new e({name:"mysql"})});import{existsSync as Q,mkdirSync as U,mkdtempSync as g,rmSync as V,writeFileSync as d}from"node:fs";import{tmpdir as c}from"node:os";import{join as $}from"node:path";function ss(){if(O)return;O=!0;let s=()=>{for(let o of R)try{if(Q(o))V(o,{recursive:!0,force:!0})}catch{}R.clear()};process.on("exit",s),process.on("SIGINT",()=>{s(),process.exit(130)}),process.on("SIGTERM",()=>{s(),process.exit(143)})}function L(s="pantry-test-"){ss();let o=g($(c(),s));return R.add(o),o}function u(s){R.delete(s);try{if(Q(s))V(s,{recursive:!0,force:!0})}catch{}}async function os(s,o){let t=L(s);try{return await o(t)}finally{u(t)}}function ts(s,o){let t=L(s);try{return o(t)}finally{u(t)}}function ns(s,o,t){let n=$(s,o),r=n.substring(0,n.lastIndexOf("/"));if(r&&!Q(r))U(r,{recursive:!0});return d(n,t),n}function es(s,o){let t=$(s,o);return U(t,{recursive:!0}),t}var R,O=!1;var X=y(()=>{R=new Set});var rs=y(()=>{w();G();J();N();X()});rs();export{ts as withTempDirSync,os as withTempDir,k as withRedis,j as withPostgres,D as withMysql,f as useRedis,E as usePostgres,S as useMysql,T as stopRedis,i as stopPostgres,P as stopMysql,A as startRedis,M as startPostgres,b as startMysql,u as removeTempDir,ns as createTestFile,es as createTestDir,L as createTempDir,e as PantryService};
|
package/package.json
CHANGED
package/dist/chunk-00fdav9e.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{Ac as o,mc as a,nc as b,oc as c,pc as d,qc as e,rc as f,sc as g,tc as h,uc as i,vc as j,wc as k,xc as l,yc as m,zc as n}from"./chunk-1fq654qh.js";import"./chunk-57kwfk9c.js";import"./chunk-eketndff.js";import"./chunk-7dxexqk4.js";export{l as validatePackageSpec,h as searchPackages,o as resolveVersionFromMetadata,e as resolveVersion,g as resolvePackageDomain,m as parseVersion,d as isVersionAvailable,j as getPopularPackages,c as getPhpVersionsForWorkflow,i as getPackagesByPattern,f as getPackageInfo,a as getLatestVersion,b as getAvailableVersions,k as getActivePackages,n as compareVersionsDesc};
|
package/dist/chunk-1fq654qh.js
DELETED
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{Dc as y,Ec as x}from"./chunk-57kwfk9c.js";import{Fc as $,Gc as I}from"./chunk-eketndff.js";import{Hc as j,Kc as C}from"./chunk-7dxexqk4.js";I();async function Z(){try{let{packages:H}=await import("./chunk-fjdg5yvk.js");return H}catch{return{}}}async function B(H){let z=_(H);if(!z)return null;let q=(await Z())[z];if(!q||!q.versions||q.versions.length===0)return null;return q.versions[0]}async function D(H){let z=_(H);if(!z)return[];let q=(await Z())[z];if(!q||!q.versions)return[];return[...q.versions]}function S(H={}){let z=["8.4.11","8.3.14","8.2.26","8.1.30"],G=H.fallbackVersions||z;try{let{pantry:q}=(x(),j(y)),E=q.phpnet||q.php;if(!E||!E.versions||E.versions.length===0)return G;let O=[...E.versions],J=H.supportedBranches||w(O),Q=new Map;for(let U of O){let[W,X]=U.split(".");if(!W||!X)continue;let K=`${W}.${X}`;if(J.includes(K)&&!Q.has(K))Q.set(K,U)}let R=J.map((U)=>Q.get(U)).filter(Boolean);return R.length>0?R:G}catch{return G}}function w(H){let z=new Map;for(let q of H){let[E,O]=q.split(".");if(!E||!O)continue;let J=`${E}.${O}`;z.set(J,(z.get(J)||0)+1)}return Array.from(z.keys()).filter((q)=>{let[E]=q.split(".");return E==="8"&&z.get(q)>3}).sort((q,E)=>{let[O,J]=q.split(".").map(Number),[Q,R]=E.split(".").map(Number);if(O!==Q)return Q-O;return R-J}).slice(0,4)}async function f(H,z){return(await D(H)).includes(z)}async function N(H,z="latest"){if(z==="latest")return await B(H);let G=await D(H);if(G.length===0)return null;if(G.includes(z))return z;if(z.startsWith("^")){let E=z.slice(1).split(".")[0];return G.filter((J)=>J.startsWith(`${E}.`))[0]||null}if(z.startsWith("~")){let q=z.slice(1),[E,O]=q.split("."),J=`${E}.${O}.`;return G.filter((R)=>R.startsWith(J))[0]||null}if(z.startsWith(">=")){let E=z.slice(2).split(".").map(Number);return G.filter((J)=>{let Q=J.split(".").map(Number);for(let R=0;R<Math.max(Q.length,E.length);R++){let U=Q[R]??0,W=E[R]??0;if(U>W)return!0;if(U<W)return!1}return!0})[0]||null}return await B(H)}async function F(H){let z=_(H);if(!z)return null;let q=(await Z())[z];if(!q)return null;let E=await B(H);if(!E)return null;return{name:String(H),domain:z,description:q.description||"",latestVersion:E,totalVersions:q.versions?.length||0,programs:[...q.programs||[]],dependencies:[...q.dependencies||[]],companions:[...q.companions||[]],versions:[...q.versions||[]]}}function _(H){let z=String(H);if(z in $){let G=$[z];return T(G)}return T(z)}function T(H){if(H.includes("/")){let[z,...G]=H.split("/"),q=G.join("/"),E=z.replace(/\./g,""),O=q.replace(/[/\-_.]/g,"").toLowerCase();return`${E}${O}`.toLowerCase()}return H.replace(/[.\-_]/g,"").toLowerCase()}async function V(H){let z=[],G=H.toLowerCase();for(let[E,O]of Object.entries($))if(E.toLowerCase().includes(G)){let J=await F(E);if(J)z.push(J)}let q=await Z();for(let[E,O]of Object.entries(q))if(E.toLowerCase().includes(G)||O.description?.toLowerCase().includes(G)){let J=await F(E);if(J&&!z.some((Q)=>Q.domain===E))z.push(J)}return z}async function h(H){let z=[],G=await Z();for(let q of Object.keys(G))if(H.test(q)){let E=await F(q);if(E)z.push(E)}return z}async function u(H=10){let z=[],G=await Z();for(let q of Object.keys(G)){let E=await F(q);if(E&&E.totalVersions>=H)z.push(E)}return z.sort((q,E)=>E.totalVersions-q.totalVersions)}async function b(H=50){return(await u(5)).slice(0,H)}async function l(H){try{let z=H.lastIndexOf("@");if(z===-1){let J=H;if(!_(J))return{isValid:!1,error:`Unknown package: ${J}`};return{isValid:!0,packageName:J}}let G=H.slice(0,z),q=H.slice(z+1);if(!_(G))return{isValid:!1,error:`Unknown package: ${G}`};if(q==="latest")return{isValid:!0,packageName:G,version:q};if(!await f(G,q))return{isValid:!1,packageName:G,version:q,error:`Version ${q} not available for package ${G}`};return{isValid:!0,packageName:G,version:q}}catch{return{isValid:!1,error:`Invalid package specification: ${H}`}}}function A(H){let z=H.replace(/^v/,"").split("+")[0],[G,...q]=z.split("-"),[E,O,J]=G.split(".").map((Q)=>{let R=Number.parseInt(Q,10);return Number.isNaN(R)?0:R});return{major:E??0,minor:O??0,patch:J??0,prerelease:q.length>0?q.join("-").split("."):[]}}function M(H,z){let G=A(H),q=A(z);if(G.major!==q.major)return q.major-G.major;if(G.minor!==q.minor)return q.minor-G.minor;if(G.patch!==q.patch)return q.patch-G.patch;let E=G.prerelease.length>0,O=q.prerelease.length>0;if(E!==O)return E?1:-1;if(!E)return 0;for(let J=0;J<Math.max(G.prerelease.length,q.prerelease.length);J++){let Q=G.prerelease[J],R=q.prerelease[J];if(Q===void 0)return 1;if(R===void 0)return-1;let U=Number.parseInt(Q,10),W=Number.parseInt(R,10),X=!Number.isNaN(U)&&String(U)===Q,K=!Number.isNaN(W)&&String(W)===R;if(X&&K){if(U!==W)return W-U}else if(X!==K)return X?1:-1;else if(Q!==R)return Q<R?1:-1}return 0}function g(H,z){if(!z||z.length===0)return null;let G=[...z].sort(M),q=H.replace(/^[\^~]/,""),E=A(q),O=q.replace(/^v/,"").split("+")[0].split("-")[0],J=O.split(".").length>=3,Q=E.prerelease.length>0,R=(K)=>{if(K.prerelease.length===0)return!0;if(!Q)return!1;return K.major===E.major&&K.minor===E.minor&&K.patch===E.patch},U=(K,Y)=>M(Y,q)<=0||K.prerelease.length>0,W=(K)=>{for(let Y of G){let L=A(Y);if(!R(L))continue;if(K(L,Y))return Y}return null};if(H.startsWith("^"))return W((K,Y)=>{if(K.major!==E.major)return!1;if(E.major===0&&K.minor!==E.minor)return!1;return U(K,Y)});if(H.startsWith("~"))return W((K,Y)=>{if(K.major!==E.major||K.minor!==E.minor)return!1;return!J||U(K,Y)});if(G.includes(q))return q;let X=O.split(".").filter(Boolean).map((K)=>Number.parseInt(K,10));if(X.length>0&&X.every((K)=>!Number.isNaN(K))){let K=W((Y)=>{if(X[0]!==void 0&&Y.major!==X[0])return!1;if(X[1]!==void 0&&Y.minor!==X[1])return!1;if(X[2]!==void 0&&Y.patch!==X[2])return!1;return!0});if(K)return K}return W(()=>!0)??G[0]??null}
|
|
2
|
-
export{B as mc,D as nc,S as oc,f as pc,N as qc,F as rc,_ as sc,V as tc,h as uc,u as vc,b as wc,l as xc,A as yc,M as zc,g as Ac};
|
package/dist/chunk-1h1r72jc.js
DELETED
|
@@ -1,313 +0,0 @@
|
|
|
1
|
-
import{bb as iQ}from"./chunk-mm22ceze.js";import{Ub as s0}from"./chunk-mq7cybgp.js";import{ac as t,cc as PQ}from"./chunk-eyk9nwn4.js";import{mc as S0,nc as A0,qc as x0,rc as cQ,tc as N0,vc as b0,wc as y0,xc as lQ}from"./chunk-1fq654qh.js";import{Ec as $$}from"./chunk-57kwfk9c.js";import{Fc as _Q,Gc as M4}from"./chunk-eketndff.js";import{Kc as n}from"./chunk-7dxexqk4.js";import I4 from"node:process";M4();import R0 from"node:process";function M0(Q){return Q in _Q}function V4(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 W$(Q){return M0(Q)||V4(Q)}function J$(Q){return["darwin","linux","windows"].includes(Q)}function H$(Q){return["x86_64","aarch64","armv7l","i686"].includes(Q)}function V0(){return Object.keys(_Q)}function U$(){return Object.values(_Q)}function z$(Q){if(M0(Q))return{originalName:Q,resolvedDomain:_Q[Q],isAlias:!0};return{originalName:Q,resolvedDomain:Q,isAlias:!1}}function G$(Q){let $=Q.lastIndexOf("@");if($===-1)return{name:Q};let X=Q.slice(0,$),Z=Q.slice($+1);return{name:X,version:Z,versionSpec:Z}}function Y$(Q,$){return $?`${Q}@${$}`:Q}function wQ(){let Q=R0.platform,$=R0.arch,X,Z,W=!0;switch(Q){case"darwin":X="darwin";break;case"linux":X="linux";break;case"win32":X="windows";break;default:X="linux",W=!1}switch($){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:X,architecture:Z,isSupported:W}}function K$(Q,$="latest",X){let Z=X||wQ(),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:$,platform:Z.platform,architecture:Z.architecture,format:W}}var B$={LATEST:"latest",ANY:"*"},I0={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 O$(Q){return I0[Q]}function _$(Q,$){return I0[$].includes(Q)}function L$(Q){return Q}function q$(Q,$){return[Q,$]}function j$(Q){return Q}async function E$(Q){try{let $=await cQ(Q);if(!$)return{success:!1,error:`Package '${Q}' not found. Use 'search' to find available packages.`};return{success:!0,data:$}}catch($){return{success:!1,error:`Failed to get package info: ${$}`}}}async function R$(Q){try{if(!Q||Q.trim().length===0)return{success:!1,error:"Search term cannot be empty"};return{success:!0,data:await N0(Q.trim())}}catch($){return{success:!1,error:`Search failed: ${$}`}}}async function M$(Q=20){try{return{success:!0,data:(await b0(Q)).slice(0,Q)}}catch($){return{success:!1,error:`Failed to list popular packages: ${$}`}}}async function V$(Q=20){try{return{success:!0,data:await y0(Q)}}catch($){return{success:!1,error:`Failed to list active packages: ${$}`}}}function I$(){try{return{success:!0,data:V0()}}catch(Q){return{success:!1,error:`Failed to list aliases: ${Q}`}}}async function S$(Q){try{let $=await lQ(Q);if(!$.isValid)return{success:!1,error:$.error};return{success:!0,data:{packageName:$.packageName,version:$.version,isValid:!0}}}catch($){return{success:!1,error:`Validation failed: ${$}`}}}async function A$(Q){try{let $=await lQ(Q);if(!$.isValid)return{success:!1,error:$.error};let X=$.packageName,Z=$.version||"latest",W=await x0(X,Z);if(!W)return{success:!1,error:`Could not resolve version '${Z}' for package '${X}'`};let H=await cQ(X);if(!H)return{success:!1,error:`Package '${X}' not found`};let U=wQ(),J={packageName:X,resolvedVersion:W,platform:U.platform,architecture:U.architecture,dependencies:H.dependencies,companions:H.companions,installCommand:`pkgx install ${X}@${W}`},z=[];if(!U.isSupported)z.push(`Platform ${U.platform}/${U.architecture} may not be fully supported`);if(H.dependencies.length>0)z.push(`This package has ${H.dependencies.length} dependencies that will also be installed`);return{success:!0,data:J,warnings:z.length>0?z:void 0}}catch($){return{success:!1,error:`Failed to create install plan: ${$}`}}}async function x$(Q){try{let $=await S0(Q);if(!$)return{success:!1,error:`Package '${Q}' not found`};let X=await A0(Q);return{success:!0,data:{latest:$,total:X.length,versions:X}}}catch($){return{success:!1,error:`Failed to get version info: ${$}`}}}function N$(Q){let $=[`Package: ${Q.name}`,`Domain: ${Q.domain}`,`Description: ${Q.description}`,`Latest Version: ${Q.latestVersion}`,`Total Versions: ${Q.totalVersions}`];if(Q.programs.length>0)$.push(`Programs: ${Q.programs.join(", ")}`);if(Q.dependencies.length>0)$.push(`Dependencies: ${Q.dependencies.join(", ")}`);if(Q.companions.length>0)$.push(`Companions: ${Q.companions.join(", ")}`);return $.join(`
|
|
2
|
-
`)}function b$(Q){if(Q.length===0)return"No packages found matching your search.";let $=[`Found ${Q.length} package(s):
|
|
3
|
-
`];for(let X of Q)$.push(`${X.name} (${X.domain})`),$.push(` ${X.description}`),$.push(` Latest: ${X.latestVersion} (${X.totalVersions} versions available)`),$.push("");return $.join(`
|
|
4
|
-
`)}function y$(Q){let $=[`Installation Plan for ${Q.packageName}@${Q.resolvedVersion}`,`Platform: ${Q.platform}/${Q.architecture}`,`Command: ${Q.installCommand}`];if(Q.dependencies.length>0)$.push(`Dependencies: ${Q.dependencies.join(", ")}`);if(Q.companions.length>0)$.push(`Companions: ${Q.companions.join(", ")}`);return $.join(`
|
|
5
|
-
`)}function D$(){try{let Q=wQ();return{success:!0,data:{platform:Q.platform,architecture:Q.architecture,isSupported:Q.isSupported,nodeVersion:I4.version}}}catch(Q){return{success:!1,error:`Failed to get system info: ${Q}`}}}import JQ from"node:fs";import FQ from"node:path";function TQ(Q){if(!JQ.existsSync(Q))throw Error(`Dependency file not found: ${Q}`);let $=JQ.readFileSync(Q,"utf-8"),X=[],Z=$.split(`
|
|
6
|
-
`),W=!1,H=!1,U=0;for(let J of Z){let z=J.trim();if(!z||z.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 K=J.substring(0,G).trim(),B=J.substring(G+1).trim();if(K&&B){let Y=K,q=B.replace(/^['"]|['"]$/g,"");if(Y==="global"||Y==="dependencies"||Y==="deps")continue;let O=q,j=q;if(q.startsWith("^"))O=q.substring(1),j=q;else if(q.startsWith("~"))O=q.substring(1),j=q;else if(q.startsWith(">=")||q.startsWith("<=")||q.startsWith(">")||q.startsWith("<")){let L=/^([><=]+)/.exec(q);if(L){let _=L[1];O=q.substring(_.length).trim(),j=q}}else if(q==="*"||q==="latest")O="latest",j="*";else O=q,j=`@${q}`;X.push({name:Y,version:O,constraint:j,isOsSpecific:!1})}}}}return X}function S4(Q){if(!JQ.existsSync(Q))throw Error(`Dependency file not found: ${Q}`);let $=JQ.readFileSync(Q,"utf-8"),X=TQ(Q),Z;try{let W=typeof Bun<"u"&&Bun.YAML?Bun.YAML.parse($):A4($);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:X,services:Z}}function A4(Q){let $={},X=Q.split(`
|
|
7
|
-
`),Z=!1,W=!1,H=[],U=!1;for(let J of X){let z=J.trim();if(!z||z.startsWith("#"))continue;if(J.match(/^services:\s*$/)){Z=!0,W=!1;continue}if(Z&&!J.startsWith(" ")&&!J.startsWith("\t")&&!z.startsWith("-")){if(z!=="services:"){Z=!1,W=!1;continue}}if(Z){if(z.startsWith("enabled:")){U=z.includes("true");continue}if(z.match(/^autoStart:\s*$/)){W=!0;continue}if(W&&z.startsWith("- ")){let G=z.slice(2).trim();if(G)H.push(G)}}}if(H.length>0)$.services={enabled:U,autoStart:H};return $}async function u$(Q,$="src/packages"){try{let X;if(Q.includes("/"))X=FQ.join($,`${Q}.ts`);else{let K=`${Q.replace(/\./g,"")}.ts`;X=FQ.join($,K)}if(!JQ.existsSync(X))return[];let Z=JQ.readFileSync(X,"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((K)=>K.replace(/'/g,""))}catch{return[]}}async function x4(Q){try{let{packages:$}=await import("./chunk-fjdg5yvk.js").catch(()=>import("./src/index.js")),X=Q.replace(/[^a-z0-9]/gi,"").toLowerCase(),Z=$[X];if(!Z){let W=Object.values($);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 D0(Q,$){let X=await x4(Q);if(X.length===0)return $.split("#")[0].trim().replace(/^[@^~>=<]+/,"")||"latest";let Z=$.split("#")[0].trim();if(Z==="*"||Z==="latest")return X[0];if(Z.startsWith("@")){let H=Z.slice(1);return X.includes(H)?H:X[0]}return N4(X,Z)||X[0]}function N4(Q,$){if($.startsWith("^")){let X=$.slice(1),[Z]=zQ(X);return Q.filter((H)=>{let[U]=zQ(H);return U===Z&&WQ(H,X)>=0})[0]||null}if($.startsWith("~")){let X=$.slice(1),[Z,W]=zQ(X);return Q.filter((U)=>{let[J,z]=zQ(U);return J===Z&&z===W&&WQ(U,X)>=0})[0]||null}if($.startsWith(">=")){let X=$.slice(2).trim();return Q.filter((W)=>WQ(W,X)>=0)[0]||null}if($.startsWith(">")){let X=$.slice(1).trim();return Q.filter((W)=>WQ(W,X)>0)[0]||null}if($.startsWith("<=")){let X=$.slice(2).trim();return Q.filter((W)=>WQ(W,X)<=0)[0]||null}if($.startsWith("<")){let X=$.slice(1).trim();return Q.filter((W)=>WQ(W,X)<0)[0]||null}if($.startsWith("=")){let X=$.slice(1).trim();return Q.includes(X)?X:null}return Q.includes($)?$:null}function zQ(Q){let $=Q.split(".").map((X)=>{let Z=X.match(/^\d+/);return Z?Number.parseInt(Z[0],10):0});return[$[0]||0,$[1]||0,$[2]||0]}function WQ(Q,$){if(Q==="latest"&&$!=="latest")return 1;if($==="latest"&&Q!=="latest")return-1;if(Q==="latest"&&$==="latest")return 0;let X=Q.split("#")[0].trim(),Z=$.split("#")[0].trim(),[W,H,U]=zQ(X),[J,z,G]=zQ(Z);if(W>J)return 1;if(W<J)return-1;if(H>z)return 1;if(H<z)return-1;if(U>G)return 1;if(U<G)return-1;return 0}var CQ=null;async function b4(){if(CQ)return CQ;return CQ=(await import("./chunk-fjdg5yvk.js").catch(()=>import("./src/index.js"))).packages,CQ}async function y4(Q){try{let $=await b4(),X=$[Q];if(X)return{dependencies:X.dependencies||[],companions:X.companions||[]};let Z=Q.replace(/[^a-z0-9]/gi,"").toLowerCase(),W=$[Z];if(W)return{dependencies:W.dependencies||[],companions:W.companions||[]};let U=Object.values($).find((J)=>J.domain===Q);if(U)return{dependencies:U.dependencies||[],companions:U.companions||[]};return null}catch($){return console.warn(`Failed to load package data for ${Q}: ${$}`),null}}async function EQ(Q,$={},X=new Set,Z=0){let{maxDepth:W=10,verbose:H=!1,targetOs:U,includeOsSpecific:J=!0}=$;if(Z>W){if(H)console.warn(` Warning: max dependency depth (${W}) exceeded for ${Q}`);return[]}if(X.has(Q))return[];if(X.add(Q),H)console.log(`${" ".repeat(Z)}Resolving dependencies for: ${Q}`);let z=[];try{let K=function(O){let j=O.match(/^(linux|darwin|windows):(.+)$/),L=!!j,_=j?j[2]:O,T=j?j[1]:void 0;if(L&&(!J||U&&T!==U))return null;let E=_,C="latest",w="*",F=_.match(/^(@?[^@^~>=<]+(?:\/[^@^~>=<]+)?)([@^~>=<].+)?$/);if(F){if(E=F[1],F[2]){let R=F[2];if(R.startsWith("@"))C=R.substring(1),w=R;else w=R,C=R.replace(/^\D*/,"")}}return{dep:{name:E,version:C,constraint:w,isOsSpecific:L,os:T},pkgName:E}},G=await y4(Q),Y=[...G?.dependencies||[],...G?.companions||[]].map(K).filter((O)=>O!==null);for(let{dep:O}of Y)z.push(O);let q=await Promise.allSettled(Y.map(({pkgName:O})=>EQ(O,$,X,Z+1)));for(let O of q)if(O.status==="fulfilled")z.push(...O.value);else if(H)console.warn(` Warning: transitive dependency resolution failed: ${O.reason}`)}catch(G){if(H)console.warn(`${" ".repeat(Z)}Warning: Could not resolve dependencies for ${Q}: ${G}`)}return z}async function pQ(Q,$={}){let X=new Map,Z=[],W={linux:[],darwin:[],windows:[]};for(let J of Q){if(!X.has(J.name))X.set(J.name,[]);if(X.get(J.name).push(J),J.isOsSpecific&&J.os)W[J.os].push(J)}let H=[],U=[];for(let[J,z]of X)if(z.length===1){let G=await D0(J,z[0].constraint),K={...z[0],version:G};H.push(K),U.push(J)}else{let G=z.map((O)=>O.version),K=[...new Set(G)];if(K.length>1)Z.push({package:J,versions:K});let B=await Promise.all(z.map(async(O)=>({...O,resolvedVersion:await D0(J,O.constraint)}))),Y=B[0];for(let O of B.slice(1))if(Y.constraint==="*"&&O.constraint!=="*")Y=O;else if(Y.constraint!=="*"&&O.constraint==="*");else if(WQ(O.resolvedVersion,Y.resolvedVersion)>0)Y=O;let q={...Y,version:Y.resolvedVersion};delete q.resolvedVersion,H.push(q),U.push(J)}return{allDependencies:H,uniquePackages:U,conflicts:Z,osSpecificDeps:W}}async function P0(Q,$={}){let{verbose:X=!1}=$;if(X)console.log(`Parsing dependency file: ${Q}`);let Z=TQ(Q);if(X)console.log(`Found ${Z.length} direct dependencies`);let W=[...Z],H=await Promise.all(Z.map(async(z)=>{if(X)console.log(`Resolving transitive dependencies for: ${z.name}`);return EQ(z.name,$)}));for(let z of H)W.push(...z);if(X)console.log(`Total dependencies found (before deduplication): ${W.length}`);let U=await pQ(W,$);if(X){if(console.log(`Unique packages after deduplication: ${U.uniquePackages.length}`),U.conflicts.length>0)console.log(`Version conflicts found: ${U.conflicts.length}`)}let J=FQ.extname(Q);if(J===".yaml"||J===".yml"){let z=S4(Q);if(z.services)U.services=z.services}return U}function k$(Q){let $=["deps.yaml","deps.yml","dependencies.yaml","dependencies.yml","pkgx.yaml","pkgx.yml",".deps.yaml",".deps.yml"],X=[];for(let Z of $){let W=FQ.join(Q,Z);if(JQ.existsSync(W))X.push(W)}return X}import*as M from"node:fs";import*as y from"node:path";import*as r from"node:os";import*as sQ from"node:https";import*as rQ from"node:http";import{execFileSync as RQ}from"node:child_process";import{createHash as D4}from"node:crypto";import{Transform as P4}from"node:stream";import{pipeline as v4}from"node:stream/promises";var tQ=(process.env.PANTRY_REGISTRY_URL||"https://registry.pantry.dev").replace(/\/$/,"");function h4(Q,$){if(Q!=="ziglang.org")return $;return $.replace(/(-dev\.\d+)\+([0-9A-Za-z-]+)$/,"$1_$2")}function IQ(){let Q=process.env.XDG_DATA_HOME,$=Q&&Q.length>0?Q:y.join(r.homedir(),".local","share");return y.join($,"pantry","global","bin")}function SQ(){let Q=r.platform(),$=r.arch();return{os:Q==="darwin"?"darwin":Q==="win32"?"windows":"linux",arch:$==="arm64"?"aarch64":"x86_64"}}var LQ={"github.com/mail-os/mail":{getDownloadUrl(Q,$){if($.os!=="linux"||$.arch!=="x86_64")throw Error("github.com/mail-os/mail currently publishes linux-x86_64 release binaries");let X={darwin:"macos",linux:"linux",windows:"windows"},Z=`mail-${$.arch}-${X[$.os]}`;return`https://github.com/mail-os/mail/releases/download/v${Q}/${Z}.tar.gz`},getArchiveFormat(){return"tar.gz"},getBinaries(Q){let $={darwin:"macos",linux:"linux",windows:"windows"};return[`mail-${Q.arch}-${$[Q.os]}`,"mail"]}},"ziglang.org":{getDownloadUrl(Q,$){let X=`${$.os}-${$.arch==="aarch64"?"arm64":"x86-64"}`,Z=`ziglang.org-${Q}.${$.os==="windows"?"zip":"tar.gz"}`;return`${tQ}/binaries/ziglang.org/${Q}/${X}/${Z}`},getArchiveFormat(Q){return Q.os==="windows"?"zip":"tar.gz"},getBinaries(Q){return Q.os==="windows"?["zig.exe"]:["zig"]}},"bun.sh":{getDownloadUrl(Q,$){let X={"darwin-aarch64":"darwin-aarch64","darwin-x86_64":"darwin-x64","linux-aarch64":"linux-aarch64","linux-x86_64":"linux-x64","windows-x86_64":"windows-x64"},Z=`${$.os}-${$.arch}`,W=X[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,$){let X={"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=`${$.os}-${$.arch}`,W=X[Z];if(!W)throw Error(`Unsupported platform for bun: ${Z}`);return W}},"nodejs.org":{getDownloadUrl(Q,$){let X={darwin:"darwin",linux:"linux",windows:"win"},Z={x86_64:"x64",aarch64:"arm64"},W=$.os==="windows"?"zip":"tar.xz";return`https://nodejs.org/dist/v${Q}/node-v${Q}-${X[$.os]}-${Z[$.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,$){let X={darwin:"darwin",linux:"linux",windows:"win"},Z={x86_64:"x64",aarch64:"arm64"};return`node-v${Q}-${X[$.os]}-${Z[$.arch]}`}}};function v0(Q,$,X,Z){M.mkdirSync(X,{recursive:!0});let W=null;for(let H of $){let U=y.join(Q,H);if(!M.existsSync(U))U=y.join(Q,"bin",H);if(!M.existsSync(U)){if(W){let z=y.join(X,H);try{M.unlinkSync(z)}catch{}if(Z.os==="windows")M.copyFileSync(W,z);else M.symlinkSync(W,z)}continue}if(!W)W=U;let J=y.join(X,H);try{M.unlinkSync(J)}catch{}if(Z.os==="windows")M.copyFileSync(U,J);else M.symlinkSync(U,J)}}async function k0(Q,$,X={}){let Z=X.platform||SQ(),W=LQ[Q];if(!W)throw Error(`Unknown package: ${Q}. Supported: ${Object.keys(LQ).join(", ")}`);if(/^[\^~>=<]/.test($))$=await c4(Q,$,Z);else if($==="latest"||$==="*"||!$)$=await aQ(Q,Z);else if(Q==="ziglang.org"&&$.endsWith("-dev")){let j=await k4($,Z,{onRetry:X.onRetry});if(!j)throw Error(`Could not resolve ${$} to a published ziglang.org development build`);$=j}if($=h4(Q,$),!$)throw Error(`Could not resolve a concrete version for ${Q} (got empty string from resolver)`);let H=X.installDir||y.join(process.cwd(),"pantry"),U=y.join(H,".bin"),J=y.join(H,Q.replace(/\./g,"-"),$),z=W.getBinaries(Z);if(z.length===0)throw Error(`No binaries defined for ${Q} on ${Z.os}-${Z.arch}`);let G=y.join(J,z[0]),K=y.join(J,"bin",z[0]);if(M.existsSync(G)||M.existsSync(K)){if(!X.quiet)console.log(` ✓ ${Q}@${$} (cached)`);if(X.createBinLinks!==!1)v0(J,z,U,Z);let j=h0(J,z,Z,X);return{name:Q,version:$,installPath:J,binaries:z,globalLinks:j}}let B=W.getDownloadUrl($,Z),Y=W.getArchiveFormat(Z);if(!X.quiet)console.log(` → ${Q}@${$} from ${new URL(B).hostname}`);let q=M.mkdtempSync(y.join(r.tmpdir(),"pantry-")),O=y.join(q,`archive.${Y}`);try{let j;if(B.startsWith(`${tQ}/binaries/`)){let C=y.join(q,"archive.sha256");await u0(`${B}.sha256`,C,{quiet:X.quiet,onRetry:X.onRetry});let w=M.readFileSync(C,"utf8").match(/\b([a-f0-9]{64})\b/i)?.[1];if(!w)throw Error(`Invalid SHA-256 checksum response for ${B}`);j=w.toLowerCase()}await u0(B,O,{quiet:X.quiet,onRetry:X.onRetry,expectedSha256:j});let L=y.join(q,"extracted");M.mkdirSync(L,{recursive:!0}),await s4(O,L,Y);let _=L,T=W.getArchivePrefix?.($,Z);if(T){let C=y.join(L,T);if(M.existsSync(C))_=C;else{let F=M.readdirSync(L).find((R)=>M.statSync(y.join(L,R)).isDirectory());if(F)_=y.join(L,F)}}if(M.mkdirSync(J,{recursive:!0}),r4(_,J),Z.os!=="windows"){for(let C of z){let w=y.join(J,C);if(M.existsSync(w))M.chmodSync(w,493);let F=y.join(J,"bin",C);if(M.existsSync(F))M.chmodSync(F,493)}for(let C of["bin","sbin","libexec"])l0(y.join(J,C))}if(X.createBinLinks!==!1)v0(J,z,U,Z);if(!X.quiet)console.log(` ✓ ${Q}@${$}`);let E=h0(J,z,Z,X);return{name:Q,version:$,installPath:J,binaries:z,globalLinks:E}}finally{try{M.rmSync(q,{recursive:!0,force:!0})}catch{}}}function h0(Q,$,X,Z){if(!Z.globalBin)return[];let W=typeof Z.globalBin==="string"?Z.globalBin:IQ();M.mkdirSync(W,{recursive:!0});let H=[];for(let U of $){let J=y.join(Q,U);if(!M.existsSync(J))J=y.join(Q,"bin",U);if(!M.existsSync(J))continue;let z=y.join(W,U);try{M.unlinkSync(z)}catch{}if(X.os==="windows")M.copyFileSync(J,z);else M.symlinkSync(J,z);H.push(z)}if(!Z.quiet&&H.length>0)console.log(` → linked ${H.length} binary(ies) into ${W}`);return H}async function u4(Q,$={}){return Promise.all(Q.map((X)=>k0(X.domain,X.version,$)))}async function aQ(Q,$=SQ()){if(Q==="bun.sh"){let Z=(await HQ("https://api.github.com/repos/oven-sh/bun/releases/latest").catch(()=>null))?.tag_name?.replace(/^bun-v/,"")||"";if(Z)return Z;let W=await nQ(Q);if(W)return W;throw Error("Failed to resolve latest bun.sh version (GitHub API unreachable, no bundled metadata)")}if(Q==="ziglang.org"){let X=await eQ(Q,$);if(X.length>0)return X.sort(iQ)[0];throw Error(`Failed to resolve a ziglang.org version published for ${f0($)}`)}if(Q==="nodejs.org"){let Z=await HQ("https://nodejs.org/dist/index.json").catch(()=>null)||[],H=(Z.find((J)=>J.lts)?.version||Z[0]?.version||"").replace(/^v/,"");if(H)return H;let U=await nQ(Q);if(U)return U;throw Error("Failed to resolve latest nodejs.org version")}if(Q==="github.com/mail-os/mail"){let Z=(await HQ("https://api.github.com/repos/mail-os/mail/releases/latest").catch(()=>null))?.tag_name?.replace(/^v/,"")||"";if(Z)return Z;let H=((await HQ("https://api.github.com/repos/mail-os/mail/tags?per_page=1").catch(()=>null))?.[0]?.name||"").replace(/^v/,"");if(H)return H;let U=await nQ(Q);if(U)return U;throw Error("Failed to resolve latest github.com/mail-os/mail version")}throw Error(`Cannot resolve latest version for ${Q}`)}async function nQ(Q){try{let $=Q.replace(/[^a-z0-9]/gi,"").toLowerCase(),{packages:X}=await import("./chunk-fjdg5yvk.js").catch(()=>import("./src/index.js")),W=X[$]?.versions||[];return W.find((H)=>!H.includes("-"))||W[0]||""}catch{return""}}async function k4(Q,$,X={}){return(await eQ("ziglang.org",$,X)).filter((W)=>W.startsWith(`${Q}.`)).sort(iQ)[0]||null}function f0(Q){let $=Q.arch==="aarch64"?"arm64":"x86-64";return`${Q.os}-${$}`}function f4(Q,$){let X=f0($);return Object.entries(Q?.versions||{}).filter(([,Z])=>Object.hasOwn(Z.platforms||{},X)).map(([Z])=>Z)}async function eQ(Q,$,X={}){let Z=await HQ(`${tQ}/binaries/${encodeURI(Q)}/metadata.json`,5,X).catch(()=>null);return f4(Z,$)}function g0(Q){let $=Q.match(/^([~^]|>=|<=|>|<|=)(\d+(?:\.\d+){0,10}(?:-[0-9A-Za-z.-]+)?(?:[+_][0-9A-Za-z.-]+)?)/);if(!$)return null;return{operator:$[1],target:$[2]}}function MQ(Q){return Q.split(/[+_-]/,1)[0].split(".").map(($)=>Number.parseInt($,10))}function m0(Q,$){let X=MQ(Q),Z=MQ($);for(let z=0;z<Math.max(X.length,Z.length,3);z++){let G=(X[z]||0)-(Z[z]||0);if(G)return G}let W=Q.includes("-"),H=$.includes("-");if(W!==H)return W?-1:1;let U=Number.parseInt(Q.match(/-dev\.(\d+)/)?.[1]||"0",10),J=Number.parseInt($.match(/-dev\.(\d+)/)?.[1]||"0",10);return U-J}function g4(Q,$){let{operator:X,target:Z}=$;if(Q.includes("-")&&!Z.includes("-"))return!1;let W=MQ(Q),H=MQ(Z);if(W.some(Number.isNaN)||H.some(Number.isNaN))return!1;let[U,J,z]=[W[0]||0,W[1]||0,W[2]||0],[G,K,B]=[H[0]||0,H[1]||0,H[2]||0],Y=m0(Q,Z);if(X==="^"){if(Y<0)return!1;if(G===0&&K===0)return U===0&&J===0&&z===B;if(G===0)return U===0&&J===K;return U===G}if(X==="~"){if(Y<0)return!1;return H.length===1?U===G:U===G&&J===K}if(X===">=")return Y>=0;if(X==="<=")return Y<=0;if(X===">")return Y>0;if(X==="<")return Y<0;if(X==="=")return Y===0;return!1}async function m4(Q,$){if(Q==="bun.sh")return(await HQ("https://api.github.com/repos/oven-sh/bun/releases?per_page=100").catch(()=>null)||[]).map((W)=>(W.tag_name||"").replace(/^bun-v/,"")).filter(Boolean);if(Q==="nodejs.org")return(await HQ("https://nodejs.org/dist/index.json").catch(()=>null)||[]).map((W)=>(W.version||"").replace(/^v/,"")).filter(Boolean);if(Q==="ziglang.org")return eQ(Q,$);return[]}function oQ(Q,$){return m0($,Q)}function d4(Q,$){let X=g0(Q);if(!X)return null;return[...new Set($)].sort(oQ).find((Z)=>g4(Z,X))||null}async function c4(Q,$,X){if(!g0($))return aQ(Q,X);let Z;try{let J=Q.replace(/[^a-z0-9]/gi,"").toLowerCase(),{packages:z}=await import("./chunk-fjdg5yvk.js").catch(()=>import("./src/index.js"));Z=z[J]?.versions||[]}catch{Z=[]}let W=await m4(Q,X),H=Q==="ziglang.org"?W.sort(oQ):[...new Set([...W,...Z])].sort(oQ),U=d4($,H);if(U)return U;throw Error(`No version of ${Q} satisfies "${$}" (checked ${H.length} version${H.length===1?"":"s"}${H.length>0?`, newest ${H[0]}`:""}).`)}var l4=4;function VQ(Q){return Q instanceof Error?Q.message:String(Q)}function p4(Q){if(typeof Q==="object"&&Q!==null&&"statusCode"in Q){let X=Number(Q.statusCode);if(Number.isFinite(X))return X}let $=VQ(Q).match(/\bHTTP\s+(\d{3})\b/i);return $?Number($[1]):void 0}function n4(Q){if(typeof Q!=="object"||Q===null)return"";let $="code"in Q?String(Q.code||""):"";if($)return $;let X="cause"in Q?Q.cause:void 0;return typeof X==="object"&&X!==null&&"code"in X?String(X.code||""):""}function o4(Q){let $=p4(Q);if($!==void 0)return $===408||$===425||$===429||$>=500;if(/^(?:ECONNRESET|ECONNREFUSED|EPIPE|ETIMEDOUT|EAI_AGAIN|ENETDOWN|ENETUNREACH|EHOSTUNREACH|UND_ERR_SOCKET)$/i.test(n4(Q)))return!0;return/socket hang up|connection reset|premature close|aborted|terminated|timed? ?out|temporar|stalled|incomplete download|checksum mismatch/i.test(VQ(Q))}async function d0(Q,$,X={}){let Z=X.maxAttempts??l4,W=X.retryDelayMs??1000,H=X.sleep??((J)=>new Promise((z)=>setTimeout(z,J))),U;for(let J=1;J<=Z;J+=1)try{return await $()}catch(z){if(U=z,!o4(z))throw z;if(J===Z)break;let G=Math.min(W*2**(J-1),1e4);X.onRetry?.(`${Q} failed (${VQ(z)}); retrying in ${G}ms`),await H(G)}throw Error(`${Q} failed after ${Z} attempts: ${VQ(U)}`)}function c0(Q,$,X){return new Promise((Z,W)=>{let U=(Q.startsWith("https")?sQ.get:rQ.get)(Q,{headers:{"User-Agent":"pantry-installer"}},(J)=>{if(J.statusCode&&J.statusCode>=300&&J.statusCode<400&&J.headers.location){if(J.resume(),$<=0)return W(Error(`Too many redirects for ${Q}`));let z=new URL(J.headers.location,Q).href;return c0(z,$-1,X).then(Z,W)}if(!J.statusCode||J.statusCode<200||J.statusCode>=300){J.resume();let z=Object.assign(Error(`HTTP ${J.statusCode||"unknown"} downloading ${Q}`),{statusCode:J.statusCode});return W(z)}J.setTimeout(X,()=>{J.destroy(Error(`Download stalled (no data for ${X/1000}s): ${Q}`))}),Z(J)});U.setTimeout(X,()=>{U.destroy(Error(`Download timed out after ${X/1000}s: ${Q}`))}),U.once("error",W)})}async function i4(Q,$,X){let Z=`${$}.part`;try{M.rmSync(Z,{force:!0})}catch{}let W=await c0(Q,10,X.stallTimeoutMs??60000),H=!X.quiet&&process.stderr.isTTY,U=Number.parseInt(String(W.headers["content-length"]||""),10),J=Number.isFinite(U)?U:0,z=0,G=0,K=X.expectedSha256?D4("sha256"):void 0,B=new P4({transform(Y,q,O){z+=Y.length,K?.update(Y);let j=Date.now();if(H&&j-G>200){G=j;let L=(z/1048576).toFixed(1);if(J>0){let _=(J/1048576).toFixed(1),T=Math.floor(z/J*100);process.stderr.write(`\r ${L}/${_} MB (${T}%)`)}else process.stderr.write(`\r ${L} MB`)}O(null,Y)}});try{if(await v4(W,B,M.createWriteStream(Z)),!W.complete||J>0&&z!==J)throw Error(`Incomplete download for ${Q}: received ${z} of ${J||"unknown"} bytes`);if(X.expectedSha256){let Y=K.digest("hex");if(Y!==X.expectedSha256.toLowerCase())throw Error(`Checksum mismatch for ${Q}: expected ${X.expectedSha256}, got ${Y}`)}M.renameSync(Z,$)}catch(Y){try{M.rmSync(Z,{force:!0})}catch{}throw Y}finally{if(H&&G>0)process.stderr.write("\r\x1B[K")}}async function u0(Q,$,X={}){await d0(`Download ${Q}`,()=>i4(Q,$,X),X)}async function s4(Q,$,X){if(X==="zip")if(process.platform==="win32")RQ("powershell",["-NoProfile","-Command","Expand-Archive","-Path",Q,"-DestinationPath",$,"-Force"],{stdio:"pipe"});else RQ("unzip",["-o","-q",Q,"-d",$],{stdio:"pipe"});else if(X==="tar.xz")RQ("tar",["xJf",Q,"-C",$],{stdio:"pipe"});else if(X==="tar.gz")RQ("tar",["xzf",Q,"-C",$],{stdio:"pipe"});else throw Error(`Unsupported archive format: ${X}`)}function r4(Q,$){M.cpSync(Q,$,{recursive:!0})}function l0(Q){let $;try{$=M.readdirSync(Q,{withFileTypes:!0})}catch{return}for(let X of $){let Z=y.join(Q,X.name);try{if(X.isDirectory()){l0(Z);continue}if(!X.isFile())continue;let W=M.statSync(Z).mode&511,H=W|(W&292)>>2;if(H!==W)M.chmodSync(Z,H)}catch{}}}function p0(Q,$){return new Promise((X,Z)=>{let W=Q.startsWith("https")?sQ.get:rQ.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($<=0)return Z(Error(`Too many redirects for ${Q}`));let G=new URL(J.headers.location,Q).href;return p0(G,$-1).then(X,Z)}if(!J.statusCode||J.statusCode<200||J.statusCode>=300)return Z(Object.assign(Error(`HTTP ${J.statusCode||"unknown"} fetching ${Q}`),{statusCode:J.statusCode}));let z="";J.on("data",(G)=>z+=G),J.on("end",()=>{try{X(JSON.parse(z))}catch(G){Z(G)}})});U.on("error",Z),U.on("timeout",()=>{U.destroy(),Z(Error(`Request timed out: ${Q}`))})})}function HQ(Q,$=5,X={}){return d0(`Fetch ${Q}`,()=>p0(Q,$),X)}function t4(Q){return Q in LQ}function p$(){return Object.keys(LQ)}function n$(Q){let $=LQ[Q];if(!$)return;let X=SQ();return $.getBinaries(X)[0]}import*as g from"node:fs";import*as NQ from"node:os";import*as UQ from"node:path";var AQ="# >>> pantry shell-init >>>",xQ="# <<< pantry shell-init <<<";function bQ(){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 Q0(Q){let $=NQ.homedir();switch(Q){case"zsh":{let X=process.env.ZDOTDIR;return UQ.join(X&&X.length>0?X:$,".zshrc")}case"bash":{if(NQ.platform()==="darwin"){let X=UQ.join($,".bash_profile");if(g.existsSync(X))return X}return UQ.join($,".bashrc")}case"fish":return UQ.join($,".config","fish","config.fish");case"unknown":return null}}function n0(Q={}){let $=Q.globalBin??IQ();if((Q.shell??bQ())==="fish")return[AQ,`if test -d "${$}"`,` set -gx PATH "${$}" $PATH`,"end",xQ,""].join(`
|
|
8
|
-
`);return[AQ,`if [ -d "${$}" ] && [[ ":$PATH:" != *":${$}:"* ]]; then`,` export PATH="${$}:$PATH"`,"fi",xQ,""].join(`
|
|
9
|
-
`)}function a4(Q={}){let $=Q.shell??bQ(),X=Q0($);if(!X)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=n0({...Q,shell:$}),W="";if(g.existsSync(X)){if(W=g.readFileSync(X,"utf-8"),W.includes(AQ))return{rcFile:X,shell:$,changed:!1}}else g.mkdirSync(UQ.dirname(X),{recursive:!0});let H=W.length>0&&!W.endsWith(`
|
|
10
|
-
`)?`
|
|
11
|
-
|
|
12
|
-
`:`
|
|
13
|
-
`;return g.appendFileSync(X,H+Z),{rcFile:X,shell:$,changed:!0}}function e4(Q={}){let $=Q.shell??bQ(),X=Q0($);if(!X||!g.existsSync(X))return{rcFile:X??"<none>",shell:$,changed:!1};let Z=g.readFileSync(X,"utf-8"),W=Z.indexOf(AQ);if(W===-1)return{rcFile:X,shell:$,changed:!1};let H=Z.indexOf(xQ,W);if(H===-1)return{rcFile:X,shell:$,changed:!1};let U=Z.slice(H+xQ.length).replace(/^\n/,""),J=Z.slice(0,W).replace(/\n+$/,`
|
|
14
|
-
`);return g.writeFileSync(X,J+U),{rcFile:X,shell:$,changed:!0}}import A from"node:fs";import I from"node:path";import m from"node:process";var r0=I.join(m.cwd(),"src","packages"),$0=I.join(m.cwd(),"docs");var YQ={};async function H0(Q){try{let $=Q||I.join(m.cwd(),"src","packages"),X=I.join($,"index.ts");if(A.existsSync(X)){console.log("Using generated index file for package mapping...");let H=await import(I.resolve(X)),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($))return console.log(`Packages directory does not exist: ${$}`),Z;let W=[];try{let H=function(U,J=""){let z=[],G=A.readdirSync(U,{withFileTypes:!0});for(let K of G)if(K.isFile()&&K.name.endsWith(".ts")&&K.name!=="index.ts"&&K.name!=="aliases.ts")z.push(I.join(U,K.name));else if(K.isDirectory()&&!K.name.startsWith(".")){let B=I.join(U,K.name),Y=J?`${J}/${K.name}`:K.name;z.push(...H(B,Y))}return z};W=H($),console.log(`Found ${W.length} package files`)}catch(H){console.error(`Error reading packages directory ${$}:`,H),W=[]}console.log(`Reading package data from ${W.length} files...`);for(let H of W)try{let U=I.isAbsolute(H)?H:I.join($,H),J=A.readFileSync(U,"utf-8"),z=I.basename(H,".ts"),G=J.match(/domain:\s*['"]([^'"]*)['"]\s*as const/),K=G?G[1]:PQ(z),B=t(K),Y=Q8(J,K);if(Y)Z[B]=Y,console.log(`Loaded package data for ${K} -> ${B}`)}catch(U){console.error(`Error processing file ${H}:`,U)}return console.log(`Successfully loaded ${Object.keys(Z).length} packages`),Z}catch($){return console.error("Error importing pantry:",$),{}}}function Q8(Q,$){try{let X=Q.match(/domain:\s*['"]([^'"]*)['"]\s*as const/),Z=X?X[1]:$;if(!Q.match(/export const \w+Package = \{([\s\S]*?)\}/))return console.warn(`Could not find package object in file for ${Z}`),null;let H=(C)=>{let w=new RegExp(`${C}:\\s*\\[(.*?)\\]\\s*as const`,"s"),F=Q.match(w);if(!F)return[];let R=F[1],V=R.match(/'([^']*)'/g);if(V)return V.map((S)=>S.replace(/'/g,""));if(V=R.match(/"([^"]*)"/g),V)return V.map((S)=>S.replace(/"/g,""));return[]},U=(C)=>{let F=new RegExp(`${C}:\\s*'([^']*)'\\s*as const`),R=Q.match(F);if(R)return R[1].replace(/\\'/g,"'").replace(/\\\\/g,"\\");if(F=new RegExp(`${C}:\\s*'([^']*)'`),R=Q.match(F),R)return R[1].replace(/\\'/g,"'").replace(/\\\\/g,"\\");return""},J=U("name")||Z,z=U("description")||`A package from ${Z}`,G=U("packageYmlUrl")||"",K=U("homepageUrl")||"",B=U("githubUrl")||"",Y=U("installCommand")||"",q=U("pantryInstallCommand")||`pantry install ${Z}`,O=U("fullPath")||Z,j=H("programs"),L=H("companions"),_=H("dependencies"),T=H("versions"),E=H("aliases");return{name:J,domain:Z,description:z,packageYmlUrl:G,homepageUrl:K,githubUrl:B,installCommand:Y,pantryInstallCommand:q,programs:j,companions:L,dependencies:_,versions:T,fullPath:O,aliases:E}}catch(X){return console.error(`Error extracting package data for ${$}:`,X),null}}function $8(Q,$){let X=["cli","app","tool","server","client","api","lib","core","sdk","dev","bin"];if(X.includes(Q.toLowerCase()))return!1;if(Q===$)return!1;let Z=$.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($.includes("/")){let H=$.split("/"),U=H[H.length-1];if(X.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 t0(){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 a0(Q){if(YQ[Q])return YQ[Q];return Q.replace(/\W/g,"_")}function e0(Q){return Q.toLowerCase()}function yQ(Q,$,X){try{let Z=$||r0,W=X||I.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`,z=H.match(/export type (\w+) = typeof/),G=z?z[1]:`${J.charAt(0).toUpperCase()}${J.slice(1)}`;return{packageVarName:J,typeName:G}}catch(Z){console.warn(`Could not read package file ${X||`${Q}.ts`}, using fallback naming:`,Z);let W=Z8(Q),H=X8(Q);return{packageVarName:W,typeName:H}}}function X8(Q){if(YQ[Q]){let Z=YQ[Q];return`${Z.charAt(0).toUpperCase()}${Z.slice(1)}Package`}let X=e0(Q).replace(/\W/g,"");return`${X.charAt(0).toUpperCase()}${X.slice(1)}Package`}function Z8(Q){if(YQ[Q])return`${YQ[Q]}Package`;return`${e0(Q).replace(/\W/g,"")}Package`}function W8(Q,$){let{typeName:X}=yQ(Q,$);return X}function J8(Q,$){let{packageVarName:X}=yQ(Q,$);return X}async function X0(Q){try{console.log("\uD83D\uDD27 Generating package index...");let $=Q||r0,X=I.resolve($,"index.ts");if(!A.existsSync($))console.log(`Creating packages directory: ${$}`),A.mkdirSync($,{recursive:!0});if(!A.existsSync($))return console.error(`Failed to create packages directory: ${$}`),null;let Z=[];try{let H=function(U,J=""){let z=[],G=A.readdirSync(U,{withFileTypes:!0});for(let K of G)if(K.isFile()&&K.name.endsWith(".ts")&&K.name!=="index.ts"&&K.name!=="aliases.ts")z.push(I.join(U,K.name));else if(K.isDirectory()&&!K.name.startsWith(".")){let B=I.join(U,K.name),Y=J?`${J}/${K.name}`:K.name;z.push(...H(B,Y))}return z};Z=H($),console.log(`Found ${Z.length} package files`)}catch(H){console.error(`Error reading packages directory ${$}:`,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
|
-
`,z=new Set,G=new Set,K=Z.sort();for(let j of K)try{let L=I.basename(j,".ts"),_=a0(L),E=I.relative($,j).replace(/\.ts$/,"").replace(/\\/g,"/"),{packageVarName:C}=yQ(L,$,j),w=C,F=1;while(G.has(w))w=`${C}${F}`,F++;if(G.add(w),w===C)H+=`import { ${C} } from './${E}'
|
|
32
|
-
`;else H+=`import { ${C} as ${w} } from './${E}'
|
|
33
|
-
`;let R=_,V=1;while(z.has(R))R=`${_}${V}`,V++;z.add(R);let S=/^\d/.test(R)||!/^[a-z_$][\w$]*$/i.test(R)?`'${R}'`:R;U+=` ${S}: typeof ${w}
|
|
34
|
-
`,J+=` ${S}: ${w},
|
|
35
|
-
`;let b=A.readFileSync(j,"utf-8").match(/domain:\s*['"]([^'"]*)['"]\s*as const/),d=b?b[1]:"";if(d){let f=t(d);if(f!==R){let u=f,N=1;while(z.has(u))u=`${f}${N}`,N++;z.add(u);let D=/^\d/.test(u)||!/^[a-z_$][\w$]*$/i.test(u)?`'${u}'`:u;U+=` ${D}: typeof ${w}
|
|
36
|
-
`,J+=` ${D}: ${w},
|
|
37
|
-
`}}}catch(L){console.error(`Error processing file ${j}:`,L)}let B=await vQ($),Y=new Map;for(let j of K)try{let _=A.readFileSync(j,"utf-8").match(/domain:\s*['"]([^'"]*)['"]\s*as const/),T=_?_[1]:"";if(T){let E=I.basename(j,".ts"),{packageVarName:C}=yQ(E,$,j),w=C,F=1;while(G.has(w)&&w!==C)w=`${C}${F}`,F++;Y.set(T,w)}}catch(L){console.error(`Error processing file for alias mapping ${j}:`,L)}for(let[j,L]of Object.entries(B).sort((_,T)=>_[0].localeCompare(T[0]))){let _=Y.get(L);if(_){let T=/^\d/.test(j)||!/^[a-z_$][\w$]*$/i.test(j)?`'${j}'`:j;if(z.has(j)){let E=T.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),C=new RegExp(`^\\s*${E}:\\s*typeof\\s+\\w+\\s*$`,"gm"),w=new RegExp(`^\\s*${E}:\\s*\\w+,\\s*$`,"gm");U=U.replace(C,""),J=J.replace(w,"")}U+=` ${T}: typeof ${_}
|
|
38
|
-
`,J+=` ${T}: ${_},
|
|
39
|
-
`,z.add(j)}}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(X,W),console.log(`Successfully generated ${X}`)}catch(H){return console.error(`Error writing index file ${X}:`,H),null}if(!A.existsSync(X))return console.error(`Index file was not created: ${X}`),null;return X}catch($){return console.error("Error generating index file:",$),null}}async function vQ(Q){let $={};console.log("Generating aliases from package files (avoiding circular dependency)");let X=Q||I.join(m.cwd(),"src","packages");if(!A.existsSync(X))return console.log(`Packages directory does not exist: ${X}`),$;function Z(U,J=""){let z=[],G=A.readdirSync(U,{withFileTypes:!0});for(let K of G)if(K.isFile()&&K.name.endsWith(".ts")&&K.name!=="index.ts"&&K.name!=="aliases.ts")z.push(I.join(U,K.name));else if(K.isDirectory()&&!K.name.startsWith(".")){let B=I.join(U,K.name),Y=J?`${J}/${K.name}`:K.name;z.push(...Z(B,Y))}return z}let W=Z(X).sort();console.log(`Found ${W.length} package files`);for(let U of W)try{let J=U,z=A.readFileSync(J,"utf-8"),G=I.basename(U,".ts"),K=z.match(/domain:\s*['"]([^'"]*)['"]\s*as const/),B=K?K[1]:PQ(G),Y=z.match(/name:\s*['"]([^'"]*)['"]\s*as const/),q=Y?Y[1]:"";if(q&&q!==B&&$8(q,B))if(!$[q])$[q]=B,console.log(`Auto-generated alias: ${q} -> ${B}`);else console.log(`Skipped auto-generated alias ${q} -> ${B} (already exists as ${$[q]})`);let O=z.match(/aliases:\s*\[([\s\S]*?)\]/);if(O&&O[1]){let j=O[1].match(/["']([^"']*)["']/g);if(j)for(let L of j){let _=L.replace(/["']/g,"");if(!(!_||_.includes("--")||_.includes("$SHELL")||_.includes("curl")||_.includes("sh <(")||_.includes(" -- ")||_.includes(" -i")||_.includes("+")&&_.includes(" ")||_.includes("{{")||_.includes("}}")||_.includes("version.major")||_.includes("version.minor")||_===B))if(!$[_])$[_]=B,console.log(`Found explicit alias ${_} -> ${B}`);else console.log(`Skipped explicit alias ${_} -> ${B} (already exists as ${$[_]})`);else console.log(`Filtered out invalid alias: ${_} for ${B}`)}}if(B==="aws.amazon.com/cli"){if(!$.aws)$.aws=B,console.log(`Added AWS CLI alias: aws -> ${B}`);if(!$["aws/cli"])$["aws/cli"]=B,console.log(`Added AWS CLI path alias: aws/cli -> ${B}`)}if(B==="aws.amazon.com/cdk"){if(!$["aws/cdk"])$["aws/cdk"]=B,console.log(`Added AWS CDK path alias: aws/cdk -> ${B}`)}}catch(J){console.error(`Error extracting aliases from ${U}:`,J)}let H=s0();for(let[U,J]of Object.entries(H))if(!$[U])$[U]=J,console.log(`Added alias override: ${U} -> ${J}`);else{let z=$[U];$[U]=J,console.log(`Overrode alias ${U}: ${z} -> ${J}`)}return $}async function Z0(Q){try{let $=await vQ(Q),X=Q?I.resolve(Q):I.resolve(m.cwd(),"src","packages"),Z=I.resolve(X,"aliases.ts"),W=I.dirname(Z);if(!A.existsSync(W))A.mkdirSync(W,{recursive:!0});let H=$,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((z,G)=>z[0].localeCompare(G[0]));for(let[z,G]of J)U+=` '${z}': '${G}',
|
|
55
|
-
`;return U+=`}
|
|
56
|
-
`,A.writeFileSync(Z,U),console.log(`Successfully generated ${Z} with ${J.length} aliases`),Z}catch($){return console.error("Error generating aliases file:",$),""}}function H8(Q){let $=Q.split(`
|
|
57
|
-
`).map((X)=>X.trimEnd()).join(`
|
|
58
|
-
`);return $=U8($),$=$.replace(/\n{3,}/g,`
|
|
59
|
-
|
|
60
|
-
`),$=`${$.trimEnd()}
|
|
61
|
-
`,$}function U0(Q){return H8(Q)}function U8(Q){let $=Q.split(`
|
|
62
|
-
`),X=!1;return $.map((Z)=>{if(Z.trimStart().startsWith("```"))return X=!X,Z;if(X)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 z8(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 X=["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(".")&&!X.includes(Q.toLowerCase()))return!1;if(!Q||Q.trim().length===0)return!1;if(!/^[\w.\-/]+$/.test(Q))return!1;return!0}function G8(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((X)=>X.test(Q))}function GQ(Q){if(!z8(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((X)=>Q.description.includes(X))}function Q4(Q){let $=(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]||"",z=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,z).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,z)=>J.length-z.length);return`pantry install ${$(H[0])}`}if(Q.aliases&&Q.aliases.some((H)=>H.toLowerCase()===W.toLowerCase()))return`pantry install ${$(W.toLowerCase())}`;return $(Q.pantryInstallCommand)}}if(Q.installCommand)return $(Q.installCommand);let X=Q.domain;if(Q.aliases&&Q.aliases.length>0)X=[...Q.aliases].sort((W,H)=>W.length-H.length)[0];return X=$(X),`pantry install ${X}`}async function Y8(Q,$){let X=await H0($),Z=await vQ($),W=t0(),H=I.resolve(Q,"package-catalog.md"),U={},J=0;for(let[O,j]of Object.entries(X))if(!GQ(j))U[O]=j;else J++,console.log(`Excluding package ${j.domain||O} (placeholder data)`);console.log(`Filtered out ${J} packages with placeholder data`);let z=new Set,G=new Map;for(let[O,j]of Object.entries(U)){let L=j.domain;if(!z.has(L))G.set(L,j),z.add(L)}let K=new Set;Object.values(W).forEach((O)=>{O.forEach((j)=>K.add(j))});let B=[];if(G.forEach((O,j)=>{if(!K.has(j))B.push(j)}),B.length>0)W["Other Utilities"]=B;let Y=`# 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
|
-
`,q=(O)=>{if(X[O])return{domainVarName:O,pkg:X[O]};let j=Z[O];if(j){let L=t(j);if(X[L])return{domainVarName:L,pkg:X[L]}}return null};Object.keys(W).forEach((O)=>{let j=O.toLowerCase().replace(/[^a-z0-9]+/g,"-"),L=W[O],_=new Map;L.forEach((E)=>{let C=q(E);if(C&&!GQ(C.pkg)){let w=C.pkg.domain||C.pkg.fullPath||"unknown";if(!_.has(w))_.set(w,C);else{let F=_.get(w);if(C.domainVarName.length<F.domainVarName.length||C.domainVarName.length===F.domainVarName.length&&C.domainVarName<F.domainVarName)_.set(w,C)}}});let T=_.size;if(T>0)Y+=`- [${O}](#${j}) (${T} packages)
|
|
78
|
-
`}),Y+=`
|
|
79
|
-
`;for(let[O,j]of Object.entries(W)){let L=new Map;j.forEach((T)=>{let E=q(T);if(E&&!GQ(E.pkg)){let C=E.pkg.domain||E.pkg.fullPath||"unknown";if(!L.has(C))L.set(C,E);else{let w=L.get(C);if(E.domainVarName.length<w.domainVarName.length||E.domainVarName.length===w.domainVarName.length&&E.domainVarName<w.domainVarName)L.set(C,E)}}});let _=Array.from(L.values()).sort((T,E)=>(T.pkg.domain||T.domainVarName).localeCompare(E.pkg.domain||E.domainVarName));if(_.length===0)continue;Y+=`## ${O}
|
|
80
|
-
|
|
81
|
-
`,Y+=`${_.length} packages in this category
|
|
82
|
-
|
|
83
|
-
`,Y+=`| Package | Description | Programs | Versions | Install |
|
|
84
|
-
`,Y+=`|---------|-------------|----------|----------|----------|
|
|
85
|
-
`;for(let{domainVarName:T,pkg:E}of _)try{let C=E.domain||E.fullPath||"unknown",w=E.aliases?` (${E.aliases.map((N)=>N.replace(/\{\{/g,"{{").replace(/\}\}/g,"}}")).join(", ")})`:"",F=E.programs.slice(0,3).map((N)=>N.replace(/\{\{/g,"{{").replace(/\}\}/g,"}}")).join(", ");if(E.programs.length>3)F+=`, ... (+${E.programs.length-3})`;if(E.programs.length===0)F="-";let R=E.versions?.length||0,V=E.versions?.[0]||"latest",S=R>0?`${V} (+${R-1})`:"latest",x=E.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=E.name||C;if(E.aliases&&E.aliases.length>0)b=[...E.aliases].sort((D,c)=>D.length-c.length)[0];b=b.replace(/\{\{/g,"{{").replace(/\}\}/g,"}}");let d=`\`pantry install ${b}\``,f;if(C.includes("."))if(C.startsWith("github.com/")&&C.includes("/")){let D=C.replace("github.com/","").split("/");if(D.length>=2){let c=D[0],XQ=D.slice(1).join("-");f=`./packages/github.com/${c}/${XQ}.md`}else f=`./packages/${DQ(C,T)}.md`}else f=`./packages/${C}/index.md`;else f=`./packages/${DQ(C,T)}.md`;let u=`| **[${C}](${f})**${w} | ${x} | ${F} | ${S} | ${d} |`.replace(/\r?\n/g," ").replace(/\s+/g," ");Y+=`${u}
|
|
86
|
-
`}catch(C){let w=E.domain||E.fullPath||"unknown";console.error(`Error processing ${w}:`,C),Y+=`| **${w}** | Error retrieving package information | - | - | - |
|
|
87
|
-
`}Y+=`
|
|
88
|
-
`}return Y+=`## 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,U0(Y)),H}function o0(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 I.join(X,"github.com",H,`${U}.md`)}else{let H=W[0];return I.join(X,"github.com",H,"index.md")}}else return I.join(X,Q,"index.md");else return I.join(X,`${DQ(Q,$)}.md`)}function DQ(Q,$){let X=(Q||$).toLowerCase();if(/^\d/.test(X))X=`pkg-${X}`;return X.replace(/[^\w-]/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,"")}async function K8(Q,$){let X=await H0($),Z=I.join(Q,"packages");if(!A.existsSync(Z))A.mkdirSync(Z,{recursive:!0});let W=[],H=new Map;for(let[U,J]of Object.entries(X)){if(GQ(J)){console.log(`Skipping package page for ${J.domain||U} (placeholder data)`);continue}let z=J.domain;if(!H.has(z))H.set(z,{domainVarName:U,pkg:J});else{let G=H.get(z);if(U.length<G.domainVarName.length||U.length===G.domainVarName.length&&U<G.domainVarName)H.set(z,{domainVarName:U,pkg:J}),console.log(`Replaced ${G.domainVarName} with ${U} for domain ${z}`)}}for(let{domainVarName:U,pkg:J}of H.values())try{let z=J.domain||J.fullPath||U,G;if(z.includes("."))if(z.startsWith("github.com/")){let F=z.replace("github.com/","").split("/");if(F.length>=2){let R=F[0],V=F.slice(1).join("-"),S=I.join(Z,"github.com",R);if(!A.existsSync(S))A.mkdirSync(S,{recursive:!0});G=I.join(S,`${V}.md`)}else{let R=F[0],V=I.join(Z,"github.com",R);if(!A.existsSync(V))A.mkdirSync(V,{recursive:!0});G=I.join(V,"index.md")}}else{let w=I.join(Z,z);if(!A.existsSync(w))A.mkdirSync(w,{recursive:!0});G=I.join(w,"index.md")}else G=I.join(Z,`${DQ(z,U)}.md`);let K=J.description||"",B=(w)=>{if(!J.versions||J.versions.length===0)return w.replace(/\{\{/g,"{{").replace(/\}\}/g,"}}");let F=J.versions[0],R=F.split("."),V=R[0]||"",S=R[1]||"",x=R[2]||"",b=S?`${V}.${S}`:V;return w.replace(/\{\{\s*version\.marketing\s*\}\}/g,b).replace(/\{\{\s*version\.major\s*\}\}/g,V).replace(/\{\{\s*version\.minor\s*\}\}/g,S).replace(/\{\{\s*version\.patch\s*\}\}/g,x).replace(/\{\{\s*version\.raw\s*\}\}/g,F).replace(/\{\{\s*version\s*\}\}/g,F).replace(/\{\{(?![^}]*\}\})/g,"{{")},Y=B(J.name||z),q=B(K).replace(/\s+/g," "),O=`# ${Y}
|
|
160
|
-
|
|
161
|
-
${q?`> ${q}`:""}
|
|
162
|
-
|
|
163
|
-
## Package Information
|
|
164
|
-
|
|
165
|
-
- **Domain**: \`${z}\`
|
|
166
|
-
- **Name**: \`${Y}\`
|
|
167
|
-
- **Homepage**: ${J.homepageUrl||"Not specified"}
|
|
168
|
-
- **Source**: [View on GitHub](${J.packageYmlUrl||`https://github.com/pantry-pm/pantry/tree/main/projects/${z}/package.yml`})
|
|
169
|
-
|
|
170
|
-
## Installation
|
|
171
|
-
|
|
172
|
-
\`\`\`bash
|
|
173
|
-
# Install with pantry
|
|
174
|
-
${Q4(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((w)=>{let F=B(w);O+=`- \`${F}\`
|
|
182
|
-
`});else O+=`No programs specified.
|
|
183
|
-
`;if(J.aliases&&J.aliases.length>0)O+=`
|
|
184
|
-
## Aliases
|
|
185
|
-
|
|
186
|
-
This package can also be accessed using these aliases:
|
|
187
|
-
|
|
188
|
-
`,J.aliases.forEach((w)=>{let F=B(w);O+=`- \`${F}\`
|
|
189
|
-
`});if(J.versions&&J.versions.length>0){O+=`
|
|
190
|
-
## Available Versions
|
|
191
|
-
|
|
192
|
-
<details>
|
|
193
|
-
<summary>Show all ${J.versions.length} versions</summary>
|
|
194
|
-
|
|
195
|
-
`;let w=new Map,F=[];J.versions.forEach((R)=>{let V=R.split("."),S=V.length>=2?`${V[0]}.${V[1]}`:V[0];if(!w.has(S))w.set(S,[]),F.push(S);w.get(S).push(R)}),F.forEach((R)=>{let V=w.get(R);O+=`- ${V.map((S)=>`\`${S}\``).join(", ")}
|
|
196
|
-
`}),O+=`
|
|
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 ${z}@${J.versions[0]}
|
|
206
|
-
\`\`\`
|
|
207
|
-
`}if(J.dependencies&&J.dependencies.length>0)O+=`
|
|
208
|
-
## Dependencies
|
|
209
|
-
|
|
210
|
-
This package depends on:
|
|
211
|
-
|
|
212
|
-
`,J.dependencies.forEach((w)=>{O+=`- \`${w}\`
|
|
213
|
-
`});if(J.companions&&J.companions.length>0){let w=J.companions.filter((F)=>!G8(F));if(w.length>0)O+=`
|
|
214
|
-
## Related Packages
|
|
215
|
-
|
|
216
|
-
These packages work well with ${J.name||z}:
|
|
217
|
-
|
|
218
|
-
`,w.forEach((F)=>{let R=t(F),V=X[R];if(V&&!GQ(V)){let S=o0(F,R,Z),x=I.relative(I.dirname(G),S).replace(/\\/g,"/"),b=V.description?.trim();if(b)O+=`- [\`${F}\`](${x}) - ${b}
|
|
219
|
-
`;else O+=`- [\`${F}\`](${x})
|
|
220
|
-
`}else{let S=o0(F,R,Z),x=I.relative(I.dirname(G),S).replace(/\\/g,"/"),b=V?.description?.trim()||"Package not available";if(b&&b!=="Package not available")O+=`- [\`${F}\`](${x}) - ${b}
|
|
221
|
-
`;else O+=`- [\`${F}\`](${x})
|
|
222
|
-
`}})}let j=I.dirname(Z),_=`${I.relative(I.dirname(G),j)}/package-catalog.md`.replace(/\\/g,"/"),T=J.aliases&&J.aliases.length>0?J.aliases[0]:J.name||t(z),C=/[^\w$]/.test(T)||/^\d/.test(T)?`pantry['${T}']`:`pantry.${T}`;O+=`
|
|
223
|
-
## Usage Examples
|
|
224
|
-
|
|
225
|
-
\`\`\`typescript
|
|
226
|
-
import { pantry } from 'ts-pantry'
|
|
227
|
-
|
|
228
|
-
// Access this package
|
|
229
|
-
const pkg = ${C}
|
|
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/${z}/package.yml`})
|
|
239
|
-
- [Homepage](${J.homepageUrl||"#"})
|
|
240
|
-
- [Back to Package Catalog](${_})
|
|
241
|
-
|
|
242
|
-
---
|
|
243
|
-
|
|
244
|
-
> Auto-generated from package data.
|
|
245
|
-
`,await A.promises.writeFile(G,U0(O)),W.push(G)}catch(z){console.error(`Error generating page for ${U}:`,z)}return W}async function B8(Q,$){let X=await H0($),Z=await vQ($),W=t0(),H=I.join(Q,"categories");if(!A.existsSync(H))A.mkdirSync(H,{recursive:!0});let U=[],J=(z)=>{if(X[z])return{domainVarName:z,pkg:X[z]};if(Z[z]){let G=Z[z],K=t(G);if(X[K])return{domainVarName:K,pkg:X[K]}}return null};for(let[z,G]of Object.entries(W)){let K=new Map;G.forEach((j)=>{let L=J(j);if(L&&!GQ(L.pkg)){let _=L.pkg.domain||L.pkg.fullPath||"unknown";if(!K.has(_))K.set(_,L);else{let T=K.get(_);if(L.domainVarName.length<T.domainVarName.length||L.domainVarName.length===T.domainVarName.length&&L.domainVarName<T.domainVarName)K.set(_,L)}}});let B=Array.from(K.values()).sort((j,L)=>(j.pkg.domain||j.domainVarName).localeCompare(L.pkg.domain||L.domainVarName));if(B.length===0)continue;let Y=`${z.toLowerCase().replace(/[^a-z0-9]+/g,"-")}.md`,q=I.join(H,Y),O=`# ${z}
|
|
246
|
-
|
|
247
|
-
${B.length} packages in this category
|
|
248
|
-
|
|
249
|
-
${z==="Programming Languages"?"Popular programming languages and their runtimes available through pantry.":z==="Databases"?"Database systems and data storage solutions.":z==="Development Tools"?"Development environments, editors, and programming tools.":z==="Build Tools"?"Build systems, compilers, and development infrastructure.":z==="DevOps"?"Tools for deployment, orchestration, and infrastructure management.":z==="Multimedia"?"Audio, video, and image processing tools.":z==="Security"?"Security tools, encryption, and authentication systems.":z==="Networking"?"Network tools, protocols, and communication software.":z==="CLI Tools & Utilities"?"Command-line utilities and system tools.":`Packages related to ${z.toLowerCase()}.`}
|
|
250
|
-
|
|
251
|
-
## Packages
|
|
252
|
-
|
|
253
|
-
`;B.forEach(({domainVarName:j,pkg:L})=>{let _=L.domain||L.fullPath||"unknown",T=(V)=>{if(!L.versions||L.versions.length===0)return V.replace(/\{\{/g,"{{").replace(/\}\}/g,"}}");let S=L.versions[0],x=S.split("."),b=x[0]||"",d=x[1]||"",f=x[2]||"",u=d?`${b}.${d}`:b;return V.replace(/\{\{\s*version\.marketing\s*\}\}/g,u).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,S).replace(/\{\{\s*version\s*\}\}/g,S).replace(/\{\{(?![^}]*\}\})/g,"{{")},E=[];if(L.name&&L.name!==_)E.push(L.name);if(L.aliases&&L.aliases.length>0)E.push(...L.aliases);let C=E.length>0?` (${E.join(", ")})`:"",w=L.description||"",F=T(w).replace(/\s+/g," "),R;if(_.includes("."))if(_.startsWith("github.com/")&&_.includes("/")){let S=_.replace("github.com/","").split("/");if(S.length>=2){let x=S[0],b=S.slice(1).join("-");R=`../packages/github.com/${x}/${b}.md`}else{let x=j.toLowerCase();if(/^\d/.test(x))x=`pkg-${x}`;x=x.replace(/[^\w-]/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,""),R=`../packages/${x}.md`}}else R=`../packages/${_}/index.md`;else{let V=j.toLowerCase();if(/^\d/.test(V))V=`pkg-${V}`;V=V.replace(/[^\w-]/g,"-").replace(/-+/g,"-").replace(/^-+|-+$/g,""),R=`../packages/${V}.md`}O+=`### [${_}](${R})${C}
|
|
254
|
-
|
|
255
|
-
${F?`${F}`:""}
|
|
256
|
-
|
|
257
|
-
**Programs**: ${L.programs&&L.programs.length>0?L.programs.map((V)=>T(V)).join(", "):"None specified"}
|
|
258
|
-
|
|
259
|
-
**Install**: \`${Q4(L)}\`
|
|
260
|
-
|
|
261
|
-
---
|
|
262
|
-
|
|
263
|
-
`}),O+=`[← Back to Package Catalog](../package-catalog.md)
|
|
264
|
-
`,await A.promises.writeFile(q,U0(O)),U.push(q)}return U}async function W0(Q=$0,$){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 X=await Y8(Q,$);console.log(`✅ Generated: ${X}`),console.log("\uD83D\uDCC4 Generating individual package pages...");let Z=await K8(Q,$);console.log(`✅ Generated ${Z.length} package pages`),console.log("\uD83D\uDCC2 Generating category pages...");let W=await B8(Q,$);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: ${X}`),console.log(`- Package pages: ${Z.length} files in docs/packages/`),console.log(`- Category pages: ${W.length} files in docs/categories/`)}catch(X){throw console.error("❌ Error generating documentation:",X),X}}async function J0(){try{console.log("\uD83C\uDFAF Updating Dependencies type timestamp...");let Q=I.join(m.cwd(),"src","dependencies.ts");if(!A.existsSync(Q)){console.log("dependencies.ts not found, skipping update");return}let $=A.readFileSync(Q,"utf-8"),X=new Date().toISOString(),Z=$.replace(/\/\/ Auto-generated precise dependency types/,`// Auto-generated precise dependency types
|
|
267
|
-
// Last updated: ${X}`);A.writeFileSync(Q,Z),console.log("✅ Updated dependencies.ts timestamp")}catch(Q){console.error("Error updating dependencies.ts:",Q)}}async function O8(){try{let Q=m.argv.slice(2);switch(Q[0]||"index"){case"index":{if(console.log("\uD83D\uDD27 Generating package index..."),!await X0())console.error("❌ Failed to generate index"),m.exit(1);if(console.log("\uD83C\uDFF7️ Generating aliases..."),!await Z0())console.error("❌ Failed to generate aliases"),m.exit(1);console.log("\uD83C\uDFAF Updating PackageVersionMap..."),await J0(),console.log("✨ Index and aliases generation completed successfully!");break}case"docs":{let X=Q[1]||$0;console.log(`\uD83D\uDCDA Generating documentation to ${X}...`),await W0(X),console.log("✨ Documentation generation completed successfully!");break}case"all":{if(console.log("\uD83D\uDE80 Generating everything..."),console.log("\uD83D\uDD27 Generating package index..."),!await X0())console.error("❌ Failed to generate index"),m.exit(1);if(console.log("\uD83C\uDFF7️ Generating aliases..."),!await Z0())console.error("❌ Failed to generate aliases"),m.exit(1);console.log("\uD83C\uDFAF Updating PackageVersionMap..."),await J0();let W=Q[1]||$0;console.log(`\uD83D\uDCDA Generating documentation to ${W}...`),await W0(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 i0=m.argv[1]?.replace(/\\/g,"/"),_8=i0?.endsWith("/generate.ts")||i0==="generate.ts";if(_8)O8();import BQ from"node:fs";import L8 from"node:os";import KQ from"node:path";import hQ from"node:process";async function q8(Q,$={}){let{targetOs:X=hQ.platform==="darwin"?"darwin":hQ.platform==="win32"?"windows":"linux",includeOsSpecific:Z=!0,maxDepth:W=10,verbose:H=!1}=$,U=await P0(Q,{targetOs:X,includeOsSpecific:Z,maxDepth:W,verbose:H}),J=TQ(Q),z=U.allDependencies.map((Y)=>({name:Y.name,version:Y.version,constraint:Y.constraint,isOsSpecific:Y.isOsSpecific,os:Y.os})),K=`pantry install ${J.map((Y)=>Y.name).join(" ")}`,B=U.conflicts.map((Y)=>{let q=z.find((O)=>O.name===Y.package);return{package:Y.package,versions:Y.versions,resolved:q?.version||"latest"}});return{packages:z,directCount:J.length,totalCount:z.length,conflicts:B,pantryCommand:K}}async function zX(Q,$={}){let X=BQ.mkdtempSync(KQ.join(L8.tmpdir(),"pantry-deps-")),Z=KQ.join(X,"deps.yaml");try{return BQ.writeFileSync(Z,Q,{encoding:"utf-8",mode:384}),await q8(Z,$)}finally{try{BQ.rmSync(X,{recursive:!0,force:!0})}catch{}}}async function GX(Q,$={}){let{targetOs:X=hQ.platform==="darwin"?"darwin":hQ.platform==="win32"?"windows":"linux",includeOsSpecific:Z=!0,maxDepth:W=10}=$,H=await EQ(Q,{targetOs:X,includeOsSpecific:Z,maxDepth:W});return H.unshift({name:Q,version:"latest",constraint:"*",isOsSpecific:!1}),(await pQ(H,{targetOs:X,includeOsSpecific:Z,maxDepth:W})).allDependencies.map((J)=>({name:J.name,version:J.version,constraint:J.constraint,isOsSpecific:J.isOsSpecific,os:J.os}))}function YX(Q,$="pantry"){if($==="pkgx")return`pkgx install ${Q.join(" ")}`;return`pantry install ${Q.join(" ")}`}function KX(Q){let $=[],X=KQ.join(Q,"pantry");try{let H=BQ.readdirSync(X,{withFileTypes:!0});for(let U of H){if(!U.isDirectory())continue;if(U.name.startsWith("@")){let J=KQ.join(X,U.name);try{let z=BQ.readdirSync(J,{withFileTypes:!0});for(let G of z){if(!G.isDirectory())continue;let K=`${U.name}/${G.name}`,B=KQ.join(J,G.name,"package.json"),Y=$4(B);$.push({name:K,version:Y,isWorkspace:K.startsWith("@stacksjs/"),isScoped:!0})}}catch{}}else{let J=KQ.join(X,U.name,"package.json"),z=$4(J);$.push({name:U.name,version:z,isWorkspace:!1,isScoped:!1})}}}catch{}$.sort((H,U)=>H.name.localeCompare(U.name));let Z=$.filter((H)=>H.isWorkspace).length,W=$.length-Z;return{packages:$,thirdPartyCount:W,workspaceCount:Z,totalCount:$.length}}function $4(Q){try{let $=BQ.readFileSync(Q,"utf-8");return JSON.parse($).version||"0.0.0"}catch{return"0.0.0"}}$$();function OX(Q){return Q}function _X(Q){return Q}var LX={baseUrl:"https://dist.pkgx.dev"};function qX(Q){return Q}import{execFileSync as F0}from"node:child_process";import v from"node:fs";import P8 from"node:os";import P from"node:path";import uQ from"node:process";import j8 from"node:fs";import X4 from"node:path";function z0(Q,$){let X=X4.resolve(Q),Z=[],W=$.rules.some((U)=>U.negated);function H(U,J){let z;try{z=j8.readdirSync(U,{withFileTypes:!0})}catch{return}for(let G of z){let K=J?`${J}/${G.name}`:G.name,B=X4.join(U,G.name),Y=G.isSymbolicLink(),q=G.isDirectory()&&!Y,O=$.ignores(K);if(q){if(O&&!W)continue;if(!O)Z.push({relPath:K,absPath:B,isDir:!0,isSymlink:!1});H(B,K)}else{if(O)continue;Z.push({relPath:K,absPath:B,isDir:!1,isSymlink:Y})}}}return H(X,""),Z.sort((U,J)=>U.relPath<J.relPath?-1:U.relPath>J.relPath?1:0),Z}var w8=new Set(["FROM","RUN","CMD","LABEL","MAINTAINER","EXPOSE","ENV","ADD","COPY","ENTRYPOINT","VOLUME","USER","WORKDIR","ARG","ONBUILD","STOPSIGNAL","HEALTHCHECK","SHELL"]);function C8(Q){let $={},X=0;for(;X<Q.length;X++){let W=Q[X].trim();if(W==="")continue;let H=/^#\s*([a-z][a-z0-9_-]*)\s*=\s*(.+?)\s*$/i.exec(W);if(!H)break;$[H[1].toLowerCase()]=H[2]}return{directives:$,bodyStart:0}}function F8(Q,$){let X=Q.split(`
|
|
283
|
-
`),Z=[],W="",H=0,U=new RegExp(`${$==="\\"?"\\\\":"`"}\\s*$`);for(let J=0;J<X.length;J++){let z=X[J].replace(/\r$/,""),G=W!=="";if(!G&&z.trim().startsWith("#"))continue;if(!G)H=J+1;if(U.test(z)){z=z.replace(U,""),W+=z;continue}if(W+=z,W.trim()!=="")Z.push({text:W,line:H});W=""}if(W.trim()!=="")Z.push({text:W,line:H});return Z}function T8(Q){let $={},X=Q.trimStart(),Z=/^--([a-z][a-z0-9-]*)=("[^"]*"|'[^']*'|\S+)\s*/i,W=Z.exec(X);while(W){let H=W[2];if(H.startsWith('"')&&H.endsWith('"')||H.startsWith("'")&&H.endsWith("'"))H=H.slice(1,-1);$[W[1]]=H,X=X.slice(W[0].length),W=Z.exec(X)}return{flags:$,rest:X.trim()}}function G0(Q){let $=Q.split(`
|
|
284
|
-
`),{directives:X}=C8($),Z=X.escape==="`"?"`":"\\",W=F8(Q,Z),H=[],U=[],J=[],z;for(let{text:G,line:K}of W){let B=G.trim();if(B==="")continue;let Y=B.search(/\s/),q=(Y===-1?B:B.slice(0,Y)).toUpperCase(),O=Y===-1?"":B.slice(Y+1).trim();if(!w8.has(q)){let T={instruction:q,args:O,flags:{},line:K};if(H.push(T),z)z.instructions.push(T);continue}let{flags:j,rest:L}=T8(O),_={instruction:q,args:L,flags:j,line:K};if(H.push(_),q==="FROM"){let T=E8(L,j,J.length);J.push(T),z=T;continue}if(!z){if(q==="ARG")U.push(_);continue}z.instructions.push(_)}return{directives:X,globalArgs:U,stages:J,instructions:H}}function E8(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:$.platform,index:X,instructions:[]}}function a(Q){let $=Q.trim();if(!$.startsWith("["))return;try{let X=JSON.parse($);if(Array.isArray(X)&&X.every((Z)=>typeof Z==="string"))return X}catch{}return}function Y0(Q,$){if(!$)return Q.stages;let X=Q.stages.findIndex((Z)=>Z.name===$);if(X===-1)throw Error(`Build target stage "${$}" not found`);return Q.stages.slice(0,X+1)}import Z4 from"node:fs";import K0 from"node:path";var R8=[".freezer",".dockerignore"];function W4(Q){let $=Q.trim();if($=$.replace(/\\/g,"/"),$.startsWith("/"))$=$.slice(1);if($.endsWith("/"))$=$.slice(0,-1);let Z="^";for(let W=0;W<$.length;W++){let H=$[W];if(H==="*")if($[W+1]==="*"){if(W++,$[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 J4(Q){let $=[];for(let X of Q.split(`
|
|
285
|
-
`)){let Z=X.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;$.push({pattern:W,negated:H,regex:W4(W)})}return $}function H4(Q){return{rules:Q,ignores($){let X=$.replace(/\\/g,"/").replace(/^\.\//,"").replace(/^\/+/,""),Z=!1;for(let W of Q)if(W.regex.test(X))Z=!W.negated;return Z}}}function B0(Q,$){let X="",Z,W=$&&K0.resolve($)!==K0.resolve(Q)?[Q,$]:[Q];Q:for(let z of W)for(let G of R8){let K=K0.join(z,G);if(Z4.existsSync(K)){X=Z4.readFileSync(K,"utf8"),Z=G;break Q}}let H=J4(X),U=[".freezer",".dockerignore",".git"];for(let z of U)if(!H.some((G)=>G.pattern===z||G.negated&&G.pattern===z))H.unshift({pattern:z,negated:!1,regex:W4(z)});let J=H4(H);return J.sourceFile=Z,J}import{execFileSync as U4}from"node:child_process";import{createHash as M8}from"node:crypto";import h from"node:fs";import k from"node:path";import{gzipSync as V8}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 e(Q){return`sha256:${M8("sha256").update(Q).digest("hex")}`}function o(Q){return Q.startsWith("sha256:")?Q.slice(7):Q}function I8(Q){let $=k.join(Q,"..",`.layer-${process.pid}-${Date.now()}.tar`);try{return U4("tar",["-cf",$,"--numeric-owner","-C",Q,"."],{stdio:"pipe",maxBuffer:536870912}),h.readFileSync($)}finally{if(h.existsSync($))h.rmSync($,{force:!0})}}function O0(Q,$){let X=I8(Q),Z=e(X),W=V8(X,{level:6}),H=e(W);h.mkdirSync($,{recursive:!0});let U=k.join($,`${o(H)}.tar.gz`),J=k.join($,`${o(Z)}.tar`);return h.writeFileSync(U,W),h.writeFileSync(J,X),{digest:H,diffId:Z,size:W.length,path:U,tarPath:J}}function _0(Q){let $=Buffer.from(JSON.stringify(Q));return{bytes:$,digest:e($)}}function L0(Q,$,X){let Z=X.map((U)=>({mediaType:p.layerGzip,digest:U.digest,size:U.size})),W={schemaVersion:2,mediaType:p.manifest,config:{mediaType:p.config,digest:Q,size:$},layers:Z},H=Buffer.from(JSON.stringify(W));return{manifest:W,bytes:H,digest:e(H)}}function q0(Q,$,X,Z,W,H,U){let J=k.join(Q,"blobs","sha256");h.mkdirSync(J,{recursive:!0}),h.writeFileSync(k.join(Q,"oci-layout"),`${JSON.stringify({imageLayoutVersion:"1.0.0"})}
|
|
286
|
-
`),h.writeFileSync(k.join(J,o(W)),Z),h.writeFileSync(k.join(J,o(X)),$);for(let G of H)h.copyFileSync(G.path,k.join(J,o(G.digest)));let z={schemaVersion:2,mediaType:p.manifestList,manifests:[{mediaType:p.manifest,digest:X,size:$.length,annotations:U.length?{"org.opencontainers.image.ref.name":U[0]}:void 0}]};h.writeFileSync(k.join(Q,"index.json"),JSON.stringify(z))}function j0(Q,$,X,Z,W){let H=`${Q}.stage-${process.pid}`;h.rmSync(H,{recursive:!0,force:!0}),h.mkdirSync(H,{recursive:!0});try{let U=`${o(X)}.json`;h.writeFileSync(k.join(H,U),$);let J=[];for(let G of Z){let K=o(G.diffId);h.mkdirSync(k.join(H,K),{recursive:!0}),h.copyFileSync(G.tarPath,k.join(H,K,"layer.tar")),J.push(`${K}/layer.tar`)}let z=[{Config:U,RepoTags:W.length?W:void 0,Layers:J}];h.writeFileSync(k.join(H,"manifest.json"),JSON.stringify(z)),h.mkdirSync(k.dirname(Q),{recursive:!0}),h.rmSync(Q,{force:!0}),U4("tar",["-cf",Q,"-C",H,"."],{stdio:"pipe",maxBuffer:536870912})}finally{h.rmSync(H,{recursive:!0,force:!0})}}function z4(Q){let $=process.arch==="arm64"?"arm64":process.arch==="x64"?"amd64":process.arch;if(!Q)return{os:"linux",architecture:$};let[X,Z]=Q.split("/");return{os:X||"linux",architecture:Z||$}}import{execFileSync as S8}from"node:child_process";import{createHash as A8}from"node:crypto";import qQ from"node:fs";import K4 from"node:https";import x8 from"node:path";import i from"node:process";var QQ=(i.env.PANTRY_REGISTRY_URL||"https://registry.pantry.dev").replace(/\/$/,""),G4="registry-1.docker.io",N8=[p.manifest,p.manifestList,p.dockerManifest,p.dockerManifestList].join(", ");function B4(Q){let $=Q,X,Z=$.indexOf("@");if(Z!==-1)X=$.slice(Z+1),$=$.slice(0,Z);let W=$.indexOf("/"),H="",U=$,J=!0;if(W!==-1){let B=$.slice(0,W);if(B==="localhost"||B.includes(".")||B.includes(":"))H=B,U=$.slice(W+1),J=!1}let z=U,G="latest",K=U.lastIndexOf(":");if(K!==-1&&!U.slice(K).includes("/"))z=U.slice(0,K),G=U.slice(K+1);if(J&&!z.includes("/"))z=`library/${z}`;return{registry:H,repository:z,tag:G,digest:X,implicitRegistry:J}}function s(Q,$={}){let{method:X="GET",headers:Z={},body:W,maxRedirects:H=5}=$;return new Promise((U,J)=>{let z=new URL(Q),G=K4.request({method:X,hostname:z.hostname,port:z.port||443,path:z.pathname+z.search,headers:{"User-Agent":"pantry-container",...Z},timeout:60000},(K)=>{let B=K.statusCode||0;if(B>=300&&B<400&&K.headers.location&&H>0){let q=new URL(K.headers.location,Q).toString();K.resume();let O={...Z};if(new URL(q).hostname!==z.hostname)delete O.Authorization;return s(q,{method:X,headers:O,body:W,maxRedirects:H-1}).then(U,J)}let Y=[];K.on("data",(q)=>Y.push(q)),K.on("end",()=>U({status:B,headers:K.headers,body:Buffer.concat(Y)}))});if(G.on("error",J),G.on("timeout",()=>{G.destroy(),J(Error(`timeout: ${Q}`))}),W)G.write(W);G.end()})}function O4(Q,$,X={},Z=5){return new Promise((W,H)=>{let U=new URL(Q),J=K4.get({hostname:U.hostname,port:U.port||443,path:U.pathname+U.search,headers:{"User-Agent":"pantry-container",...X},timeout:120000},(z)=>{let G=z.statusCode||0;if(G>=300&&G<400&&z.headers.location&&Z>0){z.resume();let Y=new URL(z.headers.location,Q).toString(),q={...X};if(new URL(Y).hostname!==U.hostname)delete q.Authorization;return O4(Y,$,q,Z-1).then(W,H)}if(G<200||G>=300)return z.resume(),H(Error(`HTTP ${G} downloading ${Q}`));let K=qQ.createWriteStream($),B=0;z.on("data",(Y)=>{B+=Y.length}),z.pipe(K),K.on("finish",()=>K.close(()=>W(B))),K.on("error",H)});J.on("error",H),J.on("timeout",()=>{J.destroy(),H(Error(`timeout: ${Q}`))})})}async function _4(Q,$,X){let Z=Q==="pantry"?QQ:`https://${Q}`;if(Z===QQ)return i.env.PANTRY_REGISTRY_TOKEN||i.env.PANTRY_TOKEN||void 0;let W=await 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 z=new URL(U);if(J)z.searchParams.set("service",J);z.searchParams.set("scope",`repository:${$}:${X}`);let G={},K=i.env.DOCKER_USERNAME,B=i.env.DOCKER_PASSWORD||i.env.DOCKER_TOKEN;if(K&&B)G.Authorization=`Basic ${Buffer.from(`${K}:${B}`).toString("base64")}`;let Y=await s(z.toString(),{headers:G});if(Y.status!==200)return;let q=JSON.parse(Y.body.toString());return q.token||q.access_token}function b8(Q){if(!Q.implicitRegistry&&Q.registry){let $=QQ.includes(Q.registry);return[{base:$?QQ:`https://${Q.registry}`,hostKey:$?"pantry":Q.registry}]}return[{base:QQ,hostKey:"pantry"},{base:`https://${G4}`,hostKey:G4}]}async function Y4(Q,$,X,Z){let W={Accept:N8};if(Z)W.Authorization=`Bearer ${Z}`;return s(`${Q}/v2/${$}/manifests/${X}`,{headers:W})}async function w0(Q,$,X={}){let Z=B4(Q),W=X.platform?.split("/")[0]||"linux",H=X.platform?.split("/")[1]||(i.arch==="arm64"?"arm64":"amd64");qQ.mkdirSync($,{recursive:!0});let U;for(let{base:J,hostKey:z}of b8(Z))try{let G=await _4(z,Z.repository,"pull"),K=Z.digest||Z.tag,B=await Y4(J,Z.repository,K,G);if(B.status===404||B.status===401){U=Error(`${J}: HTTP ${B.status} for ${Z.repository}:${K}`);continue}if(B.status!==200)throw Error(`${J}: manifest HTTP ${B.status}`);let Y=JSON.parse(B.body.toString());if(Y.manifests&&Array.isArray(Y.manifests)){let C=Y.manifests.find((w)=>w.platform?.os===W&&w.platform?.architecture===H)||Y.manifests.find((w)=>w.platform?.architecture===H)||Y.manifests[0];if(!C)throw Error("no matching platform in image index");if(B=await Y4(J,Z.repository,C.digest,G),B.status!==200)throw Error(`${J}: platform manifest HTTP ${B.status}`);Y=JSON.parse(B.body.toString())}let q=e(B.body),O=G?{Authorization:`Bearer ${G}`}:{},j=Y.config.digest,L=await s(`${J}/v2/${Z.repository}/blobs/${j}`,{headers:O});if(L.status!==200)throw Error(`${J}: config blob HTTP ${L.status}`);let _=JSON.parse(L.body.toString()),T=[],E=_.rootfs?.diff_ids||[];for(let C=0;C<Y.layers.length;C++){let w=Y.layers[C],F=x8.join($,`${o(w.digest)}.tar.gz`);if(!X.quiet)console.error(` ↓ layer ${C+1}/${Y.layers.length} ${w.digest.slice(0,19)}…`);let R=await O4(`${J}/v2/${Z.repository}/blobs/${w.digest}`,F,O);T.push({digest:w.digest,diffId:E[C]||"",path:F,size:R})}return{manifest:Y,manifestDigest:q,config:_,layers:T,source:J}}catch(G){U=G}throw Error(`Failed to pull ${Q}: ${U?.message||"unknown error"}`)}async function y8(Q){let $=(Q.registry||QQ).replace(/\/$/,""),X=$===QQ?"pantry":new URL($).hostname,Z=await _4(X,Q.repository,"push,pull"),W=Z?{Authorization:`Bearer ${Z}`}:{},H=async(z,G)=>{if((await s(`${$}/v2/${Q.repository}/blobs/${z}`,{method:"HEAD",headers:W})).status===200)return;let B=await s(`${$}/v2/${Q.repository}/blobs/uploads/`,{method:"POST",headers:W});if(B.status!==202)throw Error(`push: upload start HTTP ${B.status} for ${Q.repository}`);let Y=String(B.headers.location||""),q=new URL(Y,$);q.searchParams.set("digest",z);let O=await s(q.toString(),{method:"PUT",headers:{...W,"Content-Type":"application/octet-stream"},body:G});if(O.status!==201)throw Error(`push: blob PUT HTTP ${O.status}`)};if(!Q.quiet)console.error(" ↑ config");await H(Q.configDigest,Q.configBytes);for(let z=0;z<Q.layers.length;z++){if(!Q.quiet)console.error(` ↑ layer ${z+1}/${Q.layers.length}`);await H(Q.layers[z].digest,qQ.readFileSync(Q.layers[z].path))}let U=e(Q.manifestBytes),J=await s(`${$}/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:`${$.replace(/^https?:\/\//,"")}/${Q.repository}:${Q.tag}`,digest:U}}function D8(Q,$){let X=A8("sha256");return X.update(qQ.readFileSync(Q)),`sha256:${X.digest("hex")}`===$}function C0(Q,$){qQ.mkdirSync($,{recursive:!0}),S8("tar",["xzf",Q,"-C",$],{stdio:"pipe",maxBuffer:536870912})}function L4(){return{env:new Map,args:new Map,workdir:"/",labels:new Map,exposed:new Set,volumes:new Set,shell:["/bin/sh","-c"]}}function $Q(Q,$){let X=(Z)=>$.args.get(Z)??$.env.get(Z)??"";return Q.replace(/\$\{([A-Z0-9_]+)\}/gi,(Z,W)=>X(W)).replace(/\$([A-Z0-9_]+)/gi,(Z,W)=>X(W))}function kQ(Q){let $=[];if(/^\s*[A-Z0-9_]+=/i.test(Q)){let X=/([A-Z0-9_]+)=("(?:[^"\\]|\\.)*"|'(?:[^'\\]|\\.)*'|\S+)/gi,Z=X.exec(Q);while(Z){let W=Z[2];if(W.startsWith('"')&&W.endsWith('"')||W.startsWith("'")&&W.endsWith("'"))W=W.slice(1,-1);$.push([Z[1],W]),Z=X.exec(Q)}}else{let X=Q.search(/\s/);if(X!==-1)$.push([Q.slice(0,X),Q.slice(X+1).trim()])}return $}function v8(Q,$,X){let Z=X.startsWith("/")?X:P.posix.join($,X);return P.join(Q,Z)}function h8(Q){if(Q&&Q!=="auto")return Q;let $=uQ.platform==="linux",X=typeof uQ.getuid==="function"&&uQ.getuid()===0;return $&&X?"chroot":"host"}function T0(Q,$){let X=v.lstatSync(Q);if(X.isSymbolicLink()){let Z=v.readlinkSync(Q);v.mkdirSync(P.dirname($),{recursive:!0}),v.rmSync($,{force:!0}),v.symlinkSync(Z,$)}else if(X.isDirectory())v.mkdirSync($,{recursive:!0}),v.cpSync(Q,$,{recursive:!0});else v.mkdirSync(P.dirname($),{recursive:!0}),v.copyFileSync(Q,$)}async function u8(Q){let $=P.resolve(Q.context),X=Q.dockerfile?P.resolve(Q.dockerfile):P.join($,"Dockerfile");if(!v.existsSync(X))throw Error(`Dockerfile not found: ${X}`);let Z=G0(v.readFileSync(X,"utf8")),W=Y0(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=h8(Q.runMode),{os:z,architecture:G}=z4(Q.platform),K=v.mkdtempSync(P.join(P8.tmpdir(),"pantry-build-")),B=P.join(K,"blobs");v.mkdirSync(B,{recursive:!0});let Y=new Map,q=B0($,P.dirname(X)),O=z0($,q),j=L4(),L="",_=new Map;for(let N of Z.globalArgs){let[D,c]=kQ(N.args)[0]??[];if(D)_.set(D,Q.buildArgs?.[D]??c??"")}for(let N of W){let D=L4();for(let[ZQ,l]of _)D.args.set(ZQ,l);let c=P.join(K,`stage-${N.index}`);v.mkdirSync(c,{recursive:!0});let XQ=$Q(N.baseImage,D);if(U(`[stage ${N.index}${N.name?` ${N.name}`:""}] FROM ${XQ}`),XQ==="scratch");else if(Y.has(XQ))v.cpSync(Y.get(XQ),c,{recursive:!0});else{let ZQ=await w0(XQ,B,{platform:Q.platform,quiet:H});for(let OQ of ZQ.layers)C0(OQ.path,c);let l=ZQ.config.config||{};for(let OQ of l.Env||[]){let dQ=OQ.indexOf("=");if(dQ!==-1)D.env.set(OQ.slice(0,dQ),OQ.slice(dQ+1))}if(l.WorkingDir)D.workdir=l.WorkingDir;if(l.Entrypoint)D.entrypoint=l.Entrypoint;if(l.Cmd)D.cmd=l.Cmd;if(l.User)D.user=l.User;U(` pulled base from ${ZQ.source}`)}for(let ZQ of N.instructions)k8(ZQ,D,c,{context:$,contextEntries:O,stageRootfs:Y,runMode:J,matcher:q,log:U});if(N.name)Y.set(N.name,c);j=D,L=c}U("packaging image layer...");let T=O0(L,B),E=new Date().toISOString(),C={architecture:G,os:z,created:E,config:{User:j.user,ExposedPorts:j.exposed.size?Object.fromEntries([...j.exposed].map((N)=>[N,{}])):void 0,Env:[...j.env].map(([N,D])=>`${N}=${D}`),Entrypoint:j.entrypoint,Cmd:j.cmd,Volumes:j.volumes.size?Object.fromEntries([...j.volumes].map((N)=>[N,{}])):void 0,WorkingDir:j.workdir!=="/"?j.workdir:void 0,Labels:j.labels.size?Object.fromEntries(j.labels):void 0,StopSignal:j.stopSignal},rootfs:{type:"layers",diff_ids:[T.diffId]},history:[{created:E,created_by:"pantry build",comment:"flattened image"}]},{bytes:w,digest:F}=_0(C),{bytes:R,digest:V,manifest:S}=L0(F,w.length,[T]),x=Q.tags??[],b=Q.outputDir?P.resolve(Q.outputDir):P.join($,".pantry","images");v.mkdirSync(b,{recursive:!0});let d=P.join(b,"oci-layout");v.mkdirSync(d,{recursive:!0}),q0(d,R,V,w,F,[T],x);let f=`${(x[0]||"image").replace(/[/:]/g,"_")}.tar`,u=P.join(b,f);j0(u,w,F,[T],x),U(`built ${V}`);try{v.rmSync(K,{recursive:!0,force:!0})}catch{}return{imageId:V,tags:x,archivePath:u,ociLayoutPath:d,config:C,layers:[T],configBytes:w,configDigest:F,manifestBytes:R,manifestMediaType:S.mediaType}}function k8(Q,$,X,Z){let W=$Q(Q.args,$);switch(Q.instruction){case"ENV":{for(let[H,U]of kQ(Q.args))$.env.set(H,$Q(U,$));break}case"ARG":{let[H,U]=kQ(Q.args)[0]??[];if(H&&!$.args.has(H))$.args.set(H,U?$Q(U,$):"");break}case"LABEL":{for(let[H,U]of kQ(Q.args))$.labels.set(H,$Q(U,$));break}case"WORKDIR":{let H=W.startsWith("/")?W:P.posix.join($.workdir,W);$.workdir=H,v.mkdirSync(P.join(X,H),{recursive:!0});break}case"USER":{$.user=W.trim();break}case"EXPOSE":{for(let H of W.split(/\s+/).filter(Boolean))$.exposed.add(H.includes("/")?H:`${H}/tcp`);break}case"VOLUME":{let U=a(Q.args)??W.split(/\s+/).filter(Boolean);for(let J of U)$.volumes.add(J);break}case"STOPSIGNAL":{$.stopSignal=W.trim();break}case"SHELL":{let H=a(Q.args);if(H)$.shell=H;break}case"ENTRYPOINT":{let H=a(Q.args);$.entrypoint=H??[...$.shell,W];break}case"CMD":{let H=a(Q.args);$.cmd=H??[...$.shell,W];break}case"COPY":case"ADD":{f8(Q,$,X,Z);break}case"RUN":{g8(Q,$,X,Z);break}case"MAINTAINER":{$.labels.set("maintainer",W.trim());break}default:Z.log(` (skipping unsupported instruction: ${Q.instruction})`)}}function f8(Q,$,X,Z){let H=a(Q.args)??$Q(Q.args,$).split(/\s+/).filter(Boolean);if(H.length<2)return;let U=H[H.length-1],J=H.slice(0,-1),z=Q.flags.from,G=v8(X,$.workdir,U),K=U.endsWith("/")||J.length>1;if(z&&Z.stageRootfs.has(z)){let B=Z.stageRootfs.get(z);if(K)v.mkdirSync(G,{recursive:!0});for(let Y of J){let q=P.join(B,Y);if(!v.existsSync(q)){Z.log(` COPY --from: source not found, skipping: ${Y}`);continue}let O=K?P.join(G,P.basename(Y)):G;T0(q,O)}return}for(let B of J){let Y=B.replace(/^\.\/?/,"").replace(/\/+$/,""),q=Y===""?"":`${Y}/`,O=Z.contextEntries.find((L)=>!L.isDir&&L.relPath===Y);if(O){let L=K?P.join(G,P.basename(Y)):G;T0(O.absPath,L);continue}let j=Z.contextEntries.filter((L)=>L.relPath!==Y&&(q===""?!0:L.relPath.startsWith(q)));if(j.length===0){Z.log(` COPY: source not found or empty, skipping: ${B}`);continue}v.mkdirSync(G,{recursive:!0});for(let L of j){let _=q===""?L.relPath:L.relPath.slice(q.length),T=P.join(G,_);if(L.isDir)v.mkdirSync(T,{recursive:!0});else T0(L.absPath,T)}}}function g8(Q,$,X,Z){if(Z.runMode==="skip"){Z.log(` RUN (skipped): ${Q.args}`);return}let W=a(Q.args),H={...uQ.env,...Object.fromEntries($.env)},U=P.join(X,$.workdir);if(v.mkdirSync(U,{recursive:!0}),Z.runMode==="chroot"){let J=W?W:[...$.shell,`cd ${$.workdir} 2>/dev/null; ${$Q(Q.args,$)}`];Z.log(` RUN ${W?W.join(" "):Q.args}`),F0("chroot",[X,...J],{stdio:"inherit",env:H});return}if(Z.log(` RUN (host) ${W?W.join(" "):Q.args}`),W)F0(W[0],W.slice(1),{cwd:U,stdio:"inherit",env:H});else F0($.shell[0],[...$.shell.slice(1),$Q(Q.args,$)],{cwd:U,stdio:"inherit",env:H})}import jQ from"node:fs";import q4 from"node:path";var m8=`# .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 j4(Q){let $=Q.baseImage??"oven/bun:1.3.14-alpine",X=Q.workdir??"/app",Z=Q.installCommand??(Q.buildCommand?"bun install --frozen-lockfile":"bun install --frozen-lockfile --production"),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 ${$} AS base`),J.push(`WORKDIR ${X}`),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 --chown=bun:bun . ."),J.push(`RUN ${Z}`),Q.buildCommand){if(J.push(`RUN ${Q.buildCommand}`),!Q.installCommand)J.push("RUN bun install --frozen-lockfile --production")}J.push(""),J.push("# Source and runtime dependencies are owned by the non-root runtime user."),J.push("USER bun"),J.push("");for(let[z,G]of Object.entries(U))J.push(`ENV ${z}=${G}`);return J.push(""),J.push(`EXPOSE ${W}/tcp`),J.push(`CMD ${JSON.stringify(H)}`),J.push(""),J.join(`
|
|
313
|
-
`)}function d8(Q){jQ.mkdirSync(Q.outDir,{recursive:!0});let $=q4.join(Q.outDir,Q.dockerfileName??"Dockerfile"),X=q4.join(Q.outDir,".freezer"),Z=!1,W=!1;if(Q.force||!jQ.existsSync($))jQ.writeFileSync($,j4(Q)),Z=!0;if(Q.force||!jQ.existsSync(X))jQ.writeFileSync(X,m8),W=!0;return{dockerfilePath:$,freezerPath:X,wroteDockerfile:Z,wroteFreezer:W}}import{createPrivateKey as c8,sign as l8}from"node:crypto";import{existsSync as p8,readFileSync as n8}from"node:fs";var o8="https://api.appstoreconnect.apple.com/v1";function T4(Q){let $=[Q.detail??Q.title??Q.code].filter((X)=>Boolean(X));for(let X of Object.values(Q.meta?.associatedErrors??{}))for(let Z of X)$.push(...T4(Z));return $}function w4(Q){return Buffer.from(JSON.stringify(Q)).toString("base64url")}function i8(Q){let $={keyId:Q.keyId||process.env.APP_STORE_CONNECT_API_KEY_ID||"",issuerId:Q.issuerId||process.env.APP_STORE_CONNECT_API_ISSUER_ID||"",keyPath:Q.keyPath||process.env.APP_STORE_CONNECT_API_KEY_PATH||""};if(!$.keyId)throw Error("[pantry] APP_STORE_CONNECT_API_KEY_ID is required");if(!$.issuerId)throw Error("[pantry] APP_STORE_CONNECT_API_ISSUER_ID is required");if(!$.keyPath||!p8($.keyPath))throw Error("[pantry] APP_STORE_CONNECT_API_KEY_PATH must point to an existing .p8 file");return $}function s8(Q,$=Math.floor(Date.now()/1000)){let X={alg:"ES256",kid:Q.keyId,typ:"JWT"},Z={iss:Q.issuerId,iat:$,exp:$+120,aud:"appstoreconnect-v1"},W=`${w4(X)}.${w4(Z)}`,H;try{H=c8(n8(Q.keyPath,"utf8"))}catch(J){throw Error(`[pantry] App Store Connect API key could not be parsed: ${J instanceof Error?J.message:String(J)}`)}let U=l8("sha256",Buffer.from(W),{key:H,dsaEncoding:"ieee-p1363"});return`${W}.${U.toString("base64url")}`}class E4{auth;baseUrl;fetcher;now;constructor(Q={}){this.auth=i8(Q),this.baseUrl=(Q.baseUrl??o8).replace(/\/$/,""),this.fetcher=Q.fetch??globalThis.fetch,this.now=Q.now??(()=>Math.floor(Date.now()/1000))}async request(Q,$={}){let X=/^https?:\/\//.test(Q)?Q:/^\/v\d+\//.test(Q)?`${new URL(this.baseUrl).origin}${Q}`:`${this.baseUrl}${Q}`,Z=await this.fetcher(X,{...$,headers:{Accept:"application/json",Authorization:`Bearer ${s8(this.auth,this.now())}`,...$.body?{"Content-Type":"application/json"}:{},...$.headers}});if(!Z.ok){let W=await Z.json().catch(()=>({})),H=[...new Set(W.errors?.flatMap(T4)??[])].join("; ");throw Error(`[pantry] App Store Connect ${$.method??"GET"} ${Q} failed (${Z.status})${H?`: ${H}`:""}`)}if(Z.status===204)return;return await Z.json()}async upload(Q,$){let X=await this.fetcher(Q,$);if(!X.ok)throw Error(`[pantry] App Store Connect asset upload failed (${X.status})`)}async findBundleId(Q){let $=new URLSearchParams({"filter[identifier]":Q});return(await this.request(`/bundleIds?${$}`)).data.find((Z)=>Z.attributes.identifier===Q)}async registerBundleId(Q,$,X="MAC_OS"){return(await this.request("/bundleIds",{method:"POST",body:JSON.stringify({data:{type:"bundleIds",attributes:{identifier:Q,name:$,platform:X}}})})).data}async ensureBundleId(Q,$,X={}){let Z=await this.findBundleId(Q);if(Z)return{bundleId:Z,created:!1};if(X.checkOnly)return{created:!1};return{bundleId:await this.registerBundleId(Q,$,X.platform),created:!0}}async listBundleIdCapabilities(Q){return(await this.request(`/bundleIds/${Q}/bundleIdCapabilities?limit=200`)).data}async enableBundleIdCapability(Q,$,X=[]){return(await this.request("/bundleIdCapabilities",{method:"POST",body:JSON.stringify({data:{type:"bundleIdCapabilities",attributes:{capabilityType:$,...X.length?{settings:X}:{}},relationships:{bundleId:{data:{type:"bundleIds",id:Q}}}}})})).data}async listCertificates(Q){let $=new URLSearchParams({"filter[certificateType]":Q,"fields[certificates]":"name,certificateType,displayName,serialNumber,platform,expirationDate,certificateContent,activated",limit:"200"});return(await this.request(`/certificates?${$}`)).data}async createCertificate(Q,$){return(await this.request("/certificates",{method:"POST",body:JSON.stringify({data:{type:"certificates",attributes:{certificateType:Q,csrContent:$}}})})).data}async listProfiles(Q){let $=new URLSearchParams({"filter[bundleId]":Q,"filter[profileType]":"MAC_APP_STORE","fields[profiles]":"name,platform,profileContent,uuid,createdDate,expirationDate,profileState,profileType,certificates",include:"certificates",limit:"200"});return(await this.request(`/profiles?${$}`)).data}async createMacAppStoreProfile(Q,$,X){return(await this.request("/profiles",{method:"POST",body:JSON.stringify({data:{type:"profiles",attributes:{name:Q,profileType:"MAC_APP_STORE"},relationships:{bundleId:{data:{type:"bundleIds",id:$}},certificates:{data:[{type:"certificates",id:X}]}}}})})).data}async findApp(Q){let $=new URLSearchParams({"filter[bundleId]":Q});return(await this.request(`/apps?${$}`)).data.find((Z)=>Z.attributes.bundleId===Q)}async listAppStoreVersions(Q){return(await this.request(`/apps/${Q}/appStoreVersions?limit=200`)).data}async createAppStoreVersion(Q,$,X){return(await this.request("/appStoreVersions",{method:"POST",body:JSON.stringify({data:{type:"appStoreVersions",attributes:{platform:$,versionString:X},relationships:{app:{data:{type:"apps",id:Q}}}}})})).data}async updateAppStoreVersion(Q,$){return(await this.request(`/appStoreVersions/${Q}`,{method:"PATCH",body:JSON.stringify({data:{type:"appStoreVersions",id:Q,attributes:{versionString:$}}})})).data}async listBuilds(Q,$){let X=new URLSearchParams({"filter[app]":Q,"filter[version]":$,include:"preReleaseVersion",limit:"20","fields[builds]":"version,uploadedDate,expired,processingState,preReleaseVersion","fields[preReleaseVersions]":"version,platform"}),Z=await this.request(`/builds?${X}`),W=new Map((Z.included??[]).filter((H)=>H.type==="preReleaseVersions").map((H)=>[H.id,H.attributes]));return Z.data.flatMap((H)=>{let U=H.relationships?.preReleaseVersion?.data?.id,J=U?W.get(U):void 0;if(!J)return[];return[{id:H.id,buildNumber:H.attributes.version,version:J.version,platform:J.platform,processingState:H.attributes.processingState}]})}async attachBuild(Q,$){await this.request(`/appStoreVersions/${Q}/relationships/build`,{method:"PATCH",body:JSON.stringify({data:{type:"builds",id:$}})})}}var C4=new Set(["PREPARE_FOR_SUBMISSION","DEVELOPER_REJECTED","REJECTED","METADATA_REJECTED","INVALID_BINARY"]),F4=new Set(["READY_FOR_DISTRIBUTION","READY_FOR_SALE","DEVELOPER_REMOVED_FROM_SALE","REMOVED_FROM_SALE"]);async function O5(Q,$,X){let Z=await Q.listAppStoreVersions($),W=[],H=new Map(X.map((U)=>[U.platform,U]));for(let{platform:U,version:J}of H.values()){let z=Z.find((Y)=>Y.attributes.platform===U&&Y.attributes.versionString===J);if(z){let Y=z.attributes.appStoreState,q=C4.has(Y)?"ready":F4.has(Y)?"published":"deferred";W.push({platform:U,version:J,created:!1,updated:!1,id:z.id,status:q,appStoreState:Y,...q==="deferred"?{reason:`${U} version ${J} is already ${Y}`}:{}});continue}let G=Z.find((Y)=>Y.attributes.platform===U&&C4.has(Y.attributes.appStoreState));if(G){let Y=await Q.updateAppStoreVersion(G.id,J);G.attributes.versionString=J,W.push({platform:U,version:J,created:!1,updated:!0,id:Y.id,status:"ready",appStoreState:Y.attributes.appStoreState});continue}let K=Z.find((Y)=>Y.attributes.platform===U&&!F4.has(Y.attributes.appStoreState));if(K){W.push({platform:U,version:J,created:!1,updated:!1,id:K.id,status:"deferred",appStoreState:K.attributes.appStoreState,reason:`${U} version ${J} is queued behind ${K.attributes.versionString} (${K.attributes.appStoreState})`});continue}let B=await Q.createAppStoreVersion($,U,J);Z.push(B),W.push({platform:U,version:J,created:!0,updated:!1,id:B.id,status:"ready",appStoreState:B.attributes.appStoreState})}return W}async function _5(Q,$,X,Z,W={}){let H=W.timeoutMs??1200000,U=W.pollIntervalMs??15000,J=W.now??Date.now,z=W.sleep??((K)=>new Promise((B)=>setTimeout(B,K))),G=J()+H;while(!0){let K=await Q.listBuilds($,Z),B=[];for(let Y of X){let q=K.find((O)=>O.platform===Y.platform&&O.version===Y.version);if(!q)continue;if(q.processingState==="FAILED"||q.processingState==="INVALID")throw Error(`[pantry] ${Y.platform} build ${Z} failed App Store Connect processing (${q.processingState})`);if(q.processingState!=="VALID")continue;B.push({platform:Y.platform,versionId:Y.id,buildId:q.id,buildNumber:Z})}if(B.length===X.length){for(let Y of B)await Q.attachBuild(Y.versionId,Y.buildId);return B}if(J()>=G){let Y=X.map((q)=>q.platform).join(", ");throw Error(`[pantry] timed out waiting for ${Y} build ${Z} to finish App Store Connect processing`)}await z(U)}}function r8(Q,$=Date.now()){return Q.filter((X)=>X.attributes.activated!==!1).filter((X)=>!X.attributes.expirationDate||Date.parse(X.attributes.expirationDate)>$).sort((X,Z)=>Date.parse(Z.attributes.expirationDate||"9999-12-31")-Date.parse(X.attributes.expirationDate||"9999-12-31"))[0]}function t8(Q,$){let X=Q.relationships?.[$]?.data;if(!X)return[];return(Array.isArray(X)?X:[X]).map((Z)=>Z.id)}async function L5(Q){let $=new E4(Q),X=Q.checkOnly!==!1,Z=[],W=await $.ensureBundleId(Q.identifier,Q.name,{checkOnly:X,platform:"MAC_OS"}),H=W.bundleId;if(!H)Z.push(`Register macOS Bundle ID ${Q.identifier}`);let U=[],J=[...new Set(Q.capabilities??[])].filter(Boolean).sort(),z=H?await $.listBundleIdCapabilities(H.id):[];for(let _ of J){if(z.find((E)=>E.attributes.capabilityType===_)){U.push({type:_,enabled:!0,created:!1});continue}if(Z.push(`Enable ${_} for ${Q.identifier}`),!X&&H)await $.enableBundleIdCapability(H.id,_),U.push({type:_,enabled:!0,created:!0});else U.push({type:_,enabled:!1,created:!1})}let G=[],K=[["MAC_APP_DISTRIBUTION",Q.appCertificateCsr],["MAC_INSTALLER_DISTRIBUTION",Q.installerCertificateCsr]];for(let[_,T]of K){let E=r8(await $.listCertificates(_));if(E){G.push({type:_,id:E.id,exists:!0,created:!1,expirationDate:E.attributes.expirationDate,certificateContent:E.attributes.certificateContent});continue}if(Z.push(`Create ${_} certificate`),!X){if(!T)throw Error(`[pantry] ${_} certificate is missing; provide its CSR to apply the provisioning plan`);let C=await $.createCertificate(_,T);G.push({type:_,id:C.id,exists:!0,created:!0,expirationDate:C.attributes.expirationDate,certificateContent:C.attributes.certificateContent})}else G.push({type:_,exists:!1,created:!1})}let B=G.find((_)=>_.type==="MAC_APP_DISTRIBUTION"),Y=Q.profileName||`${Q.name} Mac App Store`,q=H?await $.listProfiles(H.id):[],O=q.find((_)=>_.attributes.profileState==="ACTIVE"&&(!_.attributes.expirationDate||Date.parse(_.attributes.expirationDate)>Date.now())&&(!B?.id||t8(_,"certificates").includes(B.id))),j;if(O)j={id:O.id,name:O.attributes.name,exists:!0,created:!1,expirationDate:O.attributes.expirationDate,profileContent:O.attributes.profileContent};else if(Z.push(`Create MAC_APP_STORE profile ${Y}`),!X){if(!H)throw Error("[pantry] Bundle ID was not created");if(!B?.id)throw Error("[pantry] MAC_APP_DISTRIBUTION certificate is required to create the profile");let _=await $.createMacAppStoreProfile(q.some((T)=>T.attributes.name===Y)?`${Y} ${B.id.slice(0,8)}`:Y,H.id,B.id);j={id:_.id,name:_.attributes.name,exists:!0,created:!0,expirationDate:_.attributes.expirationDate,profileContent:_.attributes.profileContent}}else j={name:Y,exists:!1,created:!1};let L=await $.findApp(Q.identifier);if(!L)Z.push(`Create the ${Q.identifier} app record in App Store Connect (manual Apple step)`);return{mode:X?"plan":"apply",bundleId:{identifier:Q.identifier,id:H?.id,exists:Boolean(H),created:W.created},capabilities:U,certificates:G,profile:j,appRecord:{exists:Boolean(L),id:L?.id,...!L?{manualAction:"Create the app record in App Store Connect; Apple does not expose an app-creation API."}:{}},actions:Z}}import{spawnSync as a8}from"node:child_process";import{chmodSync as E0,existsSync as mQ,mkdirSync as e8,rmSync as Q$}from"node:fs";import{join as R4,resolve as fQ}from"node:path";function gQ(Q,$){let X=a8("openssl",Q,{env:$,encoding:"utf8",stdio:["ignore","pipe","pipe"]});if(X.error)throw Error(`[pantry] openssl could not be started: ${X.error.message}`);if(X.status!==0)throw Error(`[pantry] openssl ${Q[0]} failed: ${X.stderr.trim()||`exit code ${X.status}`}`)}function F5(Q){let $=fQ(Q.outputDirectory);return e8($,{recursive:!0}),[{type:"MAC_APP_DISTRIBUTION",fileName:"mac-app-distribution",label:"Mac App Distribution"},{type:"MAC_INSTALLER_DISTRIBUTION",fileName:"mac-installer-distribution",label:"Mac Installer Distribution"}].map((Z)=>{let W=R4($,`${Z.fileName}.key`),H=R4($,`${Z.fileName}.csr`);if(mQ(W)||mQ(H))throw Error(`[pantry] refusing to replace existing Apple certificate material: ${W}`);return gQ(["req","-new","-newkey","rsa:2048","-nodes","-sha256","-subj",`/CN=${`${Q.commonName} ${Z.label}`.replaceAll("/","-")}`,"-keyout",W,"-out",H]),E0(W,384),E0(H,384),{type:Z.type,keyPath:W,csrPath:H}})}function T5(Q){let $=fQ(Q.certificatePath),X=fQ(Q.privateKeyPath),Z=fQ(Q.outputPath);if(!mQ($))throw Error(`[pantry] Apple certificate does not exist: ${$}`);if(!mQ(X))throw Error(`[pantry] certificate private key does not exist: ${X}`);let W=`${$}.pantry.pem`;try{try{gQ(["x509","-inform","DER","-in",$,"-out",W])}catch{gQ(["x509","-inform","PEM","-in",$,"-out",W])}return gQ(["pkcs12","-export","-inkey",X,"-in",W,"-name",Q.name,"-out",Z,"-passout","env:PANTRY_APPLE_P12_PASSWORD"],{...process.env,PANTRY_APPLE_P12_PASSWORD:Q.password}),E0(Z,384),Z}finally{Q$(W,{force:!0})}}export{M0 as a,V4 as b,W$ as c,J$ as d,H$ as e,V0 as f,U$ as g,z$ as h,G$ as i,Y$ as j,K$ as k,B$ as l,I0 as m,O$ as n,_$ as o,L$ as p,q$ as q,j$ as r,E$ as s,R$ as t,M$ as u,V$ as v,I$ as w,S$ as x,A$ as y,x$ as z,N$ as A,b$ as B,y$ as C,D$ as D,TQ as E,S4 as F,u$ as G,D0 as H,WQ as I,EQ as J,pQ as K,P0 as L,k$ as M,h4 as N,IQ as O,SQ as P,k0 as Q,u4 as R,aQ as S,f0 as T,f4 as U,g0 as V,g4 as W,oQ as X,d4 as Y,o4 as Z,d0 as _,u0 as $,t4 as aa,p$ as ba,n$ as ca,bQ as da,Q0 as ea,n0 as fa,a4 as ga,e4 as ha,a0 as ia,W8 as ja,J8 as ka,X0 as la,Z0 as ma,W0 as na,J0 as oa,q8 as pa,zX as qa,GX as ra,YX as sa,KX as ta,OX as ua,_X as va,LX as wa,qX as xa,z0 as ya,G0 as za,a as Aa,Y0 as Ba,J4 as Ca,H4 as Da,B0 as Ea,p as Fa,e as Ga,o as Ha,O0 as Ia,_0 as Ja,L0 as Ka,q0 as La,j0 as Ma,QQ as Na,B4 as Oa,w0 as Pa,y8 as Qa,D8 as Ra,C0 as Sa,u8 as Ta,j4 as Ua,d8 as Va,s8 as Wa,E4 as Xa,O5 as Ya,_5 as Za,L5 as _a,F5 as $a,T5 as ab};
|
package/dist/chunk-4svjvh9y.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{$b as g,Vb as a,Wb as b,Xb as c,Yb as d,Zb as e,_b as f,ac as h,bc as i,cc as j,dc as k,ec as l,fc as m,gc as n}from"./chunk-eyk9nwn4.js";import"./chunk-eketndff.js";import"./chunk-7dxexqk4.js";export{b as shouldProceedWithGitHubRequest,a as saveRateLimitInfo,d as saveGitHubPackageCache,k as resolvePackageDomain,f as logPkgxProjects,m as isKnownAlias,j as guessOriginalDomain,l as getPackageAliases,c as getGitHubPackageCache,n as getCanonicalDomain,g as formatObjectWithoutQuotedKeys,e as fetchPackageListFromGitHub,h as convertDomainToVarName,i as convertDomainToFileName};
|