@translation-cms/sync 1.2.26 → 1.2.28

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.
Files changed (197) hide show
  1. package/package.json +3 -2
  2. package/dist/api.d.ts +0 -105
  3. package/dist/api.d.ts.map +0 -1
  4. package/dist/api.js +0 -208
  5. package/dist/api.js.map +0 -1
  6. package/dist/bin.d.ts +0 -25
  7. package/dist/bin.d.ts.map +0 -1
  8. package/dist/bin.js +0 -208
  9. package/dist/bin.js.map +0 -1
  10. package/dist/commands/init.d.ts +0 -10
  11. package/dist/commands/init.d.ts.map +0 -1
  12. package/dist/commands/init.js +0 -107
  13. package/dist/commands/init.js.map +0 -1
  14. package/dist/commands/pull.d.ts +0 -10
  15. package/dist/commands/pull.d.ts.map +0 -1
  16. package/dist/commands/pull.js +0 -35
  17. package/dist/commands/pull.js.map +0 -1
  18. package/dist/commands/status.d.ts +0 -15
  19. package/dist/commands/status.d.ts.map +0 -1
  20. package/dist/commands/status.js +0 -62
  21. package/dist/commands/status.js.map +0 -1
  22. package/dist/commands/sync.d.ts +0 -24
  23. package/dist/commands/sync.d.ts.map +0 -1
  24. package/dist/commands/sync.js +0 -131
  25. package/dist/commands/sync.js.map +0 -1
  26. package/dist/commands/watch.d.ts +0 -18
  27. package/dist/commands/watch.d.ts.map +0 -1
  28. package/dist/commands/watch.js +0 -71
  29. package/dist/commands/watch.js.map +0 -1
  30. package/dist/config/config-internals/args.d.ts +0 -11
  31. package/dist/config/config-internals/args.d.ts.map +0 -1
  32. package/dist/config/config-internals/args.js +0 -22
  33. package/dist/config/config-internals/args.js.map +0 -1
  34. package/dist/config/config-internals/env.d.ts +0 -10
  35. package/dist/config/config-internals/env.d.ts.map +0 -1
  36. package/dist/config/config-internals/env.js +0 -35
  37. package/dist/config/config-internals/env.js.map +0 -1
  38. package/dist/config/config-internals/file.d.ts +0 -11
  39. package/dist/config/config-internals/file.d.ts.map +0 -1
  40. package/dist/config/config-internals/file.js +0 -28
  41. package/dist/config/config-internals/file.js.map +0 -1
  42. package/dist/config/config-internals/resolve.d.ts +0 -21
  43. package/dist/config/config-internals/resolve.d.ts.map +0 -1
  44. package/dist/config/config-internals/resolve.js +0 -73
  45. package/dist/config/config-internals/resolve.js.map +0 -1
  46. package/dist/config/config-internals/root.d.ts +0 -9
  47. package/dist/config/config-internals/root.d.ts.map +0 -1
  48. package/dist/config/config-internals/root.js +0 -22
  49. package/dist/config/config-internals/root.js.map +0 -1
  50. package/dist/config/config-internals/types.d.ts +0 -91
  51. package/dist/config/config-internals/types.d.ts.map +0 -1
  52. package/dist/config/config-internals/types.js +0 -9
  53. package/dist/config/config-internals/types.js.map +0 -1
  54. package/dist/config/resolve-config.d.ts +0 -11
  55. package/dist/config/resolve-config.d.ts.map +0 -1
  56. package/dist/config/resolve-config.js +0 -10
  57. package/dist/config/resolve-config.js.map +0 -1
  58. package/dist/core/api-internals/helpers.d.ts +0 -9
  59. package/dist/core/api-internals/helpers.d.ts.map +0 -1
  60. package/dist/core/api-internals/helpers.js +0 -14
  61. package/dist/core/api-internals/helpers.js.map +0 -1
  62. package/dist/core/api-internals/pull.d.ts +0 -19
  63. package/dist/core/api-internals/pull.d.ts.map +0 -1
  64. package/dist/core/api-internals/pull.js +0 -269
  65. package/dist/core/api-internals/pull.js.map +0 -1
  66. package/dist/core/api-internals/route-config.d.ts +0 -13
  67. package/dist/core/api-internals/route-config.d.ts.map +0 -1
  68. package/dist/core/api-internals/route-config.js +0 -34
  69. package/dist/core/api-internals/route-config.js.map +0 -1
  70. package/dist/core/api-internals/sync.d.ts +0 -19
  71. package/dist/core/api-internals/sync.d.ts.map +0 -1
  72. package/dist/core/api-internals/sync.js +0 -139
  73. package/dist/core/api-internals/sync.js.map +0 -1
  74. package/dist/core/api-internals/types.d.ts +0 -33
  75. package/dist/core/api-internals/types.d.ts.map +0 -1
  76. package/dist/core/api-internals/types.js +0 -5
  77. package/dist/core/api-internals/types.js.map +0 -1
  78. package/dist/core/api.d.ts +0 -11
  79. package/dist/core/api.d.ts.map +0 -1
  80. package/dist/core/api.js +0 -11
  81. package/dist/core/api.js.map +0 -1
  82. package/dist/core/cache-internals/format.d.ts +0 -20
  83. package/dist/core/cache-internals/format.d.ts.map +0 -1
  84. package/dist/core/cache-internals/format.js +0 -33
  85. package/dist/core/cache-internals/format.js.map +0 -1
  86. package/dist/core/cache-internals/params.d.ts +0 -33
  87. package/dist/core/cache-internals/params.d.ts.map +0 -1
  88. package/dist/core/cache-internals/params.js +0 -155
  89. package/dist/core/cache-internals/params.js.map +0 -1
  90. package/dist/core/cache-internals/pull.d.ts +0 -17
  91. package/dist/core/cache-internals/pull.d.ts.map +0 -1
  92. package/dist/core/cache-internals/pull.js +0 -34
  93. package/dist/core/cache-internals/pull.js.map +0 -1
  94. package/dist/core/cache-internals/sync.d.ts +0 -29
  95. package/dist/core/cache-internals/sync.d.ts.map +0 -1
  96. package/dist/core/cache-internals/sync.js +0 -104
  97. package/dist/core/cache-internals/sync.js.map +0 -1
  98. package/dist/core/cache-internals/types.d.ts +0 -48
  99. package/dist/core/cache-internals/types.d.ts.map +0 -1
  100. package/dist/core/cache-internals/types.js +0 -2
  101. package/dist/core/cache-internals/types.js.map +0 -1
  102. package/dist/core/cache.d.ts +0 -13
  103. package/dist/core/cache.d.ts.map +0 -1
  104. package/dist/core/cache.js +0 -33
  105. package/dist/core/cache.js.map +0 -1
  106. package/dist/core/scanner-internals/ast.d.ts +0 -40
  107. package/dist/core/scanner-internals/ast.d.ts.map +0 -1
  108. package/dist/core/scanner-internals/ast.js +0 -100
  109. package/dist/core/scanner-internals/ast.js.map +0 -1
  110. package/dist/core/scanner-internals/file-walker.d.ts +0 -10
  111. package/dist/core/scanner-internals/file-walker.d.ts.map +0 -1
  112. package/dist/core/scanner-internals/file-walker.js +0 -23
  113. package/dist/core/scanner-internals/file-walker.js.map +0 -1
  114. package/dist/core/scanner-internals/import-resolver.d.ts +0 -21
  115. package/dist/core/scanner-internals/import-resolver.d.ts.map +0 -1
  116. package/dist/core/scanner-internals/import-resolver.js +0 -119
  117. package/dist/core/scanner-internals/import-resolver.js.map +0 -1
  118. package/dist/core/scanner-internals/key-extractor.d.ts +0 -20
  119. package/dist/core/scanner-internals/key-extractor.d.ts.map +0 -1
  120. package/dist/core/scanner-internals/key-extractor.js +0 -274
  121. package/dist/core/scanner-internals/key-extractor.js.map +0 -1
  122. package/dist/core/scanner-internals/nav-config-scanner.d.ts +0 -30
  123. package/dist/core/scanner-internals/nav-config-scanner.d.ts.map +0 -1
  124. package/dist/core/scanner-internals/nav-config-scanner.js +0 -170
  125. package/dist/core/scanner-internals/nav-config-scanner.js.map +0 -1
  126. package/dist/core/scanner-internals/route-detector.d.ts +0 -27
  127. package/dist/core/scanner-internals/route-detector.d.ts.map +0 -1
  128. package/dist/core/scanner-internals/route-detector.js +0 -78
  129. package/dist/core/scanner-internals/route-detector.js.map +0 -1
  130. package/dist/core/scanner-internals/types.d.ts +0 -60
  131. package/dist/core/scanner-internals/types.d.ts.map +0 -1
  132. package/dist/core/scanner-internals/types.js +0 -29
  133. package/dist/core/scanner-internals/types.js.map +0 -1
  134. package/dist/core/scanner.d.ts +0 -21
  135. package/dist/core/scanner.d.ts.map +0 -1
  136. package/dist/core/scanner.js +0 -162
  137. package/dist/core/scanner.js.map +0 -1
  138. package/dist/index.d.ts +0 -3
  139. package/dist/index.d.ts.map +0 -1
  140. package/dist/index.js +0 -3
  141. package/dist/index.js.map +0 -1
  142. package/dist/next.d.ts +0 -33
  143. package/dist/next.d.ts.map +0 -1
  144. package/dist/next.js +0 -110
  145. package/dist/next.js.map +0 -1
  146. package/dist/preview/index.d.ts +0 -39
  147. package/dist/preview/index.d.ts.map +0 -1
  148. package/dist/preview/index.js +0 -123
  149. package/dist/preview/index.js.map +0 -1
  150. package/dist/preview/internals/highlight.d.ts +0 -31
  151. package/dist/preview/internals/highlight.d.ts.map +0 -1
  152. package/dist/preview/internals/highlight.js +0 -184
  153. package/dist/preview/internals/highlight.js.map +0 -1
  154. package/dist/preview/internals/interactions.d.ts +0 -15
  155. package/dist/preview/internals/interactions.d.ts.map +0 -1
  156. package/dist/preview/internals/interactions.js +0 -38
  157. package/dist/preview/internals/interactions.js.map +0 -1
  158. package/dist/preview/internals/interactive.d.ts +0 -14
  159. package/dist/preview/internals/interactive.d.ts.map +0 -1
  160. package/dist/preview/internals/interactive.js +0 -122
  161. package/dist/preview/internals/interactive.js.map +0 -1
  162. package/dist/preview/internals/locales.d.ts +0 -9
  163. package/dist/preview/internals/locales.d.ts.map +0 -1
  164. package/dist/preview/internals/locales.js +0 -24
  165. package/dist/preview/internals/locales.js.map +0 -1
  166. package/dist/preview/internals/state.d.ts +0 -37
  167. package/dist/preview/internals/state.d.ts.map +0 -1
  168. package/dist/preview/internals/state.js +0 -74
  169. package/dist/preview/internals/state.js.map +0 -1
  170. package/dist/preview/internals/styles.d.ts +0 -8
  171. package/dist/preview/internals/styles.d.ts.map +0 -1
  172. package/dist/preview/internals/styles.js +0 -28
  173. package/dist/preview/internals/styles.js.map +0 -1
  174. package/dist/preview/internals/types.d.ts +0 -74
  175. package/dist/preview/internals/types.d.ts.map +0 -1
  176. package/dist/preview/internals/types.js +0 -5
  177. package/dist/preview/internals/types.js.map +0 -1
  178. package/dist/preview/internals/ui-indicators.d.ts +0 -15
  179. package/dist/preview/internals/ui-indicators.d.ts.map +0 -1
  180. package/dist/preview/internals/ui-indicators.js +0 -92
  181. package/dist/preview/internals/ui-indicators.js.map +0 -1
  182. package/dist/scaffold/index.d.ts +0 -3
  183. package/dist/scaffold/index.d.ts.map +0 -1
  184. package/dist/scaffold/index.js +0 -3
  185. package/dist/scaffold/index.js.map +0 -1
  186. package/dist/scaffold/intenrals/scaffold.d.ts +0 -24
  187. package/dist/scaffold/intenrals/scaffold.d.ts.map +0 -1
  188. package/dist/scaffold/intenrals/scaffold.js +0 -53
  189. package/dist/scaffold/intenrals/scaffold.js.map +0 -1
  190. package/dist/scaffold/intenrals/templates.d.ts +0 -10
  191. package/dist/scaffold/intenrals/templates.d.ts.map +0 -1
  192. package/dist/scaffold/intenrals/templates.js +0 -344
  193. package/dist/scaffold/intenrals/templates.js.map +0 -1
  194. package/dist/scaffold/intenrals/types.d.ts +0 -14
  195. package/dist/scaffold/intenrals/types.d.ts.map +0 -1
  196. package/dist/scaffold/intenrals/types.js +0 -5
  197. package/dist/scaffold/intenrals/types.js.map +0 -1
