@blast-shield/parser
Version:
Parser utility for blast-shield
6 lines • 5.5 kB
JavaScript
import*as d from'fs/promises';import*as c from'path';import {logger}from'@blast-shield/logger';import {glob}from'glob';import y from'ignore';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:s})=>t.startsWith(s))||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:s})=>{let n=e.trim();return n.startsWith(t.marker)||n.endsWith(s.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 s=[];for(let{regex:n,marker:o}of t.lineComments){let m=e.match(new RegExp(n,"g"));m&&m.forEach(g=>{let a=g.trim();a.startsWith(o)&&(a=a.slice(o.length).trim()),s.push({raw:g,clean:a});});}for(let{start:n,end:o}of t.blockComments){let m=new RegExp(`${n.regex.source}([\\s\\S]*?)${o.regex.source}`,"g"),g=e.match(m);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)),s.push({raw:a,clean:i.trim()});});}return s}function f(e){let r=e.split(".").pop()?.toLowerCase();return r&&h[r]||null}async function G(e){let r=await d.readFile(e,"utf-8"),t=r.split(`
`),s=f(e),n=[];if(s)try{n=p(r,s).map(m=>m.raw);}catch(o){logger.warn(`Failed to extract comments from ${e}: ${o}`);}return {filePath:e,comments:n,language:s,linesOfCode:t.filter(o=>o.trim().length>0).length}}async function N(e,r={}){let t=r.rootDir||process.cwd(),s=r.additionalIgnores||[];try{let n=c.join(t,".gitignore"),o="";try{o=await d.readFile(n,"utf-8");}catch{}let m=y();o&&m.add(o),s.length>0&&m.add(s),m.add([".git/**","dist/**","build/**"]);let a=(await glob(e,{cwd:t,absolute:!0,nodir:!0})).map(x=>c.relative(t,x));return m.filter(a).map(x=>c.join(t,x))}catch(n){let o=n instanceof Error?n.message:String(n);return logger.error("Error finding files","INFO",o),[]}}
// @blast-shield/parser v0.0.31
// Blast Shield Parser Library
// Copyright © 2026 | Made with ❤️
export{h as FILE_EXTENSION_TO_LANGUAGE,l as LANGUAGE_CONFIGS,p as extractComments,N as findFilesWithGitignore,E as getLanguageConfigForFile,f as getLanguageFromFilePath,w as isBlockCommentEnd,F as isBlockCommentStart,L as isComment,u as isInBlockComment,G as parseFileForComments};