@translation-cms/sync 1.1.99 → 1.2.3

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 (161) hide show
  1. package/dist/bin.d.ts +25 -0
  2. package/dist/bin.d.ts.map +1 -0
  3. package/dist/bin.js +173 -0
  4. package/dist/bin.js.map +1 -0
  5. package/dist/commands/init.d.ts +2 -0
  6. package/dist/commands/init.d.ts.map +1 -0
  7. package/dist/commands/init.js +68 -0
  8. package/dist/commands/init.js.map +1 -0
  9. package/dist/commands/pull.d.ts +3 -0
  10. package/dist/commands/pull.d.ts.map +1 -0
  11. package/dist/commands/pull.js +22 -0
  12. package/dist/commands/pull.js.map +1 -0
  13. package/dist/commands/status.d.ts +3 -0
  14. package/dist/commands/status.d.ts.map +1 -0
  15. package/dist/commands/status.js +46 -0
  16. package/dist/commands/status.js.map +1 -0
  17. package/dist/commands/sync.d.ts +10 -0
  18. package/dist/commands/sync.d.ts.map +1 -0
  19. package/dist/commands/sync.js +20 -0
  20. package/dist/commands/sync.js.map +1 -0
  21. package/dist/commands/watch.d.ts +4 -0
  22. package/dist/commands/watch.d.ts.map +1 -0
  23. package/dist/commands/watch.js +51 -0
  24. package/dist/commands/watch.js.map +1 -0
  25. package/dist/{load-config.d.ts → config/resolve-config.d.ts} +13 -10
  26. package/dist/config/resolve-config.d.ts.map +1 -0
  27. package/dist/{resolve-config.js → config/resolve-config.js} +21 -0
  28. package/dist/config/resolve-config.js.map +1 -0
  29. package/dist/core/api-internals/helpers.d.ts +9 -0
  30. package/dist/core/api-internals/helpers.d.ts.map +1 -0
  31. package/dist/core/api-internals/helpers.js +14 -0
  32. package/dist/core/api-internals/helpers.js.map +1 -0
  33. package/dist/core/api-internals/pull.d.ts +11 -0
  34. package/dist/core/api-internals/pull.d.ts.map +1 -0
  35. package/dist/core/api-internals/pull.js +124 -0
  36. package/dist/core/api-internals/pull.js.map +1 -0
  37. package/dist/core/api-internals/route-config.d.ts +13 -0
  38. package/dist/core/api-internals/route-config.d.ts.map +1 -0
  39. package/dist/core/api-internals/route-config.js +34 -0
  40. package/dist/core/api-internals/route-config.js.map +1 -0
  41. package/dist/core/api-internals/sync.d.ts +12 -0
  42. package/dist/core/api-internals/sync.d.ts.map +1 -0
  43. package/dist/core/api-internals/sync.js +95 -0
  44. package/dist/core/api-internals/sync.js.map +1 -0
  45. package/dist/core/api-internals/types.d.ts +25 -0
  46. package/dist/core/api-internals/types.d.ts.map +1 -0
  47. package/dist/core/api-internals/types.js +5 -0
  48. package/dist/core/api-internals/types.js.map +1 -0
  49. package/dist/core/api.d.ts +11 -0
  50. package/dist/core/api.d.ts.map +1 -0
  51. package/dist/core/api.js +11 -0
  52. package/dist/core/api.js.map +1 -0
  53. package/dist/{sync.d.ts → core/cache.d.ts} +5 -25
  54. package/dist/core/cache.d.ts.map +1 -0
  55. package/dist/core/cache.js +143 -0
  56. package/dist/core/cache.js.map +1 -0
  57. package/dist/core/scanner-internals/ast.d.ts +22 -0
  58. package/dist/core/scanner-internals/ast.d.ts.map +1 -0
  59. package/dist/core/scanner-internals/ast.js +80 -0
  60. package/dist/core/scanner-internals/ast.js.map +1 -0
  61. package/dist/core/scanner-internals/file-walker.d.ts +9 -0
  62. package/dist/core/scanner-internals/file-walker.d.ts.map +1 -0
  63. package/dist/core/scanner-internals/file-walker.js +25 -0
  64. package/dist/core/scanner-internals/file-walker.js.map +1 -0
  65. package/dist/core/scanner-internals/import-resolver.d.ts +13 -0
  66. package/dist/core/scanner-internals/import-resolver.d.ts.map +1 -0
  67. package/dist/core/scanner-internals/import-resolver.js +124 -0
  68. package/dist/core/scanner-internals/import-resolver.js.map +1 -0
  69. package/dist/core/scanner-internals/key-extractor.d.ts +16 -0
  70. package/dist/core/scanner-internals/key-extractor.d.ts.map +1 -0
  71. package/dist/core/scanner-internals/key-extractor.js +168 -0
  72. package/dist/core/scanner-internals/key-extractor.js.map +1 -0
  73. package/dist/core/scanner-internals/route-detector.d.ts +19 -0
  74. package/dist/core/scanner-internals/route-detector.d.ts.map +1 -0
  75. package/dist/core/scanner-internals/route-detector.js +74 -0
  76. package/dist/core/scanner-internals/route-detector.js.map +1 -0
  77. package/dist/core/scanner-internals/types.d.ts +53 -0
  78. package/dist/core/scanner-internals/types.d.ts.map +1 -0
  79. package/dist/core/scanner-internals/types.js +29 -0
  80. package/dist/core/scanner-internals/types.js.map +1 -0
  81. package/dist/core/scanner.d.ts +20 -0
  82. package/dist/core/scanner.d.ts.map +1 -0
  83. package/dist/core/scanner.js +113 -0
  84. package/dist/core/scanner.js.map +1 -0
  85. package/dist/index.d.ts +2 -2
  86. package/dist/index.d.ts.map +1 -1
  87. package/dist/index.js +2 -2
  88. package/dist/index.js.map +1 -1
  89. package/dist/preview/index.d.ts +38 -0
  90. package/dist/preview/index.d.ts.map +1 -0
  91. package/dist/preview/index.js +114 -0
  92. package/dist/preview/index.js.map +1 -0
  93. package/dist/preview/internals/highlight.d.ts +22 -0
  94. package/dist/preview/internals/highlight.d.ts.map +1 -0
  95. package/dist/preview/internals/highlight.js +153 -0
  96. package/dist/preview/internals/highlight.js.map +1 -0
  97. package/dist/preview/internals/interactions.d.ts +15 -0
  98. package/dist/preview/internals/interactions.d.ts.map +1 -0
  99. package/dist/preview/internals/interactions.js +38 -0
  100. package/dist/preview/internals/interactions.js.map +1 -0
  101. package/dist/preview/internals/locales.d.ts +9 -0
  102. package/dist/preview/internals/locales.d.ts.map +1 -0
  103. package/dist/preview/internals/locales.js +24 -0
  104. package/dist/preview/internals/locales.js.map +1 -0
  105. package/dist/preview/internals/state.d.ts +35 -0
  106. package/dist/preview/internals/state.d.ts.map +1 -0
  107. package/dist/preview/internals/state.js +65 -0
  108. package/dist/preview/internals/state.js.map +1 -0
  109. package/dist/preview/internals/styles.d.ts +8 -0
  110. package/dist/preview/internals/styles.d.ts.map +1 -0
  111. package/dist/preview/internals/styles.js +28 -0
  112. package/dist/preview/internals/styles.js.map +1 -0
  113. package/dist/preview/internals/types.d.ts +49 -0
  114. package/dist/preview/internals/types.d.ts.map +1 -0
  115. package/dist/preview/internals/types.js +5 -0
  116. package/dist/preview/internals/types.js.map +1 -0
  117. package/dist/scaffold/index.d.ts +3 -0
  118. package/dist/scaffold/index.d.ts.map +1 -0
  119. package/dist/scaffold/index.js +3 -0
  120. package/dist/scaffold/index.js.map +1 -0
  121. package/dist/scaffold/intenrals/scaffold.d.ts +7 -0
  122. package/dist/scaffold/intenrals/scaffold.d.ts.map +1 -0
  123. package/dist/scaffold/intenrals/scaffold.js +34 -0
  124. package/dist/scaffold/intenrals/scaffold.js.map +1 -0
  125. package/dist/scaffold/intenrals/templates.d.ts +10 -0
  126. package/dist/scaffold/intenrals/templates.d.ts.map +1 -0
  127. package/dist/{scaffold.js → scaffold/intenrals/templates.js} +10 -38
  128. package/dist/scaffold/intenrals/templates.js.map +1 -0
  129. package/dist/{scaffold.d.ts → scaffold/intenrals/types.d.ts} +4 -2
  130. package/dist/scaffold/intenrals/types.d.ts.map +1 -0
  131. package/dist/scaffold/intenrals/types.js +5 -0
  132. package/dist/scaffold/intenrals/types.js.map +1 -0
  133. package/package.json +7 -7
  134. package/schema.json +64 -0
  135. package/dist/cli-entry.d.ts +0 -3
  136. package/dist/cli-entry.d.ts.map +0 -1
  137. package/dist/cli-entry.js +0 -382
  138. package/dist/cli-entry.js.map +0 -1
  139. package/dist/cli.d.ts +0 -16
  140. package/dist/cli.d.ts.map +0 -1
  141. package/dist/cli.js +0 -16
  142. package/dist/cli.js.map +0 -1
  143. package/dist/load-config.d.ts.map +0 -1
  144. package/dist/load-config.js +0 -24
  145. package/dist/load-config.js.map +0 -1
  146. package/dist/preview.d.ts +0 -88
  147. package/dist/preview.d.ts.map +0 -1
  148. package/dist/preview.js +0 -461
  149. package/dist/preview.js.map +0 -1
  150. package/dist/resolve-config.d.ts +0 -15
  151. package/dist/resolve-config.d.ts.map +0 -1
  152. package/dist/resolve-config.js.map +0 -1
  153. package/dist/scaffold.d.ts.map +0 -1
  154. package/dist/scaffold.js.map +0 -1
  155. package/dist/scanner.d.ts +0 -77
  156. package/dist/scanner.d.ts.map +0 -1
  157. package/dist/scanner.js +0 -555
  158. package/dist/scanner.js.map +0 -1
  159. package/dist/sync.d.ts.map +0 -1
  160. package/dist/sync.js +0 -340
  161. package/dist/sync.js.map +0 -1
