progy 0.4.3 → 0.6.0

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.
@@ -1,33 +1,28 @@
1
1
  // @bun
2
- var s=Object.create;var{getPrototypeOf:r,defineProperty:l,getOwnPropertyNames:e}=Object;var J0=Object.prototype.hasOwnProperty;var K0=(J,V,X)=>{X=J!=null?s(r(J)):{};let $=V||!J||!J.__esModule?l(X,"default",{value:J,enumerable:!0}):X;for(let Z of e(J))if(!J0.call($,Z))l($,Z,{get:()=>J[Z],enumerable:!0});return $};var q0=(J,V)=>()=>(V||J((V={exports:{}}).exports,V),V.exports);var D0=import.meta.require;var{serve:V0}=globalThis.Bun;import{readdir as h,readFile as E,writeFile as x,mkdir as p,exists as M,stat as X0}from"fs/promises";import{join as v}from"path";import{spawn as u}from"child_process";import{homedir as Y0}from"os";var d=async()=>{return new Response(JSON.stringify({status:"ok"}),{status:200})};var T=process.env.PROG_CWD||process.cwd(),m=v(Y0(),".progy"),N=v(m,"config.json"),c=v(T,"course.json"),O=v(T,".progy"),Z0=v(O,"exercises.json"),_=v(O,"progress.json"),P=v(import.meta.dir,import.meta.file.endsWith(".ts")?"../../public":"../public");console.log("[INFO] Server starting...");console.log(`[INFO] Working Directory: ${T}`);var $0={stats:{totalXp:0,currentStreak:0,longestStreak:0,lastActiveDate:null},exercises:{},quizzes:{},achievements:[]};async function G(){try{if(await M(c)){let J=await E(c,"utf-8");return JSON.parse(J)}return null}catch(J){return console.warn(`[WARN] Failed to read course.json: ${J}`),null}}async function f(){let J=null;try{if(await M(_)){let X=await E(_,"utf-8");J=JSON.parse(X),console.log(`[PROGRESS] Loaded local progress. XP: ${J?.stats.totalXp}`)}else console.log(`[PROGRESS] No local progress file found at ${_}`)}catch(X){console.warn(`[WARN] Failed to read progress.json: ${X}`)}let V=await i();if(V?.token&&W?.id){console.log(`[PROGRESS] Checking cloud for course ${W.id}`);let X=await z0(W.id,V.token);if(X)if(console.log(`[SYNC] Found cloud progress. Cloud XP: ${X.stats.totalXp}, Local XP: ${J?.stats.totalXp||0}`),!J||X.stats.totalXp>(J?.stats.totalXp||0))console.log("[SYNC] Updating local progress with cloud data."),J=X,await p(O,{recursive:!0}),await x(_,JSON.stringify(J,null,2));else console.log("[SYNC] Local progress is ahead or equal. Keeping local.");else console.log("[SYNC] No cloud progress found.")}return J||JSON.parse(JSON.stringify($0))}async function a(J){console.log(`[PROGRESS] Saving progress... XP: ${J.stats.totalXp}`);try{await p(O,{recursive:!0}),await x(_,JSON.stringify(J,null,2)),console.log(`[PROGRESS] Saved to ${_}`);let V=await i();if(V?.token&&W?.id)console.log("[PROGRESS] Triggering background cloud sync..."),Q0(W.id,J,V.token)}catch(V){console.error(`[ERROR] Failed to save progress.json: ${V}`)}}async function i(){if(await M(N))return JSON.parse(await E(N,"utf-8"));return null}async function Q0(J,V,X){let $=process.env.PROGY_API_URL||"https://progy.francy.workers.dev";try{console.log(`[SYNC] Syncing ${J} to cloud...`);let Z=await fetch(`${$}/api/progress/sync`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${X}`},body:JSON.stringify({courseId:J,data:V})});if(Z.ok)console.log(`[SYNC] Successfully synced ${J} progress.`);else console.warn(`[SYNC] Cloud sync failed: ${Z.status}`)}catch(Z){console.error(`[SYNC] Connection error during sync: ${Z}`)}}async function z0(J,V){let X=process.env.PROGY_API_URL||"https://progy.francy.workers.dev";try{let $=new AbortController,Z=setTimeout(()=>$.abort(),3000),K=await fetch(`${X}/api/progress/get?courseId=${J}`,{signal:$.signal,headers:{Authorization:`Bearer ${V}`}});if(clearTimeout(Z),K.ok)return await K.json()}catch($){if($.name==="AbortError")console.warn("[SYNC] Cloud fetch timed out after 3s.");else console.error(`[SYNC] Failed to fetch progress from cloud: ${$}`)}return null}function n(J){let X=new Date().toISOString().split("T")[0];if(J.lastActiveDate===X)return J;let $=new Date;$.setDate($.getDate()-1);let Z=$.toISOString().split("T")[0];if(J.lastActiveDate===Z)J.currentStreak+=1;else J.currentStreak=1;if(J.currentStreak>J.longestStreak)J.longestStreak=J.currentStreak;return J.lastActiveDate=X,J}async function t(J){console.log("[INFO] Scanning exercises...");try{if(g&&Date.now()-o<5000)return g;let V=J.content.exercises,X=v(T,V);if(!await M(X))return console.warn(`[WARN] Exercises directory not found at ${X}`),{};let Z=(await h(X)).filter((Q)=>!Q.startsWith(".")&&Q!=="README.md"&&Q!=="mod.rs"&&Q!=="practice");Z.sort((Q,Y)=>{let z=parseInt(Q.split("_")[0]||"999"),b=parseInt(Y.split("_")[0]||"999");return z-b});let K={},q=(Q)=>Q.replace(/_/g," ").replace(/([a-zA-Z])(\d+)/g,"$1 $2").replace(/\b\w/g,(Y)=>Y.toUpperCase());async function k(Q,Y,z,b,H,B,w){let A=q(z);if(H[z]?.title)A=H[z].title;let R=v(B,Y.name);if(Y.isDirectory()){let j=["exercise.rs","main.rs","index.ts","main.go","index.js"];for(let L of j){let U=v(R,L);if(await M(U)){R=U;break}}}if(await M(R)&&(await Bun.file(R).stat()).isFile())try{let L=(await E(R,"utf-8")).match(/\/\/\s*(?:Title|title):\s*(.+)/);if(L&&L[1])A=L[1].trim()}catch(j){}let y={id:`${Q}/${Y.name}`,module:Q,moduleTitle:b,name:Y.name,exerciseName:z,friendlyName:A,path:v(B,Y.name)};if(Y.isDirectory()){let j=v(B,Y.name,"quiz.json"),L=await M(j);if(L)console.log(`[DEBUG] Found quiz at ${j}`);w[Q].push({...y,markdownPath:v(B,Y.name,"README.md"),hasQuiz:L,type:"directory"})}else if(Y.isFile()){if(Y.name.endsWith(".test.ts")||Y.name==="package.json")return;w[Q].push({...y,markdownPath:null,type:"file"})}}for(let Q of Z){let Y=v(X,Q);if((await Bun.file(Y).stat()).isDirectory()){K[Q]=[];let b=await h(Y,{withFileTypes:!0}),H=q(Q),B={},w=v(Y,"info.toml");if(await M(w))try{let U=await E(w,"utf-8"),D=Bun.TOML.parse(U);if(D.module?.message)H=D.module.message;if(Array.isArray(D.exercises)){for(let I of D.exercises)if(I.name)B[I.name]=I}else if(D.exercises&&typeof D.exercises==="object")for(let[I,F]of Object.entries(D.exercises))B[I]=typeof F==="string"?{title:F}:F}catch(U){console.warn(`[WARN] Failed to parse info.toml in ${Q}: ${U}`)}let A=(U)=>{let D=U.match(/^(\d+)_/);return D?parseInt(D[1]||"0"):9999},R=new Map;for(let U of b){if(U.name.startsWith(".")||U.name==="README.md"||U.name==="mod.rs"||U.name==="info.toml")continue;let D=U.name.split(".")[0]||"";R.set(D,U)}let y=Object.keys(B),j=new Set;for(let U of y){let D=R.get(U);if(!D)continue;j.add(U),await k(Q,D,U,H,B,Y,K)}let L=b.filter((U)=>{let D=U.name.split(".")[0]||"";return!j.has(D)&&!U.name.startsWith(".")&&U.name!=="README.md"&&U.name!=="mod.rs"&&U.name!=="info.toml"});L.sort((U,D)=>{let I=A(U.name||""),F=A(D.name||"");if(I!==F)return I-F;return(U.name||"").localeCompare(D.name||"")});for(let U of L){let D=U.name.split(".")[0]||"";await k(Q,U,D,H,B,Y,K)}}}let S=v(X,"practice");if(await M(S)){K.practice=[];let Q=await h(S);for(let Y of Q)if(Y.endsWith(".rs")||Y.endsWith(".ts")||Y.endsWith(".js")||Y.endsWith(".go"))K.practice.push({id:`practice/${Y}`,module:"practice",name:Y,exerciseName:Y.split(".")[0],path:v(S,Y),markdownPath:null,type:"file"})}return await p(O,{recursive:!0}),await x(Z0,JSON.stringify(K,null,2)),g=K,o=Date.now(),K}catch(V){return console.error("[ERROR] Manifest generation failed:",V),{}}}async function U0(J){let V=[];for(let X of J.checks)if(X.type==="command")try{let $=X.command.split(" "),Z=$[0];if(!Z)continue;let K=$.slice(1),q=u(Z,K,{stdio:"ignore"}),k=await new Promise((S)=>{q.on("close",(Q)=>S(Q===0)),q.on("error",()=>S(!1))});V.push({name:X.name,status:k?"pass":"fail",message:k?"Found":"Not found or failed"})}catch($){V.push({name:X.name,status:"fail",message:String($)})}return V}var C=null,W=null,g=null,o=0;G().then(async(J)=>{if(W=J,J&&J.id&&J.content&&J.content.exercises)console.log(`[INIT] Loaded config for ${J.id}`),C=await t(J);else if(J)console.error("[INIT] course.json is missing required fields (id, content.exercises)");else console.warn("[INIT] No valid course.json found")});function W0(J,V){try{let Z=null,K=J.match(/__SRP_BEGIN__\s*([\s\S]*?)\s*__SRP_END__/);if(K&&K[1])Z=K[1].trim();else{let q=J.match(/\{[\s\S]*\}/g);if(q&&q.length>0)Z=q[q.length-1]?.trim()??null}if(Z){let q=Z.indexOf("{"),k=Z.lastIndexOf("}");if(q!==-1&&k!==-1){let S=Z.substring(q,k+1),Q=JSON.parse(S),Y=`## ${Q.success?"\u2705 Success":"\u274C Failed"}
2
+ var ce=Object.create;var{getPrototypeOf:ue,defineProperty:W,getOwnPropertyNames:pe}=Object;var le=Object.prototype.hasOwnProperty;var Le=(e,s,t)=>{t=e!=null?ce(ue(e)):{};let n=s||!e||!e.__esModule?W(t,"default",{value:e,enumerable:!0}):t;for(let o of pe(e))if(!le.call(n,o))W(n,o,{get:()=>e[o],enumerable:!0});return n};var be=(e,s)=>()=>(s||e((s={exports:{}}).exports,s),s.exports);var ze=import.meta.require;var{serve:Fe}=globalThis.Bun;import{join as G}from"path";var J={"/api/health":Response.json({status:"ok"})};import{readdir as L,readFile as v,writeFile as Y,mkdir as Q,exists as P}from"fs/promises";import{join as d}from"path";import{homedir as fe}from"os";import{spawn as de}from"child_process";var j=process.env.PROG_CWD||process.cwd(),me=d(fe(),".progy"),B=d(me,"config.json"),q=d(j,"course.json"),_=d(j,".progy"),ge=d(_,"exercises.json"),A=d(_,"progress.json"),V=process.env.PROGY_OFFLINE==="true",I={stats:{totalXp:0,currentStreak:0,longestStreak:0,lastActiveDate:null},exercises:{},quizzes:{},achievements:[]},u=null,b=null,U=0;async function ye(){try{if(await P(q)){let e=await v(q,"utf-8");return JSON.parse(e)}return null}catch(e){return console.warn(`[WARN] Failed to read course.json: ${e}`),null}}async function R(){if(!u)u=await ye();return u}async function Z(){if(await P(B))return JSON.parse(await v(B,"utf-8"));return null}async function k(){if(V){try{if(await P(A)){let s=await v(A,"utf-8"),t=JSON.parse(s);return console.log(`[OFFLINE] Loaded local progress. XP: ${t?.stats.totalXp}`),t}}catch(s){console.warn(`[WARN] Failed to read ${A}: ${s}`)}return JSON.parse(JSON.stringify(I))}await R();let e=await Z();if(e?.token&&u?.id){console.log(`[ONLINE] Fetching progress for ${u.id}...`);try{let s=await he(u.id,e.token);if(s)return console.log(`[ONLINE] Loaded cloud progress. XP: ${s.stats.totalXp}`),s;else return console.log("[ONLINE] No existing cloud progress found. Returning default."),JSON.parse(JSON.stringify(I))}catch(s){return console.error(`[CRITICAL] Failed to fetch cloud progress: ${s}`),JSON.parse(JSON.stringify(I))}}return JSON.parse(JSON.stringify(I))}async function $(e){if(V){try{await Q(_,{recursive:!0}),await Y(A,JSON.stringify(e,null,2))}catch(t){console.error(`[ERROR] Failed to save local progress: ${t}`)}return}await R();let s=await Z();if(s?.token&&u?.id)await we(u.id,e,s.token)}async function we(e,s,t){let n=process.env.PROGY_API_URL||"https://progy.francy.workers.dev";try{let o=await fetch(`${n}/api/progress/sync`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${t}`},body:JSON.stringify({courseId:e,data:s})});if(o.ok)console.log("[ONLINE] Successfully saved to cloud.");else console.warn(`[ONLINE] Cloud save failed: ${o.status}`)}catch(o){console.error(`[ONLINE] Connection error during save: ${o}`)}}async function he(e,s){let t=process.env.PROGY_API_URL||"https://progy.francy.workers.dev";try{let n=await fetch(`${t}/api/progress/get?courseId=${e}`,{headers:{Authorization:`Bearer ${s}`}});if(n.ok)return await n.json();if(n.status===404)return null;throw Error(`Cloud fetch failed with ${n.status}`)}catch(n){throw n}}function F(e){let s=new Date().toISOString().split("T")[0];if(e.lastActiveDate===s)return e;let t=new Date;t.setDate(t.getDate()-1);let n=t.toISOString().split("T")[0];if(e.lastActiveDate===n)e.currentStreak+=1;else e.currentStreak=1;if(e.currentStreak>e.longestStreak)e.longestStreak=e.currentStreak;return e.lastActiveDate=s,e}var X=(e)=>e.replace(/_/g," ").replace(/([a-zA-Z])(\d+)/g,"$1 $2").replace(/\b\w/g,(s)=>s.toUpperCase());async function K(e){if(b&&Date.now()-U<5000)return b;let s=e.content.exercises,t=d(j,s);if(!await P(t))return{};let o=(await L(t)).filter((i)=>!i.startsWith(".")&&i!=="README.md"&&i!=="mod.rs"&&i!=="practice");o.sort((i,r)=>{let w=parseInt(i.split("_")[0]||"999"),g=parseInt(r.split("_")[0]||"999");return w-g});let c={};async function m(i,r,w,g,h,l,S){let y=X(w);if(h[w]?.title)y=h[w].title;let x=d(l,r.name);if(r.isDirectory()){let C=["exercise.rs","main.rs","index.ts","main.go","index.js"];for(let O of C){let a=d(x,O);if(await P(a)){x=a;break}}}if(await P(x)&&(await Bun.file(x).stat()).isFile())try{let O=(await v(x,"utf-8")).match(/\/\/\s*(?:Title|title):\s*(.+)/);if(O&&O[1])y=O[1].trim()}catch{}let E={id:`${i}/${r.name}`,module:i,moduleTitle:g,name:r.name,exerciseName:w,friendlyName:y,path:d(l,r.name)};if(r.isDirectory()){let C=d(l,r.name,"quiz.json");S[i].push({...E,markdownPath:d(l,r.name,"README.md"),hasQuiz:await P(C),type:"directory"})}else if(r.isFile()){if(r.name.endsWith(".test.ts")||r.name==="package.json")return;S[i].push({...E,markdownPath:null,type:"file"})}}for(let i of o){let r=d(t,i);if((await Bun.file(r).stat()).isDirectory()){c[i]=[];let g=await L(r,{withFileTypes:!0}),h=X(i),l={},S=d(r,"info.toml");if(await P(S))try{let a=await v(S,"utf-8"),f=Bun.TOML.parse(a);if(f.module?.message)h=f.module.message;if(Array.isArray(f.exercises)){for(let N of f.exercises)if(N.name)l[N.name]=N}else if(f.exercises&&typeof f.exercises==="object")for(let[N,T]of Object.entries(f.exercises))l[N]=typeof T==="string"?{title:T}:T}catch(a){console.warn(`[WARN] Failed to parse info.toml: ${a}`)}let y=(a)=>{let f=a.match(/^(\d+)_/);return f?parseInt(f[1]||"0"):9999},x=new Map;for(let a of g){if(a.name.startsWith(".")||a.name==="README.md"||a.name==="mod.rs"||a.name==="info.toml")continue;x.set(a.name.split(".")[0]||"",a)}let E=Object.keys(l),C=new Set;for(let a of E){let f=x.get(a);if(f)C.add(a),await m(i,f,a,h,l,r,c)}let O=g.filter((a)=>{let f=a.name.split(".")[0]||"";return!C.has(f)&&!a.name.startsWith(".")&&a.name!=="README.md"&&a.name!=="mod.rs"&&a.name!=="info.toml"});O.sort((a,f)=>{let N=y(a.name||""),T=y(f.name||"");return N!==T?N-T:(a.name||"").localeCompare(f.name||"")});for(let a of O)await m(i,a,a.name.split(".")[0]||"",h,l,r,c)}}let p=d(t,"practice");if(await P(p)){c.practice=[];let i=await L(p);for(let r of i)if(r.endsWith(".rs")||r.endsWith(".ts")||r.endsWith(".js")||r.endsWith(".go"))c.practice.push({id:`practice/${r}`,module:"practice",name:r,exerciseName:r.split(".")[0],path:d(p,r),markdownPath:null,type:"file"})}return await Q(_,{recursive:!0}),await Y(ge,JSON.stringify(c,null,2)),b=c,U=Date.now(),c}async function ee(e){let s=[];for(let t of e.checks)if(t.type==="command")try{let n=t.command.split(" "),o=n[0];if(!o)continue;let c=de(o,n.slice(1),{stdio:"ignore"}),m=await new Promise((p)=>{c.on("close",(i)=>p(i===0)),c.on("error",()=>p(!1))});s.push({name:t.name,status:m?"pass":"fail",message:m?"Found":"Not found"})}catch(n){s.push({name:t.name,status:"fail",message:String(n)})}return s}function se(e,s){try{let n=null,o=e.match(/__SRP_BEGIN__\s*([\s\S]*?)\s*__SRP_END__/);if(o&&o[1])n=o[1].trim();else{let c=e.match(/\{[\s\S]*\}/g);if(c&&c.length>0)n=c[c.length-1]?.trim()??null}if(n){let c=n.indexOf("{"),m=n.lastIndexOf("}");if(c!==-1&&m!==-1){let p=JSON.parse(n.substring(c,m+1)),i=`## ${p.success?"\u2705 Success":"\u274C Failed"}
3
3
 
4
- `;if(Y+=`> ${Q.summary||(Q.success?"All checks passed":"Some issues were found")}
4
+ > ${p.summary}
5
5
 
6
- `,Q.diagnostics&&Q.diagnostics.length>0){Y+=`### \uD83D\uDCCD Diagnostics
6
+ `;if(p.diagnostics?.length){i+=`### \uD83D\uDCCD Diagnostics
7
7
 
8
- `;for(let z of Q.diagnostics){let b=z.severity==="error"?"\u274C":z.severity==="warning"?"\u26A0\uFE0F":"\u2139\uFE0F";if(Y+=`#### ${b} ${z.severity.toUpperCase()}
9
- `,Y+=`**${z.message}**
10
- `,z.file)Y+=`\`${z.file}:${z.line||0}:${z.column||0}\`
8
+ `;for(let r of p.diagnostics){if(i+=`#### ${r.severity==="error"?"\u274C":"\u26A0\uFE0F"} ${r.severity.toUpperCase()}
9
+ **${r.message}**
10
+ `,r.file)i+=`\`${r.file}:${r.line||0}\`
11
11
 
12
- `;if(z.snippet)Y+=`\`\`\`rust
13
- ${z.snippet}
12
+ `;if(r.snippet)i+=`\`\`\`rust
13
+ ${r.snippet}
14
14
  \`\`\`
15
15
 
16
- `;if(z.suggestion)Y+=`> \uD83D\uDCA1 **Suggestion:**
17
- `,Y+=`> \`\`\`rust
18
- > ${z.suggestion}
19
- > \`\`\`
16
+ `;i+=`---
20
17
 
21
- `;Y+=`---
18
+ `}}if(p.tests?.length){i+=`### \uD83E\uDDEA Tests
22
19
 
23
- `}}if(Q.tests&&Q.tests.length>0){Y+=`### \uD83E\uDDEA Tests
24
-
25
- `;for(let z of Q.tests){let b=z.status==="pass"?"\u2705":"\u274C";if(Y+=`- ${b} **${z.name}**
26
- `,z.message)Y+=` > ${z.message.replace(/\n/g,`
20
+ `;for(let r of p.tests)i+=`- ${r.status==="pass"?"\u2705":"\u274C"} **${r.name}**
21
+ ${r.message?` > ${r.message.replace(/\n/g,`
27
22
  > `)}
28
23
 
29
- `}}return{success:Q.success,output:Q.raw.trim(),friendlyOutput:Y}}}}catch(Z){}let X=V===0&&!J.includes("\u274C"),$=X?`\u2705 All tests passed!
24
+ `:""}`}return{success:p.success,output:p.raw.trim(),friendlyOutput:i}}}}catch{}let t=s===0&&!e.includes("\u274C");return{success:t,output:e,friendlyOutput:(t?`\u2705 Success
30
25
 
31
- `:`\u274C Issues detected during execution.
26
+ `:`\u274C Failed
32
27
 
33
- `;return $+=J,{success:X,output:J,friendlyOutput:$}}var v0=V0({port:3001,routes:{"/api/health":d,"/":()=>new Response(Bun.file(v(P,"index.html"))),"/main.js":()=>new Response(Bun.file(v(P,"main.js"))),"/main.css":()=>new Response(Bun.file(v(P,"main.css"))),"/api/progress":{async GET(){return Response.json(await f())}},"/api/progress/update":{async POST(J){try{let{type:V,id:X,success:$}=await J.json();if(!X)return Response.json({success:!1,error:"Missing ID"});let Z=await f(),K=new Date().toISOString();if(V==="quiz"&&$){if(!Z.quizzes[X])Z.quizzes[X]={passed:!0,xpEarned:10,completedAt:K},Z.stats.totalXp+=10,Z.stats=n(Z.stats),await a(Z)}return Response.json({success:!0,progress:Z})}catch(V){return Response.json({success:!1,error:String(V)})}}},"/api/config":{async GET(){if(!W)W=await G();return Response.json({...W||{},remoteApiUrl:process.env.PROGY_API_URL||"https://progy.francy.workers.dev"})}},"/api/exercises":{async GET(){if(!W)W=await G();if(!W)return Response.json({error:"No config"});if(C=await t(W),Array.isArray(C))return Response.json({});return Response.json(C)}},"/api/exercises/quiz":{async GET(J){let X=new URL(J.url).searchParams.get("path");if(!X)return new Response("Missing path",{status:400});let $=v(X,"quiz.json");try{if(await M($)){let Z=await E($,"utf-8");return Response.json(JSON.parse(Z))}return Response.json({error:"Quiz not found"},{status:404})}catch(Z){return Response.json({error:"Invalid quiz file"},{status:500})}}},"/api/exercises/code":{async GET(J){let V=new URL(J.url),X=V.searchParams.get("path"),$=V.searchParams.get("markdownPath");if(!X)return new Response("Missing path",{status:400});try{let Z="";if((await Bun.file(X).stat()).isDirectory()){let k=["exercise.rs","main.rs","index.ts","main.go","index.js"];for(let S of k){let Q=v(X,S);if(await M(Q)){Z=await E(Q,"utf-8");break}}if(!Z)Z="// No entry file found"}else Z=await E(X,"utf-8");let q=null;if($&&await M($))q=await E($,"utf-8");return Response.json({code:Z,markdown:q})}catch(Z){return Response.json({error:"File not found"},{status:404})}}},"/api/exercises/run":{async POST(J){try{if(!W)W=await G();let V=await J.json(),{exerciseName:X,id:$}=V,K=($?.split("/")||[])[0]||"",q=W.runner.command,k=W.runner.args.map((Y)=>Y.replace("{{exercise}}",X).replace("{{id}}",$||"").replace("{{module}}",K)),Q=(W.runner.cwd?v(T,W.runner.cwd):T).replace("{{exercise}}",X).replace("{{id}}",$||"").replace("{{module}}",K);return new Promise((Y)=>{let z=u(q,k,{cwd:Q,stdio:["ignore","pipe","pipe"],env:{...process.env,FORCE_COLOR:"1"}}),b="";if(z.stdout)z.stdout.on("data",(H)=>b+=H.toString());if(z.stderr)z.stderr.on("data",(H)=>b+=H.toString());z.on("close",async(H)=>{let B=W0(b,H||0);if(B.success&&V.id){let w=await f();if(!w.exercises[V.id])w.exercises[V.id]={status:"pass",xpEarned:20,completedAt:new Date().toISOString()},w.stats.totalXp+=20,w.stats=n(w.stats),await a(w)}Y(Response.json({success:B.success,output:B.output||"No output",friendlyOutput:B.friendlyOutput}))}),z.on("error",(H)=>Y(Response.json({success:!1,output:H.message})))})}catch(V){return Response.json({success:!1,output:String(V)})}}},"/api/ai/hint":{async POST(J){return Response.json({hint:"Thinking..."})}},"/api/setup/status":{async GET(){if(!W)W=await G();if(!W||!W.setup)return Response.json({success:!0,checks:[]});let J=await U0(W.setup),V=J.every((X)=>X.status==="pass");return Response.json({success:V,checks:J})}},"/api/setup/guide":{async GET(){if(!W)W=await G();if(!W||!W.setup?.guide)return Response.json({markdown:"# No setup guide available"});let J=v(T,W.setup.guide);if(await M(J)){let V=await E(J,"utf-8");return Response.json({markdown:V})}return Response.json({markdown:"# Setup guide not found"})}},"/api/auth/token":{async GET(){try{if(await M(N)){let J=JSON.parse(await E(N,"utf-8"));return console.log(`[AUTH] Local token found: ${J.token?"Yes":"No"}`),Response.json({token:J.token||null})}}catch(J){console.error(`[AUTH] Error reading global config: ${J}`)}return Response.json({token:null})},async POST(){try{if(await M(N)){let J=JSON.parse(await E(N,"utf-8"));delete J.token,await x(N,JSON.stringify(J,null,2)),console.log("[AUTH] Local token cleared.")}return Response.json({success:!0})}catch(J){return Response.json({success:!1,error:String(J)},{status:500})}}},"/api/local-settings":{async GET(){try{if(await M(N)){let J=JSON.parse(await E(N,"utf-8")),{token:V,...X}=J;return Response.json(X)}}catch(J){}return Response.json({})},async POST(J){try{let V=await J.json(),X={};if(await M(N))X=JSON.parse(await E(N,"utf-8"));else if(!await M(m))await p(m,{recursive:!0});return Object.assign(X,V),await x(N,JSON.stringify(X,null,2)),Response.json({success:!0})}catch(V){return Response.json({success:!1,error:String(V)},{status:500})}}},"/api/ide/open":{async POST(J){try{let{path:V}=await J.json();if(!V)return Response.json({success:!1,error:"Missing path"},{status:400});try{if((await X0(V)).isDirectory()){let k=["exercise.rs","main.rs","main.go","index.ts","index.js","App.tsx"];for(let S of k){let Q=v(V,S);if(await M(Q)){V=Q;break}}}}catch(q){}let X="vs-code";if(await M(N))try{let q=JSON.parse(await E(N,"utf-8"));if(q.ide)X=q.ide}catch(q){}let $="code",Z=[V];switch(X){case"vs-code":$="code";break;case"cursor":$="cursor";break;case"zed":$="zed";break;case"antigravity":$="antigravity";break;case"vim":$="vim";break}return console.log(`[IDE] Opening ${V} with ${$}`),u($,Z,{detached:!0,stdio:"ignore",shell:!0}).unref(),Response.json({success:!0})}catch(V){return console.error(`[IDE] Failed to open: ${V}`),Response.json({success:!1,error:String(V)},{status:500})}}}},development:{hmr:process.env.ENABLE_HMR==="true"},fetch(J){return new Response("Not Found",{status:404})}});console.log(`\uD83D\uDE80 Progy Server running on ${v0.url}`);
28
+ `)+e}}var Se=async()=>{return Response.json(await k())},Re=async(e)=>{try{let{type:s,id:t,success:n}=await e.json();if(!t)return Response.json({success:!1,error:"Missing ID"});let o=await k(),c=new Date().toISOString();if(s==="quiz"&&n){if(!o.quizzes[t])o.quizzes[t]={passed:!0,xpEarned:10,completedAt:c},o.stats.totalXp+=10,o.stats=F(o.stats),await $(o)}return Response.json({success:!0,progress:o})}catch(s){return Response.json({success:!1,error:String(s)})}},te={"/api/progress":{GET:Se},"/api/progress/update":{POST:Re}};var Pe=async()=>{return await R(),Response.json({...u||{},remoteApiUrl:process.env.PROGY_API_URL||"https://progy.francy.workers.dev"})},re={"/api/config":{GET:Pe}};import{readFile as D,exists as z}from"fs/promises";import{join as M}from"path";import{spawn as xe}from"child_process";var Oe=async()=>{if(await R(),!u)return Response.json({error:"No config"});let e=await K(u);return Response.json(Array.isArray(e)?{}:e)},Ne=async(e)=>{let t=new URL(e.url).searchParams.get("path");if(!t)return new Response("Missing path",{status:400});let n=M(t,"quiz.json");try{if(await z(n)){let o=await D(n,"utf-8");return Response.json(JSON.parse(o))}return Response.json({error:"Quiz not found"},{status:404})}catch(o){return Response.json({error:"Invalid quiz file"},{status:500})}},je=async(e)=>{let s=new URL(e.url),t=s.searchParams.get("path"),n=s.searchParams.get("markdownPath");if(!t)return new Response("Missing path",{status:400});try{let o="";if((await Bun.file(t).stat()).isDirectory()){let p=["exercise.rs","main.rs","index.ts","main.go","index.js"];for(let i of p){let r=M(t,i);if(await z(r)){o=await D(r,"utf-8");break}}if(!o)o="// No entry file found"}else o=await D(t,"utf-8");let m=null;if(n&&await z(n))m=await D(n,"utf-8");return Response.json({code:o,markdown:m})}catch(o){return Response.json({error:"File not found"},{status:404})}},Ce=async(e)=>{try{await R();let s=await e.json(),{exerciseName:t,id:n}=s,c=(n?.split("/")||[])[0]||"",m=u.runner.command,p=u.runner.args.map((w)=>w.replace("{{exercise}}",t).replace("{{id}}",n||"").replace("{{module}}",c)),r=(u.runner.cwd?M(j,u.runner.cwd):j).replace("{{exercise}}",t).replace("{{id}}",n||"").replace("{{module}}",c);return new Promise((w)=>{let g=xe(m,p,{cwd:r,stdio:["ignore","pipe","pipe"],env:{...process.env,FORCE_COLOR:"1"}}),h="";if(g.stdout)g.stdout.on("data",(l)=>h+=l.toString());if(g.stderr)g.stderr.on("data",(l)=>h+=l.toString());g.on("close",async(l)=>{let S=se(h,l||0);if(S.success&&s.id){let y=await k();if(!y.exercises[s.id])y.exercises[s.id]={status:"pass",xpEarned:20,completedAt:new Date().toISOString()},y.stats.totalXp+=20,y.stats=F(y.stats),await $(y)}w(Response.json({success:S.success,output:S.output||"No output",friendlyOutput:S.friendlyOutput}))}),g.on("error",(l)=>w(Response.json({success:!1,output:l.message})))})}catch(s){return Response.json({success:!1,output:String(s)})}},ne={"/api/exercises":{GET:Oe},"/api/exercises/quiz":{GET:Ne},"/api/exercises/code":{GET:je},"/api/exercises/run":{POST:Ce}};import{readFile as Te,exists as ve}from"fs/promises";import{join as ke}from"path";var Ee=async()=>{if(await R(),!u||!u.setup)return Response.json({success:!0,checks:[]});let e=await ee(u.setup);return Response.json({success:e.every((s)=>s.status==="pass"),checks:e})},Ie=async()=>{if(await R(),!u||!u.setup?.guide)return Response.json({markdown:"# No setup guide available"});let e=ke(j,u.setup.guide);if(await ve(e)){let s=await Te(e,"utf-8");return Response.json({markdown:s})}return Response.json({markdown:"# Setup guide not found"})},oe={"/api/setup/status":{GET:Ee},"/api/setup/guide":{GET:Ie}};var Ae=async()=>{return Response.json({hint:"Thinking..."})},ie={"/api/ai/hint":{POST:Ae}};import{spawn as _e}from"child_process";var $e=async(e)=>{try{let{path:s}=await e.json();if(!s)return Response.json({success:!1,error:"Missing path"});console.log(`[IDE] Opening ${s} in VS Code...`);let t=_e("code",[s],{shell:!0});return new Promise((n)=>{t.on("error",(o)=>{console.error(`[IDE] Failed to spawn 'code': ${o}`),n(Response.json({success:!1,error:"VS Code not found in PATH"}))}),t.on("spawn",()=>{n(Response.json({success:!0}))})})}catch(s){return console.error(`[IDE] Failed to open: ${s}`),Response.json({success:!1,error:String(s)},{status:500})}},ae={"/api/ide/open":{POST:$e}};var De=import.meta.file.endsWith(".ts"),H=G(import.meta.dir,De?"../../public":"../public");console.log("[INFO] Server starting...");var Ge=Fe({port:3001,routes:{"/":()=>new Response(Bun.file(G(H,"index.html"))),"/main.js":()=>new Response(Bun.file(G(H,"main.js"))),"/main.css":()=>new Response(Bun.file(G(H,"main.css"))),...J,...te,...re,...ne,...oe,...ie,...ae},development:{hmr:process.env.ENABLE_HMR==="true"},fetch(e){return new Response("Not Found",{status:404})}});console.log(`\uD83D\uDE80 Progy Server running on ${Ge.url}`);
package/dist/cli.js CHANGED
@@ -1,27 +1,27 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var tq=Object.create;var{getPrototypeOf:sq,defineProperty:Vq,getOwnPropertyNames:eq}=Object;var aq=Object.prototype.hasOwnProperty;var e=(q,Q,Y)=>{Y=q!=null?tq(sq(q)):{};let X=Q||!q||!q.__esModule?Vq(Y,"default",{value:q,enumerable:!0}):Y;for(let J of eq(q))if(!aq.call(X,J))Vq(X,J,{get:()=>q[J],enumerable:!0});return X};var D=(q,Q)=>()=>(Q||q((Q={exports:{}}).exports,Q),Q.exports);var R=import.meta.require;var k=D((qQ)=>{class a 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 Iq extends a{constructor(q){super(1,"commander.invalidArgument",q);Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}}qQ.CommanderError=a;qQ.InvalidArgumentError=Iq});var m=D((WQ)=>{var{InvalidArgumentError:XQ}=k();class jq{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 XQ(`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 JQ(q){let Q=q.name()+(q.variadic===!0?"...":"");return q.required?"<"+Q+">":"["+Q+"]"}WQ.Argument=jq;WQ.humanReadableArgName=JQ});var qq=D((KQ)=>{var{humanReadableArgName:HQ}=m();class Nq{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)=>HQ(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(U,P){if(P){let N=`${U.padEnd(Y+2)}${P}`;return Q.wrap(N,X-2,Y+2)}return U}function z(U){return U.join(`
3
+ var aq=Object.create;var{getPrototypeOf:qQ,defineProperty:jq,getOwnPropertyNames:QQ}=Object;var YQ=Object.prototype.hasOwnProperty;var e=(q,Q,Y)=>{Y=q!=null?aq(qQ(q)):{};let X=Q||!q||!q.__esModule?jq(Y,"default",{value:q,enumerable:!0}):Y;for(let J of QQ(q))if(!YQ.call(X,J))jq(X,J,{get:()=>q[J],enumerable:!0});return X};var D=(q,Q)=>()=>(Q||q((Q={exports:{}}).exports,Q),Q.exports);var R=import.meta.require;var C=D((XQ)=>{class a 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 Nq extends a{constructor(q){super(1,"commander.invalidArgument",q);Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}}XQ.CommanderError=a;XQ.InvalidArgumentError=Nq});var l=D((HQ)=>{var{InvalidArgumentError:zQ}=C();class wq{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 zQ(`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 GQ(q){let Q=q.name()+(q.variadic===!0?"...":"");return q.required?"<"+Q+">":"["+Q+"]"}HQ.Argument=wq;HQ.humanReadableArgName=GQ});var qq=D((UQ)=>{var{humanReadableArgName:LQ}=l();class Aq{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)=>LQ(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(U,P){if(P){let N=`${U.padEnd(Y+2)}${P}`;return Q.wrap(N,X-2,Y+2)}return U}function z(U){return U.join(`
4
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((U)=>{return G(Q.argumentTerm(U),Q.argumentDescription(U))});if(B.length>0)H=H.concat(["Arguments:",z(B),""]);let L=Q.visibleOptions(q).map((U)=>{return G(Q.optionTerm(U),Q.optionDescription(U))});if(L.length>0)H=H.concat(["Options:",z(L),""]);if(this.showGlobalOptions){let U=Q.visibleGlobalOptions(q).map((P)=>{return G(Q.optionTerm(P),Q.optionDescription(P))});if(U.length>0)H=H.concat(["Global Options:",z(U),""])}let $=Q.visibleCommands(q).map((U)=>{return G(Q.subcommandTerm(U),Q.subcommandDescription(U))});if($.length>0)H=H.concat(["Commands:",z($),""]);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"}`,$=new RegExp(`
8
8
  |.{1,${G-1}}([${L}]|$)|[^${L}]+?([${L}]|$)`,"g"),U=H.match($)||[];return z+U.map((P,N)=>{if(P===`
9
9
  `)return"";return(N>0?K:"")+P.trimEnd()}).join(`
10
- `)}}KQ.Help=Nq});var Qq=D((PQ)=>{var{InvalidArgumentError:LQ}=k();class wq{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=$Q(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 LQ(`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 UQ(this.name().replace(/^no-/,""))}is(q){return this.short===q||this.long===q}isBoolean(){return!this.required&&!this.optional&&!this.negate}}class Aq{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 UQ(q){return q.split("-").reduce((Q,Y)=>{return Q+Y[0].toUpperCase()+Y.slice(1)})}function $Q(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}}PQ.Option=wq;PQ.DualOptions=Aq});var Dq=D((NQ)=>{function IQ(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 jQ(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=IQ(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`
10
+ `)}}UQ.Help=Aq});var Qq=D((IQ)=>{var{InvalidArgumentError:PQ}=C();class Dq{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=VQ(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 PQ(`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 EQ(this.name().replace(/^no-/,""))}is(q){return this.short===q||this.long===q}isBoolean(){return!this.required&&!this.optional&&!this.negate}}class Rq{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 EQ(q){return q.split("-").reduce((Q,Y)=>{return Q+Y[0].toUpperCase()+Y.slice(1)})}function VQ(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=Dq;IQ.DualOptions=Rq});var Fq=D((DQ)=>{function wQ(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 AQ(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=wQ(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""}NQ.suggestSimilar=jQ});var Mq=D((MQ)=>{var AQ=R("events").EventEmitter,Yq=R("child_process"),w=R("path"),Xq=R("fs"),E=R("process"),{Argument:DQ,humanReadableArgName:RQ}=m(),{CommanderError:Jq}=k(),{Help:FQ}=qq(),{Option:Rq,DualOptions:SQ}=Qq(),{suggestSimilar:Fq}=Dq();class Wq extends AQ{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 Wq(q)}createHelp(){return Object.assign(new FQ,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
- - 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 DQ(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 Jq(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 Rq(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 Rq)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(Xq.existsSync(L))return L;if(X.includes(w.extname(B)))return;let $=X.find((U)=>Xq.existsSync(`${L}${U}`));if($)return`${L}${$}`;return}this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let W=q._executableFile||`${this._name}-${q._name}`,G=this._executableDir||"";if(this._scriptPath){let K;try{K=Xq.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=Sq(E.execArgv).concat(Q),z=Yq.spawn(E.argv[0],Q,{stdio:"inherit"});else z=Yq.spawn(W,Q,{stdio:"inherit"});else Q.unshift(W),Q=Sq(E.execArgv).concat(Q),z=Yq.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 Jq(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
12
+ (Did you mean ${X[0]}?)`;return""}DQ.suggestSimilar=AQ});var _q=D((ZQ)=>{var FQ=R("events").EventEmitter,Yq=R("child_process"),w=R("path"),Xq=R("fs"),E=R("process"),{Argument:SQ,humanReadableArgName:MQ}=l(),{CommanderError:Jq}=C(),{Help:TQ}=qq(),{Option:Sq,DualOptions:_Q}=Qq(),{suggestSimilar:Mq}=Fq();class Wq extends FQ{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 Wq(q)}createHelp(){return Object.assign(new TQ,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
+ - 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 SQ(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 Jq(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 Sq(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 Sq)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(Xq.existsSync(L))return L;if(X.includes(w.extname(B)))return;let $=X.find((U)=>Xq.existsSync(`${L}${U}`));if($)return`${L}${$}`;return}this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let W=q._executableFile||`${this._name}-${q._name}`,G=this._executableDir||"";if(this._scriptPath){let K;try{K=Xq.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=Tq(E.execArgv).concat(Q),z=Yq.spawn(E.argv[0],Q,{stdio:"inherit"});else z=Yq.spawn(W,Q,{stdio:"inherit"});else Q.unshift(W),Q=Tq(E.execArgv).concat(Q),z=Yq.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 Jq(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
18
  - ${B}`;throw Error(L)}else if(K.code==="EACCES")throw Error(`'${W}' not executable`);if(!H)E.exit(1);else{let B=new Jq(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 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 SQ(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=Fq(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=Fq(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 RQ(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.
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 _Q(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=Mq(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=Mq(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 MQ(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 Sq(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})}MQ.Command=Wq});var Oq=D((OQ)=>{var{Argument:Tq}=m(),{Command:zq}=Mq(),{CommanderError:_Q,InvalidArgumentError:_q}=k(),{Help:ZQ}=qq(),{Option:Zq}=Qq();OQ.program=new zq;OQ.createCommand=(q)=>new zq(q);OQ.createOption=(q,Q)=>new Zq(q,Q);OQ.createArgument=(q,Q)=>new Tq(q,Q);OQ.Command=zq;OQ.Option=Zq;OQ.Argument=Tq;OQ.Help=ZQ;OQ.CommanderError=_Q;OQ.InvalidArgumentError=_q;OQ.InvalidOptionArgumentError=_q});var bq=e(Oq(),1),{program:S,createCommand:TY,createArgument:_Y,createOption:ZY,CommanderError:OY,InvalidArgumentError:bY,InvalidOptionArgumentError:kY,Command:CY,Argument:xY,Option:vY,Help:hY}=bq.default;import{cp as UY,exists as b,mkdir as t,writeFile as F,readFile as B1}from"fs/promises";import{join as V}from"path";import{spawn as nq}from"child_process";import{homedir as $Y}from"os";var Gq={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
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 Tq(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})}ZQ.Command=Wq});var kq=D((CQ)=>{var{Argument:Zq}=l(),{Command:zq}=_q(),{CommanderError:bQ,InvalidArgumentError:Oq}=C(),{Help:kQ}=qq(),{Option:bq}=Qq();CQ.program=new zq;CQ.createCommand=(q)=>new zq(q);CQ.createOption=(q,Q)=>new bq(q,Q);CQ.createArgument=(q,Q)=>new Zq(q,Q);CQ.Command=zq;CQ.Option=bq;CQ.Argument=Zq;CQ.Help=kQ;CQ.CommanderError=bQ;CQ.InvalidArgumentError=Oq;CQ.InvalidOptionArgumentError=Oq});var Cq=e(kq(),1),{program:M,createCommand:bY,createArgument:kY,createOption:CY,CommanderError:xY,InvalidArgumentError:vY,InvalidOptionArgumentError:hY,Command:gY,Argument:yY,Option:cY,Help:fY}=Cq.default;import{cp as EY,exists as S,mkdir as s,writeFile as F,readFile as VY}from"fs/promises";import{join as V}from"path";import{spawn as tq}from"child_process";import{homedir as IY}from"os";var Gq={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 cY=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 $=B[L];if(!($ in z))z[$]=K[$].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 fY=Symbol("zod_brand");class A extends Error{constructor(){super("Encountered Promise during synchronous parse. Use .parseAsync() instead.")}}var Hq={};function M(q){if(q)Object.assign(Hq,q);return Hq}function xq(q,Q){if(typeof Q==="bigint")return Q.toString();return Q}function Kq(q){return{get value(){{let Y=q();return Object.defineProperty(this,"value",{value:Y}),Y}throw Error("cached value already set")}}}var Cq=Symbol("evaluating");function C(q,Q,Y){let X=void 0;Object.defineProperty(q,Q,{get(){if(X===Cq)return;if(X===void 0)X=Cq,X=Y();return X},set(J){Object.defineProperty(q,Q,{value:J})},configurable:!0})}var Bq="captureStackTrace"in Error?Error.captureStackTrace:(...q)=>{};function vq(q){return typeof q==="object"&&q!==null&&!Array.isArray(q)}var mQ=Kq(()=>{if(typeof navigator<"u"&&navigator?.userAgent?.includes("Cloudflare"))return!1;try{return new Function(""),!0}catch(q){return!1}});function Lq(q,Q,Y){let X=new q._zod.constr(Q??q._zod.def);if(!Q||Y?.parent)X._zod.parent=q;return X}function x(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 hq(q){return Object.keys(q).filter((Q)=>{return q[Q]._zod.optin==="optional"&&q[Q]._zod.optout==="optional"})}var uY={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 v(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 l(q){return typeof q==="string"?q:q?.message}function T(q,Q,Y){let X={...q,path:q.path??[]};if(!q.message){let J=l(q.inst?._zod.def?.error?.(q))??l(Q?.error?.(q))??l(Y.customError?.(q))??l(Y.localeError?.(q))??"Invalid input";X.message=J}if(delete X.inst,delete X.continue,!Q?.reportInput)delete X.input;return X}var gq=(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,xq,2),Object.defineProperty(q,"toString",{value:()=>q.message,enumerable:!1})},yq=I("$ZodError",gq),g=I("$ZodError",gq,{Parent:Error});var pQ=(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)=>T(H,W,M())));throw Bq(z,J?.callee),z}return G.value},p=pQ(g),rQ=(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)=>T(H,W,M())));throw Bq(z,J?.callee),z}return G.value},r=rQ(g),oQ=(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??yq)(W.issues.map((G)=>T(G,J,M())))}:{success:!0,data:W.value}},y=oQ(g),dQ=(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)=>T(G,J,M())))}:{success:!0,data:W.value}},c=dQ(g);var nQ="(?:(?:\\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])))",iQ=new RegExp(`^${nQ}$`);var cq=(q)=>{let Q=q?`[\\s\\S]{${q?.minimum??0},${q?.maximum??""}}`:"[\\s\\S]*";return new RegExp(`^${Q}$`)};var uq={major:4,minor:3,patch:6};var f=I("$ZodType",(q,Q)=>{var Y;q??(q={}),q._zod.def=Q,q._zod.bag=q._zod.bag||{},q._zod.version=uq;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=v(G),B;for(let L of z){if(L._zod.def.when){if(!L._zod.def.when(G))continue}else if(K)continue;let $=G.issues.length,U=L._zod.check(G);if(U instanceof Promise&&H?.async===!1)throw new A;if(B||U instanceof Promise)B=(B??Promise.resolve()).then(async()=>{if(await U,G.issues.length===$)return;if(!K)K=v(G,$)});else{if(G.issues.length===$)continue;if(!K)K=v(G,$)}}if(B)return B.then(()=>{return G});return G},W=(G,z,H)=>{if(v(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)}}C(q,"~standard",()=>({validate:(J)=>{try{let W=y(q,J);return W.success?{value:W.data}:{issues:W.error?.issues}}catch(W){return c(q,J).then((G)=>G.success?{value:G.data}:{issues:G.error?.issues})}},vendor:"zod",version:1}))}),lq=I("$ZodString",(q,Q)=>{f.init(q,Q),q._zod.pattern=[...q?._zod.bag?.patterns??[]].pop()??cq(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 mq(q,Q,Y){if(q.issues.length)Q.issues.push(...Uq(Y,q.issues));Q.value[Y]=q.value}var pq=I("$ZodArray",(q,Q)=>{f.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)=>mq(K,Y,G)));else mq(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 sQ(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=hq(q.shape);return{...q,keys:Q,keySet:new Set(Q),numKeys:Q.length,optionalKeys:new Set(Y)}}function eQ(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 $=H.run({value:Q[L],issues:[]},X);if($ instanceof Promise)q.push($.then((U)=>o(U,Y,L,Q,B)));else o($,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 rq=I("$ZodObject",(q,Q)=>{if(f.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=Kq(()=>sQ(Q));C(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=vq,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 $ of G.keys){let U=L[$],P=U._zod.optout==="optional",N=U._zod.run({value:K[$],issues:[]},H);if(N instanceof Promise)B.push(N.then((s)=>o(s,z,$,K,P)));else o(N,z,$,K,P)}if(!W)return B.length?Promise.all(B).then(()=>z):z;return eQ(B,K,z,H,X.value,q)}});function oq(q,Q){return new q({type:"string",...x(Q)})}var $q=I("ZodMiniType",(q,Q)=>{if(!q._zod)throw Error("Uninitialized schema in ZodMiniType.");f.init(q,Q),q.def=Q,q.type=Q.type,q.parse=(Y,X)=>p(q,Y,X,{callee:q.parse}),q.safeParse=(Y,X)=>y(q,Y,X),q.parseAsync=async(Y,X)=>r(q,Y,X,{callee:q.parseAsync}),q.safeParseAsync=async(Y,X)=>c(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)=>Lq(q,Y,X),q.brand=()=>q,q.register=(Y,X)=>{return Y.add(q,X),q},q.apply=(Y)=>Y(q)}),QY=I("ZodMiniString",(q,Q)=>{lq.init(q,Q),$q.init(q,Q)});function j(q){return oq(QY,q)}var YY=I("ZodMiniArray",(q,Q)=>{pq.init(q,Q),$q.init(q,Q)});function Pq(q,Q){return new YY({type:"array",element:q,...x(Q)})}var XY=I("ZodMiniObject",(q,Q)=>{rq.init(q,Q),$q.init(q,Q),C(q,"shape",()=>Q.shape)});function _(q,Q){let Y={type:"object",shape:q??{},...x(Q)};return new XY(Y)}import{cp as dq,exists as Z,mkdir as JY,readFile as WY,rm as zY}from"fs/promises";import{join as O}from"path";import{spawn as GY}from"child_process";import{homedir as HY}from"os";import{resolve as LY}from"path";var d="course.json",KY=()=>process.env.PROGY_API_URL||"https://progy.francy.workers.dev",BY=_({id:j(),name:j(),runner:_({command:j(),args:Pq(j()),cwd:j()}),content:_({root:j(),exercises:j()}),setup:_({checks:Pq(_({name:j(),type:j(),command:j()})),guide:j()})});class n{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 Z(q))return{url:LY(q)};console.log(`[INFO] Resolving alias '${q}'...`);try{let Q=`${KY()}/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=O(q,d);if(!await Z(Q))throw Error(`Missing ${d} in course directory.`);let Y=await WY(Q,"utf-8"),X;try{X=JSON.parse(Y)}catch(H){throw Error(`Invalid JSON in ${d}`)}let J=BY.safeParse(X);if(!J.success){let H=J.error.issues.map((K)=>`- ${K.path.join(".")}: ${K.message}`).join(`
88
- `);throw Error(`Invalid course configuration in ${d}:
89
- ${H}`)}let W=O(q,J.data.content.root);if(!await Z(W))throw Error(`Content root '${J.data.content.root}' not found.`);let G=O(q,J.data.content.exercises);if(!await Z(G))throw Error(`Exercises directory '${J.data.content.exercises}' not found.`);let z=O(q,J.data.setup.guide);if(!await Z(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 Z(Y)&&!Y.endsWith(".git")){await this.validateCourse(Y),await dq(Y,Q,{recursive:!0});return}let W=O(HY(),".progy","tmp",`course-${Date.now()}`);await JY(W,{recursive:!0});try{if(console.log("[GIT] Initializing repository..."),await u("git",["init"],W),await u("git",["remote","add","origin",Y],W),J)console.log(`[GIT] Configuring sparse-checkout for path: ${J}...`),await u("git",["config","core.sparseCheckout","true"],W),await u("git",["sparse-checkout","set",J],W);console.log("[GIT] Pulling content..."),await u("git",["pull","--depth=1","origin",X||"main"],W);let z=J?O(W,J):W;console.log("[VAL] Validating course..."),await this.validateCourse(z),console.log("[INST] Installing course..."),await dq(z,Q,{recursive:!0})}finally{await zY(W,{recursive:!0,force:!0})}}}function u(q,Q,Y){return new Promise((X,J)=>{GY(q,Q,{cwd:Y,stdio:"inherit"}).on("close",(G)=>{if(G===0)X();else J(Error(`${q} exited with code ${G}`))})})}var Eq=V($Y(),".progy"),PY=V(Eq,"config.json"),iq=process.env.PROGY_API_URL||"https://progy.francy.workers.dev",EY=process.env.PROGY_FRONTEND_URL||iq,i="course.json";async function VY(){let q=V(import.meta.dir,"../../../courses");if(await b(q))return q;return null}async function IY(q){if(!await b(Eq))await t(Eq,{recursive:!0});await F(PY,JSON.stringify({token:q}))}function jY(q){let Q=process.platform==="win32"?"start":process.platform==="darwin"?"open":"xdg-open";nq(Q,[q],{shell:!0}).unref()}S.name("progy").description("Universal programming course runner").version("0.0.1");S.command("init").description("Initialize a new course in the current directory").option("-c, --course <course>","Language/Course to initialize (e.g., rust)").action(async(q)=>{let Q=process.cwd(),Y=V(Q,i),X=await b(Y);if(!q.course)if(X)console.log(`[INFO] Detected '${i}'. Starting progy...`);else console.error(`[ERROR] No '${i}' found. Please specify a course to initialize:`),console.error(" progy init --course <rust|go|cloudflare...>"),process.exit(1);else{let K=q.course;console.log(`[INFO] Initializing ${K} course in ${Q}...`);let B=await VY(),L=!1;if(B){console.log(`[INFO] Checking local courses directory: ${B}`);let $=V(B,K);if(await b($))try{console.log("[VAL] Validating local course..."),await n.validateCourse($);let U=["content","runner","Cargo.toml","go.mod","SETUP.md",i];for(let P of U){let N=V($,P),s=V(Q,P);if(await b(N))console.log(`[COPY] ${P}...`),await UY(N,s,{recursive:!0})}L=!0}catch(U){console.warn(`[WARN] Local course validation failed: ${U}`)}}if(!L)try{await n.load(K,Q),L=!0}catch($){console.error(`[ERROR] Failed to initialize course: ${$}`),process.exit(1)}console.log("[INFO] Initialization complete!")}console.log("[INFO] Starting UI...");let W=import.meta.file.endsWith(".ts")?"ts":"js",z=["run",V(import.meta.dir,"backend",`server.${W}`)];if(process.env.ENABLE_HMR==="true")z.splice(1,0,"--hot");nq("bun",z,{stdio:"inherit",env:{...process.env,PROG_CWD:Q}}).on("close",(K)=>process.exit(K??0))});S.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 b(J))console.error(`[ERROR] Directory '${Y}' already exists.`),process.exit(1);let W=Gq[X];if(!W)console.error(`[ERROR] Unsupported language '${X}'. Supported: ${Object.keys(Gq).join(", ")}`),process.exit(1);console.log(`[INFO] Creating course '${Y}' with template '${X}'...`),await t(J,{recursive:!0}),await t(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 F(V(J,"course.json"),G),await F(V(J,"SETUP.md"),W.setupMd),await F(V(J,"content","01_intro","README.md"),W.introReadme),await F(V(J,"content","01_intro",W.introFilename),W.introCode),X==="go"){let z=V(J,"runner");await t(z,{recursive:!0});let H=`package main
87
+ `,introFilename:"main.go"}};var lY=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 $=B[L];if(!($ in z))z[$]=K[$].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 pY=Symbol("zod_brand");class A extends Error{constructor(){super("Encountered Promise during synchronous parse. Use .parseAsync() instead.")}}var Hq={};function T(q){if(q)Object.assign(Hq,q);return Hq}function hq(q,Q){if(typeof Q==="bigint")return Q.toString();return Q}function Kq(q){return{get value(){{let Y=q();return Object.defineProperty(this,"value",{value:Y}),Y}throw Error("cached value already set")}}}var vq=Symbol("evaluating");function x(q,Q,Y){let X=void 0;Object.defineProperty(q,Q,{get(){if(X===vq)return;if(X===void 0)X=vq,X=Y();return X},set(J){Object.defineProperty(q,Q,{value:J})},configurable:!0})}var Bq="captureStackTrace"in Error?Error.captureStackTrace:(...q)=>{};function gq(q){return typeof q==="object"&&q!==null&&!Array.isArray(q)}var rQ=Kq(()=>{if(typeof navigator<"u"&&navigator?.userAgent?.includes("Cloudflare"))return!1;try{return new Function(""),!0}catch(q){return!1}});function Lq(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 yq(q){return Object.keys(q).filter((Q)=>{return q[Q]._zod.optin==="optional"&&q[Q]._zod.optout==="optional"})}var rY={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 cq=(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,hq,2),Object.defineProperty(q,"toString",{value:()=>q.message,enumerable:!1})},fq=I("$ZodError",cq),y=I("$ZodError",cq,{Parent:Error});var dQ=(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 Bq(z,J?.callee),z}return G.value},r=dQ(y),nQ=(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 Bq(z,J?.callee),z}return G.value},o=nQ(y),iQ=(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??fq)(W.issues.map((G)=>_(G,J,T())))}:{success:!0,data:W.value}},c=iQ(y),tQ=(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=tQ(y);var sQ="(?:(?:\\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])))",eQ=new RegExp(`^${sQ}$`);var uq=(q)=>{let Q=q?`[\\s\\S]{${q?.minimum??0},${q?.maximum??""}}`:"[\\s\\S]*";return new RegExp(`^${Q}$`)};var lq={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=lq;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 $=G.issues.length,U=L._zod.check(G);if(U instanceof Promise&&H?.async===!1)throw new A;if(B||U instanceof Promise)B=(B??Promise.resolve()).then(async()=>{if(await U,G.issues.length===$)return;if(!K)K=h(G,$)});else{if(G.issues.length===$)continue;if(!K)K=h(G,$)}}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}))}),rq=I("$ZodString",(q,Q)=>{u.init(q,Q),q._zod.pattern=[...q?._zod.bag?.patterns??[]].pop()??uq(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 pq(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)=>pq(K,Y,G)));else pq(H,Y,G)}if(W.length)return Promise.all(W).then(()=>Y);return Y}});function d(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=yq(q.shape);return{...q,keys:Q,keySet:new Set(Q),numKeys:Q.length,optionalKeys:new Set(Y)}}function QY(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 $=H.run({value:Q[L],issues:[]},X);if($ instanceof Promise)q.push($.then((U)=>d(U,Y,L,Q,B)));else d($,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 dq=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=Kq(()=>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=gq,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 $ of G.keys){let U=L[$],P=U._zod.optout==="optional",N=U._zod.run({value:K[$],issues:[]},H);if(N instanceof Promise)B.push(N.then((k)=>d(k,z,$,K,P)));else d(N,z,$,K,P)}if(!W)return B.length?Promise.all(B).then(()=>z):z;return QY(B,K,z,H,X.value,q)}});function nq(q,Q){return new q({type:"string",...v(Q)})}var $q=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)=>o(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)=>Lq(q,Y,X),q.brand=()=>q,q.register=(Y,X)=>{return Y.add(q,X),q},q.apply=(Y)=>Y(q)}),JY=I("ZodMiniString",(q,Q)=>{rq.init(q,Q),$q.init(q,Q)});function j(q){return nq(JY,q)}var WY=I("ZodMiniArray",(q,Q)=>{oq.init(q,Q),$q.init(q,Q)});function Pq(q,Q){return new WY({type:"array",element:q,...v(Q)})}var zY=I("ZodMiniObject",(q,Q)=>{dq.init(q,Q),$q.init(q,Q),x(q,"shape",()=>Q.shape)});function Z(q,Q){let Y={type:"object",shape:q??{},...v(Q)};return new zY(Y)}import{cp as iq,exists as O,mkdir as GY,readFile as HY,rm as KY}from"fs/promises";import{join as b}from"path";import{spawn as BY}from"child_process";import{homedir as LY}from"os";import{resolve as PY}from"path";var n="course.json",UY=()=>process.env.PROGY_API_URL||"https://progy.francy.workers.dev",$Y=Z({id:j(),name:j(),runner:Z({command:j(),args:Pq(j()),cwd:j()}),content:Z({root:j(),exercises:j()}),setup:Z({checks:Pq(Z({name:j(),type:j(),command:j()})),guide:j()})});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 HY(Q,"utf-8"),X;try{X=JSON.parse(Y)}catch(H){throw Error(`Invalid JSON in ${n}`)}let J=$Y.safeParse(X);if(!J.success){let H=J.error.issues.map((K)=>`- ${K.path.join(".")}: ${K.message}`).join(`
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 iq(Y,Q,{recursive:!0});return}let W=b(LY(),".progy","tmp",`course-${Date.now()}`);await GY(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 iq(z,Q,{recursive:!0})}finally{await KY(W,{recursive:!0,force:!0})}}}function m(q,Q,Y){return new Promise((X,J)=>{BY(q,Q,{cwd:Y,stdio:"inherit"}).on("close",(G)=>{if(G===0)X();else J(Error(`${q} exited with code ${G}`))})})}var Eq=V(IY(),".progy"),Vq=V(Eq,"config.json"),sq=process.env.PROGY_API_URL||"https://progy.francy.workers.dev",jY=process.env.PROGY_FRONTEND_URL||sq,t="course.json";async function NY(){let q=V(import.meta.dir,"../../../courses");if(await S(q))return q;return null}async function wY(q){if(!await S(Eq))await s(Eq,{recursive:!0});await F(Vq,JSON.stringify({token:q}))}async function AY(){if(!await S(Vq))return null;try{return JSON.parse(await VY(Vq,"utf-8")).token||null}catch{return null}}function DY(q){let Q=process.platform==="win32"?"start":process.platform==="darwin"?"open":"xdg-open";tq(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 AY(),!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 $=await NY(),U=!1;if($){console.log(`[INFO] Checking local courses directory: ${$}`);let P=V($,L);if(await S(P))try{console.log("[VAL] Validating local course..."),await i.validateCourse(P);let N=["content","runner","Cargo.toml","go.mod","SETUP.md",t];for(let k of N){let Iq=V(P,k),eq=V(Q,k);if(await S(Iq))console.log(`[COPY] ${k}...`),await EY(Iq,eq,{recursive:!0})}U=!0}catch(N){console.warn(`[WARN] Local course validation failed: ${N}`)}}if(!U)try{await i.load(L,Q),U=!0}catch(P){console.error(`[ERROR] Failed to initialize course: ${P}`),process.exit(1)}console.log("[INFO] Initialization complete!")}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");tq("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=Gq[X];if(!W)console.error(`[ERROR] Unsupported language '${X}'. Supported: ${Object.keys(Gq).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 F(V(J,"course.json"),G),await F(V(J,"SETUP.md"),W.setupMd),await F(V(J,"content","01_intro","README.md"),W.introReadme),await F(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`)});S.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:iq,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:`${EY}${z}`;console.log(`
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:sq,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:`${jY}${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
- `),jY(K),console.log("[WAIT] Waiting for authorization...");let L=await(async()=>{while(!0){let{data:$,error:U}=await Y.device.token({grant_type:"urn:ietf:params:oauth:grant-type:device_code",device_code:W,client_id:"progy-cli"});if($?.access_token)return $.access_token;if(U){let P=U.error;if(P==="access_denied"||P==="expired_token")throw Error(U.error_description||P)}await new Promise((P)=>setTimeout(P,(H||5)*1000))}})();if(L)await IY(L),console.log("[SUCCESS] Logged in successfully!")}catch(X){console.error(`[ERROR] Login failed: ${X.message||X}`),process.exit(1)}});S.parse();
138
+ `),DY(K),console.log("[WAIT] Waiting for authorization...");let L=await(async()=>{while(!0){let{data:$,error:U}=await Y.device.token({grant_type:"urn:ietf:params:oauth:grant-type:device_code",device_code:W,client_id:"progy-cli"});if($?.access_token)return $.access_token;if(U){let P=U.error;if(P==="access_denied"||P==="expired_token")throw Error(U.error_description||P)}await new Promise((P)=>setTimeout(P,(H||5)*1000))}})();if(L)await wY(L),console.log("[SUCCESS] Logged in successfully!")}catch(X){console.error(`[ERROR] Login failed: ${X.message||X}`),process.exit(1)}});M.parse();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "progy",
3
- "version": "0.4.3",
3
+ "version": "0.6.0",
4
4
  "description": "The interactive CLI and learning platform for Progy courses.",
5
5
  "license": "MIT",
6
6
  "repository": {