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.
- package/dist/backend/server.js +15 -20
- package/dist/cli.js +14 -14
- package/package.json +1 -1
package/dist/backend/server.js
CHANGED
|
@@ -1,33 +1,28 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var
|
|
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
|
-
|
|
4
|
+
> ${p.summary}
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
`;if(p.diagnostics?.length){i+=`### \uD83D\uDCCD Diagnostics
|
|
7
7
|
|
|
8
|
-
`;for(let
|
|
9
|
-
|
|
10
|
-
`,
|
|
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(
|
|
13
|
-
${
|
|
12
|
+
`;if(r.snippet)i+=`\`\`\`rust
|
|
13
|
+
${r.snippet}
|
|
14
14
|
\`\`\`
|
|
15
15
|
|
|
16
|
-
`;
|
|
17
|
-
`,Y+=`> \`\`\`rust
|
|
18
|
-
> ${z.suggestion}
|
|
19
|
-
> \`\`\`
|
|
16
|
+
`;i+=`---
|
|
20
17
|
|
|
21
|
-
|
|
18
|
+
`}}if(p.tests?.length){i+=`### \uD83E\uDDEA Tests
|
|
22
19
|
|
|
23
|
-
|
|
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
|
-
`}
|
|
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
|
|
26
|
+
`:`\u274C Failed
|
|
32
27
|
|
|
33
|
-
|
|
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
|
|
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
|
-
`)}}
|
|
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""}
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 ${
|
|
89
|
-
${H}`)}let W=
|
|
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`)});
|
|
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
|
-
`),
|
|
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();
|