@translation-cms/sync 1.2.25 → 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 (198) hide show
  1. package/README.md +62 -16
  2. package/package.json +3 -2
  3. package/dist/api.d.ts +0 -105
  4. package/dist/api.d.ts.map +0 -1
  5. package/dist/api.js +0 -208
  6. package/dist/api.js.map +0 -1
  7. package/dist/bin.d.ts +0 -25
  8. package/dist/bin.d.ts.map +0 -1
  9. package/dist/bin.js +0 -208
  10. package/dist/bin.js.map +0 -1
  11. package/dist/commands/init.d.ts +0 -10
  12. package/dist/commands/init.d.ts.map +0 -1
  13. package/dist/commands/init.js +0 -89
  14. package/dist/commands/init.js.map +0 -1
  15. package/dist/commands/pull.d.ts +0 -10
  16. package/dist/commands/pull.d.ts.map +0 -1
  17. package/dist/commands/pull.js +0 -35
  18. package/dist/commands/pull.js.map +0 -1
  19. package/dist/commands/status.d.ts +0 -15
  20. package/dist/commands/status.d.ts.map +0 -1
  21. package/dist/commands/status.js +0 -62
  22. package/dist/commands/status.js.map +0 -1
  23. package/dist/commands/sync.d.ts +0 -24
  24. package/dist/commands/sync.d.ts.map +0 -1
  25. package/dist/commands/sync.js +0 -131
  26. package/dist/commands/sync.js.map +0 -1
  27. package/dist/commands/watch.d.ts +0 -18
  28. package/dist/commands/watch.d.ts.map +0 -1
  29. package/dist/commands/watch.js +0 -71
  30. package/dist/commands/watch.js.map +0 -1
  31. package/dist/config/config-internals/args.d.ts +0 -11
  32. package/dist/config/config-internals/args.d.ts.map +0 -1
  33. package/dist/config/config-internals/args.js +0 -22
  34. package/dist/config/config-internals/args.js.map +0 -1
  35. package/dist/config/config-internals/env.d.ts +0 -10
  36. package/dist/config/config-internals/env.d.ts.map +0 -1
  37. package/dist/config/config-internals/env.js +0 -35
  38. package/dist/config/config-internals/env.js.map +0 -1
  39. package/dist/config/config-internals/file.d.ts +0 -11
  40. package/dist/config/config-internals/file.d.ts.map +0 -1
  41. package/dist/config/config-internals/file.js +0 -28
  42. package/dist/config/config-internals/file.js.map +0 -1
  43. package/dist/config/config-internals/resolve.d.ts +0 -21
  44. package/dist/config/config-internals/resolve.d.ts.map +0 -1
  45. package/dist/config/config-internals/resolve.js +0 -73
  46. package/dist/config/config-internals/resolve.js.map +0 -1
  47. package/dist/config/config-internals/root.d.ts +0 -9
  48. package/dist/config/config-internals/root.d.ts.map +0 -1
  49. package/dist/config/config-internals/root.js +0 -22
  50. package/dist/config/config-internals/root.js.map +0 -1
  51. package/dist/config/config-internals/types.d.ts +0 -91
  52. package/dist/config/config-internals/types.d.ts.map +0 -1
  53. package/dist/config/config-internals/types.js +0 -9
  54. package/dist/config/config-internals/types.js.map +0 -1
  55. package/dist/config/resolve-config.d.ts +0 -11
  56. package/dist/config/resolve-config.d.ts.map +0 -1
  57. package/dist/config/resolve-config.js +0 -10
  58. package/dist/config/resolve-config.js.map +0 -1
  59. package/dist/core/api-internals/helpers.d.ts +0 -9
  60. package/dist/core/api-internals/helpers.d.ts.map +0 -1
  61. package/dist/core/api-internals/helpers.js +0 -14
  62. package/dist/core/api-internals/helpers.js.map +0 -1
  63. package/dist/core/api-internals/pull.d.ts +0 -19
  64. package/dist/core/api-internals/pull.d.ts.map +0 -1
  65. package/dist/core/api-internals/pull.js +0 -269
  66. package/dist/core/api-internals/pull.js.map +0 -1
  67. package/dist/core/api-internals/route-config.d.ts +0 -13
  68. package/dist/core/api-internals/route-config.d.ts.map +0 -1
  69. package/dist/core/api-internals/route-config.js +0 -34
  70. package/dist/core/api-internals/route-config.js.map +0 -1
  71. package/dist/core/api-internals/sync.d.ts +0 -19
  72. package/dist/core/api-internals/sync.d.ts.map +0 -1
  73. package/dist/core/api-internals/sync.js +0 -139
  74. package/dist/core/api-internals/sync.js.map +0 -1
  75. package/dist/core/api-internals/types.d.ts +0 -33
  76. package/dist/core/api-internals/types.d.ts.map +0 -1
  77. package/dist/core/api-internals/types.js +0 -5
  78. package/dist/core/api-internals/types.js.map +0 -1
  79. package/dist/core/api.d.ts +0 -11
  80. package/dist/core/api.d.ts.map +0 -1
  81. package/dist/core/api.js +0 -11
  82. package/dist/core/api.js.map +0 -1
  83. package/dist/core/cache-internals/format.d.ts +0 -20
  84. package/dist/core/cache-internals/format.d.ts.map +0 -1
  85. package/dist/core/cache-internals/format.js +0 -33
  86. package/dist/core/cache-internals/format.js.map +0 -1
  87. package/dist/core/cache-internals/params.d.ts +0 -33
  88. package/dist/core/cache-internals/params.d.ts.map +0 -1
  89. package/dist/core/cache-internals/params.js +0 -155
  90. package/dist/core/cache-internals/params.js.map +0 -1
  91. package/dist/core/cache-internals/pull.d.ts +0 -17
  92. package/dist/core/cache-internals/pull.d.ts.map +0 -1
  93. package/dist/core/cache-internals/pull.js +0 -34
  94. package/dist/core/cache-internals/pull.js.map +0 -1
  95. package/dist/core/cache-internals/sync.d.ts +0 -29
  96. package/dist/core/cache-internals/sync.d.ts.map +0 -1
  97. package/dist/core/cache-internals/sync.js +0 -104
  98. package/dist/core/cache-internals/sync.js.map +0 -1
  99. package/dist/core/cache-internals/types.d.ts +0 -48
  100. package/dist/core/cache-internals/types.d.ts.map +0 -1
  101. package/dist/core/cache-internals/types.js +0 -2
  102. package/dist/core/cache-internals/types.js.map +0 -1
  103. package/dist/core/cache.d.ts +0 -13
  104. package/dist/core/cache.d.ts.map +0 -1
  105. package/dist/core/cache.js +0 -33
  106. package/dist/core/cache.js.map +0 -1
  107. package/dist/core/scanner-internals/ast.d.ts +0 -40
  108. package/dist/core/scanner-internals/ast.d.ts.map +0 -1
  109. package/dist/core/scanner-internals/ast.js +0 -100
  110. package/dist/core/scanner-internals/ast.js.map +0 -1
  111. package/dist/core/scanner-internals/file-walker.d.ts +0 -10
  112. package/dist/core/scanner-internals/file-walker.d.ts.map +0 -1
  113. package/dist/core/scanner-internals/file-walker.js +0 -23
  114. package/dist/core/scanner-internals/file-walker.js.map +0 -1
  115. package/dist/core/scanner-internals/import-resolver.d.ts +0 -21
  116. package/dist/core/scanner-internals/import-resolver.d.ts.map +0 -1
  117. package/dist/core/scanner-internals/import-resolver.js +0 -119
  118. package/dist/core/scanner-internals/import-resolver.js.map +0 -1
  119. package/dist/core/scanner-internals/key-extractor.d.ts +0 -20
  120. package/dist/core/scanner-internals/key-extractor.d.ts.map +0 -1
  121. package/dist/core/scanner-internals/key-extractor.js +0 -274
  122. package/dist/core/scanner-internals/key-extractor.js.map +0 -1
  123. package/dist/core/scanner-internals/nav-config-scanner.d.ts +0 -30
  124. package/dist/core/scanner-internals/nav-config-scanner.d.ts.map +0 -1
  125. package/dist/core/scanner-internals/nav-config-scanner.js +0 -170
  126. package/dist/core/scanner-internals/nav-config-scanner.js.map +0 -1
  127. package/dist/core/scanner-internals/route-detector.d.ts +0 -27
  128. package/dist/core/scanner-internals/route-detector.d.ts.map +0 -1
  129. package/dist/core/scanner-internals/route-detector.js +0 -78
  130. package/dist/core/scanner-internals/route-detector.js.map +0 -1
  131. package/dist/core/scanner-internals/types.d.ts +0 -60
  132. package/dist/core/scanner-internals/types.d.ts.map +0 -1
  133. package/dist/core/scanner-internals/types.js +0 -29
  134. package/dist/core/scanner-internals/types.js.map +0 -1
  135. package/dist/core/scanner.d.ts +0 -21
  136. package/dist/core/scanner.d.ts.map +0 -1
  137. package/dist/core/scanner.js +0 -162
  138. package/dist/core/scanner.js.map +0 -1
  139. package/dist/index.d.ts +0 -3
  140. package/dist/index.d.ts.map +0 -1
  141. package/dist/index.js +0 -3
  142. package/dist/index.js.map +0 -1
  143. package/dist/next.d.ts +0 -33
  144. package/dist/next.d.ts.map +0 -1
  145. package/dist/next.js +0 -110
  146. package/dist/next.js.map +0 -1
  147. package/dist/preview/index.d.ts +0 -39
  148. package/dist/preview/index.d.ts.map +0 -1
  149. package/dist/preview/index.js +0 -123
  150. package/dist/preview/index.js.map +0 -1
  151. package/dist/preview/internals/highlight.d.ts +0 -31
  152. package/dist/preview/internals/highlight.d.ts.map +0 -1
  153. package/dist/preview/internals/highlight.js +0 -184
  154. package/dist/preview/internals/highlight.js.map +0 -1
  155. package/dist/preview/internals/interactions.d.ts +0 -15
  156. package/dist/preview/internals/interactions.d.ts.map +0 -1
  157. package/dist/preview/internals/interactions.js +0 -38
  158. package/dist/preview/internals/interactions.js.map +0 -1
  159. package/dist/preview/internals/interactive.d.ts +0 -14
  160. package/dist/preview/internals/interactive.d.ts.map +0 -1
  161. package/dist/preview/internals/interactive.js +0 -122
  162. package/dist/preview/internals/interactive.js.map +0 -1
  163. package/dist/preview/internals/locales.d.ts +0 -9
  164. package/dist/preview/internals/locales.d.ts.map +0 -1
  165. package/dist/preview/internals/locales.js +0 -24
  166. package/dist/preview/internals/locales.js.map +0 -1
  167. package/dist/preview/internals/state.d.ts +0 -37
  168. package/dist/preview/internals/state.d.ts.map +0 -1
  169. package/dist/preview/internals/state.js +0 -74
  170. package/dist/preview/internals/state.js.map +0 -1
  171. package/dist/preview/internals/styles.d.ts +0 -8
  172. package/dist/preview/internals/styles.d.ts.map +0 -1
  173. package/dist/preview/internals/styles.js +0 -28
  174. package/dist/preview/internals/styles.js.map +0 -1
  175. package/dist/preview/internals/types.d.ts +0 -74
  176. package/dist/preview/internals/types.d.ts.map +0 -1
  177. package/dist/preview/internals/types.js +0 -5
  178. package/dist/preview/internals/types.js.map +0 -1
  179. package/dist/preview/internals/ui-indicators.d.ts +0 -15
  180. package/dist/preview/internals/ui-indicators.d.ts.map +0 -1
  181. package/dist/preview/internals/ui-indicators.js +0 -92
  182. package/dist/preview/internals/ui-indicators.js.map +0 -1
  183. package/dist/scaffold/index.d.ts +0 -3
  184. package/dist/scaffold/index.d.ts.map +0 -1
  185. package/dist/scaffold/index.js +0 -3
  186. package/dist/scaffold/index.js.map +0 -1
  187. package/dist/scaffold/intenrals/scaffold.d.ts +0 -24
  188. package/dist/scaffold/intenrals/scaffold.d.ts.map +0 -1
  189. package/dist/scaffold/intenrals/scaffold.js +0 -53
  190. package/dist/scaffold/intenrals/scaffold.js.map +0 -1
  191. package/dist/scaffold/intenrals/templates.d.ts +0 -10
  192. package/dist/scaffold/intenrals/templates.d.ts.map +0 -1
  193. package/dist/scaffold/intenrals/templates.js +0 -344
  194. package/dist/scaffold/intenrals/templates.js.map +0 -1
  195. package/dist/scaffold/intenrals/types.d.ts +0 -14
  196. package/dist/scaffold/intenrals/types.d.ts.map +0 -1
  197. package/dist/scaffold/intenrals/types.js +0 -5
  198. package/dist/scaffold/intenrals/types.js.map +0 -1
