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 CHANGED
@@ -307,12 +307,30 @@ npx i18next-cli sync
307
307
  ```
308
308
 
309
309
  ### `lint`
310
- Analyzes your source code for internationalization issues like hardcoded strings. Can run without a config file.
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.66.2'); // This string is replaced with the actual version at build time by rollup
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
@@ -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
- // Build the full dotted callee name (e.g. 'i18n.t', 'tProps.label') as well as
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
- let allIssues = [...hardcodedStrings, ...interpolationIssues];
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
- const data = { success: totalIssues === 0, message: totalIssues > 0 ? `Linter found ${totalIssues} potential issues.` : 'No issues found.', files };
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 { success, message, files } = await linter.run();
568
- if (!success) {
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
- // Print detailed report after spinner fails
571
- for (const [file, issues] of Object.entries(files)) {
572
- if (internalLogger.info)
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.66.2'); // This string is replaced with the actual version at build time by rollup
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
@@ -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
- // Build the full dotted callee name (e.g. 'i18n.t', 'tProps.label') as well as
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
- let allIssues = [...hardcodedStrings, ...interpolationIssues];
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
- const data = { success: totalIssues === 0, message: totalIssues > 0 ? `Linter found ${totalIssues} potential issues.` : 'No issues found.', files };
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 { success, message, files } = await linter.run();
566
- if (!success) {
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
- // Print detailed report after spinner fails
569
- for (const [file, issues] of Object.entries(files)) {
570
- if (internalLogger.info)
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "i18next-cli",
3
- "version": "1.66.2",
3
+ "version": "1.67.1",
4
4
  "description": "A unified, high-performance i18next CLI.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -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;AA8SpG,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;;;;;;;IAkIT,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,iBAkCnD"}
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.
@@ -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":"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"}