i18next-cli 1.21.0 → 1.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +8 -0
- package/README.md +107 -0
- package/dist/cjs/cli.js +1 -1
- package/dist/cjs/extractor/core/ast-visitors.js +1 -1
- package/dist/cjs/extractor/core/extractor.js +1 -1
- package/dist/cjs/extractor/core/translation-manager.js +1 -1
- package/dist/cjs/extractor/parsers/call-expression-handler.js +1 -1
- package/dist/cjs/extractor/parsers/jsx-handler.js +1 -1
- package/dist/cjs/extractor/plugin-manager.js +1 -1
- package/dist/esm/cli.js +1 -1
- package/dist/esm/extractor/core/ast-visitors.js +1 -1
- package/dist/esm/extractor/core/extractor.js +1 -1
- package/dist/esm/extractor/core/translation-manager.js +1 -1
- package/dist/esm/extractor/parsers/call-expression-handler.js +1 -1
- package/dist/esm/extractor/parsers/jsx-handler.js +1 -1
- package/dist/esm/extractor/plugin-manager.js +1 -1
- package/package.json +1 -1
- package/src/cli.ts +1 -1
- package/src/extractor/core/ast-visitors.ts +48 -2
- package/src/extractor/core/extractor.ts +3 -0
- package/src/extractor/core/translation-manager.ts +4 -0
- package/src/extractor/parsers/call-expression-handler.ts +45 -2
- package/src/extractor/parsers/jsx-handler.ts +93 -19
- package/src/extractor/plugin-manager.ts +27 -3
- package/src/types.ts +7 -0
- package/types/extractor/core/ast-visitors.d.ts +23 -0
- package/types/extractor/core/ast-visitors.d.ts.map +1 -1
- package/types/extractor/core/extractor.d.ts.map +1 -1
- package/types/extractor/core/translation-manager.d.ts.map +1 -1
- package/types/extractor/parsers/call-expression-handler.d.ts +8 -1
- package/types/extractor/parsers/call-expression-handler.d.ts.map +1 -1
- package/types/extractor/parsers/jsx-handler.d.ts +9 -1
- package/types/extractor/parsers/jsx-handler.d.ts.map +1 -1
- package/types/extractor/plugin-manager.d.ts.map +1 -1
- package/types/types.d.ts +6 -0
- package/types/types.d.ts.map +1 -1
|
@@ -41,6 +41,8 @@ export class ASTVisitors {
|
|
|
41
41
|
private readonly expressionResolver: ExpressionResolver
|
|
42
42
|
private readonly callExpressionHandler: CallExpressionHandler
|
|
43
43
|
private readonly jsxHandler: JSXHandler
|
|
44
|
+
private currentFile: string = ''
|
|
45
|
+
private currentCode: string = ''
|
|
44
46
|
|
|
45
47
|
/**
|
|
46
48
|
* Creates a new AST visitor instance.
|
|
@@ -69,8 +71,21 @@ export class ASTVisitors {
|
|
|
69
71
|
this.scopeManager = new ScopeManager(config)
|
|
70
72
|
// use shared resolver when provided so captured enums/objects are visible across files
|
|
71
73
|
this.expressionResolver = expressionResolver ?? new ExpressionResolver(this.hooks)
|
|
72
|
-
this.callExpressionHandler = new CallExpressionHandler(
|
|
73
|
-
|
|
74
|
+
this.callExpressionHandler = new CallExpressionHandler(
|
|
75
|
+
config,
|
|
76
|
+
pluginContext,
|
|
77
|
+
logger,
|
|
78
|
+
this.expressionResolver,
|
|
79
|
+
() => this.getCurrentFile(),
|
|
80
|
+
() => this.getCurrentCode()
|
|
81
|
+
)
|
|
82
|
+
this.jsxHandler = new JSXHandler(
|
|
83
|
+
config,
|
|
84
|
+
pluginContext,
|
|
85
|
+
this.expressionResolver,
|
|
86
|
+
() => this.getCurrentFile(),
|
|
87
|
+
() => this.getCurrentCode()
|
|
88
|
+
)
|
|
74
89
|
}
|
|
75
90
|
|
|
76
91
|
/**
|
|
@@ -211,4 +226,35 @@ export class ASTVisitors {
|
|
|
211
226
|
public getVarFromScope (name: string): ScopeInfo | undefined {
|
|
212
227
|
return this.scopeManager.getVarFromScope(name)
|
|
213
228
|
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* Sets the current file path used by the extractor.
|
|
232
|
+
*
|
|
233
|
+
* @param file - The file path (absolute or relative) to set as the current processing context.
|
|
234
|
+
* @remarks
|
|
235
|
+
* Updating the current file allows subsequent AST visitors and extraction logic to
|
|
236
|
+
* associate nodes, messages, and errors with the correct source file.
|
|
237
|
+
*/
|
|
238
|
+
public setCurrentFile (file: string, code: string): void {
|
|
239
|
+
this.currentFile = file
|
|
240
|
+
this.currentCode = code
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
/**
|
|
244
|
+
* Returns the currently set file path.
|
|
245
|
+
*
|
|
246
|
+
* @returns The current file path as a string, or `undefined` if no file has been set.
|
|
247
|
+
* @remarks
|
|
248
|
+
* Use this to retrieve the file context that was previously set via `setCurrentFile`.
|
|
249
|
+
*/
|
|
250
|
+
public getCurrentFile (): string {
|
|
251
|
+
return this.currentFile
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* @returns The full source code string for the file currently under processing.
|
|
256
|
+
*/
|
|
257
|
+
public getCurrentCode (): string {
|
|
258
|
+
return this.currentCode
|
|
259
|
+
}
|
|
214
260
|
}
|
|
@@ -194,6 +194,9 @@ export async function processFile (
|
|
|
194
194
|
// This avoids a circular dependency while giving plugins access to the scope.
|
|
195
195
|
pluginContext.getVarFromScope = astVisitors.getVarFromScope.bind(astVisitors)
|
|
196
196
|
|
|
197
|
+
// Pass BOTH file and code
|
|
198
|
+
astVisitors.setCurrentFile(file, code)
|
|
199
|
+
|
|
197
200
|
// 3. FIRST: Visit the AST to build scope information
|
|
198
201
|
astVisitors.visit(ast)
|
|
199
202
|
|
|
@@ -401,6 +401,8 @@ function buildNewTranslationsForNs (
|
|
|
401
401
|
// - Otherwise use empty string for new keys
|
|
402
402
|
const isDerivedDefault = defaultValue && (
|
|
403
403
|
defaultValue === key || // Exact match
|
|
404
|
+
// Check if defaultValue includes namespace prefix (e.g., "translation:app.key")
|
|
405
|
+
defaultValue.includes(nsSep) ||
|
|
404
406
|
// For variant keys (plural/context), check if defaultValue is the base
|
|
405
407
|
(key !== defaultValue &&
|
|
406
408
|
(key.startsWith(defaultValue + pluralSeparator) ||
|
|
@@ -422,6 +424,8 @@ function buildNewTranslationsForNs (
|
|
|
422
424
|
// Only update when we have a meaningful defaultValue that's not derived from the key pattern.
|
|
423
425
|
const isDerivedDefault = defaultValue && (
|
|
424
426
|
defaultValue === key || // Exact match
|
|
427
|
+
// Check if defaultValue includes namespace prefix (e.g., "translation:app.key")
|
|
428
|
+
defaultValue.includes(nsSep) ||
|
|
425
429
|
// For variant keys (plural/context), check if defaultValue is the base
|
|
426
430
|
(key !== defaultValue &&
|
|
427
431
|
(key.startsWith(defaultValue + pluralSeparator) ||
|
|
@@ -9,17 +9,43 @@ export class CallExpressionHandler {
|
|
|
9
9
|
private logger: Logger
|
|
10
10
|
private expressionResolver: ExpressionResolver
|
|
11
11
|
public objectKeys = new Set<string>()
|
|
12
|
+
private getCurrentFile: () => string
|
|
13
|
+
private getCurrentCode: () => string
|
|
12
14
|
|
|
13
15
|
constructor (
|
|
14
16
|
config: Omit<I18nextToolkitConfig, 'plugins'>,
|
|
15
17
|
pluginContext: PluginContext,
|
|
16
18
|
logger: Logger,
|
|
17
|
-
expressionResolver: ExpressionResolver
|
|
19
|
+
expressionResolver: ExpressionResolver,
|
|
20
|
+
getCurrentFile: () => string,
|
|
21
|
+
getCurrentCode: () => string
|
|
18
22
|
) {
|
|
19
23
|
this.config = config
|
|
20
24
|
this.pluginContext = pluginContext
|
|
21
25
|
this.logger = logger
|
|
22
26
|
this.expressionResolver = expressionResolver
|
|
27
|
+
this.getCurrentFile = getCurrentFile
|
|
28
|
+
this.getCurrentCode = getCurrentCode
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Helper method to calculate line and column from byte offset.
|
|
33
|
+
* SWC provides byte offsets in span.start, not line/column directly.
|
|
34
|
+
*/
|
|
35
|
+
private getLocationFromSpan (span: any): { line: number, column: number } | undefined {
|
|
36
|
+
if (!span || typeof span.start !== 'number') return undefined
|
|
37
|
+
|
|
38
|
+
const code = this.getCurrentCode()
|
|
39
|
+
const offset = span.start
|
|
40
|
+
|
|
41
|
+
// Calculate line and column from byte offset
|
|
42
|
+
const upToOffset = code.substring(0, offset)
|
|
43
|
+
const lines = upToOffset.split('\n')
|
|
44
|
+
|
|
45
|
+
return {
|
|
46
|
+
line: lines.length,
|
|
47
|
+
column: lines[lines.length - 1].length
|
|
48
|
+
}
|
|
23
49
|
}
|
|
24
50
|
|
|
25
51
|
/**
|
|
@@ -363,7 +389,24 @@ export class CallExpressionHandler {
|
|
|
363
389
|
}
|
|
364
390
|
|
|
365
391
|
// 5. Default case: Add the simple key
|
|
366
|
-
|
|
392
|
+
{
|
|
393
|
+
// ✅ Use the helper method to calculate proper line/column
|
|
394
|
+
const location = node.span ? this.getLocationFromSpan(node.span) : undefined
|
|
395
|
+
|
|
396
|
+
this.pluginContext.addKey({
|
|
397
|
+
key: finalKey,
|
|
398
|
+
ns,
|
|
399
|
+
defaultValue: dv,
|
|
400
|
+
explicitDefault: explicitDefaultForBase,
|
|
401
|
+
locations: location
|
|
402
|
+
? [{
|
|
403
|
+
file: this.getCurrentFile(),
|
|
404
|
+
line: location.line,
|
|
405
|
+
column: location.column
|
|
406
|
+
}]
|
|
407
|
+
: undefined
|
|
408
|
+
})
|
|
409
|
+
}
|
|
367
410
|
}
|
|
368
411
|
}
|
|
369
412
|
|
|
@@ -8,15 +8,39 @@ export class JSXHandler {
|
|
|
8
8
|
private config: Omit<I18nextToolkitConfig, 'plugins'>
|
|
9
9
|
private pluginContext: PluginContext
|
|
10
10
|
private expressionResolver: ExpressionResolver
|
|
11
|
+
private getCurrentFile: () => string
|
|
12
|
+
private getCurrentCode: () => string // ✅ Add this
|
|
11
13
|
|
|
12
14
|
constructor (
|
|
13
15
|
config: Omit<I18nextToolkitConfig, 'plugins'>,
|
|
14
16
|
pluginContext: PluginContext,
|
|
15
|
-
expressionResolver: ExpressionResolver
|
|
17
|
+
expressionResolver: ExpressionResolver,
|
|
18
|
+
getCurrentFile: () => string,
|
|
19
|
+
getCurrentCode: () => string // ✅ Add parameter
|
|
16
20
|
) {
|
|
17
21
|
this.config = config
|
|
18
22
|
this.pluginContext = pluginContext
|
|
19
23
|
this.expressionResolver = expressionResolver
|
|
24
|
+
this.getCurrentFile = getCurrentFile
|
|
25
|
+
this.getCurrentCode = getCurrentCode // ✅ Store it
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Helper method to calculate line and column from byte offset.
|
|
30
|
+
*/
|
|
31
|
+
private getLocationFromSpan (span: any): { line: number, column: number } | undefined {
|
|
32
|
+
if (!span || typeof span.start !== 'number') return undefined
|
|
33
|
+
|
|
34
|
+
const code = this.getCurrentCode()
|
|
35
|
+
const offset = span.start
|
|
36
|
+
|
|
37
|
+
const upToOffset = code.substring(0, offset)
|
|
38
|
+
const lines = upToOffset.split('\n')
|
|
39
|
+
|
|
40
|
+
return {
|
|
41
|
+
line: lines.length,
|
|
42
|
+
column: lines[lines.length - 1].length
|
|
43
|
+
}
|
|
20
44
|
}
|
|
21
45
|
|
|
22
46
|
/**
|
|
@@ -48,6 +72,16 @@ export class JSXHandler {
|
|
|
48
72
|
|
|
49
73
|
const { contextExpression, optionsNode, defaultValue, hasCount, isOrdinal, serializedChildren } = extractedAttributes
|
|
50
74
|
|
|
75
|
+
// ✅ Extract location information using the helper method
|
|
76
|
+
const location = node.span ? this.getLocationFromSpan(node.span) : undefined
|
|
77
|
+
const locations = location
|
|
78
|
+
? [{
|
|
79
|
+
file: this.getCurrentFile(),
|
|
80
|
+
line: location.line,
|
|
81
|
+
column: location.column
|
|
82
|
+
}]
|
|
83
|
+
: undefined
|
|
84
|
+
|
|
51
85
|
// If ns is not explicitly set on the component, try to find it from the key
|
|
52
86
|
// or the `t` prop
|
|
53
87
|
if (!extractedAttributes.ns) {
|
|
@@ -71,6 +105,7 @@ export class JSXHandler {
|
|
|
71
105
|
hasCount,
|
|
72
106
|
isOrdinal,
|
|
73
107
|
explicitDefault: extractedAttributes.explicitDefault,
|
|
108
|
+
locations
|
|
74
109
|
}
|
|
75
110
|
})
|
|
76
111
|
|
|
@@ -106,6 +141,7 @@ export class JSXHandler {
|
|
|
106
141
|
defaultValue: defaultValue || serializedChildren,
|
|
107
142
|
hasCount,
|
|
108
143
|
isOrdinal,
|
|
144
|
+
locations
|
|
109
145
|
}
|
|
110
146
|
})
|
|
111
147
|
}
|
|
@@ -133,7 +169,12 @@ export class JSXHandler {
|
|
|
133
169
|
for (const context of contextValues) {
|
|
134
170
|
for (const extractedKey of extractedKeys) {
|
|
135
171
|
const contextKey = `${extractedKey.key}${contextSeparator}${context}`
|
|
136
|
-
this.pluginContext.addKey({
|
|
172
|
+
this.pluginContext.addKey({
|
|
173
|
+
key: contextKey,
|
|
174
|
+
ns: extractedKey.ns,
|
|
175
|
+
defaultValue: extractedKey.defaultValue,
|
|
176
|
+
locations: extractedKey.locations
|
|
177
|
+
})
|
|
137
178
|
}
|
|
138
179
|
}
|
|
139
180
|
} else {
|
|
@@ -142,13 +183,19 @@ export class JSXHandler {
|
|
|
142
183
|
this.pluginContext.addKey({
|
|
143
184
|
key: extractedKey.key,
|
|
144
185
|
ns: extractedKey.ns,
|
|
145
|
-
defaultValue: extractedKey.defaultValue
|
|
186
|
+
defaultValue: extractedKey.defaultValue,
|
|
187
|
+
locations: extractedKey.locations
|
|
146
188
|
})
|
|
147
189
|
})
|
|
148
190
|
for (const context of contextValues) {
|
|
149
191
|
for (const extractedKey of extractedKeys) {
|
|
150
192
|
const contextKey = `${extractedKey.key}${contextSeparator}${context}`
|
|
151
|
-
this.pluginContext.addKey({
|
|
193
|
+
this.pluginContext.addKey({
|
|
194
|
+
key: contextKey,
|
|
195
|
+
ns: extractedKey.ns,
|
|
196
|
+
defaultValue: extractedKey.defaultValue,
|
|
197
|
+
locations: extractedKey.locations
|
|
198
|
+
})
|
|
152
199
|
}
|
|
153
200
|
}
|
|
154
201
|
}
|
|
@@ -158,7 +205,8 @@ export class JSXHandler {
|
|
|
158
205
|
this.pluginContext.addKey({
|
|
159
206
|
key: extractedKey.key,
|
|
160
207
|
ns: extractedKey.ns,
|
|
161
|
-
defaultValue: extractedKey.defaultValue
|
|
208
|
+
defaultValue: extractedKey.defaultValue,
|
|
209
|
+
locations: extractedKey.locations
|
|
162
210
|
})
|
|
163
211
|
})
|
|
164
212
|
}
|
|
@@ -179,18 +227,18 @@ export class JSXHandler {
|
|
|
179
227
|
// Generate all combinations of context and plural forms
|
|
180
228
|
if (contextValues.length > 0) {
|
|
181
229
|
// Generate base plural forms (no context)
|
|
182
|
-
extractedKeys.forEach(extractedKey => this.generatePluralKeysForTrans(extractedKey.key, extractedKey.defaultValue, extractedKey.ns, isOrdinal, optionsNode))
|
|
230
|
+
extractedKeys.forEach(extractedKey => this.generatePluralKeysForTrans(extractedKey.key, extractedKey.defaultValue, extractedKey.ns, isOrdinal, optionsNode, undefined, extractedKey.locations))
|
|
183
231
|
|
|
184
232
|
// Generate context + plural combinations
|
|
185
233
|
for (const context of contextValues) {
|
|
186
234
|
for (const extractedKey of extractedKeys) {
|
|
187
235
|
const contextKey = `${extractedKey.key}${contextSeparator}${context}`
|
|
188
|
-
this.generatePluralKeysForTrans(contextKey, extractedKey.defaultValue, extractedKey.ns, isOrdinal, optionsNode, extractedKey.explicitDefault)
|
|
236
|
+
this.generatePluralKeysForTrans(contextKey, extractedKey.defaultValue, extractedKey.ns, isOrdinal, optionsNode, extractedKey.explicitDefault, extractedKey.locations)
|
|
189
237
|
}
|
|
190
238
|
}
|
|
191
239
|
} else {
|
|
192
240
|
// Fallback to just plural forms if context resolution fails
|
|
193
|
-
extractedKeys.forEach(extractedKey => this.generatePluralKeysForTrans(extractedKey.key, extractedKey.defaultValue, extractedKey.ns, isOrdinal, optionsNode, extractedKey.explicitDefault))
|
|
241
|
+
extractedKeys.forEach(extractedKey => this.generatePluralKeysForTrans(extractedKey.key, extractedKey.defaultValue, extractedKey.ns, isOrdinal, optionsNode, extractedKey.explicitDefault, extractedKey.locations))
|
|
194
242
|
}
|
|
195
243
|
}
|
|
196
244
|
} else if (contextExpression) {
|
|
@@ -200,8 +248,13 @@ export class JSXHandler {
|
|
|
200
248
|
if (contextValues.length > 0) {
|
|
201
249
|
// Add context variants
|
|
202
250
|
for (const context of contextValues) {
|
|
203
|
-
for (const { key, ns, defaultValue } of extractedKeys) {
|
|
204
|
-
this.pluginContext.addKey({
|
|
251
|
+
for (const { key, ns, defaultValue, locations } of extractedKeys) {
|
|
252
|
+
this.pluginContext.addKey({
|
|
253
|
+
key: `${key}${contextSeparator}${context}`,
|
|
254
|
+
ns,
|
|
255
|
+
defaultValue,
|
|
256
|
+
locations
|
|
257
|
+
})
|
|
205
258
|
}
|
|
206
259
|
}
|
|
207
260
|
// Only add the base key as a fallback if the context is dynamic (i.e., not a simple string).
|
|
@@ -210,7 +263,8 @@ export class JSXHandler {
|
|
|
210
263
|
this.pluginContext.addKey({
|
|
211
264
|
key: extractedKey.key,
|
|
212
265
|
ns: extractedKey.ns,
|
|
213
|
-
defaultValue: extractedKey.defaultValue
|
|
266
|
+
defaultValue: extractedKey.defaultValue,
|
|
267
|
+
locations: extractedKey.locations
|
|
214
268
|
})
|
|
215
269
|
})
|
|
216
270
|
}
|
|
@@ -220,7 +274,8 @@ export class JSXHandler {
|
|
|
220
274
|
this.pluginContext.addKey({
|
|
221
275
|
key: extractedKey.key,
|
|
222
276
|
ns: extractedKey.ns,
|
|
223
|
-
defaultValue: extractedKey.defaultValue
|
|
277
|
+
defaultValue: extractedKey.defaultValue,
|
|
278
|
+
locations: extractedKey.locations
|
|
224
279
|
})
|
|
225
280
|
})
|
|
226
281
|
}
|
|
@@ -232,7 +287,8 @@ export class JSXHandler {
|
|
|
232
287
|
this.pluginContext.addKey({
|
|
233
288
|
key: extractedKey.key,
|
|
234
289
|
ns: extractedKey.ns,
|
|
235
|
-
defaultValue: extractedKey.defaultValue
|
|
290
|
+
defaultValue: extractedKey.defaultValue,
|
|
291
|
+
locations: extractedKey.locations
|
|
236
292
|
})
|
|
237
293
|
})
|
|
238
294
|
} else {
|
|
@@ -246,7 +302,7 @@ export class JSXHandler {
|
|
|
246
302
|
)
|
|
247
303
|
const isOrdinal = !!ordinalAttr
|
|
248
304
|
|
|
249
|
-
extractedKeys.forEach(extractedKey => this.generatePluralKeysForTrans(extractedKey.key, extractedKey.defaultValue, extractedKey.ns, isOrdinal, optionsNode, extractedKey.explicitDefault))
|
|
305
|
+
extractedKeys.forEach(extractedKey => this.generatePluralKeysForTrans(extractedKey.key, extractedKey.defaultValue, extractedKey.ns, isOrdinal, optionsNode, extractedKey.explicitDefault, extractedKey.locations))
|
|
250
306
|
}
|
|
251
307
|
} else {
|
|
252
308
|
// No count or context - just add the base keys
|
|
@@ -254,7 +310,8 @@ export class JSXHandler {
|
|
|
254
310
|
this.pluginContext.addKey({
|
|
255
311
|
key: extractedKey.key,
|
|
256
312
|
ns: extractedKey.ns,
|
|
257
|
-
defaultValue: extractedKey.defaultValue
|
|
313
|
+
defaultValue: extractedKey.defaultValue,
|
|
314
|
+
locations: extractedKey.locations
|
|
258
315
|
})
|
|
259
316
|
})
|
|
260
317
|
}
|
|
@@ -270,8 +327,18 @@ export class JSXHandler {
|
|
|
270
327
|
* @param ns - Namespace for the keys
|
|
271
328
|
* @param isOrdinal - Whether to generate ordinal plural forms
|
|
272
329
|
* @param optionsNode - Optional tOptions object expression for plural-specific defaults
|
|
330
|
+
* @param explicitDefaultFromSource - Whether the default was explicitly provided in source
|
|
331
|
+
* @param locations - Source location information for this key
|
|
273
332
|
*/
|
|
274
|
-
private generatePluralKeysForTrans (
|
|
333
|
+
private generatePluralKeysForTrans (
|
|
334
|
+
key: string,
|
|
335
|
+
defaultValue: string | undefined,
|
|
336
|
+
ns: string | false | undefined,
|
|
337
|
+
isOrdinal: boolean,
|
|
338
|
+
optionsNode?: ObjectExpression,
|
|
339
|
+
explicitDefaultFromSource?: boolean,
|
|
340
|
+
locations?: Array<{ file: string, line?: number, column?: number }>
|
|
341
|
+
): void {
|
|
275
342
|
try {
|
|
276
343
|
const type = isOrdinal ? 'ordinal' : 'cardinal'
|
|
277
344
|
const pluralCategories = new Intl.PluralRules(this.config.extract?.primaryLanguage, { type }).resolvedOptions().pluralCategories
|
|
@@ -299,7 +366,8 @@ export class JSXHandler {
|
|
|
299
366
|
defaultValue: finalDefault,
|
|
300
367
|
hasCount: true,
|
|
301
368
|
isOrdinal,
|
|
302
|
-
explicitDefault: Boolean(explicitDefaultFromSource || typeof specificDefault === 'string' || typeof otherDefault === 'string')
|
|
369
|
+
explicitDefault: Boolean(explicitDefaultFromSource || typeof specificDefault === 'string' || typeof otherDefault === 'string'),
|
|
370
|
+
locations
|
|
303
371
|
})
|
|
304
372
|
return
|
|
305
373
|
}
|
|
@@ -344,12 +412,18 @@ export class JSXHandler {
|
|
|
344
412
|
// Only treat plural/context variant as explicit when:
|
|
345
413
|
// - the extractor indicated the default was explicit on the source element
|
|
346
414
|
// - OR a plural-specific default was provided in tOptions (specificDefault/otherDefault)
|
|
347
|
-
explicitDefault: Boolean(explicitDefaultFromSource || typeof specificDefault === 'string' || typeof otherDefault === 'string')
|
|
415
|
+
explicitDefault: Boolean(explicitDefaultFromSource || typeof specificDefault === 'string' || typeof otherDefault === 'string'),
|
|
416
|
+
locations
|
|
348
417
|
})
|
|
349
418
|
}
|
|
350
419
|
} catch (e) {
|
|
351
420
|
// Fallback to a simple key if Intl API fails
|
|
352
|
-
this.pluginContext.addKey({
|
|
421
|
+
this.pluginContext.addKey({
|
|
422
|
+
key,
|
|
423
|
+
ns,
|
|
424
|
+
defaultValue,
|
|
425
|
+
locations
|
|
426
|
+
})
|
|
353
427
|
}
|
|
354
428
|
}
|
|
355
429
|
|
|
@@ -39,7 +39,12 @@ export async function initializePlugins (plugins: any[]): Promise<void> {
|
|
|
39
39
|
* })
|
|
40
40
|
* ```
|
|
41
41
|
*/
|
|
42
|
-
export function createPluginContext (
|
|
42
|
+
export function createPluginContext (
|
|
43
|
+
allKeys: Map<string, ExtractedKey>,
|
|
44
|
+
plugins: Plugin[],
|
|
45
|
+
config: Omit<I18nextToolkitConfig, 'plugins'>,
|
|
46
|
+
logger: Logger
|
|
47
|
+
): PluginContext {
|
|
43
48
|
const pluginContextConfig = Object.freeze({
|
|
44
49
|
...config,
|
|
45
50
|
plugins: [...plugins],
|
|
@@ -74,14 +79,33 @@ export function createPluginContext (allKeys: Map<string, ExtractedKey>, plugins
|
|
|
74
79
|
|
|
75
80
|
const isNewGenericFallback = defaultValue === keyInfo.key
|
|
76
81
|
|
|
82
|
+
// Merge locations
|
|
83
|
+
if (keyInfo.locations) {
|
|
84
|
+
existingKey.locations = [
|
|
85
|
+
...(existingKey.locations || []),
|
|
86
|
+
...keyInfo.locations
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
|
|
77
90
|
// If existing value is a generic fallback and new value is specific, replace it
|
|
78
91
|
if (isExistingGenericFallback && !isNewGenericFallback) {
|
|
79
|
-
allKeys.set(uniqueKey, {
|
|
92
|
+
allKeys.set(uniqueKey, {
|
|
93
|
+
...keyInfo,
|
|
94
|
+
ns: storedNs || config.extract?.defaultNS || 'translation',
|
|
95
|
+
nsIsImplicit,
|
|
96
|
+
defaultValue,
|
|
97
|
+
locations: existingKey.locations // Preserve merged locations
|
|
98
|
+
})
|
|
80
99
|
}
|
|
81
100
|
// Otherwise keep the existing one
|
|
82
101
|
} else {
|
|
83
102
|
// New key, just add it
|
|
84
|
-
allKeys.set(uniqueKey, {
|
|
103
|
+
allKeys.set(uniqueKey, {
|
|
104
|
+
...keyInfo,
|
|
105
|
+
ns: storedNs || config.extract?.defaultNS || 'translation',
|
|
106
|
+
nsIsImplicit,
|
|
107
|
+
defaultValue
|
|
108
|
+
})
|
|
85
109
|
}
|
|
86
110
|
},
|
|
87
111
|
config: pluginContextConfig,
|
package/src/types.ts
CHANGED
|
@@ -322,6 +322,13 @@ export interface ExtractedKey {
|
|
|
322
322
|
|
|
323
323
|
/** True when the extractor returned an already-expanded plural form (e.g. "key_one") */
|
|
324
324
|
isExpandedPlural?: boolean
|
|
325
|
+
|
|
326
|
+
/** Source locations where this key was found (optional, populated by plugins) */
|
|
327
|
+
locations?: Array<{
|
|
328
|
+
file: string
|
|
329
|
+
line?: number
|
|
330
|
+
column?: number
|
|
331
|
+
}>
|
|
325
332
|
}
|
|
326
333
|
|
|
327
334
|
/**
|
|
@@ -33,6 +33,8 @@ export declare class ASTVisitors {
|
|
|
33
33
|
private readonly expressionResolver;
|
|
34
34
|
private readonly callExpressionHandler;
|
|
35
35
|
private readonly jsxHandler;
|
|
36
|
+
private currentFile;
|
|
37
|
+
private currentCode;
|
|
36
38
|
/**
|
|
37
39
|
* Creates a new AST visitor instance.
|
|
38
40
|
*
|
|
@@ -72,5 +74,26 @@ export declare class ASTVisitors {
|
|
|
72
74
|
* @private
|
|
73
75
|
*/
|
|
74
76
|
getVarFromScope(name: string): ScopeInfo | undefined;
|
|
77
|
+
/**
|
|
78
|
+
* Sets the current file path used by the extractor.
|
|
79
|
+
*
|
|
80
|
+
* @param file - The file path (absolute or relative) to set as the current processing context.
|
|
81
|
+
* @remarks
|
|
82
|
+
* Updating the current file allows subsequent AST visitors and extraction logic to
|
|
83
|
+
* associate nodes, messages, and errors with the correct source file.
|
|
84
|
+
*/
|
|
85
|
+
setCurrentFile(file: string, code: string): void;
|
|
86
|
+
/**
|
|
87
|
+
* Returns the currently set file path.
|
|
88
|
+
*
|
|
89
|
+
* @returns The current file path as a string, or `undefined` if no file has been set.
|
|
90
|
+
* @remarks
|
|
91
|
+
* Use this to retrieve the file context that was previously set via `setCurrentFile`.
|
|
92
|
+
*/
|
|
93
|
+
getCurrentFile(): string;
|
|
94
|
+
/**
|
|
95
|
+
* @returns The full source code string for the file currently under processing.
|
|
96
|
+
*/
|
|
97
|
+
getCurrentCode(): string;
|
|
75
98
|
}
|
|
76
99
|
//# sourceMappingURL=ast-visitors.d.ts.map
|
|
@@ -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,aAAa,CAAA;AAE1G,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AAInE;;;;;;;;;;;;;;;;;;;;;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,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;IACvD,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAuB;IAC7D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAY;
|
|
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,aAAa,CAAA;AAE1G,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAA;AAInE;;;;;;;;;;;;;;;;;;;;;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,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAC3C,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;IAgCzC;;;;;OAKG;IACI,KAAK,CAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAUjC;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,IAAI;IAiGZ;;;;;;;;OAQG;IACI,eAAe,CAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;IAI5D;;;;;;;OAOG;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":"extractor.d.ts","sourceRoot":"","sources":["../../../src/extractor/core/extractor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAKtF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAK5C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,oBAAoB,EAC5B,EACE,WAAmB,EACnB,QAAgB,EAChB,uBAA+B,EAChC,GAAE;IACD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uBAAuB,CAAC,EAAE,OAAO,CAAC;CAC9B,EACN,MAAM,GAAE,MAA4B,GACnC,OAAO,CAAC,OAAO,CAAC,CAyDlB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EAAE,EACjB,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,MAAM,GAAE,MAA4B,GACnC,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["../../../src/extractor/core/extractor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAKtF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAK5C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,YAAY,CAChC,MAAM,EAAE,oBAAoB,EAC5B,EACE,WAAmB,EACnB,QAAgB,EAChB,uBAA+B,EAChC,GAAE;IACD,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,uBAAuB,CAAC,EAAE,OAAO,CAAC;CAC9B,EACN,MAAM,GAAE,MAA4B,GACnC,OAAO,CAAC,OAAO,CAAC,CAyDlB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EAAE,EACjB,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,MAAM,GAAE,MAA4B,GACnC,OAAO,CAAC,IAAI,CAAC,CAoEf;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,OAAO,CAAE,MAAM,EAAE,oBAAoB,EAAE,EAAE,uBAA+B,EAAE,GAAE;IAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAAO,sDAO3I"}
|
|
@@ -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,aAAa,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,aAAa,CAAA;AAmfnF;;;;;;;;;;;;;;;;;;;;;;;;;;;;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,EAAE,uBAA+B,EAAE,GAAE;IAAE,uBAAuB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC9E,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAgH9B"}
|
|
@@ -7,7 +7,14 @@ export declare class CallExpressionHandler {
|
|
|
7
7
|
private logger;
|
|
8
8
|
private expressionResolver;
|
|
9
9
|
objectKeys: Set<string>;
|
|
10
|
-
|
|
10
|
+
private getCurrentFile;
|
|
11
|
+
private getCurrentCode;
|
|
12
|
+
constructor(config: Omit<I18nextToolkitConfig, 'plugins'>, pluginContext: PluginContext, logger: Logger, expressionResolver: ExpressionResolver, getCurrentFile: () => string, getCurrentCode: () => string);
|
|
13
|
+
/**
|
|
14
|
+
* Helper method to calculate line and column from byte offset.
|
|
15
|
+
* SWC provides byte offsets in span.start, not line/column directly.
|
|
16
|
+
*/
|
|
17
|
+
private getLocationFromSpan;
|
|
11
18
|
/**
|
|
12
19
|
* Processes function call expressions to extract translation keys.
|
|
13
20
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"call-expression-handler.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/call-expression-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAA6C,MAAM,WAAW,CAAA;AAC1F,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAgB,SAAS,EAAE,MAAM,aAAa,CAAA;AACvG,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAG1D,qBAAa,qBAAqB;IAChC,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,kBAAkB,CAAoB;IACvC,UAAU,cAAoB;
|
|
1
|
+
{"version":3,"file":"call-expression-handler.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/call-expression-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAA6C,MAAM,WAAW,CAAA;AAC1F,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAgB,SAAS,EAAE,MAAM,aAAa,CAAA;AACvG,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAG1D,qBAAa,qBAAqB;IAChC,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,MAAM,CAAQ;IACtB,OAAO,CAAC,kBAAkB,CAAoB;IACvC,UAAU,cAAoB;IACrC,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,cAAc,CAAc;gBAGlC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,aAAa,EAAE,aAAa,EAC5B,MAAM,EAAE,MAAM,EACd,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,MAAM,MAAM,EAC5B,cAAc,EAAE,MAAM,MAAM;IAU9B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;;;;;;;;;;;;OAaG;IACH,oBAAoB,CAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,GAAG,IAAI;IA4VxG;;;;;;OAMG;IACH,OAAO,CAAC,4BAA4B;IA8BpC;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,sBAAsB;IA2C9B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,gBAAgB;IA2LxB;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;CA2BxB"}
|
|
@@ -5,7 +5,13 @@ export declare class JSXHandler {
|
|
|
5
5
|
private config;
|
|
6
6
|
private pluginContext;
|
|
7
7
|
private expressionResolver;
|
|
8
|
-
|
|
8
|
+
private getCurrentFile;
|
|
9
|
+
private getCurrentCode;
|
|
10
|
+
constructor(config: Omit<I18nextToolkitConfig, 'plugins'>, pluginContext: PluginContext, expressionResolver: ExpressionResolver, getCurrentFile: () => string, getCurrentCode: () => string);
|
|
11
|
+
/**
|
|
12
|
+
* Helper method to calculate line and column from byte offset.
|
|
13
|
+
*/
|
|
14
|
+
private getLocationFromSpan;
|
|
9
15
|
/**
|
|
10
16
|
* Processes JSX elements to extract translation keys from Trans components.
|
|
11
17
|
*
|
|
@@ -27,6 +33,8 @@ export declare class JSXHandler {
|
|
|
27
33
|
* @param ns - Namespace for the keys
|
|
28
34
|
* @param isOrdinal - Whether to generate ordinal plural forms
|
|
29
35
|
* @param optionsNode - Optional tOptions object expression for plural-specific defaults
|
|
36
|
+
* @param explicitDefaultFromSource - Whether the default was explicitly provided in source
|
|
37
|
+
* @param locations - Source location information for this key
|
|
30
38
|
*/
|
|
31
39
|
private generatePluralKeysForTrans;
|
|
32
40
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jsx-handler.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/jsx-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAgB,MAAM,aAAa,CAAA;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAI1D,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,kBAAkB,CAAoB;
|
|
1
|
+
{"version":3,"file":"jsx-handler.d.ts","sourceRoot":"","sources":["../../../src/extractor/parsers/jsx-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAoB,MAAM,WAAW,CAAA;AAC7D,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAgB,MAAM,aAAa,CAAA;AACpF,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAI1D,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,aAAa,CAAe;IACpC,OAAO,CAAC,kBAAkB,CAAoB;IAC9C,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,cAAc,CAAc;gBAGlC,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,EAAE,MAAM,MAAM,EAC5B,cAAc,EAAE,MAAM,MAAM;IAS9B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;;;;;;;OAQG;IACH,gBAAgB,CAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,GAAG,IAAI;IA2QjI;;;;;;;;;;OAUG;IACH,OAAO,CAAC,0BAA0B;IAiGlC;;;;;;;;;OASG;IACH,OAAO,CAAC,cAAc;CAevB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-manager.d.ts","sourceRoot":"","sources":["../../src/extractor/plugin-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjG;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CAAE,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"plugin-manager.d.ts","sourceRoot":"","sources":["../../src/extractor/plugin-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjG;;;;;;;;;;;;GAYG;AACH,wBAAsB,iBAAiB,CAAE,OAAO,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAItE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,EAClC,OAAO,EAAE,MAAM,EAAE,EACjB,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,EAC7C,MAAM,EAAE,MAAM,GACb,aAAa,CAqEf"}
|
package/types/types.d.ts
CHANGED
|
@@ -264,6 +264,12 @@ export interface ExtractedKey {
|
|
|
264
264
|
explicitDefault?: boolean;
|
|
265
265
|
/** True when the extractor returned an already-expanded plural form (e.g. "key_one") */
|
|
266
266
|
isExpandedPlural?: boolean;
|
|
267
|
+
/** Source locations where this key was found (optional, populated by plugins) */
|
|
268
|
+
locations?: Array<{
|
|
269
|
+
file: string;
|
|
270
|
+
line?: number;
|
|
271
|
+
column?: number;
|
|
272
|
+
}>;
|
|
267
273
|
}
|
|
268
274
|
/**
|
|
269
275
|
* Result of processing translation files for a specific locale and namespace.
|
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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"}
|