@omfalos/mokosh 0.4.1 → 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 +26 -22
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +24 -20
- package/dist/cli.mjs.map +1 -1
- package/dist/index.d.mts +5 -1
- package/dist/index.d.ts +5 -1
- 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 -22
- package/dist/mcp.js.map +1 -1
- package/dist/mcp.mjs +26 -22
- package/dist/mcp.mjs.map +1 -1
- package/package.json +1 -1
package/dist/mcp.mjs
CHANGED
|
@@ -1,37 +1,41 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
var
|
|
3
|
-
`)}};import
|
|
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
|
+
var st=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,r)=>(typeof require<"u"?require:e)[r]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});import Ws from"path";import{fileURLToPath as zs}from"url";var $s=()=>zs(import.meta.url),Bs=()=>Ws.dirname($s()),f=Bs();import{StdioServerTransport as cl}from"@modelcontextprotocol/sdk/server/stdio.js";import{Server as ol}from"@modelcontextprotocol/sdk/server/index.js";import{CallToolRequestSchema as il,ListToolsRequestSchema as al}from"@modelcontextprotocol/sdk/types.js";import mr from"fs";import gr from"path";import ct from"fs";import wr from"path";var Us=[".config.","biome.json","tsconfig.json","package.json",".prettierrc",".eslintrc"],br=[];function Te(t){br.push(t)}function Sr(t){return[...Us,...br].some(e=>typeof e=="string"?t.includes(e):e instanceof RegExp?e.test(t):e(t))}var Ks=[".test.",".spec.","-test.","-spec."],kr=[];function Ee(t){kr.push(t)}function re(){return[...Ks,...kr]}var Hs=["jest","vitest","playwright","cypress","@testing-library/"],vr=[];function Ae(t){vr.push(t)}function ot(){return[...Hs,...vr]}var Cr=.8;function it(t){Cr=t}function at(){return Cr}var Js=["mokosh.config.js","mokosh.config.cjs","mokosh.config.json"];function ne(t,{allowJs:e=!0,isExplicitPath:r=!1}={}){if(r){let n=wr.resolve(t);return ct.existsSync(n)?n.endsWith(".json")?Fr(n):e?Tr(n):{}:{}}for(let n of Js){let s=wr.resolve(t,n);if(ct.existsSync(s)){if(n.endsWith(".json"))return Fr(s);if(e)return Tr(s)}}return{}}function Fr(t){return JSON.parse(ct.readFileSync(t,"utf-8"))}function Tr(t){let e=st(t);return e&&typeof e=="object"&&"default"in e&&(e=e.default),typeof e=="function"?e({}):e}function lt(t){for(let e of t.configMatchers??[])Te(e);for(let e of t.testPatterns??[])Ee(e);for(let e of t.testLibraries??[])Ae(e);t.barrelThreshold!==void 0&&it(t.barrelThreshold)}function V(t){return{gitStats:t?.gitStats??!1,parallelParsing:t?.parallelParsing,pathAliases:t?.pathAliases}}var Pe="mokosh-cache",pt="duplication-tokens.json",ut="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"];import Vs from"fs";import Er from"path";function mt(t,e){let r=Er.resolve(t,e);try{let n=Vs.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=Er.relative(t,i);o.set(l,c)}return o}catch{return new Map}}var Ne={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
|
+
`)}};import Ar from"fs";import qs from"path";function gt(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 Pr(t,e){if(typeof t=="string")return gt(t,e);if(t&&typeof t=="object"){let r=t;for(let n of["import","require","default"]){let s=Pr(r[n],e);if(s)return s}}return null}function Ys(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 Xs(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 dt(t,e){let r=[],n=qs.join(e,"package.json");if(Ar.existsSync(n))try{let s=JSON.parse(Ar.readFileSync(n,"utf8"));if(s.exports&&typeof s.exports=="object"&&!Array.isArray(s.exports))for(let o of Object.values(s.exports)){let i=Pr(o,t);i&&!r.includes(i)&&r.push(i)}else if(typeof s.exports=="string"){let o=gt(s.exports,t);o&&r.push(o)}if(r.length===0)for(let o of[s.main,s.module].filter(Boolean)){let i=gt(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 Zs(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 eo(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 to(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(d=>d.name===o))??n[0],p={name:o,definedIn:l,kind:Ys(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 ro(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 ht(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=Zs(t,e),n=eo(t,r,e),s=Xs(t,e),o=to(s,n,t,e),{internalFiles:i,unreachableFromEntry:a,testFiles:c}=ro(t,r,e);return{entryPoints:e,publicExports:o,internalFiles:i,unreachableFromEntry:a,testFiles:c}}function yt(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}}import Wl from"fs";import $l from"path";function Nr(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 xt(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:Nr(t)}}function bt(t,e){return t.impact.get(e)??[]}import{readFile as Qr}from"fs/promises";import oe from"path";import Wo from"piscina";import Ie from"fs";import no from"path";import{load as Ir}from"js-yaml";var St=["package-lock.json","yarn.lock","pnpm-lock.yaml"];function Dr(t){let e=t.lastIndexOf("@");return e>0?t.substring(0,e):t}function so(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)),Dr(r)}).filter(Boolean)}function oo(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 io(t){try{let e=Ir(t),r={dependencies:{}};for(let[n,s]of Object.entries(e))if(!(n==="__metadata"||!s?.version))for(let o of n.split(", ")){let i=Dr(o);i&&(r.dependencies[i]={version:s.version,...s.dependencies!==void 0&&{dependencies:s.dependencies}})}return r}catch{return null}}function ao(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=so(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 co(t){let e=Ie.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 lo(t){let e=Ie.readFileSync(t,"utf-8");if(e.includes("__metadata:")){let r=io(e);if(r!==null)return r}return ao(e)}function po(t){let e=Ie.readFileSync(t,"utf-8"),r={dependencies:{}};try{let n=Ir(e);if(n.packages)for(let[s,o]of Object.entries(n.packages)){let{name:i,version:a}=oo(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 Mr(t){let e={"package-lock.json":co,"yarn.lock":lo,"pnpm-lock.yaml":po},r=St.map(n=>[n,e[n]]);for(let[n,s]of r){let o=no.join(t,n);if(Ie.existsSync(o))return s(o)}return null}var uo=new Set(["css","scss","less","stylus"]);function Rr(t){return uo.has(t)?"style":"code"}import Gr from"postcss";import*as fo from"postcss-less";var mo=fo,_r=new Set(["reference","inline"]);function Lr(t){return t.startsWith("~")||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("//")||t.startsWith("data:")}function go(t){let e=t.trim();return e.length>0&&!e.startsWith("http://")&&!e.startsWith("https://")&&!e.startsWith("//")&&!e.startsWith("data:")&&!e.startsWith("#")}function ho(t,e){let r=t.match(/^\(([^)]+)\)\s+['"]([^'"]+)['"]/);if(r){let o=r[1]?.trim()??"",i=r[2]??"";if(!i)return null;let a=_r.has(o)?"side-effect":"static";return{fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a,...Lr(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",...Lr(s)?{isExternal:!0}:{}}:null}function yo(t,e){let r=[],n=/url\(['"]?([^'")]+)['"]?\)/g,s=n.exec(t);for(;s!==null;){let o=s[1]?.trim()??"";go(o)&&r.push({fromPath:e,toPath:"",rawSpecifier:o,isStyle:!0,type:"static"}),s=n.exec(t)}return r}function Or(t,e){let r=[];return t.walk(n=>{if(n.type==="atrule"&&n.name==="import"){let s=ho(n.params,e);s&&r.push(s)}n.type==="decl"&&r.push(...yo(n.value,e))}),r}function xo(t){return t.replace(/(?<!:)\/\/.*/g,"")}function bo(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=_r.has(o)?"side-effect":"static";r.push({fromPath:e,toPath:"",rawSpecifier:i,isStyle:!0,type:a})}s=n.exec(t)}return r}function De(t,e){let r=Gr.parse(xo(t));return{imports:Or(r,e),root:r}}function So(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 Me(t,e){try{let r=mo.parse(t),{exports:n,tags:s}=So(r);return{imports:Or(r,e),root:r,exports:n,tags:s}}catch{return{imports:bo(t,e),root:Gr.parse(""),exports:[],tags:[]}}}import{parse as ko}from"postcss-scss";function jr(t){return t.startsWith("_")||t.startsWith("-")}function vo(t){return!!(t.startsWith("sass:")||t.startsWith("~")||t.startsWith("http://")||t.startsWith("https://")||t.startsWith("//")||!t.startsWith(".")&&!t.startsWith("/")&&!t.startsWith("_"))}function Co(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 wo(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||jr(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||jr(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 Re(t,e){let r=ko(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}=Co(c);if(!l)return;let u={fromPath:e,toPath:"",rawSpecifier:l,isStyle:!0,type:a==="forward"?"re-export":"static",...vo(l)?{isExternal:!0}:{}};p&&(u.symbols=[p]),n.push(u)});let{exports:s,tags:o}=wo(r);return{imports:n,root:r,exports:s,tags:o}}function Fo(t){return t.trim().replace(/\s+/g," ")}function To(t){try{return t.fileType==="scss"?Re(t.source,t.file).root:t.fileType==="less"?Me(t.source,t.file).root:t.fileType==="css"?De(t.source,t.file).root:void 0}catch{return}}function Eo(t){let e=To(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()}:${Fo(p.value)}`).join(";");r.push({file:t.file,startLine:a,endLine:c,lines:c-a+1,signature:l,declCount:s.length})}),r}function Wr(t,e,r=2){let n=new Map;for(let o of t)for(let i of Eo(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 zr(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 Ao=new Set(["{","}",":",",","[","]"]);function $r(t,e,r){let n=0;for(let s=e;s<e+r;s++)Ao.has(t[s].text)&&n++;return n/r}function Br(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 Ur(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 Kr(t,e,r,n=.5){let s=[],o=[],i=new Map;for(let{file:u,tokens:d}of t)if(d.length!==0){i.set(u,d);for(let h=0;h<d.length;h++)s.push(d[h].text),o.push({file:u,localIndex:h});s.push(` ${u}`),o.push({file:u,localIndex:-1})}if(s.length===0)return[];let a=Br(s),c=Ur(s,a),l=zr(c),p=[];for(let u of l){let d=Po(u,a,o,i,e,r,n);d&&p.push(d)}return p.sort((u,d)=>d.lines-u.lines)}function Po(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||!No(a,n))return;let c=Io(a,t.lcpLength);if(c.length<2)return;let l=c[0],p=n.get(l.file);if($r(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}}),d=Math.min(...u.map(h=>h.endLine-h.startLine+1));if(!(d<o))return{occurrences:u,lines:d,tokens:t.lcpLength}}function No(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 Io(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 Do={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 Hr(t,e,r){let n=t.slice(e,r).replace(/[^\n]/g," ");return t.slice(0,e)+n+t.slice(r)}function Mo(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=Hr(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=Hr(r,o,a),s=a}}return r}var Ro=["===","!==","...","=>","==","!=","<=",">=","&&","||","::","->","..","+=","-=","*=","/="],kt=new RegExp(`${Ro.map(t=>t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")).join("|")}|[A-Za-z_$][A-Za-z0-9_$]*|\\d+(?:\\.\\d+)?|"(?:\\\\.|[^"\\\\])*"|'(?:\\\\.|[^'\\\\])*'|\`(?:\\\\.|[^\`\\\\])*\`|\\S`,"g"),Lo=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Jr=/^\d+(?:\.\d+)?$/,Go=/^(".*"|'.*'|`.*`)$/s,_o=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 Vr(t,e,r=!0){let n=Mo(t,Do[e]),s=[],o=1,i=0;kt.lastIndex=0;let a=kt.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;Lo.test(c)&&!_o.has(c)?l="ID":r&&(Jr.test(c)||Go.test(c))&&(l=Jr.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=kt.exec(n)}return s}import se from"fs";import Oo from"path";function jo(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 Le(t){try{if(!se.existsSync(t))return new Map;let e=se.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"&&jo(s[1]));return new Map(n)}catch{return new Map}}function Ge(t,e){let r=Oo.dirname(e);se.existsSync(r)||se.mkdirSync(r,{recursive:!0}),se.writeFileSync(e,JSON.stringify([...t.entries()]))}var zo=20,$o=new Set(["css","scss","less"]);function Bo(t){return St.includes(oe.basename(t))}function Uo(t,e){if(e.length===0)return!1;let r=new Set(e);return t.split(oe.sep).some(n=>r.has(n))}async function vt(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=>!Bo(h.path)&&!Uo(h.path,c)),d=Ko(l,u.length);try{let h=[],k=new Map;if(await Promise.all(u.map(async y=>{if($o.has(y.type)){let J;try{J=await Qr(oe.join(e,y.path),"utf8")}catch{return}h.push({file:y.path,source:J,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 J;try{J=await Qr(oe.join(e,y.path),"utf8")}catch{return}N=d?await d.run({source:J,fileType:y.type,ignoreLiterals:o}):Vr(J,y.type,o),p?.set(y.path,{mtime:y.mtime,size:y.size,ignoreLiterals:o,tokens:N})}let O=Rr(y.type),yr={file:y.path,tokens:N},xr=k.get(O);xr?xr.push(yr):k.set(O,[yr])})),p){let y=new Set(u.map(C=>C.path));for(let C of p.keys())y.has(C)||p.delete(C)}let x=Wr(h,n);for(let[y,C]of k)for(let D of Kr(C,s,n,i))x.push({...D,family:y});return{groups:x.sort((y,C)=>C.lines-y.lines).slice(0,a)}}finally{d&&await d.destroy()}}function Ko(t,e){if(t===!1)return null;let r=typeof t=="object"?t:{},n=r.minFiles??zo;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 Wo({filename:oe.join(f,"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}}import Ge from"path";function Bo(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 Uo(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=Ge.extname(s),c=Ge.basename(s,a),l=c==="index"?Ge.basename(Ge.dirname(s)):c;n.set(s,{path:s,outDegree:o,tag:`feature:${l}`})}return n}function z(t,e){let r=e?.minOutDegree??5;return Uo(t,Bo(t),r)}var Ko=(t,e)=>t.outDegree-e.outDegree;function Jo(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 Ho(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 Vo(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 Qo(t,e,r){let n=[];for(let s of t.keys())!e.has(s)&&!r.has(s)&&n.push(s);return n}function ie(t,e){let r=e?.detectFn??z,n=e?.hubComparator??Ko,s=r(t.nodes,e),o=Jo(t,s),i=Ho(t.nodes,s,o,n);return{features:Vo(s,i),unassigned:Qo(t.nodes,s,i)}}var Hr=new Set(["typescript","javascript","python","go","scss","less","lua","coffeescript"]),Vr=new Set(["typescript","javascript","python"]),_e=new Set(["typescript","javascript","go","python"]);function vt(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:Hr.has(r),importSymbolsTracked:Vr.has(r),callEdgesTracked:_e.has(r)})).sort((r,n)=>n.fileCount-r.fileCount)}var ae=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 M=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 d of s(c))a(d,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 ae(this.nodes).findUnusedFiles(e)}findCycles(){return new ae(this.nodes).findCycles()}};var W=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 ce(t,e){let r=t.nodes.get(e);if(r)return{category:r.category,exports:r.exports.map(n=>n.name)}}function Ct(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 le(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 wt(t,e,r={}){let{testsOnly:n=!1,changedSymbols:s}=r,o=s?new W(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 Ft(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 Tt(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 Et(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 At(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 Pt(t){return[...t.nodes.values()].some(e=>e.coveragePct!==void 0)}function Qr(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")||pe(e)==="cli"?"cli":v(e,"util")||v(e,"utils")||v(e,"helper")||v(e,"helpers")?"util":v(e,"model")||v(e,"models")||pe(e)==="model"?"model":v(e,"parser")||v(e,"parsers")||pe(e)==="parser"?"parser":pe(e)==="builder"?"builder":pe(e)==="resolver"?"resolver":"other"}function v(t,e){return t.includes(`/${e}/`)||t.includes(`/${e}.`)}function pe(t){let e=t.slice(t.lastIndexOf("/")+1);return e.slice(0,e.lastIndexOf("."))||e}function Nt(t,e){let r=ie(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:Qr(o),...o.description?{description:o.description}:{},exports:o.exports.map(a=>a.name),...i?{featureHub:i}:{}})}return s}function It(t,e){let r=[];for(let n of t.nodes.values())if(n.exports.some(s=>s.name===e))if(_e.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=le(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 qo(t){return t?t.startsWith("interface ")?"interface":t.startsWith("class ")?"class":t.startsWith("enum ")?"enum":"type":"type"}function Yo(t,e){if(e==="type-only")return!0;let r=t.signature??"";return r.startsWith("interface ")||r.startsWith("class ")||r.startsWith("enum ")}function Dt(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(!Yo(s,n.category))continue;let o=`${n.path}::${s.name}`;e.set(o,{name:s.name,file:n.path,kind:qo(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 Mt(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())}}import li from"path";import Lt from"fs";import Zr from"path";import ue from"fs";import A from"path";import qr from"fs";import fu from"path";function Yr(t){try{return qr.statSync(t,{throwIfNoEntry:!1})?.isDirectory()===!0}catch{return!1}}function Oe(t){try{return qr.statSync(t,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}function Rt(t,e){let r=A.join(e,"package.json");if(!ue.existsSync(r))return null;let n={};try{n=JSON.parse(ue.readFileSync(r,"utf-8"))}catch{return null}let s=n.name;return s?{name:s,root:e,relativeRoot:A.relative(t,e),entryPoints:Xo(e,n)}:null}function Xo(t,e){let r=[];if(e.exports){let s=e.exports;if(typeof s=="string")r.push(A.join(t,s));else if(typeof s=="object"&&s!==null){let o=s["."];if(typeof o=="string")r.push(A.join(t,o));else if(typeof o=="object"&&o!==null){let i=o.import??o.require??o.default;typeof i=="string"&&r.push(A.join(t,i))}}}e.main&&r.push(A.join(t,e.main));for(let s of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"])r.push(A.join(t,s));let n=r.filter(Oe);return n.length>0?n.slice(0,1):r.slice(0,1)}function Q(t,e){let r=[],n=new Set;for(let s of e){let o=s.replace(/\/$/,"").replace(/^\.\//,"");Zo(t,o,n,r)}return r}function Zo(t,e,r,n){if(!e.includes("*")){ei(t,e,r,n);return}let s=e.split("/");s.includes("**")?ti(t,s,r,n):ri(t,s,r,n)}function ei(t,e,r,n){let s=A.join(t,e);if(r.has(s)||!Yr(s))return;r.add(s);let o=Rt(t,s);o&&n.push(o)}function ti(t,e,r,n){let s=A.join(t,e[0]==="**"?"":e[0]??"");Xr(t,s,r,n)}function ri(t,e,r,n){let s=e.findIndex(a=>a.includes("*")),o=A.join(t,...e.slice(0,s)),i;try{i=ue.readdirSync(o,{withFileTypes:!0})}catch{return}for(let a of i){if(!a.isDirectory())continue;let c=A.join(o,a.name);if(r.has(c))continue;r.add(c);let l=Rt(t,c);l&&n.push(l)}}function Xr(t,e,r,n){let s;try{s=ue.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.join(e,o.name);if(ue.existsSync(A.join(i,"package.json"))&&!r.has(i)){r.add(i);let a=Rt(t,i);a&&n.push(a)}else Xr(t,i,r,n)}}var en={type:"npm",detect(t){let e=Zr.join(t,"package.json");if(!Lt.existsSync(e))return null;let r;try{r=JSON.parse(Lt.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!r||Lt.existsSync(Zr.join(t,"yarn.lock")))return null;let n=Array.isArray(r)?r:r.packages??[];return n.length===0?null:Q(t,n)}};import q from"fs";import T from"path";var tn={type:"nx",detect(t){return q.existsSync(T.join(t,"nx.json"))?rn(t,t,new Set,0).map(r=>ni(t,r,T.join(r,"project.json"))).filter(r=>r!==null):null}};function rn(t,e,r,n){if(n>4)return[];let s;try{s=q.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.join(e,a);q.existsSync(T.join(c,"project.json"))&&!r.has(c)?(r.add(c),o.push(c)):o.push(...rn(t,c,r,n+1))}return o}function ni(t,e,r){let n={};try{n=JSON.parse(q.readFileSync(r,"utf-8"))}catch{return null}let s=n.name,o,i,a=T.join(e,"package.json");if(q.existsSync(a))try{let c=JSON.parse(q.readFileSync(a,"utf-8"));s=c.name??s,o=c.main,i=c.exports}catch{}return s?{name:s,root:e,relativeRoot:T.relative(t,e),entryPoints:si(e,n,o,i)}:null}function si(t,e,r,n){let s=[],o=e.targets?.build?.options?.main??e.targets?.build?.options?.entryFile;if(o){let a=T.resolve(t,"../..");s.push(T.resolve(a,o)),s.push(T.resolve(t,o))}if(n){let a=n;if(typeof a=="string")s.push(T.join(t,a));else if(typeof a=="object"&&a!==null){let c=a["."];typeof c=="string"&&s.push(T.join(t,c))}}if(r&&s.push(T.join(t,r)),e.sourceRoot){let a=T.resolve(t,"../.."),c=T.resolve(a,e.sourceRoot);s.push(T.join(c,"index.ts"),T.join(c,"index.tsx"))}for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx"])s.push(T.join(t,a));let i=s.filter(Oe);return i.length>0?i.slice(0,1):s.slice(0,1)}import nn from"fs";import oi from"path";import{load as ii}from"js-yaml";var sn={type:"pnpm",detect(t){let e=oi.join(t,"pnpm-workspace.yaml");if(!nn.existsSync(e))return null;let r=[];try{r=ii(nn.readFileSync(e,"utf-8"))?.packages??[]}catch{return null}return Q(t,r)}};import ai from"fs";import ci from"path";var on={type:"turborepo",detect(t){return ai.existsSync(ci.join(t,"turbo.json"))?[]:null}};import Gt from"fs";import an from"path";var cn={type:"yarn",detect(t){if(!Gt.existsSync(an.join(t,"yarn.lock")))return null;let e=an.join(t,"package.json");if(!Gt.existsSync(e))return null;let r;try{r=JSON.parse(Gt.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:Q(t,n)}};var ln=[];function L(t){ln.push(t)}function pn(){return ln}L(on);L(tn);L(sn);L(cn);L(en);function fe(t,e=pn()){let r=li.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 me=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 M(o);r.packages.set(n.name,{graph:i,pkg:{...n,root:""}})}return r}};var un=new Map;function Y(t,e){un.set(t,e)}function fn(t){return un.get(t)}function mn(t,e){return e.startsWith("!")?t!==e.slice(1):t===e}function pi(t,e){return e.startsWith("!")?!t.includes(e.slice(1)):t.includes(e)}var ui=(t,e)=>!e.category||mn(t.category,e.category),fi=(t,e)=>!e.type||mn(t.type,e.type),mi=(t,e)=>e.lastAuthor?e.lastAuthor.startsWith("!")?t.lastAuthor!==e.lastAuthor.slice(1):t.lastAuthor!==void 0&&t.lastAuthor===e.lastAuthor:!0,gi=(t,e)=>!e.path||pi(t.path,e.path),di=(t,e)=>e.isExternal===void 0?!0:t.imports.some(n=>n.isExternal)===e.isExternal,hi=(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)))},yi=(t,e)=>!e.allTags?.length||e.allTags.every(r=>t.tags.some(n=>n.name===r)),xi=(t,e)=>!e.importsFile||t.imports.some(r=>r.toPath?.includes(e.importsFile)),bi=(t,e,r)=>e.importedBy===void 0?!0:(r?.get(t.path)??[]).some(s=>s.includes(e.importedBy)),Si=(t,e)=>e.minImports===void 0||t.imports.length>=e.minImports,ki=(t,e)=>e.maxImports===void 0||t.imports.length<=e.maxImports,vi=(t,e)=>e.minSize===void 0||t.size>=e.minSize,Ci=(t,e)=>e.maxSize===void 0||t.size<=e.maxSize,wi=(t,e)=>e.hasDocstring===void 0||!!t.description===e.hasDocstring,Fi=(t,e)=>e.isDocumented===void 0||!!t.documentedBy?.length===e.isDocumented,Ti=(t,e)=>e.isStale===void 0||!!t.staleFor?.length===e.isStale,Ei=(t,e)=>e.minCoverage===void 0||(t.coveragePct??101)>=e.minCoverage,Ai=(t,e)=>e.maxCoverage===void 0||(t.coveragePct??0)<=e.maxCoverage,Pi=(t,e)=>e.minExportUsage===void 0||(t.avgExportUsage??-1)>=e.minExportUsage,Ni=(t,e)=>e.maxExportUsage===void 0||(t.avgExportUsage??0)<=e.maxExportUsage,Ii=(t,e)=>e.minComplexity===void 0||(t.complexity??-1/0)>=e.minComplexity,Di=(t,e)=>e.maxComplexity===void 0||(t.complexity??0)<=e.maxComplexity,Mi=(t,e)=>e.minCognitiveComplexity===void 0||(t.cognitiveComplexity??-1/0)>=e.minCognitiveComplexity,Ri=(t,e)=>e.maxCognitiveComplexity===void 0||(t.cognitiveComplexity??0)<=e.maxCognitiveComplexity,Li=(t,e)=>e.minCommits===void 0||(t.commitCount90d??-1/0)>=e.minCommits,Gi=(t,e)=>e.maxCommits===void 0||(t.commitCount90d??0)<=e.maxCommits,_i=(t,e,r)=>!e.any?.length||e.any.some(n=>ge(t,n,r)),Oi=[ui,fi,mi,gi,di,hi,yi,xi,bi,Si,ki,vi,Ci,wi,Fi,Ti,Ei,Ai,Pi,Ni,Ii,Di,Mi,Ri,Li,Gi,_i];function ge(t,e,r){return Oi.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=>ge(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 gn(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 ji(t){let e=[];for(let r of t.split("|")){let n=r.trim();if(!n)continue;let s={};gn(s,n),Object.keys(s).length>0&&e.push(s)}return e}function ze(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=ji(o);i.length>0&&(e.any=[...e.any??[],...i]);continue}gn(e,n)}return e}import vn from"fs/promises";import la from"path";import Vt from"path";import Qe from"typescript";import $i from"path";import zi from"path";import F from"typescript";var dn=new Set(["describe","test","it"]);function $(t,e){let r=t[e];if(r===void 0)throw new Error(`Index ${e} out of bounds (length ${t.length})`);return r}function _t(t){let e=[];for(let r of t.statements){if(!F.isExpressionStatement(r))continue;let n=r.expression;if(!F.isCallExpression(n))continue;let s=n.expression;F.isIdentifier(s)&&dn.has(s.text)&&e.push(n),F.isPropertyAccessExpression(s)&&F.isIdentifier(s.expression)&&dn.has(s.expression.text)&&e.push(n)}return e}function Ot(t,e,r){for(let n of t.arguments){if(!F.isObjectLiteralExpression(n))continue;let s=n.properties.find(o=>F.isPropertyAssignment(o)&&F.isIdentifier(o.name)&&o.name.text===e);if(!(!s||!F.isArrayLiteralExpression(s.initializer)))return s.initializer.elements.filter(F.isStringLiteral).map(o=>o.text)}return null}function jt(t,e,r,n){if(t.arguments.length===0)return null;for(let o=1;o<t.arguments.length;o++){let i=$(t.arguments,o);if(!F.isObjectLiteralExpression(i))continue;let a=i.properties.find(l=>F.isPropertyAssignment(l)&&F.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=$(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=$(n,s);if(!F.isObjectLiteralExpression(o))continue;let i=o.properties.findIndex(c=>F.isPropertyAssignment(c)&&F.isIdentifier(c.name)&&c.name.text===e);if(i<0)continue;if(o.properties.length===1)return{start:$(n,s-1).getEnd(),end:o.getEnd(),text:""};let a=$(o.properties,i);return i===o.properties.length-1?{start:$(o.properties,i-1).getEnd(),end:a.getEnd(),text:""}:{start:a.getStart(r),end:$(o.properties,i+1).getStart(r),text:""}}return null}function Wt(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 $t(t){return`[${t.map(e=>JSON.stringify(e)).join(", ")}]`}var D=new Set([".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"]);function Wi(t){return t.map(e=>e.startsWith("@")?e.slice(1):e)}function We(t,e,r,n){let s=F.createSourceFile(zi.basename(t),e,F.ScriptTarget.Latest,!0),o=_t(s),[i]=o;if(!i)return e;let a=Ot(i,n,s),c=[...r].sort();if(a!==null&&JSON.stringify(Wi(a).sort())===JSON.stringify(c))return e;let l=$t(c.map(u=>`@${u}`)),p=o.flatMap(u=>{let d=r.length===0?zt(u,n,s):jt(u,n,l,s);return d?[d]:[]});return p.length>0?Wt(e,p):e}var $e=class{name="cypress";canHandle(e){return D.has($i.extname(e).toLowerCase())}apply(e,r,n){return We(e,r,n,"tags")}};import Bi from"path";var Bt=/# <mokosh-tags>[\s\S]*?# <\/mokosh-tags>\n*/,Ut=/^@([a-zA-Z0-9_-]+)/gm;function Ui(t){return`${["# <mokosh-tags>",...t.map(e=>`@${e}`),"# </mokosh-tags>"].join(`
|
|
11
|
+
`),null}}import _e from"path";function Ho(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 Jo(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=_e.extname(s),c=_e.basename(s,a),l=c==="index"?_e.basename(_e.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 Jo(t,Ho(t),r)}var Vo=(t,e)=>t.outDegree-e.outDegree;function Qo(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 qo(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 Yo(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 Xo(t,e,r){let n=[];for(let s of t.keys())!e.has(s)&&!r.has(s)&&n.push(s);return n}function ie(t,e){let r=e?.detectFn??W,n=e?.hubComparator??Vo,s=r(t.nodes,e),o=Qo(t,s),i=qo(t.nodes,s,o,n);return{features:Yo(s,i),unassigned:Xo(t.nodes,s,i)}}var qr=new Set(["typescript","javascript","python","go","scss","less","lua","coffeescript"]),Yr=new Set(["typescript","javascript","python"]),Oe=new Set(["typescript","javascript","go","python"]);function Ct(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:qr.has(r),importSymbolsTracked:Yr.has(r),callEdgesTracked:Oe.has(r)})).sort((r,n)=>n.fileCount-r.fileCount)}var ae=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 d of s(c))a(d,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 ae(this.nodes).findUnusedFiles(e)}findCycles(){return new ae(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 ce(t,e){let r=t.nodes.get(e);if(r)return{category:r.category,exports:r.exports.map(n=>n.name)}}function wt(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 le(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 Ft(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 Tt(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 Et(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 At(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 Pt(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 Nt(t){return[...t.nodes.values()].some(e=>e.coveragePct!==void 0)}function Xr(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")||pe(e)==="cli"?"cli":v(e,"util")||v(e,"utils")||v(e,"helper")||v(e,"helpers")?"util":v(e,"model")||v(e,"models")||pe(e)==="model"?"model":v(e,"parser")||v(e,"parsers")||pe(e)==="parser"?"parser":pe(e)==="builder"?"builder":pe(e)==="resolver"?"resolver":"other"}function v(t,e){return t.includes(`/${e}/`)||t.includes(`/${e}.`)}function pe(t){let e=t.slice(t.lastIndexOf("/")+1);return e.slice(0,e.lastIndexOf("."))||e}function It(t,e){let r=ie(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:Xr(o),...o.description?{description:o.description}:{},exports:o.exports.map(a=>a.name),...i?{featureHub:i}:{}})}return s}function Dt(t,e){let r=[];for(let n of t.nodes.values())if(n.exports.some(s=>s.name===e))if(Oe.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=le(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 Zo(t){return t?t.startsWith("interface ")?"interface":t.startsWith("class ")?"class":t.startsWith("enum ")?"enum":"type":"type"}function ei(t,e){if(e==="type-only")return!0;let r=t.signature??"";return r.startsWith("interface ")||r.startsWith("class ")||r.startsWith("enum ")}function Mt(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(!ei(s,n.category))continue;let o=`${n.path}::${s.name}`;e.set(o,{name:s.name,file:n.path,kind:Zo(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 Rt(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())}}import fi from"path";import Gt from"fs";import rn from"path";import ue from"fs";import A from"path";import Zr from"fs";import du from"path";function en(t){try{return Zr.statSync(t,{throwIfNoEntry:!1})?.isDirectory()===!0}catch{return!1}}function je(t){try{return Zr.statSync(t,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}function Lt(t,e){let r=A.join(e,"package.json");if(!ue.existsSync(r))return null;let n={};try{n=JSON.parse(ue.readFileSync(r,"utf-8"))}catch{return null}let s=n.name;return s?{name:s,root:e,relativeRoot:A.relative(t,e),entryPoints:ti(e,n)}:null}function ti(t,e){let r=[];if(e.exports){let s=e.exports;if(typeof s=="string")r.push(A.join(t,s));else if(typeof s=="object"&&s!==null){let o=s["."];if(typeof o=="string")r.push(A.join(t,o));else if(typeof o=="object"&&o!==null){let i=o.import??o.require??o.default;typeof i=="string"&&r.push(A.join(t,i))}}}e.main&&r.push(A.join(t,e.main));for(let s of["src/index.ts","src/index.tsx","index.ts","index.tsx","index.js"])r.push(A.join(t,s));let n=r.filter(je);return n.length>0?n.slice(0,1):r.slice(0,1)}function Q(t,e){let r=[],n=new Set;for(let s of e){let o=s.replace(/\/$/,"").replace(/^\.\//,"");ri(t,o,n,r)}return r}function ri(t,e,r,n){if(!e.includes("*")){ni(t,e,r,n);return}let s=e.split("/");s.includes("**")?si(t,s,r,n):oi(t,s,r,n)}function ni(t,e,r,n){let s=A.join(t,e);if(r.has(s)||!en(s))return;r.add(s);let o=Lt(t,s);o&&n.push(o)}function si(t,e,r,n){let s=A.join(t,e[0]==="**"?"":e[0]??"");tn(t,s,r,n)}function oi(t,e,r,n){let s=e.findIndex(a=>a.includes("*")),o=A.join(t,...e.slice(0,s)),i;try{i=ue.readdirSync(o,{withFileTypes:!0})}catch{return}for(let a of i){if(!a.isDirectory())continue;let c=A.join(o,a.name);if(r.has(c))continue;r.add(c);let l=Lt(t,c);l&&n.push(l)}}function tn(t,e,r,n){let s;try{s=ue.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.join(e,o.name);if(ue.existsSync(A.join(i,"package.json"))&&!r.has(i)){r.add(i);let a=Lt(t,i);a&&n.push(a)}else tn(t,i,r,n)}}var nn={type:"npm",detect(t){let e=rn.join(t,"package.json");if(!Gt.existsSync(e))return null;let r;try{r=JSON.parse(Gt.readFileSync(e,"utf-8")).workspaces}catch{return null}if(!r||Gt.existsSync(rn.join(t,"yarn.lock")))return null;let n=Array.isArray(r)?r:r.packages??[];return n.length===0?null:Q(t,n)}};import q from"fs";import T from"path";var sn={type:"nx",detect(t){return q.existsSync(T.join(t,"nx.json"))?on(t,t,new Set,0).map(r=>ii(t,r,T.join(r,"project.json"))).filter(r=>r!==null):null}};function on(t,e,r,n){if(n>4)return[];let s;try{s=q.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.join(e,a);q.existsSync(T.join(c,"project.json"))&&!r.has(c)?(r.add(c),o.push(c)):o.push(...on(t,c,r,n+1))}return o}function ii(t,e,r){let n={};try{n=JSON.parse(q.readFileSync(r,"utf-8"))}catch{return null}let s=n.name,o,i,a=T.join(e,"package.json");if(q.existsSync(a))try{let c=JSON.parse(q.readFileSync(a,"utf-8"));s=c.name??s,o=c.main,i=c.exports}catch{}return s?{name:s,root:e,relativeRoot:T.relative(t,e),entryPoints:ai(e,n,o,i)}:null}function ai(t,e,r,n){let s=[],o=e.targets?.build?.options?.main??e.targets?.build?.options?.entryFile;if(o){let a=T.resolve(t,"../..");s.push(T.resolve(a,o)),s.push(T.resolve(t,o))}if(n){let a=n;if(typeof a=="string")s.push(T.join(t,a));else if(typeof a=="object"&&a!==null){let c=a["."];typeof c=="string"&&s.push(T.join(t,c))}}if(r&&s.push(T.join(t,r)),e.sourceRoot){let a=T.resolve(t,"../.."),c=T.resolve(a,e.sourceRoot);s.push(T.join(c,"index.ts"),T.join(c,"index.tsx"))}for(let a of["src/index.ts","src/index.tsx","index.ts","index.tsx"])s.push(T.join(t,a));let i=s.filter(je);return i.length>0?i.slice(0,1):s.slice(0,1)}import an from"fs";import ci from"path";import{load as li}from"js-yaml";var cn={type:"pnpm",detect(t){let e=ci.join(t,"pnpm-workspace.yaml");if(!an.existsSync(e))return null;let r=[];try{r=li(an.readFileSync(e,"utf-8"))?.packages??[]}catch{return null}return Q(t,r)}};import pi from"fs";import ui from"path";var ln={type:"turborepo",detect(t){return pi.existsSync(ui.join(t,"turbo.json"))?[]:null}};import _t from"fs";import pn from"path";var un={type:"yarn",detect(t){if(!_t.existsSync(pn.join(t,"yarn.lock")))return null;let e=pn.join(t,"package.json");if(!_t.existsSync(e))return null;let r;try{r=JSON.parse(_t.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:Q(t,n)}};var fn=[];function L(t){fn.push(t)}function mn(){return fn}L(ln);L(sn);L(cn);L(un);L(nn);function fe(t,e=mn()){let r=fi.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 me=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 Y(t,e){gn.set(t,e)}function dn(t){return gn.get(t)}function hn(t,e){return e.startsWith("!")?t!==e.slice(1):t===e}function mi(t,e){return e.startsWith("!")?!t.includes(e.slice(1)):t.includes(e)}var gi=(t,e)=>!e.category||hn(t.category,e.category),di=(t,e)=>!e.type||hn(t.type,e.type),hi=(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||mi(t.path,e.path),xi=(t,e)=>e.isExternal===void 0?!0:t.imports.some(n=>n.isExternal)===e.isExternal,bi=(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)))},Si=(t,e)=>!e.allTags?.length||e.allTags.every(r=>t.tags.some(n=>n.name===r)),ki=(t,e)=>!e.importsFile||t.imports.some(r=>r.toPath?.includes(e.importsFile)),vi=(t,e,r)=>e.importedBy===void 0?!0:(r?.get(t.path)??[]).some(s=>s.includes(e.importedBy)),Ci=(t,e)=>e.minImports===void 0||t.imports.length>=e.minImports,wi=(t,e)=>e.maxImports===void 0||t.imports.length<=e.maxImports,Fi=(t,e)=>e.minSize===void 0||t.size>=e.minSize,Ti=(t,e)=>e.maxSize===void 0||t.size<=e.maxSize,Ei=(t,e)=>e.hasDocstring===void 0||!!t.description===e.hasDocstring,Ai=(t,e)=>e.isDocumented===void 0||!!t.documentedBy?.length===e.isDocumented,Pi=(t,e)=>e.isStale===void 0||!!t.staleFor?.length===e.isStale,Ni=(t,e)=>e.minCoverage===void 0||(t.coveragePct??101)>=e.minCoverage,Ii=(t,e)=>e.maxCoverage===void 0||(t.coveragePct??0)<=e.maxCoverage,Di=(t,e)=>e.minExportUsage===void 0||(t.avgExportUsage??-1)>=e.minExportUsage,Mi=(t,e)=>e.maxExportUsage===void 0||(t.avgExportUsage??0)<=e.maxExportUsage,Ri=(t,e)=>e.minComplexity===void 0||(t.complexity??-1/0)>=e.minComplexity,Li=(t,e)=>e.maxComplexity===void 0||(t.complexity??0)<=e.maxComplexity,Gi=(t,e)=>e.minCognitiveComplexity===void 0||(t.cognitiveComplexity??-1/0)>=e.minCognitiveComplexity,_i=(t,e)=>e.maxCognitiveComplexity===void 0||(t.cognitiveComplexity??0)<=e.maxCognitiveComplexity,Oi=(t,e)=>e.minCommits===void 0||(t.commitCount90d??-1/0)>=e.minCommits,ji=(t,e)=>e.maxCommits===void 0||(t.commitCount90d??0)<=e.maxCommits,Wi=(t,e,r)=>!e.any?.length||e.any.some(n=>ge(t,n,r)),zi=[gi,di,hi,yi,xi,bi,Si,ki,vi,Ci,wi,Fi,Ti,Ei,Ai,Pi,Ni,Ii,Di,Mi,Ri,Li,Gi,_i,Oi,ji,Wi];function ge(t,e,r){return zi.every(n=>n(t,e,r))}function We(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=>ge(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 yn(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 $i(t){let e=[];for(let r of t.split("|")){let n=r.trim();if(!n)continue;let s={};yn(s,n),Object.keys(s).length>0&&e.push(s)}return e}function ze(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=$i(o);i.length>0&&(e.any=[...e.any??[],...i]);continue}yn(e,n)}return e}import Fn from"fs/promises";import fa from"path";import Qt from"path";import qe from"typescript";import Ki from"path";import Bi from"path";import F from"typescript";var xn=new Set(["describe","test","it"]);function $(t,e){let r=t[e];if(r===void 0)throw new Error(`Index ${e} out of bounds (length ${t.length})`);return r}function Ot(t){let e=[];for(let r of t.statements){if(!F.isExpressionStatement(r))continue;let n=r.expression;if(!F.isCallExpression(n))continue;let s=n.expression;F.isIdentifier(s)&&xn.has(s.text)&&e.push(n),F.isPropertyAccessExpression(s)&&F.isIdentifier(s.expression)&&xn.has(s.expression.text)&&e.push(n)}return e}function jt(t,e,r){for(let n of t.arguments){if(!F.isObjectLiteralExpression(n))continue;let s=n.properties.find(o=>F.isPropertyAssignment(o)&&F.isIdentifier(o.name)&&o.name.text===e);if(!(!s||!F.isArrayLiteralExpression(s.initializer)))return s.initializer.elements.filter(F.isStringLiteral).map(o=>o.text)}return null}function Wt(t,e,r,n){if(t.arguments.length===0)return null;for(let o=1;o<t.arguments.length;o++){let i=$(t.arguments,o);if(!F.isObjectLiteralExpression(i))continue;let a=i.properties.find(l=>F.isPropertyAssignment(l)&&F.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=$(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=$(n,s);if(!F.isObjectLiteralExpression(o))continue;let i=o.properties.findIndex(c=>F.isPropertyAssignment(c)&&F.isIdentifier(c.name)&&c.name.text===e);if(i<0)continue;if(o.properties.length===1)return{start:$(n,s-1).getEnd(),end:o.getEnd(),text:""};let a=$(o.properties,i);return i===o.properties.length-1?{start:$(o.properties,i-1).getEnd(),end:a.getEnd(),text:""}:{start:a.getStart(r),end:$(o.properties,i+1).getStart(r),text:""}}return null}function $t(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 Bt(t){return`[${t.map(e=>JSON.stringify(e)).join(", ")}]`}var M=new Set([".ts",".tsx",".mts",".cts",".js",".jsx",".mjs",".cjs"]);function Ui(t){return t.map(e=>e.startsWith("@")?e.slice(1):e)}function $e(t,e,r,n){let s=F.createSourceFile(Bi.basename(t),e,F.ScriptTarget.Latest,!0),o=Ot(s),[i]=o;if(!i)return e;let a=jt(i,n,s),c=[...r].sort();if(a!==null&&JSON.stringify(Ui(a).sort())===JSON.stringify(c))return e;let l=Bt(c.map(u=>`@${u}`)),p=o.flatMap(u=>{let d=r.length===0?zt(u,n,s):Wt(u,n,l,s);return d?[d]:[]});return p.length>0?$t(e,p):e}var Be=class{name="cypress";canHandle(e){return M.has(Ki.extname(e).toLowerCase())}apply(e,r,n){return $e(e,r,n,"tags")}};import Hi from"path";var Ut=/# <mokosh-tags>[\s\S]*?# <\/mokosh-tags>\n*/,Kt=/^@([a-zA-Z0-9_-]+)/gm;function Ji(t){return`${["# <mokosh-tags>",...t.map(e=>`@${e}`),"# </mokosh-tags>"].join(`
|
|
10
12
|
`)}
|
|
11
13
|
|
|
12
|
-
`}function
|
|
13
|
-
`}function
|
|
14
|
-
${r.slice(c)}`}};import
|
|
14
|
+
`}function Vi(t){let e=new Set;Kt.lastIndex=0;let r=Kt.exec(t);for(;r!==null;)r[1]&&e.add(r[1]),r=Kt.exec(t);return e}var Ue=class{name="gherkin";canHandle(e){return Hi.extname(e).toLowerCase()===".feature"}apply(e,r,n){let s=r.replace(Ut,""),o=Vi(s),i=n.filter(c=>!o.has(c)),a=i.length>0?Ji(i):"";return Ut.test(r)?r.replace(Ut,a):a?r.replace(/^(Feature:)/m,`${a}$1`):r}};function bn(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)}import Qi from"path";var Ht=/^\/\/go:build mokosh_[^\n]+\n/m,qi=/^package\s+\S+/m;function Yi(t){return`//go:build ${t.map(r=>`mokosh_${r}`).join(" || ")}
|
|
15
|
+
`}function Xi(t){let e=Ht.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 Ke=class{name="go";canHandle(e){return Qi.basename(e).endsWith("_test.go")}apply(e,r,n){let s=Xi(r),o=[...n].sort();if(s!==null&&JSON.stringify([...s].sort())===JSON.stringify(o))return r;if(n.length===0)return r.replace(Ht,"");let i=Yi(o);if(s!==null)return r.replace(Ht,i);let a=qi.exec(r);if(!a)return r;let c=a.index;return`${r.slice(0,c)+i}
|
|
16
|
+
${r.slice(c)}`}};import Zi from"path";var ea=/^\/\*\*\n(?: \* @group .+\n)+ \*\/\n+/,Jt=/^ \* @group (.+)$/gm;function ta(t){return`${["/**",...t.map(e=>` * @group ${e}`)," */"].join(`
|
|
15
17
|
`)}
|
|
16
18
|
|
|
17
|
-
`}function
|
|
19
|
+
`}function ra(t){let e=[];Jt.lastIndex=0;let r=Jt.exec(t);for(;r!==null;)r[1]&&e.push(r[1]),r=Jt.exec(t);return e}var He=class{name="jest";canHandle(e){return M.has(Zi.extname(e).toLowerCase())}apply(e,r,n){let s=ea.exec(r),o=s?ra(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:ta(i)+a}};import na from"path";var Je=class{name="playwright";canHandle(e){return M.has(na.extname(e).toLowerCase())}apply(e,r,n){return $e(e,r,n,"tag")}};import sa from"path";var Vt=/^pytestmark\s*=\s*.+$/m,oa=/^import pytest\s*$/m;function ia(t){let e=t.map(r=>`pytest.mark.${r}`).join(", ");return t.length===1?`pytestmark = pytest.mark.${t[0]}`:`pytestmark = [${e}]`}function aa(t){let e=Vt.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 Ve=class{name="pytest";canHandle(e){return sa.extname(e).toLowerCase()===".py"}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(Vt,"").replace(/\n{3,}/g,`
|
|
18
20
|
|
|
19
|
-
`);let i=
|
|
21
|
+
`);let i=ia(o);if(s!==null)return r.replace(Vt,i);let a=oa.test(r),c=ca(r),l=r.slice(0,c),p=r.slice(c),u=a?"":`import pytest
|
|
20
22
|
`,d=l.endsWith(`
|
|
21
23
|
|
|
22
24
|
`)?"":`
|
|
23
25
|
`;return`${l+d+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)}import
|
|
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 wa(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 Fa(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=U(s),u=i?o:o+1,d=p[1];d&&d.type.name!=="Block"&&n(d,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 Xe(t,e){return{complexity:wa(t,e),cognitiveComplexity:Fa(t,e)}}function er(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 In(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}=Xe(n.node,e);r.push({name:o,line:de(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=er(n.node,e),a=i?`${i}.${o}`:o,{complexity:c,cognitiveComplexity:l}=Xe(n.node,e);r.push({name:a,line:de(e,n.from),complexity:c,cognitiveComplexity:l})}}while(n.next());return r}var Aa=/\/\/\s*@tag\s+([a-zA-Z0-9_-]+)/,Pa=/^\/\/go:build\s+(.+)$/,Na=/^\/\/\s*\+build\s+(.+)$/;function Mn(t,e){let r=[],n=new Map,s=new Set,o=new Set,i=new Map,a=Ea.parse(e),c=a.cursor();do switch(c.name){case"LineComment":{let y=e.slice(c.from,c.to),C=y.match(Aa);C?.[1]&&s.add(C[1]);let I=y.match(Pa);I&&Dn(I[1],o);let N=y.match(Na);N&&Dn(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 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=Ta.basename(t).endsWith("_test.go")||s.has("test")||l?"test":"logic",u=new Set([...s,...o]),{complexity:d,cognitiveComplexity:h}=Xe(a.topNode,e),k=In(a,e),x=p==="test"?[]:Ia(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:d,cognitiveComplexity:h,...k.length>0?{functions:k}:{}}}function Ia(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 d=e.slice(p.from,p.to),h=r.get(d);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=er(o.node,e);s(a,l?`${l}.${c}`:c)}}while(o.next());return n}function Dn(t,e){for(let r of t.split(/[\s,&|!()]+/)){let n=r.trim();n&&n!=="ignore"&&e.add(n)}}import Da from"livescript";function K(t){if(t){if(typeof t.value=="string")return t.value;if(typeof t.base?.value=="string")return t.base.value}}function Ma(t){if(!t)return[];if(t.constructor?.name==="Class"){let r=K(t.title);return r?[{name:r}]:[]}if(t.constructor?.name==="Obj"&&Array.isArray(t.items))return t.items.map(r=>K(r.key)??K(r.val)).filter(r=>!!r).map(r=>({name:r}));let e=K(t);return e?[{name:e}]:[]}function Ra(t){let e=t.constructor?.name||t.type;if(e==="Assign"&&t.left?.constructor?.name==="Chain"){let r=t.left,n=K(r.head),o=r.tails?.[0]?.key?.name;if(n==="module"&&o==="exports")return Ma(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=>K(n.val)??K(n.key)).filter(n=>!!n).map(n=>({name:n}))}return[]}var La=new Set(["first_line","first_column","last_line","last_column","line","column"]);function Ga(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 tr(t,e,r){if(!t||typeof t!="object")return[];let n=[],s=Ga(t,e);s&&n.push(s),r.push(...Ra(t));for(let o in t){if(La.has(o))continue;let i=t[o];if(!(!i||typeof i!="object"))if(Array.isArray(i))for(let a of i)n.push(...tr(a,e,r));else n.push(...tr(i,e,r))}return n}function Rn(t,e){let r=X(e),n=Z(t,r),s=[],o=[];try{s=tr(Da.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}}import _a from"luaparse";function Oa(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 ja(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 za(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 Wa(t){let e=t.body,r=ja(e),n=za(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 Ln(t,e){let r=X(e),n=Z(t,r),s=[],o=[];try{let i=_a.parse(e);s=Oa(i,t),o=Wa(i)}catch{}return{imports:s,exports:o,tags:Array.from(r).map(i=>({name:i,kind:"comment-marker"})),category:n}}var $a=["http://","https://","mailto:","//"],Ba="ts|tsx|js|jsx|mjs|cjs|py|go|lua|css|scss|less|styl|coffee|ls|feature|md|mdx|json",Ua=new RegExp(`(?:\\.{1,2}/)?[\\w.-]+(?:/[\\w.-]+)*\\.(?:${Ba})\\b`,"g"),Gn;async function Ka(){return Gn??=(async()=>{let{unified:t}=await import("unified"),e=(await import("remark-parse")).default;return t().use(e)})(),Gn}function Ja(t){let e=t.trim();return e.length===0||e.startsWith("#")||$a.some(r=>e.startsWith(r))}function Ha(t,e){let r=t.match(Ua);return r?r.map(n=>({fromPath:e,toPath:"",rawSpecifier:n,isStyle:!1,type:"static"})):[]}function _n(t,e,r){if(t.type==="link"&&typeof t.url=="string"&&!Ja(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(...Ha(t.value,e)),Array.isArray(t.children))for(let n of t.children)_n(n,e,r)}async function On(t,e){let n=(await Ka()).parse(e),s=[];_n(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"}}import qa from"path";import{parser as Ya}from"@lezer/python";function Va(t){let e=1;function r(n){switch(n.type.name){case"IfStatement":{e+=U(n).filter(o=>o.type.name==="if"||o.type.name==="elif").length;break}case"TryStatement":{e+=U(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 Qa(t){let e=0;function r(n,s){let o=n.type.name;if(o==="IfStatement"){let c=U(n),l=0,p=0;for(;p<c.length;){let u=c[p];if(u?.type.name==="if"||u?.type.name==="elif"){let d=l>0;e+=d?1:1+s;let h=d?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 d=c[p+1];d&&r(d,s+1),p+=2}else p++}return}if(o==="TryStatement"){let c=U(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 rr(t){return{complexity:Va(t),cognitiveComplexity:Qa(t)}}function jn(t,e){let r=[];function n(i,a){let{complexity:c,cognitiveComplexity:l}=rr(i);r.push({name:a,line:de(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"),d=u?e.slice(u.from,u.to):void 0;d&&n(p,c?`${c}.${d}`:d),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 Xa=new Set(["pytest","unittest","nose","hypothesis"]);function zn(t,e){let r=[],n=[],s=new Set,o=qa.basename(t).toLowerCase(),i=Ya.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 Za(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=oc(o,r,s);c==="test"&&s.add("test");let{complexity:l,cognitiveComplexity:p}=rr(i.topNode),u=jn(i,e),d=c==="test"?[]:sc(i,e);return{imports:r,exports:n,tags:Array.from(s).map(h=>({name:h,kind:"comment-marker"})),category:c,rawCallEdges:d,complexity:l,cognitiveComplexity:p,...u.length>0?{functions:u}:{}}}function Za(t,e,r){let n=t.firstChild;return n?n.name==="from"?ec(t,e,r):tc(t,e,r):[]}function ec(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=rc(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[he(r,o,i,!0)];let l=a===1?"./":"../".repeat(a-1);return c?[he(r,l+c.replace(/\./g,"/"),i,!1)]:i[0]==="*"?[he(r,l.slice(0,-1),["*"],!1)]:i.map(p=>he(r,l+p,[p],!1))}function tc(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(he(r,o,["*"],!0))}s=s.nextSibling}return n}function rc(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 nc(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 d=e.slice(u.from,u.to),h=d;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+d;r.set(h,k)}u=u.nextSibling}}while(n.next());return r}function sc(t,e){let r=nc(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),d=r.get(u);d&&n.push({from:c,to:u,toSpecifier:d})}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 d=u.getChild("VariableName"),h=d?e.slice(d.from,d.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 he(t,e,r,n){return{fromPath:t,toPath:"",rawSpecifier:e,isStyle:!1,isExternal:n,type:"static",symbols:r.length>0?r:void 0}}function oc(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=>Xa.has(n.rawSpecifier))?"test":"logic"}import $n from"path";import g from"typescript";import b from"typescript";function ic(t){let e=1;function r(n){switch(n.kind){case b.SyntaxKind.IfStatement:case b.SyntaxKind.ConditionalExpression:case b.SyntaxKind.ForStatement:case b.SyntaxKind.ForInStatement:case b.SyntaxKind.ForOfStatement:case b.SyntaxKind.WhileStatement:case b.SyntaxKind.DoStatement:case b.SyntaxKind.CatchClause:case b.SyntaxKind.CaseClause:e++;break;case b.SyntaxKind.BinaryExpression:{let s=n.operatorToken.kind;(s===b.SyntaxKind.AmpersandAmpersandToken||s===b.SyntaxKind.BarBarToken||s===b.SyntaxKind.QuestionQuestionToken)&&e++;break}}b.forEachChild(n,r)}return r(t),e}function ac(t){let e=0;function r(n,s,o){if(b.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.isIfStatement(n.elseStatement)?r(n.elseStatement,s,!0):(e+=1,r(n.elseStatement,s+1,!1)));return}if(b.isForStatement(n)||b.isForInStatement(n)||b.isForOfStatement(n)||b.isWhileStatement(n)||b.isDoStatement(n)||b.isSwitchStatement(n)){e+=1+s,b.forEachChild(n,a=>r(a,s+1,!1));return}if(b.isCatchClause(n)){e+=1+s,b.forEachChild(n,a=>r(a,s,!1));return}if(b.isConditionalExpression(n)&&(e+=1),b.isBinaryExpression(n)){let a=n.operatorToken.kind;(a===b.SyntaxKind.AmpersandAmpersandToken||a===b.SyntaxKind.BarBarToken||a===b.SyntaxKind.QuestionQuestionToken)&&(e+=1)}if(s>0&&(b.isFunctionDeclaration(n)||b.isFunctionExpression(n)||b.isArrowFunction(n))){e+=1+s,b.forEachChild(n,a=>r(a,s+1,!1));return}b.forEachChild(n,a=>r(a,s,!1))}return r(t,0,!1),e}function nr(t){return{complexity:ic(t),cognitiveComplexity:ac(t)}}import w from"typescript";var sr=new Set(["test","describe","it"]);function Wn(t,e){cc(t,e),pc(t,e),uc(t,e),fc(t,e)}function cc(t,e){if((w.isFunctionDeclaration(t)||w.isVariableDeclaration(t))&&t.name&&w.isIdentifier(t.name)&&lc(t)){let r;if(w.isFunctionDeclaration(t))r="function";else{let n=t.initializer;r=n&&(w.isArrowFunction(n)||w.isFunctionExpression(n))?"function":"variable"}e.tags.add({name:t.name.text,kind:r})}}function lc(t){if(w.isFunctionDeclaration(t))return w.isSourceFile(t.parent);let e=t.parent?.parent;return!!e&&w.isSourceFile(e.parent)}function pc(t,e){if(!w.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 uc(t,e){if(!w.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 fc(t,e){if(w.isCallExpression(t)&&mc(t.expression))for(let r of t.arguments)w.isObjectLiteralExpression(r)&&gc(r,e)}function mc(t){return w.isIdentifier(t)?sr.has(t.text):!!(w.isPropertyAccessExpression(t)&&(sr.has(t.name.text)||w.isIdentifier(t.expression)&&sr.has(t.expression.text)))}function gc(t,e){for(let r of t.properties){if(!w.isPropertyAssignment(r)||!w.isIdentifier(r.name)||r.name.text!=="tags"&&r.name.text!=="tag")continue;let{initializer:n}=r,s=w.isArrayLiteralExpression(n)?n.elements.filter(w.isStringLiteral):r.name.text==="tag"&&w.isStringLiteral(n)?[n]:[];for(let o of s)e.tags.add({name:o.text.replace(/^@/,""),kind:"comment-marker"})}}function or(t,e,r){let n=[],s=new Map,o=new Set,i=g.createSourceFile(t,e,g.ScriptTarget.Latest,!0,r==="typescript"?g.ScriptKind.TSX:g.ScriptKind.JSX),a={filePath:t,imports:n,exports:s,tags:o,rawCallEdges:[],sourceFile:i,hasUI:!1,hasTypesOnly:!0,totalStatements:0,exportStatements:0},c=x=>{xc(x,a),g.forEachChild(x,c)};c(i);let l=Pc(t,a);(l==="test"||l==="barrel")&&o.add({name:l,kind:"comment-marker"}),l!=="test"&&Nc(a,i);let p=i.statements[0],u=p?Un(p):void 0,{complexity:d,cognitiveComplexity:h}=nr(i),k=dc(i);return{imports:n,exports:Array.from(s.values()),tags:Array.from(o),category:l,rawCallEdges:a.rawCallEdges??[],complexity:d,cognitiveComplexity:h,...k.length>0?{functions:k}:{},...u!==void 0?{description:u}:{}}}function dc(t){let e=[],r=(s,o)=>{let{complexity:i,cognitiveComplexity:a}=nr(o),c=t.getLineAndCharacterOfPosition(o.getStart(t)).line+1;e.push({name:s,line:c,complexity:i,cognitiveComplexity:a})},n=(s,o)=>{if(g.isFunctionDeclaration(s)&&s.name&&s.body?r(s.name.text,s):g.isVariableDeclaration(s)&&g.isIdentifier(s.name)&&s.initializer&&(g.isArrowFunction(s.initializer)||g.isFunctionExpression(s.initializer))?r(s.name.text,s.initializer):o&&g.isMethodDeclaration(s)&&g.isIdentifier(s.name)&&s.body?r(`${o}.${s.name.text}`,s):o&&g.isConstructorDeclaration(s)&&s.body?r(`${o}.constructor`,s):o&&g.isGetAccessorDeclaration(s)&&g.isIdentifier(s.name)&&s.body?r(`${o}.get ${s.name.text}`,s):o&&g.isSetAccessorDeclaration(s)&&g.isIdentifier(s.name)&&s.body&&r(`${o}.set ${s.name.text}`,s),g.isClassDeclaration(s)&&s.name){let i=s.name.text;g.forEachChild(s,a=>n(a,i));return}g.forEachChild(s,i=>n(i,o))};return n(t,void 0),e}function Bn(t,e,r,n){let s={name:t},o=Un(r);o!==void 0&&(s.doc=o);let i=hc(e);i!==void 0&&(s.flags=i);let a=yc(e,n);return a!==void 0&&(s.signature=a),s}function Un(t){let e=g.getJSDocCommentsAndTags(t);for(let r of e)if(g.isJSDoc(r)&&r.comment)return g.getTextOfJSDocComment(r.comment)||void 0}function hc(t){let e=new Set(["deprecated","internal","public","alpha","beta"]),r=g.getJSDocTags(t).map(n=>n.tagName.text).filter(n=>e.has(n));return r.length>0?r:void 0}function yc(t,e){let r=g.createPrinter({removeComments:!0}),n=s=>r.printNode(g.EmitHint.Unspecified,s,e);if(g.isFunctionDeclaration(t)||g.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(g.isVariableDeclaration(t)){if(t.type)return n(t.type);if(t.initializer&&(g.isArrowFunction(t.initializer)||g.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(g.isClassDeclaration(t)&&t.name)return`class ${t.name.text}`;if(g.isInterfaceDeclaration(t))return`interface ${t.name.text}`;if(g.isTypeAliasDeclaration(t))return n(t.type);if(g.isEnumDeclaration(t))return`enum ${t.name.text}`}function xc(t,e){bc(t,e),Sc(t,e),vc(t,e),Cc(t,e),Ac(t,e),Wn(t,e)}function bc(t,e){if(!g.isSourceFile(t))return;let r=t.statements.filter(n=>!g.isEmptyStatement(n));e.totalStatements=r.length,e.exportStatements=r.filter(n=>g.isExportDeclaration(n)||g.isExportAssignment(n)||ir(n)).length}function Sc(t,e){if(g.isJsxElement(t)||g.isJsxSelfClosingElement(t)||g.isJsxFragment(t)){e.hasUI=!0,e.hasTypesOnly=!1;return}if(g.isFunctionDeclaration(t)||g.isMethodDeclaration(t)||g.isArrowFunction(t)||g.isClassDeclaration(t)||g.isVariableStatement(t)||g.isEnumDeclaration(t)){e.hasTypesOnly=!1;return}g.isExportDeclaration(t)&&!kc(t)&&(e.hasTypesOnly=!1)}function kc(t){return t.isTypeOnly?!0:!t.exportClause||!g.isNamedExports(t.exportClause)?!1:t.exportClause.elements.every(e=>e.isTypeOnly)}function vc(t,e){if(!g.isImportDeclaration(t)||!t.moduleSpecifier||!g.isStringLiteral(t.moduleSpecifier))return;let r=[];if(t.importClause&&(t.importClause.name&&r.push("default"),t.importClause.namedBindings))if(g.isNamedImports(t.importClause.namedBindings))for(let s of t.importClause.namedBindings.elements)r.push(s.name.text);else g.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 Cc(t,e){g.isExportDeclaration(t)?wc(t,e):g.isExportAssignment(t)?e.exports.set("default",{name:"default"}):ir(t)&&Ec(t,e)}function wc(t,e){if(t.moduleSpecifier&&g.isStringLiteral(t.moduleSpecifier))Fc(t,t.moduleSpecifier.text,e);else if(t.exportClause&&g.isNamedExports(t.exportClause))for(let r of t.exportClause.elements){let n=r.name.text;e.exports.set(n,{name:n})}}function Fc(t,e,r){let n=Tc(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 Tc(t){return t.exportClause?g.isNamedExports(t.exportClause)?t.exportClause.elements.map(e=>e.name.text):[]:["*"]}function Ec(t,e){if((g.isFunctionDeclaration(t)||g.isClassDeclaration(t)||g.isInterfaceDeclaration(t)||g.isTypeAliasDeclaration(t)||g.isEnumDeclaration(t))&&t.name){let n=t.name.text;e.exports.set(n,Bn(n,t,t,e.sourceFile));return}if(g.isVariableStatement(t)){for(let n of t.declarationList.declarations)if(g.isIdentifier(n.name)){let s=n.name.text;e.exports.set(s,Bn(s,n,t,e.sourceFile))}}}function Ac(t,e){if(!g.isCallExpression(t))return;let r=t.arguments[0];!r||!g.isStringLiteral(r)||(t.expression.kind===g.SyntaxKind.ImportKeyword?e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:P(r.text),type:"dynamic"}):g.isIdentifier(t.expression)&&t.expression.text==="require"&&e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:P(r.text),type:"require"}))}function Pc(t,e){let r=$n.basename(t).toLowerCase(),n=$n.extname(t).toLowerCase();return re().some(o=>r.includes(o))?"test":yr(r)?"config":e.imports.some(o=>st().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>it()?"barrel":"logic"}function ir(t){return g.canHaveModifiers(t)&&g.getModifiers(t)?.some(e=>e.kind===g.SyntaxKind.ExportKeyword)===!0}function Nc(t,e){let r=t.rawCallEdges??[];t.rawCallEdges=r;let n=new Map;for(let s of e.statements){if(!g.isImportDeclaration(s)||!g.isStringLiteral(s.moduleSpecifier))continue;let o=s.moduleSpecifier.text,i=s.importClause;if(i&&(i.name&&n.set(i.name.text,o),i.namedBindings&&g.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=Dc(s);if(o){let i=Mc(s);i&&Ze(i,o,n,r);continue}g.isClassDeclaration(s)&&s.name&&Ic(s,s.name.text,n,r)}}function Ic(t,e,r,n){for(let s of t.members)g.isMethodDeclaration(s)&&s.body&&g.isIdentifier(s.name)?Ze(s.body,`${e}.${s.name.text}`,r,n):g.isConstructorDeclaration(s)&&s.body&&Ze(s.body,`${e}.constructor`,r,n)}function Dc(t){if(ir(t)){if(g.isFunctionDeclaration(t)&&t.name)return t.name.text;if(g.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(g.isIdentifier(e.name)&&e.initializer&&(g.isArrowFunction(e.initializer)||g.isFunctionExpression(e.initializer)))return e.name.text}}}function Mc(t){if(g.isFunctionDeclaration(t))return t.body;if(g.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(e.initializer&&(g.isArrowFunction(e.initializer)||g.isFunctionExpression(e.initializer)))return e.initializer}}function Ze(t,e,r,n){if(g.isCallExpression(t)&&g.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})}g.forEachChild(t,s=>Ze(s,e,r,n))}function et(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 Kn(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 Jn(t,e){if(e.length===0)return"ui";try{let r=nt("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 ye(t,e){let r=G(t);if(r==="stylus"){let o=Kn(e,t);return{imports:o,exports:[],tags:[],category:Jn(e,o)}}if(r==="scss"){let{imports:o,root:i,exports:a,tags:c}=Me(e,t);return{imports:o,exports:a,tags:c,category:et(i,o)}}if(r==="less"){let{imports:o,root:i,exports:a,tags:c}=De(e,t);return{imports:o,exports:a,tags:c,category:et(i,o)}}let{imports:n,root:s}=Ie(e,t);return{imports:n,exports:[],tags:[],category:et(s,n)}}for(let[t,e]of[["javascript",(r,n)=>or(r,n,"javascript")],["typescript",(r,n)=>or(r,n,"typescript")],["css",ye],["scss",ye],["less",ye],["stylus",ye],["coffeescript",Nn],["livescript",Rn],["lua",Ln],["python",zn],["go",Mn],["gherkin",Zt],["markdown",On]])Y(t,e);async function Hn(t,e){let r=G(t),n=fn(r);return n?n(t,e):{imports:[],exports:[],tags:[],category:"other"}}import Vn from"path";function Rc(t,e){let r=e.get(t.path);r!==void 0&&(t.coveragePct=r)}function qn(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 Lc(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 Gc(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 Qn(t){return Math.round(t*1e4)/1e4}function _c(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=Qn(Math.min(1,o)),r.push(n.exportUsageRatio)}r.length>0&&(t.avgExportUsage=Qn(r.reduce((n,s)=>n+s,0)/r.length),t.maxExportUsage=Math.max(...r))}function ar(t,e,r){e&&(t.some(n=>n.name===e&&n.kind===r)||t.push({name:e,kind:r}))}function Oc(t,e){let r=e.toPath,n=Vn.basename(r,Vn.extname(r)).replace(/\.(test|spec)$/,"");ar(t.tags,n,"import")}function jc(t,e){if(!(!e.symbols||e.symbols.includes("*")))for(let r of e.symbols)ar(t.tags,r,"import")}function zc(t,e,r){let n=r.get(e.toPath);if(!(!n||n.category==="test"))for(let s of n.tags)s.kind==="comment-marker"&&ar(t.tags,s.name,"comment-marker")}function Wc(t,e,r){!e.toPath||e.isExternal||(Oc(t,e),jc(t,e),zc(t,e,r))}function Yn(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(_c(r,t),e.size>0&&Rc(r,e),r.category==="test")for(let n of r.imports)Lc(r,n,t),Wc(r,n,t);Gc(r,t)}}import tt from"fs";import R from"path";import es from"fs";import ee from"path";var xe=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 Zn(a);if(r!==o&&!r.startsWith(`${o}/`))return null;let c=r.slice(o.length).replace(/^\//,"");return c?Zn(ee.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=es.readFileSync(ee.join(e,"go.mod"),"utf-8"),o=$c(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 ee.join(o,i)}}}};function $c(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 ca(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)}import Sn from"path";import kn from"typescript";var la=/\/\/ <mokosh-tags>[\s\S]*?\/\/ <\/mokosh-tags>\n*/,Qe=class{name="vitest";canHandle(e){return M.has(Sn.extname(e).toLowerCase())}apply(e,r,n){let s=r.replace(la,""),o=kn.createSourceFile(Sn.basename(e),s,kn.ScriptTarget.Latest,!0),i=Ot(o),[a]=i;if(!a)return s;let c=jt(a,"tags",o),l=[...n].sort();if(c!==null&&JSON.stringify([...c].sort())===JSON.stringify(l))return s;let p=i.flatMap(u=>{let d=n.length===0?zt(u,"tags",o):Wt(u,"tags",Bt(l),o);return d?[d]:[]});return p.length>0?$t(s,p):s}};var vn={vitest:()=>new Qe,playwright:()=>new Je,cypress:()=>new Be,jest:()=>new He},pa={"@playwright/test":"playwright",cypress:"cypress","@jest/globals":"jest",vitest:"vitest"};function ua(t){let e=qe.createSourceFile("detect.ts",t,qe.ScriptTarget.Latest,!0);for(let r of e.statements){if(!qe.isImportDeclaration(r)||!qe.isStringLiteral(r.moduleSpecifier))continue;let n=pa[r.moduleSpecifier.text];if(n)return n}return null}var qt=class{constructor(e,r,n){this.rootDir=e;this.defaultFramework=r;this.frameworkOverrides=n}rootDir;defaultFramework;frameworkOverrides;name="auto";canHandle(e){return M.has(Qt.extname(e).toLowerCase())}apply(e,r,n){let s=ua(r)??this.matchOverride(e)??this.defaultFramework;return(vn[s]??vn.vitest)().apply(e,r,n)}matchOverride(e){let r=Qt.relative(this.rootDir,e).split(Qt.sep).join("/");for(let[n,s]of this.frameworkOverrides)if(bn(n,r))return s;return null}};function Cn(t="vitest",e={},r=process.cwd()){return[new Ue,new Ve,new Ke,new qt(r,t,Object.entries(e))]}function wn(t,e){return e.find(r=>r.canHandle(t))??null}var ma=/^[a-zA-Z][a-zA-Z0-9_-]{1,}$/,ga=new Set(["import"]),da=new Set(["common","fixture","fixtures","helper","helpers","index","main","mock","mocks","setup","shared","spec","test","tests","types","util","utils"]);async function ha(t,e,r,n){let s;try{s=await Fn.readFile(t,"utf8")}catch(a){return{path:t,status:"error",error:String(a)}}let o=wn(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 Fn.writeFile(t,i,"utf8"),{path:t,status:"updated"})}async function Yt(t,e,r){let n=ne(e),s=n.tagApplier?.framework??"vitest",o=n.tagApplier?.frameworkOverrides??{},i=Cn(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)ga.has(h.kind)&&ma.test(h.name)&&(da.has(h.name.toLowerCase())||l.has(h.name)||(l.add(h.name),p.push(h.name)));p.sort();let u=fa.resolve(e,c.path),d=await ha(u,p,r.dryRun,i);d.path=c.path,a.files.push(d),d.status==="updated"?a.updated++:d.status==="unchanged"?a.unchanged++:a.errors++}return a}var Ye=class{isTestNode(e){return e.category==="test"||e.tags.some(r=>r.name==="test")}};import Ce from"fs";import E from"path";import qc from"piscina";import{execFileSync as Xt}from"child_process";var Xe=class{getChangedFiles(){try{let r=[["diff","--name-only"],["diff","--cached","--name-only"],["ls-files","--others","--exclude-standard"]].flatMap(n=>{try{return Xt("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),[]}}},Tn="%x00%H%x09%ae%x09%at",En=256*1024*1024;function An(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 Pn(t){let e=new Map;try{let r=Xt("git",["-C",t,"log","--since=90 days ago","--name-status","-M",`--format=${Tn}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:En});An(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=Xt("git",["-C",t,"log","--name-status","-M",`--format=${Tn}`],{encoding:"utf-8",stdio:["ignore","pipe","ignore"],maxBuffer:En});An(r,(n,s,o)=>{e.has(n)||e.set(n,{commitCount90d:0,lastAuthor:void 0,lastCommitAt:o||void 0})})}catch{}return e}import Nn from"path";function G(t){switch(Nn.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=Nn.extname(t).toLowerCase();return[".css",".scss",".sass",".less",".styl"].includes(e)}import ya from"coffeescript";function _(t){return t.startsWith("'")||t.startsWith('"')?t.slice(1,-1):t}function X(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 Z(t,e){let r=t.toLowerCase();return r.includes(".test.")||r.includes(".spec.")||e.has("test")?"test":"logic"}function Dn(t){if(t){if(typeof t.originalValue=="string")return t.originalValue;if(typeof t.value=="string")return _(t.value)}}function B(t){if(t){if(typeof t.value=="string")return t.value;if(typeof t.base?.value=="string")return t.base.value}}function xa(t,e){let r=Dn(e.source);return r?{fromPath:t,toPath:"",rawSpecifier:r,isStyle:P(r),type:"static"}:null}function ba(t,e){let r=e.variable?.base?.value==="require",n=Dn(e.args?.[0]?.base);return!r||!n?null:{fromPath:t,toPath:"",rawSpecifier:n,isStyle:P(n),type:"require"}}function In(t,e){if(e)return[{name:e}];let r=t.value;if(r?.constructor?.name==="Class"){let s=B(r.variable);return s?[{name:s}]:[]}if(r?.base?.constructor?.name==="Obj"&&Array.isArray(r.base.properties))return r.base.properties.map(s=>B(s.variable)??B(s)).filter(s=>!!s).map(s=>({name:s}));let n=B(r);return n?[{name:n}]:[]}function Sa(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=B(t.variable)??B(t.variable?.base);return e?[{name:e}]:[]}function ka(t,e,r,n){let s=e.constructor?.name;if(s==="ImportDeclaration"){let o=xa(t,e);o&&r.push(o)}else if(s==="Call"){let o=ba(t,e);o&&r.push(o)}else if(s==="Assign"){let o=B(e.variable?.base),i=e.variable?.properties?.[0]?.name?.value;o==="module"&&i==="exports"?n.push(...In(e,void 0)):o==="exports"&&typeof i=="string"&&n.push(...In(e,i))}else s==="ExportNamedDeclaration"&&e.clause?n.push(...Sa(e.clause)):s==="ExportDefaultDeclaration"&&n.push({name:"default"})}function Zt(t,e,r,n){if(!(!e||typeof e!="object")){ka(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)Zt(t,i,r,n);else Zt(t,o,r,n)}}}function Mn(t,e){let r=X(e),n=Z(t,r),s=[],o=[];try{Zt(t,ya.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}}import{AstBuilder as va,GherkinClassicTokenMatcher as Ca,Parser as wa}from"@cucumber/gherkin";import{IdGenerator as Fa}from"@cucumber/messages";var Ta=Fa.uuid();function er(t,e){let r=new Set;try{let n=new va(Ta),s=new Ca,i=new wa(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"}}Y("gherkin",er);import Pa from"path";import{parser as Na}from"@lezer/go";function U(t){let e=[],r=t.firstChild;for(;r;)e.push(r),r=r.nextSibling;return e}function de(t,e){let r=1;for(let n=0;n<e&&n<t.length;n++)t[n]===`
|
|
30
|
+
`&&r++;return r}function Ea(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 Aa(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=U(s),u=i?o:o+1,d=p[1];d&&d.type.name!=="Block"&&n(d,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 Ze(t,e){return{complexity:Ea(t,e),cognitiveComplexity:Aa(t,e)}}function tr(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 Rn(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}=Ze(n.node,e);r.push({name:o,line:de(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=tr(n.node,e),a=i?`${i}.${o}`:o,{complexity:c,cognitiveComplexity:l}=Ze(n.node,e);r.push({name:a,line:de(e,n.from),complexity:c,cognitiveComplexity:l})}}while(n.next());return r}var Ia=/\/\/\s*@tag\s+([a-zA-Z0-9_-]+)/,Da=/^\/\/go:build\s+(.+)$/,Ma=/^\/\/\s*\+build\s+(.+)$/;function Gn(t,e){let r=[],n=new Map,s=new Set,o=new Set,i=new Map,a=Na.parse(e),c=a.cursor();do switch(c.name){case"LineComment":{let y=e.slice(c.from,c.to),C=y.match(Ia);C?.[1]&&s.add(C[1]);let D=y.match(Da);D&&Ln(D[1],o);let N=y.match(Ma);N&&Ln(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=Pa.basename(t).endsWith("_test.go")||s.has("test")||l?"test":"logic",u=new Set([...s,...o]),{complexity:d,cognitiveComplexity:h}=Ze(a.topNode,e),k=Rn(a,e),x=p==="test"?[]:Ra(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:d,cognitiveComplexity:h,...k.length>0?{functions:k}:{}}}function Ra(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 d=e.slice(p.from,p.to),h=r.get(d);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=tr(o.node,e);s(a,l?`${l}.${c}`:c)}}while(o.next());return n}function Ln(t,e){for(let r of t.split(/[\s,&|!()]+/)){let n=r.trim();n&&n!=="ignore"&&e.add(n)}}import La from"livescript";function K(t){if(t){if(typeof t.value=="string")return t.value;if(typeof t.base?.value=="string")return t.base.value}}function Ga(t){if(!t)return[];if(t.constructor?.name==="Class"){let r=K(t.title);return r?[{name:r}]:[]}if(t.constructor?.name==="Obj"&&Array.isArray(t.items))return t.items.map(r=>K(r.key)??K(r.val)).filter(r=>!!r).map(r=>({name:r}));let e=K(t);return e?[{name:e}]:[]}function _a(t){let e=t.constructor?.name||t.type;if(e==="Assign"&&t.left?.constructor?.name==="Chain"){let r=t.left,n=K(r.head),o=r.tails?.[0]?.key?.name;if(n==="module"&&o==="exports")return Ga(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=>K(n.val)??K(n.key)).filter(n=>!!n).map(n=>({name:n}))}return[]}var Oa=new Set(["first_line","first_column","last_line","last_column","line","column"]);function ja(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 rr(t,e,r){if(!t||typeof t!="object")return[];let n=[],s=ja(t,e);s&&n.push(s),r.push(..._a(t));for(let o in t){if(Oa.has(o))continue;let i=t[o];if(!(!i||typeof i!="object"))if(Array.isArray(i))for(let a of i)n.push(...rr(a,e,r));else n.push(...rr(i,e,r))}return n}function _n(t,e){let r=X(e),n=Z(t,r),s=[],o=[];try{s=rr(La.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}}import Wa from"luaparse";function za(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 $a(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 Ba(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 Ua(t){let e=t.body,r=$a(e),n=Ba(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 On(t,e){let r=X(e),n=Z(t,r),s=[],o=[];try{let i=Wa.parse(e);s=za(i,t),o=Ua(i)}catch{}return{imports:s,exports:o,tags:Array.from(r).map(i=>({name:i,kind:"comment-marker"})),category:n}}var Ka=["http://","https://","mailto:","//"],Ha="ts|tsx|js|jsx|mjs|cjs|py|go|lua|css|scss|less|styl|coffee|ls|feature|md|mdx|json",Ja=new RegExp(`(?:\\.{1,2}/)?[\\w.-]+(?:/[\\w.-]+)*\\.(?:${Ha})\\b`,"g"),jn;async function Va(){return jn??=(async()=>{let{unified:t}=await import("unified"),e=(await import("remark-parse")).default;return t().use(e)})(),jn}function Qa(t){let e=t.trim();return e.length===0||e.startsWith("#")||Ka.some(r=>e.startsWith(r))}function qa(t,e){let r=t.match(Ja);return r?r.map(n=>({fromPath:e,toPath:"",rawSpecifier:n,isStyle:!1,type:"static"})):[]}function Wn(t,e,r){if(t.type==="link"&&typeof t.url=="string"&&!Qa(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(...qa(t.value,e)),Array.isArray(t.children))for(let n of t.children)Wn(n,e,r)}async function zn(t,e){let n=(await Va()).parse(e),s=[];Wn(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"}}import Za from"path";import{parser as ec}from"@lezer/python";function Ya(t){let e=1;function r(n){switch(n.type.name){case"IfStatement":{e+=U(n).filter(o=>o.type.name==="if"||o.type.name==="elif").length;break}case"TryStatement":{e+=U(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 Xa(t){let e=0;function r(n,s){let o=n.type.name;if(o==="IfStatement"){let c=U(n),l=0,p=0;for(;p<c.length;){let u=c[p];if(u?.type.name==="if"||u?.type.name==="elif"){let d=l>0;e+=d?1:1+s;let h=d?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 d=c[p+1];d&&r(d,s+1),p+=2}else p++}return}if(o==="TryStatement"){let c=U(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 nr(t){return{complexity:Ya(t),cognitiveComplexity:Xa(t)}}function $n(t,e){let r=[];function n(i,a){let{complexity:c,cognitiveComplexity:l}=nr(i);r.push({name:a,line:de(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"),d=u?e.slice(u.from,u.to):void 0;d&&n(p,c?`${c}.${d}`:d),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 tc=new Set(["pytest","unittest","nose","hypothesis"]);function Bn(t,e){let r=[],n=[],s=new Set,o=Za.basename(t).toLowerCase(),i=ec.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 rc(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}=nr(i.topNode),u=$n(i,e),d=c==="test"?[]:ac(i,e);return{imports:r,exports:n,tags:Array.from(s).map(h=>({name:h,kind:"comment-marker"})),category:c,rawCallEdges:d,complexity:l,cognitiveComplexity:p,...u.length>0?{functions:u}:{}}}function rc(t,e,r){let n=t.firstChild;return n?n.name==="from"?nc(t,e,r):sc(t,e,r):[]}function nc(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=oc(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[he(r,o,i,!0)];let l=a===1?"./":"../".repeat(a-1);return c?[he(r,l+c.replace(/\./g,"/"),i,!1)]:i[0]==="*"?[he(r,l.slice(0,-1),["*"],!1)]:i.map(p=>he(r,l+p,[p],!1))}function sc(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(he(r,o,["*"],!0))}s=s.nextSibling}return n}function oc(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 ic(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 d=e.slice(u.from,u.to),h=d;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+d;r.set(h,k)}u=u.nextSibling}}while(n.next());return r}function ac(t,e){let r=ic(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),d=r.get(u);d&&n.push({from:c,to:u,toSpecifier:d})}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 d=u.getChild("VariableName"),h=d?e.slice(d.from,d.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 he(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=>tc.has(n.rawSpecifier))?"test":"logic"}import Kn from"path";import g from"typescript";import b from"typescript";function lc(t){let e=1;function r(n){switch(n.kind){case b.SyntaxKind.IfStatement:case b.SyntaxKind.ConditionalExpression:case b.SyntaxKind.ForStatement:case b.SyntaxKind.ForInStatement:case b.SyntaxKind.ForOfStatement:case b.SyntaxKind.WhileStatement:case b.SyntaxKind.DoStatement:case b.SyntaxKind.CatchClause:case b.SyntaxKind.CaseClause:e++;break;case b.SyntaxKind.BinaryExpression:{let s=n.operatorToken.kind;(s===b.SyntaxKind.AmpersandAmpersandToken||s===b.SyntaxKind.BarBarToken||s===b.SyntaxKind.QuestionQuestionToken)&&e++;break}}b.forEachChild(n,r)}return r(t),e}function pc(t){let e=0;function r(n,s,o){if(b.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.isIfStatement(n.elseStatement)?r(n.elseStatement,s,!0):(e+=1,r(n.elseStatement,s+1,!1)));return}if(b.isForStatement(n)||b.isForInStatement(n)||b.isForOfStatement(n)||b.isWhileStatement(n)||b.isDoStatement(n)||b.isSwitchStatement(n)){e+=1+s,b.forEachChild(n,a=>r(a,s+1,!1));return}if(b.isCatchClause(n)){e+=1+s,b.forEachChild(n,a=>r(a,s,!1));return}if(b.isConditionalExpression(n)&&(e+=1),b.isBinaryExpression(n)){let a=n.operatorToken.kind;(a===b.SyntaxKind.AmpersandAmpersandToken||a===b.SyntaxKind.BarBarToken||a===b.SyntaxKind.QuestionQuestionToken)&&(e+=1)}if(s>0&&(b.isFunctionDeclaration(n)||b.isFunctionExpression(n)||b.isArrowFunction(n))){e+=1+s,b.forEachChild(n,a=>r(a,s+1,!1));return}b.forEachChild(n,a=>r(a,s,!1))}return r(t,0,!1),e}function sr(t){return{complexity:lc(t),cognitiveComplexity:pc(t)}}import w from"typescript";var or=new Set(["test","describe","it"]);function Un(t,e){uc(t,e),mc(t,e),gc(t,e),dc(t,e)}function uc(t,e){if((w.isFunctionDeclaration(t)||w.isVariableDeclaration(t))&&t.name&&w.isIdentifier(t.name)&&fc(t)){let r;if(w.isFunctionDeclaration(t))r="function";else{let n=t.initializer;r=n&&(w.isArrowFunction(n)||w.isFunctionExpression(n))?"function":"variable"}e.tags.add({name:t.name.text,kind:r})}}function fc(t){if(w.isFunctionDeclaration(t))return w.isSourceFile(t.parent);let e=t.parent?.parent;return!!e&&w.isSourceFile(e.parent)}function mc(t,e){if(!w.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 gc(t,e){if(!w.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 dc(t,e){if(w.isCallExpression(t)&&hc(t.expression))for(let r of t.arguments)w.isObjectLiteralExpression(r)&&yc(r,e)}function hc(t){return w.isIdentifier(t)?or.has(t.text):!!(w.isPropertyAccessExpression(t)&&(or.has(t.name.text)||w.isIdentifier(t.expression)&&or.has(t.expression.text)))}function yc(t,e){for(let r of t.properties){if(!w.isPropertyAssignment(r)||!w.isIdentifier(r.name)||r.name.text!=="tags"&&r.name.text!=="tag")continue;let{initializer:n}=r,s=w.isArrayLiteralExpression(n)?n.elements.filter(w.isStringLiteral):r.name.text==="tag"&&w.isStringLiteral(n)?[n]:[];for(let o of s)e.tags.add({name:o.text.replace(/^@/,""),kind:"comment-marker"})}}function ir(t,e,r){let n=[],s=new Map,o=new Set,i=g.createSourceFile(t,e,g.ScriptTarget.Latest,!0,r==="typescript"?g.ScriptKind.TSX:g.ScriptKind.JSX),a={filePath:t,imports:n,exports:s,tags:o,rawCallEdges:[],sourceFile:i,hasUI:!1,hasTypesOnly:!0,totalStatements:0,exportStatements:0},c=x=>{kc(x,a),g.forEachChild(x,c)};c(i);let l=Dc(t,a);(l==="test"||l==="barrel")&&o.add({name:l,kind:"comment-marker"}),l!=="test"&&Mc(a,i);let p=i.statements[0],u=p?Jn(p):void 0,{complexity:d,cognitiveComplexity:h}=sr(i),k=xc(i);return{imports:n,exports:Array.from(s.values()),tags:Array.from(o),category:l,rawCallEdges:a.rawCallEdges??[],complexity:d,cognitiveComplexity:h,...k.length>0?{functions:k}:{},...u!==void 0?{description:u}:{}}}function xc(t){let e=[],r=(s,o)=>{let{complexity:i,cognitiveComplexity:a}=sr(o),c=t.getLineAndCharacterOfPosition(o.getStart(t)).line+1;e.push({name:s,line:c,complexity:i,cognitiveComplexity:a})},n=(s,o)=>{if(g.isFunctionDeclaration(s)&&s.name&&s.body?r(s.name.text,s):g.isVariableDeclaration(s)&&g.isIdentifier(s.name)&&s.initializer&&(g.isArrowFunction(s.initializer)||g.isFunctionExpression(s.initializer))?r(s.name.text,s.initializer):o&&g.isMethodDeclaration(s)&&g.isIdentifier(s.name)&&s.body?r(`${o}.${s.name.text}`,s):o&&g.isConstructorDeclaration(s)&&s.body?r(`${o}.constructor`,s):o&&g.isGetAccessorDeclaration(s)&&g.isIdentifier(s.name)&&s.body?r(`${o}.get ${s.name.text}`,s):o&&g.isSetAccessorDeclaration(s)&&g.isIdentifier(s.name)&&s.body&&r(`${o}.set ${s.name.text}`,s),g.isClassDeclaration(s)&&s.name){let i=s.name.text;g.forEachChild(s,a=>n(a,i));return}g.forEachChild(s,i=>n(i,o))};return n(t,void 0),e}function Hn(t,e,r,n){let s={name:t},o=Jn(r);o!==void 0&&(s.doc=o);let i=bc(e);i!==void 0&&(s.flags=i);let a=Sc(e,n);return a!==void 0&&(s.signature=a),s}function Jn(t){let e=g.getJSDocCommentsAndTags(t);for(let r of e)if(g.isJSDoc(r)&&r.comment)return g.getTextOfJSDocComment(r.comment)||void 0}function bc(t){let e=new Set(["deprecated","internal","public","alpha","beta"]),r=g.getJSDocTags(t).map(n=>n.tagName.text).filter(n=>e.has(n));return r.length>0?r:void 0}function Sc(t,e){let r=g.createPrinter({removeComments:!0}),n=s=>r.printNode(g.EmitHint.Unspecified,s,e);if(g.isFunctionDeclaration(t)||g.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(g.isVariableDeclaration(t)){if(t.type)return n(t.type);if(t.initializer&&(g.isArrowFunction(t.initializer)||g.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(g.isClassDeclaration(t)&&t.name)return`class ${t.name.text}`;if(g.isInterfaceDeclaration(t))return`interface ${t.name.text}`;if(g.isTypeAliasDeclaration(t))return n(t.type);if(g.isEnumDeclaration(t))return`enum ${t.name.text}`}function kc(t,e){vc(t,e),Cc(t,e),Fc(t,e),Tc(t,e),Ic(t,e),Un(t,e)}function vc(t,e){if(!g.isSourceFile(t))return;let r=t.statements.filter(n=>!g.isEmptyStatement(n));e.totalStatements=r.length,e.exportStatements=r.filter(n=>g.isExportDeclaration(n)||g.isExportAssignment(n)||ar(n)).length}function Cc(t,e){if(g.isJsxElement(t)||g.isJsxSelfClosingElement(t)||g.isJsxFragment(t)){e.hasUI=!0,e.hasTypesOnly=!1;return}if(g.isFunctionDeclaration(t)||g.isMethodDeclaration(t)||g.isArrowFunction(t)||g.isClassDeclaration(t)||g.isVariableStatement(t)||g.isEnumDeclaration(t)){e.hasTypesOnly=!1;return}g.isExportDeclaration(t)&&!wc(t)&&(e.hasTypesOnly=!1)}function wc(t){return t.isTypeOnly?!0:!t.exportClause||!g.isNamedExports(t.exportClause)?!1:t.exportClause.elements.every(e=>e.isTypeOnly)}function Fc(t,e){if(!g.isImportDeclaration(t)||!t.moduleSpecifier||!g.isStringLiteral(t.moduleSpecifier))return;let r=[];if(t.importClause&&(t.importClause.name&&r.push("default"),t.importClause.namedBindings))if(g.isNamedImports(t.importClause.namedBindings))for(let s of t.importClause.namedBindings.elements)r.push(s.name.text);else g.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 Tc(t,e){g.isExportDeclaration(t)?Ec(t,e):g.isExportAssignment(t)?e.exports.set("default",{name:"default"}):ar(t)&&Nc(t,e)}function Ec(t,e){if(t.moduleSpecifier&&g.isStringLiteral(t.moduleSpecifier))Ac(t,t.moduleSpecifier.text,e);else if(t.exportClause&&g.isNamedExports(t.exportClause))for(let r of t.exportClause.elements){let n=r.name.text;e.exports.set(n,{name:n})}}function Ac(t,e,r){let n=Pc(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 Pc(t){return t.exportClause?g.isNamedExports(t.exportClause)?t.exportClause.elements.map(e=>e.name.text):[]:["*"]}function Nc(t,e){if((g.isFunctionDeclaration(t)||g.isClassDeclaration(t)||g.isInterfaceDeclaration(t)||g.isTypeAliasDeclaration(t)||g.isEnumDeclaration(t))&&t.name){let n=t.name.text;e.exports.set(n,Hn(n,t,t,e.sourceFile));return}if(g.isVariableStatement(t)){for(let n of t.declarationList.declarations)if(g.isIdentifier(n.name)){let s=n.name.text;e.exports.set(s,Hn(s,n,t,e.sourceFile))}}}function Ic(t,e){if(!g.isCallExpression(t))return;let r=t.arguments[0];!r||!g.isStringLiteral(r)||(t.expression.kind===g.SyntaxKind.ImportKeyword?e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:P(r.text),type:"dynamic"}):g.isIdentifier(t.expression)&&t.expression.text==="require"&&e.imports.push({fromPath:e.filePath,toPath:"",rawSpecifier:r.text,isStyle:P(r.text),type:"require"}))}function Dc(t,e){let r=Kn.basename(t).toLowerCase(),n=Kn.extname(t).toLowerCase();return re().some(o=>r.includes(o))?"test":Sr(r)?"config":e.imports.some(o=>ot().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>at()?"barrel":"logic"}function ar(t){return g.canHaveModifiers(t)&&g.getModifiers(t)?.some(e=>e.kind===g.SyntaxKind.ExportKeyword)===!0}function Mc(t,e){let r=t.rawCallEdges??[];t.rawCallEdges=r;let n=new Map;for(let s of e.statements){if(!g.isImportDeclaration(s)||!g.isStringLiteral(s.moduleSpecifier))continue;let o=s.moduleSpecifier.text,i=s.importClause;if(i&&(i.name&&n.set(i.name.text,o),i.namedBindings&&g.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=Lc(s);if(o){let i=Gc(s);i&&et(i,o,n,r);continue}g.isClassDeclaration(s)&&s.name&&Rc(s,s.name.text,n,r)}}function Rc(t,e,r,n){for(let s of t.members)g.isMethodDeclaration(s)&&s.body&&g.isIdentifier(s.name)?et(s.body,`${e}.${s.name.text}`,r,n):g.isConstructorDeclaration(s)&&s.body&&et(s.body,`${e}.constructor`,r,n)}function Lc(t){if(ar(t)){if(g.isFunctionDeclaration(t)&&t.name)return t.name.text;if(g.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(g.isIdentifier(e.name)&&e.initializer&&(g.isArrowFunction(e.initializer)||g.isFunctionExpression(e.initializer)))return e.name.text}}}function Gc(t){if(g.isFunctionDeclaration(t))return t.body;if(g.isVariableStatement(t)){for(let e of t.declarationList.declarations)if(e.initializer&&(g.isArrowFunction(e.initializer)||g.isFunctionExpression(e.initializer)))return e.initializer}}function et(t,e,r,n){if(g.isCallExpression(t)&&g.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})}g.forEachChild(t,s=>et(s,e,r,n))}function tt(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 Vn(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 Qn(t,e){if(e.length===0)return"ui";try{let r=st("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 ye(t,e){let r=G(t);if(r==="stylus"){let o=Vn(e,t);return{imports:o,exports:[],tags:[],category:Qn(e,o)}}if(r==="scss"){let{imports:o,root:i,exports:a,tags:c}=Re(e,t);return{imports:o,exports:a,tags:c,category:tt(i,o)}}if(r==="less"){let{imports:o,root:i,exports:a,tags:c}=Me(e,t);return{imports:o,exports:a,tags:c,category:tt(i,o)}}let{imports:n,root:s}=De(e,t);return{imports:n,exports:[],tags:[],category:tt(s,n)}}for(let[t,e]of[["javascript",(r,n)=>ir(r,n,"javascript")],["typescript",(r,n)=>ir(r,n,"typescript")],["css",ye],["scss",ye],["less",ye],["stylus",ye],["coffeescript",Mn],["livescript",_n],["lua",On],["python",Bn],["go",Gn],["gherkin",er],["markdown",zn]])Y(t,e);async function qn(t,e){let r=G(t),n=dn(r);return n?n(t,e):{imports:[],exports:[],tags:[],category:"other"}}import Yn from"path";function _c(t,e){let r=e.get(t.path);r!==void 0&&(t.coveragePct=r)}function Zn(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 Oc(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 jc(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 Xn(t){return Math.round(t*1e4)/1e4}function Wc(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=Xn(Math.min(1,o)),r.push(n.exportUsageRatio)}r.length>0&&(t.avgExportUsage=Xn(r.reduce((n,s)=>n+s,0)/r.length),t.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 zc(t,e){let r=e.toPath,n=Yn.basename(r,Yn.extname(r)).replace(/\.(test|spec)$/,"");cr(t.tags,n,"import")}function $c(t,e){if(!(!e.symbols||e.symbols.includes("*")))for(let r of e.symbols)cr(t.tags,r,"import")}function Bc(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 Uc(t,e,r){!e.toPath||e.isExternal||(zc(t,e),$c(t,e),Bc(t,e,r))}function es(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(Wc(r,t),e.size>0&&_c(r,e),r.category==="test")for(let n of r.imports)Oc(r,n,t),Uc(r,n,t);jc(r,t)}}import rt from"fs";import R from"path";import ns from"fs";import ee from"path";var xe=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(ee.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=ns.readFileSync(ee.join(e,"go.mod"),"utf-8"),o=Kc(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 ee.join(o,i)}}}};function Kc(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("=>")){ts(a,e,s);continue}!o&&/^replace\s+/.test(a)&&a.includes("=>")&&ts(a.replace(/^replace\s+/,""),e,s)}return{mod:n,replaces:s}}function ts(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=ee.isAbsolute(s)?s:ee.resolve(e,s);r.set(o,i)}function rs(t){let e;try{e=ns.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:ee.join(t,n.name),isExternal:!1})).sort((n,s)=>n.path.localeCompare(s.path));return r.length>0?r:null}import Hc from"fs";import lr from"path";var be=class{extensions=[".lua"];resolve(e,r,n,s){let o=r.replace(/\./g,lr.sep),i=[n,lr.join(n,"lib")];for(let a of i){if(!Hc.existsSync(a))continue;let c=s(lr.join(a,"_dummy.lua"),o);if(c)return[c]}return null}};import Jc from"path";var Se=class{extensions=[".md",".mdx"];resolve(e,r,n,s){let o=s(Jc.join(n,"_dummy"),`./${r}`);return o?[o]:null}};import Vc from"fs";import pr from"path";var ke=class{extensions=[".py"];resolve(e,r,n,s){let o=r.replace(/\./g,pr.sep),i=pr.join(n,`${o}.py`);if(ss(i))return[{path:i,isExternal:!1}];let a=pr.join(n,o,"__init__.py");return ss(a)?[{path:a,isExternal:!1}]:null}};function ss(t){try{return Vc.statSync(t,{throwIfNoEntry:!1})?.isFile()===!0}catch{return!1}}import os from"path";var Qc=["~","http://","https://","//","data:","sass:"],ve=class{extensions=[".css",".scss",".sass",".less",".styl"];resolve(e,r,n,s){if(Qc.some(p=>r.startsWith(p)))return null;let o=s(e,r);if(o)return[o];let i=os.dirname(r),a=os.basename(r),c=i==="."?`_${a}`:`${i}/_${a}`,l=s(e,c);return l?[l]:null}};var H=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 ke,new be,new xe,new ve,new Se]}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.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.dirname(e),s=r.startsWith("/")?r:R.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.join(e,`index${r}`);if(this.isFile(o))return{path:o,isExternal:n};if(r===".py"){let i=R.join(e,"__init__.py");if(this.isFile(i))return{path:i,isExternal:n}}return null}isFile(e){try{return rt.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.join(r,"tsconfig.json");if(rt.existsSync(n))try{let o=JSON.parse(rt.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.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.join(n,a);try{if(rt.statSync(c,{throwIfNoEntry:!1})?.isFile())return{...o,path:c}}catch{}}return{...o,path:n}}let i=this.resolveLocalPath(R.join(n,"_dummy"),s.slice(1));return i?{...o,path:i.path}:null}return null}};var Yc=["tests","test","__tests__","specs","spec"],is=new Set(["node_modules",".git","dist","build",".next",".cache","mokosh-cache","coverage"]),Xc=600;function Zc(t,e){if(t.length===0)return e;let r=t.map(i=>E.dirname(i).split(E.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.sep)||E.sep,o=E.relative(e,s);return o.startsWith("..")||E.isAbsolute(o)?e:s}var we=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 H(e),this.lockFile=Mr(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.isAbsolute(n)?n:E.resolve(this.rootDir,n));await this.initPool(),this.enableGitStats&&(this.gitStatsMap=Pn(this.rootDir));try{for(let n of r)this.enqueue(n);return await this.drain(),await this.processTestFiles(Zc(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
|
+
`),es(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??Xc;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.join(f,"parse-worker.js");this.pool=new qc({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=Ce.readdirSync(o,{withFileTypes:!0})}catch{continue}for(let a of i)if(a.isDirectory())
|
|
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=Ce.readdirSync(o,{withFileTypes:!0})}catch{continue}for(let a of i)if(a.isDirectory())is.has(a.name)||s.push(E.join(o,a.name));else if(a.isFile()&&(n++,n>=r))return!0}return n>=r}async processTestFiles(e){let r=re(),n=o=>r.some(i=>o.name.includes(i));this.walkProject(e,n);let s=e;for(;s!==this.rootDir;){let o=E.dirname(s);if(o===s)break;for(let i of Yc){let a=E.join(o,i);try{Ce.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=Ce.readdirSync(e,{withFileTypes:!0})}catch{return}for(let s of n){let o=E.join(e,s.name);s.isDirectory()?is.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=Ce.statSync(e,{throwIfNoEntry:!1});if(!r?.isFile())return;let n=E.relative(this.rootDir,e),s=await this.getNode(e,n,r);s.imports=await this.resolveImports(e,s.imports),Zn(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=Ce.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}):
|
|
36
|
-
`)}}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}};import te from"path";import el from"fs";import tl from"os";import fr from"path";function S(t){return{content:[{type:"text",text:JSON.stringify(t,null,2)}]}}function us(t){if(!fr.isAbsolute(t))throw new Error("root must be an absolute path");let e=fr.resolve(t),r=tl.homedir();if(e!==r&&!e.startsWith(r+fr.sep))throw new Error("root must be within the user home directory");let n;try{n=el.statSync(e)}catch{throw new Error("root does not exist")}if(!n.isDirectory())throw new Error("root is not a directory")}async function fs(t,e){let{root:r,entryPoints:n}=e;if(!t.isConfigured(r)){let d=ne(r,{allowJs:!1});ct(d),t.storeConfig(r,d)}if(n.length===0){let d=fe(r);if(d.type!=="none"){let h=t.getConfig(r),k=await t.getOrBuildWorkspace(r,V(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:d.type,packageCount:k.packages.size,packages:x})}}let s=n.map(d=>te.resolve(r,d)),o=t.getConfig(r),i=o?.coverageReportPath?ft(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((d,h)=>(d[h.category]=(d[h.category]??0)+1,d),{}),p=a.findCycles(),u=vt(a);return S({nodeCount:c.nodes.length,categories:l,cycles:p,languageCoverage:u})}async function ms(t,e){let{root:r,file:n,depth:s=1,withMeta:o=!1}=e,i=await t.ensureFresh(r),a=Ct(i,n,s),c=o?a.map(l=>({...l,...ce(i,l.path)})):a;return S({file:n,dependencies:c})}async function gs(t,e){let{root:r,file:n,withMeta:s=!1}=e,o=await t.ensureFresh(r),i=le(o,n),a=s?i.map(c=>({...c,...ce(o,c.path)})):i;return S({file:n,dependents:a})}async function ds(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=d=>a?d.map(h=>({path:h,...ce(c,h)})):d;if(o){let d=t.getOrBuildChangeImpact(r),h=xt(d,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=wt(c,n,{testsOnly:s,changedSymbols:i}),u=l(p);return S({file:n,affected:u,count:u.length})}async function hs(t,e){let{root:r,file:n,depth:s=1,withEdgeDetail:o=!1}=e,i=await t.ensureFresh(r),a=Ft(i,n,{depth:s,withEdgeDetail:o});return S({file:n,callers:a,count:a.length})}async function ys(t,e){let{root:r,entryPoints:n}=e,s=n?await t.getOrBuild(r,n.map(a=>te.resolve(r,a))):await t.ensureFresh(r),o=cs(r),i=s.findUnusedFiles(o);return S({unusedFiles:i,count:i.length})}async function xs(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 bs(t,e){let{root:r,coverageThreshold:n}=e,s=await t.ensureFresh(r),o=t.getConfig(r),i=n??o?.coverageThreshold??80;if(!Pt(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 Ss(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 ks(t,e){let{root:r,metric:n="cognitiveComplexity",threshold:s=10,limit:o=20}=e,i=await t.ensureFresh(r),a=Tt(i,{metric:n,threshold:s,limit:o});return S({metric:n,threshold:s,functions:a,count:a.length})}async function vs(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 kt(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 Cs(t,e){let{root:r,changedFiles:n,featureThreshold:s,format:o="tags"}=e,i=await t.ensureFresh(r),a=n??new Ye().getChangedFiles().map(p=>te.relative(r,te.resolve(r,p))),c=s!==void 0?{featureDetection:{minOutDegree:s}}:void 0;if(o==="paths"){let p=ur(i,a,c);return S({changedFiles:a,affectedTests:p,count:p.length})}let l=pr(i,a,c);return S({changedFiles:a,proposedTags:l})}async function ws(t,e){let{root:r,entryPoints:n,featureThreshold:s}=e,o=n?await t.getOrBuild(r,n.map(c=>te.resolve(r,c))):await t.ensureFresh(r),i=z(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 Fs(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=>te.resolve(r,l))):await t.ensureFresh(r),c=je(a.serialize(),ze(s));return o?S(Pe.serialize(M.deserialize(c))):i?S(Et(c)):S(c)}async function Ts(t,e){let{root:r}=e,n=await t.ensureFreshWorkspace(r);return S(At(n))}async function Es(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 As(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 Ps(t,e){let{root:r,type:n}=e,s=await t.ensureFresh(r),o=Dt(s);if(n)return S(Mt(o,n));let i=Array.from(o.types.values());return S({count:i.length,types:i})}async function Ns(t,e){let{root:r,paths:n,minOutDegree:s}=e,o=await t.ensureFresh(r),i=Nt(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 Is(t,e){let{root:r,minOutDegree:n}=e,s=await t.ensureFresh(r),o=ie(s,n!==void 0?{minOutDegree:n}:void 0),i=Object.fromEntries(o.features);return S({features:i,unassigned:o.unassigned})}async function Ds(t,e){let{root:r,function:n}=e,s=await t.ensureFresh(r);return S(ht(s,n))}async function Ms(t,e){let{root:r,name:n}=e,s=await t.ensureFresh(r),o=It(s,n);return S({name:n,matches:o,count:o.length})}async function Rs(t,e){let{root:r,entryPoints:n}=e,s=await t.ensureFresh(r),o=n?.length?n:gt(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(dt(s,o))}async function Ls(t,e){let r=await t.ensureFresh(e.root),n=await qt(r,e.root,{dryRun:e.dryRun??!1});return S(n)}var Gs=[{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 mr(){let t=new rt,e=new rl({name:"mokosh",version:"0.0.1"},{capabilities:{tools:{}}});return e.setRequestHandler(sl,async()=>({tools:Gs})),e.setRequestHandler(nl,async r=>{let{name:n,arguments:s}=r.params,o=s,a={analyze:c=>fs(t,c),get_dependencies:c=>ms(t,c),get_dependents:c=>gs(t,c),get_affected:c=>ds(t,c),get_callers:c=>hs(t,c),find_symbol:c=>Ms(t,c),find_unused:c=>ys(t,c),find_uncovered:c=>bs(t,c),list_tags:c=>xs(t,c),check_doc_drift:c=>Ss(t,c),find_complex_functions:c=>ks(t,c),find_duplicates:c=>vs(t,c),propose_tags:c=>Cs(t,c),detect_features:c=>ws(t,c),get_type_graph:c=>Ps(t,c),get_module_responsibility:c=>Ns(t,c),get_feature_graph:c=>Is(t,c),get_call_graph:c=>Ds(t,c),get_api_surface:c=>Rs(t,c),query:c=>Fs(t,c),get_workspace_packages:c=>Ts(t,c),get_workspace_affected:c=>Es(t,c),clear_cache:c=>As(t,c),apply_tags:c=>Ls(t,c)}[n];if(!a)throw new Error(`Unknown tool: ${n}`);try{return us(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 il(){let t=mr(),e=new ol;await t.connect(e)}il().catch(console.error);export{mr as createMcpServer};
|
|
39
|
+
`),null}}parseContent(e,r){return this.pool?this.pool.run({filePath:e,content:r}):qn(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.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:d,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}:{},...d!==void 0?{cognitiveComplexity:d}:{},...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.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 as(t,e){return{identifier:e?.identifier??new Ye,featureMap:e?.featureDetection===!1?new Map:W(t.nodes,e?.featureDetection??void 0)}}function cs(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 ur(t,e,r){let{identifier:n,featureMap:s}=as(t,r),o=new Set;for(let i of e){let a=s.get(i);a&&o.add(a.tag)}return cs(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 fr(t,e,r){let{identifier:n,featureMap:s}=as(t,r),o=new Set;return cs(t,e,s,()=>{},i=>{n.isTestNode(i)&&o.add(i.path)}),Array.from(o)}import el from"fs";import Fe from"path";async function ls(t,e,r=null,n={}){let s=n.silent?void 0:a=>{process.stderr.write(`Processed ${a} files...\r`)},o=Fe.resolve(t);return await new we(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 ps(t,e={}){let r=Fe.resolve(t),n=fe(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 me(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 we(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 us(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=el.readdirSync(i,{withFileTypes:!0});for(let c of a){let l=Fe.join(i,c.name);c.isDirectory()?n.has(c.name)||o(l):c.isFile()&&s.has(Fe.extname(c.name).toLowerCase())&&r.push(Fe.relative(t,l))}}catch{}}return o(t),r}var fs=/(?:^|[/\\])(?:node_modules|\.git|dist|build|coverage)(?:[/\\]|$)/;function ms(t){return gr.join(t,Pe,pt)}function tl(t,e){return e?.cachePath?gr.resolve(t,e.cachePath):gr.join(t,Pe,ut)}function rl(t){try{if(!mr.existsSync(t))return null;let e=mr.readFileSync(t,"utf-8");return I.deserialize(JSON.parse(e))}catch{return null}}var nt=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)??rl(tl(e,s)),i=await ls(e,r,o,{...V(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 ps(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=xt(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=mr.watch(e,{recursive:!0},(n,s)=>{!s||fs.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,V(r))}async getDuplicationTokenCache(e){let r=this.duplicationTokenCaches.get(e);return r||(r=Le(ms(e)),this.duplicationTokenCaches.set(e,r)),r}flushDuplicationTokenCache(e){let r=this.duplicationTokenCaches.get(e);if(r)try{Ge(r,ms(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}};import te from"path";import nl from"fs";import sl from"os";import dr from"path";function S(t){return{content:[{type:"text",text:JSON.stringify(t)}]}}function gs(t){if(!dr.isAbsolute(t))throw new Error("root must be an absolute path");let e=dr.resolve(t),r=sl.homedir();if(e!==r&&!e.startsWith(r+dr.sep))throw new Error("root must be within the user home directory");let n;try{n=nl.statSync(e)}catch{throw new Error("root does not exist")}if(!n.isDirectory())throw new Error("root is not a directory")}async function ds(t,e){let{root:r,entryPoints:n}=e;if(!t.isConfigured(r)){let d=ne(r,{allowJs:!1});lt(d),t.storeConfig(r,d)}if(n.length===0){let d=fe(r);if(d.type!=="none"){let h=t.getConfig(r),k=await t.getOrBuildWorkspace(r,V(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:d.type,packageCount:k.packages.size,packages:x})}}let s=n.map(d=>te.resolve(r,d)),o=t.getConfig(r),i=o?.coverageReportPath?mt(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((d,h)=>(d[h.category]=(d[h.category]??0)+1,d),{}),p=a.findCycles(),u=Ct(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=wt(i,n,s),c=o?a.map(l=>({...l,...ce(i,l.path)})):a;return S({file:n,dependencies:c})}async function ys(t,e){let{root:r,file:n,withMeta:s=!1}=e,o=await t.ensureFresh(r),i=le(o,n),a=s?i.map(c=>({...c,...ce(o,c.path)})):i;return S({file:n,dependents:a})}async function xs(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=d=>a?d.map(h=>({path:h,...ce(c,h)})):d;if(o){let d=t.getOrBuildChangeImpact(r),h=bt(d,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=Ft(c,n,{testsOnly:s,changedSymbols:i}),u=l(p);return S({file:n,affected:u,count:u.length})}async function bs(t,e){let{root:r,file:n,depth:s=1,withEdgeDetail:o=!1}=e,i=await t.ensureFresh(r),a=Tt(i,n,{depth:s,withEdgeDetail:o});return S({file:n,callers:a,count:a.length})}async function Ss(t,e){let{root:r,entryPoints:n}=e,s=n?await t.getOrBuild(r,n.map(a=>te.resolve(r,a))):await t.ensureFresh(r),o=us(r),i=s.findUnusedFiles(o);return S({unusedFiles:i,count:i.length})}async function ks(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 vs(t,e){let{root:r,coverageThreshold:n}=e,s=await t.ensureFresh(r),o=t.getConfig(r),i=n??o?.coverageThreshold??80;if(!Nt(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 Cs(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 ws(t,e){let{root:r,metric:n="cognitiveComplexity",threshold:s=10,limit:o=20}=e,i=await t.ensureFresh(r),a=Et(i,{metric:n,threshold:s,limit:o});return S({metric:n,threshold:s,functions:a,count:a.length})}async function Fs(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 vt(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 Ts(t,e){let{root:r,changedFiles:n,featureThreshold:s,format:o="tags"}=e,i=await t.ensureFresh(r),a=n??new Xe().getChangedFiles().map(p=>te.relative(r,te.resolve(r,p))),c=s!==void 0?{featureDetection:{minOutDegree:s}}:void 0;if(o==="paths"){let p=fr(i,a,c);return S({changedFiles:a,affectedTests:p,count:p.length})}let l=ur(i,a,c);return S({changedFiles:a,proposedTags:l})}async function Es(t,e){let{root:r,entryPoints:n,featureThreshold:s}=e,o=n?await t.getOrBuild(r,n.map(c=>te.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 As(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=>te.resolve(r,l))):await t.ensureFresh(r),c=We(a.serialize(),ze(s));return o?S(Ne.serialize(I.deserialize(c))):i?S(At(c)):S(c)}async function Ps(t,e){let{root:r}=e,n=await t.ensureFreshWorkspace(r);return S(Pt(n))}async function Ns(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 Is(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 Ds(t,e){let{root:r,type:n}=e,s=await t.ensureFresh(r),o=Mt(s);if(n)return S(Rt(o,n));let i=Array.from(o.types.values());return S({count:i.length,types:i})}async function Ms(t,e){let{root:r,paths:n,minOutDegree:s}=e,o=await t.ensureFresh(r),i=It(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 Rs(t,e){let{root:r,minOutDegree:n}=e,s=await t.ensureFresh(r),o=ie(s,n!==void 0?{minOutDegree:n}:void 0),i=Object.fromEntries(o.features);return S({features:i,unassigned:o.unassigned})}async function Ls(t,e){let{root:r,function:n}=e,s=await t.ensureFresh(r);return S(yt(s,n))}async function Gs(t,e){let{root:r,name:n}=e,s=await t.ensureFresh(r),o=Dt(s,n);return S({name:n,matches:o,count:o.length})}async function _s(t,e){let{root:r,entryPoints:n}=e,s=await t.ensureFresh(r),o=n?.length?n:dt(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(ht(s,o))}async function Os(t,e){let r=await t.ensureFresh(e.root),n=await Yt(r,e.root,{dryRun:e.dryRun??!1});return S(n)}var js=[{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 hr(){let t=new nt,e=new ol({name:"mokosh",version:"0.0.1"},{capabilities:{tools:{}}});return e.setRequestHandler(al,async()=>({tools:js})),e.setRequestHandler(il,async r=>{let{name:n,arguments:s}=r.params,o=s,a={analyze:c=>ds(t,c),get_dependencies:c=>hs(t,c),get_dependents:c=>ys(t,c),get_affected:c=>xs(t,c),get_callers:c=>bs(t,c),find_symbol:c=>Gs(t,c),find_unused:c=>Ss(t,c),find_uncovered:c=>vs(t,c),list_tags:c=>ks(t,c),check_doc_drift:c=>Cs(t,c),find_complex_functions:c=>ws(t,c),find_duplicates:c=>Fs(t,c),propose_tags:c=>Ts(t,c),detect_features:c=>Es(t,c),get_type_graph:c=>Ds(t,c),get_module_responsibility:c=>Ms(t,c),get_feature_graph:c=>Rs(t,c),get_call_graph:c=>Ls(t,c),get_api_surface:c=>_s(t,c),query:c=>As(t,c),get_workspace_packages:c=>Ps(t,c),get_workspace_affected:c=>Ns(t,c),clear_cache:c=>Is(t,c),apply_tags:c=>Os(t,c)}[n];if(!a)throw new Error(`Unknown tool: ${n}`);try{return gs(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 ll(){let t=hr(),e=new cl;await t.connect(e)}ll().catch(console.error);export{hr as createMcpServer};
|
|
37
41
|
//# sourceMappingURL=mcp.mjs.map
|