UNPKG

jsrepo

Version:

A CLI to add shared code from remote repositories.

75 lines (73 loc) 113 kB
#!/usr/bin/env node import {h,g,f,j,z as z$1,c,w,m,o,p,x as x$1,y,a,v,u,b,l,B,A as A$1}from'./chunk-UBBLYFUD.js';import {Command,Option,program,Argument,InvalidArgumentError}from'commander';import fe from'fs';import {outro,confirm,isCancel,cancel,multiselect,text,select,log,spinner,password,intro}from'@clack/prompts';import A from'chalk';import {resolveCommand}from'package-manager-detector/commands';import {detect}from'package-manager-detector/detect';import te from'pathe';import*as k from'valibot';import gi from'is-unicode-supported';import {stripVTControlCharacters}from'util';import {builtinModules}from'module';import {createPathsMatcher,getTsconfig}from'get-tsconfig';import En from'validate-npm-package-name';import wi from'os';import os from'escape-string-regexp';import {detect as detect$1,resolveCommand as resolveCommand$1}from'package-manager-detector';import {x}from'tinyexec';import Ho from'boxen';import {diffLines,diffChars}from'diff';import Jo from'semver';import {cursor,erase}from'sisteransi';import Ri from'@anthropic-ai/sdk';import Ei from'ollama';import Ii from'openai';import Ci from'conf';import Ai from'make-fetch-happen';import {Biome,Distribution}from'@biomejs/js-api';import*as on from'css-dependency';import*as nn from'prettier';import*as an from'parse5';import ps from'oxc-parser';import {walk}from'estree-walker';import*as bn from'svelte/compiler';import*as Cn from'vue/compiler-sfc';import Xs from'node-machine-id';import oa from'ignore';import {Server}from'@modelcontextprotocol/sdk/server/index.js';import {StdioServerTransport}from'@modelcontextprotocol/sdk/server/stdio.js';import {CallToolRequestSchema,ListToolsRequestSchema}from'@modelcontextprotocol/sdk/types.js';import*as ii from'tar';var Dt={name:"jsrepo",description:"A CLI to add shared code from remote repositories.",version:"2.4.1"};var hi=gi(),de=(e,t)=>hi?e:t,So=de("\u25C6","*"),jo=de("\u25C6","*"),Po=de("\u25A0","x"),T=A.gray(de("\u2502","|")),Ht=A.gray(de("\u2500","-")),Eo=A.gray(de("\u2510","+")),Io=A.gray(de("\u2518","+")),Kt=A.gray(de("\u251C","+")),Oo=A.gray(de("\u252C","+"));A.gray(de("\u250C","T"));var Do=A.gray(de("\u2514","-")),ce=A.bgRgb(245,149,66).black(" WARN "),Ee=A.bgBlueBright.white(" INFO "),Yt=A.bgRedBright.white(" ERROR "),Xe=A.hex("#f7df1e")("jsrepo"),We=A.hex("#f7df1e").bold("jsrepo.com");function mr(e,t){let r=[];for(let[o,n]of e)r.push(t(o,n));return r}function To(e,t){let r=0;for(let o of e)r=r+t(o);return r}function No(e){let t=0;for(let r of e){let o=stripVTControlCharacters(r);o.length>t&&(t=o.length);}return t}function Qt(e,t,r=" "){let o=stripVTControlCharacters(e).length;if(o>t)throw new Error("String length is greater than the length provided.");return r.repeat(t-o)+e}function Fo(e,t,r=" "){let o=stripVTControlCharacters(e).length;if(o>t)throw new Error("String length is greater than the length provided.");return e+r.repeat(t-o)}var bi=/\n|\r\n/g;function q(e){return e.split(bi)}function z(e,{lineNumbers:t=false,prefix:r}={}){let o=e;if(t){let n=e.length.toString().length+1;o=o.map((i,s)=>`${Qt(`${s+1}`,n)} ${i}`);}return r!==void 0&&(o=o.map((n,i)=>`${r(i,e.length)}${n}`)),o.join(wi.EOL)}var ki={"no-workspace":"--no-workspace","install-as-dev-dependency":"-D"},$i={"install-as-dev-dependency":"-D"},xi={"no-workspace":"--workspaces=false","install-as-dev-dependency":"-D"},Lo={"no-workspace":"--ignore-workspace","install-as-dev-dependency":"-D"},Bo={"no-workspace":"--focus","install-as-dev-dependency":"-D"},Lr={bun:ki,npm:xi,pnpm:Lo,deno:$i,yarn:Bo,"yarn@berry":Bo,"pnpm@6":Lo};function Ve(){return new Ci({projectName:"jsrepo"})}var Br="http-registries-w-tokens",pe=class{#e;constructor(t){this.#e=t??Ve();}getKey(t){return `${t}-token`.toLowerCase()}get(t){let r=this.getKey(t),o=this.#e.get(r,void 0);return t==="jsrepo"?o??process.env.JSREPO_TOKEN:o}set(t,r){if(t.startsWith("http")){let n=this.getHttpRegistriesWithTokens(),i=t.slice(5);n||(n=[]),n.includes(i)||n.push(i),this.#e.set(Br,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),i=o.indexOf(n);i!==-1&&(o=[...o.slice(0,i),...o.slice(i+1)]),this.#e.set(Br,o);}let r=this.getKey(t);this.#e.delete(r);}getHttpRegistriesWithTokens(){let t=this.#e.get(Br);return t||[]}};var Wr={"Claude 3.7 Sonnet":{updateFile:async({originalFile:e,newFile:t,loading:r,verbose:o,additionalInstructions:n,messages:i})=>{let s=await _o("Anthropic");o||r.start("Asking Claude 3.7 Sonnet");let a=_r({originalFile:e,newFile:t,additionalInstructions:n,rePrompt:i!==void 0&&i.length>0});o?.(`Prompting Claude 3.7 Sonnet with: ${JSON.stringify(a,null," ")}`);let c=await Di({model:"claude-3-7-sonnet-latest",prompt:a,apiKey:s,messages:i,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:i})=>{let s=await _o("OpenAI");o||r.start("Asking OpenAI o3-mini");let a=_r({originalFile:e,newFile:t,additionalInstructions:n,rePrompt:i!==void 0&&i.length>0});o?.(`Prompting OpenAI o3-mini with: ${JSON.stringify(a,null," ")}`);let c=await Oi({model:"o3-mini",prompt:a,apiKey:s,messages:i,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:i})=>{o||r.start("Asking Phi4");let s=_r({originalFile:e,newFile:t,additionalInstructions:n,rePrompt:i!==void 0&&i.length>0});o?.(`Prompting Phi4 with: ${JSON.stringify(s,null," ")}`);let a=await Ti({model:"phi4",prompt:s,messages:i});return o||r.stop("Phi4 updated the file"),a?{content:Mr(a),prompt:s.message}:{content:t.content,prompt:s.message}}}};async function Oi({prompt:e,maxTokens:t,model:r,apiKey:o,messages:n}){let a=(await new Ii({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}async function Di({prompt:e,messages:t,maxTokens:r,model:o,apiKey:n}){let i=new Ri({apiKey:n}),s=[];if(t)for(let l of t)s.push({role:l.role,content:[{type:"text",text:l.content}]});s.push({role:"user",content:[{type:"text",text:e.message}]});let c=(await i.messages.create({model:o,max_tokens:Math.min(r,8192),temperature:.5,system:e.system,messages:s})).content[0];return c.type!=="text"?null:c.text}async function Ti({prompt:e,messages:t,model:r}){return (await Ei.chat({model:r,messages:[{role:"system",content:e.system},...t??[],{role:"user",content:e.message}]})).message.content}function _r({originalFile:e,newFile:t,additionalInstructions:r,rePrompt:o}){return {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>`:""} `}}function Mr(e){let t=e.trim();if(t.startsWith("```")&&(t=q(t).slice(1).join(` `).trim()),t.endsWith("```")){let r=q(t);t=r.slice(0,r.length-1).join(` `).trim();}return t}async function _o(e){let t=new pe,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 Fe=Dt;function Mo(e){return /^\s+$/g.test(e)}function Tt(e){let t=e.length-1;for(;Mo(e[t])&&t>=0;){if(e[t]===` `)return e[t-1]==="\r"?e.slice(0,t-1):e.slice(0,t);t--;}return e}function Wo({from:e,to:t,changes:r,expand:o=false,maxUnchanged:n=5,colorRemoved:i=A.redBright,colorAdded:s=A.greenBright,colorCharsRemoved:a=A.bgRedBright,colorCharsAdded:c=A.bgGreenBright,prefix:l,onUnchanged:f,intro:h}){let m="",b=To(r,y=>y.count??0).toString().length+1,d=0;if(r.length===1&&!r[0].added&&!r[0].removed)return f({from:e,to:t,changes:r,expand:o,maxUnchanged:n,colorAdded:s,colorRemoved:i,prefix:l,onUnchanged:f,intro:h});m+=h({from:e,to:t,changes:r,expand:o,maxUnchanged:n,colorAdded:s,colorRemoved:i,prefix:l,onUnchanged:f,intro:h});let g=y=>A.gray(`${l?.()??""}${Qt(`${y+1+d} `,b)} `);for(let y=0;y<r.length;y++){let u=r[y],S=r[y-1]?.added||r[y-1]?.removed,C=r[y+1]?.added||r[y+1]?.removed;if(!u.added&&!u.removed){if(!o&&u.count!==void 0&&u.count>n){let x=d,R=q(Tt(u.value)),E=0;if(C&&(E+=n),S&&(E+=n),E>=R.length){m+=`${z(R,{prefix:g})} `,d+=R.length;continue}if(S&&(m+=`${z(R.slice(0,n),{prefix:g})} `),R.length>E){let K=R.length-E;m+=`${z(q(A.gray(`+ ${K} more unchanged (${A.italic("-E to expand")})`)),{prefix:()=>`${l?.()??""}${Qt(" ",b)} `})} `;}C&&(d=d+R.length-n,m+=`${z(R.slice(R.length-n),{prefix:g})} `),d=x+u.count;continue}m+=`${z(q(Tt(u.value)),{prefix:g})} `,d+=u.count??0;continue}let p=x=>x.added?s(Tt(x.value)):x.removed?i(Tt(x.value)):x.value,w=x=>x.added?c(Tt(x.value)):x.removed?a(Tt(x.value)):x.value;if(u.removed&&u.count===1&&r[y+1]?.added&&r[y+1]?.count===1){let R=diffChars(u.value,r[y+1].value).map(E=>w(E)).join("");m+=`${g(0)}${R}`,d+=1,y++;}else Mo(u.value)?(m+=`${z(q(w(u)),{prefix:x=>`${g(x)}${w({removed:true,value:" ",added:false})}`})} `,u.removed||(d+=u.count??0)):(m+=`${z(q(p(u)),{prefix:g})} `,u.removed||(d+=u.count??0));}return m.endsWith(` `)||(m=m+=` `),m}var Re=Ai.defaults({cachePath:te.join(import.meta.dirname,"cache")});var Vr="latest-version",Li=60*60*1e3;async function Vo({noCache:e=false}={}){try{let t=Ve(),r;if(!e){let i=t.get(Vr);if(i){if(i.expiration>Date.now())return r=i.version,a(r);t.delete(Vr);}}let o=await Re("https://raw.githubusercontent.com/jsrepojs/jsrepo/refs/heads/main/packages/cli/package.json",{timeout:1e3});if(!o.ok)return b("Error getting version");let{version:n}=await o.json();return r=n,t.set(Vr,{expiration:Date.now()+Li,version:r}),a(r)}catch(t){return b(`Error getting version: ${t}`)}}var Bi=/^(@[^\/]+\/[^@\/]+)(?:@([^\/]+))?(\/.*)?$/,_i=/^([^@\/]+)(?:@([^\/]+))?(\/.*)?$/;function Ze(e){let t=Bi.exec(e)||_i.exec(e);return t?a({name:t[1]||"",version:t[2]||void 0,path:t[3]||""}):b(`invalid package name: ${e}`)}function Ur(e,t){let r=te.join(e,"package.json");if(fe.existsSync(r))return r;if(e===t)return;let o=e.split(/[\/\\]/);return Ur(o.slice(0,o.length-1).join("/"),t)}function Gr(e){if(!fe.existsSync(e))return b(`${e} doesn't exist`);let t=fe.readFileSync(e).toString();try{return a(JSON.parse(t))}catch(r){return b(`Error reading package.json: ${r}`)}}function gr(e){return e[0]==="^"?e.slice(1):e}function Go(e,t,{cwd:r}){let o=e,n=t,i=Gr(te.join(r,"package.json"));if(!i.isErr()){let s=i.unwrap();if(s.dependencies)for(let a of o){let{name:c,version:l}=Ze(a).unwrap(),f=s.dependencies[c];if(l===void 0&&f){o.delete(a);continue}f&&Jo.satisfies(gr(f),l)&&o.delete(a);}if(s.devDependencies)for(let a of n){let{name:c,version:l}=Ze(a).unwrap(),f=s.devDependencies[c];if(l===void 0&&f){n.delete(a);continue}f&&Jo.satisfies(gr(f),l)&&n.delete(a);}}return {dependencies:o,devDependencies:n}}async function Ko(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);}}async function Yo({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);}function ve({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);}}}function ft(e){let t=Ho(e.join(` `),{title:"Next Steps",textAlignment:"left",padding:1,borderColor:"gray",borderStyle:{topLeft:stripVTControlCharacters(Kt),bottomLeft:stripVTControlCharacters(Kt),topRight:stripVTControlCharacters(Eo),top:stripVTControlCharacters(Ht),bottom:stripVTControlCharacters(Ht),bottomRight:stripVTControlCharacters(Io),left:stripVTControlCharacters(T),right:stripVTControlCharacters(T)}});return `${T} ${t} `}function Qo(e,t=3){let r=e.slice(0,t),o=e.length-r.length;return `${r.join(", ")}${o>0?` and ${o} other(s)`:""}`}async function Qi(e,t,r){let o=(await detect$1({cwd:process.cwd()}))?.agent??"npm",n=resolveCommand$1(o,"global",["jsrepo@latest"]),i=[`Update available! ${A.redBright(t)} -> ${A.greenBright(r)}`,`${A.cyan("Changelog")}: https://github.com/jsrepojs/jsrepo/releases/tag/${e}@${r}`,`Run ${A.cyan(`${n?.command} ${n?.args.join(" ")}`)} to update!`,"",`${A.yellowBright("Star")} on GitHub for updates: https://github.com/jsrepojs/jsrepo`];return Ho(i.join(` `),{borderColor:"gray",padding:1,margin:1,textAlignment:"center"})}async function ie(){console.clear();let e=await Vo();e.isOk()&&Jo.lt(Fe.version,e.unwrap())&&console.info(await Qi(Fe.name,Fe.version,e.unwrap())),intro(`${A.bgHex("#f7df1e").black(` ${Fe.name} `)}${A.gray(` v${Fe.version} `)}`);}var zo="model-preference";async function Nt({incoming:e,current:t,config:r,options:o}){let n=Ve();process.stdout.write(`${T} `);let i=false,s=e.content,a=n.get(zo,"Claude 3.5 Sonnet"),c=[];for(;;){let l=diffLines(t.content,s),f=Wo({from:e.path,to:t.path,changes:l,expand:o.expand,maxUnchanged:o.maxUnchanged,prefix:()=>`${T} `,onUnchanged:({from:h,to:m,prefix:b})=>`${b?.()??""}${A.cyan(h)} \u2192 ${A.gray(m)} ${A.gray("(unchanged)")} `,intro:({from:h,to:m,changes:b,prefix:d})=>{let g=b.filter(y=>y.added||y.removed).length;return `${d?.()??""}${A.cyan(h)} \u2192 ${A.gray(m)} (${g} change${g===1?"":"s"}) ${d?.()??""} `}});if(process.stdout.write(f),(l.length>1||t.content==="")&&(i=o.yes,!o.yes&&!o.no)){let h=[{label:"Accept",value:"accept"},{label:"Reject",value:"reject"}];c.length>0?h.push({label:`\u2728 ${A.yellow("Update with AI")} \u2728 ${A.gray("(Iterate)")}`,value:"update-iterate"},{label:`\u2728 ${A.yellow("Update with AI")} \u2728 ${A.gray("(Start over)")}`,value:"update"}):h.push({label:`\u2728 ${A.yellow("Update with AI")} \u2728`,value:"update"});let m=await select({message:"Accept changes?",options:h});if(isCancel(m)&&(cancel("Canceled!"),process.exit(0)),m==="update"||m==="update-iterate"){m==="update"&&(c=[]);let b=await select({message:"Select a model",options:Object.keys(Wr).map(g=>({label:g,value:g})),initialValue:a});isCancel(b)&&(cancel("Canceled!"),process.exit(0)),b!==a&&n.set(zo,b),a=b;let d=await text({message:"Additional instructions:",defaultValue:"None",validate:g=>{if(c.length!==0&&g.trim()==="")return "Please provide additional context so that I know how I can improve."}});isCancel(d)&&(cancel("Canceled!"),process.exit(0));try{let{content:g,prompt:y}=await Wr[a].updateFile({originalFile:t,newFile:{content:m==="update-iterate"?s:e.content,path:e.path},additionalInstructions:d!=="None"?d:void 0,loading:o.loading,verbose:o.verbose,messages:c});s=g,c.push({role:"user",content:y}),c.push({role:"assistant",content:g});}catch(g){o.loading.stop(),log.error(A.red(`Error getting completions: ${g}`)),process.stdout.write(`${T} `);continue}s=await vr({file:{content:s,destPath:t.path},biomeOptions:r.biomeOptions,prettierOptions:r.prettierOptions,formatter:r.formatter}),process.stdout.write(`${T} `);continue}i=m==="accept";break}break}return i?{applyChanges:true,updatedContent:s}:{applyChanges:false}}async function et(e,t,{yes:r,no:o=false,cwd:n,pm:i,ignoreWorkspace:s=false}){let{dependencies:a,devDependencies:c}=Go(e,t,{cwd:n});if(a.size>0||c.size>0){let f=r;if(!r&&!o){let h=await confirm({message:"Would you like to install dependencies?",initialValue:true});isCancel(h)&&(cancel("Canceled!"),process.exit(0)),f=h;}if(f)return a.size>0&&await qr({pm:i,deps:Array.from(a),dev:false,cwd:n,ignoreWorkspace:s}),c.size>0&&await qr({pm:i,deps:Array.from(c),dev:true,cwd:n,ignoreWorkspace:s}),{installed:true,dependencies:a,devDependencies:c}}return {installed:false,dependencies:a,devDependencies:c}}function Xo(e){let t=A.dim(T),r=A.green(So),o=A.green(jo),n=A.red(Po);process.stdout.write(`${t} `),process.stdout.write(`${r} ${e} `);let i="",s="",a=(l=false)=>{if(!s)return;let f=process.stdout.columns,m=s.split(` `).reduce((b,d)=>b+Math.ceil(d.length/f),0)+(l?1:0);process.stdout.write(cursor.up(m)),process.stdout.write(erase.down());},c=(l=0)=>{let f=i.split(` `).slice(-l);s="";for(let h of f)s+=`${t} ${h} `;process.stdout.write(A.dim(s));};return {set text(l){a(),i+=l;let f=Math.ceil(process.stdout.rows/2);c(f);},fail(l){a(true),process.stdout.write(`${n} ${l} `),c();},success(l){a(true),process.stdout.write(`${o} ${l} `);}}}async function qr({pm:e,deps:t,dev:r,cwd:o,ignoreWorkspace:n=false}){let i=[...t];r&&i.push(Lr[e]["install-as-dev-dependency"]);let s=Lr[e]["no-workspace"];n&&s&&i.push(s);let a=resolveCommand$1(e,"add",i);a==null&&program.error(A.red(`Could not resolve add command for '${e}'.`));let c=Xo(`Installing dependencies with ${e}...`);try{let l=x(a.command,[...a.args],{nodeOptions:{cwd:o}});for await(let f of l)c.text=`${f} `;c.success(`Installed ${A.cyan(t.join(", "))}`);}catch{c.fail("Failed to install dependencies"),process.exit(2);}}var ts=/\{\{([^\/]+)\/([^\}]+)\}\}/g;function en({template:e,config:t,destPath:r,cwd:o}){let n=te.join(r,"../");return e.replace(ts,(i,s,a)=>{if(t.paths[s]===void 0){if(t.paths["*"].startsWith(".")){let c=te.relative(n,te.join(o,t.paths["*"],s,a));return c.startsWith(".")?c:`./${c}`}return te.join(t.paths["*"],s,a)}if(t.paths[s].startsWith(".")){let c=te.relative(n,te.join(o,t.paths[s],a));return c.startsWith(".")?c:`./${c}`}return te.join(t.paths[s],a)})}async function Zt({file:e,config:t,imports:r,watermark:o,prettierOptions:n,biomeOptions:i,cwd:s,verbose:a$1}){let c=ut.find(f=>f.matches(e.destPath)),l=e.content;if(c){t.watermark&&(l=`${c.comment(o)} ${l}`),a$1?.(`Formatting ${A.bold(e.destPath)}`);try{l=await c.format(l,{filePath:e.destPath,formatter:t.formatter,prettierOptions:n,biomeOptions:i});}catch(f){return b(`Error formatting ${A.bold(e.destPath)} ${f}`)}}for(let[f,h]of Object.entries(r)){let m=en({template:h,config:t,destPath:e.destPath,cwd:s}),b=new RegExp(`(['"])${os(f)}\\1`,"g");l=l.replaceAll(b,`$1${m}$1`);}return a(l)}async function vr({file:e,formatter:t,prettierOptions:r,biomeOptions:o}){let n=ut.find(s=>s.matches(e.destPath)),i=e.content;if(n)try{i=await n.format(e.content,{filePath:e.destPath,formatter:t,prettierOptions:r,biomeOptions:o});}catch{return i}return i}function rn(e){let t=[".js",".ts",".cjs",".mjs"];if(!l(e,t))return;let r=te.dirname(e),o=fe.readdirSync(r),n=te.parse(e);for(let i of o)if(l(i,t)&&te.parse(i).name===n.name)return te.join(r,i)}function At(e){let t;try{if(t=getTsconfig(e,"tsconfig.json"),!t&&(t=getTsconfig(e,"jsconfig.json"),!t))return a(null)}catch(r){return b(`Error while trying to get ${A.bold("tsconfig.json")}: ${r}`)}return a(t)}var sn={matches:e=>e.endsWith(".css"),resolveDependencies:({filePath:e,isSubDir:t,excludeDeps:r,dirs:o,cwd:n,containingDir:i})=>{let s=fe.readFileSync(e).toString(),a$1=on.parse(s,{allowTailwindDirectives:true});if(a$1.isErr())return b(a$1.unwrapErr().message);let c=a$1.unwrap(),l=De({moduleSpecifiers:c.map(f=>f.module),filePath:e,isSubDir:t,dirs:o,cwd:n,containingDir:i,doNotInstall:r});return l.isErr()?b(l.unwrapErr().map(f=>Oe(f)).join(` `)):a(l.unwrap())},comment:e=>`/* ${z(q(e),{prefix:()=>" "})} */`,format:async(e,{formatter:t,prettierOptions:r,biomeOptions:o,filePath:n})=>{if(!t)return e;if(t==="prettier")return await nn.format(e,{filepath:n,...r});let i=await Biome.create({distribution:Distribution.NODE});return o&&i.applyConfiguration(o),i.formatContent(e,{filePath:n}).content}};var ln={matches:e=>e.endsWith(".html"),resolveDependencies:({filePath:e,isSubDir:t,excludeDeps:r,dirs:o,cwd:n,containingDir:i})=>{let s=fe.readFileSync(e).toString(),a$1=an.parse(s),c=[],l=(h,m)=>{if(h&&(m(h),h.childNodes&&h.childNodes.length>0))for(let b of h.childNodes)l(b,m);};for(let h of a$1.childNodes)l(h,m=>{if(m.tagName==="script")for(let b of m.attrs)b.name==="src"&&c.push(b.value);if(m.tagName==="link"&&m.attrs.find(b=>b.name==="rel"&&b.value==="stylesheet"))for(let b of m.attrs)b.name==="href"&&!b.value.startsWith("http")&&c.push(b.value);});let f=De({moduleSpecifiers:c,filePath:e,isSubDir:t,dirs:o,cwd:n,containingDir:i,doNotInstall:["svelte","@sveltejs/kit",...r]});return f.isErr()?b(f.unwrapErr().map(h=>Oe(h)).join(` `)):a(f.unwrap())},comment:e=>`<!-- ${z(q(e),{prefix:()=>" "})} -->`,format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await nn.format(e,{parser:"html",...r}):e};function br(e,t){let r=ps.parseSync(e,t),o=[];for(let n of r.module.staticImports)o.push(n.moduleRequest.value);for(let n of r.module.dynamicImports){let i=t.slice(n.moduleRequest.start+1,n.moduleRequest.end-1);o.push(i);}for(let n of r.module.staticExports)for(let i of n.entries)i.moduleRequest&&o.push(i.moduleRequest.value);return o}var pn={matches:e=>e.endsWith(".ts")||e.endsWith(".js")||e.endsWith(".tsx")||e.endsWith(".jsx"),resolveDependencies:({filePath:e,isSubDir:t,excludeDeps:r,dirs:o,cwd:n,containingDir:i})=>{let s=fe.readFileSync(e).toString(),a$1=br(e,s),c=De({moduleSpecifiers:a$1,filePath:e,isSubDir:t,dirs:o,cwd:n,containingDir:i,doNotInstall:r});return c.isErr()?b(c.unwrapErr().map(l=>Oe(l)).join(` `)):a(c.unwrap())},comment:e=>`/* ${z(q(e),{prefix:()=>" "})} */`,format:async(e,{formatter:t,filePath:r,prettierOptions:o,biomeOptions:n})=>{if(!t)return e;if(t==="prettier")return await nn.format(e,{filepath:r,...o});let i=await Biome.create({distribution:Distribution.NODE});return n&&i.applyConfiguration(n),i.formatContent(e,{filePath:r}).content}};var mn=async(e,{formatter:t,prettierOptions:r,biomeOptions:o,filePath:n})=>{if(!t)return e;if(t==="prettier")return await nn.format(e,{filepath:n,...r});let i=await Biome.create({distribution:Distribution.NODE});return o&&i.applyConfiguration({...o,json:{parser:{allowComments:true}}}),i.formatContent(e,{filePath:n}).content},kr={matches:e=>e.endsWith(".json"),resolveDependencies:()=>a({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>e,format:mn},un={matches:e=>e.endsWith(".jsonc"),resolveDependencies:()=>a({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>`/* ${z(q(e),{prefix:()=>" "})} */`,format:mn};var yn={matches:e=>e.endsWith(".sass")||e.endsWith(".scss"),resolveDependencies:({filePath:e,isSubDir:t,excludeDeps:r,dirs:o,cwd:n,containingDir:i})=>{let s=fe.readFileSync(e).toString(),a$1=on.parse(s);if(a$1.isErr())return b(a$1.unwrapErr().message);let c=a$1.unwrap(),l=De({moduleSpecifiers:c.map(f=>f.module),filePath:e,isSubDir:t,dirs:o,cwd:n,containingDir:i,doNotInstall:r});return l.isErr()?b(l.unwrapErr().map(f=>Oe(f)).join(` `)):a(l.unwrap())},comment:e=>`/* ${z(q(e),{prefix:()=>" "})} */`,format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await nn.format(e,{parser:"scss",...r}):e};var kn={matches:e=>e.endsWith(".svelte"),resolveDependencies:({filePath:e,isSubDir:t,excludeDeps:r,dirs:o,cwd:n,containingDir:i})=>{let s=fe.readFileSync(e).toString(),a$1=bn.parse(s,{modern:true,filename:e});if(!a$1.instance&&!a$1.module)return a({dependencies:[],devDependencies:[],local:[],imports:{}});let c=[],l=h=>{(h.type==="ImportDeclaration"||h.type==="ExportAllDeclaration"||h.type==="ExportNamedDeclaration")&&typeof h.source?.value=="string"&&c.push(h.source.value),h.type==="ImportExpression"&&h.source.type==="Literal"&&typeof h.source.value=="string"&&c.push(h.source.value);};a$1.instance&&walk(a$1.instance,{enter:l}),a$1.module&&walk(a$1.module,{enter:l});let f=De({moduleSpecifiers:c,filePath:e,isSubDir:t,dirs:o,cwd:n,containingDir:i,doNotInstall:["svelte","@sveltejs/kit",...r]});return f.isErr()?b(f.unwrapErr().map(h=>Oe(h)).join(` `)):a(f.unwrap())},comment:e=>`<!-- ${z(q(e),{prefix:()=>" "})} -->`,format:async(e,{formatter:t,filePath:r,prettierOptions:o})=>t&&t==="prettier"&&o&&o.plugins?.find(n=>n==="prettier-plugin-svelte")?await nn.format(e,{filepath:r,...o}):e};var $n={matches:e=>e.endsWith(".svg"),resolveDependencies:()=>a({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>`<!-- ${z(q(e),{prefix:()=>" "})} -->`,format:async e=>e};var Rn={matches:e=>e.endsWith(".vue"),resolveDependencies:({filePath:e,isSubDir:t,excludeDeps:r,dirs:o,cwd:n,containingDir:i})=>{let s=fe.readFileSync(e).toString(),a$1=Cn.parse(s,{filename:e}),c=[];if(a$1.descriptor.script?.content){let f=br("noop.ts",a$1.descriptor.script.content);c.push(...f);}if(a$1.descriptor.scriptSetup?.content){let f=br("noop.ts",a$1.descriptor.scriptSetup.content);c.push(...f);}if(c.length===0)return a({dependencies:[],devDependencies:[],local:[],imports:{}});let l=De({moduleSpecifiers:c,filePath:e,isSubDir:t,dirs:o,cwd:n,containingDir:i,doNotInstall:["vue","nuxt",...r]});return l.isErr()?b(l.unwrapErr().map(f=>Oe(f)).join(` `)):a(l.unwrap())},comment:e=>`<!-- ${z(q(e),{prefix:()=>" "})} -->`,format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await nn.format(e,{parser:"vue",...r}):e};var jn={matches:e=>e.endsWith(".yml")||e.endsWith(".yaml"),resolveDependencies:()=>a({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>z(q(e),{prefix:()=>"# "}),format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await nn.format(e,{parser:"yaml",...r}):e};function Oe(e){return `${z(q(e),{prefix:t=>t===0?`${T} ${Yt} `:`${T} `})}`}function De({moduleSpecifiers:e,isSubDir:t,filePath:r,containingDir:o,doNotInstall:n,dirs:i,cwd:s}){let a$1=[],c=new Set,l=new Set,f={};for(let b of e){if(builtinModules.includes(b)||b.startsWith("node:"))continue;if(b.startsWith(".")){let u=In(b,t,{filePath:r,containingDir:o,dirs:i,cwd:s});if(u.isErr()){a$1.push(u.unwrapErr());continue}let S=u.unwrap();S&&(l.add(S.dependency),f[b]=S.template);continue}let d=Ze(b);if(!d.isErr()){let u=d.unwrap();if(En(u.name).validForNewPackages){c.add(b);continue}}let g=ws(b,t,{filePath:r,containingDir:o,dirs:i,cwd:s});if(g.isErr()){a$1.push(g.unwrapErr());continue}let y=g.unwrap();y?(l.add(y.dependency),f[b]=y.template):console.warn(`${T} ${ce} Skipped adding import \`${A.cyan(b)}\` from ${r}. Reason: Not a valid package name or path alias.`);}if(a$1.length>0)return b(a$1);let{devDependencies:h,dependencies:m}=$s(Array.from(c),r,{doNotInstall:n||[]});return a({dependencies:m,devDependencies:h,local:Array.from(l),imports:f})}function In(e,t,{filePath:r,containingDir:o,dropExtension:n=true,alias:i,dirs:s,cwd:a$1}){if(t&&(e.startsWith("./")||e==="."))return a(void 0);let c=t?te.join(o,"../"):te.join(r,"../"),l=te.join(te.join(r,"../"),e),f=te.join(c,"../");if(o&&l.startsWith(o))return a(void 0);if(l.startsWith(f))return a(Pn(l.slice(f.length),n));let h=te.resolve(l),m=null;for(let b of s){let d=te.resolve(te.join(a$1,b));h.startsWith(d)&&(m===null||m.length<d.length)&&(m=d);}return m!==null?a(Pn(h.slice(m.length+1),n)):b(`${r}: ${i||e} references code not contained in ${A.bold(s.join(", "))} and cannot be resolved.`)}function Pn(e,t=true){let[r,o,...n]=e.split("/");o===void 0&&(o="index");let i=o;t&&i.includes(".")&&(i=i.slice(0,i.length-te.parse(i).ext.length));let s=`${r}/${i}`,a=`{{${s}}}`;return n.length===0?i.length!==o.length&&(a+=te.parse(o).ext):a+=`/${n.join("/")}`,{dependency:s,template:a}}function ws(e,t,{filePath:r,dirs:o,cwd:n,containingDir:i}){let s=At(r);if(s.isErr())return b(s.unwrapErr());let a$1=s.unwrap();if(a$1===null)return a(void 0);let c=createPathsMatcher(a$1);if(c){let l=c(e);for(let f of l){let h=ks(f);if(!h)continue;let m=te.relative(te.resolve(te.join(r,"../")),h.prettyPath),b$1=bs(h.prettyPath,h.path,[".js",".ts"]),d=In(m,t,{filePath:r,containingDir:i,alias:e,dropExtension:b$1,dirs:o,cwd:n,modIsFile:h.type==="file"});if(d.isErr())return b(d.unwrapErr());if(d.unwrap())return a(d.unwrap());break}}return a(void 0)}function bs(e,t,r=[".ts",".js",""]){if(e===t)return true;let o=te.parse(e),n=te.parse(t),i=te.join(o.dir,o.name),s=te.join(n.dir,n.name);return i!==s?false:!!(r.includes(o.ext)&&r.includes(n.ext))}function ks(e){if(fe.existsSync(e))return {path:e,prettyPath:e,type:fe.statSync(e).isDirectory()?"directory":"file"};let t=te.join(e,"../");if(!fe.existsSync(t))return;let r=te.parse(e);if(r.ext===".js"){let n=`${e.slice(0,e.length-3)}.ts`;if(fe.existsSync(n))return {path:n,prettyPath:e,type:"file"}}let o=fe.readdirSync(t);for(let n of o){let i=te.parse(n);if(i.name===r.base){let s=te.join(t,n),a=s.slice(0,s.length-i.ext.length);return {path:s,prettyPath:a,type:fe.statSync(s).isDirectory()?"directory":"file"}}}}function $s(e,t,{doNotInstall:r}={doNotInstall:[]}){let o=new Set(r),n=Ur(te.dirname(t),""),i=new Set,s=new Set;if(n){let{devDependencies:a,dependencies:c}=JSON.parse(fe.readFileSync(n,"utf-8"));for(let l of e){let f=Ze(l);if(f.isErr()){console.warn(`${T} ${ce} Skipped adding import \`${A.cyan(l)}\`. Reason: Couldn't parse package name`);continue}let h=f.unwrap();if(!En(h.name).validForNewPackages){console.warn(`${T} ${ce} Skipped adding import \`${A.cyan(l)}\`. Reason: Not a valid package name`);continue}if(o.has(h.name))continue;let m;if(c!==void 0&&(m=c[h.name]),m!==void 0){i.add(`${h.name}@${m}`);continue}if(a!==void 0&&(m=a[h.name]),m!==void 0){s.add(`${h.name}@${m}`);continue}i.add(h.name);}}return {dependencies:Array.from(i),devDependencies:Array.from(s)}}var ut=[sn,ln,kr,un,yn,kn,$n,pn,Rn,jn];var Dn=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"]),Tn=k.union([k.literal("off"),k.literal("warn"),k.literal("error")]),Cs=k.union([k.literal("no-category-index-file-dependency"),k.literal("no-unpinned-dependency"),k.literal("require-local-dependency-exists"),k.literal("max-local-dependencies"),k.literal("no-circular-dependency"),k.literal("no-unused-block"),k.literal("no-framework-dependency"),k.literal("require-config-file-exists"),k.literal("no-config-file-framework-dependency"),k.literal("no-config-file-unpinned-dependency")]),Nn={"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 ${A.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,i]=o.split("/"),s=t.categories.find(c=>c.name.trim()===n.trim()),a=`${A.bold(`${e.category}/${e.name}`)} depends on local dependency ${A.bold(o)} which doesn't exist`;if(!s){r.push(a);continue}s.blocks.find(c=>c.name===i)===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,i]=o.split("/");if(i!=="index")continue;let s=t.categories.find(c=>c.name===n);!s||!s.blocks.find(c=>c.name===i)||r.push(`${A.bold(`${e.category}/${e.name}`)} depends on ${A.bold(`${n}/${i}`)}`);}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(`${A.bold(`${e.category}/${e.name}`)} has too many local dependencies (${A.bold(e.localDependencies.length)}) limit (${A.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=xr(o,e,t.categories);return n&&r.push(`There is a circular dependency in ${A.bold(o)}: ${A.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(xr(r,n,t.categories))return;return [`${A.bold(r)} is unused and will be ${A.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=>Ze(o).unwrap().name).filter(o=>Dn.has(o));if(r.length>0)for(let o of r)t.push(`${A.bold(`${e.category}/${e.name}`)} depends on ${A.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)fe.existsSync(te.join(t,o.path))||r.push(`The ${A.bold(o.name)} config file doesn't exist at ${A.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=>Ze(n).unwrap().name).filter(n=>Dn.has(n));if(o.length>0)for(let n of o)t.push(`${A.bold(r.name)} depends on ${A.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 ${A.bold(o)}`);return t.length>0?t:void 0}}}},An=k.record(Cs,k.union([Tn,k.tupleWithRest([Tn,k.union([k.string(),k.number()])],k.union([k.string(),k.number()]))])),er={"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"};function Cr(e,t,r,o=er){let n=[],i=[];for(let[s,a]of Object.entries(Nn)){if(a.scope==="block")continue;let c=o[s],l,f=[];if(Array.isArray(c)?(l=c[0],f.push(...c.slice(1))):l=c,l==="off")continue;let h=a.check({manifest:e,options:f,cwd:r,config:t});if(h){if(l==="error"){i.push(...h.map(m=>`${T} ${Yt} ${A.red(m)} ${A.gray(s)}`));continue}n.push(...h.map(m=>`${T} ${ce} ${m} ${A.gray(s)}`));}}for(let s of e.categories)for(let a of s.blocks)for(let[c,l]of Object.entries(Nn)){if(l.scope==="global")continue;let f=o[c],h,m=[];if(Array.isArray(f)?(h=f[0],m.push(...f.slice(1))):h=f,h==="off")continue;let b=l.check(a,{manifest:e,options:m,cwd:r,config:t});if(b){if(h==="error"){i.push(...b.map(d=>`${T} ${Yt} ${A.red(d)} ${A.gray(c)}`));continue}n.push(...b.map(d=>`${T} ${ce} ${d} ${A.gray(c)}`));}}return {warnings:n,errors:i}}function xr(e,t,r,o=[]){let n=[...o,`${t.category}/${t.name}`];for(let i of t.localDependencies){if(i===e)return n;if(o.includes(i))return;let[s,a]=i.split("/"),c=r.find(f=>f.name===s)?.blocks.find(f=>f.name===a);if(!c)continue;let l=xr(e,c,r,n);if(l)return [...l,e]}}function Fn(e,t){for(let r of t)for(let o of r.blocks){if(!o.list)continue;if(xr(e,o,t))return true}return false}var Mn=[".test.ts","_test.ts",".test.js","_test.js",".spec.ts","_spec.ts",".spec.js","_spec.js",".stories.jsx","_stories.jsx",".stories.tsx","_stories.tsx"],Wn=[".mdx",".md"];function ct(e){return l(e,Mn)!==void 0}function Rr(e){return l(e,Wn)!==void 0}function Sr(e,{cwd:t,ignore:r,config:o}){let n;try{n=fe.readdirSync(e);}catch{program.error(A.red(`Couldn't read the ${A.bold(e)} directory.`));}let i=[];for(let s of n){let a=te.join(e,s);if(fe.statSync(a).isFile())continue;let c=`${te.relative(t,a)}/`;if(r.ignores(c))continue;let l=te.basename(s);if(!Ss(l,o))continue;let f=Rs(l,o),h={name:l,blocks:[]},m=fe.readdirSync(a);for(let b of m){let d=te.join(a,b),g=te.relative(t,d);if(!r.ignores(g))if(fe.statSync(d).isFile()){if(ct(b))continue;if(Rr(b)){o.includeDocs||console.warn(`${T} ${ce} Documentation files (*.md, *.mdx) are not included by default include them with ${A.bold("--include-docs")}!`);continue}let y=js(b),u=Ln(y,o);if(!Bn(y,o))continue;let S=ut.find(J=>J.matches(b));if(!S){console.warn(`${T} ${ce} Skipped \`${A.bold(d)}\` \`*${A.bold(te.parse(b).ext)}\` files are not currently supported!`);continue}let C=m.find(J=>Mn.find(X=>J===`${y}${X}`)),p=m.find(J=>Wn.find(X=>J===`${y}${X}`)),{dependencies:w,devDependencies:x,local:R,imports:E}=S.resolveDependencies({filePath:d,isSubDir:false,excludeDeps:o.excludeDeps,dirs:o.dirs,cwd:t}).match(J=>J,J=>{program.error(A.red(J));}),K={name:y,directory:te.relative(t,a),category:l,tests:C!==void 0,docs:p!==void 0,subdirectory:false,list:f?u:false,files:[b],localDependencies:R,_imports_:E,dependencies:w,devDependencies:x};C!==void 0&&K.files.push(C),p!==void 0&&K.files.push(p),h.blocks.push(K);}else {let y=b,u=Ln(y,o);if(!Bn(y,o))continue;let S=new Set,C=new Set,p=new Set,w={},x=false,R=false,E=[],K=(X,$)=>{for(let N of $){let v=te.join(X,N),W=v.slice(d.length+1);if(ct(N)){x=true,E.push(W);continue}if(Rr(N)){o.includeDocs||console.warn(`${T} ${ce} Documentation files (*.md, *.mdx) are not included by default include them with ${A.bold("--include-docs")}!`),R=true,E.push(W);continue}if(fe.statSync(v).isDirectory()){if(!o.allowSubdirectories){console.warn(`${T} ${ce} Skipped \`${A.bold(te.join(d,N))}\` subdirectories are not allowed! Allow them with ${A.bold("--allow-subdirectories")}!`);continue}let G=fe.readdirSync(v);K(v,G);continue}let j=ut.find(G=>G.matches(N));if(!j){console.warn(`${T} ${ce} Skipped \`${v}\` \`*${A.bold(te.parse(N).ext)}\` files are not currently supported!`);continue}let{local:U,dependencies:oe,devDependencies:ye,imports:nt}=j.resolveDependencies({isSubDir:true,excludeDeps:o.excludeDeps,dirs:o.dirs,containingDir:d,filePath:v,cwd:t}).match(G=>G,G=>{program.error(A.red(G));});for(let G of U)G!==`${l}/${y}`&&S.add(G);for(let G of oe)C.add(G);for(let G of ye)p.add(G);for(let[G,Z]of Object.entries(nt))w[G]=Z;E.push(W);}};K(d,fe.readdirSync(d));let J={name:y,directory:te.relative(t,d),category:l,tests:x,docs:R,subdirectory:true,list:f?u:false,files:E,localDependencies:Array.from(S.keys()),dependencies:Array.from(C.keys()),devDependencies:Array.from(p.keys()),_imports_:w};h.blocks.push(J);}}i.push(h);}return i}function jr(e,{cwd:t}){if(!e.configFiles)return;let r=[];for(let o of e.configFiles){let n=ut.find(c=>c.matches(o.path));if(!n){r.push(o);continue}let{dependencies:i,devDependencies:s,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(A.red(c));});a.length>0&&program.error(A.red(`${A.bold(o.name)} ${A.bold(o.path)} Config files cannot have local dependencies!`)),r.push({...o,dependencies:i,devDependencies:s});}return r}function Ln(e,t){return t.doNotListBlocks.length>0&&t.doNotListBlocks.includes(e)?false:t.listBlocks.length>0?t.listBlocks.includes(e):true}function Bn(e,t){return t.excludeBlocks.length>0&&t.excludeBlocks.includes(e)?false:t.includeBlocks.length>0?t.includeBlocks.includes(e):true}function Rs(e,t){return t.doNotListCategories.length>0&&t.doNotListCategories.includes(e)?false:t.listCategories.length>0?t.listCategories.includes(e):true}function Ss(e,t){return t.excludeCategories.length>0&&t.excludeCategories.includes(e)?false:t.includeCategories.length>0?t.includeCategories.includes(e):true}function js(e){return te.parse(te.basename(e)).name}function Pr(e){let t=[];for(let o of e){let n=[];for(let i of o.blocks){let s=`${i.category}/${i.name}`;!i.list&&!Fn(s,e)||n.push(i);}n.length>0&&t.push({name:o.name,blocks:n});}return [t,0]}var Or=[".git","node_modules",".DS_Store"],yt="jsrepo.json",vt="jsrepo-build-config.json",Hr=k.union([k.literal("prettier"),k.literal("biome")]),Es=k.objectWithRest({"*":k.string()},k.string()),Kr=k.object({$schema:k.string(),repos:k.optional(k.array(k.string()),[]),includeTests:k.boolean(),includeDocs:k.optional(k.boolean(),false),paths:Es,configFiles:k.optional(k.record(k.string(),k.string())),watermark:k.optional(k.boolean(),true),formatter:k.optional(Hr)});function be(e){if(!fe.existsSync(te.join(e,yt)))return b("Could not find your configuration file! Please run `init`.");let t=k.safeParse(Kr,JSON.parse(fe.readFileSync(te.join(e,yt)).toString()));return t.success?a(t.output):b(`There was an error reading your \`${yt}\` file!`)}var Is=k.object({$schema:k.string(),name:k.optional(k.string()),version:k.optional(k.string()),readme:k.optional(k.string(),"README.md"),access:k.optional(j),meta:k.optional(f),defaultPaths:k.optional(k.record(k.string(),k.string())),peerDependencies:k.optional(g),configFiles:k.optional(k.array(h)),dirs:k.array(k.string()),outputDir:k.optional(k.string()),includeBlocks:k.optional(k.array(k.string()),[]),includeCategories:k.optional(k.array(k.string()),[]),excludeBlocks:k.optional(k.array(k.string()),[]),excludeCategories:k.optional(k.array(k.string()),[]),doNotListBlocks:k.optional(k.array(k.string()),[]),doNotListCategories:k.optional(k.array(k.string()),[]),listBlocks:k.optional(k.array(k.string()),[]),listCategories:k.optional(k.array(k.string()),[]),excludeDeps:k.optional(k.array(k.string()),[]),allowSubdirectories:k.optional(k.boolean()),preview:k.optional(k.boolean()),includeDocs:k.optional(k.boolean(),false),rules:k.optional(An)});function Ft(e){if(!fe.existsSync(te.join(e,vt)))return a(null);let t=k.safeParse(Is,JSON.parse(fe.readFileSync(te.join(e,vt)).toString()));return t.success?a(t.output):b(`There was an error reading your \`${vt}\` file!`)}function Ue(e,t){let r=At(t).unwrapOr(null),o=r?createPathsMatcher(r):null,n={"*":""};for(let[i,s]of Object.entries(e)){if(s.startsWith("./")){n[i]=te.relative(t,te.join(te.resolve(t),s));continue}if(o===null)return b(`Cannot resolve ${A.bold(`\`"${i}": "${s}"\``)} from paths because we couldn't find a tsconfig! If you intended to use a relative path ensure that your path starts with ${A.bold("`./`")}.`);let a=Os(s,o,t);if(!a)return b(`Cannot resolve ${A.bold(`\`"${i}": "${s}"\``)} 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 ${A.bold("`./`")}.`);n[i]=a;}return a(n)}function Os(e,t,r){let o=t(e);return o.length>0?te.relative(r,o[0]):void 0}function rr(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}async function Ge(e,t,{verbose:r}={}){return await A$1(e,t,{verbose:r,fetch:Re,token:Yr(e.provider,e.url)})}async function Lt(e,{verbose:t}={}){return await B(e,{verbose:t,fetch:Re,token:Yr(e.provider,e.url)})}function Yr(e,t){let r=new pe;return e.name==="http"?r.get(`http-${new URL(t).origin}`):r.get(e.name)}async function lt(e,{noCache:t=false}={}){let r=z$1(e);if(r){let o=Ve();if(r.name!==u.name&&!t)if(t)o.delete(`${e}-state`);else {let s=o.get(`${e}-state`);if(s)return a({...s,provider:r})}let n=r.parse(e,{fullyQualified:false}),i=await r.state(e,{token:Yr(r,n.url),fetch:Re});return r.name!==u.name&&!t&&o.set(`${e}-state`,i),a(i)}return b(`Only ${y.map((o,n)=>`${n===y.length-1?"and ":""}${A.bold(o.name)}`).join(", ")} registries are supported at this time!`)}async function qe(e,{noCache:t=false}={}){let r=[],n=(await Promise.all(e.map(async i=>{let s=await lt(i,{noCache:t});if(s.isErr())return b({message:s.unwrapErr(),repo:i});let a=s.unwrap();r.push(a);}))).find(i=>i!==void 0);return n||a(r)}async function bt(e,{verbose:t}={}){let r=new Map,n=(await Promise.all(e.map(async i=>{let s=await Lt(i,{verbose:t});if(s.isErr())return b({message:s.unwrapErr(),repo:i.url});let a=s.unwrap();for(let c$1 of a.categories)for(let l of c$1.blocks)r.set(c(i.url,`${l.category}/${l.name}`),{...l,sourceRepo:i});}))).find(i=>i!==void 0);return n||a(r)}function Bt(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(c(r.state.url,`${n.category}/${n.name}`),{...n,sourceRepo:r.state});return t}async function _t(e,{verbose:t}={}){let r=[],n=(await Promise.all(e.map(async i=>{let s=await Lt(i,{verbose:t});if(s.isErr())return b({message:s.unwrapErr(),repo:i.url});let a=s.unwrap();r.push({state:i,manifest:a});}))).find(i=>i!==void 0);return n||a(r)}async function $t(e,t,r,o=new Map){let n=new Map;for(let i of e){let s,a=z$1(i);if(a){let{url:l,specifier:f}=a.parse(i,{fullyQualified:true});s=t.get(c(l,f));}else {if(r.length===0)return b(A.red(`If your config doesn't contain repos then you must provide the repo in the block specifier ex: \`${A.bold(`github/ieedan/std/${i}`)}\`!`));for(let l of r){let{url:f,specifier:h}=l.provider.parse(c(l.url,i),{fullyQualified:true}),m=t.get(c(f,h));if(m!==void 0){s=m;break}}}if(!s)return b(`Invalid block! ${A.bold(i)} does not exist!`);let c$1=`${s.category}/${s.name}`;if(n.set(c$1,s),s.localDependencies&&s.localDependencies.length>0){let l=await $t(s.localDependencies.filter(f=>!n.has(f)&&!o.has(f)),t,r,n);if(l.isErr())return b(l.unwrapErr());for(let f of l.unwrap())n.set(`${f.category}/${f.name}`,f);}}return a(mr(n,(i,s)=>s))}function xt(e,t,r){let o=[],n=Ue(t.paths,r).match(i=>i,i=>program.error(A.red(i)));for(let[i,s]of e){let a=rr(s,n,r),c=te.join(a,s.files[0]);s.subdirectory&&(c=te.join(a,s.name)),fe.existsSync(c)&&o.push({specifier:`${s.category}/${s.name}`,path:c,block:s});}return o}function Mt(e,t){let r=[];for(let o of e){let n=o.files.filter(s=>!(ct(s)&&!t.includeTests||Rr(s)&&!t.includeDocs)),i=Promise.all(n.map(async s=>{let a=await Ge(o.sourceRepo,te.join(o.directory,s));return {name:s,content:a}}));r.push({block:o,files:i});}return r}function nr(e,t,r,o){let n=rr(t,r,o);return t.subdirectory?te.join(n,t.name,e):te.join(n,e)}function ir(e){if(e===void 0)return;let t={};for(let r of e.split(",")){let[o,n]=r.split("=");if(o===void 0||n===void 0)throw new InvalidArgumentError("Expected map to be provided in the following format: `--option key=value,key=value`");t[o]=n;}return t}function Vn(e){return new Promise(t=>t(e))}async function Ct({formatter:e,cwd:t}){let r=null;e==="prettier"&&(r=await nn.resolveConfig(te.join(t,".prettierrc")));let o=null;if(e==="biome"){let n=te.join(t,"biome.json");fe.existsSync(n)&&(o=JSON.parse(fe.readFileSync(n).toString()));}return {biomeOptions:o,prettierOptions:r}}function sr(e){return `Installed from ${e}`}function Wt(e,t,r){if(!t.peerDependencies)return;let o=Gr(te.join(r,"package.json")).match(s=>s,s=>{s.endsWith("doesn't exist")&&program.error(`Couldn't find your ${A.bold("package.json")}. Please create one.`),program.error(A.red(s));}),n={...o.dependencies,...o.devDependencies},i=[];for(let[s,a]of Object.entries(t.peerDependencies)){let c,l;typeof a=="string"?c=a:(c=a.version,l=a.message);let f=n[s];if(!f){i.push({name:s,expected:c,message:l,version:f,exists:false});continue}Jo.satisfies(gr(f),c)||i.push({name:s,expected:c,message:l,version:f,exists:true});}if(i.length>0){process.stdout.write(`${T} ${A.yellow("\u25B2")} ${Oo} Issues with ${A.bold(e.url)} peer dependencies `);let s=i.map((a,c)=>{let l=i.length-1===c,f;a.exists?f=`${A.yellowBright("x unmet peer")} need ${A.bold(`${a.name}@`)}${A.greenBright.bold(a.expected)} >> found ${A.yellowBright.bold(a.version)}`:f=`${A.red("x missing peer")} need ${A.bold(`${a.name}@`)}${A.greenBright.bold(a.expected)}`;let h=`${T} ${l?Do:Kt}${Ht} ${f}`;return a.message?`${h} ${T} ${l?"":T} ${A.gray(a.message)}`:h}).join(` `);process.stdout.write(`${s} `);}}var Gs=k.object({watermark:k.optional(k.boolean()),tests:k.optional(k.boolean()),docs:k.optional(k.boolean()),formatter:k.optional(k.union([k.literal("prettier"),k.literal("biome"),k.literal("none")])),paths:k.optional(k.record(k.string(),k.string())),expand:k.boolean(),maxUnchanged:k.number(),repo:k.optional(k.string()),allow:k.boolean(),yes:k.boolean(),cache:k.boolean(),verbose:k.boolean(),cwd:k.string()}),Xr=new Command("add").description("Add blocks to your project.").argument("[blocks...]","Names of the blocks you want to add to your project. ex: (utils/math, github/ieedan/std/utils/math)").addOption(new Option("--formatter <choice>","The formatter to use when adding blocks.").choices(["prettier","biome","none"])).addOption(new Option("--watermark <choice>","Include a watermark at the top of added files.").choices(["true","false"]).argParser(e=>e==="true")).addOption(new Option("--tests <choice>","Include tests when adding blocks.").choices(["true","false"]).argParser(e=>e==="true")).addOption(new Option("--docs <choice>","Include docs when adding blocks.").choices(["true","false"]).argParser(e=>e==="true")).option("--paths <category=path,category=path>","The paths where categories should be added to your project.",ir,void 0).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("--repo <repo>","Repository to download the blocks from.").option("-A, --allow","Allow jsrepo to download code from the provided repo.",false).option("-y, --yes","Skip confirmation prompt.",false).option("--no-cache","Disable caching of resolved git urls.").option("--verbose","Include debug logs.",false).option("--cwd <path>","The current working directory.",process.cwd()).action(async(e,t)=>{let r=k.parse(Gs,t);await ie(),await qs(e,r),outro(A.gr