mirror of
https://github.com/yamadashy/repomix.git
synced 2026-02-03 11:33:39 +01:00
174 lines
5.5 KiB
TypeScript
174 lines
5.5 KiB
TypeScript
import { describe, expect, it } from 'vitest';
|
|
import type { FileManipulator } from '../../../src/core/file/fileManipulate.js';
|
|
import { processFiles } from '../../../src/core/file/fileProcess.js';
|
|
import { processContent } from '../../../src/core/file/fileProcessContent.js';
|
|
import type { RawFile } from '../../../src/core/file/fileTypes.js';
|
|
import type { FileProcessTask } from '../../../src/core/file/workers/fileProcessWorker.js';
|
|
import fileProcessWorker from '../../../src/core/file/workers/fileProcessWorker.js';
|
|
import type { WorkerOptions } from '../../../src/shared/processConcurrency.js';
|
|
import { createMockConfig } from '../../testing/testUtils.js';
|
|
|
|
const createMockFileManipulator = (): FileManipulator => ({
|
|
removeComments: (content: string) => content.replace(/\/\/.*|\/\*[\s\S]*?\*\//g, ''),
|
|
removeEmptyLines: (content: string) => content.replace(/^\s*[\r\n]/gm, ''),
|
|
});
|
|
|
|
const mockGetFileManipulator = (filePath: string): FileManipulator | null => {
|
|
if (filePath.endsWith('.js')) {
|
|
return createMockFileManipulator();
|
|
}
|
|
return null;
|
|
};
|
|
|
|
const mockInitTaskRunner = <T, R>(_options: WorkerOptions) => {
|
|
return {
|
|
run: async (task: T) => {
|
|
return (await fileProcessWorker(task as FileProcessTask)) as R;
|
|
},
|
|
cleanup: async () => {
|
|
// Mock cleanup - no-op for tests
|
|
},
|
|
};
|
|
};
|
|
|
|
describe('fileProcess', () => {
|
|
describe('processFiles', () => {
|
|
it('should process multiple files', async () => {
|
|
const mockRawFiles: RawFile[] = [
|
|
{ path: 'file1.js', content: '// comment\nconst a = 1;' },
|
|
{ path: 'file2.js', content: '/* comment */\nconst b = 2;' },
|
|
];
|
|
const config = createMockConfig({
|
|
output: {
|
|
removeComments: true,
|
|
removeEmptyLines: true,
|
|
},
|
|
});
|
|
|
|
const result = await processFiles(mockRawFiles, config, () => {}, {
|
|
initTaskRunner: mockInitTaskRunner,
|
|
getFileManipulator: mockGetFileManipulator,
|
|
});
|
|
|
|
expect(result).toEqual([
|
|
{ path: 'file1.js', content: 'const a = 1;' },
|
|
{ path: 'file2.js', content: 'const b = 2;' },
|
|
]);
|
|
});
|
|
});
|
|
|
|
describe('processContent', () => {
|
|
it('should remove comments and empty lines when configured', async () => {
|
|
const content = '// comment\nconst a = 1;\n\n/* multi-line\ncomment */\nconst b = 2;';
|
|
const filePath = 'test.js';
|
|
const config = createMockConfig({
|
|
output: {
|
|
removeComments: true,
|
|
removeEmptyLines: true,
|
|
},
|
|
});
|
|
|
|
const result = await processContent({ path: filePath, content }, config);
|
|
|
|
expect(result).toBe('const a = 1;\nconst b = 2;');
|
|
});
|
|
|
|
it('should not remove comments or empty lines when not configured', async () => {
|
|
const content = '// comment\nconst a = 1;\n\n/* multi-line\ncomment */\nconst b = 2;';
|
|
const filePath = 'test.js';
|
|
const config = createMockConfig({
|
|
output: {
|
|
removeComments: false,
|
|
removeEmptyLines: false,
|
|
},
|
|
});
|
|
|
|
const result = await processContent({ path: filePath, content }, config);
|
|
|
|
expect(result).toBe(content.trim());
|
|
});
|
|
|
|
it('should handle files without a manipulator', async () => {
|
|
const content = 'Some content';
|
|
const filePath = 'unknown.ext';
|
|
const config = createMockConfig({
|
|
output: {
|
|
removeComments: true,
|
|
removeEmptyLines: true,
|
|
},
|
|
});
|
|
|
|
const result = await processContent({ path: filePath, content }, config);
|
|
|
|
expect(result).toBe(content);
|
|
});
|
|
|
|
it('should add line numbers when showLineNumbers is true', async () => {
|
|
const content = 'Line 1\nLine 2\nLine 3';
|
|
const filePath = 'test.txt';
|
|
const config = createMockConfig({
|
|
output: {
|
|
showLineNumbers: true,
|
|
removeComments: false,
|
|
removeEmptyLines: false,
|
|
},
|
|
});
|
|
|
|
const result = await processContent({ path: filePath, content }, config);
|
|
|
|
expect(result).toBe('1: Line 1\n2: Line 2\n3: Line 3');
|
|
});
|
|
|
|
it('should not add line numbers when showLineNumbers is false', async () => {
|
|
const content = 'Line 1\nLine 2\nLine 3';
|
|
const filePath = 'test.txt';
|
|
const config = createMockConfig({
|
|
output: {
|
|
showLineNumbers: false,
|
|
removeComments: false,
|
|
removeEmptyLines: false,
|
|
},
|
|
});
|
|
|
|
const result = await processContent({ path: filePath, content }, config);
|
|
|
|
expect(result).toBe('Line 1\nLine 2\nLine 3');
|
|
});
|
|
|
|
it('should handle empty content when showLineNumbers is true', async () => {
|
|
const content = '';
|
|
const filePath = 'empty.txt';
|
|
const config = createMockConfig({
|
|
output: {
|
|
showLineNumbers: true,
|
|
removeComments: false,
|
|
removeEmptyLines: false,
|
|
},
|
|
});
|
|
|
|
const result = await processContent({ path: filePath, content }, config);
|
|
|
|
expect(result).toBe('1: ');
|
|
});
|
|
|
|
it('should pad line numbers correctly for files with many lines', async () => {
|
|
const content = Array(100).fill('Line').join('\n');
|
|
const filePath = 'long.txt';
|
|
const config = createMockConfig({
|
|
output: {
|
|
showLineNumbers: true,
|
|
removeComments: false,
|
|
removeEmptyLines: false,
|
|
},
|
|
});
|
|
|
|
const result = await processContent({ path: filePath, content }, config);
|
|
|
|
const lines = result.split('\n');
|
|
expect(lines[0]).toBe(' 1: Line');
|
|
expect(lines[9]).toBe(' 10: Line');
|
|
expect(lines[99]).toBe('100: Line');
|
|
});
|
|
});
|
|
});
|