jsrepo 1.23.2 → 1.23.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +61 -55
  2. package/package.json +9 -6
package/dist/index.js CHANGED
@@ -1,65 +1,71 @@
1
1
  #!/usr/bin/env node
2
- import Ae from'node:fs';import {fileURLToPath}from'node:url';import {Command,program,Option,Argument}from'commander';import Q from'pathe';import {outro,spinner,confirm,isCancel,cancel,multiselect,text,select,log,password,intro}from'@clack/prompts';import P from'chalk';import {resolveCommand}from'package-manager-detector/commands';import {detect}from'package-manager-detector/detect';import*as C from'valibot';import {getTsconfig,createPathsMatcher}from'get-tsconfig';import ut from'node-fetch';import {Octokit}from'octokit';import {builtinModules}from'node:module';import {Biome,Distribution}from'@biomejs/js-api';import*as Ft from'@vue/compiler-sfc';import {walk}from'estree-walker';import*as _r from'parse5';import*as Le from'prettier';import*as Wr from'svelte/compiler';import {Project}from'ts-morph';import Do from'validate-npm-package-name';import Io from'node:os';import Eo from'ansi-regex';import Ko from'conf';import {execa}from'execa';import {detect as detect$1,resolveCommand as resolveCommand$1}from'package-manager-detector';import sn from'escape-string-regexp';import {diffLines,diffChars}from'diff';var W=P.gray("\u2502"),Yt=P.gray("\u2500"),Rr=P.gray("\u2510"),Cr=P.gray("\u2518"),Xt=P.gray("\u251C");P.gray("\u250C");P.gray("\u2514");var Ie=P.bgRgb(245,149,66).black(" WARN "),ft=P.bgBlueBright.white(" INFO "),It=P.bgRedBright.white(" ERROR "),fe=P.hex("#f7df1e")("jsrepo");var St=class{_result;constructor(t){this._result=t;}match(t,r){return this._result.ok?t(this._result.val):r(this._result.err)}map(t){return this.match(r=>I(t(r)),r=>T(r))}mapOr(t,r){return this.match(o=>r(o),o=>t)}mapOrElse(t,r){return this.match(o=>r(o),o=>t(o))}mapErr(t){return this.match(r=>I(r),r=>T(t(r)))}mapErrOr(t,r){return this.match(o=>t,o=>r(o))}mapErrOrElse(t,r){return this.match(o=>t(o),o=>r(o))}isOk(){return this.match(()=>!0,()=>!1)}isErr(){return this.match(()=>!1,()=>!0)}unwrap(){return this.match(t=>t,()=>{throw new Error("Attempted to call `.unwrap()` on a non `Ok` value.")})}unwrapErr(){return this.match(()=>{throw new Error("Attempted to call `.unwrapErr()` on a non `Err` value.")},t=>t)}unwrapOr(t){return this.match(r=>r,r=>t)}unwrapErrOr(t){return this.match(()=>t,r=>r)}unwrapOrElse(t){return this.match(r=>r,r=>t(r))}unwrapErrOrElse(t){return this.match(r=>t(r),r=>r)}expect(t){return this.match(r=>r,()=>{throw new Error(t)})}expectErr(t){return this.match(()=>{throw new Error(t)},r=>r)}},I=e=>new St({ok:!0,val:e}),T=e=>new St({ok:!1,err:e});var xr=(e,t)=>{let r=[];for(let[o,n]of e)r.push(t(o,n));return r};var $o=/^(@[^\/]+\/[^@\/]+)(?:@([^\/]+))?(\/.*)?$/,ko=/^([^@\/]+)(?:@([^\/]+))?(\/.*)?$/,Pt=e=>{let t=$o.exec(e)||ko.exec(e);return t?I({name:t[1]||"",version:t[2]||"latest",path:t[3]||""}):T(`invalid package name: ${e}`)};var jr=C.union([C.literal("off"),C.literal("warn"),C.literal("error")]),bo={"no-unpinned-dependency":{description:"Require all dependencies to have a pinned version.",check:e=>{let t=[];for(let r of [...e.dependencies,...e.devDependencies])r.includes("@")||t.push(`Couldn't find a version to use for ${P.bold(r)}`);return t.length>0?t:void 0}},"require-local-dependency-exists":{description:"Require all local dependencies to exist.",check:(e,{categories:t})=>{let r=[];for(let o of e.localDependencies){let[n,s]=o.split("/"),i=t.find(p=>p.name.trim()===n.trim()),a=`${P.bold(`${e.category}/${e.name}`)} depends on local dependency ${P.bold(o)} which doesn't exist`;if(!i){r.push(a);continue}i.blocks.find(p=>p.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.",check:(e,{categories:t})=>{let r=[];for(let o of e.localDependencies){let[n,s]=o.split("/");if(s!=="index")continue;let i=t.find(p=>p.name===n);!i||!i.blocks.find(p=>p.name===s)||r.push(`${P.bold(`${e.category}/${e.name}`)} depends on ${P.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.",check:(e,{options:t})=>{let r=[],o;return typeof t[0]!="number"?o=5:o=t[0],e.localDependencies.length>o&&r.push(`${P.bold(`${e.category}/${e.name}`)} has too many local dependencies (${P.bold(e.localDependencies.length)}) limit (${P.bold(o)})`),r.length>0?r:void 0}},"no-circular-dependency":{description:"Disallow circular dependencies.",check:(e,{categories:t})=>{let r=[],o=`${e.category}/${e.name}`,n=Tt(o,e,t);return n&&r.push(`There is a circular dependency in ${P.bold(o)}: ${P.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)",check:(e,{categories:t})=>{if(e.list)return;let r=`${e.category}/${e.name}`,o=t.flatMap(n=>n.blocks).filter(n=>n.list);for(let n of o)if(Tt(r,n,t))return;return [`${P.bold(r)} is unused and will be ${P.bold.red("removed")}`]}},"no-framework-dependency":{description:"Disallow frameworks (Svelte, Vue, React) as dependencies.",check:e=>{let t=[],r=new Set(["svelte","vue","nuxt","react","react-dom","next","@remix-run/react","@builder.io/qwik","astro","solid-js","@angular/core","@angular/common","@angular/forms","@angular/platform-browser","@angular/platform-browser-dynamic","@angular/router"]),o=[...e.devDependencies,...e.dependencies].map(n=>Pt(n).unwrap().name).filter(n=>r.has(n));if(o.length>0)for(let n of o)t.push(`${P.bold(`${e.category}/${e.name}`)} depends on ${P.bold(n)} causing it to be installed when added`);return t.length>0?t:void 0}}},Ro=C.union([C.literal("no-category-index-file-dependency"),C.literal("no-unpinned-dependency"),C.literal("require-local-dependency-exists"),C.literal("max-local-dependencies"),C.literal("no-circular-dependency"),C.literal("no-unused-block"),C.literal("no-framework-dependency")]),Er=C.record(Ro,C.union([jr,C.tupleWithRest([jr,C.union([C.string(),C.number()])],C.union([C.string(),C.number()]))])),Zt={"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"},Ir=(e,t,r=Zt)=>{let o=[],n=[];for(let s of e)for(let i of s.blocks)for(let[a,p]of Object.entries(bo)){let c=r[a],l,y=[];if(Array.isArray(c)?(l=c[0],y.push(...c.slice(1))):l=c,l==="off")continue;let u=p.check(i,{categories:e,options:y,config:t});if(u){if(l==="error"){n.push(...u.map(k=>`${W} ${It} ${P.red(k)} ${P.gray(a)}`));continue}o.push(...u.map(k=>`${W} ${Ie} ${k} ${P.gray(a)}`));}}return {warnings:o,errors:n}},Tt=(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("/"),p=r.find(l=>l.name===i)?.blocks.find(l=>l.name===a);if(!p)continue;let c=Tt(e,p,r,n);if(c)return [...c,e]}},Sr=(e,t)=>{for(let r of t)for(let o of r.blocks){if(!o.list)continue;if(Tt(e,o,t))return !0}return !1};var tt="jsrepo.json",Ue="jsrepo-build-config.json",Qt=C.union([C.literal("prettier"),C.literal("biome")]),xo=C.objectWithRest({"*":C.string()},C.string()),er=C.object({$schema:C.string(),repos:C.optional(C.array(C.string()),[]),includeTests:C.boolean(),paths:xo,watermark:C.optional(C.boolean(),!0),formatter:C.optional(Qt)}),we=e=>{if(!Ae.existsSync(Q.join(e,tt)))return T("Could not find your configuration file! Please run `init`.");let t=C.safeParse(er,JSON.parse(Ae.readFileSync(Q.join(e,tt)).toString()));return t.success?I(t.output):T(`There was an error reading your \`${tt}\` file!`)},jo=C.object({$schema:C.string(),dirs:C.array(C.string()),includeBlocks:C.optional(C.array(C.string()),[]),includeCategories:C.optional(C.array(C.string()),[]),excludeBlocks:C.optional(C.array(C.string()),[]),excludeCategories:C.optional(C.array(C.string()),[]),doNotListBlocks:C.optional(C.array(C.string()),[]),doNotListCategories:C.optional(C.array(C.string()),[]),listBlocks:C.optional(C.array(C.string()),[]),listCategories:C.optional(C.array(C.string()),[]),excludeDeps:C.optional(C.array(C.string()),[]),preview:C.optional(C.boolean()),rules:C.optional(Er)}),Ot=e=>{if(!Ae.existsSync(Q.join(e,Ue)))return I(null);let t=C.safeParse(jo,JSON.parse(Ae.readFileSync(Q.join(e,Ue)).toString()));return t.success?I(t.output):T(`There was an error reading your \`${Ue}\` file!`)},$e=(e,t)=>{let r=getTsconfig(t,"tsconfig.json"),o=null;r||(r=getTsconfig(t,"jsconfig.json")),r&&(o=createPathsMatcher(r));let n;if(e["*"].startsWith("."))n={"*":Q.relative(t,Q.join(Q.resolve(t),e["*"]))};else {if(o===null)return T("Cannot resolve aliases because we couldn't find a tsconfig!");n={"*":Tr(e["*"],o,t)};}for(let[s,i]of Object.entries(e))if(s!=="*"){if(i.startsWith(".")){n[s]=Q.relative(t,Q.join(Q.resolve(t),i));continue}if(o===null)return T("Cannot resolve aliases because we couldn't find a tsconfig!");n[s]=Tr(i,o,t);}return I(n)},Tr=(e,t,r)=>{let o=t(e);return Q.relative(r,o[0])};var rt=e=>e.replace(Eo(),"");var Rt=(e,t,r=" ")=>{if(rt(e).length>t)throw new Error("String length is greater than the length provided.");return r.repeat(t-rt(e).length)+e},Nr=(e,t,r=" ")=>e+r.repeat(t),Or=(e,t,r=" ")=>{if(rt(e).length>t)throw new Error("String length is greater than the length provided.");return e+r.repeat(t-rt(e).length)};var So=/\n|\r\n/g,re=e=>e.split(So),Z=(e,{lineNumbers:t=!1,prefix:r}={})=>{let o=e;if(t){let n=e.length.toString().length+1;o=o.map((s,i)=>`${Rt(`${i+1}`,n)} ${s}`);}return r!==void 0&&(o=o.map((n,s)=>`${r(s,e.length)}${n}`)),o.join(Io.EOL)};var rr=(e,t)=>{let r=Q.join(e,"package.json");if(Ae.existsSync(r))return r;if(e===t)return;let o=e.split(/[\/\\]/);return rr(o.slice(0,o.length-1).join("/"),t)},Po=e=>{if(!Ae.existsSync(e))return T(`${e} doesn't exist`);let t=Ae.readFileSync(e).toString();return I(JSON.parse(t))},Dt=(e,t,{cwd:r})=>{let o=e,n=t,s=Po(Q.join(r,"package.json"));if(!s.isErr()){let i=s.unwrap();if(i.dependencies)for(let a of o){let[p,c]=a.split("@"),l=i.dependencies[p];c===void 0&&l||l&&l===c&&o.delete(a);}if(i.devDependencies)for(let a of n){let[p,c]=a.split("@"),l=i.devDependencies[p];c===void 0&&l||l&&l===c&&n.delete(a);}}return {dependencies:o,devDependencies:n}};var Ao={matches:e=>e.endsWith(".css"),resolveDependencies:()=>I({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>`/*
3
- ${Z(re(e),{prefix:()=>" "})}
4
- */`,format:async(e,{formatter:t,prettierOptions:r,biomeOptions:o,filePath:n})=>{if(!t)return e;if(t==="prettier")return await Le.format(e,{filepath:n,...r});let s=await Biome.create({distribution:Distribution.NODE});return o&&s.applyConfiguration(o),s.formatContent(e,{filePath:n}).content}},Lo={matches:e=>e.endsWith(".html"),resolveDependencies:({filePath:e,isSubDir:t,excludeDeps:r,dirs:o,cwd:n})=>{let s=Ae.readFileSync(e).toString(),i=_r.parse(s),a=[],p=(l,y)=>{if(l&&(y(l),l.childNodes&&l.childNodes.length>0))for(let u of l.childNodes)p(u,y);};for(let l of i.childNodes)p(l,y=>{if(y.tagName==="script")for(let u of y.attrs)u.name==="src"&&a.push(u.value);if(y.tagName==="link"&&y.attrs.find(u=>u.name==="rel"&&u.value==="stylesheet"))for(let u of y.attrs)u.name==="href"&&!u.value.startsWith("http")&&a.push(u.value);});let c=Wt({moduleSpecifiers:a,filePath:e,isSubDir:t,dirs:o,cwd:n,doNotInstall:["svelte","@sveltejs/kit",...r]});return c.isErr()?T(c.unwrapErr().map(l=>_t(l)).join(`
5
- `)):I(c.unwrap())},comment:e=>`<!--
6
- ${Z(re(e),{prefix:()=>" "})}
7
- -->`,format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await Le.format(e,{parser:"html",...r}):e},or={matches:e=>e.endsWith(".json"),resolveDependencies:()=>I({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>e,format:async(e,{formatter:t,prettierOptions:r,biomeOptions:o,filePath:n})=>{if(!t)return e;if(t==="prettier")return await Le.format(e,{filepath:n,...r});let s=await Biome.create({distribution:Distribution.NODE});return o&&s.applyConfiguration(o),s.formatContent(e,{filePath:n}).content}},Bo={matches:e=>e.endsWith(".jsonc"),resolveDependencies:()=>I({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>`/*
8
- ${Z(re(e),{prefix:()=>" "})}
9
- */`,format:async(e,{formatter:t,prettierOptions:r,biomeOptions:o,filePath:n})=>{if(!t)return e;if(t==="prettier")return await Le.format(e,{filepath:n,...r});let s=await Biome.create({distribution:Distribution.NODE});return o&&s.applyConfiguration({...o,json:{parser:{allowComments:!0}}}),s.formatContent(e,{filePath:n}).content}},Fo={matches:e=>e.endsWith(".sass")||e.endsWith(".scss"),resolveDependencies:()=>I({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>`/*
10
- ${Z(re(e),{prefix:()=>" "})}
11
- */`,format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await Le.format(e,{parser:"scss",...r}):e},_o={matches:e=>e.endsWith(".svelte"),resolveDependencies:({filePath:e,isSubDir:t,excludeDeps:r,dirs:o,cwd:n})=>{let s=Ae.readFileSync(e).toString(),i=Wr.parse(s,{modern:!0,filename:e});if(!i.instance&&!i.module)return I({dependencies:[],devDependencies:[],local:[],imports:{}});let a=[],p=l=>{(l.type==="ImportDeclaration"||l.type==="ExportAllDeclaration"||l.type==="ExportNamedDeclaration")&&typeof l.source?.value=="string"&&a.push(l.source.value);};i.instance&&walk(i.instance,{enter:p}),i.module&&walk(i.module,{enter:p});let c=Wt({moduleSpecifiers:a,filePath:e,isSubDir:t,dirs:o,cwd:n,doNotInstall:["svelte","@sveltejs/kit",...r]});return c.isErr()?T(c.unwrapErr().map(l=>_t(l)).join(`
12
- `)):I(c.unwrap())},comment:e=>`<!--
13
- ${Z(re(e),{prefix:()=>" "})}
14
- -->`,format:async(e,{formatter:t,filePath:r,prettierOptions:o})=>t&&t==="prettier"&&o&&o.plugins?.find(n=>n==="prettier-plugin-svelte")?await Le.format(e,{filepath:r,...o}):e},Wo={matches:e=>e.endsWith(".svg"),resolveDependencies:()=>I({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>`<!--
15
- ${Z(re(e),{prefix:()=>" "})}
16
- -->`,format:async e=>e},Vo={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})=>{let i=new Project().addSourceFileAtPath(e),a=i.getImportDeclarations().map(l=>l.getModuleSpecifierValue()),p=i.getExportDeclarations().map(l=>l.getModuleSpecifierValue()).filter(l=>l!==void 0);a.push(...p);let c=Wt({moduleSpecifiers:a,filePath:e,isSubDir:t,dirs:o,cwd:n,doNotInstall:r});return c.isErr()?T(c.unwrapErr().map(l=>_t(l)).join(`
17
- `)):I(c.unwrap())},comment:e=>`/*
18
- ${Z(re(e),{prefix:()=>" "})}
19
- */`,format:async(e,{formatter:t,filePath:r,prettierOptions:o,biomeOptions:n})=>{if(!t)return e;if(t==="prettier")return await Le.format(e,{filepath:r,...o});let s=await Biome.create({distribution:Distribution.NODE});return n&&s.applyConfiguration(n),s.formatContent(e,{filePath:r}).content}},Mo={matches:e=>e.endsWith(".vue"),resolveDependencies:({filePath:e,isSubDir:t,excludeDeps:r,dirs:o,cwd:n})=>{let s=Ae.readFileSync(e).toString(),i=Ft.parse(s,{filename:e});if(!i.descriptor.script?.content&&!i.descriptor.scriptSetup?.content)return I({dependencies:[],devDependencies:[],local:[],imports:{}});let a;try{a=Ft.compileScript(i.descriptor,{id:"shut-it"});}catch(l){return T(`Compile error: ${l}`)}if(!a.imports)return I({dependencies:[],devDependencies:[],local:[],imports:{}});let p=Object.values(a.imports).map(l=>l.source),c=Wt({moduleSpecifiers:p,filePath:e,isSubDir:t,dirs:o,cwd:n,doNotInstall:["vue","nuxt",...r]});return c.isErr()?T(c.unwrapErr().map(l=>_t(l)).join(`
20
- `)):I(c.unwrap())},comment:e=>`<!--
21
- ${Z(re(e),{prefix:()=>" "})}
22
- -->`,format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await Le.format(e,{parser:"vue",...r}):e},Jo={matches:e=>e.endsWith(".yml")||e.endsWith(".yaml"),resolveDependencies:()=>I({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>Z(re(e),{prefix:()=>"# "}),format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await Le.format(e,{parser:"yaml",...r}):e},_t=e=>`${Z(re(e),{prefix:t=>t===0?`${W} ${It} `:`${W} `})}`,Wt=({moduleSpecifiers:e,isSubDir:t,filePath:r,doNotInstall:o,dirs:n,cwd:s})=>{let i=[],a=new Set,p=new Set,c={};for(let u of e){if(u.startsWith(".")){let A=Vr(u,t,{filePath:r,dirs:n,cwd:s});if(A.isErr()){i.push(A.unwrapErr());continue}let m=A.unwrap();m&&(p.add(m.dependency),c[u]=m.template);continue}let k=zo(u,t,{filePath:r,dirs:n,cwd:s});if(k.isErr()){i.push(k.unwrapErr());continue}let x=k.unwrap();x?(p.add(x.dependency),c[u]=x.template):a.add(u);}if(i.length>0)return T(i);let{devDependencies:l,dependencies:y}=Go(Array.from(a),r,{doNotInstall:o||[]});return I({dependencies:y,devDependencies:l,local:Array.from(p),imports:c})},Vr=(e,t,{filePath:r,alias:o,dirs:n,cwd:s})=>{if(t&&(e.startsWith("./")||e==="."))return I(void 0);let i=t?Q.join(r,"../../"):Q.join(r,"../"),a=Q.join(Q.join(r,"../"),e),p=Q.join(i,"../");if(a.startsWith(p))return I(Fr(a.slice(p.length)));if(o){for(let c of n){let l=Q.resolve(Q.join(s,c)),y=Q.resolve(a);if(y.startsWith(l))return I(Fr(y.slice(l.length+1)))}return T(`${r}:
23
- ${o} references code not contained in ${P.bold(n.join(", "))} and cannot be resolved.`)}return T(`${r}:
24
- ${e} references code not contained in ${i} and cannot be resolved.`)},Fr=e=>{let[t,r,...o]=e.split("/");r===void 0&&(r="index");let n=r;n.includes(".")&&(n=n.slice(0,n.length-Q.parse(n).ext.length));let s=`${t}/${n}`,i=`{{${s}}}`;return o.length===0?n.length!==r.length&&(i+=Q.parse(r).ext):i+=`/${o.join("/")}`,{dependency:s,template:i}},zo=(e,t,{filePath:r,dirs:o,cwd:n})=>{let s;try{if(s=getTsconfig(r,"tsconfig.json"),!s&&(s=getTsconfig(r,"jsconfig.json"),!s))return I(void 0)}catch(a){return T(`Error while trying to get ${P.bold("tsconfig.json")}: ${a}`)}let i=createPathsMatcher(s);if(i){let a=i(e);for(let p of a){let c=Uo(p);if(!c)continue;let l=Q.relative(Q.resolve(Q.join(r,"../")),c.path),y=Vr(l,t,{filePath:r,alias:e,dirs:o,cwd:n,modIsFile:c.type==="file"});if(y.isErr())return T(y.unwrapErr());if(y.unwrap())return I(y.unwrap());break}}return I(void 0)},Uo=e=>{if(Ae.existsSync(e))return {path:e,type:Ae.statSync(e).isDirectory()?"directory":"file"};if(Q.parse(e).ext===".js"){let n=`${e.slice(0,e.length-3)}.ts`;if(Ae.existsSync(n))return {path:e,type:"file"}}let r=Q.join(e,"../");if(!Ae.existsSync(r))return;let o=Ae.readdirSync(r);for(let n of o)if(Q.parse(n).name===Q.basename(e)){let i=Q.join(r,n),a=i;return a.endsWith(".ts")&&(a=a.slice(0,a.length-3)),{path:a,type:Ae.statSync(i).isDirectory()?"directory":"file"}}},Go=(e,t,{doNotInstall:r}={doNotInstall:[]})=>{let o=new Set(r),n=e.filter(p=>!builtinModules.includes(p)&&!p.startsWith("node:")),s=rr(Q.dirname(t),""),i=new Set,a=new Set;if(s){let{devDependencies:p,dependencies:c}=JSON.parse(Ae.readFileSync(s,"utf-8"));for(let l of n){let y=Pt(l);if(y.isErr()){console.warn(`${W} ${Ie} Skipped adding import \`${P.cyan(l)}\`. Reason: Couldn't parse package name`);continue}let u=y.unwrap();if(!Do(u.name).validForNewPackages){console.warn(`${W} ${Ie} Skipped adding import \`${P.cyan(l)}\`. Reason: Not a valid package name`);continue}if(o.has(u.name))continue;let k;if(c!==void 0&&(k=c[u.name]),k!==void 0){i.add(`${u.name}@${k}`);continue}if(p!==void 0&&(k=p[u.name]),k!==void 0){a.add(`${u.name}@${k}`);continue}i.add(u.name);}}return {dependencies:Array.from(i),devDependencies:Array.from(a)}},ot=[Ao,Lo,or,Bo,Fo,_o,Wo,Vo,Mo,Jo];var Ho=C.object({name:C.string(),category:C.string(),localDependencies:C.array(C.string()),dependencies:C.array(C.string()),devDependencies:C.array(C.string()),tests:C.boolean(),list:C.optional(C.boolean(),!0),directory:C.string(),subdirectory:C.boolean(),files:C.array(C.string()),_imports_:C.record(C.string(),C.string())}),Ct=C.object({name:C.string(),blocks:C.array(Ho)}),Mr=[".test.ts","_test.ts",".test.js","_test.js"],ue=e=>Mr.find(t=>e.endsWith(t))!==void 0,Jr=(e,{cwd:t,config:{excludeDeps:r,includeBlocks:o,includeCategories:n,excludeBlocks:s,excludeCategories:i,dirs:a,doNotListBlocks:p,doNotListCategories:c,listBlocks:l,listCategories:y}})=>{let u;try{u=Ae.readdirSync(e);}catch{program.error(P.red(`Couldn't read the ${P.bold(e)} directory.`));}let k=[];for(let x of u){let A=Q.join(e,x);if(Ae.statSync(A).isFile())continue;let m=Q.basename(x);if(i.length>0&&i.find(L=>L.trim()===m.trim())||n.length>0&&!n.find(L=>L.trim()===m.trim()))continue;let R=!0;c.includes(m)&&(R=!1),y.length>0&&!y.includes(m)&&(R=!1);let M={name:m,blocks:[]},F=Ae.readdirSync(A);for(let L of F){let f=Q.join(A,L);if(Ae.statSync(f).isFile()){if(ue(L))continue;let g=qo(L),E=!0;if(p.includes(g)&&(E=!1),l.length>0&&!l.includes(g)&&(E=!1),s.length>0&&s.find(v=>v.trim()===g.trim())||o.length>0&&!o.find(v=>v.trim()===g.trim()))continue;let b=ot.find(v=>v.matches(L));if(!b){console.warn(`${W} ${Ie} Skipped \`${P.bold(f)}\` \`*${P.bold(Q.parse(L).ext)}\` files are not currently supported!`);continue}let _=F.find(v=>Mr.find(j=>v===`${g}${j}`)),{dependencies:h,devDependencies:S,local:d,imports:w}=b.resolveDependencies({filePath:f,isSubDir:!1,excludeDeps:r,cwd:t,dirs:a}).match(v=>v,v=>{program.error(P.red(v));}),$={name:g,directory:Q.relative(t,A),category:m,tests:_!==void 0,subdirectory:!1,list:R?E:!1,files:[L],localDependencies:d,_imports_:w,dependencies:h,devDependencies:S};_!==void 0&&$.files.push(_),M.blocks.push($);}else {let g=L,E=!0;if(p.includes(g)&&(E=!1),l.length>0&&!l.includes(g)&&(E=!1),s.length>0&&s.find(v=>v.trim()===g.trim())||o.length>0&&!o.find(v=>v.trim()===g.trim()))continue;let b=Ae.readdirSync(f),_=b.findIndex(v=>ue(v))!==-1,h=new Set,S=new Set,d=new Set,w={};for(let v of b){if(ue(v))continue;if(Ae.statSync(Q.join(f,v)).isDirectory()){console.warn(`${W} ${Ie} Skipped \`${P.bold(Q.join(f,v))}\` subdirectories are not currently supported!`);continue}let j=ot.find(B=>B.matches(v));if(!j){console.warn(`${W} ${Ie} Skipped \`${Q.join(f,v)}\` \`*${P.bold(Q.parse(v).ext)}\` files are not currently supported!`);continue}let{local:z,dependencies:ce,devDependencies:ye,imports:N}=j.resolveDependencies({filePath:Q.join(f,v),isSubDir:!0,excludeDeps:r,cwd:t,dirs:a}).match(B=>B,B=>{program.error(P.red(B));});for(let B of z)B!==`${m}/${g}`&&h.add(B);for(let B of ce)S.add(B);for(let B of ye)d.add(B);for(let[B,ee]of Object.entries(N))w[B]=ee;}let $={name:g,directory:Q.relative(t,f),category:m,tests:_,subdirectory:!0,list:R?E:!1,files:[...b],localDependencies:Array.from(h.keys()),dependencies:Array.from(S.keys()),devDependencies:Array.from(d.keys()),_imports_:w};M.blocks.push($);}}k.push(M);}return k},qo=e=>Q.parse(Q.basename(e)).name,zr=e=>{let t=[];for(let o of e){let n=[];for(let s of o.blocks){let i=`${s.category}/${s.name}`;!s.list&&!Sr(i,e)||n.push(s);}n.length>0&&t.push({name:o.name,blocks:n});}return [t,0]};var ke="jsrepo-manifest.json";var le=()=>new Ko({projectName:"jsrepo"});var He=(e,t,r)=>T(`There was an error fetching the \`${P.bold(t)}\` from ${P.bold(e.url)}.
2
+ import Le from'node:fs';import {fileURLToPath}from'node:url';import {Command,program,Option,Argument}from'commander';import ee from'pathe';import {outro,spinner,confirm,isCancel,cancel,multiselect,text,select,log,password,intro}from'@clack/prompts';import P from'chalk';import {resolveCommand}from'package-manager-detector/commands';import {detect}from'package-manager-detector/detect';import*as C from'valibot';import {getTsconfig,createPathsMatcher}from'get-tsconfig';import gt from'node-fetch';import {Octokit}from'octokit';import {builtinModules}from'node:module';import {Biome,Distribution}from'@biomejs/js-api';import*as Vt from'@vue/compiler-sfc';import {walk}from'estree-walker';import*as zr from'parse5';import*as Be from'prettier';import*as Ur from'svelte/compiler';import {Project}from'ts-morph';import _o from'validate-npm-package-name';import Oo from'node:os';import No from'ansi-regex';import en from'conf';import {execa}from'execa';import {detect as detect$1,resolveCommand as resolveCommand$1,detectSync}from'package-manager-detector';import pn from'escape-string-regexp';import gn from'semver';import {diffLines,diffChars}from'diff';var O=P.gray("\u2502"),Ct=P.gray("\u2500"),Xt=P.gray("\u2510"),Qt=P.gray("\u2518"),er=P.gray("\u251C"),Ir=P.gray("\u250C"),Sr=P.gray("\u2514"),Ie=P.bgRgb(245,149,66).black(" WARN "),mt=P.bgBlueBright.white(" INFO "),Pt=P.bgRedBright.white(" ERROR "),fe=P.hex("#f7df1e")("jsrepo");var Nt=class{_result;constructor(t){this._result=t;}match(t,r){return this._result.ok?t(this._result.val):r(this._result.err)}map(t){return this.match(r=>E(t(r)),r=>S(r))}mapOr(t,r){return this.match(o=>r(o),o=>t)}mapOrElse(t,r){return this.match(o=>r(o),o=>t(o))}mapErr(t){return this.match(r=>E(r),r=>S(t(r)))}mapErrOr(t,r){return this.match(o=>t,o=>r(o))}mapErrOrElse(t,r){return this.match(o=>t(o),o=>r(o))}isOk(){return this.match(()=>!0,()=>!1)}isErr(){return this.match(()=>!1,()=>!0)}unwrap(){return this.match(t=>t,()=>{throw new Error("Attempted to call `.unwrap()` on a non `Ok` value.")})}unwrapErr(){return this.match(()=>{throw new Error("Attempted to call `.unwrapErr()` on a non `Err` value.")},t=>t)}unwrapOr(t){return this.match(r=>r,r=>t)}unwrapErrOr(t){return this.match(()=>t,r=>r)}unwrapOrElse(t){return this.match(r=>r,r=>t(r))}unwrapErrOrElse(t){return this.match(r=>t(r),r=>r)}expect(t){return this.match(r=>r,()=>{throw new Error(t)})}expectErr(t){return this.match(()=>{throw new Error(t)},r=>r)}},E=e=>new Nt({ok:!0,val:e}),S=e=>new Nt({ok:!1,err:e});var Tr=(e,t)=>{let r=[];for(let[o,n]of e)r.push(t(o,n));return r};var xo=/^(@[^\/]+\/[^@\/]+)(?:@([^\/]+))?(\/.*)?$/,jo=/^([^@\/]+)(?:@([^\/]+))?(\/.*)?$/,Ot=e=>{let t=xo.exec(e)||jo.exec(e);return t?E({name:t[1]||"",version:t[2]||"latest",path:t[3]||""}):S(`invalid package name: ${e}`)};var Pr=C.union([C.literal("off"),C.literal("warn"),C.literal("error")]),Eo={"no-unpinned-dependency":{description:"Require all dependencies to have a pinned version.",check:e=>{let t=[];for(let r of [...e.dependencies,...e.devDependencies])r.includes("@")||t.push(`Couldn't find a version to use for ${P.bold(r)}`);return t.length>0?t:void 0}},"require-local-dependency-exists":{description:"Require all local dependencies to exist.",check:(e,{categories:t})=>{let r=[];for(let o of e.localDependencies){let[n,s]=o.split("/"),i=t.find(d=>d.name.trim()===n.trim()),a=`${P.bold(`${e.category}/${e.name}`)} depends on local dependency ${P.bold(o)} which doesn't exist`;if(!i){r.push(a);continue}i.blocks.find(d=>d.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.",check:(e,{categories:t})=>{let r=[];for(let o of e.localDependencies){let[n,s]=o.split("/");if(s!=="index")continue;let i=t.find(d=>d.name===n);!i||!i.blocks.find(d=>d.name===s)||r.push(`${P.bold(`${e.category}/${e.name}`)} depends on ${P.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.",check:(e,{options:t})=>{let r=[],o;return typeof t[0]!="number"?o=5:o=t[0],e.localDependencies.length>o&&r.push(`${P.bold(`${e.category}/${e.name}`)} has too many local dependencies (${P.bold(e.localDependencies.length)}) limit (${P.bold(o)})`),r.length>0?r:void 0}},"no-circular-dependency":{description:"Disallow circular dependencies.",check:(e,{categories:t})=>{let r=[],o=`${e.category}/${e.name}`,n=At(o,e,t);return n&&r.push(`There is a circular dependency in ${P.bold(o)}: ${P.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)",check:(e,{categories:t})=>{if(e.list)return;let r=`${e.category}/${e.name}`,o=t.flatMap(n=>n.blocks).filter(n=>n.list);for(let n of o)if(At(r,n,t))return;return [`${P.bold(r)} is unused and will be ${P.bold.red("removed")}`]}},"no-framework-dependency":{description:"Disallow frameworks (Svelte, Vue, React) as dependencies.",check:e=>{let t=[],r=new Set(["svelte","vue","nuxt","react","react-dom","next","@remix-run/react","@builder.io/qwik","astro","solid-js","@angular/core","@angular/common","@angular/forms","@angular/platform-browser","@angular/platform-browser-dynamic","@angular/router"]),o=[...e.devDependencies,...e.dependencies].map(n=>Ot(n).unwrap().name).filter(n=>r.has(n));if(o.length>0)for(let n of o)t.push(`${P.bold(`${e.category}/${e.name}`)} depends on ${P.bold(n)} causing it to be installed when added`);return t.length>0?t:void 0}}},Io=C.union([C.literal("no-category-index-file-dependency"),C.literal("no-unpinned-dependency"),C.literal("require-local-dependency-exists"),C.literal("max-local-dependencies"),C.literal("no-circular-dependency"),C.literal("no-unused-block"),C.literal("no-framework-dependency")]),Nr=C.record(Io,C.union([Pr,C.tupleWithRest([Pr,C.union([C.string(),C.number()])],C.union([C.string(),C.number()]))])),tr={"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"},Or=(e,t,r=tr)=>{let o=[],n=[];for(let s of e)for(let i of s.blocks)for(let[a,d]of Object.entries(Eo)){let c=r[a],l,y=[];if(Array.isArray(c)?(l=c[0],y.push(...c.slice(1))):l=c,l==="off")continue;let u=d.check(i,{categories:e,options:y,config:t});if(u){if(l==="error"){n.push(...u.map(b=>`${O} ${Pt} ${P.red(b)} ${P.gray(a)}`));continue}o.push(...u.map(b=>`${O} ${Ie} ${b} ${P.gray(a)}`));}}return {warnings:o,errors:n}},At=(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("/"),d=r.find(l=>l.name===i)?.blocks.find(l=>l.name===a);if(!d)continue;let c=At(e,d,r,n);if(c)return [...c,e]}},Ar=(e,t)=>{for(let r of t)for(let o of r.blocks){if(!o.list)continue;if(At(e,o,t))return !0}return !1};var rt="jsrepo.json",Ge="jsrepo-build-config.json",rr=C.union([C.literal("prettier"),C.literal("biome")]),To=C.objectWithRest({"*":C.string()},C.string()),or=C.object({$schema:C.string(),repos:C.optional(C.array(C.string()),[]),includeTests:C.boolean(),paths:To,watermark:C.optional(C.boolean(),!0),formatter:C.optional(rr)}),we=e=>{if(!Le.existsSync(ee.join(e,rt)))return S("Could not find your configuration file! Please run `init`.");let t=C.safeParse(or,JSON.parse(Le.readFileSync(ee.join(e,rt)).toString()));return t.success?E(t.output):S(`There was an error reading your \`${rt}\` file!`)},Po=C.object({$schema:C.string(),dirs:C.array(C.string()),includeBlocks:C.optional(C.array(C.string()),[]),includeCategories:C.optional(C.array(C.string()),[]),excludeBlocks:C.optional(C.array(C.string()),[]),excludeCategories:C.optional(C.array(C.string()),[]),doNotListBlocks:C.optional(C.array(C.string()),[]),doNotListCategories:C.optional(C.array(C.string()),[]),listBlocks:C.optional(C.array(C.string()),[]),listCategories:C.optional(C.array(C.string()),[]),excludeDeps:C.optional(C.array(C.string()),[]),preview:C.optional(C.boolean()),rules:C.optional(Nr)}),Lt=e=>{if(!Le.existsSync(ee.join(e,Ge)))return E(null);let t=C.safeParse(Po,JSON.parse(Le.readFileSync(ee.join(e,Ge)).toString()));return t.success?E(t.output):S(`There was an error reading your \`${Ge}\` file!`)},$e=(e,t)=>{let r=getTsconfig(t,"tsconfig.json"),o=null;r||(r=getTsconfig(t,"jsconfig.json")),r&&(o=createPathsMatcher(r));let n;if(e["*"].startsWith("."))n={"*":ee.relative(t,ee.join(ee.resolve(t),e["*"]))};else {if(o===null)return S("Cannot resolve aliases because we couldn't find a tsconfig!");n={"*":Lr(e["*"],o,t)};}for(let[s,i]of Object.entries(e))if(s!=="*"){if(i.startsWith(".")){n[s]=ee.relative(t,ee.join(ee.resolve(t),i));continue}if(o===null)return S("Cannot resolve aliases because we couldn't find a tsconfig!");n[s]=Lr(i,o,t);}return E(n)},Lr=(e,t,r)=>{let o=t(e);return ee.relative(r,o[0])};var De=e=>e.replace(No(),"");var xt=(e,t,r=" ")=>{if(De(e).length>t)throw new Error("String length is greater than the length provided.");return r.repeat(t-De(e).length)+e},Br=(e,t,r=" ")=>e+r.repeat(t),Fr=(e,t,r=" ")=>{if(De(e).length>t)throw new Error("String length is greater than the length provided.");return e+r.repeat(t-De(e).length)},_r=(e,t,r=" ")=>{if(De(e).length>t)throw new Error("String length is greater than the length provided.");let o=t-De(e).length,n=Math.floor(o/2),s=Math.ceil(o/2);return r.repeat(n)+e+r.repeat(s)};var Ao=/\n|\r\n/g,Q=e=>e.split(Ao),Z=(e,{lineNumbers:t=!1,prefix:r}={})=>{let o=e;if(t){let n=e.length.toString().length+1;o=o.map((s,i)=>`${xt(`${i+1}`,n)} ${s}`);}return r!==void 0&&(o=o.map((n,s)=>`${r(s,e.length)}${n}`)),o.join(Oo.EOL)};var ir=(e,t)=>{let r=ee.join(e,"package.json");if(Le.existsSync(r))return r;if(e===t)return;let o=e.split(/[\/\\]/);return ir(o.slice(0,o.length-1).join("/"),t)},Do=e=>{if(!Le.existsSync(e))return S(`${e} doesn't exist`);let t=Le.readFileSync(e).toString();return E(JSON.parse(t))},Bt=(e,t,{cwd:r})=>{let o=e,n=t,s=Do(ee.join(r,"package.json"));if(!s.isErr()){let i=s.unwrap();if(i.dependencies)for(let a of o){let[d,c]=a.split("@"),l=i.dependencies[d];c===void 0&&l||l&&l===c&&o.delete(a);}if(i.devDependencies)for(let a of n){let[d,c]=a.split("@"),l=i.devDependencies[d];c===void 0&&l||l&&l===c&&n.delete(a);}}return {dependencies:o,devDependencies:n}};var Wo={matches:e=>e.endsWith(".css"),resolveDependencies:()=>E({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>`/*
3
+ ${Z(Q(e),{prefix:()=>" "})}
4
+ */`,format:async(e,{formatter:t,prettierOptions:r,biomeOptions:o,filePath:n})=>{if(!t)return e;if(t==="prettier")return await Be.format(e,{filepath:n,...r});let s=await Biome.create({distribution:Distribution.NODE});return o&&s.applyConfiguration(o),s.formatContent(e,{filePath:n}).content}},Vo={matches:e=>e.endsWith(".html"),resolveDependencies:({filePath:e,isSubDir:t,excludeDeps:r,dirs:o,cwd:n})=>{let s=Le.readFileSync(e).toString(),i=zr.parse(s),a=[],d=(l,y)=>{if(l&&(y(l),l.childNodes&&l.childNodes.length>0))for(let u of l.childNodes)d(u,y);};for(let l of i.childNodes)d(l,y=>{if(y.tagName==="script")for(let u of y.attrs)u.name==="src"&&a.push(u.value);if(y.tagName==="link"&&y.attrs.find(u=>u.name==="rel"&&u.value==="stylesheet"))for(let u of y.attrs)u.name==="href"&&!u.value.startsWith("http")&&a.push(u.value);});let c=Jt({moduleSpecifiers:a,filePath:e,isSubDir:t,dirs:o,cwd:n,doNotInstall:["svelte","@sveltejs/kit",...r]});return c.isErr()?S(c.unwrapErr().map(l=>Mt(l)).join(`
5
+ `)):E(c.unwrap())},comment:e=>`<!--
6
+ ${Z(Q(e),{prefix:()=>" "})}
7
+ -->`,format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await Be.format(e,{parser:"html",...r}):e},ar={matches:e=>e.endsWith(".json"),resolveDependencies:()=>E({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>e,format:async(e,{formatter:t,prettierOptions:r,biomeOptions:o,filePath:n})=>{if(!t)return e;if(t==="prettier")return await Be.format(e,{filepath:n,...r});let s=await Biome.create({distribution:Distribution.NODE});return o&&s.applyConfiguration(o),s.formatContent(e,{filePath:n}).content}},Mo={matches:e=>e.endsWith(".jsonc"),resolveDependencies:()=>E({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>`/*
8
+ ${Z(Q(e),{prefix:()=>" "})}
9
+ */`,format:async(e,{formatter:t,prettierOptions:r,biomeOptions:o,filePath:n})=>{if(!t)return e;if(t==="prettier")return await Be.format(e,{filepath:n,...r});let s=await Biome.create({distribution:Distribution.NODE});return o&&s.applyConfiguration({...o,json:{parser:{allowComments:!0}}}),s.formatContent(e,{filePath:n}).content}},Jo={matches:e=>e.endsWith(".sass")||e.endsWith(".scss"),resolveDependencies:()=>E({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>`/*
10
+ ${Z(Q(e),{prefix:()=>" "})}
11
+ */`,format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await Be.format(e,{parser:"scss",...r}):e},zo={matches:e=>e.endsWith(".svelte"),resolveDependencies:({filePath:e,isSubDir:t,excludeDeps:r,dirs:o,cwd:n})=>{let s=Le.readFileSync(e).toString(),i=Ur.parse(s,{modern:!0,filename:e});if(!i.instance&&!i.module)return E({dependencies:[],devDependencies:[],local:[],imports:{}});let a=[],d=l=>{(l.type==="ImportDeclaration"||l.type==="ExportAllDeclaration"||l.type==="ExportNamedDeclaration")&&typeof l.source?.value=="string"&&a.push(l.source.value);};i.instance&&walk(i.instance,{enter:d}),i.module&&walk(i.module,{enter:d});let c=Jt({moduleSpecifiers:a,filePath:e,isSubDir:t,dirs:o,cwd:n,doNotInstall:["svelte","@sveltejs/kit",...r]});return c.isErr()?S(c.unwrapErr().map(l=>Mt(l)).join(`
12
+ `)):E(c.unwrap())},comment:e=>`<!--
13
+ ${Z(Q(e),{prefix:()=>" "})}
14
+ -->`,format:async(e,{formatter:t,filePath:r,prettierOptions:o})=>t&&t==="prettier"&&o&&o.plugins?.find(n=>n==="prettier-plugin-svelte")?await Be.format(e,{filepath:r,...o}):e},Uo={matches:e=>e.endsWith(".svg"),resolveDependencies:()=>E({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>`<!--
15
+ ${Z(Q(e),{prefix:()=>" "})}
16
+ -->`,format:async e=>e},Go={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})=>{let i=new Project().addSourceFileAtPath(e),a=i.getImportDeclarations().map(l=>l.getModuleSpecifierValue()),d=i.getExportDeclarations().map(l=>l.getModuleSpecifierValue()).filter(l=>l!==void 0);a.push(...d);let c=Jt({moduleSpecifiers:a,filePath:e,isSubDir:t,dirs:o,cwd:n,doNotInstall:r});return c.isErr()?S(c.unwrapErr().map(l=>Mt(l)).join(`
17
+ `)):E(c.unwrap())},comment:e=>`/*
18
+ ${Z(Q(e),{prefix:()=>" "})}
19
+ */`,format:async(e,{formatter:t,filePath:r,prettierOptions:o,biomeOptions:n})=>{if(!t)return e;if(t==="prettier")return await Be.format(e,{filepath:r,...o});let s=await Biome.create({distribution:Distribution.NODE});return n&&s.applyConfiguration(n),s.formatContent(e,{filePath:r}).content}},Ho={matches:e=>e.endsWith(".vue"),resolveDependencies:({filePath:e,isSubDir:t,excludeDeps:r,dirs:o,cwd:n})=>{let s=Le.readFileSync(e).toString(),i=Vt.parse(s,{filename:e});if(!i.descriptor.script?.content&&!i.descriptor.scriptSetup?.content)return E({dependencies:[],devDependencies:[],local:[],imports:{}});let a;try{a=Vt.compileScript(i.descriptor,{id:"shut-it"});}catch(l){return S(`Compile error: ${l}`)}if(!a.imports)return E({dependencies:[],devDependencies:[],local:[],imports:{}});let d=Object.values(a.imports).map(l=>l.source),c=Jt({moduleSpecifiers:d,filePath:e,isSubDir:t,dirs:o,cwd:n,doNotInstall:["vue","nuxt",...r]});return c.isErr()?S(c.unwrapErr().map(l=>Mt(l)).join(`
20
+ `)):E(c.unwrap())},comment:e=>`<!--
21
+ ${Z(Q(e),{prefix:()=>" "})}
22
+ -->`,format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await Be.format(e,{parser:"vue",...r}):e},qo={matches:e=>e.endsWith(".yml")||e.endsWith(".yaml"),resolveDependencies:()=>E({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>Z(Q(e),{prefix:()=>"# "}),format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await Be.format(e,{parser:"yaml",...r}):e},Mt=e=>`${Z(Q(e),{prefix:t=>t===0?`${O} ${Pt} `:`${O} `})}`,Jt=({moduleSpecifiers:e,isSubDir:t,filePath:r,doNotInstall:o,dirs:n,cwd:s})=>{let i=[],a=new Set,d=new Set,c={};for(let u of e){if(u.startsWith(".")){let L=Gr(u,t,{filePath:r,dirs:n,cwd:s});if(L.isErr()){i.push(L.unwrapErr());continue}let m=L.unwrap();m&&(d.add(m.dependency),c[u]=m.template);continue}let b=Ko(u,t,{filePath:r,dirs:n,cwd:s});if(b.isErr()){i.push(b.unwrapErr());continue}let x=b.unwrap();x?(d.add(x.dependency),c[u]=x.template):a.add(u);}if(i.length>0)return S(i);let{devDependencies:l,dependencies:y}=Zo(Array.from(a),r,{doNotInstall:o||[]});return E({dependencies:y,devDependencies:l,local:Array.from(d),imports:c})},Gr=(e,t,{filePath:r,alias:o,dirs:n,cwd:s})=>{if(t&&(e.startsWith("./")||e==="."))return E(void 0);let i=t?ee.join(r,"../../"):ee.join(r,"../"),a=ee.join(ee.join(r,"../"),e),d=ee.join(i,"../");if(a.startsWith(d))return E(Jr(a.slice(d.length)));if(o){for(let c of n){let l=ee.resolve(ee.join(s,c)),y=ee.resolve(a);if(y.startsWith(l))return E(Jr(y.slice(l.length+1)))}return S(`${r}:
23
+ ${o} references code not contained in ${P.bold(n.join(", "))} and cannot be resolved.`)}return S(`${r}:
24
+ ${e} references code not contained in ${i} and cannot be resolved.`)},Jr=e=>{let[t,r,...o]=e.split("/");r===void 0&&(r="index");let n=r;n.includes(".")&&(n=n.slice(0,n.length-ee.parse(n).ext.length));let s=`${t}/${n}`,i=`{{${s}}}`;return o.length===0?n.length!==r.length&&(i+=ee.parse(r).ext):i+=`/${o.join("/")}`,{dependency:s,template:i}},Ko=(e,t,{filePath:r,dirs:o,cwd:n})=>{let s;try{if(s=getTsconfig(r,"tsconfig.json"),!s&&(s=getTsconfig(r,"jsconfig.json"),!s))return E(void 0)}catch(a){return S(`Error while trying to get ${P.bold("tsconfig.json")}: ${a}`)}let i=createPathsMatcher(s);if(i){let a=i(e);for(let d of a){let c=Yo(d);if(!c)continue;let l=ee.relative(ee.resolve(ee.join(r,"../")),c.path),y=Gr(l,t,{filePath:r,alias:e,dirs:o,cwd:n,modIsFile:c.type==="file"});if(y.isErr())return S(y.unwrapErr());if(y.unwrap())return E(y.unwrap());break}}return E(void 0)},Yo=e=>{if(Le.existsSync(e))return {path:e,type:Le.statSync(e).isDirectory()?"directory":"file"};if(ee.parse(e).ext===".js"){let n=`${e.slice(0,e.length-3)}.ts`;if(Le.existsSync(n))return {path:e,type:"file"}}let r=ee.join(e,"../");if(!Le.existsSync(r))return;let o=Le.readdirSync(r);for(let n of o)if(ee.parse(n).name===ee.basename(e)){let i=ee.join(r,n),a=i;return a.endsWith(".ts")&&(a=a.slice(0,a.length-3)),{path:a,type:Le.statSync(i).isDirectory()?"directory":"file"}}},Zo=(e,t,{doNotInstall:r}={doNotInstall:[]})=>{let o=new Set(r),n=e.filter(d=>!builtinModules.includes(d)&&!d.startsWith("node:")),s=ir(ee.dirname(t),""),i=new Set,a=new Set;if(s){let{devDependencies:d,dependencies:c}=JSON.parse(Le.readFileSync(s,"utf-8"));for(let l of n){let y=Ot(l);if(y.isErr()){console.warn(`${O} ${Ie} Skipped adding import \`${P.cyan(l)}\`. Reason: Couldn't parse package name`);continue}let u=y.unwrap();if(!_o(u.name).validForNewPackages){console.warn(`${O} ${Ie} Skipped adding import \`${P.cyan(l)}\`. Reason: Not a valid package name`);continue}if(o.has(u.name))continue;let b;if(c!==void 0&&(b=c[u.name]),b!==void 0){i.add(`${u.name}@${b}`);continue}if(d!==void 0&&(b=d[u.name]),b!==void 0){a.add(`${u.name}@${b}`);continue}i.add(u.name);}}return {dependencies:Array.from(i),devDependencies:Array.from(a)}},ot=[Wo,Vo,ar,Mo,Jo,zo,Uo,Go,Ho,qo];var Xo=C.object({name:C.string(),category:C.string(),localDependencies:C.array(C.string()),dependencies:C.array(C.string()),devDependencies:C.array(C.string()),tests:C.boolean(),list:C.optional(C.boolean(),!0),directory:C.string(),subdirectory:C.boolean(),files:C.array(C.string()),_imports_:C.record(C.string(),C.string())}),jt=C.object({name:C.string(),blocks:C.array(Xo)}),Hr=[".test.ts","_test.ts",".test.js","_test.js"],ue=e=>Hr.find(t=>e.endsWith(t))!==void 0,qr=(e,{cwd:t,config:{excludeDeps:r,includeBlocks:o,includeCategories:n,excludeBlocks:s,excludeCategories:i,dirs:a,doNotListBlocks:d,doNotListCategories:c,listBlocks:l,listCategories:y}})=>{let u;try{u=Le.readdirSync(e);}catch{program.error(P.red(`Couldn't read the ${P.bold(e)} directory.`));}let b=[];for(let x of u){let L=ee.join(e,x);if(Le.statSync(L).isFile())continue;let m=ee.basename(x);if(i.length>0&&i.find(B=>B.trim()===m.trim())||n.length>0&&!n.find(B=>B.trim()===m.trim()))continue;let R=!0;c.includes(m)&&(R=!1),y.length>0&&!y.includes(m)&&(R=!1);let M={name:m,blocks:[]},_=Le.readdirSync(L);for(let B of _){let f=ee.join(L,B);if(Le.statSync(f).isFile()){if(ue(B))continue;let g=Qo(B),I=!0;if(d.includes(g)&&(I=!1),l.length>0&&!l.includes(g)&&(I=!1),s.length>0&&s.find(v=>v.trim()===g.trim())||o.length>0&&!o.find(v=>v.trim()===g.trim()))continue;let k=ot.find(v=>v.matches(B));if(!k){console.warn(`${O} ${Ie} Skipped \`${P.bold(f)}\` \`*${P.bold(ee.parse(B).ext)}\` files are not currently supported!`);continue}let W=_.find(v=>Hr.find(j=>v===`${g}${j}`)),{dependencies:h,devDependencies:T,local:p,imports:w}=k.resolveDependencies({filePath:f,isSubDir:!1,excludeDeps:r,cwd:t,dirs:a}).match(v=>v,v=>{program.error(P.red(v));}),$={name:g,directory:ee.relative(t,L),category:m,tests:W!==void 0,subdirectory:!1,list:R?I:!1,files:[B],localDependencies:p,_imports_:w,dependencies:h,devDependencies:T};W!==void 0&&$.files.push(W),M.blocks.push($);}else {let g=B,I=!0;if(d.includes(g)&&(I=!1),l.length>0&&!l.includes(g)&&(I=!1),s.length>0&&s.find(v=>v.trim()===g.trim())||o.length>0&&!o.find(v=>v.trim()===g.trim()))continue;let k=Le.readdirSync(f),W=k.findIndex(v=>ue(v))!==-1,h=new Set,T=new Set,p=new Set,w={};for(let v of k){if(ue(v))continue;if(Le.statSync(ee.join(f,v)).isDirectory()){console.warn(`${O} ${Ie} Skipped \`${P.bold(ee.join(f,v))}\` subdirectories are not currently supported!`);continue}let j=ot.find(F=>F.matches(v));if(!j){console.warn(`${O} ${Ie} Skipped \`${ee.join(f,v)}\` \`*${P.bold(ee.parse(v).ext)}\` files are not currently supported!`);continue}let{local:z,dependencies:le,devDependencies:ye,imports:N}=j.resolveDependencies({filePath:ee.join(f,v),isSubDir:!0,excludeDeps:r,cwd:t,dirs:a}).match(F=>F,F=>{program.error(P.red(F));});for(let F of z)F!==`${m}/${g}`&&h.add(F);for(let F of le)T.add(F);for(let F of ye)p.add(F);for(let[F,te]of Object.entries(N))w[F]=te;}let $={name:g,directory:ee.relative(t,f),category:m,tests:W,subdirectory:!0,list:R?I:!1,files:[...k],localDependencies:Array.from(h.keys()),dependencies:Array.from(T.keys()),devDependencies:Array.from(p.keys()),_imports_:w};M.blocks.push($);}}b.push(M);}return b},Qo=e=>ee.parse(ee.basename(e)).name,Kr=e=>{let t=[];for(let o of e){let n=[];for(let s of o.blocks){let i=`${s.category}/${s.name}`;!s.list&&!Ar(i,e)||n.push(s);}n.length>0&&t.push({name:o.name,blocks:n});}return [t,0]};var be="jsrepo-manifest.json";var ne=()=>new en({projectName:"jsrepo"});var qe=(e,t,r)=>S(`There was an error fetching the \`${P.bold(t)}\` from ${P.bold(e.url)}.
25
25
 
26
26
  ${P.bold("This may be for one of the following reasons:")}
27
27
  1. The \`${P.bold(t)}\` or containing repository doesn't exist
28
28
  2. Your repository path is incorrect (wrong branch, wrong tag) default branches other than \`${P.bold(r)}\` must be specified \`${P.bold("github/<owner>/<name>/tree/<branch>")}\`
29
29
  3. You are using an expired access token or a token that doesn't have access to this repository
30
- `),de={name:()=>"github",defaultBranch:()=>"main",resolveRaw:async(e,t)=>{let r=await de.info(e);return new URL(t,`https://raw.githubusercontent.com/${r.owner}/${r.repoName}/refs/${r.refs}/${r.ref}/`)},fetchRaw:async(e,t,{verbose:r}={})=>{let o=await de.info(e),n=await de.resolveRaw(o,t);r?.(`Trying to fetch from ${n}`);try{let s=le().get(`${de.name()}-token`),i=new Headers;s!==void 0&&i.append("Authorization",`token ${s}`);let a=await ut(n,{headers:i});return r?.(`Got a response from ${n} ${a.status} ${a.statusText}`),a.ok?I(await a.text()):He(o,t,de.defaultBranch())}catch(s){return r?.(`erroring in response ${s} `),He(o,t,de.defaultBranch())}},fetchManifest:async e=>{let t=await de.fetchRaw(e,ke);if(t.isErr())return T(t.unwrapErr());let r=C.safeParse(C.array(Ct),JSON.parse(t.unwrap()));return r.success?I(r.output):T(`Error parsing categories: ${r.issues}`)},info:async e=>{if(typeof e!="string")return e;let t=e.replaceAll(/(https:\/\/github.com\/)|(github\/)/g,""),[r,o,...n]=t.split("/"),s=de.defaultBranch(),i=le().get(`${de.name()}-token`),a=new Octokit({auth:i});if(n[0]==="tree")s=n[1];else try{let{data:c}=await a.rest.repos.get({owner:r,repo:o});s=c.default_branch;}catch{}let p="heads";if(s!==de.defaultBranch())try{let{data:c}=await a.rest.git.listMatchingRefs({owner:r,repo:o,ref:"tags"});c.some(l=>l.ref===`refs/tags/${s}`)&&(p="tags");}catch{p="heads";}return {refs:p,url:e,name:de.name(),repoName:o,owner:r,ref:s,provider:de}},matches:e=>e.toLowerCase().startsWith("https://github.com")||e.toLowerCase().startsWith("github")},Pe={name:()=>"gitlab",defaultBranch:()=>"main",resolveRaw:async(e,t)=>{let r=await Pe.info(e);return new URL(`${encodeURIComponent(t)}/raw?ref=${r.ref}`,`https://gitlab.com/api/v4/projects/${encodeURIComponent(`${r.owner}/${r.repoName}`)}/repository/files/`)},fetchRaw:async(e,t,{verbose:r}={})=>{let o=await de.info(e),n=await Pe.resolveRaw(o,t);r?.(`Trying to fetch from ${n}`);try{let s=le().get(`${Pe.name()}-token`),i=new Headers;s!==void 0&&i.append("PRIVATE-TOKEN",`${s}`);let a=await ut(n,{headers:i});return r?.(`Got a response from ${n} ${a.status} ${a.statusText}`),a.ok?I(await a.text()):He(o,t,Pe.defaultBranch())}catch{return He(o,t,Pe.defaultBranch())}},fetchManifest:async e=>{let t=await Pe.fetchRaw(e,ke);if(t.isErr())return T(t.unwrapErr());let r=C.safeParse(C.array(Ct),JSON.parse(t.unwrap()));return r.success?I(r.output):T(`Error parsing categories: ${r.issues}`)},info:async e=>{if(typeof e!="string")return e;let t=e.replaceAll(/(https:\/\/gitlab.com\/)|(gitlab\/)/g,""),[r,o,...n]=t.split("/"),s=Pe.defaultBranch(),i="heads";if(n[0]==="-"&&n[1]==="tree")if(n[2].includes("?")){let[a,p]=n[2].split("?");s=a,p.startsWith("ref_type=")&&p.slice(10)==="tags"&&(i="tags");}else s=n[2];else try{let a=le().get(`${Pe.name()}-token`),p=new Headers;a!==void 0&&p.append("Authorization",`Bearer ${a}`);let c=await ut(`https://gitlab.com/api/v4/projects/${encodeURIComponent(`${r}/${o}`)}`,{headers:p});c.ok&&(s=(await c.json()).default_branch);}catch{}return {refs:i,url:e,name:Pe.name(),repoName:o,owner:r,ref:s,provider:Pe}},matches:e=>e.toLowerCase().startsWith("https://gitlab.com")||e.toLowerCase().startsWith("gitlab")},be={name:()=>"bitbucket",defaultBranch:()=>"master",resolveRaw:async(e,t)=>{let r=await be.info(e);return new URL(t,`https://api.bitbucket.org/2.0/repositories/${r.owner}/${r.repoName}/src/${r.ref}/`)},fetchRaw:async(e,t,{verbose:r}={})=>{let o=await be.info(e),n=await be.resolveRaw(o,t);r?.(`Trying to fetch from ${n}`);try{let s=le().get(`${be.name()}-token`),i=new Headers;s!==void 0&&i.append("Authorization",`Bearer ${s}`);let a=await ut(n,{headers:i});return r?.(`Got a response from ${n} ${a.status} ${a.statusText}`),a.ok?I(await a.text()):He(o,t,be.defaultBranch())}catch{return He(o,t,be.defaultBranch())}},fetchManifest:async e=>{let t=await be.fetchRaw(e,ke);if(t.isErr())return T(t.unwrapErr());let r=C.safeParse(C.array(Ct),JSON.parse(t.unwrap()));return r.success?I(r.output):T(`Error parsing categories: ${r.issues}`)},info:async e=>{if(typeof e!="string")return e;let t=e.replaceAll(/(https:\/\/bitbucket.org\/)|(bitbucket\/)/g,""),[r,o,...n]=t.split("/"),s="heads",i=be.defaultBranch();if(n[0]==="src")i=n[1];else try{let a=le().get(`${be.name()}-token`),p=new Headers;a!==void 0&&p.append("Authorization",`Bearer ${a}`);let c=await ut(`https://api.bitbucket.org/2.0/repositories/${r}/${o}`,{headers:p});c.ok&&(i=(await c.json()).mainbranch.name);}catch{}return {refs:s,url:e,name:be.name(),repoName:o,owner:r,ref:i,provider:be}},matches:e=>e.toLowerCase().startsWith("https://bitbucket.org")||e.toLowerCase().startsWith("bitbucket")},Te={name:()=>"azure",defaultBranch:()=>"main",resolveRaw:async(e,t)=>{let r=await Te.info(e),o=r.refs==="tags"?"tag":"branch";return new URL(`https://dev.azure.com/${r.owner}/${r.projectName}/_apis/git/repositories/${r.repoName}/items?path=${t}&api-version=7.2-preview.1&versionDescriptor.version=${r.ref}&versionDescriptor.versionType=${o}`)},fetchRaw:async(e,t,{verbose:r}={})=>{let o=await Te.info(e),n=await Te.resolveRaw(o,t);r?.(`Trying to fetch from ${n}`);try{let s=le().get(`${Te.name()}-token`),i=new Headers;s!==void 0&&i.append("Authorization",`Bearer ${s}`);let a=await ut(n,{headers:i});return r?.(`Got a response from ${n} ${a.status} ${a.statusText}`),a.ok?I(await a.text()):He(o,t,Te.defaultBranch())}catch(s){return r?.(`erroring in response ${s} `),He(o,t,Te.defaultBranch())}},fetchManifest:async e=>{let t=await Te.fetchRaw(e,ke);if(t.isErr())return T(t.unwrapErr());let r=C.safeParse(C.array(Ct),JSON.parse(t.unwrap()));return r.success?I(r.output):T(`Error parsing categories: ${r.issues}`)},info:async e=>{if(typeof e!="string")return e;let t=e.replaceAll(/(azure\/)/g,""),[r,o,n,...s]=t.split("/"),i=Te.defaultBranch(),a="heads";return ["tags","heads"].includes(s[0])&&(a=s[0],s[1]&&s[1]!==""&&(i=s[1])),{refs:a,url:e,name:Te.name(),projectName:o,repoName:n,owner:r,ref:i,provider:Te}},matches:e=>e.toLowerCase().startsWith("azure")},q=[de,Pe,be,Te],st=async e=>{let t=q.find(r=>r.matches(e));return t?I(await t.info(e)):T(`Only ${q.map((r,o)=>`${o===q.length-1?"and":""}${P.cyan(r.name())}`).join(", ")} repositories are supported at this time!`)},qe=async(...e)=>{let t=new Map;for(let{path:r,info:o}of e){let n=await o.provider.fetchManifest(o);if(n.isErr())return T({message:n.unwrapErr(),repo:r});let s=n.unwrap();for(let i of s)for(let a of i.blocks)t.set(`${o.name}/${o.owner}/${o.repoName}/${i.name}/${a.name}`,{...a,sourceRepo:o});}return I(t)},Ke=async(...e)=>{let t=[];for(let r of e){let o=await st(r);if(o.isErr())return T({message:o.unwrapErr(),repo:r});let n=o.unwrap();t.push({path:r,info:n});}return I(t)};var it=async(e,t,r,o=new Map)=>{let n=new Map;for(let s of e){let i;if(q.find(p=>s.startsWith(p.name()))){let[p,c,l,...y]=s.split("/");i=t.get(`${p}/${c}/${l}/${y.slice(y.length-2).join("/")}`);}else {if(r.length===0)return T(P.red(`If your config doesn't repos then you must provide the repo in the block specifier ex: \`${P.bold(`github/<owner>/<name>/${s}`)}\`!`));for(let{info:p}of r){let c=t.get(`${p.name}/${p.owner}/${p.repoName}/${s}`);if(c!==void 0){i=c;break}}}if(!i)return T(`Invalid block! ${P.bold(s)} does not exist!`);let a=`${i.category}/${i.name}`;if(n.set(a,{name:i.name,subDependency:!1,block:i}),i.localDependencies&&i.localDependencies.length>0){let p=await it(i.localDependencies.filter(c=>!n.has(c)&&!o.has(c)),t,r,n);if(p.isErr())return T(p.unwrapErr());for(let c of p.unwrap())n.set(`${c.block.category}/${c.block.name}`,c);}}return I(xr(n,(s,i)=>i))},Ye=(e,t,r)=>{let o=[],n=$e(t.paths,r);n.isErr()&&program.error(P.red(n.unwrapErr()));let s=n.unwrap();for(let[i,a]of e){let p;s[a.category]!==void 0?p=Q.join(r,s[a.category]):p=Q.join(r,s["*"],a.category);let c=Q.join(p,a.files[0]);a.subdirectory&&(c=Q.join(p,a.name)),Ae.existsSync(c)&&o.push({specifier:`${a.category}/${a.name}`,path:c,block:a});}return o};var Qo={"no-workspace":"--no-workspace","install-as-dev-dependency":"-D"},en={"install-as-dev-dependency":"-D"},tn={"no-workspace":"--workspaces=false","install-as-dev-dependency":"-D"},Ur={"no-workspace":"--ignore-workspace","install-as-dev-dependency":"-D"},Gr={"no-workspace":"--focus","install-as-dev-dependency":"-D"},sr={bun:Qo,npm:tn,pnpm:Ur,deno:en,yarn:Gr,"yarn@berry":Gr,"pnpm@6":Ur};var Ne=async({pm:e,deps:t,dev:r,cwd:o,ignoreWorkspace:n=!1})=>{let s=[...t];r&&s.push(sr[e]["install-as-dev-dependency"]);let i=sr[e]["no-workspace"];n&&i&&s.push(i);let a=resolveCommand$1(e,"install",s);if(a==null)return T(P.red(`Could not resolve add command for '${e}'.`));try{return await execa(a.command,[...a.args],{cwd:o}),I(t)}catch{return T(P.red(`Failed to install ${P.bold(t.join(", "))}! Failed while running '${P.bold(`${a.command} ${a.args.join(" ")}`)}'`))}},nn=/\{\{([^\/]+)\/([^\}]+)\}\}/g,Hr=({template:e,config:t,destPath:r,cwd:o})=>{let n=Q.join(r,"../");return e.replace(nn,(s,i,a)=>{if(t.paths[i]===void 0){if(t.paths["*"].startsWith(".")){let p=Q.relative(n,Q.join(o,t.paths["*"],i,a));return p.startsWith(".")?p:`./${p}`}return Q.join(t.paths["*"],i,a)}if(t.paths[i].startsWith(".")){let p=Q.relative(n,Q.join(o,t.paths[i],a));return p.startsWith(".")?p:`./${p}`}return Q.join(t.paths[i],a)})};var Ut=async({file:e,config:t,imports:r,watermark:o,prettierOptions:n,biomeOptions:s,cwd:i,verbose:a})=>{let p=ot.find(l=>l.matches(e.destPath)),c=e.content;if(p){t.watermark&&(c=`${p.comment(o)}
30
+ `),de={name:()=>"github",defaultBranch:()=>"main",resolveRaw:async(e,t)=>{let r=await de.info(e);return new URL(t,`https://raw.githubusercontent.com/${r.owner}/${r.repoName}/refs/${r.refs}/${r.ref}/`)},fetchRaw:async(e,t,{verbose:r}={})=>{let o=await de.info(e),n=await de.resolveRaw(o,t);r?.(`Trying to fetch from ${n}`);try{let s=ne().get(`${de.name()}-token`),i=new Headers;s!==void 0&&i.append("Authorization",`token ${s}`);let a=await gt(n,{headers:i});return r?.(`Got a response from ${n} ${a.status} ${a.statusText}`),a.ok?E(await a.text()):qe(o,t,de.defaultBranch())}catch(s){return r?.(`erroring in response ${s} `),qe(o,t,de.defaultBranch())}},fetchManifest:async e=>{let t=await de.fetchRaw(e,be);if(t.isErr())return S(t.unwrapErr());let r=C.safeParse(C.array(jt),JSON.parse(t.unwrap()));return r.success?E(r.output):S(`Error parsing categories: ${r.issues}`)},info:async e=>{if(typeof e!="string")return e;let t=e.replaceAll(/(https:\/\/github.com\/)|(github\/)/g,""),[r,o,...n]=t.split("/"),s=de.defaultBranch(),i=ne().get(`${de.name()}-token`),a=new Octokit({auth:i});if(n[0]==="tree")s=n[1];else try{let{data:c}=await a.rest.repos.get({owner:r,repo:o});s=c.default_branch;}catch{}let d="heads";if(s!==de.defaultBranch())try{let{data:c}=await a.rest.git.listMatchingRefs({owner:r,repo:o,ref:"tags"});c.some(l=>l.ref===`refs/tags/${s}`)&&(d="tags");}catch{d="heads";}return {refs:d,url:e,name:de.name(),repoName:o,owner:r,ref:s,provider:de}},matches:e=>e.toLowerCase().startsWith("https://github.com")||e.toLowerCase().startsWith("github")},Te={name:()=>"gitlab",defaultBranch:()=>"main",resolveRaw:async(e,t)=>{let r=await Te.info(e);return new URL(`${encodeURIComponent(t)}/raw?ref=${r.ref}`,`https://gitlab.com/api/v4/projects/${encodeURIComponent(`${r.owner}/${r.repoName}`)}/repository/files/`)},fetchRaw:async(e,t,{verbose:r}={})=>{let o=await de.info(e),n=await Te.resolveRaw(o,t);r?.(`Trying to fetch from ${n}`);try{let s=ne().get(`${Te.name()}-token`),i=new Headers;s!==void 0&&i.append("PRIVATE-TOKEN",`${s}`);let a=await gt(n,{headers:i});return r?.(`Got a response from ${n} ${a.status} ${a.statusText}`),a.ok?E(await a.text()):qe(o,t,Te.defaultBranch())}catch{return qe(o,t,Te.defaultBranch())}},fetchManifest:async e=>{let t=await Te.fetchRaw(e,be);if(t.isErr())return S(t.unwrapErr());let r=C.safeParse(C.array(jt),JSON.parse(t.unwrap()));return r.success?E(r.output):S(`Error parsing categories: ${r.issues}`)},info:async e=>{if(typeof e!="string")return e;let t=e.replaceAll(/(https:\/\/gitlab.com\/)|(gitlab\/)/g,""),[r,o,...n]=t.split("/"),s=Te.defaultBranch(),i="heads";if(n[0]==="-"&&n[1]==="tree")if(n[2].includes("?")){let[a,d]=n[2].split("?");s=a,d.startsWith("ref_type=")&&d.slice(10)==="tags"&&(i="tags");}else s=n[2];else try{let a=ne().get(`${Te.name()}-token`),d=new Headers;a!==void 0&&d.append("Authorization",`Bearer ${a}`);let c=await gt(`https://gitlab.com/api/v4/projects/${encodeURIComponent(`${r}/${o}`)}`,{headers:d});c.ok&&(s=(await c.json()).default_branch);}catch{}return {refs:i,url:e,name:Te.name(),repoName:o,owner:r,ref:s,provider:Te}},matches:e=>e.toLowerCase().startsWith("https://gitlab.com")||e.toLowerCase().startsWith("gitlab")},ke={name:()=>"bitbucket",defaultBranch:()=>"master",resolveRaw:async(e,t)=>{let r=await ke.info(e);return new URL(t,`https://api.bitbucket.org/2.0/repositories/${r.owner}/${r.repoName}/src/${r.ref}/`)},fetchRaw:async(e,t,{verbose:r}={})=>{let o=await ke.info(e),n=await ke.resolveRaw(o,t);r?.(`Trying to fetch from ${n}`);try{let s=ne().get(`${ke.name()}-token`),i=new Headers;s!==void 0&&i.append("Authorization",`Bearer ${s}`);let a=await gt(n,{headers:i});return r?.(`Got a response from ${n} ${a.status} ${a.statusText}`),a.ok?E(await a.text()):qe(o,t,ke.defaultBranch())}catch{return qe(o,t,ke.defaultBranch())}},fetchManifest:async e=>{let t=await ke.fetchRaw(e,be);if(t.isErr())return S(t.unwrapErr());let r=C.safeParse(C.array(jt),JSON.parse(t.unwrap()));return r.success?E(r.output):S(`Error parsing categories: ${r.issues}`)},info:async e=>{if(typeof e!="string")return e;let t=e.replaceAll(/(https:\/\/bitbucket.org\/)|(bitbucket\/)/g,""),[r,o,...n]=t.split("/"),s="heads",i=ke.defaultBranch();if(n[0]==="src")i=n[1];else try{let a=ne().get(`${ke.name()}-token`),d=new Headers;a!==void 0&&d.append("Authorization",`Bearer ${a}`);let c=await gt(`https://api.bitbucket.org/2.0/repositories/${r}/${o}`,{headers:d});c.ok&&(i=(await c.json()).mainbranch.name);}catch{}return {refs:s,url:e,name:ke.name(),repoName:o,owner:r,ref:i,provider:ke}},matches:e=>e.toLowerCase().startsWith("https://bitbucket.org")||e.toLowerCase().startsWith("bitbucket")},Pe={name:()=>"azure",defaultBranch:()=>"main",resolveRaw:async(e,t)=>{let r=await Pe.info(e),o=r.refs==="tags"?"tag":"branch";return new URL(`https://dev.azure.com/${r.owner}/${r.projectName}/_apis/git/repositories/${r.repoName}/items?path=${t}&api-version=7.2-preview.1&versionDescriptor.version=${r.ref}&versionDescriptor.versionType=${o}`)},fetchRaw:async(e,t,{verbose:r}={})=>{let o=await Pe.info(e),n=await Pe.resolveRaw(o,t);r?.(`Trying to fetch from ${n}`);try{let s=ne().get(`${Pe.name()}-token`),i=new Headers;s!==void 0&&i.append("Authorization",`Bearer ${s}`);let a=await gt(n,{headers:i});return r?.(`Got a response from ${n} ${a.status} ${a.statusText}`),a.ok?E(await a.text()):qe(o,t,Pe.defaultBranch())}catch(s){return r?.(`erroring in response ${s} `),qe(o,t,Pe.defaultBranch())}},fetchManifest:async e=>{let t=await Pe.fetchRaw(e,be);if(t.isErr())return S(t.unwrapErr());let r=C.safeParse(C.array(jt),JSON.parse(t.unwrap()));return r.success?E(r.output):S(`Error parsing categories: ${r.issues}`)},info:async e=>{if(typeof e!="string")return e;let t=e.replaceAll(/(azure\/)/g,""),[r,o,n,...s]=t.split("/"),i=Pe.defaultBranch(),a="heads";return ["tags","heads"].includes(s[0])&&(a=s[0],s[1]&&s[1]!==""&&(i=s[1])),{refs:a,url:e,name:Pe.name(),projectName:o,repoName:n,owner:r,ref:i,provider:Pe}},matches:e=>e.toLowerCase().startsWith("azure")},q=[de,Te,ke,Pe],st=async e=>{let t=q.find(r=>r.matches(e));return t?E(await t.info(e)):S(`Only ${q.map((r,o)=>`${o===q.length-1?"and":""}${P.cyan(r.name())}`).join(", ")} repositories are supported at this time!`)},Ke=async(...e)=>{let t=new Map;for(let{path:r,info:o}of e){let n=await o.provider.fetchManifest(o);if(n.isErr())return S({message:n.unwrapErr(),repo:r});let s=n.unwrap();for(let i of s)for(let a of i.blocks)t.set(`${o.name}/${o.owner}/${o.repoName}/${i.name}/${a.name}`,{...a,sourceRepo:o});}return E(t)},Ye=async(...e)=>{let t=[];for(let r of e){let o=await st(r);if(o.isErr())return S({message:o.unwrapErr(),repo:r});let n=o.unwrap();t.push({path:r,info:n});}return E(t)};var it=async(e,t,r,o=new Map)=>{let n=new Map;for(let s of e){let i;if(q.find(d=>s.startsWith(d.name()))){let[d,c,l,...y]=s.split("/");i=t.get(`${d}/${c}/${l}/${y.slice(y.length-2).join("/")}`);}else {if(r.length===0)return S(P.red(`If your config doesn't repos then you must provide the repo in the block specifier ex: \`${P.bold(`github/<owner>/<name>/${s}`)}\`!`));for(let{info:d}of r){let c=t.get(`${d.name}/${d.owner}/${d.repoName}/${s}`);if(c!==void 0){i=c;break}}}if(!i)return S(`Invalid block! ${P.bold(s)} does not exist!`);let a=`${i.category}/${i.name}`;if(n.set(a,{name:i.name,subDependency:!1,block:i}),i.localDependencies&&i.localDependencies.length>0){let d=await it(i.localDependencies.filter(c=>!n.has(c)&&!o.has(c)),t,r,n);if(d.isErr())return S(d.unwrapErr());for(let c of d.unwrap())n.set(`${c.block.category}/${c.block.name}`,c);}}return E(Tr(n,(s,i)=>i))},Ze=(e,t,r)=>{let o=[],n=$e(t.paths,r);n.isErr()&&program.error(P.red(n.unwrapErr()));let s=n.unwrap();for(let[i,a]of e){let d;s[a.category]!==void 0?d=ee.join(r,s[a.category]):d=ee.join(r,s["*"],a.category);let c=ee.join(d,a.files[0]);a.subdirectory&&(c=ee.join(d,a.name)),Le.existsSync(c)&&o.push({specifier:`${a.category}/${a.name}`,path:c,block:a});}return o};var nn={"no-workspace":"--no-workspace","install-as-dev-dependency":"-D"},sn={"install-as-dev-dependency":"-D"},an={"no-workspace":"--workspaces=false","install-as-dev-dependency":"-D"},Yr={"no-workspace":"--ignore-workspace","install-as-dev-dependency":"-D"},Zr={"no-workspace":"--focus","install-as-dev-dependency":"-D"},lr={bun:nn,npm:an,pnpm:Yr,deno:sn,yarn:Zr,"yarn@berry":Zr,"pnpm@6":Yr};var Ne=async({pm:e,deps:t,dev:r,cwd:o,ignoreWorkspace:n=!1})=>{let s=[...t];r&&s.push(lr[e]["install-as-dev-dependency"]);let i=lr[e]["no-workspace"];n&&i&&s.push(i);let a=resolveCommand$1(e,"install",s);if(a==null)return S(P.red(`Could not resolve add command for '${e}'.`));try{return await execa(a.command,[...a.args],{cwd:o}),E(t)}catch{return S(P.red(`Failed to install ${P.bold(t.join(", "))}! Failed while running '${P.bold(`${a.command} ${a.args.join(" ")}`)}'`))}},dn=/\{\{([^\/]+)\/([^\}]+)\}\}/g,Xr=({template:e,config:t,destPath:r,cwd:o})=>{let n=ee.join(r,"../");return e.replace(dn,(s,i,a)=>{if(t.paths[i]===void 0){if(t.paths["*"].startsWith(".")){let d=ee.relative(n,ee.join(o,t.paths["*"],i,a));return d.startsWith(".")?d:`./${d}`}return ee.join(t.paths["*"],i,a)}if(t.paths[i].startsWith(".")){let d=ee.relative(n,ee.join(o,t.paths[i],a));return d.startsWith(".")?d:`./${d}`}return ee.join(t.paths[i],a)})};var Ht=async({file:e,config:t,imports:r,watermark:o,prettierOptions:n,biomeOptions:s,cwd:i,verbose:a})=>{let d=ot.find(l=>l.matches(e.destPath)),c=e.content;if(d){t.watermark&&(c=`${d.comment(o)}
31
31
 
32
- ${c}`),a?.(`Formatting ${P.bold(e.destPath)}`);try{c=await p.format(c,{filePath:e.destPath,formatter:t.formatter,prettierOptions:n,biomeOptions:s});}catch(l){return T(`Error formatting ${P.bold(e.destPath)} ${l}`)}}for(let[l,y]of Object.entries(r)){let u=Hr({template:y,config:t,destPath:e.destPath,cwd:i}),k=new RegExp(`(['"])${sn(l)}\\1`,"g");c=c.replaceAll(k,`$1${u}$1`);}return I(c)};var ht=async({formatter:e,cwd:t})=>{let r=null;e==="prettier"&&(r=await Le.resolveConfig(Q.join(t,".prettierrc")));let o=null;if(e==="biome"){let n=Q.join(t,"biome.json");Ae.existsSync(n)&&(o=JSON.parse(Ae.readFileSync(n).toString()));}return {biomeOptions:o,prettierOptions:r}};var yt=(e,t)=>`jsrepo ${e}
32
+ ${c}`),a?.(`Formatting ${P.bold(e.destPath)}`);try{c=await d.format(c,{filePath:e.destPath,formatter:t.formatter,prettierOptions:n,biomeOptions:s});}catch(l){return S(`Error formatting ${P.bold(e.destPath)} ${l}`)}}for(let[l,y]of Object.entries(r)){let u=Xr({template:y,config:t,destPath:e.destPath,cwd:i}),b=new RegExp(`(['"])${pn(l)}\\1`,"g");c=c.replaceAll(b,`$1${u}$1`);}return E(c)};var yt=async({formatter:e,cwd:t})=>{let r=null;e==="prettier"&&(r=await Be.resolveConfig(ee.join(t,".prettierrc")));let o=null;if(e==="biome"){let n=ee.join(t,"biome.json");Le.existsSync(n)&&(o=JSON.parse(Le.readFileSync(n).toString()));}return {biomeOptions:o,prettierOptions:r}};var vt=(e,t)=>`jsrepo ${e}
33
33
  Installed from ${t}
34
- ${new Date().toLocaleDateString().replaceAll("/","-")}`;var xt=async(e,{verbose:t=void 0})=>{let r=spinner();for(let o of e){t?t(o.loadingMessage):r.start(o.loadingMessage);try{await o.run();}catch(n){r.stop(`Error while ${o.loadingMessage}`),console.error(n);}t?t(o.completedMessage):r.stop(o.completedMessage);}},Gt=async({tasks:e,startMessage:t,stopMessage:r,verbose:o})=>{let n=spinner(),s=i=>{o?o(i):n.message(i);};o?o(t):n.start(t),await Promise.all([...e.map(i=>i.run({message:s}))]),o?o(r):n.stop(r);},vt=e=>{let t=20;e.map(n=>{let s=Nr(rt(n),4);s.length>t&&(t=s.length);});let r="Next Steps",o=`${W}
35
- `;return o+=`${Xt} ${r} ${Yt.repeat(t-r.length-1)}${Rr}
36
- `,o+=`${W} ${" ".repeat(t)} ${W}
37
- `,e.map(n=>{o+=`${W} ${Or(n,t-1)} ${W}
38
- `;}),o+=`${W} ${" ".repeat(t)} ${W}
39
- `,o+=`${Xt}${Yt.repeat(t+2)}${Cr}
40
- `,o},eo=(e,t=3)=>{let r=e.slice(0,t),o=e.length-r.length;return `${r.join(", ")}${o>0?` and ${o} other(s)`:""}`},ne=e=>intro(`${P.bgHex("#f7df1e").black(" jsrepo ")}${P.gray(` v${e} `)}`);var hn=C.object({repo:C.optional(C.string()),allow:C.boolean(),yes:C.boolean(),verbose:C.boolean(),cwd:C.string()}),ir=new Command("add").argument("[blocks...]","Names of the blocks you want to add to your project. ex: (utils/math, github/ieedan/std/utils/math)").option("--repo <repo>","Repository to download the blocks from.").option("-A, --allow","Allow jsrepo to download code from the provided repo.",!1).option("-y, --yes","Skip confirmation prompt.",!1).option("--verbose","Include debug logs.",!1).option("--cwd <path>","The current working directory.",process.cwd()).action(async(e,t)=>{let r=C.parse(hn,t);ne(X.package.version),await yn(e,r),outro(P.green("All done!"));}),yn=async(e,t)=>{let r=h=>{t.verbose&&console.info(`${ft} ${h}`);};r(`Attempting to add ${JSON.stringify(e)}`);let o=spinner(),n=we(t.cwd),s=n.isErr(),i;if(n.isErr()){let h=t.yes;if(!t.yes){let S=await confirm({message:`You don't have ${fe} initialized in your project. Do you want to continue?`,initialValue:!1});isCancel(S)&&(cancel("Canceled!"),process.exit(0)),h=S;}h||(cancel("Canceled!"),process.exit(0)),i={$schema:"",includeTests:!1,watermark:!0,paths:{"*":"./src/blocks"},repos:[]};}else i=n.unwrap();let a=i.repos;t.repo&&(a=[t.repo]);for(let h of e){if(!q.find(j=>h.startsWith(j.name())))continue;let[S,d,w,...$]=h.split("/"),v;if($.length>2?v=`${S}/${d}/${w}/${$.slice(0,$.length-2).join("/")}`:v=`${S}/${d}/${w}`,!a.find(j=>j===v)){if(!t.allow){let j=await confirm({message:`Allow ${fe} to download and run code from ${P.cyan(v)}?`,initialValue:!0});(isCancel(j)||!j)&&(cancel("Canceled!"),process.exit(0));}a.push(v);}}if(!t.allow&&t.repo){let h=await confirm({message:`Allow ${fe} to download and run code from ${P.cyan(t.repo)}?`,initialValue:!0});(isCancel(h)||!h)&&(cancel("Canceled!"),process.exit(0));}a.length===0&&(s&&program.error(P.red(`Fully quality blocks ex: (github/ieedan/std/utils/math) or provide the \`${P.bold("--repo")}\` flag to specify a registry.`)),program.error(P.red(`There were no repos present in your config and you didn't provide the \`${P.bold("--repo")}\` flag with a repo.`))),r(`Resolving ${P.cyan(a.join(", "))}`),t.verbose||o.start(`Fetching blocks from ${P.cyan(a.join(", "))}`);let p=(await Ke(...a)).match(h=>h,({repo:h,message:S})=>{o.stop(`Failed to get info for ${P.cyan(h)}`),program.error(P.red(S));});r(`Resolved ${P.cyan(a.join(", "))}`),r(`Fetching blocks from ${P.cyan(a.join(", "))}`);let c=(await qe(...p)).match(h=>h,({repo:h,message:S})=>{o.stop(`Failed fetching blocks from ${P.cyan(h)}`),program.error(P.red(S));});t.verbose||o.stop(`Retrieved blocks from ${P.cyan(a.join(", "))}`),r(`Retrieved blocks from ${P.cyan(a.join(", "))}`);let l=Ye(c,i,t.cwd).map(h=>h.specifier),y=e;if(y.length===0){let h=await multiselect({message:"Select which blocks to add.",options:Array.from(c.entries()).filter(([S,d])=>d.list).map(([S,d])=>{let w=`${d.category}/${d.name}`,$=l.findIndex(j=>j===w)!==-1,v;return a.length>1?v=`${P.cyan(`${d.sourceRepo.name}/${d.sourceRepo.owner}/${d.sourceRepo.repoName}/${d.category}`)}/${d.name}`:v=`${P.cyan(d.category)}/${d.name}`,{label:$?P.gray(v):v,value:S,hint:$?"Installed":void 0}}),required:!0});isCancel(h)&&(cancel("Canceled!"),process.exit(0)),y=h;}r(`Installing blocks ${P.cyan(y.join(", "))}`),t.verbose&&console.log("Blocks map: ",c);let u=(await it(y,c,p)).match(h=>h,h=>program.error(h)),k=(await detect({cwd:t.cwd}))?.agent??"npm",x=[],A=new Set,m=new Set,R=le();if(s){let h=`${t.cwd}-zero-config`,S=C.safeParse(er,R.get(h)),d=S.success?S.output:i,w=Array.from(new Set(u.map(j=>j.block.category)));for(let j of w){let z=await text({message:`Where would you like to add ${P.cyan(j)}?`,placeholder:d?d.paths[j]:`./src/${j}`,initialValue:d?d.paths[j]:`./src/${j}`,defaultValue:d?d.paths[j]:`./src/${j}`,validate(ce){if(ce.trim()==="")return "Please provide a value"}});isCancel(z)&&(cancel("Canceled!"),process.exit(0)),i.paths[j]=z;}if(!t.yes){let j=await confirm({message:"Include tests?",initialValue:d.includeTests});isCancel(j)&&(cancel("Canceled!"),process.exit(0)),i.includeTests=j;let z=await confirm({message:"Add watermark?",initialValue:d.watermark});isCancel(z)&&(cancel("Canceled!"),process.exit(0)),i.watermark=z;}let $="none";Ae.existsSync(Q.join(t.cwd,".prettierrc"))&&($="prettier"),Ae.existsSync(Q.join(t.cwd,"biome.json"))&&($="biome");let v=await select({message:"What formatter would you like to use?",options:["Prettier","Biome","None"].map(j=>({value:j.toLowerCase(),label:j})),initialValue:$==="none"?d.formatter?d.formatter:"none":$});isCancel(v)&&(cancel("Canceled!"),process.exit(0)),v!=="none"&&(i.formatter=v),R.set(h,i);}let{prettierOptions:M,biomeOptions:F}=await ht({formatter:i.formatter,cwd:t.cwd}),L=$e(i.paths,t.cwd);L.isErr()&&program.error(P.red(L.unwrapErr()));let f=L.unwrap(),g=[],E;for(let{block:h}of u){let S=`${h.sourceRepo.url}/${h.category}/${h.name}`,d=`${h.category}/${h.name}`,w=yt(X.package.version,h.sourceRepo.url),$=h.sourceRepo;r(`Setting up ${S}`);let v;if(f[h.category]!==void 0?v=Q.join(t.cwd,f[h.category]):v=Q.join(t.cwd,f["*"],h.category),l.find(z=>d===z)&&!t.yes&&!E){if(E===void 0){let z=u.map(ye=>`${ye.block.category}/${ye.block.name}`).filter(ye=>l.find(N=>N===ye));log.warn(`The following components ${P.bold.yellow("already exist")}: ${P.cyan(eo(z))}`);let ce=await confirm({message:`Would you like to ${P.bold.red("overwrite")} all existing components?`,active:"Yes, overwrite everything",inactive:"No, let me decide individually",initialValue:!1});isCancel(ce)&&(cancel("Canceled!"),process.exit(0)),E=ce;}if(!E){let z=await confirm({message:`${P.cyan(d)} already exists in your project would you like to overwrite it?`,initialValue:!1});if(isCancel(z)&&(cancel("Canceled!"),process.exit(0)),!z)continue}}g.push(d),x.push({run:async({message:z})=>{z(`Adding ${P.cyan(S)}`),r(`Creating directory ${P.bold(v)}`),Ae.mkdirSync(v,{recursive:!0}),r(`Created directory ${P.bold(v)}`);let ce=[],ye=async N=>{let B=await $.provider.fetchRaw($,N,{verbose:r});return B.isErr()&&(o.stop(P.red(`Error fetching ${P.bold(N)}`)),program.error(P.red(`There was an error trying to get ${S}`))),B.unwrap()};for(let N of h.files){if(!i.includeTests&&ue(N))continue;let B=Q.join(h.directory,N),ee;h.subdirectory?ee=Q.join(v,h.name,N):ee=Q.join(v,N),r(`Adding ${P.bold(B)}`);let et=await ye(B),ze=ee.slice(0,ee.length-N.length);r(`Creating directory ${P.bold(ze)}`),Ae.mkdirSync(ze,{recursive:!0}),r(`Created directory ${P.bold(ze)}`),ce.push({content:et,destPath:ee}),r(`Got ${P.bold(B)}`);}for(let N of ce){let B=await Ut({file:N,biomeOptions:F,prettierOptions:M,config:i,imports:h._imports_,watermark:w,verbose:r,cwd:t.cwd});B.isErr()&&program.error(P.red(B.unwrapErr())),r(`Writing to ${P.bold(N.destPath)}`),Ae.writeFileSync(N.destPath,B.unwrap());}if(i.includeTests&&h.tests){r("Trying to include tests");let{devDependencies:N}=JSON.parse(Ae.readFileSync(Q.join(t.cwd,"package.json")).toString());(N===void 0||N.vitest===void 0)&&A.add("vitest");}for(let N of h.devDependencies)A.add(N);for(let N of h.dependencies)m.add(N);}});}await Gt({startMessage:"Adding blocks",stopMessage:`Added ${P.cyan(g.join(", "))}`,tasks:x,verbose:t.verbose?r:void 0});let b=Dt(m,A,{cwd:t.cwd});if(m=b.dependencies,A=b.devDependencies,m.size>0||A.size>0){let h=t.yes;if(!t.yes){let w=await confirm({message:"Would you like to install dependencies?",initialValue:!0});isCancel(w)&&(cancel("Canceled!"),process.exit(0)),h=w;}h&&(m.size>0&&(t.verbose||o.start(`Installing dependencies with ${P.cyan(k)}`),(await Ne({pm:k,deps:Array.from(m),dev:!1,cwd:t.cwd})).match(w=>{t.verbose||o.stop(`Installed ${P.cyan(w.join(", "))}`);},w=>{t.verbose||o.stop("Failed to install dependencies"),program.error(w);})),A.size>0&&(t.verbose||o.start(`Installing dependencies with ${P.cyan(k)}`),(await Ne({pm:k,deps:Array.from(A),dev:!0,cwd:t.cwd})).match(w=>{t.verbose||o.stop(`Installed ${P.cyan(w.join(", "))}`);},w=>{t.verbose||o.stop("Failed to install dev dependencies"),program.error(w);})));let S=[];if(!h){if(m.size>0){let w=resolveCommand(k,"install",[...m]);S.push(`Install dependencies \`${P.cyan(`${w?.command} ${w?.args.join(" ")}`)}\``);}if(A.size>0){let w=resolveCommand(k,"install",[...A,"-D"]);S.push(`Install dev dependencies \`${P.cyan(`${w?.command} ${w?.args.join(" ")}`)}\``);}}S=S.map((w,$)=>`${$+1}. ${w}`),h||S.push(""),S.push("Import and use the blocks!");let d=vt(S);process.stdout.write(d);}};var Cn=C.object({token:C.optional(C.string()),provider:C.optional(C.string()),logout:C.boolean()}),lr=new Command("auth").description("Provide a token for access to private repositories.").option("--token <token>","The token to use for authenticating to your provider.").addOption(new Option("--provider <name>","The provider this token belongs to.").choices(q.map(e=>e.name()))).option("--logout","Erase tokens from each provider from storage.",!1).action(async e=>{let t=C.parse(Cn,e);ne(X.package.version),await xn(t),outro(P.green("All done!"));}),xn=async e=>{let t=le();if(e.logout){for(let r of q){let o=`${r.name()}-token`;if(t.get(o)===void 0){process.stdout.write(`${W}
41
- `),process.stdout.write(P.gray(`${W} Already logged out of ${r.name()}.
42
- `));continue}let n=await confirm({message:`Remove ${r.name()} token?`,initialValue:!0});isCancel(n)&&(cancel("Canceled!"),process.exit(0)),n&&t.delete(o);}return}if(q.length>1){let r=await select({message:"Which provider is this token for?",options:q.map(o=>({label:o.name(),value:o.name()})),initialValue:q[0].name()});isCancel(r)&&(cancel("Canceled!"),process.exit(0)),e.provider=r;}else e.provider=q[0].name();if(e.token===void 0){let r=await password({message:"Paste your token",validate(o){if(o.trim()==="")return "Please provide a value"}});(isCancel(r)||!r)&&(cancel("Canceled!"),process.exit(0)),e.token=r;}t.set(`${e.provider}-token`,e.token);};var Sn=C.object({dirs:C.optional(C.array(C.string())),includeBlocks:C.optional(C.array(C.string())),includeCategories:C.optional(C.array(C.string())),excludeBlocks:C.optional(C.array(C.string())),excludeCategories:C.optional(C.array(C.string())),excludeDeps:C.optional(C.array(C.string())),listBlocks:C.optional(C.array(C.string())),listCategories:C.optional(C.array(C.string())),doNotListBlocks:C.optional(C.array(C.string())),doNotListCategories:C.optional(C.array(C.string())),preview:C.optional(C.boolean()),output:C.boolean(),verbose:C.boolean(),cwd:C.string()}),pr=new Command("build").description(`Builds the provided --dirs in the project root into a \`${ke}\` file.`).option("--dirs [dirs...]","The directories containing the blocks.").option("--include-blocks [blockNames...]","Include only the blocks with these names.").option("--include-categories [categoryNames...]","Include only the categories with these names.").option("--exclude-blocks [blockNames...]","Do not include the blocks with these names.").option("--exclude-categories [categoryNames...]","Do not include the categories with these names.").option("--list-blocks [blockNames...]","List only the blocks with these names.").option("--list-categories [categoryNames...]","List only the categories with these names.").option("--do-not-list-blocks [blockNames...]","Do not list the blocks with these names.").option("--do-not-list-categories [categoryNames...]","Do not list the categories with these names.").option("--exclude-deps [deps...]","Dependencies that should not be added.").option("--preview","Display a preview of the blocks list.").option("--no-output",`Do not output a \`${ke}\` file.`).option("--verbose","Include debug logs.",!1).option("--cwd <path>","The current working directory.",process.cwd()).action(async e=>{let t=C.parse(Sn,e);ne(X.package.version),await Pn(t),outro(P.green("All done!"));}),Pn=async e=>{let t=spinner(),r=[],o=Ot(e.cwd).match(c=>{if(c===null)return {$schema:"",dirs:e.dirs??[],doNotListBlocks:e.doNotListBlocks??[],doNotListCategories:e.doNotListCategories??[],listBlocks:e.listBlocks??[],listCategories:e.listCategories??[],excludeDeps:e.excludeDeps??[],includeBlocks:e.includeBlocks??[],includeCategories:e.includeCategories??[],excludeBlocks:e.excludeBlocks??[],excludeCategories:e.excludeCategories??[],preview:e.preview};let l=c;return e.dirs&&(l.dirs=e.dirs),e.doNotListBlocks&&(l.doNotListBlocks=e.doNotListBlocks),e.doNotListCategories&&(l.doNotListCategories=e.doNotListCategories),e.listBlocks&&(l.listBlocks=e.listBlocks),e.listCategories&&(l.listCategories=e.listCategories),e.includeBlocks&&(l.includeBlocks=e.includeBlocks),e.includeCategories&&(l.includeCategories=e.includeCategories),e.excludeBlocks&&(l.excludeBlocks=e.excludeBlocks),e.excludeCategories&&(l.excludeCategories=e.excludeCategories),e.excludeDeps&&(l.excludeDeps=e.excludeDeps),e.preview!==void 0&&(l.preview=e.preview),l.rules={...Zt,...l.rules},l},c=>program.error(P.red(c))),n=Q.join(e.cwd,ke);for(let c of o.dirs){let l=Q.join(e.cwd,c);t.start(`Building ${P.cyan(l)}`),e.output&&Ae.existsSync(n)&&Ae.rmSync(n);let y=Jr(l,{cwd:e.cwd,config:o});for(let u of y){if(r.find(k=>k.name===u.name)!==void 0){console.warn(`${W} ${Ie} Skipped adding \`${P.cyan(`${c}/${u.name}`)}\` because a category with the same name already exists!`);continue}r.push(u);}t.stop(`Built ${P.cyan(l)}`);}t.start("Checking manifest");let{warnings:s,errors:i}=Ir(r,o,o.rules);t.stop("Completed checking manifest."),(s.length>0||i.length>0)&&console.log(W);for(let c of s)console.log(c);if(i.length>0){for(let c of i)console.log(c);program.error(P.red(`Completed checking manifest with ${P.bold(`${i.length} error(s)`)} and ${P.bold(`${s.length} warning(s)`)}`));}let[a,p]=zr(r);if(r=a,p>0&&log.step(`Removed ${p} unused block${p>1?"s":""}.`),o.preview){let c=r.flatMap(l=>l.blocks.filter(y=>y.list).map(y=>`${P.cyan(y.category)}/${y.name}`));log.message(`${P.yellow("Preview")}:`);for(let l of c)console.log(`${W} \u25FB ${l}`);}e.output&&(t.start(`Writing output to \`${P.cyan(n)}\``),Ae.writeFileSync(n,JSON.stringify(r,null," ")),t.stop(`Wrote output to \`${P.cyan(n)}\``));};var io=(e,t)=>{let r=0;for(let o of e)r=r+t(o);return r};var ao=e=>/^\s+$/g.test(e),$t=e=>{let t=e.length-1;for(;ao(e[t])&&t>=0;){if(e[t]===`
43
- `)return e[t-1]==="\r"?e.slice(0,t-1):e.slice(0,t);t--;}return e},Ht=({from:e,to:t,changes:r,expand:o=!1,maxUnchanged:n=5,colorRemoved:s=P.red,colorAdded:i=P.green,colorCharsRemoved:a=P.bgRed,colorCharsAdded:p=P.bgGreen,prefix:c,onUnchanged:l,intro:y})=>{let u="",k=io(r,m=>m.count??0).toString().length+1,x=0;if(r.length===1&&!r[0].added&&!r[0].removed)return l({from:e,to:t,changes:r,expand:o,maxUnchanged:n,colorAdded:i,colorRemoved:s,prefix:c,onUnchanged:l,intro:y});u+=y({from:e,to:t,changes:r,expand:o,maxUnchanged:n,colorAdded:i,colorRemoved:s,prefix:c,onUnchanged:l,intro:y});let A=m=>P.gray(`${c?.()??""}${Rt(`${m+1+x} `,k)} `);for(let m=0;m<r.length;m++){let R=r[m],M=r[m-1]?.added||r[m-1]?.removed,F=r[m+1]?.added||r[m+1]?.removed;if(!R.added&&!R.removed){if(!o&&R.count!==void 0&&R.count>n){let g=x,E=re($t(R.value)),b=0;if(F&&(b+=n),M&&(b+=n),b>=E.length){u+=`${Z(E,{prefix:A})}
44
- `,x+=E.length;continue}if(M&&(u+=`${Z(E.slice(0,n),{prefix:A})}
45
- `),E.length>b){let _=E.length-b;u+=`${Z(re(P.gray(`+ ${_} more unchanged (${P.italic("-E to expand")})`)),{prefix:()=>`${c?.()??""}${Rt(" ",k)} `})}
46
- `;}F&&(x=x+E.length-n,u+=`${Z(E.slice(E.length-n),{prefix:A})}
47
- `),x=g+R.count;continue}u+=`${Z(re($t(R.value)),{prefix:A})}
48
- `,x+=R.count??0;continue}let L=g=>g.added?i($t(g.value)):g.removed?s($t(g.value)):g.value,f=g=>g.added?p($t(g.value)):g.removed?a($t(g.value)):g.value;if(R.removed&&R.count===1&&r[m+1]?.added&&r[m+1]?.count===1){let E=diffChars(R.value,r[m+1].value).map(b=>f(b)).join("");u+=`${A(0)}${E}`,x+=1,m++;}else ao(R.value)?(u+=`${Z(re(f(R)),{prefix:g=>`${A(g)}${f({removed:!0,value:" ",added:!1})}`})}
49
- `,R.removed||(x+=R.count??0)):(u+=`${Z(re(L(R)),{prefix:A})}
50
- `,R.removed||(x+=R.count??0));}return u};var _n=C.object({expand:C.boolean(),maxUnchanged:C.number(),repo:C.optional(C.string()),allow:C.boolean(),cwd:C.string()}),fr=new Command("diff").description("Compares local blocks to the blocks in the provided repository.").option("-E, --expand","Expands the diff so you see everything.",!1).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.",!1).option("--cwd <path>","The current working directory.",process.cwd()).action(async e=>{let t=C.parse(_n,e);ne(X.package.version),await Wn(t),outro(P.green("All done!"));}),Wn=async e=>{let t=spinner(),r=we(e.cwd).match(c=>c,c=>program.error(P.red(c))),o=r.repos;if(e.repo&&(o=[e.repo]),!e.allow&&e.repo){let c=await confirm({message:`Allow ${P.cyan("jsrepo")} to download and run code from ${P.cyan(e.repo)}?`,initialValue:!0});(isCancel(c)||!c)&&(cancel("Canceled!"),process.exit(0));}t.start(`Fetching blocks from ${P.cyan(o.join(", "))}`);let n=(await Ke(...o)).match(c=>c,({repo:c,message:l})=>{t.stop(`Failed to get info for ${P.cyan(c)}`),program.error(P.red(l));}),s=(await qe(...n)).match(c=>c,({repo:c,message:l})=>{t.stop(`Failed fetching blocks from ${P.cyan(c)}`),program.error(P.red(l));});t.stop(`Retrieved blocks from ${P.cyan(o.join(", "))}`);let i=Ye(s,r,e.cwd),a=$e(r.paths,e.cwd);a.isErr()&&program.error(P.red(a.unwrapErr()));let p=a.unwrap();for(let c of i){let l=!1;for(let y of o){let u=(await st(y)).unwrap(),k=`${u.name}/${u.owner}/${u.repoName}/${c.specifier}`,x=s.get(k);if(x===void 0)continue;let A=yt(X.package.version,y);l=!0,process.stdout.write(`${W}
51
- `),process.stdout.write(`${W} ${k}
52
- `);for(let m of x.files){if(!r.includeTests&&ue(m))continue;process.stdout.write(`${W}
53
- `);let R=Q.join(x.directory,m),M=await u.provider.fetchRaw(u,R);M.isErr()&&program.error(P.red(`There was an error trying to get ${k}`));let F=M.unwrap(),L,f;p[x.category]!==void 0?(f=p[x.category],L=Q.join(e.cwd,p[x.category])):(f=Q.join(p["*"],x.category),L=Q.join(e.cwd,p["*"],x.category));let g=Q.join(L,m),E=Q.join(f,m);x.subdirectory&&(g=Q.join(L,x.name,m),E=Q.join(f,x.name,m));let b="";if(Ae.existsSync(g)&&(b=Ae.readFileSync(g).toString()),r.watermark){let d=ot.find(w=>w.matches(R));d&&(F=`${d.comment(A)}
34
+ ${new Date().toLocaleDateString().replaceAll("/","-")}`;var It=async(e,{verbose:t=void 0})=>{let r=spinner();for(let o of e){t?t(o.loadingMessage):r.start(o.loadingMessage);try{await o.run();}catch(n){r.stop(`Error while ${o.loadingMessage}`),console.error(n);}t?t(o.completedMessage):r.stop(o.completedMessage);}},qt=async({tasks:e,startMessage:t,stopMessage:r,verbose:o})=>{let n=spinner(),s=i=>{o?o(i):n.message(i);};o?o(t):n.start(t),await Promise.all([...e.map(i=>i.run({message:s}))]),o?o(r):n.stop(r);},wt=e=>{let t=20;e.map(n=>{let s=Br(De(n),4);s.length>t&&(t=s.length);});let r="Next Steps",o=`${O}
35
+ `;return o+=`${er} ${r} ${Ct.repeat(t-r.length-1)}${Xt}
36
+ `,o+=`${O} ${" ".repeat(t)} ${O}
37
+ `,e.map(n=>{o+=`${O} ${Fr(n,t-1)} ${O}
38
+ `;}),o+=`${O} ${" ".repeat(t)} ${O}
39
+ `,o+=`${er}${Ct.repeat(t+2)}${Qt}
40
+ `,o},no=(e,t=3)=>{let r=e.slice(0,t),o=e.length-r.length;return `${r.join(", ")}${o>0?` and ${o} other(s)`:""}`},hn=(e,t,r)=>{let o=detectSync({cwd:process.cwd()})?.agent??"npm",n=resolveCommand$1(o,"global",["jsrepo@latest"]),s=[`Update available! ${P.redBright(t)} -> ${P.greenBright(r)}`,`${P.cyan("Changelog")}: https://github.com/ieedan/jsrepo/releases/tag/${e}@${r}`,`Run ${P.cyan(`${n?.command} ${n?.args.join(" ")}`)} to update!`,"",`${P.yellowBright("Star")} on GitHub for updates: https://github.com/ieedan/jsrepo`],i=30;s.map(d=>{let c=De(d);c.length+4>i&&(i=c.length+4);});let a=`
41
+ `;a+=`${Ir}${Ct.repeat(i)}${Xt}
42
+ `,a+=`${O}${" ".repeat(i)}${O}
43
+ `;for(let d of s)a+=`${O}${_r(d,i)}${O}
44
+ `;return a+=`${O}${" ".repeat(i)}${O}
45
+ `,a+=`${Sr}${Ct.repeat(i)}${Qt}
46
+ `,Z(Q(a),{prefix:()=>" "})},se=({package:e})=>{console.clear(),e.latestVersion&&gn.lt(e.version,e.latestVersion)&&console.info(hn(e.name,e.version,e.latestVersion)),intro(`${P.bgHex("#f7df1e").black(` ${e.name} `)}${P.gray(` v${e.version} `)}`);};var xn=C.object({repo:C.optional(C.string()),allow:C.boolean(),yes:C.boolean(),verbose:C.boolean(),cwd:C.string()}),dr=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)").option("--repo <repo>","Repository to download the blocks from.").option("-A, --allow","Allow jsrepo to download code from the provided repo.",!1).option("-y, --yes","Skip confirmation prompt.",!1).option("--verbose","Include debug logs.",!1).option("--cwd <path>","The current working directory.",process.cwd()).action(async(e,t)=>{let r=C.parse(xn,t);se(X),await jn(e,r),outro(P.green("All done!"));}),jn=async(e,t)=>{let r=h=>{t.verbose&&console.info(`${mt} ${h}`);};r(`Attempting to add ${JSON.stringify(e)}`);let o=spinner(),n=we(t.cwd),s=n.isErr(),i;if(n.isErr()){let h=t.yes;if(!t.yes){let T=await confirm({message:`You don't have ${fe} initialized in your project. Do you want to continue?`,initialValue:!1});isCancel(T)&&(cancel("Canceled!"),process.exit(0)),h=T;}h||(cancel("Canceled!"),process.exit(0)),i={$schema:"",includeTests:!1,watermark:!0,paths:{"*":"./src/blocks"},repos:[]};}else i=n.unwrap();let a=i.repos;t.repo&&(a=[t.repo]);for(let h of e){if(!q.find(j=>h.startsWith(j.name())))continue;let[T,p,w,...$]=h.split("/"),v;if($.length>2?v=`${T}/${p}/${w}/${$.slice(0,$.length-2).join("/")}`:v=`${T}/${p}/${w}`,!a.find(j=>j===v)){if(!t.allow){let j=await confirm({message:`Allow ${fe} to download and run code from ${P.cyan(v)}?`,initialValue:!0});(isCancel(j)||!j)&&(cancel("Canceled!"),process.exit(0));}a.push(v);}}if(!t.allow&&t.repo){let h=await confirm({message:`Allow ${fe} to download and run code from ${P.cyan(t.repo)}?`,initialValue:!0});(isCancel(h)||!h)&&(cancel("Canceled!"),process.exit(0));}a.length===0&&(s&&program.error(P.red(`Fully quality blocks ex: (github/ieedan/std/utils/math) or provide the \`${P.bold("--repo")}\` flag to specify a registry.`)),program.error(P.red(`There were no repos present in your config and you didn't provide the \`${P.bold("--repo")}\` flag with a repo.`))),r(`Resolving ${P.cyan(a.join(", "))}`),t.verbose||o.start(`Fetching blocks from ${P.cyan(a.join(", "))}`);let d=(await Ye(...a)).match(h=>h,({repo:h,message:T})=>{o.stop(`Failed to get info for ${P.cyan(h)}`),program.error(P.red(T));});r(`Resolved ${P.cyan(a.join(", "))}`),r(`Fetching blocks from ${P.cyan(a.join(", "))}`);let c=(await Ke(...d)).match(h=>h,({repo:h,message:T})=>{o.stop(`Failed fetching blocks from ${P.cyan(h)}`),program.error(P.red(T));});t.verbose||o.stop(`Retrieved blocks from ${P.cyan(a.join(", "))}`),r(`Retrieved blocks from ${P.cyan(a.join(", "))}`);let l=Ze(c,i,t.cwd).map(h=>h.specifier),y=e;if(y.length===0){let h=await multiselect({message:"Select which blocks to add.",options:Array.from(c.entries()).filter(([T,p])=>p.list).map(([T,p])=>{let w=`${p.category}/${p.name}`,$=l.findIndex(j=>j===w)!==-1,v;return a.length>1?v=`${P.cyan(`${p.sourceRepo.name}/${p.sourceRepo.owner}/${p.sourceRepo.repoName}/${p.category}`)}/${p.name}`:v=`${P.cyan(p.category)}/${p.name}`,{label:$?P.gray(v):v,value:T,hint:$?"Installed":void 0}}),required:!0});isCancel(h)&&(cancel("Canceled!"),process.exit(0)),y=h;}r(`Installing blocks ${P.cyan(y.join(", "))}`),t.verbose&&console.log("Blocks map: ",c);let u=(await it(y,c,d)).match(h=>h,h=>program.error(h)),b=(await detect({cwd:t.cwd}))?.agent??"npm",x=[],L=new Set,m=new Set,R=ne();if(s){let h=`${t.cwd}-zero-config`,T=C.safeParse(or,R.get(h)),p=T.success?T.output:i,w=Array.from(new Set(u.map(j=>j.block.category)));for(let j of w){let z=await text({message:`Where would you like to add ${P.cyan(j)}?`,placeholder:p?p.paths[j]:`./src/${j}`,initialValue:p?p.paths[j]:`./src/${j}`,defaultValue:p?p.paths[j]:`./src/${j}`,validate(le){if(le.trim()==="")return "Please provide a value"}});isCancel(z)&&(cancel("Canceled!"),process.exit(0)),i.paths[j]=z;}if(!t.yes){let j=await confirm({message:"Include tests?",initialValue:p.includeTests});isCancel(j)&&(cancel("Canceled!"),process.exit(0)),i.includeTests=j;let z=await confirm({message:"Add watermark?",initialValue:p.watermark});isCancel(z)&&(cancel("Canceled!"),process.exit(0)),i.watermark=z;}let $="none";Le.existsSync(ee.join(t.cwd,".prettierrc"))&&($="prettier"),Le.existsSync(ee.join(t.cwd,"biome.json"))&&($="biome");let v=await select({message:"What formatter would you like to use?",options:["Prettier","Biome","None"].map(j=>({value:j.toLowerCase(),label:j})),initialValue:$==="none"?p.formatter?p.formatter:"none":$});isCancel(v)&&(cancel("Canceled!"),process.exit(0)),v!=="none"&&(i.formatter=v),R.set(h,i);}let{prettierOptions:M,biomeOptions:_}=await yt({formatter:i.formatter,cwd:t.cwd}),B=$e(i.paths,t.cwd);B.isErr()&&program.error(P.red(B.unwrapErr()));let f=B.unwrap(),g=[],I;for(let{block:h}of u){let T=`${h.sourceRepo.url}/${h.category}/${h.name}`,p=`${h.category}/${h.name}`,w=vt(X.package.version,h.sourceRepo.url),$=h.sourceRepo;r(`Setting up ${T}`);let v;if(f[h.category]!==void 0?v=ee.join(t.cwd,f[h.category]):v=ee.join(t.cwd,f["*"],h.category),l.find(z=>p===z)&&!t.yes&&!I){if(I===void 0){let z=u.map(ye=>`${ye.block.category}/${ye.block.name}`).filter(ye=>l.find(N=>N===ye));log.warn(`The following components ${P.bold.yellow("already exist")}: ${P.cyan(no(z))}`);let le=await confirm({message:`Would you like to ${P.bold.red("overwrite")} all existing components?`,active:"Yes, overwrite everything",inactive:"No, let me decide individually",initialValue:!1});isCancel(le)&&(cancel("Canceled!"),process.exit(0)),I=le;}if(!I){let z=await confirm({message:`${P.cyan(p)} already exists in your project would you like to overwrite it?`,initialValue:!1});if(isCancel(z)&&(cancel("Canceled!"),process.exit(0)),!z)continue}}g.push(p),x.push({run:async({message:z})=>{z(`Adding ${P.cyan(T)}`),r(`Creating directory ${P.bold(v)}`),Le.mkdirSync(v,{recursive:!0}),r(`Created directory ${P.bold(v)}`);let le=[],ye=async N=>{let F=await $.provider.fetchRaw($,N,{verbose:r});return F.isErr()&&(o.stop(P.red(`Error fetching ${P.bold(N)}`)),program.error(P.red(`There was an error trying to get ${T}`))),F.unwrap()};for(let N of h.files){if(!i.includeTests&&ue(N))continue;let F=ee.join(h.directory,N),te;h.subdirectory?te=ee.join(v,h.name,N):te=ee.join(v,N),r(`Adding ${P.bold(F)}`);let tt=await ye(F),Ue=te.slice(0,te.length-N.length);r(`Creating directory ${P.bold(Ue)}`),Le.mkdirSync(Ue,{recursive:!0}),r(`Created directory ${P.bold(Ue)}`),le.push({content:tt,destPath:te}),r(`Got ${P.bold(F)}`);}for(let N of le){let F=await Ht({file:N,biomeOptions:_,prettierOptions:M,config:i,imports:h._imports_,watermark:w,verbose:r,cwd:t.cwd});F.isErr()&&program.error(P.red(F.unwrapErr())),r(`Writing to ${P.bold(N.destPath)}`),Le.writeFileSync(N.destPath,F.unwrap());}if(i.includeTests&&h.tests){r("Trying to include tests");let{devDependencies:N}=JSON.parse(Le.readFileSync(ee.join(t.cwd,"package.json")).toString());(N===void 0||N.vitest===void 0)&&L.add("vitest");}for(let N of h.devDependencies)L.add(N);for(let N of h.dependencies)m.add(N);}});}await qt({startMessage:"Adding blocks",stopMessage:`Added ${P.cyan(g.join(", "))}`,tasks:x,verbose:t.verbose?r:void 0});let k=Bt(m,L,{cwd:t.cwd});if(m=k.dependencies,L=k.devDependencies,m.size>0||L.size>0){let h=t.yes;if(!t.yes){let w=await confirm({message:"Would you like to install dependencies?",initialValue:!0});isCancel(w)&&(cancel("Canceled!"),process.exit(0)),h=w;}h&&(m.size>0&&(t.verbose||o.start(`Installing dependencies with ${P.cyan(b)}`),(await Ne({pm:b,deps:Array.from(m),dev:!1,cwd:t.cwd})).match(w=>{t.verbose||o.stop(`Installed ${P.cyan(w.join(", "))}`);},w=>{t.verbose||o.stop("Failed to install dependencies"),program.error(w);})),L.size>0&&(t.verbose||o.start(`Installing dependencies with ${P.cyan(b)}`),(await Ne({pm:b,deps:Array.from(L),dev:!0,cwd:t.cwd})).match(w=>{t.verbose||o.stop(`Installed ${P.cyan(w.join(", "))}`);},w=>{t.verbose||o.stop("Failed to install dev dependencies"),program.error(w);})));let T=[];if(!h){if(m.size>0){let w=resolveCommand(b,"install",[...m]);T.push(`Install dependencies \`${P.cyan(`${w?.command} ${w?.args.join(" ")}`)}\``);}if(L.size>0){let w=resolveCommand(b,"install",[...L,"-D"]);T.push(`Install dev dependencies \`${P.cyan(`${w?.command} ${w?.args.join(" ")}`)}\``);}}T=T.map((w,$)=>`${$+1}. ${w}`),h||T.push(""),T.push("Import and use the blocks!");let p=wt(T);process.stdout.write(p);}};var On=C.object({token:C.optional(C.string()),provider:C.optional(C.string()),logout:C.boolean()}),mr=new Command("auth").description("Provide a token for access to private repositories.").option("--token <token>","The token to use for authenticating to your provider.").addOption(new Option("--provider <name>","The provider this token belongs to.").choices(q.map(e=>e.name()))).option("--logout","Erase tokens from each provider from storage.",!1).action(async e=>{let t=C.parse(On,e);se(X),await An(t),outro(P.green("All done!"));}),An=async e=>{let t=ne();if(e.logout){for(let r of q){let o=`${r.name()}-token`;if(t.get(o)===void 0){process.stdout.write(`${O}
47
+ `),process.stdout.write(P.gray(`${O} Already logged out of ${r.name()}.
48
+ `));continue}let n=await confirm({message:`Remove ${r.name()} token?`,initialValue:!0});isCancel(n)&&(cancel("Canceled!"),process.exit(0)),n&&t.delete(o);}return}if(q.length>1){let r=await select({message:"Which provider is this token for?",options:q.map(o=>({label:o.name(),value:o.name()})),initialValue:q[0].name()});isCancel(r)&&(cancel("Canceled!"),process.exit(0)),e.provider=r;}else e.provider=q[0].name();if(e.token===void 0){let r=await password({message:"Paste your token",validate(o){if(o.trim()==="")return "Please provide a value"}});(isCancel(r)||!r)&&(cancel("Canceled!"),process.exit(0)),e.token=r;}t.set(`${e.provider}-token`,e.token);};var Fn=C.object({dirs:C.optional(C.array(C.string())),includeBlocks:C.optional(C.array(C.string())),includeCategories:C.optional(C.array(C.string())),excludeBlocks:C.optional(C.array(C.string())),excludeCategories:C.optional(C.array(C.string())),excludeDeps:C.optional(C.array(C.string())),listBlocks:C.optional(C.array(C.string())),listCategories:C.optional(C.array(C.string())),doNotListBlocks:C.optional(C.array(C.string())),doNotListCategories:C.optional(C.array(C.string())),preview:C.optional(C.boolean()),output:C.boolean(),verbose:C.boolean(),cwd:C.string()}),gr=new Command("build").description(`Builds the provided --dirs in the project root into a \`${be}\` file.`).option("--dirs [dirs...]","The directories containing the blocks.").option("--include-blocks [blockNames...]","Include only the blocks with these names.").option("--include-categories [categoryNames...]","Include only the categories with these names.").option("--exclude-blocks [blockNames...]","Do not include the blocks with these names.").option("--exclude-categories [categoryNames...]","Do not include the categories with these names.").option("--list-blocks [blockNames...]","List only the blocks with these names.").option("--list-categories [categoryNames...]","List only the categories with these names.").option("--do-not-list-blocks [blockNames...]","Do not list the blocks with these names.").option("--do-not-list-categories [categoryNames...]","Do not list the categories with these names.").option("--exclude-deps [deps...]","Dependencies that should not be added.").option("--preview","Display a preview of the blocks list.").option("--no-output",`Do not output a \`${be}\` file.`).option("--verbose","Include debug logs.",!1).option("--cwd <path>","The current working directory.",process.cwd()).action(async e=>{let t=C.parse(Fn,e);se(X),await _n(t),outro(P.green("All done!"));}),_n=async e=>{let t=spinner(),r=[],o=Lt(e.cwd).match(c=>{if(c===null)return {$schema:"",dirs:e.dirs??[],doNotListBlocks:e.doNotListBlocks??[],doNotListCategories:e.doNotListCategories??[],listBlocks:e.listBlocks??[],listCategories:e.listCategories??[],excludeDeps:e.excludeDeps??[],includeBlocks:e.includeBlocks??[],includeCategories:e.includeCategories??[],excludeBlocks:e.excludeBlocks??[],excludeCategories:e.excludeCategories??[],preview:e.preview};let l=c;return e.dirs&&(l.dirs=e.dirs),e.doNotListBlocks&&(l.doNotListBlocks=e.doNotListBlocks),e.doNotListCategories&&(l.doNotListCategories=e.doNotListCategories),e.listBlocks&&(l.listBlocks=e.listBlocks),e.listCategories&&(l.listCategories=e.listCategories),e.includeBlocks&&(l.includeBlocks=e.includeBlocks),e.includeCategories&&(l.includeCategories=e.includeCategories),e.excludeBlocks&&(l.excludeBlocks=e.excludeBlocks),e.excludeCategories&&(l.excludeCategories=e.excludeCategories),e.excludeDeps&&(l.excludeDeps=e.excludeDeps),e.preview!==void 0&&(l.preview=e.preview),l.rules={...tr,...l.rules},l},c=>program.error(P.red(c))),n=ee.join(e.cwd,be);for(let c of o.dirs){let l=ee.join(e.cwd,c);t.start(`Building ${P.cyan(l)}`),e.output&&Le.existsSync(n)&&Le.rmSync(n);let y=qr(l,{cwd:e.cwd,config:o});for(let u of y){if(r.find(b=>b.name===u.name)!==void 0){console.warn(`${O} ${Ie} Skipped adding \`${P.cyan(`${c}/${u.name}`)}\` because a category with the same name already exists!`);continue}r.push(u);}t.stop(`Built ${P.cyan(l)}`);}t.start("Checking manifest");let{warnings:s,errors:i}=Or(r,o,o.rules);t.stop("Completed checking manifest."),(s.length>0||i.length>0)&&console.log(O);for(let c of s)console.log(c);if(i.length>0){for(let c of i)console.log(c);program.error(P.red(`Completed checking manifest with ${P.bold(`${i.length} error(s)`)} and ${P.bold(`${s.length} warning(s)`)}`));}let[a,d]=Kr(r);if(r=a,d>0&&log.step(`Removed ${d} unused block${d>1?"s":""}.`),o.preview){let c=r.flatMap(l=>l.blocks.filter(y=>y.list).map(y=>`${P.cyan(y.category)}/${y.name}`));log.message(`${P.yellow("Preview")}:`);for(let l of c)console.log(`${O} \u25FB ${l}`);}e.output&&(t.start(`Writing output to \`${P.cyan(n)}\``),Le.writeFileSync(n,JSON.stringify(r,null," ")),t.stop(`Wrote output to \`${P.cyan(n)}\``));};var po=(e,t)=>{let r=0;for(let o of e)r=r+t(o);return r};var fo=e=>/^\s+$/g.test(e),bt=e=>{let t=e.length-1;for(;fo(e[t])&&t>=0;){if(e[t]===`
49
+ `)return e[t-1]==="\r"?e.slice(0,t-1):e.slice(0,t);t--;}return e},Kt=({from:e,to:t,changes:r,expand:o=!1,maxUnchanged:n=5,colorRemoved:s=P.red,colorAdded:i=P.green,colorCharsRemoved:a=P.bgRed,colorCharsAdded:d=P.bgGreen,prefix:c,onUnchanged:l,intro:y})=>{let u="",b=po(r,m=>m.count??0).toString().length+1,x=0;if(r.length===1&&!r[0].added&&!r[0].removed)return l({from:e,to:t,changes:r,expand:o,maxUnchanged:n,colorAdded:i,colorRemoved:s,prefix:c,onUnchanged:l,intro:y});u+=y({from:e,to:t,changes:r,expand:o,maxUnchanged:n,colorAdded:i,colorRemoved:s,prefix:c,onUnchanged:l,intro:y});let L=m=>P.gray(`${c?.()??""}${xt(`${m+1+x} `,b)} `);for(let m=0;m<r.length;m++){let R=r[m],M=r[m-1]?.added||r[m-1]?.removed,_=r[m+1]?.added||r[m+1]?.removed;if(!R.added&&!R.removed){if(!o&&R.count!==void 0&&R.count>n){let g=x,I=Q(bt(R.value)),k=0;if(_&&(k+=n),M&&(k+=n),k>=I.length){u+=`${Z(I,{prefix:L})}
50
+ `,x+=I.length;continue}if(M&&(u+=`${Z(I.slice(0,n),{prefix:L})}
51
+ `),I.length>k){let W=I.length-k;u+=`${Z(Q(P.gray(`+ ${W} more unchanged (${P.italic("-E to expand")})`)),{prefix:()=>`${c?.()??""}${xt(" ",b)} `})}
52
+ `;}_&&(x=x+I.length-n,u+=`${Z(I.slice(I.length-n),{prefix:L})}
53
+ `),x=g+R.count;continue}u+=`${Z(Q(bt(R.value)),{prefix:L})}
54
+ `,x+=R.count??0;continue}let B=g=>g.added?i(bt(g.value)):g.removed?s(bt(g.value)):g.value,f=g=>g.added?d(bt(g.value)):g.removed?a(bt(g.value)):g.value;if(R.removed&&R.count===1&&r[m+1]?.added&&r[m+1]?.count===1){let I=diffChars(R.value,r[m+1].value).map(k=>f(k)).join("");u+=`${L(0)}${I}`,x+=1,m++;}else fo(R.value)?(u+=`${Z(Q(f(R)),{prefix:g=>`${L(g)}${f({removed:!0,value:" ",added:!1})}`})}
55
+ `,R.removed||(x+=R.count??0)):(u+=`${Z(Q(B(R)),{prefix:L})}
56
+ `,R.removed||(x+=R.count??0));}return u};var qn=C.object({expand:C.boolean(),maxUnchanged:C.number(),repo:C.optional(C.string()),allow:C.boolean(),cwd:C.string()}),hr=new Command("diff").description("Compares local blocks to the blocks in the provided repository.").option("-E, --expand","Expands the diff so you see everything.",!1).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.",!1).option("--cwd <path>","The current working directory.",process.cwd()).action(async e=>{let t=C.parse(qn,e);se(X),await Kn(t),outro(P.green("All done!"));}),Kn=async e=>{let t=spinner(),r=we(e.cwd).match(c=>c,c=>program.error(P.red(c))),o=r.repos;if(e.repo&&(o=[e.repo]),!e.allow&&e.repo){let c=await confirm({message:`Allow ${P.cyan("jsrepo")} to download and run code from ${P.cyan(e.repo)}?`,initialValue:!0});(isCancel(c)||!c)&&(cancel("Canceled!"),process.exit(0));}t.start(`Fetching blocks from ${P.cyan(o.join(", "))}`);let n=(await Ye(...o)).match(c=>c,({repo:c,message:l})=>{t.stop(`Failed to get info for ${P.cyan(c)}`),program.error(P.red(l));}),s=(await Ke(...n)).match(c=>c,({repo:c,message:l})=>{t.stop(`Failed fetching blocks from ${P.cyan(c)}`),program.error(P.red(l));});t.stop(`Retrieved blocks from ${P.cyan(o.join(", "))}`);let i=Ze(s,r,e.cwd),a=$e(r.paths,e.cwd);a.isErr()&&program.error(P.red(a.unwrapErr()));let d=a.unwrap();for(let c of i){let l=!1;for(let y of o){let u=(await st(y)).unwrap(),b=`${u.name}/${u.owner}/${u.repoName}/${c.specifier}`,x=s.get(b);if(x===void 0)continue;let L=vt(X.package.version,y);l=!0,process.stdout.write(`${O}
57
+ `),process.stdout.write(`${O} ${b}
58
+ `);for(let m of x.files){if(!r.includeTests&&ue(m))continue;process.stdout.write(`${O}
59
+ `);let R=ee.join(x.directory,m),M=await u.provider.fetchRaw(u,R);M.isErr()&&program.error(P.red(`There was an error trying to get ${b}`));let _=M.unwrap(),B,f;d[x.category]!==void 0?(f=d[x.category],B=ee.join(e.cwd,d[x.category])):(f=ee.join(d["*"],x.category),B=ee.join(e.cwd,d["*"],x.category));let g=ee.join(B,m),I=ee.join(f,m);x.subdirectory&&(g=ee.join(B,x.name,m),I=ee.join(f,x.name,m));let k="";if(Le.existsSync(g)&&(k=Le.readFileSync(g).toString()),r.watermark){let p=ot.find(w=>w.matches(R));p&&(_=`${p.comment(L)}
54
60
 
55
- ${F}`);}let _=diffLines(b,F),h=Q.join(`${u.name}/${u.owner}/${u.repoName}`,R),S=Ht({from:h,to:E,changes:_,expand:e.expand,maxUnchanged:e.maxUnchanged,colorAdded:P.greenBright,colorRemoved:P.redBright,colorCharsAdded:P.bgGreenBright,colorCharsRemoved:P.bgRedBright,prefix:()=>`${W} `,onUnchanged:({from:d,to:w,prefix:$})=>`${$?.()??""}${P.cyan(d)} \u2192 ${P.gray(w)} ${P.gray("(unchanged)")}
56
- `,intro:({from:d,to:w,changes:$,prefix:v})=>{let j=$.filter(z=>z.added).length;return `${v?.()??""}${P.cyan(d)} \u2192 ${P.gray(w)} (${j} change${j===1?"":"s"})
61
+ ${_}`);}let W=diffLines(k,_),h=ee.join(`${u.name}/${u.owner}/${u.repoName}`,R),T=Kt({from:h,to:I,changes:W,expand:e.expand,maxUnchanged:e.maxUnchanged,colorAdded:P.greenBright,colorRemoved:P.redBright,colorCharsAdded:P.bgGreenBright,colorCharsRemoved:P.bgRedBright,prefix:()=>`${O} `,onUnchanged:({from:p,to:w,prefix:$})=>`${$?.()??""}${P.cyan(p)} \u2192 ${P.gray(w)} ${P.gray("(unchanged)")}
62
+ `,intro:({from:p,to:w,changes:$,prefix:v})=>{let j=$.filter(z=>z.added).length;return `${v?.()??""}${P.cyan(p)} \u2192 ${P.gray(w)} (${j} change${j===1?"":"s"})
57
63
  ${v?.()??""}
58
- `}});process.stdout.write(S);}break}l||program.error(P.red(`Invalid block! ${P.bold(c)} does not exist!`));}};var qn=C.objectWithRest({repo:C.optional(C.string()),allow:C.boolean(),cwd:C.string()},C.unknown()),gr=new Command("exec").alias("x").addArgument(new Argument("script","Name of the script you want to execute. ex: (general/hello, github/ieedan/std/general/hello)").argOptional()).option("--repo <repo>","Repository to download and run the script from.").option("-A, --allow","Allow jsrepo to download code from the provided repo.",!1).option("--cwd <path>","The current working directory.",process.cwd()).allowExcessArguments().allowUnknownOption().action(async(e,t,r)=>{let o=C.parse(qn,t);ne(X.package.version),await Kn(e,o,r);}),Kn=async(e,t,r)=>{let o=e,n=spinner(),s=we(t.cwd),i=s.isErr(),a;s.isErr()?a={$schema:"",includeTests:!1,watermark:!0,paths:{"*":"./"},repos:[]}:a=s.unwrap();let p=a.repos;if(t.repo&&(p=[t.repo]),o&&q.find(d=>o?.startsWith(d.name()))){let[d,w,$,...v]=o.split("/"),j;if(v.length>2?j=`${d}/${w}/${$}/${v.slice(0,v.length-2).join("/")}`:j=`${d}/${w}/${$}`,!p.find(z=>z===j)){if(!t.allow){let z=await confirm({message:`Allow ${fe} to download and run code from ${P.cyan(j)}?`,initialValue:!0});(isCancel(z)||!z)&&(cancel("Canceled!"),process.exit(0));}p=[j];}}if(!t.allow&&t.repo){let d=await confirm({message:`Allow ${fe} to download and run code from ${P.cyan(t.repo)}?`,initialValue:!0});(isCancel(d)||!d)&&(cancel("Canceled!"),process.exit(0));}p.length===0&&(i&&program.error(P.red(`Fully quality your script ex: (github/ieedan/std/scripts/build) or provide the \`${P.bold("--repo")}\` flag to specify a registry.`)),program.error(P.red(`There were no repos present in your config and you didn't provide the \`${P.bold("--repo")}\` flag with a repo.`))),n.start(`Fetching scripts from ${P.cyan(p.join(", "))}`);let c=(await Ke(...p)).match(d=>d,({repo:d,message:w})=>{n.stop(`Failed to get info for ${P.cyan(d)}`),program.error(P.red(w));}),l=(await qe(...c)).match(d=>d,({repo:d,message:w})=>{n.stop(`Failed fetching scripts from ${P.cyan(d)}`),program.error(P.red(w));});if(n.stop(`Retrieved scripts from ${P.cyan(p.join(", "))}`),!o){let d=await select({message:"Select which script to run.",options:Array.from(l.entries()).filter(([w,$])=>$.list).map(([w,$])=>{let v;return p.length>1?v=`${P.cyan(`${$.sourceRepo.name}/${$.sourceRepo.owner}/${$.sourceRepo.repoName}/${$.category}`)}/${$.name}`:v=`${P.cyan($.category)}/${$.name}`,{label:v,value:w}})});isCancel(d)&&(cancel("Canceled!"),process.exit(0)),o=d;}let y=(await it([o],l,c)).match(d=>d,d=>program.error(d)),u="temp-jsrepo-exec",k=`./${u}/${encodeURIComponent(o)}`,x=Q.join(process.cwd(),k);a.paths["*"]=k,Ae.mkdirSync(x,{recursive:!0});let A=(await detect({cwd:process.cwd()}))?.agent??"npm",m=[],R=new Set,M=new Set,F=$e(a.paths,t.cwd);F.isErr()&&program.error(P.red(F.unwrapErr()));let L=F.unwrap(),f=[];for(let{block:d}of y){let w=`${d.sourceRepo.url}/${d.category}/${d.name}`,$=`${d.category}/${d.name}`,v=d.sourceRepo,j=Q.join(t.cwd,L["*"],d.category);f.push($),m.push({run:async({message:z})=>{z(`Adding ${P.cyan(w)}`),Ae.mkdirSync(j,{recursive:!0});let ce=[],ye=async N=>{let B=await v.provider.fetchRaw(v,N);return B.isErr()&&(n.stop(P.red(`Error fetching ${P.bold(N)}`)),program.error(P.red(`There was an error trying to get ${w}`))),B.unwrap()};for(let N of d.files){if(!a.includeTests&&ue(N))continue;let B=Q.join(d.directory,N),ee;d.subdirectory?ee=Q.join(j,d.name,N):ee=Q.join(j,N);let et=await ye(B),ze=ee.slice(0,ee.length-N.length);Ae.mkdirSync(ze,{recursive:!0}),ce.push({content:et,destPath:ee});}for(let N of ce)Ae.writeFileSync(N.destPath,N.content);if(a.includeTests&&d.tests){let{devDependencies:N}=JSON.parse(Ae.readFileSync(Q.join(t.cwd,"package.json")).toString());(N===void 0||N.vitest===void 0)&&R.add("vitest");}for(let N of d.devDependencies)R.add(N);for(let N of d.dependencies)M.add(N);}});}if(await Gt({startMessage:"Adding blocks",stopMessage:`Added ${P.cyan(f.join(", "))}`,tasks:m}),M.size>0||R.size>0){let d={name:"temp-package",type:"module",version:"0.0.1"},w=Q.join(x,"package.json");Ae.writeFileSync(w,JSON.stringify(d,null," ")),M.size>0&&(t.verbose||n.start(`Installing dependencies with ${P.cyan(A)}`),(await Ne({pm:A,deps:Array.from(M),dev:!1,cwd:x,ignoreWorkspace:!0})).match($=>{t.verbose||n.stop(`Installed ${P.cyan($.join(", "))}`);},$=>{t.verbose||n.stop("Failed to install dependencies"),program.error($);})),R.size>0&&(t.verbose||n.start(`Installing dependencies with ${P.cyan(A)}`),(await Ne({pm:A,deps:Array.from(R),dev:!0,cwd:x,ignoreWorkspace:!0})).match($=>{t.verbose||n.stop(`Installed ${P.cyan($.join(", "))}`);},$=>{t.verbose||n.stop("Failed to install dev dependencies"),program.error($);}));}let E=r.parent.rawArgs.findIndex(d=>d==="--"),b=[];E!==-1&&(b=r.parent.rawArgs.slice(E+1)),console.clear();let _=y[0],h;_.block.subdirectory?h=Q.join(x,`${_.block.category}/${_.block.name}/index.js`):h=Q.join(x,`${_.block.category}/${_.block.name}.js`);let S=resolveCommand(A,"execute",["tsx",h,...b]);S||program.error(P.red("Error resolving run command!"));try{await execa(S.command,S.args,{cwd:process.cwd(),stdin:process.stdin,stdout:process.stdout});}finally{Ae.rmSync(Q.join(process.cwd(),u),{recursive:!0,force:!0});}};var rs=C.object({repos:C.optional(C.array(C.string())),watermark:C.boolean(),tests:C.optional(C.boolean()),formatter:C.optional(Qt),project:C.optional(C.boolean()),registry:C.optional(C.boolean()),script:C.string(),yes:C.boolean(),cwd:C.string()}),yr=new Command("init").description("Initializes your project with a configuration file.").option("--repos [repos...]","Repository to install the blocks from.").option("--no-watermark","Will not add a watermark to each file upon adding it to your project.").option("--tests","Will include tests with the blocks.").addOption(new Option("--formatter <formatter>","What formatter to use when adding or updating blocks.").choices(["prettier","biome"])).option("-P, --project","Takes you through the steps to initialize a project.").option("-R, --registry","Takes you through the steps to initialize a registry.").option("--script <name>","The name of the build script. (For Registry setup)","build:registry").option("-y, --yes","Skip confirmation prompt.",!1).option("--cwd <path>","The current working directory.",process.cwd()).action(async e=>{let t=C.parse(rs,e);if(ne(X.package.version),t.registry!==void 0&&t.project!==void 0&&program.error(P.red(`You cannot provide both ${P.bold("--project")} and ${P.bold("--registry")} at the same time.`)),t.registry===void 0&&t.project===void 0){let r=await select({message:"Initialize a project or registry?",options:[{value:"project",label:"project"},{value:"registry",label:"registry"}],initialValue:"project"});isCancel(r)&&(cancel("Canceled!"),process.exit(0)),t.registry=r==="registry";}t.registry?await ns(t):await os(t),outro(P.green("All done!"));}),os=async e=>{let t=le(),r=we(e.cwd),o=spinner(),n,s=await text({message:"Please enter a default path to install the blocks",validate(y){if(y.trim()==="")return "Please provide a value"},initialValue:r.isOk()?r.unwrap().paths["*"]:"./src/blocks"});if(isCancel(s)&&(cancel("Canceled!"),process.exit(0)),r.isOk()?n={...r.unwrap().paths,"*":s}:n={"*":s},!e.repos)for(e.repos=r.isOk()?r.unwrap().repos:[];;){let y=await confirm({message:`Add ${e.repos.length>0?"another":"a"} repo?`,initialValue:e.repos.length===0});if(isCancel(y)&&(cancel("Canceled!"),process.exit(0)),!y)break;let u=await text({message:"Where should we download the blocks from?",placeholder:"github/ieedan/std",validate:F=>{if(F.trim().length===0)return "Please provide a value";if(!q.find(L=>L.matches(F)))return `Invalid provider! Valid providers (${q.map(L=>L.name()).join(", ")})`}});isCancel(u)&&(cancel("Canceled!"),process.exit(0));let k=q.find(F=>F.matches(u));k||program.error(P.red("Invalid provider!"));let x=`${k.name()}-token`;if(!t.get(x)){let F=await confirm({message:"Would you like to add an auth token?",initialValue:!1});if(isCancel(F)&&(cancel("Canceled!"),process.exit(0)),F){let L=await password({message:"Paste your token",validate(f){if(f.trim()==="")return "Please provide a value"}});isCancel(L)&&(cancel("Canceled!"),process.exit(0)),t.set(x,L);}}o.start(`Fetching categories from ${P.cyan(u)}`);let m=await k.fetchManifest(u);o.stop(`Fetched categories from ${P.cyan(u)}`),m.isErr()&&program.error(P.red(m.unwrapErr()));let R=m.unwrap(),M=await multiselect({message:"Which category paths would you like to configure?",options:R.map(F=>({label:F.name,value:F.name})),required:!1});if(isCancel(M)&&(cancel("Canceled!"),process.exit(0)),M.length>0)for(let F of M){let L=n[F],f=await text({message:`Where should ${F} be added in your project?`,validate(g){if(g.trim()==="")return "Please provide a value"},placeholder:L||`./src/${F}`,defaultValue:L,initialValue:L});isCancel(f)&&(cancel("Canceled!"),process.exit(0)),n[F]=f;}e.repos.push(u);}if(!e.formatter){let y=r.isErr()?"none":r.unwrap().formatter??"none";Ae.existsSync(Q.join(e.cwd,".prettierrc"))&&(y="prettier"),Ae.existsSync(Q.join(e.cwd,"biome.json"))&&(y="biome");let u=await select({message:"What formatter would you like to use?",options:["Prettier","Biome","None"].map(k=>({value:k.toLowerCase(),label:k})),initialValue:y});isCancel(u)&&(cancel("Canceled!"),process.exit(0)),u!=="none"&&(e.formatter=u);}let i={$schema:`https://unpkg.com/jsrepo@${X.package.version}/schemas/project-config.json`,repos:e.repos,includeTests:r.isOk()&&e.tests===void 0?r.unwrap().includeTests:e.tests??!1,watermark:e.watermark,formatter:e.formatter,paths:n};o.start(`Writing config to \`${tt}\``);let{prettierOptions:a,biomeOptions:p}=await ht({formatter:i.formatter,cwd:e.cwd}),c=Q.join(e.cwd,tt),l=await or.format(JSON.stringify(i,null," "),{biomeOptions:p,prettierOptions:a,filePath:c,formatter:i.formatter});Ae.writeFileSync(c,l),o.stop(`Wrote config to \`${tt}\`.`);},ns=async e=>{let t=spinner(),r=Q.join(e.cwd,"package.json");Ae.existsSync(r)||program.error(P.red(`Couldn't find your ${P.bold("package.json")}!`));let o=Ot(e.cwd).match(m=>m,m=>program.error(P.red(m))),n=o===null;for(o||(o={$schema:"",dirs:[],doNotListBlocks:[],doNotListCategories:[],listBlocks:[],listCategories:[],excludeDeps:[],includeBlocks:[],includeCategories:[],excludeBlocks:[],excludeCategories:[],preview:!1}),o.$schema=`https://unpkg.com/jsrepo@${X.package.version}/schemas/registry-config.json`;;){if(o.dirs.length>0){let R=await confirm({message:"Add another blocks directory?",initialValue:!1});if(isCancel(R)&&(cancel("Canceled!"),process.exit(0)),!R)break}let m=await text({message:"Where are your blocks located?",placeholder:"./src",defaultValue:"./src",initialValue:"./src",validate:R=>{if(R.trim().length===0)return "Please provide a value!"}});isCancel(m)&&(cancel("Canceled!"),process.exit(0)),o.dirs.push(m);}let s=JSON.parse(Ae.readFileSync(r).toString());for(;!e.yes&&s.scripts&&s.scripts[e.script];){let m=await confirm({message:`The \`${P.cyan(e.script)}\` already exists overwrite?`,initialValue:!1});if(isCancel(m)&&(cancel("Canceled!"),process.exit(0)),m)break;{let R=await text({message:"What would you like to call the script?",placeholder:"build:registry",validate:M=>{if(M.trim().length===0)return "Please provide a value!"}});isCancel(R)&&(cancel("Canceled!"),process.exit(0)),e.script=R;}}let i=s.devDependencies&&s.devDependencies.jsrepo!==void 0,a=e.yes||i;if(!e.yes&&!i){let m=await confirm({message:`Add ${fe} as a dev dependency?`,initialValue:!0});isCancel(m)&&(cancel("Canceled!"),process.exit(0)),a=m;}let p=!n;if(!e.yes&&n){let m=await confirm({message:`Create a \`${P.cyan(Ue)}\` file?`,initialValue:!0});isCancel(m)&&(cancel("Canceled!"),process.exit(0)),p=m;}let c=(await detect$1({cwd:"cwd"}))?.agent??"npm",l="";if(a)l+="jsrepo build";else {let m=resolveCommand$1(c,"execute",["jsrepo","build"]);m||program.error(P.red(`Error resolving execute command for ${c}`)),l+=`${m.command} ${m.args.join(" ")} `;}p||(l+=` --dirs ${o.dirs.join(" ")} `),s.scripts===void 0&&(s.scripts={}),s.scripts[e.script]=l;let y=[];y.push({loadingMessage:`Adding \`${P.cyan(e.script)}\` to scripts in package.json`,completedMessage:`Added \`${P.cyan(e.script)}\` to scripts in package.json`,run:async()=>{try{Ae.writeFileSync(r,JSON.stringify(s,null," "));}catch(m){program.error(P.red(`Error writing to \`${P.bold(r)}\`. Error: ${m}`));}}}),p&&y.push({loadingMessage:`Writing config to \`${P.cyan(Ue)}\``,completedMessage:`Wrote config to \`${P.cyan(Ue)}\``,run:async()=>{let m=Q.join(e.cwd,Ue);try{Ae.writeFileSync(Q.join(m),JSON.stringify(o,null," "));}catch(R){program.error(P.red(`Error writing to \`${P.bold(m)}\`. Error: ${R}`));}}}),await xt(y,{});let u=i;if(a&&!i){let m=e.yes;if(!e.yes){let R=await confirm({message:"Install dependencies?",initialValue:!0});isCancel(R)&&(cancel("Canceled!"),process.exit(0)),m=R;}m&&(t.start(`Installing ${fe}`),(await Ne({pm:c,deps:["jsrepo"],dev:!0,cwd:e.cwd})).match(()=>t.stop(`Installed ${fe}.`),M=>{t.stop(`Failed to install ${fe}.`),program.error(M);}),u=!0);}let k=[];if(!u&&a){let m=resolveCommand$1(c,"install",["jsrepo","-D"]);k.push(`Install ${fe} as a dev dependency \`${P.cyan(`${m?.command} ${m?.args.join(" ")}`)}\``);}k.push(`Add categories to \`${P.cyan(o.dirs.join(", "))}\`.`);let x=resolveCommand$1(c,"run",[e.script]);k.push(`Run \`${P.cyan(`${x?.command} ${x?.args.join(" ")}`)}\` to build the registry.`),k=k.map((m,R)=>`${R+1}. ${m}`);let A=vt(k);process.stdout.write(A);};var hs=C.object({repo:C.optional(C.string()),allow:C.boolean(),debug:C.boolean(),verbose:C.boolean(),cwd:C.string()}),wr=new Command("test").description("Tests local blocks against most recent remote tests.").addArgument(new Argument("[blocks...]","The blocks you want to test.").default([])).option("--repo <repo>","Repository to download the blocks from.").option("-A, --allow","Allow jsrepo to download code from the provided repo.",!1).option("--debug","Leaves the temp test file around for debugging upon failure.",!1).option("--verbose","Include debug logs.",!1).option("--cwd <path>","The current working directory.",process.cwd()).action(async(e,t)=>{let r=C.parse(hs,t);ne(X.package.version),await ys(e,r),outro(P.green("All done!"));}),ys=async(e,t)=>{let r=f=>{t.verbose&&console.info(`${ft} ${f}`);};r(`Attempting to test ${JSON.stringify(e)}`);let o=we(t.cwd).match(f=>f,f=>program.error(P.red(f))),n=spinner(),s=new Map,i=o.repos;if(t.repo&&(i=[t.repo]),!t.allow&&t.repo){let f=await confirm({message:`Allow ${P.cyan("jsrepo")} to download and run code from ${P.cyan(t.repo)}?`,initialValue:!0});(isCancel(f)||!f)&&(cancel("Canceled!"),process.exit(0));}r(`Fetching blocks from ${P.cyan(i.join(", "))}`),t.verbose||n.start(`Fetching blocks from ${P.cyan(i.join(", "))}`);for(let f of i){let g=(await st(f)).match(_=>_,_=>program.error(P.red(_))),E=await g.provider.fetchManifest(g);r(`Got info for provider ${P.cyan(g.name)}`),E.isErr()&&(t.verbose||n.stop(`Error fetching ${P.cyan(f)}`),program.error(P.red(`There was an error fetching the \`${ke}\` from the repository ${P.cyan(f)} make sure the target repository has a \`${ke}\` in its root?`)));let b=E.unwrap();for(let _ of b)for(let h of _.blocks)s.set(`${g.name}/${g.owner}/${g.repoName}/${_.name}/${h.name}`,{...h,sourceRepo:g});}r(`Retrieved blocks from ${P.cyan(i.join(", "))}`),t.verbose||n.stop(`Retrieved blocks from ${P.cyan(i.join(", "))}`);let a=Q.resolve(Q.join(t.cwd,`blocks-tests-temp-${Date.now()}`));r(`Trying to create the temp directory ${P.bold(a)}.`),Ae.mkdirSync(a,{recursive:!0});let p=()=>{Ae.rmSync(a,{recursive:!0,force:!0});},c=Ye(s,o,t.cwd).map(f=>f.specifier),l=e;e.length===0&&(l=c),l.length===0&&(p(),program.error(P.red("There were no blocks found in your project!")));let y=[];for(let f of l){let g;if(q.find(E=>f.startsWith(E.name()))){if(i.length===0){let[E,b,_,...h]=f.split("/"),S;h.length>2?S=`${E}/${b}/${_}/${h.slice(0,h.length-2).join("/")}`:S=`${E}/${b}/${_}`;let d=(await st(S)).match($=>$,$=>program.error(P.red($))),w=(await d.provider.fetchManifest(d)).match($=>$,$=>program.error(P.red($)));for(let $ of w)for(let v of $.blocks)s.set(`${d.name}/${d.owner}/${d.repoName}/${$.name}/${v.name}`,{...v,sourceRepo:d});}g=s.get(f);}else for(let E of i){let b=(await st(E)).unwrap(),_=s.get(`${b.name}/${b.owner}/${b.repoName}/${f}`);if(_!==void 0){g=_;break}}g||program.error(P.red(`Invalid block! ${P.bold(f)} does not exist!`)),y.push({name:f,block:g});}let u=$e(o.paths,t.cwd);u.isErr()&&program.error(P.red(u.unwrapErr()));let k=u.unwrap();for(let{block:f}of y){let g=f.sourceRepo,E=`${f.sourceRepo.url}/${f.category}/${f.name}`;if(t.verbose||n.start(`Setting up test file for ${P.cyan(E)}`),!f.tests){n.stop(`No tests found for ${P.cyan(E)}`);continue}let b;k[f.category]!==void 0?b=Q.join(t.cwd,k[f.category]):b=Q.join(t.cwd,k["*"],f.category),b=Q.relative(a,b);let _=async d=>{let w=await g.provider.fetchRaw(g,d);return w.isErr()&&(n.stop(P.red(`Error fetching ${P.bold(d)}`)),program.error(P.red(`There was an error trying to get ${E}`))),w.unwrap()};r(`Downloading and copying test files for ${E}`);let h=[];for(let d of f.files.filter(w=>ue(w))){let w=await _(Q.join(f.directory,d)),$=Q.join(a,d);Ae.writeFileSync($,w),h.push($);}let S=new Project;for(let d of h){r(`Opening test file ${d}`);let w=S.addSourceFileAtPath(d);for(let $ of w.getImportDeclarations()){let v=$.getModuleSpecifierValue(),j;v.startsWith(".")&&(f.subdirectory?j=Q.join(b,f.name,v):j=Q.join(b,v)),j&&$.setModuleSpecifier(j.replaceAll(/\\/g,"/"));}}S.saveSync(),r(`Completed ${P.cyan.bold(E)} test file`),t.verbose||n.stop(`Completed setup for ${P.bold(E)}`);}r("Beginning testing");let x=await detect({cwd:t.cwd});x==null&&program.error(P.red("Could not detect package manager"));let A=resolveCommand(x.agent,"execute",["vitest","run",a]);A==null&&program.error(P.red(`Could not resolve add command for '${x.agent}'.`));let{command:m,args:R}=A,M=`${m} ${R.join(" ")}`,F=execa({cwd:t.cwd,stdio:["ignore","pipe","pipe"]})`${M}`,L=f=>console.info(f.toString());F.stdout.on("data",L),F.stderr.on("data",L);try{await F,p();}catch(f){t.debug?console.info(`${P.bold("--debug")} flag provided. Skipping cleanup. Run '${P.bold(M)}' to retry tests.
59
- `):p(),program.error(P.red(`Tests failed! Error ${f}`));}};var Cs=C.object({all:C.boolean(),expand:C.boolean(),maxUnchanged:C.number(),repo:C.optional(C.string()),allow:C.boolean(),yes:C.boolean(),verbose:C.boolean(),cwd:C.string()}),kr=new Command("update").argument("[blocks...]","Names of the blocks you want to update. ex: (utils/math)").option("--all","Update all installed components.",!1).option("-E, --expand","Expands the diff so you see everything.",!1).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.",!1).option("-y, --yes","Skip confirmation prompt.",!1).option("--verbose","Include debug logs.",!1).option("--cwd <path>","The current working directory.",process.cwd()).action(async(e,t)=>{let r=C.parse(Cs,t);ne(X.package.version),await xs(e,r),outro(P.green("All done!"));}),xs=async(e,t)=>{let r=f=>{t.verbose&&console.info(`${ft} ${f}`);};r(`Attempting to update ${JSON.stringify(e)}`);let o=spinner(),n=we(t.cwd).match(f=>f,f=>program.error(P.red(f))),s=n.repos;t.repo&&(s=[t.repo]);for(let f of e)q.find(g=>f.startsWith(g.name()))&&program.error(P.red(`Invalid value provided for block names \`${P.bold(f)}\`. Block names are expected to be provided in the format of \`${P.bold("<category>/<name>")}\``));if(!t.allow&&t.repo){let f=await confirm({message:`Allow ${P.cyan("jsrepo")} to download and run code from ${P.cyan(t.repo)}?`,initialValue:!0});(isCancel(f)||!f)&&(cancel("Canceled!"),process.exit(0));}r(`Resolving ${P.cyan(s.join(", "))}`),t.verbose||o.start(`Fetching blocks from ${P.cyan(s.join(", "))}`);let i=(await Ke(...s)).match(f=>f,({repo:f,message:g})=>{o.stop(`Failed to get info for ${P.cyan(f)}`),program.error(P.red(g));});r(`Resolved ${P.cyan(s.join(", "))}`),r(`Fetching blocks from ${P.cyan(s.join(", "))}`);let a=(await qe(...i)).match(f=>f,({repo:f,message:g})=>{o.stop(`Failed fetching blocks from ${P.cyan(f)}`),program.error(P.red(g));});t.verbose||o.stop(`Retrieved blocks from ${P.cyan(s.join(", "))}`),r(`Retrieved blocks from ${P.cyan(s.join(", "))}`);let p=Ye(a,n,t.cwd);p.length===0&&program.error(P.red(`You haven't installed any blocks yet. Did you mean to \`${P.bold("add")}\`?`));let c=e;if(t.all&&(c=p.map(f=>f.specifier)),c.length===0){let f=await multiselect({message:"Which blocks would you like to update?",options:p.filter(g=>g.block.list).map(g=>({label:`${P.cyan(g.block.category)}/${g.block.name}`,value:g.specifier})),required:!0});isCancel(f)&&(cancel("Canceled!"),process.exit(0)),c=f;}r(`Preparing to update ${P.cyan(c.join(", "))}`);let l=(await it(c,a,i)).match(f=>f,program.error),y=(await detect({cwd:t.cwd}))?.agent??"npm",u=[],k=new Set,x=new Set,{prettierOptions:A,biomeOptions:m}=await ht({formatter:n.formatter,cwd:t.cwd}),R=$e(n.paths,t.cwd);R.isErr()&&program.error(P.red(R.unwrapErr()));let M=R.unwrap();for(let{block:f}of l){let g=`${f.sourceRepo.url}/${f.category}/${f.name}`,E=yt(X.package.version,f.sourceRepo.url),b=f.sourceRepo;r(`Attempting to add ${g}`);let _;M[f.category]!==void 0?_=Q.join(t.cwd,M[f.category]):_=Q.join(t.cwd,M["*"],f.category);let h=[],S=async d=>{let w=await b.provider.fetchRaw(b,d,{verbose:r});return w.isErr()&&(o.stop(P.red(`Error fetching ${P.bold(d)}`)),program.error(P.red(`There was an error trying to get ${g}`))),w.unwrap()};for(let d of f.files){if(!n.includeTests&&ue(d))continue;let w=Q.join(f.directory,d),$;f.subdirectory?$=Q.join(_,f.name,d):$=Q.join(_,d);let v=await S(w);Ae.mkdirSync($.slice(0,$.length-d.length),{recursive:!0}),h.push({content:v,destPath:$,fileName:d});}process.stdout.write(`${W}
60
- `),process.stdout.write(`${W} ${g}
61
- `);for(let d of h){let w=await Ut({file:d,biomeOptions:m,prettierOptions:A,config:n,imports:f._imports_,watermark:E,verbose:r,cwd:t.cwd});w.isErr()&&program.error(P.red(w.unwrapErr()));let $=w.unwrap(),v=t.yes;if(!t.yes){process.stdout.write(`${W}
62
- `);let j="";Ae.existsSync(d.destPath)&&(j=Ae.readFileSync(d.destPath).toString());let z=diffLines(j,$),ce=Q.join(`${b.name}/${b.owner}/${b.repoName}`,d.fileName),ye=Q.relative(t.cwd,d.destPath),N=Ht({from:ce,to:ye,changes:z,expand:t.expand,maxUnchanged:t.maxUnchanged,colorAdded:P.greenBright,colorRemoved:P.redBright,colorCharsAdded:P.bgGreenBright,colorCharsRemoved:P.bgRedBright,prefix:()=>`${W} `,onUnchanged:({from:B,to:ee,prefix:et})=>`${et?.()??""}${P.cyan(B)} \u2192 ${P.gray(ee)} ${P.gray("(unchanged)")}
63
- `,intro:({from:B,to:ee,changes:et,prefix:ze})=>{let br=et.filter(wo=>wo.added).length;return `${ze?.()??""}${P.cyan(B)} \u2192 ${P.gray(ee)} (${br} change${br===1?"":"s"})
64
- ${ze?.()??""}
65
- `}});if(process.stdout.write(N),z.length>1||j===""){let B=await confirm({message:"Accept changes?",initialValue:!0});isCancel(B)&&(cancel("Canceled!"),process.exit(0)),v=B;}}v&&await xt([{loadingMessage:`Writing changes to ${P.cyan(d.destPath)}`,completedMessage:`Wrote changes to ${P.cyan(d.destPath)}.`,run:async()=>Ae.writeFileSync(d.destPath,$)}],{verbose:t.verbose?r:void 0});}if(n.includeTests&&f.tests){r("Trying to include tests");let{devDependencies:d}=JSON.parse(Ae.readFileSync(Q.join(t.cwd,"package.json")).toString());(d===void 0||d.vitest===void 0)&&k.add("vitest");}for(let d of f.devDependencies)k.add(d);for(let d of f.dependencies)x.add(d);}await xt(u,{verbose:t.verbose?r:void 0});let F=Dt(x,k,{cwd:t.cwd});if(x=F.dependencies,k=F.devDependencies,x.size>0||k.size>0){let f=t.yes;if(!t.yes){let b=await confirm({message:"Would you like to install dependencies?",initialValue:!0});isCancel(b)&&(cancel("Canceled!"),process.exit(0)),f=b;}f&&(x.size>0&&(t.verbose||o.start(`Installing dependencies with ${P.cyan(y)}`),(await Ne({pm:y,deps:Array.from(x),dev:!1,cwd:t.cwd})).match(b=>{t.verbose||o.stop(`Installed ${P.cyan(b.join(", "))}`);},b=>{t.verbose||o.stop("Failed to install dependencies"),program.error(b);})),k.size>0&&(t.verbose||o.start(`Installing dependencies with ${P.cyan(y)}`),(await Ne({pm:y,deps:Array.from(k),dev:!0,cwd:t.cwd})).match(b=>{t.verbose||o.stop(`Installed ${P.cyan(b.join(", "))}`);},b=>{t.verbose||o.stop("Failed to install dev dependencies"),program.error(b);})));let g=[];if(!f){if(x.size>0){let b=resolveCommand(y,"install",[...x]);g.push(`Install dependencies \`${P.cyan(`${b?.command} ${b?.args.join(" ")}`)}\``);}if(k.size>0){let b=resolveCommand(y,"install",[...k,"-D"]);g.push(`Install dev dependencies \`${P.cyan(`${b?.command} ${b?.args.join(" ")}`)}\``);}}g=g.map((b,_)=>`${_+1}. ${b}`),f||g.push(""),g.push("Import and use the blocks!");let E=vt(g);process.stdout.write(E);}};var go=e=>{let t=fileURLToPath(import.meta.url);return Q.join(t,"../..",e)},{version:ho,name:yo,description:vo,repository:Ps}=JSON.parse(Ae.readFileSync(go("package.json"),"utf-8")),X={package:{name:yo,description:vo,version:ho,repository:Ps},resolveRelativeToRoot:go};console.clear();program.name(yo).description(vo).version(ho).addCommand(ir).addCommand(lr).addCommand(pr).addCommand(fr).addCommand(gr).addCommand(yr).addCommand(wr).addCommand(kr);program.parse();export{X as context};
64
+ `}});process.stdout.write(T);}break}l||program.error(P.red(`Invalid block! ${P.bold(c)} does not exist!`));}};var os=C.objectWithRest({repo:C.optional(C.string()),allow:C.boolean(),cwd:C.string()},C.unknown()),wr=new Command("exec").alias("x").description("Execute a block as a script.").addArgument(new Argument("script","Name of the script you want to execute. ex: (general/hello, github/ieedan/std/general/hello)").argOptional()).option("--repo <repo>","Repository to download and run the script from.").option("-A, --allow","Allow jsrepo to download code from the provided repo.",!1).option("--cwd <path>","The current working directory.",process.cwd()).allowExcessArguments().allowUnknownOption().action(async(e,t,r)=>{let o=C.parse(os,t);se(X),await ns(e,o,r);}),ns=async(e,t,r)=>{let o=e,n=spinner(),s=we(t.cwd),i=s.isErr(),a;s.isErr()?a={$schema:"",includeTests:!1,watermark:!0,paths:{"*":"./"},repos:[]}:a=s.unwrap();let d=a.repos;if(t.repo&&(d=[t.repo]),o&&q.find(p=>o?.startsWith(p.name()))){let[p,w,$,...v]=o.split("/"),j;if(v.length>2?j=`${p}/${w}/${$}/${v.slice(0,v.length-2).join("/")}`:j=`${p}/${w}/${$}`,!d.find(z=>z===j)){if(!t.allow){let z=await confirm({message:`Allow ${fe} to download and run code from ${P.cyan(j)}?`,initialValue:!0});(isCancel(z)||!z)&&(cancel("Canceled!"),process.exit(0));}d=[j];}}if(!t.allow&&t.repo){let p=await confirm({message:`Allow ${fe} to download and run code from ${P.cyan(t.repo)}?`,initialValue:!0});(isCancel(p)||!p)&&(cancel("Canceled!"),process.exit(0));}d.length===0&&(i&&program.error(P.red(`Fully quality your script ex: (github/ieedan/std/scripts/build) or provide the \`${P.bold("--repo")}\` flag to specify a registry.`)),program.error(P.red(`There were no repos present in your config and you didn't provide the \`${P.bold("--repo")}\` flag with a repo.`))),n.start(`Fetching scripts from ${P.cyan(d.join(", "))}`);let c=(await Ye(...d)).match(p=>p,({repo:p,message:w})=>{n.stop(`Failed to get info for ${P.cyan(p)}`),program.error(P.red(w));}),l=(await Ke(...c)).match(p=>p,({repo:p,message:w})=>{n.stop(`Failed fetching scripts from ${P.cyan(p)}`),program.error(P.red(w));});if(n.stop(`Retrieved scripts from ${P.cyan(d.join(", "))}`),!o){let p=await select({message:"Select which script to run.",options:Array.from(l.entries()).filter(([w,$])=>$.list).map(([w,$])=>{let v;return d.length>1?v=`${P.cyan(`${$.sourceRepo.name}/${$.sourceRepo.owner}/${$.sourceRepo.repoName}/${$.category}`)}/${$.name}`:v=`${P.cyan($.category)}/${$.name}`,{label:v,value:w}})});isCancel(p)&&(cancel("Canceled!"),process.exit(0)),o=p;}let y=(await it([o],l,c)).match(p=>p,p=>program.error(p)),u="temp-jsrepo-exec",b=`./${u}/${encodeURIComponent(o)}`,x=ee.join(process.cwd(),b);a.paths["*"]=b,Le.mkdirSync(x,{recursive:!0});let L=(await detect({cwd:process.cwd()}))?.agent??"npm",m=[],R=new Set,M=new Set,_=$e(a.paths,t.cwd);_.isErr()&&program.error(P.red(_.unwrapErr()));let B=_.unwrap(),f=[];for(let{block:p}of y){let w=`${p.sourceRepo.url}/${p.category}/${p.name}`,$=`${p.category}/${p.name}`,v=p.sourceRepo,j=ee.join(t.cwd,B["*"],p.category);f.push($),m.push({run:async({message:z})=>{z(`Adding ${P.cyan(w)}`),Le.mkdirSync(j,{recursive:!0});let le=[],ye=async N=>{let F=await v.provider.fetchRaw(v,N);return F.isErr()&&(n.stop(P.red(`Error fetching ${P.bold(N)}`)),program.error(P.red(`There was an error trying to get ${w}`))),F.unwrap()};for(let N of p.files){if(!a.includeTests&&ue(N))continue;let F=ee.join(p.directory,N),te;p.subdirectory?te=ee.join(j,p.name,N):te=ee.join(j,N);let tt=await ye(F),Ue=te.slice(0,te.length-N.length);Le.mkdirSync(Ue,{recursive:!0}),le.push({content:tt,destPath:te});}for(let N of le)Le.writeFileSync(N.destPath,N.content);if(a.includeTests&&p.tests){let{devDependencies:N}=JSON.parse(Le.readFileSync(ee.join(t.cwd,"package.json")).toString());(N===void 0||N.vitest===void 0)&&R.add("vitest");}for(let N of p.devDependencies)R.add(N);for(let N of p.dependencies)M.add(N);}});}if(await qt({startMessage:"Adding blocks",stopMessage:`Added ${P.cyan(f.join(", "))}`,tasks:m}),M.size>0||R.size>0){let p={name:"temp-package",type:"module",version:"0.0.1"},w=ee.join(x,"package.json");Le.writeFileSync(w,JSON.stringify(p,null," ")),M.size>0&&(t.verbose||n.start(`Installing dependencies with ${P.cyan(L)}`),(await Ne({pm:L,deps:Array.from(M),dev:!1,cwd:x,ignoreWorkspace:!0})).match($=>{t.verbose||n.stop(`Installed ${P.cyan($.join(", "))}`);},$=>{t.verbose||n.stop("Failed to install dependencies"),program.error($);})),R.size>0&&(t.verbose||n.start(`Installing dependencies with ${P.cyan(L)}`),(await Ne({pm:L,deps:Array.from(R),dev:!0,cwd:x,ignoreWorkspace:!0})).match($=>{t.verbose||n.stop(`Installed ${P.cyan($.join(", "))}`);},$=>{t.verbose||n.stop("Failed to install dev dependencies"),program.error($);}));}let I=r.parent.rawArgs.findIndex(p=>p==="--"),k=[];I!==-1&&(k=r.parent.rawArgs.slice(I+1)),console.clear();let W=y[0],h;W.block.subdirectory?h=ee.join(x,`${W.block.category}/${W.block.name}/index.js`):h=ee.join(x,`${W.block.category}/${W.block.name}.js`);let T=resolveCommand(L,"execute",["tsx",h,...k]);T||program.error(P.red("Error resolving run command!"));try{await execa(T.command,T.args,{cwd:process.cwd(),stdin:process.stdin,stdout:process.stdout});}finally{Le.rmSync(ee.join(process.cwd(),u),{recursive:!0,force:!0});}};var ps=C.object({repos:C.optional(C.array(C.string())),watermark:C.boolean(),tests:C.optional(C.boolean()),formatter:C.optional(rr),project:C.optional(C.boolean()),registry:C.optional(C.boolean()),script:C.string(),yes:C.boolean(),cwd:C.string()}),br=new Command("init").description("Initializes your project with a configuration file.").option("--repos [repos...]","Repository to install the blocks from.").option("--no-watermark","Will not add a watermark to each file upon adding it to your project.").option("--tests","Will include tests with the blocks.").addOption(new Option("--formatter <formatter>","What formatter to use when adding or updating blocks.").choices(["prettier","biome"])).option("-P, --project","Takes you through the steps to initialize a project.").option("-R, --registry","Takes you through the steps to initialize a registry.").option("--script <name>","The name of the build script. (For Registry setup)","build:registry").option("-y, --yes","Skip confirmation prompt.",!1).option("--cwd <path>","The current working directory.",process.cwd()).action(async e=>{let t=C.parse(ps,e);if(se(X),t.registry!==void 0&&t.project!==void 0&&program.error(P.red(`You cannot provide both ${P.bold("--project")} and ${P.bold("--registry")} at the same time.`)),t.registry===void 0&&t.project===void 0){let r=await select({message:"Initialize a project or registry?",options:[{value:"project",label:"project"},{value:"registry",label:"registry"}],initialValue:"project"});isCancel(r)&&(cancel("Canceled!"),process.exit(0)),t.registry=r==="registry";}t.registry?await ms(t):await fs(t),outro(P.green("All done!"));}),fs=async e=>{let t=ne(),r=we(e.cwd),o=spinner(),n,s=await text({message:"Please enter a default path to install the blocks",validate(y){if(y.trim()==="")return "Please provide a value"},initialValue:r.isOk()?r.unwrap().paths["*"]:"./src/blocks"});if(isCancel(s)&&(cancel("Canceled!"),process.exit(0)),r.isOk()?n={...r.unwrap().paths,"*":s}:n={"*":s},!e.repos)for(e.repos=r.isOk()?r.unwrap().repos:[];;){let y=await confirm({message:`Add ${e.repos.length>0?"another":"a"} repo?`,initialValue:e.repos.length===0});if(isCancel(y)&&(cancel("Canceled!"),process.exit(0)),!y)break;let u=await text({message:"Where should we download the blocks from?",placeholder:"github/ieedan/std",validate:_=>{if(_.trim().length===0)return "Please provide a value";if(!q.find(B=>B.matches(_)))return `Invalid provider! Valid providers (${q.map(B=>B.name()).join(", ")})`}});isCancel(u)&&(cancel("Canceled!"),process.exit(0));let b=q.find(_=>_.matches(u));b||program.error(P.red("Invalid provider!"));let x=`${b.name()}-token`;if(!t.get(x)){let _=await confirm({message:"Would you like to add an auth token?",initialValue:!1});if(isCancel(_)&&(cancel("Canceled!"),process.exit(0)),_){let B=await password({message:"Paste your token",validate(f){if(f.trim()==="")return "Please provide a value"}});isCancel(B)&&(cancel("Canceled!"),process.exit(0)),t.set(x,B);}}o.start(`Fetching categories from ${P.cyan(u)}`);let m=await b.fetchManifest(u);o.stop(`Fetched categories from ${P.cyan(u)}`),m.isErr()&&program.error(P.red(m.unwrapErr()));let R=m.unwrap(),M=await multiselect({message:"Which category paths would you like to configure?",options:R.map(_=>({label:_.name,value:_.name})),required:!1});if(isCancel(M)&&(cancel("Canceled!"),process.exit(0)),M.length>0)for(let _ of M){let B=n[_],f=await text({message:`Where should ${_} be added in your project?`,validate(g){if(g.trim()==="")return "Please provide a value"},placeholder:B||`./src/${_}`,defaultValue:B,initialValue:B});isCancel(f)&&(cancel("Canceled!"),process.exit(0)),n[_]=f;}e.repos.push(u);}if(!e.formatter){let y=r.isErr()?"none":r.unwrap().formatter??"none";Le.existsSync(ee.join(e.cwd,".prettierrc"))&&(y="prettier"),Le.existsSync(ee.join(e.cwd,"biome.json"))&&(y="biome");let u=await select({message:"What formatter would you like to use?",options:["Prettier","Biome","None"].map(b=>({value:b.toLowerCase(),label:b})),initialValue:y});isCancel(u)&&(cancel("Canceled!"),process.exit(0)),u!=="none"&&(e.formatter=u);}let i={$schema:`https://unpkg.com/jsrepo@${X.package.version}/schemas/project-config.json`,repos:e.repos,includeTests:r.isOk()&&e.tests===void 0?r.unwrap().includeTests:e.tests??!1,watermark:e.watermark,formatter:e.formatter,paths:n};o.start(`Writing config to \`${rt}\``);let{prettierOptions:a,biomeOptions:d}=await yt({formatter:i.formatter,cwd:e.cwd}),c=ee.join(e.cwd,rt),l=await ar.format(JSON.stringify(i,null," "),{biomeOptions:d,prettierOptions:a,filePath:c,formatter:i.formatter});Le.writeFileSync(c,l),o.stop(`Wrote config to \`${rt}\`.`);},ms=async e=>{let t=spinner(),r=ee.join(e.cwd,"package.json");Le.existsSync(r)||program.error(P.red(`Couldn't find your ${P.bold("package.json")}!`));let o=Lt(e.cwd).match(m=>m,m=>program.error(P.red(m))),n=o===null;for(o||(o={$schema:"",dirs:[],doNotListBlocks:[],doNotListCategories:[],listBlocks:[],listCategories:[],excludeDeps:[],includeBlocks:[],includeCategories:[],excludeBlocks:[],excludeCategories:[],preview:!1}),o.$schema=`https://unpkg.com/jsrepo@${X.package.version}/schemas/registry-config.json`;;){if(o.dirs.length>0){let R=await confirm({message:"Add another blocks directory?",initialValue:!1});if(isCancel(R)&&(cancel("Canceled!"),process.exit(0)),!R)break}let m=await text({message:"Where are your blocks located?",placeholder:"./src",defaultValue:"./src",initialValue:"./src",validate:R=>{if(R.trim().length===0)return "Please provide a value!"}});isCancel(m)&&(cancel("Canceled!"),process.exit(0)),o.dirs.push(m);}let s=JSON.parse(Le.readFileSync(r).toString());for(;!e.yes&&s.scripts&&s.scripts[e.script];){let m=await confirm({message:`The \`${P.cyan(e.script)}\` already exists overwrite?`,initialValue:!1});if(isCancel(m)&&(cancel("Canceled!"),process.exit(0)),m)break;{let R=await text({message:"What would you like to call the script?",placeholder:"build:registry",validate:M=>{if(M.trim().length===0)return "Please provide a value!"}});isCancel(R)&&(cancel("Canceled!"),process.exit(0)),e.script=R;}}let i=s.devDependencies&&s.devDependencies.jsrepo!==void 0,a=e.yes||i;if(!e.yes&&!i){let m=await confirm({message:`Add ${fe} as a dev dependency?`,initialValue:!0});isCancel(m)&&(cancel("Canceled!"),process.exit(0)),a=m;}let d=!n;if(!e.yes&&n){let m=await confirm({message:`Create a \`${P.cyan(Ge)}\` file?`,initialValue:!0});isCancel(m)&&(cancel("Canceled!"),process.exit(0)),d=m;}let c=(await detect$1({cwd:"cwd"}))?.agent??"npm",l="";if(a)l+="jsrepo build";else {let m=resolveCommand$1(c,"execute",["jsrepo","build"]);m||program.error(P.red(`Error resolving execute command for ${c}`)),l+=`${m.command} ${m.args.join(" ")} `;}d||(l+=` --dirs ${o.dirs.join(" ")} `),s.scripts===void 0&&(s.scripts={}),s.scripts[e.script]=l;let y=[];y.push({loadingMessage:`Adding \`${P.cyan(e.script)}\` to scripts in package.json`,completedMessage:`Added \`${P.cyan(e.script)}\` to scripts in package.json`,run:async()=>{try{Le.writeFileSync(r,JSON.stringify(s,null," "));}catch(m){program.error(P.red(`Error writing to \`${P.bold(r)}\`. Error: ${m}`));}}}),d&&y.push({loadingMessage:`Writing config to \`${P.cyan(Ge)}\``,completedMessage:`Wrote config to \`${P.cyan(Ge)}\``,run:async()=>{let m=ee.join(e.cwd,Ge);try{Le.writeFileSync(ee.join(m),JSON.stringify(o,null," "));}catch(R){program.error(P.red(`Error writing to \`${P.bold(m)}\`. Error: ${R}`));}}}),await It(y,{});let u=i;if(a&&!i){let m=e.yes;if(!e.yes){let R=await confirm({message:"Install dependencies?",initialValue:!0});isCancel(R)&&(cancel("Canceled!"),process.exit(0)),m=R;}m&&(t.start(`Installing ${fe}`),(await Ne({pm:c,deps:["jsrepo"],dev:!0,cwd:e.cwd})).match(()=>t.stop(`Installed ${fe}.`),M=>{t.stop(`Failed to install ${fe}.`),program.error(M);}),u=!0);}let b=[];if(!u&&a){let m=resolveCommand$1(c,"install",["jsrepo","-D"]);b.push(`Install ${fe} as a dev dependency \`${P.cyan(`${m?.command} ${m?.args.join(" ")}`)}\``);}b.push(`Add categories to \`${P.cyan(o.dirs.join(", "))}\`.`);let x=resolveCommand$1(c,"run",[e.script]);b.push(`Run \`${P.cyan(`${x?.command} ${x?.args.join(" ")}`)}\` to build the registry.`),b=b.map((m,R)=>`${R+1}. ${m}`);let L=wt(b);process.stdout.write(L);};var xs=C.object({repo:C.optional(C.string()),allow:C.boolean(),debug:C.boolean(),verbose:C.boolean(),cwd:C.string()}),Rr=new Command("test").description("Tests local blocks against most recent remote tests.").addArgument(new Argument("[blocks...]","The blocks you want to test.").default([])).option("--repo <repo>","Repository to download the blocks from.").option("-A, --allow","Allow jsrepo to download code from the provided repo.",!1).option("--debug","Leaves the temp test file around for debugging upon failure.",!1).option("--verbose","Include debug logs.",!1).option("--cwd <path>","The current working directory.",process.cwd()).action(async(e,t)=>{let r=C.parse(xs,t);se(X),await js(e,r),outro(P.green("All done!"));}),js=async(e,t)=>{let r=f=>{t.verbose&&console.info(`${mt} ${f}`);};r(`Attempting to test ${JSON.stringify(e)}`);let o=we(t.cwd).match(f=>f,f=>program.error(P.red(f))),n=spinner(),s=new Map,i=o.repos;if(t.repo&&(i=[t.repo]),!t.allow&&t.repo){let f=await confirm({message:`Allow ${P.cyan("jsrepo")} to download and run code from ${P.cyan(t.repo)}?`,initialValue:!0});(isCancel(f)||!f)&&(cancel("Canceled!"),process.exit(0));}r(`Fetching blocks from ${P.cyan(i.join(", "))}`),t.verbose||n.start(`Fetching blocks from ${P.cyan(i.join(", "))}`);for(let f of i){let g=(await st(f)).match(W=>W,W=>program.error(P.red(W))),I=await g.provider.fetchManifest(g);r(`Got info for provider ${P.cyan(g.name)}`),I.isErr()&&(t.verbose||n.stop(`Error fetching ${P.cyan(f)}`),program.error(P.red(`There was an error fetching the \`${be}\` from the repository ${P.cyan(f)} make sure the target repository has a \`${be}\` in its root?`)));let k=I.unwrap();for(let W of k)for(let h of W.blocks)s.set(`${g.name}/${g.owner}/${g.repoName}/${W.name}/${h.name}`,{...h,sourceRepo:g});}r(`Retrieved blocks from ${P.cyan(i.join(", "))}`),t.verbose||n.stop(`Retrieved blocks from ${P.cyan(i.join(", "))}`);let a=ee.resolve(ee.join(t.cwd,`blocks-tests-temp-${Date.now()}`));r(`Trying to create the temp directory ${P.bold(a)}.`),Le.mkdirSync(a,{recursive:!0});let d=()=>{Le.rmSync(a,{recursive:!0,force:!0});},c=Ze(s,o,t.cwd).map(f=>f.specifier),l=e;e.length===0&&(l=c),l.length===0&&(d(),program.error(P.red("There were no blocks found in your project!")));let y=[];for(let f of l){let g;if(q.find(I=>f.startsWith(I.name()))){if(i.length===0){let[I,k,W,...h]=f.split("/"),T;h.length>2?T=`${I}/${k}/${W}/${h.slice(0,h.length-2).join("/")}`:T=`${I}/${k}/${W}`;let p=(await st(T)).match($=>$,$=>program.error(P.red($))),w=(await p.provider.fetchManifest(p)).match($=>$,$=>program.error(P.red($)));for(let $ of w)for(let v of $.blocks)s.set(`${p.name}/${p.owner}/${p.repoName}/${$.name}/${v.name}`,{...v,sourceRepo:p});}g=s.get(f);}else for(let I of i){let k=(await st(I)).unwrap(),W=s.get(`${k.name}/${k.owner}/${k.repoName}/${f}`);if(W!==void 0){g=W;break}}g||program.error(P.red(`Invalid block! ${P.bold(f)} does not exist!`)),y.push({name:f,block:g});}let u=$e(o.paths,t.cwd);u.isErr()&&program.error(P.red(u.unwrapErr()));let b=u.unwrap();for(let{block:f}of y){let g=f.sourceRepo,I=`${f.sourceRepo.url}/${f.category}/${f.name}`;if(t.verbose||n.start(`Setting up test file for ${P.cyan(I)}`),!f.tests){n.stop(`No tests found for ${P.cyan(I)}`);continue}let k;b[f.category]!==void 0?k=ee.join(t.cwd,b[f.category]):k=ee.join(t.cwd,b["*"],f.category),k=ee.relative(a,k);let W=async p=>{let w=await g.provider.fetchRaw(g,p);return w.isErr()&&(n.stop(P.red(`Error fetching ${P.bold(p)}`)),program.error(P.red(`There was an error trying to get ${I}`))),w.unwrap()};r(`Downloading and copying test files for ${I}`);let h=[];for(let p of f.files.filter(w=>ue(w))){let w=await W(ee.join(f.directory,p)),$=ee.join(a,p);Le.writeFileSync($,w),h.push($);}let T=new Project;for(let p of h){r(`Opening test file ${p}`);let w=T.addSourceFileAtPath(p);for(let $ of w.getImportDeclarations()){let v=$.getModuleSpecifierValue(),j;v.startsWith(".")&&(f.subdirectory?j=ee.join(k,f.name,v):j=ee.join(k,v)),j&&$.setModuleSpecifier(j.replaceAll(/\\/g,"/"));}}T.saveSync(),r(`Completed ${P.cyan.bold(I)} test file`),t.verbose||n.stop(`Completed setup for ${P.bold(I)}`);}r("Beginning testing");let x=await detect({cwd:t.cwd});x==null&&program.error(P.red("Could not detect package manager"));let L=resolveCommand(x.agent,"execute",["vitest","run",a]);L==null&&program.error(P.red(`Could not resolve add command for '${x.agent}'.`));let{command:m,args:R}=L,M=`${m} ${R.join(" ")}`,_=execa({cwd:t.cwd,stdio:["ignore","pipe","pipe"]})`${M}`,B=f=>console.info(f.toString());_.stdout.on("data",B),_.stderr.on("data",B);try{await _,d();}catch(f){t.debug?console.info(`${P.bold("--debug")} flag provided. Skipping cleanup. Run '${P.bold(M)}' to retry tests.
65
+ `):d(),program.error(P.red(`Tests failed! Error ${f}`));}};var Os=C.object({all:C.boolean(),expand:C.boolean(),maxUnchanged:C.number(),repo:C.optional(C.string()),allow:C.boolean(),yes:C.boolean(),verbose:C.boolean(),cwd:C.string()}),xr=new Command("update").description("Update blocks to the code in the remote repository.").argument("[blocks...]","Names of the blocks you want to update. ex: (utils/math)").option("--all","Update all installed components.",!1).option("-E, --expand","Expands the diff so you see everything.",!1).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.",!1).option("-y, --yes","Skip confirmation prompt.",!1).option("--verbose","Include debug logs.",!1).option("--cwd <path>","The current working directory.",process.cwd()).action(async(e,t)=>{let r=C.parse(Os,t);se(X),await As(e,r),outro(P.green("All done!"));}),As=async(e,t)=>{let r=f=>{t.verbose&&console.info(`${mt} ${f}`);};r(`Attempting to update ${JSON.stringify(e)}`);let o=spinner(),n=we(t.cwd).match(f=>f,f=>program.error(P.red(f))),s=n.repos;t.repo&&(s=[t.repo]);for(let f of e)q.find(g=>f.startsWith(g.name()))&&program.error(P.red(`Invalid value provided for block names \`${P.bold(f)}\`. Block names are expected to be provided in the format of \`${P.bold("<category>/<name>")}\``));if(!t.allow&&t.repo){let f=await confirm({message:`Allow ${P.cyan("jsrepo")} to download and run code from ${P.cyan(t.repo)}?`,initialValue:!0});(isCancel(f)||!f)&&(cancel("Canceled!"),process.exit(0));}r(`Resolving ${P.cyan(s.join(", "))}`),t.verbose||o.start(`Fetching blocks from ${P.cyan(s.join(", "))}`);let i=(await Ye(...s)).match(f=>f,({repo:f,message:g})=>{o.stop(`Failed to get info for ${P.cyan(f)}`),program.error(P.red(g));});r(`Resolved ${P.cyan(s.join(", "))}`),r(`Fetching blocks from ${P.cyan(s.join(", "))}`);let a=(await Ke(...i)).match(f=>f,({repo:f,message:g})=>{o.stop(`Failed fetching blocks from ${P.cyan(f)}`),program.error(P.red(g));});t.verbose||o.stop(`Retrieved blocks from ${P.cyan(s.join(", "))}`),r(`Retrieved blocks from ${P.cyan(s.join(", "))}`);let d=Ze(a,n,t.cwd);d.length===0&&program.error(P.red(`You haven't installed any blocks yet. Did you mean to \`${P.bold("add")}\`?`));let c=e;if(t.all&&(c=d.map(f=>f.specifier)),c.length===0){let f=await multiselect({message:"Which blocks would you like to update?",options:d.filter(g=>g.block.list).map(g=>({label:`${P.cyan(g.block.category)}/${g.block.name}`,value:g.specifier})),required:!0});isCancel(f)&&(cancel("Canceled!"),process.exit(0)),c=f;}r(`Preparing to update ${P.cyan(c.join(", "))}`);let l=(await it(c,a,i)).match(f=>f,program.error),y=(await detect({cwd:t.cwd}))?.agent??"npm",u=[],b=new Set,x=new Set,{prettierOptions:L,biomeOptions:m}=await yt({formatter:n.formatter,cwd:t.cwd}),R=$e(n.paths,t.cwd);R.isErr()&&program.error(P.red(R.unwrapErr()));let M=R.unwrap();for(let{block:f}of l){let g=`${f.sourceRepo.url}/${f.category}/${f.name}`,I=vt(X.package.version,f.sourceRepo.url),k=f.sourceRepo;r(`Attempting to add ${g}`);let W;M[f.category]!==void 0?W=ee.join(t.cwd,M[f.category]):W=ee.join(t.cwd,M["*"],f.category);let h=[],T=async p=>{let w=await k.provider.fetchRaw(k,p,{verbose:r});return w.isErr()&&(o.stop(P.red(`Error fetching ${P.bold(p)}`)),program.error(P.red(`There was an error trying to get ${g}`))),w.unwrap()};for(let p of f.files){if(!n.includeTests&&ue(p))continue;let w=ee.join(f.directory,p),$;f.subdirectory?$=ee.join(W,f.name,p):$=ee.join(W,p);let v=await T(w);Le.mkdirSync($.slice(0,$.length-p.length),{recursive:!0}),h.push({content:v,destPath:$,fileName:p});}process.stdout.write(`${O}
66
+ `),process.stdout.write(`${O} ${g}
67
+ `);for(let p of h){let w=await Ht({file:p,biomeOptions:m,prettierOptions:L,config:n,imports:f._imports_,watermark:I,verbose:r,cwd:t.cwd});w.isErr()&&program.error(P.red(w.unwrapErr()));let $=w.unwrap(),v=t.yes;if(!t.yes){process.stdout.write(`${O}
68
+ `);let j="";Le.existsSync(p.destPath)&&(j=Le.readFileSync(p.destPath).toString());let z=diffLines(j,$),le=ee.join(`${k.name}/${k.owner}/${k.repoName}`,p.fileName),ye=ee.relative(t.cwd,p.destPath),N=Kt({from:le,to:ye,changes:z,expand:t.expand,maxUnchanged:t.maxUnchanged,colorAdded:P.greenBright,colorRemoved:P.redBright,colorCharsAdded:P.bgGreenBright,colorCharsRemoved:P.bgRedBright,prefix:()=>`${O} `,onUnchanged:({from:F,to:te,prefix:tt})=>`${tt?.()??""}${P.cyan(F)} \u2192 ${P.gray(te)} ${P.gray("(unchanged)")}
69
+ `,intro:({from:F,to:te,changes:tt,prefix:Ue})=>{let Er=tt.filter(Co=>Co.added).length;return `${Ue?.()??""}${P.cyan(F)} \u2192 ${P.gray(te)} (${Er} change${Er===1?"":"s"})
70
+ ${Ue?.()??""}
71
+ `}});if(process.stdout.write(N),z.length>1||j===""){let F=await confirm({message:"Accept changes?",initialValue:!0});isCancel(F)&&(cancel("Canceled!"),process.exit(0)),v=F;}}v&&await It([{loadingMessage:`Writing changes to ${P.cyan(p.destPath)}`,completedMessage:`Wrote changes to ${P.cyan(p.destPath)}.`,run:async()=>Le.writeFileSync(p.destPath,$)}],{verbose:t.verbose?r:void 0});}if(n.includeTests&&f.tests){r("Trying to include tests");let{devDependencies:p}=JSON.parse(Le.readFileSync(ee.join(t.cwd,"package.json")).toString());(p===void 0||p.vitest===void 0)&&b.add("vitest");}for(let p of f.devDependencies)b.add(p);for(let p of f.dependencies)x.add(p);}await It(u,{verbose:t.verbose?r:void 0});let _=Bt(x,b,{cwd:t.cwd});if(x=_.dependencies,b=_.devDependencies,x.size>0||b.size>0){let f=t.yes;if(!t.yes){let k=await confirm({message:"Would you like to install dependencies?",initialValue:!0});isCancel(k)&&(cancel("Canceled!"),process.exit(0)),f=k;}f&&(x.size>0&&(t.verbose||o.start(`Installing dependencies with ${P.cyan(y)}`),(await Ne({pm:y,deps:Array.from(x),dev:!1,cwd:t.cwd})).match(k=>{t.verbose||o.stop(`Installed ${P.cyan(k.join(", "))}`);},k=>{t.verbose||o.stop("Failed to install dependencies"),program.error(k);})),b.size>0&&(t.verbose||o.start(`Installing dependencies with ${P.cyan(y)}`),(await Ne({pm:y,deps:Array.from(b),dev:!0,cwd:t.cwd})).match(k=>{t.verbose||o.stop(`Installed ${P.cyan(k.join(", "))}`);},k=>{t.verbose||o.stop("Failed to install dev dependencies"),program.error(k);})));let g=[];if(!f){if(x.size>0){let k=resolveCommand(y,"install",[...x]);g.push(`Install dependencies \`${P.cyan(`${k?.command} ${k?.args.join(" ")}`)}\``);}if(b.size>0){let k=resolveCommand(y,"install",[...b,"-D"]);g.push(`Install dev dependencies \`${P.cyan(`${k?.command} ${k?.args.join(" ")}`)}\``);}}g=g.map((k,W)=>`${W+1}. ${k}`),f||g.push(""),g.push("Import and use the blocks!");let I=wt(g);process.stdout.write(I);}};var jr="latest-version",Ls=60*60*1e3,vo=async()=>{try{let e=ne(),t,r=e.get(jr);if(r){if(r.expiration>Date.now())return t=r.version,E(t);e.delete(jr);}let o=new AbortController,n=setTimeout(()=>{o.abort();},1e3),s=await fetch("https://raw.githubusercontent.com/ieedan/jsrepo/refs/heads/main/packages/cli/package.json",{signal:o.signal});if(clearTimeout(n),!s.ok)return S("Error getting version");let{version:i}=await s.json();return t=i,e.set(jr,{expiration:Date.now()+Ls,version:t}),E(t)}catch(e){return S(`Error getting version: ${e}`)}};var wo=e=>{let t=fileURLToPath(import.meta.url);return ee.join(t,"../..",e)},{version:$o,name:bo,description:ko,repository:Vs}=JSON.parse(Le.readFileSync(wo("package.json"),"utf-8")),Ms=(await vo()).match(e=>e,()=>{}),X={package:{name:bo,description:ko,version:$o,repository:Vs,latestVersion:Ms},resolveRelativeToRoot:wo},Ro=program.name(bo).description(ko).version($o).addCommand(dr).addCommand(mr).addCommand(gr).addCommand(hr).addCommand(wr).addCommand(br).addCommand(Rr).addCommand(xr);Ro.parse();
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "jsrepo",
3
3
  "description": "A CLI to add shared code from remote repositories.",
