@hagicode/hagi18n 0.1.0-dev.1.1.45d0d2f

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/config.js ADDED
@@ -0,0 +1,341 @@
1
+ import { access, readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import yaml from "js-yaml";
4
+ export const DEFAULT_BASE_LOCALE = "en-US";
5
+ export const DEFAULT_CONFIG_FILE_NAMES = ["hagi18n.yaml", "hagi18n.yml"];
6
+ export const DEFAULT_DOCTOR_EXCLUDED_DIRECTORIES = [
7
+ ".git",
8
+ "coverage",
9
+ "dist",
10
+ "indexGenerator",
11
+ "node_modules",
12
+ "public"
13
+ ];
14
+ export const DEFAULT_DOCTOR_TEXT_FILE_EXTENSIONS = [
15
+ ".cjs",
16
+ ".js",
17
+ ".jsx",
18
+ ".md",
19
+ ".mjs",
20
+ ".ts",
21
+ ".tsx"
22
+ ];
23
+ export const DEFAULT_DOCTOR_EXCLUDED_PATH_PREFIXES = ["src/generated/"];
24
+ export const DEFAULT_DOCTOR_SCAN_RULES = [
25
+ {
26
+ id: "legacy-locale-path",
27
+ message: "Legacy locale paths should use en-US instead of en.",
28
+ pattern: "(?:src\\/locales\\/en\\/|\\.\\.\\/\\.\\.\\/locales\\/en\\/)"
29
+ },
30
+ {
31
+ id: "legacy-language-change-call",
32
+ message: "Use en-US when switching the canonical UI language in code or tests.",
33
+ pattern: "\\b(?:i18n\\.)?changeLanguage\\(\\s*['\"]en['\"]\\s*\\)"
34
+ },
35
+ {
36
+ id: "legacy-ui-language-literal",
37
+ message: "Use en-US as the canonical UI language literal.",
38
+ pattern: "\\b(currentLanguage|confirmedLanguage|detectedLanguage|resolvedLanguage|language|lng)\\s*[:=]\\s*['\"]en['\"]"
39
+ },
40
+ {
41
+ id: "legacy-ui-language-union",
42
+ message: "Use en-US in UI-language unions and casts.",
43
+ pattern: "(?:as\\s+)?['\"]en['\"]\\s*\\|\\s*['\"]zh-CN['\"]"
44
+ }
45
+ ];
46
+ export const DEFAULT_DOCTOR_ALLOWLIST = {
47
+ "legacy-ui-language-literal": [
48
+ "src/services/__tests__/frontendConfigBootstrap.generalSettings.test.ts",
49
+ "src/services/__tests__/frontendConfigBootstrap.projectScope.test.ts",
50
+ "src/store/__tests__/aiLanguageSlice.test.ts",
51
+ "src/store/listeners/__tests__/frontendConfigSyncListener.projectScope.test.ts",
52
+ "src/store/slices/__tests__/generalSettingsSlice.test.ts"
53
+ ],
54
+ "legacy-language-change-call": [],
55
+ "legacy-locale-path": [],
56
+ "legacy-ui-language-union": []
57
+ };
58
+ function isPlainObject(value) {
59
+ return typeof value === "object" && value !== null && !Array.isArray(value);
60
+ }
61
+ function ensureString(value, fieldName, { allowEmpty = false } = {}) {
62
+ if (value === undefined) {
63
+ return undefined;
64
+ }
65
+ if (typeof value !== "string") {
66
+ throw new Error(`${fieldName} must be a string.`);
67
+ }
68
+ const trimmed = value.trim();
69
+ if (!allowEmpty && trimmed.length === 0) {
70
+ throw new Error(`${fieldName} must not be empty.`);
71
+ }
72
+ return trimmed;
73
+ }
74
+ function ensureStringArray(value, fieldName) {
75
+ if (value === undefined) {
76
+ return undefined;
77
+ }
78
+ if (!Array.isArray(value)) {
79
+ throw new Error(`${fieldName} must be an array of strings.`);
80
+ }
81
+ return value.map((entry, index) => {
82
+ const validated = ensureString(entry, `${fieldName}[${index}]`);
83
+ return validated ?? "";
84
+ });
85
+ }
86
+ function dedupeStrings(values) {
87
+ const output = [];
88
+ for (const value of values) {
89
+ const trimmed = value.trim();
90
+ if (!trimmed || output.includes(trimmed)) {
91
+ continue;
92
+ }
93
+ output.push(trimmed);
94
+ }
95
+ return output;
96
+ }
97
+ function normalizeAllowlist(value, fieldName) {
98
+ if (value === undefined) {
99
+ return undefined;
100
+ }
101
+ if (!isPlainObject(value)) {
102
+ throw new Error(`${fieldName} must be a mapping of rule ids to file paths.`);
103
+ }
104
+ const output = {};
105
+ for (const [ruleId, paths] of Object.entries(value)) {
106
+ output[ruleId] = dedupeStrings(ensureStringArray(paths, `${fieldName}.${ruleId}`) ?? []);
107
+ }
108
+ return output;
109
+ }
110
+ function normalizeScanRules(value, fieldName) {
111
+ if (value === undefined) {
112
+ return undefined;
113
+ }
114
+ if (!Array.isArray(value)) {
115
+ throw new Error(`${fieldName} must be an array of rule definitions.`);
116
+ }
117
+ return value.map((entry, index) => {
118
+ if (!isPlainObject(entry)) {
119
+ throw new Error(`${fieldName}[${index}] must be a mapping.`);
120
+ }
121
+ return {
122
+ id: ensureString(entry.id, `${fieldName}[${index}].id`) ?? "",
123
+ message: ensureString(entry.message, `${fieldName}[${index}].message`) ?? "",
124
+ pattern: ensureString(entry.pattern, `${fieldName}[${index}].pattern`) ?? "",
125
+ flags: ensureString(entry.flags, `${fieldName}[${index}].flags`, {
126
+ allowEmpty: true
127
+ })
128
+ };
129
+ });
130
+ }
131
+ function parseDoctorConfig(value) {
132
+ if (value === undefined) {
133
+ return undefined;
134
+ }
135
+ if (!isPlainObject(value)) {
136
+ throw new Error("doctor must be a mapping.");
137
+ }
138
+ return {
139
+ excludedDirectories: ensureStringArray(value.excludedDirectories, "doctor.excludedDirectories"),
140
+ textFileExtensions: ensureStringArray(value.textFileExtensions, "doctor.textFileExtensions"),
141
+ excludedPathPrefixes: ensureStringArray(value.excludedPathPrefixes, "doctor.excludedPathPrefixes"),
142
+ allowlist: normalizeAllowlist(value.allowlist, "doctor.allowlist"),
143
+ scanRules: normalizeScanRules(value.scanRules, "doctor.scanRules")
144
+ };
145
+ }
146
+ function parseConfigDocument(document, configPath) {
147
+ if (document === undefined) {
148
+ return {};
149
+ }
150
+ if (!isPlainObject(document)) {
151
+ throw new Error(`Top-level YAML document in ${configPath} must be a mapping object.`);
152
+ }
153
+ return {
154
+ localesRoot: ensureString(document.localesRoot, "localesRoot"),
155
+ repoRoot: ensureString(document.repoRoot, "repoRoot"),
156
+ baseLocale: ensureString(document.baseLocale, "baseLocale"),
157
+ targetLocales: ensureStringArray(document.targetLocales, "targetLocales"),
158
+ doctor: parseDoctorConfig(document.doctor)
159
+ };
160
+ }
161
+ export async function findHagi18nConfigPath(options = {}) {
162
+ const cwd = path.resolve(options.cwd ?? process.cwd());
163
+ const explicitConfigPath = options.configPath?.trim();
164
+ if (explicitConfigPath) {
165
+ return path.resolve(cwd, explicitConfigPath);
166
+ }
167
+ for (const fileName of DEFAULT_CONFIG_FILE_NAMES) {
168
+ const candidate = path.join(cwd, fileName);
169
+ try {
170
+ await access(candidate);
171
+ return candidate;
172
+ }
173
+ catch {
174
+ continue;
175
+ }
176
+ }
177
+ return null;
178
+ }
179
+ export async function loadHagi18nConfig(options = {}) {
180
+ const cwd = path.resolve(options.cwd ?? process.cwd());
181
+ const configPath = await findHagi18nConfigPath({ ...options, cwd });
182
+ if (!configPath) {
183
+ return {
184
+ cwd,
185
+ configPath: null,
186
+ config: null
187
+ };
188
+ }
189
+ let raw;
190
+ try {
191
+ raw = await readFile(configPath, "utf8");
192
+ }
193
+ catch (error) {
194
+ const message = error instanceof Error ? error.message : String(error);
195
+ throw new Error(`Failed to read ${configPath}: ${message}`);
196
+ }
197
+ let parsed;
198
+ try {
199
+ parsed = yaml.load(raw);
200
+ }
201
+ catch (error) {
202
+ const message = error instanceof Error ? error.message : String(error);
203
+ throw new Error(`Failed to parse ${configPath}: ${message}`);
204
+ }
205
+ return {
206
+ cwd,
207
+ configPath,
208
+ config: parseConfigDocument(parsed, configPath)
209
+ };
210
+ }
211
+ function compileScanRules(rules) {
212
+ return rules.map((rule) => ({
213
+ ...rule,
214
+ regex: new RegExp(rule.pattern, rule.flags ?? "u")
215
+ }));
216
+ }
217
+ function resolveStringPath(value, baseDirectory) {
218
+ if (value === undefined) {
219
+ return undefined;
220
+ }
221
+ return path.isAbsolute(value) ? value : path.resolve(baseDirectory, value);
222
+ }
223
+ function resolveConfigLayer(config, { cwd, configPath }) {
224
+ if (!config) {
225
+ return {};
226
+ }
227
+ const baseDirectory = configPath ? path.dirname(configPath) : cwd;
228
+ return {
229
+ localesRoot: resolveStringPath(config.localesRoot, baseDirectory),
230
+ repoRoot: resolveStringPath(config.repoRoot, baseDirectory),
231
+ baseLocale: config.baseLocale?.trim(),
232
+ targetLocales: config.targetLocales
233
+ ? dedupeStrings(config.targetLocales)
234
+ : undefined,
235
+ doctor: {
236
+ excludedDirectories: config.doctor?.excludedDirectories
237
+ ? dedupeStrings(config.doctor.excludedDirectories)
238
+ : undefined,
239
+ textFileExtensions: config.doctor?.textFileExtensions
240
+ ? dedupeStrings(config.doctor.textFileExtensions)
241
+ : undefined,
242
+ excludedPathPrefixes: config.doctor?.excludedPathPrefixes
243
+ ? dedupeStrings(config.doctor.excludedPathPrefixes)
244
+ : undefined,
245
+ allowlist: config.doctor?.allowlist
246
+ ? Object.fromEntries(Object.entries(config.doctor.allowlist).map(([ruleId, filePaths]) => [
247
+ ruleId,
248
+ dedupeStrings(filePaths)
249
+ ]))
250
+ : undefined,
251
+ scanRules: config.doctor?.scanRules
252
+ ? compileScanRules(config.doctor.scanRules)
253
+ : undefined
254
+ }
255
+ };
256
+ }
257
+ function mergeAllowlists(baseAllowlist, overrideAllowlist) {
258
+ if (!overrideAllowlist) {
259
+ return { ...baseAllowlist };
260
+ }
261
+ const merged = { ...baseAllowlist };
262
+ for (const [ruleId, filePaths] of Object.entries(overrideAllowlist)) {
263
+ merged[ruleId] = dedupeStrings(filePaths);
264
+ }
265
+ return merged;
266
+ }
267
+ function mergeResolvedDoctorConfig(baseConfig, overrideConfig) {
268
+ if (!overrideConfig) {
269
+ return {
270
+ excludedDirectories: [...baseConfig.excludedDirectories],
271
+ textFileExtensions: [...baseConfig.textFileExtensions],
272
+ excludedPathPrefixes: [...baseConfig.excludedPathPrefixes],
273
+ allowlist: mergeAllowlists(baseConfig.allowlist),
274
+ scanRules: [...baseConfig.scanRules]
275
+ };
276
+ }
277
+ return {
278
+ excludedDirectories: overrideConfig.excludedDirectories
279
+ ? [...overrideConfig.excludedDirectories]
280
+ : [...baseConfig.excludedDirectories],
281
+ textFileExtensions: overrideConfig.textFileExtensions
282
+ ? [...overrideConfig.textFileExtensions]
283
+ : [...baseConfig.textFileExtensions],
284
+ excludedPathPrefixes: overrideConfig.excludedPathPrefixes
285
+ ? [...overrideConfig.excludedPathPrefixes]
286
+ : [...baseConfig.excludedPathPrefixes],
287
+ allowlist: mergeAllowlists(baseConfig.allowlist, overrideConfig.allowlist),
288
+ scanRules: overrideConfig.scanRules
289
+ ? [...overrideConfig.scanRules]
290
+ : [...baseConfig.scanRules]
291
+ };
292
+ }
293
+ function createDefaultResolvedConfig(cwd) {
294
+ return {
295
+ cwd,
296
+ configPath: null,
297
+ localesRoot: path.resolve(cwd, "src/locales"),
298
+ repoRoot: cwd,
299
+ baseLocale: DEFAULT_BASE_LOCALE,
300
+ targetLocales: [],
301
+ doctor: {
302
+ excludedDirectories: [...DEFAULT_DOCTOR_EXCLUDED_DIRECTORIES],
303
+ textFileExtensions: [...DEFAULT_DOCTOR_TEXT_FILE_EXTENSIONS],
304
+ excludedPathPrefixes: [...DEFAULT_DOCTOR_EXCLUDED_PATH_PREFIXES],
305
+ allowlist: { ...DEFAULT_DOCTOR_ALLOWLIST },
306
+ scanRules: compileScanRules(DEFAULT_DOCTOR_SCAN_RULES)
307
+ }
308
+ };
309
+ }
310
+ export async function resolveHagi18nConfig(options = {}) {
311
+ const cwd = path.resolve(options.cwd ?? process.cwd());
312
+ const loaded = await loadHagi18nConfig({
313
+ cwd,
314
+ configPath: options.configPath
315
+ });
316
+ const defaults = createDefaultResolvedConfig(cwd);
317
+ const fileLayer = resolveConfigLayer(loaded.config, loaded);
318
+ const overrideLayer = resolveConfigLayer({
319
+ localesRoot: options.localesRoot,
320
+ repoRoot: options.repoRoot,
321
+ baseLocale: options.baseLocale,
322
+ targetLocales: options.targetLocales,
323
+ doctor: options.doctor
324
+ }, {
325
+ cwd,
326
+ configPath: null
327
+ });
328
+ const mergedDoctor = mergeResolvedDoctorConfig(mergeResolvedDoctorConfig(defaults.doctor, fileLayer.doctor), overrideLayer.doctor);
329
+ return {
330
+ cwd,
331
+ configPath: loaded.configPath,
332
+ localesRoot: overrideLayer.localesRoot ?? fileLayer.localesRoot ?? defaults.localesRoot,
333
+ repoRoot: overrideLayer.repoRoot ?? fileLayer.repoRoot ?? defaults.repoRoot,
334
+ baseLocale: overrideLayer.baseLocale ?? fileLayer.baseLocale ?? defaults.baseLocale,
335
+ targetLocales: overrideLayer.targetLocales ??
336
+ fileLayer.targetLocales ??
337
+ defaults.targetLocales,
338
+ doctor: mergedDoctor
339
+ };
340
+ }
341
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { DEFAULT_BASE_LOCALE, DEFAULT_CONFIG_FILE_NAMES, DEFAULT_DOCTOR_ALLOWLIST, DEFAULT_DOCTOR_EXCLUDED_DIRECTORIES, DEFAULT_DOCTOR_EXCLUDED_PATH_PREFIXES, DEFAULT_DOCTOR_SCAN_RULES, DEFAULT_DOCTOR_TEXT_FILE_EXTENSIONS, findHagi18nConfigPath, loadHagi18nConfig, resolveHagi18nConfig, type DoctorScanRuleConfig, type Hagi18nConfig, type Hagi18nDoctorConfig, type LoadHagi18nConfigOptions, type LoadHagi18nConfigResult, type ResolvedDoctorScanRule, type ResolvedHagi18nConfig, type ResolvedHagi18nDoctorConfig, type ResolveHagi18nConfigOptions } from "./config.js";
2
+ export { auditHasIssues, auditLocaleTree, collectPlaceholderDifferences, collectPlaceholders, collectScalarPaths, createAuditResult, difference, doctorLocaleTree, formatAuditSummary, formatDoctorSummary, formatMutationSummary, listLocaleDirectories, normalizeLocaleName, pruneLocaleTree, readYamlLocaleFile, syncLocaleTree, walkYamlFiles, type AuditLocaleResult, type AuditLocaleTreeSummary, type DoctorLocaleTreeSummary, type DoctorRuleIssue, type LocaleMutationParseError, type LocaleParseError, type LocalePathIssue, type LocalePlaceholderMismatch, type LocaleToolkitOptions, type MutationChangedFile, type MutationLocaleToolkitOptions, type MutationRemovedFile, type MutationSummary, type MutationTotals, type YamlLocaleDocument } from "./locale-toolkit.js";
3
+ export { getPackageMetadata, packageName, packageVersion, type PackageMetadata } from "./version.js";
4
+ export interface Hagi18nRuntimeInfo {
5
+ packageName: string;
6
+ version: string;
7
+ status: "foundation";
8
+ }
9
+ export declare function createRuntimeInfo(): Hagi18nRuntimeInfo;
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ import { packageName, packageVersion } from "./version.js";
2
+ export { DEFAULT_BASE_LOCALE, DEFAULT_CONFIG_FILE_NAMES, DEFAULT_DOCTOR_ALLOWLIST, DEFAULT_DOCTOR_EXCLUDED_DIRECTORIES, DEFAULT_DOCTOR_EXCLUDED_PATH_PREFIXES, DEFAULT_DOCTOR_SCAN_RULES, DEFAULT_DOCTOR_TEXT_FILE_EXTENSIONS, findHagi18nConfigPath, loadHagi18nConfig, resolveHagi18nConfig } from "./config.js";
3
+ export { auditHasIssues, auditLocaleTree, collectPlaceholderDifferences, collectPlaceholders, collectScalarPaths, createAuditResult, difference, doctorLocaleTree, formatAuditSummary, formatDoctorSummary, formatMutationSummary, listLocaleDirectories, normalizeLocaleName, pruneLocaleTree, readYamlLocaleFile, syncLocaleTree, walkYamlFiles } from "./locale-toolkit.js";
4
+ export { getPackageMetadata, packageName, packageVersion } from "./version.js";
5
+ export function createRuntimeInfo() {
6
+ return {
7
+ packageName,
8
+ version: packageVersion,
9
+ status: "foundation"
10
+ };
11
+ }
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EACL,mBAAmB,EACnB,yBAAyB,EACzB,wBAAwB,EACxB,mCAAmC,EACnC,qCAAqC,EACrC,yBAAyB,EACzB,mCAAmC,EACnC,qBAAqB,EACrB,iBAAiB,EACjB,oBAAoB,EAUrB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,cAAc,EACd,eAAe,EACf,6BAA6B,EAC7B,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,qBAAqB,EACrB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,aAAa,EAgBd,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,cAAc,EAEf,MAAM,cAAc,CAAC;AAQtB,MAAM,UAAU,iBAAiB;IAC/B,OAAO;QACL,WAAW;QACX,OAAO,EAAE,cAAc;QACvB,MAAM,EAAE,YAAY;KACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,113 @@
1
+ import { type ResolveHagi18nConfigOptions } from "./config.js";
2
+ export interface YamlLocaleDocument {
3
+ absolutePath: string;
4
+ raw: string;
5
+ data: Record<string, unknown>;
6
+ }
7
+ export interface LocaleParseError {
8
+ file: string;
9
+ message: string;
10
+ }
11
+ export interface LocaleMutationParseError extends LocaleParseError {
12
+ locale: string;
13
+ }
14
+ export interface LocalePathIssue {
15
+ file: string;
16
+ path: string;
17
+ }
18
+ export interface LocalePlaceholderMismatch extends LocalePathIssue {
19
+ expected: string[];
20
+ actual: string[];
21
+ }
22
+ export interface AuditLocaleResult {
23
+ locale: string;
24
+ missingFiles: string[];
25
+ extraFiles: string[];
26
+ filesWithProtectedTokens: string[];
27
+ parseErrors: LocaleParseError[];
28
+ missingKeys: LocalePathIssue[];
29
+ extraKeys: LocalePathIssue[];
30
+ placeholderMismatches: LocalePlaceholderMismatch[];
31
+ }
32
+ export interface AuditLocaleTreeSummary {
33
+ localesRoot: string;
34
+ baseLocale: string;
35
+ locales: string[];
36
+ allLocales: string[];
37
+ baseFileCount: number;
38
+ results: AuditLocaleResult[];
39
+ hasIssues: boolean;
40
+ }
41
+ export interface MutationChangedFile {
42
+ locale: string;
43
+ file: string;
44
+ action: "create" | "update";
45
+ addedPaths?: string[];
46
+ removedPaths?: string[];
47
+ }
48
+ export interface MutationRemovedFile {
49
+ locale: string;
50
+ file: string;
51
+ action: "remove-file";
52
+ }
53
+ export interface MutationTotals {
54
+ createdFiles: number;
55
+ updatedFiles: number;
56
+ removedFiles: number;
57
+ addedPaths: number;
58
+ removedPaths: number;
59
+ }
60
+ export interface MutationSummary {
61
+ command: "sync" | "prune";
62
+ localesRoot: string;
63
+ baseLocale: string;
64
+ targetLocales: string[];
65
+ dryRun: boolean;
66
+ changedFiles: MutationChangedFile[];
67
+ removedFiles: MutationRemovedFile[];
68
+ parseErrors: LocaleMutationParseError[];
69
+ totals: MutationTotals;
70
+ hasIssues: boolean;
71
+ }
72
+ export interface DoctorRuleIssue {
73
+ ruleId: string;
74
+ file: string;
75
+ line: number;
76
+ message: string;
77
+ snippet: string;
78
+ }
79
+ export interface DoctorLocaleTreeSummary {
80
+ repoRoot: string;
81
+ localesRoot: string;
82
+ baseLocale: string;
83
+ locales: string[];
84
+ audit: AuditLocaleTreeSummary;
85
+ legacyReferenceIssues: DoctorRuleIssue[];
86
+ totals: {
87
+ legacyReferenceIssues: number;
88
+ affectedFiles: number;
89
+ };
90
+ hasIssues: boolean;
91
+ }
92
+ export interface LocaleToolkitOptions extends ResolveHagi18nConfigOptions {
93
+ }
94
+ export interface MutationLocaleToolkitOptions extends LocaleToolkitOptions {
95
+ dryRun?: boolean;
96
+ }
97
+ export declare function normalizeLocaleName(value: unknown): string | null;
98
+ export declare function listLocaleDirectories(localesRoot: string): Promise<string[]>;
99
+ export declare function walkYamlFiles(directory: string, prefix?: string): Promise<string[]>;
100
+ export declare function readYamlLocaleFile(localesRoot: string, locale: string, relativeFilePath: string): Promise<YamlLocaleDocument>;
101
+ export declare function collectScalarPaths(value: unknown, prefix?: string[], output?: string[]): string[];
102
+ export declare function collectPlaceholders(value: unknown, prefix?: string[], output?: Map<string, string[]>): Map<string, string[]>;
103
+ export declare function difference(source: string[], other: string[]): string[];
104
+ export declare function collectPlaceholderDifferences(basePlaceholders: Map<string, string[]>, currentPlaceholders: Map<string, string[]>): Array<Omit<LocalePlaceholderMismatch, "file">>;
105
+ export declare function createAuditResult(locale: string): AuditLocaleResult;
106
+ export declare function auditHasIssues(result: AuditLocaleResult): boolean;
107
+ export declare function auditLocaleTree(options?: LocaleToolkitOptions): Promise<AuditLocaleTreeSummary>;
108
+ export declare function syncLocaleTree(options?: MutationLocaleToolkitOptions): Promise<MutationSummary>;
109
+ export declare function pruneLocaleTree(options?: MutationLocaleToolkitOptions): Promise<MutationSummary>;
110
+ export declare function doctorLocaleTree(options?: LocaleToolkitOptions): Promise<DoctorLocaleTreeSummary>;
111
+ export declare function formatAuditSummary(summary: AuditLocaleTreeSummary): string;
112
+ export declare function formatMutationSummary(summary: MutationSummary): string;
113
+ export declare function formatDoctorSummary(summary: DoctorLocaleTreeSummary): string;