@ngm-dev/cli
Version:
A CLI for ui.angular-material.dev
80 lines (77 loc) • 108 kB
JavaScript
#!/usr/bin/env node
import {b,a,z,y,x as x$1,i,K as K$1,u,q,r,s,f,I,k as k$1,d,D,c,o,J,t,M,L as L$1,n,h,C}from'./chunk-76JHMPAQ.js';import {Command,Argument,program,Option}from'commander';import ge,{readFileSync,existsSync}from'node:fs';import {outro,confirm,isCancel,cancel,text,select,log,password,multiselect,spinner,intro,group}from'@clack/prompts';import k from'chalk';import {resolveCommand}from'package-manager-detector/commands';import {detect}from'package-manager-detector/detect';import te from'pathe';import*as x from'valibot';import xs from'is-unicode-supported';import {builtinModules}from'node:module';import {createPathsMatcher,getTsconfig}from'get-tsconfig';import _n from'validate-npm-package-name';import Rs from'node:os';import {promisify,stripVTControlCharacters}from'node:util';import ai from'escape-string-regexp';import {execa}from'execa';import {detect as detect$1,resolveCommand as resolveCommand$1}from'package-manager-detector';import Zo from'boxen';import {diffLines,diffChars}from'diff';import Ho from'semver';import {cursor,erase}from'sisteransi';import Ns from'@anthropic-ai/sdk';import Ds from'ollama';import _s from'openai';import Is from'conf';import qr from'node-fetch';import*as ln from'css-dependency';import*as pn from'prettier';import*as fn from'parse5';import di from'oxc-parser';import {walk}from'estree-walker';import*as Pn from'svelte/compiler';import*as Nn from'vue/compiler-sfc';import gt from'fs';import It,{relative}from'path';import {glob}from'glob';import na from'ignore';import {exec}from'node:child_process';import*as we from'node:fs/promises';import Pe from'node:path';import {McpServer}from'@modelcontextprotocol/sdk/server/mcp.js';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {z as z$1}from'zod';import Ar from'fs/promises';import Za from'os';var ct={name:"@ngm-dev/cli",description:"A CLI for ui.angular-material.dev",version:"1.12.13"};var Cs=xs(),pe=(e,t)=>Cs?e:t,Io=pe("\u25C6","*"),No=pe("\u25C6","*"),Ao=pe("\u25A0","x"),L=k.gray(pe("\u2502","|")),Ht=k.gray(pe("\u2500","-")),To=k.gray(pe("\u2510","+")),Oo=k.gray(pe("\u2518","+")),zt=k.gray(pe("\u251C","+")),Do=k.gray(pe("\u252C","+"));k.gray(pe("\u250C","T"));var _o=k.gray(pe("\u2514","-")),$e=k.bgRgb(245,149,66).black(" WARN "),ce=k.bgBlueBright.white(" INFO "),Yt=k.bgRedBright.white(" ERROR "),lt=k.hex("#6750A4")(b),Dr=k.hex("#6750A4")(a),Le={SPACE:k.bgBlackBright.white(" SPACE "),ENTER:k.bgBlackBright.white(" ENTER "),A:k.bgBlackBright.white(" A ")};var Fo=(e,t)=>{let r=[];for(let[o,n]of e)r.push(t(o,n));return r},Lo=(e,t)=>{let r=0;for(let o of e)r=r+t(o);return r};var qt=(e,t,r=" ")=>{if(stripVTControlCharacters(e).length>t)throw new Error("String length is greater than the length provided.");return r.repeat(t-stripVTControlCharacters(e).length)+e};var Ss=/\n|\r\n/g,U=e=>e.split(Ss),K=(e,{lineNumbers:t=false,prefix:r}={})=>{let o=e;if(t){let n=e.length.toString().length+1;o=o.map((s,i)=>`${qt(`${i+1}`,n)} ${s}`);}return r!==void 0&&(o=o.map((n,s)=>`${r(s,e.length)}${n}`)),o.join(Rs.EOL)};var Ps={"no-workspace":"--no-workspace","install-as-dev-dependency":"-D"},js={"install-as-dev-dependency":"-D"},Es={"no-workspace":"--workspaces=false","install-as-dev-dependency":"-D"},Vo={"no-workspace":"--ignore-workspace","install-as-dev-dependency":"-D"},Wo={"no-workspace":"--focus","install-as-dev-dependency":"-D"},_r={bun:Ps,npm:Es,pnpm:Vo,deno:js,yarn:Wo,"yarn@berry":Wo,"pnpm@6":Vo};var Ke=()=>new Is({projectName:b});var Fr="http-registries-w-tokens",Ne=class{#e;constructor(t){this.#e=t??Ke();}getKey(t){return `${t}-token`.toLowerCase()}get(t){let r=this.getKey(t);return this.#e.get(r,void 0)}set(t,r){if(t.startsWith("http")&&!(t.startsWith("http-username")||t.startsWith("http-machine-id"))){let n=this.getHttpRegistriesWithTokens(),s=t.slice(5);n||(n=[]),n.includes(s)||n.push(s),this.#e.set(Fr,n);}let o=this.getKey(t);this.#e.set(o,r);}delete(t){if(t.startsWith("http")){let o=this.getHttpRegistriesWithTokens(),n=t.slice(5),s=o.indexOf(n);s!==-1&&(o=[...o.slice(0,s),...o.slice(s+1)]),this.#e.set(Fr,o);}let r=this.getKey(t);this.#e.delete(r);}getHttpRegistriesWithTokens(){let t=this.#e.get(Fr);return t||[]}getHttpUsernameToken(t){return `http-username-${t}`}getHttpMachineIdToken(t){return `http-machine-id-${t}`}};var Br={"Claude 3.7 Sonnet":{updateFile:async({originalFile:e,newFile:t,loading:r,verbose:o,additionalInstructions:n,messages:s})=>{let i=await Uo("Anthropic");o||r.start("Asking Claude 3.7 Sonnet");let a=Lr({originalFile:e,newFile:t,additionalInstructions:n,rePrompt:s!==void 0&&s.length>0});o?.(`Prompting Claude 3.7 Sonnet with:
${JSON.stringify(a,null," ")}`);let c=await Ls({model:"claude-3-7-sonnet-latest",prompt:a,apiKey:i,messages:s,maxTokens:(e.content.length+t.content.length)*2});return o||r.stop("Claude 3.7 Sonnet updated the file"),c?{content:Mr(c),prompt:a.message}:{content:t.content,prompt:a.message}}},"OpenAI o3-mini":{updateFile:async({originalFile:e,newFile:t,loading:r,verbose:o,additionalInstructions:n,messages:s})=>{let i=await Uo("OpenAI");o||r.start("Asking OpenAI o3-mini");let a=Lr({originalFile:e,newFile:t,additionalInstructions:n,rePrompt:s!==void 0&&s.length>0});o?.(`Prompting OpenAI o3-mini with:
${JSON.stringify(a,null," ")}`);let c=await Fs({model:"o3-mini",prompt:a,apiKey:i,messages:s,maxTokens:(e.content.length+t.content.length)*2});return o||r.stop("OpenAI o3-mini updated the file"),c?{content:Mr(c),prompt:a.message}:{content:t.content,prompt:a.message}}},Phi4:{updateFile:async({originalFile:e,newFile:t,loading:r,verbose:o,additionalInstructions:n,messages:s})=>{o||r.start("Asking Phi4");let i=Lr({originalFile:e,newFile:t,additionalInstructions:n,rePrompt:s!==void 0&&s.length>0});o?.(`Prompting Phi4 with:
${JSON.stringify(i,null," ")}`);let a=await Ms({model:"phi4",prompt:i,messages:s});return o||r.stop("Phi4 updated the file"),a?{content:Mr(a),prompt:i.message}:{content:t.content,prompt:i.message}}}},Fs=async({prompt:e,maxTokens:t,model:r,apiKey:o,messages:n})=>{let a=(await new _s({apiKey:o}).chat.completions.create({model:r,max_completion_tokens:t,messages:[{role:"system",content:e.system},...n??[],{role:"user",content:e.message}]})).choices[0];return a.message.content===null?null:a.message.content},Ls=async({prompt:e,messages:t,maxTokens:r,model:o,apiKey:n})=>{let s=new Ns({apiKey:n}),i=[];if(t)for(let l of t)i.push({role:l.role,content:[{type:"text",text:l.content}]});i.push({role:"user",content:[{type:"text",text:e.message}]});let c=(await s.messages.create({model:o,max_tokens:Math.min(r,8192),temperature:.5,system:e.system,messages:i})).content[0];return c.type!=="text"?null:c.text},Ms=async({prompt:e,messages:t,model:r})=>(await Ds.chat({model:r,messages:[{role:"system",content:e.system},...t??[],{role:"user",content:e.message}]})).message.content,Lr=({originalFile:e,newFile:t,additionalInstructions:r,rePrompt:o})=>({system:"You will merge two files provided by the user. You will respond only with the resulting code. DO NOT format the code with markdown, DO NOT put the code inside of triple quotes, only return the code as a raw string. DO NOT make unnecessary changes.",message:o?r??"":`
This is my current file ${e.path}:
<code>
${e.content}
</code>
This is the file that has changes I want to update with ${t.path}:
<code>
${t.content}
</code>${r?`<additional-instructions>${r}</additional-instructions>`:""}
`}),Mr=e=>{let t=e.trim();if(t.startsWith("```")&&(t=U(t).slice(1).join(`
`).trim()),t.endsWith("```")){let r=U(t);t=r.slice(0,r.length-1).join(`
`).trim();}return t},Uo=async e=>{let t=new Ne,r=t.get(e);if(!r){let o=await password({message:`Paste your ${e} API key:`,validate(n){if(n.trim()==="")return "Please provide an API key"}});(isCancel(o)||!o)&&(cancel("Canceled!"),process.exit(0)),r=o;}return t.set(e,r),r};var Tt=ct;var Go=e=>/^\s+$/g.test(e),Ot=e=>{let t=e.length-1;for(;Go(e[t])&&t>=0;){if(e[t]===`
`)return e[t-1]==="\r"?e.slice(0,t-1):e.slice(0,t);t--;}return e},Ko=({from:e,to:t,changes:r,expand:o=false,maxUnchanged:n=5,colorRemoved:s=k.redBright,colorAdded:i=k.greenBright,colorCharsRemoved:a=k.bgRedBright,colorCharsAdded:c=k.bgGreenBright,prefix:l,onUnchanged:p,intro:d})=>{let v="",m=Lo(r,u=>u.count??0).toString().length+1,g=0;if(r.length===1&&!r[0].added&&!r[0].removed)return p({from:e,to:t,changes:r,expand:o,maxUnchanged:n,colorAdded:i,colorRemoved:s,prefix:l,onUnchanged:p,intro:d});v+=d({from:e,to:t,changes:r,expand:o,maxUnchanged:n,colorAdded:i,colorRemoved:s,prefix:l,onUnchanged:p,intro:d});let h=u=>k.gray(`${l?.()??""}${qt(`${u+1+g} `,m)} `);for(let u=0;u<r.length;u++){let y=r[u],w=r[u-1]?.added||r[u-1]?.removed,S=r[u+1]?.added||r[u+1]?.removed;if(!y.added&&!y.removed){if(!o&&y.count!==void 0&&y.count>n){let P=g,I=U(Ot(y.value)),N=0;if(S&&(N+=n),w&&(N+=n),N>=I.length){v+=`${K(I,{prefix:h})}
`,g+=I.length;continue}if(w&&(v+=`${K(I.slice(0,n),{prefix:h})}
`),I.length>N){let F=I.length-N;v+=`${K(U(k.gray(`+ ${F} more unchanged (${k.italic("-E to expand")})`)),{prefix:()=>`${l?.()??""}${qt(" ",m)} `})}
`;}S&&(g=g+I.length-n,v+=`${K(I.slice(I.length-n),{prefix:h})}
`),g=P+y.count;continue}v+=`${K(U(Ot(y.value)),{prefix:h})}
`,g+=y.count??0;continue}let f=P=>P.added?i(Ot(P.value)):P.removed?s(Ot(P.value)):P.value,C=P=>P.added?c(Ot(P.value)):P.removed?a(Ot(P.value)):P.value;if(y.removed&&y.count===1&&r[u+1]?.added&&r[u+1]?.count===1){let I=diffChars(y.value,r[u+1].value).map(N=>C(N)).join("");v+=`${h(0)}${I}`,g+=1,u++;}else Go(y.value)?(v+=`${K(U(C(y)),{prefix:P=>`${h(P)}${C({removed:true,value:" ",added:false})}`})}
`,y.removed||(g+=y.count??0)):(v+=`${K(U(f(y)),{prefix:h})}
`,y.removed||(g+=y.count??0));}return v.endsWith(`
`)||(v=v+=`
`),v};var Vr="latest-version",Ws=60*60*1e3,Jo=async({noCache:e=false}={})=>{try{let t$1=Ke(),r;if(!e){let a=t$1.get(Vr);if(a){if(a.expiration>Date.now())return r=a.version,s(r);t$1.delete(Vr);}}let o=new AbortController,n=setTimeout(()=>{o.abort();},1e3),s$1=await qr("https://raw.githubusercontent.com/Angular-Material-Dev/ngm-dev-cli/refs/heads/main/packages/cli/package.json",{signal:o.signal});if(clearTimeout(n),!s$1.ok)return t("Error getting version");let{version:i}=await s$1.json();return r=i,t$1.set(Vr,{expiration:Date.now()+Ws,version:r}),s(r)}catch(t$1){return t(`Error getting version: ${t$1}`)}};var Us=/^(@[^\/]+\/[^@\/]+)(?:@([^\/]+))?(\/.*)?$/,Gs=/^([^@\/]+)(?:@([^\/]+))?(\/.*)?$/,Xe=e=>{let t$1=Us.exec(e)||Gs.exec(e);return t$1?s({name:t$1[1]||"",version:t$1[2]||"latest",path:t$1[3]||""}):t(`invalid package name: ${e}`)};var Ur=(e,t)=>{let r=te.join(e,"package.json");if(ge.existsSync(r))return r;if(e===t)return;let o=e.split(/[\/\\]/);return Ur(o.slice(0,o.length-1).join("/"),t)},Gr=e=>{if(!ge.existsSync(e))return t(`${e} doesn't exist`);let t$1=ge.readFileSync(e).toString();try{return s(JSON.parse(t$1))}catch(r){return t(`Error reading package.json: ${r}`)}},gr=e=>e[0]==="^"?e.slice(1):e,Yo=(e,t,{cwd:r})=>{let o=e,n=t,s=Gr(te.join(r,"package.json"));if(!s.isErr()){let i=s.unwrap();if(i.dependencies)for(let a of o){let{name:c,version:l}=Xe(a).unwrap(),p=i.dependencies[c];if(l===void 0&&p){o.delete(a);continue}p&&Ho.satisfies(gr(p),l)&&o.delete(a);}if(i.devDependencies)for(let a of n){let{name:c,version:l}=Xe(a).unwrap(),p=i.devDependencies[c];if(l===void 0&&p){n.delete(a);continue}p&&Ho.satisfies(gr(p),l)&&n.delete(a);}}return {dependencies:o,devDependencies:n}};var en=async(e,{loading:t})=>{for(let r of e){t.start(r.loadingMessage);try{await r.run();}catch(o){t.stop(`Error while ${r.loadingMessage}`),console.error(o);}t.stop(r.completedMessage);}},tn=async({tasks:e,startMessage:t,stopMessage:r,loading:o})=>{o.start(t),await Promise.all([...e.map(n=>n.run({message:o.message}))]),o.stop(r);},be=({verbose:e}={})=>{let t=spinner();return {message:r=>{e?e(r??""):t.message(r);},stop:r=>{e?e(r??""):t.stop(r);},start:r=>{e?e(r??""):t.start(r);}}},Ze=(e,t="Next Steps")=>{let r=Zo(e.join(`
`),{title:t,textAlignment:"left",padding:1,borderColor:"gray",borderStyle:{topLeft:stripVTControlCharacters(zt),bottomLeft:stripVTControlCharacters(zt),topRight:stripVTControlCharacters(To),top:stripVTControlCharacters(Ht),bottom:stripVTControlCharacters(Ht),bottomRight:stripVTControlCharacters(Oo),left:stripVTControlCharacters(L),right:stripVTControlCharacters(L)}});return `${L}
${r}
`},rn=(e,t=3)=>{let r=e.slice(0,t),o=e.length-r.length;return `${r.join(", ")}${o>0?` and ${o} other(s)`:""}`},ti=async(e,t,r)=>{let o=(await detect$1({cwd:process.cwd()}))?.agent??"npm",n=resolveCommand$1(o,"global",["@ngm-dev/cli@latest"]),s=[`Update available! ${k.redBright(t)} -> ${k.greenBright(r)}`,`Run ${k.cyan(`${n?.command} ${n?.args.join(" ")}`)} to update!`,""];return Zo(s.join(`
`),{borderColor:"gray",padding:1,margin:1,textAlignment:"center"})},ye=async()=>{console.clear();let e=await Jo();e.isOk()&&Ho.lt(Tt.version,e.unwrap())&&console.info(await ti(Tt.name,Tt.version,e.unwrap())),intro(`${k.bgHex("#6750A4").black(` ${Tt.name} `)}${k.gray(` v${Tt.version} `)}`);},Qo="model-preference",Dt=async({incoming:e,current:t,config:r,options:o})=>{let n=Ke();process.stdout.write(`${L}
`);let s=false,i=e.content,a=n.get(Qo,"Claude 3.5 Sonnet"),c=[];for(;;){let l=diffLines(t.content,i),p=Ko({from:e.path,to:t.path,changes:l,expand:o.expand,maxUnchanged:o.maxUnchanged,prefix:()=>`${L} `,onUnchanged:({from:d,to:v,prefix:m})=>`${m?.()??""}${k.cyan(d)} \u2192 ${k.gray(v)} ${k.gray("(unchanged)")}
`,intro:({from:d,to:v,changes:m,prefix:g})=>{let h=m.filter(u=>u.added||u.removed).length;return `${g?.()??""}${k.cyan(d)} \u2192 ${k.gray(v)} (${h} change${h===1?"":"s"})
${g?.()??""}
`}});if(process.stdout.write(p),(l.length>1||t.content==="")&&(s=o.yes,!o.yes&&!o.no)){let d=[{label:"Accept",value:"accept"},{label:"Reject",value:"reject"}];c.length>0?d.push({label:`\u2728 ${k.yellow("Update with AI")} \u2728 ${k.gray("(Iterate)")}`,value:"update-iterate"},{label:`\u2728 ${k.yellow("Update with AI")} \u2728 ${k.gray("(Start over)")}`,value:"update"}):d.push({label:`\u2728 ${k.yellow("Update with AI")} \u2728`,value:"update"});let v=await select({message:"Accept changes?",options:d});if(isCancel(v)&&(cancel("Canceled!"),process.exit(0)),v==="update"||v==="update-iterate"){v==="update"&&(c=[]);let m=await select({message:"Select a model",options:Object.keys(Br).map(h=>({label:h,value:h})),initialValue:a});isCancel(m)&&(cancel("Canceled!"),process.exit(0)),m!==a&&n.set(Qo,m),a=m;let g=await text({message:"Additional instructions:",defaultValue:"None",validate:h=>{if(c.length!==0&&h.trim()==="")return "Please provide additional context so that I know how I can improve."}});isCancel(g)&&(cancel("Canceled!"),process.exit(0));try{let{content:h,prompt:u}=await Br[a].updateFile({originalFile:t,newFile:{content:v==="update-iterate"?i:e.content,path:e.path},additionalInstructions:g!=="None"?g:void 0,loading:o.loading,verbose:o.verbose,messages:c});i=h,c.push({role:"user",content:u}),c.push({role:"assistant",content:h});}catch(h){o.loading.stop(),log.error(k.red(`Error getting completions: ${h}`)),process.stdout.write(`${L}
`);continue}i=await hr({file:{content:i,destPath:t.path},prettierOptions:r.prettierOptions,formatter:r.formatter}),process.stdout.write(`${L}
`);continue}s=v==="accept";break}break}return s?{applyChanges:true,updatedContent:i}:{applyChanges:false}},et=async(e,t,{yes:r,no:o=false,cwd:n,pm:s,ignoreWorkspace:i=false})=>{let{dependencies:a,devDependencies:c}=Yo(e,t,{cwd:n});if(a.size>0||c.size>0){let p=r;if(!r&&!o){let d=await confirm({message:`Would you like to install dependencies?
${a.size>0?`${k.gray("Dependencies:")} ${Array.from(a).join(", ")}`:""}
${c.size>0?`${k.gray("Dev Dependencies:")} ${Array.from(c).join(", ")}`:""}`,initialValue:true});isCancel(d)&&(cancel("Canceled!"),process.exit(0)),p=d;}if(p)return a.size>0&&await Kr({pm:s,deps:Array.from(a),dev:false,cwd:n,ignoreWorkspace:i}),c.size>0&&await Kr({pm:s,deps:Array.from(c),dev:true,cwd:n,ignoreWorkspace:i}),{installed:true,dependencies:a,devDependencies:c}}return {installed:false,dependencies:a,devDependencies:c}},on=e=>{let t=k.dim(L),r=k.green(Io),o=k.green(No),n=k.red(Ao);process.stdout.write(`${t}
`),process.stdout.write(`${r} ${e}
`);let s="",i="",a=(l=false)=>{if(!i)return;let p=process.stdout.columns,v=i.split(`
`).reduce((m,g)=>m+Math.ceil(g.length/p),0)+(l?1:0);process.stdout.write(cursor.up(v)),process.stdout.write(erase.down());},c=(l=0)=>{let p=s.split(`
`).slice(-l);i="";for(let d of p)i+=`${t} ${d}
`;process.stdout.write(k.dim(i));};return {set text(l){a(),s+=l;let p=Math.ceil(process.stdout.rows/2);c(p);},fail(l){a(true),process.stdout.write(`${n} ${l}
`),c();},success(l){a(true),process.stdout.write(`${o} ${l}
`);}}};var yr=async(e,t)=>{let r=await confirm({message:e,initialValue:t});return isCancel(r)&&(cancel("Canceled!"),process.exit(0)),r};var Kr=async({pm:e,deps:t,dev:r,cwd:o,ignoreWorkspace:n=false})=>{let s=[...t];r&&s.push(_r[e]["install-as-dev-dependency"]);let i=_r[e]["no-workspace"];n&&i&&s.push(i);let a=resolveCommand$1(e,"add",s);a==null&&program.error(k.red(`Could not resolve add command for '${e}'.`));let c=on(`Installing dependencies with ${e}...`);try{let l=execa(a.command,[...a.args],{cwd:o});l.stdout.on("data",p=>{c.text=p;}),l.stderr.on("data",p=>{c.text=p;}),await l,c.success(`Installed ${k.cyan(t.join(", "))}`);}catch{c.fail("Failed to install dependencies"),process.exit(2);}},si=/\{\{([^\/]+)\/([^\}]+)\}\}/g,sn=({template:e,config:t,destPath:r,cwd:o})=>{let n=te.join(r,"../");return e.replace(si,(s,i,a)=>{if(t.paths[i]===void 0){if(t.paths["*"].startsWith(".")){let c=te.relative(n,te.join(o,t.paths["*"],i,a));return c.startsWith(".")?c:`./${c}`}return te.join(t.paths["*"],i,a)}if(t.paths[i].startsWith(".")){let c=te.relative(n,te.join(o,t.paths[i],a));return c.startsWith(".")?c:`./${c}`}return te.join(t.paths[i],a)})};var bt=async({file:e,config:t$1,imports:r,watermark:o,prettierOptions:n,cwd:s$1,verbose:i})=>{let a=Ae.find(l=>l.matches(e.destPath)),c=e.content;if(a){t$1.watermark&&(c=`${a.comment(o)}
${c}`),i?.(`Formatting ${k.bold(e.destPath)}`);try{c=await a.format(c,{filePath:e.destPath,formatter:t$1.formatter,prettierOptions:n});}catch(l){return t(`Error formatting ${k.bold(e.destPath)} ${l}`)}}for(let[l,p]of Object.entries(r)){let d=sn({template:p,config:t$1,destPath:e.destPath,cwd:s$1}),v=new RegExp(`(['"])${ai(l)}\\1`,"g");c=c.replaceAll(v,`$1${d}$1`);}return s(c)},hr=async({file:e,formatter:t,prettierOptions:r})=>{let o=Ae.find(s=>s.matches(e.destPath)),n=e.content;if(o)try{n=await o.format(e.content,{filePath:e.destPath,formatter:t,prettierOptions:r});}catch{return n}return n},cn=e=>{let t=[".js",".ts",".cjs",".mjs"];if(!C(e,t))return;let r=te.dirname(e),o=ge.readdirSync(r),n=te.parse(e);for(let s of o)if(C(s,t)&&te.parse(s).name===n.name)return te.join(r,s)},_t=e=>{let t$1;try{if(t$1=getTsconfig(e,"tsconfig.json"),!t$1&&(t$1=getTsconfig(e,"jsconfig.json"),!t$1))return s(null)}catch(r){return t(`Error while trying to get ${k.bold("tsconfig.json")}: ${r}`)}return s(t$1)};var dn={matches:e=>e.endsWith(".css"),resolveDependencies:({filePath:e,isSubDir:t$1,excludeDeps:r,dirs:o,cwd:n,containingDir:s$1})=>{let i=ge.readFileSync(e).toString(),a=ln.parse(i,{allowTailwindDirectives:true});if(a.isErr())return t(a.unwrapErr().message);let c=a.unwrap(),l=Oe({moduleSpecifiers:c.map(p=>p.module),filePath:e,isSubDir:t$1,dirs:o,cwd:n,containingDir:s$1,doNotInstall:r});return l.isErr()?t(l.unwrapErr().map(p=>Te(p)).join(`
`)):s(l.unwrap())},comment:e=>`/*
${K(U(e),{prefix:()=>" "})}
*/`,format:async(e,{formatter:t,prettierOptions:r,filePath:o})=>t&&t==="prettier"?await pn.format(e,{filepath:o,...r}):e};var mn={matches:e=>e.endsWith(".html"),resolveDependencies:({filePath:e,isSubDir:t$1,excludeDeps:r,dirs:o,cwd:n,containingDir:s$1})=>{let i=ge.readFileSync(e).toString(),a=fn.parse(i),c=[],l=(d,v)=>{if(d&&(v(d),d.childNodes&&d.childNodes.length>0))for(let m of d.childNodes)l(m,v);};for(let d of a.childNodes)l(d,v=>{if(v.tagName==="script")for(let m of v.attrs)m.name==="src"&&c.push(m.value);if(v.tagName==="link"&&v.attrs.find(m=>m.name==="rel"&&m.value==="stylesheet"))for(let m of v.attrs)m.name==="href"&&!m.value.startsWith("http")&&c.push(m.value);});let p=Oe({moduleSpecifiers:c,filePath:e,isSubDir:t$1,dirs:o,cwd:n,containingDir:s$1,doNotInstall:["svelte","@sveltejs/kit",...r]});return p.isErr()?t(p.unwrapErr().map(d=>Te(d)).join(`
`)):s(p.unwrap())},comment:e=>`<!--
${K(U(e),{prefix:()=>" "})}
-->`,format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await pn.format(e,{parser:"html",...r}):e};var wr=(e,t)=>{let r=di.parseSync(e,t),o=[];for(let n of r.module.staticImports)o.push(n.moduleRequest.value);for(let n of r.module.dynamicImports){let s=t.slice(n.moduleRequest.start+1,n.moduleRequest.end-1);o.push(s);}for(let n of r.module.staticExports)for(let s of n.entries)s.moduleRequest&&o.push(s.moduleRequest.value);return o},yn={matches:e=>e.endsWith(".ts")||e.endsWith(".js")||e.endsWith(".tsx")||e.endsWith(".jsx"),resolveDependencies:({filePath:e,isSubDir:t$1,excludeDeps:r,dirs:o,cwd:n,containingDir:s$1})=>{let i=ge.readFileSync(e).toString(),a=wr(e,i),c=Oe({moduleSpecifiers:a,filePath:e,isSubDir:t$1,dirs:o,cwd:n,containingDir:s$1,doNotInstall:r});return c.isErr()?t(c.unwrapErr().map(l=>Te(l)).join(`
`)):s(c.unwrap())},comment:e=>`/*
${K(U(e),{prefix:()=>" "})}
*/`,format:async(e,{formatter:t,filePath:r,prettierOptions:o})=>t&&t==="prettier"?await pn.format(e,{filepath:r,...o}):e};var vn=async(e,{formatter:t,prettierOptions:r,filePath:o})=>t&&t==="prettier"?await pn.format(e,{parser:"json",filepath:o,...r}):e,$r={matches:e=>e.endsWith(".json"),resolveDependencies:()=>s({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>e,format:vn},wn={matches:e=>e.endsWith(".jsonc"),resolveDependencies:()=>s({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>`/*
${K(U(e),{prefix:()=>" "})}
*/`,format:vn};var fi=async(e,{formatter:t,prettierOptions:r,filePath:o})=>t&&t==="prettier"?await pn.format(e,{parser:"markdown",filepath:o,...r}):e,kn={matches:e=>e.endsWith(".md"),resolveDependencies:()=>s({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>`<!--
${K(U(e),{prefix:()=>" "})}
-->`,format:fi};var Cn={matches:e=>e.endsWith(".sass")||e.endsWith(".scss"),resolveDependencies:({filePath:e,isSubDir:t$1,excludeDeps:r,dirs:o,cwd:n,containingDir:s$1})=>{let i=ge.readFileSync(e).toString(),a=ln.parse(i);if(a.isErr())return t(a.unwrapErr().message);let c=a.unwrap(),l=Oe({moduleSpecifiers:c.map(p=>p.module),filePath:e,isSubDir:t$1,dirs:o,cwd:n,containingDir:s$1,doNotInstall:r});return l.isErr()?t(l.unwrapErr().map(p=>Te(p)).join(`
`)):s(l.unwrap())},comment:e=>`/*
${K(U(e),{prefix:()=>" "})}
*/`,format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await pn.format(e,{parser:"scss",...r}):e};var jn={matches:e=>e.endsWith(".svelte"),resolveDependencies:({filePath:e,isSubDir:t$1,excludeDeps:r,dirs:o,cwd:n,containingDir:s$1})=>{let i=ge.readFileSync(e).toString(),a=Pn.parse(i,{modern:true,filename:e});if(!a.instance&&!a.module)return s({dependencies:[],devDependencies:[],local:[],imports:{}});let c=[],l=d=>{(d.type==="ImportDeclaration"||d.type==="ExportAllDeclaration"||d.type==="ExportNamedDeclaration")&&typeof d.source?.value=="string"&&c.push(d.source.value),d.type==="ImportExpression"&&d.source.type==="Literal"&&typeof d.source.value=="string"&&c.push(d.source.value);};a.instance&&walk(a.instance,{enter:l}),a.module&&walk(a.module,{enter:l});let p=Oe({moduleSpecifiers:c,filePath:e,isSubDir:t$1,dirs:o,cwd:n,containingDir:s$1,doNotInstall:["svelte","@sveltejs/kit",...r]});return p.isErr()?t(p.unwrapErr().map(d=>Te(d)).join(`
`)):s(p.unwrap())},comment:e=>`<!--
${K(U(e),{prefix:()=>" "})}
-->`,format:async(e,{formatter:t,filePath:r,prettierOptions:o})=>t&&t==="prettier"&&o&&o.plugins?.find(n=>n==="prettier-plugin-svelte")?await pn.format(e,{filepath:r,...o}):e};var En={matches:e=>e.endsWith(".svg"),resolveDependencies:()=>s({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>`<!--
${K(U(e),{prefix:()=>" "})}
-->`,format:async e=>e};var An={matches:e=>e.endsWith(".vue"),resolveDependencies:({filePath:e,isSubDir:t$1,excludeDeps:r,dirs:o,cwd:n,containingDir:s$1})=>{let i=ge.readFileSync(e).toString(),a=Nn.parse(i,{filename:e}),c=[];if(a.descriptor.script?.content){let p=wr("noop.ts",a.descriptor.script.content);c.push(...p);}if(a.descriptor.scriptSetup?.content){let p=wr("noop.ts",a.descriptor.scriptSetup.content);c.push(...p);}if(c.length===0)return s({dependencies:[],devDependencies:[],local:[],imports:{}});let l=Oe({moduleSpecifiers:c,filePath:e,isSubDir:t$1,dirs:o,cwd:n,containingDir:s$1,doNotInstall:["vue","nuxt",...r]});return l.isErr()?t(l.unwrapErr().map(p=>Te(p)).join(`
`)):s(l.unwrap())},comment:e=>`<!--
${K(U(e),{prefix:()=>" "})}
-->`,format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await pn.format(e,{parser:"vue",...r}):e};var On={matches:e=>e.endsWith(".yml")||e.endsWith(".yaml"),resolveDependencies:()=>s({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>K(U(e),{prefix:()=>"# "}),format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await pn.format(e,{parser:"yaml",...r}):e};var Te=e=>`${K(U(e),{prefix:t=>t===0?`${L} ${Yt} `:`${L} `})}`,Oe=({moduleSpecifiers:e,isSubDir:t$1,filePath:r,containingDir:o,doNotInstall:n,dirs:s$1,cwd:i})=>{let a=[],c=new Set,l=new Set,p={};for(let m of e){if(builtinModules.includes(m)||m.startsWith("node:"))continue;if(m.startsWith(".")){let y=Fn(m,t$1,{filePath:r,containingDir:o,dirs:s$1,cwd:i});if(y.isErr()){a.push(y.unwrapErr());continue}let w=y.unwrap();w&&(l.add(w.dependency),p[m]=w.template);continue}let g=Xe(m);if(!g.isErr()){let y=g.unwrap();if(_n(y.name).validForNewPackages){c.add(m);continue}}let h=vi(m,t$1,{filePath:r,containingDir:o,dirs:s$1,cwd:i});if(h.isErr()){a.push(h.unwrapErr());continue}let u=h.unwrap();u?(l.add(u.dependency),p[m]=u.template):console.warn(`${L} ${$e} Skipped adding import \`${k.cyan(m)}\` from ${r}. Reason: Not a valid package name or path alias.`);}if(a.length>0)return t(a);let{devDependencies:d,dependencies:v}=ki(Array.from(c),r,{doNotInstall:n||[]});return s({dependencies:v,devDependencies:d,local:Array.from(l),imports:p})},Fn=(e,t$1,{filePath:r,containingDir:o,dropExtension:n=true,alias:s$1,dirs:i,cwd:a})=>{if(t$1&&(e.startsWith("./")||e==="."))return s(void 0);let c=t$1?te.join(o,"../"):te.join(r,"../"),l=te.join(te.join(r,"../"),e),p=te.join(c,"../");if(o&&l.startsWith(o))return s(void 0);if(l.startsWith(p))return s(Dn(l.slice(p.length),n));for(let d of i){let v=te.resolve(te.join(a,d)),m=te.resolve(l);if(m.startsWith(v))return s(Dn(m.slice(v.length+1),n))}return t(`${r}:
${s$1||e} references code not contained in ${k.bold(i.join(", "))} and cannot be resolved.`)},Dn=(e,t=true)=>{let[r,o,...n]=e.split("/"),s=o;s===void 0&&(s="index");let i=s;t&&i.includes(".")&&(i=i.slice(0,i.length-te.parse(i).ext.length));let a=`${r}/${i}`,c=`{{${a}}}`;return n.length===0?i.length!==s.length&&(c+=te.parse(s).ext):c+=`/${n.join("/")}`,{dependency:a,template:c}},vi=(e,t$1,{filePath:r,dirs:o,cwd:n,containingDir:s$1})=>{let i=_t(r);if(i.isErr())return t(i.unwrapErr());let a=i.unwrap();if(a===null)return s(void 0);let c=createPathsMatcher(a);if(c){let l=c(e);for(let p of l){let d=$i(p);if(!d)continue;let v=te.relative(te.resolve(te.join(r,"../")),d.prettyPath),m=wi(d.prettyPath,d.path,[".js",".ts"]),g=Fn(v,t$1,{filePath:r,containingDir:s$1,alias:e,dropExtension:m,dirs:o,cwd:n,modIsFile:d.type==="file"});if(g.isErr())return t(g.unwrapErr());if(g.unwrap())return s(g.unwrap());break}}return s(void 0)},wi=(e,t,r=[".ts",".js",""])=>{if(e===t)return true;let o=te.parse(e),n=te.parse(t),s=te.join(o.dir,o.name),i=te.join(n.dir,n.name);return s!==i?false:!!(r.includes(o.ext)&&r.includes(n.ext))},$i=e=>{if(ge.existsSync(e))return {path:e,prettyPath:e,type:ge.statSync(e).isDirectory()?"directory":"file"};let t=te.join(e,"../");if(!ge.existsSync(t))return;let r=te.parse(e);if(r.ext===".js"){let n=`${e.slice(0,e.length-3)}.ts`;if(ge.existsSync(n))return {path:n,prettyPath:e,type:"file"}}let o=ge.readdirSync(t);for(let n of o){let s=te.parse(n);if(s.name===r.base){let i=te.join(t,n),a=i.slice(0,i.length-s.ext.length);return {path:i,prettyPath:a,type:ge.statSync(i).isDirectory()?"directory":"file"}}}},ki=(e,t,{doNotInstall:r}={doNotInstall:[]})=>{let o=new Set(r),n=Ur(te.dirname(t),""),s=new Set,i=new Set;if(n){let{devDependencies:a,dependencies:c}=JSON.parse(ge.readFileSync(n,"utf-8"));for(let l of e){let p=Xe(l);if(p.isErr()){console.warn(`${L} ${$e} Skipped adding import \`${k.cyan(l)}\`. Reason: Couldn't parse package name`);continue}let d=p.unwrap();if(!_n(d.name).validForNewPackages){console.warn(`${L} ${$e} Skipped adding import \`${k.cyan(l)}\`. Reason: Not a valid package name`);continue}if(o.has(d.name))continue;let v;if(c!==void 0&&(v=c[d.name]),v!==void 0){s.add(`${d.name}@${v}`);continue}if(a!==void 0&&(v=a[d.name]),v!==void 0){i.add(`${d.name}@${v}`);continue}s.add(d.name);}}return {dependencies:Array.from(s),devDependencies:Array.from(i)}},Ae=[dn,mn,$r,wn,kn,Cn,jn,En,yn,An,On];var Mn=new Set(["svelte","@sveltejs/kit","vue","nuxt","react","react-dom","next","@remix-run/react","@angular/core","@angular/common","@angular/forms","@angular/platform-browser","@angular/platform-browser-dynamic","@angular/router","@builder.io/qwik","astro","solid-js"]),Bn=x.union([x.literal("off"),x.literal("warn"),x.literal("error")]),xi=x.union([x.literal("no-category-index-file-dependency"),x.literal("no-unpinned-dependency"),x.literal("require-local-dependency-exists"),x.literal("max-local-dependencies"),x.literal("no-circular-dependency"),x.literal("no-unused-block"),x.literal("no-framework-dependency"),x.literal("require-config-file-exists"),x.literal("no-config-file-framework-dependency"),x.literal("no-config-file-unpinned-dependency")]),Vn={"no-unpinned-dependency":{description:"Require all dependencies to have a pinned version.",scope:"block",check:e=>{let t=[];for(let r of [...e.dependencies,...e.devDependencies])r.includes("@")||t.push(`Couldn't find a version to use for ${k.bold(r)}`);return t.length>0?t:void 0}},"require-local-dependency-exists":{description:"Require all local dependencies to exist.",scope:"block",check:(e,{manifest:t})=>{let r=[];for(let o of e.localDependencies){let[n,s]=o.split("/"),i=t.categories.find(c=>c.name.trim()===n.trim()),a=`${k.bold(`${e.category}/${e.name}`)} depends on local dependency ${k.bold(o)} which doesn't exist`;if(!i){r.push(a);continue}i.blocks.find(c=>c.name===s)===void 0&&r.push(a);}return r.length>0?r:void 0}},"no-category-index-file-dependency":{description:"Disallow depending on the index file of a category.",scope:"block",check:(e,{manifest:t})=>{let r=[];for(let o of e.localDependencies){let[n,s]=o.split("/");if(s!=="index")continue;let i=t.categories.find(c=>c.name===n);!i||!i.blocks.find(c=>c.name===s)||r.push(`${k.bold(`${e.category}/${e.name}`)} depends on ${k.bold(`${n}/${s}`)}`);}return r.length>0?r:void 0}},"max-local-dependencies":{description:"Enforces a limit on the amount of local dependencies a block can have.",scope:"block",check:(e,{options:t})=>{let r=[],o;return typeof t[0]!="number"?o=5:o=t[0],e.localDependencies.length>o&&r.push(`${k.bold(`${e.category}/${e.name}`)} has too many local dependencies (${k.bold(e.localDependencies.length)}) limit (${k.bold(o)})`),r.length>0?r:void 0}},"no-circular-dependency":{description:"Disallow circular dependencies.",scope:"block",check:(e,{manifest:t})=>{let r=[],o=`${e.category}/${e.name}`,n=br(o,e,t.categories);return n&&r.push(`There is a circular dependency in ${k.bold(o)}: ${k.bold(n.join(" -> "))}`),r.length>0?r:void 0}},"no-unused-block":{description:"Disallow unused blocks. (Not listed and not a dependency of another block)",scope:"block",check:(e,{manifest:t})=>{if(e.list)return;let r=`${e.category}/${e.name}`,o=t.categories.flatMap(n=>n.blocks).filter(n=>n.list);for(let n of o)if(br(r,n,t.categories))return;return [`${k.bold(r)} is unused and will be ${k.bold.red("removed")}`]}},"no-framework-dependency":{description:"Disallow frameworks (Svelte, Vue, React) as dependencies.",scope:"block",check:e=>{let t=[],r=[...e.devDependencies,...e.dependencies].map(o=>Xe(o).unwrap().name).filter(o=>Mn.has(o));if(r.length>0)for(let o of r)t.push(`${k.bold(`${e.category}/${e.name}`)} depends on ${k.bold(o)} causing it to be installed when added`);return t.length>0?t:void 0}},"require-config-file-exists":{description:"Require all of the paths listed in `configFiles` to exist.",scope:"global",check:({manifest:e,cwd:t})=>{let r=[];if(e.configFiles!==void 0){for(let o of e.configFiles)ge.existsSync(te.join(t,o.path))||r.push(`The ${k.bold(o.name)} config file doesn't exist at ${k.bold(te.join(t,o.path))}`);return r.length>0?r:void 0}}},"no-config-file-framework-dependency":{description:"Disallow frameworks (Svelte, Vue, React) as dependencies of config files.",scope:"global",check:({manifest:e})=>{let t=[];if(e.configFiles!==void 0){for(let r of e.configFiles){let o=[...r.devDependencies??[],...r.dependencies??[]].map(n=>Xe(n).unwrap().name).filter(n=>Mn.has(n));if(o.length>0)for(let n of o)t.push(`${k.bold(r.name)} depends on ${k.bold(n)} causing it to be installed when added`);}return t.length>0?t:void 0}}},"no-config-file-unpinned-dependency":{description:"Require all dependencies of config files to have a pinned version.",scope:"global",check:({manifest:e})=>{let t=[];if(e.configFiles){for(let r of e.configFiles)for(let o of [...r.dependencies??[],...r.devDependencies??[]])o.includes("@")||t.push(`Couldn't find a version to use for ${k.bold(o)}`);return t.length>0?t:void 0}}}},Wn=x.record(xi,x.union([Bn,x.tupleWithRest([Bn,x.union([x.string(),x.number()])],x.union([x.string(),x.number()]))])),Hr={"no-category-index-file-dependency":"warn","no-unpinned-dependency":"warn","require-local-dependency-exists":"error","max-local-dependencies":["warn",10],"no-circular-dependency":"error","no-unused-block":"warn","no-framework-dependency":"warn","require-config-file-exists":"error","no-config-file-framework-dependency":"warn","no-config-file-unpinned-dependency":"warn"},Un=(e,t,r,o=Hr)=>{let n=[],s=[];for(let[i,a]of Object.entries(Vn)){if(a.scope==="block")continue;let c=o[i],l,p=[];if(Array.isArray(c)?(l=c[0],p.push(...c.slice(1))):l=c,l==="off")continue;let d=a.check({manifest:e,options:p,cwd:r,config:t});if(d){if(l==="error"){s.push(...d.map(v=>`${L} ${Yt} ${k.red(v)} ${k.gray(i)}`));continue}n.push(...d.map(v=>`${L} ${$e} ${v} ${k.gray(i)}`));}}for(let i of e.categories)for(let a of i.blocks)for(let[c,l]of Object.entries(Vn)){if(l.scope==="global")continue;let p=o[c],d,v=[];if(Array.isArray(p)?(d=p[0],v.push(...p.slice(1))):d=p,d==="off")continue;let m=l.check(a,{manifest:e,options:v,cwd:r,config:t});if(m){if(d==="error"){s.push(...m.map(g=>`${L} ${Yt} ${k.red(g)} ${k.gray(c)}`));continue}n.push(...m.map(g=>`${L} ${$e} ${g} ${k.gray(c)}`));}}return {warnings:n,errors:s}},br=(e,t,r,o=[])=>{let n=[...o,`${t.category}/${t.name}`];for(let s of t.localDependencies){if(s===e)return n;if(o.includes(s))return;let[i,a]=s.split("/"),c=r.find(p=>p.name===i)?.blocks.find(p=>p.name===a);if(!c)continue;let l=br(e,c,r,n);if(l)return [...l,e]}},Gn=(e,t)=>{for(let r of t)for(let o of r.blocks){if(!o.list)continue;if(br(e,o,t))return true}return false};var zn=[".test.ts","_test.ts",".test.js","_test.js",".spec.ts","_spec.ts",".spec.js","_spec.js",".stories.jsx","_stories.jsx",".stories.tsx","_stories.tsx"],Ft=e=>zn.find(t=>e.endsWith(t))!==void 0,Yn=(e,{cwd:t,ignore:r,config:o})=>{let n;try{n=ge.readdirSync(e);}catch{program.error(k.red(`Couldn't read the ${k.bold(e)} directory.`));}let s=[];for(let i of n){let a=te.join(e,i);if(ge.statSync(a).isFile())continue;let c=`${te.relative(t,a)}/`;if(r.ignores(c))continue;let l=te.basename(i);if(!Ri(l,o))continue;let p=Ci(l,o),d={name:l,blocks:[]},v=ge.readdirSync(a);for(let m of v){let g=te.join(a,m);if(ge.statSync(g).isFile()){if(Ft(m))continue;let h=Si(m),u=Kn(h,o);if(!Jn(h,o))continue;let y=Ae.find(N=>N.matches(m));if(!y){console.warn(`${L} ${$e} Skipped \`${k.bold(g)}\` \`*${k.bold(te.parse(m).ext)}\` files are not currently supported!`);continue}let w=v.find(N=>zn.find(F=>N===`${h}${F}`)),{dependencies:S,devDependencies:f,local:C,imports:P}=y.resolveDependencies({filePath:g,isSubDir:false,excludeDeps:o.excludeDeps,dirs:o.dirs,cwd:t}).match(N=>N,N=>{program.error(k.red(N));}),I={name:h,directory:te.relative(t,a),category:l,tests:w!==void 0,subdirectory:false,list:p?u:false,files:[m],localDependencies:C,_imports_:P,dependencies:S,devDependencies:f};w!==void 0&&I.files.push(w),d.blocks.push(I);}else {let h=m,u=Kn(h,o);if(!Jn(h,o))continue;let y=new Set,w=new Set,S=new Set,f={},C=false,P=[],I=(F,X)=>{for(let G of X){let re=te.join(F,G),b=re.slice(g.length+1);if(Ft(G)){C=true,P.push(b);continue}if(ge.statSync(re).isDirectory()){if(!o.allowSubdirectories){console.warn(`${L} ${$e} Skipped \`${k.bold(te.join(g,G))}\` subdirectories are not allowed! Allow them with ${k.bold("--allow-subdirectories")}!`);continue}let B=ge.readdirSync(re);I(re,B);continue}let $=Ae.find(B=>B.matches(G));if(!$){console.warn(`${L} ${$e} Skipped \`${re}\` \`*${k.bold(te.parse(G).ext)}\` files are not currently supported!`);continue}let{local:R,dependencies:Q,devDependencies:D,imports:H}=$.resolveDependencies({isSubDir:true,excludeDeps:o.excludeDeps,dirs:o.dirs,containingDir:g,filePath:re,cwd:t}).match(B=>B,B=>{program.error(k.red(B));});for(let B of R)B!==`${l}/${h}`&&y.add(B);for(let B of Q)w.add(B);for(let B of D)S.add(B);for(let[B,O]of Object.entries(H))f[B]=O;P.push(b);}};I(g,ge.readdirSync(g));let N={name:h,directory:te.relative(t,g),category:l,tests:C,subdirectory:true,list:p?u:false,files:P,localDependencies:Array.from(y.keys()),dependencies:Array.from(w.keys()),devDependencies:Array.from(S.keys()),_imports_:f};d.blocks.push(N);}}s.push(d);}return s},qn=(e,{cwd:t})=>{if(!e.configFiles)return;let r=[];for(let o of e.configFiles){let n=Ae.find(c=>c.matches(o.path));if(!n){r.push(o);continue}let{dependencies:s,devDependencies:i,local:a}=n.resolveDependencies({filePath:te.join(t,o.path),isSubDir:false,excludeDeps:e.excludeDeps,dirs:e.dirs,cwd:t}).match(c=>c,c=>{program.error(k.red(c));});a.length>0&&program.error(k.red(`${k.bold(o.name)} ${k.bold(o.path)} Config files cannot have local dependencies!`)),r.push({...o,dependencies:s,devDependencies:i});}return r},Kn=(e,t)=>t.doNotListBlocks.length>0&&t.doNotListBlocks.includes(e)?false:t.listBlocks.length>0?t.listBlocks.includes(e):true,Jn=(e,t)=>t.excludeBlocks.length>0&&t.excludeBlocks.includes(e)?false:t.includeBlocks.length>0?t.includeBlocks.includes(e):true,Ci=(e,t)=>t.doNotListCategories.length>0&&t.doNotListCategories.includes(e)?false:t.listCategories.length>0?t.listCategories.includes(e):true,Ri=(e,t)=>t.excludeCategories.length>0&&t.excludeCategories.includes(e)?false:t.includeCategories.length>0?t.includeCategories.includes(e):true,Si=e=>te.parse(te.basename(e)).name,Qn=e=>{let t=[];for(let o of e){let n=[];for(let s of o.blocks){let i=`${s.category}/${s.name}`;!s.list&&!Gn(i,e)||n.push(s);}n.length>0&&t.push({name:o.name,blocks:n});}return [t,0]};var He=`${c}.json`,dt=`${c}-build-config.json`,zr=x.union([x.literal("prettier")]),ji=x.objectWithRest({"*":x.string()},x.string()),Lt=x.object({$schema:x.string(),repos:x.optional(x.array(x.string()),[]),includeTests:x.boolean(),paths:ji,configFiles:x.optional(x.record(x.string(),x.string())),watermark:x.optional(x.boolean(),true),formatter:x.optional(zr)}),fe=e=>{if(!ge.existsSync(te.join(e,He)))return t("Could not find your configuration file! Please run `init`.");let t$1=x.safeParse(Lt,JSON.parse(ge.readFileSync(te.join(e,He)).toString()));return t$1.success?s(t$1.output):t(`There was an error reading your \`${He}\` file!`)},Ei=x.object({$schema:x.string(),meta:x.optional(x$1),peerDependencies:x.optional(y),configFiles:x.optional(x.array(z)),dirs:x.array(x.string()),outputDir:x.optional(x.string()),includeBlocks:x.optional(x.array(x.string()),[]),includeCategories:x.optional(x.array(x.string()),[]),excludeBlocks:x.optional(x.array(x.string()),[]),excludeCategories:x.optional(x.array(x.string()),[]),doNotListBlocks:x.optional(x.array(x.string()),[]),doNotListCategories:x.optional(x.array(x.string()),[]),listBlocks:x.optional(x.array(x.string()),[]),listCategories:x.optional(x.array(x.string()),[]),excludeDeps:x.optional(x.array(x.string()),[]),allowSubdirectories:x.optional(x.boolean()),preview:x.optional(x.boolean()),rules:x.optional(Wn)}),Rr=e=>{if(!ge.existsSync(te.join(e,dt)))return s(null);let t$1=x.safeParse(Ei,JSON.parse(ge.readFileSync(te.join(e,dt)).toString()));return t$1.success?s(t$1.output):t(`There was an error reading your \`${dt}\` file!`)},De=(e,t$1)=>{let r=_t(t$1).unwrapOr(null),o=r?createPathsMatcher(r):null,n={"*":""};for(let[s,i]of Object.entries(e)){if(i.startsWith("./")){n[s]=te.relative(t$1,te.join(te.resolve(t$1),i));continue}if(o===null)return t(`Cannot resolve ${k.bold(`\`"${s}": "${i}"\``)} from paths because we couldn't find a tsconfig! If you intended to use a relative path ensure that your path starts with ${k.bold("`./`")}.`);let a=Ii(i,o,t$1);if(!a)return t(`Cannot resolve ${k.bold(`\`"${s}": "${i}"\``)} from paths because we couldn't find a matching alias in the tsconfig. If you intended to use a relative path ensure that your path starts with ${k.bold("`./`")}.`);n[s]=a;}return s(n)},Ii=(e,t,r)=>{let o=t(e);return o.length>0?te.relative(r,o[0]):void 0},Yr=(e,t,r)=>{let o;return t[e.category]!==void 0?o=te.join(r,t[e.category]):o=te.join(r,t["*"],e.category),o};var Mt=async(e,t,{verbose:r})=>await L$1(e,t,{verbose:r,fetch:qr,token:Qr(e.provider,e.url),userName:Xr(e.provider,e.url),machineId:Zr(e.provider,e.url)}),Sr=async(e,{verbose:t}={})=>await M(e,{verbose:t,fetch:qr,token:Qr(e.provider,e.url),userName:Xr(e.provider,e.url),machineId:Zr(e.provider,e.url)}),Qr=(e,t)=>{let r=new Ne;return e.name==="http"?r.get(`http-${new URL(t).origin}`):r.get(e.name)},Xr=(e,t)=>{let r=new Ne;return e.name==="http"?r.get(r.getHttpUsernameToken(new URL(t).origin)):r.get(e.name)},Zr=(e,t)=>{let r=new Ne;return e.name==="http"?r.get(r.getHttpMachineIdToken(new URL(t).origin)):r.get(e.name)},eo=async(e,{noCache:t$1=false}={})=>{let r=K$1(e);if(r){let o=Ke();if(r.name!==I.name&&!t$1){let i=o.get(`${e}-state`);if(i)return s({...i,provider:r})}let n=r.parse(e,{fullyQualified:false}),s$1=await r.state(e,{token:Qr(r,n.url),userName:Xr(r,n.url),machineId:Zr(r,n.url),fetch:qr});return r.name!==I.name&&!t$1&&o.set(`${e}-state`,s$1),s(s$1)}return t(`Only ${J.map((o,n)=>`${n===J.length-1?"and ":""}${k.bold(o.name)}`).join(", ")} registries are supported at this time!`)},ze=async(e,{noCache:t$1=false}={})=>{let r=[],n=(await Promise.all(e.map(async s=>{let i=await eo(s,{noCache:t$1});if(i.isErr())return t({message:i.unwrapErr(),repo:s});let a=i.unwrap();r.push(a);}))).find(s=>s!==void 0);return n||s(r)},Xn=async(...e)=>{let t$1=new Map,o=(await Promise.all(e.map(async n=>{let s=await Sr(n);if(s.isErr())return t({message:s.unwrapErr(),repo:n.url});let i=s.unwrap();for(let a of i.categories)for(let c of a.blocks)t$1.set(u(n.url,`${c.category}/${c.name}`),{...c,sourceRepo:n});}))).find(n=>n!==void 0);return o||s(t$1)},ft=e=>{let t=new Map;for(let r of e)for(let o of r.manifest.categories)for(let n of o.blocks)t.set(u(r.state.url,`${n.category}/${n.name}`),{...n,sourceRepo:r.state});return t},ut=async(...e)=>{let t$1=[],o=(await Promise.all(e.map(async n=>{let s=await Sr(n);if(s.isErr())return t({message:s.unwrapErr(),repo:n.url});let i=s.unwrap();t$1.push({state:n,manifest:i});}))).find(n=>n!==void 0);return o||s(t$1)};var tt=async(e,t$1,r,o=new Map)=>{let n=new Map;for(let s of e){let i,a=K$1(s);if(a){let{url:l,specifier:p}=a.parse(s,{fullyQualified:true});i=t$1.get(u(l,p));}else {if(r.length===0)return t(k.red(`If your config doesn't contain repos then you must provide the repo in the block specifier ex: \`${k.bold(`github/ieedan/std/${s}`)}\`!`));for(let l of r){let{url:p,specifier:d}=l.provider.parse(u(l.url,s),{fullyQualified:true}),v=t$1.get(u(p,d));if(v!==void 0){i=v;break}}}if(!i)return t(`Invalid block! ${k.bold(s)} does not exist!`);let c=`${i.category}/${i.name}`;if(n.set(c,i),i.localDependencies&&i.localDependencies.length>0){let l=await tt(i.localDependencies.filter(p=>!n.has(p)&&!o.has(p)),t$1,r,n);if(l.isErr())return t(l.unwrapErr());for(let p of l.unwrap())n.set(`${p.category}/${p.name}`,p);}}return s(Fo(n,(s,i)=>i))},or=(e,t,r)=>{let o=[],n=De(t.paths,r).match(s=>s,s=>program.error(k.red(s)));for(let[s,i]of e){let a=Yr(i,n,r),c=te.join(a,i.files[0]);i.subdirectory&&(c=te.join(a,i.name)),ge.existsSync(c)&&o.push({specifier:`${i.category}/${i.name}`,path:c,block:i});}return o},mt=(e,t,r)=>{let o=s=>{r&&console.info(`${ce} ${s}`);},n=[];for(let s of e){let i=s.files.filter(c=>Ft(c)?t.includeTests:true),a=Promise.all(i.map(async c=>{let l=await Mt(s.sourceRepo,te.join(s.directory,c),{verbose:o});return {name:c,content:l}}));n.push({block:s,files:a});}return n},rt=(e,t,r,o)=>{let n=Yr(t,r,o);return t.subdirectory?te.join(n,t.name,e):te.join(n,e)};var Zn=e=>new Promise(t=>t(e));var Me=async({formatter:e,cwd:t})=>{let r={singleQuote:true};return e==="prettier"&&(r=await pn.resolveConfig(te.join(t,".prettierrc"))),{prettierOptions:r}};var St=(e,t)=>`Installed from ${e}${t?`
Update this file using \`${b} update ${t}\``:""}`;var Bt=(e,t,r)=>{if(!t.peerDependencies)return;let o=Gr(te.join(r,"package.json")).match(i=>i,i=>{i.endsWith("doesn't exist")&&program.error(`Couldn't find your ${k.bold("package.json")}. Please create one.`),program.error(k.red(i));}),n={...o.dependencies,...o.devDependencies},s=[];for(let[i,a]of Object.entries(t.peerDependencies)){let c,l;typeof a=="string"?c=a:(c=a.version,l=a.message);let p=n[i];if(!p){s.push({name:i,expected:c,message:l,version:p,exists:false});continue}Ho.satisfies(gr(p),c)||s.push({name:i,expected:c,message:l,version:p,exists:true});}if(s.length>0){process.stdout.write(`${L}
${k.yellow("\u25B2")} ${Do} Issues with ${k.bold(e.url)} peer dependencies
`);let i=s.map((a,c)=>{let l=s.length-1===c,p;a.exists?p=`${k.yellowBright("x unmet peer")} need ${k.bold(`${a.name}@`)}${k.greenBright.bold(a.expected)} >> found ${k.yellowBright.bold(a.version)}`:p=`${k.red("x missing peer")} need ${k.bold(`${a.name}@`)}${k.greenBright.bold(a.expected)}`;let d=`${L} ${l?_o:zt}${Ht} ${p}`;return a.message?`${d}
${L} ${l?"":L} ${k.gray(a.message)}`:d}).join(`
`);process.stdout.write(`${i}
`);}};var Vt=e=>{let t=It.join(e,"app.config.ts");if(gt.existsSync(t)&>.statSync(t).isFile())return t;let r=gt.readdirSync(e);for(let o of r){let n=It.join(e,o);if(gt.statSync(n).isDirectory()){let s=Vt(n);if(s)return s}}};function nr(e,t){let r=/providers:\s*\[\s*([^\]]*)\s*\]/s,o=e.match(r);if(o&&!t.some(n=>o[0].includes(n))){let n=o[1].trim(),s=n?`${n}${n.endsWith(",")?" ":", "}${t.join(", ")}`:t.join(", ");e=e.replace(o[0],`providers: [${s}]`);}return e}async function Er(e){return await glob("**/project.json",{cwd:e})}var os=async e=>{let t=It.join(e,"angular.json");if(gt.existsSync(t)&>.statSync(t).isFile()){let n=[],i=JSON.parse(gt.readFileSync(t,"utf8")).projects||{};for(let[a,c]of Object.entries(i))c.projectType==="application"&&n.push(c.sourceRoot);return n}let r=It.join(e,"nx.json");if(gt.existsSync(r)&>.statSync(r).isFile()){let n=await Er(e),s=[];for(let i of n){let a=JSON.parse(gt.readFileSync(i,"utf8"));a.projectType==="application"&&(a.targets?.build?.executor).includes("angular")&&s.push(It.join(e,a.sourceRoot));}return s}let o=It.join(e,"src");if(gt.existsSync(o)&>.statSync(o).isDirectory())return [o];throw new Error("Could not find src root")};var Ji=x.object({expand:x.boolean(),maxUnchanged:x.number(),allow:x.boolean(),yes:x.boolean(),verbose:x.boolean(),cwd:x.string(),skipPreconditions:x.optional(x.boolean()),silent:x.optional(x.boolean()),config:x.optional(Lt),skipAskingForDependencies:x.optional(x.boolean())}),to=new Command("add").description("Add blocks to your project.").addArgument(new Argument("<blocks...>","Names of the blocks you want to add to your project. ex: (free-authentication/login-with-email-password)").argRequired()).option("-E, --expand","Expands the diff so you see the entire file.",false).option("--max-unchanged [number]","Maximum unchanged lines that will show without being collapsed.",e=>Number.parseInt(e),3).option("-A, --allow",`Allow ${b} to download code from the provided repo.`,false).option("-y, --yes","Skip confirmation prompt.",false).option("--verbose","Include debug logs.",false).option("--cwd [path]","The current working directory.",process.cwd()).option("--skip-asking-for-dependencies","Skip asking for dependency installation.",false).action(async(e,t)=>{let r=x.parse(Ji,t);await ye();let o=await ro(e,r);o=[...new Set(o)].filter(n=>!!n),o=o.map((n,s)=>`${s+1}. ${n}`),!r.silent&&o.length>0&&process.stdout.write(Ze(o)),outro(k.green("All done!"));}),ro=async(e,t)=>{let r$1=[],o=b=>{t.verbose&&console.info(`${ce} ${b}`);};o(`Attempting to add ${JSON.stringify(e)}`);let n=be({verbose:t.verbose?o:void 0}),s=fe(t.cwd),i$1=s.isErr()&&t.config===void 0,a;if(s.isErr()){let b=t.yes;if(!t.yes){let $=await confirm({message:`You don't have ${lt} initialized in your project. Do you want to continue?`,initialValue:false});isCancel($)&&(cancel("Canceled!"),process.exit(0)),b=$;}b||(cancel("Canceled!"),process.exit(0)),a={$schema:"",includeTests:false,watermark:true,paths:{"*":"./src/app/ngm-dev-blocks"},repos:i,...t.config};}else a=s.unwrap();let c=a.repos,l=new Set,p=false;for(let b of e){let $=K$1(b);if(!$){p=true;continue}let{url:R}=$.parse(b,{fullyQualified:true});if(!(!a.repos.find(D=>D===R)&&!l.has(R))){if(!t.allow){let D=await confirm({message:`Allow ${lt} to download and run code from ${k.cyan(R)}?`,initialValue