i18next-cli 1.67.7 → 1.67.9
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 +2 -0
- package/dist/cjs/cli.js +1 -1
- package/dist/cjs/extractor/core/ast-visitors.js +82 -0
- package/dist/cjs/extractor/core/translation-manager.js +36 -45
- package/dist/cjs/extractor/parsers/expression-resolver.js +49 -0
- package/dist/cjs/types-generator.js +35 -1
- package/dist/esm/cli.js +1 -1
- package/dist/esm/extractor/core/ast-visitors.js +82 -0
- package/dist/esm/extractor/core/translation-manager.js +36 -45
- package/dist/esm/extractor/parsers/expression-resolver.js +49 -0
- package/dist/esm/types-generator.js +35 -1
- package/package.json +1 -1
- package/types/extractor/core/ast-visitors.d.ts +11 -0
- package/types/extractor/core/ast-visitors.d.ts.map +1 -1
- package/types/extractor/core/translation-manager.d.ts.map +1 -1
- package/types/extractor/parsers/expression-resolver.d.ts +14 -0
- package/types/extractor/parsers/expression-resolver.d.ts.map +1 -1
- package/types/types-generator.d.ts.map +1 -1
- package/types/types.d.ts +1 -0
- package/types/types.d.ts.map +1 -1
package/README.md
CHANGED
|
@@ -290,6 +290,8 @@ Namespace Progress: [■■■■■■■■■■■■■■■■□□□
|
|
|
290
290
|
### `types`
|
|
291
291
|
Generates TypeScript definitions from your translation files for full type-safety and autocompletion.
|
|
292
292
|
|
|
293
|
+
> **Note:** When `extract.defaultNS` is set to `false`, the generated `defaultNS` is derived from your resource files (i18next's type system cannot express `defaultNS: false`). Adjust the generated `i18next.d.ts` if your runtime i18next config uses a different default namespace.
|
|
294
|
+
|
|
293
295
|
```bash
|
|
294
296
|
npx i18next-cli types [options]
|
|
295
297
|
```
|
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.9'); // 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
|
|
@@ -175,6 +175,7 @@ class ASTVisitors {
|
|
|
175
175
|
let isNewClassScope = false;
|
|
176
176
|
let paramTemporaries;
|
|
177
177
|
let paramObjectTemporaries;
|
|
178
|
+
let paramArrayTemporaries;
|
|
178
179
|
// ENTER CLASS SCOPE for class declarations / expressions and pre-register
|
|
179
180
|
// class field initializers so that later `this.<field>` references inside
|
|
180
181
|
// method bodies can inherit the namespace/keyPrefix from the field.
|
|
@@ -409,6 +410,17 @@ class ASTVisitors {
|
|
|
409
410
|
paramObjectTemporaries = [];
|
|
410
411
|
paramObjectTemporaries.push(paramKey);
|
|
411
412
|
}
|
|
413
|
+
else {
|
|
414
|
+
// Array-of-object param (`items: IProps[]`) so the callback
|
|
415
|
+
// parameter of `items.map(...)` can be bound to the element type.
|
|
416
|
+
const elementMembers = this.expressionResolver.resolveArrayElementMembers(typeAnn);
|
|
417
|
+
if (elementMembers) {
|
|
418
|
+
this.expressionResolver.setArrayElementMembers(paramKey, elementMembers);
|
|
419
|
+
if (!paramArrayTemporaries)
|
|
420
|
+
paramArrayTemporaries = [];
|
|
421
|
+
paramArrayTemporaries.push(paramKey);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
412
424
|
}
|
|
413
425
|
}
|
|
414
426
|
}
|
|
@@ -473,6 +485,11 @@ class ASTVisitors {
|
|
|
473
485
|
this.expressionResolver.setTemporaryVariable(info.paramName, info.values);
|
|
474
486
|
arrayCallbackCleanup = () => this.expressionResolver.deleteTemporaryVariable(info.paramName);
|
|
475
487
|
}
|
|
488
|
+
else {
|
|
489
|
+
// `items.map(({ size }) => ...)` / `items.map(item => ...t(`${item.size}`))`
|
|
490
|
+
// where `items` is typed as an array of an object shape.
|
|
491
|
+
arrayCallbackCleanup = this.tryBindObjectArrayCallback(node);
|
|
492
|
+
}
|
|
476
493
|
}
|
|
477
494
|
// --- RECURSION ---
|
|
478
495
|
// Recurse into the children of the current node
|
|
@@ -621,6 +638,11 @@ class ASTVisitors {
|
|
|
621
638
|
this.expressionResolver.deleteTemporaryObjectVariable(name);
|
|
622
639
|
}
|
|
623
640
|
}
|
|
641
|
+
if (paramArrayTemporaries) {
|
|
642
|
+
for (const name of paramArrayTemporaries) {
|
|
643
|
+
this.expressionResolver.deleteArrayElementMembers(name);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
624
646
|
this.scopeManager.exitScope();
|
|
625
647
|
}
|
|
626
648
|
// LEAVE CLASS SCOPE for classes
|
|
@@ -687,6 +709,66 @@ class ASTVisitors {
|
|
|
687
709
|
return undefined;
|
|
688
710
|
}
|
|
689
711
|
}
|
|
712
|
+
/**
|
|
713
|
+
* If `node` is `items.map(cb)` (or forEach/flatMap/…) where `items` is typed
|
|
714
|
+
* as an array of an object shape (`items: IProps[]`), binds the callback
|
|
715
|
+
* parameter to the element type for the duration of the callback body:
|
|
716
|
+
*
|
|
717
|
+
* items.map(({ size }) => t(`some|${size}`)) → `size` bound to the union
|
|
718
|
+
* items.map(item => t(`some|${item.size}`)) → `item` bound to the members
|
|
719
|
+
*
|
|
720
|
+
* Returns a cleanup function, or undefined when nothing was bound.
|
|
721
|
+
*/
|
|
722
|
+
tryBindObjectArrayCallback(node) {
|
|
723
|
+
try {
|
|
724
|
+
const callee = node.callee;
|
|
725
|
+
if (callee?.type !== 'MemberExpression')
|
|
726
|
+
return undefined;
|
|
727
|
+
const prop = callee.property;
|
|
728
|
+
if (prop?.type !== 'Identifier')
|
|
729
|
+
return undefined;
|
|
730
|
+
if (!['map', 'forEach', 'flatMap', 'filter', 'find', 'some', 'every'].includes(prop.value))
|
|
731
|
+
return undefined;
|
|
732
|
+
if (callee.object?.type !== 'Identifier')
|
|
733
|
+
return undefined;
|
|
734
|
+
const members = this.expressionResolver.getArrayElementMembers(callee.object.value);
|
|
735
|
+
if (!members)
|
|
736
|
+
return undefined;
|
|
737
|
+
const callbackArg = node.arguments?.[0]?.expression;
|
|
738
|
+
const params = callbackArg?.params ?? callbackArg?.parameters ?? [];
|
|
739
|
+
const firstParam = params[0];
|
|
740
|
+
if (!firstParam)
|
|
741
|
+
return undefined;
|
|
742
|
+
const pat = firstParam.pat ?? firstParam.pattern ?? firstParam;
|
|
743
|
+
// Destructured element: `({ size }) => …` / `({ size: s }) => …`
|
|
744
|
+
if (pat.type === 'ObjectPattern') {
|
|
745
|
+
const bound = [];
|
|
746
|
+
for (const patProp of (pat.properties ?? [])) {
|
|
747
|
+
const memberName = patProp?.key?.value;
|
|
748
|
+
let localNode = patProp?.type === 'KeyValuePatternProperty' ? patProp.value : patProp?.key;
|
|
749
|
+
if (localNode?.type === 'AssignmentPattern')
|
|
750
|
+
localNode = localNode.left;
|
|
751
|
+
const localName = localNode?.type === 'Identifier' ? localNode.value : undefined;
|
|
752
|
+
if (!memberName || !localName || !members[memberName])
|
|
753
|
+
continue;
|
|
754
|
+
this.expressionResolver.setTemporaryVariable(localName, members[memberName]);
|
|
755
|
+
bound.push(localName);
|
|
756
|
+
}
|
|
757
|
+
if (bound.length === 0)
|
|
758
|
+
return undefined;
|
|
759
|
+
return () => bound.forEach(name => this.expressionResolver.deleteTemporaryVariable(name));
|
|
760
|
+
}
|
|
761
|
+
// Whole element: `item => …` so `item.size` resolves
|
|
762
|
+
if (pat.type === 'Identifier') {
|
|
763
|
+
this.expressionResolver.setTemporaryObjectVariable(pat.value, members);
|
|
764
|
+
return () => this.expressionResolver.deleteTemporaryObjectVariable(pat.value);
|
|
765
|
+
}
|
|
766
|
+
return undefined;
|
|
767
|
+
}
|
|
768
|
+
catch {
|
|
769
|
+
return undefined;
|
|
770
|
+
}
|
|
771
|
+
}
|
|
690
772
|
/**
|
|
691
773
|
* Extracts the first callback parameter identifier from an iteration call node
|
|
692
774
|
* and pairs it with the provided values array.
|
|
@@ -95,61 +95,52 @@ function sortObject(obj, config, customSort) {
|
|
|
95
95
|
const pluralSeparator = config?.extract?.pluralSeparator ?? '_';
|
|
96
96
|
// Define the canonical order for plural forms
|
|
97
97
|
const ordinalPluralOrder = pluralForms.map(form => `ordinal${pluralSeparator}${form}`);
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
// Handle cardinal plurals: key_form or key_context_form
|
|
109
|
-
for (const form of pluralForms) {
|
|
110
|
-
if (key.endsWith(`${pluralSeparator}${form}`)) {
|
|
111
|
-
const base = key.slice(0, -(pluralSeparator.length + form.length));
|
|
112
|
-
return { base, form, isOrdinal: false, isPlural: true, fullKey: key };
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
return { base: key, form: '', isOrdinal: false, isPlural: false, fullKey: key };
|
|
116
|
-
};
|
|
117
|
-
const aInfo = getKeyInfo(a);
|
|
118
|
-
const bInfo = getKeyInfo(b);
|
|
119
|
-
// If both are plural forms
|
|
120
|
-
if (aInfo.isPlural && bInfo.isPlural) {
|
|
121
|
-
// First compare by base key
|
|
122
|
-
const baseComparison = customSort
|
|
123
|
-
? customSort(aInfo.base, bInfo.base)
|
|
124
|
-
: aInfo.base.localeCompare(bInfo.base, undefined, { sensitivity: 'base' });
|
|
125
|
-
if (baseComparison !== 0) {
|
|
126
|
-
return baseComparison;
|
|
98
|
+
// Helper function to extract base key and its rank within that base.
|
|
99
|
+
// Rank orders the variants of one base key: the plain key first, then the
|
|
100
|
+
// cardinal plural forms in canonical order, then the ordinal ones.
|
|
101
|
+
const getKeyInfo = (key) => {
|
|
102
|
+
// Handle ordinal plurals: key_ordinal_form or key_context_ordinal_form
|
|
103
|
+
for (const form of ordinalPluralOrder) {
|
|
104
|
+
if (key.endsWith(`${pluralSeparator}${form}`)) {
|
|
105
|
+
const base = key.slice(0, -(pluralSeparator.length + form.length));
|
|
106
|
+
return { base, rank: pluralForms.length + ordinalPluralOrder.indexOf(form) };
|
|
127
107
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
const orderArray = aInfo.isOrdinal ? ordinalPluralOrder : pluralForms;
|
|
135
|
-
const aIndex = orderArray.indexOf(aInfo.form);
|
|
136
|
-
const bIndex = orderArray.indexOf(bInfo.form);
|
|
137
|
-
if (aIndex !== -1 && bIndex !== -1) {
|
|
138
|
-
return aIndex - bIndex;
|
|
108
|
+
}
|
|
109
|
+
// Handle cardinal plurals: key_form or key_context_form
|
|
110
|
+
for (const form of pluralForms) {
|
|
111
|
+
if (key.endsWith(`${pluralSeparator}${form}`)) {
|
|
112
|
+
const base = key.slice(0, -(pluralSeparator.length + form.length));
|
|
113
|
+
return { base, rank: pluralForms.indexOf(form) };
|
|
139
114
|
}
|
|
140
|
-
// Fallback to alphabetical if forms not found in order array
|
|
141
|
-
return aInfo.form.localeCompare(bInfo.form);
|
|
142
115
|
}
|
|
143
|
-
|
|
144
|
-
|
|
116
|
+
return { base: key, rank: -1 };
|
|
117
|
+
};
|
|
118
|
+
const compareKeys = (a, b) => {
|
|
119
|
+
if (customSort)
|
|
145
120
|
return customSort(a, b);
|
|
146
|
-
}
|
|
147
121
|
// Default: case-insensitive, then by case
|
|
148
122
|
const caseInsensitiveComparison = a.localeCompare(b, undefined, { sensitivity: 'base' });
|
|
149
123
|
if (caseInsensitiveComparison === 0) {
|
|
150
124
|
return a.localeCompare(b, undefined, { sensitivity: 'case' });
|
|
151
125
|
}
|
|
152
126
|
return caseInsensitiveComparison;
|
|
127
|
+
};
|
|
128
|
+
const keys = Object.keys(obj).sort((a, b) => {
|
|
129
|
+
const aInfo = getKeyInfo(a);
|
|
130
|
+
const bInfo = getKeyInfo(b);
|
|
131
|
+
// Always compare by base key first. Comparing base keys for plural/plural
|
|
132
|
+
// pairs but full keys for every other pair made the comparator
|
|
133
|
+
// intransitive, so the result depended on the input order and `extract`
|
|
134
|
+
// was not idempotent (#279).
|
|
135
|
+
if (aInfo.base !== bInfo.base) {
|
|
136
|
+
const baseComparison = compareKeys(aInfo.base, bInfo.base);
|
|
137
|
+
if (baseComparison !== 0)
|
|
138
|
+
return baseComparison;
|
|
139
|
+
}
|
|
140
|
+
// Same base key: plain key, cardinal plurals, then ordinal plurals
|
|
141
|
+
if (aInfo.rank !== bInfo.rank)
|
|
142
|
+
return aInfo.rank - bInfo.rank;
|
|
143
|
+
return compareKeys(a, b);
|
|
153
144
|
});
|
|
154
145
|
for (const key of keys) {
|
|
155
146
|
sortedObj[key] = sortObject(obj[key], config, customSort);
|
|
@@ -33,6 +33,10 @@ class ExpressionResolver {
|
|
|
33
33
|
// Temporary per-scope bindings for identifiers holding an object-shaped type,
|
|
34
34
|
// e.g. `function f(props: IProps)` -> { props: { size: ['all','next'] } }.
|
|
35
35
|
temporaryObjectVariables = new Map();
|
|
36
|
+
// Identifiers holding an array of an object-shaped type, e.g.
|
|
37
|
+
// `items: IProps[]` -> { items: { size: ['all','next'] } }, so that the
|
|
38
|
+
// callback parameter of `items.map(...)` can be bound to the element type.
|
|
39
|
+
arrayElementMembers = new Map();
|
|
36
40
|
constructor(hooks) {
|
|
37
41
|
this.hooks = hooks;
|
|
38
42
|
}
|
|
@@ -43,6 +47,7 @@ class ExpressionResolver {
|
|
|
43
47
|
this.variableTable.clear();
|
|
44
48
|
this.typeAliasTable.clear();
|
|
45
49
|
this.temporaryVariables.clear();
|
|
50
|
+
this.arrayElementMembers.clear();
|
|
46
51
|
}
|
|
47
52
|
/**
|
|
48
53
|
* Capture a VariableDeclarator node to record simple statically analyzable
|
|
@@ -97,6 +102,14 @@ class ExpressionResolver {
|
|
|
97
102
|
if (node.id.type !== 'Identifier')
|
|
98
103
|
return;
|
|
99
104
|
const name = node.id.value;
|
|
105
|
+
// `const items: IProps[] = …` → remember the element's member map so
|
|
106
|
+
// `items.map(({ size }) => …)` can bind the callback parameter.
|
|
107
|
+
const idTypeAnnotation = this.extractTypeAnnotation(node.id);
|
|
108
|
+
if (idTypeAnnotation) {
|
|
109
|
+
const elementMembers = this.resolveArrayElementMembers(idTypeAnnotation);
|
|
110
|
+
if (elementMembers)
|
|
111
|
+
this.arrayElementMembers.set(name, elementMembers);
|
|
112
|
+
}
|
|
100
113
|
// pattern 1:
|
|
101
114
|
// Handle `declare const x: 'a' | 'b'` and `declare const x: SomeUnion`
|
|
102
115
|
// where there is no initializer but a TypeScript type annotation.
|
|
@@ -301,6 +314,42 @@ class ExpressionResolver {
|
|
|
301
314
|
catch { }
|
|
302
315
|
return undefined;
|
|
303
316
|
}
|
|
317
|
+
/**
|
|
318
|
+
* Resolve a type annotation for an array of an object shape (`IProps[]`,
|
|
319
|
+
* `Array<IProps>`, `ReadonlyArray<IProps>`) to the element's member map, so
|
|
320
|
+
* that `items.map(({ size }) => …)` can bind the callback parameter.
|
|
321
|
+
*/
|
|
322
|
+
resolveArrayElementMembers(tsType) {
|
|
323
|
+
try {
|
|
324
|
+
if (!tsType)
|
|
325
|
+
return undefined;
|
|
326
|
+
if (tsType.type === 'TsArrayType') {
|
|
327
|
+
return this.resolveTypeMembers(tsType.elemType);
|
|
328
|
+
}
|
|
329
|
+
if (tsType.type === 'TsTypeReference' && tsType.typeName?.type === 'Identifier') {
|
|
330
|
+
const name = tsType.typeName.value;
|
|
331
|
+
if (name !== 'Array' && name !== 'ReadonlyArray')
|
|
332
|
+
return undefined;
|
|
333
|
+
const arg = tsType.typeParams?.params?.[0] ?? tsType.typeArguments?.params?.[0];
|
|
334
|
+
return this.resolveTypeMembers(arg);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
catch { }
|
|
338
|
+
return undefined;
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Bind an identifier to the member map of its array element type
|
|
342
|
+
* (`items: IProps[]`).
|
|
343
|
+
*/
|
|
344
|
+
setArrayElementMembers(name, members) {
|
|
345
|
+
this.arrayElementMembers.set(name, members);
|
|
346
|
+
}
|
|
347
|
+
getArrayElementMembers(name) {
|
|
348
|
+
return this.arrayElementMembers.get(name);
|
|
349
|
+
}
|
|
350
|
+
deleteArrayElementMembers(name) {
|
|
351
|
+
this.arrayElementMembers.delete(name);
|
|
352
|
+
}
|
|
304
353
|
/**
|
|
305
354
|
* Temporarily bind an identifier to an object-shaped type's members, so that
|
|
306
355
|
* `props.size` inside the function body resolves to the member's values.
|
|
@@ -190,7 +190,41 @@ ${i18nextResourcesForTs.mergeResourcesAsInterface(resources, { optimize: !!enabl
|
|
|
190
190
|
// The main output file will now import from the resources file
|
|
191
191
|
const importPath = node_path.relative(node_path.dirname(outputPath), resourcesOutputPath)
|
|
192
192
|
.replace(/\\/g, '/').replace(/\.d\.ts$/, ''); // Make it a valid module path
|
|
193
|
-
|
|
193
|
+
// i18next's type system cannot resolve keys for `defaultNS: false` —
|
|
194
|
+
// `t()` would silently accept any string. When `extract.defaultNS` is
|
|
195
|
+
// disabled, derive the default namespace from the generated resources
|
|
196
|
+
// instead, so the generated types stay self-consistent.
|
|
197
|
+
let defaultNS = `'${config.extract.defaultNS || 'translation'}'`;
|
|
198
|
+
if (config.extract.defaultNS === false) {
|
|
199
|
+
const sortedNamespaces = [...new Set(resources.map(r => r.name))].sort();
|
|
200
|
+
// Namespaces resolved outside types.basePath already warn above; rank
|
|
201
|
+
// them last so a valid sibling wins the pick, but keep them derivable —
|
|
202
|
+
// they are real keys of the generated Resources interface.
|
|
203
|
+
const resourceNamespaces = [
|
|
204
|
+
...sortedNamespaces.filter(ns => !ns.startsWith('..')),
|
|
205
|
+
...sortedNamespaces.filter(ns => ns.startsWith('..')),
|
|
206
|
+
];
|
|
207
|
+
// Files named after locales (e.g. locales/en.json) carry no namespace
|
|
208
|
+
// information. A single one is still a usable default, but multiple
|
|
209
|
+
// would turn sibling languages into namespaces — keep `false` then.
|
|
210
|
+
// A single locale-named sibling is enough to tell the layout apart:
|
|
211
|
+
// types.input may well match more languages than `locales` lists.
|
|
212
|
+
const onlyLocaleNames = resourceNamespaces.length > 1 && resourceNamespaces.some(ns => config.locales.includes(ns));
|
|
213
|
+
if (resourceNamespaces.length === 0) {
|
|
214
|
+
defaultNS = 'false';
|
|
215
|
+
}
|
|
216
|
+
else if (onlyLocaleNames) {
|
|
217
|
+
internalLogger.warn(node_util.styleText('yellow', 'Warning: extract.defaultNS is disabled and your resource files are named after locales, so no namespace could be derived for the generated definitions — defaultNS stays false and t() will not be type-checked. Consider adjusting types.input or types.basePath.'));
|
|
218
|
+
defaultNS = 'false';
|
|
219
|
+
}
|
|
220
|
+
else {
|
|
221
|
+
// Unprefixed keys resolve against a single default namespace, so a
|
|
222
|
+
// single name is emitted; prefer the conventional 'translation'.
|
|
223
|
+
const effectiveDefault = resourceNamespaces.includes('translation') ? 'translation' : resourceNamespaces[0];
|
|
224
|
+
internalLogger.warn(node_util.styleText('yellow', `Warning: extract.defaultNS is disabled, so defaultNS was derived from your resource files ('${effectiveDefault}'). Adjust the generated definitions if your runtime i18next config uses a different default namespace.`));
|
|
225
|
+
defaultNS = `'${effectiveDefault}'`;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
194
228
|
const fallbackNS = config.extract.fallbackNS === false
|
|
195
229
|
? 'false'
|
|
196
230
|
: Array.isArray(config.extract.fallbackNS)
|
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.9'); // 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
|
|
@@ -173,6 +173,7 @@ class ASTVisitors {
|
|
|
173
173
|
let isNewClassScope = false;
|
|
174
174
|
let paramTemporaries;
|
|
175
175
|
let paramObjectTemporaries;
|
|
176
|
+
let paramArrayTemporaries;
|
|
176
177
|
// ENTER CLASS SCOPE for class declarations / expressions and pre-register
|
|
177
178
|
// class field initializers so that later `this.<field>` references inside
|
|
178
179
|
// method bodies can inherit the namespace/keyPrefix from the field.
|
|
@@ -407,6 +408,17 @@ class ASTVisitors {
|
|
|
407
408
|
paramObjectTemporaries = [];
|
|
408
409
|
paramObjectTemporaries.push(paramKey);
|
|
409
410
|
}
|
|
411
|
+
else {
|
|
412
|
+
// Array-of-object param (`items: IProps[]`) so the callback
|
|
413
|
+
// parameter of `items.map(...)` can be bound to the element type.
|
|
414
|
+
const elementMembers = this.expressionResolver.resolveArrayElementMembers(typeAnn);
|
|
415
|
+
if (elementMembers) {
|
|
416
|
+
this.expressionResolver.setArrayElementMembers(paramKey, elementMembers);
|
|
417
|
+
if (!paramArrayTemporaries)
|
|
418
|
+
paramArrayTemporaries = [];
|
|
419
|
+
paramArrayTemporaries.push(paramKey);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
410
422
|
}
|
|
411
423
|
}
|
|
412
424
|
}
|
|
@@ -471,6 +483,11 @@ class ASTVisitors {
|
|
|
471
483
|
this.expressionResolver.setTemporaryVariable(info.paramName, info.values);
|
|
472
484
|
arrayCallbackCleanup = () => this.expressionResolver.deleteTemporaryVariable(info.paramName);
|
|
473
485
|
}
|
|
486
|
+
else {
|
|
487
|
+
// `items.map(({ size }) => ...)` / `items.map(item => ...t(`${item.size}`))`
|
|
488
|
+
// where `items` is typed as an array of an object shape.
|
|
489
|
+
arrayCallbackCleanup = this.tryBindObjectArrayCallback(node);
|
|
490
|
+
}
|
|
474
491
|
}
|
|
475
492
|
// --- RECURSION ---
|
|
476
493
|
// Recurse into the children of the current node
|
|
@@ -619,6 +636,11 @@ class ASTVisitors {
|
|
|
619
636
|
this.expressionResolver.deleteTemporaryObjectVariable(name);
|
|
620
637
|
}
|
|
621
638
|
}
|
|
639
|
+
if (paramArrayTemporaries) {
|
|
640
|
+
for (const name of paramArrayTemporaries) {
|
|
641
|
+
this.expressionResolver.deleteArrayElementMembers(name);
|
|
642
|
+
}
|
|
643
|
+
}
|
|
622
644
|
this.scopeManager.exitScope();
|
|
623
645
|
}
|
|
624
646
|
// LEAVE CLASS SCOPE for classes
|
|
@@ -685,6 +707,66 @@ class ASTVisitors {
|
|
|
685
707
|
return undefined;
|
|
686
708
|
}
|
|
687
709
|
}
|
|
710
|
+
/**
|
|
711
|
+
* If `node` is `items.map(cb)` (or forEach/flatMap/…) where `items` is typed
|
|
712
|
+
* as an array of an object shape (`items: IProps[]`), binds the callback
|
|
713
|
+
* parameter to the element type for the duration of the callback body:
|
|
714
|
+
*
|
|
715
|
+
* items.map(({ size }) => t(`some|${size}`)) → `size` bound to the union
|
|
716
|
+
* items.map(item => t(`some|${item.size}`)) → `item` bound to the members
|
|
717
|
+
*
|
|
718
|
+
* Returns a cleanup function, or undefined when nothing was bound.
|
|
719
|
+
*/
|
|
720
|
+
tryBindObjectArrayCallback(node) {
|
|
721
|
+
try {
|
|
722
|
+
const callee = node.callee;
|
|
723
|
+
if (callee?.type !== 'MemberExpression')
|
|
724
|
+
return undefined;
|
|
725
|
+
const prop = callee.property;
|
|
726
|
+
if (prop?.type !== 'Identifier')
|
|
727
|
+
return undefined;
|
|
728
|
+
if (!['map', 'forEach', 'flatMap', 'filter', 'find', 'some', 'every'].includes(prop.value))
|
|
729
|
+
return undefined;
|
|
730
|
+
if (callee.object?.type !== 'Identifier')
|
|
731
|
+
return undefined;
|
|
732
|
+
const members = this.expressionResolver.getArrayElementMembers(callee.object.value);
|
|
733
|
+
if (!members)
|
|
734
|
+
return undefined;
|
|
735
|
+
const callbackArg = node.arguments?.[0]?.expression;
|
|
736
|
+
const params = callbackArg?.params ?? callbackArg?.parameters ?? [];
|
|
737
|
+
const firstParam = params[0];
|
|
738
|
+
if (!firstParam)
|
|
739
|
+
return undefined;
|
|
740
|
+
const pat = firstParam.pat ?? firstParam.pattern ?? firstParam;
|
|
741
|
+
// Destructured element: `({ size }) => …` / `({ size: s }) => …`
|
|
742
|
+
if (pat.type === 'ObjectPattern') {
|
|
743
|
+
const bound = [];
|
|
744
|
+
for (const patProp of (pat.properties ?? [])) {
|
|
745
|
+
const memberName = patProp?.key?.value;
|
|
746
|
+
let localNode = patProp?.type === 'KeyValuePatternProperty' ? patProp.value : patProp?.key;
|
|
747
|
+
if (localNode?.type === 'AssignmentPattern')
|
|
748
|
+
localNode = localNode.left;
|
|
749
|
+
const localName = localNode?.type === 'Identifier' ? localNode.value : undefined;
|
|
750
|
+
if (!memberName || !localName || !members[memberName])
|
|
751
|
+
continue;
|
|
752
|
+
this.expressionResolver.setTemporaryVariable(localName, members[memberName]);
|
|
753
|
+
bound.push(localName);
|
|
754
|
+
}
|
|
755
|
+
if (bound.length === 0)
|
|
756
|
+
return undefined;
|
|
757
|
+
return () => bound.forEach(name => this.expressionResolver.deleteTemporaryVariable(name));
|
|
758
|
+
}
|
|
759
|
+
// Whole element: `item => …` so `item.size` resolves
|
|
760
|
+
if (pat.type === 'Identifier') {
|
|
761
|
+
this.expressionResolver.setTemporaryObjectVariable(pat.value, members);
|
|
762
|
+
return () => this.expressionResolver.deleteTemporaryObjectVariable(pat.value);
|
|
763
|
+
}
|
|
764
|
+
return undefined;
|
|
765
|
+
}
|
|
766
|
+
catch {
|
|
767
|
+
return undefined;
|
|
768
|
+
}
|
|
769
|
+
}
|
|
688
770
|
/**
|
|
689
771
|
* Extracts the first callback parameter identifier from an iteration call node
|
|
690
772
|
* and pairs it with the provided values array.
|
|
@@ -93,61 +93,52 @@ function sortObject(obj, config, customSort) {
|
|
|
93
93
|
const pluralSeparator = config?.extract?.pluralSeparator ?? '_';
|
|
94
94
|
// Define the canonical order for plural forms
|
|
95
95
|
const ordinalPluralOrder = pluralForms.map(form => `ordinal${pluralSeparator}${form}`);
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
// Handle cardinal plurals: key_form or key_context_form
|
|
107
|
-
for (const form of pluralForms) {
|
|
108
|
-
if (key.endsWith(`${pluralSeparator}${form}`)) {
|
|
109
|
-
const base = key.slice(0, -(pluralSeparator.length + form.length));
|
|
110
|
-
return { base, form, isOrdinal: false, isPlural: true, fullKey: key };
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
return { base: key, form: '', isOrdinal: false, isPlural: false, fullKey: key };
|
|
114
|
-
};
|
|
115
|
-
const aInfo = getKeyInfo(a);
|
|
116
|
-
const bInfo = getKeyInfo(b);
|
|
117
|
-
// If both are plural forms
|
|
118
|
-
if (aInfo.isPlural && bInfo.isPlural) {
|
|
119
|
-
// First compare by base key
|
|
120
|
-
const baseComparison = customSort
|
|
121
|
-
? customSort(aInfo.base, bInfo.base)
|
|
122
|
-
: aInfo.base.localeCompare(bInfo.base, undefined, { sensitivity: 'base' });
|
|
123
|
-
if (baseComparison !== 0) {
|
|
124
|
-
return baseComparison;
|
|
96
|
+
// Helper function to extract base key and its rank within that base.
|
|
97
|
+
// Rank orders the variants of one base key: the plain key first, then the
|
|
98
|
+
// cardinal plural forms in canonical order, then the ordinal ones.
|
|
99
|
+
const getKeyInfo = (key) => {
|
|
100
|
+
// Handle ordinal plurals: key_ordinal_form or key_context_ordinal_form
|
|
101
|
+
for (const form of ordinalPluralOrder) {
|
|
102
|
+
if (key.endsWith(`${pluralSeparator}${form}`)) {
|
|
103
|
+
const base = key.slice(0, -(pluralSeparator.length + form.length));
|
|
104
|
+
return { base, rank: pluralForms.length + ordinalPluralOrder.indexOf(form) };
|
|
125
105
|
}
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
const orderArray = aInfo.isOrdinal ? ordinalPluralOrder : pluralForms;
|
|
133
|
-
const aIndex = orderArray.indexOf(aInfo.form);
|
|
134
|
-
const bIndex = orderArray.indexOf(bInfo.form);
|
|
135
|
-
if (aIndex !== -1 && bIndex !== -1) {
|
|
136
|
-
return aIndex - bIndex;
|
|
106
|
+
}
|
|
107
|
+
// Handle cardinal plurals: key_form or key_context_form
|
|
108
|
+
for (const form of pluralForms) {
|
|
109
|
+
if (key.endsWith(`${pluralSeparator}${form}`)) {
|
|
110
|
+
const base = key.slice(0, -(pluralSeparator.length + form.length));
|
|
111
|
+
return { base, rank: pluralForms.indexOf(form) };
|
|
137
112
|
}
|
|
138
|
-
// Fallback to alphabetical if forms not found in order array
|
|
139
|
-
return aInfo.form.localeCompare(bInfo.form);
|
|
140
113
|
}
|
|
141
|
-
|
|
142
|
-
|
|
114
|
+
return { base: key, rank: -1 };
|
|
115
|
+
};
|
|
116
|
+
const compareKeys = (a, b) => {
|
|
117
|
+
if (customSort)
|
|
143
118
|
return customSort(a, b);
|
|
144
|
-
}
|
|
145
119
|
// Default: case-insensitive, then by case
|
|
146
120
|
const caseInsensitiveComparison = a.localeCompare(b, undefined, { sensitivity: 'base' });
|
|
147
121
|
if (caseInsensitiveComparison === 0) {
|
|
148
122
|
return a.localeCompare(b, undefined, { sensitivity: 'case' });
|
|
149
123
|
}
|
|
150
124
|
return caseInsensitiveComparison;
|
|
125
|
+
};
|
|
126
|
+
const keys = Object.keys(obj).sort((a, b) => {
|
|
127
|
+
const aInfo = getKeyInfo(a);
|
|
128
|
+
const bInfo = getKeyInfo(b);
|
|
129
|
+
// Always compare by base key first. Comparing base keys for plural/plural
|
|
130
|
+
// pairs but full keys for every other pair made the comparator
|
|
131
|
+
// intransitive, so the result depended on the input order and `extract`
|
|
132
|
+
// was not idempotent (#279).
|
|
133
|
+
if (aInfo.base !== bInfo.base) {
|
|
134
|
+
const baseComparison = compareKeys(aInfo.base, bInfo.base);
|
|
135
|
+
if (baseComparison !== 0)
|
|
136
|
+
return baseComparison;
|
|
137
|
+
}
|
|
138
|
+
// Same base key: plain key, cardinal plurals, then ordinal plurals
|
|
139
|
+
if (aInfo.rank !== bInfo.rank)
|
|
140
|
+
return aInfo.rank - bInfo.rank;
|
|
141
|
+
return compareKeys(a, b);
|
|
151
142
|
});
|
|
152
143
|
for (const key of keys) {
|
|
153
144
|
sortedObj[key] = sortObject(obj[key], config, customSort);
|
|
@@ -31,6 +31,10 @@ class ExpressionResolver {
|
|
|
31
31
|
// Temporary per-scope bindings for identifiers holding an object-shaped type,
|
|
32
32
|
// e.g. `function f(props: IProps)` -> { props: { size: ['all','next'] } }.
|
|
33
33
|
temporaryObjectVariables = new Map();
|
|
34
|
+
// Identifiers holding an array of an object-shaped type, e.g.
|
|
35
|
+
// `items: IProps[]` -> { items: { size: ['all','next'] } }, so that the
|
|
36
|
+
// callback parameter of `items.map(...)` can be bound to the element type.
|
|
37
|
+
arrayElementMembers = new Map();
|
|
34
38
|
constructor(hooks) {
|
|
35
39
|
this.hooks = hooks;
|
|
36
40
|
}
|
|
@@ -41,6 +45,7 @@ class ExpressionResolver {
|
|
|
41
45
|
this.variableTable.clear();
|
|
42
46
|
this.typeAliasTable.clear();
|
|
43
47
|
this.temporaryVariables.clear();
|
|
48
|
+
this.arrayElementMembers.clear();
|
|
44
49
|
}
|
|
45
50
|
/**
|
|
46
51
|
* Capture a VariableDeclarator node to record simple statically analyzable
|
|
@@ -95,6 +100,14 @@ class ExpressionResolver {
|
|
|
95
100
|
if (node.id.type !== 'Identifier')
|
|
96
101
|
return;
|
|
97
102
|
const name = node.id.value;
|
|
103
|
+
// `const items: IProps[] = …` → remember the element's member map so
|
|
104
|
+
// `items.map(({ size }) => …)` can bind the callback parameter.
|
|
105
|
+
const idTypeAnnotation = this.extractTypeAnnotation(node.id);
|
|
106
|
+
if (idTypeAnnotation) {
|
|
107
|
+
const elementMembers = this.resolveArrayElementMembers(idTypeAnnotation);
|
|
108
|
+
if (elementMembers)
|
|
109
|
+
this.arrayElementMembers.set(name, elementMembers);
|
|
110
|
+
}
|
|
98
111
|
// pattern 1:
|
|
99
112
|
// Handle `declare const x: 'a' | 'b'` and `declare const x: SomeUnion`
|
|
100
113
|
// where there is no initializer but a TypeScript type annotation.
|
|
@@ -299,6 +312,42 @@ class ExpressionResolver {
|
|
|
299
312
|
catch { }
|
|
300
313
|
return undefined;
|
|
301
314
|
}
|
|
315
|
+
/**
|
|
316
|
+
* Resolve a type annotation for an array of an object shape (`IProps[]`,
|
|
317
|
+
* `Array<IProps>`, `ReadonlyArray<IProps>`) to the element's member map, so
|
|
318
|
+
* that `items.map(({ size }) => …)` can bind the callback parameter.
|
|
319
|
+
*/
|
|
320
|
+
resolveArrayElementMembers(tsType) {
|
|
321
|
+
try {
|
|
322
|
+
if (!tsType)
|
|
323
|
+
return undefined;
|
|
324
|
+
if (tsType.type === 'TsArrayType') {
|
|
325
|
+
return this.resolveTypeMembers(tsType.elemType);
|
|
326
|
+
}
|
|
327
|
+
if (tsType.type === 'TsTypeReference' && tsType.typeName?.type === 'Identifier') {
|
|
328
|
+
const name = tsType.typeName.value;
|
|
329
|
+
if (name !== 'Array' && name !== 'ReadonlyArray')
|
|
330
|
+
return undefined;
|
|
331
|
+
const arg = tsType.typeParams?.params?.[0] ?? tsType.typeArguments?.params?.[0];
|
|
332
|
+
return this.resolveTypeMembers(arg);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
catch { }
|
|
336
|
+
return undefined;
|
|
337
|
+
}
|
|
338
|
+
/**
|
|
339
|
+
* Bind an identifier to the member map of its array element type
|
|
340
|
+
* (`items: IProps[]`).
|
|
341
|
+
*/
|
|
342
|
+
setArrayElementMembers(name, members) {
|
|
343
|
+
this.arrayElementMembers.set(name, members);
|
|
344
|
+
}
|
|
345
|
+
getArrayElementMembers(name) {
|
|
346
|
+
return this.arrayElementMembers.get(name);
|
|
347
|
+
}
|
|
348
|
+
deleteArrayElementMembers(name) {
|
|
349
|
+
this.arrayElementMembers.delete(name);
|
|
350
|
+
}
|
|
302
351
|
/**
|
|
303
352
|
* Temporarily bind an identifier to an object-shaped type's members, so that
|
|
304
353
|
* `props.size` inside the function body resolves to the member's values.
|
|
@@ -183,7 +183,41 @@ ${mergeResourcesAsInterface(resources, { optimize: !!enableSelector, indentation
|
|
|
183
183
|
// The main output file will now import from the resources file
|
|
184
184
|
const importPath = relative(dirname(outputPath), resourcesOutputPath)
|
|
185
185
|
.replace(/\\/g, '/').replace(/\.d\.ts$/, ''); // Make it a valid module path
|
|
186
|
-
|
|
186
|
+
// i18next's type system cannot resolve keys for `defaultNS: false` —
|
|
187
|
+
// `t()` would silently accept any string. When `extract.defaultNS` is
|
|
188
|
+
// disabled, derive the default namespace from the generated resources
|
|
189
|
+
// instead, so the generated types stay self-consistent.
|
|
190
|
+
let defaultNS = `'${config.extract.defaultNS || 'translation'}'`;
|
|
191
|
+
if (config.extract.defaultNS === false) {
|
|
192
|
+
const sortedNamespaces = [...new Set(resources.map(r => r.name))].sort();
|
|
193
|
+
// Namespaces resolved outside types.basePath already warn above; rank
|
|
194
|
+
// them last so a valid sibling wins the pick, but keep them derivable —
|
|
195
|
+
// they are real keys of the generated Resources interface.
|
|
196
|
+
const resourceNamespaces = [
|
|
197
|
+
...sortedNamespaces.filter(ns => !ns.startsWith('..')),
|
|
198
|
+
...sortedNamespaces.filter(ns => ns.startsWith('..')),
|
|
199
|
+
];
|
|
200
|
+
// Files named after locales (e.g. locales/en.json) carry no namespace
|
|
201
|
+
// information. A single one is still a usable default, but multiple
|
|
202
|
+
// would turn sibling languages into namespaces — keep `false` then.
|
|
203
|
+
// A single locale-named sibling is enough to tell the layout apart:
|
|
204
|
+
// types.input may well match more languages than `locales` lists.
|
|
205
|
+
const onlyLocaleNames = resourceNamespaces.length > 1 && resourceNamespaces.some(ns => config.locales.includes(ns));
|
|
206
|
+
if (resourceNamespaces.length === 0) {
|
|
207
|
+
defaultNS = 'false';
|
|
208
|
+
}
|
|
209
|
+
else if (onlyLocaleNames) {
|
|
210
|
+
internalLogger.warn(styleText('yellow', 'Warning: extract.defaultNS is disabled and your resource files are named after locales, so no namespace could be derived for the generated definitions — defaultNS stays false and t() will not be type-checked. Consider adjusting types.input or types.basePath.'));
|
|
211
|
+
defaultNS = 'false';
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
// Unprefixed keys resolve against a single default namespace, so a
|
|
215
|
+
// single name is emitted; prefer the conventional 'translation'.
|
|
216
|
+
const effectiveDefault = resourceNamespaces.includes('translation') ? 'translation' : resourceNamespaces[0];
|
|
217
|
+
internalLogger.warn(styleText('yellow', `Warning: extract.defaultNS is disabled, so defaultNS was derived from your resource files ('${effectiveDefault}'). Adjust the generated definitions if your runtime i18next config uses a different default namespace.`));
|
|
218
|
+
defaultNS = `'${effectiveDefault}'`;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
187
221
|
const fallbackNS = config.extract.fallbackNS === false
|
|
188
222
|
? 'false'
|
|
189
223
|
: Array.isArray(config.extract.fallbackNS)
|
package/package.json
CHANGED
|
@@ -95,6 +95,17 @@ export declare class ASTVisitors {
|
|
|
95
95
|
* `Object.values(MAP).map/forEach(v => ...)` → param bound to MAP's values
|
|
96
96
|
*/
|
|
97
97
|
private tryGetArrayIterationCallbackInfo;
|
|
98
|
+
/**
|
|
99
|
+
* If `node` is `items.map(cb)` (or forEach/flatMap/…) where `items` is typed
|
|
100
|
+
* as an array of an object shape (`items: IProps[]`), binds the callback
|
|
101
|
+
* parameter to the element type for the duration of the callback body:
|
|
102
|
+
*
|
|
103
|
+
* items.map(({ size }) => t(`some|${size}`)) → `size` bound to the union
|
|
104
|
+
* items.map(item => t(`some|${item.size}`)) → `item` bound to the members
|
|
105
|
+
*
|
|
106
|
+
* Returns a cleanup function, or undefined when nothing was bound.
|
|
107
|
+
*/
|
|
108
|
+
private tryBindObjectArrayCallback;
|
|
98
109
|
/**
|
|
99
110
|
* Extracts the first callback parameter identifier from an iteration call node
|
|
100
111
|
* and pairs it with the provided values array.
|
|
@@ -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;IAqDzB;;;;;OAKG;IACI,KAAK,CAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAUjC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,IAAI;
|
|
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;IAudZ;;;;;;;;OAQG;IACH,OAAO,CAAC,gCAAgC;IAqDxC;;;;;;;;;OASG;IACH,OAAO,CAAC,0BAA0B;IA+ClC;;;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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"translation-manager.d.ts","sourceRoot":"","sources":["../../../src/extractor/core/translation-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"translation-manager.d.ts","sourceRoot":"","sources":["../../../src/extractor/core/translation-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AA2rC9F;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,eAAe,CACnC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EAC/B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,MAAM,EAAE,oBAAoB,EAC5B,EACE,uBAA+B,EAC/B,OAAe,EACf,oBAA4B,EAC5B,MAA4B,EAC7B,GAAE;IACD,uBAAuB,CAAC,EAAE,OAAO,CAAC;IAClC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,CAAA;CACX,GACL,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAyK9B"}
|
|
@@ -11,6 +11,7 @@ export declare class ExpressionResolver {
|
|
|
11
11
|
private temporaryVariables;
|
|
12
12
|
private objectTypeTable;
|
|
13
13
|
private temporaryObjectVariables;
|
|
14
|
+
private arrayElementMembers;
|
|
14
15
|
constructor(hooks: ASTVisitorHooks);
|
|
15
16
|
/**
|
|
16
17
|
* Clear per-file captured variables. Enums / shared maps are kept.
|
|
@@ -55,6 +56,19 @@ export declare class ExpressionResolver {
|
|
|
55
56
|
* type alias, or inline type literal) to its member → string values map.
|
|
56
57
|
*/
|
|
57
58
|
resolveTypeMembers(tsType: any): Record<string, string[]> | undefined;
|
|
59
|
+
/**
|
|
60
|
+
* Resolve a type annotation for an array of an object shape (`IProps[]`,
|
|
61
|
+
* `Array<IProps>`, `ReadonlyArray<IProps>`) to the element's member map, so
|
|
62
|
+
* that `items.map(({ size }) => …)` can bind the callback parameter.
|
|
63
|
+
*/
|
|
64
|
+
resolveArrayElementMembers(tsType: any): Record<string, string[]> | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* Bind an identifier to the member map of its array element type
|
|
67
|
+
* (`items: IProps[]`).
|
|
68
|
+
*/
|
|
69
|
+
setArrayElementMembers(name: string, members: Record<string, string[]>): void;
|
|
70
|
+
getArrayElementMembers(name: string): Record<string, string[]> | undefined;
|
|
71
|
+
deleteArrayElementMembers(name: string): void;
|
|
58
72
|
/**
|
|
59
73
|
* Temporarily bind an identifier to an object-shaped type's members, so that
|
|
60
74
|
* `props.size` inside the function body resolves to the member's values.
|
|
@@ -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;IAK7D,OAAO,CAAC,eAAe,CAAmD;IAI1E,OAAO,CAAC,wBAAwB,CAAmD;
|
|
1
|
+
{"version":3,"file":"expression-resolver.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/expression-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types-generator.d.ts","sourceRoot":"","sources":["../src/types-generator.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AA6E9D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACtE,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"types-generator.d.ts","sourceRoot":"","sources":["../src/types-generator.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AA6E9D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAO,GACtE,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CA2KvD"}
|
package/types/types.d.ts
CHANGED
|
@@ -34,6 +34,7 @@ export interface I18nextToolkitConfig {
|
|
|
34
34
|
/**
|
|
35
35
|
* Default namespace when none is specified (default: 'translation').
|
|
36
36
|
* Set to false will not generate any namespace, useful if i.e. the output is a single language json with 1 namespace (and no nesting).
|
|
37
|
+
* When false, the `types` command derives `defaultNS` from the generated resource namespaces, since i18next's type system cannot express `defaultNS: false`.
|
|
37
38
|
*/
|
|
38
39
|
defaultNS?: string | false;
|
|
39
40
|
/**
|
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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"}
|