i18next-cli 1.66.2 → 1.67.1
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 +24 -1
- package/dist/cjs/cli.js +1 -1
- package/dist/cjs/linter.js +226 -76
- package/dist/esm/cli.js +1 -1
- package/dist/esm/linter.js +227 -77
- package/package.json +1 -1
- package/types/linter.d.ts.map +1 -1
- package/types/types.d.ts +16 -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 by default)* — 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. Configure with `lint.checkConcatenation`: `'warn'` / `true` (default) reports it without failing the run, `'error'` makes it fail (exit non-zero, useful for CI), and `'off'` / `false` disables it.
|
|
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,11 @@ export default defineConfig({
|
|
|
927
945
|
|
|
928
946
|
/** Enable linting for interpolation parameter errors in translation calls (default: true) */
|
|
929
947
|
checkInterpolationParams: true,
|
|
948
|
+
|
|
949
|
+
/** Lint string concatenation involving translated strings (default: 'warn').
|
|
950
|
+
* 'warn'/true reports without failing the run, 'error' fails the run (exit non-zero,
|
|
951
|
+
* good for CI), 'off'/false disables it. */
|
|
952
|
+
checkConcatenation: 'warn',
|
|
930
953
|
},
|
|
931
954
|
|
|
932
955
|
// 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.1'); // 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,135 @@ 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
|
+
* Severity is controlled by `lint.checkConcatenation`: 'warn' (default) reports
|
|
325
|
+
* without failing the run, 'error' makes it fail (exit non-zero), 'off'/false
|
|
326
|
+
* disables it.
|
|
327
|
+
*/
|
|
328
|
+
function lintConcatenation(ast, code, config) {
|
|
329
|
+
const issues = [];
|
|
330
|
+
// Resolve the check's severity. Default 'warn'. `false`/'off' disable it;
|
|
331
|
+
// `'error'` makes concatenation fail the run (exit non-zero); `true`/'warn' warn.
|
|
332
|
+
const setting = config.lint?.checkConcatenation;
|
|
333
|
+
if (setting === false || setting === 'off')
|
|
334
|
+
return issues;
|
|
335
|
+
const severity = setting === 'error' ? 'error' : 'warning';
|
|
336
|
+
const transComponents = new Set((config.extract.transComponents || ['Trans']).map(s => s.toLowerCase()));
|
|
337
|
+
const lineOf = (node) => {
|
|
338
|
+
const start = node?.span?.start;
|
|
339
|
+
if (typeof start === 'number') {
|
|
340
|
+
const pos = astUtils.lineColumnFromOffset(code, start);
|
|
341
|
+
if (pos)
|
|
342
|
+
return pos.line;
|
|
343
|
+
}
|
|
344
|
+
// ponytail: span normalisation failed (also degrades ignore handling); coarse line 1.
|
|
345
|
+
return 1;
|
|
346
|
+
};
|
|
347
|
+
// Is `node` a translated-string operand of a concatenation? True when it is a
|
|
348
|
+
// t() call, or a `+` chain that itself contains one. Deliberately does NOT
|
|
349
|
+
// descend into other call/member expressions, so `arr.indexOf(t('x')) + 1`
|
|
350
|
+
// (numeric +, t() used only as a lookup argument) is not flagged.
|
|
351
|
+
const isTranslatedConcatOperand = (node) => {
|
|
352
|
+
let n = node?.expression ?? node;
|
|
353
|
+
// Unwrap parenthesis / TS assertion wrappers.
|
|
354
|
+
while (n && (n.type === 'ParenthesisExpression' || n.type === 'TsAsExpression' || n.type === 'TsNonNullExpression' || n.type === 'TsConstAssertion')) {
|
|
355
|
+
n = n.expression;
|
|
356
|
+
}
|
|
357
|
+
if (!n)
|
|
358
|
+
return false;
|
|
359
|
+
if (isTranslationCall(n, config))
|
|
360
|
+
return true;
|
|
361
|
+
if (n.type === 'BinaryExpression' && n.operator === '+') {
|
|
362
|
+
return isTranslatedConcatOperand(n.left) || isTranslatedConcatOperand(n.right);
|
|
363
|
+
}
|
|
364
|
+
return false;
|
|
365
|
+
};
|
|
366
|
+
const getJsxName = (el) => {
|
|
367
|
+
const nameNode = el?.opening?.name ?? el?.name;
|
|
368
|
+
if (!nameNode)
|
|
369
|
+
return null;
|
|
370
|
+
if (nameNode.type === 'JSXIdentifier' || nameNode.type === 'Identifier')
|
|
371
|
+
return nameNode.value ?? nameNode.name ?? null;
|
|
372
|
+
// e.g. Foo.Trans → use the last segment
|
|
373
|
+
if (nameNode.type === 'JSXMemberExpression')
|
|
374
|
+
return nameNode.property?.value ?? nameNode.property?.name ?? null;
|
|
375
|
+
return null;
|
|
376
|
+
};
|
|
377
|
+
const walk = (node, parent) => {
|
|
378
|
+
if (!node || typeof node !== 'object')
|
|
379
|
+
return;
|
|
380
|
+
// JS: `+` concatenation involving a t() call. Only report the outermost `+`
|
|
381
|
+
// of a chain (skip when the parent is also a `+`) so one chain = one issue.
|
|
382
|
+
if (node.type === 'BinaryExpression' && node.operator === '+') {
|
|
383
|
+
const parentIsPlus = parent?.type === 'BinaryExpression' && parent.operator === '+';
|
|
384
|
+
if (!parentIsPlus && (isTranslatedConcatOperand(node.left) || isTranslatedConcatOperand(node.right))) {
|
|
385
|
+
issues.push({
|
|
386
|
+
text: 'Avoid string concatenation in translations. Use a single string with placeholders instead.',
|
|
387
|
+
line: lineOf(node),
|
|
388
|
+
type: 'concatenation',
|
|
389
|
+
severity,
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
// JSX: a sentence split across ≥2 <Trans> components joined by literal text.
|
|
394
|
+
if ((node.type === 'JSXElement' || node.type === 'JSXFragment') && Array.isArray(node.children)) {
|
|
395
|
+
let transCount = 0;
|
|
396
|
+
let firstTrans = null;
|
|
397
|
+
let hasLiteralText = false;
|
|
398
|
+
for (const child of node.children) {
|
|
399
|
+
if (!child || typeof child !== 'object')
|
|
400
|
+
continue;
|
|
401
|
+
if (child.type === 'JSXElement') {
|
|
402
|
+
const name = getJsxName(child);
|
|
403
|
+
if (name && transComponents.has(name.toLowerCase())) {
|
|
404
|
+
transCount++;
|
|
405
|
+
if (!firstTrans)
|
|
406
|
+
firstTrans = child;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
else if (child.type === 'JSXText' && child.value.trim() !== '') {
|
|
410
|
+
hasLiteralText = true;
|
|
411
|
+
}
|
|
412
|
+
}
|
|
413
|
+
if (transCount >= 2 && hasLiteralText && firstTrans) {
|
|
414
|
+
issues.push({
|
|
415
|
+
text: 'Avoid splitting a sentence across multiple <Trans> components. Use a single <Trans> with placeholders instead.',
|
|
416
|
+
line: lineOf(firstTrans),
|
|
417
|
+
type: 'concatenation',
|
|
418
|
+
severity,
|
|
419
|
+
});
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
for (const key of Object.keys(node)) {
|
|
423
|
+
if (key === 'span')
|
|
424
|
+
continue;
|
|
425
|
+
const child = node[key];
|
|
426
|
+
if (Array.isArray(child)) {
|
|
427
|
+
for (const item of child)
|
|
428
|
+
walk(item, node);
|
|
429
|
+
}
|
|
430
|
+
else if (child && typeof child === 'object') {
|
|
431
|
+
walk(child, node);
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
};
|
|
435
|
+
walk(ast, null);
|
|
436
|
+
return issues;
|
|
437
|
+
}
|
|
302
438
|
const recommendedAcceptedTags = jsxAttributes.acceptedTags.map(s => s.toLowerCase());
|
|
303
439
|
const recommendedAcceptedAttributes = jsxAttributes.translatableAttributes.map(s => s.toLowerCase());
|
|
304
440
|
const defaultIgnoredAttributes = jsxAttributes.ignoredAttributeLowerSet;
|
|
@@ -426,7 +562,9 @@ class Linter extends node_events.EventEmitter {
|
|
|
426
562
|
const hardcodedStrings = findHardcodedStrings(ast, code, config);
|
|
427
563
|
// Collect interpolation parameter issues
|
|
428
564
|
const interpolationIssues = lintInterpolationParams(ast, code, config, translationValues);
|
|
429
|
-
|
|
565
|
+
// Collect string-concatenation issues
|
|
566
|
+
const concatenationIssues = lintConcatenation(ast, code, config);
|
|
567
|
+
let allIssues = [...hardcodedStrings, ...interpolationIssues, ...concatenationIssues];
|
|
430
568
|
// Filter issues suppressed by ignore-directive comments.
|
|
431
569
|
// i18next-instrument-ignore-next-line → suppresses the single next line
|
|
432
570
|
// i18next-instrument-ignore → suppresses the whole next JSX element
|
|
@@ -441,7 +579,10 @@ class Linter extends node_events.EventEmitter {
|
|
|
441
579
|
}
|
|
442
580
|
}
|
|
443
581
|
const files = Object.fromEntries(issuesByFile.entries());
|
|
444
|
-
|
|
582
|
+
// `success` reflects errors only — warning-severity issues (e.g. string
|
|
583
|
+
// concatenation) are reported but do not fail the run / CI.
|
|
584
|
+
const errorCount = Array.from(issuesByFile.values()).flat().filter(i => i.severity !== 'warning').length;
|
|
585
|
+
const data = { success: errorCount === 0, message: totalIssues > 0 ? `Linter found ${totalIssues} potential issues.` : 'No issues found.', files };
|
|
445
586
|
this.emit('done', data);
|
|
446
587
|
return data;
|
|
447
588
|
}
|
|
@@ -564,28 +705,37 @@ async function runLinterCli(config, options = {}) {
|
|
|
564
705
|
spinner.text = event.message;
|
|
565
706
|
});
|
|
566
707
|
try {
|
|
567
|
-
const {
|
|
568
|
-
|
|
708
|
+
const { message, files } = await linter.run();
|
|
709
|
+
const fileEntries = Object.entries(files);
|
|
710
|
+
const allIssues = fileEntries.flatMap(([, issues]) => issues);
|
|
711
|
+
const hasErrors = allIssues.some(i => i.severity !== 'warning');
|
|
712
|
+
const hasWarnings = allIssues.some(i => i.severity === 'warning');
|
|
713
|
+
// Summary line: fail on errors, warn when only warnings, succeed when clean.
|
|
714
|
+
if (hasErrors)
|
|
569
715
|
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 {
|
|
716
|
+
else if (hasWarnings)
|
|
717
|
+
spinner.warn(node_util.styleText(['yellow', 'bold'], message));
|
|
718
|
+
else
|
|
587
719
|
spinner.succeed(node_util.styleText(['green', 'bold'], message));
|
|
720
|
+
// Detailed report — colour each line by severity (red Error / yellow Warning).
|
|
721
|
+
for (const [file, issues] of fileEntries) {
|
|
722
|
+
if (internalLogger.info)
|
|
723
|
+
internalLogger.info(node_util.styleText('yellow', `\n${file}`));
|
|
724
|
+
else
|
|
725
|
+
console.log(node_util.styleText('yellow', `\n${file}`));
|
|
726
|
+
issues.forEach(({ text, line, type, severity }) => {
|
|
727
|
+
const label = type === 'interpolation' ? 'Interpolation issue' : type === 'concatenation' ? 'String concatenation' : 'Found hardcoded string';
|
|
728
|
+
const tag = severity === 'warning' ? node_util.styleText('yellow', 'Warning:') : node_util.styleText('red', 'Error:');
|
|
729
|
+
const detail = ` ${node_util.styleText('gray', `${line}:`)} ${tag} ${label}: "${text}"`;
|
|
730
|
+
if (typeof internalLogger.info === 'function')
|
|
731
|
+
internalLogger.info(detail);
|
|
732
|
+
else
|
|
733
|
+
console.log(detail);
|
|
734
|
+
});
|
|
588
735
|
}
|
|
736
|
+
// Only errors fail the process; warning-only runs exit 0.
|
|
737
|
+
if (hasErrors)
|
|
738
|
+
process.exit(1);
|
|
589
739
|
}
|
|
590
740
|
catch (error) {
|
|
591
741
|
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.1'); // 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,135 @@ 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
|
+
* Severity is controlled by `lint.checkConcatenation`: 'warn' (default) reports
|
|
323
|
+
* without failing the run, 'error' makes it fail (exit non-zero), 'off'/false
|
|
324
|
+
* disables it.
|
|
325
|
+
*/
|
|
326
|
+
function lintConcatenation(ast, code, config) {
|
|
327
|
+
const issues = [];
|
|
328
|
+
// Resolve the check's severity. Default 'warn'. `false`/'off' disable it;
|
|
329
|
+
// `'error'` makes concatenation fail the run (exit non-zero); `true`/'warn' warn.
|
|
330
|
+
const setting = config.lint?.checkConcatenation;
|
|
331
|
+
if (setting === false || setting === 'off')
|
|
332
|
+
return issues;
|
|
333
|
+
const severity = setting === 'error' ? 'error' : 'warning';
|
|
334
|
+
const transComponents = new Set((config.extract.transComponents || ['Trans']).map(s => s.toLowerCase()));
|
|
335
|
+
const lineOf = (node) => {
|
|
336
|
+
const start = node?.span?.start;
|
|
337
|
+
if (typeof start === 'number') {
|
|
338
|
+
const pos = lineColumnFromOffset(code, start);
|
|
339
|
+
if (pos)
|
|
340
|
+
return pos.line;
|
|
341
|
+
}
|
|
342
|
+
// ponytail: span normalisation failed (also degrades ignore handling); coarse line 1.
|
|
343
|
+
return 1;
|
|
344
|
+
};
|
|
345
|
+
// Is `node` a translated-string operand of a concatenation? True when it is a
|
|
346
|
+
// t() call, or a `+` chain that itself contains one. Deliberately does NOT
|
|
347
|
+
// descend into other call/member expressions, so `arr.indexOf(t('x')) + 1`
|
|
348
|
+
// (numeric +, t() used only as a lookup argument) is not flagged.
|
|
349
|
+
const isTranslatedConcatOperand = (node) => {
|
|
350
|
+
let n = node?.expression ?? node;
|
|
351
|
+
// Unwrap parenthesis / TS assertion wrappers.
|
|
352
|
+
while (n && (n.type === 'ParenthesisExpression' || n.type === 'TsAsExpression' || n.type === 'TsNonNullExpression' || n.type === 'TsConstAssertion')) {
|
|
353
|
+
n = n.expression;
|
|
354
|
+
}
|
|
355
|
+
if (!n)
|
|
356
|
+
return false;
|
|
357
|
+
if (isTranslationCall(n, config))
|
|
358
|
+
return true;
|
|
359
|
+
if (n.type === 'BinaryExpression' && n.operator === '+') {
|
|
360
|
+
return isTranslatedConcatOperand(n.left) || isTranslatedConcatOperand(n.right);
|
|
361
|
+
}
|
|
362
|
+
return false;
|
|
363
|
+
};
|
|
364
|
+
const getJsxName = (el) => {
|
|
365
|
+
const nameNode = el?.opening?.name ?? el?.name;
|
|
366
|
+
if (!nameNode)
|
|
367
|
+
return null;
|
|
368
|
+
if (nameNode.type === 'JSXIdentifier' || nameNode.type === 'Identifier')
|
|
369
|
+
return nameNode.value ?? nameNode.name ?? null;
|
|
370
|
+
// e.g. Foo.Trans → use the last segment
|
|
371
|
+
if (nameNode.type === 'JSXMemberExpression')
|
|
372
|
+
return nameNode.property?.value ?? nameNode.property?.name ?? null;
|
|
373
|
+
return null;
|
|
374
|
+
};
|
|
375
|
+
const walk = (node, parent) => {
|
|
376
|
+
if (!node || typeof node !== 'object')
|
|
377
|
+
return;
|
|
378
|
+
// JS: `+` concatenation involving a t() call. Only report the outermost `+`
|
|
379
|
+
// of a chain (skip when the parent is also a `+`) so one chain = one issue.
|
|
380
|
+
if (node.type === 'BinaryExpression' && node.operator === '+') {
|
|
381
|
+
const parentIsPlus = parent?.type === 'BinaryExpression' && parent.operator === '+';
|
|
382
|
+
if (!parentIsPlus && (isTranslatedConcatOperand(node.left) || isTranslatedConcatOperand(node.right))) {
|
|
383
|
+
issues.push({
|
|
384
|
+
text: 'Avoid string concatenation in translations. Use a single string with placeholders instead.',
|
|
385
|
+
line: lineOf(node),
|
|
386
|
+
type: 'concatenation',
|
|
387
|
+
severity,
|
|
388
|
+
});
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
// JSX: a sentence split across ≥2 <Trans> components joined by literal text.
|
|
392
|
+
if ((node.type === 'JSXElement' || node.type === 'JSXFragment') && Array.isArray(node.children)) {
|
|
393
|
+
let transCount = 0;
|
|
394
|
+
let firstTrans = null;
|
|
395
|
+
let hasLiteralText = false;
|
|
396
|
+
for (const child of node.children) {
|
|
397
|
+
if (!child || typeof child !== 'object')
|
|
398
|
+
continue;
|
|
399
|
+
if (child.type === 'JSXElement') {
|
|
400
|
+
const name = getJsxName(child);
|
|
401
|
+
if (name && transComponents.has(name.toLowerCase())) {
|
|
402
|
+
transCount++;
|
|
403
|
+
if (!firstTrans)
|
|
404
|
+
firstTrans = child;
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
else if (child.type === 'JSXText' && child.value.trim() !== '') {
|
|
408
|
+
hasLiteralText = true;
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
if (transCount >= 2 && hasLiteralText && firstTrans) {
|
|
412
|
+
issues.push({
|
|
413
|
+
text: 'Avoid splitting a sentence across multiple <Trans> components. Use a single <Trans> with placeholders instead.',
|
|
414
|
+
line: lineOf(firstTrans),
|
|
415
|
+
type: 'concatenation',
|
|
416
|
+
severity,
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
for (const key of Object.keys(node)) {
|
|
421
|
+
if (key === 'span')
|
|
422
|
+
continue;
|
|
423
|
+
const child = node[key];
|
|
424
|
+
if (Array.isArray(child)) {
|
|
425
|
+
for (const item of child)
|
|
426
|
+
walk(item, node);
|
|
427
|
+
}
|
|
428
|
+
else if (child && typeof child === 'object') {
|
|
429
|
+
walk(child, node);
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
};
|
|
433
|
+
walk(ast, null);
|
|
434
|
+
return issues;
|
|
435
|
+
}
|
|
300
436
|
const recommendedAcceptedTags = acceptedTags.map(s => s.toLowerCase());
|
|
301
437
|
const recommendedAcceptedAttributes = translatableAttributes.map(s => s.toLowerCase());
|
|
302
438
|
const defaultIgnoredAttributes = ignoredAttributeLowerSet;
|
|
@@ -424,7 +560,9 @@ class Linter extends EventEmitter {
|
|
|
424
560
|
const hardcodedStrings = findHardcodedStrings(ast, code, config);
|
|
425
561
|
// Collect interpolation parameter issues
|
|
426
562
|
const interpolationIssues = lintInterpolationParams(ast, code, config, translationValues);
|
|
427
|
-
|
|
563
|
+
// Collect string-concatenation issues
|
|
564
|
+
const concatenationIssues = lintConcatenation(ast, code, config);
|
|
565
|
+
let allIssues = [...hardcodedStrings, ...interpolationIssues, ...concatenationIssues];
|
|
428
566
|
// Filter issues suppressed by ignore-directive comments.
|
|
429
567
|
// i18next-instrument-ignore-next-line → suppresses the single next line
|
|
430
568
|
// i18next-instrument-ignore → suppresses the whole next JSX element
|
|
@@ -439,7 +577,10 @@ class Linter extends EventEmitter {
|
|
|
439
577
|
}
|
|
440
578
|
}
|
|
441
579
|
const files = Object.fromEntries(issuesByFile.entries());
|
|
442
|
-
|
|
580
|
+
// `success` reflects errors only — warning-severity issues (e.g. string
|
|
581
|
+
// concatenation) are reported but do not fail the run / CI.
|
|
582
|
+
const errorCount = Array.from(issuesByFile.values()).flat().filter(i => i.severity !== 'warning').length;
|
|
583
|
+
const data = { success: errorCount === 0, message: totalIssues > 0 ? `Linter found ${totalIssues} potential issues.` : 'No issues found.', files };
|
|
443
584
|
this.emit('done', data);
|
|
444
585
|
return data;
|
|
445
586
|
}
|
|
@@ -562,28 +703,37 @@ async function runLinterCli(config, options = {}) {
|
|
|
562
703
|
spinner.text = event.message;
|
|
563
704
|
});
|
|
564
705
|
try {
|
|
565
|
-
const {
|
|
566
|
-
|
|
706
|
+
const { message, files } = await linter.run();
|
|
707
|
+
const fileEntries = Object.entries(files);
|
|
708
|
+
const allIssues = fileEntries.flatMap(([, issues]) => issues);
|
|
709
|
+
const hasErrors = allIssues.some(i => i.severity !== 'warning');
|
|
710
|
+
const hasWarnings = allIssues.some(i => i.severity === 'warning');
|
|
711
|
+
// Summary line: fail on errors, warn when only warnings, succeed when clean.
|
|
712
|
+
if (hasErrors)
|
|
567
713
|
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 {
|
|
714
|
+
else if (hasWarnings)
|
|
715
|
+
spinner.warn(styleText(['yellow', 'bold'], message));
|
|
716
|
+
else
|
|
585
717
|
spinner.succeed(styleText(['green', 'bold'], message));
|
|
718
|
+
// Detailed report — colour each line by severity (red Error / yellow Warning).
|
|
719
|
+
for (const [file, issues] of fileEntries) {
|
|
720
|
+
if (internalLogger.info)
|
|
721
|
+
internalLogger.info(styleText('yellow', `\n${file}`));
|
|
722
|
+
else
|
|
723
|
+
console.log(styleText('yellow', `\n${file}`));
|
|
724
|
+
issues.forEach(({ text, line, type, severity }) => {
|
|
725
|
+
const label = type === 'interpolation' ? 'Interpolation issue' : type === 'concatenation' ? 'String concatenation' : 'Found hardcoded string';
|
|
726
|
+
const tag = severity === 'warning' ? styleText('yellow', 'Warning:') : styleText('red', 'Error:');
|
|
727
|
+
const detail = ` ${styleText('gray', `${line}:`)} ${tag} ${label}: "${text}"`;
|
|
728
|
+
if (typeof internalLogger.info === 'function')
|
|
729
|
+
internalLogger.info(detail);
|
|
730
|
+
else
|
|
731
|
+
console.log(detail);
|
|
732
|
+
});
|
|
586
733
|
}
|
|
734
|
+
// Only errors fail the process; warning-only runs exit 0.
|
|
735
|
+
if (hasErrors)
|
|
736
|
+
process.exit(1);
|
|
587
737
|
}
|
|
588
738
|
catch (error) {
|
|
589
739
|
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;AAibpG,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,18 @@ 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
|
+
/** Lint for string concatenation involving translated strings (default: `'warn'`).
|
|
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
|
+
* Accepts a severity level or a boolean:
|
|
229
|
+
* - `'error'` — report as an error; the `lint` command exits non-zero (fails CI).
|
|
230
|
+
* - `'warn'` / `true` — report as a warning; printed but does not fail the run.
|
|
231
|
+
* - `'off'` / `false` — disable the check.
|
|
232
|
+
*/
|
|
233
|
+
checkConcatenation?: boolean | 'off' | 'warn' | 'error';
|
|
222
234
|
};
|
|
223
235
|
/** Configuration options for TypeScript type generation */
|
|
224
236
|
types?: {
|
|
@@ -314,7 +326,10 @@ export interface LintIssue {
|
|
|
314
326
|
/** Line number where the issue was found */
|
|
315
327
|
line: number;
|
|
316
328
|
/** Issue category */
|
|
317
|
-
type?: 'hardcoded' | 'interpolation';
|
|
329
|
+
type?: 'hardcoded' | 'interpolation' | 'concatenation';
|
|
330
|
+
/** Severity of the issue. Defaults to 'error' (fails the lint run / CI); 'warning' is
|
|
331
|
+
* reported but does not fail the run. Concatenation issues are reported as warnings. */
|
|
332
|
+
severity?: 'error' | 'warning';
|
|
318
333
|
}
|
|
319
334
|
/**
|
|
320
335
|
* 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":"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;KACpC,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,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,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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|