4
- "version": "1.23.2",
4
+ "version": "1.23.4",
5
5
  "license": "MIT",
6
6
  "homepage": "https://jsrepo.dev",
7
7
  "author": {
@@ -36,7 +36,8 @@
36
36
  "devDependencies": {
37
37
  "@biomejs/biome": "1.9.4",
38
38
  "@types/diff": "^6.0.0",
39
- "@types/node": "^22.10.3",
39
+ "@types/node": "^22.10.5",
40
+ "@types/semver": "^7.5.8",
40
41
  "@types/validate-npm-package-name": "^4.0.2",
41
42
  "tsup": "^8.3.5",
42
43
  "typescript": "^5.7.2",
@@ -60,11 +61,12 @@
60
61
  "octokit": "^4.0.3",
61
62
  "package-manager-detector": "^0.2.8",
62
63
  "parse5": "^7.2.1",
63
- "pathe": "^1.1.2",
64
+ "pathe": "^2.0.0",
64
65
  "prettier": "^3.4.2",
65
- "svelte": "^5.16.0",
66
+ "semver": "^7.6.3",
67
+ "svelte": "^5.16.1",
66
68
  "ts-morph": "^25.0.0",
67
- "valibot": "^0.42.1",
69
+ "valibot": "1.0.0-beta.9",
68
70
  "validate-npm-package-name": "^6.0.0"
69
71
  },
70
72
  "scripts": {
@@ -74,6 +76,7 @@
74
76
  "lint": "biome lint --write",
75
77
  "check": "biome check && tsc",
76
78
  "test": "vitest",
77
- "check:types": "tsc"
79
+ "check:types": "tsc",
80
+ "build:docs": "pnpm dlx tsx ./scripts/generate-docs.ts ../../sites/docs/static/docs/cli/llms.txt"
78
81
  }
79
82
  }