package/dist/bin.js DELETED
@@ -1,208 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * sync-translations CLI
4
- *
5
- * Subcommands:
6
- * sync (default) Scan codebase and sync translation keys to the CMS.
7
- * pull Fetch translations from CMS and write local JSON files.
8
- * status Show what would change on next sync (no network calls).
9
- * watch Watch for file changes and auto-sync on save.
10
- * init Interactive setup — creates .translationsrc.json.
11
- *
12
- * Usage:
13
- * sync-translations # sync keys + pull
14
- * sync-translations sync --dry-run # preview changes only
15
- * sync-translations sync --report scan.json # write JSON report
16
- * sync-translations pull --output ./locales # custom output dir
17
- * sync-translations pull --force # ignore TTL cache
18
- * sync-translations pull --env staging # pull staging env
19
- * sync-translations pull --ttl 600000 # custom TTL (ms)
20
- * sync-translations status # diff vs last sync cache
21
- * sync-translations watch # watch + auto-sync
22
- * sync-translations init # interactive setup
23
- */
24
- import path from 'path';
25
- import fs from 'fs';
26
- import { resolveConfig, resolveRouteParams, findProjectRoot, loadConfigFile, } from './config/resolve-config.js';
27
- import { fetchRouteParams } from './core/api.js';
28
- import { runStatus } from './commands/status.js';
29
- import { runWatch } from './commands/watch.js';
30
- import { runInit } from './commands/init.js';
31
- import { runPull } from './commands/pull.js';
32
- import { runSync } from './commands/sync.js';
33
- // ---------------------------------------------------------------------------
34
- // Helpers
35
- // ---------------------------------------------------------------------------
36
- function stripJsonComments(input) {
37
- let result = '';
38
- let i = 0;
39
- while (i < input.length) {
40
- // --- String literal: copy char-by-char, respecting escape sequences ---
41
- if (input[i] === '"') {
42
- result += '"';
43
- i++;
44
- while (i < input.length) {
45
- const ch = input[i];
46
- result += ch;
47
- i++;
48
- if (ch === '\\') {
49
- // Escaped character — copy next char unconditionally
50
- if (i < input.length)
51
- result += input[i++];
52
- }
53
- else if (ch === '"') {
54
- break; // closing quote
55
- }
56
- }
57
- continue;
58
- }
59
- // --- Line comment: skip everything up to the newline ---
60
- if (input[i] === '/' && input[i + 1] === '/') {
61
- while (i < input.length && input[i] !== '\n')
62
- i++;
63
- continue;
64
- }
65
- // --- Block comment: skip until closing */ ---
66
- if (input[i] === '/' && input[i + 1] === '*') {
67
- i += 2;
68
- while (i < input.length) {
69
- if (input[i] === '*' && input[i + 1] === '/') {
70
- i += 2;
71
- break;
72
- }
73
- i++;
74
- }
75
- continue;
76
- }
77
- result += input[i++];
78
- }
79
- return result;
80
- }
81
- /**
82
- * Load TypeScript path alias mappings from `tsconfig.json` at the project root.
83
- *
84
- * These mappings are passed to the scanner so that aliased imports such as
85
- * `@/components/button` can be resolved to absolute file paths. tsconfig
86
- * files are JSONC (JSON with comments) so we strip comments before parsing.
87
- *
88
- * Returns null when tsconfig.json is absent, unreadable, or has no `paths`.
89
- */
90
- function loadTsConfigPathMappings(root) {
91
- const tsconfigPath = path.join(root, 'tsconfig.json');
92
- if (!fs.existsSync(tsconfigPath))
93
- return null;
94
- try {
95
- const cleaned = stripJsonComments(fs.readFileSync(tsconfigPath, 'utf-8'));
96
- const tsconfig = JSON.parse(cleaned);
97
- // Drill into compilerOptions.paths — guard each level against unexpected shapes
98
- if (typeof tsconfig !== 'object' || tsconfig === null)
99
- return null;
100
- if (!('compilerOptions' in tsconfig))
101
- return null;
102
- const opts = tsconfig.compilerOptions;
103
- if (typeof opts !== 'object' || opts === null)
104
- return null;
105
- if (!('paths' in opts))
106
- return null;
107
- const paths = opts.paths;
108
- if (typeof paths === 'object' && paths !== null)
109
- return paths;
110
- }
111
- catch {
112
- // Silently ignore tsconfig parse errors — scanning continues without alias resolution
113
- }
114
- return null;
115
- }
116
- /** Return the value that follows `flag` in `args`, or undefined if absent. */
117
- function getFlag(args, flag) {
118
- const idx = args.indexOf(flag);
119
- return idx !== -1 && args[idx + 1] ? args[idx + 1] : undefined;
120
- }
121
- /** Return true when any of the given flag strings is present in `args`. */
122
- function hasFlag(args, ...flags) {
123
- return flags.some(f => args.includes(f));
124
- }
125
- // ---------------------------------------------------------------------------
126
- // Main
127
- // ---------------------------------------------------------------------------
128
- /** All valid subcommand names. Used for validation and dispatch. */
129
- const SUBCOMMANDS = new Set(['sync', 'pull', 'status', 'watch', 'init']);
130
- /**
131
- * CLI entry point.
132
- *
133
- * Resolves config, loads tsconfig path mappings, and dispatches to the
134
- * appropriate command handler. Config resolution and scanner setup are shared
135
- * across all commands except `init` (which runs before a config file exists).
136
- */
137
- async function main() {
138
- const args = process.argv.slice(2);
139
- // First non-flag argument is the subcommand; default to 'sync' when omitted
140
- const subcommand = args.find(a => !a.startsWith('-')) ?? 'sync';
141
- if (!SUBCOMMANDS.has(subcommand)) {
142
- // eslint-disable-next-line no-console
143
- console.error(`Unknown subcommand: ${subcommand}`);
144
- // eslint-disable-next-line no-console
145
- console.error(`Available: ${[...SUBCOMMANDS].join(', ')}`);
146
- process.exit(1);
147
- }
148
- const root = findProjectRoot();
149
- const fileConfig = loadConfigFile(root);
150
- // `init` runs before a config file exists, so it short-circuits here
151
- if (subcommand === 'init') {
152
- await runInit(root);
153
- return;
154
- }
155
- const config = resolveConfig(root, fileConfig);
156
- // Path mappings let the scanner resolve aliased imports (e.g. @/components/…)
157
- const pathMappings = loadTsConfigPathMappings(root);
158
- // Route params from the CMS are merged with locally configured params;
159
- // skip the network call for `pull` since it doesn't scan the codebase
160
- let cmsRouteParams = {};
161
- if (subcommand !== 'pull') {
162
- cmsRouteParams = await fetchRouteParams(config);
163
- }
164
- // User-defined params (from config) take precedence over CMS-generated ones
165
- const allRouteParams = resolveRouteParams(root, fileConfig);
166
- const scanOpts = {
167
- excludedDirs: fileConfig.excludedDirs,
168
- sourceExtensions: fileConfig.sourceExtensions,
169
- routeParams: { ...cmsRouteParams, ...allRouteParams },
170
- pathMappings: pathMappings ?? undefined,
171
- projectRoot: root,
172
- includeNavRoutes: fileConfig.includeNavRoutes,
173
- };
174
- if (subcommand === 'status') {
175
- runStatus(root, scanOpts);
176
- return;
177
- }
178
- if (subcommand === 'watch') {
179
- const outputDir = fileConfig.outputDir ?? path.join(root, 'public', 'locales');
180
- await runWatch(root, config, outputDir, scanOpts);
181
- return;
182
- }
183
- if (subcommand === 'pull') {
184
- await runPull(root, config, fileConfig, args);
185
- return;
186
- }
187
- // --- sync (default) ---
188
- const outputDir = fileConfig.outputDir ?? path.join(root, 'public', 'locales');
189
- const reportArg = getFlag(args, '--report');
190
- await runSync(root, config, scanOpts, {
191
- outputDir,
192
- dryRun: hasFlag(args, '--dry-run'),
193
- force: hasFlag(args, '--force'),
194
- // Resolve report path relative to project root when not absolute
195
- reportPath: reportArg
196
- ? path.isAbsolute(reportArg)
197
- ? reportArg
198
- : path.join(root, reportArg)
199
- : undefined,
200
- mockDataPath: fileConfig.mockDataPath,
201
- userRouteParams: fileConfig.routeParams,
202
- });
203
- }
204
- main().catch(err => {
205
- process.stderr.write(`${err instanceof Error ? (err.stack ?? err.message) : String(err)}\n`);
206
- process.exit(1);
207
- });
208
- //# sourceMappingURL=bin.js.map
package/dist/bin.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EACH,aAAa,EACb,kBAAkB,EAClB,eAAe,EACf,cAAc,GACjB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C,8EAA8E;AAC9E,UAAU;AACV,8EAA8E;AAE9E,SAAS,iBAAiB,CAAC,KAAa;IACpC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QACtB,yEAAyE;QACzE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,CAAC;YACd,CAAC,EAAE,CAAC;YACJ,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBACtB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACpB,MAAM,IAAI,EAAE,CAAC;gBACb,CAAC,EAAE,CAAC;gBACJ,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;oBACd,qDAAqD;oBACrD,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM;wBAAE,MAAM,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;gBAC/C,CAAC;qBAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;oBACpB,MAAM,CAAC,gBAAgB;gBAC3B,CAAC;YACL,CAAC;YACD,SAAS;QACb,CAAC;QAED,0DAA0D;QAC1D,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC3C,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI;gBAAE,CAAC,EAAE,CAAC;YAClD,SAAS;QACb,CAAC;QAED,+CAA+C;QAC/C,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC3C,CAAC,IAAI,CAAC,CAAC;YACP,OAAO,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;gBACtB,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;oBAC3C,CAAC,IAAI,CAAC,CAAC;oBACP,MAAM;gBACV,CAAC;gBACD,CAAC,EAAE,CAAC;YACR,CAAC;YACD,SAAS;QACb,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;;;;;GAQG;AACH,SAAS,wBAAwB,CAC7B,IAAY;IAEZ,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IACtD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;QAAE,OAAO,IAAI,CAAC;IAE9C,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,iBAAiB,CAC7B,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CACzC,CAAC;QACF,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,CAAC;QAEhD,gFAAgF;QAChF,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACnE,IAAI,CAAC,CAAC,iBAAiB,IAAI,QAAQ,CAAC;YAAE,OAAO,IAAI,CAAC;QAElD,MAAM,IAAI,GAAI,QAAoC,CAAC,eAAe,CAAC;QACnE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC3D,IAAI,CAAC,CAAC,OAAO,IAAI,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QAEpC,MAAM,KAAK,GAAI,IAAgC,CAAC,KAAK,CAAC;QACtD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAC3C,OAAO,KAAiC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACL,sFAAsF;IAC1F,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,SAAS,OAAO,CAAC,IAAc,EAAE,IAAY;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC;AAED,2EAA2E;AAC3E,SAAS,OAAO,CAAC,IAAc,EAAE,GAAG,KAAe;IAC/C,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7C,CAAC;AAED,8EAA8E;AAC9E,OAAO;AACP,8EAA8E;AAE9E,oEAAoE;AACpE,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAEzE;;;;;;GAMG;AACH,KAAK,UAAU,IAAI;IACf,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACnC,4EAA4E;IAC5E,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC;IAEhE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;QACnD,sCAAsC;QACtC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,GAAG,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAExC,qEAAqE;IACrE,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QACxB,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO;IACX,CAAC;IAED,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC/C,8EAA8E;IAC9E,MAAM,YAAY,GAAG,wBAAwB,CAAC,IAAI,CAAC,CAAC;IAEpD,uEAAuE;IACvE,sEAAsE;IACtE,IAAI,cAAc,GAA2C,EAAE,CAAC;IAChE,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QACxB,cAAc,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IAED,4EAA4E;IAC5E,MAAM,cAAc,GAAG,kBAAkB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAE5D,MAAM,QAAQ,GAAgB;QAC1B,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;QAC7C,WAAW,EAAE,EAAE,GAAG,cAAc,EAAE,GAAG,cAAc,EAAE;QACrD,YAAY,EAAE,YAAY,IAAI,SAAS;QACvC,WAAW,EAAE,IAAI;QACjB,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;KAChD,CAAC;IAEF,IAAI,UAAU,KAAK,QAAQ,EAAE,CAAC;QAC1B,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC1B,OAAO;IACX,CAAC;IAED,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,SAAS,GACX,UAAU,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;QACjE,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;QAClD,OAAO;IACX,CAAC;IAED,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;QACxB,MAAM,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;QAC9C,OAAO;IACX,CAAC;IAED,yBAAyB;IACzB,MAAM,SAAS,GACX,UAAU,CAAC,SAAS,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACjE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAE5C,MAAM,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE;QAClC,SAAS;QACT,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC;QAClC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;QAC/B,iEAAiE;QACjE,UAAU,EAAE,SAAS;YACjB,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;gBACxB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC;YAChC,CAAC,CAAC,SAAS;QACf,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,eAAe,EAAE,UAAU,CAAC,WAAW;KAC1C,CAAC,CAAC;AACP,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;IACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAChB,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CACzE,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpB,CAAC,CAAC,CAAC"}
@@ -1,10 +0,0 @@
1
- /**
2
- * Interactive `init` command.
3
- *
4
- * Walks the user through a series of prompts and writes a
5
- * `.translationsrc.json` config file to the project root.
6
- * Optionally scaffolds the i18n boilerplate files (settings,
7
- * client, server, provider) into the chosen i18n directory.
8
- */
9
- export declare function runInit(root: string): Promise<void>;
10
- //# sourceMappingURL=init.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgGzD"}
@@ -1,89 +0,0 @@
1
- import path from 'path';
2
- import fs from 'fs';
3
- import { scaffoldI18n } from '../scaffold/index.js';
4
- /**
5
- * Interactive `init` command.
6
- *
7
- * Walks the user through a series of prompts and writes a
8
- * `.translationsrc.json` config file to the project root.
9
- * Optionally scaffolds the i18n boilerplate files (settings,
10
- * client, server, provider) into the chosen i18n directory.
11
- */
12
- export async function runInit(root) {
13
- const { createInterface } = await import('readline');
14
- // Use readline so we can show prompts and read answers synchronously one by one
15
- const rl = createInterface({
16
- input: process.stdin,
17
- output: process.stdout,
18
- });
19
- const question = (prompt) => new Promise(resolve => rl.question(prompt, resolve));
20
- // eslint-disable-next-line no-console
21
- console.log('sync-translations init\n');
22
- // eslint-disable-next-line no-console
23
- console.log('This creates .translationsrc.json in your project root.');
24
- // eslint-disable-next-line no-console
25
- console.log('Values here override env vars for the sync-translations CLI.\n');
26
- // Collect required config values from the user
27
- const cmsUrl = await question('CMS URL (e.g. https://cms.example.com): ');
28
- const projectId = await question('Project ID: ');
29
- const apiKey = await question('API key: ');
30
- const i18nDirInput = await question('i18n directory [./src/lib/i18n]: ');
31
- const pullTtlInput = await question('Pull TTL in seconds [300]: ');
32
- const scaffoldInput = await question('Scaffold i18n files (settings, client, server, provider)? [Y/n]: ');
33
- rl.close();
34
- // Apply defaults for optional fields
35
- const i18nDir = i18nDirInput.trim() || './src/lib/i18n';
36
- // Dictionaries live one level deeper than the i18n dir
37
- const outputDir = `${i18nDir.replace(/\/$/, '')}/dictionaries`;
38
- // Build the config object — only include keys that the user actually provided
39
- const config = {
40
- $schema: './node_modules/@translation-cms/sync/schema.json',
41
- };
42
- if (cmsUrl.trim())
43
- config['cmsUrl'] = cmsUrl.trim();
44
- if (projectId.trim())
45
- config['projectId'] = projectId.trim();
46
- if (apiKey.trim())
47
- config['apiKey'] = apiKey.trim();
48
- config['outputDir'] = outputDir;
49
- if (pullTtlInput.trim()) {
50
- const ttlSec = parseInt(pullTtlInput.trim(), 10);
51
- // Convert seconds → milliseconds for the config field
52
- if (!isNaN(ttlSec))
53
- config['pullTtlMs'] = ttlSec * 1000;
54
- }
55
- // Write the config file
56
- const configPath = path.join(root, '.translationsrc.json');
57
- fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
58
- console.log(`\nCreated: ${configPath}`);
59
- // Warn if an API key was written to disk — it should ideally stay in .env.local
60
- if (config['apiKey']) {
61
- console.log('\nWarning: .translationsrc.json contains an API key. Consider adding it to .gitignore:');
62
- console.log(' echo ".translationsrc.json" >> .gitignore');
63
- console.log('Or move the API key to CMS_SYNC_API_KEY in .env.local instead.');
64
- }
65
- // Default to scaffolding unless the user explicitly answers "n"
66
- const doScaffold = scaffoldInput.trim().toLowerCase() !== 'n';
67
- if (doScaffold) {
68
- const absI18nDir = path.isAbsolute(i18nDir)
69
- ? i18nDir
70
- : path.resolve(root, i18nDir);
71
- const { written, skipped } = scaffoldI18n({ i18nDir: absI18nDir });
72
- if (written.length > 0) {
73
- console.log('\nScaffolded i18n files:');
74
- for (const f of written)
75
- console.log(` + src/lib/i18n/${f}`);
76
- }
77
- if (skipped.length > 0) {
78
- // Files that already exist are left untouched to avoid overwriting customizations
79
- console.log('\nSkipped (already exist):');
80
- for (const f of skipped)
81
- console.log(` ~ src/lib/i18n/${f}`);
82
- }
83
- console.log('\nNext steps:');
84
- console.log(' 1. Install peer deps: pnpm add i18next react-i18next i18next-resources-to-backend');
85
- console.log(' 2. Pull translations: sync-translations pull');
86
- console.log(' 3. Wrap your root layout with <TranslationProvider locale={locale}>');
87
- }
88
- }
89
- //# sourceMappingURL=init.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -1,10 +0,0 @@
1
- import type { Config, TranslationsConfig } from '../config/resolve-config.js';
2
- /**
3
- * `pull` command — fetches published translations from the CMS and writes
4
- * them as JSON dictionary files to the output directory.
5
- *
6
- * Resolution order for each option:
7
- * CLI flag > .translationsrc.json > built-in default
8
- */
9
- export declare function runPull(root: string, config: Config, fileConfig: TranslationsConfig, args: string[]): Promise<void>;
10
- //# sourceMappingURL=pull.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAG9E;;;;;;GAMG;AACH,wBAAsB,OAAO,CACzB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,kBAAkB,EAC9B,IAAI,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,IAAI,CAAC,CAiBf"}
@@ -1,35 +0,0 @@
1
- import path from 'path';
2
- import { pullTranslations } from '../core/api.js';
3
- /**
4
- * `pull` command — fetches published translations from the CMS and writes
5
- * them as JSON dictionary files to the output directory.
6
- *
7
- * Resolution order for each option:
8
- * CLI flag > .translationsrc.json > built-in default
9
- */
10
- export async function runPull(root, config, fileConfig, args) {
11
- // --output overrides the config file value; fall back to public/locales
12
- const outputArg = getFlag(args, '--output');
13
- const outputDir = outputArg
14
- ? path.resolve(root, outputArg)
15
- : fileConfig.outputDir
16
- ? path.resolve(root, fileConfig.outputDir)
17
- : path.join(root, 'public', 'locales');
18
- // --ttl overrides the config file value (already in ms)
19
- const ttlArg = getFlag(args, '--ttl');
20
- await pullTranslations(config, {
21
- outputDir,
22
- force: args.includes('--force'), // skip TTL cache check and always re-fetch
23
- ttlMs: ttlArg ? parseInt(ttlArg, 10) : fileConfig.pullTtlMs,
24
- env: getFlag(args, '--env'), // target a specific environment (e.g. staging)
25
- });
26
- }
27
- /**
28
- * Returns the value of a named CLI flag (`--flag value`),
29
- * or `undefined` if the flag is absent or has no value after it.
30
- */
31
- function getFlag(args, flag) {
32
- const idx = args.indexOf(flag);
33
- return idx !== -1 && args[idx + 1] ? args[idx + 1] : undefined;
34
- }
35
- //# sourceMappingURL=pull.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/commands/pull.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAElD;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CACzB,IAAY,EACZ,MAAc,EACd,UAA8B,EAC9B,IAAc;IAEd,wEAAwE;IACxE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAC5C,MAAM,SAAS,GAAG,SAAS;QACvB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,CAAC;QAC/B,CAAC,CAAC,UAAU,CAAC,SAAS;YACpB,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,SAAS,CAAC;YAC1C,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAE7C,wDAAwD;IACxD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,MAAM,gBAAgB,CAAC,MAAM,EAAE;QAC3B,SAAS;QACT,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,2CAA2C;QAC5E,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS;QAC3D,GAAG,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,+CAA+C;KAC/E,CAAC,CAAC;AACP,CAAC;AAED;;;GAGG;AACH,SAAS,OAAO,CAAC,IAAc,EAAE,IAAY;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,GAAG,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACnE,CAAC"}
@@ -1,15 +0,0 @@
1
- import { type ScanOptions } from '../core/scanner.js';
2
- /**
3
- * `status` command — scans the project for translation keys and compares
4
- * the result against the last sync cache (.cms-sync-cache.json).
5
- *
6
- * Outputs a human-readable diff showing:
7
- * + keys that are new since the last sync
8
- * - keys that have been removed
9
- * ~ keys whose preview routes have changed
10
- * = keys that are unchanged
11
- *
12
- * Does not write anything — safe to run at any time.
13
- */
14
- export declare function runStatus(root: string, scanOpts: ScanOptions): void;
15
- //# sourceMappingURL=status.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAQnE;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI,CA8DnE"}
@@ -1,62 +0,0 @@
1
- import { scanProject } from '../core/scanner.js';
2
- import { serializeNamespaces, loadSyncCache, computeDiff, formatPreviewRoutes, } from '../core/cache.js';
3
- /**
4
- * `status` command — scans the project for translation keys and compares
5
- * the result against the last sync cache (.cms-sync-cache.json).
6
- *
7
- * Outputs a human-readable diff showing:
8
- * + keys that are new since the last sync
9
- * - keys that have been removed
10
- * ~ keys whose preview routes have changed
11
- * = keys that are unchanged
12
- *
13
- * Does not write anything — safe to run at any time.
14
- */
15
- export function runStatus(root, scanOpts) {
16
- console.log(`Scanning project: ${root}`);
17
- const namespaces = scanProject(root, scanOpts);
18
- // Flatten the NamespaceMap into a plain serializable object and get the total key count
19
- const { serialized, totalKeys } = serializeNamespaces(namespaces);
20
- const namespaceCount = Object.keys(serialized).length;
21
- console.log(`\nFound ${totalKeys} key(s) across ${namespaceCount} namespace(s): ${Object.keys(serialized).join(', ')}`);
22
- // Load the baseline written by the last successful sync
23
- const cached = loadSyncCache(root);
24
- if (!cached) {
25
- console.log('\nNo sync cache found (.cms-sync-cache.json). Run sync first to establish a baseline.');
26
- return;
27
- }
28
- // Diff current scan against the cached snapshot
29
- const diff = computeDiff(serialized, cached);
30
- console.log('\nStatus vs last sync:');
31
- console.log(` + ${diff.added.length} new key(s)`);
32
- console.log(` - ${diff.removed.length} removed key(s)`);
33
- console.log(` ~ ${diff.routesChanged.length} route update(s)`);
34
- console.log(` = ${diff.unchanged} unchanged`);
35
- if (diff.added.length > 0) {
36
- console.log('\nNew keys:');
37
- for (const { namespace, key, routes } of diff.added) {
38
- console.log(` + ${namespace}:${key} (${formatPreviewRoutes(routes)})`);
39
- }
40
- }
41
- if (diff.removed.length > 0) {
42
- console.log('\nRemoved keys:');
43
- for (const { namespace, key } of diff.removed) {
44
- console.log(` - ${namespace}:${key}`);
45
- }
46
- }
47
- if (diff.routesChanged.length > 0) {
48
- console.log('\nRoute updates:');
49
- for (const { namespace, key, before, after } of diff.routesChanged) {
50
- console.log(` ~ ${namespace}:${key} [${formatPreviewRoutes(before)}] -> [${formatPreviewRoutes(after)}]`);
51
- }
52
- }
53
- // Only prompt to sync if there are actual changes
54
- const total = diff.added.length + diff.removed.length + diff.routesChanged.length;
55
- if (total > 0) {
56
- console.log('\nRun "sync-translations sync" to push these changes.');
57
- }
58
- else {
59
- console.log('\nEverything is in sync.');
60
- }
61
- }
62
- //# sourceMappingURL=status.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- import type { Config } from '../config/resolve-config.js';
2
- import { type ScanOptions } from '../core/scanner.js';
3
- export interface SyncCommandOptions {
4
- outputDir: string;
5
- dryRun: boolean;
6
- force: boolean;
7
- reportPath?: string;
8
- /** Path (relative to root) for the generated mock-params TS file. */
9
- mockDataPath?: string;
10
- /** User-configured route params from config file (merged into mock data). */
11
- userRouteParams?: Record<string, Record<string, string>>;
12
- }
13
- /**
14
- * `sync` command — the main push/pull cycle:
15
- *
16
- * 1. Scan the project for translation keys and their preview routes.
17
- * 2. Auto-generate mock route params for any dynamic routes (e.g. /[slug]).
18
- * If a mockDataPath is configured, write a TS file with the merged params
19
- * so the CMS can render live previews.
20
- * 3. POST the discovered keys to the CMS (dry-run: report only, no writes).
21
- * 4. Pull the latest published translations back to disk (skipped on dry-run).
22
- */
23
- export declare function runSync(root: string, config: Config, scanOpts: ScanOptions, opts: SyncCommandOptions): Promise<void>;
24
- //# sourceMappingURL=sync.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAe,KAAK,WAAW,EAAY,MAAM,oBAAoB,CAAC;AAQ7E,MAAM,WAAW,kBAAkB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,6EAA6E;IAC7E,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC5D;AAED;;;;;;;;;GASG;AACH,wBAAsB,OAAO,CACzB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,WAAW,EACrB,IAAI,EAAE,kBAAkB,GACzB,OAAO,CAAC,IAAI,CAAC,CA2Df"}
@@ -1,131 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- import { scanProject, routeKey } from '../core/scanner.js';
4
- import { postToSync, pullTranslations } from '../core/api.js';
5
- import { generateRouteParams, saveRouteParamsCache, writeMockDataFile, } from '../core/cache.js';
6
- /**
7
- * `sync` command — the main push/pull cycle:
8
- *
9
- * 1. Scan the project for translation keys and their preview routes.
10
- * 2. Auto-generate mock route params for any dynamic routes (e.g. /[slug]).
11
- * If a mockDataPath is configured, write a TS file with the merged params
12
- * so the CMS can render live previews.
13
- * 3. POST the discovered keys to the CMS (dry-run: report only, no writes).
14
- * 4. Pull the latest published translations back to disk (skipped on dry-run).
15
- */
16
- export async function runSync(root, config, scanOpts, opts) {
17
- console.log(`Scanning project: ${root}`);
18
- const namespaces = scanProject(root, scanOpts);
19
- // Collect every unique route string found across all keys so we can
20
- // generate placeholder params for dynamic segments (e.g. [slug], [id]).
21
- const detectedRoutes = new Set();
22
- for (const keyMap of Object.values(namespaces)) {
23
- for (const routes of keyMap.values()) {
24
- for (const route of routes) {
25
- // routeKey normalises PreviewRoute objects to plain strings
26
- const routeStr = routeKey(route);
27
- detectedRoutes.add(routeStr);
28
- }
29
- }
30
- }
31
- if (detectedRoutes.size > 0) {
32
- const autoParams = generateRouteParams(Array.from(detectedRoutes));
33
- if (Object.keys(autoParams).length > 0) {
34
- // Persist the auto-generated params to cache so subsequent scans
35
- // can reuse them without re-deriving them from scratch
36
- saveRouteParamsCache(root, autoParams);
37
- console.log(`[route-params] Auto-generated params for ${Object.keys(autoParams).length} dynamic routes`);
38
- if (opts.mockDataPath) {
39
- // Merge auto-generated with user-configured params (user wins on conflict)
40
- const merged = {
41
- ...autoParams,
42
- ...(opts.userRouteParams ?? {}),
43
- };
44
- writeMockDataFile(root, merged, opts.mockDataPath);
45
- }
46
- }
47
- }
48
- // Read local translation values from JSON files to bootstrap drafts in CMS.
49
- // Keys that already have a draft in the CMS are never overwritten.
50
- const localValues = readLocalValues(opts.outputDir);
51
- // Push discovered keys to the CMS; dry-run mode only prints a report
52
- await postToSync(config, namespaces, {
53
- root,
54
- force: opts.force,
55
- dryRun: opts.dryRun,
56
- reportPath: opts.reportPath,
57
- localValues,
58
- });
59
- // Pull translations back to disk after a successful push.
60
- // Skip when dry-running — there's nothing new to pull yet.
61
- if (!opts.dryRun) {
62
- await pullTranslations(config, {
63
- outputDir: opts.outputDir,
64
- force: opts.force,
65
- });
66
- }
67
- }
68
- /**
69
- * Flatten a nested object to dot-notation keys.
70
- * e.g. { button: { save: "Save" } } → { "button.save": "Save" }
71
- */
72
- function flattenObject(obj, prefix = '') {
73
- const result = {};
74
- for (const [key, value] of Object.entries(obj)) {
75
- const fullKey = prefix ? `${prefix}.${key}` : key;
76
- if (typeof value === 'string') {
77
- result[fullKey] = value;
78
- }
79
- else if (typeof value === 'object' && value !== null) {
80
- Object.assign(result, flattenObject(value, fullKey));
81
- }
82
- }
83
- return result;
84
- }
85
- /**
86
- * Read all `{locale}.json` files from outputDir and return a nested map:
87
- * namespace → translationKey → locale → value
88
- *
89
- * Local JSON files use the nested format written by `pull`:
90
- * { namespace: { "dot.notation.key": "value" } }
91
- */
92
- function readLocalValues(outputDir) {
93
- const result = {};
94
- if (!fs.existsSync(outputDir))
95
- return result;
96
- let files;
97
- try {
98
- files = fs
99
- .readdirSync(outputDir)
100
- .filter(f => f.endsWith('.json') && f !== '.last-pulled');
101
- }
102
- catch {
103
- return result;
104
- }
105
- for (const file of files) {
106
- const locale = file.replace('.json', '');
107
- try {
108
- const raw = fs.readFileSync(path.join(outputDir, file), 'utf-8');
109
- const content = JSON.parse(raw);
110
- for (const [namespace, keys] of Object.entries(content)) {
111
- if (typeof keys !== 'object' || keys === null)
112
- continue;
113
- const flat = flattenObject(keys);
114
- if (!result[namespace])
115
- result[namespace] = {};
116
- for (const [key, value] of Object.entries(flat)) {
117
- if (!value.trim())
118
- continue;
119
- if (!result[namespace][key])
120
- result[namespace][key] = {};
121
- result[namespace][key][locale] = value;
122
- }
123
- }
124
- }
125
- catch {
126
- // Skip malformed files silently
127
- }
128
- }
129
- return result;
130
- }
131
- //# sourceMappingURL=sync.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}