jsrepo 1.41.1 → 1.41.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {h,g,f,u,c,l,n,t,a,b,w,v,s,k}from'./chunk-J7BJNBQR.js';import {Command,program,Argument,Option}from'commander';import ie from'node:fs';import {outro,confirm,isCancel,cancel,multiselect,text,select,log,password,spinner,intro}from'@clack/prompts';import E from'chalk';import {resolveCommand}from'package-manager-detector/commands';import {detect}from'package-manager-detector/detect';import Y from'pathe';import*as $ from'valibot';import fn from'is-unicode-supported';import {builtinModules}from'node:module';import {Biome,Distribution}from'@biomejs/js-api';import*as vr from'css-dependency';import {walk}from'estree-walker';import {createPathsMatcher,getTsconfig}from'get-tsconfig';import*as Io from'parse5';import*as De from'prettier';import*as Eo from'svelte/compiler';import {Project,SyntaxKind}from'ts-morph';import es from'validate-npm-package-name';import*as qt from'vue/compiler-sfc';import un from'node:os';import {stripVTControlCharacters}from'node:util';import Yn from'escape-string-regexp';import {execa}from'execa';import {detect as detect$1,resolveCommand as resolveCommand$1,detectSync}from'package-manager-detector';import vo from'boxen';import {diffLines,diffChars}from'diff';import mo from'semver';import {cursor,erase}from'sisteransi';import bn from'@anthropic-ai/sdk';import Cn from'ollama';import Rn from'openai';import wn from'conf';import xr from'node-fetch';import zs from'ignore';var pt={name:"jsrepo",description:"A CLI to add shared code from remote repositories.",version:"1.41.
|
|
2
|
+
import {h,g,f,u,c,l,n,t,a,b,w,v,s,k}from'./chunk-J7BJNBQR.js';import {Command,program,Argument,Option}from'commander';import ie from'node:fs';import {outro,confirm,isCancel,cancel,multiselect,text,select,log,password,spinner,intro}from'@clack/prompts';import E from'chalk';import {resolveCommand}from'package-manager-detector/commands';import {detect}from'package-manager-detector/detect';import Y from'pathe';import*as $ from'valibot';import fn from'is-unicode-supported';import {builtinModules}from'node:module';import {Biome,Distribution}from'@biomejs/js-api';import*as vr from'css-dependency';import {walk}from'estree-walker';import {createPathsMatcher,getTsconfig}from'get-tsconfig';import*as Io from'parse5';import*as De from'prettier';import*as Eo from'svelte/compiler';import {Project,SyntaxKind}from'ts-morph';import es from'validate-npm-package-name';import*as qt from'vue/compiler-sfc';import un from'node:os';import {stripVTControlCharacters}from'node:util';import Yn from'escape-string-regexp';import {execa}from'execa';import {detect as detect$1,resolveCommand as resolveCommand$1,detectSync}from'package-manager-detector';import vo from'boxen';import {diffLines,diffChars}from'diff';import mo from'semver';import {cursor,erase}from'sisteransi';import bn from'@anthropic-ai/sdk';import Cn from'ollama';import Rn from'openai';import wn from'conf';import xr from'node-fetch';import zs from'ignore';var pt={name:"jsrepo",description:"A CLI to add shared code from remote repositories.",version:"1.41.2"};var mn=fn(),se=(e,t)=>mn?e:t,qr=se("\u25C6","*"),Yr=se("\u25C6","*"),Qr=se("\u25A0","x"),O=E.gray(se("\u2502","|")),Ct=E.gray(se("\u2500","-")),Xr=E.gray(se("\u2510","+")),Zr=E.gray(se("\u2518","+")),Rt=E.gray(se("\u251C","+")),eo=E.gray(se("\u252C","+"));E.gray(se("\u250C","T"));var to=E.gray(se("\u2514","-")),we=E.bgRgb(245,149,66).black(" WARN "),Pe=E.bgBlueBright.white(" INFO "),St=E.bgRedBright.white(" ERROR "),Ie=E.hex("#f7df1e")("jsrepo");var ro=(e,t)=>{let r=[];for(let[o,n]of e)r.push(t(o,n));return r},oo=(e,t)=>{let r=0;for(let o of e)r=r+t(o);return r};var jt=(e,t,r=" ")=>{if(stripVTControlCharacters(e).length>t)throw new Error("String length is greater than the length provided.");return r.repeat(t-stripVTControlCharacters(e).length)+e};var gn=/\n|\r\n/g,Z=e=>e.split(gn),ee=(e,{lineNumbers:t=false,prefix:r}={})=>{let o=e;if(t){let n=e.length.toString().length+1;o=o.map((s,i)=>`${jt(`${i+1}`,n)} ${s}`);}return r!==void 0&&(o=o.map((n,s)=>`${r(s,e.length)}${n}`)),o.join(un.EOL)};var hn={"no-workspace":"--no-workspace","install-as-dev-dependency":"-D"},yn={"install-as-dev-dependency":"-D"},vn={"no-workspace":"--workspaces=false","install-as-dev-dependency":"-D"},io={"no-workspace":"--ignore-workspace","install-as-dev-dependency":"-D"},ao={"no-workspace":"--focus","install-as-dev-dependency":"-D"},ar={bun:hn,npm:vn,pnpm:io,deno:yn,yarn:ao,"yarn@berry":ao,"pnpm@6":io};var Ce=()=>new wn({projectName:"jsrepo"});var Ge=class{#e;constructor(t){this.#e=t??Ce();}getKey(t){return `${t}-token`.toLowerCase()}get(t){let r=this.getKey(t);return this.#e.get(r,void 0)}set(t,r){let o=this.getKey(t);this.#e.set(o,r);}delete(t){let r=this.getKey(t);this.#e.delete(r);}};var lr={"Claude 3.7 Sonnet":{updateFile:async({originalFile:e,newFile:t,loading:r,verbose:o,additionalInstructions:n,messages:s})=>{let i=await cr("Anthropic");o||r.start("Asking Claude 3.7 Sonnet");let a=Mt({originalFile:e,newFile:t,additionalInstructions:n,rePrompt:s!==void 0&&s.length>0});o?.(`Prompting Claude 3.7 Sonnet with:
|
|
3
3
|
${JSON.stringify(a,null," ")}`);let c=await Sn({model:"claude-3-7-sonnet-latest",prompt:a,apiKey:i,messages:s,maxTokens:(e.content.length+t.content.length)*2});return o||r.stop("Claude 3.7 Sonnet updated the file"),c?{content:Vt(c),prompt:a.message}:{content:t.content,prompt:a.message}}},"ChatGPT 4o":{updateFile:async({originalFile:e,newFile:t,loading:r,verbose:o,additionalInstructions:n,messages:s})=>{let i=await cr("OpenAI");o||r.start("Asking ChatGPT 4o");let a=Mt({originalFile:e,newFile:t,additionalInstructions:n,rePrompt:s!==void 0&&s.length>0});o?.(`Prompting ChatGPT 4o with:
|
|
4
4
|
${JSON.stringify(a,null," ")}`);let c=await co({model:"gpt-4o",prompt:a,apiKey:i,messages:s,maxTokens:(e.content.length+t.content.length)*2});return o||r.stop("ChatGPT 4o updated the file"),c?{content:Vt(c),prompt:a.message}:{content:t.content,prompt:a.message}}},"ChatGPT 4o-mini":{updateFile:async({originalFile:e,newFile:t,loading:r,verbose:o,additionalInstructions:n,messages:s})=>{let i=await cr("OpenAI");o||r.start("Asking ChatGPT 4o-mini");let a=Mt({originalFile:e,newFile:t,additionalInstructions:n,rePrompt:s!==void 0&&s.length>0});o?.(`Prompting ChatGPT 4o with:
|
|
5
5
|
${JSON.stringify(a,null," ")}`);let c=await co({model:"gpt-4o-mini",prompt:a,apiKey:i,messages:s,maxTokens:(e.content.length+t.content.length)*2});return o||r.stop("ChatGPT 4o-mini updated the file"),c?{content:Vt(c),prompt:a.message}:{content:t.content,prompt:a.message}}},Phi4:{updateFile:async({originalFile:e,newFile:t,loading:r,verbose:o,additionalInstructions:n,messages:s})=>{o||r.start("Asking Phi4");let i=Mt({originalFile:e,newFile:t,additionalInstructions:n,rePrompt:s!==void 0&&s.length>0});o?.(`Prompting Phi4 with:
|
|
@@ -69,7 +69,7 @@ ${ee(Z(e),{prefix:()=>" "})}
|
|
|
69
69
|
-->`,format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await De.format(e,{parser:"vue",...r}):e},ls={matches:e=>e.endsWith(".yml")||e.endsWith(".yaml"),resolveDependencies:()=>a({dependencies:[],local:[],devDependencies:[],imports:{}}),comment:e=>ee(Z(e),{prefix:()=>"# "}),format:async(e,{formatter:t,prettierOptions:r})=>t&&t==="prettier"?await De.format(e,{parser:"yaml",...r}):e},gt=e=>`${ee(Z(e),{prefix:t=>t===0?`${O} ${St} `:`${O} `})}`,ht=({moduleSpecifiers:e,isSubDir:t,filePath:r,containingDir:o,doNotInstall:n,dirs:s,cwd:i})=>{let a$1=[],c=new Set,l=new Set,d={};for(let u of e){if(u.startsWith(".")){let g=Do(u,t,{filePath:r,containingDir:o,dirs:s,cwd:i});if(g.isErr()){a$1.push(g.unwrapErr());continue}let p=g.unwrap();p&&(l.add(p.dependency),d[u]=p.template);continue}let y=ds(u,t,{filePath:r,containingDir:o,dirs:s,cwd:i});if(y.isErr()){a$1.push(y.unwrapErr());continue}let f=y.unwrap();f?(l.add(f.dependency),d[u]=f.template):c.add(u);}if(a$1.length>0)return b(a$1);let{devDependencies:m,dependencies:h}=ms(Array.from(c),r,{doNotInstall:n||[]});return a({dependencies:h,devDependencies:m,local:Array.from(l),imports:d})},Do=(e,t,{filePath:r,containingDir:o,dropExtension:n=true,alias:s,dirs:i,cwd:a$1})=>{if(t&&(e.startsWith("./")||e==="."))return a(void 0);let c=t?Y.join(o,"../"):Y.join(r,"../"),l=Y.join(Y.join(r,"../"),e),d=Y.join(c,"../");if(o&&l.startsWith(o))return a(void 0);if(l.startsWith(d))return a(Po(l.slice(d.length),n));for(let m of i){let h=Y.resolve(Y.join(a$1,m)),u=Y.resolve(l);if(u.startsWith(h))return a(Po(u.slice(h.length+1),n))}return b(`${r}:
|
|
70
70
|
${s||e} references code not contained in ${E.bold(i.join(", "))} and cannot be resolved.`)},Po=(e,t=true)=>{let[r,o,...n]=e.split("/");o===void 0&&(o="index");let s=o;t&&s.includes(".")&&(s=s.slice(0,s.length-Y.parse(s).ext.length));let i=`${r}/${s}`,a=`{{${i}}}`;return n.length===0?s.length!==o.length&&(a+=Y.parse(o).ext):a+=`/${n.join("/")}`,{dependency:i,template:a}},ds=(e,t,{filePath:r,dirs:o,cwd:n,containingDir:s})=>{let i=ut(r);if(i.isErr())return b(i.unwrapErr());let a$1=i.unwrap();if(a$1===null)return a(void 0);let c=createPathsMatcher(a$1);if(c){let l=c(e);for(let d of l){let m=fs(d);if(!m)continue;let h=Y.relative(Y.resolve(Y.join(r,"../")),m.prettyPath),u=ps(m.prettyPath,m.path,[".js",".ts"]),y=Do(h,t,{filePath:r,containingDir:s,alias:e,dropExtension:u,dirs:o,cwd:n,modIsFile:m.type==="file"});if(y.isErr())return b(y.unwrapErr());if(y.unwrap())return a(y.unwrap());break}}return a(void 0)},ps=(e,t,r=[".ts",".js",""])=>{if(e===t)return true;let o=Y.parse(e),n=Y.parse(t),s=Y.join(o.dir,o.name),i=Y.join(n.dir,n.name);return s!==i?false:!!(r.includes(o.ext)&&r.includes(n.ext))},fs=e=>{if(ie.existsSync(e))return {path:e,prettyPath:e,type:ie.statSync(e).isDirectory()?"directory":"file"};let t=Y.join(e,"../");if(!ie.existsSync(t))return;let r=Y.parse(e);if(r.ext===".js"){let n=`${e.slice(0,e.length-3)}.ts`;if(ie.existsSync(n))return {path:n,prettyPath:e,type:"file"}}let o=ie.readdirSync(t);for(let n of o){let s=Y.parse(n);if(s.name===r.base){let i=Y.join(t,n),a=i.slice(0,i.length-s.ext.length);return {path:i,prettyPath:a,type:ie.statSync(i).isDirectory()?"directory":"file"}}}},ms=(e,t,{doNotInstall:r}={doNotInstall:[]})=>{let o=new Set(r),n=e.filter(c=>!builtinModules.includes(c)&&!c.startsWith("node:")),s=fr(Y.dirname(t),""),i=new Set,a=new Set;if(s){let{devDependencies:c,dependencies:l}=JSON.parse(ie.readFileSync(s,"utf-8"));for(let d of n){let m=Ue(d);if(m.isErr()){console.warn(`${O} ${we} Skipped adding import \`${E.cyan(d)}\`. Reason: Couldn't parse package name`);continue}let h=m.unwrap();if(!es(h.name).validForNewPackages){console.warn(`${O} ${we} Skipped adding import \`${E.cyan(d)}\`. Reason: Not a valid package name`);continue}if(o.has(h.name))continue;let u;if(l!==void 0&&(u=l[h.name]),u!==void 0){i.add(`${h.name}@${u}`);continue}if(c!==void 0&&(u=c[h.name]),u!==void 0){a.add(`${h.name}@${u}`);continue}i.add(h.name);}}return {dependencies:Array.from(i),devDependencies:Array.from(a)}},rt=[ts,rs,wr,os,ns,ss,is,as,cs,ls];var To=new Set(["svelte","@sveltejs/kit","vue","nuxt","react","react-dom","next","@remix-run/react","@angular/core","@angular/common","@angular/forms","@angular/platform-browser","@angular/platform-browser-dynamic","@angular/router","@builder.io/qwik","astro","solid-js"]),No=$.union([$.literal("off"),$.literal("warn"),$.literal("error")]),gs=$.union([$.literal("no-category-index-file-dependency"),$.literal("no-unpinned-dependency"),$.literal("require-local-dependency-exists"),$.literal("max-local-dependencies"),$.literal("no-circular-dependency"),$.literal("no-unused-block"),$.literal("no-framework-dependency"),$.literal("require-config-file-exists"),$.literal("no-config-file-framework-dependency"),$.literal("no-config-file-unpinned-dependency")]),Ao={"no-unpinned-dependency":{description:"Require all dependencies to have a pinned version.",scope:"block",check:e=>{let t=[];for(let r of [...e.dependencies,...e.devDependencies])r.includes("@")||t.push(`Couldn't find a version to use for ${E.bold(r)}`);return t.length>0?t:void 0}},"require-local-dependency-exists":{description:"Require all local dependencies to exist.",scope:"block",check:(e,{manifest:t})=>{let r=[];for(let o of e.localDependencies){let[n,s]=o.split("/"),i=t.categories.find(c=>c.name.trim()===n.trim()),a=`${E.bold(`${e.category}/${e.name}`)} depends on local dependency ${E.bold(o)} which doesn't exist`;if(!i){r.push(a);continue}i.blocks.find(c=>c.name===s)===void 0&&r.push(a);}return r.length>0?r:void 0}},"no-category-index-file-dependency":{description:"Disallow depending on the index file of a category.",scope:"block",check:(e,{manifest:t})=>{let r=[];for(let o of e.localDependencies){let[n,s]=o.split("/");if(s!=="index")continue;let i=t.categories.find(c=>c.name===n);!i||!i.blocks.find(c=>c.name===s)||r.push(`${E.bold(`${e.category}/${e.name}`)} depends on ${E.bold(`${n}/${s}`)}`);}return r.length>0?r:void 0}},"max-local-dependencies":{description:"Enforces a limit on the amount of local dependencies a block can have.",scope:"block",check:(e,{options:t})=>{let r=[],o;return typeof t[0]!="number"?o=5:o=t[0],e.localDependencies.length>o&&r.push(`${E.bold(`${e.category}/${e.name}`)} has too many local dependencies (${E.bold(e.localDependencies.length)}) limit (${E.bold(o)})`),r.length>0?r:void 0}},"no-circular-dependency":{description:"Disallow circular dependencies.",scope:"block",check:(e,{manifest:t})=>{let r=[],o=`${e.category}/${e.name}`,n=Yt(o,e,t.categories);return n&&r.push(`There is a circular dependency in ${E.bold(o)}: ${E.bold(n.join(" -> "))}`),r.length>0?r:void 0}},"no-unused-block":{description:"Disallow unused blocks. (Not listed and not a dependency of another block)",scope:"block",check:(e,{manifest:t})=>{if(e.list)return;let r=`${e.category}/${e.name}`,o=t.categories.flatMap(n=>n.blocks).filter(n=>n.list);for(let n of o)if(Yt(r,n,t.categories))return;return [`${E.bold(r)} is unused and will be ${E.bold.red("removed")}`]}},"no-framework-dependency":{description:"Disallow frameworks (Svelte, Vue, React) as dependencies.",scope:"block",check:e=>{let t=[],r=[...e.devDependencies,...e.dependencies].map(o=>Ue(o).unwrap().name).filter(o=>To.has(o));if(r.length>0)for(let o of r)t.push(`${E.bold(`${e.category}/${e.name}`)} depends on ${E.bold(o)} causing it to be installed when added`);return t.length>0?t:void 0}},"require-config-file-exists":{description:"Require all of the paths listed in `configFiles` to exist.",scope:"global",check:({manifest:e,cwd:t})=>{let r=[];if(e.configFiles!==void 0){for(let o of e.configFiles)ie.existsSync(Y.join(t,o.path))||r.push(`The ${E.bold(o.name)} config file doesn't exist at ${E.bold(Y.join(t,o.path))}`);return r.length>0?r:void 0}}},"no-config-file-framework-dependency":{description:"Disallow frameworks (Svelte, Vue, React) as dependencies of config files.",scope:"global",check:({manifest:e})=>{let t=[];if(e.configFiles!==void 0){for(let r of e.configFiles){let o=[...r.devDependencies??[],...r.dependencies??[]].map(n=>Ue(n).unwrap().name).filter(n=>To.has(n));if(o.length>0)for(let n of o)t.push(`${E.bold(r.name)} depends on ${E.bold(n)} causing it to be installed when added`);}return t.length>0?t:void 0}}},"no-config-file-unpinned-dependency":{description:"Require all dependencies of config files to have a pinned version.",scope:"global",check:({manifest:e})=>{let t=[];if(e.configFiles){for(let r of e.configFiles)for(let o of [...r.dependencies??[],...r.devDependencies??[]])o.includes("@")||t.push(`Couldn't find a version to use for ${E.bold(o)}`);return t.length>0?t:void 0}}}},Fo=$.record(gs,$.union([No,$.tupleWithRest([No,$.union([$.string(),$.number()])],$.union([$.string(),$.number()]))])),br={"no-category-index-file-dependency":"warn","no-unpinned-dependency":"warn","require-local-dependency-exists":"error","max-local-dependencies":["warn",10],"no-circular-dependency":"error","no-unused-block":"warn","no-framework-dependency":"warn","require-config-file-exists":"error","no-config-file-framework-dependency":"warn","no-config-file-unpinned-dependency":"warn"},Lo=(e,t,r,o=br)=>{let n=[],s=[];for(let[i,a]of Object.entries(Ao)){if(a.scope==="block")continue;let c=o[i],l,d=[];if(Array.isArray(c)?(l=c[0],d.push(...c.slice(1))):l=c,l==="off")continue;let m=a.check({manifest:e,options:d,cwd:r,config:t});if(m){if(l==="error"){s.push(...m.map(h=>`${O} ${St} ${E.red(h)} ${E.gray(i)}`));continue}n.push(...m.map(h=>`${O} ${we} ${h} ${E.gray(i)}`));}}for(let i of e.categories)for(let a of i.blocks)for(let[c,l]of Object.entries(Ao)){if(l.scope==="global")continue;let d=o[c],m,h=[];if(Array.isArray(d)?(m=d[0],h.push(...d.slice(1))):m=d,m==="off")continue;let u=l.check(a,{manifest:e,options:h,cwd:r,config:t});if(u){if(m==="error"){s.push(...u.map(y=>`${O} ${St} ${E.red(y)} ${E.gray(c)}`));continue}n.push(...u.map(y=>`${O} ${we} ${y} ${E.gray(c)}`));}}return {warnings:n,errors:s}},Yt=(e,t,r,o=[])=>{let n=[...o,`${t.category}/${t.name}`];for(let s of t.localDependencies){if(s===e)return n;if(o.includes(s))return;let[i,a]=s.split("/"),c=r.find(d=>d.name===i)?.blocks.find(d=>d.name===a);if(!c)continue;let l=Yt(e,c,r,n);if(l)return [...l,e]}},Bo=(e,t)=>{for(let r of t)for(let o of r.blocks){if(!o.list)continue;if(Yt(e,o,t))return true}return false};var Wo=[".test.ts","_test.ts",".test.js","_test.js",".spec.ts","_spec.ts",".spec.js","_spec.js",".stories.jsx","_stories.jsx",".stories.tsx","_stories.tsx"],ze=e=>Wo.find(t=>e.endsWith(t))!==void 0,Jo=(e,{cwd:t,ignore:r,config:o})=>{let n;try{n=ie.readdirSync(e);}catch{program.error(E.red(`Couldn't read the ${E.bold(e)} directory.`));}let s=[];for(let i of n){let a=Y.join(e,i);if(ie.statSync(a).isFile())continue;let c=`${Y.relative(t,a)}/`;if(r.ignores(c))continue;let l=Y.basename(i);if(!ys(l,o))continue;let d=hs(l,o),m={name:l,blocks:[]},h=ie.readdirSync(a);for(let u of h){let y=Y.join(a,u);if(ie.statSync(y).isFile()){if(ze(u))continue;let f=vs(u),g=_o(f,o);if(!Mo(f,o))continue;let p=rt.find(I=>I.matches(u));if(!p){console.warn(`${O} ${we} Skipped \`${E.bold(y)}\` \`*${E.bold(Y.parse(u).ext)}\` files are not currently supported!`);continue}let P=h.find(I=>Wo.find(U=>I===`${f}${U}`)),{dependencies:x,devDependencies:v,local:k,imports:C}=p.resolveDependencies({filePath:y,isSubDir:false,excludeDeps:o.excludeDeps,dirs:o.dirs,cwd:t}).match(I=>I,I=>{program.error(E.red(I));}),R={name:f,directory:Y.relative(t,a),category:l,tests:P!==void 0,subdirectory:false,list:d?g:false,files:[u],localDependencies:k,_imports_:C,dependencies:x,devDependencies:v};P!==void 0&&R.files.push(P),m.blocks.push(R);}else {let f=u,g=_o(f,o);if(!Mo(f,o))continue;let p=new Set,P=new Set,x=new Set,v={},k=false,C=[],R=(U,K)=>{for(let H of K){let b=Y.join(U,H),T=b.slice(y.length+1);if(ze(H)){k=true,C.push(T);continue}if(ie.statSync(b).isDirectory()){if(!o.allowSubdirectories){console.warn(`${O} ${we} Skipped \`${E.bold(Y.join(y,H))}\` subdirectories are not allowed! Allow them with ${E.bold("--allow-subdirectories")}!`);continue}let F=ie.readdirSync(b);R(b,F);continue}let w=rt.find(F=>F.matches(H));if(!w){console.warn(`${O} ${we} Skipped \`${b}\` \`*${E.bold(Y.parse(H).ext)}\` files are not currently supported!`);continue}let{local:V,dependencies:N,devDependencies:W,imports:A}=w.resolveDependencies({isSubDir:true,excludeDeps:o.excludeDeps,dirs:o.dirs,containingDir:y,filePath:b,cwd:t}).match(F=>F,F=>{program.error(E.red(F));});for(let F of V)F!==`${l}/${f}`&&p.add(F);for(let F of N)P.add(F);for(let F of W)x.add(F);for(let[F,je]of Object.entries(A))v[F]=je;C.push(T);}};R(y,ie.readdirSync(y));let I={name:f,directory:Y.relative(t,y),category:l,tests:k,subdirectory:true,list:d?g:false,files:C,localDependencies:Array.from(p.keys()),dependencies:Array.from(P.keys()),devDependencies:Array.from(x.keys()),_imports_:v};m.blocks.push(I);}}s.push(m);}return s},Go=(e,{cwd:t})=>{if(!e.configFiles)return;let r=[];for(let o of e.configFiles){let n=rt.find(c=>c.matches(o.path));if(!n){r.push(o);continue}let{dependencies:s,devDependencies:i,local:a}=n.resolveDependencies({filePath:Y.join(t,o.path),isSubDir:false,excludeDeps:e.excludeDeps,dirs:e.dirs,cwd:t}).match(c=>c,c=>{program.error(E.red(c));});a.length>0&&program.error(E.red(`${E.bold(o.name)} ${E.bold(o.path)} Config files cannot have local dependencies!`)),r.push({...o,dependencies:s,devDependencies:i});}return r},_o=(e,t)=>t.doNotListBlocks.length>0&&t.doNotListBlocks.includes(e)?false:t.listBlocks.length>0?t.listBlocks.includes(e):true,Mo=(e,t)=>t.excludeBlocks.length>0&&t.excludeBlocks.includes(e)?false:t.includeBlocks.length>0?t.includeBlocks.includes(e):true,hs=(e,t)=>t.doNotListCategories.length>0&&t.doNotListCategories.includes(e)?false:t.listCategories.length>0?t.listCategories.includes(e):true,ys=(e,t)=>t.excludeCategories.length>0&&t.excludeCategories.includes(e)?false:t.includeCategories.length>0?t.includeCategories.includes(e):true,vs=e=>Y.parse(Y.basename(e)).name,Uo=e=>{let t=[];for(let o of e){let n=[];for(let s of o.blocks){let i=`${s.category}/${s.name}`;!s.list&&!Bo(i,e)||n.push(s);}n.length>0&&t.push({name:o.name,blocks:n});}return [t,0]};var nt="jsrepo.json",He="jsrepo-build-config.json",kr=$.union([$.literal("prettier"),$.literal("biome")]),bs=$.objectWithRest({"*":$.string()},$.string()),$r=$.object({$schema:$.string(),repos:$.optional($.array($.string()),[]),includeTests:$.boolean(),paths:bs,configFiles:$.optional($.record($.string(),$.string())),watermark:$.optional($.boolean(),true),formatter:$.optional(kr)}),Te=e=>{if(!ie.existsSync(Y.join(e,nt)))return b("Could not find your configuration file! Please run `init`.");let t=$.safeParse($r,JSON.parse(ie.readFileSync(Y.join(e,nt)).toString()));return t.success?a(t.output):b(`There was an error reading your \`${nt}\` file!`)},ks=$.object({$schema:$.string(),meta:$.optional(f),peerDependencies:$.optional(g),configFiles:$.optional($.array(h)),dirs:$.array($.string()),outputDir:$.optional($.string()),includeBlocks:$.optional($.array($.string()),[]),includeCategories:$.optional($.array($.string()),[]),excludeBlocks:$.optional($.array($.string()),[]),excludeCategories:$.optional($.array($.string()),[]),doNotListBlocks:$.optional($.array($.string()),[]),doNotListCategories:$.optional($.array($.string()),[]),listBlocks:$.optional($.array($.string()),[]),listCategories:$.optional($.array($.string()),[]),excludeDeps:$.optional($.array($.string()),[]),allowSubdirectories:$.optional($.boolean()),preview:$.optional($.boolean()),rules:$.optional(Fo)}),Zt=e=>{if(!ie.existsSync(Y.join(e,He)))return a(null);let t=$.safeParse(ks,JSON.parse(ie.readFileSync(Y.join(e,He)).toString()));return t.success?a(t.output):b(`There was an error reading your \`${He}\` file!`)},Ne=(e,t)=>{let r=ut(t).unwrapOr(null),o=r?createPathsMatcher(r):null,n={"*":""};for(let[s,i]of Object.entries(e)){if(i.startsWith("./")){n[s]=Y.relative(t,Y.join(Y.resolve(t),i));continue}if(o===null)return b(`Cannot resolve ${E.bold(`\`"${s}": "${i}"\``)} from paths because we couldn't find a tsconfig! If you intended to use a relative path ensure that your path starts with ${E.bold("`./`")}.`);let a=$s(i,o,t);if(!a)return b(`Cannot resolve ${E.bold(`\`"${s}": "${i}"\``)} from paths because we couldn't find a matching alias in the tsconfig. If you intended to use a relative path ensure that your path starts with ${E.bold("`./`")}.`);n[s]=a;}return a(n)},$s=(e,t,r)=>{let o=t(e);return o.length>0?Y.relative(r,o[0]):void 0},Dt=(e,t,r)=>{let o;return t[e.category]!==void 0?o=Y.join(r,t[e.category]):o=Y.join(r,t["*"],e.category),o};var qe=async(e,t,{verbose:r}={})=>await v(e,t,{verbose:r,fetch:xr,token:Cr(e.provider)}),er=async(e,{verbose:t}={})=>await w(e,{verbose:t,fetch:xr,token:Cr(e.provider)}),Cr=e=>{if(e.name==="http")return;let t=Ce().get(`${e.name}-token`);if(t)return t},Ot=async(e,{noCache:t$1=false}={})=>{let r=u(e);if(r){let o=Ce();if(r.name!==s.name&&!t$1){let s=o.get(`${e}-state`);if(s)return a({...s,provider:r})}let n=await r.state(e,{token:Cr(r),fetch:xr});return r.name!==s.name&&!t$1&&o.set(`${e}-state`,n),a(n)}return b(`Only ${t.map((o,n)=>`${n===t.length-1?"and ":""}${E.bold(o.name)}`).join(", ")} registries are supported at this time!`)},Ye=async(e,{noCache:t=false}={})=>{let r=[],n=(await Promise.all(e.map(async s=>{let i=await Ot(s,{noCache:t});if(i.isErr())return b({message:i.unwrapErr(),repo:s});let a=i.unwrap();r.push(a);}))).find(s=>s!==void 0);return n||a(r)},Tt=async(...e)=>{let t=new Map,o=(await Promise.all(e.map(async n=>{let s=await er(n);if(s.isErr())return b({message:s.unwrapErr(),repo:n.url});let i=s.unwrap();for(let a of i.categories)for(let c$1 of a.blocks)t.set(c(n.url,`${c$1.category}/${c$1.name}`),{...c$1,sourceRepo:n});}))).find(n=>n!==void 0);return o||a(t)},tr=e=>{let t=new Map;for(let r of e)for(let o of r.manifest.categories)for(let n of o.blocks)t.set(c(r.state.url,`${n.category}/${n.name}`),{...n,sourceRepo:r.state});return t},rr=async(...e)=>{let t=[],o=(await Promise.all(e.map(async n=>{let s=await er(n);if(s.isErr())return b({message:s.unwrapErr(),repo:n.url});let i=s.unwrap();t.push({state:n,manifest:i});}))).find(n=>n!==void 0);return o||a(t)};var st=async(e,t,r,o=new Map)=>{let n=new Map;for(let s of e){let i,a=u(s);if(a){let{url:l,specifier:d}=a.parse(s,{fullyQualified:true});i=t.get(c(l,d));}else {if(r.length===0)return b(E.red(`If your config doesn't contain repos then you must provide the repo in the block specifier ex: \`${E.bold(`github/ieedan/std/${s}`)}\`!`));for(let l of r){let{url:d,specifier:m}=l.provider.parse(c(l.url,s),{fullyQualified:true}),h=t.get(c(d,m));if(h!==void 0){i=h;break}}}if(!i)return b(`Invalid block! ${E.bold(s)} does not exist!`);let c$1=`${i.category}/${i.name}`;if(n.set(c$1,i),i.localDependencies&&i.localDependencies.length>0){let l=await st(i.localDependencies.filter(d=>!n.has(d)&&!o.has(d)),t,r,n);if(l.isErr())return b(l.unwrapErr());for(let d of l.unwrap())n.set(`${d.category}/${d.name}`,d);}}return a(ro(n,(s,i)=>i))},it=(e,t,r)=>{let o=[],n=Ne(t.paths,r).match(s=>s,s=>program.error(E.red(s)));for(let[s,i]of e){let a=Dt(i,n,r),c=Y.join(a,i.files[0]);i.subdirectory&&(c=Y.join(a,i.name)),ie.existsSync(c)&&o.push({specifier:`${i.category}/${i.name}`,path:c,block:i});}return o},nr=(e,t)=>{let r=[];for(let o of e){let n=o.files.filter(i=>ze(i)?t.includeTests:true),s=Promise.all(n.map(async i=>{let a=await qe(o.sourceRepo,Y.join(o.directory,i));return {name:i,content:a}}));r.push({block:o,files:s});}return r},At=(e,t,r,o)=>{let n=Dt(t,r,o);return t.subdirectory?Y.join(n,t.name,e):Y.join(n,e)};var Ko=e=>new Promise(t=>t(e));var at=async({formatter:e,cwd:t})=>{let r=null;e==="prettier"&&(r=await De.resolveConfig(Y.join(t,".prettierrc")));let o=null;if(e==="biome"){let n=Y.join(t,"biome.json");ie.existsSync(n)&&(o=JSON.parse(ie.readFileSync(n).toString()));}return {biomeOptions:o,prettierOptions:r}};var Ft=e=>`jsrepo ${Re.version}
|
|
71
71
|
Installed from ${e}
|
|
72
|
-
${new Date().toLocaleDateString().replaceAll("/","-")}`;var wt=(e,t,r)=>{let o=mr(Y.join(r,"package.json")).match(i=>i,i=>{i.endsWith("doesn't exist")&&program.error(`Couldn't find your ${E.bold("package.json")}. Please create one.`),program.error(E.red(i));})
|
|
72
|
+
${new Date().toLocaleDateString().replaceAll("/","-")}`;var wt=(e,t,r)=>{if(!t.peerDependencies)return;let o=mr(Y.join(r,"package.json")).match(i=>i,i=>{i.endsWith("doesn't exist")&&program.error(`Couldn't find your ${E.bold("package.json")}. Please create one.`),program.error(E.red(i));}),n={...o.dependencies,...o.devDependencies},s=[];for(let[i,a]of Object.entries(t.peerDependencies)){let c,l;typeof a=="string"?c=a:(c=a.version,l=a.message);let d=n[i];if(!d){s.push({name:i,expected:c,message:l,version:d,exists:false});continue}mo.satisfies(Wt(d),c)||s.push({name:i,expected:c,message:l,version:d,exists:true});}if(s.length>0){process.stdout.write(`${O}
|
|
73
73
|
${E.yellow("\u25B2")} ${eo} Issues with ${E.bold(e.url)} peer dependencies
|
|
74
74
|
`);let i=s.map((a,c)=>{let l=s.length-1===c,d;a.exists?d=`${E.yellowBright("x unmet peer")} need ${E.bold(`${a.name}@`)}${E.greenBright.bold(a.expected)} >> found ${E.yellowBright.bold(a.version)}`:d=`${E.red("x missing peer")} need ${E.bold(`${a.name}@`)}${E.greenBright.bold(a.expected)}`;let m=`${O} ${l?to:Rt}${Ct} ${d}`;return a.message?`${m}
|
|
75
75
|
${O} ${l?"":O} ${E.gray(a.message)}`:m}).join(`
|