progy 0.7.2 → 0.9.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 +13 -13
- package/dist/cli.js +24 -22
- package/package.json +4 -2
package/dist/backend/server.js
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var U$=Object.create;var{getPrototypeOf:
|
|
2
|
+
var U$=Object.create;var{getPrototypeOf:K$,defineProperty:o,getOwnPropertyNames:w$}=Object;var M$=Object.prototype.hasOwnProperty;var d$=($,V,Q)=>{Q=$!=null?U$(K$($)):{};let Y=V||!$||!$.__esModule?o(Q,"default",{value:$,enumerable:!0}):Q;for(let Z of w$($))if(!M$.call(Y,Z))o(Y,Z,{get:()=>$[Z],enumerable:!0});return Y};var o$=($,V)=>()=>(V||$((V={exports:{}}).exports,V),V.exports);var i$=import.meta.require;var{serve:n$}=globalThis.Bun;import{join as h}from"path";var i={"/api/health":Response.json({status:"ok"})};import{readdir as P,readFile as F,writeFile as m,mkdir as c,exists as E}from"fs/promises";import{join as U}from"path";import{homedir as D$}from"os";import{spawn as L$}from"child_process";var T=process.env.PROG_CWD||process.cwd(),e=U(D$(),".progy"),l=U(e,"config.json"),t=U(T,"course.json"),C=U(T,".progy"),j$=U(C,"exercises.json"),O=U(C,"progress.json"),$$=process.env.PROGY_OFFLINE==="true",p={stats:{totalXp:0,currentStreak:0,longestStreak:0,lastActiveDate:null},exercises:{},quizzes:{},achievements:[]},W=null,g=null,s=0;async function N$(){try{if(await E(t)){let $=await F(t,"utf-8");return JSON.parse($)}return null}catch($){return console.warn(`[WARN] Failed to read course.json: ${$}`),null}}async function q(){if(!W)W=await N$();return W}async function G(){if(await E(l))return JSON.parse(await F(l,"utf-8"));return{}}async function x($){let Q={...await G(),...$};return await c(e,{recursive:!0}),await m(l,JSON.stringify(Q,null,2)),Q}async function _(){if($$){try{if(await E(O)){let V=await F(O,"utf-8"),Q=JSON.parse(V);return console.log(`[OFFLINE] Loaded local progress. XP: ${Q?.stats.totalXp}`),Q}}catch(V){console.warn(`[WARN] Failed to read ${O}: ${V}`)}return JSON.parse(JSON.stringify(p))}await q();let $=await G();if($?.token&&W?.id){console.log(`[ONLINE] Fetching progress for ${W.id}...`);try{let V=await q$(W.id,$.token);if(V)return console.log(`[ONLINE] Loaded cloud progress. XP: ${V.stats.totalXp}`),V;else return console.log("[ONLINE] No existing cloud progress found. Returning default."),JSON.parse(JSON.stringify(p))}catch(V){throw console.error(`[CRITICAL] Failed to fetch cloud progress: ${V}`),V}}return JSON.parse(JSON.stringify(p))}async function y($){if($$){try{await c(C,{recursive:!0}),await m(O,JSON.stringify($,null,2))}catch(Q){console.error(`[ERROR] Failed to save local progress: ${Q}`)}return}await q();let V=await G();if(V?.token&&W?.id)await T$(W.id,$,V.token)}async function T$($,V,Q){let Y=process.env.PROGY_API_URL||"https://progy.francy.workers.dev";try{let Z=await fetch(`${Y}/api/progress/sync`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${Q}`},body:JSON.stringify({courseId:$,data:V})});if(Z.ok)console.log("[ONLINE] Successfully saved to cloud.");else console.warn(`[ONLINE] Cloud save failed: ${Z.status}`)}catch(Z){console.error(`[ONLINE] Connection error during save: ${Z}`)}}async function q$($,V){let Q=process.env.PROGY_API_URL||"https://progy.francy.workers.dev";try{let Y=await fetch(`${Q}/api/progress/get?courseId=${$}`,{headers:{Authorization:`Bearer ${V}`}});if(Y.ok)return await Y.json();if(Y.status===404)return null;throw Error(`Cloud fetch failed with ${Y.status}`)}catch(Y){throw Y}}function u($){let V=new Date().toISOString().split("T")[0];if($.lastActiveDate===V)return $;let Q=new Date;Q.setDate(Q.getDate()-1);let Y=Q.toISOString().split("T")[0];if($.lastActiveDate===Y)$.currentStreak+=1;else $.currentStreak=1;if($.currentStreak>$.longestStreak)$.longestStreak=$.currentStreak;return $.lastActiveDate=V,$}var r=($)=>$.replace(/_/g," ").replace(/([a-zA-Z])(\d+)/g,"$1 $2").replace(/\b\w/g,(V)=>V.toUpperCase());async function V$($){if(g&&Date.now()-s<5000)return g;let V=$.content.exercises,Q=U(T,V);if(!await E(Q))return{};let Z=(await P(Q)).filter((J)=>!J.startsWith(".")&&J!=="README.md"&&J!=="mod.rs"&&J!=="practice");Z.sort((J,X)=>{let D=parseInt(J.split("_")[0]||"999"),M=parseInt(X.split("_")[0]||"999");return D-M});let k={};async function w(J,X,D,M,j,B,N){let S=r(D);if(j[D]?.title)S=j[D].title;let L=U(B,X.name);if(X.isDirectory()){let I=["exercise.rs","main.rs","index.ts","main.go","index.js"];for(let b of I){let z=U(L,b);if(await E(z)){L=z;break}}}if(await E(L)&&(await Bun.file(L).stat()).isFile())try{let b=(await F(L,"utf-8")).match(/\/\/\s*(?:Title|title):\s*(.+)/);if(b&&b[1])S=b[1].trim()}catch{}let K={id:`${J}/${X.name}`,module:J,moduleTitle:M,name:X.name,exerciseName:D,friendlyName:S,path:U(B,X.name)};if(X.isDirectory()){let I=U(B,X.name,"quiz.json");N[J].push({...K,markdownPath:U(B,X.name,"README.md"),hasQuiz:await E(I),type:"directory"})}else if(X.isFile()){if(X.name.endsWith(".test.ts")||X.name==="package.json")return;N[J].push({...K,markdownPath:null,type:"file"})}}for(let J of Z){let X=U(Q,J);if((await Bun.file(X).stat()).isDirectory()){k[J]=[];let M=await P(X,{withFileTypes:!0}),j=r(J),B={},N=U(X,"info.toml");if(await E(N))try{let z=await F(N,"utf-8"),H=Bun.TOML.parse(z);if(H.module?.message)j=H.module.message;if(Array.isArray(H.exercises)){for(let A of H.exercises)if(A.name)B[A.name]=A}else if(H.exercises&&typeof H.exercises==="object")for(let[A,R]of Object.entries(H.exercises))B[A]=typeof R==="string"?{title:R}:R}catch(z){console.warn(`[WARN] Failed to parse info.toml: ${z}`)}let S=(z)=>{let H=z.match(/^(\d+)_/);return H?parseInt(H[1]||"0"):9999},L=new Map;for(let z of M){if(z.name.startsWith(".")||z.name==="README.md"||z.name==="mod.rs"||z.name==="info.toml")continue;L.set(z.name.split(".")[0]||"",z)}let K=Object.keys(B),I=new Set;for(let z of K){let H=L.get(z);if(H)I.add(z),await w(J,H,z,j,B,X,k)}let b=M.filter((z)=>{let H=z.name.split(".")[0]||"";return!I.has(H)&&!z.name.startsWith(".")&&z.name!=="README.md"&&z.name!=="mod.rs"&&z.name!=="info.toml"});b.sort((z,H)=>{let A=S(z.name||""),R=S(H.name||"");return A!==R?A-R:(z.name||"").localeCompare(H.name||"")});for(let z of b)await w(J,z,z.name.split(".")[0]||"",j,B,X,k)}}let v=U(Q,"practice");if(await E(v)){k.practice=[];let J=await P(v);for(let X of J)if(X.endsWith(".rs")||X.endsWith(".ts")||X.endsWith(".js")||X.endsWith(".go"))k.practice.push({id:`practice/${X}`,module:"practice",name:X,exerciseName:X.split(".")[0],path:U(v,X),markdownPath:null,type:"file"})}return await c(C,{recursive:!0}),await m(j$,JSON.stringify(k,null,2)),g=k,s=Date.now(),k}async function Q$($){let V=[];for(let Q of $.checks)if(Q.type==="command")try{let Y=Q.command.split(" "),Z=Y[0];if(!Z)continue;let k=L$(Z,Y.slice(1),{stdio:"ignore"}),w=await new Promise((v)=>{k.on("close",(J)=>v(J===0)),k.on("error",()=>v(!1))});V.push({name:Q.name,status:w?"pass":"fail",message:w?"Found":"Not found"})}catch(Y){V.push({name:Q.name,status:"fail",message:String(Y)})}return V}function X$($,V){try{let Y=null,Z=$.match(/__SRP_BEGIN__\s*([\s\S]*?)\s*__SRP_END__/);if(Z&&Z[1])Y=Z[1].trim();else{let k=$.match(/\{[\s\S]*\}/g);if(k&&k.length>0)Y=k[k.length-1]?.trim()??null}if(Y){let k=Y.indexOf("{"),w=Y.lastIndexOf("}");if(k!==-1&&w!==-1){let v=JSON.parse(Y.substring(k,w+1)),J=`## ${v.success?"\u2705 Success":"\u274C Failed"}
|
|
3
3
|
|
|
4
|
-
> ${
|
|
4
|
+
> ${v.summary}
|
|
5
5
|
|
|
6
|
-
`;if(
|
|
6
|
+
`;if(v.diagnostics?.length){J+=`### \uD83D\uDCCD Diagnostics
|
|
7
7
|
|
|
8
|
-
`;for(let
|
|
9
|
-
**${
|
|
10
|
-
`,
|
|
8
|
+
`;for(let X of v.diagnostics){if(J+=`#### ${X.severity==="error"?"\u274C":"\u26A0\uFE0F"} ${X.severity.toUpperCase()}
|
|
9
|
+
**${X.message}**
|
|
10
|
+
`,X.file)J+=`\`${X.file}:${X.line||0}\`
|
|
11
11
|
|
|
12
|
-
`;if(
|
|
13
|
-
${
|
|
12
|
+
`;if(X.snippet)J+=`\`\`\`rust
|
|
13
|
+
${X.snippet}
|
|
14
14
|
\`\`\`
|
|
15
15
|
|
|
16
16
|
`;J+=`---
|
|
17
17
|
|
|
18
|
-
`}}if(
|
|
18
|
+
`}}if(v.tests?.length){J+=`### \uD83E\uDDEA Tests
|
|
19
19
|
|
|
20
|
-
`;for(let
|
|
21
|
-
${
|
|
20
|
+
`;for(let X of v.tests)J+=`- ${X.status==="pass"?"\u2705":"\u274C"} **${X.name}**
|
|
21
|
+
${X.message?` > ${X.message.replace(/\n/g,`
|
|
22
22
|
> `)}
|
|
23
23
|
|
|
24
|
-
`:""}`}return{success:
|
|
24
|
+
`:""}`}return{success:v.success,output:v.raw.trim(),friendlyOutput:J}}}}catch{}let Q=V===0&&!$.includes("\u274C");return{success:Q,output:$,friendlyOutput:(Q?`\u2705 Success
|
|
25
25
|
|
|
26
26
|
`:`\u274C Failed
|
|
27
27
|
|
|
28
|
-
`)+$}}var
|
|
28
|
+
`)+$}}var S$=async()=>{try{return Response.json(await _())}catch($){return console.error(`[ERROR] getProgress failed: ${$}`),Response.json(JSON.parse(JSON.stringify(p)))}},E$=async($)=>{try{let{type:V,id:Q,success:Y}=await $.json();if(!Q)return Response.json({success:!1,error:"Missing ID"});let Z=await _(),k=new Date().toISOString();if(V==="quiz"&&Y){if(!Z.quizzes[Q])Z.quizzes[Q]={passed:!0,xpEarned:10,completedAt:k},Z.stats.totalXp+=10,Z.stats=u(Z.stats),await y(Z)}return Response.json({success:!0,progress:Z})}catch(V){return Response.json({success:!1,error:String(V)})}},Y$={"/api/progress":{GET:S$},"/api/progress/update":{POST:E$}};import{execSync as b$}from"child_process";var A$=()=>{if(W?.repo?.includes("fhorray/progy-courses"))return!0;try{return b$("git remote get-url origin",{cwd:T,stdio:"pipe"}).toString().trim().includes("fhorray/progy-courses")}catch($){return!1}},I$=async()=>{return await q(),Response.json({...W||{},remoteApiUrl:process.env.PROGY_API_URL||"https://progy.francy.workers.dev",isOffline:process.env.PROGY_OFFLINE==="true",isOfficial:A$()})},Z$={"/api/config":{GET:I$}};import{readFile as f,exists as n}from"fs/promises";import{join as a}from"path";import{spawn as G$}from"child_process";var R$=async()=>{if(await q(),!W)return Response.json({error:"No config"});let $=await V$(W);return Response.json(Array.isArray($)?{}:$)},p$=async($)=>{let Q=new URL($.url).searchParams.get("path");if(!Q)return new Response("Missing path",{status:400});let Y=a(Q,"quiz.json");try{if(await n(Y)){let Z=await f(Y,"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})}},F$=async($)=>{let V=new URL($.url),Q=V.searchParams.get("path"),Y=V.searchParams.get("markdownPath");if(!Q)return new Response("Missing path",{status:400});try{let Z="";if((await Bun.file(Q).stat()).isDirectory()){let v=["exercise.rs","main.rs","index.ts","main.go","index.js"];for(let J of v){let X=a(Q,J);if(await n(X)){Z=await f(X,"utf-8");break}}if(!Z)Z="// No entry file found"}else Z=await f(Q,"utf-8");let w=null;if(Y&&await n(Y))w=await f(Y,"utf-8");return Response.json({code:Z,markdown:w})}catch(Z){return Response.json({error:"File not found"},{status:404})}},_$=async($)=>{try{await q();let V=await $.json(),{exerciseName:Q,id:Y}=V,k=(Y?.split("/")||[])[0]||"",w=W.runner.command,v=W.runner.args.map((D)=>D.replace("{{exercise}}",Q).replace("{{id}}",Y||"").replace("{{module}}",k)),X=(W.runner.cwd?a(T,W.runner.cwd):T).replace("{{exercise}}",Q).replace("{{id}}",Y||"").replace("{{module}}",k);return new Promise((D)=>{let M=G$(w,v,{cwd:X,stdio:["ignore","pipe","pipe"],env:{...process.env,FORCE_COLOR:"1"}}),j="";if(M.stdout)M.stdout.on("data",(B)=>j+=B.toString());if(M.stderr)M.stderr.on("data",(B)=>j+=B.toString());M.on("close",async(B)=>{let N=X$(j,B||0),S=null,L=null;if(N.success&&V.id)try{let K=await _();if(!K.exercises[V.id])K.exercises[V.id]={status:"pass",xpEarned:20,completedAt:new Date().toISOString()},K.stats.totalXp+=20,K.stats=u(K.stats),await y(K);S=K}catch(K){console.error(`[WARN] Could not update progress: ${K}`),L="Failed to save progress (Auth/Network error)"}D(Response.json({success:N.success,output:N.output||"No output",friendlyOutput:N.friendlyOutput,progress:S,error:L}))}),M.on("error",(B)=>D(Response.json({success:!1,output:B.message})))})}catch(V){return Response.json({success:!1,output:String(V)})}},J$={"/api/exercises":{GET:R$},"/api/exercises/quiz":{GET:p$},"/api/exercises/code":{GET:F$},"/api/exercises/run":{POST:_$}};import{readFile as O$,exists as C$}from"fs/promises";import{join as x$}from"path";var y$=async()=>{if(await q(),!W||!W.setup)return Response.json({success:!0,checks:[]});let $=await Q$(W.setup);return Response.json({success:$.every((V)=>V.status==="pass"),checks:$})},u$=async()=>{if(await q(),!W||!W.setup?.guide)return Response.json({markdown:"# No setup guide available"});let $=x$(T,W.setup.guide);if(await C$($)){let V=await O$($,"utf-8");return Response.json({markdown:V})}return Response.json({markdown:"# Setup guide not found"})},z$={"/api/setup/status":{GET:y$},"/api/setup/guide":{GET:u$}};var f$=async()=>{return Response.json({hint:"Thinking..."})},k$={"/api/ai/hint":{POST:f$}};import{spawn as h$}from"child_process";var P$=async($)=>{try{let{path:V}=await $.json();if(!V)return Response.json({success:!1,error:"Missing path"});console.log(`[IDE] Opening ${V} in VS Code...`);let Q=h$("code",[V],{shell:!0});return new Promise((Y)=>{Q.on("error",(Z)=>{console.error(`[IDE] Failed to spawn 'code': ${Z}`),Y(Response.json({success:!1,error:"VS Code not found in PATH"}))}),Q.on("spawn",()=>{Y(Response.json({success:!0}))})})}catch(V){return console.error(`[IDE] Failed to open: ${V}`),Response.json({success:!1,error:String(V)},{status:500})}},W$={"/api/ide/open":{POST:P$}};var g$=async()=>{let $=await G();return Response.json({token:$?.token||null})},l$=async()=>{return await x({token:null}),Response.json({success:!0})},v$={"/api/auth/token":{GET:g$,POST:l$}};var m$=async()=>{let $=await G(),{token:V,...Q}=$||{};return Response.json(Q)},c$=async($)=>{let V=await $.json();return await x(V),Response.json({success:!0})},B$={"/api/local-settings":{GET:m$,POST:c$}};var a$=import.meta.file.endsWith(".ts"),d=h(import.meta.dir,a$?"../../public":"../public");console.log("[INFO] Server starting...");var H$;try{H$=n$({port:3001,routes:{"/":()=>new Response(Bun.file(h(d,"index.html"))),"/main.js":()=>new Response(Bun.file(h(d,"main.js"))),"/main.css":()=>new Response(Bun.file(h(d,"main.css"))),...i,...Y$,...Z$,...J$,...z$,...k$,...W$,...v$,...B$},development:{hmr:process.env.ENABLE_HMR==="true"},fetch($){let V=$.headers.get("Origin"),Q=$.headers.get("Host");if(V){if(new URL(V).host!==Q)return console.warn(`[SECURITY] Blocked CSRF attempt from ${V}`),new Response("Forbidden",{status:403})}return new Response("Not Found",{status:404})}}),console.log(`\uD83D\uDE80 Progy Server running on ${H$.url}`)}catch($){if($.code==="EADDRINUSE"||$.syscall==="listen")console.error(`
|
|
29
29
|
\u274C \x1B[31mError: Port 3001 is already in use.\x1B[0m`),console.error(" To fix this, you can:"),console.error(" 1. Stop the other Progy instance (Ctrl+C)"),console.error(" 2. Kill the process manually: \x1B[33mbunx progy kill-port 3001\x1B[0m (if implemented) or use task manager"),console.error(` 3. Wait a few seconds and try again.
|
|
30
30
|
`),process.exit(1);else throw $}
|
package/dist/cli.js
CHANGED
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
var
|
|
4
|
-
`).replace(/^/gm," ".repeat(2))}let
|
|
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
|
|
3
|
+
var wQ=Object.create;var{getPrototypeOf:NQ,defineProperty:W0,getOwnPropertyNames:DQ}=Object;var MQ=Object.prototype.hasOwnProperty;var $q=(q,Q,Y)=>{Y=q!=null?wQ(NQ(q)):{};let X=Q||!q||!q.__esModule?W0(Y,"default",{value:q,enumerable:!0}):Y;for(let J of DQ(q))if(!MQ.call(X,J))W0(X,J,{get:()=>q[J],enumerable:!0});return X};var O=(q,Q)=>()=>(Q||q((Q={exports:{}}).exports,Q),Q.exports);var f=import.meta.require;var Vq=O((SQ)=>{class vq 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 G0 extends vq{constructor(q){super(1,"commander.invalidArgument",q);Error.captureStackTrace(this,this.constructor),this.name=this.constructor.name}}SQ.CommanderError=vq;SQ.InvalidArgumentError=G0});var Mq=O((OQ)=>{var{InvalidArgumentError:ZQ}=Vq();class K0{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 PQ(q){let Q=q.name()+(q.variadic===!0?"...":"");return q.required?"<"+Q+">":"["+Q+"]"}OQ.Argument=K0;OQ.humanReadableArgName=PQ});var hq=O((_Q)=>{var{humanReadableArgName:xQ}=Mq();class $0{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)=>xQ(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 K(V,R){if(R){let H=`${V.padEnd(Y+2)}${R}`;return Q.wrap(H,X-2,Y+2)}return V}function $(V){return V.join(`
|
|
4
|
+
`).replace(/^/gm," ".repeat(2))}let L=[`Usage: ${Q.commandUsage(q)}`,""],B=Q.commandDescription(q);if(B.length>0)L=L.concat([Q.wrap(B,X,0),""]);let U=Q.visibleArguments(q).map((V)=>{return K(Q.argumentTerm(V),Q.argumentDescription(V))});if(U.length>0)L=L.concat(["Arguments:",$(U),""]);let w=Q.visibleOptions(q).map((V)=>{return K(Q.optionTerm(V),Q.optionDescription(V))});if(w.length>0)L=L.concat(["Options:",$(w),""]);if(this.showGlobalOptions){let V=Q.visibleGlobalOptions(q).map((R)=>{return K(Q.optionTerm(R),Q.optionDescription(R))});if(V.length>0)L=L.concat(["Global Options:",$(V),""])}let D=Q.visibleCommands(q).map((V)=>{return K(Q.subcommandTerm(V),Q.subcommandDescription(V))});if(D.length>0)L=L.concat(["Commands:",$(D),""]);return L.join(`
|
|
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 K=Q-Y;if(K<X)return q;let $=q.slice(0,Y),L=q.slice(Y).replace(`\r
|
|
6
6
|
`,`
|
|
7
|
-
`),
|
|
8
|
-
|.{1,${
|
|
9
|
-
`)return"";return(
|
|
10
|
-
`)}}
|
|
7
|
+
`),B=" ".repeat(Y),w=`\\s${"\u200B"}`,D=new RegExp(`
|
|
8
|
+
|.{1,${K-1}}([${w}]|$)|[^${w}]+?([${w}]|$)`,"g"),V=L.match(D)||[];return $+V.map((R,H)=>{if(R===`
|
|
9
|
+
`)return"";return(H>0?B:"")+R.trimEnd()}).join(`
|
|
10
|
+
`)}}_Q.Help=$0});var gq=O((yQ)=>{var{InvalidArgumentError:vQ}=Vq();class V0{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=gQ(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 vQ(`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 hQ(this.name().replace(/^no-/,""))}is(q){return this.short===q||this.long===q}isBoolean(){return!this.required&&!this.optional&&!this.negate}}class L0{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 hQ(q){return q.split("-").reduce((Q,Y)=>{return Q+Y[0].toUpperCase()+Y.slice(1)})}function gQ(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}}yQ.Option=V0;yQ.DualOptions=L0});var B0=O((pQ)=>{function mQ(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 cQ(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((K)=>K.slice(2));let X=[],J=3,W=0.4;if(Q.forEach((K)=>{if(K.length<=1)return;let $=mQ(q,K),L=Math.max(q.length,K.length);if((L-$)/L>W){if($<J)J=$,X=[K];else if($===J)X.push(K)}}),X.sort((K,$)=>K.localeCompare($)),Y)X=X.map((K)=>`--${K}`);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
|
|
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,
|
|
12
|
+
(Did you mean ${X[0]}?)`;return""}pQ.suggestSimilar=cQ});var H0=O((sQ)=>{var dQ=f("events").EventEmitter,yq=f("child_process"),o=f("path"),uq=f("fs"),x=f("process"),{Argument:oQ,humanReadableArgName:rQ}=Mq(),{CommanderError:fq}=Vq(),{Help:iQ}=hq(),{Option:R0,DualOptions:nQ}=gq(),{suggestSimilar:A0}=B0();class mq extends dQ{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)=>x.stdout.write(Q),writeErr:(Q)=>x.stderr.write(Q),getOutHelpWidth:()=>x.stdout.isTTY?x.stdout.columns:void 0,getErrHelpWidth:()=>x.stderr.isTTY?x.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,K]=q.match(/([^ ]+) *(.*)/),$=this.createCommand(W);if(X)$.description(X),$._executableHandler=!0;if(J.isDefault)this._defaultCommandName=$._name;if($._hidden=!!(J.noHelp||J.hidden),$._executableFile=J.executableFile||null,K)$.arguments(K);if(this._registerCommand($),$.parent=this,$.copyInheritedSettings(this),X)return this;return $}createCommand(q){return new mq(q)}createHelp(){return Object.assign(new iQ,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 oQ(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 fq(q,Q,Y));x.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 R0(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,K)=>{if(J==null&&q.presetArg!==void 0)J=q.presetArg;let $=this.getOptionValue(Y);if(J!==null&&q.parseArg)J=this._callParseArg(q,J,$,W);else if(J!==null&&q.variadic)J=q._concatValue(J,$);if(J==null)if(q.negate)J=!1;else if(q.isBoolean()||q.optional)J=!0;else J="";this.setOptionValueWithSource(Y,J,K)};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 R0)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 K=X;X=($,L)=>{let B=K.exec($);return B?B[0]:L},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(x.versions?.electron)Q.from="electron";let X=x.execArgv??[];if(X.includes("-e")||X.includes("--eval")||X.includes("-p")||X.includes("--print"))Q.from="eval"}if(q===void 0)q=x.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(x.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(B,U){let w=o.resolve(B,U);if(uq.existsSync(w))return w;if(X.includes(o.extname(U)))return;let D=X.find((V)=>uq.existsSync(`${w}${V}`));if(D)return`${w}${D}`;return}this._checkForMissingMandatoryOptions(),this._checkForConflictingOptions();let W=q._executableFile||`${this._name}-${q._name}`,K=this._executableDir||"";if(this._scriptPath){let B;try{B=uq.realpathSync(this._scriptPath)}catch(U){B=this._scriptPath}K=o.resolve(o.dirname(B),K)}if(K){let B=J(K,W);if(!B&&!q._executableFile&&this._scriptPath){let U=o.basename(this._scriptPath,o.extname(this._scriptPath));if(U!==this._name)B=J(K,`${U}-${q._name}`)}W=B||W}Y=X.includes(o.extname(W));let $;if(x.platform!=="win32")if(Y)Q.unshift(W),Q=I0(x.execArgv).concat(Q),$=yq.spawn(x.argv[0],Q,{stdio:"inherit"});else $=yq.spawn(W,Q,{stdio:"inherit"});else Q.unshift(W),Q=I0(x.execArgv).concat(Q),$=yq.spawn(x.execPath,Q,{stdio:"inherit"});if(!$.killed)["SIGUSR1","SIGUSR2","SIGTERM","SIGINT","SIGHUP"].forEach((U)=>{x.on(U,()=>{if($.killed===!1&&$.exitCode===null)$.kill(U)})});let L=this._exitCallback;$.on("close",(B)=>{if(B=B??1,!L)x.exit(B);else L(new fq(B,"commander.executeSubCommandAsync","(close)"))}),$.on("error",(B)=>{if(B.code==="ENOENT"){let U=K?`searched for local subcommand relative to directory '${K}'`:"no directory for search for local subcommand, use .executableDir() to supply a custom directory",w=`'${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
|
+
- ${U}`;throw Error(w)}else if(B.code==="EACCES")throw Error(`'${W}' not executable`);if(!L)x.exit(1);else{let U=new fq(1,"commander.executeSubCommandAsync","(error)");U.nestedError=B,L(U)}}),this.runningCommand=$}_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 K=`error: command-argument value '${X}' is invalid for argument '${Y.name()}'.`;W=this._callParseArg(Y,X,J,K)}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,K)=>{return q(Y,K,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($){return $.length>1&&$[0]==="-"}let K=null;while(J.length){let $=J.shift();if($==="--"){if(X===Y)X.push($);X.push(...J);break}if(K&&!W($)){this.emit(`option:${K.name()}`,$);continue}if(K=null,W($)){let L=this._findOption($);if(L){if(L.required){let B=J.shift();if(B===void 0)this.optionMissingArgument(L);this.emit(`option:${L.name()}`,B)}else if(L.optional){let B=null;if(J.length>0&&!W(J[0]))B=J.shift();this.emit(`option:${L.name()}`,B)}else this.emit(`option:${L.name()}`);K=L.variadic?L:null;continue}}if($.length>2&&$[0]==="-"&&$[1]!=="-"){let L=this._findOption(`-${$[1]}`);if(L){if(L.required||L.optional&&this._combineFlagAndOptionalValue)this.emit(`option:${L.name()}`,$.slice(2));else this.emit(`option:${L.name()}`),J.unshift(`-${$.slice(2)}`);continue}}if(/^--[^=]+=/.test($)){let L=$.indexOf("="),B=this._findOption($.slice(0,L));if(B&&(B.required||B.optional)){this.emit(`option:${B.name()}`,$.slice(L+1));continue}}if(W($))X=Y;if((this._enablePositionalOptions||this._passThroughOptions)&&Q.length===0&&Y.length===0){if(this._findCommand($)){if(Q.push($),J.length>0)Y.push(...J);break}else if(this._getHelpCommand()&&$===this._getHelpCommand().name()){if(Q.push($),J.length>0)Q.push(...J);break}else if(this._defaultCommandName){if(Y.push($),J.length>0)Y.push(...J);break}}if(this._passThroughOptions){if(X.push($),J.length>0)X.push(...J);break}X.push($)}return{operands:Q,unknown:Y}}opts(){if(this._storeOptionsAsProperties){let q={},Q=this.options.length;for(let Y=0;Y<Q;Y++){let X=this.options[Y].attributeName();q[X]=X===this._versionOptionName?this._version:this[X]}return q}return this._optionValues}optsWithGlobals(){return this._getCommandAndAncestors().reduce((q,Q)=>Object.assign(q,Q.opts()),{})}error(q,Q){if(this._outputConfiguration.outputError(`${q}
|
|
19
19
|
`,this._outputConfiguration.writeErr),typeof this._showHelpAfterError==="string")this._outputConfiguration.writeErr(`${this._showHelpAfterError}
|
|
20
20
|
`);else if(this._showHelpAfterError)this._outputConfiguration.writeErr(`
|
|
21
|
-
`),this.outputHelp({error:!0});let Y=Q||{},X=Y.exitCode||1,J=Y.code||"commander.error";this._exit(X,J,q)}_parseOptionsEnv(){this.options.forEach((q)=>{if(q.envVar&&q.envVar in
|
|
22
|
-
`),this._exit(0,"commander.version",q)}),this}description(q,Q){if(q===void 0&&Q===void 0)return this._description;if(this._description=q,Q)this._argsDescription=Q;return this}summary(q){if(q===void 0)return this._summary;return this._summary=q,this}alias(q){if(q===void 0)return this._aliases[0];let Q=this;if(this.commands.length!==0&&this.commands[this.commands.length-1]._executableHandler)Q=this.commands[this.commands.length-1];if(q===Q._name)throw Error("Command alias can't be the same as its name");let Y=this.parent?._findCommand(q);if(Y){let X=[Y.name()].concat(Y.aliases()).join("|");throw Error(`cannot add alias '${q}' to command '${this.name()}' as already have command '${X}'`)}return Q._aliases.push(q),this}aliases(q){if(q===void 0)return this._aliases;return q.forEach((Q)=>this.alias(Q)),this}usage(q){if(q===void 0){if(this._usage)return this._usage;let Q=this.registeredArguments.map((Y)=>{return
|
|
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 x.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()}`,x.env[q.envVar]);else this.emit(`optionEnv:${q.name()}`)}})}_parseOptionsImplied(){let q=new nQ(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 K=W.attributeName(),$=this.getOptionValue(K),L=this.options.find((U)=>U.negate&&K===U.attributeName()),B=this.options.find((U)=>!U.negate&&K===U.attributeName());if(L&&(L.presetArg===void 0&&$===!1||L.presetArg!==void 0&&$===L.presetArg))return L;return B||W},X=(W)=>{let K=Y(W),$=K.attributeName();if(this.getOptionValueSource($)==="env")return`environment variable '${K.envVar}'`;return`option '${K.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((K)=>K.long).map((K)=>K.long);X=X.concat(W),J=J.parent}while(J&&!J._enablePositionalOptions);Q=A0(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=A0(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=o.basename(q,o.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=x.exitCode||0;if(Q===0&&q&&typeof q!=="function"&&q.error)Q=1;this._exit(Q,"commander.help","(outputHelp)")}addHelpText(q,Q){let Y=["beforeAll","before","after","afterAll"];if(!Y.includes(q))throw Error(`Unexpected value for position to addHelpText.
|
|
23
23
|
Expecting one of '${Y.join("', '")}'`);let X=`${q}Help`;return this.on(X,(J)=>{let W;if(typeof Q==="function")W=Q({error:J.error,command:J.command});else W=Q;if(W)J.write(`${W}
|
|
24
|
-
`)}),this}_outputHelpIfRequested(q){let Q=this._getHelpOption();if(Q&&q.find((X)=>Q.is(X)))this.outputHelp(),this._exit(0,"commander.helpDisplayed","(outputHelp)")}}function _q(q){return q.map((Q)=>{if(!Q.startsWith("--inspect"))return Q;let Y,X="127.0.0.1",J="9229",W;if((W=Q.match(/^(--inspect(-brk)?)$/))!==null)Y=W[1];else if((W=Q.match(/^(--inspect(-brk|-port)?)=([^:]+)$/))!==null)if(Y=W[1],/^\d+$/.test(W[3]))J=W[3];else X=W[3];else if((W=Q.match(/^(--inspect(-brk|-port)?)=([^:]+):(\d+)$/))!==null)Y=W[1],X=W[3],J=W[4];if(Y&&J!=="0")return`${Y}=${X}:${parseInt(J)+1}`;return Q})}OQ.Command=zq});var Cq=R((xQ)=>{var{Argument:Oq}=l(),{Command:Gq}=Zq(),{CommanderError:kQ,InvalidArgumentError:bq}=C(),{Help:CQ}=Qq(),{Option:kq}=Yq();xQ.program=new Gq;xQ.createCommand=(q)=>new Gq(q);xQ.createOption=(q,Q)=>new kq(q,Q);xQ.createArgument=(q,Q)=>new Oq(q,Q);xQ.Command=Gq;xQ.Option=kq;xQ.Argument=Oq;xQ.Help=CQ;xQ.CommanderError=kQ;xQ.InvalidArgumentError=bq;xQ.InvalidOptionArgumentError=bq});var xq=a(Cq(),1),{program:M,createCommand:xY,createArgument:vY,createOption:hY,CommanderError:gY,InvalidArgumentError:yY,InvalidOptionArgumentError:cY,Command:fY,Argument:uY,Option:mY,Help:lY}=xq.default;import{cp as VY,exists as S,mkdir as s,writeFile as D,readFile as sq}from"fs/promises";import{join as V,relative as jY}from"path";import{spawn as e}from"child_process";import{homedir as IY}from"os";var Hq={rust:{courseJson:{id:"{{id}}",name:"{{name}}",runner:{command:"cargo",args:["test","--quiet","--manifest-path","./content/{{id}}/Cargo.toml"],cwd:"."},content:{root:".",exercises:"content"},setup:{checks:[{name:"Rust Compiler",type:"command",command:"rustc --version"},{name:"Cargo Package Manager",type:"command",command:"cargo --version"}],guide:"SETUP.md"}},setupMd:`# \uD83E\uDD80 Rust Setup Guide
|
|
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 I0(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})}sQ.Command=mq});var E0=O((qY)=>{var{Argument:z0}=Mq(),{Command:cq}=H0(),{CommanderError:aQ,InvalidArgumentError:j0}=Vq(),{Help:eQ}=hq(),{Option:U0}=gq();qY.program=new cq;qY.createCommand=(q)=>new cq(q);qY.createOption=(q,Q)=>new U0(q,Q);qY.createArgument=(q,Q)=>new z0(q,Q);qY.Command=cq;qY.Option=U0;qY.Argument=z0;qY.Help=eQ;qY.CommanderError=aQ;qY.InvalidArgumentError=j0;qY.InvalidOptionArgumentError=j0});var tq=O((jJ,g0)=>{g0.exports={LOCHDR:30,LOCSIG:67324752,LOCVER:4,LOCFLG:6,LOCHOW:8,LOCTIM:10,LOCCRC:14,LOCSIZ:18,LOCLEN:22,LOCNAM:26,LOCEXT:28,EXTSIG:134695760,EXTHDR:16,EXTCRC:4,EXTSIZ:8,EXTLEN:12,CENHDR:46,CENSIG:33639248,CENVEM:4,CENVER:6,CENFLG:8,CENHOW:10,CENTIM:12,CENCRC:16,CENSIZ:20,CENLEN:24,CENNAM:28,CENEXT:30,CENCOM:32,CENDSK:34,CENATT:36,CENATX:38,CENOFF:42,ENDHDR:22,ENDSIG:101010256,ENDSUB:8,ENDTOT:10,ENDSIZ:12,ENDOFF:16,ENDCOM:20,END64HDR:20,END64SIG:117853008,END64START:4,END64OFF:8,END64NUMDISKS:16,ZIP64SIG:101075792,ZIP64HDR:56,ZIP64LEAD:12,ZIP64SIZE:4,ZIP64VEM:12,ZIP64VER:14,ZIP64DSK:16,ZIP64DSKDIR:20,ZIP64SUB:24,ZIP64TOT:32,ZIP64SIZB:40,ZIP64OFF:48,ZIP64EXTRA:56,STORED:0,SHRUNK:1,REDUCED1:2,REDUCED2:3,REDUCED3:4,REDUCED4:5,IMPLODED:6,DEFLATED:8,ENHANCED_DEFLATED:9,PKWARE:10,BZIP2:12,LZMA:14,IBM_TERSE:18,IBM_LZ77:19,AES_ENCRYPT:99,FLG_ENC:1,FLG_COMP1:2,FLG_COMP2:4,FLG_DESC:8,FLG_ENH:16,FLG_PATCH:32,FLG_STR:64,FLG_EFS:2048,FLG_MSK:4096,FILE:2,BUFFER:1,NONE:0,EF_ID:0,EF_SIZE:2,ID_ZIP64:1,ID_AVINFO:7,ID_PFS:8,ID_OS2:9,ID_NTFS:10,ID_OPENVMS:12,ID_UNIX:13,ID_FORK:14,ID_PATCH:15,ID_X509_PKCS7:20,ID_X509_CERTID_F:21,ID_X509_CERTID_C:22,ID_STRONGENC:23,ID_RECORD_MGT:24,ID_X509_PKCS7_RL:25,ID_IBM1:101,ID_IBM2:102,ID_POSZIP:18064,EF_ZIP64_OR_32:4294967295,EF_ZIP64_OR_16:65535,EF_ZIP64_SUNCOMP:0,EF_ZIP64_SCOMP:8,EF_ZIP64_RHO:16,EF_ZIP64_DSN:24}});var Oq=O((u0)=>{var y0={INVALID_LOC:"Invalid LOC header (bad signature)",INVALID_CEN:"Invalid CEN header (bad signature)",INVALID_END:"Invalid END header (bad signature)",DESCRIPTOR_NOT_EXIST:"No descriptor present",DESCRIPTOR_UNKNOWN:"Unknown descriptor format",DESCRIPTOR_FAULTY:"Descriptor data is malformed",NO_DATA:"Nothing to decompress",BAD_CRC:"CRC32 checksum failed {0}",FILE_IN_THE_WAY:"There is a file in the way: {0}",UNKNOWN_METHOD:"Invalid/unsupported compression method",AVAIL_DATA:"inflate::Available inflate data did not terminate",INVALID_DISTANCE:"inflate::Invalid literal/length or distance code in fixed or dynamic block",TO_MANY_CODES:"inflate::Dynamic block code description: too many length or distance codes",INVALID_REPEAT_LEN:"inflate::Dynamic block code description: repeat more than specified lengths",INVALID_REPEAT_FIRST:"inflate::Dynamic block code description: repeat lengths with no first length",INCOMPLETE_CODES:"inflate::Dynamic block code description: code lengths codes incomplete",INVALID_DYN_DISTANCE:"inflate::Dynamic block code description: invalid distance code lengths",INVALID_CODES_LEN:"inflate::Dynamic block code description: invalid literal/length code lengths",INVALID_STORE_BLOCK:"inflate::Stored block length did not match one's complement",INVALID_BLOCK_TYPE:"inflate::Invalid block type (type == 3)",CANT_EXTRACT_FILE:"Could not extract the file",CANT_OVERRIDE:"Target file already exists",DISK_ENTRY_TOO_LARGE:"Number of disk entries is too large",NO_ZIP:"No zip file was loaded",NO_ENTRY:"Entry doesn't exist",DIRECTORY_CONTENT_ERROR:"A directory cannot have content",FILE_NOT_FOUND:'File not found: "{0}"',NOT_IMPLEMENTED:"Not implemented",INVALID_FILENAME:"Invalid filename",INVALID_FORMAT:"Invalid or unsupported zip format. No END header found",INVALID_PASS_PARAM:"Incompatible password parameter",WRONG_PASSWORD:"Wrong Password",COMMENT_TOO_LONG:"Comment is too long",EXTRA_FIELD_PARSE_ERROR:"Extra field parsing error"};function hY(q){return function(...Q){if(Q.length)q=q.replace(/\{(\d)\}/g,(Y,X)=>Q[X]||"");return Error("ADM-ZIP: "+q)}}for(let q of Object.keys(y0))u0[q]=hY(y0[q])});var l0=O((EJ,p0)=>{var gY=f("fs"),g=f("path"),f0=tq(),yY=Oq(),uY=typeof process==="object"&&process.platform==="win32",m0=(q)=>typeof q==="object"&&q!==null,c0=new Uint32Array(256).map((q,Q)=>{for(let Y=0;Y<8;Y++)if((Q&1)!==0)Q=3988292384^Q>>>1;else Q>>>=1;return Q>>>0});function _(q){if(this.sep=g.sep,this.fs=gY,m0(q)){if(m0(q.fs)&&typeof q.fs.statSync==="function")this.fs=q.fs}}p0.exports=_;_.prototype.makeDir=function(q){let Q=this;function Y(X){let J=X.split(Q.sep)[0];X.split(Q.sep).forEach(function(W){if(!W||W.substr(-1,1)===":")return;J+=Q.sep+W;var K;try{K=Q.fs.statSync(J)}catch($){Q.fs.mkdirSync(J)}if(K&&K.isFile())throw yY.FILE_IN_THE_WAY(`"${J}"`)})}Y(q)};_.prototype.writeFileTo=function(q,Q,Y,X){let J=this;if(J.fs.existsSync(q)){if(!Y)return!1;var W=J.fs.statSync(q);if(W.isDirectory())return!1}var K=g.dirname(q);if(!J.fs.existsSync(K))J.makeDir(K);var $;try{$=J.fs.openSync(q,"w",438)}catch(L){J.fs.chmodSync(q,438),$=J.fs.openSync(q,"w",438)}if($)try{J.fs.writeSync($,Q,0,Q.length,0)}finally{J.fs.closeSync($)}return J.fs.chmodSync(q,X||438),!0};_.prototype.writeFileToAsync=function(q,Q,Y,X,J){if(typeof X==="function")J=X,X=void 0;let W=this;W.fs.exists(q,function(K){if(K&&!Y)return J(!1);W.fs.stat(q,function($,L){if(K&&L.isDirectory())return J(!1);var B=g.dirname(q);W.fs.exists(B,function(U){if(!U)W.makeDir(B);W.fs.open(q,"w",438,function(w,D){if(w)W.fs.chmod(q,438,function(){W.fs.open(q,"w",438,function(V,R){W.fs.write(R,Q,0,Q.length,0,function(){W.fs.close(R,function(){W.fs.chmod(q,X||438,function(){J(!0)})})})})});else if(D)W.fs.write(D,Q,0,Q.length,0,function(){W.fs.close(D,function(){W.fs.chmod(q,X||438,function(){J(!0)})})});else W.fs.chmod(q,X||438,function(){J(!0)})})})})})};_.prototype.findFiles=function(q){let Q=this;function Y(X,J,W){if(typeof J==="boolean")W=J,J=void 0;let K=[];return Q.fs.readdirSync(X).forEach(function($){let L=g.join(X,$),B=Q.fs.statSync(L);if(!J||J.test(L))K.push(g.normalize(L)+(B.isDirectory()?Q.sep:""));if(B.isDirectory()&&W)K=K.concat(Y(L,J,W))}),K}return Y(q,void 0,!0)};_.prototype.findFilesAsync=function(q,Q){let Y=this,X=[];Y.fs.readdir(q,function(J,W){if(J)return Q(J);let K=W.length;if(!K)return Q(null,X);W.forEach(function($){$=g.join(q,$),Y.fs.stat($,function(L,B){if(L)return Q(L);if(B){if(X.push(g.normalize($)+(B.isDirectory()?Y.sep:"")),B.isDirectory())Y.findFilesAsync($,function(U,w){if(U)return Q(U);if(X=X.concat(w),!--K)Q(null,X)});else if(!--K)Q(null,X)}})})})};_.prototype.getAttributes=function(){};_.prototype.setAttributes=function(){};_.crc32update=function(q,Q){return c0[(q^Q)&255]^q>>>8};_.crc32=function(q){if(typeof q==="string")q=Buffer.from(q,"utf8");let Q=q.length,Y=-1;for(let X=0;X<Q;)Y=_.crc32update(Y,q[X++]);return~Y>>>0};_.methodToString=function(q){switch(q){case f0.STORED:return"STORED ("+q+")";case f0.DEFLATED:return"DEFLATED ("+q+")";default:return"UNSUPPORTED ("+q+")"}};_.canonical=function(q){if(!q)return"";let Q=g.posix.normalize("/"+q.split("\\").join("/"));return g.join(".",Q)};_.zipnamefix=function(q){if(!q)return"";let Q=g.posix.normalize("/"+q.split("\\").join("/"));return g.posix.join(".",Q)};_.findLast=function(q,Q){if(!Array.isArray(q))throw TypeError("arr is not array");let Y=q.length>>>0;for(let X=Y-1;X>=0;X--)if(Q(q[X],X,q))return q[X];return};_.sanitize=function(q,Q){q=g.resolve(g.normalize(q));var Y=Q.split("/");for(var X=0,J=Y.length;X<J;X++){var W=g.normalize(g.join(q,Y.slice(X,J).join(g.sep)));if(W.indexOf(q)===0)return W}return g.normalize(g.join(q,g.basename(Q)))};_.toBuffer=function(Q,Y){if(Buffer.isBuffer(Q))return Q;else if(Q instanceof Uint8Array)return Buffer.from(Q);else return typeof Q==="string"?Y(Q):Buffer.alloc(0)};_.readBigUInt64LE=function(q,Q){var Y=Buffer.from(q.slice(Q,Q+8));return Y.swap64(),parseInt(`0x${Y.toString("hex")}`)};_.fromDOS2Date=function(q){return new Date((q>>25&127)+1980,Math.max((q>>21&15)-1,0),Math.max(q>>16&31,1),q>>11&31,q>>5&63,(q&31)<<1)};_.fromDate2DOS=function(q){let Q=0,Y=0;if(q.getFullYear()>1979)Q=(q.getFullYear()-1980&127)<<9|q.getMonth()+1<<5|q.getDate(),Y=q.getHours()<<11|q.getMinutes()<<5|q.getSeconds()>>1;return Q<<16|Y};_.isWin=uY;_.crcTable=c0});var o0=O((wJ,d0)=>{var fY=f("path");d0.exports=function(q,{fs:Q}){var Y=q||"",X=W(),J=null;function W(){return{directory:!1,readonly:!1,hidden:!1,executable:!1,mtime:0,atime:0}}if(Y&&Q.existsSync(Y))J=Q.statSync(Y),X.directory=J.isDirectory(),X.mtime=J.mtime,X.atime=J.atime,X.executable=(73&J.mode)!==0,X.readonly=(128&J.mode)===0,X.hidden=fY.basename(Y)[0]===".";else console.warn("Invalid path: "+Y);return{get directory(){return X.directory},get readOnly(){return X.readonly},get hidden(){return X.hidden},get mtime(){return X.mtime},get atime(){return X.atime},get executable(){return X.executable},decodeAttributes:function(){},encodeAttributes:function(){},toJSON:function(){return{path:Y,isDirectory:X.directory,isReadOnly:X.readonly,isHidden:X.hidden,isExecutable:X.executable,mTime:X.mtime,aTime:X.atime}},toString:function(){return JSON.stringify(this.toJSON(),null,"\t")}}}});var i0=O((NJ,r0)=>{r0.exports={efs:!0,encode:(q)=>Buffer.from(q,"utf8"),decode:(q)=>q.toString("utf8")}});var Jq=O((DJ,Xq)=>{Xq.exports=l0();Xq.exports.Constants=tq();Xq.exports.Errors=Oq();Xq.exports.FileAttr=o0();Xq.exports.decoder=i0()});var s0=O((MJ,n0)=>{var i=Jq(),N=i.Constants;n0.exports=function(){var q=20,Q=10,Y=0,X=0,J=0,W=0,K=0,$=0,L=0,B=0,U=0,w=0,D=0,V=0,R=0;q|=i.isWin?2560:768,Y|=N.FLG_EFS;let H={extraLen:0},A=(G)=>Math.max(0,G)>>>0,j=(G)=>Math.max(0,G)&65535,E=(G)=>Math.max(0,G)&255;return J=i.fromDate2DOS(new Date),{get made(){return q},set made(G){q=G},get version(){return Q},set version(G){Q=G},get flags(){return Y},set flags(G){Y=G},get flags_efs(){return(Y&N.FLG_EFS)>0},set flags_efs(G){if(G)Y|=N.FLG_EFS;else Y&=~N.FLG_EFS},get flags_desc(){return(Y&N.FLG_DESC)>0},set flags_desc(G){if(G)Y|=N.FLG_DESC;else Y&=~N.FLG_DESC},get method(){return X},set method(G){switch(G){case N.STORED:this.version=10;case N.DEFLATED:default:this.version=20}X=G},get time(){return i.fromDOS2Date(this.timeval)},set time(G){this.timeval=i.fromDate2DOS(G)},get timeval(){return J},set timeval(G){J=A(G)},get timeHighByte(){return E(J>>>8)},get crc(){return W},set crc(G){W=A(G)},get compressedSize(){return K},set compressedSize(G){K=A(G)},get size(){return $},set size(G){$=A(G)},get fileNameLength(){return L},set fileNameLength(G){L=G},get extraLength(){return B},set extraLength(G){B=G},get extraLocalLength(){return H.extraLen},set extraLocalLength(G){H.extraLen=G},get commentLength(){return U},set commentLength(G){U=G},get diskNumStart(){return w},set diskNumStart(G){w=A(G)},get inAttr(){return D},set inAttr(G){D=A(G)},get attr(){return V},set attr(G){V=A(G)},get fileAttr(){return(V||0)>>16&4095},get offset(){return R},set offset(G){R=A(G)},get encrypted(){return(Y&N.FLG_ENC)===N.FLG_ENC},get centralHeaderSize(){return N.CENHDR+L+B+U},get realDataOffset(){return R+N.LOCHDR+H.fnameLen+H.extraLen},get localHeader(){return H},loadLocalHeaderFromBinary:function(G){var I=G.slice(R,R+N.LOCHDR);if(I.readUInt32LE(0)!==N.LOCSIG)throw i.Errors.INVALID_LOC();H.version=I.readUInt16LE(N.LOCVER),H.flags=I.readUInt16LE(N.LOCFLG),H.method=I.readUInt16LE(N.LOCHOW),H.time=I.readUInt32LE(N.LOCTIM),H.crc=I.readUInt32LE(N.LOCCRC),H.compressedSize=I.readUInt32LE(N.LOCSIZ),H.size=I.readUInt32LE(N.LOCLEN),H.fnameLen=I.readUInt16LE(N.LOCNAM),H.extraLen=I.readUInt16LE(N.LOCEXT);let z=R+N.LOCHDR+H.fnameLen,S=z+H.extraLen;return G.slice(z,S)},loadFromBinary:function(G){if(G.length!==N.CENHDR||G.readUInt32LE(0)!==N.CENSIG)throw i.Errors.INVALID_CEN();q=G.readUInt16LE(N.CENVEM),Q=G.readUInt16LE(N.CENVER),Y=G.readUInt16LE(N.CENFLG),X=G.readUInt16LE(N.CENHOW),J=G.readUInt32LE(N.CENTIM),W=G.readUInt32LE(N.CENCRC),K=G.readUInt32LE(N.CENSIZ),$=G.readUInt32LE(N.CENLEN),L=G.readUInt16LE(N.CENNAM),B=G.readUInt16LE(N.CENEXT),U=G.readUInt16LE(N.CENCOM),w=G.readUInt16LE(N.CENDSK),D=G.readUInt16LE(N.CENATT),V=G.readUInt32LE(N.CENATX),R=G.readUInt32LE(N.CENOFF)},localHeaderToBinary:function(){var G=Buffer.alloc(N.LOCHDR);return G.writeUInt32LE(N.LOCSIG,0),G.writeUInt16LE(Q,N.LOCVER),G.writeUInt16LE(Y,N.LOCFLG),G.writeUInt16LE(X,N.LOCHOW),G.writeUInt32LE(J,N.LOCTIM),G.writeUInt32LE(W,N.LOCCRC),G.writeUInt32LE(K,N.LOCSIZ),G.writeUInt32LE($,N.LOCLEN),G.writeUInt16LE(L,N.LOCNAM),G.writeUInt16LE(H.extraLen,N.LOCEXT),G},centralHeaderToBinary:function(){var G=Buffer.alloc(N.CENHDR+L+B+U);return G.writeUInt32LE(N.CENSIG,0),G.writeUInt16LE(q,N.CENVEM),G.writeUInt16LE(Q,N.CENVER),G.writeUInt16LE(Y,N.CENFLG),G.writeUInt16LE(X,N.CENHOW),G.writeUInt32LE(J,N.CENTIM),G.writeUInt32LE(W,N.CENCRC),G.writeUInt32LE(K,N.CENSIZ),G.writeUInt32LE($,N.CENLEN),G.writeUInt16LE(L,N.CENNAM),G.writeUInt16LE(B,N.CENEXT),G.writeUInt16LE(U,N.CENCOM),G.writeUInt16LE(w,N.CENDSK),G.writeUInt16LE(D,N.CENATT),G.writeUInt32LE(V,N.CENATX),G.writeUInt32LE(R,N.CENOFF),G},toJSON:function(){let G=function(I){return I+" bytes"};return{made:q,version:Q,flags:Y,method:i.methodToString(X),time:this.time,crc:"0x"+W.toString(16).toUpperCase(),compressedSize:G(K),size:G($),fileNameLength:G(L),extraLength:G(B),commentLength:G(U),diskNumStart:w,inAttr:D,attr:V,offset:R,centralHeaderSize:G(N.CENHDR+L+B+U)}},toString:function(){return JSON.stringify(this.toJSON(),null,"\t")}}}});var a0=O((SJ,t0)=>{var Wq=Jq(),b=Wq.Constants;t0.exports=function(){var q=0,Q=0,Y=0,X=0,J=0;return{get diskEntries(){return q},set diskEntries(W){q=Q=W},get totalEntries(){return Q},set totalEntries(W){Q=q=W},get size(){return Y},set size(W){Y=W},get offset(){return X},set offset(W){X=W},get commentLength(){return J},set commentLength(W){J=W},get mainHeaderSize(){return b.ENDHDR+J},loadFromBinary:function(W){if((W.length!==b.ENDHDR||W.readUInt32LE(0)!==b.ENDSIG)&&(W.length<b.ZIP64HDR||W.readUInt32LE(0)!==b.ZIP64SIG))throw Wq.Errors.INVALID_END();if(W.readUInt32LE(0)===b.ENDSIG)q=W.readUInt16LE(b.ENDSUB),Q=W.readUInt16LE(b.ENDTOT),Y=W.readUInt32LE(b.ENDSIZ),X=W.readUInt32LE(b.ENDOFF),J=W.readUInt16LE(b.ENDCOM);else q=Wq.readBigUInt64LE(W,b.ZIP64SUB),Q=Wq.readBigUInt64LE(W,b.ZIP64TOT),Y=Wq.readBigUInt64LE(W,b.ZIP64SIZE),X=Wq.readBigUInt64LE(W,b.ZIP64OFF),J=0},toBinary:function(){var W=Buffer.alloc(b.ENDHDR+J);return W.writeUInt32LE(b.ENDSIG,0),W.writeUInt32LE(0,4),W.writeUInt16LE(q,b.ENDSUB),W.writeUInt16LE(Q,b.ENDTOT),W.writeUInt32LE(Y,b.ENDSIZ),W.writeUInt32LE(X,b.ENDOFF),W.writeUInt16LE(J,b.ENDCOM),W.fill(" ",b.ENDHDR),W},toJSON:function(){let W=function(K,$){let L=K.toString(16).toUpperCase();while(L.length<$)L="0"+L;return"0x"+L};return{diskEntries:q,totalEntries:Q,size:Y+" bytes",offset:W(X,4),commentLength:J}},toString:function(){return JSON.stringify(this.toJSON(),null,"\t")}}}});var aq=O((mY)=>{mY.EntryHeader=s0();mY.MainHeader=a0()});var qQ=O((FJ,e0)=>{e0.exports=function(q){var Q=f("zlib"),Y={chunkSize:(parseInt(q.length/1024)+1)*1024};return{deflate:function(){return Q.deflateRawSync(q,Y)},deflateAsync:function(X){var J=Q.createDeflateRaw(Y),W=[],K=0;J.on("data",function($){W.push($),K+=$.length}),J.on("end",function(){var $=Buffer.alloc(K),L=0;$.fill(0);for(var B=0;B<W.length;B++){var U=W[B];U.copy($,L),L+=U.length}X&&X($)}),J.end(q)}}}});var YQ=O((ZJ,QQ)=>{var lY=+(process.versions?process.versions.node:"").split(".")[0]||0;QQ.exports=function(q,Q){var Y=f("zlib");let X=lY>=15&&Q>0?{maxOutputLength:Q}:{};return{inflate:function(){return Y.inflateRawSync(q,X)},inflateAsync:function(J){var W=Y.createInflateRaw(X),K=[],$=0;W.on("data",function(L){K.push(L),$+=L.length}),W.on("end",function(){var L=Buffer.alloc($),B=0;L.fill(0);for(var U=0;U<K.length;U++){var w=K[U];w.copy(L,B),B+=w.length}J&&J(L)}),W.end(q)}}}});var KQ=O((PJ,GQ)=>{var{randomFillSync:XQ}=f("crypto"),dY=Oq(),oY=new Uint32Array(256).map((q,Q)=>{for(let Y=0;Y<8;Y++)if((Q&1)!==0)Q=Q>>>1^3988292384;else Q>>>=1;return Q>>>0}),WQ=(q,Q)=>Math.imul(q,Q)>>>0,JQ=(q,Q)=>{return oY[(q^Q)&255]^q>>>8},wq=()=>{if(typeof XQ==="function")return XQ(Buffer.alloc(12));else return wq.node()};wq.node=()=>{let q=Buffer.alloc(12),Q=q.length;for(let Y=0;Y<Q;Y++)q[Y]=Math.random()*256&255;return q};var bq={genSalt:wq};function Cq(q){let Q=Buffer.isBuffer(q)?q:Buffer.from(q);this.keys=new Uint32Array([305419896,591751049,878082192]);for(let Y=0;Y<Q.length;Y++)this.updateKeys(Q[Y])}Cq.prototype.updateKeys=function(q){let Q=this.keys;return Q[0]=JQ(Q[0],q),Q[1]+=Q[0]&255,Q[1]=WQ(Q[1],134775813)+1,Q[2]=JQ(Q[2],Q[1]>>>24),q};Cq.prototype.next=function(){let q=(this.keys[2]|2)>>>0;return WQ(q,q^1)>>8&255};function rY(q){let Q=new Cq(q);return function(Y){let X=Buffer.alloc(Y.length),J=0;for(let W of Y)X[J++]=Q.updateKeys(W^Q.next());return X}}function iY(q){let Q=new Cq(q);return function(Y,X,J=0){if(!X)X=Buffer.alloc(Y.length);for(let W of Y){let K=Q.next();X[J++]=W^K,Q.updateKeys(W)}return X}}function nY(q,Q,Y){if(!q||!Buffer.isBuffer(q)||q.length<12)return Buffer.alloc(0);let X=rY(Y),J=X(q.slice(0,12)),W=(Q.flags&8)===8?Q.timeHighByte:Q.crc>>>24;if(J[11]!==W)throw dY.WRONG_PASSWORD();return X(q.slice(12))}function sY(q){if(Buffer.isBuffer(q)&&q.length>=12)bq.genSalt=function(){return q.slice(0,12)};else if(q==="node")bq.genSalt=wq.node;else bq.genSalt=wq}function tY(q,Q,Y,X=!1){if(q==null)q=Buffer.alloc(0);if(!Buffer.isBuffer(q))q=Buffer.from(q.toString());let J=iY(Y),W=bq.genSalt();if(W[11]=Q.crc>>>24&255,X)W[10]=Q.crc>>>16&255;let K=Buffer.alloc(q.length+12);return J(W,K),J(q,K,12)}GQ.exports={decrypt:nY,encrypt:tY,_salter:sY}});var $Q=O((aY)=>{aY.Deflater=qQ();aY.Inflater=YQ();aY.ZipCrypto=KQ()});var q0=O((bJ,VQ)=>{var F=Jq(),Y8=aq(),k=F.Constants,eq=$Q();VQ.exports=function(q,Q){var Y=new Y8.EntryHeader,X=Buffer.alloc(0),J=Buffer.alloc(0),W=!1,K=null,$=Buffer.alloc(0),L=Buffer.alloc(0),B=!0;let U=q,w=typeof U.decoder==="object"?U.decoder:F.decoder;B=w.hasOwnProperty("efs")?w.efs:!1;function D(){if(!Q||!(Q instanceof Uint8Array))return Buffer.alloc(0);return L=Y.loadLocalHeaderFromBinary(Q),Q.slice(Y.realDataOffset,Y.realDataOffset+Y.compressedSize)}function V(G){if(!Y.flags_desc){if(F.crc32(G)!==Y.localHeader.crc)return!1}else{let I={},z=Y.realDataOffset+Y.compressedSize;if(Q.readUInt32LE(z)==k.LOCSIG||Q.readUInt32LE(z)==k.CENSIG)throw F.Errors.DESCRIPTOR_NOT_EXIST();if(Q.readUInt32LE(z)==k.EXTSIG)I.crc=Q.readUInt32LE(z+k.EXTCRC),I.compressedSize=Q.readUInt32LE(z+k.EXTSIZ),I.size=Q.readUInt32LE(z+k.EXTLEN);else if(Q.readUInt16LE(z+12)===19280)I.crc=Q.readUInt32LE(z+k.EXTCRC-4),I.compressedSize=Q.readUInt32LE(z+k.EXTSIZ-4),I.size=Q.readUInt32LE(z+k.EXTLEN-4);else throw F.Errors.DESCRIPTOR_UNKNOWN();if(I.compressedSize!==Y.compressedSize||I.size!==Y.size||I.crc!==Y.crc)throw F.Errors.DESCRIPTOR_FAULTY();if(F.crc32(G)!==I.crc)return!1}return!0}function R(G,I,z){if(typeof I>"u"&&typeof G==="string")z=G,G=void 0;if(W){if(G&&I)I(Buffer.alloc(0),F.Errors.DIRECTORY_CONTENT_ERROR());return Buffer.alloc(0)}var S=D();if(S.length===0){if(G&&I)I(S);return S}if(Y.encrypted){if(typeof z!=="string"&&!Buffer.isBuffer(z))throw F.Errors.INVALID_PASS_PARAM();S=eq.ZipCrypto.decrypt(S,Y,z)}var M=Buffer.alloc(Y.size);switch(Y.method){case F.Constants.STORED:if(S.copy(M),!V(M)){if(G&&I)I(M,F.Errors.BAD_CRC());throw F.Errors.BAD_CRC()}else{if(G&&I)I(M);return M}case F.Constants.DEFLATED:var Z=new eq.Inflater(S,Y.size);if(!G){if(Z.inflate(M).copy(M,0),!V(M))throw F.Errors.BAD_CRC(`"${w.decode(X)}"`);return M}else Z.inflateAsync(function(T){if(T.copy(T,0),I)if(!V(T))I(T,F.Errors.BAD_CRC());else I(T)});break;default:if(G&&I)I(Buffer.alloc(0),F.Errors.UNKNOWN_METHOD());throw F.Errors.UNKNOWN_METHOD()}}function H(G,I){if((!K||!K.length)&&Buffer.isBuffer(Q)){if(G&&I)I(D());return D()}if(K.length&&!W){var z;switch(Y.method){case F.Constants.STORED:if(Y.compressedSize=Y.size,z=Buffer.alloc(K.length),K.copy(z),G&&I)I(z);return z;default:case F.Constants.DEFLATED:var S=new eq.Deflater(K);if(!G){var M=S.deflate();return Y.compressedSize=M.length,M}else S.deflateAsync(function(Z){z=Buffer.alloc(Z.length),Y.compressedSize=Z.length,Z.copy(z),I&&I(z)});S=null;break}}else if(G&&I)I(Buffer.alloc(0));else return Buffer.alloc(0)}function A(G,I){return(G.readUInt32LE(I+4)<<4)+G.readUInt32LE(I)}function j(G){try{var I=0,z,S,M;while(I+4<G.length)if(z=G.readUInt16LE(I),I+=2,S=G.readUInt16LE(I),I+=2,M=G.slice(I,I+S),I+=S,k.ID_ZIP64===z)E(M)}catch(Z){throw F.Errors.EXTRA_FIELD_PARSE_ERROR()}}function E(G){var I,z,S,M;if(G.length>=k.EF_ZIP64_SCOMP){if(I=A(G,k.EF_ZIP64_SUNCOMP),Y.size===k.EF_ZIP64_OR_32)Y.size=I}if(G.length>=k.EF_ZIP64_RHO){if(z=A(G,k.EF_ZIP64_SCOMP),Y.compressedSize===k.EF_ZIP64_OR_32)Y.compressedSize=z}if(G.length>=k.EF_ZIP64_DSN){if(S=A(G,k.EF_ZIP64_RHO),Y.offset===k.EF_ZIP64_OR_32)Y.offset=S}if(G.length>=k.EF_ZIP64_DSN+4){if(M=G.readUInt32LE(k.EF_ZIP64_DSN),Y.diskNumStart===k.EF_ZIP64_OR_16)Y.diskNumStart=M}}return{get entryName(){return w.decode(X)},get rawEntryName(){return X},set entryName(G){X=F.toBuffer(G,w.encode);var I=X[X.length-1];W=I===47||I===92,Y.fileNameLength=X.length},get efs(){if(typeof B==="function")return B(this.entryName);else return B},get extra(){return $},set extra(G){$=G,Y.extraLength=G.length,j(G)},get comment(){return w.decode(J)},set comment(G){if(J=F.toBuffer(G,w.encode),Y.commentLength=J.length,J.length>65535)throw F.Errors.COMMENT_TOO_LONG()},get name(){var G=w.decode(X);return W?G.substr(G.length-1).split("/").pop():G.split("/").pop()},get isDirectory(){return W},getCompressedData:function(){return H(!1,null)},getCompressedDataAsync:function(G){H(!0,G)},setData:function(G){if(K=F.toBuffer(G,F.decoder.encode),!W&&K.length)Y.size=K.length,Y.method=F.Constants.DEFLATED,Y.crc=F.crc32(G),Y.changed=!0;else Y.method=F.Constants.STORED},getData:function(G){if(Y.changed)return K;else return R(!1,null,G)},getDataAsync:function(G,I){if(Y.changed)G(K);else R(!0,G,I)},set attr(G){Y.attr=G},get attr(){return Y.attr},set header(G){Y.loadFromBinary(G)},get header(){return Y},packCentralHeader:function(){Y.flags_efs=this.efs,Y.extraLength=$.length;var G=Y.centralHeaderToBinary(),I=F.Constants.CENHDR;return X.copy(G,I),I+=X.length,$.copy(G,I),I+=Y.extraLength,J.copy(G,I),G},packLocalHeader:function(){let G=0;Y.flags_efs=this.efs,Y.extraLocalLength=L.length;let I=Y.localHeaderToBinary(),z=Buffer.alloc(I.length+X.length+Y.extraLocalLength);return I.copy(z,G),G+=I.length,X.copy(z,G),G+=X.length,L.copy(z,G),G+=L.length,z},toJSON:function(){let G=function(I){return"<"+(I&&I.length+" bytes buffer"||"null")+">"};return{entryName:this.entryName,name:this.name,comment:this.comment,isDirectory:this.isDirectory,header:Y.toJSON(),compressedData:G(Q),data:G(K)}},toString:function(){return JSON.stringify(this.toJSON(),null,"\t")}}}});var RQ=O((CJ,BQ)=>{var LQ=q0(),X8=aq(),u=Jq();BQ.exports=function(q,Q){var Y=[],X={},J=Buffer.alloc(0),W=new X8.MainHeader,K=!1,$=null;let L=new Set,B=Q,{noSort:U,decoder:w}=B;if(q)R(B.readEntries);else K=!0;function D(){let A=new Set;for(let j of Object.keys(X)){let E=j.split("/");if(E.pop(),!E.length)continue;for(let G=0;G<E.length;G++){let I=E.slice(0,G+1).join("/")+"/";A.add(I)}}for(let j of A)if(!(j in X)){let E=new LQ(B);E.entryName=j,E.attr=16,E.temporary=!0,Y.push(E),X[E.entryName]=E,L.add(E)}}function V(){if(K=!0,X={},W.diskEntries>(q.length-W.offset)/u.Constants.CENHDR)throw u.Errors.DISK_ENTRY_TOO_LARGE();Y=Array(W.diskEntries);var A=W.offset;for(var j=0;j<Y.length;j++){var E=A,G=new LQ(B,q);if(G.header=q.slice(E,E+=u.Constants.CENHDR),G.entryName=q.slice(E,E+=G.header.fileNameLength),G.header.extraLength)G.extra=q.slice(E,E+=G.header.extraLength);if(G.header.commentLength)G.comment=q.slice(E,E+G.header.commentLength);A+=G.header.centralHeaderSize,Y[j]=G,X[G.entryName]=G}L.clear(),D()}function R(A){var j=q.length-u.Constants.ENDHDR,E=Math.max(0,j-65535),G=E,I=q.length,z=-1,S=0;if(typeof B.trailingSpace==="boolean"?B.trailingSpace:!1)E=0;for(j;j>=G;j--){if(q[j]!==80)continue;if(q.readUInt32LE(j)===u.Constants.ENDSIG){z=j,S=j,I=j+u.Constants.ENDHDR,G=j-u.Constants.END64HDR;continue}if(q.readUInt32LE(j)===u.Constants.END64SIG){G=E;continue}if(q.readUInt32LE(j)===u.Constants.ZIP64SIG){z=j,I=j+u.readBigUInt64LE(q,j+u.Constants.ZIP64SIZE)+u.Constants.ZIP64LEAD;break}}if(z==-1)throw u.Errors.INVALID_FORMAT();if(W.loadFromBinary(q.slice(z,I)),W.commentLength)J=q.slice(S+u.Constants.ENDHDR);if(A)V()}function H(){if(Y.length>1&&!U)Y.sort((A,j)=>A.entryName.toLowerCase().localeCompare(j.entryName.toLowerCase()))}return{get entries(){if(!K)V();return Y.filter((A)=>!L.has(A))},get comment(){return w.decode(J)},set comment(A){J=u.toBuffer(A,w.encode),W.commentLength=J.length},getEntryCount:function(){if(!K)return W.diskEntries;return Y.length},forEach:function(A){this.entries.forEach(A)},getEntry:function(A){if(!K)V();return X[A]||null},setEntry:function(A){if(!K)V();Y.push(A),X[A.entryName]=A,W.totalEntries=Y.length},deleteFile:function(A,j=!0){if(!K)V();let E=X[A];this.getEntryChildren(E,j).map((I)=>I.entryName).forEach(this.deleteEntry)},deleteEntry:function(A){if(!K)V();let j=X[A],E=Y.indexOf(j);if(E>=0)Y.splice(E,1),delete X[A],W.totalEntries=Y.length},getEntryChildren:function(A,j=!0){if(!K)V();if(typeof A==="object")if(A.isDirectory&&j){let E=[],G=A.entryName;for(let I of Y)if(I.entryName.startsWith(G))E.push(I);return E}else return[A];return[]},getChildCount:function(A){if(A&&A.isDirectory){let j=this.getEntryChildren(A);return j.includes(A)?j.length-1:j.length}return 0},compressToBuffer:function(){if(!K)V();H();let A=[],j=[],E=0,G=0;W.size=0,W.offset=0;let I=0;for(let M of this.entries){let Z=M.getCompressedData();M.header.offset=G;let T=M.packLocalHeader(),y=T.length+Z.length;G+=y,A.push(T),A.push(Z);let P=M.packCentralHeader();j.push(P),W.size+=P.length,E+=y+P.length,I++}E+=W.mainHeaderSize,W.offset=G,W.totalEntries=I,G=0;let z=Buffer.alloc(E);for(let M of A)M.copy(z,G),G+=M.length;for(let M of j)M.copy(z,G),G+=M.length;let S=W.toBinary();if(J)J.copy(S,u.Constants.ENDHDR);return S.copy(z,G),q=z,K=!1,z},toAsyncBuffer:function(A,j,E,G){try{if(!K)V();H();let I=[],z=[],S=0,M=0,Z=0;W.size=0,W.offset=0;let T=function(y){if(y.length>0){let P=y.shift(),d=P.entryName+P.extra.toString();if(E)E(d);P.getCompressedDataAsync(function(p){if(G)G(d);P.header.offset=M;let Dq=P.packLocalHeader(),J0=Dq.length+p.length;M+=J0,I.push(Dq),I.push(p);let kq=P.packCentralHeader();z.push(kq),W.size+=kq.length,S+=J0+kq.length,Z++,T(y)})}else{S+=W.mainHeaderSize,W.offset=M,W.totalEntries=Z,M=0;let P=Buffer.alloc(S);I.forEach(function(p){p.copy(P,M),M+=p.length}),z.forEach(function(p){p.copy(P,M),M+=p.length});let d=W.toBinary();if(J)J.copy(d,u.Constants.ENDHDR);d.copy(P,M),q=P,K=!1,A(P)}};T(Array.from(this.entries))}catch(I){j(I)}}}}});var HQ=O((xJ,IQ)=>{var C=Jq(),v=f("path"),J8=q0(),W8=RQ(),t=(...q)=>C.findLast(q,(Q)=>typeof Q==="boolean"),AQ=(...q)=>C.findLast(q,(Q)=>typeof Q==="string"),G8=(...q)=>C.findLast(q,(Q)=>typeof Q==="function"),K8={noSort:!1,readEntries:!1,method:C.Constants.NONE,fs:null};IQ.exports=function(q,Q){let Y=null,X=Object.assign(Object.create(null),K8);if(q&&typeof q==="object"){if(!(q instanceof Uint8Array)){if(Object.assign(X,q),q=X.input?X.input:void 0,X.input)delete X.input}if(Buffer.isBuffer(q))Y=q,X.method=C.Constants.BUFFER,q=void 0}Object.assign(X,Q);let J=new C(X);if(typeof X.decoder!=="object"||typeof X.decoder.encode!=="function"||typeof X.decoder.decode!=="function")X.decoder=C.decoder;if(q&&typeof q==="string")if(J.fs.existsSync(q))X.method=C.Constants.FILE,X.filename=q,Y=J.fs.readFileSync(q);else throw C.Errors.INVALID_FILENAME();let W=new W8(Y,X),{canonical:K,sanitize:$,zipnamefix:L}=C;function B(V){if(V&&W){var R;if(typeof V==="string")R=W.getEntry(v.posix.normalize(V));if(typeof V==="object"&&typeof V.entryName<"u"&&typeof V.header<"u")R=W.getEntry(V.entryName);if(R)return R}return null}function U(V){let{join:R,normalize:H,sep:A}=v.posix;return R(".",H(A+V.split("\\").join(A)+A))}function w(V){if(V instanceof RegExp)return function(R){return function(H){return R.test(H)}}(V);else if(typeof V!=="function")return()=>!0;return V}let D=(V,R)=>{let H=R.slice(-1);return H=H===J.sep?J.sep:"",v.relative(V,R)+H};return{readFile:function(V,R){var H=B(V);return H&&H.getData(R)||null},childCount:function(V){let R=B(V);if(R)return W.getChildCount(R)},readFileAsync:function(V,R){var H=B(V);if(H)H.getDataAsync(R);else R(null,"getEntry failed for:"+V)},readAsText:function(V,R){var H=B(V);if(H){var A=H.getData();if(A&&A.length)return A.toString(R||"utf8")}return""},readAsTextAsync:function(V,R,H){var A=B(V);if(A)A.getDataAsync(function(j,E){if(E){R(j,E);return}if(j&&j.length)R(j.toString(H||"utf8"));else R("")});else R("")},deleteFile:function(V,R=!0){var H=B(V);if(H)W.deleteFile(H.entryName,R)},deleteEntry:function(V){var R=B(V);if(R)W.deleteEntry(R.entryName)},addZipComment:function(V){W.comment=V},getZipComment:function(){return W.comment||""},addZipEntryComment:function(V,R){var H=B(V);if(H)H.comment=R},getZipEntryComment:function(V){var R=B(V);if(R)return R.comment||"";return""},updateFile:function(V,R){var H=B(V);if(H)H.setData(R)},addLocalFile:function(V,R,H,A){if(J.fs.existsSync(V)){R=R?U(R):"";let j=v.win32.basename(v.win32.normalize(V));R+=H?H:j;let E=J.fs.statSync(V),G=E.isFile()?J.fs.readFileSync(V):Buffer.alloc(0);if(E.isDirectory())R+=J.sep;this.addFile(R,G,A,E)}else throw C.Errors.FILE_NOT_FOUND(V)},addLocalFileAsync:function(V,R){V=typeof V==="object"?V:{localPath:V};let H=v.resolve(V.localPath),{comment:A}=V,{zipPath:j,zipName:E}=V,G=this;J.fs.stat(H,function(I,z){if(I)return R(I,!1);j=j?U(j):"";let S=v.win32.basename(v.win32.normalize(H));if(j+=E?E:S,z.isFile())J.fs.readFile(H,function(M,Z){if(M)return R(M,!1);return G.addFile(j,Z,A,z),setImmediate(R,void 0,!0)});else if(z.isDirectory())return j+=J.sep,G.addFile(j,Buffer.alloc(0),A,z),setImmediate(R,void 0,!0)})},addLocalFolder:function(V,R,H){if(H=w(H),R=R?U(R):"",V=v.normalize(V),J.fs.existsSync(V)){let A=J.findFiles(V),j=this;if(A.length)for(let E of A){let G=v.join(R,D(V,E));if(H(G))j.addLocalFile(E,v.dirname(G))}}else throw C.Errors.FILE_NOT_FOUND(V)},addLocalFolderAsync:function(V,R,H,A){A=w(A),H=H?U(H):"",V=v.normalize(V);var j=this;J.fs.open(V,"r",function(E){if(E&&E.code==="ENOENT")R(void 0,C.Errors.FILE_NOT_FOUND(V));else if(E)R(void 0,E);else{var G=J.findFiles(V),I=-1,z=function(){if(I+=1,I<G.length){var S=G[I],M=D(V,S).split("\\").join("/");if(M=M.normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[^\x20-\x7E]/g,""),A(M))J.fs.stat(S,function(Z,T){if(Z)R(void 0,Z);if(T.isFile())J.fs.readFile(S,function(y,P){if(y)R(void 0,y);else j.addFile(H+M,P,"",T),z()});else j.addFile(H+M+"/",Buffer.alloc(0),"",T),z()});else process.nextTick(()=>{z()})}else R(!0,void 0)};z()}})},addLocalFolderAsync2:function(V,R){let H=this;V=typeof V==="object"?V:{localPath:V},localPath=v.resolve(U(V.localPath));let{zipPath:A,filter:j,namefix:E}=V;if(j instanceof RegExp)j=function(z){return function(S){return z.test(S)}}(j);else if(typeof j!=="function")j=function(){return!0};if(A=A?U(A):"",E=="latin1")E=(z)=>z.normalize("NFD").replace(/[\u0300-\u036f]/g,"").replace(/[^\x20-\x7E]/g,"");if(typeof E!=="function")E=(z)=>z;let G=(z)=>v.join(A,E(D(localPath,z))),I=(z)=>v.win32.basename(v.win32.normalize(E(z)));J.fs.open(localPath,"r",function(z){if(z&&z.code==="ENOENT")R(void 0,C.Errors.FILE_NOT_FOUND(localPath));else if(z)R(void 0,z);else J.findFilesAsync(localPath,function(S,M){if(S)return R(S);if(M=M.filter((Z)=>j(G(Z))),!M.length)R(void 0,!1);setImmediate(M.reverse().reduce(function(Z,T){return function(y,P){if(y||P===!1)return setImmediate(Z,y,!1);H.addLocalFileAsync({localPath:T,zipPath:v.dirname(G(T)),zipName:I(T)},Z)}},R))})})},addLocalFolderPromise:function(V,R){return new Promise((H,A)=>{this.addLocalFolderAsync2(Object.assign({localPath:V},R),(j,E)=>{if(j)A(j);if(E)H(this)})})},addFile:function(V,R,H,A){V=L(V);let j=B(V),E=j!=null;if(!E)j=new J8(X),j.entryName=V;j.comment=H||"";let G=typeof A==="object"&&A instanceof J.fs.Stats;if(G)j.header.time=A.mtime;var I=j.isDirectory?16:0;let z=j.isDirectory?16384:32768;if(G)z|=4095&A.mode;else if(typeof A==="number")z|=4095&A;else z|=j.isDirectory?493:420;if(I=(I|z<<16)>>>0,j.attr=I,j.setData(R),!E)W.setEntry(j);return j},getEntries:function(V){return W.password=V,W?W.entries:[]},getEntry:function(V){return B(V)},getEntryCount:function(){return W.getEntryCount()},forEach:function(V){return W.forEach(V)},extractEntryTo:function(V,R,H,A,j,E){A=t(!1,A),j=t(!1,j),H=t(!0,H),E=AQ(j,E);var G=B(V);if(!G)throw C.Errors.NO_ENTRY();var I=K(G.entryName),z=$(R,E&&!G.isDirectory?E:H?I:v.basename(I));if(G.isDirectory){var S=W.getEntryChildren(G);return S.forEach(function(T){if(T.isDirectory)return;var y=T.getData();if(!y)throw C.Errors.CANT_EXTRACT_FILE();var P=K(T.entryName),d=$(R,H?P:v.basename(P));let p=j?T.header.fileAttr:void 0;J.writeFileTo(d,y,A,p)}),!0}var M=G.getData(W.password);if(!M)throw C.Errors.CANT_EXTRACT_FILE();if(J.fs.existsSync(z)&&!A)throw C.Errors.CANT_OVERRIDE();let Z=j?V.header.fileAttr:void 0;return J.writeFileTo(z,M,A,Z),!0},test:function(V){if(!W)return!1;for(var R in W.entries)try{if(R.isDirectory)continue;var H=W.entries[R].getData(V);if(!H)return!1}catch(A){return!1}return!0},extractAllTo:function(V,R,H,A){if(H=t(!1,H),A=AQ(H,A),R=t(!1,R),!W)throw C.Errors.NO_ZIP();W.entries.forEach(function(j){var E=$(V,K(j.entryName));if(j.isDirectory){J.makeDir(E);return}var G=j.getData(A);if(!G)throw C.Errors.CANT_EXTRACT_FILE();let I=H?j.header.fileAttr:void 0;J.writeFileTo(E,G,R,I);try{J.fs.utimesSync(E,j.header.time,j.header.time)}catch(z){throw C.Errors.CANT_EXTRACT_FILE()}})},extractAllToAsync:function(V,R,H,A){if(A=G8(R,H,A),H=t(!1,H),R=t(!1,R),!A)return new Promise((z,S)=>{this.extractAllToAsync(V,R,H,function(M){if(M)S(M);else z(this)})});if(!W){A(C.Errors.NO_ZIP());return}V=v.resolve(V);let j=(z)=>$(V,v.normalize(K(z.entryName))),E=(z,S)=>Error(z+': "'+S+'"'),G=[],I=[];W.entries.forEach((z)=>{if(z.isDirectory)G.push(z);else I.push(z)});for(let z of G){let S=j(z),M=H?z.header.fileAttr:void 0;try{if(J.makeDir(S),M)J.fs.chmodSync(S,M);J.fs.utimesSync(S,z.header.time,z.header.time)}catch(Z){A(E("Unable to create folder",S))}}I.reverse().reduce(function(z,S){return function(M){if(M)z(M);else{let Z=v.normalize(K(S.entryName)),T=$(V,Z);S.getDataAsync(function(y,P){if(P)z(P);else if(!y)z(C.Errors.CANT_EXTRACT_FILE());else{let d=H?S.header.fileAttr:void 0;J.writeFileToAsync(T,y,R,d,function(p){if(!p)z(E("Unable to write file",T));J.fs.utimes(T,S.header.time,S.header.time,function(Dq){if(Dq)z(E("Unable to set times",T));else z()})})}})}}},A)()},writeZip:function(V,R){if(arguments.length===1){if(typeof V==="function")R=V,V=""}if(!V&&X.filename)V=X.filename;if(!V)return;var H=W.compressToBuffer();if(H){var A=J.writeFileTo(V,H,!0);if(typeof R==="function")R(!A?Error("failed"):null,"")}},writeZipPromise:function(V,R){let{overwrite:H,perm:A}=Object.assign({overwrite:!0},R);return new Promise((j,E)=>{if(!V&&X.filename)V=X.filename;if(!V)E("ADM-ZIP: ZIP File Name Missing");this.toBufferPromise().then((G)=>{let I=(z)=>z?j(z):E("ADM-ZIP: Wasn't able to write zip file");J.writeFileToAsync(V,G,H,A,I)},E)})},toBufferPromise:function(){return new Promise((V,R)=>{W.toAsyncBuffer(V,R)})},toBuffer:function(V,R,H,A){if(typeof V==="function")return W.toAsyncBuffer(V,R,H,A),null;return W.compressToBuffer()}}}});var w0=$q(E0(),1),{program:s,createCommand:h8,createArgument:g8,createOption:y8,CommanderError:u8,InvalidArgumentError:f8,InvalidOptionArgumentError:m8,Command:c8,Argument:p8,Option:l8,Help:d8}=w0.default;import{cp as z8,mkdir as Nq,writeFile as n,readFile as jQ,rm as _q,readdir as j8}from"fs/promises";import{join as h,resolve as U8,relative as dJ,basename as E8}from"path";import{spawn as UQ}from"child_process";import{homedir as w8,tmpdir as N8}from"os";import{stat as D8}from"fs/promises";var pq={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,11 @@ func Greeting() string {
|
|
|
84
84
|
func main() {
|
|
85
85
|
fmt.Println(Greeting())
|
|
86
86
|
}
|
|
87
|
-
`,introFilename:"main.go"}};var dY=Object.freeze({status:"aborted"});function I(q,Q,Y){function X(z,H){if(!z._zod)Object.defineProperty(z,"_zod",{value:{def:H,constr:G,traits:new Set},enumerable:!1});if(z._zod.traits.has(q))return;z._zod.traits.add(q),Q(z,H);let K=G.prototype,B=Object.keys(K);for(let L=0;L<B.length;L++){let U=B[L];if(!(U in z))z[U]=K[U].bind(z)}}let J=Y?.Parent??Object;class W extends J{}Object.defineProperty(W,"name",{value:q});function G(z){var H;let K=Y?.Parent?new W:this;X(K,z),(H=K._zod).deferred??(H.deferred=[]);for(let B of K._zod.deferred)B();return K}return Object.defineProperty(G,"init",{value:X}),Object.defineProperty(G,Symbol.hasInstance,{value:(z)=>{if(Y?.Parent&&z instanceof Y.Parent)return!0;return z?._zod?.traits?.has(q)}}),Object.defineProperty(G,"name",{value:q}),G}var oY=Symbol("zod_brand");class A extends Error{constructor(){super("Encountered Promise during synchronous parse. Use .parseAsync() instead.")}}var Kq={};function T(q){if(q)Object.assign(Kq,q);return Kq}function gq(q,Q){if(typeof Q==="bigint")return Q.toString();return Q}function Bq(q){return{get value(){{let Y=q();return Object.defineProperty(this,"value",{value:Y}),Y}throw Error("cached value already set")}}}var hq=Symbol("evaluating");function x(q,Q,Y){let X=void 0;Object.defineProperty(q,Q,{get(){if(X===hq)return;if(X===void 0)X=hq,X=Y();return X},set(J){Object.defineProperty(q,Q,{value:J})},configurable:!0})}var Lq="captureStackTrace"in Error?Error.captureStackTrace:(...q)=>{};function yq(q){return typeof q==="object"&&q!==null&&!Array.isArray(q)}var dQ=Bq(()=>{if(typeof navigator<"u"&&navigator?.userAgent?.includes("Cloudflare"))return!1;try{return new Function(""),!0}catch(q){return!1}});function $q(q,Q,Y){let X=new q._zod.constr(Q??q._zod.def);if(!Q||Y?.parent)X._zod.parent=q;return X}function v(q){let Q=q;if(!Q)return{};if(typeof Q==="string")return{error:()=>Q};if(Q?.message!==void 0){if(Q?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");Q.error=Q.message}if(delete Q.message,typeof Q.error==="string")return{...Q,error:()=>Q.error};return Q}function cq(q){return Object.keys(q).filter((Q)=>{return q[Q]._zod.optin==="optional"&&q[Q]._zod.optout==="optional"})}var nY={safeint:[Number.MIN_SAFE_INTEGER,Number.MAX_SAFE_INTEGER],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-340282346638528860000000000000000000000,340282346638528860000000000000000000000],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]};function h(q,Q=0){if(q.aborted===!0)return!0;for(let Y=Q;Y<q.issues.length;Y++)if(q.issues[Y]?.continue!==!0)return!0;return!1}function Uq(q,Q){return Q.map((Y)=>{var X;return(X=Y).path??(X.path=[]),Y.path.unshift(q),Y})}function p(q){return typeof q==="string"?q:q?.message}function _(q,Q,Y){let X={...q,path:q.path??[]};if(!q.message){let J=p(q.inst?._zod.def?.error?.(q))??p(Q?.error?.(q))??p(Y.customError?.(q))??p(Y.localeError?.(q))??"Invalid input";X.message=J}if(delete X.inst,delete X.continue,!Q?.reportInput)delete X.input;return X}var fq=(q,Q)=>{q.name="$ZodError",Object.defineProperty(q,"_zod",{value:q._zod,enumerable:!1}),Object.defineProperty(q,"issues",{value:Q,enumerable:!1}),q.message=JSON.stringify(Q,gq,2),Object.defineProperty(q,"toString",{value:()=>q.message,enumerable:!1})},uq=I("$ZodError",fq),y=I("$ZodError",fq,{Parent:Error});var nQ=(q)=>(Q,Y,X,J)=>{let W=X?Object.assign(X,{async:!1}):{async:!1},G=Q._zod.run({value:Y,issues:[]},W);if(G instanceof Promise)throw new A;if(G.issues.length){let z=new(J?.Err??q)(G.issues.map((H)=>_(H,W,T())));throw Lq(z,J?.callee),z}return G.value},r=nQ(y),iQ=(q)=>async(Q,Y,X,J)=>{let W=X?Object.assign(X,{async:!0}):{async:!0},G=Q._zod.run({value:Y,issues:[]},W);if(G instanceof Promise)G=await G;if(G.issues.length){let z=new(J?.Err??q)(G.issues.map((H)=>_(H,W,T())));throw Lq(z,J?.callee),z}return G.value},d=iQ(y),tQ=(q)=>(Q,Y,X)=>{let J=X?{...X,async:!1}:{async:!1},W=Q._zod.run({value:Y,issues:[]},J);if(W instanceof Promise)throw new A;return W.issues.length?{success:!1,error:new(q??uq)(W.issues.map((G)=>_(G,J,T())))}:{success:!0,data:W.value}},c=tQ(y),sQ=(q)=>async(Q,Y,X)=>{let J=X?Object.assign(X,{async:!0}):{async:!0},W=Q._zod.run({value:Y,issues:[]},J);if(W instanceof Promise)W=await W;return W.issues.length?{success:!1,error:new q(W.issues.map((G)=>_(G,J,T())))}:{success:!0,data:W.value}},f=sQ(y);var eQ="(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))",aQ=new RegExp(`^${eQ}$`);var mq=(q)=>{let Q=q?`[\\s\\S]{${q?.minimum??0},${q?.maximum??""}}`:"[\\s\\S]*";return new RegExp(`^${Q}$`)};var pq={major:4,minor:3,patch:6};var u=I("$ZodType",(q,Q)=>{var Y;q??(q={}),q._zod.def=Q,q._zod.bag=q._zod.bag||{},q._zod.version=pq;let X=[...q._zod.def.checks??[]];if(q._zod.traits.has("$ZodCheck"))X.unshift(q);for(let J of X)for(let W of J._zod.onattach)W(q);if(X.length===0)(Y=q._zod).deferred??(Y.deferred=[]),q._zod.deferred?.push(()=>{q._zod.run=q._zod.parse});else{let J=(G,z,H)=>{let K=h(G),B;for(let L of z){if(L._zod.def.when){if(!L._zod.def.when(G))continue}else if(K)continue;let U=G.issues.length,$=L._zod.check(G);if($ instanceof Promise&&H?.async===!1)throw new A;if(B||$ instanceof Promise)B=(B??Promise.resolve()).then(async()=>{if(await $,G.issues.length===U)return;if(!K)K=h(G,U)});else{if(G.issues.length===U)continue;if(!K)K=h(G,U)}}if(B)return B.then(()=>{return G});return G},W=(G,z,H)=>{if(h(G))return G.aborted=!0,G;let K=J(z,X,H);if(K instanceof Promise){if(H.async===!1)throw new A;return K.then((B)=>q._zod.parse(B,H))}return q._zod.parse(K,H)};q._zod.run=(G,z)=>{if(z.skipChecks)return q._zod.parse(G,z);if(z.direction==="backward"){let K=q._zod.parse({value:G.value,issues:[]},{...z,skipChecks:!0});if(K instanceof Promise)return K.then((B)=>{return W(B,G,z)});return W(K,G,z)}let H=q._zod.parse(G,z);if(H instanceof Promise){if(z.async===!1)throw new A;return H.then((K)=>J(K,X,z))}return J(H,X,z)}}x(q,"~standard",()=>({validate:(J)=>{try{let W=c(q,J);return W.success?{value:W.data}:{issues:W.error?.issues}}catch(W){return f(q,J).then((G)=>G.success?{value:G.data}:{issues:G.error?.issues})}},vendor:"zod",version:1}))}),dq=I("$ZodString",(q,Q)=>{u.init(q,Q),q._zod.pattern=[...q?._zod.bag?.patterns??[]].pop()??mq(q._zod.bag),q._zod.parse=(Y,X)=>{if(Q.coerce)try{Y.value=String(Y.value)}catch(J){}if(typeof Y.value==="string")return Y;return Y.issues.push({expected:"string",code:"invalid_type",input:Y.value,inst:q}),Y}});function rq(q,Q,Y){if(q.issues.length)Q.issues.push(...Uq(Y,q.issues));Q.value[Y]=q.value}var oq=I("$ZodArray",(q,Q)=>{u.init(q,Q),q._zod.parse=(Y,X)=>{let J=Y.value;if(!Array.isArray(J))return Y.issues.push({expected:"array",code:"invalid_type",input:J,inst:q}),Y;Y.value=Array(J.length);let W=[];for(let G=0;G<J.length;G++){let z=J[G],H=Q.element._zod.run({value:z,issues:[]},X);if(H instanceof Promise)W.push(H.then((K)=>rq(K,Y,G)));else rq(H,Y,G)}if(W.length)return Promise.all(W).then(()=>Y);return Y}});function o(q,Q,Y,X,J){if(q.issues.length){if(J&&!(Y in X))return;Q.issues.push(...Uq(Y,q.issues))}if(q.value===void 0){if(Y in X)Q.value[Y]=void 0}else Q.value[Y]=q.value}function QY(q){let Q=Object.keys(q.shape);for(let X of Q)if(!q.shape?.[X]?._zod?.traits?.has("$ZodType"))throw Error(`Invalid element at key "${X}": expected a Zod schema`);let Y=cq(q.shape);return{...q,keys:Q,keySet:new Set(Q),numKeys:Q.length,optionalKeys:new Set(Y)}}function YY(q,Q,Y,X,J,W){let G=[],z=J.keySet,H=J.catchall._zod,K=H.def.type,B=H.optout==="optional";for(let L in Q){if(z.has(L))continue;if(K==="never"){G.push(L);continue}let U=H.run({value:Q[L],issues:[]},X);if(U instanceof Promise)q.push(U.then(($)=>o($,Y,L,Q,B)));else o(U,Y,L,Q,B)}if(G.length)Y.issues.push({code:"unrecognized_keys",keys:G,input:Q,inst:W});if(!q.length)return Y;return Promise.all(q).then(()=>{return Y})}var nq=I("$ZodObject",(q,Q)=>{if(u.init(q,Q),!Object.getOwnPropertyDescriptor(Q,"shape")?.get){let z=Q.shape;Object.defineProperty(Q,"shape",{get:()=>{let H={...z};return Object.defineProperty(Q,"shape",{value:H}),H}})}let X=Bq(()=>QY(Q));x(q._zod,"propValues",()=>{let z=Q.shape,H={};for(let K in z){let B=z[K]._zod;if(B.values){H[K]??(H[K]=new Set);for(let L of B.values)H[K].add(L)}}return H});let J=yq,W=Q.catchall,G;q._zod.parse=(z,H)=>{G??(G=X.value);let K=z.value;if(!J(K))return z.issues.push({expected:"object",code:"invalid_type",input:K,inst:q}),z;z.value={};let B=[],L=G.shape;for(let U of G.keys){let $=L[U],P=$._zod.optout==="optional",j=$._zod.run({value:K[U],issues:[]},H);if(j instanceof Promise)B.push(j.then((k)=>o(k,z,U,K,P)));else o(j,z,U,K,P)}if(!W)return B.length?Promise.all(B).then(()=>z):z;return YY(B,K,z,H,X.value,q)}});function iq(q,Q){return new q({type:"string",...v(Q)})}var Pq=I("ZodMiniType",(q,Q)=>{if(!q._zod)throw Error("Uninitialized schema in ZodMiniType.");u.init(q,Q),q.def=Q,q.type=Q.type,q.parse=(Y,X)=>r(q,Y,X,{callee:q.parse}),q.safeParse=(Y,X)=>c(q,Y,X),q.parseAsync=async(Y,X)=>d(q,Y,X,{callee:q.parseAsync}),q.safeParseAsync=async(Y,X)=>f(q,Y,X),q.check=(...Y)=>{return q.clone({...Q,checks:[...Q.checks??[],...Y.map((X)=>typeof X==="function"?{_zod:{check:X,def:{check:"custom"},onattach:[]}}:X)]},{parent:!0})},q.with=q.check,q.clone=(Y,X)=>$q(q,Y,X),q.brand=()=>q,q.register=(Y,X)=>{return Y.add(q,X),q},q.apply=(Y)=>Y(q)}),WY=I("ZodMiniString",(q,Q)=>{dq.init(q,Q),Pq.init(q,Q)});function N(q){return iq(WY,q)}var zY=I("ZodMiniArray",(q,Q)=>{oq.init(q,Q),Pq.init(q,Q)});function Eq(q,Q){return new zY({type:"array",element:q,...v(Q)})}var GY=I("ZodMiniObject",(q,Q)=>{nq.init(q,Q),Pq.init(q,Q),x(q,"shape",()=>Q.shape)});function Z(q,Q){let Y={type:"object",shape:q??{},...v(Q)};return new GY(Y)}import{cp as tq,exists as O,mkdir as HY,readFile as KY,rm as BY}from"fs/promises";import{join as b}from"path";import{spawn as LY}from"child_process";import{homedir as $Y}from"os";import{resolve as EY}from"path";var n="course.json",UY=()=>process.env.PROGY_API_URL||"https://progy.francy.workers.dev",PY=Z({id:N(),name:N(),runner:Z({command:N(),args:Eq(N()),cwd:N()}),content:Z({root:N(),exercises:N()}),setup:Z({checks:Eq(Z({name:N(),type:N(),command:N()})),guide:N()})});class i{static async resolveSource(q){if(q.startsWith("http://")||q.startsWith("https://")||q.startsWith("git@")){let Q=q.split("#"),Y=Q[0],X=Q[1];return{url:Y,branch:X}}if(await O(q))return{url:EY(q)};console.log(`[INFO] Resolving alias '${q}'...`);try{let Q=`${UY()}/api/registry`,Y=await fetch(Q);if(!Y.ok)throw Error(`Failed to fetch registry (Status: ${Y.status})`);let J=(await Y.json()).courses[q];if(J)return{url:J.repo,branch:J.branch,path:J.path}}catch(Q){console.warn(`[WARN] Registry lookup failed: ${Q.message||Q}`)}throw Error(`Could not resolve course source for '${q}'`)}static async validateCourse(q){let Q=b(q,n);if(!await O(Q))throw Error(`Missing ${n} in course directory.`);let Y=await KY(Q,"utf-8"),X;try{X=JSON.parse(Y)}catch(H){throw Error(`Invalid JSON in ${n}`)}let J=PY.safeParse(X);if(!J.success){let H=J.error.issues.map((K)=>`- ${K.path.join(".")}: ${K.message}`).join(`
|
|
88
|
-
`);throw Error(`Invalid course configuration in ${
|
|
89
|
-
${
|
|
87
|
+
`,introFilename:"main.go"}};var i8=Object.freeze({status:"aborted"});function m(q,Q,Y){function X($,L){if(!$._zod)Object.defineProperty($,"_zod",{value:{def:L,constr:K,traits:new Set},enumerable:!1});if($._zod.traits.has(q))return;$._zod.traits.add(q),Q($,L);let B=K.prototype,U=Object.keys(B);for(let w=0;w<U.length;w++){let D=U[w];if(!(D in $))$[D]=B[D].bind($)}}let J=Y?.Parent??Object;class W extends J{}Object.defineProperty(W,"name",{value:q});function K($){var L;let B=Y?.Parent?new W:this;X(B,$),(L=B._zod).deferred??(L.deferred=[]);for(let U of B._zod.deferred)U();return B}return Object.defineProperty(K,"init",{value:X}),Object.defineProperty(K,Symbol.hasInstance,{value:($)=>{if(Y?.Parent&&$ instanceof Y.Parent)return!0;return $?._zod?.traits?.has(q)}}),Object.defineProperty(K,"name",{value:q}),K}var n8=Symbol("zod_brand");class r extends Error{constructor(){super("Encountered Promise during synchronous parse. Use .parseAsync() instead.")}}var lq={};function a(q){if(q)Object.assign(lq,q);return lq}function M0(q,Q){if(typeof Q==="bigint")return Q.toString();return Q}function dq(q){return{get value(){{let Y=q();return Object.defineProperty(this,"value",{value:Y}),Y}throw Error("cached value already set")}}}var D0=Symbol("evaluating");function Lq(q,Q,Y){let X=void 0;Object.defineProperty(q,Q,{get(){if(X===D0)return;if(X===void 0)X=D0,X=Y();return X},set(J){Object.defineProperty(q,Q,{value:J})},configurable:!0})}var oq="captureStackTrace"in Error?Error.captureStackTrace:(...q)=>{};function S0(q){return typeof q==="object"&&q!==null&&!Array.isArray(q)}var RY=dq(()=>{if(typeof navigator<"u"&&navigator?.userAgent?.includes("Cloudflare"))return!1;try{return new Function(""),!0}catch(q){return!1}});function rq(q,Q,Y){let X=new q._zod.constr(Q??q._zod.def);if(!Q||Y?.parent)X._zod.parent=q;return X}function Bq(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 T0(q){return Object.keys(q).filter((Q)=>{return q[Q]._zod.optin==="optional"&&q[Q]._zod.optout==="optional"})}var s8={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 Rq(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 iq(q,Q){return Q.map((Y)=>{var X;return(X=Y).path??(X.path=[]),Y.path.unshift(q),Y})}function Sq(q){return typeof q==="string"?q:q?.message}function e(q,Q,Y){let X={...q,path:q.path??[]};if(!q.message){let J=Sq(q.inst?._zod.def?.error?.(q))??Sq(Q?.error?.(q))??Sq(Y.customError?.(q))??Sq(Y.localeError?.(q))??"Invalid input";X.message=J}if(delete X.inst,delete X.continue,!Q?.reportInput)delete X.input;return X}var F0=(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,M0,2),Object.defineProperty(q,"toString",{value:()=>q.message,enumerable:!1})},Z0=m("$ZodError",F0),Iq=m("$ZodError",F0,{Parent:Error});var IY=(q)=>(Q,Y,X,J)=>{let W=X?Object.assign(X,{async:!1}):{async:!1},K=Q._zod.run({value:Y,issues:[]},W);if(K instanceof Promise)throw new r;if(K.issues.length){let $=new(J?.Err??q)(K.issues.map((L)=>e(L,W,a())));throw oq($,J?.callee),$}return K.value},Tq=IY(Iq),HY=(q)=>async(Q,Y,X,J)=>{let W=X?Object.assign(X,{async:!0}):{async:!0},K=Q._zod.run({value:Y,issues:[]},W);if(K instanceof Promise)K=await K;if(K.issues.length){let $=new(J?.Err??q)(K.issues.map((L)=>e(L,W,a())));throw oq($,J?.callee),$}return K.value},Fq=HY(Iq),zY=(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 r;return W.issues.length?{success:!1,error:new(q??Z0)(W.issues.map((K)=>e(K,J,a())))}:{success:!0,data:W.value}},Hq=zY(Iq),jY=(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((K)=>e(K,J,a())))}:{success:!0,data:W.value}},zq=jY(Iq);var UY="(?:(?:\\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])))",EY=new RegExp(`^${UY}$`);var P0=(q)=>{let Q=q?`[\\s\\S]{${q?.minimum??0},${q?.maximum??""}}`:"[\\s\\S]*";return new RegExp(`^${Q}$`)};var b0={major:4,minor:3,patch:6};var jq=m("$ZodType",(q,Q)=>{var Y;q??(q={}),q._zod.def=Q,q._zod.bag=q._zod.bag||{},q._zod.version=b0;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=(K,$,L)=>{let B=Rq(K),U;for(let w of $){if(w._zod.def.when){if(!w._zod.def.when(K))continue}else if(B)continue;let D=K.issues.length,V=w._zod.check(K);if(V instanceof Promise&&L?.async===!1)throw new r;if(U||V instanceof Promise)U=(U??Promise.resolve()).then(async()=>{if(await V,K.issues.length===D)return;if(!B)B=Rq(K,D)});else{if(K.issues.length===D)continue;if(!B)B=Rq(K,D)}}if(U)return U.then(()=>{return K});return K},W=(K,$,L)=>{if(Rq(K))return K.aborted=!0,K;let B=J($,X,L);if(B instanceof Promise){if(L.async===!1)throw new r;return B.then((U)=>q._zod.parse(U,L))}return q._zod.parse(B,L)};q._zod.run=(K,$)=>{if($.skipChecks)return q._zod.parse(K,$);if($.direction==="backward"){let B=q._zod.parse({value:K.value,issues:[]},{...$,skipChecks:!0});if(B instanceof Promise)return B.then((U)=>{return W(U,K,$)});return W(B,K,$)}let L=q._zod.parse(K,$);if(L instanceof Promise){if($.async===!1)throw new r;return L.then((B)=>J(B,X,$))}return J(L,X,$)}}Lq(q,"~standard",()=>({validate:(J)=>{try{let W=Hq(q,J);return W.success?{value:W.data}:{issues:W.error?.issues}}catch(W){return zq(q,J).then((K)=>K.success?{value:K.data}:{issues:K.error?.issues})}},vendor:"zod",version:1}))}),x0=m("$ZodString",(q,Q)=>{jq.init(q,Q),q._zod.pattern=[...q?._zod.bag?.patterns??[]].pop()??P0(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 C0(q,Q,Y){if(q.issues.length)Q.issues.push(...iq(Y,q.issues));Q.value[Y]=q.value}var _0=m("$ZodArray",(q,Q)=>{jq.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 K=0;K<J.length;K++){let $=J[K],L=Q.element._zod.run({value:$,issues:[]},X);if(L instanceof Promise)W.push(L.then((B)=>C0(B,Y,K)));else C0(L,Y,K)}if(W.length)return Promise.all(W).then(()=>Y);return Y}});function Zq(q,Q,Y,X,J){if(q.issues.length){if(J&&!(Y in X))return;Q.issues.push(...iq(Y,q.issues))}if(q.value===void 0){if(Y in X)Q.value[Y]=void 0}else Q.value[Y]=q.value}function NY(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=T0(q.shape);return{...q,keys:Q,keySet:new Set(Q),numKeys:Q.length,optionalKeys:new Set(Y)}}function DY(q,Q,Y,X,J,W){let K=[],$=J.keySet,L=J.catchall._zod,B=L.def.type,U=L.optout==="optional";for(let w in Q){if($.has(w))continue;if(B==="never"){K.push(w);continue}let D=L.run({value:Q[w],issues:[]},X);if(D instanceof Promise)q.push(D.then((V)=>Zq(V,Y,w,Q,U)));else Zq(D,Y,w,Q,U)}if(K.length)Y.issues.push({code:"unrecognized_keys",keys:K,input:Q,inst:W});if(!q.length)return Y;return Promise.all(q).then(()=>{return Y})}var k0=m("$ZodObject",(q,Q)=>{if(jq.init(q,Q),!Object.getOwnPropertyDescriptor(Q,"shape")?.get){let $=Q.shape;Object.defineProperty(Q,"shape",{get:()=>{let L={...$};return Object.defineProperty(Q,"shape",{value:L}),L}})}let X=dq(()=>NY(Q));Lq(q._zod,"propValues",()=>{let $=Q.shape,L={};for(let B in $){let U=$[B]._zod;if(U.values){L[B]??(L[B]=new Set);for(let w of U.values)L[B].add(w)}}return L});let J=S0,W=Q.catchall,K;q._zod.parse=($,L)=>{K??(K=X.value);let B=$.value;if(!J(B))return $.issues.push({expected:"object",code:"invalid_type",input:B,inst:q}),$;$.value={};let U=[],w=K.shape;for(let D of K.keys){let V=w[D],R=V._zod.optout==="optional",H=V._zod.run({value:B[D],issues:[]},L);if(H instanceof Promise)U.push(H.then((A)=>Zq(A,$,D,B,R)));else Zq(H,$,D,B,R)}if(!W)return U.length?Promise.all(U).then(()=>$):$;return DY(U,B,$,L,X.value,q)}});function v0(q,Q){return new q({type:"string",...Bq(Q)})}var nq=m("ZodMiniType",(q,Q)=>{if(!q._zod)throw Error("Uninitialized schema in ZodMiniType.");jq.init(q,Q),q.def=Q,q.type=Q.type,q.parse=(Y,X)=>Tq(q,Y,X,{callee:q.parse}),q.safeParse=(Y,X)=>Hq(q,Y,X),q.parseAsync=async(Y,X)=>Fq(q,Y,X,{callee:q.parseAsync}),q.safeParseAsync=async(Y,X)=>zq(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)=>rq(q,Y,X),q.brand=()=>q,q.register=(Y,X)=>{return Y.add(q,X),q},q.apply=(Y)=>Y(q)}),TY=m("ZodMiniString",(q,Q)=>{x0.init(q,Q),nq.init(q,Q)});function l(q){return v0(TY,q)}var FY=m("ZodMiniArray",(q,Q)=>{_0.init(q,Q),nq.init(q,Q)});function sq(q,Q){return new FY({type:"array",element:q,...Bq(Q)})}var ZY=m("ZodMiniObject",(q,Q)=>{k0.init(q,Q),nq.init(q,Q),Lq(q,"shape",()=>Q.shape)});function qq(q,Q){let Y={type:"object",shape:q??{},...Bq(Q)};return new ZY(Y)}import{cp as h0,exists as Qq,mkdir as PY,readFile as OY,rm as bY}from"fs/promises";import{join as Yq}from"path";import{spawn as CY}from"child_process";import{homedir as xY}from"os";import{resolve as vY}from"path";var Uq="course.json",_Y=()=>process.env.PROGY_API_URL||"https://progy.francy.workers.dev",kY=qq({id:l(),name:l(),runner:qq({command:l(),args:sq(l()),cwd:l()}),content:qq({root:l(),exercises:l()}),setup:qq({checks:sq(qq({name:l(),type:l(),command:l()})),guide:l()})});class Pq{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 Qq(q))return{url:vY(q)};console.log(`[INFO] Resolving alias '${q}'...`);try{let Q=`${_Y()}/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=Yq(q,Uq);if(!await Qq(Q))throw Error(`Missing ${Uq} in course directory.`);let Y=await OY(Q,"utf-8"),X;try{X=JSON.parse(Y)}catch(L){throw Error(`Invalid JSON in ${Uq}`)}if("repo"in X)throw Error(`Security Error: Pre-configured 'repo' field in ${Uq} is forbidden. Source is potentially untrusted.`);let J=kY.safeParse(X);if(!J.success){let L=J.error.issues.map((B)=>`- ${B.path.join(".")}: ${B.message}`).join(`
|
|
88
|
+
`);throw Error(`Invalid course configuration in ${Uq}:
|
|
89
|
+
${L}`)}let W=Yq(q,J.data.content.root);if(!await Qq(W))throw Error(`Content root '${J.data.content.root}' not found.`);let K=Yq(q,J.data.content.exercises);if(!await Qq(K))throw Error(`Exercises directory '${J.data.content.exercises}' not found.`);let $=Yq(q,J.data.setup.guide);if(!await Qq($))throw Error(`Setup guide '${J.data.setup.guide}' not found.`);return J.data}static async load(q,Q){let Y=await this.resolveSource(q),{url:X,branch:J,path:W}=Y;if(console.log(`[INFO] Loading course from: ${X} (branch: ${J||"default"}, path: ${W||"root"})`),await Qq(X)&&!X.endsWith(".git"))return await this.validateCourse(X),await h0(X,Q,{recursive:!0}),Y;let K=Yq(xY(),".progy","tmp",`course-${Date.now()}`);await PY(K,{recursive:!0});try{if(console.log("[GIT] Initializing repository..."),await Eq("git",["init"],K),await Eq("git",["remote","add","origin",X],K),W)console.log(`[GIT] Configuring sparse-checkout for path: ${W}...`),await Eq("git",["config","core.sparseCheckout","true"],K),await Eq("git",["sparse-checkout","set",W],K);console.log("[GIT] Pulling content..."),await Eq("git",["pull","--depth=1","origin",J||"main"],K);let L=W?Yq(K,W):K;return console.log("[VAL] Validating course..."),await this.validateCourse(L),console.log("[INST] Installing course..."),await h0(L,Q,{recursive:!0}),Y}finally{await bY(K,{recursive:!0,force:!0})}}}function Eq(q,Q,Y){return new Promise((X,J)=>{CY(q,Q,{cwd:Y,stdio:"inherit"}).on("close",(K)=>{if(K===0)X();else J(Error(`${q} exited with code ${K}`))})})}var xq=$q(HQ(),1);import{stat as zQ,mkdir as $8,rm as V8}from"fs/promises";import{join as Q0,basename as L8}from"path";import{createHash as B8}from"crypto";import{homedir as R8}from"os";var A8=Q0(R8(),".progy"),I8=Q0(A8,"runtime");class Gq{static async pack(q,Q){let Y=new xq.default;Y.addLocalFolder(q),await Y.writeZipPromise(Q)}static async unpack(q){let Q=await zQ(q),Y=`${q}-${Q.mtimeMs}`,X=B8("md5").update(Y).digest("hex").substring(0,8),J=L8(q,".progy").replace(/[^a-zA-Z0-9-]/g,"_"),W=Q0(I8,`${J}-${X}`);if(await H8(W))await V8(W,{recursive:!0,force:!0});await $8(W,{recursive:!0});let K=new xq.default(q);return await new Promise(($,L)=>{K.extractAllToAsync(W,!0,!1,(B)=>{if(B)L(B);else $()})}),W}static async sync(q,Q){let Y=new xq.default;Y.addLocalFolder(q),await Y.writeZipPromise(Q)}}async function H8(q){try{return await zQ(q),!0}catch{return!1}}var Y0=h(w8(),".progy"),X0=h(Y0,"config.json"),EQ=process.env.PROGY_API_URL||"https://progy.francy.workers.dev",M8=process.env.PROGY_FRONTEND_URL||EQ,Kq="course.json";async function c(q){try{return await D8(q),!0}catch{return!1}}async function S8(){let q=h(import.meta.dir,"../../../courses");if(await c(q))return q;return null}async function T8(q){if(!await c(Y0))await Nq(Y0,{recursive:!0});await n(X0,JSON.stringify({token:q}))}async function F8(){if(!await c(X0))return null;try{return JSON.parse(await jQ(X0,"utf-8")).token||null}catch{return null}}function Z8(q){let Q=process.platform==="win32"?"start":process.platform==="darwin"?"open":"xdg-open";UQ(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)").option("--offline","Run in offline mode (Guest access, local storage only)").action(async(q)=>{let Q=process.cwd(),Y=!!q.offline,X=h(Q,Kq),J=await c(X),W=null,K=null;if(!Y){if(K=await F8(),!K)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 '${Kq}'. Starting progy...`);else console.error(`[ERROR] No '${Kq}' found. Please specify a course to initialize:`),console.error(" progy init --course <rust|go|cloudflare...>"),process.exit(1);else{let $=q.course;console.log(`[INFO] Initializing ${$} course in ${Q}...`);let L=await S8(),B=!1;if(L){console.log(`[INFO] Checking local courses directory: ${L}`);let D=h(L,$);if(await c(D))try{console.log("[VAL] Validating local course..."),await Pq.validateCourse(D);let V=["content","runner","Cargo.toml","go.mod","SETUP.md",Kq];for(let R of V){let H=h(D,R),A=h(Q,R);if(await c(H))console.log(`[COPY] ${R}...`),await z8(H,A,{recursive:!0})}B=!0}catch(V){console.warn(`[WARN] Local course validation failed: ${V}`)}}let U=h(N8(),`progy-init-${Date.now()}`);await Nq(U,{recursive:!0});let w=$.replace(/\//g,"-");try{W=await Pq.load($,U);let D=h(U,Kq);if(await c(D)){let R=await jQ(D,"utf-8"),H=JSON.parse(R);if(H.id)w=H.id;let A=!1;if(W)H.repo=W.url,A=!0;if(A)await n(D,JSON.stringify(H,null,2)),console.log("[META] Course metadata injected.")}let V=h(Q,`${w}.progy`);if(await c(V))console.error(`[ERROR] File '${w}.progy' already exists.`),await _q(U,{recursive:!0,force:!0}),process.exit(1);if(console.log(`[INFO] Packaging course from ${U}...`),await Gq.pack(U,V),console.log(`[SUCCESS] Course packaged: ${w}.progy`),U&&await c(U))await _q(U,{recursive:!0,force:!0});console.log(`
|
|
90
|
+
To start the course, run:
|
|
91
|
+
bunx progy`)}catch(D){console.error(`[ERROR] Failed to initialize course: ${D}`),await _q(U,{recursive:!0,force:!0}),process.exit(1)}finally{if(await c(U))await _q(U,{recursive:!0,force:!0})}}});s.command("start",{isDefault:!0}).description("Start the Progy server (opens local .progy file)").option("--offline","Run in offline mode").argument("[file]","Specific .progy file to open").action(async(q,Q)=>{let Y=process.cwd(),X=!!Q.offline,J=Y,W="";if(q&&q.endsWith(".progy")&&await c(q))W=U8(q);else{let D=(await j8(Y)).filter((V)=>V.endsWith(".progy"));if(D.length>0){if(D.length>1)console.warn(`[WARN] Multiple .progy files found. Using ${D[0]}`);W=h(Y,D[0])}}if(W){console.log(`[OPEN] Opening course: ${E8(W)}...`);try{J=await Gq.unpack(W),console.log(`[KT] Runtime ready at: ${J}`)}catch(w){console.error(`[ERROR] Failed to unpack course: ${w}`),process.exit(1)}}else if(await c(h(Y,Kq)))console.log("[INFO] Legacy course directory detected.");else console.log("[INFO] No .progy file or course structure found."),console.log("Run 'progy init' to create a new course.");console.log(`[INFO] Starting UI in ${X?"OFFLINE":"ONLINE"} mode...`);let $=import.meta.file.endsWith(".ts")?"ts":"js",B=["run",h(import.meta.dir,"backend",`server.${$}`)];if(process.env.ENABLE_HMR==="true")B.splice(1,0,"--hot");let U=UQ("bun",B,{stdio:"inherit",env:{...process.env,PROG_CWD:J,PROGY_OFFLINE:X?"true":"false"}});if(W){console.log("[SYNC] Auto-save enabled.");let{watch:w}=await import("fs"),D=null,V=w(J,{recursive:!0},(R,H)=>{if(!H||H.includes(".git")||H.includes("node_modules"))return;if(D)clearTimeout(D);D=setTimeout(async()=>{try{await Gq.sync(J,W)}catch(A){console.error(`[SYNC] Failed to save: ${A}`)}},1000)});U.on("close",()=>{V.close(),console.log("[SYNC] Final save..."),Gq.sync(J,W).then(()=>process.exit(0))})}else U.on("close",(w)=>process.exit(w??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=h(Q,Y);if(await c(J))console.error(`[ERROR] Directory '${Y}' already exists.`),process.exit(1);let W=pq[X];if(!W)console.error(`[ERROR] Unsupported language '${X}'. Supported: ${Object.keys(pq).join(", ")}`),process.exit(1);console.log(`[INFO] Creating course '${Y}' with template '${X}'...`),await Nq(J,{recursive:!0}),await Nq(h(J,"content","01_intro"),{recursive:!0});let K=JSON.stringify(W.courseJson,null,2).replace(/{{id}}/g,Y).replace(/{{name}}/g,Y);if(await n(h(J,"course.json"),K),await n(h(J,"SETUP.md"),W.setupMd),await n(h(J,"content","01_intro","README.md"),W.introReadme),await n(h(J,"content","01_intro",W.introFilename),W.introCode),X==="go"){let $=h(J,"runner");await Nq($,{recursive:!0});let L=`package main
|
|
90
92
|
import (
|
|
91
93
|
"bufio"
|
|
92
94
|
"encoding/json"
|
|
@@ -127,12 +129,12 @@ func main() {
|
|
|
127
129
|
fmt.Println("__SRP_END__")
|
|
128
130
|
if !srp.Success { os.Exit(0) }
|
|
129
131
|
}
|
|
130
|
-
`;await
|
|
132
|
+
`;await n(h($,"main.go"),L),await n(h(J,"go.mod"),`module ${Y}
|
|
131
133
|
|
|
132
134
|
go 1.21
|
|
133
135
|
`)}console.log("[SUCCESS] Course created!"),console.log(`
|
|
134
136
|
To get started:
|
|
135
137
|
cd ${Y}
|
|
136
|
-
bunx progy init`)});
|
|
137
|
-
Please authenticate in your browser:`),console.log(`\x1B[36m${
|
|
138
|
-
`),
|
|
138
|
+
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:EQ,plugins:[Q()]});try{console.log("[INFO] Requesting login session...");let{data:X,error:J}=await Y.device.code({client_id:"progy-cli"});if(J)throw Error(J.error_description||"Failed to initiate device authorization");let{device_code:W,user_code:K,verification_uri:$,interval:L}=X,B=$.startsWith("http")?$:`${M8}${$}`;console.log(`
|
|
139
|
+
Please authenticate in your browser:`),console.log(`\x1B[36m${B}\x1B[0m`),console.log(`Code: \x1B[33m${K}\x1B[0m
|
|
140
|
+
`),Z8(B),console.log("[WAIT] Waiting for authorization...");let w=await(async()=>{while(!0){let{data:D,error:V}=await Y.device.token({grant_type:"urn:ietf:params:oauth:grant-type:device_code",device_code:W,client_id:"progy-cli"});if(D?.access_token)return D.access_token;if(V){let R=V.error;if(R==="access_denied"||R==="expired_token")throw Error(V.error_description||R)}await new Promise((R)=>setTimeout(R,(L||5)*1000))}})();if(w)await T8(w),console.log("[SUCCESS] Logged in successfully!")}catch(X){console.error(`[ERROR] Login failed: ${X.message||X}`),process.exit(1)}});s.parse();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "progy",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "The interactive CLI and learning platform for Progy courses.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
"@radix-ui/react-dropdown-menu": "^2.1.16",
|
|
42
42
|
"@radix-ui/react-label": "^2.1.8",
|
|
43
43
|
"@radix-ui/react-tabs": "^1.1.13",
|
|
44
|
+
"@types/adm-zip": "^0.5.7",
|
|
44
45
|
"@types/bun": "latest",
|
|
45
46
|
"@types/react": "^19.0.0",
|
|
46
47
|
"@types/react-dom": "^19.0.0",
|
|
@@ -61,7 +62,8 @@
|
|
|
61
62
|
"typescript": "^5"
|
|
62
63
|
},
|
|
63
64
|
"dependencies": {
|
|
64
|
-
"
|
|
65
|
+
"adm-zip": "^0.5.16",
|
|
66
|
+
"better-auth": "^1.4.18",
|
|
65
67
|
"commander": "^12.1.0",
|
|
66
68
|
"zod": "^4.3.6"
|
|
67
69
|
}
|