unqommented
Version:
A Node.js utility that quickly identifies files with uncommented code in your codebase. Designed for developers who want to efficiently tell LLMs exactly which files need comments added.
101 lines (85 loc) • 3.28 kB
JavaScript
require('qtests/setup');
const { test, expect, describe, beforeAll, afterAll } = require('@jest/globals');
const fs = require('fs');
const path = require('path');
const { PassThrough } = require('stream');
const utils = require('../utils');
const os = require('os');
const TEST_DIR = './test-dir-stream';
let outputStream;
let data = '';
beforeAll(() => {
if (!fs.existsSync(TEST_DIR)) {
fs.mkdirSync(TEST_DIR);
}
fs.writeFileSync(path.join(TEST_DIR, 'commented.js'), '// comment');
fs.writeFileSync(path.join(TEST_DIR, 'uncommented.js'), 'const x = 1;');
outputStream = new PassThrough();
outputStream.on('data', chunk => { data += chunk.toString(); });
});
afterAll(() => {
fs.rmSync(TEST_DIR, { recursive: true, force: true });
});
describe('findUncommentedFiles with output stream', () => {
test('writes expected paths to provided stream and returns empty list', async () => {
const result = await utils.findUncommentedFiles(TEST_DIR, outputStream);
outputStream.end();
const files = data.trim().split('\n').filter(f => f);
expect(files).toEqual(['uncommented.js']);
expect(result.uncommentedFiles).toEqual([]);
});
});
describe('findUncommentedFiles stream with only commented files', () => {
let tmpDir;
let stream;
let content = '';
let finished = false;
beforeAll(() => {
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'unqommented-'));
fs.writeFileSync(path.join(tmpDir, 'commented.js'), '// just a comment');
stream = new PassThrough();
stream.on('data', chunk => { content += chunk.toString(); });
stream.on('finish', () => { finished = true; });
});
afterAll(() => {
fs.rmSync(tmpDir, { recursive: true, force: true });
});
test('does not write to stream and ends cleanly', async () => {
const result = await utils.findUncommentedFiles(tmpDir, stream);
await new Promise(res => stream.end(res));
expect(content).toBe('');
expect(finished).toBe(true);
expect(result.uncommentedFiles).toEqual([]);
});
});
describe('findUncommentedFiles backpressure handling', () => {
let tmpDir;
let stream;
let collected = '';
let finished = false;
beforeAll(() => {
tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'unqommented-'));
for (let i = 0; i < 5; i += 1) {
fs.writeFileSync(path.join(tmpDir, `file${i}.js`), 'const x = 1;');
}
stream = new PassThrough({ highWaterMark: 1 });
stream.on('finish', () => { finished = true; });
});
afterAll(() => {
fs.rmSync(tmpDir, { recursive: true, force: true });
});
test('waits for drain event when stream buffer is full', async () => {
let resolved = false;
const promise = utils.findUncommentedFiles(tmpDir, stream).then(res => { resolved = true; return res; });
await new Promise(res => setTimeout(res, 50));
expect(resolved).toBe(false); // should still wait for drain
stream.on('data', chunk => { collected += chunk.toString(); });
stream.resume(); // drain buffered data
const result = await promise;
await new Promise(res => stream.end(res));
const lines = collected.trim().split('\n').filter(f => f);
expect(lines.length).toBe(5);
expect(finished).toBe(true);
expect(result.uncommentedFiles).toEqual([]);
});
});