jsrepo 1.16.2 → 1.16.3

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 +40 -38
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -1,54 +1,56 @@
1
1
  #!/usr/bin/env node
2
- import Ce from'node:fs';import {fileURLToPath}from'node:url';import {Command,program,Option,Argument}from'commander';import H from'pathe';import {outro,spinner,confirm,isCancel,cancel,multiselect,text,select,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 lt from'node-fetch';import {Octokit}from'octokit';import {builtinModules}from'node:module';import {Biome,Distribution}from'@biomejs/js-api';import*as wt from'@vue/compiler-sfc';import {walk}from'estree-walker';import*as Xe from'prettier';import*as yr from'svelte/compiler';import {Project}from'ts-morph';import oo from'validate-npm-package-name';import Yr from'node:os';import Hr from'ansi-regex';import mo from'conf';import {execa}from'execa';import {detect as detect$1,resolveCommand as resolveCommand$1}from'package-manager-detector';import wo from'escape-string-regexp';import {diffLines,diffChars}from'diff';var D=P.gray("\u2502"),Pt=P.gray("\u2500"),rr=P.gray("\u2510"),or=P.gray("\u2518"),Tt=P.gray("\u251C");P.gray("\u250C");P.gray("\u2514");var fe=P.bgRgb(245,149,66).white("WARN"),qe=P.bgBlueBright.white("INFO"),nr=P.bgRedBright.white("ERROR"),ve=P.hex("#f7df1e")("jsrepo");var gt=class{_result;constructor(e){this._result=e;}match(e,r){return this._result.ok?e(this._result.val):r(this._result.err)}map(e){return this.match(r=>E(e(r)),r=>I(r))}mapOr(e,r){return this.match(o=>r(o),o=>e)}mapOrElse(e,r){return this.match(o=>r(o),o=>e(o))}mapErr(e){return this.match(r=>E(r),r=>I(e(r)))}mapErrOr(e,r){return this.match(o=>e,o=>r(o))}mapErrOrElse(e,r){return this.match(o=>e(o),o=>r(o))}isOk(){return this.match(()=>!0,()=>!1)}isErr(){return this.match(()=>!1,()=>!0)}unwrap(){return this.match(e=>e,()=>{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.")},e=>e)}unwrapOr(e){return this.match(r=>r,r=>e)}unwrapErrOr(e){return this.match(()=>e,r=>r)}unwrapOrElse(e){return this.match(r=>r,r=>e(r))}unwrapErrOrElse(e){return this.match(r=>e(r),r=>r)}expect(e){return this.match(r=>r,()=>{throw new Error(e)})}expectErr(e){return this.match(()=>{throw new Error(e)},r=>r)}},E=t=>new gt({ok:!0,val:t}),I=t=>new gt({ok:!1,err:t});var ir=(t,e)=>{let r=[];for(let[o,n]of t)r.push(e(o,n));return r};var _e="jsrepo.json",Oe="jsrepo-build-config.json",Ot=C.union([C.literal("prettier"),C.literal("biome")]),Ur=C.objectWithRest({"*":C.string()},C.string()),zr=C.object({$schema:C.string(),repos:C.optional(C.array(C.string()),[]),includeTests:C.boolean(),paths:Ur,watermark:C.optional(C.boolean(),!0),formatter:C.optional(Ot)}),$e=t=>{if(!Ce.existsSync(H.join(t,_e)))return I("Could not find your configuration file! Please run `init`.");let e=C.safeParse(zr,JSON.parse(Ce.readFileSync(H.join(t,_e)).toString()));return e.success?E(e.output):I(`There was an error reading your \`${_e}\` file!`)},Gr=C.object({$schema:C.string(),dirs:C.array(C.string()),includeBlocks:C.optional(C.array(C.string()),[]),includeCategories:C.optional(C.array(C.string()),[]),doNotListBlocks:C.optional(C.array(C.string()),[]),doNotListCategories:C.optional(C.array(C.string()),[]),excludeDeps:C.optional(C.array(C.string()),[]),output:C.boolean(),errorOnWarn:C.boolean()}),yt=t=>{if(!Ce.existsSync(H.join(t,Oe)))return E(null);let e=C.safeParse(Gr,JSON.parse(Ce.readFileSync(H.join(t,Oe)).toString()));return e.success?E(e.output):I(`There was an error reading your \`${Oe}\` file!`)},be=(t,e)=>{let r=getTsconfig(e,"tsconfig.json"),o=null;r||(r=getTsconfig(e,"jsconfig.json")),r&&(o=createPathsMatcher(r));let n;if(t["*"].startsWith("."))n={"*":H.relative(e,H.join(H.resolve(e),t["*"]))};else {if(o===null)return I("Cannot resolve aliases because we couldn't find a tsconfig!");n={"*":ar(t["*"],o,e)};}for(let[a,s]of Object.entries(t))if(a!=="*"){if(s.startsWith(".")){n[a]=H.relative(e,H.join(H.resolve(e),s));continue}if(o===null)return I("Cannot resolve aliases because we couldn't find a tsconfig!");n[a]=ar(s,o,e);}return E(n)},ar=(t,e,r)=>{let o=e(t);return H.relative(r,o[0])};var We=t=>t.replace(Hr(),"");var ct=(t,e,r=" ")=>{if(We(t).length>e)throw new Error("String length is greater than the length provided.");return r.repeat(e-We(t).length)+t},cr=(t,e,r=" ")=>t+r.repeat(e),lr=(t,e,r=" ")=>{if(We(t).length>e)throw new Error("String length is greater than the length provided.");return t+r.repeat(e-We(t).length)};var Kr=/\n|\r\n/g,ce=t=>t.split(Kr),te=(t,{lineNumbers:e=!1,prefix:r}={})=>{let o=t;if(e){let n=t.length.toString().length+1;o=o.map((a,s)=>`${ct(`${s+1}`,n)} ${a}`);}return r!==void 0&&(o=o.map((n,a)=>`${r(a,t.length)}${n}`)),o.join(Yr.EOL)};var At=(t,e)=>{let r=H.join(t,"package.json");if(Ce.existsSync(r))return r;if(t===e)return;let o=t.split(/[\/\\]/);return At(o.slice(0,o.length-1).join("/"),e)},qr=t=>{if(!Ce.existsSync(t))return I(`${t} doesn't exist`);let e=Ce.readFileSync(t).toString();return E(JSON.parse(e))},vt=(t,e,{cwd:r})=>{let o=t,n=e,a=qr(H.join(r,"package.json"));if(!a.isErr()){let s=a.unwrap();if(s.dependencies)for(let i of o){let[c,d]=i.split("@"),m=s.dependencies[c];d===void 0&&m||m&&m===d&&o.delete(i);}if(s.devDependencies)for(let i of n){let[c,d]=i.split("@"),m=s.devDependencies[c];d===void 0&&m||m&&m===d&&n.delete(i);}}return {dependencies:o,devDependencies:n}};var Xr=/^(@[^\/]+\/[^@\/]+)(?:@([^\/]+))?(\/.*)?$/,Zr=/^([^@\/]+)(?:@([^\/]+))?(\/.*)?$/,fr=t=>{let e=Xr.exec(t)||Zr.exec(t);return e?E({name:e[1]||"",version:e[2]||"latest",path:e[3]||""}):I(`invalid package name: ${t}`)};var no={matches:t=>t.endsWith(".ts")||t.endsWith(".js")||t.endsWith(".tsx")||t.endsWith(".jsx"),resolveDependencies:({filePath:t,isSubDir:e,excludeDeps:r,dirs:o,cwd:n})=>{let i=new Project().addSourceFileAtPath(t).getImportDeclarations().map(d=>d.getModuleSpecifierValue()),c=Ft({moduleSpecifiers:i,filePath:t,isSubDir:e,dirs:o,cwd:n,doNotInstall:r});return c.isErr()?I(c.unwrapErr().map(d=>Bt(d)).join(`
3
- `)):E(c.unwrap())},comment:t=>`/*
4
- ${te(ce(t),{prefix:()=>" "})}
5
- */`,format:async(t,{formatter:e,filePath:r,prettierOptions:o,biomeOptions:n})=>{if(!e)return t;if(e==="prettier")return await Xe.format(t,{filepath:r,...o});let a=await Biome.create({distribution:Distribution.NODE});return n&&a.applyConfiguration(n),a.formatContent(t,{filePath:r}).content}},io={matches:t=>t.endsWith(".svelte"),resolveDependencies:({filePath:t,isSubDir:e,excludeDeps:r,dirs:o,cwd:n})=>{let a=Ce.readFileSync(t).toString(),s=yr.parse(a,{modern:!0,filename:t});if(!s.instance)return E({dependencies:[],devDependencies:[],local:[],imports:{}});let i=[];walk(s.instance,{enter:d=>{d.type==="ImportDeclaration"&&typeof d.source.value=="string"&&i.push(d.source.value);}});let c=Ft({moduleSpecifiers:i,filePath:t,isSubDir:e,dirs:o,cwd:n,doNotInstall:["svelte","@sveltejs/kit",...r]});return c.isErr()?I(c.unwrapErr().map(d=>Bt(d)).join(`
6
- `)):E(c.unwrap())},comment:t=>`<!--
7
- ${te(ce(t),{prefix:()=>" "})}
8
- -->`,format:async(t,{formatter:e,filePath:r,prettierOptions:o})=>e&&e==="prettier"&&o&&o.plugins?.find(n=>n==="prettier-plugin-svelte")?await Xe.format(t,{filepath:r,...o}):t},so={matches:t=>t.endsWith(".vue"),resolveDependencies:({filePath:t,isSubDir:e,excludeDeps:r,dirs:o,cwd:n})=>{let a=Ce.readFileSync(t).toString(),s=wt.parse(a,{filename:t});if(!s.descriptor.script?.content&&!s.descriptor.scriptSetup?.content)return E({dependencies:[],devDependencies:[],local:[],imports:{}});let i;try{i=wt.compileScript(s.descriptor,{id:"shut-it"});}catch(m){return I(`Compile error: ${m}`)}if(!i.imports)return E({dependencies:[],devDependencies:[],local:[],imports:{}});let c=Object.values(i.imports).map(m=>m.source),d=Ft({moduleSpecifiers:c,filePath:t,isSubDir:e,dirs:o,cwd:n,doNotInstall:["vue","nuxt",...r]});return d.isErr()?I(d.unwrapErr().map(m=>Bt(m)).join(`
9
- `)):E(d.unwrap())},comment:t=>`<!--
10
- ${te(ce(t),{prefix:()=>" "})}
11
- -->`,format:async(t,{formatter:e,prettierOptions:r})=>e&&e==="prettier"?await Xe.format(t,{parser:"vue",...r}):t},ao={matches:t=>t.endsWith(".yml")||t.endsWith(".yaml"),resolveDependencies:()=>E({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:t=>te(ce(t),{prefix:()=>"# "}),format:async(t,{formatter:e,prettierOptions:r})=>e&&e==="prettier"?await Xe.format(t,{parser:"yaml",...r}):t},Lt={matches:t=>t.endsWith(".json"),resolveDependencies:()=>E({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:t=>t,format:async(t,{formatter:e,prettierOptions:r,biomeOptions:o,filePath:n})=>{if(!e)return t;if(e==="prettier")return await Xe.format(t,{filepath:n,...r});let a=await Biome.create({distribution:Distribution.NODE});return o&&a.applyConfiguration(o),a.formatContent(t,{filePath:n}).content}},Bt=t=>`${te(ce(t),{prefix:e=>e===0?`${D} ${nr} `:`${D} `})}`,Ft=({moduleSpecifiers:t,isSubDir:e,filePath:r,doNotInstall:o,dirs:n,cwd:a})=>{let s=[],i=new Set,c=new Set,d={};for(let u of t){if(u.startsWith(".")){let S=vr(u,e,{filePath:r,dirs:n,cwd:a});if(S.isErr()){s.push(S.unwrapErr());continue}let v=S.unwrap();v&&(c.add(v.dependency),d[u]=v.template);continue}let y=co(u,e,{filePath:r,dirs:n,cwd:a});if(y.isErr()){s.push(y.unwrapErr());continue}let x=y.unwrap();x?(c.add(x.dependency),d[u]=x.template):i.add(u);}if(s.length>0)return I(s);let{devDependencies:m,dependencies:k}=po(Array.from(i),r,{doNotInstall:o||[]});return E({dependencies:k,devDependencies:m,local:Array.from(c),imports:d})},vr=(t,e,{filePath:r,alias:o,dirs:n,cwd:a})=>{if(e&&(t.startsWith("./")||t==="."))return E(void 0);let s=e?H.join(r,"../../"):H.join(r,"../"),i=H.join(H.join(r,"../"),t),c=H.join(s,"../");if(i.startsWith(c))return E(ur(i.slice(c.length)));if(o){for(let d of n){let m=H.resolve(H.join(a,d)),k=H.resolve(i);if(k.startsWith(m))return E(ur(k.slice(m.length+1)))}return I(`${r}:
2
+ import Ce from'node:fs';import {fileURLToPath}from'node:url';import {Command,program,Option,Argument}from'commander';import H from'pathe';import {outro,spinner,confirm,isCancel,cancel,multiselect,text,select,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 lt from'node-fetch';import {Octokit}from'octokit';import {builtinModules}from'node:module';import {Biome,Distribution}from'@biomejs/js-api';import*as wt from'@vue/compiler-sfc';import {walk}from'estree-walker';import*as Xe from'prettier';import*as yr from'svelte/compiler';import {Project}from'ts-morph';import oo from'validate-npm-package-name';import Yr from'node:os';import Hr from'ansi-regex';import uo from'conf';import {execa}from'execa';import {detect as detect$1,resolveCommand as resolveCommand$1}from'package-manager-detector';import $o from'escape-string-regexp';import {diffLines,diffChars}from'diff';var D=P.gray("\u2502"),Pt=P.gray("\u2500"),rr=P.gray("\u2510"),or=P.gray("\u2518"),Tt=P.gray("\u251C");P.gray("\u250C");P.gray("\u2514");var fe=P.bgRgb(245,149,66).white("WARN"),qe=P.bgBlueBright.white("INFO"),nr=P.bgRedBright.white("ERROR"),ve=P.hex("#f7df1e")("jsrepo");var gt=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=>j(t(r)),r=>I(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=>j(r),r=>I(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)}},j=e=>new gt({ok:!0,val:e}),I=e=>new gt({ok:!1,err:e});var ir=(e,t)=>{let r=[];for(let[o,n]of e)r.push(t(o,n));return r};var _e="jsrepo.json",Oe="jsrepo-build-config.json",Ot=C.union([C.literal("prettier"),C.literal("biome")]),Ur=C.objectWithRest({"*":C.string()},C.string()),zr=C.object({$schema:C.string(),repos:C.optional(C.array(C.string()),[]),includeTests:C.boolean(),paths:Ur,watermark:C.optional(C.boolean(),!0),formatter:C.optional(Ot)}),$e=e=>{if(!Ce.existsSync(H.join(e,_e)))return I("Could not find your configuration file! Please run `init`.");let t=C.safeParse(zr,JSON.parse(Ce.readFileSync(H.join(e,_e)).toString()));return t.success?j(t.output):I(`There was an error reading your \`${_e}\` file!`)},Gr=C.object({$schema:C.string(),dirs:C.array(C.string()),includeBlocks:C.optional(C.array(C.string()),[]),includeCategories:C.optional(C.array(C.string()),[]),doNotListBlocks:C.optional(C.array(C.string()),[]),doNotListCategories:C.optional(C.array(C.string()),[]),excludeDeps:C.optional(C.array(C.string()),[]),output:C.boolean(),errorOnWarn:C.boolean()}),yt=e=>{if(!Ce.existsSync(H.join(e,Oe)))return j(null);let t=C.safeParse(Gr,JSON.parse(Ce.readFileSync(H.join(e,Oe)).toString()));return t.success?j(t.output):I(`There was an error reading your \`${Oe}\` file!`)},be=(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={"*":H.relative(t,H.join(H.resolve(t),e["*"]))};else {if(o===null)return I("Cannot resolve aliases because we couldn't find a tsconfig!");n={"*":ar(e["*"],o,t)};}for(let[a,s]of Object.entries(e))if(a!=="*"){if(s.startsWith(".")){n[a]=H.relative(t,H.join(H.resolve(t),s));continue}if(o===null)return I("Cannot resolve aliases because we couldn't find a tsconfig!");n[a]=ar(s,o,t);}return j(n)},ar=(e,t,r)=>{let o=t(e);return H.relative(r,o[0])};var We=e=>e.replace(Hr(),"");var ct=(e,t,r=" ")=>{if(We(e).length>t)throw new Error("String length is greater than the length provided.");return r.repeat(t-We(e).length)+e},cr=(e,t,r=" ")=>e+r.repeat(t),lr=(e,t,r=" ")=>{if(We(e).length>t)throw new Error("String length is greater than the length provided.");return e+r.repeat(t-We(e).length)};var Kr=/\n|\r\n/g,ie=e=>e.split(Kr),ee=(e,{lineNumbers:t=!1,prefix:r}={})=>{let o=e;if(t){let n=e.length.toString().length+1;o=o.map((a,s)=>`${ct(`${s+1}`,n)} ${a}`);}return r!==void 0&&(o=o.map((n,a)=>`${r(a,e.length)}${n}`)),o.join(Yr.EOL)};var At=(e,t)=>{let r=H.join(e,"package.json");if(Ce.existsSync(r))return r;if(e===t)return;let o=e.split(/[\/\\]/);return At(o.slice(0,o.length-1).join("/"),t)},qr=e=>{if(!Ce.existsSync(e))return I(`${e} doesn't exist`);let t=Ce.readFileSync(e).toString();return j(JSON.parse(t))},vt=(e,t,{cwd:r})=>{let o=e,n=t,a=qr(H.join(r,"package.json"));if(!a.isErr()){let s=a.unwrap();if(s.dependencies)for(let i of o){let[c,d]=i.split("@"),m=s.dependencies[c];d===void 0&&m||m&&m===d&&o.delete(i);}if(s.devDependencies)for(let i of n){let[c,d]=i.split("@"),m=s.devDependencies[c];d===void 0&&m||m&&m===d&&n.delete(i);}}return {dependencies:o,devDependencies:n}};var Xr=/^(@[^\/]+\/[^@\/]+)(?:@([^\/]+))?(\/.*)?$/,Zr=/^([^@\/]+)(?:@([^\/]+))?(\/.*)?$/,fr=e=>{let t=Xr.exec(e)||Zr.exec(e);return t?j({name:t[1]||"",version:t[2]||"latest",path:t[3]||""}):I(`invalid package name: ${e}`)};var no={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).getImportDeclarations().map(d=>d.getModuleSpecifierValue()),c=Ft({moduleSpecifiers:i,filePath:e,isSubDir:t,dirs:o,cwd:n,doNotInstall:r});return c.isErr()?I(c.unwrapErr().map(d=>Bt(d)).join(`
3
+ `)):j(c.unwrap())},comment:e=>`/*
4
+ ${ee(ie(e),{prefix:()=>" "})}
5
+ */`,format:async(e,{formatter:t,filePath:r,prettierOptions:o,biomeOptions:n})=>{if(!t)return e;if(t==="prettier")return await Xe.format(e,{filepath:r,...o});let a=await Biome.create({distribution:Distribution.NODE});return n&&a.applyConfiguration(n),a.formatContent(e,{filePath:r}).content}},io={matches:e=>e.endsWith(".svelte"),resolveDependencies:({filePath:e,isSubDir:t,excludeDeps:r,dirs:o,cwd:n})=>{let a=Ce.readFileSync(e).toString(),s=yr.parse(a,{modern:!0,filename:e});if(!s.instance)return j({dependencies:[],devDependencies:[],local:[],imports:{}});let i=[];walk(s.instance,{enter:d=>{d.type==="ImportDeclaration"&&typeof d.source.value=="string"&&i.push(d.source.value);}});let c=Ft({moduleSpecifiers:i,filePath:e,isSubDir:t,dirs:o,cwd:n,doNotInstall:["svelte","@sveltejs/kit",...r]});return c.isErr()?I(c.unwrapErr().map(d=>Bt(d)).join(`
6
+ `)):j(c.unwrap())},comment:e=>`<!--
7
+ ${ee(ie(e),{prefix:()=>" "})}
8
+ -->`,format:async(e,{formatter:t,filePath:r,prettierOptions:o})=>t&&t==="prettier"&&o&&o.plugins?.find(n=>n==="prettier-plugin-svelte")?await Xe.format(e,{filepath:r,...o}):e},so={matches:e=>e.endsWith(".vue"),resolveDependencies:({filePath:e,isSubDir:t,excludeDeps:r,dirs:o,cwd:n})=>{let a=Ce.readFileSync(e).toString(),s=wt.parse(a,{filename:e});if(!s.descriptor.script?.content&&!s.descriptor.scriptSetup?.content)return j({dependencies:[],devDependencies:[],local:[],imports:{}});let i;try{i=wt.compileScript(s.descriptor,{id:"shut-it"});}catch(m){return I(`Compile error: ${m}`)}if(!i.imports)return j({dependencies:[],devDependencies:[],local:[],imports:{}});let c=Object.values(i.imports).map(m=>m.source),d=Ft({moduleSpecifiers:c,filePath:e,isSubDir:t,dirs:o,cwd:n,doNotInstall:["vue","nuxt",...r]});return d.isErr()?I(d.unwrapErr().map(m=>Bt(m)).join(`
9
+ `)):j(d.unwrap())},comment:e=>`<!--
10
+ ${ee(ie(e),{prefix:()=>" "})}
11
+ -->`,format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await Xe.format(e,{parser:"vue",...r}):e},ao={matches:e=>e.endsWith(".yml")||e.endsWith(".yaml"),resolveDependencies:()=>j({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>ee(ie(e),{prefix:()=>"# "}),format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await Xe.format(e,{parser:"yaml",...r}):e},co={matches:e=>e.endsWith(".svg"),resolveDependencies:()=>j({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>`<!--
12
+ ${ee(ie(e),{prefix:()=>" "})}
13
+ -->`,format:async e=>e},Lt={matches:e=>e.endsWith(".json"),resolveDependencies:()=>j({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 Xe.format(e,{filepath:n,...r});let a=await Biome.create({distribution:Distribution.NODE});return o&&a.applyConfiguration(o),a.formatContent(e,{filePath:n}).content}},Bt=e=>`${ee(ie(e),{prefix:t=>t===0?`${D} ${nr} `:`${D} `})}`,Ft=({moduleSpecifiers:e,isSubDir:t,filePath:r,doNotInstall:o,dirs:n,cwd:a})=>{let s=[],i=new Set,c=new Set,d={};for(let u of e){if(u.startsWith(".")){let S=vr(u,t,{filePath:r,dirs:n,cwd:a});if(S.isErr()){s.push(S.unwrapErr());continue}let v=S.unwrap();v&&(c.add(v.dependency),d[u]=v.template);continue}let y=lo(u,t,{filePath:r,dirs:n,cwd:a});if(y.isErr()){s.push(y.unwrapErr());continue}let E=y.unwrap();E?(c.add(E.dependency),d[u]=E.template):i.add(u);}if(s.length>0)return I(s);let{devDependencies:m,dependencies:k}=fo(Array.from(i),r,{doNotInstall:o||[]});return j({dependencies:k,devDependencies:m,local:Array.from(c),imports:d})},vr=(e,t,{filePath:r,alias:o,dirs:n,cwd:a})=>{if(t&&(e.startsWith("./")||e==="."))return j(void 0);let s=t?H.join(r,"../../"):H.join(r,"../"),i=H.join(H.join(r,"../"),e),c=H.join(s,"../");if(i.startsWith(c))return j(ur(i.slice(c.length)));if(o){for(let d of n){let m=H.resolve(H.join(a,d)),k=H.resolve(i);if(k.startsWith(m))return j(ur(k.slice(m.length+1)))}return I(`${r}:
12
14
  ${o} references code not contained in ${P.bold(n.join(", "))} and cannot be resolved.`)}return I(`${r}:
13
- ${t} references code not contained in ${s} and cannot be resolved.`)},ur=t=>{let[e,r,...o]=t.split("/"),n=r;n.includes(".")&&(n=n.slice(0,n.length-H.parse(n).ext.length));let a=`${e}/${n}`,s=`{{${a}}}`;return o.length===0?n.length!==r.length&&(s+=H.parse(r).ext):s+=`/${o.join("/")}`,{dependency:a,template:s}},co=(t,e,{filePath:r,dirs:o,cwd:n})=>{let a=getTsconfig(r,"tsconfig.json");if(!a&&(a=getTsconfig(r,"jsconfig.json"),!a))return E(void 0);let s=createPathsMatcher(a);if(s){let i=s(t);for(let c of i){let d=lo(c);if(!d)continue;let m=H.relative(H.resolve(H.join(r,"../")),d.path),k=vr(m,e,{filePath:r,alias:t,dirs:o,cwd:n,modIsFile:d.type==="file"});if(k.isErr())return I(k.unwrapErr());if(k.unwrap())return E(k.unwrap());break}}return E(void 0)},lo=t=>{if(Ce.existsSync(t))return {path:t,type:Ce.statSync(t).isDirectory()?"directory":"file"};if(H.parse(t).ext===".js"){let n=`${t.slice(0,t.length-3)}.ts`;if(Ce.existsSync(n))return {path:t,type:"file"}}let r=H.join(t,"../");if(!Ce.existsSync(r))return;let o=Ce.readdirSync(r);for(let n of o)if(H.parse(n).name===H.basename(t)){let s=H.join(r,n),i=s;return i.endsWith(".ts")&&(i=i.slice(0,i.length-3)),{path:i,type:Ce.statSync(s).isDirectory()?"directory":"file"}}},po=(t,e,{doNotInstall:r}={doNotInstall:[]})=>{let o=new Set(r),n=t.filter(c=>!builtinModules.includes(c)&&!c.startsWith("node:")),a=At(H.dirname(e),""),s=new Set,i=new Set;if(a){let{devDependencies:c,dependencies:d}=JSON.parse(Ce.readFileSync(a,"utf-8"));for(let m of n){let k=fr(m);if(k.isErr()){console.warn(`${fe} Skipped adding import \`${P.cyan(m)}\`. Reason: Couldn't parse package name`);continue}let u=k.unwrap();if(!oo(u.name).validForNewPackages){console.warn(`${fe} Skipped adding import \`${P.cyan(m)}\`. Reason: Not a valid package name`);continue}if(o.has(u.name))continue;let y;if(d!==void 0&&(y=d[u.name]),y!==void 0){s.add(`${u.name}@${y}`);continue}if(c!==void 0&&(y=c[u.name]),y!==void 0){i.add(`${u.name}@${y}`);continue}s.add(u.name);}}return {dependencies:Array.from(s),devDependencies:Array.from(i)}},Me=[no,io,so,ao,Lt];var fo=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())}),$t=C.object({name:C.string(),blocks:C.array(fo)}),wr=[".test.ts","_test.ts",".test.js","_test.js"],ue=t=>wr.find(e=>t.endsWith(e))!==void 0,$r=(t,{cwd:e,config:{excludeDeps:r,includeBlocks:o,includeCategories:n,errorOnWarn:a,dirs:s,doNotListBlocks:i,doNotListCategories:c}})=>{let d;try{d=Ce.readdirSync(t);}catch{program.error(P.red(`Couldn't read the ${P.bold(t)} directory.`));}let m=[];for(let k of d){let u=H.join(t,k);if(Ce.statSync(u).isFile())continue;let y=H.basename(k),x=c.findIndex(b=>b===y)===-1;if(n.length>0&&n.find(b=>b.trim()===y.trim())===void 0)continue;let S={name:y,blocks:[]},v=Ce.readdirSync(u);for(let b of v){let T=H.join(u,b);if(Ce.statSync(T).isFile()){if(ue(b))continue;let j=H.parse(H.basename(b)).name,g=i.findIndex(h=>h===j)===-1;if(o.length>0&&o.find(h=>h.trim()===j.trim())===void 0)continue;let f=Me.find(h=>h.matches(b));if(!f){let h="files are not currently supported!";a?program.error(P.red(`Couldn't add \`${P.bold(T)}\` \`*${P.bold(H.parse(b).ext)}\` ${h}`)):console.warn(`${D} ${fe} Skipped \`${P.bold(T)}\` \`*${P.bold(H.parse(b).ext)}\` ${h}`);continue}let l=v.find(h=>wr.find(A=>h===`${j}${A}`)),{dependencies:p,devDependencies:$,local:R,imports:B}=f.resolveDependencies({filePath:T,isSubDir:!1,excludeDeps:r,cwd:e,dirs:s}).match(h=>h,h=>{program.error(P.red(h));}),w={name:j,directory:H.relative(e,u),category:y,tests:l!==void 0,subdirectory:!1,list:x?g:!1,files:[b],localDependencies:R,_imports_:B,dependencies:p,devDependencies:$};l!==void 0&&w.files.push(l),S.blocks.push(w);}else {let j=b,g=i.findIndex(h=>h===j)===-1;if(o.length>0&&o.find(h=>h.trim()===j.trim())===void 0)continue;let f=Ce.readdirSync(T),l=f.findIndex(h=>ue(h))!==-1,p=new Set,$=new Set,R=new Set,B={};for(let h of f){if(ue(h))continue;if(Ce.statSync(H.join(T,h)).isDirectory()){let V="subdirectories are not currently supported!";a?program.error(P.red(`Couldn't add \`${P.bold(H.join(T,h))}\` ${V}`)):console.warn(`${D} ${fe} Skipped \`${P.bold(H.join(T,h))}\` ${V}`);continue}let A=Me.find(V=>V.matches(h));if(!A){let V="files are not currently supported!";a?program.error(P.red(`Couldn't add \`${P.bold(H.join(T,h))}\` \`*${P.bold(H.parse(h).ext)}\` ${V}`)):console.warn(`${D} ${fe} Skipped \`${H.join(T,h)}\` \`*${P.bold(H.parse(h).ext)}\` ${V}`);continue}let{local:W,dependencies:N,devDependencies:U,imports:Re}=A.resolveDependencies({filePath:H.join(T,h),isSubDir:!0,excludeDeps:r,cwd:e,dirs:s}).match(V=>V,V=>{program.error(P.red(V));});for(let V of W)V!==`${y}/${j}`&&p.add(V);for(let V of N)$.add(V);for(let V of U)R.add(V);for(let[V,Fe]of Object.entries(Re))B[V]=Fe;}let w={name:j,directory:H.relative(e,T),category:y,tests:l,subdirectory:!0,list:x?g:!1,files:[...f],localDependencies:Array.from(p.keys()),dependencies:Array.from($.keys()),devDependencies:Array.from(R.keys()),_imports_:B};S.blocks.push(w);}}m.push(S);}return m};var ge="jsrepo-manifest.json";var he=()=>new mo({projectName:"jsrepo"});var et=(t,e,r)=>I(`There was an error fetching the \`${P.bold(e)}\` from ${P.bold(t.url)}.
15
+ ${e} references code not contained in ${s} and cannot be resolved.`)},ur=e=>{let[t,r,...o]=e.split("/");r===void 0&&(r="index");let n=r;n.includes(".")&&(n=n.slice(0,n.length-H.parse(n).ext.length));let a=`${t}/${n}`,s=`{{${a}}}`;return o.length===0?n.length!==r.length&&(s+=H.parse(r).ext):s+=`/${o.join("/")}`,{dependency:a,template:s}},lo=(e,t,{filePath:r,dirs:o,cwd:n})=>{let a=getTsconfig(r,"tsconfig.json");if(!a&&(a=getTsconfig(r,"jsconfig.json"),!a))return j(void 0);let s=createPathsMatcher(a);if(s){let i=s(e);for(let c of i){let d=po(c);if(!d)continue;let m=H.relative(H.resolve(H.join(r,"../")),d.path),k=vr(m,t,{filePath:r,alias:e,dirs:o,cwd:n,modIsFile:d.type==="file"});if(k.isErr())return I(k.unwrapErr());if(k.unwrap())return j(k.unwrap());break}}return j(void 0)},po=e=>{if(Ce.existsSync(e))return {path:e,type:Ce.statSync(e).isDirectory()?"directory":"file"};if(H.parse(e).ext===".js"){let n=`${e.slice(0,e.length-3)}.ts`;if(Ce.existsSync(n))return {path:e,type:"file"}}let r=H.join(e,"../");if(!Ce.existsSync(r))return;let o=Ce.readdirSync(r);for(let n of o)if(H.parse(n).name===H.basename(e)){let s=H.join(r,n),i=s;return i.endsWith(".ts")&&(i=i.slice(0,i.length-3)),{path:i,type:Ce.statSync(s).isDirectory()?"directory":"file"}}},fo=(e,t,{doNotInstall:r}={doNotInstall:[]})=>{let o=new Set(r),n=e.filter(c=>!builtinModules.includes(c)&&!c.startsWith("node:")),a=At(H.dirname(t),""),s=new Set,i=new Set;if(a){let{devDependencies:c,dependencies:d}=JSON.parse(Ce.readFileSync(a,"utf-8"));for(let m of n){let k=fr(m);if(k.isErr()){console.warn(`${fe} Skipped adding import \`${P.cyan(m)}\`. Reason: Couldn't parse package name`);continue}let u=k.unwrap();if(!oo(u.name).validForNewPackages){console.warn(`${fe} Skipped adding import \`${P.cyan(m)}\`. Reason: Not a valid package name`);continue}if(o.has(u.name))continue;let y;if(d!==void 0&&(y=d[u.name]),y!==void 0){s.add(`${u.name}@${y}`);continue}if(c!==void 0&&(y=c[u.name]),y!==void 0){i.add(`${u.name}@${y}`);continue}s.add(u.name);}}return {dependencies:Array.from(s),devDependencies:Array.from(i)}},Me=[no,io,so,ao,Lt,co];var mo=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())}),$t=C.object({name:C.string(),blocks:C.array(mo)}),wr=[".test.ts","_test.ts",".test.js","_test.js"],ue=e=>wr.find(t=>e.endsWith(t))!==void 0,$r=(e,{cwd:t,config:{excludeDeps:r,includeBlocks:o,includeCategories:n,errorOnWarn:a,dirs:s,doNotListBlocks:i,doNotListCategories:c}})=>{let d;try{d=Ce.readdirSync(e);}catch{program.error(P.red(`Couldn't read the ${P.bold(e)} directory.`));}let m=[];for(let k of d){let u=H.join(e,k);if(Ce.statSync(u).isFile())continue;let y=H.basename(k),E=c.findIndex(b=>b===y)===-1;if(n.length>0&&n.find(b=>b.trim()===y.trim())===void 0)continue;let S={name:y,blocks:[]},v=Ce.readdirSync(u);for(let b of v){let T=H.join(u,b);if(Ce.statSync(T).isFile()){if(ue(b))continue;let x=H.parse(H.basename(b)).name,g=i.findIndex(h=>h===x)===-1;if(o.length>0&&o.find(h=>h.trim()===x.trim())===void 0)continue;let f=Me.find(h=>h.matches(b));if(!f){let h="files are not currently supported!";a?program.error(P.red(`Couldn't add \`${P.bold(T)}\` \`*${P.bold(H.parse(b).ext)}\` ${h}`)):console.warn(`${D} ${fe} Skipped \`${P.bold(T)}\` \`*${P.bold(H.parse(b).ext)}\` ${h}`);continue}let l=v.find(h=>wr.find(A=>h===`${x}${A}`)),{dependencies:p,devDependencies:$,local:R,imports:B}=f.resolveDependencies({filePath:T,isSubDir:!1,excludeDeps:r,cwd:t,dirs:s}).match(h=>h,h=>{program.error(P.red(h));}),w={name:x,directory:H.relative(t,u),category:y,tests:l!==void 0,subdirectory:!1,list:E?g:!1,files:[b],localDependencies:R,_imports_:B,dependencies:p,devDependencies:$};l!==void 0&&w.files.push(l),S.blocks.push(w);}else {let x=b,g=i.findIndex(h=>h===x)===-1;if(o.length>0&&o.find(h=>h.trim()===x.trim())===void 0)continue;let f=Ce.readdirSync(T),l=f.findIndex(h=>ue(h))!==-1,p=new Set,$=new Set,R=new Set,B={};for(let h of f){if(ue(h))continue;if(Ce.statSync(H.join(T,h)).isDirectory()){let V="subdirectories are not currently supported!";a?program.error(P.red(`Couldn't add \`${P.bold(H.join(T,h))}\` ${V}`)):console.warn(`${D} ${fe} Skipped \`${P.bold(H.join(T,h))}\` ${V}`);continue}let A=Me.find(V=>V.matches(h));if(!A){let V="files are not currently supported!";a?program.error(P.red(`Couldn't add \`${P.bold(H.join(T,h))}\` \`*${P.bold(H.parse(h).ext)}\` ${V}`)):console.warn(`${D} ${fe} Skipped \`${H.join(T,h)}\` \`*${P.bold(H.parse(h).ext)}\` ${V}`);continue}let{local:W,dependencies:N,devDependencies:U,imports:Re}=A.resolveDependencies({filePath:H.join(T,h),isSubDir:!0,excludeDeps:r,cwd:t,dirs:s}).match(V=>V,V=>{program.error(P.red(V));});for(let V of W)V!==`${y}/${x}`&&p.add(V);for(let V of N)$.add(V);for(let V of U)R.add(V);for(let[V,Fe]of Object.entries(Re))B[V]=Fe;}let w={name:x,directory:H.relative(t,T),category:y,tests:l,subdirectory:!0,list:E?g:!1,files:[...f],localDependencies:Array.from(p.keys()),dependencies:Array.from($.keys()),devDependencies:Array.from(R.keys()),_imports_:B};S.blocks.push(w);}}m.push(S);}return m};var ge="jsrepo-manifest.json";var he=()=>new uo({projectName:"jsrepo"});var et=(e,t,r)=>I(`There was an error fetching the \`${P.bold(t)}\` from ${P.bold(e.url)}.
14
16
 
15
17
  ${P.bold("This may be for one of the following reasons:")}
16
- 1. The \`${P.bold(e)}\` or containing repository doesn't exist
18
+ 1. The \`${P.bold(t)}\` or containing repository doesn't exist
17
19
  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>")}\`
18
20
  3. You are using an expired access token or a token that doesn't have access to this repository
19
- `),re={name:()=>"github",defaultBranch:()=>"main",resolveRaw:async(t,e)=>{let r=await re.info(t);return new URL(e,`https://raw.githubusercontent.com/${r.owner}/${r.repoName}/refs/${r.refs}/${r.ref}/`)},fetchRaw:async(t,e,{verbose:r}={})=>{let o=await re.info(t),n=await re.resolveRaw(o,e);r?.(`Trying to fetch from ${n}`);try{let a=he().get(`${re.name()}-token`),s=new Headers;a!==void 0&&s.append("Authorization",`token ${a}`);let i=await lt(n,{headers:s});return r?.(`Got a response from ${n} ${i.status} ${i.statusText}`),i.ok?E(await i.text()):et(o,e,re.defaultBranch())}catch(a){return r?.(`erroring in response ${a} `),et(o,e,re.defaultBranch())}},fetchManifest:async t=>{let e=await re.fetchRaw(t,ge);if(e.isErr())return I(e.unwrapErr());let r=C.safeParse(C.array($t),JSON.parse(e.unwrap()));return r.success?E(r.output):I(`Error parsing categories: ${r.issues}`)},info:async t=>{if(typeof t!="string")return t;let e=t.replaceAll(/(https:\/\/github.com\/)|(github\/)/g,""),[r,o,...n]=e.split("/"),a=re.defaultBranch(),s=he().get(`${re.name()}-token`),i=new Octokit({auth:s});if(n[0]==="tree")a=n[1];else try{let{data:d}=await i.rest.repos.get({owner:r,repo:o});a=d.default_branch;}catch{}let c="heads";if(a!==re.defaultBranch())try{let{data:d}=await i.rest.git.listMatchingRefs({owner:r,repo:o,ref:"tags"});d.some(m=>m.ref===`refs/tags/${a}`)&&(c="tags");}catch{c="heads";}return {refs:c,url:t,name:re.name(),repoName:o,owner:r,ref:a,provider:re}},matches:t=>t.toLowerCase().startsWith("https://github.com")||t.toLowerCase().startsWith("github")},ye={name:()=>"gitlab",defaultBranch:()=>"main",resolveRaw:async(t,e)=>{let r=await ye.info(t);return new URL(`${encodeURIComponent(e)}/raw?ref=${r.ref}`,`https://gitlab.com/api/v4/projects/${encodeURIComponent(`${r.owner}/${r.repoName}`)}/repository/files/`)},fetchRaw:async(t,e,{verbose:r}={})=>{let o=await re.info(t),n=await ye.resolveRaw(o,e);r?.(`Trying to fetch from ${n}`);try{let a=he().get(`${ye.name()}-token`),s=new Headers;a!==void 0&&s.append("PRIVATE-TOKEN",`${a}`);let i=await lt(n,{headers:s});return r?.(`Got a response from ${n} ${i.status} ${i.statusText}`),i.ok?E(await i.text()):et(o,e,ye.defaultBranch())}catch{return et(o,e,ye.defaultBranch())}},fetchManifest:async t=>{let e=await ye.fetchRaw(t,ge);if(e.isErr())return I(e.unwrapErr());let r=C.safeParse(C.array($t),JSON.parse(e.unwrap()));return r.success?E(r.output):I(`Error parsing categories: ${r.issues}`)},info:async t=>{if(typeof t!="string")return t;let e=t.replaceAll(/(https:\/\/gitlab.com\/)|(gitlab\/)/g,""),[r,o,...n]=e.split("/"),a=ye.defaultBranch(),s="heads";if(n[0]==="-"&&n[1]==="tree")if(n[2].includes("?")){let[i,c]=n[2].split("?");a=i,c.startsWith("ref_type=")&&c.slice(10)==="tags"&&(s="tags");}else a=n[2];else try{let i=he().get(`${ye.name()}-token`),c=new Headers;i!==void 0&&c.append("Authorization",`Bearer ${i}`);let d=await lt(`https://gitlab.com/api/v4/projects/${encodeURIComponent(`${r}/${o}`)}`,{headers:c});d.ok&&(a=(await d.json()).default_branch);}catch{}return {refs:s,url:t,name:ye.name(),repoName:o,owner:r,ref:a,provider:ye}},matches:t=>t.toLowerCase().startsWith("https://gitlab.com")||t.toLowerCase().startsWith("gitlab")},le={name:()=>"bitbucket",defaultBranch:()=>"master",resolveRaw:async(t,e)=>{let r=await le.info(t);return new URL(e,`https://api.bitbucket.org/2.0/repositories/${r.owner}/${r.repoName}/src/${r.ref}/`)},fetchRaw:async(t,e,{verbose:r}={})=>{let o=await le.info(t),n=await le.resolveRaw(o,e);r?.(`Trying to fetch from ${n}`);try{let a=he().get(`${le.name()}-token`),s=new Headers;a!==void 0&&s.append("Authorization",`Bearer ${a}`);let i=await lt(n,{headers:s});return r?.(`Got a response from ${n} ${i.status} ${i.statusText}`),i.ok?E(await i.text()):et(o,e,le.defaultBranch())}catch{return et(o,e,le.defaultBranch())}},fetchManifest:async t=>{let e=await le.fetchRaw(t,ge);if(e.isErr())return I(e.unwrapErr());let r=C.safeParse(C.array($t),JSON.parse(e.unwrap()));return r.success?E(r.output):I(`Error parsing categories: ${r.issues}`)},info:async t=>{if(typeof t!="string")return t;let e=t.replaceAll(/(https:\/\/bitbucket.org\/)|(bitbucket\/)/g,""),[r,o,...n]=e.split("/"),a="heads",s=le.defaultBranch();if(n[0]==="src")s=n[1];else try{let i=he().get(`${le.name()}-token`),c=new Headers;i!==void 0&&c.append("Authorization",`Bearer ${i}`);let d=await lt(`https://api.bitbucket.org/2.0/repositories/${r}/${o}`,{headers:c});d.ok&&(s=(await d.json()).mainbranch.name);}catch{}return {refs:a,url:t,name:le.name(),repoName:o,owner:r,ref:s,provider:le}},matches:t=>t.toLowerCase().startsWith("https://bitbucket.org")||t.toLowerCase().startsWith("bitbucket")},z=[re,ye,le],je=async t=>{let e=z.find(r=>r.matches(t));return e?E(await e.info(t)):I(`Only ${z.map((r,o)=>`${o===z.length-1?"and":""}${P.cyan(r.name())}`).join(", ")} repositories are supported at this time!`)},tt=async(...t)=>{let e=new Map;for(let r of t){let o=await je(r);if(o.isErr())return I({message:o.unwrapErr(),repo:r});let n=o.unwrap(),a=await n.provider.fetchManifest(n);if(a.isErr())return I({message:a.unwrapErr(),repo:r});let s=a.unwrap();for(let i of s)for(let c of i.blocks)e.set(`${n.name}/${n.owner}/${n.repoName}/${i.name}/${c.name}`,{...c,sourceRepo:n});}return E(e)};var pt=async(t,e,r)=>{let o=new Map;for(let n of t){let a;if(z.find(i=>n.startsWith(i.name()))){let[i,c,d,...m]=n.split("/");a=e.get(`${i}/${c}/${d}/${m.slice(m.length-2).join("/")}`);}else {if(r.length===0)return I(P.red(`If your config doesn't repos then you must provide the repo in the block specifier ex: \`${P.bold(`github/<owner>/<name>/${n}`)}\`!`));for(let i of r){let c=(await je(i)).unwrap(),d=e.get(`${c.name}/${c.owner}/${c.repoName}/${n}`);if(d!==void 0){a=d;break}}}if(!a)return I(`Invalid block! ${P.bold(n)} does not exist!`);let s=`${a.category}/${a.name}`;if(o.set(s,{name:a.name,subDependency:!1,block:a}),a.localDependencies&&a.localDependencies.length>0){let i=await pt(a.localDependencies.filter(c=>!o.has(c)),e,r);if(i.isErr())return I(i.unwrapErr());for(let c of i.unwrap())o.set(`${c.block.category}/${c.block.name}`,c);}}return E(ir(o,(n,a)=>a))},Ae=(t,e,r)=>{let o=[],n=be(e.paths,r);n.isErr()&&program.error(P.red(n.unwrapErr()));let a=n.unwrap();for(let[s,i]of t){let c;a[i.category]!==void 0?c=H.join(r,a[i.category]):c=H.join(r,a["*"],i.category);let d=H.join(c,i.files[0]);i.subdirectory&&(d=H.join(c,i.name)),Ce.existsSync(d)&&o.push({specifier:`${i.category}/${i.name}`,path:d,block:i});}return o};var De=async({pm:t,deps:e,dev:r,cwd:o})=>{let n;if(r?n=resolveCommand$1(t,"install",[...e,"-D"]):n=resolveCommand$1(t,"install",[...e]),n==null)return I(P.red(`Could not resolve add command for '${t}'.`));try{return await execa(n.command,[...n.args],{cwd:o}),E(e)}catch{return I(P.red(`Failed to install ${P.bold(e.join(", "))}! Failed while running '${P.bold(`${n.command} ${n.args.join(" ")}`)}'`))}},vo=/\{\{([^\/]+)\/([^\}]+)\}\}/g,kr=({template:t,config:e,destPath:r,cwd:o})=>{let n=H.join(r,"../");return t.replace(vo,(a,s,i)=>{if(e.paths[s]===void 0){if(e.paths["*"].startsWith(".")){let c=H.relative(n,H.join(o,e.paths["*"],s,i));return c.startsWith(".")?c:`./${c}`}return H.join(e.paths["*"],s,i)}if(e.paths[s].startsWith(".")){let c=H.relative(n,H.join(o,e.paths[s],i));return c.startsWith(".")?c:`./${c}`}return H.join(e.paths[s],i)})};var Ct=async({file:t,config:e,imports:r,watermark:o,prettierOptions:n,biomeOptions:a,cwd:s,verbose:i})=>{let c=Me.find(m=>m.matches(t.destPath)),d=t.content;if(c){e.watermark&&(d=`${c.comment(o)}
21
+ `),re={name:()=>"github",defaultBranch:()=>"main",resolveRaw:async(e,t)=>{let r=await re.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 re.info(e),n=await re.resolveRaw(o,t);r?.(`Trying to fetch from ${n}`);try{let a=he().get(`${re.name()}-token`),s=new Headers;a!==void 0&&s.append("Authorization",`token ${a}`);let i=await lt(n,{headers:s});return r?.(`Got a response from ${n} ${i.status} ${i.statusText}`),i.ok?j(await i.text()):et(o,t,re.defaultBranch())}catch(a){return r?.(`erroring in response ${a} `),et(o,t,re.defaultBranch())}},fetchManifest:async e=>{let t=await re.fetchRaw(e,ge);if(t.isErr())return I(t.unwrapErr());let r=C.safeParse(C.array($t),JSON.parse(t.unwrap()));return r.success?j(r.output):I(`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("/"),a=re.defaultBranch(),s=he().get(`${re.name()}-token`),i=new Octokit({auth:s});if(n[0]==="tree")a=n[1];else try{let{data:d}=await i.rest.repos.get({owner:r,repo:o});a=d.default_branch;}catch{}let c="heads";if(a!==re.defaultBranch())try{let{data:d}=await i.rest.git.listMatchingRefs({owner:r,repo:o,ref:"tags"});d.some(m=>m.ref===`refs/tags/${a}`)&&(c="tags");}catch{c="heads";}return {refs:c,url:e,name:re.name(),repoName:o,owner:r,ref:a,provider:re}},matches:e=>e.toLowerCase().startsWith("https://github.com")||e.toLowerCase().startsWith("github")},ye={name:()=>"gitlab",defaultBranch:()=>"main",resolveRaw:async(e,t)=>{let r=await ye.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 re.info(e),n=await ye.resolveRaw(o,t);r?.(`Trying to fetch from ${n}`);try{let a=he().get(`${ye.name()}-token`),s=new Headers;a!==void 0&&s.append("PRIVATE-TOKEN",`${a}`);let i=await lt(n,{headers:s});return r?.(`Got a response from ${n} ${i.status} ${i.statusText}`),i.ok?j(await i.text()):et(o,t,ye.defaultBranch())}catch{return et(o,t,ye.defaultBranch())}},fetchManifest:async e=>{let t=await ye.fetchRaw(e,ge);if(t.isErr())return I(t.unwrapErr());let r=C.safeParse(C.array($t),JSON.parse(t.unwrap()));return r.success?j(r.output):I(`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("/"),a=ye.defaultBranch(),s="heads";if(n[0]==="-"&&n[1]==="tree")if(n[2].includes("?")){let[i,c]=n[2].split("?");a=i,c.startsWith("ref_type=")&&c.slice(10)==="tags"&&(s="tags");}else a=n[2];else try{let i=he().get(`${ye.name()}-token`),c=new Headers;i!==void 0&&c.append("Authorization",`Bearer ${i}`);let d=await lt(`https://gitlab.com/api/v4/projects/${encodeURIComponent(`${r}/${o}`)}`,{headers:c});d.ok&&(a=(await d.json()).default_branch);}catch{}return {refs:s,url:e,name:ye.name(),repoName:o,owner:r,ref:a,provider:ye}},matches:e=>e.toLowerCase().startsWith("https://gitlab.com")||e.toLowerCase().startsWith("gitlab")},le={name:()=>"bitbucket",defaultBranch:()=>"master",resolveRaw:async(e,t)=>{let r=await le.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 le.info(e),n=await le.resolveRaw(o,t);r?.(`Trying to fetch from ${n}`);try{let a=he().get(`${le.name()}-token`),s=new Headers;a!==void 0&&s.append("Authorization",`Bearer ${a}`);let i=await lt(n,{headers:s});return r?.(`Got a response from ${n} ${i.status} ${i.statusText}`),i.ok?j(await i.text()):et(o,t,le.defaultBranch())}catch{return et(o,t,le.defaultBranch())}},fetchManifest:async e=>{let t=await le.fetchRaw(e,ge);if(t.isErr())return I(t.unwrapErr());let r=C.safeParse(C.array($t),JSON.parse(t.unwrap()));return r.success?j(r.output):I(`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("/"),a="heads",s=le.defaultBranch();if(n[0]==="src")s=n[1];else try{let i=he().get(`${le.name()}-token`),c=new Headers;i!==void 0&&c.append("Authorization",`Bearer ${i}`);let d=await lt(`https://api.bitbucket.org/2.0/repositories/${r}/${o}`,{headers:c});d.ok&&(s=(await d.json()).mainbranch.name);}catch{}return {refs:a,url:e,name:le.name(),repoName:o,owner:r,ref:s,provider:le}},matches:e=>e.toLowerCase().startsWith("https://bitbucket.org")||e.toLowerCase().startsWith("bitbucket")},z=[re,ye,le],je=async e=>{let t=z.find(r=>r.matches(e));return t?j(await t.info(e)):I(`Only ${z.map((r,o)=>`${o===z.length-1?"and":""}${P.cyan(r.name())}`).join(", ")} repositories are supported at this time!`)},tt=async(...e)=>{let t=new Map;for(let r of e){let o=await je(r);if(o.isErr())return I({message:o.unwrapErr(),repo:r});let n=o.unwrap(),a=await n.provider.fetchManifest(n);if(a.isErr())return I({message:a.unwrapErr(),repo:r});let s=a.unwrap();for(let i of s)for(let c of i.blocks)t.set(`${n.name}/${n.owner}/${n.repoName}/${i.name}/${c.name}`,{...c,sourceRepo:n});}return j(t)};var pt=async(e,t,r)=>{let o=new Map;for(let n of e){let a;if(z.find(i=>n.startsWith(i.name()))){let[i,c,d,...m]=n.split("/");a=t.get(`${i}/${c}/${d}/${m.slice(m.length-2).join("/")}`);}else {if(r.length===0)return I(P.red(`If your config doesn't repos then you must provide the repo in the block specifier ex: \`${P.bold(`github/<owner>/<name>/${n}`)}\`!`));for(let i of r){let c=(await je(i)).unwrap(),d=t.get(`${c.name}/${c.owner}/${c.repoName}/${n}`);if(d!==void 0){a=d;break}}}if(!a)return I(`Invalid block! ${P.bold(n)} does not exist!`);let s=`${a.category}/${a.name}`;if(o.set(s,{name:a.name,subDependency:!1,block:a}),a.localDependencies&&a.localDependencies.length>0){let i=await pt(a.localDependencies.filter(c=>!o.has(c)),t,r);if(i.isErr())return I(i.unwrapErr());for(let c of i.unwrap())o.set(`${c.block.category}/${c.block.name}`,c);}}return j(ir(o,(n,a)=>a))},Ae=(e,t,r)=>{let o=[],n=be(t.paths,r);n.isErr()&&program.error(P.red(n.unwrapErr()));let a=n.unwrap();for(let[s,i]of e){let c;a[i.category]!==void 0?c=H.join(r,a[i.category]):c=H.join(r,a["*"],i.category);let d=H.join(c,i.files[0]);i.subdirectory&&(d=H.join(c,i.name)),Ce.existsSync(d)&&o.push({specifier:`${i.category}/${i.name}`,path:d,block:i});}return o};var De=async({pm:e,deps:t,dev:r,cwd:o})=>{let n;if(r?n=resolveCommand$1(e,"install",[...t,"-D"]):n=resolveCommand$1(e,"install",[...t]),n==null)return I(P.red(`Could not resolve add command for '${e}'.`));try{return await execa(n.command,[...n.args],{cwd:o}),j(t)}catch{return I(P.red(`Failed to install ${P.bold(t.join(", "))}! Failed while running '${P.bold(`${n.command} ${n.args.join(" ")}`)}'`))}},wo=/\{\{([^\/]+)\/([^\}]+)\}\}/g,kr=({template:e,config:t,destPath:r,cwd:o})=>{let n=H.join(r,"../");return e.replace(wo,(a,s,i)=>{if(t.paths[s]===void 0){if(t.paths["*"].startsWith(".")){let c=H.relative(n,H.join(o,t.paths["*"],s,i));return c.startsWith(".")?c:`./${c}`}return H.join(t.paths["*"],s,i)}if(t.paths[s].startsWith(".")){let c=H.relative(n,H.join(o,t.paths[s],i));return c.startsWith(".")?c:`./${c}`}return H.join(t.paths[s],i)})};var Ct=async({file:e,config:t,imports:r,watermark:o,prettierOptions:n,biomeOptions:a,cwd:s,verbose:i})=>{let c=Me.find(m=>m.matches(e.destPath)),d=e.content;if(c){t.watermark&&(d=`${c.comment(o)}
20
22
 
21
- ${d}`),i?.(`Formatting ${P.bold(t.destPath)}`);try{d=await c.format(d,{filePath:t.destPath,formatter:e.formatter,prettierOptions:n,biomeOptions:a});}catch(m){return I(`Error formatting ${P.bold(t.destPath)} ${m}`)}}for(let[m,k]of Object.entries(r)){let u=kr({template:k,config:e,destPath:t.destPath,cwd:s}),y=new RegExp(`(['"])${wo(m)}\\1`,"g");d=d.replaceAll(y,`$1${u}$1`);}return E(d)};var rt=async({formatter:t,cwd:e})=>{let r=null;t==="prettier"&&(r=await Xe.resolveConfig(H.join(e,".prettierrc")));let o=null;if(t==="biome"){let n=H.join(e,"biome.json");Ce.existsSync(n)&&(o=JSON.parse(Ce.readFileSync(n).toString()));}return {biomeOptions:o,prettierOptions:r}};var ot=(t,e)=>`jsrepo ${t}
22
- Installed from ${e}
23
- ${new Date().toLocaleDateString().replaceAll("/","-")}`;var Ue=async(t,{verbose:e=void 0})=>{let r=spinner();for(let o of t){e?e(o.loadingMessage):r.start(o.loadingMessage);try{await o.run();}catch(n){r.stop(`Error while ${o.loadingMessage}`),console.error(n);}e?e(o.completedMessage):r.stop(o.completedMessage);}},nt=t=>{let e=20;t.map(n=>{let a=cr(We(n),4);a.length>e&&(e=a.length);});let r="Next Steps",o=`${D}
24
- `;return o+=`${Tt} ${r} ${Pt.repeat(e-r.length-1)}${rr}
25
- `,o+=`${D} ${" ".repeat(e)} ${D}
26
- `,t.map(n=>{o+=`${D} ${lr(n,e-1)} ${D}
27
- `;}),o+=`${D} ${" ".repeat(e)} ${D}
28
- `,o+=`${Tt}${Pt.repeat(e+2)}${or}
29
- `,o},oe=t=>intro(`${P.bgHex("#f7df1e").black(" jsrepo ")}${P.gray(` v${t} `)}`);var Io=C.object({repo:C.optional(C.string()),allow:C.boolean(),yes:C.boolean(),verbose:C.boolean(),cwd:C.string()}),Wt=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(t,e)=>{let r=C.parse(Io,e);oe(Y.package.version),await So(t,r),outro(P.green("All done!"));}),So=async(t,e)=>{let r=l=>{e.verbose&&console.info(`${qe} ${l}`);};r(`Attempting to add ${JSON.stringify(t)}`);let o=spinner(),n=$e(e.cwd),a=n.isErr(),s;if(n.isErr()){let l=await confirm({message:`You don't have ${ve} initialized in your project. Do you want to continue?`,initialValue:!1});(isCancel(l)||!l)&&(cancel("Canceled!"),process.exit(0)),s={$schema:"",includeTests:!1,watermark:!0,paths:{"*":"./src/blocks"},repos:[]};}else s=n.unwrap();let i=s.repos;e.repo&&(i=[e.repo]);for(let l of t){if(!z.find(h=>l.startsWith(h.name())))continue;let[p,$,R,...B]=l.split("/"),w;if(B.length>2?w=`${p}/${$}/${R}/${B.slice(0,B.length-2).join("/")}`:w=`${p}/${$}/${R}`,!i.find(h=>h===w)){if(!e.allow){let h=await confirm({message:`Allow ${ve} to download and run code from ${P.cyan(w)}?`,initialValue:!0});(isCancel(h)||!h)&&(cancel("Canceled!"),process.exit(0));}i.push(w);}}if(!e.allow&&e.repo){let l=await confirm({message:`Allow ${ve} to download and run code from ${P.cyan(e.repo)}?`,initialValue:!0});(isCancel(l)||!l)&&(cancel("Canceled!"),process.exit(0));}i.length===0&&(a&&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(`Fetching blocks from ${P.cyan(i.join(", "))}`),e.verbose||o.start(`Fetching blocks from ${P.cyan(i.join(", "))}`);let c=(await tt(...i)).match(l=>l,({repo:l,message:p})=>{o.stop(`Failed fetching blocks from ${P.cyan(l)}`),program.error(P.red(p));});e.verbose||o.stop(`Retrieved blocks from ${P.cyan(i.join(", "))}`),r(`Retrieved blocks from ${P.cyan(i.join(", "))}`);let d=Ae(c,s,e.cwd).map(l=>l.specifier),m=t;if(m.length===0){let l=await multiselect({message:"Select which blocks to add.",options:Array.from(c.entries()).filter(([p,$])=>$.list).map(([p,$])=>{let R=`${$.category}/${$.name}`,B=d.findIndex(h=>h===R)!==-1,w;return i.length>1?w=`${P.cyan(`${$.sourceRepo.name}/${$.sourceRepo.owner}/${$.sourceRepo.repoName}/${$.category}`)}/${$.name}`:w=`${P.cyan($.category)}/${$.name}`,{label:B?P.gray(w):w,value:p,hint:B?"Installed":void 0}}),required:!0});isCancel(l)&&(cancel("Canceled!"),process.exit(0)),m=l;}r(`Installing blocks ${P.cyan(m.join(", "))}`),e.verbose&&console.log("Blocks map: ",c);let k=(await pt(m,c,i)).match(l=>l,l=>program.error(l)),u=(await detect({cwd:e.cwd}))?.agent??"npm",y=[],x=new Set,S=new Set;if(a){let l=await text({message:"Where would you like to add the blocks?",initialValue:s.paths["*"],defaultValue:s.paths["*"],placeholder:s.paths["*"],validate(p){if(p.trim()==="")return "Please provide a value"}});if(isCancel(l)&&(cancel("Canceled!"),process.exit(0)),s.paths["*"]=l,!e.yes){let p=await confirm({message:"Include tests?",initialValue:s.includeTests});isCancel(p)&&(cancel("Canceled!"),process.exit(0)),s.includeTests=p;let $=await confirm({message:"Add watermark?",initialValue:s.watermark});isCancel($)&&(cancel("Canceled!"),process.exit(0)),s.watermark=$;}}let{prettierOptions:v,biomeOptions:b}=await rt({formatter:s.formatter,cwd:e.cwd}),T=be(s.paths,e.cwd);T.isErr()&&program.error(P.red(T.unwrapErr()));let j=T.unwrap();for(let{block:l}of k){let p=`${l.sourceRepo.url}/${l.category}/${l.name}`,$=`${l.category}/${l.name}`,R=ot(Y.package.version,l.sourceRepo.url),B=l.sourceRepo;r(`Setting up ${p}`);let w;if(j[l.category]!==void 0?w=H.join(e.cwd,j[l.category]):w=H.join(e.cwd,j["*"],l.category),(!l.subdirectory&&Ce.existsSync(H.join(w,l.files[0]))||l.subdirectory&&Ce.existsSync(H.join(w,l.name)))&&!e.yes){let A=await confirm({message:`${P.cyan($)} already exists in your project would you like to overwrite it?`,initialValue:!1});(isCancel(A)||!A)&&(cancel("Canceled!"),process.exit(0));}y.push({loadingMessage:`Adding ${p}`,completedMessage:`Added ${p}`,run:async()=>{r(`Creating directory ${P.bold(w)}`),Ce.mkdirSync(w,{recursive:!0}),r(`Created directory ${P.bold(w)}`);let A=[],W=async N=>{let U=await B.provider.fetchRaw(B,N,{verbose:r});return U.isErr()&&(o.stop(P.red(`Error fetching ${P.bold(N)}`)),program.error(P.red(`There was an error trying to get ${p}`))),U.unwrap()};for(let N of l.files){if(!s.includeTests&&ue(N))continue;let U=H.join(l.directory,N),Re;l.subdirectory?Re=H.join(w,l.name,N):Re=H.join(w,N),r(`Adding ${P.bold(U)}`);let V=await W(U),Fe=Re.slice(0,Re.length-N.length);r(`Creating directory ${P.bold(Fe)}`),Ce.mkdirSync(Fe,{recursive:!0}),r(`Created directory ${P.bold(Fe)}`),A.push({content:V,destPath:Re}),r(`Got ${P.bold(U)}`);}for(let N of A){let U=await Ct({file:N,biomeOptions:b,prettierOptions:v,config:s,imports:l._imports_,watermark:R,verbose:r,cwd:e.cwd});U.isErr()&&program.error(P.red(U.unwrapErr())),r(`Writing to ${P.bold(N.destPath)}`),Ce.writeFileSync(N.destPath,U.unwrap());}if(s.includeTests&&l.tests){r("Trying to include tests");let{devDependencies:N}=JSON.parse(Ce.readFileSync(H.join(e.cwd,"package.json")).toString());(N===void 0||N.vitest===void 0)&&x.add("vitest");}for(let N of l.devDependencies)x.add(N);for(let N of l.dependencies)S.add(N);}});}await Ue(y,{verbose:e.verbose?r:void 0});let g=vt(S,x,{cwd:e.cwd});if(S=g.dependencies,x=g.devDependencies,S.size>0||x.size>0){let l=e.yes;if(!e.yes){let R=await confirm({message:"Would you like to install dependencies?",initialValue:!0});isCancel(R)&&(cancel("Canceled!"),process.exit(0)),l=R;}l&&(S.size>0&&(e.verbose||o.start(`Installing dependencies with ${P.cyan(u)}`),(await De({pm:u,deps:Array.from(S),dev:!1,cwd:e.cwd})).match(R=>{e.verbose||o.stop(`Installed ${P.cyan(R.join(", "))}`);},R=>{e.verbose||o.stop("Failed to install dependencies"),program.error(R);})),x.size>0&&(e.verbose||o.start(`Installing dependencies with ${P.cyan(u)}`),(await De({pm:u,deps:Array.from(x),dev:!0,cwd:e.cwd})).match(R=>{e.verbose||o.stop(`Installed ${P.cyan(R.join(", "))}`);},R=>{e.verbose||o.stop("Failed to install dev dependencies"),program.error(R);})));let p=[];if(!l){if(S.size>0){let R=resolveCommand(u,"install",[...S]);p.push(`Install dependencies \`${P.cyan(`${R?.command} ${R?.args.join(" ")}`)}\``);}if(x.size>0){let R=resolveCommand(u,"install",[...x,"-D"]);p.push(`Install dev dependencies \`${P.cyan(`${R?.command} ${R?.args.join(" ")}`)}\``);}}p=p.map((R,B)=>`${B+1}. ${R}`),l||p.push(""),p.push("Import and use the blocks!");let $=nt(p);process.stdout.write($);}};var Lo=C.object({token:C.optional(C.string()),provider:C.optional(C.string()),logout:C.boolean(),cwd:C.string()}),Jt=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(z.map(t=>t.name()))).option("--logout","Erase tokens from each provider from storage.",!1).option("--cwd <path>","The current working directory.",process.cwd()).action(async t=>{let e=C.parse(Lo,t);oe(Y.package.version),await Bo(e),outro(P.green("All done!"));}),Bo=async t=>{let e=he();if(t.logout){for(let r of z){let o=`${r.name()}-token`;if(e.get(o)===void 0){process.stdout.write(`${D}
23
+ ${d}`),i?.(`Formatting ${P.bold(e.destPath)}`);try{d=await c.format(d,{filePath:e.destPath,formatter:t.formatter,prettierOptions:n,biomeOptions:a});}catch(m){return I(`Error formatting ${P.bold(e.destPath)} ${m}`)}}for(let[m,k]of Object.entries(r)){let u=kr({template:k,config:t,destPath:e.destPath,cwd:s}),y=new RegExp(`(['"])${$o(m)}\\1`,"g");d=d.replaceAll(y,`$1${u}$1`);}return j(d)};var rt=async({formatter:e,cwd:t})=>{let r=null;e==="prettier"&&(r=await Xe.resolveConfig(H.join(t,".prettierrc")));let o=null;if(e==="biome"){let n=H.join(t,"biome.json");Ce.existsSync(n)&&(o=JSON.parse(Ce.readFileSync(n).toString()));}return {biomeOptions:o,prettierOptions:r}};var ot=(e,t)=>`jsrepo ${e}
24
+ Installed from ${t}
25
+ ${new Date().toLocaleDateString().replaceAll("/","-")}`;var Ue=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);}},nt=e=>{let t=20;e.map(n=>{let a=cr(We(n),4);a.length>t&&(t=a.length);});let r="Next Steps",o=`${D}
26
+ `;return o+=`${Tt} ${r} ${Pt.repeat(t-r.length-1)}${rr}
27
+ `,o+=`${D} ${" ".repeat(t)} ${D}
28
+ `,e.map(n=>{o+=`${D} ${lr(n,t-1)} ${D}
29
+ `;}),o+=`${D} ${" ".repeat(t)} ${D}
30
+ `,o+=`${Tt}${Pt.repeat(t+2)}${or}
31
+ `,o},oe=e=>intro(`${P.bgHex("#f7df1e").black(" jsrepo ")}${P.gray(` v${e} `)}`);var So=C.object({repo:C.optional(C.string()),allow:C.boolean(),yes:C.boolean(),verbose:C.boolean(),cwd:C.string()}),Wt=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(So,t);oe(Y.package.version),await Po(e,r),outro(P.green("All done!"));}),Po=async(e,t)=>{let r=l=>{t.verbose&&console.info(`${qe} ${l}`);};r(`Attempting to add ${JSON.stringify(e)}`);let o=spinner(),n=$e(t.cwd),a=n.isErr(),s;if(n.isErr()){let l=await confirm({message:`You don't have ${ve} initialized in your project. Do you want to continue?`,initialValue:!1});(isCancel(l)||!l)&&(cancel("Canceled!"),process.exit(0)),s={$schema:"",includeTests:!1,watermark:!0,paths:{"*":"./src/blocks"},repos:[]};}else s=n.unwrap();let i=s.repos;t.repo&&(i=[t.repo]);for(let l of e){if(!z.find(h=>l.startsWith(h.name())))continue;let[p,$,R,...B]=l.split("/"),w;if(B.length>2?w=`${p}/${$}/${R}/${B.slice(0,B.length-2).join("/")}`:w=`${p}/${$}/${R}`,!i.find(h=>h===w)){if(!t.allow){let h=await confirm({message:`Allow ${ve} to download and run code from ${P.cyan(w)}?`,initialValue:!0});(isCancel(h)||!h)&&(cancel("Canceled!"),process.exit(0));}i.push(w);}}if(!t.allow&&t.repo){let l=await confirm({message:`Allow ${ve} to download and run code from ${P.cyan(t.repo)}?`,initialValue:!0});(isCancel(l)||!l)&&(cancel("Canceled!"),process.exit(0));}i.length===0&&(a&&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(`Fetching blocks from ${P.cyan(i.join(", "))}`),t.verbose||o.start(`Fetching blocks from ${P.cyan(i.join(", "))}`);let c=(await tt(...i)).match(l=>l,({repo:l,message:p})=>{o.stop(`Failed fetching blocks from ${P.cyan(l)}`),program.error(P.red(p));});t.verbose||o.stop(`Retrieved blocks from ${P.cyan(i.join(", "))}`),r(`Retrieved blocks from ${P.cyan(i.join(", "))}`);let d=Ae(c,s,t.cwd).map(l=>l.specifier),m=e;if(m.length===0){let l=await multiselect({message:"Select which blocks to add.",options:Array.from(c.entries()).filter(([p,$])=>$.list).map(([p,$])=>{let R=`${$.category}/${$.name}`,B=d.findIndex(h=>h===R)!==-1,w;return i.length>1?w=`${P.cyan(`${$.sourceRepo.name}/${$.sourceRepo.owner}/${$.sourceRepo.repoName}/${$.category}`)}/${$.name}`:w=`${P.cyan($.category)}/${$.name}`,{label:B?P.gray(w):w,value:p,hint:B?"Installed":void 0}}),required:!0});isCancel(l)&&(cancel("Canceled!"),process.exit(0)),m=l;}r(`Installing blocks ${P.cyan(m.join(", "))}`),t.verbose&&console.log("Blocks map: ",c);let k=(await pt(m,c,i)).match(l=>l,l=>program.error(l)),u=(await detect({cwd:t.cwd}))?.agent??"npm",y=[],E=new Set,S=new Set;if(a){let l=await text({message:"Where would you like to add the blocks?",initialValue:s.paths["*"],defaultValue:s.paths["*"],placeholder:s.paths["*"],validate(p){if(p.trim()==="")return "Please provide a value"}});if(isCancel(l)&&(cancel("Canceled!"),process.exit(0)),s.paths["*"]=l,!t.yes){let p=await confirm({message:"Include tests?",initialValue:s.includeTests});isCancel(p)&&(cancel("Canceled!"),process.exit(0)),s.includeTests=p;let $=await confirm({message:"Add watermark?",initialValue:s.watermark});isCancel($)&&(cancel("Canceled!"),process.exit(0)),s.watermark=$;}}let{prettierOptions:v,biomeOptions:b}=await rt({formatter:s.formatter,cwd:t.cwd}),T=be(s.paths,t.cwd);T.isErr()&&program.error(P.red(T.unwrapErr()));let x=T.unwrap();for(let{block:l}of k){let p=`${l.sourceRepo.url}/${l.category}/${l.name}`,$=`${l.category}/${l.name}`,R=ot(Y.package.version,l.sourceRepo.url),B=l.sourceRepo;r(`Setting up ${p}`);let w;if(x[l.category]!==void 0?w=H.join(t.cwd,x[l.category]):w=H.join(t.cwd,x["*"],l.category),(!l.subdirectory&&Ce.existsSync(H.join(w,l.files[0]))||l.subdirectory&&Ce.existsSync(H.join(w,l.name)))&&!t.yes){let A=await confirm({message:`${P.cyan($)} already exists in your project would you like to overwrite it?`,initialValue:!1});(isCancel(A)||!A)&&(cancel("Canceled!"),process.exit(0));}y.push({loadingMessage:`Adding ${p}`,completedMessage:`Added ${p}`,run:async()=>{r(`Creating directory ${P.bold(w)}`),Ce.mkdirSync(w,{recursive:!0}),r(`Created directory ${P.bold(w)}`);let A=[],W=async N=>{let U=await B.provider.fetchRaw(B,N,{verbose:r});return U.isErr()&&(o.stop(P.red(`Error fetching ${P.bold(N)}`)),program.error(P.red(`There was an error trying to get ${p}`))),U.unwrap()};for(let N of l.files){if(!s.includeTests&&ue(N))continue;let U=H.join(l.directory,N),Re;l.subdirectory?Re=H.join(w,l.name,N):Re=H.join(w,N),r(`Adding ${P.bold(U)}`);let V=await W(U),Fe=Re.slice(0,Re.length-N.length);r(`Creating directory ${P.bold(Fe)}`),Ce.mkdirSync(Fe,{recursive:!0}),r(`Created directory ${P.bold(Fe)}`),A.push({content:V,destPath:Re}),r(`Got ${P.bold(U)}`);}for(let N of A){let U=await Ct({file:N,biomeOptions:b,prettierOptions:v,config:s,imports:l._imports_,watermark:R,verbose:r,cwd:t.cwd});U.isErr()&&program.error(P.red(U.unwrapErr())),r(`Writing to ${P.bold(N.destPath)}`),Ce.writeFileSync(N.destPath,U.unwrap());}if(s.includeTests&&l.tests){r("Trying to include tests");let{devDependencies:N}=JSON.parse(Ce.readFileSync(H.join(t.cwd,"package.json")).toString());(N===void 0||N.vitest===void 0)&&E.add("vitest");}for(let N of l.devDependencies)E.add(N);for(let N of l.dependencies)S.add(N);}});}await Ue(y,{verbose:t.verbose?r:void 0});let g=vt(S,E,{cwd:t.cwd});if(S=g.dependencies,E=g.devDependencies,S.size>0||E.size>0){let l=t.yes;if(!t.yes){let R=await confirm({message:"Would you like to install dependencies?",initialValue:!0});isCancel(R)&&(cancel("Canceled!"),process.exit(0)),l=R;}l&&(S.size>0&&(t.verbose||o.start(`Installing dependencies with ${P.cyan(u)}`),(await De({pm:u,deps:Array.from(S),dev:!1,cwd:t.cwd})).match(R=>{t.verbose||o.stop(`Installed ${P.cyan(R.join(", "))}`);},R=>{t.verbose||o.stop("Failed to install dependencies"),program.error(R);})),E.size>0&&(t.verbose||o.start(`Installing dependencies with ${P.cyan(u)}`),(await De({pm:u,deps:Array.from(E),dev:!0,cwd:t.cwd})).match(R=>{t.verbose||o.stop(`Installed ${P.cyan(R.join(", "))}`);},R=>{t.verbose||o.stop("Failed to install dev dependencies"),program.error(R);})));let p=[];if(!l){if(S.size>0){let R=resolveCommand(u,"install",[...S]);p.push(`Install dependencies \`${P.cyan(`${R?.command} ${R?.args.join(" ")}`)}\``);}if(E.size>0){let R=resolveCommand(u,"install",[...E,"-D"]);p.push(`Install dev dependencies \`${P.cyan(`${R?.command} ${R?.args.join(" ")}`)}\``);}}p=p.map((R,B)=>`${B+1}. ${R}`),l||p.push(""),p.push("Import and use the blocks!");let $=nt(p);process.stdout.write($);}};var Bo=C.object({token:C.optional(C.string()),provider:C.optional(C.string()),logout:C.boolean(),cwd:C.string()}),Jt=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(z.map(e=>e.name()))).option("--logout","Erase tokens from each provider from storage.",!1).option("--cwd <path>","The current working directory.",process.cwd()).action(async e=>{let t=C.parse(Bo,e);oe(Y.package.version),await Fo(t),outro(P.green("All done!"));}),Fo=async e=>{let t=he();if(e.logout){for(let r of z){let o=`${r.name()}-token`;if(t.get(o)===void 0){process.stdout.write(`${D}
30
32
  `),process.stdout.write(P.gray(`${D} Already logged out of ${r.name()}.
31
- `));continue}let n=await confirm({message:`Remove ${r.name()} token?`,initialValue:!0});isCancel(n)&&(cancel("Canceled!"),process.exit(0)),n&&e.delete(o);}return}if(z.length>1){let r=await select({message:"Which provider is this token for?",options:z.map(o=>({label:o.name(),value:o.name()})),initialValue:z[0].name()});isCancel(r)&&(cancel("Canceled!"),process.exit(0)),t.provider=r;}else t.provider=z[0].name();if(t.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)),t.token=r;}e.set(`${t.provider}-token`,t.token);};var Mo=C.object({dirs:C.optional(C.array(C.string())),includeBlocks:C.optional(C.array(C.string())),includeCategories:C.optional(C.array(C.string())),excludeDeps:C.optional(C.array(C.string())),doNotListBlocks:C.optional(C.array(C.string())),doNotListCategories:C.optional(C.array(C.string())),output:C.boolean(),errorOnWarn:C.boolean(),verbose:C.boolean(),cwd:C.string()}),Gt=new Command("build").description(`Builds the provided --dirs in the project root into a \`${ge}\` 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("--do-not-list-blocks","The names of blocks that shouldn't be listed when the user runs add.").option("--do-not-list-categories","The names of categories that shouldn't be listed when the user runs add.").option("--exclude-deps [deps...]","Dependencies that should not be added.").option("--no-output",`Do not output a \`${ge}\` file.`).option("--error-on-warn","If there is a warning throw an error and do not allow build to complete.",!1).option("--verbose","Include debug logs.",!1).option("--cwd <path>","The current working directory.",process.cwd()).action(async t=>{let e=C.parse(Mo,t);oe(Y.package.version),await Vo(e),outro(P.green("All done!"));}),Vo=async t=>{let e=spinner(),r=[],o=yt(t.cwd).match(s=>{if(s===null)return {$schema:"",dirs:t.dirs??[],doNotListBlocks:t.doNotListBlocks??[],doNotListCategories:t.doNotListCategories??[],errorOnWarn:t.errorOnWarn,excludeDeps:t.excludeDeps??[],includeBlocks:t.includeBlocks??[],includeCategories:t.includeCategories??[],output:t.output};let i=s;return t.dirs&&(i.dirs=t.dirs),t.doNotListBlocks&&(i.doNotListBlocks=t.doNotListBlocks),t.doNotListCategories&&(i.doNotListCategories=t.doNotListCategories),t.includeBlocks&&(i.includeBlocks=t.includeBlocks),t.includeCategories&&(i.includeCategories=t.includeCategories),t.excludeDeps&&(i.excludeDeps=t.excludeDeps),i.errorOnWarn=t.errorOnWarn,i.output=t.output,i},s=>program.error(P.red(s))),n=H.join(t.cwd,ge);for(let s of o.dirs){let i=H.join(t.cwd,s);e.start(`Building ${P.cyan(i)}`),o.output&&Ce.existsSync(n)&&Ce.rmSync(n);let c=$r(i,{cwd:t.cwd,config:o});for(let d of c){if(r.find(m=>m.name===d.name)!==void 0){let m="a category with the same name already exists!";o.errorOnWarn?program.error(P.red(`\`${P.bold(`${s}/${d.name}`)}\` could not be added because ${m}`)):console.warn(`${D} ${fe} Skipped adding \`${P.cyan(`${s}/${d.name}`)}\` because ${m}`);continue}r.push(d);}e.stop(`Built ${P.cyan(i)}`);}e.start("Checking manifest");let a=[];for(let s of r)for(let i of s.blocks){for(let c of i.localDependencies){let[d,m]=c.split("/"),k=r.find(y=>y.name.trim()===d.trim()),u=()=>{let y=`depends on ${P.bold(c)} which doesn't exist!`;o.errorOnWarn?a.push(P.red(`${P.bold(`${s.name}/${i.name}`)} ${y}`)):a.push(`${D} ${fe} ${P.bold(`${s.name}/${i.name}`)} ${y}`);};if(!k){u();continue}k.blocks.find(y=>y.name===m)===void 0&&u();}for(let c of [...i.dependencies,...i.devDependencies])if(!c.includes("@")){let d=`You haven't installed ${P.bold(c)} as a dependency so your users could get any version of it when they install your block!`;o.errorOnWarn?a.push(P.red(d)):a.push(`${D} ${fe} ${d}`);}}if(e.stop("Completed checking manifest."),a.length>0){for(let s of a)console.log(s);o.errorOnWarn&&program.error("Had warnings while checking manifest.");}o.output&&(e.start(`Writing output to \`${P.cyan(n)}\``),Ce.writeFileSync(n,JSON.stringify(r,null," ")),e.stop(`Wrote output to \`${P.cyan(n)}\``));};var Tr=(t,e)=>{let r=0;for(let o of t)r=r+e(o);return r};var Or=t=>/^\s+$/g.test(t),st=t=>{let e=t.length-1;for(;Or(t[e])&&e>=0;){if(t[e]===`
32
- `)return t[e-1]==="\r"?t.slice(0,e-1):t.slice(0,e);e--;}return t},jt=({from:t,to:e,changes:r,expand:o=!1,maxUnchanged:n=5,colorRemoved:a=P.red,colorAdded:s=P.green,colorCharsRemoved:i=P.bgRed,colorCharsAdded:c=P.bgGreen,prefix:d,onUnchanged:m,intro:k})=>{let u="",y=Tr(r,v=>v.count??0).toString().length+1,x=0;if(r.length===1&&!r[0].added&&!r[0].removed)return m({from:t,to:e,changes:r,expand:o,maxUnchanged:n,colorAdded:s,colorRemoved:a,prefix:d,onUnchanged:m,intro:k});u+=k({from:t,to:e,changes:r,expand:o,maxUnchanged:n,colorAdded:s,colorRemoved:a,prefix:d,onUnchanged:m,intro:k});let S=v=>P.gray(`${d?.()??""}${ct(`${v+1+x} `,y)} `);for(let v=0;v<r.length;v++){let b=r[v],T=r[v-1]?.added||r[v-1]?.removed,j=r[v+1]?.added||r[v+1]?.removed;if(!b.added&&!b.removed){if(!o&&b.count!==void 0&&b.count>n){let l=x,p=ce(st(b.value)),$=0;if(j&&($+=n),T&&($+=n),$>=p.length){u+=`${te(p,{prefix:S})}
33
- `,x+=p.length;continue}if(T&&(u+=`${te(p.slice(0,n),{prefix:S})}
34
- `),p.length>$){let R=p.length-$;u+=`${te(ce(P.gray(`+ ${R} more unchanged (${P.italic("-E to expand")})`)),{prefix:()=>`${d?.()??""}${ct(" ",y)} `})}
35
- `;}j&&(x=x+p.length-n,u+=`${te(p.slice(p.length-n),{prefix:S})}
36
- `),x=l+b.count;continue}u+=`${te(ce(st(b.value)),{prefix:S})}
37
- `,x+=b.count??0;continue}let g=l=>l.added?s(st(l.value)):l.removed?a(st(l.value)):l.value,f=l=>l.added?c(st(l.value)):l.removed?i(st(l.value)):l.value;if(b.removed&&b.count===1&&r[v+1]?.added&&r[v+1]?.count===1){let p=diffChars(b.value,r[v+1].value).map($=>f($)).join("");u+=`${S(0)}${p}`,x+=1,v++;}else Or(b.value)?(u+=`${te(ce(f(b)),{prefix:l=>`${S(l)}${f({removed:!0,value:" ",added:!1})}`})}
38
- `,b.removed||(x+=b.count??0)):(u+=`${te(ce(g(b)),{prefix:S})}
39
- `,b.removed||(x+=b.count??0));}return u};var Xo=C.object({expand:C.boolean(),maxUnchanged:C.number(),repo:C.optional(C.string()),allow:C.boolean(),cwd:C.string()}),Ht=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.",t=>Number.parseInt(t),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 t=>{let e=C.parse(Xo,t);oe(Y.package.version),await Zo(e),outro(P.green("All done!"));}),Zo=async t=>{let e=spinner(),r=$e(t.cwd).match(c=>c,c=>program.error(P.red(c))),o=r.repos;if(t.repo&&(o=[t.repo]),!t.allow&&t.repo){let c=await confirm({message:`Allow ${P.cyan("jsrepo")} to download and run code from ${P.cyan(t.repo)}?`,initialValue:!0});(isCancel(c)||!c)&&(cancel("Canceled!"),process.exit(0));}e.start(`Fetching blocks from ${P.cyan(o.join(", "))}`);let n=(await tt(...o)).match(c=>c,({repo:c,message:d})=>{e.stop(`Failed fetching blocks from ${P.cyan(c)}`),program.error(P.red(d));});e.stop(`Retrieved blocks from ${P.cyan(o.join(", "))}`);let a=Ae(n,r,t.cwd),s=be(r.paths,t.cwd);s.isErr()&&program.error(P.red(s.unwrapErr()));let i=s.unwrap();for(let c of a){let d=!1;for(let m of o){let k=(await je(m)).unwrap(),u=`${k.name}/${k.owner}/${k.repoName}/${c.specifier}`,y=n.get(u);if(y===void 0)continue;let x=ot(Y.package.version,m);d=!0,process.stdout.write(`${D}
33
+ `));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(z.length>1){let r=await select({message:"Which provider is this token for?",options:z.map(o=>({label:o.name(),value:o.name()})),initialValue:z[0].name()});isCancel(r)&&(cancel("Canceled!"),process.exit(0)),e.provider=r;}else e.provider=z[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 Vo=C.object({dirs:C.optional(C.array(C.string())),includeBlocks:C.optional(C.array(C.string())),includeCategories:C.optional(C.array(C.string())),excludeDeps:C.optional(C.array(C.string())),doNotListBlocks:C.optional(C.array(C.string())),doNotListCategories:C.optional(C.array(C.string())),output:C.boolean(),errorOnWarn:C.boolean(),verbose:C.boolean(),cwd:C.string()}),Gt=new Command("build").description(`Builds the provided --dirs in the project root into a \`${ge}\` 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("--do-not-list-blocks","The names of blocks that shouldn't be listed when the user runs add.").option("--do-not-list-categories","The names of categories that shouldn't be listed when the user runs add.").option("--exclude-deps [deps...]","Dependencies that should not be added.").option("--no-output",`Do not output a \`${ge}\` file.`).option("--error-on-warn","If there is a warning throw an error and do not allow build to complete.",!1).option("--verbose","Include debug logs.",!1).option("--cwd <path>","The current working directory.",process.cwd()).action(async e=>{let t=C.parse(Vo,e);oe(Y.package.version),await Jo(t),outro(P.green("All done!"));}),Jo=async e=>{let t=spinner(),r=[],o=yt(e.cwd).match(s=>{if(s===null)return {$schema:"",dirs:e.dirs??[],doNotListBlocks:e.doNotListBlocks??[],doNotListCategories:e.doNotListCategories??[],errorOnWarn:e.errorOnWarn,excludeDeps:e.excludeDeps??[],includeBlocks:e.includeBlocks??[],includeCategories:e.includeCategories??[],output:e.output};let i=s;return e.dirs&&(i.dirs=e.dirs),e.doNotListBlocks&&(i.doNotListBlocks=e.doNotListBlocks),e.doNotListCategories&&(i.doNotListCategories=e.doNotListCategories),e.includeBlocks&&(i.includeBlocks=e.includeBlocks),e.includeCategories&&(i.includeCategories=e.includeCategories),e.excludeDeps&&(i.excludeDeps=e.excludeDeps),i.errorOnWarn=e.errorOnWarn,i.output=e.output,i},s=>program.error(P.red(s))),n=H.join(e.cwd,ge);for(let s of o.dirs){let i=H.join(e.cwd,s);t.start(`Building ${P.cyan(i)}`),o.output&&Ce.existsSync(n)&&Ce.rmSync(n);let c=$r(i,{cwd:e.cwd,config:o});for(let d of c){if(r.find(m=>m.name===d.name)!==void 0){let m="a category with the same name already exists!";o.errorOnWarn?program.error(P.red(`\`${P.bold(`${s}/${d.name}`)}\` could not be added because ${m}`)):console.warn(`${D} ${fe} Skipped adding \`${P.cyan(`${s}/${d.name}`)}\` because ${m}`);continue}r.push(d);}t.stop(`Built ${P.cyan(i)}`);}t.start("Checking manifest");let a=[];for(let s of r)for(let i of s.blocks){for(let c of i.localDependencies){let[d,m]=c.split("/"),k=r.find(y=>y.name.trim()===d.trim()),u=()=>{let y=`depends on ${P.bold(c)} which doesn't exist!`;o.errorOnWarn?a.push(P.red(`${P.bold(`${s.name}/${i.name}`)} ${y}`)):a.push(`${D} ${fe} ${P.bold(`${s.name}/${i.name}`)} ${y}`);};if(!k){u();continue}k.blocks.find(y=>y.name===m)===void 0&&u();}for(let c of [...i.dependencies,...i.devDependencies])if(!c.includes("@")){let d=`You haven't installed ${P.bold(c)} as a dependency so your users could get any version of it when they install your block!`;o.errorOnWarn?a.push(P.red(d)):a.push(`${D} ${fe} ${d}`);}}if(t.stop("Completed checking manifest."),a.length>0){for(let s of a)console.log(s);o.errorOnWarn&&program.error("Had warnings while checking manifest.");}o.output&&(t.start(`Writing output to \`${P.cyan(n)}\``),Ce.writeFileSync(n,JSON.stringify(r,null," ")),t.stop(`Wrote output to \`${P.cyan(n)}\``));};var Tr=(e,t)=>{let r=0;for(let o of e)r=r+t(o);return r};var Or=e=>/^\s+$/g.test(e),st=e=>{let t=e.length-1;for(;Or(e[t])&&t>=0;){if(e[t]===`
34
+ `)return e[t-1]==="\r"?e.slice(0,t-1):e.slice(0,t);t--;}return e},jt=({from:e,to:t,changes:r,expand:o=!1,maxUnchanged:n=5,colorRemoved:a=P.red,colorAdded:s=P.green,colorCharsRemoved:i=P.bgRed,colorCharsAdded:c=P.bgGreen,prefix:d,onUnchanged:m,intro:k})=>{let u="",y=Tr(r,v=>v.count??0).toString().length+1,E=0;if(r.length===1&&!r[0].added&&!r[0].removed)return m({from:e,to:t,changes:r,expand:o,maxUnchanged:n,colorAdded:s,colorRemoved:a,prefix:d,onUnchanged:m,intro:k});u+=k({from:e,to:t,changes:r,expand:o,maxUnchanged:n,colorAdded:s,colorRemoved:a,prefix:d,onUnchanged:m,intro:k});let S=v=>P.gray(`${d?.()??""}${ct(`${v+1+E} `,y)} `);for(let v=0;v<r.length;v++){let b=r[v],T=r[v-1]?.added||r[v-1]?.removed,x=r[v+1]?.added||r[v+1]?.removed;if(!b.added&&!b.removed){if(!o&&b.count!==void 0&&b.count>n){let l=E,p=ie(st(b.value)),$=0;if(x&&($+=n),T&&($+=n),$>=p.length){u+=`${ee(p,{prefix:S})}
35
+ `,E+=p.length;continue}if(T&&(u+=`${ee(p.slice(0,n),{prefix:S})}
36
+ `),p.length>$){let R=p.length-$;u+=`${ee(ie(P.gray(`+ ${R} more unchanged (${P.italic("-E to expand")})`)),{prefix:()=>`${d?.()??""}${ct(" ",y)} `})}
37
+ `;}x&&(E=E+p.length-n,u+=`${ee(p.slice(p.length-n),{prefix:S})}
38
+ `),E=l+b.count;continue}u+=`${ee(ie(st(b.value)),{prefix:S})}
39
+ `,E+=b.count??0;continue}let g=l=>l.added?s(st(l.value)):l.removed?a(st(l.value)):l.value,f=l=>l.added?c(st(l.value)):l.removed?i(st(l.value)):l.value;if(b.removed&&b.count===1&&r[v+1]?.added&&r[v+1]?.count===1){let p=diffChars(b.value,r[v+1].value).map($=>f($)).join("");u+=`${S(0)}${p}`,E+=1,v++;}else Or(b.value)?(u+=`${ee(ie(f(b)),{prefix:l=>`${S(l)}${f({removed:!0,value:" ",added:!1})}`})}
40
+ `,b.removed||(E+=b.count??0)):(u+=`${ee(ie(g(b)),{prefix:S})}
41
+ `,b.removed||(E+=b.count??0));}return u};var Zo=C.object({expand:C.boolean(),maxUnchanged:C.number(),repo:C.optional(C.string()),allow:C.boolean(),cwd:C.string()}),Ht=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(Zo,e);oe(Y.package.version),await Qo(t),outro(P.green("All done!"));}),Qo=async e=>{let t=spinner(),r=$e(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 tt(...o)).match(c=>c,({repo:c,message:d})=>{t.stop(`Failed fetching blocks from ${P.cyan(c)}`),program.error(P.red(d));});t.stop(`Retrieved blocks from ${P.cyan(o.join(", "))}`);let a=Ae(n,r,e.cwd),s=be(r.paths,e.cwd);s.isErr()&&program.error(P.red(s.unwrapErr()));let i=s.unwrap();for(let c of a){let d=!1;for(let m of o){let k=(await je(m)).unwrap(),u=`${k.name}/${k.owner}/${k.repoName}/${c.specifier}`,y=n.get(u);if(y===void 0)continue;let E=ot(Y.package.version,m);d=!0,process.stdout.write(`${D}
40
42
  `),process.stdout.write(`${D} ${u}
41
43
  `);for(let S of y.files){if(!r.includeTests&&ue(S))continue;process.stdout.write(`${D}
42
- `);let v=H.join(y.directory,S),b=await k.provider.fetchRaw(k,v);b.isErr()&&program.error(P.red(`There was an error trying to get ${u}`));let T=b.unwrap(),j,g;i[y.category]!==void 0?(g=i[y.category],j=H.join(t.cwd,i[y.category])):(g=H.join(i["*"],y.category),j=H.join(t.cwd,i["*"],y.category));let f=H.join(j,S),l=H.join(g,S);y.subdirectory&&(f=H.join(j,y.name,S),l=H.join(g,y.name,S));let p="";if(Ce.existsSync(f)&&(p=Ce.readFileSync(f).toString()),r.watermark){let w=Me.find(h=>h.matches(v));w&&(T=`${w.comment(x)}
44
+ `);let v=H.join(y.directory,S),b=await k.provider.fetchRaw(k,v);b.isErr()&&program.error(P.red(`There was an error trying to get ${u}`));let T=b.unwrap(),x,g;i[y.category]!==void 0?(g=i[y.category],x=H.join(e.cwd,i[y.category])):(g=H.join(i["*"],y.category),x=H.join(e.cwd,i["*"],y.category));let f=H.join(x,S),l=H.join(g,S);y.subdirectory&&(f=H.join(x,y.name,S),l=H.join(g,y.name,S));let p="";if(Ce.existsSync(f)&&(p=Ce.readFileSync(f).toString()),r.watermark){let w=Me.find(h=>h.matches(v));w&&(T=`${w.comment(E)}
43
45
 
44
- ${T}`);}let $=diffLines(p,T),R=H.join(`${k.name}/${k.owner}/${k.repoName}`,v),B=jt({from:R,to:l,changes:$,expand:t.expand,maxUnchanged:t.maxUnchanged,colorAdded:P.greenBright,colorRemoved:P.redBright,colorCharsAdded:P.bgGreenBright,colorCharsRemoved:P.bgRedBright,prefix:()=>`${D} `,onUnchanged:({from:w,to:h,prefix:A})=>`${A?.()??""}${P.cyan(w)} \u2192 ${P.gray(h)} ${P.gray("(unchanged)")}
46
+ ${T}`);}let $=diffLines(p,T),R=H.join(`${k.name}/${k.owner}/${k.repoName}`,v),B=jt({from:R,to:l,changes:$,expand:e.expand,maxUnchanged:e.maxUnchanged,colorAdded:P.greenBright,colorRemoved:P.redBright,colorCharsAdded:P.bgGreenBright,colorCharsRemoved:P.bgRedBright,prefix:()=>`${D} `,onUnchanged:({from:w,to:h,prefix:A})=>`${A?.()??""}${P.cyan(w)} \u2192 ${P.gray(h)} ${P.gray("(unchanged)")}
45
47
  `,intro:({from:w,to:h,changes:A,prefix:W})=>{let N=A.filter(U=>U.added).length;return `${W?.()??""}${P.cyan(w)} \u2192 ${P.gray(h)} (${N} change${N===1?"":"s"})
46
48
  ${W?.()??""}
47
- `}});process.stdout.write(B);}break}d||program.error(P.red(`Invalid block! ${P.bold(c)} does not exist!`));}};var sn=C.object({path:C.optional(C.string()),repos:C.optional(C.array(C.string())),watermark:C.boolean(),tests:C.optional(C.boolean()),formatter:C.optional(Ot),project:C.optional(C.boolean()),registry:C.optional(C.boolean()),script:C.string(),yes:C.boolean(),cwd:C.string()}),Kt=new Command("init").description("Initializes your project with a configuration file.").option("--path <path>","Path to install the blocks from.").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 t=>{let e=C.parse(sn,t);if(oe(Y.package.version),e.registry!==void 0&&e.project!==void 0&&program.error(P.red(`You cannot provide both ${P.bold("--project")} and ${P.bold("--registry")} at the same time.`)),e.registry===void 0&&e.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)),e.registry=r==="registry";}e.registry?await cn(e):await an(e),outro(P.green("All done!"));}),an=async t=>{let e=he(),r=$e(t.cwd),o=spinner(),n,a=await text({message:"Please enter a default path to install the blocks",validate(k){if(k.trim()==="")return "Please provide a value"},initialValue:r.isOk()?r.unwrap().paths["*"]:"./src/blocks"});if(isCancel(a)&&(cancel("Canceled!"),process.exit(0)),r.isOk()?n={...r.unwrap().paths,"*":a}:n={"*":a},!t.repos)for(t.repos=r.isOk()?r.unwrap().repos:[];;){let k=await confirm({message:`Add ${t.repos.length>0?"another":"a"} repo?`,initialValue:t.repos.length===0});if(isCancel(k)&&(cancel("Canceled!"),process.exit(0)),!k)break;let u=await text({message:"Where should we download the blocks from?",placeholder:"github/ieedan/std",validate:j=>{if(j.trim().length===0)return "Please provide a value";if(!z.find(g=>g.matches(j)))return `Invalid provider! Valid providers (${z.map(g=>g.name()).join(", ")})`}});isCancel(u)&&(cancel("Canceled!"),process.exit(0));let y=z.find(j=>j.matches(u));y||program.error(P.red("Invalid provider!"));let x=`${y.name()}-token`;if(!e.get(x)){let j=await confirm({message:"Would you like to add an auth token?",initialValue:!1});if(isCancel(j)&&(cancel("Canceled!"),process.exit(0)),j){let g=await password({message:"Paste your token",validate(f){if(f.trim()==="")return "Please provide a value"}});isCancel(g)&&(cancel("Canceled!"),process.exit(0)),e.set(x,g);}}o.start(`Fetching categories from ${P.cyan(u)}`);let v=await y.fetchManifest(u);o.stop(`Fetched categories from ${P.cyan(u)}`),v.isErr()&&program.error(P.red(v.unwrapErr()));let b=v.unwrap(),T=await multiselect({message:"Which category paths would you like to configure?",options:b.map(j=>({label:j.name,value:j.name}))});if(isCancel(T)&&(cancel("Canceled!"),process.exit(0)),T.length>0)for(let j of T){let g=n[j],f=await text({message:`Where should ${j} be added in your project?`,validate(l){if(l.trim()==="")return "Please provide a value"},placeholder:g||`./src/${j}`,defaultValue:g,initialValue:g});isCancel(f)&&(cancel("Canceled!"),process.exit(0)),n[j]=f;}t.repos.push(u);}if(!t.formatter){let k=r.isErr()?"none":r.unwrap().formatter??"none";Ce.existsSync(H.join(t.cwd,".prettierrc"))&&(k="prettier"),Ce.existsSync(H.join(t.cwd,"biome.json"))&&(k="biome");let u=await select({message:"What formatter would you like to use?",options:["Prettier","Biome","None"].map(y=>({value:y.toLowerCase(),label:y})),initialValue:k});isCancel(u)&&(cancel("Canceled!"),process.exit(0)),u!=="none"&&(t.formatter=u);}let s={$schema:`https://unpkg.com/jsrepo@${Y.package.version}/schemas/project-config.json`,repos:t.repos,includeTests:r.isOk()&&t.tests===void 0?r.unwrap().includeTests:t.tests??!1,watermark:t.watermark,formatter:t.formatter,paths:n};o.start(`Writing config to \`${_e}\``);let{prettierOptions:i,biomeOptions:c}=await rt({formatter:s.formatter,cwd:t.cwd}),d=H.join(t.cwd,_e),m=await Lt.format(JSON.stringify(s,null," "),{biomeOptions:c,prettierOptions:i,filePath:d,formatter:s.formatter});Ce.writeFileSync(d,m),o.stop(`Wrote config to \`${_e}\`.`);},cn=async t=>{let e=spinner(),r=H.join(t.cwd,"package.json");Ce.existsSync(r)||program.error(P.red(`Couldn't find your ${P.bold("package.json")}!`));let o=yt(t.cwd).match(v=>v,v=>program.error(P.red(v))),n=o===null;for(o||(o={$schema:`https://unpkg.com/jsrepo@${Y.package.version}/schemas/project-config.json`,dirs:[],doNotListBlocks:[],doNotListCategories:[],excludeDeps:[],includeBlocks:[],includeCategories:[],errorOnWarn:!1,output:!0});;){if(o.dirs.length>0){let b=await confirm({message:"Add another blocks directory?",initialValue:!1});if(isCancel(b)&&(cancel("Canceled!"),process.exit(0)),!b)break}let v=await text({message:"Where are your blocks located?",placeholder:"./src"});isCancel(v)&&(cancel("Canceled!"),process.exit(0)),o.dirs.push(v);}let a=JSON.parse(Ce.readFileSync(r).toString());for(;!t.yes&&a.scripts&&a.scripts[t.script];){let v=await confirm({message:`The \`${P.cyan(t.script)}\` already exists overwrite?`,initialValue:!1});if(isCancel(v)&&(cancel("Canceled!"),process.exit(0)),v)break;{let b=await text({message:"What would you like to call the script?",placeholder:"build:registry",validate:T=>{if(T.trim().length===0)return "Please provide a value!"}});isCancel(b)&&(cancel("Canceled!"),process.exit(0)),t.script=b;}}let s=a.devDependencies&&a.devDependencies.jsrepo!==void 0,i=t.yes||s;if(!t.yes&&!s){let v=await confirm({message:`Add ${ve} as a dev dependency?`,initialValue:!0});isCancel(v)&&(cancel("Canceled!"),process.exit(0)),i=v;}let c=!n;if(!t.yes&&n){let v=await confirm({message:`Create a \`${P.cyan(Oe)}\` file?`,initialValue:!0});isCancel(v)&&(cancel("Canceled!"),process.exit(0)),c=v;}let d=(await detect$1({cwd:"cwd"}))?.agent??"npm",m="";if(i)m+="jsrepo build";else {let v=resolveCommand$1(d,"execute",["jsrepo","build"]);v||program.error(P.red(`Error resolving execute command for ${d}`)),m+=`${v.command} ${v.args.join(" ")} `;}c||(m+=` --dirs ${o.dirs.join(" ")} `),a.scripts===void 0&&(a.scripts={}),a.scripts[t.script]=m;let k=[];k.push({loadingMessage:`Adding \`${P.cyan(t.script)}\` to scripts in package.json`,completedMessage:`Added \`${P.cyan(t.script)}\` to scripts in package.json`,run:async()=>{try{Ce.writeFileSync(r,JSON.stringify(a,null," "));}catch(v){program.error(P.red(`Error writing to \`${P.bold(r)}\`. Error: ${v}`));}}}),c&&k.push({loadingMessage:`Writing config to \`${P.cyan(Oe)}\``,completedMessage:`Wrote config to \`${P.cyan(Oe)}\``,run:async()=>{let v=H.join(t.cwd,Oe);try{Ce.writeFileSync(H.join(v),JSON.stringify(o,null," "));}catch(b){program.error(P.red(`Error writing to \`${P.bold(v)}\`. Error: ${b}`));}}}),await Ue(k,{});let u=s;if(i&&!s){let v=t.yes;if(!t.yes){let b=await confirm({message:"Install dependencies?",initialValue:!0});isCancel(b)&&(cancel("Canceled!"),process.exit(0)),v=b;}v&&(e.start(`Installing ${ve}`),(await De({pm:d,deps:["jsrepo"],dev:!0,cwd:t.cwd})).match(()=>e.stop(`Installed ${ve}.`),T=>{e.stop(`Failed to install ${ve}.`),program.error(T);}),u=!0);}let y=[];if(!u&&i){let v=resolveCommand$1(d,"install",["jsrepo","-D"]);y.push(`Install ${ve} as a dev dependency \`${P.cyan(`${v?.command} ${v?.args.join(" ")}`)}\``);}y.push(`Add categories to \`${P.cyan(o.dirs.join(", "))}\`.`);let x=resolveCommand$1(d,"run",[t.script]);y.push(`Run \`${P.cyan(`${x?.command} ${x?.args.join(" ")}`)}\` to build the registry.`),y=y.map((v,b)=>`${b+1}. ${v}`);let S=nt(y);process.stdout.write(S);};var $n=C.object({repo:C.optional(C.string()),allow:C.boolean(),debug:C.boolean(),verbose:C.boolean(),cwd:C.string()}),Xt=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(t,e)=>{let r=C.parse($n,e);oe(Y.package.version),await bn(t,r),outro(P.green("All done!"));}),bn=async(t,e)=>{let r=f=>{e.verbose&&console.info(`${qe} ${f}`);};r(`Attempting to test ${JSON.stringify(t)}`);let o=$e(e.cwd).match(f=>f,f=>program.error(P.red(f))),n=spinner(),a=new Map,s=o.repos;if(e.repo&&(s=[e.repo]),!e.allow&&e.repo){let f=await confirm({message:`Allow ${P.cyan("jsrepo")} to download and run code from ${P.cyan(e.repo)}?`,initialValue:!0});(isCancel(f)||!f)&&(cancel("Canceled!"),process.exit(0));}r(`Fetching blocks from ${P.cyan(s.join(", "))}`),e.verbose||n.start(`Fetching blocks from ${P.cyan(s.join(", "))}`);for(let f of s){let l=(await je(f)).match(R=>R,R=>program.error(P.red(R))),p=await l.provider.fetchManifest(l);r(`Got info for provider ${P.cyan(l.name)}`),p.isErr()&&(e.verbose||n.stop(`Error fetching ${P.cyan(f)}`),program.error(P.red(`There was an error fetching the \`${ge}\` from the repository ${P.cyan(f)} make sure the target repository has a \`${ge}\` in its root?`)));let $=p.unwrap();for(let R of $)for(let B of R.blocks)a.set(`${l.name}/${l.owner}/${l.repoName}/${R.name}/${B.name}`,{...B,sourceRepo:l});}r(`Retrieved blocks from ${P.cyan(s.join(", "))}`),e.verbose||n.stop(`Retrieved blocks from ${P.cyan(s.join(", "))}`);let i=H.resolve(H.join(e.cwd,`blocks-tests-temp-${Date.now()}`));r(`Trying to create the temp directory ${P.bold(i)}.`),Ce.mkdirSync(i,{recursive:!0});let c=()=>{Ce.rmSync(i,{recursive:!0,force:!0});},d=Ae(a,o,e.cwd).map(f=>f.specifier),m=t;t.length===0&&(m=d),m.length===0&&(c(),program.error(P.red("There were no blocks found in your project!")));let k=[];for(let f of m){let l;if(z.find(p=>f.startsWith(p.name()))){if(s.length===0){let[p,$,R,...B]=f.split("/"),w;B.length>2?w=`${p}/${$}/${R}/${B.slice(0,B.length-2).join("/")}`:w=`${p}/${$}/${R}`;let h=(await je(w)).match(W=>W,W=>program.error(P.red(W))),A=(await h.provider.fetchManifest(h)).match(W=>W,W=>program.error(P.red(W)));for(let W of A)for(let N of W.blocks)a.set(`${h.name}/${h.owner}/${h.repoName}/${W.name}/${N.name}`,{...N,sourceRepo:h});}l=a.get(f);}else for(let p of s){let $=(await je(p)).unwrap(),R=a.get(`${$.name}/${$.owner}/${$.repoName}/${f}`);if(R!==void 0){l=R;break}}l||program.error(P.red(`Invalid block! ${P.bold(f)} does not exist!`)),k.push({name:f,block:l});}let u=be(o.paths,e.cwd);u.isErr()&&program.error(P.red(u.unwrapErr()));let y=u.unwrap();for(let{block:f}of k){let l=f.sourceRepo,p=`${f.sourceRepo.url}/${f.category}/${f.name}`;if(e.verbose||n.start(`Setting up test file for ${P.cyan(p)}`),!f.tests){n.stop(`No tests found for ${P.cyan(p)}`);continue}let $;y[f.category]!==void 0?$=H.join(e.cwd,y[f.category]):$=H.join(e.cwd,y["*"],f.category),$=H.relative(i,$);let R=async h=>{let A=await l.provider.fetchRaw(l,h);return A.isErr()&&(n.stop(P.red(`Error fetching ${P.bold(h)}`)),program.error(P.red(`There was an error trying to get ${p}`))),A.unwrap()};r(`Downloading and copying test files for ${p}`);let B=[];for(let h of f.files.filter(A=>ue(A))){let A=await R(H.join(f.directory,h)),W=H.join(i,h);Ce.writeFileSync(W,A),B.push(W);}let w=new Project;for(let h of B){r(`Opening test file ${h}`);let A=w.addSourceFileAtPath(h);for(let W of A.getImportDeclarations()){let N=W.getModuleSpecifierValue(),U;N.startsWith(".")&&(f.subdirectory?U=H.join($,f.name,N):U=H.join($,N)),U&&W.setModuleSpecifier(U.replaceAll(/\\/g,"/"));}}w.saveSync(),r(`Completed ${P.cyan.bold(p)} test file`),e.verbose||n.stop(`Completed setup for ${P.bold(p)}`);}r("Beginning testing");let x=await detect({cwd:e.cwd});x==null&&program.error(P.red("Could not detect package manager"));let S=resolveCommand(x.agent,"execute",["vitest","run",i]);S==null&&program.error(P.red(`Could not resolve add command for '${x.agent}'.`));let{command:v,args:b}=S,T=`${v} ${b.join(" ")}`,j=execa({cwd:e.cwd,stdio:["ignore","pipe","pipe"]})`${T}`,g=f=>console.info(f.toString());j.stdout.on("data",g),j.stderr.on("data",g);try{await j,c();}catch(f){e.debug?console.info(`${P.bold("--debug")} flag provided. Skipping cleanup. Run '${P.bold(T)}' to retry tests.
48
- `):c(),program.error(P.red(`Tests failed! Error ${f}`));}};var In=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()}),Qt=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.",t=>Number.parseInt(t),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(t,e)=>{let r=C.parse(In,e);oe(Y.package.version),await Sn(t,r),outro(P.green("All done!"));}),Sn=async(t,e)=>{let r=g=>{e.verbose&&console.info(`${qe} ${g}`);};r(`Attempting to update ${JSON.stringify(t)}`);let o=spinner(),n=$e(e.cwd).match(g=>g,g=>program.error(P.red(g))),a=n.repos;e.repo&&(a=[e.repo]);for(let g of t)z.find(f=>g.startsWith(f.name()))&&program.error(P.red(`Invalid value provided for block names \`${P.bold(g)}\`. Block names are expected to be provided in the format of \`${P.bold("<category>/<name>")}\``));if(!e.allow&&e.repo){let g=await confirm({message:`Allow ${P.cyan("jsrepo")} to download and run code from ${P.cyan(e.repo)}?`,initialValue:!0});(isCancel(g)||!g)&&(cancel("Canceled!"),process.exit(0));}r(`Fetching blocks from ${P.cyan(a.join(", "))}`),e.verbose||o.start(`Fetching blocks from ${P.cyan(a.join(", "))}`);let s=(await tt(...a)).match(g=>g,({repo:g,message:f})=>{o.stop(`Failed fetching blocks from ${P.cyan(g)}`),program.error(P.red(f));});e.verbose||o.stop(`Retrieved blocks from ${P.cyan(a.join(", "))}`),r(`Retrieved blocks from ${P.cyan(a.join(", "))}`);let i=Ae(s,n,e.cwd);i.length===0&&program.error(P.red(`You haven't installed any blocks yet. Did you mean to \`${P.bold("add")}\`?`));let c=t;if(e.all&&(c=i.map(g=>g.specifier)),c.length===0){let g=await multiselect({message:"Which blocks would you like to update?",options:i.map(f=>({label:`${P.cyan(f.block.category)}/${f.block.name}`,value:f.specifier})),required:!0});isCancel(g)&&(cancel("Canceled!"),process.exit(0)),c=g;}r(`Preparing to update ${P.cyan(c.join(", "))}`);let d=(await pt(c,s,a)).match(g=>g,program.error),m=(await detect({cwd:e.cwd}))?.agent??"npm",k=[],u=new Set,y=new Set,{prettierOptions:x,biomeOptions:S}=await rt({formatter:n.formatter,cwd:e.cwd}),v=be(n.paths,e.cwd);v.isErr()&&program.error(P.red(v.unwrapErr()));let b=v.unwrap();for(let{block:g}of d){let f=`${g.sourceRepo.url}/${g.category}/${g.name}`,l=ot(Y.package.version,g.sourceRepo.url),p=g.sourceRepo;r(`Attempting to add ${f}`);let $;b[g.category]!==void 0?$=H.join(e.cwd,b[g.category]):$=H.join(e.cwd,b["*"],g.category);let R=[],B=async w=>{let h=await p.provider.fetchRaw(p,w,{verbose:r});return h.isErr()&&(o.stop(P.red(`Error fetching ${P.bold(w)}`)),program.error(P.red(`There was an error trying to get ${f}`))),h.unwrap()};for(let w of g.files){if(!n.includeTests&&ue(w))continue;let h=H.join(g.directory,w),A;g.subdirectory?A=H.join($,g.name,w):A=H.join($,w);let W=await B(h);Ce.mkdirSync(A.slice(0,A.length-w.length),{recursive:!0}),R.push({content:W,destPath:A,fileName:w});}process.stdout.write(`${D}
49
+ `}});process.stdout.write(B);}break}d||program.error(P.red(`Invalid block! ${P.bold(c)} does not exist!`));}};var an=C.object({path:C.optional(C.string()),repos:C.optional(C.array(C.string())),watermark:C.boolean(),tests:C.optional(C.boolean()),formatter:C.optional(Ot),project:C.optional(C.boolean()),registry:C.optional(C.boolean()),script:C.string(),yes:C.boolean(),cwd:C.string()}),Kt=new Command("init").description("Initializes your project with a configuration file.").option("--path <path>","Path to install the blocks from.").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(an,e);if(oe(Y.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 ln(t):await cn(t),outro(P.green("All done!"));}),cn=async e=>{let t=he(),r=$e(e.cwd),o=spinner(),n,a=await text({message:"Please enter a default path to install the blocks",validate(k){if(k.trim()==="")return "Please provide a value"},initialValue:r.isOk()?r.unwrap().paths["*"]:"./src/blocks"});if(isCancel(a)&&(cancel("Canceled!"),process.exit(0)),r.isOk()?n={...r.unwrap().paths,"*":a}:n={"*":a},!e.repos)for(e.repos=r.isOk()?r.unwrap().repos:[];;){let k=await confirm({message:`Add ${e.repos.length>0?"another":"a"} repo?`,initialValue:e.repos.length===0});if(isCancel(k)&&(cancel("Canceled!"),process.exit(0)),!k)break;let u=await text({message:"Where should we download the blocks from?",placeholder:"github/ieedan/std",validate:x=>{if(x.trim().length===0)return "Please provide a value";if(!z.find(g=>g.matches(x)))return `Invalid provider! Valid providers (${z.map(g=>g.name()).join(", ")})`}});isCancel(u)&&(cancel("Canceled!"),process.exit(0));let y=z.find(x=>x.matches(u));y||program.error(P.red("Invalid provider!"));let E=`${y.name()}-token`;if(!t.get(E)){let x=await confirm({message:"Would you like to add an auth token?",initialValue:!1});if(isCancel(x)&&(cancel("Canceled!"),process.exit(0)),x){let g=await password({message:"Paste your token",validate(f){if(f.trim()==="")return "Please provide a value"}});isCancel(g)&&(cancel("Canceled!"),process.exit(0)),t.set(E,g);}}o.start(`Fetching categories from ${P.cyan(u)}`);let v=await y.fetchManifest(u);o.stop(`Fetched categories from ${P.cyan(u)}`),v.isErr()&&program.error(P.red(v.unwrapErr()));let b=v.unwrap(),T=await multiselect({message:"Which category paths would you like to configure?",options:b.map(x=>({label:x.name,value:x.name}))});if(isCancel(T)&&(cancel("Canceled!"),process.exit(0)),T.length>0)for(let x of T){let g=n[x],f=await text({message:`Where should ${x} be added in your project?`,validate(l){if(l.trim()==="")return "Please provide a value"},placeholder:g||`./src/${x}`,defaultValue:g,initialValue:g});isCancel(f)&&(cancel("Canceled!"),process.exit(0)),n[x]=f;}e.repos.push(u);}if(!e.formatter){let k=r.isErr()?"none":r.unwrap().formatter??"none";Ce.existsSync(H.join(e.cwd,".prettierrc"))&&(k="prettier"),Ce.existsSync(H.join(e.cwd,"biome.json"))&&(k="biome");let u=await select({message:"What formatter would you like to use?",options:["Prettier","Biome","None"].map(y=>({value:y.toLowerCase(),label:y})),initialValue:k});isCancel(u)&&(cancel("Canceled!"),process.exit(0)),u!=="none"&&(e.formatter=u);}let s={$schema:`https://unpkg.com/jsrepo@${Y.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 \`${_e}\``);let{prettierOptions:i,biomeOptions:c}=await rt({formatter:s.formatter,cwd:e.cwd}),d=H.join(e.cwd,_e),m=await Lt.format(JSON.stringify(s,null," "),{biomeOptions:c,prettierOptions:i,filePath:d,formatter:s.formatter});Ce.writeFileSync(d,m),o.stop(`Wrote config to \`${_e}\`.`);},ln=async e=>{let t=spinner(),r=H.join(e.cwd,"package.json");Ce.existsSync(r)||program.error(P.red(`Couldn't find your ${P.bold("package.json")}!`));let o=yt(e.cwd).match(v=>v,v=>program.error(P.red(v))),n=o===null;for(o||(o={$schema:`https://unpkg.com/jsrepo@${Y.package.version}/schemas/project-config.json`,dirs:[],doNotListBlocks:[],doNotListCategories:[],excludeDeps:[],includeBlocks:[],includeCategories:[],errorOnWarn:!1,output:!0});;){if(o.dirs.length>0){let b=await confirm({message:"Add another blocks directory?",initialValue:!1});if(isCancel(b)&&(cancel("Canceled!"),process.exit(0)),!b)break}let v=await text({message:"Where are your blocks located?",placeholder:"./src"});isCancel(v)&&(cancel("Canceled!"),process.exit(0)),o.dirs.push(v);}let a=JSON.parse(Ce.readFileSync(r).toString());for(;!e.yes&&a.scripts&&a.scripts[e.script];){let v=await confirm({message:`The \`${P.cyan(e.script)}\` already exists overwrite?`,initialValue:!1});if(isCancel(v)&&(cancel("Canceled!"),process.exit(0)),v)break;{let b=await text({message:"What would you like to call the script?",placeholder:"build:registry",validate:T=>{if(T.trim().length===0)return "Please provide a value!"}});isCancel(b)&&(cancel("Canceled!"),process.exit(0)),e.script=b;}}let s=a.devDependencies&&a.devDependencies.jsrepo!==void 0,i=e.yes||s;if(!e.yes&&!s){let v=await confirm({message:`Add ${ve} as a dev dependency?`,initialValue:!0});isCancel(v)&&(cancel("Canceled!"),process.exit(0)),i=v;}let c=!n;if(!e.yes&&n){let v=await confirm({message:`Create a \`${P.cyan(Oe)}\` file?`,initialValue:!0});isCancel(v)&&(cancel("Canceled!"),process.exit(0)),c=v;}let d=(await detect$1({cwd:"cwd"}))?.agent??"npm",m="";if(i)m+="jsrepo build";else {let v=resolveCommand$1(d,"execute",["jsrepo","build"]);v||program.error(P.red(`Error resolving execute command for ${d}`)),m+=`${v.command} ${v.args.join(" ")} `;}c||(m+=` --dirs ${o.dirs.join(" ")} `),a.scripts===void 0&&(a.scripts={}),a.scripts[e.script]=m;let k=[];k.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{Ce.writeFileSync(r,JSON.stringify(a,null," "));}catch(v){program.error(P.red(`Error writing to \`${P.bold(r)}\`. Error: ${v}`));}}}),c&&k.push({loadingMessage:`Writing config to \`${P.cyan(Oe)}\``,completedMessage:`Wrote config to \`${P.cyan(Oe)}\``,run:async()=>{let v=H.join(e.cwd,Oe);try{Ce.writeFileSync(H.join(v),JSON.stringify(o,null," "));}catch(b){program.error(P.red(`Error writing to \`${P.bold(v)}\`. Error: ${b}`));}}}),await Ue(k,{});let u=s;if(i&&!s){let v=e.yes;if(!e.yes){let b=await confirm({message:"Install dependencies?",initialValue:!0});isCancel(b)&&(cancel("Canceled!"),process.exit(0)),v=b;}v&&(t.start(`Installing ${ve}`),(await De({pm:d,deps:["jsrepo"],dev:!0,cwd:e.cwd})).match(()=>t.stop(`Installed ${ve}.`),T=>{t.stop(`Failed to install ${ve}.`),program.error(T);}),u=!0);}let y=[];if(!u&&i){let v=resolveCommand$1(d,"install",["jsrepo","-D"]);y.push(`Install ${ve} as a dev dependency \`${P.cyan(`${v?.command} ${v?.args.join(" ")}`)}\``);}y.push(`Add categories to \`${P.cyan(o.dirs.join(", "))}\`.`);let E=resolveCommand$1(d,"run",[e.script]);y.push(`Run \`${P.cyan(`${E?.command} ${E?.args.join(" ")}`)}\` to build the registry.`),y=y.map((v,b)=>`${b+1}. ${v}`);let S=nt(y);process.stdout.write(S);};var bn=C.object({repo:C.optional(C.string()),allow:C.boolean(),debug:C.boolean(),verbose:C.boolean(),cwd:C.string()}),Xt=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(bn,t);oe(Y.package.version),await kn(e,r),outro(P.green("All done!"));}),kn=async(e,t)=>{let r=f=>{t.verbose&&console.info(`${qe} ${f}`);};r(`Attempting to test ${JSON.stringify(e)}`);let o=$e(t.cwd).match(f=>f,f=>program.error(P.red(f))),n=spinner(),a=new Map,s=o.repos;if(t.repo&&(s=[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(s.join(", "))}`),t.verbose||n.start(`Fetching blocks from ${P.cyan(s.join(", "))}`);for(let f of s){let l=(await je(f)).match(R=>R,R=>program.error(P.red(R))),p=await l.provider.fetchManifest(l);r(`Got info for provider ${P.cyan(l.name)}`),p.isErr()&&(t.verbose||n.stop(`Error fetching ${P.cyan(f)}`),program.error(P.red(`There was an error fetching the \`${ge}\` from the repository ${P.cyan(f)} make sure the target repository has a \`${ge}\` in its root?`)));let $=p.unwrap();for(let R of $)for(let B of R.blocks)a.set(`${l.name}/${l.owner}/${l.repoName}/${R.name}/${B.name}`,{...B,sourceRepo:l});}r(`Retrieved blocks from ${P.cyan(s.join(", "))}`),t.verbose||n.stop(`Retrieved blocks from ${P.cyan(s.join(", "))}`);let i=H.resolve(H.join(t.cwd,`blocks-tests-temp-${Date.now()}`));r(`Trying to create the temp directory ${P.bold(i)}.`),Ce.mkdirSync(i,{recursive:!0});let c=()=>{Ce.rmSync(i,{recursive:!0,force:!0});},d=Ae(a,o,t.cwd).map(f=>f.specifier),m=e;e.length===0&&(m=d),m.length===0&&(c(),program.error(P.red("There were no blocks found in your project!")));let k=[];for(let f of m){let l;if(z.find(p=>f.startsWith(p.name()))){if(s.length===0){let[p,$,R,...B]=f.split("/"),w;B.length>2?w=`${p}/${$}/${R}/${B.slice(0,B.length-2).join("/")}`:w=`${p}/${$}/${R}`;let h=(await je(w)).match(W=>W,W=>program.error(P.red(W))),A=(await h.provider.fetchManifest(h)).match(W=>W,W=>program.error(P.red(W)));for(let W of A)for(let N of W.blocks)a.set(`${h.name}/${h.owner}/${h.repoName}/${W.name}/${N.name}`,{...N,sourceRepo:h});}l=a.get(f);}else for(let p of s){let $=(await je(p)).unwrap(),R=a.get(`${$.name}/${$.owner}/${$.repoName}/${f}`);if(R!==void 0){l=R;break}}l||program.error(P.red(`Invalid block! ${P.bold(f)} does not exist!`)),k.push({name:f,block:l});}let u=be(o.paths,t.cwd);u.isErr()&&program.error(P.red(u.unwrapErr()));let y=u.unwrap();for(let{block:f}of k){let l=f.sourceRepo,p=`${f.sourceRepo.url}/${f.category}/${f.name}`;if(t.verbose||n.start(`Setting up test file for ${P.cyan(p)}`),!f.tests){n.stop(`No tests found for ${P.cyan(p)}`);continue}let $;y[f.category]!==void 0?$=H.join(t.cwd,y[f.category]):$=H.join(t.cwd,y["*"],f.category),$=H.relative(i,$);let R=async h=>{let A=await l.provider.fetchRaw(l,h);return A.isErr()&&(n.stop(P.red(`Error fetching ${P.bold(h)}`)),program.error(P.red(`There was an error trying to get ${p}`))),A.unwrap()};r(`Downloading and copying test files for ${p}`);let B=[];for(let h of f.files.filter(A=>ue(A))){let A=await R(H.join(f.directory,h)),W=H.join(i,h);Ce.writeFileSync(W,A),B.push(W);}let w=new Project;for(let h of B){r(`Opening test file ${h}`);let A=w.addSourceFileAtPath(h);for(let W of A.getImportDeclarations()){let N=W.getModuleSpecifierValue(),U;N.startsWith(".")&&(f.subdirectory?U=H.join($,f.name,N):U=H.join($,N)),U&&W.setModuleSpecifier(U.replaceAll(/\\/g,"/"));}}w.saveSync(),r(`Completed ${P.cyan.bold(p)} test file`),t.verbose||n.stop(`Completed setup for ${P.bold(p)}`);}r("Beginning testing");let E=await detect({cwd:t.cwd});E==null&&program.error(P.red("Could not detect package manager"));let S=resolveCommand(E.agent,"execute",["vitest","run",i]);S==null&&program.error(P.red(`Could not resolve add command for '${E.agent}'.`));let{command:v,args:b}=S,T=`${v} ${b.join(" ")}`,x=execa({cwd:t.cwd,stdio:["ignore","pipe","pipe"]})`${T}`,g=f=>console.info(f.toString());x.stdout.on("data",g),x.stderr.on("data",g);try{await x,c();}catch(f){t.debug?console.info(`${P.bold("--debug")} flag provided. Skipping cleanup. Run '${P.bold(T)}' to retry tests.
50
+ `):c(),program.error(P.red(`Tests failed! Error ${f}`));}};var Sn=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()}),Qt=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(Sn,t);oe(Y.package.version),await Pn(e,r),outro(P.green("All done!"));}),Pn=async(e,t)=>{let r=g=>{t.verbose&&console.info(`${qe} ${g}`);};r(`Attempting to update ${JSON.stringify(e)}`);let o=spinner(),n=$e(t.cwd).match(g=>g,g=>program.error(P.red(g))),a=n.repos;t.repo&&(a=[t.repo]);for(let g of e)z.find(f=>g.startsWith(f.name()))&&program.error(P.red(`Invalid value provided for block names \`${P.bold(g)}\`. Block names are expected to be provided in the format of \`${P.bold("<category>/<name>")}\``));if(!t.allow&&t.repo){let g=await confirm({message:`Allow ${P.cyan("jsrepo")} to download and run code from ${P.cyan(t.repo)}?`,initialValue:!0});(isCancel(g)||!g)&&(cancel("Canceled!"),process.exit(0));}r(`Fetching blocks from ${P.cyan(a.join(", "))}`),t.verbose||o.start(`Fetching blocks from ${P.cyan(a.join(", "))}`);let s=(await tt(...a)).match(g=>g,({repo:g,message:f})=>{o.stop(`Failed fetching blocks from ${P.cyan(g)}`),program.error(P.red(f));});t.verbose||o.stop(`Retrieved blocks from ${P.cyan(a.join(", "))}`),r(`Retrieved blocks from ${P.cyan(a.join(", "))}`);let i=Ae(s,n,t.cwd);i.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=i.map(g=>g.specifier)),c.length===0){let g=await multiselect({message:"Which blocks would you like to update?",options:i.map(f=>({label:`${P.cyan(f.block.category)}/${f.block.name}`,value:f.specifier})),required:!0});isCancel(g)&&(cancel("Canceled!"),process.exit(0)),c=g;}r(`Preparing to update ${P.cyan(c.join(", "))}`);let d=(await pt(c,s,a)).match(g=>g,program.error),m=(await detect({cwd:t.cwd}))?.agent??"npm",k=[],u=new Set,y=new Set,{prettierOptions:E,biomeOptions:S}=await rt({formatter:n.formatter,cwd:t.cwd}),v=be(n.paths,t.cwd);v.isErr()&&program.error(P.red(v.unwrapErr()));let b=v.unwrap();for(let{block:g}of d){let f=`${g.sourceRepo.url}/${g.category}/${g.name}`,l=ot(Y.package.version,g.sourceRepo.url),p=g.sourceRepo;r(`Attempting to add ${f}`);let $;b[g.category]!==void 0?$=H.join(t.cwd,b[g.category]):$=H.join(t.cwd,b["*"],g.category);let R=[],B=async w=>{let h=await p.provider.fetchRaw(p,w,{verbose:r});return h.isErr()&&(o.stop(P.red(`Error fetching ${P.bold(w)}`)),program.error(P.red(`There was an error trying to get ${f}`))),h.unwrap()};for(let w of g.files){if(!n.includeTests&&ue(w))continue;let h=H.join(g.directory,w),A;g.subdirectory?A=H.join($,g.name,w):A=H.join($,w);let W=await B(h);Ce.mkdirSync(A.slice(0,A.length-w.length),{recursive:!0}),R.push({content:W,destPath:A,fileName:w});}process.stdout.write(`${D}
49
51
  `),process.stdout.write(`${D} ${f}
50
- `);for(let w of R){let h=await Ct({file:w,biomeOptions:S,prettierOptions:x,config:n,imports:g._imports_,watermark:l,verbose:r,cwd:e.cwd});h.isErr()&&program.error(P.red(h.unwrapErr()));let A=h.unwrap(),W=e.yes;if(!e.yes){process.stdout.write(`${D}
51
- `);let N="";Ce.existsSync(w.destPath)&&(N=Ce.readFileSync(w.destPath).toString());let U=diffLines(N,A),Re=H.join(`${p.name}/${p.owner}/${p.repoName}`,w.fileName),V=H.relative(e.cwd,w.destPath),Fe=jt({from:Re,to:V,changes:U,expand:e.expand,maxUnchanged:e.maxUnchanged,colorAdded:P.greenBright,colorRemoved:P.redBright,colorCharsAdded:P.bgGreenBright,colorCharsRemoved:P.bgRedBright,prefix:()=>`${D} `,onUnchanged:({from:Ke,to:It,prefix:St})=>`${St?.()??""}${P.cyan(Ke)} \u2192 ${P.gray(It)} ${P.gray("(unchanged)")}
52
+ `);for(let w of R){let h=await Ct({file:w,biomeOptions:S,prettierOptions:E,config:n,imports:g._imports_,watermark:l,verbose:r,cwd:t.cwd});h.isErr()&&program.error(P.red(h.unwrapErr()));let A=h.unwrap(),W=t.yes;if(!t.yes){process.stdout.write(`${D}
53
+ `);let N="";Ce.existsSync(w.destPath)&&(N=Ce.readFileSync(w.destPath).toString());let U=diffLines(N,A),Re=H.join(`${p.name}/${p.owner}/${p.repoName}`,w.fileName),V=H.relative(t.cwd,w.destPath),Fe=jt({from:Re,to:V,changes:U,expand:t.expand,maxUnchanged:t.maxUnchanged,colorAdded:P.greenBright,colorRemoved:P.redBright,colorCharsAdded:P.bgGreenBright,colorCharsRemoved:P.bgRedBright,prefix:()=>`${D} `,onUnchanged:({from:Ke,to:It,prefix:St})=>`${St?.()??""}${P.cyan(Ke)} \u2192 ${P.gray(It)} ${P.gray("(unchanged)")}
52
54
  `,intro:({from:Ke,to:It,changes:St,prefix:er})=>{let tr=St.filter(Vr=>Vr.added).length;return `${er?.()??""}${P.cyan(Ke)} \u2192 ${P.gray(It)} (${tr} change${tr===1?"":"s"})
53
55
  ${er?.()??""}
54
- `}});if(process.stdout.write(Fe),U.length>1||N===""){let Ke=await confirm({message:"Accept changes?",initialValue:!0});isCancel(Ke)&&(cancel("Canceled!"),process.exit(0)),W=Ke;}}W&&await Ue([{loadingMessage:`Writing changes to ${P.cyan(w.destPath)}`,completedMessage:`Wrote changes to ${P.cyan(w.destPath)}.`,run:async()=>Ce.writeFileSync(w.destPath,A)}],{verbose:e.verbose?r:void 0});}if(n.includeTests&&g.tests){r("Trying to include tests");let{devDependencies:w}=JSON.parse(Ce.readFileSync(H.join(e.cwd,"package.json")).toString());(w===void 0||w.vitest===void 0)&&u.add("vitest");}for(let w of g.devDependencies)u.add(w);for(let w of g.dependencies)y.add(w);}await Ue(k,{verbose:e.verbose?r:void 0});let T=vt(y,u,{cwd:e.cwd});if(y=T.dependencies,u=T.devDependencies,y.size>0||u.size>0){let g=e.yes;if(!e.yes){let p=await confirm({message:"Would you like to install dependencies?",initialValue:!0});isCancel(p)&&(cancel("Canceled!"),process.exit(0)),g=p;}g&&(y.size>0&&(e.verbose||o.start(`Installing dependencies with ${P.cyan(m)}`),(await De({pm:m,deps:Array.from(y),dev:!1,cwd:e.cwd})).match(p=>{e.verbose||o.stop(`Installed ${P.cyan(p.join(", "))}`);},p=>{e.verbose||o.stop("Failed to install dependencies"),program.error(p);})),u.size>0&&(e.verbose||o.start(`Installing dependencies with ${P.cyan(m)}`),(await De({pm:m,deps:Array.from(u),dev:!0,cwd:e.cwd})).match(p=>{e.verbose||o.stop(`Installed ${P.cyan(p.join(", "))}`);},p=>{e.verbose||o.stop("Failed to install dev dependencies"),program.error(p);})));let f=[];if(!g){if(y.size>0){let p=resolveCommand(m,"install",[...y]);f.push(`Install dependencies \`${P.cyan(`${p?.command} ${p?.args.join(" ")}`)}\``);}if(u.size>0){let p=resolveCommand(m,"install",[...u,"-D"]);f.push(`Install dev dependencies \`${P.cyan(`${p?.command} ${p?.args.join(" ")}`)}\``);}}f=f.map((p,$)=>`${$+1}. ${p}`),g||f.push(""),f.push("Import and use the blocks!");let l=nt(f);process.stdout.write(l);}};var Fr=t=>{let e=fileURLToPath(import.meta.url);return H.join(e,"../..",t)},{version:_r,name:Wr,description:Mr,repository:An}=JSON.parse(Ce.readFileSync(Fr("package.json"),"utf-8")),Y={package:{name:Wr,description:Mr,version:_r,repository:An},resolveRelativeToRoot:Fr};console.clear();program.name(Wr).description(Mr).version(_r).addCommand(Wt).addCommand(Jt).addCommand(Kt).addCommand(Xt).addCommand(Gt).addCommand(Qt).addCommand(Ht);program.parse();export{Y as context};
56
+ `}});if(process.stdout.write(Fe),U.length>1||N===""){let Ke=await confirm({message:"Accept changes?",initialValue:!0});isCancel(Ke)&&(cancel("Canceled!"),process.exit(0)),W=Ke;}}W&&await Ue([{loadingMessage:`Writing changes to ${P.cyan(w.destPath)}`,completedMessage:`Wrote changes to ${P.cyan(w.destPath)}.`,run:async()=>Ce.writeFileSync(w.destPath,A)}],{verbose:t.verbose?r:void 0});}if(n.includeTests&&g.tests){r("Trying to include tests");let{devDependencies:w}=JSON.parse(Ce.readFileSync(H.join(t.cwd,"package.json")).toString());(w===void 0||w.vitest===void 0)&&u.add("vitest");}for(let w of g.devDependencies)u.add(w);for(let w of g.dependencies)y.add(w);}await Ue(k,{verbose:t.verbose?r:void 0});let T=vt(y,u,{cwd:t.cwd});if(y=T.dependencies,u=T.devDependencies,y.size>0||u.size>0){let g=t.yes;if(!t.yes){let p=await confirm({message:"Would you like to install dependencies?",initialValue:!0});isCancel(p)&&(cancel("Canceled!"),process.exit(0)),g=p;}g&&(y.size>0&&(t.verbose||o.start(`Installing dependencies with ${P.cyan(m)}`),(await De({pm:m,deps:Array.from(y),dev:!1,cwd:t.cwd})).match(p=>{t.verbose||o.stop(`Installed ${P.cyan(p.join(", "))}`);},p=>{t.verbose||o.stop("Failed to install dependencies"),program.error(p);})),u.size>0&&(t.verbose||o.start(`Installing dependencies with ${P.cyan(m)}`),(await De({pm:m,deps:Array.from(u),dev:!0,cwd:t.cwd})).match(p=>{t.verbose||o.stop(`Installed ${P.cyan(p.join(", "))}`);},p=>{t.verbose||o.stop("Failed to install dev dependencies"),program.error(p);})));let f=[];if(!g){if(y.size>0){let p=resolveCommand(m,"install",[...y]);f.push(`Install dependencies \`${P.cyan(`${p?.command} ${p?.args.join(" ")}`)}\``);}if(u.size>0){let p=resolveCommand(m,"install",[...u,"-D"]);f.push(`Install dev dependencies \`${P.cyan(`${p?.command} ${p?.args.join(" ")}`)}\``);}}f=f.map((p,$)=>`${$+1}. ${p}`),g||f.push(""),f.push("Import and use the blocks!");let l=nt(f);process.stdout.write(l);}};var Fr=e=>{let t=fileURLToPath(import.meta.url);return H.join(t,"../..",e)},{version:_r,name:Wr,description:Mr,repository:Dn}=JSON.parse(Ce.readFileSync(Fr("package.json"),"utf-8")),Y={package:{name:Wr,description:Mr,version:_r,repository:Dn},resolveRelativeToRoot:Fr};console.clear();program.name(Wr).description(Mr).version(_r).addCommand(Wt).addCommand(Jt).addCommand(Kt).addCommand(Xt).addCommand(Gt).addCommand(Qt).addCommand(Ht);program.parse();export{Y as context};
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.16.2",
4
+ "version": "1.16.3",
5
5
  "license": "MIT",
6
6
  "homepage": "https://jsrepo.dev",
7
7
  "author": {