export const grep = (pattern, flags, files) => {
const showLineNumber = flags.includes('-n');
const onlyFileNames = flags.includes('-l');
const caseInsensitive = flags.includes('-i');
const invertMatch = flags.includes('-v');
const matchEntireLine = flags.includes('-x');
const multipleFiles = files.length > 1;
let results = [];
for (const file of files) {
const lines = readFileSync(file, 'utf8').split('\n');
let fileMatched = false;
for (let i = 0; i < lines.length; i++) {
const line = lines[i];
let isMatch = false;
const p = caseInsensitive ? pattern.toLowerCase() : pattern;
const l = caseInsensitive ? line.toLowerCase() : line;
if (matchEntireLine) {
isMatch = (p === l);
} else {
isMatch = l.includes(p);
}
if (invertMatch) isMatch = !isMatch;
if (isMatch) {
fileMatched = true;
if (onlyFileNames) break;
let output = '';
if (multipleFiles) output += `${file}:`;
if (showLineNumber) output += `${i + 1}:`;
output += line;
results.push(output);
}
}
if (onlyFileNames && fileMatched) {
results.push(file);
}
}
return results.join('\n');
};