Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kentcdodds/lineage

src/ignore-rules.ts

58 lines · 1.6 KB · TypeScript
import {
	emptyIgnoreIndex,
	parseGitignore,
	parseLinguistGenerated,
	type IgnoreIndex,
} from './classify.ts'
import { getRepoTextFile } from './github.ts'
import {
	getRepoSettings,
	getSetting,
	listKnownGeneratedPaths,
	setSetting,
} from './storage.ts'

export async function loadIgnoreIndex(): Promise<IgnoreIndex> {
	const repo = await getRepoSettings()
	const cacheKey = `ignore:${repo.owner}/${repo.repo}/${repo.branch}`
	const cached = await getSetting(cacheKey)
	let gitignore: string[] = []
	let linguistGenerated: string[] = []
	if (cached) {
		try {
			const parsed = JSON.parse(cached) as {
				gitignore?: string[]
				linguistGenerated?: string[]
			}
			gitignore = parsed.gitignore ?? []
			linguistGenerated = parsed.linguistGenerated ?? []
		} catch {
			gitignore = []
			linguistGenerated = []
		}
	} else {
		const [gitignoreText, attributesText] = await Promise.all([
			getRepoTextFile(repo, '.gitignore'),
			getRepoTextFile(repo, '.gitattributes'),
		])
		gitignore = parseGitignore(gitignoreText ?? '')
		linguistGenerated = parseLinguistGenerated(attributesText ?? '')
		await setSetting(
			cacheKey,
			JSON.stringify({ gitignore, linguistGenerated, fetchedAt: new Date().toISOString() }),
		)
	}
	const known = await listKnownGeneratedPaths()
	return {
		...emptyIgnoreIndex(),
		gitignore: [],
		linguistGenerated,
		knownGeneratedPaths: new Set(known.keys()),
	}
}

export async function refreshIgnoreIndex(): Promise<IgnoreIndex> {
	const repo = await getRepoSettings()
	await setSetting(`ignore:${repo.owner}/${repo.repo}/${repo.branch}`, '')
	return loadIgnoreIndex()
}