UNPKG

@blast-shield/parser

Version:
6 lines 5.45 kB
import*as d from'fs/promises';import {glob}from'glob';import G from'ignore';import {logger}from'@blast-shield/logger';import*as x from'path';var l=[{name:"typescript",extensions:["ts","tsx"],lineComments:[{regex:/\/\/.*/,marker:"//"}],blockComments:[{start:{regex:/\/\*/,marker:"/*"},end:{regex:/\*\//,marker:"*/"}}]},{name:"javascript",extensions:["js","jsx"],lineComments:[{regex:/\/\/.*/,marker:"//"}],blockComments:[{start:{regex:/\/\*/,marker:"/*"},end:{regex:/\*\//,marker:"*/"}}]},{name:"python",extensions:["py"],lineComments:[{regex:/#.*/,marker:"#"}],blockComments:[{start:{regex:/"""/,marker:'"""'},end:{regex:/"""/,marker:'"""'}},{start:{regex:/'''/,marker:"'''"},end:{regex:/'''/,marker:"'''"}}]},{name:"html",extensions:["html","htm"],lineComments:[],blockComments:[{start:{regex:/<!--/,marker:"<!--"},end:{regex:/-->/,marker:"-->"}}]},{name:"css",extensions:["css"],lineComments:[],blockComments:[{start:{regex:/\/\*/,marker:"/*"},end:{regex:/\*\//,marker:"*/"}}]},{name:"java",extensions:["java"],lineComments:[{regex:/\/\/.*/,marker:"//"}],blockComments:[{start:{regex:/\/\*/,marker:"/*"},end:{regex:/\*\//,marker:"*/"}}]},{name:"c",extensions:["c","h"],lineComments:[{regex:/\/\/.*/,marker:"//"}],blockComments:[{start:{regex:/\/\*/,marker:"/*"},end:{regex:/\*\//,marker:"*/"}}]},{name:"cpp",extensions:["cpp","hpp","cc","hh"],lineComments:[{regex:/\/\/.*/,marker:"//"}],blockComments:[{start:{regex:/\/\*/,marker:"/*"},end:{regex:/\*\//,marker:"*/"}}]},{name:"go",extensions:["go"],lineComments:[{regex:/\/\/.*/,marker:"//"}],blockComments:[{start:{regex:/\/\*/,marker:"/*"},end:{regex:/\*\//,marker:"*/"}}]},{name:"ruby",extensions:["rb"],lineComments:[{regex:/#.*/,marker:"#"}],blockComments:[{start:{regex:/=begin/,marker:"=begin"},end:{regex:/=end/,marker:"=end"}},{start:{regex:/__END__/,marker:"__END__"},end:{regex:/.*/,marker:""}}]},{name:"rust",extensions:["rs"],lineComments:[{regex:/\/\/.*/,marker:"//"}],blockComments:[{start:{regex:/\/\*/,marker:"/*"},end:{regex:/\*\//,marker:"*/"}}]},{name:"php",extensions:["php"],lineComments:[{regex:/\/\/.*/,marker:"//"}],blockComments:[{start:{regex:/\/\*/,marker:"/*"},end:{regex:/\*\//,marker:"*/"}},{start:{regex:/<!--/,marker:"<!--"},end:{regex:/-->/,marker:"-->"}}]},{name:"swift",extensions:["swift"],lineComments:[{regex:/\/\/.*/,marker:"//"}],blockComments:[{start:{regex:/\/\*/,marker:"/*"},end:{regex:/\*\//,marker:"*/"}}]},{name:"shell",extensions:["sh","bash","zsh"],lineComments:[{regex:/#.*/,marker:"#"}],blockComments:[]},{name:"perl",extensions:["pl","pm"],lineComments:[{regex:/#.*/,marker:"#"}],blockComments:[{start:{regex:/=pod/,marker:"=pod"},end:{regex:/=cut/,marker:"=cut"}}]},{name:"lua",extensions:["lua"],lineComments:[{regex:/--.*/,marker:"--"}],blockComments:[{start:{regex:/--\[\[/,marker:"--[["},end:{regex:/]]/,marker:"]]"}}]},{name:"r",extensions:["r","R"],lineComments:[{regex:/#.*/,marker:"#"}],blockComments:[]},{name:"sql",extensions:["sql"],lineComments:[{regex:/--.*/,marker:"--"}],blockComments:[{start:{regex:/\/\*/,marker:"/*"},end:{regex:/\*\//,marker:"*/"}}]}];function E(e){let r=e.split(".").pop()?.toLowerCase();return r&&l.find(t=>t.extensions.includes(r))||null}function L(e,r){let t=e.trim();return r.lineComments.some(({marker:m})=>t.startsWith(m))||u(e,r)}function F(e,r){return r.blockComments.some(({start:t})=>e.trim().startsWith(t.marker))}function w(e,r){return r.blockComments.some(({end:t})=>e.trim().endsWith(t.marker))}function u(e,r){return r.blockComments.some(({start:t,end:m})=>{let n=e.trim();return n.startsWith(t.marker)||n.endsWith(m.marker)})}var h=l.flatMap(e=>e.extensions.map(r=>[r,e.name])).reduce((e,[r,t])=>(e[r]=t,e),{});function p(e,r){let t=l.find(n=>n.name.toLowerCase()===r.toLowerCase());if(!t)throw new Error(`Unsupported language: ${r}`);let m=[];for(let{regex:n,marker:o}of t.lineComments){let s=e.match(new RegExp(n,"g"));s&&s.forEach(g=>{let a=g.trim();a.startsWith(o)&&(a=a.slice(o.length).trim()),m.push({raw:g,clean:a});});}for(let{start:n,end:o}of t.blockComments){let s=new RegExp(`${n.regex.source}([sS]*?)${o.regex.source}`,"g"),g=e.match(s);g&&g.forEach(a=>{let i=a.trim();i.startsWith(n.marker)&&(i=i.slice(n.marker.length)),i.endsWith(o.marker)&&(i=i.slice(0,-o.marker.length)),m.push({raw:a,clean:i.trim()});});}return m}function f(e){let r=e.split(".").pop()?.toLowerCase();return r&&h[r]||null}async function N(e){let r=await d.readFile(e,"utf-8"),t=r.split(` `),m=f(e),n=[];if(m)try{n=p(r,m).map(s=>s.raw);}catch(o){logger.warn(`Failed to extract comments from ${e}: ${o}`);}return {filePath:e,comments:n,language:m,linesOfCode:t.filter(o=>o.trim().length>0).length}}async function y(e,r={}){let t=r.rootDir||process.cwd(),m=r.additionalIgnores||[];try{let n=x.join(t,".gitignore"),o="";try{o=await d.readFile(n,"utf-8");}catch{}let s=G();o&&s.add(o),m.length>0&&s.add(m),s.add([".git/**","dist/**","build/**"]);let a=(await glob(e,{cwd:t,absolute:!0,nodir:!0})).map(c=>x.relative(t,c));return s.filter(a).map(c=>x.join(t,c))}catch(n){return logger.error("Error finding files","INFO",n),[]}} // @blast-shield/parser v0.0.27 // Blast Shield Parser Library // Copyright © 2025 | Made with ❤️ export{h as FILE_EXTENSION_TO_LANGUAGE,l as LANGUAGE_CONFIGS,p as extractComments,y as findFilesWithGitignore,E as getLanguageConfigForFile,f as getLanguageFromFilePath,w as isBlockCommentEnd,F as isBlockCommentStart,L as isComment,u as isInBlockComment,N as parseFileForComments};