import { basename } from 'node:path' import type { CodeIntelligenceConfig } from '../config.ts' import { matchesAnyGlob, normalizeRelativePath } from './glob.ts' export type GeneratedDetection = { isGenerated: boolean reason?: string } const GENERATED_DIR_SEGMENTS = new Set(['generated', '__generated__', 'gen', 'autogen']) const GENERATED_FILE_NAMES = new Set([ 'package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', 'bun.lockb', 'composer.lock', 'poetry.lock', 'cargo.lock', ]) const HEADER_MARKERS = [ '@generated', 'this file is generated', 'code generated by', 'do not edit', 'generated by openapi', 'generated by prisma', ] export function detectGeneratedFile( relativePath: string, content: string, config: Pick ): GeneratedDetection { const rel = normalizeRelativePath(relativePath) if (matchesAnyGlob(rel, config.generatedPaths)) { return { isGenerated: true, reason: 'configured generatedPaths match' } } const segments = rel.toLowerCase().split('/') if (segments.some((segment) => GENERATED_DIR_SEGMENTS.has(segment))) { return { isGenerated: true, reason: 'generated directory path' } } if (GENERATED_FILE_NAMES.has(basename(rel).toLowerCase())) { return { isGenerated: true, reason: 'lockfile/generated artifact' } } const header = content.slice(0, 4096).toLowerCase() const marker = HEADER_MARKERS.find((candidate) => header.includes(candidate)) if (marker) { return { isGenerated: true, reason: `header marker: ${marker}` } } return { isGenerated: false } }