Advertisement

← vibesdk

worker/agents/utils/codeSerializers.ts

1.7 KB Download file
import { SCOFFormat } from '../output-formats/streaming-formats/scof';
import { FileOutputType } from '../schemas';

export enum CodeSerializerType {
	SIMPLE = 'simple',
	SCOF = 'scof',
}

export type CodeSerializer = (files: FileOutputType[]) => string;

function detectLanguage(filePath: string): string {
    const extension = filePath.split('.').pop() ?? '';
    switch (extension) {
        case 'js':
            return 'javascript';
        case 'ts':
            return 'typescript';
        case 'tsx':
            return 'typescript';
        case 'jsx':
            return 'javascript';
        case 'json':
            return 'json';
        case 'html':
            return 'html';
        case 'css':
            return 'css';
        case 'md':
            return 'markdown';
        case 'sh':
            return 'shell';
        default:
            return '';
    }
}

function simpleSerializer(files: FileOutputType[]): string {
	/*
        # File Name: <file name>
        # File Purpose: <file purpose>
        \`\`\`<language>
        <file content>
        \`\`\`
    */
	return files
		.map((file) => {
			return `# File Name: ${file.filePath}\n# File Purpose: ${file.filePurpose}\n\`\`\`${detectLanguage(file.filePath)}\n${file.fileContents}\n\`\`\`\n`;
		})
		.join('\n\n');
}

function scofSerializer(files: FileOutputType[]): string {
	return new SCOFFormat().serialize(
		files.map((file) => {
			return {
				...file,
				format: 'full_content',
			};
		}),
	);
}

export const CODE_SERIALIZERS: Record<CodeSerializerType, CodeSerializer> = {
	[CodeSerializerType.SIMPLE]: simpleSerializer,
	[CodeSerializerType.SCOF]: scofSerializer,
};