@@ -1,100 +0,0 @@
1
- /**
2
- * AST parsing and traversal utilities.
3
- */
4
- import { parse } from '@babel/parser';
5
- import path from 'path';
6
- /**
7
- * Walk an AST node depth-first, calling visit() for every node encountered.
8
- *
9
- * Handles three cases:
10
- * - Arrays → recurse into each element
11
- * - AST nodes → call visit(), then recurse into all object-valued properties
12
- * - Primitives → stop (nothing to traverse)
13
- */
14
- export function walk(node, visit) {
15
- if (!node || typeof node !== 'object')
16
- return;
17
- if (Array.isArray(node)) {
18
- for (const item of node)
19
- walk(item, visit);
20
- return;
21
- }
22
- const n = node;
23
- // Visit before recursing so parents are seen before their children
24
- if (typeof n.type === 'string')
25
- visit(n);
26
- for (const value of Object.values(n)) {
27
- if (value && typeof value === 'object')
28
- walk(value, visit);
29
- }
30
- }
31
- /**
32
- * Parse source code into a Babel AST with the appropriate plugins for the
33
- * file extension.
34
- *
35
- * - `.ts` → typescript
36
- * - `.tsx`, `.jsx`, `.js` → typescript (if .tsx) + jsx
37
- *
38
- * `errorRecovery: true` lets the parser continue past syntax errors so a
39
- * single broken file doesn't abort the entire scan.
40
- */
41
- export function parseSource(filePath, source) {
42
- const ext = path.extname(filePath);
43
- const plugins = [];
44
- if (ext === '.ts' || ext === '.tsx')
45
- plugins.push('typescript');
46
- if (ext !== '.ts')
47
- plugins.push('jsx'); // .tsx, .jsx, .js
48
- return parse(source, {
49
- sourceType: 'module',
50
- plugins,
51
- errorRecovery: true,
52
- });
53
- }
54
- /**
55
- * Extract the static string value from a `StringLiteral` or a `TemplateLiteral`
56
- * that contains no expressions (i.e. `` `plain string` ``).
57
- * Returns null for dynamic expressions or any other node type.
58
- */
59
- export function stringValue(node) {
60
- if (!node || typeof node !== 'object')
61
- return null;
62
- const n = node;
63
- if (n.type === 'StringLiteral' && typeof n.value === 'string')
64
- return n.value;
65
- if (n.type === 'TemplateLiteral') {
66
- const exprs = n.expressions;
67
- const quasis = n.quasis;
68
- // Only static template literals (no ${…} expressions) can be resolved
69
- if (exprs.length === 0 && quasis.length === 1) {
70
- const quasi = quasis[0];
71
- if (quasi?.value) {
72
- return quasi.value.cooked ?? null;
73
- }
74
- }
75
- }
76
- return null;
77
- }
78
- /**
79
- * Extract namespace string(s) from the first argument of a
80
- * `useTranslation()` / `getTranslation()` call.
81
- *
82
- * Handles:
83
- * - Single string: `useTranslation('sidebar')` → `['sidebar']`
84
- * - Array of strings: `useTranslation(['common', 'nav'])` → `['common', 'nav']`
85
- */
86
- export function namespacesFromArg(node) {
87
- const single = stringValue(node);
88
- if (single)
89
- return [single];
90
- if (!node || typeof node !== 'object')
91
- return [];
92
- const n = node;
93
- if (n.type === 'ArrayExpression') {
94
- return n.elements
95
- .map(stringValue)
96
- .filter((s) => s !== null);
97
- }
98
- return [];
99
- }
100
- //# sourceMappingURL=ast.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ast.js","sourceRoot":"","sources":["../../../src/core/scanner-internals/ast.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAqB,MAAM,eAAe,CAAC;AACzD,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB;;;;;;;GAOG;AACH,MAAM,UAAU,IAAI,CAAC,IAAa,EAAE,KAA8B;IAC9D,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACtB,KAAK,MAAM,IAAI,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAC3C,OAAO;IACX,CAAC;IACD,MAAM,CAAC,GAAG,IAAe,CAAC;IAC1B,mEAAmE;IACnE,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;QAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACnC,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/D,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,MAAc;IACxD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,OAAO,GAAmB,EAAE,CAAC;IACnC,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAChE,IAAI,GAAG,KAAK,KAAK;QAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,kBAAkB;IAC1D,OAAO,KAAK,CAAC,MAAM,EAAE;QACjB,UAAU,EAAE,QAAQ;QACpB,OAAO;QACP,aAAa,EAAE,IAAI;KACtB,CAAC,CAAC;AACP,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,IAAa;IACrC,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACnD,MAAM,CAAC,GAAG,IAAe,CAAC;IAC1B,IAAI,CAAC,CAAC,IAAI,KAAK,eAAe,IAAI,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ;QACzD,OAAO,CAAC,CAAC,KAAK,CAAC;IACnB,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC/B,MAAM,KAAK,GAAG,CAAC,CAAC,WAAwB,CAAC;QACzC,MAAM,MAAM,GAAG,CAAC,CAAC,MAAqD,CAAC;QACvE,sEAAsE;QACtE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,KAAK,EAAE,KAAK,EAAE,CAAC;gBACf,OAAO,KAAK,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC;YACtC,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAa;IAC3C,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,MAAM;QAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC;IACjD,MAAM,CAAC,GAAG,IAAe,CAAC;IAC1B,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QAC/B,OAAQ,CAAC,CAAC,QAAsB;aAC3B,GAAG,CAAC,WAAW,CAAC;aAChB,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC"}
@@ -1,10 +0,0 @@
1
- /**
2
- * File system traversal utilities.
3
- */
4
- /**
5
- * Recursively walk a directory, yielding paths of source files.
6
- * Skips directories listed in `excludedDirs` and files whose extension
7
- * is not in `sourceExtensions`.
8
- */
9
- export declare function walkFiles(dir: string, excludedDirs: Set<string>, sourceExtensions: Set<string>): Generator<string>;
10
- //# sourceMappingURL=file-walker.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-walker.d.ts","sourceRoot":"","sources":["../../../src/core/scanner-internals/file-walker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH;;;;GAIG;AACH,wBAAiB,SAAS,CACtB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,EACzB,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC9B,SAAS,CAAC,MAAM,CAAC,CAanB"}
@@ -1,23 +0,0 @@
1
- /**
2
- * File system traversal utilities.
3
- */
4
- import fs from 'fs';
5
- import path from 'path';
6
- /**
7
- * Recursively walk a directory, yielding paths of source files.
8
- * Skips directories listed in `excludedDirs` and files whose extension
9
- * is not in `sourceExtensions`.
10
- */
11
- export function* walkFiles(dir, excludedDirs, sourceExtensions) {
12
- for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
13
- const fullPath = path.join(dir, entry.name);
14
- if (entry.isDirectory()) {
15
- if (!excludedDirs.has(entry.name))
16
- yield* walkFiles(fullPath, excludedDirs, sourceExtensions);
17
- continue;
18
- }
19
- if (entry.isFile() && sourceExtensions.has(path.extname(entry.name)))
20
- yield fullPath;
21
- }
22
- }
23
- //# sourceMappingURL=file-walker.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-walker.js","sourceRoot":"","sources":["../../../src/core/scanner-internals/file-walker.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB;;;;GAIG;AACH,MAAM,SAAS,CAAC,CAAC,SAAS,CACtB,GAAW,EACX,YAAyB,EACzB,gBAA6B;IAE7B,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAE5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACtB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC7B,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,YAAY,EAAE,gBAAgB,CAAC,CAAC;YAC/D,SAAS;QACb,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAChE,MAAM,QAAQ,CAAC;IACvB,CAAC;AACL,CAAC"}
@@ -1,21 +0,0 @@
1
- /**
2
- * Import path resolution and traversal.
3
- * Handles aliased imports (@/path), relative imports (../path), and layout chains.
4
- */
5
- /**
6
- * Extract all local imports (relative and aliased) from a source file via AST.
7
- *
8
- * Handles `import`, `export { ... } from`, and `export * from` declarations.
9
- * Silently skips files that cannot be read or parsed (errorRecovery in parser
10
- * handles most syntax issues, but catastrophic parse failures are caught here).
11
- */
12
- export declare function extractLocalImports(filePath: string, sourceExtensions: Set<string>, root?: string, pathMappings?: Record<string, string[]>): string[];
13
- /**
14
- * For a given page file, find all wrapping `layout.*` files walking upward
15
- * through the directory tree until we reach the app root.
16
- *
17
- * The returned array is ordered from nearest to furthest layout, matching the
18
- * order in which layouts wrap the page in Next.js App Router.
19
- */
20
- export declare function getLayoutChain(root: string, pageFile: string, sourceExtensions: Set<string>): string[];
21
- //# sourceMappingURL=import-resolver.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"import-resolver.d.ts","sourceRoot":"","sources":["../../../src/core/scanner-internals/import-resolver.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkFH;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAC/B,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,EAC7B,IAAI,CAAC,EAAE,MAAM,EACb,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACxC,MAAM,EAAE,CAoCV;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC1B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC9B,MAAM,EAAE,CAaV"}
@@ -1,119 +0,0 @@
1
- /**
2
- * Import path resolution and traversal.
3
- * Handles aliased imports (@/path), relative imports (../path), and layout chains.
4
- */
5
- import fs from 'fs';
6
- import path from 'path';
7
- import { parseSource, walk } from './ast.js';
8
- /**
9
- * Given a base path (without extension), resolve it to an existing file by:
10
- * 1. Returning it as-is if it already carries a known source extension.
11
- * 2. Probing `basePath + ext` for each known extension.
12
- * 3. Probing `basePath/index + ext` (barrel / directory index files).
13
- *
14
- * Returns null when no matching file is found on disk.
15
- */
16
- function resolveFilePath(basePath, sourceExtensions) {
17
- // Already has a known extension — check directly
18
- if (sourceExtensions.has(path.extname(basePath)))
19
- return fs.existsSync(basePath) ? basePath : null;
20
- // Try appending each source extension (e.g. basePath.tsx)
21
- for (const ext of sourceExtensions) {
22
- const candidate = basePath + ext;
23
- if (fs.existsSync(candidate))
24
- return candidate;
25
- }
26
- // Try directory index files (e.g. basePath/index.tsx)
27
- for (const ext of sourceExtensions) {
28
- const candidate = path.join(basePath, 'index' + ext);
29
- if (fs.existsSync(candidate))
30
- return candidate;
31
- }
32
- return null;
33
- }
34
- /**
35
- * Resolve an aliased import path (e.g. `@/components/button`) to an absolute
36
- * file path using the tsconfig path mappings provided.
37
- *
38
- * Each alias key may contain `*` as a wildcard (mirrors tsconfig `paths` syntax).
39
- * Returns null when no mapping matches or no file is found on disk.
40
- */
41
- function resolveAliasedImport(importPath, root, sourceExtensions, pathMappings) {
42
- if (!pathMappings)
43
- return null;
44
- for (const [alias, targets] of Object.entries(pathMappings)) {
45
- const match = importPath.match(new RegExp(`^${alias.replace(/\*/g, '(.*)')}$`));
46
- if (!match)
47
- continue;
48
- const captured = match[1] ?? '';
49
- for (const target of targets) {
50
- const fullPath = path.join(root, target.replace(/\*/g, captured));
51
- const resolved = resolveFilePath(fullPath, sourceExtensions);
52
- if (resolved)
53
- return resolved;
54
- }
55
- }
56
- return null;
57
- }
58
- /**
59
- * Resolve a relative import path (e.g. `../utils/helpers`) to an absolute
60
- * file path. Delegates to `resolveFilePath` for extension probing.
61
- */
62
- function resolveLocalImport(fromDir, importPath, sourceExtensions) {
63
- return resolveFilePath(path.join(fromDir, importPath), sourceExtensions);
64
- }
65
- /**
66
- * Extract all local imports (relative and aliased) from a source file via AST.
67
- *
68
- * Handles `import`, `export { ... } from`, and `export * from` declarations.
69
- * Silently skips files that cannot be read or parsed (errorRecovery in parser
70
- * handles most syntax issues, but catastrophic parse failures are caught here).
71
- */
72
- export function extractLocalImports(filePath, sourceExtensions, root, pathMappings) {
73
- let ast;
74
- try {
75
- ast = parseSource(filePath, fs.readFileSync(filePath, 'utf-8'));
76
- }
77
- catch {
78
- return [];
79
- }
80
- const fromDir = path.dirname(filePath);
81
- const results = [];
82
- walk(ast, node => {
83
- if (node.type !== 'ImportDeclaration' &&
84
- node.type !== 'ExportNamedDeclaration' &&
85
- node.type !== 'ExportAllDeclaration')
86
- return;
87
- const src = node.source;
88
- if (!src || typeof src.value !== 'string')
89
- return;
90
- const importPath = src.value;
91
- const resolved = importPath.startsWith('.')
92
- ? resolveLocalImport(fromDir, importPath, sourceExtensions)
93
- : resolveAliasedImport(importPath, root ?? '', sourceExtensions, pathMappings);
94
- if (resolved && !results.includes(resolved))
95
- results.push(resolved);
96
- });
97
- return results;
98
- }
99
- /**
100
- * For a given page file, find all wrapping `layout.*` files walking upward
101
- * through the directory tree until we reach the app root.
102
- *
103
- * The returned array is ordered from nearest to furthest layout, matching the
104
- * order in which layouts wrap the page in Next.js App Router.
105
- */
106
- export function getLayoutChain(root, pageFile, sourceExtensions) {
107
- const layouts = [];
108
- let dir = path.dirname(pageFile);
109
- while (dir.startsWith(root)) {
110
- for (const ext of sourceExtensions) {
111
- const candidate = path.join(dir, `layout${ext}`);
112
- if (fs.existsSync(candidate))
113
- layouts.push(candidate);
114
- }
115
- dir = path.dirname(dir);
116
- }
117
- return layouts;
118
- }
119
- //# sourceMappingURL=import-resolver.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"import-resolver.js","sourceRoot":"","sources":["../../../src/core/scanner-internals/import-resolver.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- /**
2
- * Extraction of translation keys from source files.
3
- *
4
- * Five passes over the AST per file:
5
- * 1. Collect `t`-binding declarations (useTranslation / getTranslation / getTranslations)
6
- * 2. Extract keys from `t('namespace:key')` call expressions
7
- * 3. Extract keys from `<Trans i18nKey="namespace:key">` JSX elements
8
- * 4. Extract keys from `I18nKey`-typed string literals in config/data files
9
- * 5. Extract keys from object properties whose name ends with `Key`
10
- */
11
- import type { NamespaceMap } from './types.js';
12
- /**
13
- * Extract all translation keys from `filePath` and merge them into `result`.
14
- *
15
- * @param filePath Absolute path to the source file to scan.
16
- * @param routes Preview routes associated with this file ([] for overlays).
17
- * @param result Accumulator map updated in place.
18
- */
19
- export declare function extractKeysFromFile(filePath: string, routes: string[], result: NamespaceMap): void;
20
- //# sourceMappingURL=key-extractor.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"key-extractor.d.ts","sourceRoot":"","sources":["../../../src/core/scanner-internals/key-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAW,YAAY,EAAE,MAAM,YAAY,CAAC;AA6FxD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAC/B,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAAE,EAChB,MAAM,EAAE,YAAY,GACrB,IAAI,CAiKN"}
@@ -1,274 +0,0 @@
1
- /**
2
- * Extraction of translation keys from source files.
3
- *
4
- * Five passes over the AST per file:
5
- * 1. Collect `t`-binding declarations (useTranslation / getTranslation / getTranslations)
6
- * 2. Extract keys from `t('namespace:key')` call expressions
7
- * 3. Extract keys from `<Trans i18nKey="namespace:key">` JSX elements
8
- * 4. Extract keys from `I18nKey`-typed string literals in config/data files
9
- * 5. Extract keys from object properties whose name ends with `Key`
10
- */
11
- import fs from 'fs';
12
- import path from 'path';
13
- import { parseSource, walk, stringValue, namespacesFromArg } from './ast.js';
14
- // ---------------------------------------------------------------------------
15
- // Small helpers
16
- // ---------------------------------------------------------------------------
17
- /**
18
- * Add a key to the namespace map with its associated routes.
19
- * Skips keys that look like URL paths or are purely numeric (not translation keys).
20
- * Merges routes with any previously registered set for the same key.
21
- */
22
- function addKey(map, namespace, key, routes) {
23
- if (key.startsWith('/') || key.startsWith('.') || /^\d+$/.test(key))
24
- return;
25
- if (!map[namespace])
26
- map[namespace] = new Map();
27
- const existing = map[namespace].get(key) ?? [];
28
- if (routes.length > 0) {
29
- // Union the new routes with whatever was already stored
30
- const merged = new Set(existing);
31
- for (const route of routes)
32
- merged.add(route);
33
- map[namespace].set(key, Array.from(merged));
34
- }
35
- else if (existing.length === 0) {
36
- // Key seen with no routes yet — register it so it appears in the map
37
- map[namespace].set(key, []);
38
- }
39
- }
40
- /**
41
- * Split a `"namespace:key"` string into its two parts.
42
- * Returns null when the colon is absent or at position 0 (invalid).
43
- */
44
- function splitI18nKey(keyStr) {
45
- const colonIdx = keyStr.indexOf(':');
46
- if (colonIdx <= 0)
47
- return null;
48
- return [keyStr.slice(0, colonIdx), keyStr.slice(colonIdx + 1)];
49
- }
50
- /**
51
- * Extract the string value of a JSX attribute value node.
52
- * Handles plain string literals (`i18nKey="ns:key"`) and expression containers
53
- * (`i18nKey={"ns:key"}`). Returns null for dynamic expressions.
54
- */
55
- function jsxAttrStringValue(value) {
56
- if (!value)
57
- return null;
58
- if (value.type === 'StringLiteral')
59
- return value.value;
60
- if (value.type === 'JSXExpressionContainer')
61
- return stringValue(value.expression);
62
- return null;
63
- }
64
- /**
65
- * Bind translation function aliases from a destructuring pattern.
66
- *
67
- * Handles both direct binding and renaming:
68
- * `const { t } = useTranslation()` → binds `t`
69
- * `const { t: myT } = useTranslation()` → binds `myT`
70
- * `const { tDynamic } = getTranslation()` → binds `tDynamic`
71
- *
72
- * Only the standard accessor names (`t`, `tDynamic`) are recognised as
73
- * source keys; any other destructured property is ignored.
74
- */
75
- function bindFromObjectPattern(id, namespaces, tBindings) {
76
- for (const prop of id.properties) {
77
- if (prop.type !== 'ObjectProperty')
78
- continue;
79
- const keyNode = prop.key;
80
- const origName = keyNode.type === 'Identifier' ? keyNode.name : null;
81
- if (!origName || (origName !== 't' && origName !== 'tDynamic'))
82
- continue;
83
- // Use the aliased name if present: `{ t: myT }` → bind `myT`
84
- const valNode = prop.value;
85
- const boundName = valNode.type === 'Identifier' ? valNode.name : origName;
86
- tBindings.set(boundName, namespaces);
87
- }
88
- }
89
- // ---------------------------------------------------------------------------
90
- // Main export
91
- // ---------------------------------------------------------------------------
92
- /**
93
- * Extract all translation keys from `filePath` and merge them into `result`.
94
- *
95
- * @param filePath Absolute path to the source file to scan.
96
- * @param routes Preview routes associated with this file ([] for overlays).
97
- * @param result Accumulator map updated in place.
98
- */
99
- export function extractKeysFromFile(filePath, routes, result) {
100
- let ast;
101
- try {
102
- // Single try/catch covers both the file read and the parse step
103
- ast = parseSource(filePath, fs.readFileSync(filePath, 'utf-8'));
104
- }
105
- catch {
106
- return;
107
- }
108
- // --- Step 1: collect namespace bindings ---
109
- // Maps each local variable name (e.g. `t`) to the namespace(s) it is bound to
110
- // so that call-expression extraction in Step 2 can resolve the correct namespace.
111
- const tBindings = new Map();
112
- walk(ast, node => {
113
- if (node.type !== 'VariableDeclaration')
114
- return;
115
- for (const decl of node.declarations) {
116
- const init = decl.init;
117
- if (!init)
118
- continue;
119
- // Unwrap `await` so `const t = await client.getTranslations(...)` works
120
- const call = init.type === 'AwaitExpression'
121
- ? init.argument
122
- : init;
123
- if (!call || call.type !== 'CallExpression')
124
- continue;
125
- const callee = call.callee;
126
- const args = call.arguments;
127
- // useTranslation('ns') / getTranslation('ns')
128
- const isHook = callee.type === 'Identifier' &&
129
- (callee.name === 'useTranslation' ||
130
- callee.name === 'getTranslation');
131
- // client.getTranslations(locale, 'ns') / client.getT(locale, 'ns')
132
- const isCmsStyle = callee.type === 'MemberExpression' &&
133
- callee.property.type === 'Identifier' &&
134
- /^getTranslations(?:WithFallback)?$|^getT$/.test(callee.property.name);
135
- if (!isHook && !isCmsStyle)
136
- continue;
137
- // Namespace arg position differs: hook uses args[0], CMS style uses args[1]
138
- const namespaces = isHook
139
- ? namespacesFromArg(args[0])
140
- : namespacesFromArg(args[1]);
141
- if (!namespaces.length)
142
- continue;
143
- const id = decl.id;
144
- if (id.type === 'Identifier') {
145
- // const t = useTranslation(...)
146
- tBindings.set(id.name, namespaces);
147
- }
148
- else if (id.type === 'ObjectPattern') {
149
- // const { t } = useTranslation(...) or const { t: myT } = ...
150
- bindFromObjectPattern(id, namespaces, tBindings);
151
- }
152
- }
153
- });
154
- // --- Step 2: extract keys from t('…') call expressions ---
155
- // Only variables explicitly bound in Step 1 are processed; unknown callee
156
- // names are silently skipped to avoid false positives.
157
- walk(ast, node => {
158
- if (node.type !== 'CallExpression')
159
- return;
160
- const callee = node.callee;
161
- if (callee.type !== 'Identifier')
162
- return;
163
- const varName = callee.name;
164
- if (!tBindings.has(varName))
165
- return;
166
- const keyStr = stringValue(node.arguments[0]);
167
- if (!keyStr)
168
- return;
169
- const parts = splitI18nKey(keyStr);
170
- if (parts) {
171
- // t('namespace:key') — namespace is explicit in the key string
172
- addKey(result, parts[0], parts[1], routes);
173
- }
174
- else {
175
- // Bare key: t('key') — namespace comes from the binding; emit a warning
176
- console.warn(`[WARN] Bare key in ${path.relative(process.cwd(), filePath)}: ` +
177
- `${varName}('${keyStr}') — use ${varName}('namespace:${keyStr}') instead`);
178
- for (const ns of tBindings.get(varName))
179
- addKey(result, ns, keyStr, routes);
180
- }
181
- });
182
- // --- Step 3: <Trans i18nKey="namespace:key"> ---
183
- // The Trans component is the JSX equivalent of t(); only fully-qualified
184
- // "namespace:key" values are accepted (bare keys cannot be resolved here).
185
- walk(ast, node => {
186
- if (node.type !== 'JSXOpeningElement')
187
- return;
188
- const name = node.name;
189
- if (name.type !== 'JSXIdentifier' || name.name !== 'Trans')
190
- return;
191
- for (const attr of node.attributes) {
192
- if (attr.type !== 'JSXAttribute')
193
- continue;
194
- const attrName = attr.name;
195
- if (attrName.type !== 'JSXIdentifier' ||
196
- attrName.name !== 'i18nKey')
197
- continue;
198
- const keyStr = jsxAttrStringValue(attr.value);
199
- if (!keyStr)
200
- continue;
201
- const parts = splitI18nKey(keyStr);
202
- if (parts)
203
- addKey(result, parts[0], parts[1], routes);
204
- }
205
- });
206
- // --- Step 4: I18nKey string literals in config/data files ---
207
- // When a file imports the `I18nKey` type it likely contains typed config
208
- // objects (e.g. nav items with `label: 'sidebar:settings'`). Scan every
209
- // string literal that matches "namespace:key" to catch these.
210
- if (hasI18nKeyImport(ast)) {
211
- walk(ast, node => {
212
- if (node.type !== 'StringLiteral')
213
- return;
214
- const parts = splitI18nKey(node.value);
215
- if (!parts)
216
- return;
217
- // Namespace and key must look like identifiers/dot-paths (no spaces, slashes…)
218
- if (!/^\w[\w-]*$/.test(parts[0]) || !/^\w[\w.-]*$/.test(parts[1]))
219
- return;
220
- addKey(result, parts[0], parts[1], routes);
221
- });
222
- }
223
- // --- Step 5: *Key object property string literals ---
224
- // Catches translation keys passed as prop/config values where the property
225
- // name ends with "Key" (e.g. `titleKey: 'subscription:expired'`).
226
- // The naming convention is the only signal needed — no import sentinel required.
227
- walk(ast, node => {
228
- if (node.type !== 'ObjectProperty' && node.type !== 'Property')
229
- return;
230
- const keyNode = node.key;
231
- const propName = keyNode.type === 'Identifier'
232
- ? keyNode.name
233
- : keyNode.type === 'StringLiteral'
234
- ? keyNode.value
235
- : null;
236
- if (!propName?.endsWith('Key'))
237
- return;
238
- const val = stringValue(node.value);
239
- if (!val)
240
- return;
241
- const parts = splitI18nKey(val);
242
- if (!parts)
243
- return;
244
- if (!/^\w[\w-]*$/.test(parts[0]) || !/^\w[\w.-]*$/.test(parts[1]))
245
- return;
246
- addKey(result, parts[0], parts[1], routes);
247
- });
248
- }
249
- // ---------------------------------------------------------------------------
250
- // Internal helpers
251
- // ---------------------------------------------------------------------------
252
- /**
253
- * Returns true if the AST contains an import of the `I18nKey` type.
254
- * Used as a cheap sentinel to decide whether Step 4 should run for a file.
255
- *
256
- * The `found` flag pattern is necessary because `walk()` does not support
257
- * early termination — we skip further work as soon as the import is spotted.
258
- */
259
- function hasI18nKeyImport(ast) {
260
- let found = false;
261
- walk(ast, node => {
262
- if (found || node.type !== 'ImportDeclaration')
263
- return;
264
- for (const spec of node.specifiers) {
265
- if (spec.type === 'ImportSpecifier' &&
266
- spec.imported?.name === 'I18nKey') {
267
- found = true;
268
- return;
269
- }
270
- }
271
- });
272
- return found;
273
- }
274
- //# sourceMappingURL=key-extractor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"key-extractor.js","sourceRoot":"","sources":["../../../src/core/scanner-internals/key-extractor.ts"],"names":[],"mappings":"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"}
@@ -1,30 +0,0 @@
1
- /**
2
- * Navigation config scanner.
3
- * Extracts href values from navigation configuration files and returns them
4
- * as preview routes that can be merged into the translation key map.
5
- *
6
- * Looks for patterns like:
7
- * href: `/projects/${id}/settings`
8
- * href: '/admin/users'
9
- * href: `/o/${orgId}/projects`
10
- */
11
- /**
12
- * Finds navigation config files in the project.
13
- * Matches files with patterns like:
14
- * - &#42;&#42;/navigation.config.ts(x)
15
- * - &#42;&#42;/navigation&#42;.ts(x) in config/ directories
16
- * - &#42;&#42;/routes.config.ts(x)
17
- * - &#42;&#42;/app-routes.ts(x)
18
- */
19
- export declare function findNavConfigFiles(root: string, sourceExtensions: Set<string>): string[];
20
- /**
21
- * Extract href values from a navigation config file.
22
- * Returns an array of href strings/routes found in the config.
23
- */
24
- export declare function extractNavRoutes(filePath: string): string[];
25
- /**
26
- * Scan navigation config files and return preview routes for all hrefs found.
27
- * Returns a map of route patterns to their string arrays.
28
- */
29
- export declare function scanNavConfig(root: string, sourceExtensions: Set<string>): Record<string, string[]>;
30
- //# sourceMappingURL=nav-config-scanner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nav-config-scanner.d.ts","sourceRoot":"","sources":["../../../src/core/scanner-internals/nav-config-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAC9B,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC9B,MAAM,EAAE,CA4CV;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,CA6C3D;AA4CD;;;GAGG;AACH,wBAAgB,aAAa,CACzB,IAAI,EAAE,MAAM,EACZ,gBAAgB,EAAE,GAAG,CAAC,MAAM,CAAC,GAC9B,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CA4B1B"}