@omfalos/mokosh 0.4.0 → 0.4.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/cli.js +36 -32
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +34 -30
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.mts +39 -8
- package/dist/index.d.ts +39 -8
- package/dist/index.js +24 -20
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +24 -20
- package/dist/index.mjs.map +1 -1
- package/dist/mcp.js +26 -21
- package/dist/mcp.js.map +1 -1
- package/dist/mcp.mjs +27 -22
- package/dist/mcp.mjs.map +1 -1
- package/package.json +1 -1
package/dist/mcp.js
CHANGED
|
@@ -1,36 +1,41 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
"use strict";var
|
|
3
|
-
`)}};var
|
|
4
|
-
`).filter(c=>c.trim().length>0&&!c.trim().startsWith("#"));if(n.length<2)continue;let s=n[0];if(!s||s.startsWith(" "))continue;let o=
|
|
5
|
-
`,o),a=i===-1?r.length:i;r=
|
|
6
|
-
`&&o++;i=a.index;let c=a[0],l=c;
|
|
7
|
-
`&&o++;i=a.index+c.length,a=
|
|
2
|
+
"use strict";var To=Object.create;var Ie=Object.defineProperty;var Eo=Object.getOwnPropertyDescriptor;var Ao=Object.getOwnPropertyNames;var Po=Object.getPrototypeOf,No=Object.prototype.hasOwnProperty;var Io=(t,e)=>{for(var r in e)Ie(t,r,{get:e[r],enumerable:!0})},jr=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Ao(e))!No.call(t,s)&&s!==r&&Ie(t,s,{get:()=>e[s],enumerable:!(n=Eo(e,s))||n.enumerable});return t};var d=(t,e,r)=>(r=t!=null?To(Po(t)):{},jr(e||!t||!t.__esModule?Ie(r,"default",{value:t,enumerable:!0}):r,t)),Do=t=>jr(Ie({},"__esModule",{value:!0}),t);var gl={};Io(gl,{createMcpServer:()=>yt});module.exports=Do(gl);var Fo=require("@modelcontextprotocol/sdk/server/stdio.js");var wo=require("@modelcontextprotocol/sdk/server/index.js"),ht=require("@modelcontextprotocol/sdk/types.js");var ft=d(require("fs")),mt=d(require("path"));var Le=d(require("fs")),kt=d(require("path"));var Mo=[".config.","biome.json","tsconfig.json","package.json",".prettierrc",".eslintrc"],Wr=[];function De(t){Wr.push(t)}function zr(t){return[...Mo,...Wr].some(e=>typeof e=="string"?t.includes(e):e instanceof RegExp?e.test(t):e(t))}var Ro=[".test.",".spec.","-test.","-spec."],$r=[];function Me(t){$r.push(t)}function ce(){return[...Ro,...$r]}var Lo=["jest","vitest","playwright","cypress","@testing-library/"],Br=[];function Re(t){Br.push(t)}function xt(){return[...Lo,...Br]}var Ur=.8;function bt(t){Ur=t}function St(){return Ur}var Go=["mokosh.config.js","mokosh.config.cjs","mokosh.config.json"];function le(t,{allowJs:e=!0,isExplicitPath:r=!1}={}){if(r){let n=kt.default.resolve(t);return Le.default.existsSync(n)?n.endsWith(".json")?Kr(n):e?Hr(n):{}:{}}for(let n of Go){let s=kt.default.resolve(t,n);if(Le.default.existsSync(s)){if(n.endsWith(".json"))return Kr(s);if(e)return Hr(s)}}return{}}function Kr(t){return JSON.parse(Le.default.readFileSync(t,"utf-8"))}function Hr(t){let e=require(t);return e&&typeof e=="object"&&"default"in e&&(e=e.default),typeof e=="function"?e({}):e}function vt(t){for(let e of t.configMatchers??[])De(e);for(let e of t.testPatterns??[])Me(e);for(let e of t.testLibraries??[])Re(e);t.barrelThreshold!==void 0&&bt(t.barrelThreshold)}function Y(t){return{gitStats:t?.gitStats??!1,parallelParsing:t?.parallelParsing,pathAliases:t?.pathAliases}}var Ge="mokosh-cache",Ct="duplication-tokens.json",wt="graph.json",j=["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"],Ft=[".ts",".tsx",".js",".jsx",".mjs",".cjs",".css",".scss",".sass",".less",".styl",".coffee",".ls",".lua",".py",".go",".feature",".md",".mdx"];var Jr=d(require("fs")),Tt=d(require("path"));function Et(t,e){let r=Tt.default.resolve(t,e);try{let n=Jr.default.readFileSync(r,"utf-8"),s=JSON.parse(n),o=new Map;for(let[i,a]of Object.entries(s)){if(i==="total")continue;let c=a?.lines?.pct;if(typeof c!="number")continue;let l=Tt.default.relative(t,i);o.set(l,c)}return o}catch{return new Map}}var _e={serialize(t){let e=["graph TD"],r=new Set;for(let n of t.nodes.values()){let s=`"${n.path}"`;for(let o of n.imports){if(!o.toPath)continue;let i=`"${o.toPath}"`,a=`${n.path} -> ${o.toPath}`;if(!r.has(a)){let c=o.isStyle?"-- styles -->":"-->";e.push(` ${s} ${c} ${i}`),r.add(a)}}}return e.join(`
|
|
3
|
+
`)}};var At=d(require("fs")),Vr=d(require("path"));function Pt(t,e){let r=t.replace(/^\.\//,"");if(e.nodes.has(r))return r;let n=r.replace(/^dist\//,"src/").replace(/\.(js|mjs|cjs)$/,".ts");return e.nodes.has(n)?n:null}function Qr(t,e){if(typeof t=="string")return Pt(t,e);if(t&&typeof t=="object"){let r=t;for(let n of["import","require","default"]){let s=Qr(r[n],e);if(s)return s}}return null}function Oo(t){if(!t)return"unknown";let e=t.trimStart();return e.startsWith("interface ")?"interface":e.startsWith("class ")?"class":e.startsWith("enum ")?"enum":e.startsWith("type ")?"type":e.startsWith("namespace ")?"namespace":e.startsWith("const ")||e.startsWith("let ")||e.startsWith("var ")||e.startsWith("readonly ")?"const":e.startsWith("(")||e.startsWith("async ")||e.startsWith("function ")||e.includes("=>")?"function":"unknown"}function jo(t,e){let r=new Set,n=new Set,s=[...e];for(;s.length;){let o=s.shift();if(n.has(o))continue;n.add(o);let i=t.nodes.get(o);if(i){for(let a of i.exports)r.add(a.name);for(let a of i.imports){if(a.type!=="re-export"||a.isExternal||!a.toPath)continue;if(!a.symbols?.length||a.symbols.includes("*")){let l=t.nodes.get(a.toPath);if(l)for(let p of l.exports)r.add(p.name);s.push(a.toPath)}else for(let l of a.symbols)r.add(l)}}}return r}function Nt(t,e){let r=[],n=Vr.default.join(e,"package.json");if(At.default.existsSync(n))try{let s=JSON.parse(At.default.readFileSync(n,"utf8"));if(s.exports&&typeof s.exports=="object"&&!Array.isArray(s.exports))for(let o of Object.values(s.exports)){let i=Qr(o,t);i&&!r.includes(i)&&r.push(i)}else if(typeof s.exports=="string"){let o=Pt(s.exports,t);o&&r.push(o)}if(r.length===0)for(let o of[s.main,s.module].filter(Boolean)){let i=Pt(o,t);i&&!r.includes(i)&&r.push(i)}}catch{}if(r.length===0){for(let s of["src/index.ts","src/index.js","index.ts","index.js"])if(t.nodes.has(s)){r.push(s);break}}return r}function Wo(t,e){let r=new Set(e);for(let n of e)t.traverse(n,s=>(r.add(s.path),!0),{direction:"outgoing"});return r}function zo(t,e,r){let n=new Map;for(let s of e){if(r.includes(s))continue;let o=t.nodes.get(s);if(!o)continue;let i=o.category==="barrel";for(let a of o.exports){let c=n.get(a.name),l=!!(a.signature||a.doc);(!c||l&&!i)&&n.set(a.name,{file:s,symbol:a})}}return n}function $o(t,e,r,n){let s=[];for(let o of t){let i=e.get(o),a=n.flatMap(u=>r.nodes.get(u)?.exports??[]).find(u=>u.name===o),c=i?.symbol??a,l=i?.file??n.find(u=>r.nodes.get(u)?.exports.some(g=>g.name===o))??n[0],p={name:o,definedIn:l,kind:Oo(c?.signature)};c?.doc&&(p.doc=c.doc),c?.signature&&(p.signature=c.signature),s.push(p)}return s.sort((o,i)=>o.name.localeCompare(i.name)),s}function Bo(t,e,r){let n=c=>t.nodes.get(c)?.category==="test",s=[...e].filter(c=>!r.includes(c)&&!n(c)),o=[...t.nodes.keys()].filter(c=>!e.has(c)),i=o.filter(c=>!n(c)),a=o.filter(c=>n(c));return{internalFiles:s,unreachableFromEntry:i,testFiles:a}}function It(t,e){if(e.length===0)throw new Error("buildApiSurface requires at least one entry point");for(let l of e)if(!t.nodes.has(l))throw new Error(`Entry point not found in graph: ${l}`);let r=Wo(t,e),n=zo(t,r,e),s=jo(t,e),o=$o(s,n,t,e),{internalFiles:i,unreachableFromEntry:a,testFiles:c}=Bo(t,r,e);return{entryPoints:e,publicExports:o,internalFiles:i,unreachableFromEntry:a,testFiles:c}}function Dt(t,e){let r=null,n=[];for(let o of t.nodes.values()){o.exports.some(i=>i.name===e)&&(r=o.path);for(let i of o.callEdges??[])i.to===e&&n.push({file:o.path,callerFunction:i.from})}let s=[];if(r){let o=t.nodes.get(r);for(let i of o?.callEdges??[])i.from===e&&s.push({file:i.toFile,calleeFunction:i.to})}return{functionName:e,definedIn:r,callers:n,callees:s}}var Uo=d(require("fs")),Ko=d(require("path"));function qr(t){let e=[...t.nodes.entries()].sort(([n],[s])=>n.localeCompare(s)).map(([n,s])=>`${n}:${s.mtime}:${s.size}`).join("|"),r=2166136261;for(let n=0;n<e.length;n++)r^=e.charCodeAt(n),r=Math.imul(r,16777619)>>>0;return r.toString(16).padStart(8,"0")}function Mt(t){let e=new Map;for(let r of t.nodes.keys()){let n=[];t.traverse(r,s=>(s.path!==r&&n.push(s.path),!0),{direction:"incoming"}),e.set(r,n)}return{impact:e,graphHash:qr(t)}}function Rt(t,e){return t.impact.get(e)??[]}var jt=require("fs/promises"),Z=d(require("path")),yn=d(require("piscina"));var pe=d(require("fs")),Yr=d(require("path")),Lt=require("js-yaml"),Gt=["package-lock.json","yarn.lock","pnpm-lock.yaml"];function Xr(t){let e=t.lastIndexOf("@");return e>0?t.substring(0,e):t}function Ho(t){return t.replace(/:$/,"").split(",").map(e=>{let r=e.trim();return r.startsWith('"')&&(r=r.slice(1)),r.endsWith('"')&&(r=r.slice(0,-1)),Xr(r)}).filter(Boolean)}function Jo(t,e){let r=t.startsWith("/")?t.slice(1):t,n=r.lastIndexOf("@");return n>0?{name:r.substring(0,n),version:e||r.substring(n+1)}:{name:r,version:e}}function Vo(t){try{let e=(0,Lt.load)(t),r={dependencies:{}};for(let[n,s]of Object.entries(e))if(!(n==="__metadata"||!s?.version))for(let o of n.split(", ")){let i=Xr(o);i&&(r.dependencies[i]={version:s.version,...s.dependencies!==void 0&&{dependencies:s.dependencies}})}return r}catch{return null}}function Qo(t){let e={dependencies:{}};for(let r of t.split(/\n\n+/)){let n=r.split(`
|
|
4
|
+
`).filter(c=>c.trim().length>0&&!c.trim().startsWith("#"));if(n.length<2)continue;let s=n[0];if(!s||s.startsWith(" "))continue;let o=Ho(s);if(o.length===0)continue;let a=n.find(c=>c.trim().startsWith('version "'))?.match(/version "(.*?)"/)?.[1]??"";for(let c of o)e.dependencies[c]={version:a}}return e}function qo(t){let e=pe.default.readFileSync(t,"utf-8"),r=JSON.parse(e),n={dependencies:{}};if(r.packages)for(let[s,o]of Object.entries(r.packages)){if(!s.startsWith("node_modules/"))continue;let i=s.replace("node_modules/","");i.includes("node_modules/")||(n.dependencies[i]={version:o.version,...o.dependencies!==void 0&&{dependencies:o.dependencies}})}else if(r.dependencies)for(let[s,o]of Object.entries(r.dependencies))n.dependencies[s]={version:o.version,...o.dependencies!==void 0&&{dependencies:o.dependencies}};return n}function Yo(t){let e=pe.default.readFileSync(t,"utf-8");if(e.includes("__metadata:")){let r=Vo(e);if(r!==null)return r}return Qo(e)}function Xo(t){let e=pe.default.readFileSync(t,"utf-8"),r={dependencies:{}};try{let n=(0,Lt.load)(e);if(n.packages)for(let[s,o]of Object.entries(n.packages)){let{name:i,version:a}=Jo(s,o.version);i&&(r.dependencies[i]={version:a,...o.dependencies!==void 0&&{dependencies:o.dependencies}})}if(n.dependencies)for(let[s,o]of Object.entries(n.dependencies)){if(r.dependencies[s])continue;let i=typeof o=="string"?o:o.version;r.dependencies[s]={version:i||""}}}catch{}return r}function Zr(t){let e={"package-lock.json":qo,"yarn.lock":Yo,"pnpm-lock.yaml":Xo},r=Gt.map(n=>[n,e[n]]);for(let[n,s]of r){let o=Yr.default.join(t,n);if(pe.default.existsSync(o))return s(o)}return null}var Zo=new Set(["css","scss","less","stylus"]);function en(t){return Zo.has(t)?"style":"code"}var _t=d(require("postcss")),ei=d(require("postcss-less")),ti=ei,rn=new Set(["reference","inline"]);function tn(t){return t.startsWith("~")||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("//")||t.startsWith("data:")}function ri(t){let e=t.trim();return e.length>0&&!e.startsWith("http://")&&!e.startsWith("https://")&&!e.startsWith("//")&&!e.startsWith("data:")&&!e.startsWith("#")}function ni(t,e){let r=t.match(/^\(([^)]+)\)\s+['"]([^'"]+)['"]/);if(r){let o=r[1]?.trim()??"",i=r[2]??"";if(!i)return null;let a=rn.has(o)?"side-effect":"static";return{fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a,...tn(i)?{isExternal:!0}:{}}}let n=t.match(/^url\(['"]?([^'")]+)['"]?\)/),s=n?n[1]?.trim()??"":t.match(/^['"]([^'"]+)['"]/)?.[1]??"";return s?{fromPath:e,toPath:"",rawSpecifier:s,isStyle:!0,type:"static",...tn(s)?{isExternal:!0}:{}}:null}function si(t,e){let r=[],n=/url\(['"]?([^'")]+)['"]?\)/g,s=n.exec(t);for(;s!==null;){let o=s[1]?.trim()??"";ri(o)&&r.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:!0,type:"static"}),s=n.exec(t)}return r}function nn(t,e){let r=[];return t.walk(n=>{if(n.type==="atrule"&&n.name==="import"){let s=ni(n.params,e);s&&r.push(s)}n.type==="decl"&&r.push(...si(n.value,e))}),r}function oi(t){return t.replace(/(?<!:)\/\/.*/g,"")}function ii(t,e){let r=[],n=/@import\s+(?:\(([^)]+)\)\s+)?['"]([^'"]+)['"]/g,s=n.exec(t);for(;s!==null;){let o=s[1]?.trim()??"",i=s[2]??"";if(i){let a=rn.has(o)?"side-effect":"static";r.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a})}s=n.exec(t)}return r}function Oe(t,e){let r=_t.default.parse(oi(t));return{imports:nn(r,e),root:r}}function ai(t){let e=[],r=[];for(let n of t.nodes??[]){if(n.type!=="atrule")continue;let{value:s}=n;if(s===void 0)continue;let o=n.name;o&&(e.push({name:o}),r.push({name:o,kind:"variable"}))}return{exports:e,tags:r}}function je(t,e){try{let r=ti.parse(t),{exports:n,tags:s}=ai(r);return{imports:nn(r,e),root:r,exports:n,tags:s}}catch{return{imports:ii(t,e),root:_t.default.parse(""),exports:[],tags:[]}}}var on=require("postcss-scss");function sn(t){return t.startsWith("_")||t.startsWith("-")}function ci(t){return!!(t.startsWith("sass:")||t.startsWith("~")||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("//")||!t.startsWith(".")&&!t.startsWith("/")&&!t.startsWith("_"))}function li(t){let e=t.match(/^['"]([^'"]+)['"]/);if(!e?.[1])return{specifier:""};let r=e[1],s=t.match(/\bas\s+(\S+)/)?.[1];return s!==void 0?{specifier:r,alias:s}:{specifier:r}}function pi(t){let e=[],r=[];for(let n of t.nodes??[]){if(n.type==="decl"&&n.prop.startsWith("$")){let s=n.prop.slice(1);if(!s||sn(s))continue;e.push({name:s}),r.push({name:s,kind:"variable"});continue}if(n.type==="atrule"&&(n.name==="mixin"||n.name==="function")){let o=n.params.match(/^([\w-]+)/)?.[1];if(!o||sn(o))continue;let i=n.params.trim();e.push(i.includes("(")?{name:o,signature:i}:{name:o}),r.push({name:o,kind:"function"})}}return{exports:e,tags:r}}function We(t,e){let r=(0,on.parse)(t),n=[];r.walk(i=>{if(i.type!=="atrule")return;let{name:a,params:c}=i;if(a!=="import"&&a!=="use"&&a!=="forward")return;let{specifier:l,alias:p}=li(c);if(!l)return;let u={fromPath:e,toPath:"",rawSpecifier:l,isStyle:!0,type:a==="forward"?"re-export":"static",...ci(l)?{isExternal:!0}:{}};p&&(u.symbols=[p]),n.push(u)});let{exports:s,tags:o}=pi(r);return{imports:n,root:r,exports:s,tags:o}}function ui(t){return t.trim().replace(/\s+/g," ")}function fi(t){try{return t.fileType==="scss"?We(t.source,t.file).root:t.fileType==="less"?je(t.source,t.file).root:t.fileType==="css"?Oe(t.source,t.file).root:void 0}catch{return}}function mi(t){let e=fi(t);if(!e)return[];let r=[];return e.walkRules(n=>{let s=n.nodes?.filter(p=>p.type==="decl")??[];if(s.length===0)return;let o=s[0],i=s[s.length-1],a=n.source?.start?.line??o?.source?.start?.line,c=i?.source?.end?.line??i?.source?.start?.line??a;if(a===void 0||c===void 0)return;let l=s.map(p=>`${p.prop.trim().toLowerCase()}:${ui(p.value)}`).join(";");r.push({file:t.file,startLine:a,endLine:c,lines:c-a+1,signature:l,declCount:s.length})}),r}function an(t,e,r=2){let n=new Map;for(let o of t)for(let i of mi(o)){if(i.declCount<r||i.lines<e)continue;let a=n.get(i.signature);a?a.push(i):n.set(i.signature,[i])}let s=[];for(let o of n.values())for(let i=0;i<o.length;i++)for(let a=i+1;a<o.length;a++){let c=o[i],l=o[a];if(c.file===l.file&&c.startLine===l.startLine&&c.endLine===l.endLine)continue;let p={file:c.file,startLine:c.startLine,endLine:c.endLine},u={file:l.file,startLine:l.startLine,endLine:l.endLine};s.push({occurrences:[p,u],lines:Math.min(c.lines,l.lines),tokens:c.declCount,family:"style"})}return s.sort((o,i)=>i.lines-o.lines)}function cn(t){let e=t.length,r=[],n=[{lcpLength:0,low:0}];for(let s=1;s<e;s++){let o=s-1;for(;t[s]<n[n.length-1].lcpLength;){let i=n.pop();r.push({lcpLength:i.lcpLength,low:i.low,high:s-1}),o=i.low}t[s]>n[n.length-1].lcpLength&&n.push({lcpLength:t[s],low:o})}for(;n.length>1;){let s=n.pop();r.push({lcpLength:s.lcpLength,low:s.low,high:e-1})}return r}var gi=new Set(["{","}",":",",","[","]"]);function ln(t,e,r){let n=0;for(let s=e;s<e+r;s++)gi.has(t[s].text)&&n++;return n/r}function pn(t){let e=t.length;if(e===0)return[];let r=Array.from({length:e},(o,i)=>i),n=new Array(e);{let o=[...new Set(t)].sort(),i=new Map(o.map((a,c)=>[a,c]));for(let a=0;a<e;a++)n[a]=i.get(t[a])}let s=new Array(e).fill(0);for(let o=1;o<e;o*=2){let i=a=>a+o<e?n[a+o]:-1;r.sort((a,c)=>{let l=n[a]-n[c];return l!==0?l:i(a)-i(c)}),s[r[0]]=0;for(let a=1;a<e;a++){let c=r[a-1],l=r[a],p=n[c]===n[l],u=i(c)===i(l);s[l]=s[c]+(p&&u?0:1)}if([n,s]=[s,n],n[r[e-1]]===e-1)break}return r}function un(t,e){let r=t.length,n=new Array(r).fill(0);if(r===0)return n;let s=new Array(r);for(let i=0;i<r;i++)s[e[i]]=i;let o=0;for(let i=0;i<r;i++){let a=s[i];if(a>0){let c=e[a-1];for(;i+o<r&&c+o<r&&t[i+o]===t[c+o];)o++;n[a]=o,o>0&&o--}else o=0}return n}function fn(t,e,r,n=.5){let s=[],o=[],i=new Map;for(let{file:u,tokens:g}of t)if(g.length!==0){i.set(u,g);for(let h=0;h<g.length;h++)s.push(g[h].text),o.push({file:u,localIndex:h});s.push(` ${u}`),o.push({file:u,localIndex:-1})}if(s.length===0)return[];let a=pn(s),c=un(s,a),l=cn(c),p=[];for(let u of l){let g=di(u,a,o,i,e,r,n);g&&p.push(g)}return p.sort((u,g)=>g.lines-u.lines)}function di(t,e,r,n,s,o,i){if(t.lcpLength<s)return;let a=[];for(let h=t.low;h<=t.high;h++){let k=r[e[h]];k.localIndex!==-1&&a.push(k)}if(a.length<2||!hi(a,n))return;let c=yi(a,t.lcpLength);if(c.length<2)return;let l=c[0],p=n.get(l.file);if(ln(p,l.localIndex,t.lcpLength)>i)return;let u=c.map(({file:h,localIndex:k})=>{let x=n.get(h);return{file:h,startLine:x[k].line,endLine:x[k+t.lcpLength-1].line}}),g=Math.min(...u.map(h=>h.endLine-h.startLine+1));if(!(g<o))return{occurrences:u,lines:g,tokens:t.lcpLength}}function hi(t,e){let r=null;for(let{file:n,localIndex:s}of t){if(s===0)return!0;let i=e.get(n)[s-1].text;if(r===null)r=i;else if(r!==i)return!0}return!1}function yi(t,e){let r=new Map;for(let{file:s,localIndex:o}of t){let i=r.get(s);i?i.push(o):r.set(s,[o])}let n=[];for(let[s,o]of r){o.sort((a,c)=>a-c);let i=Number.NEGATIVE_INFINITY;for(let a of o)a>=i&&(n.push({file:s,localIndex:a}),i=a+e)}return n}var xi={typescript:{line:["//"],block:[["/*","*/"]]},javascript:{line:["//"],block:[["/*","*/"]]},go:{line:["//"],block:[["/*","*/"]]},css:{block:[["/*","*/"]]},scss:{line:["//"],block:[["/*","*/"]]},less:{line:["//"],block:[["/*","*/"]]},stylus:{line:["//"],block:[["/*","*/"]]},python:{line:["#"]},gherkin:{line:["#"]},coffeescript:{line:["#"],block:[["###","###"]]},livescript:{line:["#"],block:[["###","###"]]},lua:{line:["--"],block:[["--[[","]]"]]},markdown:{block:[["<!--","-->"]]}};function mn(t,e,r){let n=t.slice(e,r).replace(/[^\n]/g," ");return t.slice(0,e)+n+t.slice(r)}function bi(t,e){if(!e)return t;let r=t;for(let[n,s]of e.block??[]){let o=0;for(;;){let i=r.indexOf(n,o);if(i===-1)break;let a=r.indexOf(s,i+n.length),c=a===-1?r.length:a+s.length;r=mn(r,i,c),o=c}}for(let n of e.line??[]){let s=0;for(;;){let o=r.indexOf(n,s);if(o===-1)break;let i=r.indexOf(`
|
|
5
|
+
`,o),a=i===-1?r.length:i;r=mn(r,o,a),s=a}}return r}var Si=["===","!==","...","=>","==","!=","<=",">=","&&","||","::","->","..","+=","-=","*=","/="],Ot=new RegExp(`${Si.map(t=>t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")}|[A-Za-z_$][A-Za-z0-9_$]*|\\d+(?:\\.\\d+)?|"(?:\\\\.|[^"\\\\])*"|'(?:\\\\.|[^'\\\\])*'|\`(?:\\\\.|[^\`\\\\])*\`|\\S`,"g"),ki=/^[A-Za-z_$][A-Za-z0-9_$]*$/,gn=/^\d+(?:\.\d+)?$/,vi=/^(".*"|'.*'|`.*`)$/s,Ci=new Set(["if","else","elif","for","while","do","switch","case","default","break","continue","return","function","def","class","struct","interface","const","let","var","local","import","export","from","package","try","catch","except","finally","throw","raise","new","this","self","end","then","yield","async","await","nil","null","None","true","false","True","False","and","or","not","in","of","is"]);function dn(t,e,r=!0){let n=bi(t,xi[e]),s=[],o=1,i=0;Ot.lastIndex=0;let a=Ot.exec(n);for(;a!==null;){for(let p=i;p<a.index;p++)n[p]===`
|
|
6
|
+
`&&o++;i=a.index;let c=a[0],l=c;ki.test(c)&&!Ci.has(c)?l="ID":r&&(gn.test(c)||vi.test(c))&&(l=gn.test(c)?"NUM":"STR"),s.push({text:l,line:o});for(let p=i;p<a.index+c.length;p++)n[p]===`
|
|
7
|
+
`&&o++;i=a.index+c.length,a=Ot.exec(n)}return s}var X=d(require("fs")),hn=d(require("path"));function wi(t){if(!t||typeof t!="object")return!1;let e=t;return typeof e.mtime=="number"&&typeof e.size=="number"&&typeof e.ignoreLiterals=="boolean"&&Array.isArray(e.tokens)}function ze(t){try{if(!X.default.existsSync(t))return new Map;let e=X.default.readFileSync(t,"utf-8"),r=JSON.parse(e);if(!Array.isArray(r))return new Map;let n=r.filter(s=>Array.isArray(s)&&s.length===2&&typeof s[0]=="string"&&wi(s[1]));return new Map(n)}catch{return new Map}}function $e(t,e){let r=hn.default.dirname(e);X.default.existsSync(r)||X.default.mkdirSync(r,{recursive:!0}),X.default.writeFileSync(e,JSON.stringify([...t.entries()]))}var Fi=20,Ti=new Set(["css","scss","less"]);function Ei(t){return Gt.includes(Z.default.basename(t))}function Ai(t,e){if(e.length===0)return!1;let r=new Set(e);return t.split(Z.default.sep).some(n=>r.has(n))}async function Wt(t,e,r={}){let{minLines:n=6,windowSize:s=15,ignoreLiterals:o=!0,maxPunctuationRatio:i=.5,limit:a=50,ignoreDirs:c=j,parallelTokenizing:l=!0,tokenCache:p}=r,u=[...t.nodes.values()].filter(h=>!Ei(h.path)&&!Ai(h.path,c)),g=Pi(l,u.length);try{let h=[],k=new Map;if(await Promise.all(u.map(async y=>{if(Ti.has(y.type)){let q;try{q=await(0,jt.readFile)(Z.default.join(e,y.path),"utf8")}catch{return}h.push({file:y.path,source:q,fileType:y.type});return}let C=p?.get(y.path),D=C&&C.mtime===y.mtime&&C.size===y.size&&C.ignoreLiterals===o,N;if(D)N=C.tokens;else{let q;try{q=await(0,jt.readFile)(Z.default.join(e,y.path),"utf8")}catch{return}N=g?await g.run({source:q,fileType:y.type,ignoreLiterals:o}):dn(q,y.type,o),p?.set(y.path,{mtime:y.mtime,size:y.size,ignoreLiterals:o,tokens:N})}let O=en(y.type),_r={file:y.path,tokens:N},Or=k.get(O);Or?Or.push(_r):k.set(O,[_r])})),p){let y=new Set(u.map(C=>C.path));for(let C of p.keys())y.has(C)||p.delete(C)}let x=an(h,n);for(let[y,C]of k)for(let D of fn(C,s,n,i))x.push({...D,family:y});return{groups:x.sort((y,C)=>C.lines-y.lines).slice(0,a)}}finally{g&&await g.destroy()}}function Pi(t,e){if(t===!1)return null;let r=typeof t=="object"?t:{},n=r.minFiles??Fi;if(e<n)return null;r.maxThreads!==void 0&&r.maxThreads<1&&process.stderr.write(`
|
|
8
|
+
Warning: parallelTokenizing.maxThreads (${r.maxThreads}) must be at least 1; using 1.
|
|
9
|
+
`);try{return new yn.default({filename:Z.default.join(__dirname,"duplication-worker.js"),...r.maxThreads!==void 0?{maxThreads:Math.max(1,r.maxThreads)}:{}})}catch(s){return process.stderr.write(`
|
|
8
10
|
Warning: failed to start duplicate-detection worker pool, falling back to synchronous tokenizing: ${s}
|
|
9
|
-
`),null}}var pe=d(require("path"));function Ci(t){let e=new Map;for(let[r,n]of t){let s=n.imports.filter(o=>o.toPath&&!o.isExternal).length;s>0&&e.set(r,s)}return e}function Fi(t,e,r){let n=new Map;for(let[s,o]of e){if(o<r)continue;let i=t.get(s);if(!i||i.category==="test"||i.category==="barrel")continue;let a=pe.default.extname(s),c=pe.default.basename(s,a),l=c==="index"?pe.default.basename(pe.default.dirname(s)):c;n.set(s,{path:s,outDegree:o,tag:`feature:${l}`})}return n}function W(t,e){let r=e?.minOutDegree??5;return Fi(t,Ci(t),r)}var Ti=(t,e)=>t.outDegree-e.outDegree;function Ei(t,e){let r=new Map;for(let n of e.values()){let s=new Set;t.traverse(n.path,o=>(o.path!==n.path&&s.add(o.path),!0),{direction:"outgoing"}),r.set(n.path,s)}return r}function Pi(t,e,r,n){let s=new Map;for(let[o]of t){if(e.has(o))continue;let i=null;for(let a of e.values())r.get(a.path)?.has(o)&&(!i||n(a,i)<0)&&(i=a);i&&s.set(o,i.path)}return s}function Ai(t,e){let r=new Map;for(let n of t.values()){let s=n.tag.replace("feature:",""),o=[];for(let[i,a]of e)a===n.path&&o.push(i);r.set(s,{hub:n.path,outDegree:n.outDegree,files:o})}return r}function Ni(t,e,r){let n=[];for(let s of t.keys())!e.has(s)&&!r.has(s)&&n.push(s);return n}function ue(t,e){let r=e?.detectFn??W,n=e?.hubComparator??Ti,s=r(t.nodes,e),o=Ei(t,s),i=Pi(t.nodes,s,o,n);return{features:Ai(s,i),unassigned:Ni(t.nodes,s,i)}}var ln=new Set(["typescript","javascript","python","go","scss","less","lua","coffeescript"]),pn=new Set(["typescript","javascript","python"]),je=new Set(["typescript","javascript","go","python"]);function Dt(t){let e=new Map;for(let r of t.nodes.values())e.set(r.type,(e.get(r.type)??0)+1);return[...e.entries()].map(([r,n])=>({type:r,fileCount:n,exportsTracked:ln.has(r),importSymbolsTracked:pn.has(r),callEdgesTracked:je.has(r)})).sort((r,n)=>n.fileCount-r.fileCount)}var fe=class{constructor(e){this.nodes=e}nodes;findUnusedFiles(e){let r=new Set(this.nodes.keys());return e.filter(n=>!r.has(n))}findHighExportUsage(e){let r=[];for(let n of this.nodes.values()){if(n.maxExportUsage===void 0||n.maxExportUsage<e)continue;let s=n.imports.reduce((o,i)=>(i.exportUsageRatio??0)>(o?.exportUsageRatio??0)?i:o,null);r.push({path:n.path,maxExportUsage:n.maxExportUsage,tightestDep:s?.toPath??""})}return r.sort((n,s)=>s.maxExportUsage-n.maxExportUsage)}findCycles(){let e=[],r=new Set,n=new Set,s=[],o=i=>{r.add(i),n.add(i),s.push(i);let a=this.nodes.get(i);if(a){for(let c of a.imports)if(!(!c.toPath||c.isExternal))if(n.has(c.toPath)){let l=s.indexOf(c.toPath);e.push([...s.slice(l),c.toPath])}else r.has(c.toPath)||o(c.toPath)}n.delete(i),s.pop()};for(let i of this.nodes.keys())r.has(i)||o(i);return e}};var D=class t{constructor(e){this.nodes=e}nodes;_incomingEdgesCache=null;_callIncomingCache=null;serialize(){return{nodes:Array.from(this.nodes.values())}}static deserialize(e){let r=new Map;for(let n of e.nodes)r.set(n.path,n);return new t(r)}getIncomingEdgesMap(){if(this._incomingEdgesCache)return this._incomingEdgesCache;let e=new Map;for(let r of this.nodes.values())for(let n of r.imports)if(n.toPath){let s=e.get(n.toPath)||[];s.push(r.path),e.set(n.toPath,s)}return this._incomingEdgesCache=e,e}dfs(e,r,n,s){let o=new Set,i=n.maxDepth??1/0,a=(c,l,p)=>{if(l>i||o.has(c))return;let u=this.nodes.get(c);if(u&&(o.add(c),r(u,l,p)!==!1))for(let g of s(c))a(g,l+1,c)};a(e,0,null)}traverse(e,r,n={}){let s=n.direction??"outgoing",o=s==="incoming"?this.getIncomingEdgesMap():null;this.dfs(e,r,n,i=>s==="outgoing"?this.nodes.get(i)?.imports.map(a=>a.toPath).filter(Boolean)??[]:o?.get(i)??[])}getCallIncomingCache(){if(this._callIncomingCache)return this._callIncomingCache;let e=new Map;for(let r of this.nodes.values())for(let n of r.callEdges??[]){let s=e.get(n.toFile)??[];s.push(r.path),e.set(n.toFile,s)}return this._callIncomingCache=e,e}traverseCalls(e,r,n={}){let s=n.direction??"outgoing",o=s==="incoming"?this.getCallIncomingCache():null;this.dfs(e,r,n,i=>s==="outgoing"?this.nodes.get(i)?.callEdges?.map(a=>a.toFile)??[]:o?.get(i)??[])}getCallers(e){let r=[];return this.traverseCalls(e,n=>(n.path!==e&&r.push(n.path),!0),{direction:"incoming",maxDepth:1}),r}getCallEdgesFor(e){return this.nodes.get(e)?.callEdges??[]}getNeighbors(e){let r=this.nodes.get(e);return r?r.imports.map(n=>this.nodes.get(n.toPath)).filter(n=>n!==void 0):[]}findUnusedFiles(e){return new fe(this.nodes).findUnusedFiles(e)}findCycles(){return new fe(this.nodes).findCycles()}};var z=class{affectedSymbols=new Map;constructor(e,r){this.affectedSymbols.set(e,new Set(["default",...r]))}updateAffectedSymbols(e,r){let n=this.affectedSymbols.get(r)||new Set,s=e.imports.find(c=>c.toPath===r);if(!s)return!1;let o=s.symbols||["*"],i=new Set;for(let c of o)(c==="*"||n.has("*")||n.has(c))&&i.add("*");if(i.size===0)return!1;let a=this.affectedSymbols.get(e.path)||new Set;for(let c of i)a.add(c);return this.affectedSymbols.set(e.path,a),!0}};function me(t,e){let r=t.nodes.get(e);if(r)return{category:r.category,exports:r.exports.map(n=>n.name)}}function Rt(t,e,r=1){let n=[];return t.traverse(e,(s,o,i)=>{if(s.path===e)return!0;let a=i?t.nodes.get(i)?.imports.find(c=>c.toPath===s.path):void 0;return n.push({path:s.path,...a?.symbols?{symbols:a.symbols}:{}}),!0},{direction:"outgoing",maxDepth:r}),n}function ge(t,e){let r=[];return t.traverse(e,n=>{if(n.path===e)return!0;let s=n.imports.find(o=>o.toPath===e);return r.push({path:n.path,...s?.symbols?{symbols:s.symbols}:{}}),!0},{direction:"incoming",maxDepth:1}),r}function Lt(t,e,r={}){let{testsOnly:n=!1,changedSymbols:s}=r,o=s?new z(e,s):null,i=[];return t.traverse(e,(a,c,l)=>{if(a.path===e)return!0;if(o&&l&&!o.updateAffectedSymbols(a,l))return!1;let p=a.category==="test"||a.tags.some(u=>u.name==="test");return(!n||p)&&i.push(a.path),!0},{direction:"incoming"}),i}function Gt(t,e,r={}){let{depth:n=1,withEdgeDetail:s=!1}=r,o=[];return t.traverseCalls(e,i=>{if(i.path===e)return!0;let a={file:i.path};return s&&(a.edges=(i.callEdges??[]).filter(c=>c.toFile===e).map(c=>({from:c.from,to:c.to}))),o.push(a),!0},{direction:"incoming",maxDepth:n}),o}function _t(t,e={}){let{metric:r="cognitiveComplexity",threshold:n=10,limit:s=20}=e;return[...t.nodes.values()].flatMap(o=>(o.functions??[]).filter(i=>i[r]>=n).map(i=>({file:o.path,name:i.name,line:i.line,complexity:i.complexity,cognitiveComplexity:i.cognitiveComplexity}))).sort((o,i)=>i[r]-o[r]).slice(0,s)}function Ot(t){return{nodes:t.nodes.map(r=>({path:r.path,type:r.type,category:r.category,exports:r.exports.map(n=>n.name),tags:r.tags.filter(n=>n.kind==="comment-marker"||n.kind==="import").map(n=>n.name),importsFiles:r.imports.filter(n=>!n.isExternal&&n.toPath).map(n=>n.toPath),...r.description!==void 0&&{description:r.description},...r.testedBy!==void 0&&{testedBy:r.testedBy},...r.coveragePct!==void 0&&{coveragePct:r.coveragePct},...r.avgExportUsage!==void 0&&{avgExportUsage:r.avgExportUsage},...r.maxExportUsage!==void 0&&{maxExportUsage:r.maxExportUsage}})),cycles:t.cycles}}function jt(t){let e=t.getPackageDependencies(),r=Array.from(t.packages.values()).map(({graph:n,pkg:s})=>({name:s.name,relativeRoot:s.relativeRoot,nodeCount:n.nodes.size,dependsOn:e.get(s.name)??[]}));return{monorepoType:t.type,packageCount:r.length,packages:r}}function Wt(t){return[...t.nodes.values()].some(e=>e.coveragePct!==void 0)}function un(t){if(t.category==="test")return"test";if(t.category==="config")return"config";if(t.category==="type-only")return"types";let e=t.path;return v(e,"component")||v(e,"components")?"component":v(e,"controller")||v(e,"controllers")?"controller":v(e,"middleware")?"middleware":v(e,"router")||v(e,"routes")||v(e,"route")?"router":v(e,"store")||v(e,"stores")?"store":v(e,"service")||v(e,"services")?"service":v(e,"handler")||v(e,"handlers")?"handler":v(e,"adapter")||v(e,"adapters")?"adapter":v(e,"plugin")||v(e,"plugins")?"plugin":v(e,"api")?"api":v(e,"cli")||v(e,"commands")||de(e)==="cli"?"cli":v(e,"util")||v(e,"utils")||v(e,"helper")||v(e,"helpers")?"util":v(e,"model")||v(e,"models")||de(e)==="model"?"model":v(e,"parser")||v(e,"parsers")||de(e)==="parser"?"parser":de(e)==="builder"?"builder":de(e)==="resolver"?"resolver":"other"}function v(t,e){return t.includes(`/${e}/`)||t.includes(`/${e}.`)}function de(t){let e=t.slice(t.lastIndexOf("/")+1);return e.slice(0,e.lastIndexOf("."))||e}function zt(t,e){let r=ue(t,e),n=new Map;for(let[o,i]of r.features){for(let a of i.files)n.set(a,o);n.set(i.hub,o)}let s=new Map;for(let o of t.nodes.values()){let i=n.get(o.path);s.set(o.path,{path:o.path,role:un(o),...o.description?{description:o.description}:{},exports:o.exports.map(a=>a.name),...i?{featureHub:i}:{}})}return s}function $t(t,e){let r=[];for(let n of t.nodes.values())if(n.exports.some(s=>s.name===e))if(je.has(n.type)){let s=[];for(let o of t.nodes.values())for(let i of o.callEdges??[])i.to===e&&s.push({file:o.path,callerFunction:i.from});r.push({path:n.path,category:n.category,precision:"call",callers:s})}else{let s=ge(t,n.path).map(o=>({file:o.path,...o.symbols?{symbols:o.symbols}:{}}));r.push({path:n.path,category:n.category,precision:"file-level",importers:s})}return r}function Ii(t){return t?t.startsWith("interface ")?"interface":t.startsWith("class ")?"class":t.startsWith("enum ")?"enum":"type":"type"}function Mi(t,e){if(e==="type-only")return!0;let r=t.signature??"";return r.startsWith("interface ")||r.startsWith("class ")||r.startsWith("enum ")}function Bt(t){let e=new Map;for(let n of t.nodes.values())if(!(n.type!=="typescript"&&n.type!=="javascript"))for(let s of n.exports){if(!Mi(s,n.category))continue;let o=`${n.path}::${s.name}`;e.set(o,{name:s.name,file:n.path,kind:Ii(s.signature),...s.doc?{doc:s.doc}:{}})}let r=[];for(let n of t.nodes.values())if(!(n.type!=="typescript"&&n.type!=="javascript")){for(let s of n.imports)if(!(!s.toPath||s.isExternal||!s.symbols?.length))for(let o of s.symbols)e.has(`${s.toPath}::${o}`)&&r.push({fromFile:n.path,toType:o,toFile:s.toPath})}return{types:e,edges:r}}function Ut(t,e){let r=null;for(let o of t.types.values())if(o.name===e){r=o;break}if(!r)return{type:null,usedByFiles:[],uses:[]};let n=new Set,s=new Map;for(let o of t.edges)if(o.toType===e&&o.toFile===r.file&&n.add(o.fromFile),o.fromFile===r.file){let i=t.types.get(`${o.toFile}::${o.toType}`);i&&s.set(`${i.file}::${i.name}`,i)}return{type:r,usedByFiles:Array.from(n),uses:Array.from(s.values())}}var Tn=d(require("path"));var ze=d(require("fs")),Vt=d(require("path"));var Z=d(require("fs")),P=d(require("path"));var Kt=d(require("fs")),Di=d(require("path"));function fn(t){try{return Kt.default.statSync(t,{throwIfNoEntry:!1})?.isDirectory()===!0}catch{return!1}}function We(t){try{return Kt.default.statSync(t,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}function Jt(t,e){let r=P.default.join(e,"package.json");if(!Z.default.existsSync(r))return null;let n={};try{n=JSON.parse(Z.default.readFileSync(r,"utf-8"))}catch{return null}let s=n.name;return s?{name:s,root:e,relativeRoot:P.default.relative(t,e),entryPoints:Ri(e,n)}:null}function Ri(t,e){let r=[];if(e.exports){let s=e.exports;if(typeof s=="string")r.push(P.default.join(t,s));else if(typeof s=="object"&&s!==null){let o=s["."];if(typeof o=="string")r.push(P.default.join(t,o));else if(typeof o=="object"&&o!==null){let i=o.import??o.require??o.default;typeof i=="string"&&r.push(P.default.join(t,i))}}}e.main&&r.push(P.default.join(t,e.main));for(let s of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"])r.push(P.default.join(t,s));let n=r.filter(We);return n.length>0?n.slice(0,1):r.slice(0,1)}function ee(t,e){let r=[],n=new Set;for(let s of e){let o=s.replace(/\/$/,"").replace(/^\.\//,"");Li(t,o,n,r)}return r}function Li(t,e,r,n){if(!e.includes("*")){Gi(t,e,r,n);return}let s=e.split("/");s.includes("**")?_i(t,s,r,n):Oi(t,s,r,n)}function Gi(t,e,r,n){let s=P.default.join(t,e);if(r.has(s)||!fn(s))return;r.add(s);let o=Jt(t,s);o&&n.push(o)}function _i(t,e,r,n){let s=P.default.join(t,e[0]==="**"?"":e[0]??"");mn(t,s,r,n)}function Oi(t,e,r,n){let s=e.findIndex(a=>a.includes("*")),o=P.default.join(t,...e.slice(0,s)),i;try{i=Z.default.readdirSync(o,{withFileTypes:!0})}catch{return}for(let a of i){if(!a.isDirectory())continue;let c=P.default.join(o,a.name);if(r.has(c))continue;r.add(c);let l=Jt(t,c);l&&n.push(l)}}function mn(t,e,r,n){let s;try{s=Z.default.readdirSync(e,{withFileTypes:!0})}catch{return}for(let o of s){if(!o.isDirectory()||o.name==="node_modules"||o.name.startsWith("."))continue;let i=P.default.join(e,o.name);if(Z.default.existsSync(P.default.join(i,"package.json"))&&!r.has(i)){r.add(i);let a=Jt(t,i);a&&n.push(a)}else mn(t,i,r,n)}}var gn={type:"npm",detect(t){let e=Vt.default.join(t,"package.json");if(!ze.default.existsSync(e))return null;let r;try{r=JSON.parse(ze.default.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!r||ze.default.existsSync(Vt.default.join(t,"yarn.lock")))return null;let n=Array.isArray(r)?r:r.packages??[];return n.length===0?null:ee(t,n)}};var $=d(require("fs")),T=d(require("path"));var dn={type:"nx",detect(t){return $.default.existsSync(T.default.join(t,"nx.json"))?hn(t,t,new Set,0).map(r=>ji(t,r,T.default.join(r,"project.json"))).filter(r=>r!==null):null}};function hn(t,e,r,n){if(n>4)return[];let s;try{s=$.default.readdirSync(e,{withFileTypes:!0})}catch{return[]}let o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name;if(a.startsWith(".")||a==="node_modules"||a==="dist"||a===".nx")continue;let c=T.default.join(e,a);$.default.existsSync(T.default.join(c,"project.json"))&&!r.has(c)?(r.add(c),o.push(c)):o.push(...hn(t,c,r,n+1))}return o}function ji(t,e,r){let n={};try{n=JSON.parse($.default.readFileSync(r,"utf-8"))}catch{return null}let s=n.name,o,i,a=T.default.join(e,"package.json");if($.default.existsSync(a))try{let c=JSON.parse($.default.readFileSync(a,"utf-8"));s=c.name??s,o=c.main,i=c.exports}catch{}return s?{name:s,root:e,relativeRoot:T.default.relative(t,e),entryPoints:Wi(e,n,o,i)}:null}function Wi(t,e,r,n){let s=[],o=e.targets?.build?.options?.main??e.targets?.build?.options?.entryFile;if(o){let a=T.default.resolve(t,"../..");s.push(T.default.resolve(a,o)),s.push(T.default.resolve(t,o))}if(n){let a=n;if(typeof a=="string")s.push(T.default.join(t,a));else if(typeof a=="object"&&a!==null){let c=a["."];typeof c=="string"&&s.push(T.default.join(t,c))}}if(r&&s.push(T.default.join(t,r)),e.sourceRoot){let a=T.default.resolve(t,"../.."),c=T.default.resolve(a,e.sourceRoot);s.push(T.default.join(c,"index.ts"),T.default.join(c,"index.tsx"))}for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx"])s.push(T.default.join(t,a));let i=s.filter(We);return i.length>0?i.slice(0,1):s.slice(0,1)}var Ht=d(require("fs")),yn=d(require("path")),xn=require("js-yaml");var bn={type:"pnpm",detect(t){let e=yn.default.join(t,"pnpm-workspace.yaml");if(!Ht.default.existsSync(e))return null;let r=[];try{r=(0,xn.load)(Ht.default.readFileSync(e,"utf-8"))?.packages??[]}catch{return null}return ee(t,r)}};var Sn=d(require("fs")),kn=d(require("path")),vn={type:"turborepo",detect(t){return Sn.default.existsSync(kn.default.join(t,"turbo.json"))?[]:null}};var $e=d(require("fs")),Qt=d(require("path"));var wn={type:"yarn",detect(t){if(!$e.default.existsSync(Qt.default.join(t,"yarn.lock")))return null;let e=Qt.default.join(t,"package.json");if(!$e.default.existsSync(e))return null;let r;try{r=JSON.parse($e.default.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!r)return null;let n=Array.isArray(r)?r:r.packages??[];return n.length===0?null:ee(t,n)}};var Cn=[];function L(t){Cn.push(t)}function Fn(){return Cn}L(vn);L(dn);L(bn);L(wn);L(gn);function he(t,e=Fn()){let r=Tn.default.resolve(t),n=new Map,s=[];for(let i of e){let a=i.detect(r);if(a!==null){s.push(i.type);for(let c of a)n.has(c.name)||n.set(c.name,c)}}if(s.length===0)return{root:r,type:"none",types:[],packages:[],packageMap:new Map};let o=Array.from(n.values());return{root:r,type:s[0],types:s,packages:o,packageMap:new Map(o.map(i=>[i.name,i]))}}var ye=class t{constructor(e,r){this.monorepoRoot=e;this.type=r}monorepoRoot;type;packages=new Map;addPackage(e,r){this.packages.set(e.name,{graph:r,pkg:e})}getPackageForFile(e){for(let{pkg:r}of this.packages.values())if(e===r.relativeRoot||e.startsWith(`${r.relativeRoot}/`))return r}getPackageDependencies(){let e=new Map;for(let{graph:r,pkg:n}of this.packages.values()){let s=new Set;for(let o of r.nodes.values())for(let i of o.imports)i.isWorkspace&&i.workspacePackage&&s.add(i.workspacePackage);e.set(n.name,[...s])}return e}getAffectedAcrossPackages(e){let r=this.getPackageForFile(e);if(!r)return[];let n=this.packages.get(r.name);if(!n)return[];let s=[];n.graph.traverse(e,o=>(o.path!==e&&s.push({file:o.path,package:r.name}),!0),{direction:"incoming"});for(let{graph:o,pkg:i}of this.packages.values())if(i.name!==r.name)for(let a of o.nodes.values())a.imports.some(l=>l.isWorkspace&&l.workspacePackage===r.name)&&s.push({file:a.path,package:i.name});return s}serialize(){return{monorepoRoot:this.monorepoRoot,type:this.type,packages:Array.from(this.packages.values()).map(({graph:e,pkg:r})=>({pkg:{name:r.name,relativeRoot:r.relativeRoot,entryPoints:r.entryPoints},nodes:Array.from(e.nodes.values())}))}}static deserialize(e){let r=new t(e.monorepoRoot,e.type);for(let{pkg:n,nodes:s}of e.packages){let o=new Map(s.map(a=>[a.path,a])),i=new D(o);r.packages.set(n.name,{graph:i,pkg:{...n,root:""}})}return r}};var En=new Map;function te(t,e){En.set(t,e)}function Pn(t){return En.get(t)}function An(t,e){return e.startsWith("!")?t!==e.slice(1):t===e}function zi(t,e){return e.startsWith("!")?!t.includes(e.slice(1)):t.includes(e)}var $i=(t,e)=>!e.category||An(t.category,e.category),Bi=(t,e)=>!e.type||An(t.type,e.type),Ui=(t,e)=>e.lastAuthor?e.lastAuthor.startsWith("!")?t.lastAuthor!==e.lastAuthor.slice(1):t.lastAuthor!==void 0&&t.lastAuthor===e.lastAuthor:!0,Ki=(t,e)=>!e.path||zi(t.path,e.path),Ji=(t,e)=>e.isExternal===void 0?!0:t.imports.some(n=>n.isExternal)===e.isExternal,Vi=(t,e)=>{if(!e.tags||e.tags.length===0)return!0;let r=e.tags.filter(s=>!s.startsWith("!")),n=e.tags.filter(s=>s.startsWith("!")).map(s=>s.slice(1));return!(r.length>0&&!r.some(s=>t.tags.some(o=>o.name===s))||n.some(s=>t.tags.some(o=>o.name===s)))},Hi=(t,e)=>!e.allTags?.length||e.allTags.every(r=>t.tags.some(n=>n.name===r)),Qi=(t,e)=>!e.importsFile||t.imports.some(r=>r.toPath?.includes(e.importsFile)),qi=(t,e,r)=>e.importedBy===void 0?!0:(r?.get(t.path)??[]).some(s=>s.includes(e.importedBy)),Yi=(t,e)=>e.minImports===void 0||t.imports.length>=e.minImports,Xi=(t,e)=>e.maxImports===void 0||t.imports.length<=e.maxImports,Zi=(t,e)=>e.minSize===void 0||t.size>=e.minSize,ea=(t,e)=>e.maxSize===void 0||t.size<=e.maxSize,ta=(t,e)=>e.hasDocstring===void 0||!!t.description===e.hasDocstring,ra=(t,e)=>e.isDocumented===void 0||!!t.documentedBy?.length===e.isDocumented,na=(t,e)=>e.isStale===void 0||!!t.staleFor?.length===e.isStale,sa=(t,e)=>e.minCoverage===void 0||(t.coveragePct??101)>=e.minCoverage,oa=(t,e)=>e.maxCoverage===void 0||(t.coveragePct??0)<=e.maxCoverage,ia=(t,e)=>e.minExportUsage===void 0||(t.avgExportUsage??-1)>=e.minExportUsage,aa=(t,e)=>e.maxExportUsage===void 0||(t.avgExportUsage??0)<=e.maxExportUsage,ca=(t,e)=>e.minComplexity===void 0||(t.complexity??-1/0)>=e.minComplexity,la=(t,e)=>e.maxComplexity===void 0||(t.complexity??0)<=e.maxComplexity,pa=(t,e)=>e.minCognitiveComplexity===void 0||(t.cognitiveComplexity??-1/0)>=e.minCognitiveComplexity,ua=(t,e)=>e.maxCognitiveComplexity===void 0||(t.cognitiveComplexity??0)<=e.maxCognitiveComplexity,fa=(t,e)=>e.minCommits===void 0||(t.commitCount90d??-1/0)>=e.minCommits,ma=(t,e)=>e.maxCommits===void 0||(t.commitCount90d??0)<=e.maxCommits,ga=(t,e,r)=>!e.any?.length||e.any.some(n=>xe(t,n,r)),da=[$i,Bi,Ui,Ki,Ji,Vi,Hi,Qi,qi,Yi,Xi,Zi,ea,ta,ra,na,sa,oa,ia,aa,ca,la,pa,ua,fa,ma,ga];function xe(t,e,r){return da.every(n=>n(t,e,r))}function Be(t,e){let r=new Map;if(e.importedBy!==void 0){for(let i of t.nodes)for(let a of i.imports)if(a.toPath){let c=r.get(a.toPath)??[];c.push(i.path),r.set(a.toPath,c)}}let n=t.nodes.filter(i=>xe(i,e,r)),s=new Set(n.map(i=>i.path)),o=n.map(i=>({...i,imports:i.imports.filter(a=>!a.toPath||s.has(a.toPath))}));if(e.sort){let i=e.sortDir==="asc"?-1:1;o.sort((a,c)=>{let l=0;return e.sort==="size"?l=c.size-a.size:e.sort==="imports"?l=c.imports.length-a.imports.length:e.sort==="commitCount90d"?l=(c.commitCount90d??0)-(a.commitCount90d??0):e.sort==="exportUsage"?l=(c.avgExportUsage??0)-(a.avgExportUsage??0):e.sort==="complexity"?l=(c.complexity??0)-(a.complexity??0):e.sort==="cognitiveComplexity"&&(l=(c.cognitiveComplexity??0)-(a.cognitiveComplexity??0)),l*i})}return e.limit!==void 0&&o.splice(e.limit),{nodes:o,cycles:t.cycles?.filter(i=>i.every(a=>s.has(a)))??void 0}}function Nn(t,e){let r=e.indexOf(":");if(r===-1)return;let n=e.slice(0,r).trim().toLowerCase(),s=e.slice(r+1).trim();if(!(!n||!s))switch(n){case"category":t.category=s;break;case"type":t.type=s;break;case"tag":case"tags":s.includes("+")?t.allTags=[...t.allTags??[],...s.split("+")]:t.tags=[...t.tags??[],s];break;case"path":t.path=s;break;case"external":t.isExternal=s.toLowerCase()==="true";break;case"importsfile":t.importsFile=s;break;case"importedby":t.importedBy=s;break;case"minimports":t.minImports=parseInt(s,10);break;case"maximports":t.maxImports=parseInt(s,10);break;case"minsize":t.minSize=parseInt(s,10);break;case"maxsize":t.maxSize=parseInt(s,10);break;case"sort":t.sort=s;break;case"sortdir":t.sortDir=s.toLowerCase()==="asc"?"asc":"desc";break;case"limit":t.limit=parseInt(s,10);break;case"hasdocstring":t.hasDocstring=s.toLowerCase()!=="false";break;case"mincoverage":t.minCoverage=parseInt(s,10);break;case"maxcoverage":t.maxCoverage=parseInt(s,10);break;case"minexportusage":t.minExportUsage=parseFloat(s);break;case"maxexportusage":t.maxExportUsage=parseFloat(s);break;case"mincomplexity":t.minComplexity=parseInt(s,10);break;case"maxcomplexity":t.maxComplexity=parseInt(s,10);break;case"mincognitivecomplexity":t.minCognitiveComplexity=parseInt(s,10);break;case"maxcognitivecomplexity":t.maxCognitiveComplexity=parseInt(s,10);break;case"mincommits":t.minCommits=parseInt(s,10);break;case"maxcommits":t.maxCommits=parseInt(s,10);break;case"isdocumented":t.isDocumented=s.toLowerCase()!=="false";break;case"isstale":t.isStale=s.toLowerCase()!=="false";break;case"lastauthor":t.lastAuthor=s;break}}function ha(t){let e=[];for(let r of t.split("|")){let n=r.trim();if(!n)continue;let s={};Nn(s,n),Object.keys(s).length>0&&e.push(s)}return e}function Ue(t){let e={},r=t.split(",");for(let n of r){let s=n.trim();if(s.toLowerCase().startsWith("any(")&&s.endsWith(")")){let o=s.slice(4,-1),i=ha(o);i.length>0&&(e.any=[...e.any??[],...i]);continue}Nn(e,n)}return e}var pr=d(require("fs/promises")),Bn=d(require("path"));var Ze=d(require("path")),be=d(require("typescript"));var Dn=d(require("path"));var Mn=d(require("path")),F=d(require("typescript")),In=new Set(["describe","test","it"]);function B(t,e){let r=t[e];if(r===void 0)throw new Error(`Index ${e} out of bounds (length ${t.length})`);return r}function qt(t){let e=[];for(let r of t.statements){if(!F.default.isExpressionStatement(r))continue;let n=r.expression;if(!F.default.isCallExpression(n))continue;let s=n.expression;F.default.isIdentifier(s)&&In.has(s.text)&&e.push(n),F.default.isPropertyAccessExpression(s)&&F.default.isIdentifier(s.expression)&&In.has(s.expression.text)&&e.push(n)}return e}function Yt(t,e,r){for(let n of t.arguments){if(!F.default.isObjectLiteralExpression(n))continue;let s=n.properties.find(o=>F.default.isPropertyAssignment(o)&&F.default.isIdentifier(o.name)&&o.name.text===e);if(!(!s||!F.default.isArrayLiteralExpression(s.initializer)))return s.initializer.elements.filter(F.default.isStringLiteral).map(o=>o.text)}return null}function Xt(t,e,r,n){if(t.arguments.length===0)return null;for(let o=1;o<t.arguments.length;o++){let i=B(t.arguments,o);if(!F.default.isObjectLiteralExpression(i))continue;let a=i.properties.find(l=>F.default.isPropertyAssignment(l)&&F.default.isIdentifier(l.name)&&l.name.text===e);if(a)return{start:a.initializer.getStart(n),end:a.initializer.getEnd(),text:r};let c=i.getEnd()-1;return{start:c,end:c,text:`${i.properties.length>0?", ":""}${e}: ${r}`}}let s=B(t.arguments,t.arguments.length-1);return{start:s.getStart(n),end:s.getStart(n),text:`{ ${e}: ${r} }, `}}function Zt(t,e,r){let n=t.arguments;for(let s=1;s<n.length;s++){let o=B(n,s);if(!F.default.isObjectLiteralExpression(o))continue;let i=o.properties.findIndex(c=>F.default.isPropertyAssignment(c)&&F.default.isIdentifier(c.name)&&c.name.text===e);if(i<0)continue;if(o.properties.length===1)return{start:B(n,s-1).getEnd(),end:o.getEnd(),text:""};let a=B(o.properties,i);return i===o.properties.length-1?{start:B(o.properties,i-1).getEnd(),end:a.getEnd(),text:""}:{start:a.getStart(r),end:B(o.properties,i+1).getStart(r),text:""}}return null}function er(t,e){let r=[...e].sort((s,o)=>o.start-s.start),n=t;for(let s of r)n=n.slice(0,s.start)+s.text+n.slice(s.end);return n}function tr(t){return`[${t.map(e=>JSON.stringify(e)).join(", ")}]`}var M=new Set([".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"]);function ya(t){return t.map(e=>e.startsWith("@")?e.slice(1):e)}function Ke(t,e,r,n){let s=F.default.createSourceFile(Mn.default.basename(t),e,F.default.ScriptTarget.Latest,!0),o=qt(s),[i]=o;if(!i)return e;let a=Yt(i,n,s),c=[...r].sort();if(a!==null&&JSON.stringify(ya(a).sort())===JSON.stringify(c))return e;let l=tr(c.map(u=>`@${u}`)),p=o.flatMap(u=>{let g=r.length===0?Zt(u,n,s):Xt(u,n,l,s);return g?[g]:[]});return p.length>0?er(e,p):e}var Je=class{name="cypress";canHandle(e){return M.has(Dn.default.extname(e).toLowerCase())}apply(e,r,n){return Ke(e,r,n,"tags")}};var Rn=d(require("path")),rr=/# <mokosh-tags>[\s\S]*?# <\/mokosh-tags>\n*/,nr=/^@([a-zA-Z0-9_-]+)/gm;function xa(t){return`${["# <mokosh-tags>",...t.map(e=>`@${e}`),"# </mokosh-tags>"].join(`
|
|
11
|
+
`),null}}var ue=d(require("path"));function Ni(t){let e=new Map;for(let[r,n]of t){let s=n.imports.filter(o=>o.toPath&&!o.isExternal).length;s>0&&e.set(r,s)}return e}function Ii(t,e,r){let n=new Map;for(let[s,o]of e){if(o<r)continue;let i=t.get(s);if(!i||i.category==="test"||i.category==="barrel")continue;let a=ue.default.extname(s),c=ue.default.basename(s,a),l=c==="index"?ue.default.basename(ue.default.dirname(s)):c;n.set(s,{path:s,outDegree:o,tag:`feature:${l}`})}return n}function W(t,e){let r=e?.minOutDegree??5;return Ii(t,Ni(t),r)}var Di=(t,e)=>t.outDegree-e.outDegree;function Mi(t,e){let r=new Map;for(let n of e.values()){let s=new Set;t.traverse(n.path,o=>(o.path!==n.path&&s.add(o.path),!0),{direction:"outgoing"}),r.set(n.path,s)}return r}function Ri(t,e,r,n){let s=new Map;for(let[o]of t){if(e.has(o))continue;let i=null;for(let a of e.values())r.get(a.path)?.has(o)&&(!i||n(a,i)<0)&&(i=a);i&&s.set(o,i.path)}return s}function Li(t,e){let r=new Map;for(let n of t.values()){let s=n.tag.replace("feature:",""),o=[];for(let[i,a]of e)a===n.path&&o.push(i);r.set(s,{hub:n.path,outDegree:n.outDegree,files:o})}return r}function Gi(t,e,r){let n=[];for(let s of t.keys())!e.has(s)&&!r.has(s)&&n.push(s);return n}function fe(t,e){let r=e?.detectFn??W,n=e?.hubComparator??Di,s=r(t.nodes,e),o=Mi(t,s),i=Ri(t.nodes,s,o,n);return{features:Li(s,i),unassigned:Gi(t.nodes,s,i)}}var xn=new Set(["typescript","javascript","python","go","scss","less","lua","coffeescript"]),bn=new Set(["typescript","javascript","python"]),Be=new Set(["typescript","javascript","go","python"]);function zt(t){let e=new Map;for(let r of t.nodes.values())e.set(r.type,(e.get(r.type)??0)+1);return[...e.entries()].map(([r,n])=>({type:r,fileCount:n,exportsTracked:xn.has(r),importSymbolsTracked:bn.has(r),callEdgesTracked:Be.has(r)})).sort((r,n)=>n.fileCount-r.fileCount)}var me=class{constructor(e){this.nodes=e}nodes;findUnusedFiles(e){let r=new Set(this.nodes.keys());return e.filter(n=>!r.has(n))}findHighExportUsage(e){let r=[];for(let n of this.nodes.values()){if(n.maxExportUsage===void 0||n.maxExportUsage<e)continue;let s=n.imports.reduce((o,i)=>(i.exportUsageRatio??0)>(o?.exportUsageRatio??0)?i:o,null);r.push({path:n.path,maxExportUsage:n.maxExportUsage,tightestDep:s?.toPath??""})}return r.sort((n,s)=>s.maxExportUsage-n.maxExportUsage)}findCycles(){let e=[],r=new Set,n=new Set,s=[],o=i=>{r.add(i),n.add(i),s.push(i);let a=this.nodes.get(i);if(a){for(let c of a.imports)if(!(!c.toPath||c.isExternal))if(n.has(c.toPath)){let l=s.indexOf(c.toPath);e.push([...s.slice(l),c.toPath])}else r.has(c.toPath)||o(c.toPath)}n.delete(i),s.pop()};for(let i of this.nodes.keys())r.has(i)||o(i);return e}};var I=class t{constructor(e){this.nodes=e}nodes;_incomingEdgesCache=null;_callIncomingCache=null;serialize(){return{nodes:Array.from(this.nodes.values())}}static deserialize(e){let r=new Map;for(let n of e.nodes)r.set(n.path,n);return new t(r)}getIncomingEdgesMap(){if(this._incomingEdgesCache)return this._incomingEdgesCache;let e=new Map;for(let r of this.nodes.values())for(let n of r.imports)if(n.toPath){let s=e.get(n.toPath)||[];s.push(r.path),e.set(n.toPath,s)}return this._incomingEdgesCache=e,e}dfs(e,r,n,s){let o=new Set,i=n.maxDepth??1/0,a=(c,l,p)=>{if(l>i||o.has(c))return;let u=this.nodes.get(c);if(u&&(o.add(c),r(u,l,p)!==!1))for(let g of s(c))a(g,l+1,c)};a(e,0,null)}traverse(e,r,n={}){let s=n.direction??"outgoing",o=s==="incoming"?this.getIncomingEdgesMap():null;this.dfs(e,r,n,i=>s==="outgoing"?this.nodes.get(i)?.imports.map(a=>a.toPath).filter(Boolean)??[]:o?.get(i)??[])}getCallIncomingCache(){if(this._callIncomingCache)return this._callIncomingCache;let e=new Map;for(let r of this.nodes.values())for(let n of r.callEdges??[]){let s=e.get(n.toFile)??[];s.push(r.path),e.set(n.toFile,s)}return this._callIncomingCache=e,e}traverseCalls(e,r,n={}){let s=n.direction??"outgoing",o=s==="incoming"?this.getCallIncomingCache():null;this.dfs(e,r,n,i=>s==="outgoing"?this.nodes.get(i)?.callEdges?.map(a=>a.toFile)??[]:o?.get(i)??[])}getCallers(e){let r=[];return this.traverseCalls(e,n=>(n.path!==e&&r.push(n.path),!0),{direction:"incoming",maxDepth:1}),r}getCallEdgesFor(e){return this.nodes.get(e)?.callEdges??[]}getNeighbors(e){let r=this.nodes.get(e);return r?r.imports.map(n=>this.nodes.get(n.toPath)).filter(n=>n!==void 0):[]}findUnusedFiles(e){return new me(this.nodes).findUnusedFiles(e)}findCycles(){return new me(this.nodes).findCycles()}};var z=class{affectedSymbols=new Map;constructor(e,r){this.affectedSymbols.set(e,new Set(["default",...r]))}updateAffectedSymbols(e,r){let n=this.affectedSymbols.get(r)||new Set,s=e.imports.find(c=>c.toPath===r);if(!s)return!1;let o=s.symbols||["*"],i=new Set;for(let c of o)(c==="*"||n.has("*")||n.has(c))&&i.add("*");if(i.size===0)return!1;let a=this.affectedSymbols.get(e.path)||new Set;for(let c of i)a.add(c);return this.affectedSymbols.set(e.path,a),!0}};function ge(t,e){let r=t.nodes.get(e);if(r)return{category:r.category,exports:r.exports.map(n=>n.name)}}function $t(t,e,r=1){let n=[];return t.traverse(e,(s,o,i)=>{if(s.path===e)return!0;let a=i?t.nodes.get(i)?.imports.find(c=>c.toPath===s.path):void 0;return n.push({path:s.path,...a?.symbols?{symbols:a.symbols}:{}}),!0},{direction:"outgoing",maxDepth:r}),n}function de(t,e){let r=[];return t.traverse(e,n=>{if(n.path===e)return!0;let s=n.imports.find(o=>o.toPath===e);return r.push({path:n.path,...s?.symbols?{symbols:s.symbols}:{}}),!0},{direction:"incoming",maxDepth:1}),r}function Bt(t,e,r={}){let{testsOnly:n=!1,changedSymbols:s}=r,o=s?new z(e,s):null,i=[];return t.traverse(e,(a,c,l)=>{if(a.path===e)return!0;if(o&&l&&!o.updateAffectedSymbols(a,l))return!1;let p=a.category==="test"||a.tags.some(u=>u.name==="test");return(!n||p)&&i.push(a.path),!0},{direction:"incoming"}),i}function Ut(t,e,r={}){let{depth:n=1,withEdgeDetail:s=!1}=r,o=[];return t.traverseCalls(e,i=>{if(i.path===e)return!0;let a={file:i.path};return s&&(a.edges=(i.callEdges??[]).filter(c=>c.toFile===e).map(c=>({from:c.from,to:c.to}))),o.push(a),!0},{direction:"incoming",maxDepth:n}),o}function Kt(t,e={}){let{metric:r="cognitiveComplexity",threshold:n=10,limit:s=20}=e;return[...t.nodes.values()].flatMap(o=>(o.functions??[]).filter(i=>i[r]>=n).map(i=>({file:o.path,name:i.name,line:i.line,complexity:i.complexity,cognitiveComplexity:i.cognitiveComplexity}))).sort((o,i)=>i[r]-o[r]).slice(0,s)}function Ht(t){return{nodes:t.nodes.map(r=>({path:r.path,type:r.type,category:r.category,exports:r.exports.map(n=>n.name),tags:r.tags.filter(n=>n.kind==="comment-marker"||n.kind==="import").map(n=>n.name),importsFiles:r.imports.filter(n=>!n.isExternal&&n.toPath).map(n=>n.toPath),...r.description!==void 0&&{description:r.description},...r.testedBy!==void 0&&{testedBy:r.testedBy},...r.coveragePct!==void 0&&{coveragePct:r.coveragePct},...r.avgExportUsage!==void 0&&{avgExportUsage:r.avgExportUsage},...r.maxExportUsage!==void 0&&{maxExportUsage:r.maxExportUsage}})),cycles:t.cycles}}function Jt(t){let e=t.getPackageDependencies(),r=Array.from(t.packages.values()).map(({graph:n,pkg:s})=>({name:s.name,relativeRoot:s.relativeRoot,nodeCount:n.nodes.size,dependsOn:e.get(s.name)??[]}));return{monorepoType:t.type,packageCount:r.length,packages:r}}function Vt(t){return[...t.nodes.values()].some(e=>e.coveragePct!==void 0)}function Sn(t){if(t.category==="test")return"test";if(t.category==="config")return"config";if(t.category==="type-only")return"types";let e=t.path;return v(e,"component")||v(e,"components")?"component":v(e,"controller")||v(e,"controllers")?"controller":v(e,"middleware")?"middleware":v(e,"router")||v(e,"routes")||v(e,"route")?"router":v(e,"store")||v(e,"stores")?"store":v(e,"service")||v(e,"services")?"service":v(e,"handler")||v(e,"handlers")?"handler":v(e,"adapter")||v(e,"adapters")?"adapter":v(e,"plugin")||v(e,"plugins")?"plugin":v(e,"api")?"api":v(e,"cli")||v(e,"commands")||he(e)==="cli"?"cli":v(e,"util")||v(e,"utils")||v(e,"helper")||v(e,"helpers")?"util":v(e,"model")||v(e,"models")||he(e)==="model"?"model":v(e,"parser")||v(e,"parsers")||he(e)==="parser"?"parser":he(e)==="builder"?"builder":he(e)==="resolver"?"resolver":"other"}function v(t,e){return t.includes(`/${e}/`)||t.includes(`/${e}.`)}function he(t){let e=t.slice(t.lastIndexOf("/")+1);return e.slice(0,e.lastIndexOf("."))||e}function Qt(t,e){let r=fe(t,e),n=new Map;for(let[o,i]of r.features){for(let a of i.files)n.set(a,o);n.set(i.hub,o)}let s=new Map;for(let o of t.nodes.values()){let i=n.get(o.path);s.set(o.path,{path:o.path,role:Sn(o),...o.description?{description:o.description}:{},exports:o.exports.map(a=>a.name),...i?{featureHub:i}:{}})}return s}function qt(t,e){let r=[];for(let n of t.nodes.values())if(n.exports.some(s=>s.name===e))if(Be.has(n.type)){let s=[];for(let o of t.nodes.values())for(let i of o.callEdges??[])i.to===e&&s.push({file:o.path,callerFunction:i.from});r.push({path:n.path,category:n.category,precision:"call",callers:s})}else{let s=de(t,n.path).map(o=>({file:o.path,...o.symbols?{symbols:o.symbols}:{}}));r.push({path:n.path,category:n.category,precision:"file-level",importers:s})}return r}function _i(t){return t?t.startsWith("interface ")?"interface":t.startsWith("class ")?"class":t.startsWith("enum ")?"enum":"type":"type"}function Oi(t,e){if(e==="type-only")return!0;let r=t.signature??"";return r.startsWith("interface ")||r.startsWith("class ")||r.startsWith("enum ")}function Yt(t){let e=new Map;for(let n of t.nodes.values())if(!(n.type!=="typescript"&&n.type!=="javascript"))for(let s of n.exports){if(!Oi(s,n.category))continue;let o=`${n.path}::${s.name}`;e.set(o,{name:s.name,file:n.path,kind:_i(s.signature),...s.doc?{doc:s.doc}:{}})}let r=[];for(let n of t.nodes.values())if(!(n.type!=="typescript"&&n.type!=="javascript")){for(let s of n.imports)if(!(!s.toPath||s.isExternal||!s.symbols?.length))for(let o of s.symbols)e.has(`${s.toPath}::${o}`)&&r.push({fromFile:n.path,toType:o,toFile:s.toPath})}return{types:e,edges:r}}function Xt(t,e){let r=null;for(let o of t.types.values())if(o.name===e){r=o;break}if(!r)return{type:null,usedByFiles:[],uses:[]};let n=new Set,s=new Map;for(let o of t.edges)if(o.toType===e&&o.toFile===r.file&&n.add(o.fromFile),o.fromFile===r.file){let i=t.types.get(`${o.toFile}::${o.toType}`);i&&s.set(`${i.file}::${i.name}`,i)}return{type:r,usedByFiles:Array.from(n),uses:Array.from(s.values())}}var Ln=d(require("path"));var Ke=d(require("fs")),tr=d(require("path"));var ee=d(require("fs")),A=d(require("path"));var Zt=d(require("fs")),ji=d(require("path"));function kn(t){try{return Zt.default.statSync(t,{throwIfNoEntry:!1})?.isDirectory()===!0}catch{return!1}}function Ue(t){try{return Zt.default.statSync(t,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}function er(t,e){let r=A.default.join(e,"package.json");if(!ee.default.existsSync(r))return null;let n={};try{n=JSON.parse(ee.default.readFileSync(r,"utf-8"))}catch{return null}let s=n.name;return s?{name:s,root:e,relativeRoot:A.default.relative(t,e),entryPoints:Wi(e,n)}:null}function Wi(t,e){let r=[];if(e.exports){let s=e.exports;if(typeof s=="string")r.push(A.default.join(t,s));else if(typeof s=="object"&&s!==null){let o=s["."];if(typeof o=="string")r.push(A.default.join(t,o));else if(typeof o=="object"&&o!==null){let i=o.import??o.require??o.default;typeof i=="string"&&r.push(A.default.join(t,i))}}}e.main&&r.push(A.default.join(t,e.main));for(let s of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"])r.push(A.default.join(t,s));let n=r.filter(Ue);return n.length>0?n.slice(0,1):r.slice(0,1)}function te(t,e){let r=[],n=new Set;for(let s of e){let o=s.replace(/\/$/,"").replace(/^\.\//,"");zi(t,o,n,r)}return r}function zi(t,e,r,n){if(!e.includes("*")){$i(t,e,r,n);return}let s=e.split("/");s.includes("**")?Bi(t,s,r,n):Ui(t,s,r,n)}function $i(t,e,r,n){let s=A.default.join(t,e);if(r.has(s)||!kn(s))return;r.add(s);let o=er(t,s);o&&n.push(o)}function Bi(t,e,r,n){let s=A.default.join(t,e[0]==="**"?"":e[0]??"");vn(t,s,r,n)}function Ui(t,e,r,n){let s=e.findIndex(a=>a.includes("*")),o=A.default.join(t,...e.slice(0,s)),i;try{i=ee.default.readdirSync(o,{withFileTypes:!0})}catch{return}for(let a of i){if(!a.isDirectory())continue;let c=A.default.join(o,a.name);if(r.has(c))continue;r.add(c);let l=er(t,c);l&&n.push(l)}}function vn(t,e,r,n){let s;try{s=ee.default.readdirSync(e,{withFileTypes:!0})}catch{return}for(let o of s){if(!o.isDirectory()||o.name==="node_modules"||o.name.startsWith("."))continue;let i=A.default.join(e,o.name);if(ee.default.existsSync(A.default.join(i,"package.json"))&&!r.has(i)){r.add(i);let a=er(t,i);a&&n.push(a)}else vn(t,i,r,n)}}var Cn={type:"npm",detect(t){let e=tr.default.join(t,"package.json");if(!Ke.default.existsSync(e))return null;let r;try{r=JSON.parse(Ke.default.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!r||Ke.default.existsSync(tr.default.join(t,"yarn.lock")))return null;let n=Array.isArray(r)?r:r.packages??[];return n.length===0?null:te(t,n)}};var $=d(require("fs")),T=d(require("path"));var wn={type:"nx",detect(t){return $.default.existsSync(T.default.join(t,"nx.json"))?Fn(t,t,new Set,0).map(r=>Ki(t,r,T.default.join(r,"project.json"))).filter(r=>r!==null):null}};function Fn(t,e,r,n){if(n>4)return[];let s;try{s=$.default.readdirSync(e,{withFileTypes:!0})}catch{return[]}let o=[];for(let i of s){if(!i.isDirectory())continue;let a=i.name;if(a.startsWith(".")||a==="node_modules"||a==="dist"||a===".nx")continue;let c=T.default.join(e,a);$.default.existsSync(T.default.join(c,"project.json"))&&!r.has(c)?(r.add(c),o.push(c)):o.push(...Fn(t,c,r,n+1))}return o}function Ki(t,e,r){let n={};try{n=JSON.parse($.default.readFileSync(r,"utf-8"))}catch{return null}let s=n.name,o,i,a=T.default.join(e,"package.json");if($.default.existsSync(a))try{let c=JSON.parse($.default.readFileSync(a,"utf-8"));s=c.name??s,o=c.main,i=c.exports}catch{}return s?{name:s,root:e,relativeRoot:T.default.relative(t,e),entryPoints:Hi(e,n,o,i)}:null}function Hi(t,e,r,n){let s=[],o=e.targets?.build?.options?.main??e.targets?.build?.options?.entryFile;if(o){let a=T.default.resolve(t,"../..");s.push(T.default.resolve(a,o)),s.push(T.default.resolve(t,o))}if(n){let a=n;if(typeof a=="string")s.push(T.default.join(t,a));else if(typeof a=="object"&&a!==null){let c=a["."];typeof c=="string"&&s.push(T.default.join(t,c))}}if(r&&s.push(T.default.join(t,r)),e.sourceRoot){let a=T.default.resolve(t,"../.."),c=T.default.resolve(a,e.sourceRoot);s.push(T.default.join(c,"index.ts"),T.default.join(c,"index.tsx"))}for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx"])s.push(T.default.join(t,a));let i=s.filter(Ue);return i.length>0?i.slice(0,1):s.slice(0,1)}var rr=d(require("fs")),Tn=d(require("path")),En=require("js-yaml");var An={type:"pnpm",detect(t){let e=Tn.default.join(t,"pnpm-workspace.yaml");if(!rr.default.existsSync(e))return null;let r=[];try{r=(0,En.load)(rr.default.readFileSync(e,"utf-8"))?.packages??[]}catch{return null}return te(t,r)}};var Pn=d(require("fs")),Nn=d(require("path")),In={type:"turborepo",detect(t){return Pn.default.existsSync(Nn.default.join(t,"turbo.json"))?[]:null}};var He=d(require("fs")),nr=d(require("path"));var Dn={type:"yarn",detect(t){if(!He.default.existsSync(nr.default.join(t,"yarn.lock")))return null;let e=nr.default.join(t,"package.json");if(!He.default.existsSync(e))return null;let r;try{r=JSON.parse(He.default.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!r)return null;let n=Array.isArray(r)?r:r.packages??[];return n.length===0?null:te(t,n)}};var Mn=[];function L(t){Mn.push(t)}function Rn(){return Mn}L(In);L(wn);L(An);L(Dn);L(Cn);function ye(t,e=Rn()){let r=Ln.default.resolve(t),n=new Map,s=[];for(let i of e){let a=i.detect(r);if(a!==null){s.push(i.type);for(let c of a)n.has(c.name)||n.set(c.name,c)}}if(s.length===0)return{root:r,type:"none",types:[],packages:[],packageMap:new Map};let o=Array.from(n.values());return{root:r,type:s[0],types:s,packages:o,packageMap:new Map(o.map(i=>[i.name,i]))}}var xe=class t{constructor(e,r){this.monorepoRoot=e;this.type=r}monorepoRoot;type;packages=new Map;addPackage(e,r){this.packages.set(e.name,{graph:r,pkg:e})}getPackageForFile(e){for(let{pkg:r}of this.packages.values())if(e===r.relativeRoot||e.startsWith(`${r.relativeRoot}/`))return r}getPackageDependencies(){let e=new Map;for(let{graph:r,pkg:n}of this.packages.values()){let s=new Set;for(let o of r.nodes.values())for(let i of o.imports)i.isWorkspace&&i.workspacePackage&&s.add(i.workspacePackage);e.set(n.name,[...s])}return e}getAffectedAcrossPackages(e){let r=this.getPackageForFile(e);if(!r)return[];let n=this.packages.get(r.name);if(!n)return[];let s=[];n.graph.traverse(e,o=>(o.path!==e&&s.push({file:o.path,package:r.name}),!0),{direction:"incoming"});for(let{graph:o,pkg:i}of this.packages.values())if(i.name!==r.name)for(let a of o.nodes.values())a.imports.some(l=>l.isWorkspace&&l.workspacePackage===r.name)&&s.push({file:a.path,package:i.name});return s}serialize(){return{monorepoRoot:this.monorepoRoot,type:this.type,packages:Array.from(this.packages.values()).map(({graph:e,pkg:r})=>({pkg:{name:r.name,relativeRoot:r.relativeRoot,entryPoints:r.entryPoints},nodes:Array.from(e.nodes.values())}))}}static deserialize(e){let r=new t(e.monorepoRoot,e.type);for(let{pkg:n,nodes:s}of e.packages){let o=new Map(s.map(a=>[a.path,a])),i=new I(o);r.packages.set(n.name,{graph:i,pkg:{...n,root:""}})}return r}};var Gn=new Map;function re(t,e){Gn.set(t,e)}function _n(t){return Gn.get(t)}function On(t,e){return e.startsWith("!")?t!==e.slice(1):t===e}function Ji(t,e){return e.startsWith("!")?!t.includes(e.slice(1)):t.includes(e)}var Vi=(t,e)=>!e.category||On(t.category,e.category),Qi=(t,e)=>!e.type||On(t.type,e.type),qi=(t,e)=>e.lastAuthor?e.lastAuthor.startsWith("!")?t.lastAuthor!==e.lastAuthor.slice(1):t.lastAuthor!==void 0&&t.lastAuthor===e.lastAuthor:!0,Yi=(t,e)=>!e.path||Ji(t.path,e.path),Xi=(t,e)=>e.isExternal===void 0?!0:t.imports.some(n=>n.isExternal)===e.isExternal,Zi=(t,e)=>{if(!e.tags||e.tags.length===0)return!0;let r=e.tags.filter(s=>!s.startsWith("!")),n=e.tags.filter(s=>s.startsWith("!")).map(s=>s.slice(1));return!(r.length>0&&!r.some(s=>t.tags.some(o=>o.name===s))||n.some(s=>t.tags.some(o=>o.name===s)))},ea=(t,e)=>!e.allTags?.length||e.allTags.every(r=>t.tags.some(n=>n.name===r)),ta=(t,e)=>!e.importsFile||t.imports.some(r=>r.toPath?.includes(e.importsFile)),ra=(t,e,r)=>e.importedBy===void 0?!0:(r?.get(t.path)??[]).some(s=>s.includes(e.importedBy)),na=(t,e)=>e.minImports===void 0||t.imports.length>=e.minImports,sa=(t,e)=>e.maxImports===void 0||t.imports.length<=e.maxImports,oa=(t,e)=>e.minSize===void 0||t.size>=e.minSize,ia=(t,e)=>e.maxSize===void 0||t.size<=e.maxSize,aa=(t,e)=>e.hasDocstring===void 0||!!t.description===e.hasDocstring,ca=(t,e)=>e.isDocumented===void 0||!!t.documentedBy?.length===e.isDocumented,la=(t,e)=>e.isStale===void 0||!!t.staleFor?.length===e.isStale,pa=(t,e)=>e.minCoverage===void 0||(t.coveragePct??101)>=e.minCoverage,ua=(t,e)=>e.maxCoverage===void 0||(t.coveragePct??0)<=e.maxCoverage,fa=(t,e)=>e.minExportUsage===void 0||(t.avgExportUsage??-1)>=e.minExportUsage,ma=(t,e)=>e.maxExportUsage===void 0||(t.avgExportUsage??0)<=e.maxExportUsage,ga=(t,e)=>e.minComplexity===void 0||(t.complexity??-1/0)>=e.minComplexity,da=(t,e)=>e.maxComplexity===void 0||(t.complexity??0)<=e.maxComplexity,ha=(t,e)=>e.minCognitiveComplexity===void 0||(t.cognitiveComplexity??-1/0)>=e.minCognitiveComplexity,ya=(t,e)=>e.maxCognitiveComplexity===void 0||(t.cognitiveComplexity??0)<=e.maxCognitiveComplexity,xa=(t,e)=>e.minCommits===void 0||(t.commitCount90d??-1/0)>=e.minCommits,ba=(t,e)=>e.maxCommits===void 0||(t.commitCount90d??0)<=e.maxCommits,Sa=(t,e,r)=>!e.any?.length||e.any.some(n=>be(t,n,r)),ka=[Vi,Qi,qi,Yi,Xi,Zi,ea,ta,ra,na,sa,oa,ia,aa,ca,la,pa,ua,fa,ma,ga,da,ha,ya,xa,ba,Sa];function be(t,e,r){return ka.every(n=>n(t,e,r))}function Je(t,e){let r=new Map;if(e.importedBy!==void 0){for(let i of t.nodes)for(let a of i.imports)if(a.toPath){let c=r.get(a.toPath)??[];c.push(i.path),r.set(a.toPath,c)}}let n=t.nodes.filter(i=>be(i,e,r)),s=new Set(n.map(i=>i.path)),o=n.map(i=>({...i,imports:i.imports.filter(a=>!a.toPath||s.has(a.toPath))}));if(e.sort){let i=e.sortDir==="asc"?-1:1;o.sort((a,c)=>{let l=0;return e.sort==="size"?l=c.size-a.size:e.sort==="imports"?l=c.imports.length-a.imports.length:e.sort==="commitCount90d"?l=(c.commitCount90d??0)-(a.commitCount90d??0):e.sort==="exportUsage"?l=(c.avgExportUsage??0)-(a.avgExportUsage??0):e.sort==="complexity"?l=(c.complexity??0)-(a.complexity??0):e.sort==="cognitiveComplexity"&&(l=(c.cognitiveComplexity??0)-(a.cognitiveComplexity??0)),l*i})}return e.limit!==void 0&&o.splice(e.limit),{nodes:o,cycles:t.cycles?.filter(i=>i.every(a=>s.has(a)))??void 0}}function jn(t,e){let r=e.indexOf(":");if(r===-1)return;let n=e.slice(0,r).trim().toLowerCase(),s=e.slice(r+1).trim();if(!(!n||!s))switch(n){case"category":t.category=s;break;case"type":t.type=s;break;case"tag":case"tags":s.includes("+")?t.allTags=[...t.allTags??[],...s.split("+")]:t.tags=[...t.tags??[],s];break;case"path":t.path=s;break;case"external":t.isExternal=s.toLowerCase()==="true";break;case"importsfile":t.importsFile=s;break;case"importedby":t.importedBy=s;break;case"minimports":t.minImports=parseInt(s,10);break;case"maximports":t.maxImports=parseInt(s,10);break;case"minsize":t.minSize=parseInt(s,10);break;case"maxsize":t.maxSize=parseInt(s,10);break;case"sort":t.sort=s;break;case"sortdir":t.sortDir=s.toLowerCase()==="asc"?"asc":"desc";break;case"limit":t.limit=parseInt(s,10);break;case"hasdocstring":t.hasDocstring=s.toLowerCase()!=="false";break;case"mincoverage":t.minCoverage=parseInt(s,10);break;case"maxcoverage":t.maxCoverage=parseInt(s,10);break;case"minexportusage":t.minExportUsage=parseFloat(s);break;case"maxexportusage":t.maxExportUsage=parseFloat(s);break;case"mincomplexity":t.minComplexity=parseInt(s,10);break;case"maxcomplexity":t.maxComplexity=parseInt(s,10);break;case"mincognitivecomplexity":t.minCognitiveComplexity=parseInt(s,10);break;case"maxcognitivecomplexity":t.maxCognitiveComplexity=parseInt(s,10);break;case"mincommits":t.minCommits=parseInt(s,10);break;case"maxcommits":t.maxCommits=parseInt(s,10);break;case"isdocumented":t.isDocumented=s.toLowerCase()!=="false";break;case"isstale":t.isStale=s.toLowerCase()!=="false";break;case"lastauthor":t.lastAuthor=s;break}}function va(t){let e=[];for(let r of t.split("|")){let n=r.trim();if(!n)continue;let s={};jn(s,n),Object.keys(s).length>0&&e.push(s)}return e}function Ve(t){let e={},r=t.split(",");for(let n of r){let s=n.trim();if(s.toLowerCase().startsWith("any(")&&s.endsWith(")")){let o=s.slice(4,-1),i=va(o);i.length>0&&(e.any=[...e.any??[],...i]);continue}jn(e,n)}return e}var xr=d(require("fs/promises")),Xn=d(require("path"));var nt=d(require("path")),Se=d(require("typescript"));var $n=d(require("path"));var zn=d(require("path")),F=d(require("typescript")),Wn=new Set(["describe","test","it"]);function B(t,e){let r=t[e];if(r===void 0)throw new Error(`Index ${e} out of bounds (length ${t.length})`);return r}function sr(t){let e=[];for(let r of t.statements){if(!F.default.isExpressionStatement(r))continue;let n=r.expression;if(!F.default.isCallExpression(n))continue;let s=n.expression;F.default.isIdentifier(s)&&Wn.has(s.text)&&e.push(n),F.default.isPropertyAccessExpression(s)&&F.default.isIdentifier(s.expression)&&Wn.has(s.expression.text)&&e.push(n)}return e}function or(t,e,r){for(let n of t.arguments){if(!F.default.isObjectLiteralExpression(n))continue;let s=n.properties.find(o=>F.default.isPropertyAssignment(o)&&F.default.isIdentifier(o.name)&&o.name.text===e);if(!(!s||!F.default.isArrayLiteralExpression(s.initializer)))return s.initializer.elements.filter(F.default.isStringLiteral).map(o=>o.text)}return null}function ir(t,e,r,n){if(t.arguments.length===0)return null;for(let o=1;o<t.arguments.length;o++){let i=B(t.arguments,o);if(!F.default.isObjectLiteralExpression(i))continue;let a=i.properties.find(l=>F.default.isPropertyAssignment(l)&&F.default.isIdentifier(l.name)&&l.name.text===e);if(a)return{start:a.initializer.getStart(n),end:a.initializer.getEnd(),text:r};let c=i.getEnd()-1;return{start:c,end:c,text:`${i.properties.length>0?", ":""}${e}: ${r}`}}let s=B(t.arguments,t.arguments.length-1);return{start:s.getStart(n),end:s.getStart(n),text:`{ ${e}: ${r} }, `}}function ar(t,e,r){let n=t.arguments;for(let s=1;s<n.length;s++){let o=B(n,s);if(!F.default.isObjectLiteralExpression(o))continue;let i=o.properties.findIndex(c=>F.default.isPropertyAssignment(c)&&F.default.isIdentifier(c.name)&&c.name.text===e);if(i<0)continue;if(o.properties.length===1)return{start:B(n,s-1).getEnd(),end:o.getEnd(),text:""};let a=B(o.properties,i);return i===o.properties.length-1?{start:B(o.properties,i-1).getEnd(),end:a.getEnd(),text:""}:{start:a.getStart(r),end:B(o.properties,i+1).getStart(r),text:""}}return null}function cr(t,e){let r=[...e].sort((s,o)=>o.start-s.start),n=t;for(let s of r)n=n.slice(0,s.start)+s.text+n.slice(s.end);return n}function lr(t){return`[${t.map(e=>JSON.stringify(e)).join(", ")}]`}var M=new Set([".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"]);function Ca(t){return t.map(e=>e.startsWith("@")?e.slice(1):e)}function Qe(t,e,r,n){let s=F.default.createSourceFile(zn.default.basename(t),e,F.default.ScriptTarget.Latest,!0),o=sr(s),[i]=o;if(!i)return e;let a=or(i,n,s),c=[...r].sort();if(a!==null&&JSON.stringify(Ca(a).sort())===JSON.stringify(c))return e;let l=lr(c.map(u=>`@${u}`)),p=o.flatMap(u=>{let g=r.length===0?ar(u,n,s):ir(u,n,l,s);return g?[g]:[]});return p.length>0?cr(e,p):e}var qe=class{name="cypress";canHandle(e){return M.has($n.default.extname(e).toLowerCase())}apply(e,r,n){return Qe(e,r,n,"tags")}};var Bn=d(require("path")),pr=/# <mokosh-tags>[\s\S]*?# <\/mokosh-tags>\n*/,ur=/^@([a-zA-Z0-9_-]+)/gm;function wa(t){return`${["# <mokosh-tags>",...t.map(e=>`@${e}`),"# </mokosh-tags>"].join(`
|
|
10
12
|
`)}
|
|
11
13
|
|
|
12
|
-
`}function
|
|
13
|
-
`}function
|
|
14
|
-
${r.slice(c)}`}};var
|
|
14
|
+
`}function Fa(t){let e=new Set;ur.lastIndex=0;let r=ur.exec(t);for(;r!==null;)r[1]&&e.add(r[1]),r=ur.exec(t);return e}var Ye=class{name="gherkin";canHandle(e){return Bn.default.extname(e).toLowerCase()===".feature"}apply(e,r,n){let s=r.replace(pr,""),o=Fa(s),i=n.filter(c=>!o.has(c)),a=i.length>0?wa(i):"";return pr.test(r)?r.replace(pr,a):a?r.replace(/^(Feature:)/m,`${a}$1`):r}};function Un(t,e){let r=t.replace(/\\/g,"/"),n=e.replace(/\\/g,"/"),s="";for(let o=0;o<r.length;o++){let i=r[o];i==="*"?r[o+1]==="*"?(s+=".*",o++):s+="[^/]*":i==="?"?s+="[^/]":i!==void 0&&(s+=i.replace(/[.+^${}()|[\]\\]/g,"\\$&"))}return new RegExp(`^${s}$`).test(n)}var Kn=d(require("path")),fr=/^\/\/go:build mokosh_[^\n]+\n/m,Ta=/^package\s+\S+/m;function Ea(t){return`//go:build ${t.map(r=>`mokosh_${r}`).join(" || ")}
|
|
15
|
+
`}function Aa(t){let e=fr.exec(t);if(!e)return null;let r=e[0]??"",n=/mokosh_([a-zA-Z0-9_-]+)/g,s=[],o=n.exec(r);for(;o!==null;)o[1]&&s.push(o[1]),o=n.exec(r);return s}var Xe=class{name="go";canHandle(e){return Kn.default.basename(e).endsWith("_test.go")}apply(e,r,n){let s=Aa(r),o=[...n].sort();if(s!==null&&JSON.stringify([...s].sort())===JSON.stringify(o))return r;if(n.length===0)return r.replace(fr,"");let i=Ea(o);if(s!==null)return r.replace(fr,i);let a=Ta.exec(r);if(!a)return r;let c=a.index;return`${r.slice(0,c)+i}
|
|
16
|
+
${r.slice(c)}`}};var Hn=d(require("path"));var Pa=/^\/\*\*\n(?: \* @group .+\n)+ \*\/\n+/,mr=/^ \* @group (.+)$/gm;function Na(t){return`${["/**",...t.map(e=>` * @group ${e}`)," */"].join(`
|
|
15
17
|
`)}
|
|
16
18
|
|
|
17
|
-
`}function
|
|
19
|
+
`}function Ia(t){let e=[];mr.lastIndex=0;let r=mr.exec(t);for(;r!==null;)r[1]&&e.push(r[1]),r=mr.exec(t);return e}var Ze=class{name="jest";canHandle(e){return M.has(Hn.default.extname(e).toLowerCase())}apply(e,r,n){let s=Pa.exec(r),o=s?Ia(s[0]):null,i=[...n].sort();if(o!==null&&JSON.stringify([...o].sort())===JSON.stringify(i))return r;let a=s?r.slice(s[0].length):r;return n.length===0?a:Na(i)+a}};var Jn=d(require("path"));var et=class{name="playwright";canHandle(e){return M.has(Jn.default.extname(e).toLowerCase())}apply(e,r,n){return Qe(e,r,n,"tag")}};var Vn=d(require("path")),gr=/^pytestmark\s*=\s*.+$/m,Da=/^import pytest\s*$/m;function Ma(t){let e=t.map(r=>`pytest.mark.${r}`).join(", ");return t.length===1?`pytestmark = pytest.mark.${t[0]}`:`pytestmark = [${e}]`}function Ra(t){let e=gr.exec(t);if(!e)return null;let r=e[0],n=[],s=/pytest\.mark\.([a-zA-Z0-9_-]+)/g,o=s.exec(r);for(;o!==null;)o[1]&&n.push(o[1]),o=s.exec(r);return n}var tt=class{name="pytest";canHandle(e){return Vn.default.extname(e).toLowerCase()===".py"}apply(e,r,n){let s=Ra(r),o=[...n].sort();if(s!==null&&JSON.stringify([...s].sort())===JSON.stringify(o))return r;if(n.length===0)return r.replace(gr,"").replace(/\n{3,}/g,`
|
|
18
20
|
|
|
19
|
-
`);let i=
|
|
21
|
+
`);let i=Ma(o);if(s!==null)return r.replace(gr,i);let a=Da.test(r),c=La(r),l=r.slice(0,c),p=r.slice(c),u=a?"":`import pytest
|
|
20
22
|
`,g=l.endsWith(`
|
|
21
23
|
|
|
22
24
|
`)?"":`
|
|
23
25
|
`;return`${l+g+u+i}
|
|
24
|
-
${p}`}};function
|
|
25
|
-
`),r=-1;return e.forEach((s,o)=>{(s.trimStart().startsWith("import ")||s.trimStart().startsWith("from "))&&(r=o)}),r<0?0:e.slice(0,r+1).reduce((s,o)=>s+o.length+1,0)}var
|
|
26
|
-
`).map(o=>o.trim()).filter(o=>o!=="")}catch{return[]}});return Array.from(new Set(r))}catch(e){return console.error("Error getting git diff:",e),[]}}},
|
|
27
|
-
`)){if(s.startsWith("\0")){let[,c,l]=s.slice(1).split(" ");r=c??"",n=l?Number(l)*1e3:0;continue}if(s==="")continue;let o=s.split(" "),i=o[0];if(!i)continue;let a=i.startsWith("R")||i.startsWith("C")?o[2]:o[1];a&&e(a,r,n)}}function
|
|
28
|
-
`&&r++;return r}function $a(t,e){let r=1;function n(s){switch(s.type.name){case"IfStatement":case"ForStatement":r++;break;case"Case":{s.firstChild?.type.name==="case"&&r++;break}case"LogicOp":{let i=e.slice(s.from,s.to);(i==="&&"||i==="||")&&r++;break}}let o=s.firstChild;for(;o;)n(o),o=o.nextSibling}return n(t),r}function Ba(t,e){let r=0;function n(s,o,i){let a=s.type.name;if(a==="IfStatement"){r+=i?1:1+o;let p=K(s),u=i?o:o+1,g=p[1];g&&g.type.name!=="Block"&&n(g,u,!1);let h=p.find(x=>x.type.name==="Block");h&&n(h,u,!1);let k=p.findIndex(x=>x.type.name==="else");if(k>=0){let x=p[k+1];x?.type.name==="IfStatement"?n(x,o,!0):x&&(r+=1,n(x,o+1,!1))}return}if(a==="ForStatement"||a==="SwitchStatement"||a==="SelectStatement"){r+=1+o;let p=s.firstChild;for(;p;)n(p,o+1,!1),p=p.nextSibling;return}if(a==="LogicOp"){let p=e.slice(s.from,s.to);(p==="&&"||p==="||")&&(r+=1)}if(o>0&&a==="FunctionLiteral"){r+=1+o;let p=s.firstChild;for(;p;)n(p,o+1,!1),p=p.nextSibling;return}let l=s.firstChild;for(;l;)n(l,o,!1),l=l.nextSibling}return n(t,0,!1),r}function nt(t,e){return{complexity:$a(t,e),cognitiveComplexity:Ba(t,e)}}function dr(t,e){let n=t.getChild("Parameters")?.getChild("Parameter"),s=n?.getChild("TypeName")??n?.getChild("PointerType")?.getChild("TypeName");return s?e.slice(s.from,s.to):void 0}function Zn(t,e){let r=[],n=t.cursor();do if(n.name==="FunctionDecl"){let s=n.node.getChild("DefName");if(s){let o=e.slice(s.from,s.to),{complexity:i,cognitiveComplexity:a}=nt(n.node,e);r.push({name:o,line:Se(e,n.from),complexity:i,cognitiveComplexity:a})}}else if(n.name==="MethodDecl"){let s=n.node.getChild("FieldName");if(s){let o=e.slice(s.from,s.to),i=dr(n.node,e),a=i?`${i}.${o}`:o,{complexity:c,cognitiveComplexity:l}=nt(n.node,e);r.push({name:a,line:Se(e,n.from),complexity:c,cognitiveComplexity:l})}}while(n.next());return r}var Ua=/\/\/\s*@tag\s+([a-zA-Z0-9_-]+)/,Ka=/^\/\/go:build\s+(.+)$/,Ja=/^\/\/\s*\+build\s+(.+)$/;function ns(t,e){let r=[],n=new Map,s=new Set,o=new Set,i=new Map,a=rs.parser.parse(e),c=a.cursor();do switch(c.name){case"LineComment":{let y=e.slice(c.from,c.to),w=y.match(Ua);w?.[1]&&s.add(w[1]);let I=y.match(Ka);I&&es(I[1],o);let N=y.match(Ja);N&&es(N[1],o);break}case"ImportSpec":{let y=c.node.getChild("String");if(y){let I=e.slice(y.from,y.to).slice(1,-1);r.push({fromPath:t,toPath:"",rawSpecifier:I,isExternal:!0,isStyle:!1,type:"static"});let N=c.node.getChild("DefName"),O=N?e.slice(N.from,N.to):I.split("/").pop();O&&O!=="_"&&O!=="."&&i.set(O,I)}break}case"FunctionDecl":case"MethodDecl":case"TypeDecl":case"VarDecl":case"ConstDecl":{let y=c.node.getChild("DefName")??c.node.getChild("FieldName")??c.node.getChild("TypeSpec")?.getChild("DefName")??c.node.getChild("VarSpec")?.getChild("DefName")??c.node.getChild("ConstSpec")?.getChild("DefName");if(y){let w=e.slice(y.from,y.to);w!=="_"&&/^[A-Z]/.test(w)&&!n.has(w)&&n.set(w,{name:w})}break}}while(c.next());let l=r.some(y=>y.rawSpecifier==="testing"),p=ts.default.basename(t).endsWith("_test.go")||s.has("test")||l?"test":"logic",u=new Set([...s,...o]),{complexity:g,cognitiveComplexity:h}=nt(a.topNode,e),k=Zn(a,e),x=p==="test"?[]:Va(a,e,i);return{imports:r,exports:Array.from(n.values()),tags:Array.from(u).map(y=>({name:y,kind:"comment-marker"})),category:p,rawCallEdges:x,complexity:g,cognitiveComplexity:h,...k.length>0?{functions:k}:{}}}function Va(t,e,r){let n=[];function s(i,a){if(i.type.name==="CallExpr"){let l=i.firstChild;if(l?.type.name==="SelectorExpr"){let p=l.firstChild,u=l.getChild("FieldName");if(p?.type.name==="VariableName"&&u){let g=e.slice(p.from,p.to),h=r.get(g);if(h){let k=e.slice(u.from,u.to);n.push({from:a,to:k,toSpecifier:h})}}}}let c=i.firstChild;for(;c;)s(c,a),c=c.nextSibling}let o=t.cursor();do if(o.name==="FunctionDecl"){let i=o.node.getChild("DefName"),a=o.node.getChild("Block");if(i&&a){let c=e.slice(i.from,i.to);/^[A-Z]/.test(c)&&s(a,c)}}else if(o.name==="MethodDecl"){let i=o.node.getChild("FieldName"),a=o.node.getChild("Block");if(i&&a){let c=e.slice(i.from,i.to),l=dr(o.node,e);s(a,l?`${l}.${c}`:c)}}while(o.next());return n}function es(t,e){for(let r of t.split(/[\s,&|!()]+/)){let n=r.trim();n&&n!=="ignore"&&e.add(n)}}var ss=d(require("livescript"));function J(t){if(t){if(typeof t.value=="string")return t.value;if(typeof t.base?.value=="string")return t.base.value}}function Ha(t){if(!t)return[];if(t.constructor?.name==="Class"){let r=J(t.title);return r?[{name:r}]:[]}if(t.constructor?.name==="Obj"&&Array.isArray(t.items))return t.items.map(r=>J(r.key)??J(r.val)).filter(r=>!!r).map(r=>({name:r}));let e=J(t);return e?[{name:e}]:[]}function Qa(t){let e=t.constructor?.name||t.type;if(e==="Assign"&&t.left?.constructor?.name==="Chain"){let r=t.left,n=J(r.head),o=r.tails?.[0]?.key?.name;if(n==="module"&&o==="exports")return Ha(t.right);if(n==="exports"&&typeof o=="string")return[{name:o}];if(r.head?.verb==="out"&&typeof o=="string")return[{name:o}]}if(e==="Import"&&t.left?.verb==="out"){let r=t.right;if(r?.constructor?.name==="Obj"&&Array.isArray(r.items))return r.items.map(n=>J(n.val)??J(n.key)).filter(n=>!!n).map(n=>({name:n}))}return[]}var qa=new Set(["first_line","first_column","last_line","last_column","line","column"]);function Ya(t,e){let r=t.constructor?.name||t.type;if(r==="Import"){let n=t.right?.value;if(typeof n=="string"){let s=_(n);return{fromPath:e,toPath:"",rawSpecifier:s,isStyle:A(s),type:"static"}}}if(r==="Chain"&&t.head?.value==="require"){let n=t.tails?.[0];if(n?.constructor?.name==="Call"||n?.type==="Call"){let s=n.args?.[0]?.value;if(typeof s=="string"){let o=_(s);return{fromPath:e,toPath:"",rawSpecifier:o,isStyle:A(o),type:"require"}}}}return null}function hr(t,e,r){if(!t||typeof t!="object")return[];let n=[],s=Ya(t,e);s&&n.push(s),r.push(...Qa(t));for(let o in t){if(qa.has(o))continue;let i=t[o];if(!(!i||typeof i!="object"))if(Array.isArray(i))for(let a of i)n.push(...hr(a,e,r));else n.push(...hr(i,e,r))}return n}function os(t,e){let r=re(e),n=ne(t,r),s=[],o=[];try{s=hr(ss.default.ast(e),t,o)}catch{}let i=new Set,a=o.filter(c=>i.has(c.name)?!1:(i.add(c.name),!0));return{imports:s,exports:a,tags:Array.from(r).map(c=>({name:c,kind:"comment-marker"})),category:n}}var is=d(require("luaparse"));function Xa(t,e){let r=[];function n(s){if(!(!s||typeof s!="object")){if((s.type==="CallExpression"||s.type==="StringCallExpression")&&s.base?.type==="Identifier"&&s.base?.name==="require"){let o;if(s.type==="CallExpression"){let i=s.arguments?.[0];i?.type==="StringLiteral"&&(o=_(i.raw))}else if(s.type==="StringCallExpression"){let i=s.argument;i?.type==="StringLiteral"&&(o=_(i.raw))}o&&r.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:A(o),type:"require"})}for(let o in s){if(o==="loc")continue;let i=s[o];if(i&&typeof i=="object")if(Array.isArray(i))for(let a of i)n(a);else n(i)}}}return n(t),r}function Za(t){let e=new Set;for(let r of t)r.type==="LocalStatement"&&r.variables.forEach((n,s)=>{r.init[s]?.type==="TableConstructorExpression"&&e.add(n.name)});return e}function ec(t){let e=t[t.length-1];if(e?.type!=="ReturnStatement")return[];let r=e.arguments[0];if(r?.type!=="TableConstructorExpression")return[];let n=[];for(let s of r.fields)s.type==="TableKeyString"&&n.push({name:s.key.name});return n}function tc(t){let e=t.body,r=Za(e),n=ec(e);for(let o of e)if(o.type==="FunctionDeclaration")o.identifier?.type==="MemberExpression"?o.identifier.base.type==="Identifier"&&r.has(o.identifier.base.name)&&n.push({name:o.identifier.identifier.name}):o.identifier?.type==="Identifier"&&!o.isLocal&&n.push({name:o.identifier.name});else if(o.type==="AssignmentStatement")for(let i of o.variables)i.type==="MemberExpression"&&i.base.type==="Identifier"&&r.has(i.base.name)&&n.push({name:i.identifier.name});let s=new Set;return n.filter(o=>s.has(o.name)?!1:(s.add(o.name),!0))}function as(t,e){let r=re(e),n=ne(t,r),s=[],o=[];try{let i=is.default.parse(e);s=Xa(i,t),o=tc(i)}catch{}return{imports:s,exports:o,tags:Array.from(r).map(i=>({name:i,kind:"comment-marker"})),category:n}}var rc=["http://","https://","mailto:","//"],nc="ts|tsx|js|jsx|mjs|cjs|py|go|lua|css|scss|less|styl|coffee|ls|feature|md|mdx|json",sc=new RegExp(`(?:\\.{1,2}/)?[\\w.-]+(?:/[\\w.-]+)*\\.(?:${nc})\\b`,"g"),cs;async function oc(){return cs??=(async()=>{let{unified:t}=await import("unified"),e=(await import("remark-parse")).default;return t().use(e)})(),cs}function ic(t){let e=t.trim();return e.length===0||e.startsWith("#")||rc.some(r=>e.startsWith(r))}function ac(t,e){let r=t.match(sc);return r?r.map(n=>({fromPath:e,toPath:"",rawSpecifier:n,isStyle:!1,type:"static"})):[]}function ls(t,e,r){if(t.type==="link"&&typeof t.url=="string"&&!ic(t.url)&&r.push({fromPath:e,toPath:"",rawSpecifier:t.url,isStyle:!1,type:"static"}),(t.type==="code"||t.type==="inlineCode")&&typeof t.value=="string"&&r.push(...ac(t.value,e)),Array.isArray(t.children))for(let n of t.children)ls(n,e,r)}async function ps(t,e){let n=(await oc()).parse(e),s=[];ls(n,t,s);let o=new Set;return{imports:s.filter(a=>o.has(a.rawSpecifier)?!1:(o.add(a.rawSpecifier),!0)),exports:[],tags:[],category:"other"}}var fs=d(require("path")),ms=require("@lezer/python");function cc(t){let e=1;function r(n){switch(n.type.name){case"IfStatement":{e+=K(n).filter(o=>o.type.name==="if"||o.type.name==="elif").length;break}case"TryStatement":{e+=K(n).filter(o=>o.type.name==="except").length;break}case"ForStatement":case"WhileStatement":case"ConditionalExpression":e++;break;case"and":case"or":e++;break}let s=n.firstChild;for(;s;)r(s),s=s.nextSibling}return r(t),e}function lc(t){let e=0;function r(n,s){let o=n.type.name;if(o==="IfStatement"){let c=K(n),l=0,p=0;for(;p<c.length;){let u=c[p];if(u?.type.name==="if"||u?.type.name==="elif"){let g=l>0;e+=g?1:1+s;let h=g?s:s+1,k=c[p+1],x=c[p+2];k&&r(k,h),x&&r(x,h),l++,p+=3}else if(u?.type.name==="else"){e+=1;let g=c[p+1];g&&r(g,s+1),p+=2}else p++}return}if(o==="TryStatement"){let c=K(n),l=0;for(;l<c.length;){let p=c[l];if(p?.type.name==="except"){for(e+=1+s,l++;l<c.length&&c[l]?.type.name!=="Body";)r(c[l],s),l++;l<c.length&&(r(c[l],s),l++)}else p?.type.name==="Body"&&r(p,s),l++}return}if(o==="ForStatement"||o==="WhileStatement"){e+=1+s;let c=n.firstChild;for(;c;)r(c,s+1),c=c.nextSibling;return}if((o==="ConditionalExpression"||o==="and"||o==="or")&&(e+=1),s>0&&(o==="FunctionDefinition"||o==="LambdaExpression")){e+=1+s;let c=n.firstChild;for(;c;)r(c,s+1),c=c.nextSibling;return}let a=n.firstChild;for(;a;)r(a,s),a=a.nextSibling}return r(t,0),e}function yr(t){return{complexity:cc(t),cognitiveComplexity:lc(t)}}function us(t,e){let r=[];function n(i,a){let{complexity:c,cognitiveComplexity:l}=yr(i);r.push({name:a,line:Se(e,i.from),complexity:c,cognitiveComplexity:l})}function s(i){let a=i.firstChild;for(;a;)o(a),a=a.nextSibling}function o(i){if(i.type.name==="ClassDefinition"){let a=i.getChild("VariableName"),c=a?e.slice(a.from,a.to):void 0,l=i.getChild("Body");if(l){let p=l.firstChild;for(;p;){if(p.type.name==="FunctionDefinition"){let u=p.getChild("VariableName"),g=u?e.slice(u.from,u.to):void 0;g&&n(p,c?`${c}.${g}`:g),s(p)}else o(p);p=p.nextSibling}}return}if(i.type.name==="FunctionDefinition"){let a=i.getChild("VariableName");a&&n(i,e.slice(a.from,a.to)),s(i);return}s(i)}return o(t.topNode),r}var pc=new Set(["pytest","unittest","nose","hypothesis"]);function gs(t,e){let r=[],n=[],s=new Set,o=fs.default.basename(t).toLowerCase(),i=ms.parser.parse(e),a=i.cursor();do switch(a.name){case"Comment":{let h=e.slice(a.from,a.to).match(/#\s*@tag\s+([a-zA-Z0-9_-]+)/);h?.[1]&&s.add(h[1]);break}case"ImportStatement":{for(let h of uc(a.node,e,t))r.push(h);break}case"FunctionDefinition":case"ClassDefinition":{let h=a.node.parent;if(h?.name==="Script"||h?.name==="DecoratedStatement"&&h.parent?.name==="Script"){let x=a.node.getChild("VariableName");x&&n.push({name:e.slice(x.from,x.to)})}break}case"AssignStatement":{if(a.node.parent?.name==="Script"){let h=a.node.firstChild;h?.name==="VariableName"&&n.push({name:e.slice(h.from,h.to)})}break}}while(a.next());let c=yc(o,r,s);c==="test"&&s.add("test");let{complexity:l,cognitiveComplexity:p}=yr(i.topNode),u=us(i,e),g=c==="test"?[]:hc(i,e);return{imports:r,exports:n,tags:Array.from(s).map(h=>({name:h,kind:"comment-marker"})),category:c,rawCallEdges:g,complexity:l,cognitiveComplexity:p,...u.length>0?{functions:u}:{}}}function uc(t,e,r){let n=t.firstChild;return n?n.name==="from"?fc(t,e,r):mc(t,e,r):[]}function fc(t,e,r){let n=t.firstChild;if(!n)return[];let s=n.nextSibling;for(;s&&s.name!=="import";)s=s.nextSibling;if(!s)return[];let o=e.slice(n.to,s.from).trim(),i=gc(s.nextSibling,e);if(!i.length)return[];let a=0;for(;a<o.length&&o[a]===".";)a++;let c=o.slice(a);if(a===0)return[ke(r,o,i,!0)];let l=a===1?"./":"../".repeat(a-1);return c?[ke(r,l+c.replace(/\./g,"/"),i,!1)]:i[0]==="*"?[ke(r,l.slice(0,-1),["*"],!1)]:i.map(p=>ke(r,l+p,[p],!1))}function mc(t,e,r){let n=[],s=t.firstChild?.nextSibling??null;for(;s;){if(s.name==="VariableName"){let o=e.slice(s.from,s.to);for(;s.nextSibling?.name==="."&&s.nextSibling.nextSibling?.name==="VariableName";)s=s.nextSibling.nextSibling,o+=`.${e.slice(s.from,s.to)}`;s.nextSibling?.name==="as"&&(s=s.nextSibling.nextSibling??s.nextSibling),n.push(ke(r,o,["*"],!0))}s=s.nextSibling}return n}function gc(t,e){let r=[],n=t;for(;n;)n.name==="*"?r.push("*"):n.name==="VariableName"&&(r.push(e.slice(n.from,n.to)),n.nextSibling?.name==="as"&&(n=n.nextSibling.nextSibling??n.nextSibling)),n=n.nextSibling;return r}function dc(t,e){let r=new Map,n=t.cursor();do{if(n.name!=="ImportStatement")continue;let o=n.node.firstChild;if(o?.type.name!=="from")continue;let i=o.nextSibling;for(;i&&i.type.name!=="import";)i=i.nextSibling;if(!i)continue;let a=e.slice(o.to,i.from).trim(),c=0;for(;c<a.length&&a[c]===".";)c++;let l=a.slice(c),p=c<=1?"./":"../".repeat(c-1),u=i.nextSibling;for(;u;){if(u.type.name==="VariableName"){let g=e.slice(u.from,u.to),h=g;if(u.nextSibling?.type.name==="as"){let x=u.nextSibling.nextSibling;x?.type.name==="VariableName"&&(h=e.slice(x.from,x.to),u=x)}let k=c===0?a:l?p+l.replace(/\./g,"/"):p+g;r.set(h,k)}u=u.nextSibling}}while(n.next());return r}function hc(t,e){let r=dc(t,e),n=[];function s(a,c){if(a.type.name==="CallExpression"&&a.firstChild?.type.name==="VariableName"){let p=a.firstChild,u=e.slice(p.from,p.to),g=r.get(u);g&&n.push({from:c,to:u,toSpecifier:g})}let l=a.firstChild;for(;l;)s(l,c),l=l.nextSibling}function o(a){let c=a.firstChild;for(;c;)i(c),c=c.nextSibling}function i(a){if(a.type.name==="ClassDefinition"){let c=a.getChild("VariableName"),l=c?e.slice(c.from,c.to):void 0,p=a.getChild("Body");if(p){let u=p.firstChild;for(;u;){if(u.type.name==="FunctionDefinition"){let g=u.getChild("VariableName"),h=g?e.slice(g.from,g.to):void 0;h&&s(u,l?`${l}.${h}`:h)}else i(u);u=u.nextSibling}}return}if(a.type.name==="FunctionDefinition"){let c=a.getChild("VariableName");c&&s(a,e.slice(c.from,c.to));return}o(a)}return i(t.topNode),n}function ke(t,e,r,n){return{fromPath:t,toPath:"",rawSpecifier:e,isStyle:!1,isExternal:n,type:"static",symbols:r.length>0?r:void 0}}function yc(t,e,r){return t.startsWith("test_")||t.endsWith("_test.py")?"test":t==="conftest.py"||t==="setup.py"?"config":r.has("test")||e.some(n=>pc.has(n.rawSpecifier))?"test":"logic"}var Sr=d(require("path")),m=d(require("typescript"));var b=d(require("typescript"));function xc(t){let e=1;function r(n){switch(n.kind){case b.default.SyntaxKind.IfStatement:case b.default.SyntaxKind.ConditionalExpression:case b.default.SyntaxKind.ForStatement:case b.default.SyntaxKind.ForInStatement:case b.default.SyntaxKind.ForOfStatement:case b.default.SyntaxKind.WhileStatement:case b.default.SyntaxKind.DoStatement:case b.default.SyntaxKind.CatchClause:case b.default.SyntaxKind.CaseClause:e++;break;case b.default.SyntaxKind.BinaryExpression:{let s=n.operatorToken.kind;(s===b.default.SyntaxKind.AmpersandAmpersandToken||s===b.default.SyntaxKind.BarBarToken||s===b.default.SyntaxKind.QuestionQuestionToken)&&e++;break}}b.default.forEachChild(n,r)}return r(t),e}function bc(t){let e=0;function r(n,s,o){if(b.default.isIfStatement(n)){e+=o?1:1+s;let a=o?s:s+1;r(n.expression,a,!1),r(n.thenStatement,a,!1),n.elseStatement&&(b.default.isIfStatement(n.elseStatement)?r(n.elseStatement,s,!0):(e+=1,r(n.elseStatement,s+1,!1)));return}if(b.default.isForStatement(n)||b.default.isForInStatement(n)||b.default.isForOfStatement(n)||b.default.isWhileStatement(n)||b.default.isDoStatement(n)||b.default.isSwitchStatement(n)){e+=1+s,b.default.forEachChild(n,a=>r(a,s+1,!1));return}if(b.default.isCatchClause(n)){e+=1+s,b.default.forEachChild(n,a=>r(a,s,!1));return}if(b.default.isConditionalExpression(n)&&(e+=1),b.default.isBinaryExpression(n)){let a=n.operatorToken.kind;(a===b.default.SyntaxKind.AmpersandAmpersandToken||a===b.default.SyntaxKind.BarBarToken||a===b.default.SyntaxKind.QuestionQuestionToken)&&(e+=1)}if(s>0&&(b.default.isFunctionDeclaration(n)||b.default.isFunctionExpression(n)||b.default.isArrowFunction(n))){e+=1+s,b.default.forEachChild(n,a=>r(a,s+1,!1));return}b.default.forEachChild(n,a=>r(a,s,!1))}return r(t,0,!1),e}function xr(t){return{complexity:xc(t),cognitiveComplexity:bc(t)}}var C=d(require("typescript")),br=new Set(["test","describe","it"]);function ds(t,e){Sc(t,e),vc(t,e),wc(t,e),Cc(t,e)}function Sc(t,e){if((C.default.isFunctionDeclaration(t)||C.default.isVariableDeclaration(t))&&t.name&&C.default.isIdentifier(t.name)&&kc(t)){let r;if(C.default.isFunctionDeclaration(t))r="function";else{let n=t.initializer;r=n&&(C.default.isArrowFunction(n)||C.default.isFunctionExpression(n))?"function":"variable"}e.tags.add({name:t.name.text,kind:r})}}function kc(t){if(C.default.isFunctionDeclaration(t))return C.default.isSourceFile(t.parent);let e=t.parent?.parent;return!!e&&C.default.isSourceFile(e.parent)}function vc(t,e){if(!C.default.isStringLiteral(t))return;let r=t.text.match(/@[\w-]+/g);if(r)for(let n of r)e.tags.add({name:n.substring(1),kind:"comment-marker"})}function wc(t,e){if(!C.default.isSourceFile(t))return;let r=/@tag\s+([a-zA-Z0-9_-]+)/g,n=t.getFullText(),s=r.exec(n);for(;s!==null;)s[1]&&e.tags.add({name:s[1],kind:"comment-marker"}),s=r.exec(n)}function Cc(t,e){if(C.default.isCallExpression(t)&&Fc(t.expression))for(let r of t.arguments)C.default.isObjectLiteralExpression(r)&&Tc(r,e)}function Fc(t){return C.default.isIdentifier(t)?br.has(t.text):!!(C.default.isPropertyAccessExpression(t)&&(br.has(t.name.text)||C.default.isIdentifier(t.expression)&&br.has(t.expression.text)))}function Tc(t,e){for(let r of t.properties){if(!C.default.isPropertyAssignment(r)||!C.default.isIdentifier(r.name)||r.name.text!=="tags"&&r.name.text!=="tag")continue;let{initializer:n}=r,s=C.default.isArrayLiteralExpression(n)?n.elements.filter(C.default.isStringLiteral):r.name.text==="tag"&&C.default.isStringLiteral(n)?[n]:[];for(let o of s)e.tags.add({name:o.text.replace(/^@/,""),kind:"comment-marker"})}}function kr(t,e,r){let n=[],s=new Map,o=new Set,i=m.default.createSourceFile(t,e,m.default.ScriptTarget.Latest,!0,r==="typescript"?m.default.ScriptKind.TSX:m.default.ScriptKind.JSX),a={filePath:t,imports:n,exports:s,tags:o,rawCallEdges:[],sourceFile:i,hasUI:!1,hasTypesOnly:!0,totalStatements:0,exportStatements:0},c=x=>{Nc(x,a),m.default.forEachChild(x,c)};c(i);let l=zc(t,a);(l==="test"||l==="barrel")&&o.add({name:l,kind:"comment-marker"}),l!=="test"&&$c(a,i);let p=i.statements[0],u=p?ys(p):void 0,{complexity:g,cognitiveComplexity:h}=xr(i),k=Ec(i);return{imports:n,exports:Array.from(s.values()),tags:Array.from(o),category:l,rawCallEdges:a.rawCallEdges??[],complexity:g,cognitiveComplexity:h,...k.length>0?{functions:k}:{},...u!==void 0?{description:u}:{}}}function Ec(t){let e=[],r=(s,o)=>{let{complexity:i,cognitiveComplexity:a}=xr(o),c=t.getLineAndCharacterOfPosition(o.getStart(t)).line+1;e.push({name:s,line:c,complexity:i,cognitiveComplexity:a})},n=(s,o)=>{if(m.default.isFunctionDeclaration(s)&&s.name&&s.body?r(s.name.text,s):m.default.isVariableDeclaration(s)&&m.default.isIdentifier(s.name)&&s.initializer&&(m.default.isArrowFunction(s.initializer)||m.default.isFunctionExpression(s.initializer))?r(s.name.text,s.initializer):o&&m.default.isMethodDeclaration(s)&&m.default.isIdentifier(s.name)&&s.body?r(`${o}.${s.name.text}`,s):o&&m.default.isConstructorDeclaration(s)&&s.body?r(`${o}.constructor`,s):o&&m.default.isGetAccessorDeclaration(s)&&m.default.isIdentifier(s.name)&&s.body?r(`${o}.get ${s.name.text}`,s):o&&m.default.isSetAccessorDeclaration(s)&&m.default.isIdentifier(s.name)&&s.body&&r(`${o}.set ${s.name.text}`,s),m.default.isClassDeclaration(s)&&s.name){let i=s.name.text;m.default.forEachChild(s,a=>n(a,i));return}m.default.forEachChild(s,i=>n(i,o))};return n(t,void 0),e}function hs(t,e,r,n){let s={name:t},o=ys(r);o!==void 0&&(s.doc=o);let i=Pc(e);i!==void 0&&(s.flags=i);let a=Ac(e,n);return a!==void 0&&(s.signature=a),s}function ys(t){let e=m.default.getJSDocCommentsAndTags(t);for(let r of e)if(m.default.isJSDoc(r)&&r.comment)return m.default.getTextOfJSDocComment(r.comment)||void 0}function Pc(t){let e=new Set(["deprecated","internal","public","alpha","beta"]),r=m.default.getJSDocTags(t).map(n=>n.tagName.text).filter(n=>e.has(n));return r.length>0?r:void 0}function Ac(t,e){let r=m.default.createPrinter({removeComments:!0}),n=s=>r.printNode(m.default.EmitHint.Unspecified,s,e);if(m.default.isFunctionDeclaration(t)||m.default.isMethodDeclaration(t)){let s=t.parameters.map(n).join(", "),o=t.type?n(t.type):"void";return`${t.typeParameters?`<${t.typeParameters.map(a=>a.name.text).join(", ")}>`:""}(${s}) => ${o}`}if(m.default.isVariableDeclaration(t)){if(t.type)return n(t.type);if(t.initializer&&(m.default.isArrowFunction(t.initializer)||m.default.isFunctionExpression(t.initializer))){let s=t.initializer,o=s.parameters.map(n).join(", "),i=s.type?n(s.type):"unknown";return`(${o}) => ${i}`}return}if(m.default.isClassDeclaration(t)&&t.name)return`class ${t.name.text}`;if(m.default.isInterfaceDeclaration(t))return`interface ${t.name.text}`;if(m.default.isTypeAliasDeclaration(t))return n(t.type);if(m.default.isEnumDeclaration(t))return`enum ${t.name.text}`}function Nc(t,e){Ic(t,e),Mc(t,e),Rc(t,e),Lc(t,e),Wc(t,e),ds(t,e)}function Ic(t,e){if(!m.default.isSourceFile(t))return;let r=t.statements.filter(n=>!m.default.isEmptyStatement(n));e.totalStatements=r.length,e.exportStatements=r.filter(n=>m.default.isExportDeclaration(n)||m.default.isExportAssignment(n)||vr(n)).length}function Mc(t,e){if(m.default.isJsxElement(t)||m.default.isJsxSelfClosingElement(t)||m.default.isJsxFragment(t)){e.hasUI=!0,e.hasTypesOnly=!1;return}if(m.default.isFunctionDeclaration(t)||m.default.isMethodDeclaration(t)||m.default.isArrowFunction(t)||m.default.isClassDeclaration(t)||m.default.isVariableStatement(t)||m.default.isEnumDeclaration(t)){e.hasTypesOnly=!1;return}m.default.isExportDeclaration(t)&&!Dc(t)&&(e.hasTypesOnly=!1)}function Dc(t){return t.isTypeOnly?!0:!t.exportClause||!m.default.isNamedExports(t.exportClause)?!1:t.exportClause.elements.every(e=>e.isTypeOnly)}function Rc(t,e){if(!m.default.isImportDeclaration(t)||!t.moduleSpecifier||!m.default.isStringLiteral(t.moduleSpecifier))return;let r=[];if(t.importClause&&(t.importClause.name&&r.push("default"),t.importClause.namedBindings))if(m.default.isNamedImports(t.importClause.namedBindings))for(let s of t.importClause.namedBindings.elements)r.push(s.name.text);else m.default.isNamespaceImport(t.importClause.namedBindings)&&r.push("*");let n=r.length>0?"static":"side-effect";e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:t.moduleSpecifier.text,isStyle:A(t.moduleSpecifier.text),type:n,symbols:r.length>0?r:void 0})}function Lc(t,e){m.default.isExportDeclaration(t)?Gc(t,e):m.default.isExportAssignment(t)?e.exports.set("default",{name:"default"}):vr(t)&&jc(t,e)}function Gc(t,e){if(t.moduleSpecifier&&m.default.isStringLiteral(t.moduleSpecifier))_c(t,t.moduleSpecifier.text,e);else if(t.exportClause&&m.default.isNamedExports(t.exportClause))for(let r of t.exportClause.elements){let n=r.name.text;e.exports.set(n,{name:n})}}function _c(t,e,r){let n=Oc(t),s={fromPath:r.filePath,toPath:"",rawSpecifier:e,isStyle:A(e),type:"re-export"};n.length>0&&(s.symbols=n),r.imports.push(s)}function Oc(t){return t.exportClause?m.default.isNamedExports(t.exportClause)?t.exportClause.elements.map(e=>e.name.text):[]:["*"]}function jc(t,e){if((m.default.isFunctionDeclaration(t)||m.default.isClassDeclaration(t)||m.default.isInterfaceDeclaration(t)||m.default.isTypeAliasDeclaration(t)||m.default.isEnumDeclaration(t))&&t.name){let n=t.name.text;e.exports.set(n,hs(n,t,t,e.sourceFile));return}if(m.default.isVariableStatement(t)){for(let n of t.declarationList.declarations)if(m.default.isIdentifier(n.name)){let s=n.name.text;e.exports.set(s,hs(s,n,t,e.sourceFile))}}}function Wc(t,e){if(!m.default.isCallExpression(t))return;let r=t.arguments[0];!r||!m.default.isStringLiteral(r)||(t.expression.kind===m.default.SyntaxKind.ImportKeyword?e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:A(r.text),type:"dynamic"}):m.default.isIdentifier(t.expression)&&t.expression.text==="require"&&e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:A(r.text),type:"require"}))}function zc(t,e){let r=Sr.default.basename(t).toLowerCase(),n=Sr.default.extname(t).toLowerCase();return ae().some(o=>r.includes(o))?"test":Dr(r)?"config":e.imports.some(o=>ft().some(i=>o.rawSpecifier.includes(i)))?"test":n===".tsx"||n===".jsx"||e.hasUI?"ui":e.hasTypesOnly&&e.totalStatements>0?"type-only":e.totalStatements>0&&e.exportStatements/e.totalStatements>gt()?"barrel":"logic"}function vr(t){return m.default.canHaveModifiers(t)&&m.default.getModifiers(t)?.some(e=>e.kind===m.default.SyntaxKind.ExportKeyword)===!0}function $c(t,e){let r=t.rawCallEdges??[];t.rawCallEdges=r;let n=new Map;for(let s of e.statements){if(!m.default.isImportDeclaration(s)||!m.default.isStringLiteral(s.moduleSpecifier))continue;let o=s.moduleSpecifier.text,i=s.importClause;if(i&&(i.name&&n.set(i.name.text,o),i.namedBindings&&m.default.isNamedImports(i.namedBindings)))for(let a of i.namedBindings.elements)n.set(a.name.text,o)}if(n.size!==0)for(let s of e.statements){let o=Uc(s);if(o){let i=Kc(s);i&&st(i,o,n,r);continue}m.default.isClassDeclaration(s)&&s.name&&Bc(s,s.name.text,n,r)}}function Bc(t,e,r,n){for(let s of t.members)m.default.isMethodDeclaration(s)&&s.body&&m.default.isIdentifier(s.name)?st(s.body,`${e}.${s.name.text}`,r,n):m.default.isConstructorDeclaration(s)&&s.body&&st(s.body,`${e}.constructor`,r,n)}function Uc(t){if(vr(t)){if(m.default.isFunctionDeclaration(t)&&t.name)return t.name.text;if(m.default.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(m.default.isIdentifier(e.name)&&e.initializer&&(m.default.isArrowFunction(e.initializer)||m.default.isFunctionExpression(e.initializer)))return e.name.text}}}function Kc(t){if(m.default.isFunctionDeclaration(t))return t.body;if(m.default.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(e.initializer&&(m.default.isArrowFunction(e.initializer)||m.default.isFunctionExpression(e.initializer)))return e.initializer}}function st(t,e,r,n){if(m.default.isCallExpression(t)&&m.default.isIdentifier(t.expression)){let s=t.expression.text,o=r.get(s);o&&!n.some(i=>i.from===e&&i.to===s&&i.toSpecifier===o)&&n.push({from:e,to:s,toSpecifier:o})}m.default.forEachChild(t,s=>st(s,e,r,n))}function ot(t,e){if(e.length===0)return"ui";let r=!1;return t.walk(n=>{if(n.type==="rule")return r=!0,!1}),r?"ui":"barrel"}function xs(t,e){let r=[],n=/@require\s+['"]([^'"]+)['"]/g,s=n.exec(t);for(;s!==null;){let i=s[1];i&&r.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:"require"}),s=n.exec(t)}let o=/(?<!@)(?:import|require)\s*\(?\s*['"]([^'"]+)['"]/g;for(s=o.exec(t);s!==null;){let i=s[1];i&&r.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:"static"}),s=o.exec(t)}return r}function bs(t,e){if(e.length===0)return"ui";try{let r=require("stylus");return new r.Parser(t).parse().nodes.some(o=>o.constructor.name!=="Import")?"ui":"barrel"}catch{return t.replace(/^\s*@?(?:require|import)\b.*/gm,"").trim().length>0?"ui":"barrel"}}function ve(t,e){let r=G(t);if(r==="stylus"){let o=xs(e,t);return{imports:o,exports:[],tags:[],category:bs(e,o)}}if(r==="scss"){let{imports:o,root:i,exports:a,tags:c}=Oe(e,t);return{imports:o,exports:a,tags:c,category:ot(i,o)}}if(r==="less"){let{imports:o,root:i,exports:a,tags:c}=_e(e,t);return{imports:o,exports:a,tags:c,category:ot(i,o)}}let{imports:n,root:s}=Ge(e,t);return{imports:n,exports:[],tags:[],category:ot(s,n)}}for(let[t,e]of[["javascript",(r,n)=>kr(r,n,"javascript")],["typescript",(r,n)=>kr(r,n,"typescript")],["css",ve],["scss",ve],["less",ve],["stylus",ve],["coffeescript",Yn],["livescript",os],["lua",as],["python",gs],["go",ns],["gherkin",gr],["markdown",ps]])te(t,e);async function Ss(t,e){let r=G(t),n=Pn(r);return n?n(t,e):{imports:[],exports:[],tags:[],category:"other"}}var wr=d(require("path"));function vs(t,e){for(let r of t.values()){let n=e.get(r.path);n!==void 0&&(r.coveragePct=n)}}function ws(t,e){for(let r of t)if(r.isExternal){let n=r.rawSpecifier.startsWith("@")?r.rawSpecifier.split("/").slice(0,2).join("/"):r.rawSpecifier.split("/")[0];n&&!e.some(s=>s.name===n)&&e.push({name:n,kind:"library"})}}function Cs(t){for(let e of t.values())if(e.category==="test")for(let r of e.imports){if(r.isExternal||!r.toPath)continue;let n=t.get(r.toPath);n&&(n.category!=="logic"&&n.category!=="barrel"||(n.testedBy??=[],n.testedBy.includes(e.path)||n.testedBy.push(e.path)))}}function Fs(t){for(let e of t.values())if(e.type==="markdown")for(let r of e.imports){if(r.isExternal||!r.toPath)continue;let n=t.get(r.toPath);!n||n===e||(n.documentedBy??=[],n.documentedBy.includes(e.path)||n.documentedBy.push(e.path),n.category==="logic"&&(n.lastCommitAt??0)>(e.lastCommitAt??0)&&(e.staleFor??=[],e.staleFor.includes(n.path)||e.staleFor.push(n.path)))}}function ks(t){return Math.round(t*1e4)/1e4}function Ts(t){for(let e of t.values()){let r=[];for(let n of e.imports){if(n.isExternal||!n.toPath)continue;let s=t.get(n.toPath);if(!s||s.exports.length===0)continue;let o;if(n.symbols===void 0){if(n.type==="side-effect")continue;o=1}else n.symbols.includes("*")?o=1:o=n.symbols.length/s.exports.length;n.exportUsageRatio=ks(Math.min(1,o)),r.push(n.exportUsageRatio)}r.length>0&&(e.avgExportUsage=ks(r.reduce((n,s)=>n+s,0)/r.length),e.maxExportUsage=Math.max(...r))}}function Cr(t,e,r){e&&(t.some(n=>n.name===e&&n.kind===r)||t.push({name:e,kind:r}))}function Jc(t,e){let r=e.toPath,n=wr.default.basename(r,wr.default.extname(r)).replace(/\.(test|spec)$/,"");Cr(t.tags,n,"import")}function Vc(t,e){if(!(!e.symbols||e.symbols.includes("*")))for(let r of e.symbols)Cr(t.tags,r,"import")}function Hc(t,e,r){let n=r.get(e.toPath);if(!(!n||n.category==="test"))for(let s of n.tags)s.kind==="comment-marker"&&Cr(t.tags,s.name,"comment-marker")}function Es(t){for(let e of t.values())if(e.category==="test")for(let r of e.imports)!r.toPath||r.isExternal||(Jc(e,r),Vc(e,r),Hc(e,r,t))}var Pe=d(require("fs")),R=d(require("path"));var Fr=d(require("fs")),V=d(require("path")),we=class{extensions=[".go"];goModCache=new Map;resolve(e,r,n,s){let{mod:o,replaces:i}=this.readGoMod(n);if(!o)return null;let a=this.applyReplace(r,i,n);if(a!==void 0)return As(a);if(r!==o&&!r.startsWith(`${o}/`))return null;let c=r.slice(o.length).replace(/^\//,"");return c?As(V.default.join(n,c)):null}readGoMod(e){let r=this.goModCache.get(e);if(r!==void 0)return r;let n={mod:null,replaces:new Map};try{let s=Fr.default.readFileSync(V.default.join(e,"go.mod"),"utf-8"),o=Qc(s,e);return this.goModCache.set(e,o),o}catch{return this.goModCache.set(e,n),n}}applyReplace(e,r,n){for(let[s,o]of r){if(e===s)return o;if(e.startsWith(`${s}/`)){let i=e.slice(s.length+1);return V.default.join(o,i)}}}};function Qc(t,e){let r=t.split(`
|
|
29
|
-
`),n=null,s=new Map,o=!1;for(let i of r){let a=i.trim();if(a.startsWith("module ")){n=a.slice(7).trim();continue}if(/^replace\s*\(/.test(a)){o=!0;continue}if(o&&a===")"){o=!1;continue}if(o&&a.includes("=>")){
|
|
26
|
+
${p}`}};function La(t){let e=t.split(`
|
|
27
|
+
`),r=-1;return e.forEach((s,o)=>{(s.trimStart().startsWith("import ")||s.trimStart().startsWith("from "))&&(r=o)}),r<0?0:e.slice(0,r+1).reduce((s,o)=>s+o.length+1,0)}var dr=d(require("path")),hr=d(require("typescript"));var Ga=/\/\/ <mokosh-tags>[\s\S]*?\/\/ <\/mokosh-tags>\n*/,rt=class{name="vitest";canHandle(e){return M.has(dr.default.extname(e).toLowerCase())}apply(e,r,n){let s=r.replace(Ga,""),o=hr.default.createSourceFile(dr.default.basename(e),s,hr.default.ScriptTarget.Latest,!0),i=sr(o),[a]=i;if(!a)return s;let c=or(a,"tags",o),l=[...n].sort();if(c!==null&&JSON.stringify([...c].sort())===JSON.stringify(l))return s;let p=i.flatMap(u=>{let g=n.length===0?ar(u,"tags",o):ir(u,"tags",lr(l),o);return g?[g]:[]});return p.length>0?cr(s,p):s}};var Qn={vitest:()=>new rt,playwright:()=>new et,cypress:()=>new qe,jest:()=>new Ze},_a={"@playwright/test":"playwright",cypress:"cypress","@jest/globals":"jest",vitest:"vitest"};function Oa(t){let e=Se.default.createSourceFile("detect.ts",t,Se.default.ScriptTarget.Latest,!0);for(let r of e.statements){if(!Se.default.isImportDeclaration(r)||!Se.default.isStringLiteral(r.moduleSpecifier))continue;let n=_a[r.moduleSpecifier.text];if(n)return n}return null}var yr=class{constructor(e,r,n){this.rootDir=e;this.defaultFramework=r;this.frameworkOverrides=n}rootDir;defaultFramework;frameworkOverrides;name="auto";canHandle(e){return M.has(nt.default.extname(e).toLowerCase())}apply(e,r,n){let s=Oa(r)??this.matchOverride(e)??this.defaultFramework;return(Qn[s]??Qn.vitest)().apply(e,r,n)}matchOverride(e){let r=nt.default.relative(this.rootDir,e).split(nt.default.sep).join("/");for(let[n,s]of this.frameworkOverrides)if(Un(n,r))return s;return null}};function qn(t="vitest",e={},r=process.cwd()){return[new Ye,new tt,new Xe,new yr(r,t,Object.entries(e))]}function Yn(t,e){return e.find(r=>r.canHandle(t))??null}var ja=/^[a-zA-Z][a-zA-Z0-9_-]{1,}$/,Wa=new Set(["import"]),za=new Set(["common","fixture","fixtures","helper","helpers","index","main","mock","mocks","setup","shared","spec","test","tests","types","util","utils"]);async function $a(t,e,r,n){let s;try{s=await xr.default.readFile(t,"utf8")}catch(a){return{path:t,status:"error",error:String(a)}}let o=Yn(t,n);if(!o)return{path:t,status:"unchanged"};let i=o.apply(t,s,e);return i===s?{path:t,status:"unchanged"}:(r||await xr.default.writeFile(t,i,"utf8"),{path:t,status:"updated"})}async function br(t,e,r){let n=le(e),s=n.tagApplier?.framework??"vitest",o=n.tagApplier?.frameworkOverrides??{},i=qn(s,o,e),a={updated:0,unchanged:0,errors:0,files:[]};for(let c of t.nodes.values()){if(c.category!=="test")continue;let l=new Set,p=[];for(let h of c.tags)Wa.has(h.kind)&&ja.test(h.name)&&(za.has(h.name.toLowerCase())||l.has(h.name)||(l.add(h.name),p.push(h.name)));p.sort();let u=Xn.default.resolve(e,c.path),g=await $a(u,p,r.dryRun,i);g.path=c.path,a.files.push(g),g.status==="updated"?a.updated++:g.status==="unchanged"?a.unchanged++:a.errors++}return a}var st=class{isTestNode(e){return e.category==="test"||e.tags.some(r=>r.name==="test")}};var ie=d(require("fs")),E=d(require("path")),Ws=d(require("piscina"));var ot=require("child_process"),it=class{getChangedFiles(){try{let r=[["diff","--name-only"],["diff","--cached","--name-only"],["ls-files","--others","--exclude-standard"]].flatMap(n=>{try{return(0,ot.execFileSync)("git",n,{encoding:"utf-8",stdio:["ignore","pipe","ignore"]}).split(`
|
|
28
|
+
`).map(o=>o.trim()).filter(o=>o!=="")}catch{return[]}});return Array.from(new Set(r))}catch(e){return console.error("Error getting git diff:",e),[]}}},Zn="%x00%H%x09%ae%x09%at",es=256*1024*1024;function ts(t,e){let r="",n=0;for(let s of t.split(`
|
|
29
|
+
`)){if(s.startsWith("\0")){let[,c,l]=s.slice(1).split(" ");r=c??"",n=l?Number(l)*1e3:0;continue}if(s==="")continue;let o=s.split(" "),i=o[0];if(!i)continue;let a=i.startsWith("R")||i.startsWith("C")?o[2]:o[1];a&&e(a,r,n)}}function rs(t){let e=new Map;try{let r=(0,ot.execFileSync)("git",["-C",t,"log","--since=90 days ago","--name-status","-M",`--format=${Zn}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:es});ts(r,(n,s,o)=>{let i=e.get(n);if(i){i.commitCount90d+=1;return}e.set(n,{commitCount90d:1,lastAuthor:s||void 0,lastCommitAt:o||void 0})})}catch{return e}try{let r=(0,ot.execFileSync)("git",["-C",t,"log","--name-status","-M",`--format=${Zn}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:es});ts(r,(n,s,o)=>{e.has(n)||e.set(n,{commitCount90d:0,lastAuthor:void 0,lastCommitAt:o||void 0})})}catch{}return e}var Sr=d(require("path"));function G(t){switch(Sr.default.extname(t).toLowerCase()){case".js":case".jsx":case".mjs":case".cjs":return"javascript";case".ts":case".tsx":return"typescript";case".css":return"css";case".scss":case".sass":return"scss";case".less":return"less";case".styl":return"stylus";case".coffee":return"coffeescript";case".ls":return"livescript";case".lua":return"lua";case".py":return"python";case".go":return"go";case".java":case".cpp":case".cc":case".cxx":case".c":return"unknown";case".feature":return"gherkin";case".md":case".mdx":return"markdown";default:return"unknown"}}function P(t){let e=Sr.default.extname(t).toLowerCase();return[".css",".scss",".sass",".less",".styl"].includes(e)}var ss=d(require("coffeescript"));function _(t){return t.startsWith("'")||t.startsWith('"')?t.slice(1,-1):t}function ne(t){let e=new Set,r=/@tag\s+([a-zA-Z0-9_-]+)/g,n=r.exec(t);for(;n!==null;)n[1]&&e.add(n[1]),n=r.exec(t);return e}function se(t,e){let r=t.toLowerCase();return r.includes(".test.")||r.includes(".spec.")||e.has("test")?"test":"logic"}function os(t){if(t){if(typeof t.originalValue=="string")return t.originalValue;if(typeof t.value=="string")return _(t.value)}}function U(t){if(t){if(typeof t.value=="string")return t.value;if(typeof t.base?.value=="string")return t.base.value}}function Ba(t,e){let r=os(e.source);return r?{fromPath:t,toPath:"",rawSpecifier:r,isStyle:P(r),type:"static"}:null}function Ua(t,e){let r=e.variable?.base?.value==="require",n=os(e.args?.[0]?.base);return!r||!n?null:{fromPath:t,toPath:"",rawSpecifier:n,isStyle:P(n),type:"require"}}function ns(t,e){if(e)return[{name:e}];let r=t.value;if(r?.constructor?.name==="Class"){let s=U(r.variable);return s?[{name:s}]:[]}if(r?.base?.constructor?.name==="Obj"&&Array.isArray(r.base.properties))return r.base.properties.map(s=>U(s.variable)??U(s)).filter(s=>!!s).map(s=>({name:s}));let n=U(r);return n?[{name:n}]:[]}function Ka(t){if(Array.isArray(t.specifiers))return t.specifiers.map(r=>r.identifier??r.original?.value).filter(r=>!!r).map(r=>({name:r}));let e=U(t.variable)??U(t.variable?.base);return e?[{name:e}]:[]}function Ha(t,e,r,n){let s=e.constructor?.name;if(s==="ImportDeclaration"){let o=Ba(t,e);o&&r.push(o)}else if(s==="Call"){let o=Ua(t,e);o&&r.push(o)}else if(s==="Assign"){let o=U(e.variable?.base),i=e.variable?.properties?.[0]?.name?.value;o==="module"&&i==="exports"?n.push(...ns(e,void 0)):o==="exports"&&typeof i=="string"&&n.push(...ns(e,i))}else s==="ExportNamedDeclaration"&&e.clause?n.push(...Ka(e.clause)):s==="ExportDefaultDeclaration"&&n.push({name:"default"})}function kr(t,e,r,n){if(!(!e||typeof e!="object")){Ha(t,e,r,n);for(let s in e){if(s==="locationData")continue;let o=e[s];if(!(!o||typeof o!="object"))if(Array.isArray(o))for(let i of o)kr(t,i,r,n);else kr(t,o,r,n)}}}function is(t,e){let r=ne(e),n=se(t,r),s=[],o=[];try{kr(t,ss.default.nodes(e),s,o)}catch{}let i=new Set,a=o.filter(c=>i.has(c.name)?!1:(i.add(c.name),!0));return{imports:s,exports:a,tags:Array.from(r).map(c=>({name:c,kind:"comment-marker"})),category:n}}var oe=require("@cucumber/gherkin"),as=require("@cucumber/messages");var Ja=as.IdGenerator.uuid();function vr(t,e){let r=new Set;try{let n=new oe.AstBuilder(Ja),s=new oe.GherkinClassicTokenMatcher,i=new oe.Parser(n,s).parse(e);i.feature&&(i.feature.tags.forEach(a=>{r.add(a.name.startsWith("@")?a.name.slice(1):a.name)}),i.feature.children.forEach(a=>{a.scenario&&(a.scenario.tags.forEach(c=>{r.add(c.name.startsWith("@")?c.name.slice(1):c.name)}),a.scenario.examples.forEach(c=>{c.tags.forEach(l=>{r.add(l.name.startsWith("@")?l.name.slice(1):l.name)})})),a.rule&&a.rule.children.forEach(c=>{c.scenario&&c.scenario.tags.forEach(l=>{r.add(l.name.startsWith("@")?l.name.slice(1):l.name)})})}))}catch(n){console.warn(`[GherkinParser] Failed to parse ${t}:`,n)}return{imports:[],exports:[],tags:Array.from(r).map(n=>({name:n,kind:"comment-marker"})),category:"test"}}re("gherkin",vr);var ps=d(require("path")),us=require("@lezer/go");function K(t){let e=[],r=t.firstChild;for(;r;)e.push(r),r=r.nextSibling;return e}function ke(t,e){let r=1;for(let n=0;n<e&&n<t.length;n++)t[n]===`
|
|
30
|
+
`&&r++;return r}function Va(t,e){let r=1;function n(s){switch(s.type.name){case"IfStatement":case"ForStatement":r++;break;case"Case":{s.firstChild?.type.name==="case"&&r++;break}case"LogicOp":{let i=e.slice(s.from,s.to);(i==="&&"||i==="||")&&r++;break}}let o=s.firstChild;for(;o;)n(o),o=o.nextSibling}return n(t),r}function Qa(t,e){let r=0;function n(s,o,i){let a=s.type.name;if(a==="IfStatement"){r+=i?1:1+o;let p=K(s),u=i?o:o+1,g=p[1];g&&g.type.name!=="Block"&&n(g,u,!1);let h=p.find(x=>x.type.name==="Block");h&&n(h,u,!1);let k=p.findIndex(x=>x.type.name==="else");if(k>=0){let x=p[k+1];x?.type.name==="IfStatement"?n(x,o,!0):x&&(r+=1,n(x,o+1,!1))}return}if(a==="ForStatement"||a==="SwitchStatement"||a==="SelectStatement"){r+=1+o;let p=s.firstChild;for(;p;)n(p,o+1,!1),p=p.nextSibling;return}if(a==="LogicOp"){let p=e.slice(s.from,s.to);(p==="&&"||p==="||")&&(r+=1)}if(o>0&&a==="FunctionLiteral"){r+=1+o;let p=s.firstChild;for(;p;)n(p,o+1,!1),p=p.nextSibling;return}let l=s.firstChild;for(;l;)n(l,o,!1),l=l.nextSibling}return n(t,0,!1),r}function at(t,e){return{complexity:Va(t,e),cognitiveComplexity:Qa(t,e)}}function Cr(t,e){let n=t.getChild("Parameters")?.getChild("Parameter"),s=n?.getChild("TypeName")??n?.getChild("PointerType")?.getChild("TypeName");return s?e.slice(s.from,s.to):void 0}function cs(t,e){let r=[],n=t.cursor();do if(n.name==="FunctionDecl"){let s=n.node.getChild("DefName");if(s){let o=e.slice(s.from,s.to),{complexity:i,cognitiveComplexity:a}=at(n.node,e);r.push({name:o,line:ke(e,n.from),complexity:i,cognitiveComplexity:a})}}else if(n.name==="MethodDecl"){let s=n.node.getChild("FieldName");if(s){let o=e.slice(s.from,s.to),i=Cr(n.node,e),a=i?`${i}.${o}`:o,{complexity:c,cognitiveComplexity:l}=at(n.node,e);r.push({name:a,line:ke(e,n.from),complexity:c,cognitiveComplexity:l})}}while(n.next());return r}var qa=/\/\/\s*@tag\s+([a-zA-Z0-9_-]+)/,Ya=/^\/\/go:build\s+(.+)$/,Xa=/^\/\/\s*\+build\s+(.+)$/;function fs(t,e){let r=[],n=new Map,s=new Set,o=new Set,i=new Map,a=us.parser.parse(e),c=a.cursor();do switch(c.name){case"LineComment":{let y=e.slice(c.from,c.to),C=y.match(qa);C?.[1]&&s.add(C[1]);let D=y.match(Ya);D&&ls(D[1],o);let N=y.match(Xa);N&&ls(N[1],o);break}case"ImportSpec":{let y=c.node.getChild("String");if(y){let D=e.slice(y.from,y.to).slice(1,-1);r.push({fromPath:t,toPath:"",rawSpecifier:D,isExternal:!0,isStyle:!1,type:"static"});let N=c.node.getChild("DefName"),O=N?e.slice(N.from,N.to):D.split("/").pop();O&&O!=="_"&&O!=="."&&i.set(O,D)}break}case"FunctionDecl":case"MethodDecl":case"TypeDecl":case"VarDecl":case"ConstDecl":{let y=c.node.getChild("DefName")??c.node.getChild("FieldName")??c.node.getChild("TypeSpec")?.getChild("DefName")??c.node.getChild("VarSpec")?.getChild("DefName")??c.node.getChild("ConstSpec")?.getChild("DefName");if(y){let C=e.slice(y.from,y.to);C!=="_"&&/^[A-Z]/.test(C)&&!n.has(C)&&n.set(C,{name:C})}break}}while(c.next());let l=r.some(y=>y.rawSpecifier==="testing"),p=ps.default.basename(t).endsWith("_test.go")||s.has("test")||l?"test":"logic",u=new Set([...s,...o]),{complexity:g,cognitiveComplexity:h}=at(a.topNode,e),k=cs(a,e),x=p==="test"?[]:Za(a,e,i);return{imports:r,exports:Array.from(n.values()),tags:Array.from(u).map(y=>({name:y,kind:"comment-marker"})),category:p,rawCallEdges:x,complexity:g,cognitiveComplexity:h,...k.length>0?{functions:k}:{}}}function Za(t,e,r){let n=[];function s(i,a){if(i.type.name==="CallExpr"){let l=i.firstChild;if(l?.type.name==="SelectorExpr"){let p=l.firstChild,u=l.getChild("FieldName");if(p?.type.name==="VariableName"&&u){let g=e.slice(p.from,p.to),h=r.get(g);if(h){let k=e.slice(u.from,u.to);n.push({from:a,to:k,toSpecifier:h})}}}}let c=i.firstChild;for(;c;)s(c,a),c=c.nextSibling}let o=t.cursor();do if(o.name==="FunctionDecl"){let i=o.node.getChild("DefName"),a=o.node.getChild("Block");if(i&&a){let c=e.slice(i.from,i.to);/^[A-Z]/.test(c)&&s(a,c)}}else if(o.name==="MethodDecl"){let i=o.node.getChild("FieldName"),a=o.node.getChild("Block");if(i&&a){let c=e.slice(i.from,i.to),l=Cr(o.node,e);s(a,l?`${l}.${c}`:c)}}while(o.next());return n}function ls(t,e){for(let r of t.split(/[\s,&|!()]+/)){let n=r.trim();n&&n!=="ignore"&&e.add(n)}}var ms=d(require("livescript"));function H(t){if(t){if(typeof t.value=="string")return t.value;if(typeof t.base?.value=="string")return t.base.value}}function ec(t){if(!t)return[];if(t.constructor?.name==="Class"){let r=H(t.title);return r?[{name:r}]:[]}if(t.constructor?.name==="Obj"&&Array.isArray(t.items))return t.items.map(r=>H(r.key)??H(r.val)).filter(r=>!!r).map(r=>({name:r}));let e=H(t);return e?[{name:e}]:[]}function tc(t){let e=t.constructor?.name||t.type;if(e==="Assign"&&t.left?.constructor?.name==="Chain"){let r=t.left,n=H(r.head),o=r.tails?.[0]?.key?.name;if(n==="module"&&o==="exports")return ec(t.right);if(n==="exports"&&typeof o=="string")return[{name:o}];if(r.head?.verb==="out"&&typeof o=="string")return[{name:o}]}if(e==="Import"&&t.left?.verb==="out"){let r=t.right;if(r?.constructor?.name==="Obj"&&Array.isArray(r.items))return r.items.map(n=>H(n.val)??H(n.key)).filter(n=>!!n).map(n=>({name:n}))}return[]}var rc=new Set(["first_line","first_column","last_line","last_column","line","column"]);function nc(t,e){let r=t.constructor?.name||t.type;if(r==="Import"){let n=t.right?.value;if(typeof n=="string"){let s=_(n);return{fromPath:e,toPath:"",rawSpecifier:s,isStyle:P(s),type:"static"}}}if(r==="Chain"&&t.head?.value==="require"){let n=t.tails?.[0];if(n?.constructor?.name==="Call"||n?.type==="Call"){let s=n.args?.[0]?.value;if(typeof s=="string"){let o=_(s);return{fromPath:e,toPath:"",rawSpecifier:o,isStyle:P(o),type:"require"}}}}return null}function wr(t,e,r){if(!t||typeof t!="object")return[];let n=[],s=nc(t,e);s&&n.push(s),r.push(...tc(t));for(let o in t){if(rc.has(o))continue;let i=t[o];if(!(!i||typeof i!="object"))if(Array.isArray(i))for(let a of i)n.push(...wr(a,e,r));else n.push(...wr(i,e,r))}return n}function gs(t,e){let r=ne(e),n=se(t,r),s=[],o=[];try{s=wr(ms.default.ast(e),t,o)}catch{}let i=new Set,a=o.filter(c=>i.has(c.name)?!1:(i.add(c.name),!0));return{imports:s,exports:a,tags:Array.from(r).map(c=>({name:c,kind:"comment-marker"})),category:n}}var ds=d(require("luaparse"));function sc(t,e){let r=[];function n(s){if(!(!s||typeof s!="object")){if((s.type==="CallExpression"||s.type==="StringCallExpression")&&s.base?.type==="Identifier"&&s.base?.name==="require"){let o;if(s.type==="CallExpression"){let i=s.arguments?.[0];i?.type==="StringLiteral"&&(o=_(i.raw))}else if(s.type==="StringCallExpression"){let i=s.argument;i?.type==="StringLiteral"&&(o=_(i.raw))}o&&r.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:P(o),type:"require"})}for(let o in s){if(o==="loc")continue;let i=s[o];if(i&&typeof i=="object")if(Array.isArray(i))for(let a of i)n(a);else n(i)}}}return n(t),r}function oc(t){let e=new Set;for(let r of t)r.type==="LocalStatement"&&r.variables.forEach((n,s)=>{r.init[s]?.type==="TableConstructorExpression"&&e.add(n.name)});return e}function ic(t){let e=t[t.length-1];if(e?.type!=="ReturnStatement")return[];let r=e.arguments[0];if(r?.type!=="TableConstructorExpression")return[];let n=[];for(let s of r.fields)s.type==="TableKeyString"&&n.push({name:s.key.name});return n}function ac(t){let e=t.body,r=oc(e),n=ic(e);for(let o of e)if(o.type==="FunctionDeclaration")o.identifier?.type==="MemberExpression"?o.identifier.base.type==="Identifier"&&r.has(o.identifier.base.name)&&n.push({name:o.identifier.identifier.name}):o.identifier?.type==="Identifier"&&!o.isLocal&&n.push({name:o.identifier.name});else if(o.type==="AssignmentStatement")for(let i of o.variables)i.type==="MemberExpression"&&i.base.type==="Identifier"&&r.has(i.base.name)&&n.push({name:i.identifier.name});let s=new Set;return n.filter(o=>s.has(o.name)?!1:(s.add(o.name),!0))}function hs(t,e){let r=ne(e),n=se(t,r),s=[],o=[];try{let i=ds.default.parse(e);s=sc(i,t),o=ac(i)}catch{}return{imports:s,exports:o,tags:Array.from(r).map(i=>({name:i,kind:"comment-marker"})),category:n}}var cc=["http://","https://","mailto:","//"],lc="ts|tsx|js|jsx|mjs|cjs|py|go|lua|css|scss|less|styl|coffee|ls|feature|md|mdx|json",pc=new RegExp(`(?:\\.{1,2}/)?[\\w.-]+(?:/[\\w.-]+)*\\.(?:${lc})\\b`,"g"),ys;async function uc(){return ys??=(async()=>{let{unified:t}=await import("unified"),e=(await import("remark-parse")).default;return t().use(e)})(),ys}function fc(t){let e=t.trim();return e.length===0||e.startsWith("#")||cc.some(r=>e.startsWith(r))}function mc(t,e){let r=t.match(pc);return r?r.map(n=>({fromPath:e,toPath:"",rawSpecifier:n,isStyle:!1,type:"static"})):[]}function xs(t,e,r){if(t.type==="link"&&typeof t.url=="string"&&!fc(t.url)&&r.push({fromPath:e,toPath:"",rawSpecifier:t.url,isStyle:!1,type:"static"}),(t.type==="code"||t.type==="inlineCode")&&typeof t.value=="string"&&r.push(...mc(t.value,e)),Array.isArray(t.children))for(let n of t.children)xs(n,e,r)}async function bs(t,e){let n=(await uc()).parse(e),s=[];xs(n,t,s);let o=new Set;return{imports:s.filter(a=>o.has(a.rawSpecifier)?!1:(o.add(a.rawSpecifier),!0)),exports:[],tags:[],category:"other"}}var ks=d(require("path")),vs=require("@lezer/python");function gc(t){let e=1;function r(n){switch(n.type.name){case"IfStatement":{e+=K(n).filter(o=>o.type.name==="if"||o.type.name==="elif").length;break}case"TryStatement":{e+=K(n).filter(o=>o.type.name==="except").length;break}case"ForStatement":case"WhileStatement":case"ConditionalExpression":e++;break;case"and":case"or":e++;break}let s=n.firstChild;for(;s;)r(s),s=s.nextSibling}return r(t),e}function dc(t){let e=0;function r(n,s){let o=n.type.name;if(o==="IfStatement"){let c=K(n),l=0,p=0;for(;p<c.length;){let u=c[p];if(u?.type.name==="if"||u?.type.name==="elif"){let g=l>0;e+=g?1:1+s;let h=g?s:s+1,k=c[p+1],x=c[p+2];k&&r(k,h),x&&r(x,h),l++,p+=3}else if(u?.type.name==="else"){e+=1;let g=c[p+1];g&&r(g,s+1),p+=2}else p++}return}if(o==="TryStatement"){let c=K(n),l=0;for(;l<c.length;){let p=c[l];if(p?.type.name==="except"){for(e+=1+s,l++;l<c.length&&c[l]?.type.name!=="Body";)r(c[l],s),l++;l<c.length&&(r(c[l],s),l++)}else p?.type.name==="Body"&&r(p,s),l++}return}if(o==="ForStatement"||o==="WhileStatement"){e+=1+s;let c=n.firstChild;for(;c;)r(c,s+1),c=c.nextSibling;return}if((o==="ConditionalExpression"||o==="and"||o==="or")&&(e+=1),s>0&&(o==="FunctionDefinition"||o==="LambdaExpression")){e+=1+s;let c=n.firstChild;for(;c;)r(c,s+1),c=c.nextSibling;return}let a=n.firstChild;for(;a;)r(a,s),a=a.nextSibling}return r(t,0),e}function Fr(t){return{complexity:gc(t),cognitiveComplexity:dc(t)}}function Ss(t,e){let r=[];function n(i,a){let{complexity:c,cognitiveComplexity:l}=Fr(i);r.push({name:a,line:ke(e,i.from),complexity:c,cognitiveComplexity:l})}function s(i){let a=i.firstChild;for(;a;)o(a),a=a.nextSibling}function o(i){if(i.type.name==="ClassDefinition"){let a=i.getChild("VariableName"),c=a?e.slice(a.from,a.to):void 0,l=i.getChild("Body");if(l){let p=l.firstChild;for(;p;){if(p.type.name==="FunctionDefinition"){let u=p.getChild("VariableName"),g=u?e.slice(u.from,u.to):void 0;g&&n(p,c?`${c}.${g}`:g),s(p)}else o(p);p=p.nextSibling}}return}if(i.type.name==="FunctionDefinition"){let a=i.getChild("VariableName");a&&n(i,e.slice(a.from,a.to)),s(i);return}s(i)}return o(t.topNode),r}var hc=new Set(["pytest","unittest","nose","hypothesis"]);function Cs(t,e){let r=[],n=[],s=new Set,o=ks.default.basename(t).toLowerCase(),i=vs.parser.parse(e),a=i.cursor();do switch(a.name){case"Comment":{let h=e.slice(a.from,a.to).match(/#\s*@tag\s+([a-zA-Z0-9_-]+)/);h?.[1]&&s.add(h[1]);break}case"ImportStatement":{for(let h of yc(a.node,e,t))r.push(h);break}case"FunctionDefinition":case"ClassDefinition":{let h=a.node.parent;if(h?.name==="Script"||h?.name==="DecoratedStatement"&&h.parent?.name==="Script"){let x=a.node.getChild("VariableName");x&&n.push({name:e.slice(x.from,x.to)})}break}case"AssignStatement":{if(a.node.parent?.name==="Script"){let h=a.node.firstChild;h?.name==="VariableName"&&n.push({name:e.slice(h.from,h.to)})}break}}while(a.next());let c=Cc(o,r,s);c==="test"&&s.add("test");let{complexity:l,cognitiveComplexity:p}=Fr(i.topNode),u=Ss(i,e),g=c==="test"?[]:vc(i,e);return{imports:r,exports:n,tags:Array.from(s).map(h=>({name:h,kind:"comment-marker"})),category:c,rawCallEdges:g,complexity:l,cognitiveComplexity:p,...u.length>0?{functions:u}:{}}}function yc(t,e,r){let n=t.firstChild;return n?n.name==="from"?xc(t,e,r):bc(t,e,r):[]}function xc(t,e,r){let n=t.firstChild;if(!n)return[];let s=n.nextSibling;for(;s&&s.name!=="import";)s=s.nextSibling;if(!s)return[];let o=e.slice(n.to,s.from).trim(),i=Sc(s.nextSibling,e);if(!i.length)return[];let a=0;for(;a<o.length&&o[a]===".";)a++;let c=o.slice(a);if(a===0)return[ve(r,o,i,!0)];let l=a===1?"./":"../".repeat(a-1);return c?[ve(r,l+c.replace(/\./g,"/"),i,!1)]:i[0]==="*"?[ve(r,l.slice(0,-1),["*"],!1)]:i.map(p=>ve(r,l+p,[p],!1))}function bc(t,e,r){let n=[],s=t.firstChild?.nextSibling??null;for(;s;){if(s.name==="VariableName"){let o=e.slice(s.from,s.to);for(;s.nextSibling?.name==="."&&s.nextSibling.nextSibling?.name==="VariableName";)s=s.nextSibling.nextSibling,o+=`.${e.slice(s.from,s.to)}`;s.nextSibling?.name==="as"&&(s=s.nextSibling.nextSibling??s.nextSibling),n.push(ve(r,o,["*"],!0))}s=s.nextSibling}return n}function Sc(t,e){let r=[],n=t;for(;n;)n.name==="*"?r.push("*"):n.name==="VariableName"&&(r.push(e.slice(n.from,n.to)),n.nextSibling?.name==="as"&&(n=n.nextSibling.nextSibling??n.nextSibling)),n=n.nextSibling;return r}function kc(t,e){let r=new Map,n=t.cursor();do{if(n.name!=="ImportStatement")continue;let o=n.node.firstChild;if(o?.type.name!=="from")continue;let i=o.nextSibling;for(;i&&i.type.name!=="import";)i=i.nextSibling;if(!i)continue;let a=e.slice(o.to,i.from).trim(),c=0;for(;c<a.length&&a[c]===".";)c++;let l=a.slice(c),p=c<=1?"./":"../".repeat(c-1),u=i.nextSibling;for(;u;){if(u.type.name==="VariableName"){let g=e.slice(u.from,u.to),h=g;if(u.nextSibling?.type.name==="as"){let x=u.nextSibling.nextSibling;x?.type.name==="VariableName"&&(h=e.slice(x.from,x.to),u=x)}let k=c===0?a:l?p+l.replace(/\./g,"/"):p+g;r.set(h,k)}u=u.nextSibling}}while(n.next());return r}function vc(t,e){let r=kc(t,e),n=[];function s(a,c){if(a.type.name==="CallExpression"&&a.firstChild?.type.name==="VariableName"){let p=a.firstChild,u=e.slice(p.from,p.to),g=r.get(u);g&&n.push({from:c,to:u,toSpecifier:g})}let l=a.firstChild;for(;l;)s(l,c),l=l.nextSibling}function o(a){let c=a.firstChild;for(;c;)i(c),c=c.nextSibling}function i(a){if(a.type.name==="ClassDefinition"){let c=a.getChild("VariableName"),l=c?e.slice(c.from,c.to):void 0,p=a.getChild("Body");if(p){let u=p.firstChild;for(;u;){if(u.type.name==="FunctionDefinition"){let g=u.getChild("VariableName"),h=g?e.slice(g.from,g.to):void 0;h&&s(u,l?`${l}.${h}`:h)}else i(u);u=u.nextSibling}}return}if(a.type.name==="FunctionDefinition"){let c=a.getChild("VariableName");c&&s(a,e.slice(c.from,c.to));return}o(a)}return i(t.topNode),n}function ve(t,e,r,n){return{fromPath:t,toPath:"",rawSpecifier:e,isStyle:!1,isExternal:n,type:"static",symbols:r.length>0?r:void 0}}function Cc(t,e,r){return t.startsWith("test_")||t.endsWith("_test.py")?"test":t==="conftest.py"||t==="setup.py"?"config":r.has("test")||e.some(n=>hc.has(n.rawSpecifier))?"test":"logic"}var Ar=d(require("path")),m=d(require("typescript"));var b=d(require("typescript"));function wc(t){let e=1;function r(n){switch(n.kind){case b.default.SyntaxKind.IfStatement:case b.default.SyntaxKind.ConditionalExpression:case b.default.SyntaxKind.ForStatement:case b.default.SyntaxKind.ForInStatement:case b.default.SyntaxKind.ForOfStatement:case b.default.SyntaxKind.WhileStatement:case b.default.SyntaxKind.DoStatement:case b.default.SyntaxKind.CatchClause:case b.default.SyntaxKind.CaseClause:e++;break;case b.default.SyntaxKind.BinaryExpression:{let s=n.operatorToken.kind;(s===b.default.SyntaxKind.AmpersandAmpersandToken||s===b.default.SyntaxKind.BarBarToken||s===b.default.SyntaxKind.QuestionQuestionToken)&&e++;break}}b.default.forEachChild(n,r)}return r(t),e}function Fc(t){let e=0;function r(n,s,o){if(b.default.isIfStatement(n)){e+=o?1:1+s;let a=o?s:s+1;r(n.expression,a,!1),r(n.thenStatement,a,!1),n.elseStatement&&(b.default.isIfStatement(n.elseStatement)?r(n.elseStatement,s,!0):(e+=1,r(n.elseStatement,s+1,!1)));return}if(b.default.isForStatement(n)||b.default.isForInStatement(n)||b.default.isForOfStatement(n)||b.default.isWhileStatement(n)||b.default.isDoStatement(n)||b.default.isSwitchStatement(n)){e+=1+s,b.default.forEachChild(n,a=>r(a,s+1,!1));return}if(b.default.isCatchClause(n)){e+=1+s,b.default.forEachChild(n,a=>r(a,s,!1));return}if(b.default.isConditionalExpression(n)&&(e+=1),b.default.isBinaryExpression(n)){let a=n.operatorToken.kind;(a===b.default.SyntaxKind.AmpersandAmpersandToken||a===b.default.SyntaxKind.BarBarToken||a===b.default.SyntaxKind.QuestionQuestionToken)&&(e+=1)}if(s>0&&(b.default.isFunctionDeclaration(n)||b.default.isFunctionExpression(n)||b.default.isArrowFunction(n))){e+=1+s,b.default.forEachChild(n,a=>r(a,s+1,!1));return}b.default.forEachChild(n,a=>r(a,s,!1))}return r(t,0,!1),e}function Tr(t){return{complexity:wc(t),cognitiveComplexity:Fc(t)}}var w=d(require("typescript")),Er=new Set(["test","describe","it"]);function ws(t,e){Tc(t,e),Ac(t,e),Pc(t,e),Nc(t,e)}function Tc(t,e){if((w.default.isFunctionDeclaration(t)||w.default.isVariableDeclaration(t))&&t.name&&w.default.isIdentifier(t.name)&&Ec(t)){let r;if(w.default.isFunctionDeclaration(t))r="function";else{let n=t.initializer;r=n&&(w.default.isArrowFunction(n)||w.default.isFunctionExpression(n))?"function":"variable"}e.tags.add({name:t.name.text,kind:r})}}function Ec(t){if(w.default.isFunctionDeclaration(t))return w.default.isSourceFile(t.parent);let e=t.parent?.parent;return!!e&&w.default.isSourceFile(e.parent)}function Ac(t,e){if(!w.default.isStringLiteral(t))return;let r=t.text.match(/@[\w-]+/g);if(r)for(let n of r)e.tags.add({name:n.substring(1),kind:"comment-marker"})}function Pc(t,e){if(!w.default.isSourceFile(t))return;let r=/@tag\s+([a-zA-Z0-9_-]+)/g,n=t.getFullText(),s=r.exec(n);for(;s!==null;)s[1]&&e.tags.add({name:s[1],kind:"comment-marker"}),s=r.exec(n)}function Nc(t,e){if(w.default.isCallExpression(t)&&Ic(t.expression))for(let r of t.arguments)w.default.isObjectLiteralExpression(r)&&Dc(r,e)}function Ic(t){return w.default.isIdentifier(t)?Er.has(t.text):!!(w.default.isPropertyAccessExpression(t)&&(Er.has(t.name.text)||w.default.isIdentifier(t.expression)&&Er.has(t.expression.text)))}function Dc(t,e){for(let r of t.properties){if(!w.default.isPropertyAssignment(r)||!w.default.isIdentifier(r.name)||r.name.text!=="tags"&&r.name.text!=="tag")continue;let{initializer:n}=r,s=w.default.isArrayLiteralExpression(n)?n.elements.filter(w.default.isStringLiteral):r.name.text==="tag"&&w.default.isStringLiteral(n)?[n]:[];for(let o of s)e.tags.add({name:o.text.replace(/^@/,""),kind:"comment-marker"})}}function Pr(t,e,r){let n=[],s=new Map,o=new Set,i=m.default.createSourceFile(t,e,m.default.ScriptTarget.Latest,!0,r==="typescript"?m.default.ScriptKind.TSX:m.default.ScriptKind.JSX),a={filePath:t,imports:n,exports:s,tags:o,rawCallEdges:[],sourceFile:i,hasUI:!1,hasTypesOnly:!0,totalStatements:0,exportStatements:0},c=x=>{Gc(x,a),m.default.forEachChild(x,c)};c(i);let l=Jc(t,a);(l==="test"||l==="barrel")&&o.add({name:l,kind:"comment-marker"}),l!=="test"&&Vc(a,i);let p=i.statements[0],u=p?Ts(p):void 0,{complexity:g,cognitiveComplexity:h}=Tr(i),k=Mc(i);return{imports:n,exports:Array.from(s.values()),tags:Array.from(o),category:l,rawCallEdges:a.rawCallEdges??[],complexity:g,cognitiveComplexity:h,...k.length>0?{functions:k}:{},...u!==void 0?{description:u}:{}}}function Mc(t){let e=[],r=(s,o)=>{let{complexity:i,cognitiveComplexity:a}=Tr(o),c=t.getLineAndCharacterOfPosition(o.getStart(t)).line+1;e.push({name:s,line:c,complexity:i,cognitiveComplexity:a})},n=(s,o)=>{if(m.default.isFunctionDeclaration(s)&&s.name&&s.body?r(s.name.text,s):m.default.isVariableDeclaration(s)&&m.default.isIdentifier(s.name)&&s.initializer&&(m.default.isArrowFunction(s.initializer)||m.default.isFunctionExpression(s.initializer))?r(s.name.text,s.initializer):o&&m.default.isMethodDeclaration(s)&&m.default.isIdentifier(s.name)&&s.body?r(`${o}.${s.name.text}`,s):o&&m.default.isConstructorDeclaration(s)&&s.body?r(`${o}.constructor`,s):o&&m.default.isGetAccessorDeclaration(s)&&m.default.isIdentifier(s.name)&&s.body?r(`${o}.get ${s.name.text}`,s):o&&m.default.isSetAccessorDeclaration(s)&&m.default.isIdentifier(s.name)&&s.body&&r(`${o}.set ${s.name.text}`,s),m.default.isClassDeclaration(s)&&s.name){let i=s.name.text;m.default.forEachChild(s,a=>n(a,i));return}m.default.forEachChild(s,i=>n(i,o))};return n(t,void 0),e}function Fs(t,e,r,n){let s={name:t},o=Ts(r);o!==void 0&&(s.doc=o);let i=Rc(e);i!==void 0&&(s.flags=i);let a=Lc(e,n);return a!==void 0&&(s.signature=a),s}function Ts(t){let e=m.default.getJSDocCommentsAndTags(t);for(let r of e)if(m.default.isJSDoc(r)&&r.comment)return m.default.getTextOfJSDocComment(r.comment)||void 0}function Rc(t){let e=new Set(["deprecated","internal","public","alpha","beta"]),r=m.default.getJSDocTags(t).map(n=>n.tagName.text).filter(n=>e.has(n));return r.length>0?r:void 0}function Lc(t,e){let r=m.default.createPrinter({removeComments:!0}),n=s=>r.printNode(m.default.EmitHint.Unspecified,s,e);if(m.default.isFunctionDeclaration(t)||m.default.isMethodDeclaration(t)){let s=t.parameters.map(n).join(", "),o=t.type?n(t.type):"void";return`${t.typeParameters?`<${t.typeParameters.map(a=>a.name.text).join(", ")}>`:""}(${s}) => ${o}`}if(m.default.isVariableDeclaration(t)){if(t.type)return n(t.type);if(t.initializer&&(m.default.isArrowFunction(t.initializer)||m.default.isFunctionExpression(t.initializer))){let s=t.initializer,o=s.parameters.map(n).join(", "),i=s.type?n(s.type):"unknown";return`(${o}) => ${i}`}return}if(m.default.isClassDeclaration(t)&&t.name)return`class ${t.name.text}`;if(m.default.isInterfaceDeclaration(t))return`interface ${t.name.text}`;if(m.default.isTypeAliasDeclaration(t))return n(t.type);if(m.default.isEnumDeclaration(t))return`enum ${t.name.text}`}function Gc(t,e){_c(t,e),Oc(t,e),Wc(t,e),zc(t,e),Hc(t,e),ws(t,e)}function _c(t,e){if(!m.default.isSourceFile(t))return;let r=t.statements.filter(n=>!m.default.isEmptyStatement(n));e.totalStatements=r.length,e.exportStatements=r.filter(n=>m.default.isExportDeclaration(n)||m.default.isExportAssignment(n)||Nr(n)).length}function Oc(t,e){if(m.default.isJsxElement(t)||m.default.isJsxSelfClosingElement(t)||m.default.isJsxFragment(t)){e.hasUI=!0,e.hasTypesOnly=!1;return}if(m.default.isFunctionDeclaration(t)||m.default.isMethodDeclaration(t)||m.default.isArrowFunction(t)||m.default.isClassDeclaration(t)||m.default.isVariableStatement(t)||m.default.isEnumDeclaration(t)){e.hasTypesOnly=!1;return}m.default.isExportDeclaration(t)&&!jc(t)&&(e.hasTypesOnly=!1)}function jc(t){return t.isTypeOnly?!0:!t.exportClause||!m.default.isNamedExports(t.exportClause)?!1:t.exportClause.elements.every(e=>e.isTypeOnly)}function Wc(t,e){if(!m.default.isImportDeclaration(t)||!t.moduleSpecifier||!m.default.isStringLiteral(t.moduleSpecifier))return;let r=[];if(t.importClause&&(t.importClause.name&&r.push("default"),t.importClause.namedBindings))if(m.default.isNamedImports(t.importClause.namedBindings))for(let s of t.importClause.namedBindings.elements)r.push(s.name.text);else m.default.isNamespaceImport(t.importClause.namedBindings)&&r.push("*");let n=r.length>0?"static":"side-effect";e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:t.moduleSpecifier.text,isStyle:P(t.moduleSpecifier.text),type:n,symbols:r.length>0?r:void 0})}function zc(t,e){m.default.isExportDeclaration(t)?$c(t,e):m.default.isExportAssignment(t)?e.exports.set("default",{name:"default"}):Nr(t)&&Kc(t,e)}function $c(t,e){if(t.moduleSpecifier&&m.default.isStringLiteral(t.moduleSpecifier))Bc(t,t.moduleSpecifier.text,e);else if(t.exportClause&&m.default.isNamedExports(t.exportClause))for(let r of t.exportClause.elements){let n=r.name.text;e.exports.set(n,{name:n})}}function Bc(t,e,r){let n=Uc(t),s={fromPath:r.filePath,toPath:"",rawSpecifier:e,isStyle:P(e),type:"re-export"};n.length>0&&(s.symbols=n),r.imports.push(s)}function Uc(t){return t.exportClause?m.default.isNamedExports(t.exportClause)?t.exportClause.elements.map(e=>e.name.text):[]:["*"]}function Kc(t,e){if((m.default.isFunctionDeclaration(t)||m.default.isClassDeclaration(t)||m.default.isInterfaceDeclaration(t)||m.default.isTypeAliasDeclaration(t)||m.default.isEnumDeclaration(t))&&t.name){let n=t.name.text;e.exports.set(n,Fs(n,t,t,e.sourceFile));return}if(m.default.isVariableStatement(t)){for(let n of t.declarationList.declarations)if(m.default.isIdentifier(n.name)){let s=n.name.text;e.exports.set(s,Fs(s,n,t,e.sourceFile))}}}function Hc(t,e){if(!m.default.isCallExpression(t))return;let r=t.arguments[0];!r||!m.default.isStringLiteral(r)||(t.expression.kind===m.default.SyntaxKind.ImportKeyword?e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:P(r.text),type:"dynamic"}):m.default.isIdentifier(t.expression)&&t.expression.text==="require"&&e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:P(r.text),type:"require"}))}function Jc(t,e){let r=Ar.default.basename(t).toLowerCase(),n=Ar.default.extname(t).toLowerCase();return ce().some(o=>r.includes(o))?"test":zr(r)?"config":e.imports.some(o=>xt().some(i=>o.rawSpecifier.includes(i)))?"test":n===".tsx"||n===".jsx"||e.hasUI?"ui":e.hasTypesOnly&&e.totalStatements>0?"type-only":e.totalStatements>0&&e.exportStatements/e.totalStatements>St()?"barrel":"logic"}function Nr(t){return m.default.canHaveModifiers(t)&&m.default.getModifiers(t)?.some(e=>e.kind===m.default.SyntaxKind.ExportKeyword)===!0}function Vc(t,e){let r=t.rawCallEdges??[];t.rawCallEdges=r;let n=new Map;for(let s of e.statements){if(!m.default.isImportDeclaration(s)||!m.default.isStringLiteral(s.moduleSpecifier))continue;let o=s.moduleSpecifier.text,i=s.importClause;if(i&&(i.name&&n.set(i.name.text,o),i.namedBindings&&m.default.isNamedImports(i.namedBindings)))for(let a of i.namedBindings.elements)n.set(a.name.text,o)}if(n.size!==0)for(let s of e.statements){let o=qc(s);if(o){let i=Yc(s);i&&ct(i,o,n,r);continue}m.default.isClassDeclaration(s)&&s.name&&Qc(s,s.name.text,n,r)}}function Qc(t,e,r,n){for(let s of t.members)m.default.isMethodDeclaration(s)&&s.body&&m.default.isIdentifier(s.name)?ct(s.body,`${e}.${s.name.text}`,r,n):m.default.isConstructorDeclaration(s)&&s.body&&ct(s.body,`${e}.constructor`,r,n)}function qc(t){if(Nr(t)){if(m.default.isFunctionDeclaration(t)&&t.name)return t.name.text;if(m.default.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(m.default.isIdentifier(e.name)&&e.initializer&&(m.default.isArrowFunction(e.initializer)||m.default.isFunctionExpression(e.initializer)))return e.name.text}}}function Yc(t){if(m.default.isFunctionDeclaration(t))return t.body;if(m.default.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(e.initializer&&(m.default.isArrowFunction(e.initializer)||m.default.isFunctionExpression(e.initializer)))return e.initializer}}function ct(t,e,r,n){if(m.default.isCallExpression(t)&&m.default.isIdentifier(t.expression)){let s=t.expression.text,o=r.get(s);o&&!n.some(i=>i.from===e&&i.to===s&&i.toSpecifier===o)&&n.push({from:e,to:s,toSpecifier:o})}m.default.forEachChild(t,s=>ct(s,e,r,n))}function lt(t,e){if(e.length===0)return"ui";let r=!1;return t.walk(n=>{if(n.type==="rule")return r=!0,!1}),r?"ui":"barrel"}function Es(t,e){let r=[],n=/@require\s+['"]([^'"]+)['"]/g,s=n.exec(t);for(;s!==null;){let i=s[1];i&&r.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:"require"}),s=n.exec(t)}let o=/(?<!@)(?:import|require)\s*\(?\s*['"]([^'"]+)['"]/g;for(s=o.exec(t);s!==null;){let i=s[1];i&&r.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:"static"}),s=o.exec(t)}return r}function As(t,e){if(e.length===0)return"ui";try{let r=require("stylus");return new r.Parser(t).parse().nodes.some(o=>o.constructor.name!=="Import")?"ui":"barrel"}catch{return t.replace(/^\s*@?(?:require|import)\b.*/gm,"").trim().length>0?"ui":"barrel"}}function Ce(t,e){let r=G(t);if(r==="stylus"){let o=Es(e,t);return{imports:o,exports:[],tags:[],category:As(e,o)}}if(r==="scss"){let{imports:o,root:i,exports:a,tags:c}=We(e,t);return{imports:o,exports:a,tags:c,category:lt(i,o)}}if(r==="less"){let{imports:o,root:i,exports:a,tags:c}=je(e,t);return{imports:o,exports:a,tags:c,category:lt(i,o)}}let{imports:n,root:s}=Oe(e,t);return{imports:n,exports:[],tags:[],category:lt(s,n)}}for(let[t,e]of[["javascript",(r,n)=>Pr(r,n,"javascript")],["typescript",(r,n)=>Pr(r,n,"typescript")],["css",Ce],["scss",Ce],["less",Ce],["stylus",Ce],["coffeescript",is],["livescript",gs],["lua",hs],["python",Cs],["go",fs],["gherkin",vr],["markdown",bs]])re(t,e);async function Ps(t,e){let r=G(t),n=_n(r);return n?n(t,e):{imports:[],exports:[],tags:[],category:"other"}}var Ir=d(require("path"));function Xc(t,e){let r=e.get(t.path);r!==void 0&&(t.coveragePct=r)}function Is(t,e){for(let r of t)if(r.isExternal){let n=r.rawSpecifier.startsWith("@")?r.rawSpecifier.split("/").slice(0,2).join("/"):r.rawSpecifier.split("/")[0];n&&!e.some(s=>s.name===n)&&e.push({name:n,kind:"library"})}}function Zc(t,e,r){if(e.isExternal||!e.toPath)return;let n=r.get(e.toPath);n&&(n.category!=="logic"&&n.category!=="barrel"||(n.testedBy??=[],n.testedBy.includes(t.path)||n.testedBy.push(t.path)))}function el(t,e){if(t.type==="markdown")for(let r of t.imports){if(r.isExternal||!r.toPath)continue;let n=e.get(r.toPath);!n||n===t||(n.documentedBy??=[],n.documentedBy.includes(t.path)||n.documentedBy.push(t.path),n.category==="logic"&&(n.lastCommitAt??0)>(t.lastCommitAt??0)&&(t.staleFor??=[],t.staleFor.includes(n.path)||t.staleFor.push(n.path)))}}function Ns(t){return Math.round(t*1e4)/1e4}function tl(t,e){let r=[];for(let n of t.imports){if(n.isExternal||!n.toPath)continue;let s=e.get(n.toPath);if(!s||s.exports.length===0)continue;let o;if(n.symbols===void 0){if(n.type==="side-effect")continue;o=1}else n.symbols.includes("*")?o=1:o=n.symbols.length/s.exports.length;n.exportUsageRatio=Ns(Math.min(1,o)),r.push(n.exportUsageRatio)}r.length>0&&(t.avgExportUsage=Ns(r.reduce((n,s)=>n+s,0)/r.length),t.maxExportUsage=Math.max(...r))}function Dr(t,e,r){e&&(t.some(n=>n.name===e&&n.kind===r)||t.push({name:e,kind:r}))}function rl(t,e){let r=e.toPath,n=Ir.default.basename(r,Ir.default.extname(r)).replace(/\.(test|spec)$/,"");Dr(t.tags,n,"import")}function nl(t,e){if(!(!e.symbols||e.symbols.includes("*")))for(let r of e.symbols)Dr(t.tags,r,"import")}function sl(t,e,r){let n=r.get(e.toPath);if(!(!n||n.category==="test"))for(let s of n.tags)s.kind==="comment-marker"&&Dr(t.tags,s.name,"comment-marker")}function ol(t,e,r){!e.toPath||e.isExternal||(rl(t,e),nl(t,e),sl(t,e,r))}function Ds(t,e){for(let r of t.values())delete r.testedBy,delete r.documentedBy,delete r.staleFor,r.category==="test"&&(r.tags=r.tags.filter(n=>n.kind!=="import"));for(let r of t.values()){if(tl(r,t),e.size>0&&Xc(r,e),r.category==="test")for(let n of r.imports)Zc(r,n,t),ol(r,n,t);el(r,t)}}var Pe=d(require("fs")),R=d(require("path"));var Mr=d(require("fs")),J=d(require("path")),we=class{extensions=[".go"];goModCache=new Map;resolve(e,r,n,s){let{mod:o,replaces:i}=this.readGoMod(n);if(!o)return null;let a=this.applyReplace(r,i,n);if(a!==void 0)return Rs(a);if(r!==o&&!r.startsWith(`${o}/`))return null;let c=r.slice(o.length).replace(/^\//,"");return c?Rs(J.default.join(n,c)):null}readGoMod(e){let r=this.goModCache.get(e);if(r!==void 0)return r;let n={mod:null,replaces:new Map};try{let s=Mr.default.readFileSync(J.default.join(e,"go.mod"),"utf-8"),o=il(s,e);return this.goModCache.set(e,o),o}catch{return this.goModCache.set(e,n),n}}applyReplace(e,r,n){for(let[s,o]of r){if(e===s)return o;if(e.startsWith(`${s}/`)){let i=e.slice(s.length+1);return J.default.join(o,i)}}}};function il(t,e){let r=t.split(`
|
|
31
|
+
`),n=null,s=new Map,o=!1;for(let i of r){let a=i.trim();if(a.startsWith("module ")){n=a.slice(7).trim();continue}if(/^replace\s*\(/.test(a)){o=!0;continue}if(o&&a===")"){o=!1;continue}if(o&&a.includes("=>")){Ms(a,e,s);continue}!o&&/^replace\s+/.test(a)&&a.includes("=>")&&Ms(a.replace(/^replace\s+/,""),e,s)}return{mod:n,replaces:s}}function Ms(t,e,r){let[n,s]=t.split("=>").map(a=>a.trim());if(!n||!s)return;let o=n.split(/\s+/)[0];if(!s.startsWith(".")&&!s.startsWith("/"))return;let i=J.default.isAbsolute(s)?s:J.default.resolve(e,s);r.set(o,i)}function Rs(t){let e;try{e=Mr.default.readdirSync(t,{withFileTypes:!0})}catch{return null}let r=e.filter(n=>n.isFile()&&n.name.endsWith(".go")&&!n.name.endsWith("_test.go")).map(n=>({path:J.default.join(t,n.name),isExternal:!1})).sort((n,s)=>n.path.localeCompare(s.path));return r.length>0?r:null}var Ls=d(require("fs")),pt=d(require("path")),Fe=class{extensions=[".lua"];resolve(e,r,n,s){let o=r.replace(/\./g,pt.default.sep),i=[n,pt.default.join(n,"lib")];for(let a of i){if(!Ls.default.existsSync(a))continue;let c=s(pt.default.join(a,"_dummy.lua"),o);if(c)return[c]}return null}};var Gs=d(require("path")),Te=class{extensions=[".md",".mdx"];resolve(e,r,n,s){let o=s(Gs.default.join(n,"_dummy"),`./${r}`);return o?[o]:null}};var Os=d(require("fs")),ut=d(require("path")),Ee=class{extensions=[".py"];resolve(e,r,n,s){let o=r.replace(/\./g,ut.default.sep),i=ut.default.join(n,`${o}.py`);if(_s(i))return[{path:i,isExternal:!1}];let a=ut.default.join(n,o,"__init__.py");return _s(a)?[{path:a,isExternal:!1}]:null}};function _s(t){try{return Os.default.statSync(t,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}var Rr=d(require("path")),al=["~","http://","https://","//","data:","sass:"],Ae=class{extensions=[".css",".scss",".sass",".less",".styl"];resolve(e,r,n,s){if(al.some(p=>r.startsWith(p)))return null;let o=s(e,r);if(o)return[o];let i=Rr.default.dirname(r),a=Rr.default.basename(r),c=i==="."?`_${a}`:`${i}/_${a}`,l=s(e,c);return l?[l]:null}};var V=class{constructor(e,r={}){this.rootDir=e;this.workspaceMap=r.workspaceMap??new Map,this.tsconfigSearchPaths=r.tsconfigSearchPaths??[e],this.pathAliases=r.pathAliases,this.langResolvers=r.langResolvers??[new Ee,new Fe,new we,new Ae,new Te]}rootDir;workspaceMap;tsconfigSearchPaths;pathAliases;langResolvers;resolutionCache=new Map;langBucketFor(e){for(let r=0;r<this.langResolvers.length;r++)if(this.langResolvers[r]?.extensions.some(n=>e.endsWith(n)))return String(r);return"none"}cacheKey(e,r){return`${R.default.dirname(e)}\0${this.langBucketFor(e)}\0${r}`}resolveAll(e,r){let n=this.cacheKey(e,r),s=this.resolutionCache.get(n);if(s!==void 0)return s??[];let o=this.resolveAllUncached(e,r);return this.resolutionCache.set(n,o.length>0?o:null),o}resolveAllUncached(e,r){let n=this.resolvePathAlias(r);if(n)return[n];if(r.startsWith(".")||r.startsWith("/")){let i=this.resolveLocalPath(e,r);return i?[i]:[]}let s=(i,a)=>this.resolveLocalPath(i,a);for(let i of this.langResolvers)if(i.extensions.some(a=>e.endsWith(a))){let a=i.resolve(e,r,this.rootDir,s);if(a)return a}let o=this.resolveWorkspaceImport(r);return o?[o]:[{path:r,isExternal:!0}]}resolve(e,r){return this.resolveAll(e,r)[0]??null}resolveLocalPath(e,r){let n=R.default.dirname(e),s=r.startsWith("/")?r:R.default.resolve(n,r),o=!s.startsWith(this.rootDir),i=["",".ts",".tsx",".js",".jsx",".mjs",".cjs",".css",".scss",".sass",".less",".styl",".coffee",".ls",".lua",".py",".feature",".md",".mdx"],a=s.match(/\.(js|mjs|cjs)$/);if(a){let c=s.slice(0,-a[0].length);for(let l of[".ts",".tsx"]){let p=this.tryExtensions(c,l,o);if(p)return p}}for(let c of i){let l=this.tryExtensions(s,c,o);if(l)return l}return o?{path:s,isExternal:!0}:null}tryExtensions(e,r,n){let s=e+r;if(this.isFile(s))return{path:s,isExternal:n};let o=R.default.join(e,`index${r}`);if(this.isFile(o))return{path:o,isExternal:n};if(r===".py"){let i=R.default.join(e,"__init__.py");if(this.isFile(i))return{path:i,isExternal:n}}return null}isFile(e){try{return Pe.default.statSync(e,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}resolvePathAlias(e){if(this.pathAliases)for(let r in this.pathAliases){let n=this.matchAliasPattern(r,e),s=this.pathAliases[r];if(n&&s){let o=this.tryAliasSubstitutions(s,n[1]||"");if(o)return o}}for(let r of this.tsconfigSearchPaths){let n=R.default.join(r,"tsconfig.json");if(Pe.default.existsSync(n))try{let o=JSON.parse(Pe.default.readFileSync(n,"utf-8")).compilerOptions?.paths;if(!o)continue;for(let i in o){let a=this.matchAliasPattern(i,e);if(a){let c=this.tryAliasSubstitutions(o[i],a[1]||"",r);if(c)return c}}}catch{}}return null}aliasRegexCache=new Map;matchAliasPattern(e,r){let n=this.aliasRegexCache.get(e);if(!n){let s=e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace("\\*","(.*)");n=new RegExp(`^${s}$`),this.aliasRegexCache.set(e,n)}return r.match(n)}tryAliasSubstitutions(e,r,n=this.rootDir){let s=["",".ts",".tsx",".js",".jsx",".coffee",".ls",".lua",".feature"];for(let o of e){let i=o.replace("*",r),a=R.default.resolve(n,i);for(let c of s){let l=this.tryExtensions(a,c,!1);if(l)return l}}return null}resolveWorkspaceImport(e){if(this.workspaceMap.size===0)return null;for(let[r,n]of this.workspaceMap){if(e!==r&&!e.startsWith(`${r}/`))continue;let s=e.slice(r.length),o={path:"",isExternal:!1,isWorkspace:!0,workspacePackage:r};if(!s){for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"]){let c=R.default.join(n,a);try{if(Pe.default.statSync(c,{throwIfNoEntry:!1})?.isFile())return{...o,path:c}}catch{}}return{...o,path:n}}let i=this.resolveLocalPath(R.default.join(n,"_dummy"),s.slice(1));return i?{...o,path:i.path}:null}return null}};var cl=["tests","test","__tests__","specs","spec"],js=new Set(["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"]),ll=600;function pl(t,e){if(t.length===0)return e;let r=t.map(i=>E.default.dirname(i).split(E.default.sep)),n=r[0]??[];for(let i of r.slice(1)){let a=0;for(;a<n.length&&a<i.length&&n[a]===i[a];)a++;n=n.slice(0,a)}let s=n.join(E.default.sep)||E.default.sep,o=E.default.relative(e,s);return o.startsWith("..")||E.default.isAbsolute(o)?e:s}var Ne=class{constructor(e,r=null,n,s,o=!1,i=new Map,a=!0){this.rootDir=e;this.enableGitStats=o;this.coverageMap=i;this.parallelParsing=a;this.previousGraph=r,this.resolver=n||new V(e),this.lockFile=Zr(e),s&&(this.progressCallback=s)}rootDir;enableGitStats;coverageMap;parallelParsing;graph={nodes:new Map};visited=new Set;queue=[];previousGraph=null;resolver;lockFile=null;progressCallback;pool=null;gitStatsMap=null;async build(e){let r=e.map(n=>E.default.isAbsolute(n)?n:E.default.resolve(this.rootDir,n));await this.initPool(),this.enableGitStats&&(this.gitStatsMap=rs(this.rootDir));try{for(let n of r)this.enqueue(n);return await this.drain(),await this.processTestFiles(pl(r,this.rootDir)),await this.processDocFiles(),this.progressCallback&&this.visited.size>=100&&process.stderr.write(`
|
|
30
32
|
Done. Total processed: ${this.visited.size} nodes.
|
|
31
|
-
`),
|
|
33
|
+
`),Ds(this.graph.nodes,this.coverageMap),new I(this.graph.nodes)}finally{this.pool&&(await this.pool.destroy(),this.pool=null)}}async initPool(){if(this.parallelParsing===!1)return;let e=typeof this.parallelParsing=="object"?this.parallelParsing:{},r=e.minFiles??ll;if(!(r>0&&!this.hasAtLeastFiles(this.rootDir,r))){e.maxThreads!==void 0&&e.maxThreads<1&&process.stderr.write(`
|
|
34
|
+
Warning: parallelParsing.maxThreads (${e.maxThreads}) must be at least 1; using 1.
|
|
35
|
+
`);try{let n=E.default.join(__dirname,"parse-worker.js");this.pool=new Ws.default({filename:n,...e.maxThreads!==void 0?{maxThreads:Math.max(1,e.maxThreads)}:{}})}catch(n){process.stderr.write(`
|
|
32
36
|
Warning: failed to start parse worker pool, falling back to synchronous parsing: ${n}
|
|
33
|
-
`),this.pool=null}}hasAtLeastFiles(e,r){let n=0,s=[e];for(;s.length>0;){let o=s.pop();if(o===void 0)continue;let i;try{i=
|
|
37
|
+
`),this.pool=null}}}hasAtLeastFiles(e,r){let n=0,s=[e];for(;s.length>0;){let o=s.pop();if(o===void 0)continue;let i;try{i=ie.default.readdirSync(o,{withFileTypes:!0})}catch{continue}for(let a of i)if(a.isDirectory())js.has(a.name)||s.push(E.default.join(o,a.name));else if(a.isFile()&&(n++,n>=r))return!0}return n>=r}async processTestFiles(e){let r=ce(),n=o=>r.some(i=>o.name.includes(i));this.walkProject(e,n);let s=e;for(;s!==this.rootDir;){let o=E.default.dirname(s);if(o===s)break;for(let i of cl){let a=E.default.join(o,i);try{ie.default.statSync(a).isDirectory()&&this.walkProject(a,n)}catch{}}s=o}await this.drain()}async processDocFiles(){this.walkProject(this.rootDir,e=>e.name.endsWith(".md")||e.name.endsWith(".mdx")),await this.drain()}walkProject(e,r){let n;try{n=ie.default.readdirSync(e,{withFileTypes:!0})}catch{return}for(let s of n){let o=E.default.join(e,s.name);s.isDirectory()?js.has(s.name)||this.walkProject(o,r):s.isFile()&&r(s)&&this.enqueue(o)}}enqueue(e){this.visited.has(e)||(this.visited.add(e),this.showProgress(),this.queue.push(e))}async drain(){for(;this.queue.length>0;){let e=this.queue;this.queue=[],await Promise.all(e.map(r=>this.finishFile(r)))}}async finishFile(e){let r=ie.default.statSync(e,{throwIfNoEntry:!1});if(!r?.isFile())return;let n=E.default.relative(this.rootDir,e),s=await this.getNode(e,n,r);s.imports=await this.resolveImports(e,s.imports),Is(s.imports,s.tags),this.graph.nodes.set(s.path,s)}async getNode(e,r,n){let s=this.previousGraph?.nodes.get(r);if(s&&s.mtime===n.mtimeMs&&s.size===n.size)return{...s};let o=await this.tryParse(e,r);if(!o)return this.makeStubNode(e,r,n);let i=this.resolveCallEdges(e,o.rawCallEdges),a=this.buildNode(e,r,n,o,i);return this.attachGitStats(a,r),a}async tryParse(e,r){let n=ie.default.readFileSync(e,"utf-8");try{return await this.parseContent(e,n)}catch(s){return process.stderr.write(`
|
|
34
38
|
Warning: failed to parse ${r}: ${s}
|
|
35
|
-
`),null}}parseContent(e,r){return this.pool?this.pool.run({filePath:e,content:r}):Ss(e,r)}makeStubNode(e,r,n){return{path:r,type:G(e),category:"other",imports:[],exports:[],tags:[],mtime:n.mtimeMs,size:n.size}}resolveCallEdges(e,r){let n=[];for(let s of r??[])try{let o=this.resolver.resolve(e,s.toSpecifier);o&&!o.isExternal&&n.push({from:s.from,to:s.to,toFile:E.default.relative(this.rootDir,o.path)})}catch{}return n}buildNode(e,r,n,s,o){let{imports:i,exports:a,tags:c,category:l,description:p,complexity:u,cognitiveComplexity:g,functions:h}=s;return{path:r,type:G(e),category:l,imports:i,exports:a,tags:c,mtime:n.mtimeMs,size:n.size,...p!==void 0?{description:p}:{},...o.length>0?{callEdges:o}:{},...u!==void 0?{complexity:u}:{},...g!==void 0?{cognitiveComplexity:g}:{},...h!==void 0?{functions:h}:{}}}attachGitStats(e,r){let n=this.gitStatsMap?.get(r);n&&(e.commitCount90d=n.commitCount90d,n.lastAuthor!==void 0&&(e.lastAuthor=n.lastAuthor),n.lastCommitAt!==void 0&&(e.lastCommitAt=n.lastCommitAt))}async resolveImports(e,r){let n=[];for(let s of r){let o=this.resolver.resolveAll(e,s.rawSpecifier);if(o.length!==0)for(let i of o){let a={...s,toPath:i.isExternal?i.path:E.default.relative(this.rootDir,i.path),isExternal:i.isExternal};i.isWorkspace&&(a.isWorkspace=!0,a.workspacePackage=i.workspacePackage),i.isExternal?this.attachLockfileVersion(a):this.enqueue(i.path),n.push(a)}}return n}attachLockfileVersion(e){if(!this.lockFile)return;let r=e.rawSpecifier.startsWith("@")?e.rawSpecifier.split("/").slice(0,2).join("/"):e.rawSpecifier.split("/")[0],n=r?this.lockFile.dependencies[r]:void 0;n&&(e.version=n.version)}showProgress(){this.progressCallback&&this.visited.size%100===0&&this.progressCallback(this.visited.size)}};function Gs(t,e){return{identifier:e?.identifier??new et,featureMap:e?.featureDetection===!1?new Map:W(t.nodes,e?.featureDetection??void 0)}}function _s(t,e,r,n,s){for(let o of e){let i=t.nodes.get(o);if(!i)continue;let a=new z(o,["*",...i.exports.map(c=>c.name)]);t.traverse(o,(c,l,p)=>{if(!p)return!0;if(!a.updateAffectedSymbols(c,p))return!1;if(l>0){let u=r.get(c.path);if(u)return n(u),!1}return s(c),!0},{direction:"incoming"})}}function Er(t,e,r){let{identifier:n,featureMap:s}=Gs(t,r),o=new Set;for(let i of e){let a=s.get(i);a&&o.add(a.tag)}return _s(t,e,s,i=>o.add(i.tag),i=>{if(n.isTestNode(i))for(let a of i.tags)o.add(a.name)}),Array.from(o)}function Pr(t,e,r){let{identifier:n,featureMap:s}=Gs(t,r),o=new Set;return _s(t,e,s,()=>{},i=>{n.isTestNode(i)&&o.add(i.path)}),Array.from(o)}var Os=d(require("fs")),ie=d(require("path"));async function js(t,e,r=null,n={}){let s=n.silent?void 0:a=>{process.stderr.write(`Processed ${a} files...\r`)},o=ie.default.resolve(t);return await new Ae(o,r,n.pathAliases?new H(o,{pathAliases:n.pathAliases}):void 0,s,n.gitStats??!1,n.coverageMap??new Map,n.parallelParsing??!0).build(e)}async function Ws(t,e={}){let r=ie.default.resolve(t),n=he(r),s=e.packages?n.packages.filter(a=>e.packages?.includes(a.name)||e.packages?.includes(a.relativeRoot)):n.packages,o=new Map(n.packages.map(a=>[a.name,a.root])),i=new ye(r,n.type);for(let a of s){let c=e.silent?void 0:u=>{process.stderr.write(`[${a.name}] Processed ${u} files...\r`)},p=await new Ae(r,null,new H(r,{workspaceMap:o,tsconfigSearchPaths:[a.root,r],pathAliases:e.pathAliases}),c,e.gitStats??!1,new Map,e.parallelParsing??!0).build(a.entryPoints);i.addPackage(a,p)}return i}function zs(t,e={}){let r=[],n=new Set([...e.ignoreDirs??j,...e.additionalIgnoreDirs??[]]),s=new Set([...e.extensions??yt,...e.additionalExtensions??[]]);function o(i){try{let a=Os.default.readdirSync(i,{withFileTypes:!0});for(let c of a){let l=ie.default.join(i,c.name);c.isDirectory()?n.has(c.name)||o(l):c.isFile()&&s.has(ie.default.extname(c.name).toLowerCase())&&r.push(ie.default.relative(t,l))}}catch{}}return o(t),r}var $s=/(?:^|[/\\])(?:node_modules|\.git|dist|build|coverage)(?:[/\\]|$)/;var ct=class{graphs=new Map;configs=new Map;workspaceGraphs=new Map;changeImpactCaches=new Map;dirtyRoots=new Set;watchers=new Map;lastAnalyze=new Map;duplicationTokenCaches=new Map;isConfigured(e){return this.configs.has(e)}storeConfig(e,r){this.configs.set(e,r)}getConfig(e){return this.configs.get(e)}async getOrBuild(e,r,n=new Map){let s=this.configs.get(e),o=await js(e,r,this.graphs.get(e)??null,{...Y(s),coverageMap:n});return this.graphs.set(e,o),o}require(e){let r=this.graphs.get(e);if(!r)throw new Error('No graph cached for this root. Call "analyze" first.');return r}async getOrBuildWorkspace(e,r={}){let n=this.workspaceGraphs.get(e);if(n)return n;let s=await Ws(e,r);return this.workspaceGraphs.set(e,s),s}requireWorkspace(e){let r=this.workspaceGraphs.get(e);if(!r)throw new Error('No workspace graph cached for this root. Call "analyze" first.');return r}hasWorkspace(e){return this.workspaceGraphs.has(e)}getOrBuildChangeImpact(e){let r=this.changeImpactCaches.get(e);if(r)return r;let n=this.require(e),s=Ft(n);return this.changeImpactCaches.set(e,s),s}storeLastAnalyze(e,r){this.lastAnalyze.set(e,r)}startWatching(e){if(!this.watchers.has(e))try{let r=Bs.default.watch(e,{recursive:!0},(n,s)=>{!s||$s.test(s)||this.dirtyRoots.add(e)});r.on("error",()=>{this.watchers.delete(e)}),this.watchers.set(e,r)}catch{}}async ensureFresh(e){if(!this.dirtyRoots.has(e))return this.require(e);this.dirtyRoots.delete(e),this.changeImpactCaches.delete(e);let r=this.lastAnalyze.get(e);return r?.kind==="single"?this.getOrBuild(e,r.entryPoints,r.coverageMap):this.require(e)}async ensureFreshWorkspace(e){if(!this.dirtyRoots.has(e))return this.requireWorkspace(e);this.dirtyRoots.delete(e),this.changeImpactCaches.delete(e),this.workspaceGraphs.delete(e);let r=this.configs.get(e);return this.getOrBuildWorkspace(e,Y(r))}getDuplicationTokenCache(e){let r=this.duplicationTokenCaches.get(e);return r||(r=new Map,this.duplicationTokenCaches.set(e,r)),r}invalidate(e){let r=this.graphs.has(e)||this.workspaceGraphs.has(e);return this.graphs.delete(e),this.workspaceGraphs.delete(e),this.changeImpactCaches.delete(e),this.dirtyRoots.delete(e),this.duplicationTokenCaches.delete(e),r}};var Q=d(require("path"));var Us=d(require("fs")),Ks=d(require("os")),lt=d(require("path"));function S(t){return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}}function Js(t){if(!lt.default.isAbsolute(t))throw new Error("root must be an absolute path");let e=lt.default.resolve(t),r=Ks.default.homedir();if(e!==r&&!e.startsWith(r+lt.default.sep))throw new Error("root must be within the user home directory");let n;try{n=Us.default.statSync(e)}catch{throw new Error("root does not exist")}if(!n.isDirectory())throw new Error("root is not a directory")}async function Vs(t,e){let{root:r,entryPoints:n}=e;if(!t.isConfigured(r)){let g=ce(r,{allowJs:!1});ht(g),t.storeConfig(r,g)}if(n.length===0){let g=he(r);if(g.type!=="none"){let h=t.getConfig(r),k=await t.getOrBuildWorkspace(r,Y(h));t.storeLastAnalyze(r,{kind:"workspace"}),t.startWatching(r);let x=Array.from(k.packages.values()).map(({graph:y,pkg:w})=>({package:w.name,relativeRoot:w.relativeRoot,nodeCount:y.nodes.size}));return S({monorepoType:g.type,packageCount:k.packages.size,packages:x})}}let s=n.map(g=>Q.default.resolve(r,g)),o=t.getConfig(r),i=o?.coverageReportPath?bt(r,o.coverageReportPath):new Map,a=await t.getOrBuild(r,s,i);t.storeLastAnalyze(r,{kind:"single",entryPoints:s,coverageMap:i}),t.startWatching(r);let c=a.serialize(),l=c.nodes.reduce((g,h)=>(g[h.category]=(g[h.category]??0)+1,g),{}),p=a.findCycles(),u=Dt(a);return S({nodeCount:c.nodes.length,categories:l,cycles:p,languageCoverage:u})}async function Hs(t,e){let{root:r,file:n,depth:s=1,withMeta:o=!1}=e,i=await t.ensureFresh(r),a=Rt(i,n,s),c=o?a.map(l=>({...l,...me(i,l.path)})):a;return S({file:n,dependencies:c})}async function Qs(t,e){let{root:r,file:n,withMeta:s=!1}=e,o=await t.ensureFresh(r),i=ge(o,n),a=s?i.map(c=>({...c,...me(o,c.path)})):i;return S({file:n,dependents:a})}async function qs(t,e){let{root:r,file:n,testsOnly:s=!1,cached:o=!1,changedSymbols:i,withMeta:a=!1}=e,c=await t.ensureFresh(r),l=g=>a?g.map(h=>({path:h,...me(c,h)})):g;if(o){let g=t.getOrBuildChangeImpact(r),h=Tt(g,n),k=s?h.filter(y=>c.nodes.get(y)?.category==="test"):h,x=l(k);return S({file:n,affected:x,count:x.length})}let p=Lt(c,n,{testsOnly:s,changedSymbols:i}),u=l(p);return S({file:n,affected:u,count:u.length})}async function Ys(t,e){let{root:r,file:n,depth:s=1,withEdgeDetail:o=!1}=e,i=await t.ensureFresh(r),a=Gt(i,n,{depth:s,withEdgeDetail:o});return S({file:n,callers:a,count:a.length})}async function Xs(t,e){let{root:r,entryPoints:n}=e,s=n?await t.getOrBuild(r,n.map(a=>Q.default.resolve(r,a))):await t.ensureFresh(r),o=zs(r),i=s.findUnusedFiles(o);return S({unusedFiles:i,count:i.length})}async function Zs(t,e){let{root:r}=e,n=await t.ensureFresh(r),s=new Map;for(let i of n.nodes.values())for(let a of i.tags)s.set(a.name,(s.get(a.name)??0)+1);let o=[...s.entries()].map(([i,a])=>({name:i,count:a})).sort((i,a)=>a.count-i.count);return S({tags:o,count:o.length})}async function eo(t,e){let{root:r,coverageThreshold:n}=e,s=await t.ensureFresh(r),o=t.getConfig(r),i=n??o?.coverageThreshold??80;if(!Wt(s))return S({error:"No coverage data available. Set coverageReportPath in mokosh.config and call analyze again."});let a=[...s.nodes.values()].filter(c=>c.category!=="test"&&c.category!=="config").filter(c=>c.coveragePct!==void 0&&c.coveragePct<i).map(c=>({file:c.path,coveragePct:c.coveragePct}));return S({threshold:i,uncovered:a,count:a.length})}async function to(t,e){let{root:r}=e,s=[...(await t.ensureFresh(r)).nodes.values()].filter(o=>o.type==="markdown"&&o.staleFor&&o.staleFor.length>0).map(o=>({doc:o.path,staleFor:o.staleFor}));return S({staleDocs:s,count:s.length})}async function ro(t,e){let{root:r,metric:n="cognitiveComplexity",threshold:s=10,limit:o=20}=e,i=await t.ensureFresh(r),a=_t(i,{metric:n,threshold:s,limit:o});return S({metric:n,threshold:s,functions:a,count:a.length})}async function no(t,e){let{root:r,minLines:n=6,ignoreLiterals:s=!0,maxPunctuationRatio:o=.5,limit:i=50}=e,a=await t.ensureFresh(r),c=e.ignoreDirs??[...j,...t.getConfig(r)?.ignoreDirs??[]],{groups:l}=await Mt(a,r,{minLines:n,ignoreLiterals:s,maxPunctuationRatio:o,limit:i,ignoreDirs:c,tokenCache:t.getDuplicationTokenCache(r)});return S({minLines:n,groups:l,count:l.length})}async function so(t,e){let{root:r,changedFiles:n,featureThreshold:s,format:o="tags"}=e,i=await t.ensureFresh(r),a=n??new rt().getChangedFiles().map(p=>Q.default.relative(r,Q.default.resolve(r,p))),c=s!==void 0?{featureDetection:{minOutDegree:s}}:void 0;if(o==="paths"){let p=Pr(i,a,c);return S({changedFiles:a,affectedTests:p,count:p.length})}let l=Er(i,a,c);return S({changedFiles:a,proposedTags:l})}async function oo(t,e){let{root:r,entryPoints:n,featureThreshold:s}=e,o=n?await t.getOrBuild(r,n.map(c=>Q.default.resolve(r,c))):await t.ensureFresh(r),i=W(o.nodes,s!==void 0?{minOutDegree:s}:void 0),a=Array.from(i.values()).sort((c,l)=>l.outDegree-c.outDegree);return S({features:a,count:a.length})}async function io(t,e){let{root:r,entryPoints:n,filter:s,mermaid:o=!1,slim:i=!0}=e,a=n?await t.getOrBuild(r,n.map(l=>Q.default.resolve(r,l))):await t.ensureFresh(r),c=Be(a.serialize(),Ue(s));return o?S(Le.serialize(D.deserialize(c))):i?S(Ot(c)):S(c)}async function ao(t,e){let{root:r}=e,n=await t.ensureFreshWorkspace(r);return S(jt(n))}async function co(t,e){let{root:r,file:n}=e,o=(await t.ensureFreshWorkspace(r)).getAffectedAcrossPackages(n);return S({file:n,affected:o,count:o.length})}function lo(t,e){let{root:r}=e,n=t.invalidate(r);return S({root:r,cleared:n,message:n?"Cache cleared. Call analyze to rebuild.":"No cache was present for this root."})}async function po(t,e){let{root:r,type:n}=e,s=await t.ensureFresh(r),o=Bt(s);if(n)return S(Ut(o,n));let i=Array.from(o.types.values());return S({count:i.length,types:i})}async function uo(t,e){let{root:r,paths:n,minOutDegree:s}=e,o=await t.ensureFresh(r),i=zt(o,s!==void 0?{minOutDegree:s}:void 0);if(n?.length){let c=n.map(l=>i.get(l)).filter(Boolean);return S({count:c.length,modules:c})}let a=Array.from(i.values());return S({count:a.length,modules:a})}async function fo(t,e){let{root:r,minOutDegree:n}=e,s=await t.ensureFresh(r),o=ue(s,n!==void 0?{minOutDegree:n}:void 0),i=Object.fromEntries(o.features);return S({features:i,unassigned:o.unassigned})}async function mo(t,e){let{root:r,function:n}=e,s=await t.ensureFresh(r);return S(Ct(s,n))}async function go(t,e){let{root:r,name:n}=e,s=await t.ensureFresh(r),o=$t(s,n);return S({name:n,matches:o,count:o.length})}async function ho(t,e){let{root:r,entryPoints:n}=e,s=await t.ensureFresh(r),o=n?.length?n:vt(s,r);if(o.length===0)throw new Error("No entry points found. Pass entryPoints explicitly or ensure package.json has a main/exports field.");return S(wt(s,o))}async function yo(t,e){let r=await t.ensureFresh(e.root),n=await ur(r,e.root,{dryRun:e.dryRun??!1});return S(n)}var xo=[{name:"analyze",description:"Build the dependency graph for a project from entry points. Returns a summary of node count, categories, and cycles. Must be called before get_dependencies, get_dependents, get_affected, or propose_tags. Pass an empty entryPoints array to auto-detect a monorepo (pnpm/npm/yarn/Nx/Turborepo) and build per-package graphs \u2014 use get_workspace_packages and get_workspace_affected for monorepo queries.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root (or monorepo root)"},entryPoints:{type:"array",items:{type:"string"},description:"Entry point files relative to root (e.g. ['src/index.ts']). Pass [] to trigger monorepo auto-detection."}},required:["root","entryPoints"]}},{name:"get_dependencies",description:"Get files that a given file imports (outgoing traversal). depth=1 returns immediate imports; omit for the full transitive tree. Each result includes the specific symbols imported from that file (when known).",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},depth:{type:"number",description:"Max traversal depth (default: 1)"},withMeta:{type:"boolean",description:"Include each result's category and export names alongside the path (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_dependents",description:"Get files that directly import a given file (one-hop incoming edges). Each result includes the specific symbols that dependent file imports from this file (when known).",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},withMeta:{type:"boolean",description:"Include each result's category and export names alongside the path (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_affected",description:"Get all files transitively affected if a given file changes \u2014 full incoming traversal upward. Use before a refactor to understand blast radius. Set testsOnly=true to get only test files. Set cached=true to use a pre-computed O(1) lookup cache instead of graph traversal \u2014 faster on repeated calls for the same root. Pass changedSymbols to restrict blast-radius to files that actually import those symbols \u2014 omit to treat the whole file as changed. Set withMeta=true to get { path, category, exports } objects instead of bare path strings.",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},testsOnly:{type:"boolean",description:"Return only test/spec files (default: false)"},cached:{type:"boolean",description:"Use a pre-computed impact cache for O(1) lookup instead of graph traversal. Cache is built lazily on first use and reused for the session (default: false)."},changedSymbols:{type:"array",items:{type:"string"},description:"Restrict blast-radius to files that import at least one of these symbols. Omit to treat the whole file as changed (conservative, same as before)."},withMeta:{type:"boolean",description:"Return each affected file as { path, category, exports } instead of a bare path string (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_callers",description:"Get files whose exported functions call into a given file (call-graph dependents). More precise than get_affected: only files with actual runtime call edges, not mere imports. Requires prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to project root"},file:{type:"string",description:"File path relative to root"},depth:{type:"number",description:"Max traversal depth (default: 1)"},withEdgeDetail:{type:"boolean",description:"Include from/to function names per edge (default: false)"}},required:["root","file"]}},{name:"find_unused",description:"Find files in the project that are not reachable from any entry point. Useful before cleanup passes. Omit entryPoints to reuse the cached graph from a prior analyze() call instead of rebuilding.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"},description:"Entry point files relative to root. Omit to reuse the cached graph from a prior analyze() call."}},required:["root"]}},{name:"list_tags",description:"List every distinct tag name present in the graph, with how many nodes carry each one. Call this before querying with tag:<name> to avoid a speculative filter silently returning zero results. Includes all tag kinds \u2014 a superset of what query's slim mode keeps (slim only retains comment-marker and import tags).",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"}},required:["root"]}},{name:"find_uncovered",description:"Find non-test files whose line coverage is below the configured threshold. Requires a prior analyze() call and coverageReportPath set in mokosh.config. coverageThreshold overrides the config default (default: 80).",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},coverageThreshold:{type:"number",description:"Line-coverage % below which a file is considered uncovered. Overrides config value."}},required:["root"]}},{name:"check_doc_drift",description:"Find markdown docs whose referenced files changed more recently than the doc itself \u2014 a commit-recency heuristic for stale documentation, not a content diff. Requires a prior analyze() call with gitStats: true in mokosh.config (otherwise no file has commit-timestamp data and nothing is flagged). See docs/adr-009-markdown-parsing.md for known limitations.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"}},required:["root"]}},{name:"find_complex_functions",description:"Find individual functions/methods above a cognitive (or cyclomatic) complexity threshold, sorted worst-first. Requires a prior analyze() call. Populated for TypeScript/JavaScript, Go, and Python.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},metric:{type:"string",enum:["cognitiveComplexity","complexity"],description:"Which score to threshold/sort on (default: cognitiveComplexity)"},threshold:{type:"number",description:"Minimum score to include (default: 10)"},limit:{type:"number",description:"Max results to return, worst-first (default: 20)"}},required:["root"]}},{name:"find_duplicates",description:"Find duplicated code blocks across the project, largest-first. Two matching strategies, picked per file: CSS/SCSS/Less are compared structurally by rule body \u2014 the literal, ordered property:value declarations a rule contains, independent of its selector \u2014 so a genuine copy-pasted declaration list is caught while rules that merely share shape (e.g. display:flex vs display:block) never match. Every other language mokosh parses (TypeScript/JavaScript, Python, Go, CoffeeScript, LiveScript, Lua, Gherkin, Markdown, and Stylus) is tokenized and matched via a suffix array over the whole candidate token stream instead, partitioned by language family so matching never crosses between Stylus and code languages \u2014 exact and complete regardless of how repetitive the repo is, with no truncation caveat. Identifiers \u2014 and by default literals \u2014 are normalized before matching in the token-based path, so renamed-variable copies are still caught; blocks that are mostly object/array-literal structural punctuation (e.g. schema/object-literal boilerplate) rather than substantive shared logic are gated out. A block repeated N times across the project is reported once with N occurrences, not as separate pairs. Lock files (package-lock.json, yarn.lock, pnpm-lock.yaml) and files under an ignored directory are always excluded, even if the graph itself contains them. On large repos, tokenizing is offloaded to a worker pool and tokenized files are cached per session, so repeated calls against an unchanged root only re-tokenize what actually changed. Requires a prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},minLines:{type:"number",description:"Minimum duplicated block size in lines to report (default: 6)"},ignoreLiterals:{type:"boolean",description:"Normalize string/number literals too, not just identifiers, so only structural shape drives a match (default: true). Set false for stricter, exact-text-only matching."},maxPunctuationRatio:{type:"number",description:"Maximum fraction of a token-shingled block's window that may be object/array-literal structural punctuation ({ } : , [ ]) (default: 0.5). Filters out blocks that are mostly schema/object-literal shape instead of substantive shared logic. Does not apply to the CSS/Less/SCSS structural comparator. Set 1 to disable."},ignoreDirs:{type:"array",items:{type:"string"},description:"Directory names to exclude, matched against any path segment (default: DEFAULT_IGNORE_DIRS merged with this root's configured ignoreDirs, if any). Pass [] to disable."},limit:{type:"number",description:"Max duplicate blocks to return, largest-first (default: 50)"}},required:["root"]}},{name:"propose_tags",description:"Propose what to run based on changed files. Pass changedFiles explicitly or omit to use git diff. format='tags' (default) returns test tags for CI tag-filtering; format='paths' returns test file paths ready to pipe directly to a test runner (e.g. vitest). Feature hubs act as traversal boundaries in both modes.",inputSchema:{type:"object",properties:{root:{type:"string"},changedFiles:{type:"array",items:{type:"string"},description:"Changed files relative to root. Omit to read from git diff."},featureThreshold:{type:"number",description:"Min importers for a file to be treated as a feature hub (default: 5). A hub short-circuits traversal and emits a feature:<name> tag instead of all downstream tags."},format:{type:"string",enum:["tags","paths"],description:"Output format: 'tags' returns test tag names for CI filtering (default); 'paths' returns test file paths to pipe to a test runner."}},required:["root"]}},{name:"detect_features",description:"Identify feature hub files \u2014 non-test files that import many other internal modules (orchestrators / aggregators like src/parser.ts or src/cli/runner.ts). Returns a list sorted by import count descending.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"},description:"Entry point files relative to root. Omit to use the cached graph."},featureThreshold:{type:"number",description:"Min internal imports a file must have to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"query",description:"Filter the graph by category, tag, or path. Returns matching nodes as JSON or a Mermaid diagram. If entryPoints is omitted the cached graph from a prior 'analyze' call is used.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"},description:"Entry points to build the graph. Omit to reuse the cached graph from a prior 'analyze' call."},filter:{type:"string",description:"Query string e.g. 'category:logic' or 'category:logic,tag:auth'. Supports: category, type, tag, path, external, importsFile, importedBy, minImports, maxImports, minSize, maxSize, hasDocstring, minCoverage, maxCoverage, minExportUsage, maxExportUsage, minComplexity, maxComplexity, minCognitiveComplexity, maxCognitiveComplexity, minCommits, maxCommits, isDocumented, isStale, lastAuthor. OR logic: any(key:val|key:val) matches if any single-key clause holds, ANDed with the rest of the query. sort: size|imports|commitCount90d|exportUsage|complexity|cognitiveComplexity, with sortDir: asc|desc (default desc). limit: N."},mermaid:{type:"boolean",description:"Return a Mermaid diagram (default: false)"},slim:{type:"boolean",description:"Compact response mode (default: true). Returns export names, meaningful tags, and a flat importsFiles path list \u2014 no edge objects, no mtime/size. Tags are filtered to kinds comment-marker and import only; function/class/variable/type/library tags are dropped in slim output. Use list_tags to see the full tag inventory, or pass slim: false to get every tag kind on matching nodes."}},required:["root","filter"]}},{name:"get_workspace_packages",description:"List all workspace packages detected in a monorepo, with their node counts and inter-package dependencies. Requires a prior analyze() call with empty entryPoints on a monorepo root.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the monorepo root"}},required:["root"]}},{name:"get_workspace_affected",description:"Cross-package blast-radius analysis. Returns every file that could be affected if a given file changes, annotated with the package it belongs to. Requires a prior analyze() call with empty entryPoints on a monorepo root.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the monorepo root"},file:{type:"string",description:"Monorepo-root-relative path of the changed file (e.g. 'packages/shared/src/utils.ts')"}},required:["root","file"]}},{name:"get_type_graph",description:"Return type-level relationships for the project. Without a type name, returns an inventory of all interfaces, classes, enums, and type aliases with their file and kind. With a type name, returns which files import that type (usedByFiles) and which types the defining file imports (uses). Requires a prior analyze() call. Only covers TypeScript/JavaScript files.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},type:{type:"string",description:"Exact exported name of the type to look up (e.g. 'FileNode'). Omit to get the full type inventory."}},required:["root"]}},{name:"get_module_responsibility",description:"Return what each file is responsible for: its semantic role, JSDoc description (when present), exported symbol names, and which feature hub it belongs to. Pass specific paths to filter, or omit paths to get all files. Requires a prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},paths:{type:"array",items:{type:"string"},description:"Project-relative file paths to include. Omit to return all files."},minOutDegree:{type:"number",description:"Min imports for a file to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"get_feature_graph",description:"Group files by domain: returns which files each feature hub (high-import orchestrator) transitively owns. Each file is assigned to the most specific hub that can reach it (lowest out-degree wins). Use this instead of a full query when answering 'what files are in the X feature/module?' \u2014 typically 85\u201395% fewer tokens than a full graph query.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},minOutDegree:{type:"number",description:"Minimum internal imports a file must have to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"get_call_graph",description:"Look up callers and callees for a named function. Returns the file that defines the function, all files/functions that call it, and all files/functions it calls. Always requires a function name \u2014 never returns the full call graph unfiltered. Call edges are only populated for TypeScript/JavaScript files.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},function:{type:"string",description:"Exact name of the function to look up (e.g. 'parseFile')."}},required:["root","function"]}},{name:"find_symbol",description:"Find every file that exports a symbol by exact name, with the best available usage info per match. Precision varies by the defining file's language: TypeScript/JavaScript, Go, and Python get function-level callers (via call edges) \u2014 though coverage differs per language (Go only tracks package-qualified calls, Python only tracks bare calls to `from module import name` symbols); everything else (CoffeeScript, LiveScript, Lua, Gherkin, Markdown, CSS/SCSS/Stylus) falls back to whole-file dependents, which is import-level only \u2014 a listed importer might not even use this specific export. Files whose parser never records exports (CoffeeScript, LiveScript, Lua, Gherkin, Markdown, CSS/SCSS/Stylus) never appear as matches, so a name that only exists in one of those returns an empty result, same as a typo. Each match's `precision` field is 'call' | 'file-level' \u2014 check it before trusting caller/importer results as symbol-exact.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},name:{type:"string",description:"Exact export name to look up (e.g. 'parseFile')."}},required:["root","name"]}},{name:"get_api_surface",description:"Build the API surface report for a project. Expands export* chains so every symbol accessible to consumers is listed (not just those directly declared in the entry file). Each export is resolved to its defining file and tagged with a kind (function/class/interface/type/enum/const). The graph is partitioned into: internalFiles (implementation reachable from entry points), unreachableFromEntry (non-test files not reachable from any entry point \u2014 may be separate consumers like CLI/MCP, config, or dead code), and testFiles (test suite). Supports multiple public entry points for libraries with sub-path exports. Requires a prior analyze() call. When entryPoints is omitted, auto-detects all entry points from package.json exports/main/module.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},entryPoints:{type:"array",items:{type:"string"},description:"Project-relative paths of public entry points (e.g. ['src/index.ts', 'src/utils.ts']). Omit to auto-detect from package.json exports / main / module fields."}},required:["root"]}},{name:"clear_cache",description:"Drop the cached dependency graph for a project root, forcing the next analyze() call to rebuild from disk. Call this after editing source files mid-session \u2014 otherwise get_affected, get_dependencies, and other query tools will reason from stale data.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root to invalidate."}},required:["root"]}},{name:"apply_tags",description:"Write @tag annotations into test file source code based on the dependency graph. Tags of kind 'import' (filename-derived) and 'comment-marker' (domain semantic, propagated from source files) are written as an idempotent block. Re-running is safe: the existing block is replaced in place. Tags already present in the file are excluded from the block to avoid duplication. Supports TypeScript/JavaScript (// <mokosh-tags> block with // @tag lines) and Gherkin .feature files (# <mokosh-tags> block with @tagname lines). Use dryRun=true to preview changes without writing to disk. Requires a prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root."},dryRun:{type:"boolean",description:"When true, computes which files would change but does not write to disk (default: false)."}},required:["root"]}}];function ut(){let t=new ct,e=new bo.Server({name:"mokosh",version:"0.0.1"},{capabilities:{tools:{}}});return e.setRequestHandler(pt.ListToolsRequestSchema,async()=>({tools:xo})),e.setRequestHandler(pt.CallToolRequestSchema,async r=>{let{name:n,arguments:s}=r.params,o=s,a={analyze:c=>Vs(t,c),get_dependencies:c=>Hs(t,c),get_dependents:c=>Qs(t,c),get_affected:c=>qs(t,c),get_callers:c=>Ys(t,c),find_symbol:c=>go(t,c),find_unused:c=>Xs(t,c),find_uncovered:c=>eo(t,c),list_tags:c=>Zs(t,c),check_doc_drift:c=>to(t,c),find_complex_functions:c=>ro(t,c),find_duplicates:c=>no(t,c),propose_tags:c=>so(t,c),detect_features:c=>oo(t,c),get_type_graph:c=>po(t,c),get_module_responsibility:c=>uo(t,c),get_feature_graph:c=>fo(t,c),get_call_graph:c=>mo(t,c),get_api_surface:c=>ho(t,c),query:c=>io(t,c),get_workspace_packages:c=>ao(t,c),get_workspace_affected:c=>co(t,c),clear_cache:c=>lo(t,c),apply_tags:c=>yo(t,c)}[n];if(!a)throw new Error(`Unknown tool: ${n}`);try{return Js(o.root),await a(o)}catch(c){return{content:[{type:"text",text:`Error: ${c instanceof Error?c.message:String(c)}`}],isError:!0}}}),e}async function el(){let t=ut(),e=new So.StdioServerTransport;await t.connect(e)}el().catch(console.error);0&&(module.exports={createMcpServer});
|
|
39
|
+
`),null}}parseContent(e,r){return this.pool?this.pool.run({filePath:e,content:r}):Ps(e,r)}makeStubNode(e,r,n){return{path:r,type:G(e),category:"other",imports:[],exports:[],tags:[],mtime:n.mtimeMs,size:n.size}}resolveCallEdges(e,r){let n=[];for(let s of r??[])try{let o=this.resolver.resolve(e,s.toSpecifier);o&&!o.isExternal&&n.push({from:s.from,to:s.to,toFile:E.default.relative(this.rootDir,o.path)})}catch{}return n}buildNode(e,r,n,s,o){let{imports:i,exports:a,tags:c,category:l,description:p,complexity:u,cognitiveComplexity:g,functions:h}=s;return{path:r,type:G(e),category:l,imports:i,exports:a,tags:c,mtime:n.mtimeMs,size:n.size,...p!==void 0?{description:p}:{},...o.length>0?{callEdges:o}:{},...u!==void 0?{complexity:u}:{},...g!==void 0?{cognitiveComplexity:g}:{},...h!==void 0?{functions:h}:{}}}attachGitStats(e,r){let n=this.gitStatsMap?.get(r);n&&(e.commitCount90d=n.commitCount90d,n.lastAuthor!==void 0&&(e.lastAuthor=n.lastAuthor),n.lastCommitAt!==void 0&&(e.lastCommitAt=n.lastCommitAt))}async resolveImports(e,r){let n=[];for(let s of r){let o=this.resolver.resolveAll(e,s.rawSpecifier);if(o.length!==0)for(let i of o){let a={...s,toPath:i.isExternal?i.path:E.default.relative(this.rootDir,i.path),isExternal:i.isExternal};i.isWorkspace&&(a.isWorkspace=!0,a.workspacePackage=i.workspacePackage),i.isExternal?this.attachLockfileVersion(a):this.enqueue(i.path),n.push(a)}}return n}attachLockfileVersion(e){if(!this.lockFile)return;let r=e.rawSpecifier.startsWith("@")?e.rawSpecifier.split("/").slice(0,2).join("/"):e.rawSpecifier.split("/")[0],n=r?this.lockFile.dependencies[r]:void 0;n&&(e.version=n.version)}showProgress(){this.progressCallback&&this.visited.size%100===0&&this.progressCallback(this.visited.size)}};function zs(t,e){return{identifier:e?.identifier??new st,featureMap:e?.featureDetection===!1?new Map:W(t.nodes,e?.featureDetection??void 0)}}function $s(t,e,r,n,s){for(let o of e){let i=t.nodes.get(o);if(!i)continue;let a=new z(o,["*",...i.exports.map(c=>c.name)]);t.traverse(o,(c,l,p)=>{if(!p)return!0;if(!a.updateAffectedSymbols(c,p))return!1;if(l>0){let u=r.get(c.path);if(u)return n(u),!1}return s(c),!0},{direction:"incoming"})}}function Lr(t,e,r){let{identifier:n,featureMap:s}=zs(t,r),o=new Set;for(let i of e){let a=s.get(i);a&&o.add(a.tag)}return $s(t,e,s,i=>o.add(i.tag),i=>{if(n.isTestNode(i))for(let a of i.tags)o.add(a.name)}),Array.from(o)}function Gr(t,e,r){let{identifier:n,featureMap:s}=zs(t,r),o=new Set;return $s(t,e,s,()=>{},i=>{n.isTestNode(i)&&o.add(i.path)}),Array.from(o)}var Bs=d(require("fs")),ae=d(require("path"));async function Us(t,e,r=null,n={}){let s=n.silent?void 0:a=>{process.stderr.write(`Processed ${a} files...\r`)},o=ae.default.resolve(t);return await new Ne(o,r,n.pathAliases?new V(o,{pathAliases:n.pathAliases}):void 0,s,n.gitStats??!1,n.coverageMap??new Map,n.parallelParsing??!0).build(e)}async function Ks(t,e={}){let r=ae.default.resolve(t),n=ye(r),s=e.packages?n.packages.filter(a=>e.packages?.includes(a.name)||e.packages?.includes(a.relativeRoot)):n.packages,o=new Map(n.packages.map(a=>[a.name,a.root])),i=new xe(r,n.type);for(let a of s){let c=e.silent?void 0:u=>{process.stderr.write(`[${a.name}] Processed ${u} files...\r`)},p=await new Ne(r,null,new V(r,{workspaceMap:o,tsconfigSearchPaths:[a.root,r],pathAliases:e.pathAliases}),c,e.gitStats??!1,new Map,e.parallelParsing??!0).build(a.entryPoints);i.addPackage(a,p)}return i}function Hs(t,e={}){let r=[],n=new Set([...e.ignoreDirs??j,...e.additionalIgnoreDirs??[]]),s=new Set([...e.extensions??Ft,...e.additionalExtensions??[]]);function o(i){try{let a=Bs.default.readdirSync(i,{withFileTypes:!0});for(let c of a){let l=ae.default.join(i,c.name);c.isDirectory()?n.has(c.name)||o(l):c.isFile()&&s.has(ae.default.extname(c.name).toLowerCase())&&r.push(ae.default.relative(t,l))}}catch{}}return o(t),r}var Js=/(?:^|[/\\])(?:node_modules|\.git|dist|build|coverage)(?:[/\\]|$)/;function Vs(t){return mt.default.join(t,Ge,Ct)}function ul(t,e){return e?.cachePath?mt.default.resolve(t,e.cachePath):mt.default.join(t,Ge,wt)}function fl(t){try{if(!ft.default.existsSync(t))return null;let e=ft.default.readFileSync(t,"utf-8");return I.deserialize(JSON.parse(e))}catch{return null}}var gt=class{graphs=new Map;configs=new Map;workspaceGraphs=new Map;changeImpactCaches=new Map;dirtyRoots=new Set;watchers=new Map;lastAnalyze=new Map;duplicationTokenCaches=new Map;isConfigured(e){return this.configs.has(e)}storeConfig(e,r){this.configs.set(e,r)}getConfig(e){return this.configs.get(e)}async getOrBuild(e,r,n=new Map){let s=this.configs.get(e),o=this.graphs.get(e)??fl(ul(e,s)),i=await Us(e,r,o,{...Y(s),coverageMap:n});return this.graphs.set(e,i),i}require(e){let r=this.graphs.get(e);if(!r)throw new Error('No graph cached for this root. Call "analyze" first.');return r}async getOrBuildWorkspace(e,r={}){let n=this.workspaceGraphs.get(e);if(n)return n;let s=await Ks(e,r);return this.workspaceGraphs.set(e,s),s}requireWorkspace(e){let r=this.workspaceGraphs.get(e);if(!r)throw new Error('No workspace graph cached for this root. Call "analyze" first.');return r}hasWorkspace(e){return this.workspaceGraphs.has(e)}getOrBuildChangeImpact(e){let r=this.changeImpactCaches.get(e);if(r)return r;let n=this.require(e),s=Mt(n);return this.changeImpactCaches.set(e,s),s}storeLastAnalyze(e,r){this.lastAnalyze.set(e,r)}startWatching(e){if(!this.watchers.has(e))try{let r=ft.default.watch(e,{recursive:!0},(n,s)=>{!s||Js.test(s)||this.dirtyRoots.add(e)});r.on("error",()=>{this.watchers.delete(e)}),this.watchers.set(e,r)}catch{}}async ensureFresh(e){if(!this.dirtyRoots.has(e))return this.require(e);this.dirtyRoots.delete(e),this.changeImpactCaches.delete(e);let r=this.lastAnalyze.get(e);return r?.kind==="single"?this.getOrBuild(e,r.entryPoints,r.coverageMap):this.require(e)}async ensureFreshWorkspace(e){if(!this.dirtyRoots.has(e))return this.requireWorkspace(e);this.dirtyRoots.delete(e),this.changeImpactCaches.delete(e),this.workspaceGraphs.delete(e);let r=this.configs.get(e);return this.getOrBuildWorkspace(e,Y(r))}async getDuplicationTokenCache(e){let r=this.duplicationTokenCaches.get(e);return r||(r=ze(Vs(e)),this.duplicationTokenCaches.set(e,r)),r}flushDuplicationTokenCache(e){let r=this.duplicationTokenCaches.get(e);if(r)try{$e(r,Vs(e))}catch(n){process.stderr.write(`Warning: failed to persist duplication token cache: ${n}
|
|
40
|
+
`)}}invalidate(e){let r=this.graphs.has(e)||this.workspaceGraphs.has(e);return this.graphs.delete(e),this.workspaceGraphs.delete(e),this.changeImpactCaches.delete(e),this.dirtyRoots.delete(e),this.duplicationTokenCaches.delete(e),r}};var Q=d(require("path"));var Qs=d(require("fs")),qs=d(require("os")),dt=d(require("path"));function S(t){return{content:[{type:"text",text:JSON.stringify(t)}]}}function Ys(t){if(!dt.default.isAbsolute(t))throw new Error("root must be an absolute path");let e=dt.default.resolve(t),r=qs.default.homedir();if(e!==r&&!e.startsWith(r+dt.default.sep))throw new Error("root must be within the user home directory");let n;try{n=Qs.default.statSync(e)}catch{throw new Error("root does not exist")}if(!n.isDirectory())throw new Error("root is not a directory")}async function Xs(t,e){let{root:r,entryPoints:n}=e;if(!t.isConfigured(r)){let g=le(r,{allowJs:!1});vt(g),t.storeConfig(r,g)}if(n.length===0){let g=ye(r);if(g.type!=="none"){let h=t.getConfig(r),k=await t.getOrBuildWorkspace(r,Y(h));t.storeLastAnalyze(r,{kind:"workspace"}),t.startWatching(r);let x=Array.from(k.packages.values()).map(({graph:y,pkg:C})=>({package:C.name,relativeRoot:C.relativeRoot,nodeCount:y.nodes.size}));return S({monorepoType:g.type,packageCount:k.packages.size,packages:x})}}let s=n.map(g=>Q.default.resolve(r,g)),o=t.getConfig(r),i=o?.coverageReportPath?Et(r,o.coverageReportPath):new Map,a=await t.getOrBuild(r,s,i);t.storeLastAnalyze(r,{kind:"single",entryPoints:s,coverageMap:i}),t.startWatching(r);let c=a.serialize(),l=c.nodes.reduce((g,h)=>(g[h.category]=(g[h.category]??0)+1,g),{}),p=a.findCycles(),u=zt(a);return S({nodeCount:c.nodes.length,categories:l,cycles:p,languageCoverage:u})}async function Zs(t,e){let{root:r,file:n,depth:s=1,withMeta:o=!1}=e,i=await t.ensureFresh(r),a=$t(i,n,s),c=o?a.map(l=>({...l,...ge(i,l.path)})):a;return S({file:n,dependencies:c})}async function eo(t,e){let{root:r,file:n,withMeta:s=!1}=e,o=await t.ensureFresh(r),i=de(o,n),a=s?i.map(c=>({...c,...ge(o,c.path)})):i;return S({file:n,dependents:a})}async function to(t,e){let{root:r,file:n,testsOnly:s=!1,cached:o=!1,changedSymbols:i,withMeta:a=!1}=e,c=await t.ensureFresh(r),l=g=>a?g.map(h=>({path:h,...ge(c,h)})):g;if(o){let g=t.getOrBuildChangeImpact(r),h=Rt(g,n),k=s?h.filter(y=>c.nodes.get(y)?.category==="test"):h,x=l(k);return S({file:n,affected:x,count:x.length})}let p=Bt(c,n,{testsOnly:s,changedSymbols:i}),u=l(p);return S({file:n,affected:u,count:u.length})}async function ro(t,e){let{root:r,file:n,depth:s=1,withEdgeDetail:o=!1}=e,i=await t.ensureFresh(r),a=Ut(i,n,{depth:s,withEdgeDetail:o});return S({file:n,callers:a,count:a.length})}async function no(t,e){let{root:r,entryPoints:n}=e,s=n?await t.getOrBuild(r,n.map(a=>Q.default.resolve(r,a))):await t.ensureFresh(r),o=Hs(r),i=s.findUnusedFiles(o);return S({unusedFiles:i,count:i.length})}async function so(t,e){let{root:r}=e,n=await t.ensureFresh(r),s=new Map;for(let i of n.nodes.values())for(let a of i.tags)s.set(a.name,(s.get(a.name)??0)+1);let o=[...s.entries()].map(([i,a])=>({name:i,count:a})).sort((i,a)=>a.count-i.count);return S({tags:o,count:o.length})}async function oo(t,e){let{root:r,coverageThreshold:n}=e,s=await t.ensureFresh(r),o=t.getConfig(r),i=n??o?.coverageThreshold??80;if(!Vt(s))return S({error:"No coverage data available. Set coverageReportPath in mokosh.config and call analyze again."});let a=[...s.nodes.values()].filter(c=>c.category!=="test"&&c.category!=="config").filter(c=>c.coveragePct!==void 0&&c.coveragePct<i).map(c=>({file:c.path,coveragePct:c.coveragePct}));return S({threshold:i,uncovered:a,count:a.length})}async function io(t,e){let{root:r}=e,s=[...(await t.ensureFresh(r)).nodes.values()].filter(o=>o.type==="markdown"&&o.staleFor&&o.staleFor.length>0).map(o=>({doc:o.path,staleFor:o.staleFor}));return S({staleDocs:s,count:s.length})}async function ao(t,e){let{root:r,metric:n="cognitiveComplexity",threshold:s=10,limit:o=20}=e,i=await t.ensureFresh(r),a=Kt(i,{metric:n,threshold:s,limit:o});return S({metric:n,threshold:s,functions:a,count:a.length})}async function co(t,e){let{root:r,minLines:n=6,ignoreLiterals:s=!0,maxPunctuationRatio:o=.5,limit:i=50}=e,a=await t.ensureFresh(r),c=e.ignoreDirs??[...j,...t.getConfig(r)?.ignoreDirs??[]],{groups:l}=await Wt(a,r,{minLines:n,ignoreLiterals:s,maxPunctuationRatio:o,limit:i,ignoreDirs:c,tokenCache:await t.getDuplicationTokenCache(r)});return t.flushDuplicationTokenCache(r),S({minLines:n,groups:l,count:l.length})}async function lo(t,e){let{root:r,changedFiles:n,featureThreshold:s,format:o="tags"}=e,i=await t.ensureFresh(r),a=n??new it().getChangedFiles().map(p=>Q.default.relative(r,Q.default.resolve(r,p))),c=s!==void 0?{featureDetection:{minOutDegree:s}}:void 0;if(o==="paths"){let p=Gr(i,a,c);return S({changedFiles:a,affectedTests:p,count:p.length})}let l=Lr(i,a,c);return S({changedFiles:a,proposedTags:l})}async function po(t,e){let{root:r,entryPoints:n,featureThreshold:s}=e,o=n?await t.getOrBuild(r,n.map(c=>Q.default.resolve(r,c))):await t.ensureFresh(r),i=W(o.nodes,s!==void 0?{minOutDegree:s}:void 0),a=Array.from(i.values()).sort((c,l)=>l.outDegree-c.outDegree);return S({features:a,count:a.length})}async function uo(t,e){let{root:r,entryPoints:n,filter:s,mermaid:o=!1,slim:i=!0}=e,a=n?await t.getOrBuild(r,n.map(l=>Q.default.resolve(r,l))):await t.ensureFresh(r),c=Je(a.serialize(),Ve(s));return o?S(_e.serialize(I.deserialize(c))):i?S(Ht(c)):S(c)}async function fo(t,e){let{root:r}=e,n=await t.ensureFreshWorkspace(r);return S(Jt(n))}async function mo(t,e){let{root:r,file:n}=e,o=(await t.ensureFreshWorkspace(r)).getAffectedAcrossPackages(n);return S({file:n,affected:o,count:o.length})}function go(t,e){let{root:r}=e,n=t.invalidate(r);return S({root:r,cleared:n,message:n?"Cache cleared. Call analyze to rebuild.":"No cache was present for this root."})}async function ho(t,e){let{root:r,type:n}=e,s=await t.ensureFresh(r),o=Yt(s);if(n)return S(Xt(o,n));let i=Array.from(o.types.values());return S({count:i.length,types:i})}async function yo(t,e){let{root:r,paths:n,minOutDegree:s}=e,o=await t.ensureFresh(r),i=Qt(o,s!==void 0?{minOutDegree:s}:void 0);if(n?.length){let c=n.map(l=>i.get(l)).filter(Boolean);return S({count:c.length,modules:c})}let a=Array.from(i.values());return S({count:a.length,modules:a})}async function xo(t,e){let{root:r,minOutDegree:n}=e,s=await t.ensureFresh(r),o=fe(s,n!==void 0?{minOutDegree:n}:void 0),i=Object.fromEntries(o.features);return S({features:i,unassigned:o.unassigned})}async function bo(t,e){let{root:r,function:n}=e,s=await t.ensureFresh(r);return S(Dt(s,n))}async function So(t,e){let{root:r,name:n}=e,s=await t.ensureFresh(r),o=qt(s,n);return S({name:n,matches:o,count:o.length})}async function ko(t,e){let{root:r,entryPoints:n}=e,s=await t.ensureFresh(r),o=n?.length?n:Nt(s,r);if(o.length===0)throw new Error("No entry points found. Pass entryPoints explicitly or ensure package.json has a main/exports field.");return S(It(s,o))}async function vo(t,e){let r=await t.ensureFresh(e.root),n=await br(r,e.root,{dryRun:e.dryRun??!1});return S(n)}var Co=[{name:"analyze",description:"Build the dependency graph for a project from entry points. Returns a summary of node count, categories, and cycles. Must be called before get_dependencies, get_dependents, get_affected, or propose_tags. Pass an empty entryPoints array to auto-detect a monorepo (pnpm/npm/yarn/Nx/Turborepo) and build per-package graphs \u2014 use get_workspace_packages and get_workspace_affected for monorepo queries.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root (or monorepo root)"},entryPoints:{type:"array",items:{type:"string"},description:"Entry point files relative to root (e.g. ['src/index.ts']). Pass [] to trigger monorepo auto-detection."}},required:["root","entryPoints"]}},{name:"get_dependencies",description:"Get files that a given file imports (outgoing traversal). depth=1 returns immediate imports; omit for the full transitive tree. Each result includes the specific symbols imported from that file (when known).",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},depth:{type:"number",description:"Max traversal depth (default: 1)"},withMeta:{type:"boolean",description:"Include each result's category and export names alongside the path (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_dependents",description:"Get files that directly import a given file (one-hop incoming edges). Each result includes the specific symbols that dependent file imports from this file (when known).",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},withMeta:{type:"boolean",description:"Include each result's category and export names alongside the path (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_affected",description:"Get all files transitively affected if a given file changes \u2014 full incoming traversal upward. Use before a refactor to understand blast radius. See docs/mcp.md for details on the testsOnly, cached, changedSymbols, and withMeta options.",inputSchema:{type:"object",properties:{root:{type:"string"},file:{type:"string",description:"File path relative to root"},testsOnly:{type:"boolean",description:"Return only test/spec files (default: false)"},cached:{type:"boolean",description:"Use a pre-computed impact cache for O(1) lookup instead of graph traversal. Cache is built lazily on first use and reused for the session (default: false)."},changedSymbols:{type:"array",items:{type:"string"},description:"Restrict blast-radius to files that import at least one of these symbols. Omit to treat the whole file as changed (conservative, same as before)."},withMeta:{type:"boolean",description:"Return each affected file as { path, category, exports } instead of a bare path string (default: false). Set true when you need to decide what to do with a result without a follow-up lookup."}},required:["root","file"]}},{name:"get_callers",description:"Get files whose exported functions call into a given file (call-graph dependents). More precise than get_affected: only files with actual runtime call edges, not mere imports. Requires prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to project root"},file:{type:"string",description:"File path relative to root"},depth:{type:"number",description:"Max traversal depth (default: 1)"},withEdgeDetail:{type:"boolean",description:"Include from/to function names per edge (default: false)"}},required:["root","file"]}},{name:"find_unused",description:"Find files in the project that are not reachable from any entry point. Useful before cleanup passes. Omit entryPoints to reuse the cached graph from a prior analyze() call instead of rebuilding.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"},description:"Entry point files relative to root. Omit to reuse the cached graph from a prior analyze() call."}},required:["root"]}},{name:"list_tags",description:"List every distinct tag name present in the graph, with how many nodes carry each one. Call this before querying with tag:<name> to avoid a speculative filter silently returning zero results. Includes all tag kinds \u2014 a superset of what query's slim mode keeps (slim only retains comment-marker and import tags).",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"}},required:["root"]}},{name:"find_uncovered",description:"Find non-test files whose line coverage is below the configured threshold. Requires a prior analyze() call and coverageReportPath set in mokosh.config. coverageThreshold overrides the config default (default: 80).",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},coverageThreshold:{type:"number",description:"Line-coverage % below which a file is considered uncovered. Overrides config value."}},required:["root"]}},{name:"check_doc_drift",description:"Find markdown docs whose referenced files changed more recently than the doc itself \u2014 a commit-recency heuristic for stale documentation, not a content diff. Requires a prior analyze() call with gitStats: true in mokosh.config (otherwise no file has commit-timestamp data and nothing is flagged). See docs/adr-009-markdown-parsing.md for known limitations.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"}},required:["root"]}},{name:"find_complex_functions",description:"Find individual functions/methods above a cognitive (or cyclomatic) complexity threshold, sorted worst-first. Requires a prior analyze() call. Populated for TypeScript/JavaScript, Go, and Python.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},metric:{type:"string",enum:["cognitiveComplexity","complexity"],description:"Which score to threshold/sort on (default: cognitiveComplexity)"},threshold:{type:"number",description:"Minimum score to include (default: 10)"},limit:{type:"number",description:"Max results to return, worst-first (default: 20)"}},required:["root"]}},{name:"find_duplicates",description:"Find duplicated code blocks across the project, largest-first. CSS/SCSS/Less are matched structurally by rule body; every other parsed language is tokenized and matched via suffix array. Lock files and ignored directories are always excluded. Requires a prior analyze() call. See docs/mcp.md for matching-strategy, normalization, and caching details.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},minLines:{type:"number",description:"Minimum duplicated block size in lines to report (default: 6)"},ignoreLiterals:{type:"boolean",description:"Normalize string/number literals too, not just identifiers, so only structural shape drives a match (default: true). Set false for stricter, exact-text-only matching."},maxPunctuationRatio:{type:"number",description:"Maximum fraction of a token-shingled block's window that may be object/array-literal structural punctuation ({ } : , [ ]) (default: 0.5). Filters out blocks that are mostly schema/object-literal shape instead of substantive shared logic. Does not apply to the CSS/Less/SCSS structural comparator. Set 1 to disable."},ignoreDirs:{type:"array",items:{type:"string"},description:"Directory names to exclude, matched against any path segment (default: DEFAULT_IGNORE_DIRS merged with this root's configured ignoreDirs, if any). Pass [] to disable."},limit:{type:"number",description:"Max duplicate blocks to return, largest-first (default: 50)"}},required:["root"]}},{name:"propose_tags",description:"Propose what to run based on changed files. Pass changedFiles explicitly or omit to use git diff. format='tags' (default) returns test tags for CI tag-filtering; format='paths' returns test file paths ready to pipe directly to a test runner (e.g. vitest). Feature hubs act as traversal boundaries in both modes.",inputSchema:{type:"object",properties:{root:{type:"string"},changedFiles:{type:"array",items:{type:"string"},description:"Changed files relative to root. Omit to read from git diff."},featureThreshold:{type:"number",description:"Min importers for a file to be treated as a feature hub (default: 5). A hub short-circuits traversal and emits a feature:<name> tag instead of all downstream tags."},format:{type:"string",enum:["tags","paths"],description:"Output format: 'tags' returns test tag names for CI filtering (default); 'paths' returns test file paths to pipe to a test runner."}},required:["root"]}},{name:"detect_features",description:"Identify feature hub files \u2014 non-test files that import many other internal modules (orchestrators / aggregators like src/parser.ts or src/cli/runner.ts). Returns a list sorted by import count descending.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"},description:"Entry point files relative to root. Omit to use the cached graph."},featureThreshold:{type:"number",description:"Min internal imports a file must have to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"query",description:"Filter the graph by category, tag, path, or other node metadata. Returns matching nodes as JSON or a Mermaid diagram. If entryPoints is omitted the cached graph from a prior 'analyze' call is used. See docs/mcp.md for the full query DSL reference.",inputSchema:{type:"object",properties:{root:{type:"string"},entryPoints:{type:"array",items:{type:"string"},description:"Entry points to build the graph. Omit to reuse the cached graph from a prior 'analyze' call."},filter:{type:"string",description:"Query string e.g. 'category:logic' or 'category:logic,tag:auth'. Supports: category, type, tag, path, external, importsFile, importedBy, minImports, maxImports, minSize, maxSize, hasDocstring, minCoverage, maxCoverage, minExportUsage, maxExportUsage, minComplexity, maxComplexity, minCognitiveComplexity, maxCognitiveComplexity, minCommits, maxCommits, isDocumented, isStale, lastAuthor. OR logic: any(key:val|key:val) matches if any single-key clause holds, ANDed with the rest of the query. sort: size|imports|commitCount90d|exportUsage|complexity|cognitiveComplexity, with sortDir: asc|desc (default desc). limit: N."},mermaid:{type:"boolean",description:"Return a Mermaid diagram (default: false)"},slim:{type:"boolean",description:"Compact response mode (default: true). Returns export names, meaningful tags, and a flat importsFiles path list \u2014 no edge objects, no mtime/size. Tags are filtered to kinds comment-marker and import only; function/class/variable/type/library tags are dropped in slim output. Use list_tags to see the full tag inventory, or pass slim: false to get every tag kind on matching nodes."}},required:["root","filter"]}},{name:"get_workspace_packages",description:"List all workspace packages detected in a monorepo, with their node counts and inter-package dependencies. Requires a prior analyze() call with empty entryPoints on a monorepo root.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the monorepo root"}},required:["root"]}},{name:"get_workspace_affected",description:"Cross-package blast-radius analysis. Returns every file that could be affected if a given file changes, annotated with the package it belongs to. Requires a prior analyze() call with empty entryPoints on a monorepo root.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the monorepo root"},file:{type:"string",description:"Monorepo-root-relative path of the changed file (e.g. 'packages/shared/src/utils.ts')"}},required:["root","file"]}},{name:"get_type_graph",description:"Return type-level relationships for the project. Without a type name, returns an inventory of all interfaces, classes, enums, and type aliases with their file and kind. With a type name, returns which files import that type (usedByFiles) and which types the defining file imports (uses). Requires a prior analyze() call. Only covers TypeScript/JavaScript files.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},type:{type:"string",description:"Exact exported name of the type to look up (e.g. 'FileNode'). Omit to get the full type inventory."}},required:["root"]}},{name:"get_module_responsibility",description:"Return what each file is responsible for: its semantic role, JSDoc description (when present), exported symbol names, and which feature hub it belongs to. Pass specific paths to filter, or omit paths to get all files. Requires a prior analyze() call.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},paths:{type:"array",items:{type:"string"},description:"Project-relative file paths to include. Omit to return all files."},minOutDegree:{type:"number",description:"Min imports for a file to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"get_feature_graph",description:"Group files by domain: returns which files each feature hub (high-import orchestrator) transitively owns. Each file is assigned to the most specific hub that can reach it (lowest out-degree wins). Use this instead of a full query when answering 'what files are in the X feature/module?' \u2014 typically 85\u201395% fewer tokens than a full graph query.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},minOutDegree:{type:"number",description:"Minimum internal imports a file must have to qualify as a feature hub (default: 5)."}},required:["root"]}},{name:"get_call_graph",description:"Look up callers and callees for a named function. Returns the file that defines the function, all files/functions that call it, and all files/functions it calls. Always requires a function name \u2014 never returns the full call graph unfiltered. Call edges are only populated for TypeScript/JavaScript files.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},function:{type:"string",description:"Exact name of the function to look up (e.g. 'parseFile')."}},required:["root","function"]}},{name:"find_symbol",description:"Find every file that exports a symbol by exact name, with the best available usage info per match. Precision varies by the defining file's language \u2014 check each match's `precision` field ('call' | 'file-level') before trusting caller/importer results as symbol-exact. See docs/mcp.md for per-language coverage details.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},name:{type:"string",description:"Exact export name to look up (e.g. 'parseFile')."}},required:["root","name"]}},{name:"get_api_surface",description:"Build the API surface report for a project: every exported symbol resolved to its defining file and kind, partitioned into internalFiles, unreachableFromEntry, and testFiles. Requires a prior analyze() call. When entryPoints is omitted, auto-detects from package.json exports/main/module. See docs/mcp.md for the export* expansion and partition semantics.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root"},entryPoints:{type:"array",items:{type:"string"},description:"Project-relative paths of public entry points (e.g. ['src/index.ts', 'src/utils.ts']). Omit to auto-detect from package.json exports / main / module fields."}},required:["root"]}},{name:"clear_cache",description:"Drop the cached dependency graph for a project root, forcing the next analyze() call to rebuild from disk. Call this after editing source files mid-session \u2014 otherwise get_affected, get_dependencies, and other query tools will reason from stale data.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root to invalidate."}},required:["root"]}},{name:"apply_tags",description:"Write @tag annotations into test file source code based on the dependency graph, as an idempotent block \u2014 re-running is safe, the existing block is replaced in place. Use dryRun=true to preview changes without writing to disk. Requires a prior analyze() call. See docs/mcp.md for tag-kind and per-language block syntax details.",inputSchema:{type:"object",properties:{root:{type:"string",description:"Absolute path to the project root."},dryRun:{type:"boolean",description:"When true, computes which files would change but does not write to disk (default: false)."}},required:["root"]}}];function yt(){let t=new gt,e=new wo.Server({name:"mokosh",version:"0.0.1"},{capabilities:{tools:{}}});return e.setRequestHandler(ht.ListToolsRequestSchema,async()=>({tools:Co})),e.setRequestHandler(ht.CallToolRequestSchema,async r=>{let{name:n,arguments:s}=r.params,o=s,a={analyze:c=>Xs(t,c),get_dependencies:c=>Zs(t,c),get_dependents:c=>eo(t,c),get_affected:c=>to(t,c),get_callers:c=>ro(t,c),find_symbol:c=>So(t,c),find_unused:c=>no(t,c),find_uncovered:c=>oo(t,c),list_tags:c=>so(t,c),check_doc_drift:c=>io(t,c),find_complex_functions:c=>ao(t,c),find_duplicates:c=>co(t,c),propose_tags:c=>lo(t,c),detect_features:c=>po(t,c),get_type_graph:c=>ho(t,c),get_module_responsibility:c=>yo(t,c),get_feature_graph:c=>xo(t,c),get_call_graph:c=>bo(t,c),get_api_surface:c=>ko(t,c),query:c=>uo(t,c),get_workspace_packages:c=>fo(t,c),get_workspace_affected:c=>mo(t,c),clear_cache:c=>go(t,c),apply_tags:c=>vo(t,c)}[n];if(!a)throw new Error(`Unknown tool: ${n}`);try{return Ys(o.root),await a(o)}catch(c){return{content:[{type:"text",text:`Error: ${c instanceof Error?c.message:String(c)}`}],isError:!0}}}),e}async function ml(){let t=yt(),e=new Fo.StdioServerTransport;await t.connect(e)}ml().catch(console.error);0&&(module.exports={createMcpServer});
|
|
36
41
|
//# sourceMappingURL=mcp.js.map
|