@translation-cms/sync 1.2.24 → 1.2.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/api.d.ts CHANGED
@@ -71,6 +71,30 @@ export declare function pullTranslations(options?: PullOptions): Promise<{
71
71
  locales: string[];
72
72
  fileCount: number;
73
73
  }>;
74
+ export interface WatchOptions {
75
+ /** Project root directory. If omitted, searches up from cwd */
76
+ projectRoot?: string;
77
+ /** Custom output directory to watch (must match the pull outputDir) */
78
+ outputDir?: string;
79
+ /**
80
+ * How often (in ms) to poll the CMS for new translations.
81
+ * Default: 10000 (10 seconds). Set to 0 to disable.
82
+ */
83
+ interval?: number;
84
+ }
85
+ /**
86
+ * Starts a polling loop that detects new CMS publishes and automatically
87
+ * re-pulls translations to local JSON files. Non-blocking — returns immediately.
88
+ *
89
+ * Call this once in dev mode after the initial pull:
90
+ *
91
+ * @example
92
+ * if (phase === PHASE_DEVELOPMENT_SERVER) {
93
+ * await pullTranslations({ projectRoot: '.' });
94
+ * watchTranslations({ projectRoot: '.' });
95
+ * }
96
+ */
97
+ export declare function watchTranslations(options?: WatchOptions): void;
74
98
  /**
75
99
  * Sync and pull in one operation (equivalent to CLI `sync` command)
76
100
  */
package/dist/api.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAcH,MAAM,WAAW,WAAW;IACxB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kCAAkC;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,WAAW;IACxB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CAClC,OAAO,GAAE,WAAgB,GAC1B,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAmErD;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAClC,OAAO,GAAE,WAAgB,GAC1B,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CA4DnD;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC7B,OAAO,GAAE,WAAW,GAAG,WAAgB,GACxC,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAQ/C"}
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAeH,MAAM,WAAW,WAAW;IACxB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,8CAA8C;IAC9C,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kCAAkC;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,0CAA0C;IAC1C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kFAAkF;IAClF,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,WAAW;IACxB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,6CAA6C;IAC7C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kCAAkC;IAClC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yCAAyC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0BAA0B;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CAClC,OAAO,GAAE,WAAgB,GAC1B,OAAO,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAmErD;AAED;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAClC,OAAO,GAAE,WAAgB,GAC1B,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CA4DnD;AAED,MAAM,WAAW,YAAY;IACzB,+DAA+D;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,GAAE,YAAiB,GAAG,IAAI,CAqDlE;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC7B,OAAO,GAAE,WAAW,GAAG,WAAgB,GACxC,OAAO,CAAC;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAQ/C"}
package/dist/api.js CHANGED
@@ -18,6 +18,7 @@ import { resolveConfig, resolveRouteParams, findProjectRoot as findProjectRootHe
18
18
  import { fetchRouteParams } from './core/api.js';
19
19
  import { runSync } from './commands/sync.js';
20
20
  import { runPull } from './commands/pull.js';
21
+ import { getLastPulledTime } from './core/cache.js';
21
22
  /**
22
23
  * Scans codebase for translation keys and syncs them to the CMS.
23
24
  *
@@ -137,6 +138,60 @@ export async function pullTranslations(options = {}) {
137
138
  throw error;
138
139
  }
139
140
  }
141
+ /**
142
+ * Starts a polling loop that detects new CMS publishes and automatically
143
+ * re-pulls translations to local JSON files. Non-blocking — returns immediately.
144
+ *
145
+ * Call this once in dev mode after the initial pull:
146
+ *
147
+ * @example
148
+ * if (phase === PHASE_DEVELOPMENT_SERVER) {
149
+ * await pullTranslations({ projectRoot: '.' });
150
+ * watchTranslations({ projectRoot: '.' });
151
+ * }
152
+ */
153
+ export function watchTranslations(options = {}) {
154
+ const { projectRoot = findProjectRootHelper(), interval = 10_000 } = options;
155
+ if (interval <= 0)
156
+ return;
157
+ const fileConfig = loadConfigFile(projectRoot);
158
+ const config = resolveConfig(projectRoot, fileConfig);
159
+ if (!config.cmsUrl || !config.projectId || !config.apiKey) {
160
+ // eslint-disable-next-line no-console
161
+ console.warn('[CMS] Missing config — watch disabled');
162
+ return;
163
+ }
164
+ const resolvedOutputDir = options.outputDir ??
165
+ fileConfig.outputDir ??
166
+ path.join(projectRoot, 'public', 'locales');
167
+ const statusUrl = `${config.cmsUrl.replace(/\/$/, '')}/api/sync/${config.projectId}/status`;
168
+ const poll = async () => {
169
+ try {
170
+ const res = await fetch(statusUrl, {
171
+ headers: { 'x-api-key': config.apiKey },
172
+ signal: AbortSignal.timeout(5000),
173
+ });
174
+ if (!res.ok)
175
+ return;
176
+ const { lastPublishedAt } = (await res.json());
177
+ if (!lastPublishedAt)
178
+ return;
179
+ const lastPulled = getLastPulledTime(resolvedOutputDir);
180
+ const publishedMs = new Date(lastPublishedAt).getTime();
181
+ if (lastPulled === null || publishedMs > lastPulled) {
182
+ // eslint-disable-next-line no-console
183
+ console.log('[CMS] New translations detected — pulling...');
184
+ await runPull(projectRoot, config, fileConfig, ['--force']);
185
+ }
186
+ }
187
+ catch {
188
+ // Silently ignore — CMS may be unreachable or dev server starting up
189
+ }
190
+ };
191
+ setInterval(poll, interval);
192
+ // eslint-disable-next-line no-console
193
+ console.log(`[CMS] Watching for translation updates every ${interval / 1000}s`);
194
+ }
140
195
  /**
141
196
  * Sync and pull in one operation (equivalent to CLI `sync` command)
142
197
  */
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,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,CAsDf"}
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,3 +1,5 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
1
3
  import { scanProject, routeKey } from '../core/scanner.js';
2
4
  import { postToSync, pullTranslations } from '../core/api.js';
3
5
  import { generateRouteParams, saveRouteParamsCache, writeMockDataFile, } from '../core/cache.js';
@@ -43,12 +45,16 @@ export async function runSync(root, config, scanOpts, opts) {
43
45
  }
44
46
  }
