i18next-cli 1.67.2 → 1.67.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +18 -1
- package/dist/cjs/cli.js +1 -1
- package/dist/cjs/extractor/core/ast-visitors.js +53 -0
- package/dist/cjs/extractor/parsers/expression-resolver.js +97 -0
- package/dist/cjs/linter.js +74 -26
- package/dist/esm/cli.js +1 -1
- package/dist/esm/extractor/core/ast-visitors.js +53 -0
- package/dist/esm/extractor/parsers/expression-resolver.js +97 -0
- package/dist/esm/linter.js +74 -26
- package/package.json +1 -1
- package/types/extractor/core/ast-visitors.d.ts.map +1 -1
- package/types/extractor/parsers/expression-resolver.d.ts +27 -0
- package/types/extractor/parsers/expression-resolver.d.ts.map +1 -1
- package/types/linter.d.ts.map +1 -1
- package/types/types.d.ts +12 -0
- package/types/types.d.ts.map +1 -1
package/README.md
CHANGED
|
@@ -323,13 +323,26 @@ npx i18next-cli lint
|
|
|
323
323
|
// ⚠️ Flagged — word order can't be translated
|
|
324
324
|
t('greeting') + ', ' + name
|
|
325
325
|
<p><Trans>Hello</Trans> and <Trans>World</Trans></p>
|
|
326
|
+
<p><Trans>new</Trans>{t('cat')}</p>
|
|
326
327
|
|
|
327
328
|
// ✅ Preferred — one key, placeholders
|
|
328
329
|
t('greeting', { name }) // "Hello, {{name}}"
|
|
329
330
|
<Trans i18nKey="greeting">Hello {{name}}</Trans>
|
|
330
331
|
```
|
|
331
332
|
|
|
332
|
-
|
|
333
|
+
- **Punctuation concatenation** *(off by default)* — punctuation glued onto a translation, e.g. `<label><Trans>Email</Trans>:</label>` or `<div>- <Trans>item</Trans></div>`. Punctuation spacing and form differ across languages (French needs a narrow no-break space before `:`, CJK uses fullwidth `:`, RTL reorders), so it belongs inside the translation or in semantic markup (a real `<ul>/<li>` for bullets). This is **opt-in**, since keeping punctuation out of a translation is often deliberate. Enable with `lint.checkPunctuationConcatenation`: `'warn'`, `'error'`, or `'off'` / `false` (default).
|
|
334
|
+
|
|
335
|
+
```jsx
|
|
336
|
+
// ⚠️ Flagged when enabled
|
|
337
|
+
<label><Trans>Email</Trans>:</label>
|
|
338
|
+
<div>- <Trans>item</Trans></div>
|
|
339
|
+
|
|
340
|
+
// ✅ Preferred
|
|
341
|
+
<label><Trans i18nKey="emailLabel">Email:</Trans></label>
|
|
342
|
+
<ul><li><Trans>item</Trans></li></ul>
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
The linter exits non-zero only when it finds **errors**; a run with only warnings succeeds. Individual spots can be excused with the [`i18next-instrument-ignore` directive](#suppressing-detection-with-i18next-instrument-ignore).
|
|
333
346
|
|
|
334
347
|
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.
|
|
335
348
|
|
|
@@ -950,6 +963,10 @@ export default defineConfig({
|
|
|
950
963
|
* 'warn'/true reports without failing the run, 'error' fails the run (exit non-zero,
|
|
951
964
|
* good for CI), 'off'/false disables it. */
|
|
952
965
|
checkConcatenation: 'warn',
|
|
966
|
+
|
|
967
|
+
/** Lint punctuation glued onto a translation, e.g. <Trans>Email</Trans>: (default: 'off').
|
|
968
|
+
* Opt-in; accepts the same values as checkConcatenation. */
|
|
969
|
+
checkPunctuationConcatenation: 'off',
|
|
953
970
|
},
|
|
954
971
|
|
|
955
972
|
// 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.67.
|
|
40
|
+
.version('1.67.4'); // 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
|
|
@@ -112,6 +112,13 @@ class ASTVisitors {
|
|
|
112
112
|
// Type aliases → ExpressionResolver.sharedTypeAliasTable
|
|
113
113
|
this.expressionResolver.captureTypeAliasDeclaration(node);
|
|
114
114
|
break;
|
|
115
|
+
case 'TsInterfaceDeclaration':
|
|
116
|
+
case 'TSInterfaceDeclaration':
|
|
117
|
+
case 'TsInterfaceDecl':
|
|
118
|
+
// Interfaces → ExpressionResolver.objectTypeTable, so params typed by
|
|
119
|
+
// them (`{ size }: IProps`) resolve to their string-literal unions.
|
|
120
|
+
this.expressionResolver.captureInterfaceDeclaration(node);
|
|
121
|
+
break;
|
|
115
122
|
case 'FunctionDeclaration':
|
|
116
123
|
case 'FnDecl':
|
|
117
124
|
// Return-type annotations or inferred return values for t(fn()) patterns
|
|
@@ -167,6 +174,7 @@ class ASTVisitors {
|
|
|
167
174
|
let isNewScope = false;
|
|
168
175
|
let isNewClassScope = false;
|
|
169
176
|
let paramTemporaries;
|
|
177
|
+
let paramObjectTemporaries;
|
|
170
178
|
// ENTER CLASS SCOPE for class declarations / expressions and pre-register
|
|
171
179
|
// class field initializers so that later `this.<field>` references inside
|
|
172
180
|
// method bodies can inherit the namespace/keyPrefix from the field.
|
|
@@ -215,6 +223,31 @@ class ASTVisitors {
|
|
|
215
223
|
let ident;
|
|
216
224
|
if (!p)
|
|
217
225
|
continue;
|
|
226
|
+
// Destructured object param: `function f({ size }: IProps)`.
|
|
227
|
+
// Bind each destructured local name to its interface member's values.
|
|
228
|
+
const pat = p.pat ?? p.pattern ?? p;
|
|
229
|
+
if (pat.type === 'ObjectPattern') {
|
|
230
|
+
const patType = pat.typeAnnotation?.typeAnnotation ?? pat.typeAnnotation;
|
|
231
|
+
const members = this.expressionResolver.resolveTypeMembers(patType);
|
|
232
|
+
if (members) {
|
|
233
|
+
for (const prop of (pat.properties ?? [])) {
|
|
234
|
+
// `{ size }` / `{ size = 'all' }` → AssignmentPatternProperty (local name is the key)
|
|
235
|
+
// `{ size: s }` / `{ size: s = 'all' }` → KeyValuePatternProperty
|
|
236
|
+
const memberName = prop?.key?.value;
|
|
237
|
+
let localNode = prop?.type === 'KeyValuePatternProperty' ? prop.value : prop?.key;
|
|
238
|
+
if (localNode?.type === 'AssignmentPattern')
|
|
239
|
+
localNode = localNode.left;
|
|
240
|
+
const localName = localNode?.type === 'Identifier' ? localNode.value : undefined;
|
|
241
|
+
if (!memberName || !localName || !members[memberName])
|
|
242
|
+
continue;
|
|
243
|
+
this.expressionResolver.setTemporaryVariable(localName, members[memberName]);
|
|
244
|
+
if (!paramTemporaries)
|
|
245
|
+
paramTemporaries = [];
|
|
246
|
+
paramTemporaries.push(localName);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
218
251
|
// direct identifier (arrow fn params etc)
|
|
219
252
|
if (p.type === 'Identifier')
|
|
220
253
|
ident = p;
|
|
@@ -367,6 +400,16 @@ class ASTVisitors {
|
|
|
367
400
|
paramTemporaries = [];
|
|
368
401
|
paramTemporaries.push(paramKey);
|
|
369
402
|
}
|
|
403
|
+
else {
|
|
404
|
+
// Object-shaped param (`props: IProps`) so `props.size` resolves.
|
|
405
|
+
const members = this.expressionResolver.resolveTypeMembers(typeAnn);
|
|
406
|
+
if (members) {
|
|
407
|
+
this.expressionResolver.setTemporaryObjectVariable(paramKey, members);
|
|
408
|
+
if (!paramObjectTemporaries)
|
|
409
|
+
paramObjectTemporaries = [];
|
|
410
|
+
paramObjectTemporaries.push(paramKey);
|
|
411
|
+
}
|
|
412
|
+
}
|
|
370
413
|
}
|
|
371
414
|
}
|
|
372
415
|
}
|
|
@@ -392,6 +435,11 @@ class ASTVisitors {
|
|
|
392
435
|
case 'TsTypeAliasDecl':
|
|
393
436
|
this.expressionResolver.captureTypeAliasDeclaration(node);
|
|
394
437
|
break;
|
|
438
|
+
case 'TsInterfaceDeclaration':
|
|
439
|
+
case 'TSInterfaceDeclaration':
|
|
440
|
+
case 'TsInterfaceDecl':
|
|
441
|
+
this.expressionResolver.captureInterfaceDeclaration(node);
|
|
442
|
+
break;
|
|
395
443
|
// pattern 3: capture function return types so `t(fn())` can be resolved
|
|
396
444
|
case 'FunctionDeclaration':
|
|
397
445
|
case 'FnDecl':
|
|
@@ -568,6 +616,11 @@ class ASTVisitors {
|
|
|
568
616
|
this.expressionResolver.deleteTemporaryVariable(name);
|
|
569
617
|
}
|
|
570
618
|
}
|
|
619
|
+
if (paramObjectTemporaries) {
|
|
620
|
+
for (const name of paramObjectTemporaries) {
|
|
621
|
+
this.expressionResolver.deleteTemporaryObjectVariable(name);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
571
624
|
this.scopeManager.exitScope();
|
|
572
625
|
}
|
|
573
626
|
// LEAVE CLASS SCOPE for classes
|
|
@@ -26,6 +26,13 @@ class ExpressionResolver {
|
|
|
26
26
|
// Temporary per-scope variable overrides, used to inject .map() / .forEach()
|
|
27
27
|
// callback parameters while the callback body is being walked.
|
|
28
28
|
temporaryVariables = new Map();
|
|
29
|
+
// Shared (cross-file) table for object-shaped types: interfaces and object
|
|
30
|
+
// type aliases. Maps typeName -> { memberName: possible string values }.
|
|
31
|
+
// e.g. `interface IProps { size: ChangeType }` -> { IProps: { size: ['all','next'] } }
|
|
32
|
+
objectTypeTable = new Map();
|
|
33
|
+
// Temporary per-scope bindings for identifiers holding an object-shaped type,
|
|
34
|
+
// e.g. `function f(props: IProps)` -> { props: { size: ['all','next'] } }.
|
|
35
|
+
temporaryObjectVariables = new Map();
|
|
29
36
|
constructor(hooks) {
|
|
30
37
|
this.hooks = hooks;
|
|
31
38
|
}
|
|
@@ -214,6 +221,13 @@ class ExpressionResolver {
|
|
|
214
221
|
const tsType = node.typeAnnotation ?? node.typeAnn;
|
|
215
222
|
if (!tsType)
|
|
216
223
|
return;
|
|
224
|
+
// `type IProps = { size: ChangeType }` — object shape, not a string union.
|
|
225
|
+
if (tsType.type === 'TsTypeLiteral') {
|
|
226
|
+
const members = this.collectObjectTypeMembers(tsType.members);
|
|
227
|
+
if (members)
|
|
228
|
+
this.objectTypeTable.set(name, members);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
217
231
|
const vals = this.resolvePossibleStringValuesFromType(tsType);
|
|
218
232
|
if (vals.length > 0) {
|
|
219
233
|
this.typeAliasTable.set(name, vals);
|
|
@@ -225,6 +239,78 @@ class ExpressionResolver {
|
|
|
225
239
|
// noop
|
|
226
240
|
}
|
|
227
241
|
}
|
|
242
|
+
/**
|
|
243
|
+
* Capture a TypeScript interface so that parameters typed by it
|
|
244
|
+
* (`function f({ size }: IProps)` / `f(props: IProps)`) can resolve their
|
|
245
|
+
* members to string-literal unions.
|
|
246
|
+
*
|
|
247
|
+
* SWC node shape: `TsInterfaceDeclaration` with `body.body` members.
|
|
248
|
+
*/
|
|
249
|
+
captureInterfaceDeclaration(node) {
|
|
250
|
+
try {
|
|
251
|
+
const name = node?.id?.type === 'Identifier' ? node.id.value : undefined;
|
|
252
|
+
if (!name)
|
|
253
|
+
return;
|
|
254
|
+
const members = this.collectObjectTypeMembers(node?.body?.body);
|
|
255
|
+
if (members)
|
|
256
|
+
this.objectTypeTable.set(name, members);
|
|
257
|
+
}
|
|
258
|
+
catch {
|
|
259
|
+
// noop
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Build `{ memberName: possibleStringValues }` for an object-shaped type
|
|
264
|
+
* (interface body or object type-literal members). Only members whose type
|
|
265
|
+
* resolves to a finite string set are kept; returns undefined when none do.
|
|
266
|
+
*/
|
|
267
|
+
collectObjectTypeMembers(members) {
|
|
268
|
+
if (!Array.isArray(members))
|
|
269
|
+
return undefined;
|
|
270
|
+
const map = {};
|
|
271
|
+
for (const m of members) {
|
|
272
|
+
if (!m || m.type !== 'TsPropertySignature')
|
|
273
|
+
continue;
|
|
274
|
+
const memberName = m.key?.type === 'Identifier' ? m.key.value : m.key?.type === 'StringLiteral' ? m.key.value : undefined;
|
|
275
|
+
if (!memberName)
|
|
276
|
+
continue;
|
|
277
|
+
const tsType = m.typeAnnotation?.typeAnnotation ?? m.typeAnnotation;
|
|
278
|
+
if (!tsType)
|
|
279
|
+
continue;
|
|
280
|
+
const vals = this.resolvePossibleStringValuesFromType(tsType);
|
|
281
|
+
if (vals.length > 0)
|
|
282
|
+
map[memberName] = vals;
|
|
283
|
+
}
|
|
284
|
+
return Object.keys(map).length > 0 ? map : undefined;
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Resolve a type annotation that refers to an object shape (interface, object
|
|
288
|
+
* type alias, or inline type literal) to its member → string values map.
|
|
289
|
+
*/
|
|
290
|
+
resolveTypeMembers(tsType) {
|
|
291
|
+
try {
|
|
292
|
+
if (!tsType)
|
|
293
|
+
return undefined;
|
|
294
|
+
if (tsType.type === 'TsTypeLiteral') {
|
|
295
|
+
return this.collectObjectTypeMembers(tsType.members);
|
|
296
|
+
}
|
|
297
|
+
if (tsType.type === 'TsTypeReference' && tsType.typeName?.type === 'Identifier') {
|
|
298
|
+
return this.objectTypeTable.get(tsType.typeName.value);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
catch { }
|
|
302
|
+
return undefined;
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Temporarily bind an identifier to an object-shaped type's members, so that
|
|
306
|
+
* `props.size` inside the function body resolves to the member's values.
|
|
307
|
+
*/
|
|
308
|
+
setTemporaryObjectVariable(name, members) {
|
|
309
|
+
this.temporaryObjectVariables.set(name, members);
|
|
310
|
+
}
|
|
311
|
+
deleteTemporaryObjectVariable(name) {
|
|
312
|
+
this.temporaryObjectVariables.delete(name);
|
|
313
|
+
}
|
|
228
314
|
/**
|
|
229
315
|
* Capture the return-type annotation of a function declaration so that
|
|
230
316
|
* `t(fn())` calls can be expanded to all union members.
|
|
@@ -552,6 +638,17 @@ class ExpressionResolver {
|
|
|
552
638
|
const prop = expression.property;
|
|
553
639
|
// only handle simple identifier base + simple property (Identifier or computed StringLiteral)
|
|
554
640
|
if (obj.type === 'Identifier') {
|
|
641
|
+
// Parameter typed by an interface / object type: `props.size`
|
|
642
|
+
const objMembers = this.temporaryObjectVariables.get(obj.value);
|
|
643
|
+
if (objMembers) {
|
|
644
|
+
const propName = prop.type === 'Identifier'
|
|
645
|
+
? prop.value
|
|
646
|
+
: prop.type === 'Computed' && prop.expression?.type === 'StringLiteral'
|
|
647
|
+
? prop.expression.value
|
|
648
|
+
: undefined;
|
|
649
|
+
if (propName && objMembers[propName])
|
|
650
|
+
return objMembers[propName];
|
|
651
|
+
}
|
|
555
652
|
const baseVar = this.variableTable.get(obj.value);
|
|
556
653
|
const baseShared = this.sharedEnumTable.get(obj.value);
|
|
557
654
|
const base = baseVar ?? baseShared;
|
package/dist/cjs/linter.js
CHANGED
|
@@ -306,6 +306,11 @@ function lintInterpolationParams(ast, code, config, translationValues) {
|
|
|
306
306
|
}
|
|
307
307
|
return issues;
|
|
308
308
|
}
|
|
309
|
+
// Literal text that is punctuation only (no letters/digits). Covers ASCII, the
|
|
310
|
+
// CJK fullwidth forms and Arabic variants, since those are exactly the marks whose
|
|
311
|
+
// spacing/shape differ per language (French narrow no-break space before ':',
|
|
312
|
+
// fullwidth ':' in CJK, RTL reordering).
|
|
313
|
+
const PUNCTUATION_ONLY_RE = /^[:.!?,;\-–—…·/|&()[\]{}"'«»„“”‘’:.!?,;、。〜~؛،؟]+$/;
|
|
309
314
|
/**
|
|
310
315
|
* Detects string concatenation involving translated strings — an i18n
|
|
311
316
|
* anti-pattern because word order and grammar differ across languages, so
|
|
@@ -323,18 +328,28 @@ function lintInterpolationParams(ast, code, config, translationValues) {
|
|
|
323
328
|
* The fix in both cases is a single key with placeholders:
|
|
324
329
|
* t('greeting', { name }) / <Trans i18nKey="greeting">Hello {{name}}</Trans>
|
|
325
330
|
*
|
|
326
|
-
*
|
|
327
|
-
*
|
|
328
|
-
*
|
|
331
|
+
* Additionally, when `lint.checkPunctuationConcatenation` is enabled (opt-in,
|
|
332
|
+
* default 'off'), flags punctuation glued onto a translation:
|
|
333
|
+
* <label><Trans>Email</Trans>:</label> / <div>- <Trans>item</Trans></div>
|
|
334
|
+
*
|
|
335
|
+
* Severity for both is controlled by their config option: 'warn' reports without
|
|
336
|
+
* failing the run, 'error' makes it fail (exit non-zero), 'off'/false disables it.
|
|
329
337
|
*/
|
|
330
338
|
function lintConcatenation(ast, code, config) {
|
|
331
339
|
const issues = [];
|
|
332
|
-
// Resolve
|
|
333
|
-
// `'error'` makes
|
|
340
|
+
// Resolve each check's severity independently. `false`/'off' disable a check;
|
|
341
|
+
// `'error'` makes it fail the run (exit non-zero); `true`/'warn' warn.
|
|
342
|
+
// checkConcatenation defaults to on ('warn'); checkPunctuationConcatenation
|
|
343
|
+
// defaults to off (opt-in), since punctuation outside a translation is often
|
|
344
|
+
// deliberate and flagging it by default would be noisy.
|
|
334
345
|
const setting = config.lint?.checkConcatenation;
|
|
335
|
-
|
|
336
|
-
return issues;
|
|
346
|
+
const concatEnabled = setting !== false && setting !== 'off';
|
|
337
347
|
const severity = setting === 'error' ? 'error' : 'warning';
|
|
348
|
+
const punctSetting = config.lint?.checkPunctuationConcatenation;
|
|
349
|
+
const punctEnabled = punctSetting === true || punctSetting === 'warn' || punctSetting === 'error';
|
|
350
|
+
const punctSeverity = punctSetting === 'error' ? 'error' : 'warning';
|
|
351
|
+
if (!concatEnabled && !punctEnabled)
|
|
352
|
+
return issues;
|
|
338
353
|
const transComponents = new Set((config.extract.transComponents || ['Trans']).map(s => s.toLowerCase()));
|
|
339
354
|
const lineOf = (node) => {
|
|
340
355
|
const start = node?.span?.start;
|
|
@@ -346,6 +361,19 @@ function lintConcatenation(ast, code, config) {
|
|
|
346
361
|
// ponytail: span normalisation failed (also degrades ignore handling); coarse line 1.
|
|
347
362
|
return 1;
|
|
348
363
|
};
|
|
364
|
+
// A JSXText span starts right after the preceding tag, so it can begin on an
|
|
365
|
+
// earlier line than its visible text. Skip the leading whitespace to report the
|
|
366
|
+
// line the punctuation actually sits on.
|
|
367
|
+
const lineOfText = (node) => {
|
|
368
|
+
const start = node?.span?.start;
|
|
369
|
+
if (typeof start === 'number' && typeof node.value === 'string') {
|
|
370
|
+
const offset = node.value.length - node.value.trimStart().length;
|
|
371
|
+
const pos = astUtils.lineColumnFromOffset(code, start + offset);
|
|
372
|
+
if (pos)
|
|
373
|
+
return pos.line;
|
|
374
|
+
}
|
|
375
|
+
return lineOf(node);
|
|
376
|
+
};
|
|
349
377
|
// Is `node` a translated-string operand of a concatenation? True when it is a
|
|
350
378
|
// t() call, or a `+` chain that itself contains one. Deliberately does NOT
|
|
351
379
|
// descend into other call/member expressions, so `arr.indexOf(t('x')) + 1`
|
|
@@ -381,7 +409,7 @@ function lintConcatenation(ast, code, config) {
|
|
|
381
409
|
return;
|
|
382
410
|
// JS: `+` concatenation involving a t() call. Only report the outermost `+`
|
|
383
411
|
// of a chain (skip when the parent is also a `+`) so one chain = one issue.
|
|
384
|
-
if (node.type === 'BinaryExpression' && node.operator === '+') {
|
|
412
|
+
if (concatEnabled && node.type === 'BinaryExpression' && node.operator === '+') {
|
|
385
413
|
const parentIsPlus = parent?.type === 'BinaryExpression' && parent.operator === '+';
|
|
386
414
|
if (!parentIsPlus && (isTranslatedConcatOperand(node.left) || isTranslatedConcatOperand(node.right))) {
|
|
387
415
|
issues.push({
|
|
@@ -396,32 +424,52 @@ function lintConcatenation(ast, code, config) {
|
|
|
396
424
|
// direct siblings — a <Trans> component or a `{t(...)}` expression. Covers
|
|
397
425
|
// <Trans>…</Trans><Trans>…</Trans>, <Trans>…</Trans>{t(…)} and {t(…)}{t(…)}.
|
|
398
426
|
if ((node.type === 'JSXElement' || node.type === 'JSXFragment') && Array.isArray(node.children)) {
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
for (const child of node.children) {
|
|
402
|
-
if (!child || typeof child !== 'object')
|
|
403
|
-
continue;
|
|
404
|
-
let isUnit = false;
|
|
427
|
+
const children = node.children.filter((c) => c && typeof c === 'object');
|
|
428
|
+
const isUnit = (child) => {
|
|
405
429
|
if (child.type === 'JSXElement') {
|
|
406
430
|
const name = getJsxName(child);
|
|
407
|
-
|
|
408
|
-
}
|
|
409
|
-
else if (child.type === 'JSXExpressionContainer') {
|
|
410
|
-
isUnit = isTranslationCall(child.expression, config);
|
|
431
|
+
return !!name && transComponents.has(name.toLowerCase());
|
|
411
432
|
}
|
|
412
|
-
if (
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
if (
|
|
433
|
+
if (child.type === 'JSXExpressionContainer')
|
|
434
|
+
return isTranslationCall(child.expression, config);
|
|
435
|
+
return false;
|
|
436
|
+
};
|
|
437
|
+
const units = children.filter(isUnit);
|
|
438
|
+
let reportedHere = false;
|
|
439
|
+
if (concatEnabled && units.length >= 2) {
|
|
419
440
|
issues.push({
|
|
420
441
|
text: 'Avoid splitting text across multiple translations (<Trans> or t()). Use a single translation with placeholders instead.',
|
|
421
|
-
line: lineOf(
|
|
442
|
+
line: lineOf(units[0]),
|
|
422
443
|
type: 'concatenation',
|
|
423
444
|
severity,
|
|
424
445
|
});
|
|
446
|
+
reportedHere = true;
|
|
447
|
+
}
|
|
448
|
+
// Punctuation glued onto a translation, e.g. `<Trans>Email</Trans>:` or
|
|
449
|
+
// `- <Trans>item</Trans>`. Skipped when the element was already reported
|
|
450
|
+
// above, so one problem yields one issue. Opt-in via config.
|
|
451
|
+
if (punctEnabled && !reportedHere) {
|
|
452
|
+
for (let i = 0; i < children.length; i++) {
|
|
453
|
+
const child = children[i];
|
|
454
|
+
if (child.type !== 'JSXText')
|
|
455
|
+
continue;
|
|
456
|
+
const trimmed = child.value.trim();
|
|
457
|
+
if (!trimmed || !PUNCTUATION_ONLY_RE.test(trimmed))
|
|
458
|
+
continue;
|
|
459
|
+
// Only flag when it actually abuts a translation (previous or next
|
|
460
|
+
// non-blank sibling), not when it merely shares a parent.
|
|
461
|
+
const prev = children.slice(0, i).reverse().find((c) => c.type !== 'JSXText' || c.value.trim());
|
|
462
|
+
const next = children.slice(i + 1).find((c) => c.type !== 'JSXText' || c.value.trim());
|
|
463
|
+
const neighbour = [prev, next].find(c => c && isUnit(c));
|
|
464
|
+
if (!neighbour)
|
|
465
|
+
continue;
|
|
466
|
+
issues.push({
|
|
467
|
+
text: `Avoid concatenating punctuation ("${trimmed}") with a translation. Include it in the translation string or use semantic markup, since punctuation spacing and form differ across languages.`,
|
|
468
|
+
line: lineOfText(child),
|
|
469
|
+
type: 'concatenation',
|
|
470
|
+
severity: punctSeverity,
|
|
471
|
+
});
|
|
472
|
+
}
|
|
425
473
|
}
|
|
426
474
|
}
|
|
427
475
|
for (const key of Object.keys(node)) {
|
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.67.
|
|
34
|
+
.version('1.67.4'); // This string is replaced with the actual version at build time by rollup
|
|
35
35
|
// new: global config override option
|
|
36
36
|
program.option('-c, --config <path>', 'Path to i18next-cli config file (overrides detection)');
|
|
37
37
|
program
|
|
@@ -110,6 +110,13 @@ class ASTVisitors {
|
|
|
110
110
|
// Type aliases → ExpressionResolver.sharedTypeAliasTable
|
|
111
111
|
this.expressionResolver.captureTypeAliasDeclaration(node);
|
|
112
112
|
break;
|
|
113
|
+
case 'TsInterfaceDeclaration':
|
|
114
|
+
case 'TSInterfaceDeclaration':
|
|
115
|
+
case 'TsInterfaceDecl':
|
|
116
|
+
// Interfaces → ExpressionResolver.objectTypeTable, so params typed by
|
|
117
|
+
// them (`{ size }: IProps`) resolve to their string-literal unions.
|
|
118
|
+
this.expressionResolver.captureInterfaceDeclaration(node);
|
|
119
|
+
break;
|
|
113
120
|
case 'FunctionDeclaration':
|
|
114
121
|
case 'FnDecl':
|
|
115
122
|
// Return-type annotations or inferred return values for t(fn()) patterns
|
|
@@ -165,6 +172,7 @@ class ASTVisitors {
|
|
|
165
172
|
let isNewScope = false;
|
|
166
173
|
let isNewClassScope = false;
|
|
167
174
|
let paramTemporaries;
|
|
175
|
+
let paramObjectTemporaries;
|
|
168
176
|
// ENTER CLASS SCOPE for class declarations / expressions and pre-register
|
|
169
177
|
// class field initializers so that later `this.<field>` references inside
|
|
170
178
|
// method bodies can inherit the namespace/keyPrefix from the field.
|
|
@@ -213,6 +221,31 @@ class ASTVisitors {
|
|
|
213
221
|
let ident;
|
|
214
222
|
if (!p)
|
|
215
223
|
continue;
|
|
224
|
+
// Destructured object param: `function f({ size }: IProps)`.
|
|
225
|
+
// Bind each destructured local name to its interface member's values.
|
|
226
|
+
const pat = p.pat ?? p.pattern ?? p;
|
|
227
|
+
if (pat.type === 'ObjectPattern') {
|
|
228
|
+
const patType = pat.typeAnnotation?.typeAnnotation ?? pat.typeAnnotation;
|
|
229
|
+
const members = this.expressionResolver.resolveTypeMembers(patType);
|
|
230
|
+
if (members) {
|
|
231
|
+
for (const prop of (pat.properties ?? [])) {
|
|
232
|
+
// `{ size }` / `{ size = 'all' }` → AssignmentPatternProperty (local name is the key)
|
|
233
|
+
// `{ size: s }` / `{ size: s = 'all' }` → KeyValuePatternProperty
|
|
234
|
+
const memberName = prop?.key?.value;
|
|
235
|
+
let localNode = prop?.type === 'KeyValuePatternProperty' ? prop.value : prop?.key;
|
|
236
|
+
if (localNode?.type === 'AssignmentPattern')
|
|
237
|
+
localNode = localNode.left;
|
|
238
|
+
const localName = localNode?.type === 'Identifier' ? localNode.value : undefined;
|
|
239
|
+
if (!memberName || !localName || !members[memberName])
|
|
240
|
+
continue;
|
|
241
|
+
this.expressionResolver.setTemporaryVariable(localName, members[memberName]);
|
|
242
|
+
if (!paramTemporaries)
|
|
243
|
+
paramTemporaries = [];
|
|
244
|
+
paramTemporaries.push(localName);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
continue;
|
|
248
|
+
}
|
|
216
249
|
// direct identifier (arrow fn params etc)
|
|
217
250
|
if (p.type === 'Identifier')
|
|
218
251
|
ident = p;
|
|
@@ -365,6 +398,16 @@ class ASTVisitors {
|
|
|
365
398
|
paramTemporaries = [];
|
|
366
399
|
paramTemporaries.push(paramKey);
|
|
367
400
|
}
|
|
401
|
+
else {
|
|
402
|
+
// Object-shaped param (`props: IProps`) so `props.size` resolves.
|
|
403
|
+
const members = this.expressionResolver.resolveTypeMembers(typeAnn);
|
|
404
|
+
if (members) {
|
|
405
|
+
this.expressionResolver.setTemporaryObjectVariable(paramKey, members);
|
|
406
|
+
if (!paramObjectTemporaries)
|
|
407
|
+
paramObjectTemporaries = [];
|
|
408
|
+
paramObjectTemporaries.push(paramKey);
|
|
409
|
+
}
|
|
410
|
+
}
|
|
368
411
|
}
|
|
369
412
|
}
|
|
370
413
|
}
|
|
@@ -390,6 +433,11 @@ class ASTVisitors {
|
|
|
390
433
|
case 'TsTypeAliasDecl':
|
|
391
434
|
this.expressionResolver.captureTypeAliasDeclaration(node);
|
|
392
435
|
break;
|
|
436
|
+
case 'TsInterfaceDeclaration':
|
|
437
|
+
case 'TSInterfaceDeclaration':
|
|
438
|
+
case 'TsInterfaceDecl':
|
|
439
|
+
this.expressionResolver.captureInterfaceDeclaration(node);
|
|
440
|
+
break;
|
|
393
441
|
// pattern 3: capture function return types so `t(fn())` can be resolved
|
|
394
442
|
case 'FunctionDeclaration':
|
|
395
443
|
case 'FnDecl':
|
|
@@ -566,6 +614,11 @@ class ASTVisitors {
|
|
|
566
614
|
this.expressionResolver.deleteTemporaryVariable(name);
|
|
567
615
|
}
|
|
568
616
|
}
|
|
617
|
+
if (paramObjectTemporaries) {
|
|
618
|
+
for (const name of paramObjectTemporaries) {
|
|
619
|
+
this.expressionResolver.deleteTemporaryObjectVariable(name);
|
|
620
|
+
}
|
|
621
|
+
}
|
|
569
622
|
this.scopeManager.exitScope();
|
|
570
623
|
}
|
|
571
624
|
// LEAVE CLASS SCOPE for classes
|
|
@@ -24,6 +24,13 @@ class ExpressionResolver {
|
|
|
24
24
|
// Temporary per-scope variable overrides, used to inject .map() / .forEach()
|
|
25
25
|
// callback parameters while the callback body is being walked.
|
|
26
26
|
temporaryVariables = new Map();
|
|
27
|
+
// Shared (cross-file) table for object-shaped types: interfaces and object
|
|
28
|
+
// type aliases. Maps typeName -> { memberName: possible string values }.
|
|
29
|
+
// e.g. `interface IProps { size: ChangeType }` -> { IProps: { size: ['all','next'] } }
|
|
30
|
+
objectTypeTable = new Map();
|
|
31
|
+
// Temporary per-scope bindings for identifiers holding an object-shaped type,
|
|
32
|
+
// e.g. `function f(props: IProps)` -> { props: { size: ['all','next'] } }.
|
|
33
|
+
temporaryObjectVariables = new Map();
|
|
27
34
|
constructor(hooks) {
|
|
28
35
|
this.hooks = hooks;
|
|
29
36
|
}
|
|
@@ -212,6 +219,13 @@ class ExpressionResolver {
|
|
|
212
219
|
const tsType = node.typeAnnotation ?? node.typeAnn;
|
|
213
220
|
if (!tsType)
|
|
214
221
|
return;
|
|
222
|
+
// `type IProps = { size: ChangeType }` — object shape, not a string union.
|
|
223
|
+
if (tsType.type === 'TsTypeLiteral') {
|
|
224
|
+
const members = this.collectObjectTypeMembers(tsType.members);
|
|
225
|
+
if (members)
|
|
226
|
+
this.objectTypeTable.set(name, members);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
215
229
|
const vals = this.resolvePossibleStringValuesFromType(tsType);
|
|
216
230
|
if (vals.length > 0) {
|
|
217
231
|
this.typeAliasTable.set(name, vals);
|
|
@@ -223,6 +237,78 @@ class ExpressionResolver {
|
|
|
223
237
|
// noop
|
|
224
238
|
}
|
|
225
239
|
}
|
|
240
|
+
/**
|
|
241
|
+
* Capture a TypeScript interface so that parameters typed by it
|
|
242
|
+
* (`function f({ size }: IProps)` / `f(props: IProps)`) can resolve their
|
|
243
|
+
* members to string-literal unions.
|
|
244
|
+
*
|
|
245
|
+
* SWC node shape: `TsInterfaceDeclaration` with `body.body` members.
|
|
246
|
+
*/
|
|
247
|
+
captureInterfaceDeclaration(node) {
|
|
248
|
+
try {
|
|
249
|
+
const name = node?.id?.type === 'Identifier' ? node.id.value : undefined;
|
|
250
|
+
if (!name)
|
|
251
|
+
return;
|
|
252
|
+
const members = this.collectObjectTypeMembers(node?.body?.body);
|
|
253
|
+
if (members)
|
|
254
|
+
this.objectTypeTable.set(name, members);
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
// noop
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Build `{ memberName: possibleStringValues }` for an object-shaped type
|
|
262
|
+
* (interface body or object type-literal members). Only members whose type
|
|
263
|
+
* resolves to a finite string set are kept; returns undefined when none do.
|
|
264
|
+
*/
|
|
265
|
+
collectObjectTypeMembers(members) {
|
|
266
|
+
if (!Array.isArray(members))
|
|
267
|
+
return undefined;
|
|
268
|
+
const map = {};
|
|
269
|
+
for (const m of members) {
|
|
270
|
+
if (!m || m.type !== 'TsPropertySignature')
|
|
271
|
+
continue;
|
|
272
|
+
const memberName = m.key?.type === 'Identifier' ? m.key.value : m.key?.type === 'StringLiteral' ? m.key.value : undefined;
|
|
273
|
+
if (!memberName)
|
|
274
|
+
continue;
|
|
275
|
+
const tsType = m.typeAnnotation?.typeAnnotation ?? m.typeAnnotation;
|
|
276
|
+
if (!tsType)
|
|
277
|
+
continue;
|
|
278
|
+
const vals = this.resolvePossibleStringValuesFromType(tsType);
|
|
279
|
+
if (vals.length > 0)
|
|
280
|
+
map[memberName] = vals;
|
|
281
|
+
}
|
|
282
|
+
return Object.keys(map).length > 0 ? map : undefined;
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Resolve a type annotation that refers to an object shape (interface, object
|
|
286
|
+
* type alias, or inline type literal) to its member → string values map.
|
|
287
|
+
*/
|
|
288
|
+
resolveTypeMembers(tsType) {
|
|
289
|
+
try {
|
|
290
|
+
if (!tsType)
|
|
291
|
+
return undefined;
|
|
292
|
+
if (tsType.type === 'TsTypeLiteral') {
|
|
293
|
+
return this.collectObjectTypeMembers(tsType.members);
|
|
294
|
+
}
|
|
295
|
+
if (tsType.type === 'TsTypeReference' && tsType.typeName?.type === 'Identifier') {
|
|
296
|
+
return this.objectTypeTable.get(tsType.typeName.value);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
catch { }
|
|
300
|
+
return undefined;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Temporarily bind an identifier to an object-shaped type's members, so that
|
|
304
|
+
* `props.size` inside the function body resolves to the member's values.
|
|
305
|
+
*/
|
|
306
|
+
setTemporaryObjectVariable(name, members) {
|
|
307
|
+
this.temporaryObjectVariables.set(name, members);
|
|
308
|
+
}
|
|
309
|
+
deleteTemporaryObjectVariable(name) {
|
|
310
|
+
this.temporaryObjectVariables.delete(name);
|
|
311
|
+
}
|
|
226
312
|
/**
|
|
227
313
|
* Capture the return-type annotation of a function declaration so that
|
|
228
314
|
* `t(fn())` calls can be expanded to all union members.
|
|
@@ -550,6 +636,17 @@ class ExpressionResolver {
|
|
|
550
636
|
const prop = expression.property;
|
|
551
637
|
// only handle simple identifier base + simple property (Identifier or computed StringLiteral)
|
|
552
638
|
if (obj.type === 'Identifier') {
|
|
639
|
+
// Parameter typed by an interface / object type: `props.size`
|
|
640
|
+
const objMembers = this.temporaryObjectVariables.get(obj.value);
|
|
641
|
+
if (objMembers) {
|
|
642
|
+
const propName = prop.type === 'Identifier'
|
|
643
|
+
? prop.value
|
|
644
|
+
: prop.type === 'Computed' && prop.expression?.type === 'StringLiteral'
|
|
645
|
+
? prop.expression.value
|
|
646
|
+
: undefined;
|
|
647
|
+
if (propName && objMembers[propName])
|
|
648
|
+
return objMembers[propName];
|
|
649
|
+
}
|
|
553
650
|
const baseVar = this.variableTable.get(obj.value);
|
|
554
651
|
const baseShared = this.sharedEnumTable.get(obj.value);
|
|
555
652
|
const base = baseVar ?? baseShared;
|
package/dist/esm/linter.js
CHANGED
|
@@ -304,6 +304,11 @@ function lintInterpolationParams(ast, code, config, translationValues) {
|
|
|
304
304
|
}
|
|
305
305
|
return issues;
|
|
306
306
|
}
|
|
307
|
+
// Literal text that is punctuation only (no letters/digits). Covers ASCII, the
|
|
308
|
+
// CJK fullwidth forms and Arabic variants, since those are exactly the marks whose
|
|
309
|
+
// spacing/shape differ per language (French narrow no-break space before ':',
|
|
310
|
+
// fullwidth ':' in CJK, RTL reordering).
|
|
311
|
+
const PUNCTUATION_ONLY_RE = /^[:.!?,;\-–—…·/|&()[\]{}"'«»„“”‘’:.!?,;、。〜~؛،؟]+$/;
|
|
307
312
|
/**
|
|
308
313
|
* Detects string concatenation involving translated strings — an i18n
|
|
309
314
|
* anti-pattern because word order and grammar differ across languages, so
|
|
@@ -321,18 +326,28 @@ function lintInterpolationParams(ast, code, config, translationValues) {
|
|
|
321
326
|
* The fix in both cases is a single key with placeholders:
|
|
322
327
|
* t('greeting', { name }) / <Trans i18nKey="greeting">Hello {{name}}</Trans>
|
|
323
328
|
*
|
|
324
|
-
*
|
|
325
|
-
*
|
|
326
|
-
*
|
|
329
|
+
* Additionally, when `lint.checkPunctuationConcatenation` is enabled (opt-in,
|
|
330
|
+
* default 'off'), flags punctuation glued onto a translation:
|
|
331
|
+
* <label><Trans>Email</Trans>:</label> / <div>- <Trans>item</Trans></div>
|
|
332
|
+
*
|
|
333
|
+
* Severity for both is controlled by their config option: 'warn' reports without
|
|
334
|
+
* failing the run, 'error' makes it fail (exit non-zero), 'off'/false disables it.
|
|
327
335
|
*/
|
|
328
336
|
function lintConcatenation(ast, code, config) {
|
|
329
337
|
const issues = [];
|
|
330
|
-
// Resolve
|
|
331
|
-
// `'error'` makes
|
|
338
|
+
// Resolve each check's severity independently. `false`/'off' disable a check;
|
|
339
|
+
// `'error'` makes it fail the run (exit non-zero); `true`/'warn' warn.
|
|
340
|
+
// checkConcatenation defaults to on ('warn'); checkPunctuationConcatenation
|
|
341
|
+
// defaults to off (opt-in), since punctuation outside a translation is often
|
|
342
|
+
// deliberate and flagging it by default would be noisy.
|
|
332
343
|
const setting = config.lint?.checkConcatenation;
|
|
333
|
-
|
|
334
|
-
return issues;
|
|
344
|
+
const concatEnabled = setting !== false && setting !== 'off';
|
|
335
345
|
const severity = setting === 'error' ? 'error' : 'warning';
|
|
346
|
+
const punctSetting = config.lint?.checkPunctuationConcatenation;
|
|
347
|
+
const punctEnabled = punctSetting === true || punctSetting === 'warn' || punctSetting === 'error';
|
|
348
|
+
const punctSeverity = punctSetting === 'error' ? 'error' : 'warning';
|
|
349
|
+
if (!concatEnabled && !punctEnabled)
|
|
350
|
+
return issues;
|
|
336
351
|
const transComponents = new Set((config.extract.transComponents || ['Trans']).map(s => s.toLowerCase()));
|
|
337
352
|
const lineOf = (node) => {
|
|
338
353
|
const start = node?.span?.start;
|
|
@@ -344,6 +359,19 @@ function lintConcatenation(ast, code, config) {
|
|
|
344
359
|
// ponytail: span normalisation failed (also degrades ignore handling); coarse line 1.
|
|
345
360
|
return 1;
|
|
346
361
|
};
|
|
362
|
+
// A JSXText span starts right after the preceding tag, so it can begin on an
|
|
363
|
+
// earlier line than its visible text. Skip the leading whitespace to report the
|
|
364
|
+
// line the punctuation actually sits on.
|
|
365
|
+
const lineOfText = (node) => {
|
|
366
|
+
const start = node?.span?.start;
|
|
367
|
+
if (typeof start === 'number' && typeof node.value === 'string') {
|
|
368
|
+
const offset = node.value.length - node.value.trimStart().length;
|
|
369
|
+
const pos = lineColumnFromOffset(code, start + offset);
|
|
370
|
+
if (pos)
|
|
371
|
+
return pos.line;
|
|
372
|
+
}
|
|
373
|
+
return lineOf(node);
|
|
374
|
+
};
|
|
347
375
|
// Is `node` a translated-string operand of a concatenation? True when it is a
|
|
348
376
|
// t() call, or a `+` chain that itself contains one. Deliberately does NOT
|
|
349
377
|
// descend into other call/member expressions, so `arr.indexOf(t('x')) + 1`
|
|
@@ -379,7 +407,7 @@ function lintConcatenation(ast, code, config) {
|
|
|
379
407
|
return;
|
|
380
408
|
// JS: `+` concatenation involving a t() call. Only report the outermost `+`
|
|
381
409
|
// of a chain (skip when the parent is also a `+`) so one chain = one issue.
|
|
382
|
-
if (node.type === 'BinaryExpression' && node.operator === '+') {
|
|
410
|
+
if (concatEnabled && node.type === 'BinaryExpression' && node.operator === '+') {
|
|
383
411
|
const parentIsPlus = parent?.type === 'BinaryExpression' && parent.operator === '+';
|
|
384
412
|
if (!parentIsPlus && (isTranslatedConcatOperand(node.left) || isTranslatedConcatOperand(node.right))) {
|
|
385
413
|
issues.push({
|
|
@@ -394,32 +422,52 @@ function lintConcatenation(ast, code, config) {
|
|
|
394
422
|
// direct siblings — a <Trans> component or a `{t(...)}` expression. Covers
|
|
395
423
|
// <Trans>…</Trans><Trans>…</Trans>, <Trans>…</Trans>{t(…)} and {t(…)}{t(…)}.
|
|
396
424
|
if ((node.type === 'JSXElement' || node.type === 'JSXFragment') && Array.isArray(node.children)) {
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
for (const child of node.children) {
|
|
400
|
-
if (!child || typeof child !== 'object')
|
|
401
|
-
continue;
|
|
402
|
-
let isUnit = false;
|
|
425
|
+
const children = node.children.filter((c) => c && typeof c === 'object');
|
|
426
|
+
const isUnit = (child) => {
|
|
403
427
|
if (child.type === 'JSXElement') {
|
|
404
428
|
const name = getJsxName(child);
|
|
405
|
-
|
|
406
|
-
}
|
|
407
|
-
else if (child.type === 'JSXExpressionContainer') {
|
|
408
|
-
isUnit = isTranslationCall(child.expression, config);
|
|
429
|
+
return !!name && transComponents.has(name.toLowerCase());
|
|
409
430
|
}
|
|
410
|
-
if (
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
if (
|
|
431
|
+
if (child.type === 'JSXExpressionContainer')
|
|
432
|
+
return isTranslationCall(child.expression, config);
|
|
433
|
+
return false;
|
|
434
|
+
};
|
|
435
|
+
const units = children.filter(isUnit);
|
|
436
|
+
let reportedHere = false;
|
|
437
|
+
if (concatEnabled && units.length >= 2) {
|
|
417
438
|
issues.push({
|
|
418
439
|
text: 'Avoid splitting text across multiple translations (<Trans> or t()). Use a single translation with placeholders instead.',
|
|
419
|
-
line: lineOf(
|
|
440
|
+
line: lineOf(units[0]),
|
|
420
441
|
type: 'concatenation',
|
|
421
442
|
severity,
|
|
422
443
|
});
|
|
444
|
+
reportedHere = true;
|
|
445
|
+
}
|
|
446
|
+
// Punctuation glued onto a translation, e.g. `<Trans>Email</Trans>:` or
|
|
447
|
+
// `- <Trans>item</Trans>`. Skipped when the element was already reported
|
|
448
|
+
// above, so one problem yields one issue. Opt-in via config.
|
|
449
|
+
if (punctEnabled && !reportedHere) {
|
|
450
|
+
for (let i = 0; i < children.length; i++) {
|
|
451
|
+
const child = children[i];
|
|
452
|
+
if (child.type !== 'JSXText')
|
|
453
|
+
continue;
|
|
454
|
+
const trimmed = child.value.trim();
|
|
455
|
+
if (!trimmed || !PUNCTUATION_ONLY_RE.test(trimmed))
|
|
456
|
+
continue;
|
|
457
|
+
// Only flag when it actually abuts a translation (previous or next
|
|
458
|
+
// non-blank sibling), not when it merely shares a parent.
|
|
459
|
+
const prev = children.slice(0, i).reverse().find((c) => c.type !== 'JSXText' || c.value.trim());
|
|
460
|
+
const next = children.slice(i + 1).find((c) => c.type !== 'JSXText' || c.value.trim());
|
|
461
|
+
const neighbour = [prev, next].find(c => c && isUnit(c));
|
|
462
|
+
if (!neighbour)
|
|
463
|
+
continue;
|
|
464
|
+
issues.push({
|
|
465
|
+
text: `Avoid concatenating punctuation ("${trimmed}") with a translation. Include it in the translation string or use semantic markup, since punctuation spacing and form differ across languages.`,
|
|
466
|
+
line: lineOfText(child),
|
|
467
|
+
type: 'concatenation',
|
|
468
|
+
severity: punctSeverity,
|
|
469
|
+
});
|
|
470
|
+
}
|
|
423
471
|
}
|
|
424
472
|
}
|
|
425
473
|
for (const key of Object.keys(node)) {
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ast-visitors.d.ts","sourceRoot":"","sources":["../../../src/extractor/core/ast-visitors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAQ,MAAM,WAAW,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC7G,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AAItE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,KAAK,CAAiB;IAE9B,IAAW,UAAU,gBAEpB;IAED,SAAgB,YAAY,EAAE,YAAY,CAAA;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;IACvD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAuB;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,WAAW,CAAa;IAEhC;;;;;;OAMG;gBAED,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,eAAe,EACvB,kBAAkB,CAAC,EAAE,kBAAkB;IAiCzC;;;;;;;;;;;;;OAaG;IACI,mBAAmB,CAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAK/C;;;OAGG;IACH,OAAO,CAAC,iBAAiB;
|
|
1
|
+
{"version":3,"file":"ast-visitors.d.ts","sourceRoot":"","sources":["../../../src/extractor/core/ast-visitors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAQ,MAAM,WAAW,CAAA;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC7G,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAA;AAItE;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;IAC/B,OAAO,CAAC,KAAK,CAAiB;IAE9B,IAAW,UAAU,gBAEpB;IAED,SAAgB,YAAY,EAAE,YAAY,CAAA;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;IACvD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAuB;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;IACvC,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,WAAW,CAAa;IAEhC;;;;;;OAMG;gBAED,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,eAAe,EACvB,kBAAkB,CAAC,EAAE,kBAAkB;IAiCzC;;;;;;;;;;;;;OAaG;IACI,mBAAmB,CAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAK/C;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAqDzB;;;;;OAKG;IACI,KAAK,CAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAUjC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,IAAI;IAocZ;;;;;;;;OAQG;IACH,OAAO,CAAC,gCAAgC;IAqDxC;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAqB5B;;;;;;;;OAQG;IACI,eAAe,CAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI5D;;OAEG;IACI,cAAc,CAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAKxD;;;;;;OAMG;IACI,cAAc,IAAK,MAAM;IAIhC;;OAEG;IACI,cAAc,IAAK,MAAM;CAGjC"}
|
|
@@ -9,6 +9,8 @@ export declare class ExpressionResolver {
|
|
|
9
9
|
private sharedTypeAliasTable;
|
|
10
10
|
private sharedFunctionReturnTable;
|
|
11
11
|
private temporaryVariables;
|
|
12
|
+
private objectTypeTable;
|
|
13
|
+
private temporaryObjectVariables;
|
|
12
14
|
constructor(hooks: ASTVisitorHooks);
|
|
13
15
|
/**
|
|
14
16
|
* Clear per-file captured variables. Enums / shared maps are kept.
|
|
@@ -34,6 +36,31 @@ export declare class ExpressionResolver {
|
|
|
34
36
|
* SWC node shapes: `TsTypeAliasDeclaration` / `TsTypeAliasDecl`
|
|
35
37
|
*/
|
|
36
38
|
captureTypeAliasDeclaration(node: any): void;
|
|
39
|
+
/**
|
|
40
|
+
* Capture a TypeScript interface so that parameters typed by it
|
|
41
|
+
* (`function f({ size }: IProps)` / `f(props: IProps)`) can resolve their
|
|
42
|
+
* members to string-literal unions.
|
|
43
|
+
*
|
|
44
|
+
* SWC node shape: `TsInterfaceDeclaration` with `body.body` members.
|
|
45
|
+
*/
|
|
46
|
+
captureInterfaceDeclaration(node: any): void;
|
|
47
|
+
/**
|
|
48
|
+
* Build `{ memberName: possibleStringValues }` for an object-shaped type
|
|
49
|
+
* (interface body or object type-literal members). Only members whose type
|
|
50
|
+
* resolves to a finite string set are kept; returns undefined when none do.
|
|
51
|
+
*/
|
|
52
|
+
private collectObjectTypeMembers;
|
|
53
|
+
/**
|
|
54
|
+
* Resolve a type annotation that refers to an object shape (interface, object
|
|
55
|
+
* type alias, or inline type literal) to its member → string values map.
|
|
56
|
+
*/
|
|
57
|
+
resolveTypeMembers(tsType: any): Record<string, string[]> | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Temporarily bind an identifier to an object-shaped type's members, so that
|
|
60
|
+
* `props.size` inside the function body resolves to the member's values.
|
|
61
|
+
*/
|
|
62
|
+
setTemporaryObjectVariable(name: string, members: Record<string, string[]>): void;
|
|
63
|
+
deleteTemporaryObjectVariable(name: string): void;
|
|
37
64
|
/**
|
|
38
65
|
* Capture the return-type annotation of a function declaration so that
|
|
39
66
|
* `t(fn())` calls can be expanded to all union members.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expression-resolver.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/expression-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAkD,MAAM,WAAW,CAAA;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,KAAK,CAAiB;IAK9B,OAAO,CAAC,aAAa,CAA4D;IAGjF,OAAO,CAAC,eAAe,CAAiD;IAIxE,OAAO,CAAC,cAAc,CAAmC;IAIzD,OAAO,CAAC,mBAAmB,CAAmC;IAI9D,OAAO,CAAC,oBAAoB,CAAmC;IAM/D,OAAO,CAAC,yBAAyB,CAAmC;IAIpE,OAAO,CAAC,kBAAkB,CAAmC;
|
|
1
|
+
{"version":3,"file":"expression-resolver.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/expression-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAkD,MAAM,WAAW,CAAA;AAC3F,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAErD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,KAAK,CAAiB;IAK9B,OAAO,CAAC,aAAa,CAA4D;IAGjF,OAAO,CAAC,eAAe,CAAiD;IAIxE,OAAO,CAAC,cAAc,CAAmC;IAIzD,OAAO,CAAC,mBAAmB,CAAmC;IAI9D,OAAO,CAAC,oBAAoB,CAAmC;IAM/D,OAAO,CAAC,yBAAyB,CAAmC;IAIpE,OAAO,CAAC,kBAAkB,CAAmC;IAK7D,OAAO,CAAC,eAAe,CAAmD;IAI1E,OAAO,CAAC,wBAAwB,CAAmD;gBAEtE,KAAK,EAAE,eAAe;IAInC;;OAEG;IACI,gBAAgB,IAAK,IAAI;IAMhC;;;;;;;;;OASG;IACH,yBAAyB,CAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IA2J3C;;;;;;;OAOG;IACH,2BAA2B,CAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAwB7C;;;;;;OAMG;IACH,2BAA2B,CAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAW7C;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAehC;;;OAGG;IACI,kBAAkB,CAAE,MAAM,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,SAAS;IAa7E;;;OAGG;IACI,0BAA0B,CAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI;IAIlF,6BAA6B,CAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAIzD;;;;;;;;;OASG;IACH,0BAA0B,CAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAqC5C;;;;;;;;OAQG;IACH,OAAO,CAAC,iCAAiC;IA6CzC;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAQ7B;;;;OAIG;IACI,oBAAoB,CAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IAIlE;;OAEG;IACI,uBAAuB,CAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAInD;;;;OAIG;IACI,yBAAyB,CAAE,MAAM,EAAE,GAAG,GAAG,MAAM,EAAE;IAQxD;;;OAGG;IACI,iBAAiB,CAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS;IAQ7D;;;;OAIG;IACI,YAAY,CAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS;IAQtE;;;;;OAKG;IACH,sBAAsB,CAAE,IAAI,EAAE,GAAG,GAAG,IAAI;IAwBxC;;;;;;;OAOG;IACH,kCAAkC,CAAE,UAAU,EAAE,UAAU,GAAG,MAAM,EAAE;IAKrE;;;;;;;OAOG;IACH,8BAA8B,CAAE,UAAU,EAAE,UAAU,GAAG,MAAM,EAAE;IAKjE;;;;;;;;;;;;;;;;;;OAkBG;IACH,OAAO,CAAC,yCAAyC;IAqOjD,OAAO,CAAC,mCAAmC;IAiH3C;;;;;;OAMG;IACH,OAAO,CAAC,6CAA6C;IAyBrD;;;;;;OAMG;IACH,OAAO,CAAC,kDAAkD;CAwB3D"}
|
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;AA0epG,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
|
@@ -231,6 +231,18 @@ export interface I18nextToolkitConfig {
|
|
|
231
231
|
* - `'off'` / `false` — disable the check.
|
|
232
232
|
*/
|
|
233
233
|
checkConcatenation?: boolean | 'off' | 'warn' | 'error';
|
|
234
|
+
/** Lint punctuation concatenated onto a translation (default: `'off'`).
|
|
235
|
+
*
|
|
236
|
+
* Flags a literal punctuation sibling next to a `<Trans>` or `{t(...)}`, e.g.
|
|
237
|
+
* `<label><Trans>Email</Trans>:</label>` or `<div>- <Trans>item</Trans></div>`.
|
|
238
|
+
* Punctuation spacing and form differ across languages (French requires a
|
|
239
|
+
* narrow no-break space before `:`, CJK uses fullwidth forms, RTL reorders),
|
|
240
|
+
* so it belongs inside the translation or in semantic markup.
|
|
241
|
+
*
|
|
242
|
+
* Opt-in, since keeping punctuation out of the translation is often deliberate.
|
|
243
|
+
* Accepts the same values as {@link checkConcatenation}; defaults to `'off'`.
|
|
244
|
+
*/
|
|
245
|
+
checkPunctuationConcatenation?: boolean | 'off' | 'warn' | 'error';
|
|
234
246
|
};
|
|
235
247
|
/** Configuration options for TypeScript type generation */
|
|
236
248
|
types?: {
|
package/types/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|