i18next-cli 1.50.2 → 1.50.4
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/cjs/cli.js +1 -1
- package/dist/cjs/extractor/core/translation-manager.js +2 -17
- package/dist/cjs/extractor/parsers/call-expression-handler.js +24 -9
- package/dist/cjs/extractor/parsers/comment-parser.js +15 -9
- package/dist/cjs/extractor/parsers/jsx-handler.js +8 -3
- package/dist/cjs/status.js +111 -46
- package/dist/esm/cli.js +1 -1
- package/dist/esm/extractor/core/translation-manager.js +2 -17
- package/dist/esm/extractor/parsers/call-expression-handler.js +24 -9
- package/dist/esm/extractor/parsers/comment-parser.js +15 -9
- package/dist/esm/extractor/parsers/jsx-handler.js +8 -3
- package/dist/esm/status.js +111 -46
- package/package.json +6 -6
- package/types/extractor/core/translation-manager.d.ts.map +1 -1
- package/types/extractor/parsers/call-expression-handler.d.ts.map +1 -1
- package/types/extractor/parsers/comment-parser.d.ts.map +1 -1
- package/types/extractor/parsers/jsx-handler.d.ts.map +1 -1
- package/types/status.d.ts +5 -0
- package/types/status.d.ts.map +1 -1
- package/types/types.d.ts +8 -0
- package/types/types.d.ts.map +1 -1
package/dist/cjs/cli.js
CHANGED
|
@@ -31,7 +31,7 @@ const program = new commander.Command();
|
|
|
31
31
|
program
|
|
32
32
|
.name('i18next-cli')
|
|
33
33
|
.description('A unified, high-performance i18next CLI.')
|
|
34
|
-
.version('1.50.
|
|
34
|
+
.version('1.50.4'); // This string is replaced with the actual version at build time by rollup
|
|
35
35
|
// new: global config override option
|
|
36
36
|
program.option('-c, --config <path>', 'Path to i18next-cli config file (overrides detection)');
|
|
37
37
|
program
|
|
@@ -809,29 +809,14 @@ async function getTranslations(keys, objectKeys, config, { syncPrimaryWithDefaul
|
|
|
809
809
|
// namespace (internally we keep implicit keys as 'translation').
|
|
810
810
|
const NO_NS_TOKEN = '__no_namespace__';
|
|
811
811
|
const keysByNS = new Map();
|
|
812
|
-
const nsSep = typeof config.extract.nsSeparator === 'string' ? config.extract.nsSeparator : ':';
|
|
813
|
-
const nsNaturalLanguageRegex = new RegExp(`(${chars.map((c) => (c === '?' ? '\\?' : c)).join('|')})`);
|
|
814
812
|
for (const k of keys.values()) {
|
|
815
|
-
|
|
816
|
-
let key = k.key;
|
|
817
|
-
// Fix for incorrect splitting of natural language keys containing nsSeparator
|
|
818
|
-
// If the namespace contains spaces or looks like natural language, assume it was split incorrectly
|
|
819
|
-
// and rejoin it with the key.
|
|
820
|
-
if (ns && nsNaturalLanguageRegex.test(ns)) {
|
|
821
|
-
key = `${ns}${nsSep}${key}`;
|
|
822
|
-
ns = undefined;
|
|
823
|
-
}
|
|
813
|
+
const ns = k.ns;
|
|
824
814
|
const nsKey = (k.nsIsImplicit && config.extract.defaultNS === false)
|
|
825
815
|
? NO_NS_TOKEN
|
|
826
816
|
: String(ns ?? (config.extract.defaultNS ?? 'translation'));
|
|
827
817
|
if (!keysByNS.has(nsKey))
|
|
828
818
|
keysByNS.set(nsKey, []);
|
|
829
|
-
|
|
830
|
-
keysByNS.get(nsKey).push({ ...k, ns, key });
|
|
831
|
-
}
|
|
832
|
-
else {
|
|
833
|
-
keysByNS.get(nsKey).push(k);
|
|
834
|
-
}
|
|
819
|
+
keysByNS.get(nsKey).push(k);
|
|
835
820
|
}
|
|
836
821
|
// Filter out ignored namespaces
|
|
837
822
|
const ignoreNamespaces = new Set(config.extract.ignoreNamespaces ?? []);
|
|
@@ -4,6 +4,10 @@ var astUtils = require('./ast-utils.js');
|
|
|
4
4
|
|
|
5
5
|
// Helper to escape regex characters
|
|
6
6
|
const escapeRegex = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
7
|
+
// Checks if a string looks like natural language (contains spaces, punctuation, etc.)
|
|
8
|
+
// Used to prevent splitting keys like "Error message: not found" into namespace + key.
|
|
9
|
+
const naturalLanguageChars = /[ ,?!;]/;
|
|
10
|
+
const looksLikeNaturalLanguage = (s) => naturalLanguageChars.test(s);
|
|
7
11
|
class CallExpressionHandler {
|
|
8
12
|
pluginContext;
|
|
9
13
|
config;
|
|
@@ -162,11 +166,16 @@ class CallExpressionHandler {
|
|
|
162
166
|
const nsSeparator = this.config.extract.nsSeparator ?? ':';
|
|
163
167
|
if (!ns && nsSeparator && key.includes(nsSeparator)) {
|
|
164
168
|
const parts = key.split(nsSeparator);
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
169
|
+
const candidateNs = parts[0];
|
|
170
|
+
// If the candidate namespace looks like natural language (contains spaces,
|
|
171
|
+
// punctuation), assume the separator is part of the key text, not a namespace delimiter.
|
|
172
|
+
if (!looksLikeNaturalLanguage(candidateNs)) {
|
|
173
|
+
ns = parts.shift();
|
|
174
|
+
key = parts.join(nsSeparator);
|
|
175
|
+
if (!key || key.trim() === '') {
|
|
176
|
+
this.logger.warn(`Skipping key that became empty after namespace removal: '${ns}${nsSeparator}'`);
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
170
179
|
}
|
|
171
180
|
}
|
|
172
181
|
if (!ns && scopeInfo?.defaultNs)
|
|
@@ -491,10 +500,16 @@ class CallExpressionHandler {
|
|
|
491
500
|
const nsSeparator = this.config.extract.nsSeparator ?? ':';
|
|
492
501
|
if (nsSeparator && key.includes(nsSeparator)) {
|
|
493
502
|
const parts = key.split(nsSeparator);
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
503
|
+
const candidateNs = parts[0];
|
|
504
|
+
if (!looksLikeNaturalLanguage(candidateNs)) {
|
|
505
|
+
nestedNs = parts.shift();
|
|
506
|
+
key = parts.join(nsSeparator);
|
|
507
|
+
if (!key || key.trim() === '')
|
|
508
|
+
return;
|
|
509
|
+
}
|
|
510
|
+
else {
|
|
511
|
+
nestedNs = this.config.extract.defaultNS;
|
|
512
|
+
}
|
|
498
513
|
}
|
|
499
514
|
else {
|
|
500
515
|
nestedNs = this.config.extract.defaultNS;
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
// Checks if a string looks like natural language (contains spaces, punctuation, etc.)
|
|
4
|
+
const naturalLanguageChars = /[ ,?!;]/;
|
|
5
|
+
const looksLikeNaturalLanguage = (s) => naturalLanguageChars.test(s);
|
|
3
6
|
/**
|
|
4
7
|
* Extracts translation keys from comments in source code using regex patterns.
|
|
5
8
|
* Supports extraction from single-line (//) and multi-line comments.
|
|
@@ -88,15 +91,18 @@ function extractKeysFromComments(code, pluginContext, config, scopeResolver) {
|
|
|
88
91
|
const nsSeparator = config.extract.nsSeparator ?? ':';
|
|
89
92
|
if (!ns && nsSeparator && key.includes(nsSeparator)) {
|
|
90
93
|
const parts = key.split(nsSeparator);
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
94
|
+
// If the candidate namespace looks like natural language, don't split
|
|
95
|
+
if (!looksLikeNaturalLanguage(parts[0])) {
|
|
96
|
+
ns = parts.shift();
|
|
97
|
+
key = parts.join(nsSeparator);
|
|
98
|
+
// Validate that the key didn't become empty after namespace removal
|
|
99
|
+
if (!key || key.trim() === '') {
|
|
100
|
+
continue; // Skip keys that become empty after namespace removal
|
|
101
|
+
}
|
|
102
|
+
// Re-check preservePatterns after namespace processing (namespace-aware)
|
|
103
|
+
if (matchesPreserve(key, ns)) {
|
|
104
|
+
continue; // Skip processed keys that match preserve patterns
|
|
105
|
+
}
|
|
100
106
|
}
|
|
101
107
|
}
|
|
102
108
|
// 3. If no explicit namespace found, try to resolve from scope
|
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
var jsxParser = require('./jsx-parser.js');
|
|
4
4
|
var astUtils = require('./ast-utils.js');
|
|
5
5
|
|
|
6
|
+
// Checks if a string looks like natural language (contains spaces, punctuation, etc.)
|
|
7
|
+
const naturalLanguageChars = /[ ,?!;]/;
|
|
8
|
+
const looksLikeNaturalLanguage = (s) => naturalLanguageChars.test(s);
|
|
6
9
|
class JSXHandler {
|
|
7
10
|
config;
|
|
8
11
|
pluginContext;
|
|
@@ -87,9 +90,11 @@ class JSXHandler {
|
|
|
87
90
|
// If the key contains a namespace separator, it takes precedence
|
|
88
91
|
// over the default t ns value
|
|
89
92
|
if (nsSeparator && key.includes(nsSeparator)) {
|
|
90
|
-
|
|
91
|
-
([
|
|
92
|
-
|
|
93
|
+
const parts = key.split(nsSeparator);
|
|
94
|
+
if (!looksLikeNaturalLanguage(parts[0])) {
|
|
95
|
+
ns = parts.shift();
|
|
96
|
+
key = parts.join(nsSeparator);
|
|
97
|
+
}
|
|
93
98
|
}
|
|
94
99
|
return {
|
|
95
100
|
key,
|
package/dist/cjs/status.js
CHANGED
|
@@ -12,6 +12,13 @@ var fileUtils = require('./utils/file-utils.js');
|
|
|
12
12
|
var funnelMsgTracker = require('./utils/funnel-msg-tracker.js');
|
|
13
13
|
require('./extractor/parsers/jsx-parser.js');
|
|
14
14
|
|
|
15
|
+
function classifyValue(value) {
|
|
16
|
+
if (value === undefined || value === null)
|
|
17
|
+
return 'absent';
|
|
18
|
+
if (value === '')
|
|
19
|
+
return 'empty';
|
|
20
|
+
return 'translated';
|
|
21
|
+
}
|
|
15
22
|
/**
|
|
16
23
|
* Runs a health check on the project's i18next translations and displays a status report.
|
|
17
24
|
*
|
|
@@ -22,6 +29,11 @@ require('./extractor/parsers/jsx-parser.js');
|
|
|
22
29
|
* 4. Displaying a formatted report with key counts, locales, and progress bars.
|
|
23
30
|
* 5. Serving as a value-driven funnel to introduce the locize commercial service.
|
|
24
31
|
*
|
|
32
|
+
* Exit behaviour (unchanged): exits 1 when any key is either empty or absent.
|
|
33
|
+
* The output now distinguishes between the two states so developers can tell
|
|
34
|
+
* whether they have a structural problem (absent) or simply pending translation
|
|
35
|
+
* work (empty).
|
|
36
|
+
*
|
|
25
37
|
* @param config - The i18next toolkit configuration object.
|
|
26
38
|
* @param options - Options object, may contain a `detail` property with a locale string.
|
|
27
39
|
* @throws {Error} When unable to extract keys or read translation files
|
|
@@ -42,7 +54,7 @@ async function runStatus(config, options = {}) {
|
|
|
42
54
|
}
|
|
43
55
|
}
|
|
44
56
|
if (hasMissing) {
|
|
45
|
-
spinner.fail('Error:
|
|
57
|
+
spinner.fail('Error: Incomplete translations detected.');
|
|
46
58
|
process.exit(1);
|
|
47
59
|
}
|
|
48
60
|
}
|
|
@@ -94,6 +106,8 @@ async function generateStatusReport(config) {
|
|
|
94
106
|
};
|
|
95
107
|
for (const locale of secondaryLanguages) {
|
|
96
108
|
let totalTranslatedForLocale = 0;
|
|
109
|
+
let totalEmptyForLocale = 0;
|
|
110
|
+
let totalAbsentForLocale = 0;
|
|
97
111
|
let totalKeysForLocale = 0;
|
|
98
112
|
const namespaces = new Map();
|
|
99
113
|
const mergedTranslations = mergeNamespaces
|
|
@@ -120,6 +134,8 @@ async function generateStatusReport(config) {
|
|
|
120
134
|
}
|
|
121
135
|
}
|
|
122
136
|
let translatedInNs = 0;
|
|
137
|
+
let emptyInNs = 0;
|
|
138
|
+
let absentInNs = 0;
|
|
123
139
|
let totalInNs = 0;
|
|
124
140
|
const keyDetails = [];
|
|
125
141
|
// Get the plural categories for THIS specific locale
|
|
@@ -135,6 +151,26 @@ async function generateStatusReport(config) {
|
|
|
135
151
|
return fallbackRules.resolvedOptions().pluralCategories;
|
|
136
152
|
}
|
|
137
153
|
};
|
|
154
|
+
/**
|
|
155
|
+
* Resolves the value for a single key, applying the fallback namespace when
|
|
156
|
+
* configured, and classifies it as translated / empty / absent.
|
|
157
|
+
*
|
|
158
|
+
* The fallback is only consulted when the primary value is absent — an empty
|
|
159
|
+
* string is a deliberate placeholder written by `extract` and should not be
|
|
160
|
+
* silently replaced by a fallback value.
|
|
161
|
+
*/
|
|
162
|
+
const resolveAndClassify = (key) => {
|
|
163
|
+
const sep = keySeparator ?? '.';
|
|
164
|
+
const primaryValue = nestedObject.getNestedValue(translationsForNs, key, sep);
|
|
165
|
+
const primaryState = classifyValue(primaryValue);
|
|
166
|
+
// Only fall back when the key is genuinely absent from the primary file.
|
|
167
|
+
// An empty string is intentional (placeholder from extract) — don't hide it.
|
|
168
|
+
if (primaryState === 'absent' && fallbackTranslations) {
|
|
169
|
+
const fallbackValue = nestedObject.getNestedValue(fallbackTranslations, key, sep);
|
|
170
|
+
return classifyValue(fallbackValue);
|
|
171
|
+
}
|
|
172
|
+
return primaryState;
|
|
173
|
+
};
|
|
138
174
|
for (const { key: baseKey, hasCount, isOrdinal, isExpandedPlural } of keysInNs) {
|
|
139
175
|
if (hasCount) {
|
|
140
176
|
if (isExpandedPlural) {
|
|
@@ -150,15 +186,14 @@ async function generateStatusReport(config) {
|
|
|
150
186
|
// Only count this key if it's a plural form used by this locale
|
|
151
187
|
if (localePluralCategories.includes(category)) {
|
|
152
188
|
totalInNs++;
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
if (!value && fallbackTranslations) {
|
|
156
|
-
value = nestedObject.getNestedValue(fallbackTranslations, baseKey, keySeparator ?? '.');
|
|
157
|
-
}
|
|
158
|
-
const isTranslated = !!value;
|
|
159
|
-
if (isTranslated)
|
|
189
|
+
const state = resolveAndClassify(baseKey);
|
|
190
|
+
if (state === 'translated')
|
|
160
191
|
translatedInNs++;
|
|
161
|
-
|
|
192
|
+
else if (state === 'empty')
|
|
193
|
+
emptyInNs++;
|
|
194
|
+
else
|
|
195
|
+
absentInNs++;
|
|
196
|
+
keyDetails.push({ key: baseKey, state });
|
|
162
197
|
}
|
|
163
198
|
}
|
|
164
199
|
else {
|
|
@@ -170,40 +205,57 @@ async function generateStatusReport(config) {
|
|
|
170
205
|
const pluralKey = isOrdinal
|
|
171
206
|
? `${baseKey}${pluralSeparator}ordinal${pluralSeparator}${category}`
|
|
172
207
|
: `${baseKey}${pluralSeparator}${category}`;
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
if (!value && fallbackTranslations) {
|
|
176
|
-
value = nestedObject.getNestedValue(fallbackTranslations, pluralKey, keySeparator ?? '.');
|
|
177
|
-
}
|
|
178
|
-
const isTranslated = !!value;
|
|
179
|
-
if (isTranslated)
|
|
208
|
+
const state = resolveAndClassify(pluralKey);
|
|
209
|
+
if (state === 'translated')
|
|
180
210
|
translatedInNs++;
|
|
181
|
-
|
|
211
|
+
else if (state === 'empty')
|
|
212
|
+
emptyInNs++;
|
|
213
|
+
else
|
|
214
|
+
absentInNs++;
|
|
215
|
+
keyDetails.push({ key: pluralKey, state });
|
|
182
216
|
}
|
|
183
217
|
}
|
|
184
218
|
}
|
|
185
219
|
else {
|
|
186
|
-
// It's a simple key
|
|
187
220
|
totalInNs++;
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
if (!value && fallbackTranslations) {
|
|
191
|
-
value = nestedObject.getNestedValue(fallbackTranslations, baseKey, keySeparator ?? '.');
|
|
192
|
-
}
|
|
193
|
-
const isTranslated = !!value;
|
|
194
|
-
if (isTranslated)
|
|
221
|
+
const state = resolveAndClassify(baseKey);
|
|
222
|
+
if (state === 'translated')
|
|
195
223
|
translatedInNs++;
|
|
196
|
-
|
|
224
|
+
else if (state === 'empty')
|
|
225
|
+
emptyInNs++;
|
|
226
|
+
else
|
|
227
|
+
absentInNs++;
|
|
228
|
+
keyDetails.push({ key: baseKey, state });
|
|
197
229
|
}
|
|
198
230
|
}
|
|
199
|
-
namespaces.set(ns, { totalKeys: totalInNs, translatedKeys: translatedInNs, keyDetails });
|
|
231
|
+
namespaces.set(ns, { totalKeys: totalInNs, translatedKeys: translatedInNs, emptyKeys: emptyInNs, absentKeys: absentInNs, keyDetails });
|
|
200
232
|
totalTranslatedForLocale += translatedInNs;
|
|
233
|
+
totalEmptyForLocale += emptyInNs;
|
|
234
|
+
totalAbsentForLocale += absentInNs;
|
|
201
235
|
totalKeysForLocale += totalInNs;
|
|
202
236
|
}
|
|
203
|
-
report.locales.set(locale, {
|
|
237
|
+
report.locales.set(locale, {
|
|
238
|
+
totalKeys: totalKeysForLocale,
|
|
239
|
+
totalTranslated: totalTranslatedForLocale,
|
|
240
|
+
totalEmpty: totalEmptyForLocale,
|
|
241
|
+
totalAbsent: totalAbsentForLocale,
|
|
242
|
+
namespaces,
|
|
243
|
+
});
|
|
204
244
|
}
|
|
205
245
|
return report;
|
|
206
246
|
}
|
|
247
|
+
/**
|
|
248
|
+
* Builds a compact breakdown string like "3 untranslated, 2 absent" for use in
|
|
249
|
+
* summary lines. Returns an empty string when there is nothing to report.
|
|
250
|
+
*/
|
|
251
|
+
function buildBreakdown(emptyCount, absentCount) {
|
|
252
|
+
const parts = [];
|
|
253
|
+
if (emptyCount > 0)
|
|
254
|
+
parts.push(node_util.styleText('yellow', `${emptyCount} untranslated`));
|
|
255
|
+
if (absentCount > 0)
|
|
256
|
+
parts.push(node_util.styleText('red', `${absentCount} absent`));
|
|
257
|
+
return parts.join(', ');
|
|
258
|
+
}
|
|
207
259
|
/**
|
|
208
260
|
* Main display router that calls the appropriate display function based on options.
|
|
209
261
|
*
|
|
@@ -230,17 +282,10 @@ async function displayStatusReport(report, config, options) {
|
|
|
230
282
|
/**
|
|
231
283
|
* Displays the detailed, grouped report for a single locale.
|
|
232
284
|
*
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
*
|
|
236
|
-
*
|
|
237
|
-
* - Summary message with total missing translations
|
|
238
|
-
*
|
|
239
|
-
* @param report - The generated status report data
|
|
240
|
-
* @param config - The i18next toolkit configuration object
|
|
241
|
-
* @param locale - The locale code to display details for
|
|
242
|
-
* @param namespaceFilter - Optional namespace to filter the display
|
|
243
|
-
* @param hideTranslated - When true, only untranslated keys are shown
|
|
285
|
+
* Key status icons:
|
|
286
|
+
* ✓ green — translated
|
|
287
|
+
* ~ yellow — present in file but empty (needs translation)
|
|
288
|
+
* ✗ red — absent from file entirely (structural problem)
|
|
244
289
|
*/
|
|
245
290
|
async function displayDetailedLocaleReport(report, config, locale, namespaceFilter, hideTranslated) {
|
|
246
291
|
if (locale === config.extract.primaryLanguage) {
|
|
@@ -259,6 +304,9 @@ async function displayDetailedLocaleReport(report, config, locale, namespaceFilt
|
|
|
259
304
|
console.log(node_util.styleText('bold', `\nKey Status for "${node_util.styleText('cyan', locale)}":`));
|
|
260
305
|
const totalKeysForLocale = localeData.totalKeys;
|
|
261
306
|
printProgressBar('Overall', localeData.totalTranslated, totalKeysForLocale);
|
|
307
|
+
const breakdown = buildBreakdown(localeData.totalEmpty, localeData.totalAbsent);
|
|
308
|
+
if (breakdown)
|
|
309
|
+
console.log(` ${breakdown}`);
|
|
262
310
|
const namespacesToDisplay = namespaceFilter ? [namespaceFilter] : Array.from(localeData.namespaces.keys()).sort();
|
|
263
311
|
for (const ns of namespacesToDisplay) {
|
|
264
312
|
const nsData = localeData.namespaces.get(ns);
|
|
@@ -266,15 +314,28 @@ async function displayDetailedLocaleReport(report, config, locale, namespaceFilt
|
|
|
266
314
|
continue;
|
|
267
315
|
console.log(node_util.styleText(['cyan', 'bold'], `\nNamespace: ${ns}`));
|
|
268
316
|
printProgressBar('Namespace Progress', nsData.translatedKeys, nsData.totalKeys);
|
|
269
|
-
const
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
317
|
+
const nsBreakdown = buildBreakdown(nsData.emptyKeys, nsData.absentKeys);
|
|
318
|
+
if (nsBreakdown)
|
|
319
|
+
console.log(` ${nsBreakdown}`);
|
|
320
|
+
const keysToDisplay = hideTranslated
|
|
321
|
+
? nsData.keyDetails.filter(({ state }) => state !== 'translated')
|
|
322
|
+
: nsData.keyDetails;
|
|
323
|
+
keysToDisplay.forEach(({ key, state }) => {
|
|
324
|
+
if (state === 'translated') {
|
|
325
|
+
console.log(` ${node_util.styleText('green', '✓')} ${key}`);
|
|
326
|
+
}
|
|
327
|
+
else if (state === 'empty') {
|
|
328
|
+
console.log(` ${node_util.styleText('yellow', '~')} ${key} ${node_util.styleText('yellow', '(untranslated)')}`);
|
|
329
|
+
}
|
|
330
|
+
else {
|
|
331
|
+
console.log(` ${node_util.styleText('red', '✗')} ${key} ${node_util.styleText('red', '(absent)')}`);
|
|
332
|
+
}
|
|
273
333
|
});
|
|
274
334
|
}
|
|
275
335
|
const missingCount = totalKeysForLocale - localeData.totalTranslated;
|
|
276
336
|
if (missingCount > 0) {
|
|
277
|
-
|
|
337
|
+
const summaryBreakdown = buildBreakdown(localeData.totalEmpty, localeData.totalAbsent);
|
|
338
|
+
console.log(node_util.styleText(['yellow', 'bold'], `\nSummary: Found ${missingCount} incomplete translations for "${locale}" — ${summaryBreakdown}.`));
|
|
278
339
|
}
|
|
279
340
|
else {
|
|
280
341
|
console.log(node_util.styleText(['green', 'bold'], `\nSummary: 🎉 All keys are translated for "${locale}".`));
|
|
@@ -304,7 +365,9 @@ async function displayNamespaceSummaryReport(report, config, namespace) {
|
|
|
304
365
|
if (nsLocaleData) {
|
|
305
366
|
const percentage = nsLocaleData.totalKeys > 0 ? Math.round((nsLocaleData.translatedKeys / nsLocaleData.totalKeys) * 100) : 100;
|
|
306
367
|
const bar = generateProgressBarText(percentage);
|
|
307
|
-
|
|
368
|
+
const breakdown = buildBreakdown(nsLocaleData.emptyKeys, nsLocaleData.absentKeys);
|
|
369
|
+
const suffix = breakdown ? ` — ${breakdown}` : '';
|
|
370
|
+
console.log(`- ${locale}: ${bar} ${percentage}% (${nsLocaleData.translatedKeys}/${nsLocaleData.totalKeys} keys)${suffix}`);
|
|
308
371
|
}
|
|
309
372
|
}
|
|
310
373
|
await printLocizeFunnel();
|
|
@@ -333,7 +396,9 @@ async function displayOverallSummaryReport(report, config) {
|
|
|
333
396
|
for (const [locale, localeData] of report.locales.entries()) {
|
|
334
397
|
const percentage = localeData.totalKeys > 0 ? Math.round((localeData.totalTranslated / localeData.totalKeys) * 100) : 100;
|
|
335
398
|
const bar = generateProgressBarText(percentage);
|
|
336
|
-
|
|
399
|
+
const breakdown = buildBreakdown(localeData.totalEmpty, localeData.totalAbsent);
|
|
400
|
+
const suffix = breakdown ? ` — ${breakdown}` : '';
|
|
401
|
+
console.log(`- ${locale}: ${bar} ${percentage}% (${localeData.totalTranslated}/${localeData.totalKeys} keys)${suffix}`);
|
|
337
402
|
}
|
|
338
403
|
await printLocizeFunnel();
|
|
339
404
|
}
|
package/dist/esm/cli.js
CHANGED
|
@@ -29,7 +29,7 @@ const program = new Command();
|
|
|
29
29
|
program
|
|
30
30
|
.name('i18next-cli')
|
|
31
31
|
.description('A unified, high-performance i18next CLI.')
|
|
32
|
-
.version('1.50.
|
|
32
|
+
.version('1.50.4'); // This string is replaced with the actual version at build time by rollup
|
|
33
33
|
// new: global config override option
|
|
34
34
|
program.option('-c, --config <path>', 'Path to i18next-cli config file (overrides detection)');
|
|
35
35
|
program
|
|
@@ -807,29 +807,14 @@ async function getTranslations(keys, objectKeys, config, { syncPrimaryWithDefaul
|
|
|
807
807
|
// namespace (internally we keep implicit keys as 'translation').
|
|
808
808
|
const NO_NS_TOKEN = '__no_namespace__';
|
|
809
809
|
const keysByNS = new Map();
|
|
810
|
-
const nsSep = typeof config.extract.nsSeparator === 'string' ? config.extract.nsSeparator : ':';
|
|
811
|
-
const nsNaturalLanguageRegex = new RegExp(`(${chars.map((c) => (c === '?' ? '\\?' : c)).join('|')})`);
|
|
812
810
|
for (const k of keys.values()) {
|
|
813
|
-
|
|
814
|
-
let key = k.key;
|
|
815
|
-
// Fix for incorrect splitting of natural language keys containing nsSeparator
|
|
816
|
-
// If the namespace contains spaces or looks like natural language, assume it was split incorrectly
|
|
817
|
-
// and rejoin it with the key.
|
|
818
|
-
if (ns && nsNaturalLanguageRegex.test(ns)) {
|
|
819
|
-
key = `${ns}${nsSep}${key}`;
|
|
820
|
-
ns = undefined;
|
|
821
|
-
}
|
|
811
|
+
const ns = k.ns;
|
|
822
812
|
const nsKey = (k.nsIsImplicit && config.extract.defaultNS === false)
|
|
823
813
|
? NO_NS_TOKEN
|
|
824
814
|
: String(ns ?? (config.extract.defaultNS ?? 'translation'));
|
|
825
815
|
if (!keysByNS.has(nsKey))
|
|
826
816
|
keysByNS.set(nsKey, []);
|
|
827
|
-
|
|
828
|
-
keysByNS.get(nsKey).push({ ...k, ns, key });
|
|
829
|
-
}
|
|
830
|
-
else {
|
|
831
|
-
keysByNS.get(nsKey).push(k);
|
|
832
|
-
}
|
|
817
|
+
keysByNS.get(nsKey).push(k);
|
|
833
818
|
}
|
|
834
819
|
// Filter out ignored namespaces
|
|
835
820
|
const ignoreNamespaces = new Set(config.extract.ignoreNamespaces ?? []);
|
|
@@ -2,6 +2,10 @@ import { lineColumnFromOffset, isSimpleTemplateLiteral, getObjectPropValue, getO
|
|
|
2
2
|
|
|
3
3
|
// Helper to escape regex characters
|
|
4
4
|
const escapeRegex = (str) => str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
5
|
+
// Checks if a string looks like natural language (contains spaces, punctuation, etc.)
|
|
6
|
+
// Used to prevent splitting keys like "Error message: not found" into namespace + key.
|
|
7
|
+
const naturalLanguageChars = /[ ,?!;]/;
|
|
8
|
+
const looksLikeNaturalLanguage = (s) => naturalLanguageChars.test(s);
|
|
5
9
|
class CallExpressionHandler {
|
|
6
10
|
pluginContext;
|
|
7
11
|
config;
|
|
@@ -160,11 +164,16 @@ class CallExpressionHandler {
|
|
|
160
164
|
const nsSeparator = this.config.extract.nsSeparator ?? ':';
|
|
161
165
|
if (!ns && nsSeparator && key.includes(nsSeparator)) {
|
|
162
166
|
const parts = key.split(nsSeparator);
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
167
|
+
const candidateNs = parts[0];
|
|
168
|
+
// If the candidate namespace looks like natural language (contains spaces,
|
|
169
|
+
// punctuation), assume the separator is part of the key text, not a namespace delimiter.
|
|
170
|
+
if (!looksLikeNaturalLanguage(candidateNs)) {
|
|
171
|
+
ns = parts.shift();
|
|
172
|
+
key = parts.join(nsSeparator);
|
|
173
|
+
if (!key || key.trim() === '') {
|
|
174
|
+
this.logger.warn(`Skipping key that became empty after namespace removal: '${ns}${nsSeparator}'`);
|
|
175
|
+
continue;
|
|
176
|
+
}
|
|
168
177
|
}
|
|
169
178
|
}
|
|
170
179
|
if (!ns && scopeInfo?.defaultNs)
|
|
@@ -489,10 +498,16 @@ class CallExpressionHandler {
|
|
|
489
498
|
const nsSeparator = this.config.extract.nsSeparator ?? ':';
|
|
490
499
|
if (nsSeparator && key.includes(nsSeparator)) {
|
|
491
500
|
const parts = key.split(nsSeparator);
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
501
|
+
const candidateNs = parts[0];
|
|
502
|
+
if (!looksLikeNaturalLanguage(candidateNs)) {
|
|
503
|
+
nestedNs = parts.shift();
|
|
504
|
+
key = parts.join(nsSeparator);
|
|
505
|
+
if (!key || key.trim() === '')
|
|
506
|
+
return;
|
|
507
|
+
}
|
|
508
|
+
else {
|
|
509
|
+
nestedNs = this.config.extract.defaultNS;
|
|
510
|
+
}
|
|
496
511
|
}
|
|
497
512
|
else {
|
|
498
513
|
nestedNs = this.config.extract.defaultNS;
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// Checks if a string looks like natural language (contains spaces, punctuation, etc.)
|
|
2
|
+
const naturalLanguageChars = /[ ,?!;]/;
|
|
3
|
+
const looksLikeNaturalLanguage = (s) => naturalLanguageChars.test(s);
|
|
1
4
|
/**
|
|
2
5
|
* Extracts translation keys from comments in source code using regex patterns.
|
|
3
6
|
* Supports extraction from single-line (//) and multi-line comments.
|
|
@@ -86,15 +89,18 @@ function extractKeysFromComments(code, pluginContext, config, scopeResolver) {
|
|
|
86
89
|
const nsSeparator = config.extract.nsSeparator ?? ':';
|
|
87
90
|
if (!ns && nsSeparator && key.includes(nsSeparator)) {
|
|
88
91
|
const parts = key.split(nsSeparator);
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
92
|
+
// If the candidate namespace looks like natural language, don't split
|
|
93
|
+
if (!looksLikeNaturalLanguage(parts[0])) {
|
|
94
|
+
ns = parts.shift();
|
|
95
|
+
key = parts.join(nsSeparator);
|
|
96
|
+
// Validate that the key didn't become empty after namespace removal
|
|
97
|
+
if (!key || key.trim() === '') {
|
|
98
|
+
continue; // Skip keys that become empty after namespace removal
|
|
99
|
+
}
|
|
100
|
+
// Re-check preservePatterns after namespace processing (namespace-aware)
|
|
101
|
+
if (matchesPreserve(key, ns)) {
|
|
102
|
+
continue; // Skip processed keys that match preserve patterns
|
|
103
|
+
}
|
|
98
104
|
}
|
|
99
105
|
}
|
|
100
106
|
// 3. If no explicit namespace found, try to resolve from scope
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { extractFromTransComponent } from './jsx-parser.js';
|
|
2
2
|
import { lineColumnFromOffset, getObjectPropValue } from './ast-utils.js';
|
|
3
3
|
|
|
4
|
+
// Checks if a string looks like natural language (contains spaces, punctuation, etc.)
|
|
5
|
+
const naturalLanguageChars = /[ ,?!;]/;
|
|
6
|
+
const looksLikeNaturalLanguage = (s) => naturalLanguageChars.test(s);
|
|
4
7
|
class JSXHandler {
|
|
5
8
|
config;
|
|
6
9
|
pluginContext;
|
|
@@ -85,9 +88,11 @@ class JSXHandler {
|
|
|
85
88
|
// If the key contains a namespace separator, it takes precedence
|
|
86
89
|
// over the default t ns value
|
|
87
90
|
if (nsSeparator && key.includes(nsSeparator)) {
|
|
88
|
-
|
|
89
|
-
([
|
|
90
|
-
|
|
91
|
+
const parts = key.split(nsSeparator);
|
|
92
|
+
if (!looksLikeNaturalLanguage(parts[0])) {
|
|
93
|
+
ns = parts.shift();
|
|
94
|
+
key = parts.join(nsSeparator);
|
|
95
|
+
}
|
|
91
96
|
}
|
|
92
97
|
return {
|
|
93
98
|
key,
|
package/dist/esm/status.js
CHANGED
|
@@ -10,6 +10,13 @@ import { loadTranslationFile, getOutputPath } from './utils/file-utils.js';
|
|
|
10
10
|
import { shouldShowFunnel, recordFunnelShown } from './utils/funnel-msg-tracker.js';
|
|
11
11
|
import './extractor/parsers/jsx-parser.js';
|
|
12
12
|
|
|
13
|
+
function classifyValue(value) {
|
|
14
|
+
if (value === undefined || value === null)
|
|
15
|
+
return 'absent';
|
|
16
|
+
if (value === '')
|
|
17
|
+
return 'empty';
|
|
18
|
+
return 'translated';
|
|
19
|
+
}
|
|
13
20
|
/**
|
|
14
21
|
* Runs a health check on the project's i18next translations and displays a status report.
|
|
15
22
|
*
|
|
@@ -20,6 +27,11 @@ import './extractor/parsers/jsx-parser.js';
|
|
|
20
27
|
* 4. Displaying a formatted report with key counts, locales, and progress bars.
|
|
21
28
|
* 5. Serving as a value-driven funnel to introduce the locize commercial service.
|
|
22
29
|
*
|
|
30
|
+
* Exit behaviour (unchanged): exits 1 when any key is either empty or absent.
|
|
31
|
+
* The output now distinguishes between the two states so developers can tell
|
|
32
|
+
* whether they have a structural problem (absent) or simply pending translation
|
|
33
|
+
* work (empty).
|
|
34
|
+
*
|
|
23
35
|
* @param config - The i18next toolkit configuration object.
|
|
24
36
|
* @param options - Options object, may contain a `detail` property with a locale string.
|
|
25
37
|
* @throws {Error} When unable to extract keys or read translation files
|
|
@@ -40,7 +52,7 @@ async function runStatus(config, options = {}) {
|
|
|
40
52
|
}
|
|
41
53
|
}
|
|
42
54
|
if (hasMissing) {
|
|
43
|
-
spinner.fail('Error:
|
|
55
|
+
spinner.fail('Error: Incomplete translations detected.');
|
|
44
56
|
process.exit(1);
|
|
45
57
|
}
|
|
46
58
|
}
|
|
@@ -92,6 +104,8 @@ async function generateStatusReport(config) {
|
|
|
92
104
|
};
|
|
93
105
|
for (const locale of secondaryLanguages) {
|
|
94
106
|
let totalTranslatedForLocale = 0;
|
|
107
|
+
let totalEmptyForLocale = 0;
|
|
108
|
+
let totalAbsentForLocale = 0;
|
|
95
109
|
let totalKeysForLocale = 0;
|
|
96
110
|
const namespaces = new Map();
|
|
97
111
|
const mergedTranslations = mergeNamespaces
|
|
@@ -118,6 +132,8 @@ async function generateStatusReport(config) {
|
|
|
118
132
|
}
|
|
119
133
|
}
|
|
120
134
|
let translatedInNs = 0;
|
|
135
|
+
let emptyInNs = 0;
|
|
136
|
+
let absentInNs = 0;
|
|
121
137
|
let totalInNs = 0;
|
|
122
138
|
const keyDetails = [];
|
|
123
139
|
// Get the plural categories for THIS specific locale
|
|
@@ -133,6 +149,26 @@ async function generateStatusReport(config) {
|
|
|
133
149
|
return fallbackRules.resolvedOptions().pluralCategories;
|
|
134
150
|
}
|
|
135
151
|
};
|
|
152
|
+
/**
|
|
153
|
+
* Resolves the value for a single key, applying the fallback namespace when
|
|
154
|
+
* configured, and classifies it as translated / empty / absent.
|
|
155
|
+
*
|
|
156
|
+
* The fallback is only consulted when the primary value is absent — an empty
|
|
157
|
+
* string is a deliberate placeholder written by `extract` and should not be
|
|
158
|
+
* silently replaced by a fallback value.
|
|
159
|
+
*/
|
|
160
|
+
const resolveAndClassify = (key) => {
|
|
161
|
+
const sep = keySeparator ?? '.';
|
|
162
|
+
const primaryValue = getNestedValue(translationsForNs, key, sep);
|
|
163
|
+
const primaryState = classifyValue(primaryValue);
|
|
164
|
+
// Only fall back when the key is genuinely absent from the primary file.
|
|
165
|
+
// An empty string is intentional (placeholder from extract) — don't hide it.
|
|
166
|
+
if (primaryState === 'absent' && fallbackTranslations) {
|
|
167
|
+
const fallbackValue = getNestedValue(fallbackTranslations, key, sep);
|
|
168
|
+
return classifyValue(fallbackValue);
|
|
169
|
+
}
|
|
170
|
+
return primaryState;
|
|
171
|
+
};
|
|
136
172
|
for (const { key: baseKey, hasCount, isOrdinal, isExpandedPlural } of keysInNs) {
|
|
137
173
|
if (hasCount) {
|
|
138
174
|
if (isExpandedPlural) {
|
|
@@ -148,15 +184,14 @@ async function generateStatusReport(config) {
|
|
|
148
184
|
// Only count this key if it's a plural form used by this locale
|
|
149
185
|
if (localePluralCategories.includes(category)) {
|
|
150
186
|
totalInNs++;
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
if (!value && fallbackTranslations) {
|
|
154
|
-
value = getNestedValue(fallbackTranslations, baseKey, keySeparator ?? '.');
|
|
155
|
-
}
|
|
156
|
-
const isTranslated = !!value;
|
|
157
|
-
if (isTranslated)
|
|
187
|
+
const state = resolveAndClassify(baseKey);
|
|
188
|
+
if (state === 'translated')
|
|
158
189
|
translatedInNs++;
|
|
159
|
-
|
|
190
|
+
else if (state === 'empty')
|
|
191
|
+
emptyInNs++;
|
|
192
|
+
else
|
|
193
|
+
absentInNs++;
|
|
194
|
+
keyDetails.push({ key: baseKey, state });
|
|
160
195
|
}
|
|
161
196
|
}
|
|
162
197
|
else {
|
|
@@ -168,40 +203,57 @@ async function generateStatusReport(config) {
|
|
|
168
203
|
const pluralKey = isOrdinal
|
|
169
204
|
? `${baseKey}${pluralSeparator}ordinal${pluralSeparator}${category}`
|
|
170
205
|
: `${baseKey}${pluralSeparator}${category}`;
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
if (!value && fallbackTranslations) {
|
|
174
|
-
value = getNestedValue(fallbackTranslations, pluralKey, keySeparator ?? '.');
|
|
175
|
-
}
|
|
176
|
-
const isTranslated = !!value;
|
|
177
|
-
if (isTranslated)
|
|
206
|
+
const state = resolveAndClassify(pluralKey);
|
|
207
|
+
if (state === 'translated')
|
|
178
208
|
translatedInNs++;
|
|
179
|
-
|
|
209
|
+
else if (state === 'empty')
|
|
210
|
+
emptyInNs++;
|
|
211
|
+
else
|
|
212
|
+
absentInNs++;
|
|
213
|
+
keyDetails.push({ key: pluralKey, state });
|
|
180
214
|
}
|
|
181
215
|
}
|
|
182
216
|
}
|
|
183
217
|
else {
|
|
184
|
-
// It's a simple key
|
|
185
218
|
totalInNs++;
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
if (!value && fallbackTranslations) {
|
|
189
|
-
value = getNestedValue(fallbackTranslations, baseKey, keySeparator ?? '.');
|
|
190
|
-
}
|
|
191
|
-
const isTranslated = !!value;
|
|
192
|
-
if (isTranslated)
|
|
219
|
+
const state = resolveAndClassify(baseKey);
|
|
220
|
+
if (state === 'translated')
|
|
193
221
|
translatedInNs++;
|
|
194
|
-
|
|
222
|
+
else if (state === 'empty')
|
|
223
|
+
emptyInNs++;
|
|
224
|
+
else
|
|
225
|
+
absentInNs++;
|
|
226
|
+
keyDetails.push({ key: baseKey, state });
|
|
195
227
|
}
|
|
196
228
|
}
|
|
197
|
-
namespaces.set(ns, { totalKeys: totalInNs, translatedKeys: translatedInNs, keyDetails });
|
|
229
|
+
namespaces.set(ns, { totalKeys: totalInNs, translatedKeys: translatedInNs, emptyKeys: emptyInNs, absentKeys: absentInNs, keyDetails });
|
|
198
230
|
totalTranslatedForLocale += translatedInNs;
|
|
231
|
+
totalEmptyForLocale += emptyInNs;
|
|
232
|
+
totalAbsentForLocale += absentInNs;
|
|
199
233
|
totalKeysForLocale += totalInNs;
|
|
200
234
|
}
|
|
201
|
-
report.locales.set(locale, {
|
|
235
|
+
report.locales.set(locale, {
|
|
236
|
+
totalKeys: totalKeysForLocale,
|
|
237
|
+
totalTranslated: totalTranslatedForLocale,
|
|
238
|
+
totalEmpty: totalEmptyForLocale,
|
|
239
|
+
totalAbsent: totalAbsentForLocale,
|
|
240
|
+
namespaces,
|
|
241
|
+
});
|
|
202
242
|
}
|
|
203
243
|
return report;
|
|
204
244
|
}
|
|
245
|
+
/**
|
|
246
|
+
* Builds a compact breakdown string like "3 untranslated, 2 absent" for use in
|
|
247
|
+
* summary lines. Returns an empty string when there is nothing to report.
|
|
248
|
+
*/
|
|
249
|
+
function buildBreakdown(emptyCount, absentCount) {
|
|
250
|
+
const parts = [];
|
|
251
|
+
if (emptyCount > 0)
|
|
252
|
+
parts.push(styleText('yellow', `${emptyCount} untranslated`));
|
|
253
|
+
if (absentCount > 0)
|
|
254
|
+
parts.push(styleText('red', `${absentCount} absent`));
|
|
255
|
+
return parts.join(', ');
|
|
256
|
+
}
|
|
205
257
|
/**
|
|
206
258
|
* Main display router that calls the appropriate display function based on options.
|
|
207
259
|
*
|
|
@@ -228,17 +280,10 @@ async function displayStatusReport(report, config, options) {
|
|
|
228
280
|
/**
|
|
229
281
|
* Displays the detailed, grouped report for a single locale.
|
|
230
282
|
*
|
|
231
|
-
*
|
|
232
|
-
*
|
|
233
|
-
*
|
|
234
|
-
*
|
|
235
|
-
* - Summary message with total missing translations
|
|
236
|
-
*
|
|
237
|
-
* @param report - The generated status report data
|
|
238
|
-
* @param config - The i18next toolkit configuration object
|
|
239
|
-
* @param locale - The locale code to display details for
|
|
240
|
-
* @param namespaceFilter - Optional namespace to filter the display
|
|
241
|
-
* @param hideTranslated - When true, only untranslated keys are shown
|
|
283
|
+
* Key status icons:
|
|
284
|
+
* ✓ green — translated
|
|
285
|
+
* ~ yellow — present in file but empty (needs translation)
|
|
286
|
+
* ✗ red — absent from file entirely (structural problem)
|
|
242
287
|
*/
|
|
243
288
|
async function displayDetailedLocaleReport(report, config, locale, namespaceFilter, hideTranslated) {
|
|
244
289
|
if (locale === config.extract.primaryLanguage) {
|
|
@@ -257,6 +302,9 @@ async function displayDetailedLocaleReport(report, config, locale, namespaceFilt
|
|
|
257
302
|
console.log(styleText('bold', `\nKey Status for "${styleText('cyan', locale)}":`));
|
|
258
303
|
const totalKeysForLocale = localeData.totalKeys;
|
|
259
304
|
printProgressBar('Overall', localeData.totalTranslated, totalKeysForLocale);
|
|
305
|
+
const breakdown = buildBreakdown(localeData.totalEmpty, localeData.totalAbsent);
|
|
306
|
+
if (breakdown)
|
|
307
|
+
console.log(` ${breakdown}`);
|
|
260
308
|
const namespacesToDisplay = namespaceFilter ? [namespaceFilter] : Array.from(localeData.namespaces.keys()).sort();
|
|
261
309
|
for (const ns of namespacesToDisplay) {
|
|
262
310
|
const nsData = localeData.namespaces.get(ns);
|
|
@@ -264,15 +312,28 @@ async function displayDetailedLocaleReport(report, config, locale, namespaceFilt
|
|
|
264
312
|
continue;
|
|
265
313
|
console.log(styleText(['cyan', 'bold'], `\nNamespace: ${ns}`));
|
|
266
314
|
printProgressBar('Namespace Progress', nsData.translatedKeys, nsData.totalKeys);
|
|
267
|
-
const
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
315
|
+
const nsBreakdown = buildBreakdown(nsData.emptyKeys, nsData.absentKeys);
|
|
316
|
+
if (nsBreakdown)
|
|
317
|
+
console.log(` ${nsBreakdown}`);
|
|
318
|
+
const keysToDisplay = hideTranslated
|
|
319
|
+
? nsData.keyDetails.filter(({ state }) => state !== 'translated')
|
|
320
|
+
: nsData.keyDetails;
|
|
321
|
+
keysToDisplay.forEach(({ key, state }) => {
|
|
322
|
+
if (state === 'translated') {
|
|
323
|
+
console.log(` ${styleText('green', '✓')} ${key}`);
|
|
324
|
+
}
|
|
325
|
+
else if (state === 'empty') {
|
|
326
|
+
console.log(` ${styleText('yellow', '~')} ${key} ${styleText('yellow', '(untranslated)')}`);
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
console.log(` ${styleText('red', '✗')} ${key} ${styleText('red', '(absent)')}`);
|
|
330
|
+
}
|
|
271
331
|
});
|
|
272
332
|
}
|
|
273
333
|
const missingCount = totalKeysForLocale - localeData.totalTranslated;
|
|
274
334
|
if (missingCount > 0) {
|
|
275
|
-
|
|
335
|
+
const summaryBreakdown = buildBreakdown(localeData.totalEmpty, localeData.totalAbsent);
|
|
336
|
+
console.log(styleText(['yellow', 'bold'], `\nSummary: Found ${missingCount} incomplete translations for "${locale}" — ${summaryBreakdown}.`));
|
|
276
337
|
}
|
|
277
338
|
else {
|
|
278
339
|
console.log(styleText(['green', 'bold'], `\nSummary: 🎉 All keys are translated for "${locale}".`));
|
|
@@ -302,7 +363,9 @@ async function displayNamespaceSummaryReport(report, config, namespace) {
|
|
|
302
363
|
if (nsLocaleData) {
|
|
303
364
|
const percentage = nsLocaleData.totalKeys > 0 ? Math.round((nsLocaleData.translatedKeys / nsLocaleData.totalKeys) * 100) : 100;
|
|
304
365
|
const bar = generateProgressBarText(percentage);
|
|
305
|
-
|
|
366
|
+
const breakdown = buildBreakdown(nsLocaleData.emptyKeys, nsLocaleData.absentKeys);
|
|
367
|
+
const suffix = breakdown ? ` — ${breakdown}` : '';
|
|
368
|
+
console.log(`- ${locale}: ${bar} ${percentage}% (${nsLocaleData.translatedKeys}/${nsLocaleData.totalKeys} keys)${suffix}`);
|
|
306
369
|
}
|
|
307
370
|
}
|
|
308
371
|
await printLocizeFunnel();
|
|
@@ -331,7 +394,9 @@ async function displayOverallSummaryReport(report, config) {
|
|
|
331
394
|
for (const [locale, localeData] of report.locales.entries()) {
|
|
332
395
|
const percentage = localeData.totalKeys > 0 ? Math.round((localeData.totalTranslated / localeData.totalKeys) * 100) : 100;
|
|
333
396
|
const bar = generateProgressBarText(percentage);
|
|
334
|
-
|
|
397
|
+
const breakdown = buildBreakdown(localeData.totalEmpty, localeData.totalAbsent);
|
|
398
|
+
const suffix = breakdown ? ` — ${breakdown}` : '';
|
|
399
|
+
console.log(`- ${locale}: ${bar} ${percentage}% (${localeData.totalTranslated}/${localeData.totalKeys} keys)${suffix}`);
|
|
335
400
|
}
|
|
336
401
|
await printLocizeFunnel();
|
|
337
402
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "i18next-cli",
|
|
3
|
-
"version": "1.50.
|
|
3
|
+
"version": "1.50.4",
|
|
4
4
|
"description": "A unified, high-performance i18next CLI.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -57,12 +57,12 @@
|
|
|
57
57
|
"@types/inquirer": "^9.0.9",
|
|
58
58
|
"@types/node": "^25.5.0",
|
|
59
59
|
"@types/react": "^19.2.14",
|
|
60
|
-
"@typescript-eslint/parser": "^8.57.
|
|
60
|
+
"@typescript-eslint/parser": "^8.57.1",
|
|
61
61
|
"@vitest/coverage-v8": "^4.1.0",
|
|
62
62
|
"eslint": "^9.39.2",
|
|
63
63
|
"eslint-import-resolver-typescript": "^4.4.4",
|
|
64
64
|
"eslint-plugin-import": "^2.32.0",
|
|
65
|
-
"memfs": "^4.
|
|
65
|
+
"memfs": "^4.57.1",
|
|
66
66
|
"neostandard": "^0.13.0",
|
|
67
67
|
"rollup-plugin-typescript2": "^0.36.0",
|
|
68
68
|
"typescript": "^5.9.3",
|
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
73
|
"@croct/json5-parser": "^0.2.2",
|
|
74
|
-
"@swc/core": "^1.15.
|
|
74
|
+
"@swc/core": "^1.15.21",
|
|
75
75
|
"chokidar": "^5.0.0",
|
|
76
76
|
"commander": "^14.0.3",
|
|
77
77
|
"execa": "^9.6.1",
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"minimatch": "^10.2.4",
|
|
85
85
|
"ora": "^9.3.0",
|
|
86
86
|
"react": "^19.2.4",
|
|
87
|
-
"react-i18next": "^16.
|
|
88
|
-
"yaml": "^2.8.
|
|
87
|
+
"react-i18next": "^16.6.1",
|
|
88
|
+
"yaml": "^2.8.3"
|
|
89
89
|
}
|
|
90
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translation-manager.d.ts","sourceRoot":"","sources":["../../../src/extractor/core/translation-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAy3B9F;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EAC/B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,MAAM,EAAE,oBAAoB,EAC5B,EACE,uBAA+B,EAC/B,OAAe,EACf,MAA4B,EAC7B,GAAE;IACD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CACX,GACL,OAAO,CAAC,iBAAiB,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"translation-manager.d.ts","sourceRoot":"","sources":["../../../src/extractor/core/translation-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAy3B9F;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EAC/B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,MAAM,EAAE,oBAAoB,EAC5B,EACE,uBAA+B,EAC/B,OAAe,EACf,MAA4B,EAC7B,GAAE;IACD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;CACX,GACL,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA6I9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call-expression-handler.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/call-expression-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAA6C,MAAM,WAAW,CAAA;AAC1F,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAgB,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1G,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"call-expression-handler.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/call-expression-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAA6C,MAAM,WAAW,CAAA;AAC1F,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAgB,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC1G,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAW7D,qBAAa,qBAAqB;IAChC,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,kBAAkB,CAAoB;IACvC,UAAU,cAAoB;IACrC,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,iBAAiB,CAAsC;gBAG7D,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,MAAM,MAAM,EAC5B,cAAc,EAAE,MAAM,MAAM,EAC5B,iBAAiB,GAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAA2B;IAW3E;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;;;;;;;;;;;;;OAcG;IACH,oBAAoB,CAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,GAAG,IAAI;IAyYxG;;OAEG;IACH,OAAO,CAAC,iBAAiB;IA4BzB,OAAO,CAAC,oBAAoB;IAkF5B,OAAO,CAAC,wBAAwB;IAyEhC;;;;;;OAMG;IACH,OAAO,CAAC,4BAA4B;IA8BpC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,sBAAsB;IA2C9B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,gBAAgB;IAyMxB;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;CA2BxB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"comment-parser.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/comment-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"comment-parser.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/comment-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAA;AAMzE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,oBAAoB,EAC5B,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,GAC1F,IAAI,CAqJN"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-handler.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/jsx-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAgB,MAAM,gBAAgB,CAAA;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;
|
|
1
|
+
{"version":3,"file":"jsx-handler.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/jsx-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAgB,MAAM,gBAAgB,CAAA;AACvF,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAQ7D,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,cAAc,CAAc;gBAGlC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,MAAM,MAAM,EAC5B,cAAc,EAAE,MAAM,MAAM;IAS9B;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAK3B;;;;;;;;OAQG;IACH,gBAAgB,CAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,GAAG,IAAI;IAyUjI;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,0BAA0B;IAkIlC;;;;;;;;;OASG;IACH,OAAO,CAAC,cAAc;CAevB"}
|
package/types/status.d.ts
CHANGED
|
@@ -20,6 +20,11 @@ interface StatusOptions {
|
|
|
20
20
|
* 4. Displaying a formatted report with key counts, locales, and progress bars.
|
|
21
21
|
* 5. Serving as a value-driven funnel to introduce the locize commercial service.
|
|
22
22
|
*
|
|
23
|
+
* Exit behaviour (unchanged): exits 1 when any key is either empty or absent.
|
|
24
|
+
* The output now distinguishes between the two states so developers can tell
|
|
25
|
+
* whether they have a structural problem (absent) or simply pending translation
|
|
26
|
+
* work (empty).
|
|
27
|
+
*
|
|
23
28
|
* @param config - The i18next toolkit configuration object.
|
|
24
29
|
* @param options - Options object, may contain a `detail` property with a locale string.
|
|
25
30
|
* @throws {Error} When unable to extract keys or read translation files
|
package/types/status.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAgB,MAAM,YAAY,CAAA;AAIpE;;GAEG;AACH,UAAU,aAAa;IACrB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAgB,MAAM,YAAY,CAAA;AAIpE;;GAEG;AACH,UAAU,aAAa;IACrB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wCAAwC;IACxC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,uEAAuE;IACvE,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAqDD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,SAAS,CAAE,MAAM,EAAE,oBAAoB,EAAE,OAAO,GAAE,aAAkB,iBAuBzF"}
|
package/types/types.d.ts
CHANGED
|
@@ -506,6 +506,14 @@ export interface ExtractedKey {
|
|
|
506
506
|
* Empty/undefined if the key doesn't use context.
|
|
507
507
|
*/
|
|
508
508
|
keyAcceptingContext?: string;
|
|
509
|
+
/**
|
|
510
|
+
* Whether the namespace was derived from splitting the key by nsSeparator.
|
|
511
|
+
* When true, the natural language heuristic may rejoin the namespace and key
|
|
512
|
+
* if the namespace looks like natural language (contains spaces, etc.).
|
|
513
|
+
* When false/undefined, the namespace was explicitly provided (via options,
|
|
514
|
+
* useTranslation scope, etc.) and should not be subject to the heuristic.
|
|
515
|
+
*/
|
|
516
|
+
nsFromKeySplit?: boolean;
|
|
509
517
|
}
|
|
510
518
|
/**
|
|
511
519
|
* Result of processing translation files for a specific locale and namespace.
|
package/types/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAEnE;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,oBAAoB;IACnC,iEAAiE;IACjE,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,2DAA2D;IAC3D,OAAO,EAAE;QACP,oEAAoE;QACpE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAEzB,4DAA4D;QAC5D,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAE3B,mGAAmG;QACnG,MAAM,EAAE,MAAM,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;QAEpE;;;WAGG;QACH,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAE3B,gGAAgG;QAChG,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAE5B,uEAAuE;QACvE,YAAY,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC;QAErC,8EAA8E;QAC9E,WAAW,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,IAAI,CAAC;QAEpC,oDAAoD;QACpD,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAE1B,mDAAmD;QACnD,eAAe,CAAC,EAAE,MAAM,CAAC;QAEzB,+EAA+E;QAC/E,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;QAErB,4EAA4E;QAC5E,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;QAE3B;;;;;WAKG;QACH,mBAAmB,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG;YACnC,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,YAAY,CAAC,EAAE,MAAM,CAAC;SACvB,CAAC,CAAC;QAEH,kFAAkF;QAClF,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAE7B,kGAAkG;QAClG,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QAEvB;;;;;WAKG;QACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;QAE9B;;;;;WAKG;QACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QAExB,8FAA8F;QAC9F,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAC;QAEtC,wFAAwF;QACxF,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;QAE5B;;;;;WAKG;QACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;QAElC,2HAA2H;QAC3H,IAAI,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,KAAK,MAAM,CAAC,CAAC;QAEhE,yDAAyD;QACzD,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QAE9B,2EAA2E;QAC3E,YAAY,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;QAEtG,4EAA4E;QAC5E,eAAe,CAAC,EAAE,MAAM,CAAC;QAEzB,0DAA0D;QAC1D,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;QAE9B;;;;;;;;;WASG;QACH,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;QAEpF;;;;;WAKG;QACH,eAAe,CAAC,EAAE,OAAO,CAAC;QAE1B,kHAAkH;QAClH,gBAAgB,CAAC,EAAE,OAAO,CAAC;QAE3B;;;;;WAKG;QACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;QAE5B;;;WAGG;QACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAG9B,uBAAuB,CAAC,EAAE,OAAO,CAAA;QAGjC,cAAc,CAAC,EAAE,OAAO,CAAA;QAExB;;;WAGG;QACH,aAAa,CAAC,EAAE,MAAM,CAAC;QAEvB;;;WAGG;QACH,aAAa,CAAC,EAAE,MAAM,CAAC;QAEvB;;;WAGG;QACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;QAEjC;;;WAGG;QACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAE7B;;;WAGG;QACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;QAE7B;;;;;;;;WAQG;QACH,gBAAgB,CAAC,EAAE,qBAAqB,CAAC;QAEzC;;;;;WAKG;QACH,eAAe,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;KAC9C,CAAC;IAEF,uCAAuC;IACvC,IAAI,CAAC,EAAE;QACL,kFAAkF;QAClF,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;QAE7B,kGAAkG;QAClG,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QAEvB;;;;;WAKG;QACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,CAAC;QAE9B;;;;;WAKG;QACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;QAExB,oGAAoG;QACpG,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAE3B,6FAA6F;QAC7F,wBAAwB,CAAC,EAAE,OAAO,CAAC;KACpC,CAAC;IAEF,2DAA2D;IAC3D,KAAK,CAAC,EAAE;QACN,mEAAmE;QACnE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAEzB,0DAA0D;QAC1D,MAAM,EAAE,MAAM,CAAC;QAEf,8EAA8E;QAC9E,cAAc,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;QAEtC,qDAAqD;QACrD,aAAa,CAAC,EAAE,MAAM,CAAC;QAEvB;;;WAGG;QACH,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KAC/B,CAAC;IAEF,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB,2CAA2C;IAC3C,MAAM,CAAC,EAAE;QACP,wBAAwB;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;QAEnB,gEAAgE;QAChE,MAAM,CAAC,EAAE,MAAM,CAAC;QAEhB,+CAA+C;QAC/C,OAAO,CAAC,EAAE,MAAM,CAAC;QAEjB,8DAA8D;QAC9D,YAAY,CAAC,EAAE,OAAO,CAAC;QAEvB,8CAA8C;QAC9C,kBAAkB,CAAC,EAAE,OAAO,CAAC;QAE7B,8CAA8C;QAC9C,uBAAuB,CAAC,EAAE,OAAO,CAAC;QAElC,6GAA6G;QAC7G,OAAO,CAAC,EAAE,UAAU,GAAG,KAAK,CAAC;QAE7B,0CAA0C;QAC1C,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;CACH;AAED,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;AAErC;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,IAAI,CAAC,EAAE,WAAW,GAAG,eAAe,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,oDAAoD;IACpD,MAAM,EAAE,oBAAoB,CAAC;IAE7B,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,oDAAoD;IACpD,MAAM,EAAE,oBAAoB,CAAC;IAE7B,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IAEb;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAE1B;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IAE/D;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,YAAY,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAEzF;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,YAAY,CAAC,SAAS,EAAE,GAAG,SAAS,CAAC,CAAC;CACjG;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IACjC,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IAEb;;;;;OAKG;IACH,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhC;;;OAGG;IACH,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IAE3E;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,YAAY,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IAE/F;;;;;;;OAOG;IACH,kBAAkB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,YAAY,CAAC,eAAe,EAAE,GAAG,SAAS,CAAC,CAAC;CACvH;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,MAAM,WAAW,MAAO,SAAQ,YAAY,EAAE,kBAAkB;IAC9D,iCAAiC;IACjC,IAAI,EAAE,MAAM,CAAC;IAEb;;;;;;;;;;OAUG;IACH,yBAAyB,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IAEhI;;;;;;;;;;OAUG;IACH,4BAA4B,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IAEnI;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,YAAY,CAAC,IAAI,CAAC,CAAC;IAEjC;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IAE1E;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;IAE3D;;;;;;;;OAQG;IACH,cAAc,CAAC,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;IAEvD;;;;;OAKG;IACH,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;IAEvD;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,oBAAoB,KAAK,YAAY,CAAC,IAAI,CAAC,CAAC;CAChG;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,GAAG,EAAE,MAAM,CAAC;IAEZ,mDAAmD;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,oCAAoC;IACpC,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAEpB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,oEAAoE;IACpE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,0DAA0D;IAC1D,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,gBAAgB,CAAC;IAE/B,mDAAmD;IACnD,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAE/B,qGAAqG;IACrG,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B,wFAAwF;IACxF,gBAAgB,CAAC,EAAE,OAAO,CAAA;IAE1B,iFAAiF;IACjF,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,MAAM,CAAC,EAAE,MAAM,CAAA;KAChB,CAAC,CAAA;IAEF;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,iBAAiB;IAChC,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IAEb,+DAA+D;IAC/D,OAAO,EAAE,OAAO,CAAC;IAEjB,2DAA2D;IAC3D,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAErC,kEAAkE;IAClE,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC3C;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,MAAM;IACrB;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAE5B;;;OAGG;IACH,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC;IAExC;;;OAGG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC;CACpC;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,aAAa;IAC5B;;;;;OAKG;IACH,MAAM,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IAExC,oDAAoD;IACpD,MAAM,EAAE,oBAAoB,CAAC;IAE7B,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IAEf;;;;;OAKG;IACH,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,CAAC;IAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,KAAK,IAAI,CAAA;CACvD;AAED;;;GAGG;AACH,MAAM,WAAW,SAAS;IACxB,4DAA4D;IAC5D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,WAAW,wBAAwB;IACvC,qEAAqE;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,gEAAgE;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,yEAAyE;IACzE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;IAExC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAA;IAEvC;;;;;;;OAOG;IACH,kCAAkC,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,kBAAkB,CAAC,EAAE,OAAO,KAAK,MAAM,EAAE,CAAA;IAEvG;;;;;;;OAOG;IACH,8BAA8B,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,kBAAkB,CAAC,EAAE,OAAO,KAAK,MAAM,EAAE,CAAA;CACpG;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,MAAM,gBAAgB,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAA;AAExD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IACrD,gBAAgB,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IAC3D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;IACpB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,aAAa,CAAC,EAAE,OAAO,CAAA;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf;;OAEG;IACH,UAAU,EAAE,MAAM,CAAA;IAElB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,IAAI,EAAE,gBAAgB,GAAG,UAAU,GAAG,eAAe,GAAG,WAAW,GAAG,kBAAkB,CAAA;IAExF;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IAEZ;;OAEG;IACH,IAAI,EAAE,MAAM,CAAA;IAEZ;;OAEG;IACH,MAAM,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAA;IAEZ;;OAEG;IACH,OAAO,CAAC,EAAE;QACR,WAAW,EAAE,OAAO,CAAA;QACpB,aAAa,EAAE,MAAM,CAAA;QACrB,eAAe,EAAE,MAAM,CAAA;KACxB,CAAA;IAED;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB;;;;OAIG;IACH,cAAc,CAAC,EAAE,KAAK,CAAC;QACrB,6DAA6D;QAC7D,IAAI,EAAE,MAAM,CAAA;QACZ,4DAA4D;QAC5D,UAAU,EAAE,MAAM,CAAA;KACnB,CAAC,CAAA;IAEF;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;;;OAIG;IACH,WAAW,CAAC,EAAE;QACZ,6DAA6D;QAC7D,eAAe,EAAE,MAAM,CAAA;QACvB,6EAA6E;QAC7E,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,iCAAiC;QACjC,GAAG,CAAC,EAAE,MAAM,CAAA;QACZ,4EAA4E;QAC5E,KAAK,EAAE,MAAM,CAAA;KACd,CAAA;CACF;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,QAAQ,EAAE,OAAO,CAAA;IAEjB;;OAEG;IACH,UAAU,CAAC,EAAE,MAAM,CAAA;IAEnB;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAA;IAEb;;OAEG;IACH,MAAM,EAAE,MAAM,EAAE,CAAA;IAEhB;;OAEG;IACH,QAAQ,EAAE,MAAM,EAAE,CAAA;IAElB;;OAEG;IACH,cAAc,EAAE,MAAM,CAAA;IAEtB;;OAEG;IACH,mBAAmB,EAAE,MAAM,CAAA;IAE3B;;OAEG;IACH,UAAU,EAAE;QACV,WAAW,CAAC,EAAE,OAAO,CAAA;QACrB,YAAY,CAAC,EAAE,OAAO,CAAA;KACvB,CAAA;CACF;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,eAAe,EAAE,CAAA;IAC7B,MAAM,EAAE,eAAe,CAAA;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,yBAAyB,EAAE,CAAA;IAClC,eAAe,EAAE,MAAM,CAAA;IACvB,gBAAgB,EAAE,MAAM,CAAA;IACxB,YAAY,EAAE,MAAM,CAAA;IACpB,oBAAoB,EAAE,MAAM,CAAA;IAC5B,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CACjF;AAED;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAA;IACZ,wDAAwD;IACxD,SAAS,EAAE,MAAM,CAAA;IACjB,wDAAwD;IACxD,OAAO,EAAE,MAAM,CAAA;IACf,2DAA2D;IAC3D,iBAAiB,EAAE,OAAO,CAAA;CAC3B;AAED;;;;GAIG;AACH,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,kBAAkB,EAAE,MAAM,CAAA;IAE1B;;;OAGG;IACH,SAAS,EAAE,MAAM,CAAA;IAEjB;;OAEG;IACH,OAAO,EAAE,MAAM,CAAA;IAEf;;;;OAIG;IACH,eAAe,CAAC,EAAE,MAAM,CAAA;IAExB,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAA;IACZ,qBAAqB;IACrB,MAAM,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,eAAe,EAAE,CAAA;IAC7B,UAAU,EAAE,iBAAiB,EAAE,CAAA;IAC/B,0CAA0C;IAC1C,mBAAmB,EAAE,kBAAkB,EAAE,CAAA;CAC1C;AAED;;;;;;;GAOG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAClC,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IACP,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,aAAa,EAAE,MAAM,CAAA;IACrB,YAAY,EAAE,MAAM,CAAA;CACrB,KACE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA"}
|