45
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);
46
51
  // Push discovered keys to the CMS; dry-run mode only prints a report
47
52
  await postToSync(config, namespaces, {
48
53
  root,
49
54
  force: opts.force,
50
55
  dryRun: opts.dryRun,
51
56
  reportPath: opts.reportPath,
57
+ localValues,
52
58
  });
53
59
  // Pull translations back to disk after a successful push.
54
60
  // Skip when dry-running — there's nothing new to pull yet.
@@ -59,4 +65,67 @@ export async function runSync(root, config, scanOpts, opts) {
59
65
  });
60
66
  }
61
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
+ }
62
131
  //# sourceMappingURL=sync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAoB,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EACH,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,GACpB,MAAM,kBAAkB,CAAC;AAa1B;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CACzB,IAAY,EACZ,MAAc,EACd,QAAqB,EACrB,IAAwB;IAExB,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE/C,oEAAoE;IACpE,wEAAwE;IACxE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACzB,4DAA4D;gBAC5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACjC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACjC,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,cAAc,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QACnE,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,iEAAiE;YACjE,uDAAuD;YACvD,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CACP,4CAA4C,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,iBAAiB,CAC9F,CAAC;YAEF,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,2EAA2E;gBAC3E,MAAM,MAAM,GAAG;oBACX,GAAG,UAAU;oBACb,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC;iBAClC,CAAC;gBACF,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACvD,CAAC;QACL,CAAC;IACL,CAAC;IAED,qEAAqE;IACrE,MAAM,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE;QACjC,IAAI;QACJ,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,IAAI,CAAC,UAAU;KAC9B,CAAC,CAAC;IAEH,0DAA0D;IAC1D,2DAA2D;IAC3D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,gBAAgB,CAAC,MAAM,EAAE;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;SACpB,CAAC,CAAC;IACP,CAAC;AACL,CAAC"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,WAAW,EAAoB,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EACH,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,GACpB,MAAM,kBAAkB,CAAC;AAa1B;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CACzB,IAAY,EACZ,MAAc,EACd,QAAqB,EACrB,IAAwB;IAExB,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAE/C,oEAAoE;IACpE,wEAAwE;IACxE,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;IACzC,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;QAC7C,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;YACnC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACzB,4DAA4D;gBAC5D,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACjC,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACjC,CAAC;QACL,CAAC;IACL,CAAC;IAED,IAAI,cAAc,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,UAAU,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;QACnE,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,iEAAiE;YACjE,uDAAuD;YACvD,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YACvC,OAAO,CAAC,GAAG,CACP,4CAA4C,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,iBAAiB,CAC9F,CAAC;YAEF,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACpB,2EAA2E;gBAC3E,MAAM,MAAM,GAAG;oBACX,GAAG,UAAU;oBACb,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC;iBAClC,CAAC;gBACF,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;YACvD,CAAC;QACL,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,mEAAmE;IACnE,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAEpD,qEAAqE;IACrE,MAAM,UAAU,CAAC,MAAM,EAAE,UAAU,EAAE;QACjC,IAAI;QACJ,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,WAAW;KACd,CAAC,CAAC;IAEH,0DAA0D;IAC1D,2DAA2D;IAC3D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,gBAAgB,CAAC,MAAM,EAAE;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;SACpB,CAAC,CAAC;IACP,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,SAAS,aAAa,CAClB,GAA4B,EAC5B,MAAM,GAAG,EAAE;IAEX,MAAM,MAAM,GAA2B,EAAE,CAAC;IAC1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;QAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC;QAC5B,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACrD,MAAM,CAAC,MAAM,CACT,MAAM,EACN,aAAa,CAAC,KAAgC,EAAE,OAAO,CAAC,CAC3D,CAAC;QACN,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;;;GAMG;AACH,SAAS,eAAe,CACpB,SAAiB;IAEjB,MAAM,MAAM,GAA2D,EAAE,CAAC;IAE1E,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,MAAM,CAAC;IAE7C,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACD,KAAK,GAAG,EAAE;aACL,WAAW,CAAC,SAAS,CAAC;aACtB,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,cAAc,CAAC,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,MAAM,CAAC;IAClB,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC;YACD,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,EAAE,OAAO,CAAC,CAAC;YACjE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA4B,CAAC;YAE3D,KAAK,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACtD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;oBAAE,SAAS;gBAExD,MAAM,IAAI,GAAG,aAAa,CAAC,IAA+B,CAAC,CAAC;gBAC5D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;oBAAE,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;gBAE/C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC9C,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;wBAAE,SAAS;oBAC5B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAE,CAAC,GAAG,CAAC;wBAAE,MAAM,CAAC,SAAS,CAAE,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;oBAC3D,MAAM,CAAC,SAAS,CAAE,CAAC,GAAG,CAAE,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;gBAC7C,CAAC;YACL,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACL,gCAAgC;QACpC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/core/api-internals/sync.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAgB,MAAM,YAAY,CAAC;AAYlE;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC5B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,YAAY,EACxB,IAAI,GAAE,iBAA2C,GAClD,OAAO,CAAC,IAAI,CAAC,CAwIf"}
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/core/api-internals/sync.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,iBAAiB,EAAgB,MAAM,YAAY,CAAC;AAYlE;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,CAC5B,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,YAAY,EACxB,IAAI,GAAE,iBAA2C,GAClD,OAAO,CAAC,IAAI,CAAC,CAoJf"}
@@ -71,13 +71,19 @@ export async function postToSync(config, namespaces, opts = { root: process.cwd(
71
71
  // Strip trailing slash to avoid double slashes in the URL
72
72
  const url = `${config.cmsUrl.replace(/\/$/, '')}/api/sync/${config.projectId}`;
73
73
  console.log(`Posting to ${url}...`);
74
+ // Build the API payload — same as serialized but with optional values merged
75
+ // in per key. Values are excluded from the cache so key-change detection is
76
+ // not affected by local translation edits.
77
+ const apiPayload = opts.localValues && Object.keys(opts.localValues).length > 0
78
+ ? buildPayloadWithValues(serialized, opts.localValues)
79
+ : serialized;
74
80
  const response = await fetch(url, {
75
81
  method: 'POST',
76
82
  headers: {
77
83
  'Content-Type': 'application/json',
78
84
  'x-api-key': config.apiKey,
79
85
  },
80
- body: JSON.stringify({ namespaces: serialized }),
86
+ body: JSON.stringify({ namespaces: apiPayload }),
81
87
  });
82
88
  const contentType = response.headers.get('content-type') ?? '';
83
89
  const isJson = contentType.includes('application/json');
@@ -98,7 +104,10 @@ export async function postToSync(config, namespaces, opts = { root: process.cwd(
98
104
  process.exit(1);
99
105
  }
100
106
  const data = (await response.json());
101
- console.log(`Synced: ${data.created} created, ${data.updated ?? 0} routes updated, ${data.existing} existing`);
107
+ const valuesPart = data.valuesUploaded != null && data.valuesUploaded > 0
108
+ ? `, ${data.valuesUploaded} draft value(s) bootstrapped`
109
+ : '';
110
+ console.log(`Synced: ${data.created} created, ${data.updated ?? 0} routes updated, ${data.existing} existing${valuesPart}`);
102
111
  if (data.message)
103
112
  console.log(data.message);
104
113
  // Persist the new baseline so subsequent runs can detect changes correctly
@@ -108,4 +117,23 @@ export async function postToSync(config, namespaces, opts = { root: process.cwd(
108
117
  writeReport(resolveReportPath(opts.root, opts.reportPath), serialized, diff);
109
118
  }
110
119
  }
120
+ /**
121
+ * Merge local translation values into the serialized namespace payload.
122
+ * Values are attached per key but never included in the sync cache — this
123
+ * keeps key-change detection independent of translation edits.
124
+ */
125
+ function buildPayloadWithValues(serialized, localValues) {
126
+ const payload = {};
127
+ for (const [ns, entries] of Object.entries(serialized)) {
128
+ const nsValues = localValues[ns] ?? {};
129
+ payload[ns] = entries.map(entry => {
130
+ const values = nsValues[entry.key];
131
+ if (values && Object.keys(values).length > 0) {
132
+ return { ...entry, values };
133
+ }
134
+ return entry;
135
+ });
136
+ }
137
+ return payload;
138
+ }
111
139
  //# sourceMappingURL=sync.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/core/api-internals/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../../src/core/api-internals/sync.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export interface SyncResponse {
5
5
  created: number;
6
6
  updated?: number;
7
7
  existing: number;
8
+ valuesUploaded?: number;
8
9
  message?: string;
9
10
  }
10
11
  export interface PostToSyncOptions {
@@ -14,6 +15,13 @@ export interface PostToSyncOptions {
14
15
  dryRun?: boolean;
15
16
  /** Write a JSON scan report to this file path. */
16
17
  reportPath?: string;
18
+ /**
19
+ * Translation values read from local JSON files, keyed by
20
+ * namespace → translationKey → locale → value.
21
+ * When provided, values are included in the sync payload so the CMS can
22
+ * store them as drafts (only where no draft exists yet).
23
+ */
24
+ localValues?: Record<string, Record<string, Record<string, string>>>;
17
25
  }
18
26
  export interface PullOptions {
19
27
  outputDir: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/api-internals/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/api-internals/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+DAA+D;IAC/D,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,WAAW;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,GAAG,CAAC,EAAE,MAAM,CAAC;CAChB"}
package/dist/next.d.ts CHANGED
@@ -15,6 +15,11 @@ export interface TranslationsCMSPluginOptions {
15
15
  pullOnBuild?: boolean;
16
16
  /** Automatically pull translations on `next dev` (default: true) */
17
17
  pullOnDev?: boolean;
18
+ /**
19
+ * How often (in ms) to poll the CMS for new translations in dev mode.
20
+ * Set to 0 to disable. Default: 10000 (10 seconds).
21
+ */
22
+ watchInterval?: number;
18
23
  }
19
24
  /**
20
25
  * Higher-order function that wraps your Next.js config with automatic translation syncing.
@@ -1 +1 @@
1
- {"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../src/next.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAQvC,MAAM,WAAW,4BAA4B;IACzC,sEAAsE;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oEAAoE;IACpE,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAC/B,UAAU,EAAE,UAAU,GAAG,SAAS,EAClC,aAAa,GAAE,4BAAiC,GACjD,UAAU,CAqDZ;AAED,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../src/next.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAWvC,MAAM,WAAW,4BAA4B;IACzC,sEAAsE;IACtE,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,oEAAoE;IACpE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAC/B,UAAU,EAAE,UAAU,GAAG,SAAS,EAClC,aAAa,GAAE,4BAAiC,GACjD,UAAU,CA6DZ;AAgDD,eAAe,mBAAmB,CAAC"}
package/dist/next.js CHANGED
@@ -9,8 +9,11 @@
9
9
  * pullOnDev: true, // default
10
10
  * });
11
11
  */
12
+ import path from 'path';
12
13
  import { runPull } from './commands/pull.js';
13
14
  import { resolveConfig, findProjectRoot, loadConfigFile, } from './config/resolve-config.js';
15
+ import { getLastPulledTime } from './core/cache.js';
16
+ import { pullTranslations } from './core/api.js';
14
17
  /**
15
18
  * Higher-order function that wraps your Next.js config with automatic translation syncing.
16
19
  *
@@ -19,7 +22,7 @@ import { resolveConfig, findProjectRoot, loadConfigFile, } from './config/resolv
19
22
  * @returns Enhanced Next.js configuration with sync hooks
20
23
  */
21
24
  export function withTranslationsCMS(userConfig, pluginOptions = {}) {
22
- const { pullOnBuild = true, pullOnDev = true } = pluginOptions;
25
+ const { pullOnBuild = true, pullOnDev = true, watchInterval = 10_000 } = pluginOptions;
23
26
  let initialized = false;
24
27
  // Initialize and run pull if needed
25
28
  const initTranslations = async () => {
@@ -37,6 +40,13 @@ export function withTranslationsCMS(userConfig, pluginOptions = {}) {
37
40
  if (shouldPull) {
38
41
  await runPull(root, config, fileConfig, []);
39
42
  }
43
+ // In dev mode, start a polling loop to auto-pull when the CMS publishes
44
+ if (isDev && watchInterval > 0) {
45
+ const outputDir = fileConfig.outputDir
46
+ ? path.resolve(root, fileConfig.outputDir)
47
+ : path.join(root, 'public', 'locales');
48
+ startWatcher(config, outputDir, watchInterval);
49
+ }
40
50
  }
41
51
  }
42
52
  catch (error) {
@@ -62,5 +72,39 @@ export function withTranslationsCMS(userConfig, pluginOptions = {}) {
62
72
  },
63
73
  };
64
74
  }
75
+ /**
76
+ * Poll the CMS status endpoint every `intervalMs` ms.
77
+ * When a publish newer than the last local pull is detected, re-pulls translations.
78
+ * Errors are silently swallowed so a temporarily unreachable CMS never crashes dev.
79
+ */
80
+ function startWatcher(config, outputDir, intervalMs) {
81
+ const statusUrl = `${config.cmsUrl.replace(/\/$/, '')}/api/sync/${config.projectId}/status`;
82
+ const poll = async () => {
83
+ try {
84
+ const res = await fetch(statusUrl, {
85
+ headers: { 'x-api-key': config.apiKey },
86
+ signal: AbortSignal.timeout(5000),
87
+ });
88
+ if (!res.ok)
89
+ return;
90
+ const { lastPublishedAt } = (await res.json());
91
+ if (!lastPublishedAt)
92
+ return;
93
+ const lastPulled = getLastPulledTime(outputDir);
94
+ const publishedMs = new Date(lastPublishedAt).getTime();
95
+ if (lastPulled === null || publishedMs > lastPulled) {
96
+ // eslint-disable-next-line no-console
97
+ console.log('[CMS] New translations detected — pulling...');
98
+ await pullTranslations(config, { outputDir, force: true });
99
+ }
100
+ }
101
+ catch {
102
+ // Silently ignore — CMS may be unreachable or dev server starting up
103
+ }
104
+ };
105
+ setInterval(poll, intervalMs);
106
+ // eslint-disable-next-line no-console
107
+ console.log(`[CMS] Watching for translation updates every ${intervalMs / 1000}s`);
108
+ }
65
109
  export default withTranslationsCMS;
66
110
  //# sourceMappingURL=next.js.map
package/dist/next.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"next.js","sourceRoot":"","sources":["../src/next.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAC7C,OAAO,EACH,aAAa,EACb,eAAe,EACf,cAAc,GACjB,MAAM,4BAA4B,CAAC;AASpC;;;;;;GAMG;AACH,MAAM,UAAU,mBAAmB,CAC/B,UAAkC,EAClC,gBAA8C,EAAE;IAEhD,MAAM,EAAE,WAAW,GAAG,IAAI,EAAE,SAAS,GAAG,IAAI,EAAE,GAAG,aAAa,CAAC;IAE/D,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,oCAAoC;IACpC,MAAM,gBAAgB,GAAG,KAAK,IAAI,EAAE;QAChC,IAAI,WAAW;YAAE,OAAO;QACxB,WAAW,GAAG,IAAI,CAAC;QAEnB,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;YAC/B,MAAM,UAAU,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;YACxC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;YAE/C,2CAA2C;YAC3C,IAAI,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBACrD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC;gBACrD,MAAM,UAAU,GACZ,CAAC,KAAK,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,WAAW,CAAC,CAAC;gBAEpD,IAAI,UAAU,EAAE,CAAC;oBACb,MAAM,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;gBAChD,CAAC;YACL,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,qCAAqC;YACrC,sCAAsC;YACtC,OAAO,CAAC,IAAI,CACR,kDAAkD,EAClD,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CACzD,CAAC;QACN,CAAC;IACL,CAAC,CAAC;IAEF,OAAO;QACH,GAAG,UAAU;QACb,8DAA8D;QAC9D,OAAO,EAAE,CAAC,MAAW,EAAE,OAAY,EAAE,EAAE;YACnC,+DAA+D;YAC/D,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,WAAW,EAAE,CAAC;gBACnC,sCAAsC;gBACtC,gBAAgB,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;YAC5C,CAAC;YAED,+CAA+C;YAC/C,IAAI,OAAO,UAAU,EAAE,OAAO,KAAK,UAAU,EAAE,CAAC;gBAC5C,OAAO,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YAC/C,CAAC;YAED,OAAO,MAAM,CAAC;QAClB,CAAC;KACJ,CAAC;AACN,CAAC;AAED,eAAe,mBAAmB,CAAC"}
1
+ {"version":3,"file":"next.js","sourceRoot":"","sources":["../src/next.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@translation-cms/sync",
3
- "version": "1.2.24",
3
+ "version": "1.2.25",
4
4
  "description": "Scan translation keys in your codebase and sync them to the Translations CMS",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",