@stacksjs/cli 0.74.36 → 0.74.37
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/index.d.ts +2 -0
- package/dist/index.js +7 -5
- package/dist/terminal.d.ts +83 -0
- package/package.json +9 -9
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
import
|
|
2
|
+
import Me from"process";async function Ie(e,t={silent:!0}){let n=t.packageManager??"bun",r=[n==="npm"?"install":"add"];if(t.dev)r.push("-D");if(t.preferOffline&&n!=="bun")r.push("--prefer-offline");if(t.additionalArgs)r.push(...t.additionalArgs);r.push(e);let i=await Bun.spawn([n,...r],{cwd:t.cwd??Me.cwd(),stdout:t.silent?"ignore":"inherit",stderr:t.silent?"ignore":"inherit",stdin:"ignore",env:Me.env}).exited;if(i!==0)throw Error(`Failed to install ${e} (exit code ${i})`)}async function Dt(e,t){return Ie(e,t??{silent:!0})}async function zt(e,t){return Ie(`@stacksjs/${e}`,t??{silent:!0})}import{CLI as Kt,cli as et,onUnknownSubcommand as Ht}from"@stacksjs/clapp";function Ut(e,t){if(typeof e==="object")t=e,e=t.name;return et(e||"buddy")}import{existsSync as U,readdirSync as tt}from"fs";import{join as Te}from"path";var nt=/(?:\.test|\.spec|\.bench|\.d)\.ts$/;function rt(e){return e.endsWith(".ts")&&!nt.test(e)&&!e.startsWith("_")}function ot(e){if(!U(e))return[];let t=[],n=(r,o)=>{for(let i of tt(r,{withFileTypes:!0})){if(i.name.startsWith(".")||i.name==="node_modules")continue;if(i.isDirectory()){n(Te(r,i.name),`${o}${i.name}/`);continue}if(rt(i.name))t.push(`${o}${i.name.slice(0,-3)}`)}};return n(e,""),t.sort()}async function je(e){if(!e||!U(e))return{};try{let n=(await import(e)).default;if(!n||typeof n!=="object")return{error:Error(`${e} must default-export a command registry object.`)};return{registry:n}}catch(t){return{error:t}}}async function it(e){let{commandsDir:t}=e,n=e.registry??(await je(e.registryPath)).registry,r=ot(t),o=new Map;for(let l of r)o.set(l,{file:l,path:Te(t,`${l}.ts`),aliases:[],enabled:!0,source:"auto"});let i=[];for(let[l,a]of Object.entries(n??{})){let s=typeof a==="string"?{file:a}:a,d=o.get(s.file);if(!d)continue;if(d.signature=l,d.aliases=s.aliases??[],d.enabled=s.enabled!==!1,d.source="registry",!i.includes(d))i.push(d)}for(let l of r){let a=o.get(l);if(a&&!i.includes(a))i.push(a)}return i}function st(e,t,n){let r=t.trim().split(/\s+/)[0],i=e?.commands?.find((l)=>l.name===r);if(!i||typeof i.alias!=="function")return!1;for(let l of n)i.alias(l);return!0}async function Xt(e,t){let n=t.onError??(()=>{}),r=t.onDebug??(()=>{});if(!U(t.commandsDir))return r(`No ${t.commandsDir} directory, skipping application commands.`),[];let o=t.registry?{registry:t.registry}:await je(t.registryPath);if(o.error)n(`Could not read the command registry at ${t.registryPath}`,o.error);let i=await it({...t,registry:o.registry}),l=[];for(let a of i){if(!a.enabled){r(`Skipping disabled command ${a.file}.`);continue}try{let s=await import(a.path);if(s.enabled===!1){r(`Skipping ${a.file}: the module exports \`enabled = false\`.`);continue}if(typeof s.default!=="function"){n(`Expected a default export function in ${a.file}.ts, but got: ${typeof s.default}`);continue}let d=e.commands?.length??0;s.default(e);let m=[...a.aliases,...s.aliases??[]];if(m.length)at(e,a.signature,d,m,r);l.push(a)}catch(s){n(`Failed to load command ${a.file}`,s)}}return l}function at(e,t,n,r,o){if(t&&st(e,t,r))return;let a=(e.commands?.slice(n)??[])[0];if(!a||typeof a.alias!=="function"){o(`Could not alias '${t??"command"}': no matching command was registered.`);return}for(let s of r)a.alias(s)}function Zt(e){if(typeof e==="function")return e;return(t)=>lt(t,e)}function lt(e,t){let n=e.command(t.name,t.description??"",{allowUnknownOptions:t.allowUnknownOptions});if(t.usage)n.usage(t.usage);for(let[r,o]of Object.entries(t.options??{})){let i=typeof o==="string"?{description:o}:o;n.option(r,i.description??"",{...i.default===void 0?{}:{default:i.default},...i.type?{type:i.type}:{}})}for(let r of t.aliases??[])n.alias(r);for(let r of t.examples??[])n.example(r);return n.action((...r)=>{let o=r[r.length-1];return t.handle(o,...r.slice(0,-1))}),n}function en(e){return e}import A from"process";import{err as G,handleError as V,ok as ct}from"@stacksjs/error-handling";import{ExitCode as P}from"@stacksjs/types";async function J(e,t){let n=Array.isArray(e)?e:e.match(/(?:[^\s"]|"[^"]*")+/g);if(!n)return G(V(`Failed to parse command: ${n}`,t));let r=t?.cwd??A.cwd(),o=t?.timeoutMs,i=Bun.spawn(n,{stdin:t?.stdin??"inherit",stdout:t?.silent||t?.quiet?"ignore":t?.stdin?t.stdin:t?.stdout||"inherit",stderr:t?.silent||t?.quiet?"ignore":t?.stderr||"inherit",cwd:r,env:{...A.env,...t?.env},onExit(d,m,y,v){Ge("spawn",d,m,y,v)}});if(t?.stdin==="pipe"&&t.input){if(i.stdin)i.stdin.write(t.input),i.stdin.end()}let l,a=await Promise.race([i.exited,new Promise((d)=>{if(!o)return;l=setTimeout(()=>{try{i.kill()}catch{}d(P.FatalError)},o)})]);if(l)clearTimeout(l);if(o&&a===P.FatalError&&i.exitCode===null)return G(V(`Command timed out after ${o}ms: ${f(n.join(" "))} in ${f(r)}`,t));if(a===P.Success)return ct(i);let s=i.signalCode;if(s==="SIGTERM"||s==="SIGINT"||s==="SIGKILL"||i.exitCode===null&&a!==P.Success)return G(Error(`Command terminated by ${s??"signal"}: ${n.join(" ")}`));return G(V(`Failed to execute command: ${f(n.join(" "))} in ${f(r)}`,t))}async function Ee(e,t){let n=Array.isArray(e)?e:e.match(/(?:[^\s"]|"[^"]*")+/g);if(!n)throw p.error(`Failed to parse command: ${n}`,t),Error(`Failed to parse command: ${n}`);let r=Bun.spawnSync(n,{...t,stdin:t?.stdin??"inherit",stdout:t?.stdout??"pipe",stderr:t?.stderr??"inherit",cwd:t?.cwd??A.cwd(),env:{...A.env,...t?.env},onExit(i,l,a,s){Ge("spawnSync",i,l,a,s)}}),o=r.stdout?.toString()??"";if(t?.throwOnError&&r.exitCode!==0){let l=((r.stderr?.toString()??"").trim()||o.trim()||"(no output)").split(`
|
|
3
3
|
`).slice(0,5).join(`
|
|
4
4
|
`);throw Error(`Command failed with exit code ${r.exitCode}: ${n.join(" ")}
|
|
5
|
-
${
|
|
6
|
-
`)}function
|
|
7
|
-
`)}var
|
|
8
|
-
`),
|
|
5
|
+
${l}`)}return o}function Ge(e,t,n,r,o){if(p.debug(`exitHandler: ${e}, exitCode: ${n}, signalCode: ${r}`),o)p.debug("Process error:",o.message)}import{handleError as Ct}from"@stacksjs/error-handling";import{log as p}from"@stacksjs/logging";import{ExitCode as Se}from"@stacksjs/types";import{collect as gt}from"@stacksjs/collections";var g=!process.env.NO_COLOR&&(process.env.FORCE_COLOR?process.env.FORCE_COLOR!=="0":!!process.stdout?.isTTY),u={reset:g?"\x1B[0m":"",black:g?"\x1B[30m":"",red:g?"\x1B[31m":"",green:g?"\x1B[32m":"",yellow:g?"\x1B[33m":"",blue:g?"\x1B[34m":"",magenta:g?"\x1B[35m":"",cyan:g?"\x1B[36m":"",white:g?"\x1B[37m":"",gray:g?"\x1B[90m":"",lightRed:g?"\x1B[91m":"",lightGreen:g?"\x1B[92m":"",lightYellow:g?"\x1B[93m":"",lightBlue:g?"\x1B[94m":"",lightMagenta:g?"\x1B[95m":"",lightCyan:g?"\x1B[96m":"",lightGray:g?"\x1B[37m":"",bgBlack:g?"\x1B[40m":"",bgRed:g?"\x1B[41m":"",bgGreen:g?"\x1B[42m":"",bgYellow:g?"\x1B[43m":"",bgBlue:g?"\x1B[44m":"",bgMagenta:g?"\x1B[45m":"",bgCyan:g?"\x1B[46m":"",bgWhite:g?"\x1B[47m":"",bgGray:g?"\x1B[100m":"",bgLightRed:g?"\x1B[101m":"",bgLightGreen:g?"\x1B[102m":"",bgLightYellow:g?"\x1B[103m":"",bgLightBlue:g?"\x1B[104m":"",bgLightMagenta:g?"\x1B[105m":"",bgLightCyan:g?"\x1B[106m":"",bgLightGray:g?"\x1B[47m":"",bold:g?"\x1B[1m":"",dim:g?"\x1B[2m":"",italic:g?"\x1B[3m":"",underline:g?"\x1B[4m":"",inverse:g?"\x1B[7m":"",hidden:g?"\x1B[8m":"",strikethrough:g?"\x1B[9m":""},N="\x1B[",ut="\x1B]8;;",dt="\x1B]8;;\x07",Pe=(e)=>String(e);function C(e,t,n){return Math.min(Math.max(Math.floor(e),t),n)}function c(e,t=u.reset){return(n)=>{if(!g)return String(n);return`${e}${String(n)}${t}`}}function mt(e){return e.replace(/\x1B\]8;;[^\x07]*(?:\x07|\x1B\\)/g,"").replace(/\x1B\]8;;(?:\x07|\x1B\\)/g,"")}function F(e){return mt(e).replace(/\x1B\[[0-?]*[ -/]*[@-~]/g,"")}var Ae=F;function We(e){return Array.from(F(e)).length}var Q=c(u.black),X=c(u.red),B=c(u.green),Z=c(u.yellow),ee=c(u.blue),te=c(u.magenta),S=c(u.cyan),ne=c(u.white),x=c(u.gray),re=c(u.lightRed),oe=c(u.lightGreen),ie=c(u.lightYellow),se=c(u.lightBlue),ae=c(u.lightMagenta),le=c(u.lightCyan),W=c(u.lightGray),ce=c(u.bgBlack),ge=c(u.bgRed),ue=c(u.bgGreen),de=c(u.bgYellow),me=c(u.bgBlue),pe=c(u.bgMagenta),M=c(u.bgCyan),fe=c(u.bgWhite),he=c(u.bgGray),be=c(u.bgLightRed),ye=c(u.bgLightGreen),Ce=c(u.bgLightYellow),xe=c(u.bgLightBlue),we=c(u.bgLightMagenta),ke=c(u.bgLightCyan),Y=c(u.bgLightGray),b=c(u.bold),w=c(u.dim),f=c(u.italic),$e=c(u.underline),Fe=c(u.inverse),ve=c(u.hidden),Oe=c(u.strikethrough),Be=c(u.reset,"");function Ye(e){return c(`${N}38;5;${C(e,0,255)}m`)}function Ne(e){return c(`${N}48;5;${C(e,0,255)}m`)}function De(e,t,n){return c(`${N}38;2;${C(e,0,255)};${C(t,0,255)};${C(n,0,255)}m`)}function ze(e,t,n){return c(`${N}48;2;${C(e,0,255)};${C(t,0,255)};${C(n,0,255)}m`)}function _e(e,t){let n=(o,i)=>{let l=String(o);if(!g)return l;return`${ut}${i}\x07${l}${dt}`};if(typeof t==="string")return n(e,t);let r=String(e);return(o)=>n(o,r)}var pt={black:Q,red:X,green:B,yellow:Z,blue:ee,magenta:te,cyan:S,white:ne,gray:x,lightRed:re,lightGreen:oe,lightYellow:ie,lightBlue:se,lightMagenta:ae,lightCyan:le,lightGray:W,bgBlack:ce,bgRed:ge,bgGreen:ue,bgYellow:de,bgBlue:me,bgMagenta:pe,bgCyan:M,bgWhite:fe,bgGray:he,bgLightRed:be,bgLightGreen:ye,bgLightYellow:Ce,bgLightBlue:xe,bgLightMagenta:we,bgLightCyan:ke,bgLightGray:Y,bold:b,dim:w,italic:f,underline:$e,inverse:Fe,hidden:ve,strikethrough:Oe,reset:Be};function qe(e){return pt[e]??Pe}function cn(e,t){if(typeof t==="function")return t(e);return qe(t)(e)}function ft(){return g}var gn={black:Q,red:X,green:B,yellow:Z,blue:ee,magenta:te,cyan:S,white:ne,gray:x,lightRed:re,lightGreen:oe,lightYellow:ie,lightBlue:se,lightMagenta:ae,lightCyan:le,lightGray:W,bgBlack:ce,bgRed:ge,bgGreen:ue,bgYellow:de,bgBlue:me,bgMagenta:pe,bgCyan:M,bgWhite:fe,bgGray:he,bgLightRed:be,bgLightGreen:ye,bgLightYellow:Ce,bgLightBlue:xe,bgLightMagenta:we,bgLightCyan:ke,bgLightGray:Y,bold:b,dim:w,italic:f,underline:$e,inverse:Fe,hidden:ve,strikethrough:Oe,reset:Be,ansi256:Ye,ansi256Bg:Ne,trueColor:De,trueColorBg:ze,link:_e,stripColors:Ae},un={black:Q,red:X,green:B,yellow:Z,blue:ee,magenta:te,cyan:S,white:ne,gray:x,lightRed:re,lightGreen:oe,lightYellow:ie,lightBlue:se,lightMagenta:ae,lightCyan:le,lightGray:W,bgBlack:ce,bgRed:ge,bgGreen:ue,bgYellow:de,bgBlue:me,bgMagenta:pe,bgCyan:M,bgWhite:fe,bgGray:he,bgLightRed:be,bgLightGreen:ye,bgLightYellow:Ce,bgLightBlue:xe,bgLightMagenta:we,bgLightCyan:ke,bgLightGray:Y,bold:b,dim:w,italic:f,underline:$e,inverse:Fe,hidden:ve,strikethrough:Oe,reset:Be,ansi256:Ye,ansi256Bg:Ne,trueColor:De,trueColorBg:ze,link:_e,stripColors:Ae,grey:x,lightGrey:W,bgLightGrey:Y,supportsColor:ft};function ht(e,t,n,r){let o=We(e);if(o>=t)return e;let i=r[0]||" ",l=t-o;if(n==="right")return`${i.repeat(l)}${e}`;if(n==="center"){let a=Math.floor(l/2),s=l-a;return`${i.repeat(a)}${e}${i.repeat(s)}`}return`${e}${i.repeat(l)}`}function D(e){return Math.max(0,...e.map(We))}function z(e,t,n="left"){let r=String(e).split(/\r?\n/),o=typeof t==="object"?t:void 0,i=typeof t==="number"?t:o?.width??D(r),l=o?.align??n,a=o?.padChar??" ";return r.map((s)=>ht(s,Math.max(0,i),l,a)).join(`
|
|
6
|
+
`)}function dn(e,t){return z(e,t,"left")}function mn(e,t){let n=String(e).split(/\r?\n/);return z(e,t??process.stdout?.columns??D(n),"right")}function pn(e,t){let n=String(e).split(/\r?\n/);return z(e,t??process.stdout?.columns??D(n),"center")}var bt={single:{topLeft:"\u250C",topRight:"\u2510",bottomLeft:"\u2514",bottomRight:"\u2518",horizontal:"\u2500",vertical:"\u2502"},double:{topLeft:"\u2554",topRight:"\u2557",bottomLeft:"\u255A",bottomRight:"\u255D",horizontal:"\u2550",vertical:"\u2551"},round:{topLeft:"\u256D",topRight:"\u256E",bottomLeft:"\u2570",bottomRight:"\u256F",horizontal:"\u2500",vertical:"\u2502"}};function Ke(e,t={}){let n=String(e).split(/\r?\n/),r=bt[t.borderStyle??"single"],o=Math.max(0,t.padding??1),i=Math.max(0,t.margin??0),l=t.align??"left",a=D(n),s=a+o*2,d=typeof t.borderColor==="function"?t.borderColor:t.borderColor?qe(t.borderColor):Pe,y=d((()=>{if(!t.title)return`${r.topLeft}${r.horizontal.repeat(s)}${r.topRight}`;let E=` ${F(String(t.title))} `.slice(0,s),H=r.horizontal.repeat(Math.max(0,s-E.length));return`${r.topLeft}${E}${H}${r.topRight}`})()),v=d(`${r.bottomLeft}${r.horizontal.repeat(s)}${r.bottomRight}`),j=n.map((O)=>{let E=z(O,{align:l,width:a}),H=`${" ".repeat(o)}${E}${" ".repeat(o)}`;return`${d(r.vertical)}${H}${d(r.vertical)}`}),K=" ".repeat(i);return[y,...j,v].map((O)=>`${K}${O}`).join(`
|
|
7
|
+
`)}var fn=gt(["The best way to get started is to quit talking and begin doing.","The pessimist sees difficulty in every opportunity. The optimist sees opportunity in every difficulty.","Don\u2019t let yesterday take up too much of today.","You learn more from failure than from success. Don\u2019t let it stop you. Failure builds character.","It\u2019s not whether you get knocked down, it\u2019s whether you get up.","If you are working on something that you really care about, you don\u2019t have to be pushed. The vision pulls you.","People who are crazy enough to think they can change the world, are the ones who do.","Failure will never overtake me if my determination to succeed is strong enough.","Entrepreneurs are great at dealing with uncertainty and also very good at minimizing risk. That\u2019s the classic entrepreneur.","We may encounter many defeats but we must not be defeated.","Knowing is not enough; we must apply. Wishing is not enough; we must do.","Imagine your life is perfect in every respect; what would it look like?","We generate fears while we sit. We overcome them by action.","Whether you think you can or think you can\u2019t, you\u2019re right.","Security is mostly a superstition. Life is either a daring adventure or nothing."]);var He="0.74.37";async function $n(e,t){return new Promise((n)=>{if(t?.quiet===!1)console.log(),console.log(S(b("Stacks CLI"))+w(` v${He}`)),console.log();if(p.info(`Running ${M(f(b(` ${e} `)))}`),t?.showPerformance===!1||t?.quiet)return n(0);return n(performance.now())})}function Fn(e,t,n){let r={type:"success",useSeconds:!0,...t};return r.message=t?.message||e,new Promise((o)=>{if(n)return Ct(n),o(Se.FatalError);if(r?.startTime){let i=performance.now()-r.startTime;if(r.useSeconds)i=i/1000,i=Math.round(i*100)/100;if(r.quiet===!0)return o(Se.Success);if(n)p.error(`[${i.toFixed(2)}${r.useSeconds?"s":"ms"}] Failed`);else if(r.type==="error")p.error(`[${i.toFixed(2)}${r.useSeconds?"s":"ms"}] ${r.message??"Failed"}`);else if(r.type==="warning")p.warn(`[${i.toFixed(2)}${r.useSeconds?"s":"ms"}] ${r.message??"Complete"}`);else if(r.type==="info")p.info(`${w(x(`[${i.toFixed(2)}${r.useSeconds?"s":"ms"}]`))} ${r.message??"Complete"}`);else p.success(`${w(x(b(`[${i.toFixed(2)}${r.useSeconds?"s":"ms"}]`)))} ${b(B(r.message??"Complete"))}`)}else if(r?.type==="info")p.info(e);else if(r?.type==="error")p.error(e);else if(r?.type==="warning")p.warn(e);else if(r?.type==="success"&&r?.quiet!==!0)p.success(e);p.flush().catch(()=>{}).then(()=>o(Se.Success))})}import _ from"process";function Ue(e){if(!e)return!1;return e.startsWith("--")}function xt(e){return e.startsWith("-")&&!Ue(e)}function Le(e){if(e==="true")return!0;if(e==="false")return!1;let t=Number.parseFloat(e);if(!Number.isNaN(t))return t;return e.replace(/"/g,"")}function wt(e,t,n,r){let[o,i]=e.slice(2).split("=");if(i!==void 0)r[o]=Le(i);else if(n+1<t.length&&!t[n+1]?.startsWith("-"))r[o]=t[n+1],n++;else r[o]=!0;return n}function kt(e,t,n,r){let[o,i]=e.slice(1).split("=");if(o===void 0)return n;if(i!==void 0&&o!==void 0)for(let l=0;l<o.length;l++)r[o[l]]=Le(i);else for(let l=0;l<o.length;l++)if(n+1<t.length&&l===o.length-1&&!t[n+1]?.startsWith("-"))r[o[l]]=Le(t[n+1]),n++;else r[o[l]]=!0;return n}function $t(e){if(e===void 0)e=_.argv.slice(2);let t=[],n={};for(let r=0;r<e.length;r++){let o=e[r];if(!o)continue;if(Ue(o))r=wt(o,e,r,n);else if(xt(o))r=kt(o,e,r,n);else t.push(o)}return{args:t,options:n}}function Sn(e){if(e===void 0)e=_.argv.slice(2);return $t(e).args}function Ln(e){e=e||{};let t={dryRun:!1,quiet:!1,verbose:!1},n=_.argv.slice(2);for(let r=0;r<n.length;r++){let o=n[r];if(o?.startsWith("--")){let l=o.substring(2).replace(/-([a-z])/gi,(a)=>a[1]?a[1].toUpperCase():"");if(r+1<n.length&&!n?.[r+1]?.startsWith("--"))if(n?.[r+1]==="true"||n?.[r+1]==="false")e[l]=n[r+1]==="true",r++;else e[l]=n[r+1],r++;else e[l]=!0}}if(Object.keys(e).length===0)return{};return{...t,...e}}function Ft(e){if(Array.isArray(e)){if(e=Array.from(new Set(e)),Array.isArray(e)&&e[0]&&!e[0].startsWith("-"))e.shift();return e.join(" ")}if(typeof e==="object"&&e!==null)return Object.entries(e).filter(([t,n])=>t!=="--"&&t!=="_"&&n!==!1&&n!==void 0&&n!==null).map(([t,n])=>{if(n===!0)return`--${t}`;return`--${t} ${n}`}).join(" ");return Ft(_.argv.slice(2))}import h from"process";import{createInterface as vt}from"readline";var Tn=h.stdin.destroy;h.stdin.destroy=function(e){if(e)this.emit("error",e);return this};h.on("SIGINT",()=>{console.log(`
|
|
8
|
+
`),h.exit(130)});var L=null;function Ot(){if(!L){let e=h.stdin.isTTY&&h.stdout.isTTY;if(L=vt({input:h.stdin,output:h.stdout,terminal:e}),e&&typeof h.stdin.setRawMode==="function")L.on("SIGINT",()=>{h.emit("SIGINT")});L.once("close",()=>{L=null})}return L}var q=Symbol("stdin-eof");function Ve(e){return new Promise((t)=>{let n=Ot(),r=!1,o=(l)=>{if(r)return;r=!0,n.off("close",i),t(l)},i=()=>o(q);n.once("close",i);try{n.question(e,o)}catch{o(q)}})}async function I(e){let t=await Ve(e);return t===q?"":t}function Je(e,t){let n=e.toLowerCase().trim();if(!n)return t;if(n==="y"||n==="yes")return!0;if(n==="n"||n==="no")return!1;return t}async function jn(e){let t=typeof e==="string"?{message:e}:e,n=t.initial??!1,r=n?" (Y/n) ":" (y/N) ",o=await Ve(`${t.message}${r}`);if(o===q)return null;return Je(o,n)}async function Bt(e){let t=typeof e==="string"?{message:e}:e,n=t.initial??!1,r=n?" (Y/n) ":" (y/N) ",o=await I(`${t.message}${r}`);return Je(o,n)}async function St(e){let t=typeof e==="string"?{message:e}:e,n=t.placeholder||t.initial||"",r=n?` (${n}) `:" ";return(await I(`${t.message}${r}`)).trim()||t.initial||""}async function Lt(e){console.log(e.message),e.choices.forEach((o,i)=>{let l=i===(e.initial??0)?">":" ";console.log(`${l} ${i+1}. ${o.label}`)});let t=await I("Select (number): "),n=Number.parseInt(t.trim(),10)-1,r=e.choices[n]??e.choices[e.initial??0];if(!r)throw Error("select prompt: no choices available");return r.value}async function Rt(e){console.log(e.message),console.log("(Enter numbers separated by commas)"),e.choices.forEach((o,i)=>{console.log(` ${i+1}. ${o.label}`)});let n=(await I("Select (e.g., 1,3,4): ")).split(",").map((o)=>Number.parseInt(o.trim(),10)-1),r=[];for(let o of n){let i=e.choices[o];if(i)r.push(i.value)}return r}async function Mt(e){return(await I(`${(typeof e==="string"?{message:e}:e).message} `)).trim()}var En={text:St,confirm:Bt,select:Lt,multiselect:Rt,password:Mt};import{handleError as It}from"@stacksjs/error-handling";async function Tt(e,t){let n={...t,stdin:t?.stdin??"inherit",verbose:t?.verbose??!1};return await J(e,n)}async function Wn(e,t){let n={...t,stdio:[t?.stdin??"inherit","pipe","pipe"],verbose:t?.verbose??!1};return await J(e,n)}async function Yn(e,t){let n={...t,stdio:[t?.stdin??"inherit","pipe","pipe"],verbose:t?.verbose??!1};return await Ee(e,n)}async function Nn(e,t){let n=[];for(let r of e){let o=await Tt(r,t);if(o.isErr)throw It("Error during runCommands",o.error),o.error;n.push(o)}return n}import jt from"process";var Et=["SIGINT","SIGTERM","SIGHUP"],R=new Map,Qe=!1;function Gt(){if(Qe)return;Qe=!0;for(let e of Et)jt.on(e,async()=>{for(let[t,n]of R)try{await n()}catch(r){console.error(`[signals] cleanup '${t}' threw:`,r)}})}function _n(e,t){return Gt(),R.set(e,t),()=>{if(R.get(e)===t)R.delete(e)}}function qn(e){R.delete(e)}function Kn(){return[...R.keys()]}var Xe=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],T=process.stdout.isTTY&&!process.env.CI;function Pt(e){let t=e||"",n=0,r=null,o=!1,i=()=>{if(T)process.stdout.write("\r\x1B[K")},l=()=>{if(!T)return;i();let a=Xe[n];process.stdout.write(`${a} ${t}`),n=(n+1)%Xe.length};return{start(a){if(a)t=a;if(o)return;if(o=!0,T)l(),r=setInterval(l,80);else if(t)console.log(` ${t}`)},stop(a){if(o=!1,r)clearInterval(r),r=null;if(i(),a)console.log(a)},update(a){if(t=a,!T&&o)console.log(` ${a}`)},succeed(a){let s=a||t;if(o=!1,r)clearInterval(r),r=null;i(),console.log(`\u2713 ${s}`)},fail(a){let s=a||t;if(o=!1,r)clearInterval(r),r=null;i(),console.error(`\u2717 ${s}`)},get text(){return t},set text(a){if(t=a,T&&o)l()},get isSpinning(){return o}}}async function Un(e,t,n){let r=Pt(e);r.start();try{let o=await t();return r.succeed(n?.successMessage||e),o}catch(o){throw r.fail(n?.failMessage||`Failed: ${e}`),o}}import k from"process";var Ze="\r\x1B[2K";function At(){return{columns:k.stdout.columns??80,rows:k.stdout.rows??24}}function Wt(){return Boolean(k.stdout.isTTY)&&!k.env.CI}function Xn(e,t){console.log(Ke(e,t===void 0?{}:{title:t}))}function Re(e){try{return JSON.stringify(e,null,2)??String(e)}catch{return String(e)}}function Zn(e){console.log(typeof e==="string"?e:Re(e))}function Yt(e,t){console.error(t===void 0?Re(e):`${t}: ${Re(e)}`)}function er(e,t){Yt(e,t),k.exit(1)}function tr(e,t={}){let r=(t.columns??[...new Set(e.flatMap((s)=>Object.keys(s)))]).map((s)=>typeof s==="string"?{key:s}:s);if(r.length===0)return"";let o=(s,d)=>{let m=s[d.key];return m===void 0||m===null?"":String(m)},i=r.map((s)=>{let d=t.header===!1?"":s.header??s.key;return Math.max(F(d).length,...e.map((m)=>F(o(m,s)).length))}),l=(s,d,m)=>{let y=Math.max(0,d-F(s).length);return m==="right"?" ".repeat(y)+s:s+" ".repeat(y)},a=[];if(t.header!==!1)a.push(r.map((s,d)=>l(s.header??s.key,i[d],s.align)).join(" ").trimEnd()),a.push(r.map((s,d)=>"-".repeat(i[d])).join(" "));for(let s of e)a.push(r.map((d,m)=>l(o(s,d),i[m],d.align)).join(" ").trimEnd());return a.join(`
|
|
9
|
+
`)}function nr(e){if(!Number.isFinite(e.total)||e.total<=0)throw TypeError(`progress() needs a positive total; got ${e.total}`);let t=e.format??"|{bar}| {percentage}% | {value}/{total}",n=e.width??Math.max(10,Math.floor(At().columns/3)),r=Wt(),o=0,i=-1,l=(s)=>{let d=Math.min(1,o/e.total),m=Math.round(d*n),y={bar:"\u2588".repeat(m)+"\u2591".repeat(n-m),percentage:Math.round(d*100),value:o,total:e.total,...s},v=t.replace(/\{(\w+)\}/g,(K,O)=>String(y[O]??K));if(r){k.stdout.write(`${Ze}${v}`);return}let j=Math.floor(d*10);if(j>i)i=j,console.log(v)},a={update(s,d={}){o=Math.max(0,Math.min(e.total,s)),l(d)},increment(s=1){a.update(o+s)},stop(s){if(r)k.stdout.write(Ze);if(s)console.log(s);else if(r)k.stdout.write(`
|
|
10
|
+
`)},get value(){return o},get total(){return e.total}};return a}async function rr(e){let t=[];for(let n of e){let r=Date.now(),o=n.skip?.();if(o){console.log(`- ${n.title}${typeof o==="string"?` (${o})`:""}`),t.push({title:n.title,status:"skipped",durationMs:0});continue}try{await n.task(),console.log(`\u2713 ${n.title}`),t.push({title:n.title,status:"done",durationMs:Date.now()-r})}catch(i){throw console.log(`\u2717 ${n.title}`),t.push({title:n.title,status:"failed",error:i instanceof Error?i:Error(String(i)),durationMs:Date.now()-r}),i}}return t}export{Kt as CLI,z as align,Ye as ansi256,Ne as ansi256Bg,st as applyAliases,ce as bgBlack,me as bgBlue,M as bgCyan,he as bgGray,ue as bgGreen,xe as bgLightBlue,ke as bgLightCyan,Y as bgLightGray,ye as bgLightGreen,we as bgLightMagenta,be as bgLightRed,Ce as bgLightYellow,pe as bgMagenta,ge as bgRed,fe as bgWhite,de as bgYellow,Q as black,ee as blue,b as bold,Ke as box,Ft as buddyOptions,pn as centerAlign,Ut as cli,cn as colorize,gn as colors,Bt as confirm,jn as confirmOrNull,S as cyan,er as dd,Zt as defineCommand,en as defineCommands,w as dim,ot as discoverCommandFiles,Yt as dump,Zn as echo,J as exec,Ee as execSync,qe as getColor,At as getTerminalSize,x as gray,B as green,ve as hidden,Dt as installPackage,zt as installStack,$n as intro,Fe as inverse,Wt as isInteractive,f as italic,un as kolorist,dn as leftAlign,se as lightBlue,le as lightCyan,W as lightGray,oe as lightGreen,ae as lightMagenta,re as lightRed,ie as lightYellow,_e as link,Kn as listSignalHandlers,je as loadCommandRegistry,Xt as loadCommands,p as log,te as magenta,Rt as multiselect,Xn as note,qn as offSignal,_n as onSignal,Ht as onUnknownSubcommand,Fn as outro,Sn as parseArgs,$t as parseArgv,Ln as parseOptions,Mt as password,nr as progress,En as prompts,fn as quotes,X as red,Be as reset,it as resolveCommands,mn as rightAlign,Tt as runCommand,Yn as runCommandSync,Nn as runCommands,Wn as runProcess,Lt as select,Pt as spinner,Oe as strikethrough,F as stripAnsi,Ae as stripColors,tr as table,rr as tasks,St as text,De as trueColor,ze as trueColorBg,$e as underline,ne as white,Un as withSpinner,Z as yellow};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/** The terminal's size, with the fallback a pipe or a CI runner gets. */
|
|
2
|
+
export declare function getTerminalSize(): { columns: number, rows: number };
|
|
3
|
+
/**
|
|
4
|
+
* Whether it is worth prompting or animating.
|
|
5
|
+
*
|
|
6
|
+
* `CI` is checked as well as `isTTY`: some CI providers allocate a TTY, and a
|
|
7
|
+
* spinner still has nobody watching it.
|
|
8
|
+
*/
|
|
9
|
+
export declare function isInteractive(): boolean;
|
|
10
|
+
/** A short boxed aside. Sugar over `box`, which is what it should look like. */
|
|
11
|
+
export declare function note(message: string, title?: string): void;
|
|
12
|
+
/** JSON where it round-trips, `String()` otherwise (a Map, a circular ref). */
|
|
13
|
+
declare function format(value: unknown): string;
|
|
14
|
+
/** Print a value: strings as-is, everything else pretty-printed. */
|
|
15
|
+
export declare function echo(value: unknown): void;
|
|
16
|
+
/**
|
|
17
|
+
* Print a value with its label, for debugging.
|
|
18
|
+
*
|
|
19
|
+
* Goes to stderr, so a command whose stdout is being piped into something can
|
|
20
|
+
* still be debugged without corrupting what the pipe receives.
|
|
21
|
+
*/
|
|
22
|
+
export declare function dump(value: unknown, label?: string): void;
|
|
23
|
+
/** `dump`, then exit non-zero. "Dump and die". */
|
|
24
|
+
export declare function dd(value: unknown, label?: string): never;
|
|
25
|
+
/**
|
|
26
|
+
* Render rows as an aligned text table.
|
|
27
|
+
*
|
|
28
|
+
* Widths are measured with ANSI stripped, so a colored cell does not push its
|
|
29
|
+
* column out by the length of the escape sequence - which is the bug every
|
|
30
|
+
* hand-rolled table renderer has.
|
|
31
|
+
*/
|
|
32
|
+
export declare function table(rows: Array<Record<string, unknown>>, options?: TableOptions): string;
|
|
33
|
+
/**
|
|
34
|
+
* A single-line progress bar.
|
|
35
|
+
*
|
|
36
|
+
* Non-interactive output does not redraw: it prints a line each time the
|
|
37
|
+
* percentage crosses a whole 10%, so a CI log gets ten lines rather than one
|
|
38
|
+
* per update or a screenful of escape codes.
|
|
39
|
+
*/
|
|
40
|
+
export declare function progress(options: ProgressOptions): ProgressBar;
|
|
41
|
+
/**
|
|
42
|
+
* Run tasks in order, printing each one's outcome.
|
|
43
|
+
*
|
|
44
|
+
* Sequential on purpose: the titles are a narration, and a narration whose
|
|
45
|
+
* lines arrive out of order is worse than no narration. Something that wants
|
|
46
|
+
* concurrency wants `Promise.all` and its own reporting.
|
|
47
|
+
*
|
|
48
|
+
* Stops at the first failure and rethrows, because a task list is a procedure -
|
|
49
|
+
* "build" after a failed "install" would fail differently and confusingly.
|
|
50
|
+
*/
|
|
51
|
+
export declare function tasks(definitions: TaskDefinition[]): Promise<TaskOutcome[]>;
|
|
52
|
+
export declare interface TableColumn {
|
|
53
|
+
key: string
|
|
54
|
+
header?: string
|
|
55
|
+
align?: 'left' | 'right'
|
|
56
|
+
}
|
|
57
|
+
export declare interface TableOptions {
|
|
58
|
+
columns?: Array<TableColumn | string>
|
|
59
|
+
header?: boolean
|
|
60
|
+
}
|
|
61
|
+
export declare interface ProgressBar {
|
|
62
|
+
update: (value: number, tokens?: Record<string, string | number>) => void
|
|
63
|
+
increment: (by?: number) => void
|
|
64
|
+
stop: (message?: string) => void
|
|
65
|
+
readonly value: number
|
|
66
|
+
readonly total: number
|
|
67
|
+
}
|
|
68
|
+
export declare interface ProgressOptions {
|
|
69
|
+
total: number
|
|
70
|
+
format?: string
|
|
71
|
+
width?: number
|
|
72
|
+
}
|
|
73
|
+
export declare interface TaskDefinition {
|
|
74
|
+
title: string
|
|
75
|
+
task: () => unknown | Promise<unknown>
|
|
76
|
+
skip?: () => boolean | string
|
|
77
|
+
}
|
|
78
|
+
export declare interface TaskOutcome {
|
|
79
|
+
title: string
|
|
80
|
+
status: 'done' | 'skipped' | 'failed'
|
|
81
|
+
error?: Error
|
|
82
|
+
durationMs: number
|
|
83
|
+
}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "@stacksjs/cli",
|
|
3
3
|
"type": "module",
|
|
4
4
|
"sideEffects": false,
|
|
5
|
-
"version": "0.74.
|
|
5
|
+
"version": "0.74.37",
|
|
6
6
|
"description": "TypeScript framework for CLI artisans. Build beautiful console apps with ease.",
|
|
7
7
|
"author": "Chris Breuer",
|
|
8
8
|
"contributors": [
|
|
@@ -70,16 +70,16 @@
|
|
|
70
70
|
},
|
|
71
71
|
"dependencies": {
|
|
72
72
|
"@stacksjs/clapp": "^0.2.12",
|
|
73
|
-
"@stacksjs/collections": "0.74.
|
|
74
|
-
"@stacksjs/error-handling": "0.74.
|
|
75
|
-
"@stacksjs/logging": "0.74.
|
|
76
|
-
"@stacksjs/types": "0.74.
|
|
73
|
+
"@stacksjs/collections": "0.74.37",
|
|
74
|
+
"@stacksjs/error-handling": "0.74.37",
|
|
75
|
+
"@stacksjs/logging": "0.74.37",
|
|
76
|
+
"@stacksjs/types": "0.74.37"
|
|
77
77
|
},
|
|
78
78
|
"devDependencies": {
|
|
79
|
-
"@stacksjs/config": "0.74.
|
|
80
|
-
"@stacksjs/path": "0.74.
|
|
81
|
-
"@stacksjs/utils": "0.74.
|
|
82
|
-
"@stacksjs/validation": "0.74.
|
|
79
|
+
"@stacksjs/config": "0.74.37",
|
|
80
|
+
"@stacksjs/path": "0.74.37",
|
|
81
|
+
"@stacksjs/utils": "0.74.37",
|
|
82
|
+
"@stacksjs/validation": "0.74.37",
|
|
83
83
|
"better-dx": "^0.2.24"
|
|
84
84
|
}
|
|
85
85
|
}
|