progy 0.6.2 → 0.6.4
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/backend/server.js +16 -14
- package/dist/cli.js +16 -16
- package/package.json +1 -1
package/dist/backend/server.js
CHANGED
|
@@ -1,28 +1,30 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var
|
|
2
|
+
var Qp=Object.create;var{getPrototypeOf:Zp,defineProperty:a,getOwnPropertyNames:Bp}=Object;var Jp=Object.prototype.hasOwnProperty;var lp=(p,o,u)=>{u=p!=null?Qp(Zp(p)):{};let v=o||!p||!p.__esModule?a(u,"default",{value:p,enumerable:!0}):u;for(let S of Bp(p))if(!Jp.call(v,S))a(v,S,{get:()=>p[S],enumerable:!0});return v};var mp=(p,o)=>()=>(o||p((o={exports:{}}).exports,o),o.exports);var Pp=import.meta.require;var{serve:cp}=globalThis.Bun;import{join as F}from"path";var i={"/api/health":Response.json({status:"ok"})};import{readdir as O,readFile as b,writeFile as c,mkdir as h,exists as T}from"fs/promises";import{join as Q}from"path";import{homedir as jp}from"os";import{spawn as np}from"child_process";var M=process.env.PROG_CWD||process.cwd(),e=Q(jp(),".progy"),x=Q(e,"config.json"),r=Q(M,"course.json"),f=Q(M,".progy"),Up=Q(f,"exercises.json"),A=Q(f,"progress.json"),pp=process.env.PROGY_OFFLINE==="true",C={stats:{totalXp:0,currentStreak:0,longestStreak:0,lastActiveDate:null},exercises:{},quizzes:{},achievements:[]},z=null,s=null,t=0;async function Hp(){try{if(await T(r)){let p=await b(r,"utf-8");return JSON.parse(p)}return null}catch(p){return console.warn(`[WARN] Failed to read course.json: ${p}`),null}}async function D(){if(!z)z=await Hp();return z}async function I(){if(await T(x))return JSON.parse(await b(x,"utf-8"));return{}}async function G(p){let u={...await I(),...p};return await h(e,{recursive:!0}),await c(x,JSON.stringify(u,null,2)),u}async function N(){if(pp){try{if(await T(A)){let o=await b(A,"utf-8"),u=JSON.parse(o);return console.log(`[OFFLINE] Loaded local progress. XP: ${u?.stats.totalXp}`),u}}catch(o){console.warn(`[WARN] Failed to read ${A}: ${o}`)}return JSON.parse(JSON.stringify(C))}await D();let p=await I();if(p?.token&&z?.id){console.log(`[ONLINE] Fetching progress for ${z.id}...`);try{let o=await Wp(z.id,p.token);if(o)return console.log(`[ONLINE] Loaded cloud progress. XP: ${o.stats.totalXp}`),o;else return console.log("[ONLINE] No existing cloud progress found. Returning default."),JSON.parse(JSON.stringify(C))}catch(o){throw console.error(`[CRITICAL] Failed to fetch cloud progress: ${o}`),o}}return JSON.parse(JSON.stringify(C))}async function g(p){if(pp){try{await h(f,{recursive:!0}),await c(A,JSON.stringify(p,null,2))}catch(u){console.error(`[ERROR] Failed to save local progress: ${u}`)}return}await D();let o=await I();if(o?.token&&z?.id)await Dp(z.id,p,o.token)}async function Dp(p,o,u){let v=process.env.PROGY_API_URL||"https://progy.francy.workers.dev";try{let S=await fetch(`${v}/api/progress/sync`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${u}`},body:JSON.stringify({courseId:p,data:o})});if(S.ok)console.log("[ONLINE] Successfully saved to cloud.");else console.warn(`[ONLINE] Cloud save failed: ${S.status}`)}catch(S){console.error(`[ONLINE] Connection error during save: ${S}`)}}async function Wp(p,o){let u=process.env.PROGY_API_URL||"https://progy.francy.workers.dev";try{let v=await fetch(`${u}/api/progress/get?courseId=${p}`,{headers:{Authorization:`Bearer ${o}`}});if(v.ok)return await v.json();if(v.status===404)return null;throw Error(`Cloud fetch failed with ${v.status}`)}catch(v){throw v}}function _(p){let o=new Date().toISOString().split("T")[0];if(p.lastActiveDate===o)return p;let u=new Date;u.setDate(u.getDate()-1);let v=u.toISOString().split("T")[0];if(p.lastActiveDate===v)p.currentStreak+=1;else p.currentStreak=1;if(p.currentStreak>p.longestStreak)p.longestStreak=p.currentStreak;return p.lastActiveDate=o,p}var d=(p)=>p.replace(/_/g," ").replace(/([a-zA-Z])(\d+)/g,"$1 $2").replace(/\b\w/g,(o)=>o.toUpperCase());async function op(p){if(s&&Date.now()-t<5000)return s;let o=p.content.exercises,u=Q(M,o);if(!await T(u))return{};let S=(await O(u)).filter(($)=>!$.startsWith(".")&&$!=="README.md"&&$!=="mod.rs"&&$!=="practice");S.sort(($,R)=>{let j=parseInt($.split("_")[0]||"999"),J=parseInt(R.split("_")[0]||"999");return j-J});let w={};async function B($,R,j,J,U,Y,H){let W=d(j);if(U[j]?.title)W=U[j].title;let n=Q(Y,R.name);if(R.isDirectory()){let E=["exercise.rs","main.rs","index.ts","main.go","index.js"];for(let L of E){let V=Q(n,L);if(await T(V)){n=V;break}}}if(await T(n)&&(await Bun.file(n).stat()).isFile())try{let L=(await b(n,"utf-8")).match(/\/\/\s*(?:Title|title):\s*(.+)/);if(L&&L[1])W=L[1].trim()}catch{}let Z={id:`${$}/${R.name}`,module:$,moduleTitle:J,name:R.name,exerciseName:j,friendlyName:W,path:Q(Y,R.name)};if(R.isDirectory()){let E=Q(Y,R.name,"quiz.json");H[$].push({...Z,markdownPath:Q(Y,R.name,"README.md"),hasQuiz:await T(E),type:"directory"})}else if(R.isFile()){if(R.name.endsWith(".test.ts")||R.name==="package.json")return;H[$].push({...Z,markdownPath:null,type:"file"})}}for(let $ of S){let R=Q(u,$);if((await Bun.file(R).stat()).isDirectory()){w[$]=[];let J=await O(R,{withFileTypes:!0}),U=d($),Y={},H=Q(R,"info.toml");if(await T(H))try{let V=await b(H,"utf-8"),k=Bun.TOML.parse(V);if(k.module?.message)U=k.module.message;if(Array.isArray(k.exercises)){for(let q of k.exercises)if(q.name)Y[q.name]=q}else if(k.exercises&&typeof k.exercises==="object")for(let[q,K]of Object.entries(k.exercises))Y[q]=typeof K==="string"?{title:K}:K}catch(V){console.warn(`[WARN] Failed to parse info.toml: ${V}`)}let W=(V)=>{let k=V.match(/^(\d+)_/);return k?parseInt(k[1]||"0"):9999},n=new Map;for(let V of J){if(V.name.startsWith(".")||V.name==="README.md"||V.name==="mod.rs"||V.name==="info.toml")continue;n.set(V.name.split(".")[0]||"",V)}let Z=Object.keys(Y),E=new Set;for(let V of Z){let k=n.get(V);if(k)E.add(V),await B($,k,V,U,Y,R,w)}let L=J.filter((V)=>{let k=V.name.split(".")[0]||"";return!E.has(k)&&!V.name.startsWith(".")&&V.name!=="README.md"&&V.name!=="mod.rs"&&V.name!=="info.toml"});L.sort((V,k)=>{let q=W(V.name||""),K=W(k.name||"");return q!==K?q-K:(V.name||"").localeCompare(k.name||"")});for(let V of L)await B($,V,V.name.split(".")[0]||"",U,Y,R,w)}}let X=Q(u,"practice");if(await T(X)){w.practice=[];let $=await O(X);for(let R of $)if(R.endsWith(".rs")||R.endsWith(".ts")||R.endsWith(".js")||R.endsWith(".go"))w.practice.push({id:`practice/${R}`,module:"practice",name:R,exerciseName:R.split(".")[0],path:Q(X,R),markdownPath:null,type:"file"})}return await h(f,{recursive:!0}),await c(Up,JSON.stringify(w,null,2)),s=w,t=Date.now(),w}async function up(p){let o=[];for(let u of p.checks)if(u.type==="command")try{let v=u.command.split(" "),S=v[0];if(!S)continue;let w=np(S,v.slice(1),{stdio:"ignore"}),B=await new Promise((X)=>{w.on("close",($)=>X($===0)),w.on("error",()=>X(!1))});o.push({name:u.name,status:B?"pass":"fail",message:B?"Found":"Not found"})}catch(v){o.push({name:u.name,status:"fail",message:String(v)})}return o}function Rp(p,o){try{let v=null,S=p.match(/__SRP_BEGIN__\s*([\s\S]*?)\s*__SRP_END__/);if(S&&S[1])v=S[1].trim();else{let w=p.match(/\{[\s\S]*\}/g);if(w&&w.length>0)v=w[w.length-1]?.trim()??null}if(v){let w=v.indexOf("{"),B=v.lastIndexOf("}");if(w!==-1&&B!==-1){let X=JSON.parse(v.substring(w,B+1)),$=`## ${X.success?"\u2705 Success":"\u274C Failed"}
|
|
3
3
|
|
|
4
|
-
> ${
|
|
4
|
+
> ${X.summary}
|
|
5
5
|
|
|
6
|
-
`;if(
|
|
6
|
+
`;if(X.diagnostics?.length){$+=`### \uD83D\uDCCD Diagnostics
|
|
7
7
|
|
|
8
|
-
`;for(let
|
|
9
|
-
**${
|
|
10
|
-
`,
|
|
8
|
+
`;for(let R of X.diagnostics){if($+=`#### ${R.severity==="error"?"\u274C":"\u26A0\uFE0F"} ${R.severity.toUpperCase()}
|
|
9
|
+
**${R.message}**
|
|
10
|
+
`,R.file)$+=`\`${R.file}:${R.line||0}\`
|
|
11
11
|
|
|
12
|
-
`;if(
|
|
13
|
-
${
|
|
12
|
+
`;if(R.snippet)$+=`\`\`\`rust
|
|
13
|
+
${R.snippet}
|
|
14
14
|
\`\`\`
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
`;$+=`---
|
|
17
17
|
|
|
18
|
-
`}}if(
|
|
18
|
+
`}}if(X.tests?.length){$+=`### \uD83E\uDDEA Tests
|
|
19
19
|
|
|
20
|
-
`;for(let
|
|
21
|
-
${
|
|
20
|
+
`;for(let R of X.tests)$+=`- ${R.status==="pass"?"\u2705":"\u274C"} **${R.name}**
|
|
21
|
+
${R.message?` > ${R.message.replace(/\n/g,`
|
|
22
22
|
> `)}
|
|
23
23
|
|
|
24
|
-
`:""}`}return{success:
|
|
24
|
+
`:""}`}return{success:X.success,output:X.raw.trim(),friendlyOutput:$}}}}catch{}let u=o===0&&!p.includes("\u274C");return{success:u,output:p,friendlyOutput:(u?`\u2705 Success
|
|
25
25
|
|
|
26
26
|
`:`\u274C Failed
|
|
27
27
|
|
|
28
|
-
`)+
|
|
28
|
+
`)+p}}var Tp=async()=>{try{return Response.json(await N())}catch(p){return Response.json({error:String(p)},{status:500})}},Lp=async(p)=>{try{let{type:o,id:u,success:v}=await p.json();if(!u)return Response.json({success:!1,error:"Missing ID"});let S=await N(),w=new Date().toISOString();if(o==="quiz"&&v){if(!S.quizzes[u])S.quizzes[u]={passed:!0,xpEarned:10,completedAt:w},S.stats.totalXp+=10,S.stats=_(S.stats),await g(S)}return Response.json({success:!0,progress:S})}catch(o){return Response.json({success:!1,error:String(o)})}},vp={"/api/progress":{GET:Tp},"/api/progress/update":{POST:Lp}};var qp=async()=>{return await D(),Response.json({...z||{},remoteApiUrl:process.env.PROGY_API_URL||"https://progy.francy.workers.dev"})},Sp={"/api/config":{GET:qp}};import{readFile as y,exists as l}from"fs/promises";import{join as m}from"path";import{spawn as Mp}from"child_process";var Ep=async()=>{if(await D(),!z)return Response.json({error:"No config"});let p=await op(z);return Response.json(Array.isArray(p)?{}:p)},Ip=async(p)=>{let u=new URL(p.url).searchParams.get("path");if(!u)return new Response("Missing path",{status:400});let v=m(u,"quiz.json");try{if(await l(v)){let S=await y(v,"utf-8");return Response.json(JSON.parse(S))}return Response.json({error:"Quiz not found"},{status:404})}catch(S){return Response.json({error:"Invalid quiz file"},{status:500})}},Kp=async(p)=>{let o=new URL(p.url),u=o.searchParams.get("path"),v=o.searchParams.get("markdownPath");if(!u)return new Response("Missing path",{status:400});try{let S="";if((await Bun.file(u).stat()).isDirectory()){let X=["exercise.rs","main.rs","index.ts","main.go","index.js"];for(let $ of X){let R=m(u,$);if(await l(R)){S=await y(R,"utf-8");break}}if(!S)S="// No entry file found"}else S=await y(u,"utf-8");let B=null;if(v&&await l(v))B=await y(v,"utf-8");return Response.json({code:S,markdown:B})}catch(S){return Response.json({error:"File not found"},{status:404})}},bp=async(p)=>{try{await D();let o=await p.json(),{exerciseName:u,id:v}=o,w=(v?.split("/")||[])[0]||"",B=z.runner.command,X=z.runner.args.map((j)=>j.replace("{{exercise}}",u).replace("{{id}}",v||"").replace("{{module}}",w)),R=(z.runner.cwd?m(M,z.runner.cwd):M).replace("{{exercise}}",u).replace("{{id}}",v||"").replace("{{module}}",w);return new Promise((j)=>{let J=Mp(B,X,{cwd:R,stdio:["ignore","pipe","pipe"],env:{...process.env,FORCE_COLOR:"1"}}),U="";if(J.stdout)J.stdout.on("data",(Y)=>U+=Y.toString());if(J.stderr)J.stderr.on("data",(Y)=>U+=Y.toString());J.on("close",async(Y)=>{let H=Rp(U,Y||0),W=null,n=null;if(H.success&&o.id)try{let Z=await N();if(!Z.exercises[o.id])Z.exercises[o.id]={status:"pass",xpEarned:20,completedAt:new Date().toISOString()},Z.stats.totalXp+=20,Z.stats=_(Z.stats),await g(Z);W=Z}catch(Z){console.error(`[WARN] Could not update progress: ${Z}`),n="Failed to save progress (Auth/Network error)"}j(Response.json({success:H.success,output:H.output||"No output",friendlyOutput:H.friendlyOutput,progress:W,error:n}))}),J.on("error",(Y)=>j(Response.json({success:!1,output:Y.message})))})}catch(o){return Response.json({success:!1,output:String(o)})}},$p={"/api/exercises":{GET:Ep},"/api/exercises/quiz":{GET:Ip},"/api/exercises/code":{GET:Kp},"/api/exercises/run":{POST:bp}};import{readFile as Np,exists as Ap}from"fs/promises";import{join as fp}from"path";var Gp=async()=>{if(await D(),!z||!z.setup)return Response.json({success:!0,checks:[]});let p=await up(z.setup);return Response.json({success:p.every((o)=>o.status==="pass"),checks:p})},gp=async()=>{if(await D(),!z||!z.setup?.guide)return Response.json({markdown:"# No setup guide available"});let p=fp(M,z.setup.guide);if(await Ap(p)){let o=await Np(p,"utf-8");return Response.json({markdown:o})}return Response.json({markdown:"# Setup guide not found"})},Vp={"/api/setup/status":{GET:Gp},"/api/setup/guide":{GET:gp}};var _p=async()=>{return Response.json({hint:"Thinking..."})},wp={"/api/ai/hint":{POST:_p}};import{spawn as yp}from"child_process";var Fp=async(p)=>{try{let{path:o}=await p.json();if(!o)return Response.json({success:!1,error:"Missing path"});console.log(`[IDE] Opening ${o} in VS Code...`);let u=yp("code",[o],{shell:!0});return new Promise((v)=>{u.on("error",(S)=>{console.error(`[IDE] Failed to spawn 'code': ${S}`),v(Response.json({success:!1,error:"VS Code not found in PATH"}))}),u.on("spawn",()=>{v(Response.json({success:!0}))})})}catch(o){return console.error(`[IDE] Failed to open: ${o}`),Response.json({success:!1,error:String(o)},{status:500})}},zp={"/api/ide/open":{POST:Fp}};var Op=async()=>{let p=await I();return Response.json({token:p?.token||null})},Cp=async()=>{return await G({token:null}),Response.json({success:!0})},Xp={"/api/auth/token":{GET:Op,POST:Cp}};var sp=async()=>{let p=await I(),{token:o,...u}=p||{};return Response.json(u)},xp=async(p)=>{let o=await p.json();return await G(o),Response.json({success:!0})},Yp={"/api/local-settings":{GET:sp,POST:xp}};var hp=import.meta.file.endsWith(".ts"),P=F(import.meta.dir,hp?"../../public":"../public");console.log("[INFO] Server starting...");var kp;try{kp=cp({port:3001,routes:{"/":()=>new Response(Bun.file(F(P,"index.html"))),"/main.js":()=>new Response(Bun.file(F(P,"main.js"))),"/main.css":()=>new Response(Bun.file(F(P,"main.css"))),...i,...vp,...Sp,...$p,...Vp,...wp,...zp,...Xp,...Yp},development:{hmr:process.env.ENABLE_HMR==="true"},fetch(p){return new Response("Not Found",{status:404})}}),console.log(`\uD83D\uDE80 Progy Server running on ${kp.url}`)}catch(p){if(p.code==="EADDRINUSE"||p.syscall==="listen")console.error(`
|
|
29
|
+
\u274C \x1B[31mError: Port 3001 is already in use.\x1B[0m`),console.error(" To fix this, you can:"),console.error(" 1. Stop the other Progy instance (Ctrl+C)"),console.error(" 2. Kill the process manually: \x1B[33mbunx progy kill-port 3001\x1B[0m (if implemented) or use task manager"),console.error(` 3. Wait a few seconds and try again.
|
|
30
|
+
`),process.exit(1);else throw p}
|
package/dist/cli.js
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
var qQ=Object.create;var{getPrototypeOf:QQ,defineProperty:Nq,getOwnPropertyNames:YQ}=Object;var XQ=Object.prototype.hasOwnProperty;var a=(q,Q,Y)=>{Y=q!=null?qQ(QQ(q)):{};let X=Q||!q||!q.__esModule?Nq(Y,"default",{value:q,enumerable:!0}):Y;for(let J of YQ(q))if(!XQ.call(X,J))Nq(X,J,{get:()=>q[J],enumerable:!0});return X};var R=(q,Q)=>()=>(Q||q((Q={exports:{}}).exports,Q),Q.exports);var F=import.meta.require;var C=R((JQ)=>{class qq extends Error{constructor(q,Q,Y){super(Y);Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=Q,this.exitCode=q,this.nestedError=void 0}}class
|
|
4
|
-
`).replace(/^/gm," ".repeat(2))}let H=[`Usage: ${Q.commandUsage(q)}`,""],K=Q.commandDescription(q);if(K.length>0)H=H.concat([Q.wrap(K,X,0),""]);let B=Q.visibleArguments(q).map(($)=>{return G(Q.argumentTerm($),Q.argumentDescription($))});if(B.length>0)H=H.concat(["Arguments:",z(B),""]);let L=Q.visibleOptions(q).map(($)=>{return G(Q.optionTerm($),Q.optionDescription($))});if(L.length>0)H=H.concat(["Options:",z(L),""]);if(this.showGlobalOptions){let $=Q.visibleGlobalOptions(q).map((
|
|
3
|
+
var qQ=Object.create;var{getPrototypeOf:QQ,defineProperty:Nq,getOwnPropertyNames:YQ}=Object;var XQ=Object.prototype.hasOwnProperty;var a=(q,Q,Y)=>{Y=q!=null?qQ(QQ(q)):{};let X=Q||!q||!q.__esModule?Nq(Y,"default",{value:q,enumerable:!0}):Y;for(let J of YQ(q))if(!XQ.call(X,J))Nq(X,J,{get:()=>q[J],enumerable:!0});return X};var R=(q,Q)=>()=>(Q||q((Q={exports:{}}).exports,Q),Q.exports);var F=import.meta.require;var C=R((JQ)=>{class qq extends Error{constructor(q,Q,Y){super(Y);Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name,this.code=Q,this.exitCode=q,this.nestedError=void 0}}class wq extends qq{constructor(q){super(1,"commander.invalidArgument",q);Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}}JQ.CommanderError=qq;JQ.InvalidArgumentError=wq});var l=R((KQ)=>{var{InvalidArgumentError:GQ}=C();class Aq{constructor(q,Q){switch(this.description=Q||"",this.variadic=!1,this.parseArg=void 0,this.defaultValue=void 0,this.defaultValueDescription=void 0,this.argChoices=void 0,q[0]){case"<":this.required=!0,this._name=q.slice(1,-1);break;case"[":this.required=!1,this._name=q.slice(1,-1);break;default:this.required=!0,this._name=q;break}if(this._name.length>3&&this._name.slice(-3)==="...")this.variadic=!0,this._name=this._name.slice(0,-3)}name(){return this._name}_concatValue(q,Q){if(Q===this.defaultValue||!Array.isArray(Q))return[q];return Q.concat(q)}default(q,Q){return this.defaultValue=q,this.defaultValueDescription=Q,this}argParser(q){return this.parseArg=q,this}choices(q){return this.argChoices=q.slice(),this.parseArg=(Q,Y)=>{if(!this.argChoices.includes(Q))throw new GQ(`Allowed choices are ${this.argChoices.join(", ")}.`);if(this.variadic)return this._concatValue(Q,Y);return Q},this}argRequired(){return this.required=!0,this}argOptional(){return this.required=!1,this}}function HQ(q){let Q=q.name()+(q.variadic===!0?"...":"");return q.required?"<"+Q+">":"["+Q+"]"}KQ.Argument=Aq;KQ.humanReadableArgName=HQ});var Qq=R((UQ)=>{var{humanReadableArgName:$Q}=l();class Dq{constructor(){this.helpWidth=void 0,this.sortSubcommands=!1,this.sortOptions=!1,this.showGlobalOptions=!1}visibleCommands(q){let Q=q.commands.filter((X)=>!X._hidden),Y=q._getHelpCommand();if(Y&&!Y._hidden)Q.push(Y);if(this.sortSubcommands)Q.sort((X,J)=>{return X.name().localeCompare(J.name())});return Q}compareOptions(q,Q){let Y=(X)=>{return X.short?X.short.replace(/^-/,""):X.long.replace(/^--/,"")};return Y(q).localeCompare(Y(Q))}visibleOptions(q){let Q=q.options.filter((X)=>!X.hidden),Y=q._getHelpOption();if(Y&&!Y.hidden){let X=Y.short&&q._findOption(Y.short),J=Y.long&&q._findOption(Y.long);if(!X&&!J)Q.push(Y);else if(Y.long&&!J)Q.push(q.createOption(Y.long,Y.description));else if(Y.short&&!X)Q.push(q.createOption(Y.short,Y.description))}if(this.sortOptions)Q.sort(this.compareOptions);return Q}visibleGlobalOptions(q){if(!this.showGlobalOptions)return[];let Q=[];for(let Y=q.parent;Y;Y=Y.parent){let X=Y.options.filter((J)=>!J.hidden);Q.push(...X)}if(this.sortOptions)Q.sort(this.compareOptions);return Q}visibleArguments(q){if(q._argsDescription)q.registeredArguments.forEach((Q)=>{Q.description=Q.description||q._argsDescription[Q.name()]||""});if(q.registeredArguments.find((Q)=>Q.description))return q.registeredArguments;return[]}subcommandTerm(q){let Q=q.registeredArguments.map((Y)=>$Q(Y)).join(" ");return q._name+(q._aliases[0]?"|"+q._aliases[0]:"")+(q.options.length?" [options]":"")+(Q?" "+Q:"")}optionTerm(q){return q.flags}argumentTerm(q){return q.name()}longestSubcommandTermLength(q,Q){return Q.visibleCommands(q).reduce((Y,X)=>{return Math.max(Y,Q.subcommandTerm(X).length)},0)}longestOptionTermLength(q,Q){return Q.visibleOptions(q).reduce((Y,X)=>{return Math.max(Y,Q.optionTerm(X).length)},0)}longestGlobalOptionTermLength(q,Q){return Q.visibleGlobalOptions(q).reduce((Y,X)=>{return Math.max(Y,Q.optionTerm(X).length)},0)}longestArgumentTermLength(q,Q){return Q.visibleArguments(q).reduce((Y,X)=>{return Math.max(Y,Q.argumentTerm(X).length)},0)}commandUsage(q){let Q=q._name;if(q._aliases[0])Q=Q+"|"+q._aliases[0];let Y="";for(let X=q.parent;X;X=X.parent)Y=X.name()+" "+Y;return Y+Q+" "+q.usage()}commandDescription(q){return q.description()}subcommandDescription(q){return q.summary()||q.description()}optionDescription(q){let Q=[];if(q.argChoices)Q.push(`choices: ${q.argChoices.map((Y)=>JSON.stringify(Y)).join(", ")}`);if(q.defaultValue!==void 0){if(q.required||q.optional||q.isBoolean()&&typeof q.defaultValue==="boolean")Q.push(`default: ${q.defaultValueDescription||JSON.stringify(q.defaultValue)}`)}if(q.presetArg!==void 0&&q.optional)Q.push(`preset: ${JSON.stringify(q.presetArg)}`);if(q.envVar!==void 0)Q.push(`env: ${q.envVar}`);if(Q.length>0)return`${q.description} (${Q.join(", ")})`;return q.description}argumentDescription(q){let Q=[];if(q.argChoices)Q.push(`choices: ${q.argChoices.map((Y)=>JSON.stringify(Y)).join(", ")}`);if(q.defaultValue!==void 0)Q.push(`default: ${q.defaultValueDescription||JSON.stringify(q.defaultValue)}`);if(Q.length>0){let Y=`(${Q.join(", ")})`;if(q.description)return`${q.description} ${Y}`;return Y}return q.description}formatHelp(q,Q){let Y=Q.padWidth(q,Q),X=Q.helpWidth||80,J=2,W=2;function G($,P){if(P){let j=`${$.padEnd(Y+2)}${P}`;return Q.wrap(j,X-2,Y+2)}return $}function z($){return $.join(`
|
|
4
|
+
`).replace(/^/gm," ".repeat(2))}let H=[`Usage: ${Q.commandUsage(q)}`,""],K=Q.commandDescription(q);if(K.length>0)H=H.concat([Q.wrap(K,X,0),""]);let B=Q.visibleArguments(q).map(($)=>{return G(Q.argumentTerm($),Q.argumentDescription($))});if(B.length>0)H=H.concat(["Arguments:",z(B),""]);let L=Q.visibleOptions(q).map(($)=>{return G(Q.optionTerm($),Q.optionDescription($))});if(L.length>0)H=H.concat(["Options:",z(L),""]);if(this.showGlobalOptions){let $=Q.visibleGlobalOptions(q).map((P)=>{return G(Q.optionTerm(P),Q.optionDescription(P))});if($.length>0)H=H.concat(["Global Options:",z($),""])}let U=Q.visibleCommands(q).map(($)=>{return G(Q.subcommandTerm($),Q.subcommandDescription($))});if(U.length>0)H=H.concat(["Commands:",z(U),""]);return H.join(`
|
|
5
5
|
`)}padWidth(q,Q){return Math.max(Q.longestOptionTermLength(q,Q),Q.longestGlobalOptionTermLength(q,Q),Q.longestSubcommandTermLength(q,Q),Q.longestArgumentTermLength(q,Q))}wrap(q,Q,Y,X=40){let W=new RegExp(`[\\n][${" \\f\\t\\v\xA0\u1680\u2000-\u200A\u202F\u205F\u3000\uFEFF"}]+`);if(q.match(W))return q;let G=Q-Y;if(G<X)return q;let z=q.slice(0,Y),H=q.slice(Y).replace(`\r
|
|
6
6
|
`,`
|
|
7
7
|
`),K=" ".repeat(Y),L=`\\s${"\u200B"}`,U=new RegExp(`
|
|
8
|
-
|.{1,${G-1}}([${L}]|$)|[^${L}]+?([${L}]|$)`,"g"),$=H.match(U)||[];return z+$.map((
|
|
9
|
-
`)return"";return(j>0?K:"")+
|
|
10
|
-
`)}}UQ.Help=Dq});var Yq=R((IQ)=>{var{InvalidArgumentError:
|
|
8
|
+
|.{1,${G-1}}([${L}]|$)|[^${L}]+?([${L}]|$)`,"g"),$=H.match(U)||[];return z+$.map((P,j)=>{if(P===`
|
|
9
|
+
`)return"";return(j>0?K:"")+P.trimEnd()}).join(`
|
|
10
|
+
`)}}UQ.Help=Dq});var Yq=R((IQ)=>{var{InvalidArgumentError:EQ}=C();class Rq{constructor(q,Q){this.flags=q,this.description=Q||"",this.required=q.includes("<"),this.optional=q.includes("["),this.variadic=/\w\.\.\.[>\]]$/.test(q),this.mandatory=!1;let Y=jQ(q);if(this.short=Y.shortFlag,this.long=Y.longFlag,this.negate=!1,this.long)this.negate=this.long.startsWith("--no-");this.defaultValue=void 0,this.defaultValueDescription=void 0,this.presetArg=void 0,this.envVar=void 0,this.parseArg=void 0,this.hidden=!1,this.argChoices=void 0,this.conflictsWith=[],this.implied=void 0}default(q,Q){return this.defaultValue=q,this.defaultValueDescription=Q,this}preset(q){return this.presetArg=q,this}conflicts(q){return this.conflictsWith=this.conflictsWith.concat(q),this}implies(q){let Q=q;if(typeof q==="string")Q={[q]:!0};return this.implied=Object.assign(this.implied||{},Q),this}env(q){return this.envVar=q,this}argParser(q){return this.parseArg=q,this}makeOptionMandatory(q=!0){return this.mandatory=!!q,this}hideHelp(q=!0){return this.hidden=!!q,this}_concatValue(q,Q){if(Q===this.defaultValue||!Array.isArray(Q))return[q];return Q.concat(q)}choices(q){return this.argChoices=q.slice(),this.parseArg=(Q,Y)=>{if(!this.argChoices.includes(Q))throw new EQ(`Allowed choices are ${this.argChoices.join(", ")}.`);if(this.variadic)return this._concatValue(Q,Y);return Q},this}name(){if(this.long)return this.long.replace(/^--/,"");return this.short.replace(/^-/,"")}attributeName(){return VQ(this.name().replace(/^no-/,""))}is(q){return this.short===q||this.long===q}isBoolean(){return!this.required&&!this.optional&&!this.negate}}class Fq{constructor(q){this.positiveOptions=new Map,this.negativeOptions=new Map,this.dualOptions=new Set,q.forEach((Q)=>{if(Q.negate)this.negativeOptions.set(Q.attributeName(),Q);else this.positiveOptions.set(Q.attributeName(),Q)}),this.negativeOptions.forEach((Q,Y)=>{if(this.positiveOptions.has(Y))this.dualOptions.add(Y)})}valueFromOption(q,Q){let Y=Q.attributeName();if(!this.dualOptions.has(Y))return!0;let X=this.negativeOptions.get(Y).presetArg,J=X!==void 0?X:!1;return Q.negate===(J===q)}}function VQ(q){return q.split("-").reduce((Q,Y)=>{return Q+Y[0].toUpperCase()+Y.slice(1)})}function jQ(q){let Q,Y,X=q.split(/[ |,]+/);if(X.length>1&&!/^[[<]/.test(X[1]))Q=X.shift();if(Y=X.shift(),!Q&&/^-[^-]$/.test(Y))Q=Y,Y=void 0;return{shortFlag:Q,longFlag:Y}}IQ.Option=Rq;IQ.DualOptions=Fq});var Sq=R((RQ)=>{function AQ(q,Q){if(Math.abs(q.length-Q.length)>3)return Math.max(q.length,Q.length);let Y=[];for(let X=0;X<=q.length;X++)Y[X]=[X];for(let X=0;X<=Q.length;X++)Y[0][X]=X;for(let X=1;X<=Q.length;X++)for(let J=1;J<=q.length;J++){let W=1;if(q[J-1]===Q[X-1])W=0;else W=1;if(Y[J][X]=Math.min(Y[J-1][X]+1,Y[J][X-1]+1,Y[J-1][X-1]+W),J>1&&X>1&&q[J-1]===Q[X-2]&&q[J-2]===Q[X-1])Y[J][X]=Math.min(Y[J][X],Y[J-2][X-2]+1)}return Y[q.length][Q.length]}function DQ(q,Q){if(!Q||Q.length===0)return"";Q=Array.from(new Set(Q));let Y=q.startsWith("--");if(Y)q=q.slice(2),Q=Q.map((G)=>G.slice(2));let X=[],J=3,W=0.4;if(Q.forEach((G)=>{if(G.length<=1)return;let z=AQ(q,G),H=Math.max(q.length,G.length);if((H-z)/H>W){if(z<J)J=z,X=[G];else if(z===J)X.push(G)}}),X.sort((G,z)=>G.localeCompare(z)),Y)X=X.map((G)=>`--${G}`);if(X.length>1)return`
|
|
11
11
|
(Did you mean one of ${X.join(", ")}?)`;if(X.length===1)return`
|
|
12
|
-
(Did you mean ${X[0]}?)`;return""}RQ.suggestSimilar=DQ});var Zq=R((OQ)=>{var SQ=F("events").EventEmitter,Xq=F("child_process"),
|
|
12
|
+
(Did you mean ${X[0]}?)`;return""}RQ.suggestSimilar=DQ});var Zq=R((OQ)=>{var SQ=F("events").EventEmitter,Xq=F("child_process"),w=F("path"),Jq=F("fs"),E=F("process"),{Argument:MQ,humanReadableArgName:TQ}=l(),{CommanderError:Wq}=C(),{Help:_Q}=Qq(),{Option:Mq,DualOptions:ZQ}=Yq(),{suggestSimilar:Tq}=Sq();class zq extends SQ{constructor(q){super();this.commands=[],this.options=[],this.parent=null,this._allowUnknownOption=!1,this._allowExcessArguments=!0,this.registeredArguments=[],this._args=this.registeredArguments,this.args=[],this.rawArgs=[],this.processedArgs=[],this._scriptPath=null,this._name=q||"",this._optionValues={},this._optionValueSources={},this._storeOptionsAsProperties=!1,this._actionHandler=null,this._executableHandler=!1,this._executableFile=null,this._executableDir=null,this._defaultCommandName=null,this._exitCallback=null,this._aliases=[],this._combineFlagAndOptionalValue=!0,this._description="",this._summary="",this._argsDescription=void 0,this._enablePositionalOptions=!1,this._passThroughOptions=!1,this._lifeCycleHooks={},this._showHelpAfterError=!1,this._showSuggestionAfterError=!0,this._outputConfiguration={writeOut:(Q)=>E.stdout.write(Q),writeErr:(Q)=>E.stderr.write(Q),getOutHelpWidth:()=>E.stdout.isTTY?E.stdout.columns:void 0,getErrHelpWidth:()=>E.stderr.isTTY?E.stderr.columns:void 0,outputError:(Q,Y)=>Y(Q)},this._hidden=!1,this._helpOption=void 0,this._addImplicitHelpCommand=void 0,this._helpCommand=void 0,this._helpConfiguration={}}copyInheritedSettings(q){return this._outputConfiguration=q._outputConfiguration,this._helpOption=q._helpOption,this._helpCommand=q._helpCommand,this._helpConfiguration=q._helpConfiguration,this._exitCallback=q._exitCallback,this._storeOptionsAsProperties=q._storeOptionsAsProperties,this._combineFlagAndOptionalValue=q._combineFlagAndOptionalValue,this._allowExcessArguments=q._allowExcessArguments,this._enablePositionalOptions=q._enablePositionalOptions,this._showHelpAfterError=q._showHelpAfterError,this._showSuggestionAfterError=q._showSuggestionAfterError,this}_getCommandAndAncestors(){let q=[];for(let Q=this;Q;Q=Q.parent)q.push(Q);return q}command(q,Q,Y){let X=Q,J=Y;if(typeof X==="object"&&X!==null)J=X,X=null;J=J||{};let[,W,G]=q.match(/([^ ]+) *(.*)/),z=this.createCommand(W);if(X)z.description(X),z._executableHandler=!0;if(J.isDefault)this._defaultCommandName=z._name;if(z._hidden=!!(J.noHelp||J.hidden),z._executableFile=J.executableFile||null,G)z.arguments(G);if(this._registerCommand(z),z.parent=this,z.copyInheritedSettings(this),X)return this;return z}createCommand(q){return new zq(q)}createHelp(){return Object.assign(new _Q,this.configureHelp())}configureHelp(q){if(q===void 0)return this._helpConfiguration;return this._helpConfiguration=q,this}configureOutput(q){if(q===void 0)return this._outputConfiguration;return Object.assign(this._outputConfiguration,q),this}showHelpAfterError(q=!0){if(typeof q!=="string")q=!!q;return this._showHelpAfterError=q,this}showSuggestionAfterError(q=!0){return this._showSuggestionAfterError=!!q,this}addCommand(q,Q){if(!q._name)throw Error(`Command passed to .addCommand() must have a name
|
|
13
13
|
- specify the name in Command constructor or using .name()`);if(Q=Q||{},Q.isDefault)this._defaultCommandName=q._name;if(Q.noHelp||Q.hidden)q._hidden=!0;return this._registerCommand(q),q.parent=this,q._checkForBrokenPassThrough(),this}createArgument(q,Q){return new MQ(q,Q)}argument(q,Q,Y,X){let J=this.createArgument(q,Q);if(typeof Y==="function")J.default(X).argParser(Y);else J.default(Y);return this.addArgument(J),this}arguments(q){return q.trim().split(/ +/).forEach((Q)=>{this.argument(Q)}),this}addArgument(q){let Q=this.registeredArguments.slice(-1)[0];if(Q&&Q.variadic)throw Error(`only the last argument can be variadic '${Q.name()}'`);if(q.required&&q.defaultValue!==void 0&&q.parseArg===void 0)throw Error(`a default value for a required argument is never used: '${q.name()}'`);return this.registeredArguments.push(q),this}helpCommand(q,Q){if(typeof q==="boolean")return this._addImplicitHelpCommand=q,this;q=q??"help [command]";let[,Y,X]=q.match(/([^ ]+) *(.*)/),J=Q??"display help for command",W=this.createCommand(Y);if(W.helpOption(!1),X)W.arguments(X);if(J)W.description(J);return this._addImplicitHelpCommand=!0,this._helpCommand=W,this}addHelpCommand(q,Q){if(typeof q!=="object")return this.helpCommand(q,Q),this;return this._addImplicitHelpCommand=!0,this._helpCommand=q,this}_getHelpCommand(){if(this._addImplicitHelpCommand??(this.commands.length&&!this._actionHandler&&!this._findCommand("help"))){if(this._helpCommand===void 0)this.helpCommand(void 0,void 0);return this._helpCommand}return null}hook(q,Q){let Y=["preSubcommand","preAction","postAction"];if(!Y.includes(q))throw Error(`Unexpected value for event passed to hook : '${q}'.
|
|
14
|
-
Expecting one of '${Y.join("', '")}'`);if(this._lifeCycleHooks[q])this._lifeCycleHooks[q].push(Q);else this._lifeCycleHooks[q]=[Q];return this}exitOverride(q){if(q)this._exitCallback=q;else this._exitCallback=(Q)=>{if(Q.code!=="commander.executeSubCommandAsync")throw Q};return this}_exit(q,Q,Y){if(this._exitCallback)this._exitCallback(new Wq(q,Q,Y));
|
|
15
|
-
- already used by option '${Q.flags}'`)}this.options.push(q)}_registerCommand(q){let Q=(X)=>{return[X.name()].concat(X.aliases())},Y=Q(q).find((X)=>this._findCommand(X));if(Y){let X=Q(this._findCommand(Y)).join("|"),J=Q(q).join("|");throw Error(`cannot add command '${J}' as already have command '${X}'`)}this.commands.push(q)}addOption(q){this._registerOption(q);let Q=q.name(),Y=q.attributeName();if(q.negate){let J=q.long.replace(/^--no-/,"--");if(!this._findOption(J))this.setOptionValueWithSource(Y,q.defaultValue===void 0?!0:q.defaultValue,"default")}else if(q.defaultValue!==void 0)this.setOptionValueWithSource(Y,q.defaultValue,"default");let X=(J,W,G)=>{if(J==null&&q.presetArg!==void 0)J=q.presetArg;let z=this.getOptionValue(Y);if(J!==null&&q.parseArg)J=this._callParseArg(q,J,z,W);else if(J!==null&&q.variadic)J=q._concatValue(J,z);if(J==null)if(q.negate)J=!1;else if(q.isBoolean()||q.optional)J=!0;else J="";this.setOptionValueWithSource(Y,J,G)};if(this.on("option:"+Q,(J)=>{let W=`error: option '${q.flags}' argument '${J}' is invalid.`;X(J,W,"cli")}),q.envVar)this.on("optionEnv:"+Q,(J)=>{let W=`error: option '${q.flags}' value '${J}' from env '${q.envVar}' is invalid.`;X(J,W,"env")});return this}_optionEx(q,Q,Y,X,J){if(typeof Q==="object"&&Q instanceof Mq)throw Error("To add an Option object use addOption() instead of option() or requiredOption()");let W=this.createOption(Q,Y);if(W.makeOptionMandatory(!!q.mandatory),typeof X==="function")W.default(J).argParser(X);else if(X instanceof RegExp){let G=X;X=(z,H)=>{let K=G.exec(z);return K?K[0]:H},W.default(J).argParser(X)}else W.default(X);return this.addOption(W)}option(q,Q,Y,X){return this._optionEx({},q,Q,Y,X)}requiredOption(q,Q,Y,X){return this._optionEx({mandatory:!0},q,Q,Y,X)}combineFlagAndOptionalValue(q=!0){return this._combineFlagAndOptionalValue=!!q,this}allowUnknownOption(q=!0){return this._allowUnknownOption=!!q,this}allowExcessArguments(q=!0){return this._allowExcessArguments=!!q,this}enablePositionalOptions(q=!0){return this._enablePositionalOptions=!!q,this}passThroughOptions(q=!0){return this._passThroughOptions=!!q,this._checkForBrokenPassThrough(),this}_checkForBrokenPassThrough(){if(this.parent&&this._passThroughOptions&&!this.parent._enablePositionalOptions)throw Error(`passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`)}storeOptionsAsProperties(q=!0){if(this.options.length)throw Error("call .storeOptionsAsProperties() before adding options");if(Object.keys(this._optionValues).length)throw Error("call .storeOptionsAsProperties() before setting option values");return this._storeOptionsAsProperties=!!q,this}getOptionValue(q){if(this._storeOptionsAsProperties)return this[q];return this._optionValues[q]}setOptionValue(q,Q){return this.setOptionValueWithSource(q,Q,void 0)}setOptionValueWithSource(q,Q,Y){if(this._storeOptionsAsProperties)this[q]=Q;else this._optionValues[q]=Q;return this._optionValueSources[q]=Y,this}getOptionValueSource(q){return this._optionValueSources[q]}getOptionValueSourceWithGlobals(q){let Q;return this._getCommandAndAncestors().forEach((Y)=>{if(Y.getOptionValueSource(q)!==void 0)Q=Y.getOptionValueSource(q)}),Q}_prepareUserArgs(q,Q){if(q!==void 0&&!Array.isArray(q))throw Error("first parameter to parse must be array or undefined");if(Q=Q||{},q===void 0&&Q.from===void 0){if(
|
|
14
|
+
Expecting one of '${Y.join("', '")}'`);if(this._lifeCycleHooks[q])this._lifeCycleHooks[q].push(Q);else this._lifeCycleHooks[q]=[Q];return this}exitOverride(q){if(q)this._exitCallback=q;else this._exitCallback=(Q)=>{if(Q.code!=="commander.executeSubCommandAsync")throw Q};return this}_exit(q,Q,Y){if(this._exitCallback)this._exitCallback(new Wq(q,Q,Y));E.exit(q)}action(q){let Q=(Y)=>{let X=this.registeredArguments.length,J=Y.slice(0,X);if(this._storeOptionsAsProperties)J[X]=this;else J[X]=this.opts();return J.push(this),q.apply(this,J)};return this._actionHandler=Q,this}createOption(q,Q){return new Mq(q,Q)}_callParseArg(q,Q,Y,X){try{return q.parseArg(Q,Y)}catch(J){if(J.code==="commander.invalidArgument"){let W=`${X} ${J.message}`;this.error(W,{exitCode:J.exitCode,code:J.code})}throw J}}_registerOption(q){let Q=q.short&&this._findOption(q.short)||q.long&&this._findOption(q.long);if(Q){let Y=q.long&&this._findOption(q.long)?q.long:q.short;throw Error(`Cannot add option '${q.flags}'${this._name&&` to command '${this._name}'`} due to conflicting flag '${Y}'
|
|
15
|
+
- already used by option '${Q.flags}'`)}this.options.push(q)}_registerCommand(q){let Q=(X)=>{return[X.name()].concat(X.aliases())},Y=Q(q).find((X)=>this._findCommand(X));if(Y){let X=Q(this._findCommand(Y)).join("|"),J=Q(q).join("|");throw Error(`cannot add command '${J}' as already have command '${X}'`)}this.commands.push(q)}addOption(q){this._registerOption(q);let Q=q.name(),Y=q.attributeName();if(q.negate){let J=q.long.replace(/^--no-/,"--");if(!this._findOption(J))this.setOptionValueWithSource(Y,q.defaultValue===void 0?!0:q.defaultValue,"default")}else if(q.defaultValue!==void 0)this.setOptionValueWithSource(Y,q.defaultValue,"default");let X=(J,W,G)=>{if(J==null&&q.presetArg!==void 0)J=q.presetArg;let z=this.getOptionValue(Y);if(J!==null&&q.parseArg)J=this._callParseArg(q,J,z,W);else if(J!==null&&q.variadic)J=q._concatValue(J,z);if(J==null)if(q.negate)J=!1;else if(q.isBoolean()||q.optional)J=!0;else J="";this.setOptionValueWithSource(Y,J,G)};if(this.on("option:"+Q,(J)=>{let W=`error: option '${q.flags}' argument '${J}' is invalid.`;X(J,W,"cli")}),q.envVar)this.on("optionEnv:"+Q,(J)=>{let W=`error: option '${q.flags}' value '${J}' from env '${q.envVar}' is invalid.`;X(J,W,"env")});return this}_optionEx(q,Q,Y,X,J){if(typeof Q==="object"&&Q instanceof Mq)throw Error("To add an Option object use addOption() instead of option() or requiredOption()");let W=this.createOption(Q,Y);if(W.makeOptionMandatory(!!q.mandatory),typeof X==="function")W.default(J).argParser(X);else if(X instanceof RegExp){let G=X;X=(z,H)=>{let K=G.exec(z);return K?K[0]:H},W.default(J).argParser(X)}else W.default(X);return this.addOption(W)}option(q,Q,Y,X){return this._optionEx({},q,Q,Y,X)}requiredOption(q,Q,Y,X){return this._optionEx({mandatory:!0},q,Q,Y,X)}combineFlagAndOptionalValue(q=!0){return this._combineFlagAndOptionalValue=!!q,this}allowUnknownOption(q=!0){return this._allowUnknownOption=!!q,this}allowExcessArguments(q=!0){return this._allowExcessArguments=!!q,this}enablePositionalOptions(q=!0){return this._enablePositionalOptions=!!q,this}passThroughOptions(q=!0){return this._passThroughOptions=!!q,this._checkForBrokenPassThrough(),this}_checkForBrokenPassThrough(){if(this.parent&&this._passThroughOptions&&!this.parent._enablePositionalOptions)throw Error(`passThroughOptions cannot be used for '${this._name}' without turning on enablePositionalOptions for parent command(s)`)}storeOptionsAsProperties(q=!0){if(this.options.length)throw Error("call .storeOptionsAsProperties() before adding options");if(Object.keys(this._optionValues).length)throw Error("call .storeOptionsAsProperties() before setting option values");return this._storeOptionsAsProperties=!!q,this}getOptionValue(q){if(this._storeOptionsAsProperties)return this[q];return this._optionValues[q]}setOptionValue(q,Q){return this.setOptionValueWithSource(q,Q,void 0)}setOptionValueWithSource(q,Q,Y){if(this._storeOptionsAsProperties)this[q]=Q;else this._optionValues[q]=Q;return this._optionValueSources[q]=Y,this}getOptionValueSource(q){return this._optionValueSources[q]}getOptionValueSourceWithGlobals(q){let Q;return this._getCommandAndAncestors().forEach((Y)=>{if(Y.getOptionValueSource(q)!==void 0)Q=Y.getOptionValueSource(q)}),Q}_prepareUserArgs(q,Q){if(q!==void 0&&!Array.isArray(q))throw Error("first parameter to parse must be array or undefined");if(Q=Q||{},q===void 0&&Q.from===void 0){if(E.versions?.electron)Q.from="electron";let X=E.execArgv??[];if(X.includes("-e")||X.includes("--eval")||X.includes("-p")||X.includes("--print"))Q.from="eval"}if(q===void 0)q=E.argv;this.rawArgs=q.slice();let Y;switch(Q.from){case void 0:case"node":this._scriptPath=q[1],Y=q.slice(2);break;case"electron":if(E.defaultApp)this._scriptPath=q[1],Y=q.slice(2);else Y=q.slice(1);break;case"user":Y=q.slice(0);break;case"eval":Y=q.slice(1);break;default:throw Error(`unexpected parse option { from: '${Q.from}' }`)}if(!this._name&&this._scriptPath)this.nameFromFilename(this._scriptPath);return this._name=this._name||"program",Y}parse(q,Q){let Y=this._prepareUserArgs(q,Q);return this._parseCommand([],Y),this}async parseAsync(q,Q){let Y=this._prepareUserArgs(q,Q);return await this._parseCommand([],Y),this}_executeSubCommand(q,Q){Q=Q.slice();let Y=!1,X=[".js",".ts",".tsx",".mjs",".cjs"];function J(K,B){let L=w.resolve(K,B);if(Jq.existsSync(L))return L;if(X.includes(w.extname(B)))return;let U=X.find(($)=>Jq.existsSync(`${L}${$}`));if(U)return`${L}${U}`;return}this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let W=q._executableFile||`${this._name}-${q._name}`,G=this._executableDir||"";if(this._scriptPath){let K;try{K=Jq.realpathSync(this._scriptPath)}catch(B){K=this._scriptPath}G=w.resolve(w.dirname(K),G)}if(G){let K=J(G,W);if(!K&&!q._executableFile&&this._scriptPath){let B=w.basename(this._scriptPath,w.extname(this._scriptPath));if(B!==this._name)K=J(G,`${B}-${q._name}`)}W=K||W}Y=X.includes(w.extname(W));let z;if(E.platform!=="win32")if(Y)Q.unshift(W),Q=_q(E.execArgv).concat(Q),z=Xq.spawn(E.argv[0],Q,{stdio:"inherit"});else z=Xq.spawn(W,Q,{stdio:"inherit"});else Q.unshift(W),Q=_q(E.execArgv).concat(Q),z=Xq.spawn(E.execPath,Q,{stdio:"inherit"});if(!z.killed)["SIGUSR1","SIGUSR2","SIGTERM","SIGINT","SIGHUP"].forEach((B)=>{E.on(B,()=>{if(z.killed===!1&&z.exitCode===null)z.kill(B)})});let H=this._exitCallback;z.on("close",(K)=>{if(K=K??1,!H)E.exit(K);else H(new Wq(K,"commander.executeSubCommandAsync","(close)"))}),z.on("error",(K)=>{if(K.code==="ENOENT"){let B=G?`searched for local subcommand relative to directory '${G}'`:"no directory for search for local subcommand, use .executableDir() to supply a custom directory",L=`'${W}' does not exist
|
|
16
16
|
- if '${q._name}' is not meant to be an executable command, remove description parameter from '.command()' and use '.description()' instead
|
|
17
17
|
- if the default executable name is not suitable, use the executableFile option to supply a custom name or path
|
|
18
|
-
- ${B}`;throw Error(L)}else if(K.code==="EACCES")throw Error(`'${W}' not executable`);if(!H)
|
|
18
|
+
- ${B}`;throw Error(L)}else if(K.code==="EACCES")throw Error(`'${W}' not executable`);if(!H)E.exit(1);else{let B=new Wq(1,"commander.executeSubCommandAsync","(error)");B.nestedError=K,H(B)}}),this.runningCommand=z}_dispatchSubcommand(q,Q,Y){let X=this._findCommand(q);if(!X)this.help({error:!0});let J;return J=this._chainOrCallSubCommandHook(J,X,"preSubcommand"),J=this._chainOrCall(J,()=>{if(X._executableHandler)this._executeSubCommand(X,Q.concat(Y));else return X._parseCommand(Q,Y)}),J}_dispatchHelpCommand(q){if(!q)this.help();let Q=this._findCommand(q);if(Q&&!Q._executableHandler)Q.help();return this._dispatchSubcommand(q,[],[this._getHelpOption()?.long??this._getHelpOption()?.short??"--help"])}_checkNumberOfArguments(){if(this.registeredArguments.forEach((q,Q)=>{if(q.required&&this.args[Q]==null)this.missingArgument(q.name())}),this.registeredArguments.length>0&&this.registeredArguments[this.registeredArguments.length-1].variadic)return;if(this.args.length>this.registeredArguments.length)this._excessArguments(this.args)}_processArguments(){let q=(Y,X,J)=>{let W=X;if(X!==null&&Y.parseArg){let G=`error: command-argument value '${X}' is invalid for argument '${Y.name()}'.`;W=this._callParseArg(Y,X,J,G)}return W};this._checkNumberOfArguments();let Q=[];this.registeredArguments.forEach((Y,X)=>{let J=Y.defaultValue;if(Y.variadic){if(X<this.args.length){if(J=this.args.slice(X),Y.parseArg)J=J.reduce((W,G)=>{return q(Y,G,W)},Y.defaultValue)}else if(J===void 0)J=[]}else if(X<this.args.length){if(J=this.args[X],Y.parseArg)J=q(Y,J,Y.defaultValue)}Q[X]=J}),this.processedArgs=Q}_chainOrCall(q,Q){if(q&&q.then&&typeof q.then==="function")return q.then(()=>Q());return Q()}_chainOrCallHooks(q,Q){let Y=q,X=[];if(this._getCommandAndAncestors().reverse().filter((J)=>J._lifeCycleHooks[Q]!==void 0).forEach((J)=>{J._lifeCycleHooks[Q].forEach((W)=>{X.push({hookedCommand:J,callback:W})})}),Q==="postAction")X.reverse();return X.forEach((J)=>{Y=this._chainOrCall(Y,()=>{return J.callback(J.hookedCommand,this)})}),Y}_chainOrCallSubCommandHook(q,Q,Y){let X=q;if(this._lifeCycleHooks[Y]!==void 0)this._lifeCycleHooks[Y].forEach((J)=>{X=this._chainOrCall(X,()=>{return J(this,Q)})});return X}_parseCommand(q,Q){let Y=this.parseOptions(Q);if(this._parseOptionsEnv(),this._parseOptionsImplied(),q=q.concat(Y.operands),Q=Y.unknown,this.args=q.concat(Q),q&&this._findCommand(q[0]))return this._dispatchSubcommand(q[0],q.slice(1),Q);if(this._getHelpCommand()&&q[0]===this._getHelpCommand().name())return this._dispatchHelpCommand(q[1]);if(this._defaultCommandName)return this._outputHelpIfRequested(Q),this._dispatchSubcommand(this._defaultCommandName,q,Q);if(this.commands.length&&this.args.length===0&&!this._actionHandler&&!this._defaultCommandName)this.help({error:!0});this._outputHelpIfRequested(Y.unknown),this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let X=()=>{if(Y.unknown.length>0)this.unknownOption(Y.unknown[0])},J=`command:${this.name()}`;if(this._actionHandler){X(),this._processArguments();let W;if(W=this._chainOrCallHooks(W,"preAction"),W=this._chainOrCall(W,()=>this._actionHandler(this.processedArgs)),this.parent)W=this._chainOrCall(W,()=>{this.parent.emit(J,q,Q)});return W=this._chainOrCallHooks(W,"postAction"),W}if(this.parent&&this.parent.listenerCount(J))X(),this._processArguments(),this.parent.emit(J,q,Q);else if(q.length){if(this._findCommand("*"))return this._dispatchSubcommand("*",q,Q);if(this.listenerCount("command:*"))this.emit("command:*",q,Q);else if(this.commands.length)this.unknownCommand();else X(),this._processArguments()}else if(this.commands.length)X(),this.help({error:!0});else X(),this._processArguments()}_findCommand(q){if(!q)return;return this.commands.find((Q)=>Q._name===q||Q._aliases.includes(q))}_findOption(q){return this.options.find((Q)=>Q.is(q))}_checkForMissingMandatoryOptions(){this._getCommandAndAncestors().forEach((q)=>{q.options.forEach((Q)=>{if(Q.mandatory&&q.getOptionValue(Q.attributeName())===void 0)q.missingMandatoryOptionValue(Q)})})}_checkForConflictingLocalOptions(){let q=this.options.filter((Y)=>{let X=Y.attributeName();if(this.getOptionValue(X)===void 0)return!1;return this.getOptionValueSource(X)!=="default"});q.filter((Y)=>Y.conflictsWith.length>0).forEach((Y)=>{let X=q.find((J)=>Y.conflictsWith.includes(J.attributeName()));if(X)this._conflictingOption(Y,X)})}_checkForConflictingOptions(){this._getCommandAndAncestors().forEach((q)=>{q._checkForConflictingLocalOptions()})}parseOptions(q){let Q=[],Y=[],X=Q,J=q.slice();function W(z){return z.length>1&&z[0]==="-"}let G=null;while(J.length){let z=J.shift();if(z==="--"){if(X===Y)X.push(z);X.push(...J);break}if(G&&!W(z)){this.emit(`option:${G.name()}`,z);continue}if(G=null,W(z)){let H=this._findOption(z);if(H){if(H.required){let K=J.shift();if(K===void 0)this.optionMissingArgument(H);this.emit(`option:${H.name()}`,K)}else if(H.optional){let K=null;if(J.length>0&&!W(J[0]))K=J.shift();this.emit(`option:${H.name()}`,K)}else this.emit(`option:${H.name()}`);G=H.variadic?H:null;continue}}if(z.length>2&&z[0]==="-"&&z[1]!=="-"){let H=this._findOption(`-${z[1]}`);if(H){if(H.required||H.optional&&this._combineFlagAndOptionalValue)this.emit(`option:${H.name()}`,z.slice(2));else this.emit(`option:${H.name()}`),J.unshift(`-${z.slice(2)}`);continue}}if(/^--[^=]+=/.test(z)){let H=z.indexOf("="),K=this._findOption(z.slice(0,H));if(K&&(K.required||K.optional)){this.emit(`option:${K.name()}`,z.slice(H+1));continue}}if(W(z))X=Y;if((this._enablePositionalOptions||this._passThroughOptions)&&Q.length===0&&Y.length===0){if(this._findCommand(z)){if(Q.push(z),J.length>0)Y.push(...J);break}else if(this._getHelpCommand()&&z===this._getHelpCommand().name()){if(Q.push(z),J.length>0)Q.push(...J);break}else if(this._defaultCommandName){if(Y.push(z),J.length>0)Y.push(...J);break}}if(this._passThroughOptions){if(X.push(z),J.length>0)X.push(...J);break}X.push(z)}return{operands:Q,unknown:Y}}opts(){if(this._storeOptionsAsProperties){let q={},Q=this.options.length;for(let Y=0;Y<Q;Y++){let X=this.options[Y].attributeName();q[X]=X===this._versionOptionName?this._version:this[X]}return q}return this._optionValues}optsWithGlobals(){return this._getCommandAndAncestors().reduce((q,Q)=>Object.assign(q,Q.opts()),{})}error(q,Q){if(this._outputConfiguration.outputError(`${q}
|
|
19
19
|
`,this._outputConfiguration.writeErr),typeof this._showHelpAfterError==="string")this._outputConfiguration.writeErr(`${this._showHelpAfterError}
|
|
20
20
|
`);else if(this._showHelpAfterError)this._outputConfiguration.writeErr(`
|
|
21
|
-
`),this.outputHelp({error:!0});let Y=Q||{},X=Y.exitCode||1,J=Y.code||"commander.error";this._exit(X,J,q)}_parseOptionsEnv(){this.options.forEach((q)=>{if(q.envVar&&q.envVar in
|
|
22
|
-
`),this._exit(0,"commander.version",q)}),this}description(q,Q){if(q===void 0&&Q===void 0)return this._description;if(this._description=q,Q)this._argsDescription=Q;return this}summary(q){if(q===void 0)return this._summary;return this._summary=q,this}alias(q){if(q===void 0)return this._aliases[0];let Q=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler)Q=this.commands[this.commands.length-1];if(q===Q._name)throw Error("Command alias can't be the same as its name");let Y=this.parent?._findCommand(q);if(Y){let X=[Y.name()].concat(Y.aliases()).join("|");throw Error(`cannot add alias '${q}' to command '${this.name()}' as already have command '${X}'`)}return Q._aliases.push(q),this}aliases(q){if(q===void 0)return this._aliases;return q.forEach((Q)=>this.alias(Q)),this}usage(q){if(q===void 0){if(this._usage)return this._usage;let Q=this.registeredArguments.map((Y)=>{return TQ(Y)});return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?Q:[]).join(" ")}return this._usage=q,this}name(q){if(q===void 0)return this._name;return this._name=q,this}nameFromFilename(q){return this._name=
|
|
21
|
+
`),this.outputHelp({error:!0});let Y=Q||{},X=Y.exitCode||1,J=Y.code||"commander.error";this._exit(X,J,q)}_parseOptionsEnv(){this.options.forEach((q)=>{if(q.envVar&&q.envVar in E.env){let Q=q.attributeName();if(this.getOptionValue(Q)===void 0||["default","config","env"].includes(this.getOptionValueSource(Q)))if(q.required||q.optional)this.emit(`optionEnv:${q.name()}`,E.env[q.envVar]);else this.emit(`optionEnv:${q.name()}`)}})}_parseOptionsImplied(){let q=new ZQ(this.options),Q=(Y)=>{return this.getOptionValue(Y)!==void 0&&!["default","implied"].includes(this.getOptionValueSource(Y))};this.options.filter((Y)=>Y.implied!==void 0&&Q(Y.attributeName())&&q.valueFromOption(this.getOptionValue(Y.attributeName()),Y)).forEach((Y)=>{Object.keys(Y.implied).filter((X)=>!Q(X)).forEach((X)=>{this.setOptionValueWithSource(X,Y.implied[X],"implied")})})}missingArgument(q){let Q=`error: missing required argument '${q}'`;this.error(Q,{code:"commander.missingArgument"})}optionMissingArgument(q){let Q=`error: option '${q.flags}' argument missing`;this.error(Q,{code:"commander.optionMissingArgument"})}missingMandatoryOptionValue(q){let Q=`error: required option '${q.flags}' not specified`;this.error(Q,{code:"commander.missingMandatoryOptionValue"})}_conflictingOption(q,Q){let Y=(W)=>{let G=W.attributeName(),z=this.getOptionValue(G),H=this.options.find((B)=>B.negate&&G===B.attributeName()),K=this.options.find((B)=>!B.negate&&G===B.attributeName());if(H&&(H.presetArg===void 0&&z===!1||H.presetArg!==void 0&&z===H.presetArg))return H;return K||W},X=(W)=>{let G=Y(W),z=G.attributeName();if(this.getOptionValueSource(z)==="env")return`environment variable '${G.envVar}'`;return`option '${G.flags}'`},J=`error: ${X(q)} cannot be used with ${X(Q)}`;this.error(J,{code:"commander.conflictingOption"})}unknownOption(q){if(this._allowUnknownOption)return;let Q="";if(q.startsWith("--")&&this._showSuggestionAfterError){let X=[],J=this;do{let W=J.createHelp().visibleOptions(J).filter((G)=>G.long).map((G)=>G.long);X=X.concat(W),J=J.parent}while(J&&!J._enablePositionalOptions);Q=Tq(q,X)}let Y=`error: unknown option '${q}'${Q}`;this.error(Y,{code:"commander.unknownOption"})}_excessArguments(q){if(this._allowExcessArguments)return;let Q=this.registeredArguments.length,Y=Q===1?"":"s",J=`error: too many arguments${this.parent?` for '${this.name()}'`:""}. Expected ${Q} argument${Y} but got ${q.length}.`;this.error(J,{code:"commander.excessArguments"})}unknownCommand(){let q=this.args[0],Q="";if(this._showSuggestionAfterError){let X=[];this.createHelp().visibleCommands(this).forEach((J)=>{if(X.push(J.name()),J.alias())X.push(J.alias())}),Q=Tq(q,X)}let Y=`error: unknown command '${q}'${Q}`;this.error(Y,{code:"commander.unknownCommand"})}version(q,Q,Y){if(q===void 0)return this._version;this._version=q,Q=Q||"-V, --version",Y=Y||"output the version number";let X=this.createOption(Q,Y);return this._versionOptionName=X.attributeName(),this._registerOption(X),this.on("option:"+X.name(),()=>{this._outputConfiguration.writeOut(`${q}
|
|
22
|
+
`),this._exit(0,"commander.version",q)}),this}description(q,Q){if(q===void 0&&Q===void 0)return this._description;if(this._description=q,Q)this._argsDescription=Q;return this}summary(q){if(q===void 0)return this._summary;return this._summary=q,this}alias(q){if(q===void 0)return this._aliases[0];let Q=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler)Q=this.commands[this.commands.length-1];if(q===Q._name)throw Error("Command alias can't be the same as its name");let Y=this.parent?._findCommand(q);if(Y){let X=[Y.name()].concat(Y.aliases()).join("|");throw Error(`cannot add alias '${q}' to command '${this.name()}' as already have command '${X}'`)}return Q._aliases.push(q),this}aliases(q){if(q===void 0)return this._aliases;return q.forEach((Q)=>this.alias(Q)),this}usage(q){if(q===void 0){if(this._usage)return this._usage;let Q=this.registeredArguments.map((Y)=>{return TQ(Y)});return[].concat(this.options.length||this._helpOption!==null?"[options]":[],this.commands.length?"[command]":[],this.registeredArguments.length?Q:[]).join(" ")}return this._usage=q,this}name(q){if(q===void 0)return this._name;return this._name=q,this}nameFromFilename(q){return this._name=w.basename(q,w.extname(q)),this}executableDir(q){if(q===void 0)return this._executableDir;return this._executableDir=q,this}helpInformation(q){let Q=this.createHelp();if(Q.helpWidth===void 0)Q.helpWidth=q&&q.error?this._outputConfiguration.getErrHelpWidth():this._outputConfiguration.getOutHelpWidth();return Q.formatHelp(this,Q)}_getHelpContext(q){q=q||{};let Q={error:!!q.error},Y;if(Q.error)Y=(X)=>this._outputConfiguration.writeErr(X);else Y=(X)=>this._outputConfiguration.writeOut(X);return Q.write=q.write||Y,Q.command=this,Q}outputHelp(q){let Q;if(typeof q==="function")Q=q,q=void 0;let Y=this._getHelpContext(q);this._getCommandAndAncestors().reverse().forEach((J)=>J.emit("beforeAllHelp",Y)),this.emit("beforeHelp",Y);let X=this.helpInformation(Y);if(Q){if(X=Q(X),typeof X!=="string"&&!Buffer.isBuffer(X))throw Error("outputHelp callback must return a string or a Buffer")}if(Y.write(X),this._getHelpOption()?.long)this.emit(this._getHelpOption().long);this.emit("afterHelp",Y),this._getCommandAndAncestors().forEach((J)=>J.emit("afterAllHelp",Y))}helpOption(q,Q){if(typeof q==="boolean"){if(q)this._helpOption=this._helpOption??void 0;else this._helpOption=null;return this}return q=q??"-h, --help",Q=Q??"display help for command",this._helpOption=this.createOption(q,Q),this}_getHelpOption(){if(this._helpOption===void 0)this.helpOption(void 0,void 0);return this._helpOption}addHelpOption(q){return this._helpOption=q,this}help(q){this.outputHelp(q);let Q=E.exitCode||0;if(Q===0&&q&&typeof q!=="function"&&q.error)Q=1;this._exit(Q,"commander.help","(outputHelp)")}addHelpText(q,Q){let Y=["beforeAll","before","after","afterAll"];if(!Y.includes(q))throw Error(`Unexpected value for position to addHelpText.
|
|
23
23
|
Expecting one of '${Y.join("', '")}'`);let X=`${q}Help`;return this.on(X,(J)=>{let W;if(typeof Q==="function")W=Q({error:J.error,command:J.command});else W=Q;if(W)J.write(`${W}
|
|
24
|
-
`)}),this}_outputHelpIfRequested(q){let Q=this._getHelpOption();if(Q&&q.find((X)=>Q.is(X)))this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)")}}function _q(q){return q.map((Q)=>{if(!Q.startsWith("--inspect"))return Q;let Y,X="127.0.0.1",J="9229",W;if((W=Q.match(/^(--inspect(-brk)?)$/))!==null)Y=W[1];else if((W=Q.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null)if(Y=W[1],/^\d+$/.test(W[3]))J=W[3];else X=W[3];else if((W=Q.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null)Y=W[1],X=W[3],J=W[4];if(Y&&J!=="0")return`${Y}=${X}:${parseInt(J)+1}`;return Q})}OQ.Command=zq});var Cq=R((xQ)=>{var{Argument:Oq}=l(),{Command:Gq}=Zq(),{CommanderError:kQ,InvalidArgumentError:bq}=C(),{Help:CQ}=Qq(),{Option:kq}=Yq();xQ.program=new Gq;xQ.createCommand=(q)=>new Gq(q);xQ.createOption=(q,Q)=>new kq(q,Q);xQ.createArgument=(q,Q)=>new Oq(q,Q);xQ.Command=Gq;xQ.Option=kq;xQ.Argument=Oq;xQ.Help=CQ;xQ.CommanderError=kQ;xQ.InvalidArgumentError=bq;xQ.InvalidOptionArgumentError=bq});var xq=a(Cq(),1),{program:M,createCommand:
|
|
24
|
+
`)}),this}_outputHelpIfRequested(q){let Q=this._getHelpOption();if(Q&&q.find((X)=>Q.is(X)))this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)")}}function _q(q){return q.map((Q)=>{if(!Q.startsWith("--inspect"))return Q;let Y,X="127.0.0.1",J="9229",W;if((W=Q.match(/^(--inspect(-brk)?)$/))!==null)Y=W[1];else if((W=Q.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null)if(Y=W[1],/^\d+$/.test(W[3]))J=W[3];else X=W[3];else if((W=Q.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null)Y=W[1],X=W[3],J=W[4];if(Y&&J!=="0")return`${Y}=${X}:${parseInt(J)+1}`;return Q})}OQ.Command=zq});var Cq=R((xQ)=>{var{Argument:Oq}=l(),{Command:Gq}=Zq(),{CommanderError:kQ,InvalidArgumentError:bq}=C(),{Help:CQ}=Qq(),{Option:kq}=Yq();xQ.program=new Gq;xQ.createCommand=(q)=>new Gq(q);xQ.createOption=(q,Q)=>new kq(q,Q);xQ.createArgument=(q,Q)=>new Oq(q,Q);xQ.Command=Gq;xQ.Option=kq;xQ.Argument=Oq;xQ.Help=CQ;xQ.CommanderError=kQ;xQ.InvalidArgumentError=bq;xQ.InvalidOptionArgumentError=bq});var xq=a(Cq(),1),{program:M,createCommand:xY,createArgument:vY,createOption:hY,CommanderError:gY,InvalidArgumentError:yY,InvalidOptionArgumentError:cY,Command:fY,Argument:uY,Option:mY,Help:lY}=xq.default;import{cp as VY,exists as S,mkdir as s,writeFile as D,readFile as sq}from"fs/promises";import{join as V,relative as jY}from"path";import{spawn as e}from"child_process";import{homedir as IY}from"os";var Hq={rust:{courseJson:{id:"{{id}}",name:"{{name}}",runner:{command:"cargo",args:["test","--quiet","--manifest-path","./content/{{id}}/Cargo.toml"],cwd:"."},content:{root:".",exercises:"content"},setup:{checks:[{name:"Rust Compiler",type:"command",command:"rustc --version"},{name:"Cargo Package Manager",type:"command",command:"cargo --version"}],guide:"SETUP.md"}},setupMd:`# \uD83E\uDD80 Rust Setup Guide
|
|
25
25
|
|
|
26
26
|
To run the exercises in this course, you need to have **Rust** installed on your system.
|
|
27
27
|
|
|
@@ -84,9 +84,9 @@ func Greeting() string {
|
|
|
84
84
|
func main() {
|
|
85
85
|
fmt.Println(Greeting())
|
|
86
86
|
}
|
|
87
|
-
`,introFilename:"main.go"}};var rY=Object.freeze({status:"aborted"});function I(q,Q,Y){function X(z,H){if(!z._zod)Object.defineProperty(z,"_zod",{value:{def:H,constr:G,traits:new Set},enumerable:!1});if(z._zod.traits.has(q))return;z._zod.traits.add(q),Q(z,H);let K=G.prototype,B=Object.keys(K);for(let L=0;L<B.length;L++){let U=B[L];if(!(U in z))z[U]=K[U].bind(z)}}let J=Y?.Parent??Object;class W extends J{}Object.defineProperty(W,"name",{value:q});function G(z){var H;let K=Y?.Parent?new W:this;X(K,z),(H=K._zod).deferred??(H.deferred=[]);for(let B of K._zod.deferred)B();return K}return Object.defineProperty(G,"init",{value:X}),Object.defineProperty(G,Symbol.hasInstance,{value:(z)=>{if(Y?.Parent&&z instanceof Y.Parent)return!0;return z?._zod?.traits?.has(q)}}),Object.defineProperty(G,"name",{value:q}),G}var dY=Symbol("zod_brand");class w extends Error{constructor(){super("Encountered Promise during synchronous parse. Use .parseAsync() instead.")}}var Kq={};function T(q){if(q)Object.assign(Kq,q);return Kq}function gq(q,Q){if(typeof Q==="bigint")return Q.toString();return Q}function Bq(q){return{get value(){{let Y=q();return Object.defineProperty(this,"value",{value:Y}),Y}throw Error("cached value already set")}}}var hq=Symbol("evaluating");function x(q,Q,Y){let X=void 0;Object.defineProperty(q,Q,{get(){if(X===hq)return;if(X===void 0)X=hq,X=Y();return X},set(J){Object.defineProperty(q,Q,{value:J})},configurable:!0})}var Lq="captureStackTrace"in Error?Error.captureStackTrace:(...q)=>{};function yq(q){return typeof q==="object"&&q!==null&&!Array.isArray(q)}var dQ=Bq(()=>{if(typeof navigator<"u"&&navigator?.userAgent?.includes("Cloudflare"))return!1;try{return new Function(""),!0}catch(q){return!1}});function $q(q,Q,Y){let X=new q._zod.constr(Q??q._zod.def);if(!Q||Y?.parent)X._zod.parent=q;return X}function v(q){let Q=q;if(!Q)return{};if(typeof Q==="string")return{error:()=>Q};if(Q?.message!==void 0){if(Q?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");Q.error=Q.message}if(delete Q.message,typeof Q.error==="string")return{...Q,error:()=>Q.error};return Q}function cq(q){return Object.keys(q).filter((Q)=>{return q[Q]._zod.optin==="optional"&&q[Q]._zod.optout==="optional"})}var oY={safeint:[Number.MIN_SAFE_INTEGER,Number.MAX_SAFE_INTEGER],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-340282346638528860000000000000000000000,340282346638528860000000000000000000000],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function h(q,Q=0){if(q.aborted===!0)return!0;for(let Y=Q;Y<q.issues.length;Y++)if(q.issues[Y]?.continue!==!0)return!0;return!1}function Uq(q,Q){return Q.map((Y)=>{var X;return(X=Y).path??(X.path=[]),Y.path.unshift(q),Y})}function p(q){return typeof q==="string"?q:q?.message}function _(q,Q,Y){let X={...q,path:q.path??[]};if(!q.message){let J=p(q.inst?._zod.def?.error?.(q))??p(Q?.error?.(q))??p(Y.customError?.(q))??p(Y.localeError?.(q))??"Invalid input";X.message=J}if(delete X.inst,delete X.continue,!Q?.reportInput)delete X.input;return X}var fq=(q,Q)=>{q.name="$ZodError",Object.defineProperty(q,"_zod",{value:q._zod,enumerable:!1}),Object.defineProperty(q,"issues",{value:Q,enumerable:!1}),q.message=JSON.stringify(Q,gq,2),Object.defineProperty(q,"toString",{value:()=>q.message,enumerable:!1})},uq=I("$ZodError",fq),y=I("$ZodError",fq,{Parent:Error});var nQ=(q)=>(Q,Y,X,J)=>{let W=X?Object.assign(X,{async:!1}):{async:!1},G=Q._zod.run({value:Y,issues:[]},W);if(G instanceof Promise)throw new w;if(G.issues.length){let z=new(J?.Err??q)(G.issues.map((H)=>_(H,W,T())));throw Lq(z,J?.callee),z}return G.value},r=nQ(y),iQ=(q)=>async(Q,Y,X,J)=>{let W=X?Object.assign(X,{async:!0}):{async:!0},G=Q._zod.run({value:Y,issues:[]},W);if(G instanceof Promise)G=await G;if(G.issues.length){let z=new(J?.Err??q)(G.issues.map((H)=>_(H,W,T())));throw Lq(z,J?.callee),z}return G.value},d=iQ(y),tQ=(q)=>(Q,Y,X)=>{let J=X?{...X,async:!1}:{async:!1},W=Q._zod.run({value:Y,issues:[]},J);if(W instanceof Promise)throw new w;return W.issues.length?{success:!1,error:new(q??uq)(W.issues.map((G)=>_(G,J,T())))}:{success:!0,data:W.value}},c=tQ(y),sQ=(q)=>async(Q,Y,X)=>{let J=X?Object.assign(X,{async:!0}):{async:!0},W=Q._zod.run({value:Y,issues:[]},J);if(W instanceof Promise)W=await W;return W.issues.length?{success:!1,error:new q(W.issues.map((G)=>_(G,J,T())))}:{success:!0,data:W.value}},f=sQ(y);var eQ="(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))",aQ=new RegExp(`^${eQ}$`);var mq=(q)=>{let Q=q?`[\\s\\S]{${q?.minimum??0},${q?.maximum??""}}`:"[\\s\\S]*";return new RegExp(`^${Q}$`)};var pq={major:4,minor:3,patch:6};var u=I("$ZodType",(q,Q)=>{var Y;q??(q={}),q._zod.def=Q,q._zod.bag=q._zod.bag||{},q._zod.version=pq;let X=[...q._zod.def.checks??[]];if(q._zod.traits.has("$ZodCheck"))X.unshift(q);for(let J of X)for(let W of J._zod.onattach)W(q);if(X.length===0)(Y=q._zod).deferred??(Y.deferred=[]),q._zod.deferred?.push(()=>{q._zod.run=q._zod.parse});else{let J=(G,z,H)=>{let K=h(G),B;for(let L of z){if(L._zod.def.when){if(!L._zod.def.when(G))continue}else if(K)continue;let U=G.issues.length,$=L._zod.check(G);if($ instanceof Promise&&H?.async===!1)throw new w;if(B||$ instanceof Promise)B=(B??Promise.resolve()).then(async()=>{if(await $,G.issues.length===U)return;if(!K)K=h(G,U)});else{if(G.issues.length===U)continue;if(!K)K=h(G,U)}}if(B)return B.then(()=>{return G});return G},W=(G,z,H)=>{if(h(G))return G.aborted=!0,G;let K=J(z,X,H);if(K instanceof Promise){if(H.async===!1)throw new w;return K.then((B)=>q._zod.parse(B,H))}return q._zod.parse(K,H)};q._zod.run=(G,z)=>{if(z.skipChecks)return q._zod.parse(G,z);if(z.direction==="backward"){let K=q._zod.parse({value:G.value,issues:[]},{...z,skipChecks:!0});if(K instanceof Promise)return K.then((B)=>{return W(B,G,z)});return W(K,G,z)}let H=q._zod.parse(G,z);if(H instanceof Promise){if(z.async===!1)throw new w;return H.then((K)=>J(K,X,z))}return J(H,X,z)}}x(q,"~standard",()=>({validate:(J)=>{try{let W=c(q,J);return W.success?{value:W.data}:{issues:W.error?.issues}}catch(W){return f(q,J).then((G)=>G.success?{value:G.data}:{issues:G.error?.issues})}},vendor:"zod",version:1}))}),dq=I("$ZodString",(q,Q)=>{u.init(q,Q),q._zod.pattern=[...q?._zod.bag?.patterns??[]].pop()??mq(q._zod.bag),q._zod.parse=(Y,X)=>{if(Q.coerce)try{Y.value=String(Y.value)}catch(J){}if(typeof Y.value==="string")return Y;return Y.issues.push({expected:"string",code:"invalid_type",input:Y.value,inst:q}),Y}});function rq(q,Q,Y){if(q.issues.length)Q.issues.push(...Uq(Y,q.issues));Q.value[Y]=q.value}var oq=I("$ZodArray",(q,Q)=>{u.init(q,Q),q._zod.parse=(Y,X)=>{let J=Y.value;if(!Array.isArray(J))return Y.issues.push({expected:"array",code:"invalid_type",input:J,inst:q}),Y;Y.value=Array(J.length);let W=[];for(let G=0;G<J.length;G++){let z=J[G],H=Q.element._zod.run({value:z,issues:[]},X);if(H instanceof Promise)W.push(H.then((K)=>rq(K,Y,G)));else rq(H,Y,G)}if(W.length)return Promise.all(W).then(()=>Y);return Y}});function o(q,Q,Y,X,J){if(q.issues.length){if(J&&!(Y in X))return;Q.issues.push(...Uq(Y,q.issues))}if(q.value===void 0){if(Y in X)Q.value[Y]=void 0}else Q.value[Y]=q.value}function QY(q){let Q=Object.keys(q.shape);for(let X of Q)if(!q.shape?.[X]?._zod?.traits?.has("$ZodType"))throw Error(`Invalid element at key "${X}": expected a Zod schema`);let Y=cq(q.shape);return{...q,keys:Q,keySet:new Set(Q),numKeys:Q.length,optionalKeys:new Set(Y)}}function YY(q,Q,Y,X,J,W){let G=[],z=J.keySet,H=J.catchall._zod,K=H.def.type,B=H.optout==="optional";for(let L in Q){if(z.has(L))continue;if(K==="never"){G.push(L);continue}let U=H.run({value:Q[L],issues:[]},X);if(U instanceof Promise)q.push(U.then(($)=>o($,Y,L,Q,B)));else o(U,Y,L,Q,B)}if(G.length)Y.issues.push({code:"unrecognized_keys",keys:G,input:Q,inst:W});if(!q.length)return Y;return Promise.all(q).then(()=>{return Y})}var nq=I("$ZodObject",(q,Q)=>{if(u.init(q,Q),!Object.getOwnPropertyDescriptor(Q,"shape")?.get){let z=Q.shape;Object.defineProperty(Q,"shape",{get:()=>{let H={...z};return Object.defineProperty(Q,"shape",{value:H}),H}})}let X=Bq(()=>QY(Q));x(q._zod,"propValues",()=>{let z=Q.shape,H={};for(let K in z){let B=z[K]._zod;if(B.values){H[K]??(H[K]=new Set);for(let L of B.values)H[K].add(L)}}return H});let J=yq,W=Q.catchall,G;q._zod.parse=(z,H)=>{G??(G=X.value);let K=z.value;if(!J(K))return z.issues.push({expected:"object",code:"invalid_type",input:K,inst:q}),z;z.value={};let B=[],L=G.shape;for(let U of G.keys){let $=L[U],E=$._zod.optout==="optional",j=$._zod.run({value:K[U],issues:[]},H);if(j instanceof Promise)B.push(j.then((k)=>o(k,z,U,K,E)));else o(j,z,U,K,E)}if(!W)return B.length?Promise.all(B).then(()=>z):z;return YY(B,K,z,H,X.value,q)}});function iq(q,Q){return new q({type:"string",...v(Q)})}var Eq=I("ZodMiniType",(q,Q)=>{if(!q._zod)throw Error("Uninitialized schema in ZodMiniType.");u.init(q,Q),q.def=Q,q.type=Q.type,q.parse=(Y,X)=>r(q,Y,X,{callee:q.parse}),q.safeParse=(Y,X)=>c(q,Y,X),q.parseAsync=async(Y,X)=>d(q,Y,X,{callee:q.parseAsync}),q.safeParseAsync=async(Y,X)=>f(q,Y,X),q.check=(...Y)=>{return q.clone({...Q,checks:[...Q.checks??[],...Y.map((X)=>typeof X==="function"?{_zod:{check:X,def:{check:"custom"},onattach:[]}}:X)]},{parent:!0})},q.with=q.check,q.clone=(Y,X)=>$q(q,Y,X),q.brand=()=>q,q.register=(Y,X)=>{return Y.add(q,X),q},q.apply=(Y)=>Y(q)}),WY=I("ZodMiniString",(q,Q)=>{dq.init(q,Q),Eq.init(q,Q)});function N(q){return iq(WY,q)}var zY=I("ZodMiniArray",(q,Q)=>{oq.init(q,Q),Eq.init(q,Q)});function Pq(q,Q){return new zY({type:"array",element:q,...v(Q)})}var GY=I("ZodMiniObject",(q,Q)=>{nq.init(q,Q),Eq.init(q,Q),x(q,"shape",()=>Q.shape)});function Z(q,Q){let Y={type:"object",shape:q??{},...v(Q)};return new GY(Y)}import{cp as tq,exists as O,mkdir as HY,readFile as KY,rm as BY}from"fs/promises";import{join as b}from"path";import{spawn as LY}from"child_process";import{homedir as $Y}from"os";import{resolve as PY}from"path";var n="course.json",UY=()=>process.env.PROGY_API_URL||"https://progy.francy.workers.dev",EY=Z({id:N(),name:N(),runner:Z({command:N(),args:Pq(N()),cwd:N()}),content:Z({root:N(),exercises:N()}),setup:Z({checks:Pq(Z({name:N(),type:N(),command:N()})),guide:N()})});class i{static async resolveSource(q){if(q.startsWith("http://")||q.startsWith("https://")||q.startsWith("git@")){let Q=q.split("#"),Y=Q[0],X=Q[1];return{url:Y,branch:X}}if(await O(q))return{url:PY(q)};console.log(`[INFO] Resolving alias '${q}'...`);try{let Q=`${UY()}/api/registry`,Y=await fetch(Q);if(!Y.ok)throw Error(`Failed to fetch registry (Status: ${Y.status})`);let J=(await Y.json()).courses[q];if(J)return{url:J.repo,branch:J.branch,path:J.path}}catch(Q){console.warn(`[WARN] Registry lookup failed: ${Q.message||Q}`)}throw Error(`Could not resolve course source for '${q}'`)}static async validateCourse(q){let Q=b(q,n);if(!await O(Q))throw Error(`Missing ${n} in course directory.`);let Y=await KY(Q,"utf-8"),X;try{X=JSON.parse(Y)}catch(H){throw Error(`Invalid JSON in ${n}`)}let J=EY.safeParse(X);if(!J.success){let H=J.error.issues.map((K)=>`- ${K.path.join(".")}: ${K.message}`).join(`
|
|
87
|
+
`,introFilename:"main.go"}};var dY=Object.freeze({status:"aborted"});function I(q,Q,Y){function X(z,H){if(!z._zod)Object.defineProperty(z,"_zod",{value:{def:H,constr:G,traits:new Set},enumerable:!1});if(z._zod.traits.has(q))return;z._zod.traits.add(q),Q(z,H);let K=G.prototype,B=Object.keys(K);for(let L=0;L<B.length;L++){let U=B[L];if(!(U in z))z[U]=K[U].bind(z)}}let J=Y?.Parent??Object;class W extends J{}Object.defineProperty(W,"name",{value:q});function G(z){var H;let K=Y?.Parent?new W:this;X(K,z),(H=K._zod).deferred??(H.deferred=[]);for(let B of K._zod.deferred)B();return K}return Object.defineProperty(G,"init",{value:X}),Object.defineProperty(G,Symbol.hasInstance,{value:(z)=>{if(Y?.Parent&&z instanceof Y.Parent)return!0;return z?._zod?.traits?.has(q)}}),Object.defineProperty(G,"name",{value:q}),G}var oY=Symbol("zod_brand");class A extends Error{constructor(){super("Encountered Promise during synchronous parse. Use .parseAsync() instead.")}}var Kq={};function T(q){if(q)Object.assign(Kq,q);return Kq}function gq(q,Q){if(typeof Q==="bigint")return Q.toString();return Q}function Bq(q){return{get value(){{let Y=q();return Object.defineProperty(this,"value",{value:Y}),Y}throw Error("cached value already set")}}}var hq=Symbol("evaluating");function x(q,Q,Y){let X=void 0;Object.defineProperty(q,Q,{get(){if(X===hq)return;if(X===void 0)X=hq,X=Y();return X},set(J){Object.defineProperty(q,Q,{value:J})},configurable:!0})}var Lq="captureStackTrace"in Error?Error.captureStackTrace:(...q)=>{};function yq(q){return typeof q==="object"&&q!==null&&!Array.isArray(q)}var dQ=Bq(()=>{if(typeof navigator<"u"&&navigator?.userAgent?.includes("Cloudflare"))return!1;try{return new Function(""),!0}catch(q){return!1}});function $q(q,Q,Y){let X=new q._zod.constr(Q??q._zod.def);if(!Q||Y?.parent)X._zod.parent=q;return X}function v(q){let Q=q;if(!Q)return{};if(typeof Q==="string")return{error:()=>Q};if(Q?.message!==void 0){if(Q?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");Q.error=Q.message}if(delete Q.message,typeof Q.error==="string")return{...Q,error:()=>Q.error};return Q}function cq(q){return Object.keys(q).filter((Q)=>{return q[Q]._zod.optin==="optional"&&q[Q]._zod.optout==="optional"})}var nY={safeint:[Number.MIN_SAFE_INTEGER,Number.MAX_SAFE_INTEGER],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-340282346638528860000000000000000000000,340282346638528860000000000000000000000],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function h(q,Q=0){if(q.aborted===!0)return!0;for(let Y=Q;Y<q.issues.length;Y++)if(q.issues[Y]?.continue!==!0)return!0;return!1}function Uq(q,Q){return Q.map((Y)=>{var X;return(X=Y).path??(X.path=[]),Y.path.unshift(q),Y})}function p(q){return typeof q==="string"?q:q?.message}function _(q,Q,Y){let X={...q,path:q.path??[]};if(!q.message){let J=p(q.inst?._zod.def?.error?.(q))??p(Q?.error?.(q))??p(Y.customError?.(q))??p(Y.localeError?.(q))??"Invalid input";X.message=J}if(delete X.inst,delete X.continue,!Q?.reportInput)delete X.input;return X}var fq=(q,Q)=>{q.name="$ZodError",Object.defineProperty(q,"_zod",{value:q._zod,enumerable:!1}),Object.defineProperty(q,"issues",{value:Q,enumerable:!1}),q.message=JSON.stringify(Q,gq,2),Object.defineProperty(q,"toString",{value:()=>q.message,enumerable:!1})},uq=I("$ZodError",fq),y=I("$ZodError",fq,{Parent:Error});var nQ=(q)=>(Q,Y,X,J)=>{let W=X?Object.assign(X,{async:!1}):{async:!1},G=Q._zod.run({value:Y,issues:[]},W);if(G instanceof Promise)throw new A;if(G.issues.length){let z=new(J?.Err??q)(G.issues.map((H)=>_(H,W,T())));throw Lq(z,J?.callee),z}return G.value},r=nQ(y),iQ=(q)=>async(Q,Y,X,J)=>{let W=X?Object.assign(X,{async:!0}):{async:!0},G=Q._zod.run({value:Y,issues:[]},W);if(G instanceof Promise)G=await G;if(G.issues.length){let z=new(J?.Err??q)(G.issues.map((H)=>_(H,W,T())));throw Lq(z,J?.callee),z}return G.value},d=iQ(y),tQ=(q)=>(Q,Y,X)=>{let J=X?{...X,async:!1}:{async:!1},W=Q._zod.run({value:Y,issues:[]},J);if(W instanceof Promise)throw new A;return W.issues.length?{success:!1,error:new(q??uq)(W.issues.map((G)=>_(G,J,T())))}:{success:!0,data:W.value}},c=tQ(y),sQ=(q)=>async(Q,Y,X)=>{let J=X?Object.assign(X,{async:!0}):{async:!0},W=Q._zod.run({value:Y,issues:[]},J);if(W instanceof Promise)W=await W;return W.issues.length?{success:!1,error:new q(W.issues.map((G)=>_(G,J,T())))}:{success:!0,data:W.value}},f=sQ(y);var eQ="(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))",aQ=new RegExp(`^${eQ}$`);var mq=(q)=>{let Q=q?`[\\s\\S]{${q?.minimum??0},${q?.maximum??""}}`:"[\\s\\S]*";return new RegExp(`^${Q}$`)};var pq={major:4,minor:3,patch:6};var u=I("$ZodType",(q,Q)=>{var Y;q??(q={}),q._zod.def=Q,q._zod.bag=q._zod.bag||{},q._zod.version=pq;let X=[...q._zod.def.checks??[]];if(q._zod.traits.has("$ZodCheck"))X.unshift(q);for(let J of X)for(let W of J._zod.onattach)W(q);if(X.length===0)(Y=q._zod).deferred??(Y.deferred=[]),q._zod.deferred?.push(()=>{q._zod.run=q._zod.parse});else{let J=(G,z,H)=>{let K=h(G),B;for(let L of z){if(L._zod.def.when){if(!L._zod.def.when(G))continue}else if(K)continue;let U=G.issues.length,$=L._zod.check(G);if($ instanceof Promise&&H?.async===!1)throw new A;if(B||$ instanceof Promise)B=(B??Promise.resolve()).then(async()=>{if(await $,G.issues.length===U)return;if(!K)K=h(G,U)});else{if(G.issues.length===U)continue;if(!K)K=h(G,U)}}if(B)return B.then(()=>{return G});return G},W=(G,z,H)=>{if(h(G))return G.aborted=!0,G;let K=J(z,X,H);if(K instanceof Promise){if(H.async===!1)throw new A;return K.then((B)=>q._zod.parse(B,H))}return q._zod.parse(K,H)};q._zod.run=(G,z)=>{if(z.skipChecks)return q._zod.parse(G,z);if(z.direction==="backward"){let K=q._zod.parse({value:G.value,issues:[]},{...z,skipChecks:!0});if(K instanceof Promise)return K.then((B)=>{return W(B,G,z)});return W(K,G,z)}let H=q._zod.parse(G,z);if(H instanceof Promise){if(z.async===!1)throw new A;return H.then((K)=>J(K,X,z))}return J(H,X,z)}}x(q,"~standard",()=>({validate:(J)=>{try{let W=c(q,J);return W.success?{value:W.data}:{issues:W.error?.issues}}catch(W){return f(q,J).then((G)=>G.success?{value:G.data}:{issues:G.error?.issues})}},vendor:"zod",version:1}))}),dq=I("$ZodString",(q,Q)=>{u.init(q,Q),q._zod.pattern=[...q?._zod.bag?.patterns??[]].pop()??mq(q._zod.bag),q._zod.parse=(Y,X)=>{if(Q.coerce)try{Y.value=String(Y.value)}catch(J){}if(typeof Y.value==="string")return Y;return Y.issues.push({expected:"string",code:"invalid_type",input:Y.value,inst:q}),Y}});function rq(q,Q,Y){if(q.issues.length)Q.issues.push(...Uq(Y,q.issues));Q.value[Y]=q.value}var oq=I("$ZodArray",(q,Q)=>{u.init(q,Q),q._zod.parse=(Y,X)=>{let J=Y.value;if(!Array.isArray(J))return Y.issues.push({expected:"array",code:"invalid_type",input:J,inst:q}),Y;Y.value=Array(J.length);let W=[];for(let G=0;G<J.length;G++){let z=J[G],H=Q.element._zod.run({value:z,issues:[]},X);if(H instanceof Promise)W.push(H.then((K)=>rq(K,Y,G)));else rq(H,Y,G)}if(W.length)return Promise.all(W).then(()=>Y);return Y}});function o(q,Q,Y,X,J){if(q.issues.length){if(J&&!(Y in X))return;Q.issues.push(...Uq(Y,q.issues))}if(q.value===void 0){if(Y in X)Q.value[Y]=void 0}else Q.value[Y]=q.value}function QY(q){let Q=Object.keys(q.shape);for(let X of Q)if(!q.shape?.[X]?._zod?.traits?.has("$ZodType"))throw Error(`Invalid element at key "${X}": expected a Zod schema`);let Y=cq(q.shape);return{...q,keys:Q,keySet:new Set(Q),numKeys:Q.length,optionalKeys:new Set(Y)}}function YY(q,Q,Y,X,J,W){let G=[],z=J.keySet,H=J.catchall._zod,K=H.def.type,B=H.optout==="optional";for(let L in Q){if(z.has(L))continue;if(K==="never"){G.push(L);continue}let U=H.run({value:Q[L],issues:[]},X);if(U instanceof Promise)q.push(U.then(($)=>o($,Y,L,Q,B)));else o(U,Y,L,Q,B)}if(G.length)Y.issues.push({code:"unrecognized_keys",keys:G,input:Q,inst:W});if(!q.length)return Y;return Promise.all(q).then(()=>{return Y})}var nq=I("$ZodObject",(q,Q)=>{if(u.init(q,Q),!Object.getOwnPropertyDescriptor(Q,"shape")?.get){let z=Q.shape;Object.defineProperty(Q,"shape",{get:()=>{let H={...z};return Object.defineProperty(Q,"shape",{value:H}),H}})}let X=Bq(()=>QY(Q));x(q._zod,"propValues",()=>{let z=Q.shape,H={};for(let K in z){let B=z[K]._zod;if(B.values){H[K]??(H[K]=new Set);for(let L of B.values)H[K].add(L)}}return H});let J=yq,W=Q.catchall,G;q._zod.parse=(z,H)=>{G??(G=X.value);let K=z.value;if(!J(K))return z.issues.push({expected:"object",code:"invalid_type",input:K,inst:q}),z;z.value={};let B=[],L=G.shape;for(let U of G.keys){let $=L[U],P=$._zod.optout==="optional",j=$._zod.run({value:K[U],issues:[]},H);if(j instanceof Promise)B.push(j.then((k)=>o(k,z,U,K,P)));else o(j,z,U,K,P)}if(!W)return B.length?Promise.all(B).then(()=>z):z;return YY(B,K,z,H,X.value,q)}});function iq(q,Q){return new q({type:"string",...v(Q)})}var Pq=I("ZodMiniType",(q,Q)=>{if(!q._zod)throw Error("Uninitialized schema in ZodMiniType.");u.init(q,Q),q.def=Q,q.type=Q.type,q.parse=(Y,X)=>r(q,Y,X,{callee:q.parse}),q.safeParse=(Y,X)=>c(q,Y,X),q.parseAsync=async(Y,X)=>d(q,Y,X,{callee:q.parseAsync}),q.safeParseAsync=async(Y,X)=>f(q,Y,X),q.check=(...Y)=>{return q.clone({...Q,checks:[...Q.checks??[],...Y.map((X)=>typeof X==="function"?{_zod:{check:X,def:{check:"custom"},onattach:[]}}:X)]},{parent:!0})},q.with=q.check,q.clone=(Y,X)=>$q(q,Y,X),q.brand=()=>q,q.register=(Y,X)=>{return Y.add(q,X),q},q.apply=(Y)=>Y(q)}),WY=I("ZodMiniString",(q,Q)=>{dq.init(q,Q),Pq.init(q,Q)});function N(q){return iq(WY,q)}var zY=I("ZodMiniArray",(q,Q)=>{oq.init(q,Q),Pq.init(q,Q)});function Eq(q,Q){return new zY({type:"array",element:q,...v(Q)})}var GY=I("ZodMiniObject",(q,Q)=>{nq.init(q,Q),Pq.init(q,Q),x(q,"shape",()=>Q.shape)});function Z(q,Q){let Y={type:"object",shape:q??{},...v(Q)};return new GY(Y)}import{cp as tq,exists as O,mkdir as HY,readFile as KY,rm as BY}from"fs/promises";import{join as b}from"path";import{spawn as LY}from"child_process";import{homedir as $Y}from"os";import{resolve as EY}from"path";var n="course.json",UY=()=>process.env.PROGY_API_URL||"https://progy.francy.workers.dev",PY=Z({id:N(),name:N(),runner:Z({command:N(),args:Eq(N()),cwd:N()}),content:Z({root:N(),exercises:N()}),setup:Z({checks:Eq(Z({name:N(),type:N(),command:N()})),guide:N()})});class i{static async resolveSource(q){if(q.startsWith("http://")||q.startsWith("https://")||q.startsWith("git@")){let Q=q.split("#"),Y=Q[0],X=Q[1];return{url:Y,branch:X}}if(await O(q))return{url:EY(q)};console.log(`[INFO] Resolving alias '${q}'...`);try{let Q=`${UY()}/api/registry`,Y=await fetch(Q);if(!Y.ok)throw Error(`Failed to fetch registry (Status: ${Y.status})`);let J=(await Y.json()).courses[q];if(J)return{url:J.repo,branch:J.branch,path:J.path}}catch(Q){console.warn(`[WARN] Registry lookup failed: ${Q.message||Q}`)}throw Error(`Could not resolve course source for '${q}'`)}static async validateCourse(q){let Q=b(q,n);if(!await O(Q))throw Error(`Missing ${n} in course directory.`);let Y=await KY(Q,"utf-8"),X;try{X=JSON.parse(Y)}catch(H){throw Error(`Invalid JSON in ${n}`)}let J=PY.safeParse(X);if(!J.success){let H=J.error.issues.map((K)=>`- ${K.path.join(".")}: ${K.message}`).join(`
|
|
88
88
|
`);throw Error(`Invalid course configuration in ${n}:
|
|
89
|
-
${H}`)}let W=b(q,J.data.content.root);if(!await O(W))throw Error(`Content root '${J.data.content.root}' not found.`);let G=b(q,J.data.content.exercises);if(!await O(G))throw Error(`Exercises directory '${J.data.content.exercises}' not found.`);let z=b(q,J.data.setup.guide);if(!await O(z))throw Error(`Setup guide '${J.data.setup.guide}' not found.`);return J.data}static async load(q,Q){let{url:Y,branch:X,path:J}=await this.resolveSource(q);if(console.log(`[INFO] Loading course from: ${Y} (branch: ${X||"default"}, path: ${J||"root"})`),await O(Y)&&!Y.endsWith(".git")){await this.validateCourse(Y),await tq(Y,Q,{recursive:!0});return}let W=b($Y(),".progy","tmp",`course-${Date.now()}`);await HY(W,{recursive:!0});try{if(console.log("[GIT] Initializing repository..."),await m("git",["init"],W),await m("git",["remote","add","origin",Y],W),J)console.log(`[GIT] Configuring sparse-checkout for path: ${J}...`),await m("git",["config","core.sparseCheckout","true"],W),await m("git",["sparse-checkout","set",J],W);console.log("[GIT] Pulling content..."),await m("git",["pull","--depth=1","origin",X||"main"],W);let z=J?b(W,J):W;console.log("[VAL] Validating course..."),await this.validateCourse(z),console.log("[INST] Installing course..."),await tq(z,Q,{recursive:!0})}finally{await BY(W,{recursive:!0,force:!0})}}}function m(q,Q,Y){return new Promise((X,J)=>{LY(q,Q,{cwd:Y,stdio:"inherit"}).on("close",(G)=>{if(G===0)X();else J(Error(`${q} exited with code ${G}`))})})}var Vq=V(
|
|
89
|
+
${H}`)}let W=b(q,J.data.content.root);if(!await O(W))throw Error(`Content root '${J.data.content.root}' not found.`);let G=b(q,J.data.content.exercises);if(!await O(G))throw Error(`Exercises directory '${J.data.content.exercises}' not found.`);let z=b(q,J.data.setup.guide);if(!await O(z))throw Error(`Setup guide '${J.data.setup.guide}' not found.`);return J.data}static async load(q,Q){let{url:Y,branch:X,path:J}=await this.resolveSource(q);if(console.log(`[INFO] Loading course from: ${Y} (branch: ${X||"default"}, path: ${J||"root"})`),await O(Y)&&!Y.endsWith(".git")){await this.validateCourse(Y),await tq(Y,Q,{recursive:!0});return}let W=b($Y(),".progy","tmp",`course-${Date.now()}`);await HY(W,{recursive:!0});try{if(console.log("[GIT] Initializing repository..."),await m("git",["init"],W),await m("git",["remote","add","origin",Y],W),J)console.log(`[GIT] Configuring sparse-checkout for path: ${J}...`),await m("git",["config","core.sparseCheckout","true"],W),await m("git",["sparse-checkout","set",J],W);console.log("[GIT] Pulling content..."),await m("git",["pull","--depth=1","origin",X||"main"],W);let z=J?b(W,J):W;console.log("[VAL] Validating course..."),await this.validateCourse(z),console.log("[INST] Installing course..."),await tq(z,Q,{recursive:!0})}finally{await BY(W,{recursive:!0,force:!0})}}}function m(q,Q,Y){return new Promise((X,J)=>{LY(q,Q,{cwd:Y,stdio:"inherit"}).on("close",(G)=>{if(G===0)X();else J(Error(`${q} exited with code ${G}`))})})}var Vq=V(IY(),".progy"),jq=V(Vq,"config.json"),eq=process.env.PROGY_API_URL||"https://progy.francy.workers.dev",NY=process.env.PROGY_FRONTEND_URL||eq,t="course.json";async function wY(){let q=V(import.meta.dir,"../../../courses");if(await S(q))return q;return null}async function AY(q){if(!await S(Vq))await s(Vq,{recursive:!0});await D(jq,JSON.stringify({token:q}))}async function DY(){if(!await S(jq))return null;try{return JSON.parse(await sq(jq,"utf-8")).token||null}catch{return null}}async function RY(q){try{let Q=e("git",["remote","get-url","origin"],{cwd:q}),Y=await new Promise((W)=>{let G="";Q.stdout.on("data",(z)=>G+=z.toString()),Q.on("close",(z)=>W(z===0?G.trim():null))}),X=e("git",["rev-parse","--show-toplevel"],{cwd:q}),J=await new Promise((W)=>{let G="";X.stdout.on("data",(z)=>G+=z.toString()),X.on("close",(z)=>W(z===0?G.trim():null))});return{remoteUrl:Y,root:J}}catch{return{remoteUrl:null,root:null}}}function FY(q,Q,Y){try{let X="";if(q.startsWith("http"))X=q.replace(/\.git$/,"").split("/").slice(-2).join("/");else if(q.startsWith("git@"))X=q.replace(/\.git$/,"").split(":")[1]||"";if(!X)return"local/course";let J=jY(Q.trim(),Y.trim()).replace(/\\/g,"/");return J?`${X}/${J}`:X}catch{return"local/course"}}function SY(q){let Q=process.platform==="win32"?"start":process.platform==="darwin"?"open":"xdg-open";e(Q,[q],{shell:!0}).unref()}M.name("progy").description("Universal programming course runner").version("0.0.1");M.command("init").description("Initialize a new course in the current directory").option("-c, --course <course>","Language/Course to initialize (e.g., rust)").option("--offline","Run in offline mode (Guest access, local storage only)").action(async(q)=>{let Q=process.cwd(),Y=!!q.offline,X=V(Q,t),J=await S(X),W=null;if(!Y){if(W=await DY(),!W)console.error("\u274C Authentication required for Online Mode."),console.error(" Run `bunx progy login` to authenticate."),console.error(" Or use `--offline` for Guest access (progress will only be saved locally)."),process.exit(1)}if(!q.course)if(J)console.log(`[INFO] Detected '${t}'. Starting progy...`);else console.error(`[ERROR] No '${t}' found. Please specify a course to initialize:`),console.error(" progy init --course <rust|go|cloudflare...>"),process.exit(1);else{let L=q.course;console.log(`[INFO] Initializing ${L} course in ${Q}...`);let U=await wY(),$=!1;if(U){console.log(`[INFO] Checking local courses directory: ${U}`);let P=V(U,L);if(await S(P))try{console.log("[VAL] Validating local course..."),await i.validateCourse(P);let j=["content","runner","Cargo.toml","go.mod","SETUP.md",t];for(let k of j){let Iq=V(P,k),aq=V(Q,k);if(await S(Iq))console.log(`[COPY] ${k}...`),await VY(Iq,aq,{recursive:!0})}$=!0}catch(j){console.warn(`[WARN] Local course validation failed: ${j}`)}}if(!$)try{await i.load(L,Q),$=!0}catch(P){console.error(`[ERROR] Failed to initialize course: ${P}`),process.exit(1)}console.log("[INFO] Initialization complete!")}if(J||q.course)try{let L=await sq(X,"utf-8"),U=JSON.parse(L),{remoteUrl:$,root:P}=await RY(Q);if($&&P){let j=FY($,P,Q);if(U.id!==j)console.log(`[ID] Updating course ID to match repository: ${j}`),U.id=j,await D(X,JSON.stringify(U,null,2))}}catch(L){console.warn(`[WARN] Failed to update dynamic course ID: ${L}`)}console.log(`[INFO] Starting UI in ${Y?"OFFLINE":"ONLINE"} mode...`);let z=import.meta.file.endsWith(".ts")?"ts":"js",K=["run",V(import.meta.dir,"backend",`server.${z}`)];if(process.env.ENABLE_HMR==="true")K.splice(1,0,"--hot");e("bun",K,{stdio:"inherit",env:{...process.env,PROG_CWD:Q,PROGY_OFFLINE:Y?"true":"false"}}).on("close",(L)=>process.exit(L??0))});M.command("create-course").description("Scaffold a new course with standard directory structure").requiredOption("--name <name>","Name of the course (e.g., rust-advanced)").requiredOption("-c, --course <course>","Programming language template (rust, go)").action(async(q)=>{let Q=process.cwd(),Y=q.name,X=q.course.toLowerCase(),J=V(Q,Y);if(await S(J))console.error(`[ERROR] Directory '${Y}' already exists.`),process.exit(1);let W=Hq[X];if(!W)console.error(`[ERROR] Unsupported language '${X}'. Supported: ${Object.keys(Hq).join(", ")}`),process.exit(1);console.log(`[INFO] Creating course '${Y}' with template '${X}'...`),await s(J,{recursive:!0}),await s(V(J,"content","01_intro"),{recursive:!0});let G=JSON.stringify(W.courseJson,null,2).replace(/{{id}}/g,Y).replace(/{{name}}/g,Y);if(await D(V(J,"course.json"),G),await D(V(J,"SETUP.md"),W.setupMd),await D(V(J,"content","01_intro","README.md"),W.introReadme),await D(V(J,"content","01_intro",W.introFilename),W.introCode),X==="go"){let z=V(J,"runner");await s(z,{recursive:!0});let H=`package main
|
|
90
90
|
import (
|
|
91
91
|
"bufio"
|
|
92
92
|
"encoding/json"
|
|
@@ -133,6 +133,6 @@ go 1.21
|
|
|
133
133
|
`)}console.log("[SUCCESS] Course created!"),console.log(`
|
|
134
134
|
To get started:
|
|
135
135
|
cd ${Y}
|
|
136
|
-
bunx progy init`)});M.command("login").description("Authenticate with Progy").action(async()=>{let{createAuthClient:q}=await import("better-auth/client"),{deviceAuthorizationClient:Q}=await import("better-auth/client/plugins"),Y=q({baseURL:eq,plugins:[Q()]});try{console.log("[INFO] Requesting login session...");let{data:X,error:J}=await Y.device.code({client_id:"progy-cli"});if(J)throw Error(J.error_description||"Failed to initiate device authorization");let{device_code:W,user_code:G,verification_uri:z,interval:H}=X,K=z.startsWith("http")?z:`${
|
|
136
|
+
bunx progy init`)});M.command("login").description("Authenticate with Progy").action(async()=>{let{createAuthClient:q}=await import("better-auth/client"),{deviceAuthorizationClient:Q}=await import("better-auth/client/plugins"),Y=q({baseURL:eq,plugins:[Q()]});try{console.log("[INFO] Requesting login session...");let{data:X,error:J}=await Y.device.code({client_id:"progy-cli"});if(J)throw Error(J.error_description||"Failed to initiate device authorization");let{device_code:W,user_code:G,verification_uri:z,interval:H}=X,K=z.startsWith("http")?z:`${NY}${z}`;console.log(`
|
|
137
137
|
Please authenticate in your browser:`),console.log(`\x1B[36m${K}\x1B[0m`),console.log(`Code: \x1B[33m${G}\x1B[0m
|
|
138
|
-
`),
|
|
138
|
+
`),SY(K),console.log("[WAIT] Waiting for authorization...");let L=await(async()=>{while(!0){let{data:U,error:$}=await Y.device.token({grant_type:"urn:ietf:params:oauth:grant-type:device_code",device_code:W,client_id:"progy-cli"});if(U?.access_token)return U.access_token;if($){let P=$.error;if(P==="access_denied"||P==="expired_token")throw Error($.error_description||P)}await new Promise((P)=>setTimeout(P,(H||5)*1000))}})();if(L)await AY(L),console.log("[SUCCESS] Logged in successfully!")}catch(X){console.error(`[ERROR] Login failed: ${X.message||X}`),process.exit(1)}});M.parse();
|