package/dist/cli-entry.js DELETED
@@ -1,382 +0,0 @@
1
- #!/usr/bin/env node
2
- import path from 'path';
3
- import fs from 'fs';
4
- import { resolveConfig, findProjectRoot } from './resolve-config.js';
5
- import { scanProject } from './scanner.js';
6
- import { postToSync, pullTranslations, loadSyncCache, serializeNamespaces, computeDiff, formatPreviewRoutes, } from './sync.js';
7
- import { loadConfigFile } from './load-config.js';
8
- import { scaffoldI18n } from './scaffold.js';
9
- /**
10
- * Strip line and block comments from a JSON-with-comments (JSONC) string,
11
- * correctly skipping content inside string literals to avoid false positives
12
- * on patterns like "@/*" or "**\/*.ts".
13
- */
14
- function stripJsonComments(input) {
15
- let result = '';
16
- let i = 0;
17
- while (i < input.length) {
18
- // String literal — copy verbatim until closing quote
19
- if (input[i] === '"') {
20
- result += '"';
21
- i++;
22
- while (i < input.length) {
23
- const ch = input[i];
24
- result += ch;
25
- i++;
26
- if (ch === '\\') {
27
- // Escaped character — copy next char too
28
- if (i < input.length) {
29
- result += input[i++];
30
- }
31
- }
32
- else if (ch === '"') {
33
- break;
34
- }
35
- }
36
- continue;
37
- }
38
- // Line comment (//)
39
- if (input[i] === '/' && input[i + 1] === '/') {
40
- while (i < input.length && input[i] !== '\n')
41
- i++;
42
- continue;
43
- }
44
- // Block comment (/* ... */)
45
- if (input[i] === '/' && input[i + 1] === '*') {
46
- i += 2;
47
- while (i < input.length) {
48
- if (input[i] === '*' && input[i + 1] === '/') {
49
- i += 2;
50
- break;
51
- }
52
- i++;
53
- }
54
- continue;
55
- }
56
- result += input[i++];
57
- }
58
- return result;
59
- }
60
- /**
61
- * Load TypeScript path mappings from tsconfig.json.
62
- * Returns a mapping of alias patterns to base paths in the project.
63
- */
64
- function loadTsConfigPathMappings(root) {
65
- const tsconfigPath = path.join(root, 'tsconfig.json');
66
- if (!fs.existsSync(tsconfigPath)) {
67
- return null;
68
- }
69
- try {
70
- const content = fs.readFileSync(tsconfigPath, 'utf-8');
71
- // Remove comments for JSON parsing, but skip content inside string literals
72
- // to avoid false positives on patterns like "@/*" or "**/*.ts"
73
- const cleaned = stripJsonComments(content);
74
- const tsconfig = JSON.parse(cleaned);
75
- if (typeof tsconfig === 'object' &&
76
- tsconfig !== null &&
77
- 'compilerOptions' in tsconfig) {
78
- const compilerOptions = tsconfig
79
- .compilerOptions;
80
- if (typeof compilerOptions === 'object' &&
81
- compilerOptions !== null &&
82
- 'paths' in compilerOptions) {
83
- const paths = compilerOptions
84
- .paths;
85
- if (typeof paths === 'object' && paths !== null) {
86
- return paths;
87
- }
88
- }
89
- }
90
- }
91
- catch {
92
- // Silently ignore tsconfig errors
93
- }
94
- return null;
95
- }
96
- /**
97
- * sync-translations CLI
98
- *
99
- * Subcommands:
100
- * sync (default) Scan codebase and sync translation keys to the CMS.
101
- * pull Fetch translations from CMS and write local JSON files.
102
- * status Show what would change on next sync (no network calls).
103
- * watch Watch for file changes and auto-sync on save.
104
- * init Interactive setup — creates .translationsrc.json.
105
- *
106
- * Usage:
107
- * sync-translations # sync keys + pull
108
- * sync-translations sync # same as above
109
- * sync-translations sync --dry-run # preview changes only
110
- * sync-translations sync --report scan.json # write JSON report
111
- * sync-translations pull # pull to ./public/dictionaries
112
- * sync-translations pull --output ./locales # custom output dir
113
- * sync-translations pull --force # ignore TTL cache
114
- * sync-translations pull --env staging # pull staging translations
115
- * sync-translations pull --ttl 600000 # custom TTL (ms)
116
- * sync-translations status # diff vs last sync cache
117
- * sync-translations watch # watch + auto-sync
118
- * sync-translations init # interactive setup
119
- *
120
- * Or configure via .env.local / .translationsrc.json:
121
- * NEXT_PUBLIC_CMS_PROJECT_ID=abc123
122
- * CMS_SYNC_API_KEY=secret
123
- * NEXT_PUBLIC_CMS_URL=https://cms.example.com
124
- */
125
- const SUBCOMMANDS = new Set(['sync', 'pull', 'status', 'watch', 'init']);
126
- // ---------------------------------------------------------------------------
127
- // Arg helpers
128
- // ---------------------------------------------------------------------------
129
- function getFlag(args, flag) {
130
- const idx = args.indexOf(flag);
131
- return idx !== -1 && args[idx + 1] ? args[idx + 1] : undefined;
132
- }
133
- function hasFlag(args, ...flags) {
134
- return flags.some(f => args.includes(f));
135
- }
136
- // ---------------------------------------------------------------------------
137
- // status subcommand
138
- // ---------------------------------------------------------------------------
139
- function runStatus(root, scanOpts) {
140
- console.log(`Scanning project: ${root}`);
141
- const namespaces = scanProject(root, scanOpts);
142
- const { serialized, totalKeys } = serializeNamespaces(namespaces);
143
- const namespaceCount = Object.keys(serialized).length;
144
- console.log(`\nFound ${totalKeys} key(s) across ${namespaceCount} namespace(s): ${Object.keys(serialized).join(', ')}`);
145
- const cached = loadSyncCache(root);
146
- if (!cached) {
147
- console.log('\nNo sync cache found (.cms-sync-cache.json). Run sync first to establish a baseline.');
148
- return;
149
- }
150
- const diff = computeDiff(serialized, cached);
151
- console.log('\nStatus vs last sync:');
152
- console.log(` + ${diff.added.length} new key(s)`);
153
- console.log(` - ${diff.removed.length} removed key(s)`);
154
- console.log(` ~ ${diff.routesChanged.length} route update(s)`);
155
- console.log(` = ${diff.unchanged} unchanged`);
156
- if (diff.added.length > 0) {
157
- console.log('\nNew keys:');
158
- for (const { namespace, key, routes } of diff.added) {
159
- console.log(` + ${namespace}:${key} (${formatPreviewRoutes(routes)})`);
160
- }
161
- }
162
- if (diff.removed.length > 0) {
163
- console.log('\nRemoved keys:');
164
- for (const { namespace, key } of diff.removed) {
165
- console.log(` - ${namespace}:${key}`);
166
- }
167
- }
168
- if (diff.routesChanged.length > 0) {
169
- console.log('\nRoute updates:');
170
- for (const { namespace, key, before, after } of diff.routesChanged) {
171
- console.log(` ~ ${namespace}:${key} [${formatPreviewRoutes(before)}] -> [${formatPreviewRoutes(after)}]`);
172
- }
173
- }
174
- const total = diff.added.length + diff.removed.length + diff.routesChanged.length;
175
- if (total > 0) {
176
- console.log('\nRun "sync-translations sync" to push these changes.');
177
- }
178
- else {
179
- console.log('\nEverything is in sync.');
180
- }
181
- }
182
- // ---------------------------------------------------------------------------
183
- // watch subcommand
184
- // ---------------------------------------------------------------------------
185
- async function runWatch(root, config, outputDir, scanOpts) {
186
- console.log(`[watch] Watching ${root} for changes...`);
187
- console.log('[watch] Press Ctrl+C to stop.\n');
188
- const sourceExtensions = new Set(scanOpts.sourceExtensions ?? ['.ts', '.tsx', '.js', '.jsx']);
189
- let debounce = null;
190
- let running = false;
191
- const runSync = async () => {
192
- if (running)
193
- return;
194
- running = true;
195
- try {
196
- const namespaces = scanProject(root, scanOpts);
197
- await postToSync(config, namespaces, { root, force: true });
198
- await pullTranslations(config, { outputDir, force: true });
199
- }
200
- catch (err) {
201
- console.error('[watch] Sync error:', err instanceof Error ? err.message : String(err));
202
- }
203
- finally {
204
- running = false;
205
- }
206
- };
207
- // Initial sync on start
208
- await runSync();
209
- // Recursively watch for file changes
210
- const watcher = fs.watch(root, { recursive: true }, (_evt, filename) => {
211
- if (!filename)
212
- return;
213
- const ext = path.extname(filename);
214
- if (!sourceExtensions.has(ext))
215
- return;
216
- if (debounce)
217
- clearTimeout(debounce);
218
- debounce = setTimeout(() => {
219
- console.log(`[watch] Change detected: ${filename}`);
220
- void runSync();
221
- }, 500);
222
- });
223
- process.on('SIGINT', () => {
224
- watcher.close();
225
- console.log('\n[watch] Stopped.');
226
- process.exit(0);
227
- });
228
- // Keep the process alive
229
- await new Promise(() => undefined);
230
- }
231
- // ---------------------------------------------------------------------------
232
- // init subcommand
233
- // ---------------------------------------------------------------------------
234
- async function runInit(root) {
235
- const { createInterface } = await import('readline');
236
- const rl = createInterface({
237
- input: process.stdin,
238
- output: process.stdout,
239
- });
240
- const question = (prompt) => new Promise(resolve => rl.question(prompt, resolve));
241
- console.log('sync-translations init\n');
242
- console.log('This creates .translationsrc.json in your project root.');
243
- console.log('Values here override env vars for the sync-translations CLI.\n');
244
- const cmsUrl = await question('CMS URL (e.g. https://cms.example.com): ');
245
- const projectId = await question('Project ID: ');
246
- const apiKey = await question('API key: ');
247
- const i18nDirInput = await question('i18n directory [./src/lib/i18n]: ');
248
- const pullTtlInput = await question('Pull TTL in seconds [300]: ');
249
- const scaffoldInput = await question('Scaffold i18n files (settings, client, server, provider)? [Y/n]: ');
250
- rl.close();
251
- const i18nDir = i18nDirInput.trim() || './src/lib/i18n';
252
- const outputDir = `${i18nDir.replace(/\/$/, '')}/dictionaries`;
253
- const config = {};
254
- if (cmsUrl.trim())
255
- config['cmsUrl'] = cmsUrl.trim();
256
- if (projectId.trim())
257
- config['projectId'] = projectId.trim();
258
- if (apiKey.trim())
259
- config['apiKey'] = apiKey.trim();
260
- config['outputDir'] = outputDir;
261
- if (pullTtlInput.trim()) {
262
- const ttlSec = parseInt(pullTtlInput.trim(), 10);
263
- if (!isNaN(ttlSec))
264
- config['pullTtlMs'] = ttlSec * 1000;
265
- }
266
- const configPath = path.join(root, '.translationsrc.json');
267
- fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
268
- console.log(`\nCreated: ${configPath}`);
269
- if (config['apiKey']) {
270
- console.log('\nWarning: .translationsrc.json contains an API key. Consider adding it to .gitignore:');
271
- console.log(' echo ".translationsrc.json" >> .gitignore');
272
- console.log('Or move the API key to CMS_SYNC_API_KEY in .env.local instead.');
273
- }
274
- const doScaffold = scaffoldInput.trim().toLowerCase() !== 'n';
275
- if (doScaffold) {
276
- const absI18nDir = path.isAbsolute(i18nDir)
277
- ? i18nDir
278
- : path.resolve(root, i18nDir);
279
- const { written, skipped } = scaffoldI18n({ i18nDir: absI18nDir });
280
- if (written.length > 0) {
281
- console.log('\nScaffolded i18n files:');
282
- for (const f of written)
283
- console.log(` + src/lib/i18n/${f}`);
284
- }
285
- if (skipped.length > 0) {
286
- console.log('\nSkipped (already exist):');
287
- for (const f of skipped)
288
- console.log(` ~ src/lib/i18n/${f}`);
289
- }
290
- console.log('\nNext steps:');
291
- console.log(' 1. Install peer deps: pnpm add i18next react-i18next i18next-resources-to-backend');
292
- console.log(' 2. Pull translations: sync-translations pull');
293
- console.log(' 3. Wrap your root layout with <TranslationProvider locale={locale}>');
294
- }
295
- }
296
- // ---------------------------------------------------------------------------
297
- // main
298
- // ---------------------------------------------------------------------------
299
- async function main() {
300
- const args = process.argv.slice(2);
301
- // Detect subcommand (first non-flag arg)
302
- const subcommand = args.find(a => !a.startsWith('-')) ?? 'sync';
303
- if (!SUBCOMMANDS.has(subcommand)) {
304
- console.error(`Unknown subcommand: ${subcommand}`);
305
- console.error(`Available subcommands: ${[...SUBCOMMANDS].join(', ')}`);
306
- process.exit(1);
307
- }
308
- const root = findProjectRoot();
309
- const fileConfig = loadConfigFile(root);
310
- // init doesn't need a resolved Config
311
- if (subcommand === 'init') {
312
- await runInit(root);
313
- return;
314
- }
315
- const config = resolveConfig(root, fileConfig);
316
- // Build scan options from config file
317
- const pathMappings = loadTsConfigPathMappings(root);
318
- const scanOpts = {
319
- excludedDirs: fileConfig.excludedDirs,
320
- sourceExtensions: fileConfig.sourceExtensions,
321
- reservedCssNamespaces: fileConfig.reservedCssNamespaces,
322
- routeParams: fileConfig.routeParams,
323
- pathMappings: pathMappings ?? undefined,
324
- projectRoot: root,
325
- };
326
- // ---- status -------------------------------------------------------------
327
- if (subcommand === 'status') {
328
- runStatus(root, scanOpts);
329
- return;
330
- }
331
- // ---- watch --------------------------------------------------------------
332
- if (subcommand === 'watch') {
333
- const outputDir = fileConfig.outputDir ?? path.join(root, 'public', 'locales');
334
- await runWatch(root, config, outputDir, scanOpts);
335
- return;
336
- }
337
- // ---- pull ---------------------------------------------------------------
338
- if (subcommand === 'pull') {
339
- const outputArg = getFlag(args, '--output');
340
- const outputDir = outputArg
341
- ? path.resolve(root, outputArg)
342
- : fileConfig.outputDir
343
- ? path.resolve(root, fileConfig.outputDir)
344
- : path.join(root, 'public', 'locales');
345
- const ttlArg = getFlag(args, '--ttl');
346
- const ttlMs = ttlArg ? parseInt(ttlArg, 10) : fileConfig.pullTtlMs;
347
- await pullTranslations(config, {
348
- outputDir,
349
- force: hasFlag(args, '--force'),
350
- ttlMs,
351
- env: getFlag(args, '--env'),
352
- });
353
- return;
354
- }
355
- // ---- sync (default) + optional pull afterwards --------------------------
356
- const dryRun = hasFlag(args, '--dry-run');
357
- const force = hasFlag(args, '--force');
358
- const reportArg = getFlag(args, '--report');
359
- const reportPath = reportArg
360
- ? path.isAbsolute(reportArg)
361
- ? reportArg
362
- : path.join(root, reportArg)
363
- : undefined;
364
- const outputDir = fileConfig.outputDir ?? path.join(root, 'public', 'locales');
365
- console.log(`Scanning project: ${root}`);
366
- const namespaces = scanProject(root, scanOpts);
367
- await postToSync(config, namespaces, {
368
- root,
369
- force,
370
- dryRun,
371
- reportPath,
372
- });
373
- // Skip pull when dry-running — there's nothing to pull yet
374
- if (!dryRun) {
375
- await pullTranslations(config, { outputDir, force });
376
- }
377
- }
378
- main().catch(err => {
379
- console.error(err);
380
- process.exit(1);
381
- });
382
- //# sourceMappingURL=cli-entry.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli-entry.js","sourceRoot":"","sources":["../src/cli-entry.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * @translation-cms/sync — public CLI utilities
3
- * Exposed as the `./cli` package export.
4
- *
5
- * Internal implementation is split across focused modules:
6
- * cli-config.ts — config resolution (env vars, .env.local, CLI args)
7
- * scanner.ts — source-file scanning and key extraction
8
- * sync.ts — CMS sync/pull API, diff, cache, and reports
9
- *
10
- * Everything is re-exported here so consumers and the CLI entry point
11
- * can import from a single stable path.
12
- */
13
- export { type Config, loadEnvLocal, parseArgs, findProjectRoot, resolveConfig, } from './resolve-config.js';
14
- export { type ScanOptions, type NamespaceMap, DEFAULT_EXCLUDED_DIRS, DEFAULT_SOURCE_EXTENSIONS, DEFAULT_RESERVED_CSS_NAMESPACES, walkFiles, filePathToRoute, extractKeysFromFile, scanProject, } from './scanner.js';
15
- export { type SerializedNamespaces, type SyncResponse, type SyncDiff, type PullOptions, type PostToSyncOptions, serializeNamespaces, loadSyncCache, saveSyncCache, isSyncNeeded, computeDiff, writeReport, postToSync, pullTranslations, } from './sync.js';
16
- //# sourceMappingURL=cli.d.ts.map
package/dist/cli.d.ts.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EACH,KAAK,MAAM,EACX,YAAY,EACZ,SAAS,EACT,eAAe,EACf,aAAa,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACH,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,qBAAqB,EACrB,yBAAyB,EACzB,+BAA+B,EAC/B,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,WAAW,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EACH,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,QAAQ,EACb,KAAK,WAAW,EAChB,KAAK,iBAAiB,EACtB,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,gBAAgB,GACnB,MAAM,WAAW,CAAC"}
package/dist/cli.js DELETED
@@ -1,16 +0,0 @@
1
- /**
2
- * @translation-cms/sync — public CLI utilities
3
- * Exposed as the `./cli` package export.
4
- *
5
- * Internal implementation is split across focused modules:
6
- * cli-config.ts — config resolution (env vars, .env.local, CLI args)
7
- * scanner.ts — source-file scanning and key extraction
8
- * sync.ts — CMS sync/pull API, diff, cache, and reports
9
- *
10
- * Everything is re-exported here so consumers and the CLI entry point
11
- * can import from a single stable path.
12
- */
13
- export { loadEnvLocal, parseArgs, findProjectRoot, resolveConfig, } from './resolve-config.js';
14
- export { DEFAULT_EXCLUDED_DIRS, DEFAULT_SOURCE_EXTENSIONS, DEFAULT_RESERVED_CSS_NAMESPACES, walkFiles, filePathToRoute, extractKeysFromFile, scanProject, } from './scanner.js';
15
- export { serializeNamespaces, loadSyncCache, saveSyncCache, isSyncNeeded, computeDiff, writeReport, postToSync, pullTranslations, } from './sync.js';
16
- //# sourceMappingURL=cli.js.map
package/dist/cli.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAEH,YAAY,EACZ,SAAS,EACT,eAAe,EACf,aAAa,GAChB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAGH,qBAAqB,EACrB,yBAAyB,EACzB,+BAA+B,EAC/B,SAAS,EACT,eAAe,EACf,mBAAmB,EACnB,WAAW,GACd,MAAM,cAAc,CAAC;AAEtB,OAAO,EAMH,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,YAAY,EACZ,WAAW,EACX,WAAW,EACX,UAAU,EACV,gBAAgB,GACnB,MAAM,WAAW,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"load-config.d.ts","sourceRoot":"","sources":["../src/load-config.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IAC/B;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAEhB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAExB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE5B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;OAKG;IACH,qBAAqB,CAAC,EAAE,MAAM,EAAE,CAAC;IAEjC;;;;;;;;;;;;OAYG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACxD;AAID;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAqB/D"}
@@ -1,24 +0,0 @@
1
- import fs from 'fs';
2
- import path from 'path';
3
- const CONFIG_FILENAMES = ['.translationsrc.json', 'translations.config.json'];
4
- /**
5
- * Load project-level config from .translationsrc.json or translations.config.json.
6
- * Returns an empty object when no config file is found — never throws.
7
- */
8
- export function loadConfigFile(root) {
9
- for (const filename of CONFIG_FILENAMES) {
10
- const filePath = path.join(root, filename);
11
- if (!fs.existsSync(filePath))
12
- continue;
13
- try {
14
- const parsed = JSON.parse(fs.readFileSync(filePath, 'utf-8'));
15
- console.log(`[config] Loaded config from ${filename}`);
16
- return parsed;
17
- }
18
- catch (err) {
19
- console.warn(`[config] Failed to parse ${filename}: ${err instanceof Error ? err.message : String(err)}`);
20
- }
21
- }
22
- return {};
23
- }
24
- //# sourceMappingURL=load-config.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"load-config.js","sourceRoot":"","sources":["../src/load-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AA8ExB,MAAM,gBAAgB,GAAG,CAAC,sBAAsB,EAAE,0BAA0B,CAAC,CAAC;AAE9E;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACvC,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;YAAE,SAAS;QAEvC,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CACrB,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CACf,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,+BAA+B,QAAQ,EAAE,CAAC,CAAC;YACvD,OAAO,MAAM,CAAC;QAClB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,OAAO,CAAC,IAAI,CACR,4BAA4B,QAAQ,KAChC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CACnD,EAAE,CACL,CAAC;QACN,CAAC;IACL,CAAC;IAED,OAAO,EAAE,CAAC;AACd,CAAC"}
package/dist/preview.d.ts DELETED
@@ -1,88 +0,0 @@
1
- /**
2
- * Translation CMS — Preview Listener
3
- *
4
- * Add this to your client app in development mode to enable live in-context
5
- * preview of translations from the CMS.
6
- *
7
- * Usage in Next.js:
8
- * ```tsx
9
- * import { initPreviewListener } from '@translation-cms/sync/preview';
10
- *
11
- * // In a useEffect or root layout (development only)
12
- * if (process.env.NODE_ENV === 'development') {
13
- * initPreviewListener();
14
- * }
15
- * ```
16
- *
17
- * Precise highlighting (recommended):
18
- * Add `data-cms-key="namespace:key"` to elements that render a translation.
19
- * The listener will target those elements directly, bypassing text-search heuristics.
20
- * ```tsx
21
- * <h1 data-cms-key="blog:post.title">{t('blog:post.title')}</h1>
22
- * ```
23
- */
24
- /** Callback invoked when an action is triggered by the CMS. */
25
- type PreviewActionCallback = () => void | Promise<void>;
26
- export interface PreviewListenerOptions {
27
- /**
28
- * Custom CSS to apply to highlighted elements.
29
- * If not provided, uses default blue outline.
30
- */
31
- highlightStyles?: {
32
- outline?: string;
33
- outlineOffset?: string;
34
- borderRadius?: string;
35
- backgroundColor?: string;
36
- };
37
- /**
38
- * Called when the CMS requests a locale switch.
39
- * Use this to integrate with your i18n library:
40
- *
41
- * ```ts
42
- * initPreviewListener({
43
- * onLocaleSwitch: (locale) => i18n.changeLanguage(locale),
44
- * });
45
- * ```
46
- *
47
- * When omitted, the listener looks for `window.__cmsSetLocale(locale)`.
48
- */
49
- onLocaleSwitch?: (locale: string) => void;
50
- }
51
- /**
52
- * Initialize the preview listener.
53
- * Safe to call multiple times — only initialises once.
54
- */
55
- export declare function initPreviewListener(options?: PreviewListenerOptions): void;
56
- /** Remove the preview listener and clear all highlights. */
57
- export declare function cleanupPreviewListener(): void;
58
- /**
59
- * Register an action that can be triggered by the CMS.
60
- * Useful for opening dialogs, menus, or other UI interactions.
61
- *
62
- * Usage in your app:
63
- * ```tsx
64
- * import { registerPreviewAction } from '@translation-cms/sync';
65
- *
66
- * function MyDialog() {
67
- * const [open, setOpen] = useState(false);
68
- *
69
- * useEffect(() => {
70
- * if (process.env.NODE_ENV === 'development') {
71
- * registerPreviewAction('nav.menu', () => setOpen(true));
72
- * }
73
- * }, []);
74
- *
75
- * return <Dialog open={open} onOpenChange={setOpen}>...</Dialog>;
76
- * }
77
- * ```
78
- *
79
- * When the editor clicks "Show in app" in the CMS for a key inside this menu,
80
- * the CMS notifies the preview and this callback is triggered.
81
- */
82
- export declare function registerPreviewAction(actionId: string, callback: PreviewActionCallback): void;
83
- /**
84
- * Unregister a previously registered action.
85
- */
86
- export declare function unregisterPreviewAction(actionId: string): void;
87
- export {};
88
- //# sourceMappingURL=preview.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../src/preview.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AA2CH,+DAA+D;AAC/D,KAAK,qBAAqB,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAExD,MAAM,WAAW,sBAAsB;IACnC;;;OAGG;IACH,eAAe,CAAC,EAAE;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,eAAe,CAAC,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C;AAyBD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,sBAAsB,GAAG,IAAI,CAkC1E;AAED,4DAA4D;AAC5D,wBAAgB,sBAAsB,IAAI,IAAI,CAa7C;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,qBAAqB,CACjC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,qBAAqB,GAChC,IAAI,CAGN;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAG9D"}