export const LINGO_COVERAGE_VERSION: number; export const NEEDS_TRANSLATION_KEY: 'needs-translation'; /** #911 (review round 2): test-only work-counter — how many times `lingoCoverage` called `parseSite`. */ export let parseSiteCallCount: number; /** Zero `parseSiteCallCount` between measurements — test-only. */ export function resetParseSiteCallCountForTests(): void; export type LingoCoverageCell = { /** That locale's copy of the page (for a missing one: where it would live). */ path: string; missing?: true; /** #1407: other files of this locale on the same route; `path` is the one the build serves. */ duplicate?: string[]; /** Present when the page carries `needs-translation: true`: rows still holding copied words. */ needsTranslation?: number; /** Reference block ids whose position no longer lines up (kind or row count). */ structureMismatch?: string[]; /** `.` whose shared asset differs from the reference. Shown, never a gap. */ assetDiffers?: string[]; /** How many `structureMismatch` ids are NOT listed above — the list itself is capped. */ structureMismatchMore?: number; /** How many `assetDiffers` ids are NOT listed above. */ assetDiffersMore?: number; }; export type LingoCoveragePage = { /** The reference locale's file. */ path: string; /** The locale-free path under the IR root (`students/vmodel-8.md`). */ inner: string; /** Only the locales with something to say — or whose copy is not where the path convention would put it (#1407: a * path-only cell, which reads complete); an absent locale is complete on THIS listed page. */ locales: Record; }; export type LingoCoverageTotals = { pages: number; missingPages: number; needsTranslationPages: number; needsTranslationRows: number; structureMismatchPages: number; structureMismatchBlocks: number; assetDifferPages: number; extraPages: number; /** #1407: pages where this locale has two files on one route. */ duplicatePages: number; }; export type LingoCoverage = { referenceLocale: string; locales: string[]; referencePages: number; pages: LingoCoveragePage[]; /** Locale-free paths that exist only in a translation — not a gap, and no reference to compare with. */ extras: string[]; totals: Record; /** * 🔴 #1010: `pages`/`extras` were WINDOWED, so 「this page is not listed」 no longer means * 「this page is complete」 — it means UNKNOWN. Every reader of `pages` must branch on this. * `totals` and the sentence are still the whole site. */ truncated?: true; /** What was cut, in one line — present only with `truncated`. */ truncationNote?: string; }; export function declaredLocalesOf(siteMd: string | null | undefined): string[]; export function lingoCoverage(input: { siteMd: string | null | undefined; pages: Iterable<[string, string]> | Map; irDir?: string; }): LingoCoverage | null; export function hasLingoGaps(coverage: LingoCoverage | null | undefined): boolean; export function lingoCoverageSentence(coverage: LingoCoverage | null | undefined): string | null; export const LINGO_COVERAGE_RESOURCE: Readonly<{ name: string; uriTemplate: string; title: string; description: string; mimeType: string; }>; export function siteFromLingoCoverageUri(uri: string | null | undefined): string | null; export function lingoCoverageResourceEntry(siteKey: string): { uri: string; name: string; title: string; description: string; mimeType: string; };