i18next-cli 1.66.2 → 1.67.0
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/README.md +23 -1
- package/dist/cjs/cli.js +1 -1
- package/dist/cjs/linter.js +220 -76
- package/dist/esm/cli.js +1 -1
- package/dist/esm/linter.js +221 -77
- package/package.json +1 -1
- package/types/linter.d.ts.map +1 -1
- package/types/types.d.ts +11 -1
- package/types/types.d.ts.map +1 -1
package/README.md
CHANGED
|
@@ -307,12 +307,30 @@ npx i18next-cli sync
|
|
|
307
307
|
```
|
|
308
308
|
|
|
309
309
|
### `lint`
|
|
310
|
-
Analyzes your source code for internationalization issues
|
|
310
|
+
Analyzes your source code for internationalization issues. Can run without a config file.
|
|
311
311
|
|
|
312
312
|
```bash
|
|
313
313
|
npx i18next-cli lint
|
|
314
314
|
```
|
|
315
315
|
|
|
316
|
+
**What it checks:**
|
|
317
|
+
|
|
318
|
+
- **Hardcoded strings** *(error)* — user-facing text in JSX elements and attributes that isn't wrapped in `t()`/`<Trans>`.
|
|
319
|
+
- **Interpolation parameters** *(error)* — mismatches between `{{placeholders}}` in a translation and the params passed to `t()` (missing or unused). Toggle with `lint.checkInterpolationParams` (default: `true`).
|
|
320
|
+
- **String concatenation** *(warning)* — translated strings glued together with `+`, or a sentence split across multiple `<Trans>` components. This breaks in languages that reorder or inflect the pieces; use a single key with placeholders instead. Reported as a **warning** — it is printed but does **not** fail the run / CI (exit code stays `0` unless there are errors). Toggle with `lint.checkConcatenation` (default: `true`).
|
|
321
|
+
|
|
322
|
+
```jsx
|
|
323
|
+
// ⚠️ Flagged — word order can't be translated
|
|
324
|
+
t('greeting') + ', ' + name
|
|
325
|
+
<p><Trans>Hello</Trans> and <Trans>World</Trans></p>
|
|
326
|
+
|
|
327
|
+
// ✅ Preferred — one key, placeholders
|
|
328
|
+
t('greeting', { name }) // "Hello, {{name}}"
|
|
329
|
+
<Trans i18nKey="greeting">Hello {{name}}</Trans>
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
The linter exits non-zero only when it finds **errors**; a run with only warnings succeeds.
|
|
333
|
+
|
|
316
334
|
To suppress warnings for code you intentionally aren't translating yet, use the [`i18next-instrument-ignore` directive](#suppressing-detection-with-i18next-instrument-ignore) — the same comment recognized by the `instrument` command.
|
|
317
335
|
|
|
318
336
|
### `instrument`
|
|
@@ -927,6 +945,10 @@ export default defineConfig({
|
|
|
927
945
|
|
|
928
946
|
/** Enable linting for interpolation parameter errors in translation calls (default: true) */
|
|
929
947
|
checkInterpolationParams: true,
|
|
948
|
+
|
|
949
|
+
/** Enable linting for string concatenation involving translated strings (default: true).
|
|
950
|
+
* Reported as a warning — it does not fail the run / CI. */
|
|
951
|
+
checkConcatenation: true,
|
|
930
952
|
},
|
|
931
953
|
|
|
932
954
|
// TypeScript type generation
|
package/dist/cjs/cli.js
CHANGED
|
@@ -37,7 +37,7 @@ const program = new commander.Command();
|
|
|
37
37
|
program
|
|
38
38
|
.name('i18next-cli')
|
|
39
39
|
.description('A unified, high-performance i18next CLI.')
|
|
40
|
-
.version('1.
|
|
40
|
+
.version('1.67.0'); // This string is replaced with the actual version at build time by rollup
|
|
41
41
|
// new: global config override option
|
|
42
42
|
program.option('-c, --config <path>', 'Path to i18next-cli config file (overrides detection)');
|
|
43
43
|
program
|
package/dist/cjs/linter.js
CHANGED
|
@@ -103,6 +103,67 @@ function isI18nextOptionKey(key) {
|
|
|
103
103
|
return true;
|
|
104
104
|
return false;
|
|
105
105
|
}
|
|
106
|
+
// Builds the full dotted callee name (e.g. 'i18n.t', 'tProps.label') and the
|
|
107
|
+
// bare last segment ('t', 'label') for a CallExpression, so both exact and
|
|
108
|
+
// wildcard function patterns can be matched against it.
|
|
109
|
+
function getCalleeNames(node) {
|
|
110
|
+
let calleeName = '';
|
|
111
|
+
let fullCalleeName = '';
|
|
112
|
+
if (node.callee) {
|
|
113
|
+
if (node.callee.type === 'Identifier') {
|
|
114
|
+
calleeName = node.callee.value || node.callee.name || '';
|
|
115
|
+
fullCalleeName = calleeName;
|
|
116
|
+
}
|
|
117
|
+
else if (node.callee.type === 'MemberExpression') {
|
|
118
|
+
const parts = [];
|
|
119
|
+
let current = node.callee;
|
|
120
|
+
let computed = false;
|
|
121
|
+
while (current?.type === 'MemberExpression') {
|
|
122
|
+
if (current.property?.type === 'Identifier') {
|
|
123
|
+
parts.unshift(current.property.value || current.property.name);
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
computed = true;
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
current = current.object;
|
|
130
|
+
}
|
|
131
|
+
if (!computed) {
|
|
132
|
+
if (current?.type === 'ThisExpression') {
|
|
133
|
+
parts.unshift('this');
|
|
134
|
+
}
|
|
135
|
+
else if (current?.type === 'Identifier') {
|
|
136
|
+
parts.unshift(current.value || current.name);
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
parts.length = 0;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (node.callee.property?.type === 'Identifier') {
|
|
143
|
+
calleeName = node.callee.property.value || node.callee.property.name;
|
|
144
|
+
}
|
|
145
|
+
fullCalleeName = parts.length ? parts.join('.') : calleeName;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return { calleeName, fullCalleeName };
|
|
149
|
+
}
|
|
150
|
+
// Returns true when a CallExpression's callee matches one of the configured
|
|
151
|
+
// translation functions (config.extract.functions, default ['t', '*.t']).
|
|
152
|
+
function isTranslationCall(node, config) {
|
|
153
|
+
if (!node || node.type !== 'CallExpression')
|
|
154
|
+
return false;
|
|
155
|
+
const { calleeName, fullCalleeName } = getCalleeNames(node);
|
|
156
|
+
const fnPatterns = config.extract.functions || ['t', '*.t'];
|
|
157
|
+
for (const pattern of fnPatterns) {
|
|
158
|
+
if (functionMatcher.matchesFunctionPattern(fullCalleeName, pattern))
|
|
159
|
+
return true;
|
|
160
|
+
// Backwards-compatible: '*.X' also matches a call whose last segment is X
|
|
161
|
+
// (covers computed member expressions where the full chain is unavailable).
|
|
162
|
+
if (pattern.startsWith('*.') && calleeName === pattern.slice(2))
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
return false;
|
|
166
|
+
}
|
|
106
167
|
// Helper to lint interpolation parameter errors in t() calls
|
|
107
168
|
function lintInterpolationParams(ast, code, config, translationValues) {
|
|
108
169
|
const issues = [];
|
|
@@ -142,61 +203,7 @@ function lintInterpolationParams(ast, code, config, translationValues) {
|
|
|
142
203
|
}
|
|
143
204
|
// Modularized CallExpression handler
|
|
144
205
|
function handleCallExpression(node, ancestors) {
|
|
145
|
-
|
|
146
|
-
// the bare last segment ('t', 'label') so both exact and wildcard patterns match.
|
|
147
|
-
let calleeName = '';
|
|
148
|
-
let fullCalleeName = '';
|
|
149
|
-
if (node.callee) {
|
|
150
|
-
if (node.callee.type === 'Identifier') {
|
|
151
|
-
calleeName = node.callee.value || node.callee.name || '';
|
|
152
|
-
fullCalleeName = calleeName;
|
|
153
|
-
}
|
|
154
|
-
else if (node.callee.type === 'MemberExpression') {
|
|
155
|
-
const parts = [];
|
|
156
|
-
let current = node.callee;
|
|
157
|
-
let computed = false;
|
|
158
|
-
while (current?.type === 'MemberExpression') {
|
|
159
|
-
if (current.property?.type === 'Identifier') {
|
|
160
|
-
parts.unshift(current.property.value || current.property.name);
|
|
161
|
-
}
|
|
162
|
-
else {
|
|
163
|
-
computed = true;
|
|
164
|
-
break;
|
|
165
|
-
}
|
|
166
|
-
current = current.object;
|
|
167
|
-
}
|
|
168
|
-
if (!computed) {
|
|
169
|
-
if (current?.type === 'ThisExpression') {
|
|
170
|
-
parts.unshift('this');
|
|
171
|
-
}
|
|
172
|
-
else if (current?.type === 'Identifier') {
|
|
173
|
-
parts.unshift(current.value || current.name);
|
|
174
|
-
}
|
|
175
|
-
else {
|
|
176
|
-
parts.length = 0;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
if (node.callee.property?.type === 'Identifier') {
|
|
180
|
-
calleeName = node.callee.property.value || node.callee.property.name;
|
|
181
|
-
}
|
|
182
|
-
fullCalleeName = parts.length ? parts.join('.') : calleeName;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
const fnPatterns = config.extract.functions || ['t', '*.t'];
|
|
186
|
-
let matches = false;
|
|
187
|
-
for (const pattern of fnPatterns) {
|
|
188
|
-
if (functionMatcher.matchesFunctionPattern(fullCalleeName, pattern)) {
|
|
189
|
-
matches = true;
|
|
190
|
-
break;
|
|
191
|
-
}
|
|
192
|
-
// Backwards-compatible: '*.X' also matches a call whose last segment is X
|
|
193
|
-
// (covers computed member expressions where the full chain is unavailable).
|
|
194
|
-
if (pattern.startsWith('*.') && calleeName === pattern.slice(2)) {
|
|
195
|
-
matches = true;
|
|
196
|
-
break;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
if (matches) {
|
|
206
|
+
if (isTranslationCall(node, config)) {
|
|
200
207
|
// Support both .expression and direct node for arguments
|
|
201
208
|
const arg0raw = node.arguments?.[0];
|
|
202
209
|
const arg1raw = node.arguments?.[1];
|
|
@@ -299,6 +306,129 @@ function lintInterpolationParams(ast, code, config, translationValues) {
|
|
|
299
306
|
}
|
|
300
307
|
return issues;
|
|
301
308
|
}
|
|
309
|
+
/**
|
|
310
|
+
* Detects string concatenation involving translated strings — an i18n
|
|
311
|
+
* anti-pattern because word order and grammar differ across languages, so
|
|
312
|
+
* gluing translated fragments together produces ungrammatical output in
|
|
313
|
+
* languages that reorder, inflect, or gender the pieces.
|
|
314
|
+
*
|
|
315
|
+
* Flags two patterns:
|
|
316
|
+
* JS — a `+` expression where an operand is a t() call:
|
|
317
|
+
* t('greeting') + ', ' + name
|
|
318
|
+
* JSX — a sentence split across ≥2 <Trans> components joined by literal text:
|
|
319
|
+
* <p><Trans>Hello</Trans> and <Trans>World</Trans></p>
|
|
320
|
+
*
|
|
321
|
+
* The fix in both cases is a single key with placeholders:
|
|
322
|
+
* t('greeting', { name }) / <Trans i18nKey="greeting">Hello {{name}}</Trans>
|
|
323
|
+
*
|
|
324
|
+
* Enabled by default; disable via `lint.checkConcatenation: false`.
|
|
325
|
+
*/
|
|
326
|
+
function lintConcatenation(ast, code, config) {
|
|
327
|
+
const issues = [];
|
|
328
|
+
if (config.lint?.checkConcatenation === false)
|
|
329
|
+
return issues;
|
|
330
|
+
const transComponents = new Set((config.extract.transComponents || ['Trans']).map(s => s.toLowerCase()));
|
|
331
|
+
const lineOf = (node) => {
|
|
332
|
+
const start = node?.span?.start;
|
|
333
|
+
if (typeof start === 'number') {
|
|
334
|
+
const pos = astUtils.lineColumnFromOffset(code, start);
|
|
335
|
+
if (pos)
|
|
336
|
+
return pos.line;
|
|
337
|
+
}
|
|
338
|
+
// ponytail: span normalisation failed (also degrades ignore handling); coarse line 1.
|
|
339
|
+
return 1;
|
|
340
|
+
};
|
|
341
|
+
// Is `node` a translated-string operand of a concatenation? True when it is a
|
|
342
|
+
// t() call, or a `+` chain that itself contains one. Deliberately does NOT
|
|
343
|
+
// descend into other call/member expressions, so `arr.indexOf(t('x')) + 1`
|
|
344
|
+
// (numeric +, t() used only as a lookup argument) is not flagged.
|
|
345
|
+
const isTranslatedConcatOperand = (node) => {
|
|
346
|
+
let n = node?.expression ?? node;
|
|
347
|
+
// Unwrap parenthesis / TS assertion wrappers.
|
|
348
|
+
while (n && (n.type === 'ParenthesisExpression' || n.type === 'TsAsExpression' || n.type === 'TsNonNullExpression' || n.type === 'TsConstAssertion')) {
|
|
349
|
+
n = n.expression;
|
|
350
|
+
}
|
|
351
|
+
if (!n)
|
|
352
|
+
return false;
|
|
353
|
+
if (isTranslationCall(n, config))
|
|
354
|
+
return true;
|
|
355
|
+
if (n.type === 'BinaryExpression' && n.operator === '+') {
|
|
356
|
+
return isTranslatedConcatOperand(n.left) || isTranslatedConcatOperand(n.right);
|
|
357
|
+
}
|
|
358
|
+
return false;
|
|
359
|
+
};
|
|
360
|
+
const getJsxName = (el) => {
|
|
361
|
+
const nameNode = el?.opening?.name ?? el?.name;
|
|
362
|
+
if (!nameNode)
|
|
363
|
+
return null;
|
|
364
|
+
if (nameNode.type === 'JSXIdentifier' || nameNode.type === 'Identifier')
|
|
365
|
+
return nameNode.value ?? nameNode.name ?? null;
|
|
366
|
+
// e.g. Foo.Trans → use the last segment
|
|
367
|
+
if (nameNode.type === 'JSXMemberExpression')
|
|
368
|
+
return nameNode.property?.value ?? nameNode.property?.name ?? null;
|
|
369
|
+
return null;
|
|
370
|
+
};
|
|
371
|
+
const walk = (node, parent) => {
|
|
372
|
+
if (!node || typeof node !== 'object')
|
|
373
|
+
return;
|
|
374
|
+
// JS: `+` concatenation involving a t() call. Only report the outermost `+`
|
|
375
|
+
// of a chain (skip when the parent is also a `+`) so one chain = one issue.
|
|
376
|
+
if (node.type === 'BinaryExpression' && node.operator === '+') {
|
|
377
|
+
const parentIsPlus = parent?.type === 'BinaryExpression' && parent.operator === '+';
|
|
378
|
+
if (!parentIsPlus && (isTranslatedConcatOperand(node.left) || isTranslatedConcatOperand(node.right))) {
|
|
379
|
+
issues.push({
|
|
380
|
+
text: 'Avoid string concatenation in translations. Use a single string with placeholders instead.',
|
|
381
|
+
line: lineOf(node),
|
|
382
|
+
type: 'concatenation',
|
|
383
|
+
severity: 'warning',
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
// JSX: a sentence split across ≥2 <Trans> components joined by literal text.
|
|
388
|
+
if ((node.type === 'JSXElement' || node.type === 'JSXFragment') && Array.isArray(node.children)) {
|
|
389
|
+
let transCount = 0;
|
|
390
|
+
let firstTrans = null;
|
|
391
|
+
let hasLiteralText = false;
|
|
392
|
+
for (const child of node.children) {
|
|
393
|
+
if (!child || typeof child !== 'object')
|
|
394
|
+
continue;
|
|
395
|
+
if (child.type === 'JSXElement') {
|
|
396
|
+
const name = getJsxName(child);
|
|
397
|
+
if (name && transComponents.has(name.toLowerCase())) {
|
|
398
|
+
transCount++;
|
|
399
|
+
if (!firstTrans)
|
|
400
|
+
firstTrans = child;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
else if (child.type === 'JSXText' && child.value.trim() !== '') {
|
|
404
|
+
hasLiteralText = true;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
if (transCount >= 2 && hasLiteralText && firstTrans) {
|
|
408
|
+
issues.push({
|
|
409
|
+
text: 'Avoid splitting a sentence across multiple <Trans> components. Use a single <Trans> with placeholders instead.',
|
|
410
|
+
line: lineOf(firstTrans),
|
|
411
|
+
type: 'concatenation',
|
|
412
|
+
severity: 'warning',
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
for (const key of Object.keys(node)) {
|
|
417
|
+
if (key === 'span')
|
|
418
|
+
continue;
|
|
419
|
+
const child = node[key];
|
|
420
|
+
if (Array.isArray(child)) {
|
|
421
|
+
for (const item of child)
|
|
422
|
+
walk(item, node);
|
|
423
|
+
}
|
|
424
|
+
else if (child && typeof child === 'object') {
|
|
425
|
+
walk(child, node);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
};
|
|
429
|
+
walk(ast, null);
|
|
430
|
+
return issues;
|
|
431
|
+
}
|
|
302
432
|
const recommendedAcceptedTags = jsxAttributes.acceptedTags.map(s => s.toLowerCase());
|
|
303
433
|
const recommendedAcceptedAttributes = jsxAttributes.translatableAttributes.map(s => s.toLowerCase());
|
|
304
434
|
const defaultIgnoredAttributes = jsxAttributes.ignoredAttributeLowerSet;
|
|
@@ -426,7 +556,9 @@ class Linter extends node_events.EventEmitter {
|
|
|
426
556
|
const hardcodedStrings = findHardcodedStrings(ast, code, config);
|
|
427
557
|
// Collect interpolation parameter issues
|
|
428
558
|
const interpolationIssues = lintInterpolationParams(ast, code, config, translationValues);
|
|
429
|
-
|
|
559
|
+
// Collect string-concatenation issues
|
|
560
|
+
const concatenationIssues = lintConcatenation(ast, code, config);
|
|
561
|
+
let allIssues = [...hardcodedStrings, ...interpolationIssues, ...concatenationIssues];
|
|
430
562
|
// Filter issues suppressed by ignore-directive comments.
|
|
431
563
|
// i18next-instrument-ignore-next-line → suppresses the single next line
|
|
432
564
|
// i18next-instrument-ignore → suppresses the whole next JSX element
|
|
@@ -441,7 +573,10 @@ class Linter extends node_events.EventEmitter {
|
|
|
441
573
|
}
|
|
442
574
|
}
|
|
443
575
|
const files = Object.fromEntries(issuesByFile.entries());
|
|
444
|
-
|
|
576
|
+
// `success` reflects errors only — warning-severity issues (e.g. string
|
|
577
|
+
// concatenation) are reported but do not fail the run / CI.
|
|
578
|
+
const errorCount = Array.from(issuesByFile.values()).flat().filter(i => i.severity !== 'warning').length;
|
|
579
|
+
const data = { success: errorCount === 0, message: totalIssues > 0 ? `Linter found ${totalIssues} potential issues.` : 'No issues found.', files };
|
|
445
580
|
this.emit('done', data);
|
|
446
581
|
return data;
|
|
447
582
|
}
|
|
@@ -564,28 +699,37 @@ async function runLinterCli(config, options = {}) {
|
|
|
564
699
|
spinner.text = event.message;
|
|
565
700
|
});
|
|
566
701
|
try {
|
|
567
|
-
const {
|
|
568
|
-
|
|
702
|
+
const { message, files } = await linter.run();
|
|
703
|
+
const fileEntries = Object.entries(files);
|
|
704
|
+
const allIssues = fileEntries.flatMap(([, issues]) => issues);
|
|
705
|
+
const hasErrors = allIssues.some(i => i.severity !== 'warning');
|
|
706
|
+
const hasWarnings = allIssues.some(i => i.severity === 'warning');
|
|
707
|
+
// Summary line: fail on errors, warn when only warnings, succeed when clean.
|
|
708
|
+
if (hasErrors)
|
|
569
709
|
spinner.fail(node_util.styleText(['red', 'bold'], message));
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
internalLogger.info(node_util.styleText('yellow', `\n${file}`));
|
|
574
|
-
else
|
|
575
|
-
console.log(node_util.styleText('yellow', `\n${file}`));
|
|
576
|
-
issues.forEach(({ text, line, type }) => {
|
|
577
|
-
const label = type === 'interpolation' ? 'Interpolation issue' : 'Found hardcoded string';
|
|
578
|
-
if (typeof internalLogger.info === 'function')
|
|
579
|
-
internalLogger.info(` ${node_util.styleText('gray', `${line}:`)} ${node_util.styleText('red', 'Error:')} ${label}: "${text}"`);
|
|
580
|
-
else
|
|
581
|
-
console.log(` ${node_util.styleText('gray', `${line}:`)} ${node_util.styleText('red', 'Error:')} ${label}: "${text}"`);
|
|
582
|
-
});
|
|
583
|
-
}
|
|
584
|
-
process.exit(1);
|
|
585
|
-
}
|
|
586
|
-
else {
|
|
710
|
+
else if (hasWarnings)
|
|
711
|
+
spinner.warn(node_util.styleText(['yellow', 'bold'], message));
|
|
712
|
+
else
|
|
587
713
|
spinner.succeed(node_util.styleText(['green', 'bold'], message));
|
|
714
|
+
// Detailed report — colour each line by severity (red Error / yellow Warning).
|
|
715
|
+
for (const [file, issues] of fileEntries) {
|
|
716
|
+
if (internalLogger.info)
|
|
717
|
+
internalLogger.info(node_util.styleText('yellow', `\n${file}`));
|
|
718
|
+
else
|
|
719
|
+
console.log(node_util.styleText('yellow', `\n${file}`));
|
|
720
|
+
issues.forEach(({ text, line, type, severity }) => {
|
|
721
|
+
const label = type === 'interpolation' ? 'Interpolation issue' : type === 'concatenation' ? 'String concatenation' : 'Found hardcoded string';
|
|
722
|
+
const tag = severity === 'warning' ? node_util.styleText('yellow', 'Warning:') : node_util.styleText('red', 'Error:');
|
|
723
|
+
const detail = ` ${node_util.styleText('gray', `${line}:`)} ${tag} ${label}: "${text}"`;
|
|
724
|
+
if (typeof internalLogger.info === 'function')
|
|
725
|
+
internalLogger.info(detail);
|
|
726
|
+
else
|
|
727
|
+
console.log(detail);
|
|
728
|
+
});
|
|
588
729
|
}
|
|
730
|
+
// Only errors fail the process; warning-only runs exit 0.
|
|
731
|
+
if (hasErrors)
|
|
732
|
+
process.exit(1);
|
|
589
733
|
}
|
|
590
734
|
catch (error) {
|
|
591
735
|
const wrappedError = linter.wrapError(error);
|
package/dist/esm/cli.js
CHANGED
|
@@ -31,7 +31,7 @@ const program = new Command();
|
|
|
31
31
|
program
|
|
32
32
|
.name('i18next-cli')
|
|
33
33
|
.description('A unified, high-performance i18next CLI.')
|
|
34
|
-
.version('1.
|
|
34
|
+
.version('1.67.0'); // 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
|
package/dist/esm/linter.js
CHANGED
|
@@ -7,7 +7,7 @@ import { styleText } from 'node:util';
|
|
|
7
7
|
import { ConsoleLogger } from './utils/logger.js';
|
|
8
8
|
import { createSpinnerLike } from './utils/wrap-ora.js';
|
|
9
9
|
import { acceptedTags, translatableAttributes, ignoredTags, ignoredAttributeLowerSet } from './utils/jsx-attributes.js';
|
|
10
|
-
import { findFirstTokenIndex, normalizeASTSpans, buildByteToCharMap, convertSpansToCharIndices, collectIgnoredLineRanges } from './extractor/parsers/ast-utils.js';
|
|
10
|
+
import { findFirstTokenIndex, normalizeASTSpans, buildByteToCharMap, convertSpansToCharIndices, collectIgnoredLineRanges, lineColumnFromOffset } from './extractor/parsers/ast-utils.js';
|
|
11
11
|
import { matchesFunctionPattern } from './extractor/utils/function-matcher.js';
|
|
12
12
|
|
|
13
13
|
/**
|
|
@@ -101,6 +101,67 @@ function isI18nextOptionKey(key) {
|
|
|
101
101
|
return true;
|
|
102
102
|
return false;
|
|
103
103
|
}
|
|
104
|
+
// Builds the full dotted callee name (e.g. 'i18n.t', 'tProps.label') and the
|
|
105
|
+
// bare last segment ('t', 'label') for a CallExpression, so both exact and
|
|
106
|
+
// wildcard function patterns can be matched against it.
|
|
107
|
+
function getCalleeNames(node) {
|
|
108
|
+
let calleeName = '';
|
|
109
|
+
let fullCalleeName = '';
|
|
110
|
+
if (node.callee) {
|
|
111
|
+
if (node.callee.type === 'Identifier') {
|
|
112
|
+
calleeName = node.callee.value || node.callee.name || '';
|
|
113
|
+
fullCalleeName = calleeName;
|
|
114
|
+
}
|
|
115
|
+
else if (node.callee.type === 'MemberExpression') {
|
|
116
|
+
const parts = [];
|
|
117
|
+
let current = node.callee;
|
|
118
|
+
let computed = false;
|
|
119
|
+
while (current?.type === 'MemberExpression') {
|
|
120
|
+
if (current.property?.type === 'Identifier') {
|
|
121
|
+
parts.unshift(current.property.value || current.property.name);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
computed = true;
|
|
125
|
+
break;
|
|
126
|
+
}
|
|
127
|
+
current = current.object;
|
|
128
|
+
}
|
|
129
|
+
if (!computed) {
|
|
130
|
+
if (current?.type === 'ThisExpression') {
|
|
131
|
+
parts.unshift('this');
|
|
132
|
+
}
|
|
133
|
+
else if (current?.type === 'Identifier') {
|
|
134
|
+
parts.unshift(current.value || current.name);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
parts.length = 0;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (node.callee.property?.type === 'Identifier') {
|
|
141
|
+
calleeName = node.callee.property.value || node.callee.property.name;
|
|
142
|
+
}
|
|
143
|
+
fullCalleeName = parts.length ? parts.join('.') : calleeName;
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
return { calleeName, fullCalleeName };
|
|
147
|
+
}
|
|
148
|
+
// Returns true when a CallExpression's callee matches one of the configured
|
|
149
|
+
// translation functions (config.extract.functions, default ['t', '*.t']).
|
|
150
|
+
function isTranslationCall(node, config) {
|
|
151
|
+
if (!node || node.type !== 'CallExpression')
|
|
152
|
+
return false;
|
|
153
|
+
const { calleeName, fullCalleeName } = getCalleeNames(node);
|
|
154
|
+
const fnPatterns = config.extract.functions || ['t', '*.t'];
|
|
155
|
+
for (const pattern of fnPatterns) {
|
|
156
|
+
if (matchesFunctionPattern(fullCalleeName, pattern))
|
|
157
|
+
return true;
|
|
158
|
+
// Backwards-compatible: '*.X' also matches a call whose last segment is X
|
|
159
|
+
// (covers computed member expressions where the full chain is unavailable).
|
|
160
|
+
if (pattern.startsWith('*.') && calleeName === pattern.slice(2))
|
|
161
|
+
return true;
|
|
162
|
+
}
|
|
163
|
+
return false;
|
|
164
|
+
}
|
|
104
165
|
// Helper to lint interpolation parameter errors in t() calls
|
|
105
166
|
function lintInterpolationParams(ast, code, config, translationValues) {
|
|
106
167
|
const issues = [];
|
|
@@ -140,61 +201,7 @@ function lintInterpolationParams(ast, code, config, translationValues) {
|
|
|
140
201
|
}
|
|
141
202
|
// Modularized CallExpression handler
|
|
142
203
|
function handleCallExpression(node, ancestors) {
|
|
143
|
-
|
|
144
|
-
// the bare last segment ('t', 'label') so both exact and wildcard patterns match.
|
|
145
|
-
let calleeName = '';
|
|
146
|
-
let fullCalleeName = '';
|
|
147
|
-
if (node.callee) {
|
|
148
|
-
if (node.callee.type === 'Identifier') {
|
|
149
|
-
calleeName = node.callee.value || node.callee.name || '';
|
|
150
|
-
fullCalleeName = calleeName;
|
|
151
|
-
}
|
|
152
|
-
else if (node.callee.type === 'MemberExpression') {
|
|
153
|
-
const parts = [];
|
|
154
|
-
let current = node.callee;
|
|
155
|
-
let computed = false;
|
|
156
|
-
while (current?.type === 'MemberExpression') {
|
|
157
|
-
if (current.property?.type === 'Identifier') {
|
|
158
|
-
parts.unshift(current.property.value || current.property.name);
|
|
159
|
-
}
|
|
160
|
-
else {
|
|
161
|
-
computed = true;
|
|
162
|
-
break;
|
|
163
|
-
}
|
|
164
|
-
current = current.object;
|
|
165
|
-
}
|
|
166
|
-
if (!computed) {
|
|
167
|
-
if (current?.type === 'ThisExpression') {
|
|
168
|
-
parts.unshift('this');
|
|
169
|
-
}
|
|
170
|
-
else if (current?.type === 'Identifier') {
|
|
171
|
-
parts.unshift(current.value || current.name);
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
parts.length = 0;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
if (node.callee.property?.type === 'Identifier') {
|
|
178
|
-
calleeName = node.callee.property.value || node.callee.property.name;
|
|
179
|
-
}
|
|
180
|
-
fullCalleeName = parts.length ? parts.join('.') : calleeName;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
const fnPatterns = config.extract.functions || ['t', '*.t'];
|
|
184
|
-
let matches = false;
|
|
185
|
-
for (const pattern of fnPatterns) {
|
|
186
|
-
if (matchesFunctionPattern(fullCalleeName, pattern)) {
|
|
187
|
-
matches = true;
|
|
188
|
-
break;
|
|
189
|
-
}
|
|
190
|
-
// Backwards-compatible: '*.X' also matches a call whose last segment is X
|
|
191
|
-
// (covers computed member expressions where the full chain is unavailable).
|
|
192
|
-
if (pattern.startsWith('*.') && calleeName === pattern.slice(2)) {
|
|
193
|
-
matches = true;
|
|
194
|
-
break;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
if (matches) {
|
|
204
|
+
if (isTranslationCall(node, config)) {
|
|
198
205
|
// Support both .expression and direct node for arguments
|
|
199
206
|
const arg0raw = node.arguments?.[0];
|
|
200
207
|
const arg1raw = node.arguments?.[1];
|
|
@@ -297,6 +304,129 @@ function lintInterpolationParams(ast, code, config, translationValues) {
|
|
|
297
304
|
}
|
|
298
305
|
return issues;
|
|
299
306
|
}
|
|
307
|
+
/**
|
|
308
|
+
* Detects string concatenation involving translated strings — an i18n
|
|
309
|
+
* anti-pattern because word order and grammar differ across languages, so
|
|
310
|
+
* gluing translated fragments together produces ungrammatical output in
|
|
311
|
+
* languages that reorder, inflect, or gender the pieces.
|
|
312
|
+
*
|
|
313
|
+
* Flags two patterns:
|
|
314
|
+
* JS — a `+` expression where an operand is a t() call:
|
|
315
|
+
* t('greeting') + ', ' + name
|
|
316
|
+
* JSX — a sentence split across ≥2 <Trans> components joined by literal text:
|
|
317
|
+
* <p><Trans>Hello</Trans> and <Trans>World</Trans></p>
|
|
318
|
+
*
|
|
319
|
+
* The fix in both cases is a single key with placeholders:
|
|
320
|
+
* t('greeting', { name }) / <Trans i18nKey="greeting">Hello {{name}}</Trans>
|
|
321
|
+
*
|
|
322
|
+
* Enabled by default; disable via `lint.checkConcatenation: false`.
|
|
323
|
+
*/
|
|
324
|
+
function lintConcatenation(ast, code, config) {
|
|
325
|
+
const issues = [];
|
|
326
|
+
if (config.lint?.checkConcatenation === false)
|
|
327
|
+
return issues;
|
|
328
|
+
const transComponents = new Set((config.extract.transComponents || ['Trans']).map(s => s.toLowerCase()));
|
|
329
|
+
const lineOf = (node) => {
|
|
330
|
+
const start = node?.span?.start;
|
|
331
|
+
if (typeof start === 'number') {
|
|
332
|
+
const pos = lineColumnFromOffset(code, start);
|
|
333
|
+
if (pos)
|
|
334
|
+
return pos.line;
|
|
335
|
+
}
|
|
336
|
+
// ponytail: span normalisation failed (also degrades ignore handling); coarse line 1.
|
|
337
|
+
return 1;
|
|
338
|
+
};
|
|
339
|
+
// Is `node` a translated-string operand of a concatenation? True when it is a
|
|
340
|
+
// t() call, or a `+` chain that itself contains one. Deliberately does NOT
|
|
341
|
+
// descend into other call/member expressions, so `arr.indexOf(t('x')) + 1`
|
|
342
|
+
// (numeric +, t() used only as a lookup argument) is not flagged.
|
|
343
|
+
const isTranslatedConcatOperand = (node) => {
|
|
344
|
+
let n = node?.expression ?? node;
|
|
345
|
+
// Unwrap parenthesis / TS assertion wrappers.
|
|
346
|
+
while (n && (n.type === 'ParenthesisExpression' || n.type === 'TsAsExpression' || n.type === 'TsNonNullExpression' || n.type === 'TsConstAssertion')) {
|
|
347
|
+
n = n.expression;
|
|
348
|
+
}
|
|
349
|
+
if (!n)
|
|
350
|
+
return false;
|
|
351
|
+
if (isTranslationCall(n, config))
|
|
352
|
+
return true;
|
|
353
|
+
if (n.type === 'BinaryExpression' && n.operator === '+') {
|
|
354
|
+
return isTranslatedConcatOperand(n.left) || isTranslatedConcatOperand(n.right);
|
|
355
|
+
}
|
|
356
|
+
return false;
|
|
357
|
+
};
|
|
358
|
+
const getJsxName = (el) => {
|
|
359
|
+
const nameNode = el?.opening?.name ?? el?.name;
|
|
360
|
+
if (!nameNode)
|
|
361
|
+
return null;
|
|
362
|
+
if (nameNode.type === 'JSXIdentifier' || nameNode.type === 'Identifier')
|
|
363
|
+
return nameNode.value ?? nameNode.name ?? null;
|
|
364
|
+
// e.g. Foo.Trans → use the last segment
|
|
365
|
+
if (nameNode.type === 'JSXMemberExpression')
|
|
366
|
+
return nameNode.property?.value ?? nameNode.property?.name ?? null;
|
|
367
|
+
return null;
|
|
368
|
+
};
|
|
369
|
+
const walk = (node, parent) => {
|
|
370
|
+
if (!node || typeof node !== 'object')
|
|
371
|
+
return;
|
|
372
|
+
// JS: `+` concatenation involving a t() call. Only report the outermost `+`
|
|
373
|
+
// of a chain (skip when the parent is also a `+`) so one chain = one issue.
|
|
374
|
+
if (node.type === 'BinaryExpression' && node.operator === '+') {
|
|
375
|
+
const parentIsPlus = parent?.type === 'BinaryExpression' && parent.operator === '+';
|
|
376
|
+
if (!parentIsPlus && (isTranslatedConcatOperand(node.left) || isTranslatedConcatOperand(node.right))) {
|
|
377
|
+
issues.push({
|
|
378
|
+
text: 'Avoid string concatenation in translations. Use a single string with placeholders instead.',
|
|
379
|
+
line: lineOf(node),
|
|
380
|
+
type: 'concatenation',
|
|
381
|
+
severity: 'warning',
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
// JSX: a sentence split across ≥2 <Trans> components joined by literal text.
|
|
386
|
+
if ((node.type === 'JSXElement' || node.type === 'JSXFragment') && Array.isArray(node.children)) {
|
|
387
|
+
let transCount = 0;
|
|
388
|
+
let firstTrans = null;
|
|
389
|
+
let hasLiteralText = false;
|
|
390
|
+
for (const child of node.children) {
|
|
391
|
+
if (!child || typeof child !== 'object')
|
|
392
|
+
continue;
|
|
393
|
+
if (child.type === 'JSXElement') {
|
|
394
|
+
const name = getJsxName(child);
|
|
395
|
+
if (name && transComponents.has(name.toLowerCase())) {
|
|
396
|
+
transCount++;
|
|
397
|
+
if (!firstTrans)
|
|
398
|
+
firstTrans = child;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
else if (child.type === 'JSXText' && child.value.trim() !== '') {
|
|
402
|
+
hasLiteralText = true;
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
if (transCount >= 2 && hasLiteralText && firstTrans) {
|
|
406
|
+
issues.push({
|
|
407
|
+
text: 'Avoid splitting a sentence across multiple <Trans> components. Use a single <Trans> with placeholders instead.',
|
|
408
|
+
line: lineOf(firstTrans),
|
|
409
|
+
type: 'concatenation',
|
|
410
|
+
severity: 'warning',
|
|
411
|
+
});
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
for (const key of Object.keys(node)) {
|
|
415
|
+
if (key === 'span')
|
|
416
|
+
continue;
|
|
417
|
+
const child = node[key];
|
|
418
|
+
if (Array.isArray(child)) {
|
|
419
|
+
for (const item of child)
|
|
420
|
+
walk(item, node);
|
|
421
|
+
}
|
|
422
|
+
else if (child && typeof child === 'object') {
|
|
423
|
+
walk(child, node);
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
};
|
|
427
|
+
walk(ast, null);
|
|
428
|
+
return issues;
|
|
429
|
+
}
|
|
300
430
|
const recommendedAcceptedTags = acceptedTags.map(s => s.toLowerCase());
|
|
301
431
|
const recommendedAcceptedAttributes = translatableAttributes.map(s => s.toLowerCase());
|
|
302
432
|
const defaultIgnoredAttributes = ignoredAttributeLowerSet;
|
|
@@ -424,7 +554,9 @@ class Linter extends EventEmitter {
|
|
|
424
554
|
const hardcodedStrings = findHardcodedStrings(ast, code, config);
|
|
425
555
|
// Collect interpolation parameter issues
|
|
426
556
|
const interpolationIssues = lintInterpolationParams(ast, code, config, translationValues);
|
|
427
|
-
|
|
557
|
+
// Collect string-concatenation issues
|
|
558
|
+
const concatenationIssues = lintConcatenation(ast, code, config);
|
|
559
|
+
let allIssues = [...hardcodedStrings, ...interpolationIssues, ...concatenationIssues];
|
|
428
560
|
// Filter issues suppressed by ignore-directive comments.
|
|
429
561
|
// i18next-instrument-ignore-next-line → suppresses the single next line
|
|
430
562
|
// i18next-instrument-ignore → suppresses the whole next JSX element
|
|
@@ -439,7 +571,10 @@ class Linter extends EventEmitter {
|
|
|
439
571
|
}
|
|
440
572
|
}
|
|
441
573
|
const files = Object.fromEntries(issuesByFile.entries());
|
|
442
|
-
|
|
574
|
+
// `success` reflects errors only — warning-severity issues (e.g. string
|
|
575
|
+
// concatenation) are reported but do not fail the run / CI.
|
|
576
|
+
const errorCount = Array.from(issuesByFile.values()).flat().filter(i => i.severity !== 'warning').length;
|
|
577
|
+
const data = { success: errorCount === 0, message: totalIssues > 0 ? `Linter found ${totalIssues} potential issues.` : 'No issues found.', files };
|
|
443
578
|
this.emit('done', data);
|
|
444
579
|
return data;
|
|
445
580
|
}
|
|
@@ -562,28 +697,37 @@ async function runLinterCli(config, options = {}) {
|
|
|
562
697
|
spinner.text = event.message;
|
|
563
698
|
});
|
|
564
699
|
try {
|
|
565
|
-
const {
|
|
566
|
-
|
|
700
|
+
const { message, files } = await linter.run();
|
|
701
|
+
const fileEntries = Object.entries(files);
|
|
702
|
+
const allIssues = fileEntries.flatMap(([, issues]) => issues);
|
|
703
|
+
const hasErrors = allIssues.some(i => i.severity !== 'warning');
|
|
704
|
+
const hasWarnings = allIssues.some(i => i.severity === 'warning');
|
|
705
|
+
// Summary line: fail on errors, warn when only warnings, succeed when clean.
|
|
706
|
+
if (hasErrors)
|
|
567
707
|
spinner.fail(styleText(['red', 'bold'], message));
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
internalLogger.info(styleText('yellow', `\n${file}`));
|
|
572
|
-
else
|
|
573
|
-
console.log(styleText('yellow', `\n${file}`));
|
|
574
|
-
issues.forEach(({ text, line, type }) => {
|
|
575
|
-
const label = type === 'interpolation' ? 'Interpolation issue' : 'Found hardcoded string';
|
|
576
|
-
if (typeof internalLogger.info === 'function')
|
|
577
|
-
internalLogger.info(` ${styleText('gray', `${line}:`)} ${styleText('red', 'Error:')} ${label}: "${text}"`);
|
|
578
|
-
else
|
|
579
|
-
console.log(` ${styleText('gray', `${line}:`)} ${styleText('red', 'Error:')} ${label}: "${text}"`);
|
|
580
|
-
});
|
|
581
|
-
}
|
|
582
|
-
process.exit(1);
|
|
583
|
-
}
|
|
584
|
-
else {
|
|
708
|
+
else if (hasWarnings)
|
|
709
|
+
spinner.warn(styleText(['yellow', 'bold'], message));
|
|
710
|
+
else
|
|
585
711
|
spinner.succeed(styleText(['green', 'bold'], message));
|
|
712
|
+
// Detailed report — colour each line by severity (red Error / yellow Warning).
|
|
713
|
+
for (const [file, issues] of fileEntries) {
|
|
714
|
+
if (internalLogger.info)
|
|
715
|
+
internalLogger.info(styleText('yellow', `\n${file}`));
|
|
716
|
+
else
|
|
717
|
+
console.log(styleText('yellow', `\n${file}`));
|
|
718
|
+
issues.forEach(({ text, line, type, severity }) => {
|
|
719
|
+
const label = type === 'interpolation' ? 'Interpolation issue' : type === 'concatenation' ? 'String concatenation' : 'Found hardcoded string';
|
|
720
|
+
const tag = severity === 'warning' ? styleText('yellow', 'Warning:') : styleText('red', 'Error:');
|
|
721
|
+
const detail = ` ${styleText('gray', `${line}:`)} ${tag} ${label}: "${text}"`;
|
|
722
|
+
if (typeof internalLogger.info === 'function')
|
|
723
|
+
internalLogger.info(detail);
|
|
724
|
+
else
|
|
725
|
+
console.log(detail);
|
|
726
|
+
});
|
|
586
727
|
}
|
|
728
|
+
// Only errors fail the process; warning-only runs exit 0.
|
|
729
|
+
if (hasErrors)
|
|
730
|
+
process.exit(1);
|
|
587
731
|
}
|
|
588
732
|
catch (error) {
|
|
589
733
|
const wrappedError = linter.wrapError(error);
|
package/package.json
CHANGED
package/types/linter.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../src/linter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAO1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAA6B,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"linter.d.ts","sourceRoot":"","sources":["../src/linter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAO1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAA6B,MAAM,YAAY,CAAA;AA2apG,KAAK,cAAc,GAAG;IACpB,QAAQ,EAAE;QAAC;YACT,OAAO,EAAE,MAAM,CAAC;SACjB;KAAC,CAAC;IACH,IAAI,EAAE;QAAC;YACL,OAAO,EAAE,OAAO,CAAC;YACjB,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;SACpC;KAAC,CAAC;IACH,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;CACvB,CAAA;AAED,eAAO,MAAM,uBAAuB,EAAE,MAAM,EAAiD,CAAA;AAC7F,eAAO,MAAM,6BAA6B,EAAE,MAAM,EAAqD,CAAA;AAKvG,qBAAa,MAAO,SAAQ,YAAY,CAAC,cAAc,CAAC;IACtD,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAQ;gBAET,MAAM,EAAE,oBAAoB,EAAE,MAAM,GAAE,MAA4B;IAM/E,SAAS,CAAE,KAAK,EAAE,OAAO;IAanB,GAAG;;;;;;;IAuIT,OAAO,CAAC,uBAAuB;YAOjB,qBAAqB;IAWnC,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,0BAA0B;YAUpB,qBAAqB;YAgBrB,uBAAuB;CAgBtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,SAAS,CAAE,MAAM,EAAE,oBAAoB;;;;;;GAE5D;AAED,wBAAsB,YAAY,CAChC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,iBA0CnD"}
|
package/types/types.d.ts
CHANGED
|
@@ -219,6 +219,13 @@ export interface I18nextToolkitConfig {
|
|
|
219
219
|
ignore?: string | string[];
|
|
220
220
|
/** Enable linting for interpolation parameter errors in translation calls (default: true) */
|
|
221
221
|
checkInterpolationParams?: boolean;
|
|
222
|
+
/** Enable linting for string concatenation involving translated strings (default: true).
|
|
223
|
+
*
|
|
224
|
+
* Flags patterns like `t('greeting') + ', ' + name` and sentences split across
|
|
225
|
+
* multiple `<Trans>` components joined by literal text, which break in languages
|
|
226
|
+
* that reorder or inflect the pieces. Use a single key with placeholders instead.
|
|
227
|
+
*/
|
|
228
|
+
checkConcatenation?: boolean;
|
|
222
229
|
};
|
|
223
230
|
/** Configuration options for TypeScript type generation */
|
|
224
231
|
types?: {
|
|
@@ -314,7 +321,10 @@ export interface LintIssue {
|
|
|
314
321
|
/** Line number where the issue was found */
|
|
315
322
|
line: number;
|
|
316
323
|
/** Issue category */
|
|
317
|
-
type?: 'hardcoded' | 'interpolation';
|
|
324
|
+
type?: 'hardcoded' | 'interpolation' | 'concatenation';
|
|
325
|
+
/** Severity of the issue. Defaults to 'error' (fails the lint run / CI); 'warning' is
|
|
326
|
+
* reported but does not fail the run. Concatenation issues are reported as warnings. */
|
|
327
|
+
severity?: 'error' | 'warning';
|
|
318
328
|
}
|
|
319
329
|
/**
|
|
320
330
|
* Context object provided to linter plugin hooks.
|
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;;;;;WAKG;QACH,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,KAAK,CAAC;QAEvC,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;;;;;WAKG;QACH,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,KAAK,MAAM,CAAC,CAAC;QAE3E,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;;;;;;WAMG;QACH,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;QAEnC;;;;;WAKG;QACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,CAAC;IAEF,2DAA2D;IAC3D,KAAK,CAAC,EAAE;QACN;;;;;;;;;;;WAWG;QACH,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAEzB;;;;;;;;;;WAUG;QACH,QAAQ,CAAC,EAAE,MAAM,CAAC;QAElB,0DAA0D;QAC1D,MAAM,EAAE,MAAM,CAAC;QAEf;;;;;;;;;;;WAWG;QACH,cAAc,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;QAEjD,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,yEAAyE;QACzE,WAAW,CAAC,EAAE,MAAM,CAAC;QAErB,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;QAEjB;;;;WAIG;QACH,aAAa,CAAC,EAAE,OAAO,CAAC;QAExB,oHAAoH;QACpH,mBAAmB,CAAC,EAAE,OAAO,CAAC;QAE9B,iGAAiG;QACjG,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;KACnC,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,GAAG,eAAe,CAAC;IACvD;4FACwF;IACxF,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;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,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IAEf,gFAAgF;IAChF,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,+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;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,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"}
|