Programmatic Usage Examples
Real-world recipes using @zamdevio/i18nprune/config and @zamdevio/i18nprune/core.
1. Pre-commit Validation Hook
// scripts/validate-i18n.ts
import { resolveContext, scanProjectDynamicKeySites } from '@zamdevio/i18nprune/core';
import { exactLiteralKeys } from '@zamdevio/i18nprune/core';
const ctx = resolveContext();
const dynamicSites = scanProjectDynamicKeySites(ctx);
if (dynamicSites.length > 0) {
console.warn(`${dynamicSites.length} dynamic translation keys found.`);
process.exit(1);
}2. Custom Report Generator
import {
resolveContext,
collectStringLeaves,
scanSources,
readJsonFile,
exactLiteralKeys,
} from '@zamdevio/i18nprune/core';
const ctx = resolveContext();
const sourceData = readJsonFile(ctx.paths.sourceLocale);
const usedKeys = new Set(exactLiteralKeys(scanSources(ctx.paths.srcRoot), ctx.config.functions));
const unused = collectStringLeaves(sourceData)
.map((l) => l.path)
.filter((k) => !usedKeys.has(k));
console.log('Unused keys:', unused);3. Config in Library / Monorepo
import { defineConfig } from '@zamdevio/i18nprune/config';
export default defineConfig({
source: 'packages/design-system/locales/en.json',
localesDir: 'packages/design-system/locales',
src: 'packages/**/*.{ts,tsx}',
functions: ['t'],
});4. Testing Context Resolution
import { resolveContext, clearContextCache } from '@zamdevio/i18nprune/core';
test('resolves context correctly', () => {
clearContextCache();
const ctx = resolveContext(fixturePath);
expect(ctx.meta.fieldSources.source).toBe('file');
});5. Namespaced imports (same API, grouped)
import { context, extractor, dynamic, validate, files } from '@zamdevio/i18nprune/core';
const ctx = context.resolveContext();
const usage = extractor.scanProjectLiteralKeyUsage(ctx);
const sites = dynamic.scanProjectDynamicKeySites(ctx);
const raw = files.readJsonFile(ctx.paths.sourceLocale);
const missing = validate.computeMissingLiteralKeys(ctx, raw);More examples coming as the ecosystem grows.
Pro tip: Always call clearContextCache() in tests or when switching projects.