@translation-cms/sync 1.2.9 → 1.2.12
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/README.md +304 -151
- package/dist/api.d.ts +79 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +151 -0
- package/dist/api.js.map +1 -0
- package/dist/bin.js +51 -17
- package/dist/bin.js.map +1 -1
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +18 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/pull.d.ts +7 -0
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +15 -2
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/status.d.ts +12 -0
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +16 -0
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/sync.d.ts +10 -0
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +23 -4
- package/dist/commands/sync.js.map +1 -1
- package/dist/commands/watch.d.ts +14 -0
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +23 -3
- package/dist/commands/watch.js.map +1 -1
- package/dist/config/config-internals/args.d.ts +11 -0
- package/dist/config/config-internals/args.d.ts.map +1 -0
- package/dist/config/config-internals/args.js +22 -0
- package/dist/config/config-internals/args.js.map +1 -0
- package/dist/config/config-internals/env.d.ts +10 -0
- package/dist/config/config-internals/env.d.ts.map +1 -0
- package/dist/config/config-internals/env.js +35 -0
- package/dist/config/config-internals/env.js.map +1 -0
- package/dist/config/config-internals/file.d.ts +11 -0
- package/dist/config/config-internals/file.d.ts.map +1 -0
- package/dist/config/config-internals/file.js +28 -0
- package/dist/config/config-internals/file.js.map +1 -0
- package/dist/config/config-internals/resolve.d.ts +21 -0
- package/dist/config/config-internals/resolve.d.ts.map +1 -0
- package/dist/config/config-internals/resolve.js +73 -0
- package/dist/config/config-internals/resolve.js.map +1 -0
- package/dist/config/config-internals/root.d.ts +9 -0
- package/dist/config/config-internals/root.d.ts.map +1 -0
- package/dist/config/config-internals/root.js +22 -0
- package/dist/config/config-internals/root.js.map +1 -0
- package/dist/config/config-internals/types.d.ts +83 -0
- package/dist/config/config-internals/types.d.ts.map +1 -0
- package/dist/config/config-internals/types.js +9 -0
- package/dist/config/config-internals/types.js.map +1 -0
- package/dist/config/resolve-config.d.ts +9 -90
- package/dist/config/resolve-config.d.ts.map +1 -1
- package/dist/config/resolve-config.js +7 -123
- package/dist/config/resolve-config.js.map +1 -1
- package/dist/core/api-internals/pull.d.ts +9 -1
- package/dist/core/api-internals/pull.d.ts.map +1 -1
- package/dist/core/api-internals/pull.js +41 -28
- package/dist/core/api-internals/pull.js.map +1 -1
- package/dist/core/api-internals/sync.d.ts +9 -2
- package/dist/core/api-internals/sync.d.ts.map +1 -1
- package/dist/core/api-internals/sync.js +18 -2
- package/dist/core/api-internals/sync.js.map +1 -1
- package/dist/core/cache-internals/format.d.ts +16 -0
- package/dist/core/cache-internals/format.d.ts.map +1 -1
- package/dist/core/cache-internals/format.js +17 -0
- package/dist/core/cache-internals/format.js.map +1 -1
- package/dist/core/cache-internals/params.d.ts.map +1 -1
- package/dist/core/cache-internals/params.js +24 -24
- package/dist/core/cache-internals/params.js.map +1 -1
- package/dist/core/cache-internals/pull.d.ts +12 -0
- package/dist/core/cache-internals/pull.d.ts.map +1 -1
- package/dist/core/cache-internals/pull.js +13 -0
- package/dist/core/cache-internals/pull.js.map +1 -1
- package/dist/core/cache-internals/sync.d.ts +23 -0
- package/dist/core/cache-internals/sync.d.ts.map +1 -1
- package/dist/core/cache-internals/sync.js +33 -0
- package/dist/core/cache-internals/sync.js.map +1 -1
- package/dist/core/cache-internals/types.d.ts +20 -0
- package/dist/core/cache-internals/types.d.ts.map +1 -1
- package/dist/core/scanner-internals/ast.d.ts +23 -5
- package/dist/core/scanner-internals/ast.d.ts.map +1 -1
- package/dist/core/scanner-internals/ast.js +25 -5
- package/dist/core/scanner-internals/ast.js.map +1 -1
- package/dist/core/scanner-internals/file-walker.d.ts +3 -2
- package/dist/core/scanner-internals/file-walker.d.ts.map +1 -1
- package/dist/core/scanner-internals/file-walker.js +10 -12
- package/dist/core/scanner-internals/file-walker.js.map +1 -1
- package/dist/core/scanner-internals/import-resolver.d.ts +9 -1
- package/dist/core/scanner-internals/import-resolver.d.ts.map +1 -1
- package/dist/core/scanner-internals/import-resolver.js +58 -63
- package/dist/core/scanner-internals/import-resolver.js.map +1 -1
- package/dist/core/scanner-internals/key-extractor.d.ts +12 -8
- package/dist/core/scanner-internals/key-extractor.d.ts.map +1 -1
- package/dist/core/scanner-internals/key-extractor.js +125 -97
- package/dist/core/scanner-internals/key-extractor.js.map +1 -1
- package/dist/core/scanner-internals/route-detector.d.ts +16 -8
- package/dist/core/scanner-internals/route-detector.d.ts.map +1 -1
- package/dist/core/scanner-internals/route-detector.js +37 -33
- package/dist/core/scanner-internals/route-detector.js.map +1 -1
- package/dist/core/scanner.d.ts.map +1 -1
- package/dist/core/scanner.js +25 -8
- package/dist/core/scanner.js.map +1 -1
- package/dist/next.d.ts +28 -0
- package/dist/next.d.ts.map +1 -0
- package/dist/next.js +65 -0
- package/dist/next.js.map +1 -0
- package/dist/preview/internals/highlight.d.ts +16 -7
- package/dist/preview/internals/highlight.d.ts.map +1 -1
- package/dist/preview/internals/highlight.js +71 -60
- package/dist/preview/internals/highlight.js.map +1 -1
- package/dist/scaffold/intenrals/scaffold.d.ts +17 -0
- package/dist/scaffold/intenrals/scaffold.d.ts.map +1 -1
- package/dist/scaffold/intenrals/scaffold.js +19 -0
- package/dist/scaffold/intenrals/scaffold.js.map +1 -1
- package/package.json +16 -3
package/dist/api.d.ts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Programmatic API for translation sync
|
|
3
|
+
*
|
|
4
|
+
* Use this if you want to integrate sync into your own tooling, CI/CD,
|
|
5
|
+
* or custom workflows.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { syncTranslations, pullTranslations } from '@translation-cms/sync/api';
|
|
9
|
+
*
|
|
10
|
+
* // Scan and sync keys to CMS
|
|
11
|
+
* await syncTranslations({ projectRoot: './my-project' });
|
|
12
|
+
*
|
|
13
|
+
* // Fetch translations from CMS
|
|
14
|
+
* await pullTranslations({ projectRoot: './my-project' });
|
|
15
|
+
*/
|
|
16
|
+
export interface SyncOptions {
|
|
17
|
+
/** Project root directory. If omitted, searches up from cwd */
|
|
18
|
+
projectRoot?: string;
|
|
19
|
+
/** Dry run: show changes without uploading */
|
|
20
|
+
dryRun?: boolean;
|
|
21
|
+
/** Force refresh: ignore cache */
|
|
22
|
+
force?: boolean;
|
|
23
|
+
/** Write sync report to this file path */
|
|
24
|
+
reportPath?: string;
|
|
25
|
+
/** Show verbose output */
|
|
26
|
+
verbose?: boolean;
|
|
27
|
+
}
|
|
28
|
+
export interface PullOptions {
|
|
29
|
+
/** Project root directory. If omitted, searches up from cwd */
|
|
30
|
+
projectRoot?: string;
|
|
31
|
+
/** Custom output directory for JSON files */
|
|
32
|
+
outputDir?: string;
|
|
33
|
+
/** Force refresh: ignore cache */
|
|
34
|
+
force?: boolean;
|
|
35
|
+
/** Override cache TTL in milliseconds */
|
|
36
|
+
ttl?: number;
|
|
37
|
+
/** Pull from specific environment */
|
|
38
|
+
environment?: string;
|
|
39
|
+
/** Show verbose output */
|
|
40
|
+
verbose?: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Scans codebase for translation keys and syncs them to the CMS.
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* const result = await syncTranslations({
|
|
47
|
+
* projectRoot: './apps/web',
|
|
48
|
+
* dryRun: false,
|
|
49
|
+
* verbose: true,
|
|
50
|
+
* });
|
|
51
|
+
*
|
|
52
|
+
* console.log(`Synced ${result.keysAdded} new keys`);
|
|
53
|
+
*/
|
|
54
|
+
export declare function syncTranslations(options?: SyncOptions): Promise<{
|
|
55
|
+
keysAdded: number;
|
|
56
|
+
keysUpdated: number;
|
|
57
|
+
}>;
|
|
58
|
+
/**
|
|
59
|
+
* Fetches translations from the CMS and writes them as local JSON files.
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* await pullTranslations({
|
|
63
|
+
* projectRoot: './apps/web',
|
|
64
|
+
* outputDir: './src/i18n/locales',
|
|
65
|
+
* force: true,
|
|
66
|
+
* });
|
|
67
|
+
*/
|
|
68
|
+
export declare function pullTranslations(options?: PullOptions): Promise<{
|
|
69
|
+
locales: string[];
|
|
70
|
+
fileCount: number;
|
|
71
|
+
}>;
|
|
72
|
+
/**
|
|
73
|
+
* Sync and pull in one operation (equivalent to CLI `sync` command)
|
|
74
|
+
*/
|
|
75
|
+
export declare function syncAndPull(options?: SyncOptions & PullOptions): Promise<{
|
|
76
|
+
synced: boolean;
|
|
77
|
+
pulled: boolean;
|
|
78
|
+
}>;
|
|
79
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +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;CACrB;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,CAgErD;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"}
|
package/dist/api.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Programmatic API for translation sync
|
|
3
|
+
*
|
|
4
|
+
* Use this if you want to integrate sync into your own tooling, CI/CD,
|
|
5
|
+
* or custom workflows.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { syncTranslations, pullTranslations } from '@translation-cms/sync/api';
|
|
9
|
+
*
|
|
10
|
+
* // Scan and sync keys to CMS
|
|
11
|
+
* await syncTranslations({ projectRoot: './my-project' });
|
|
12
|
+
*
|
|
13
|
+
* // Fetch translations from CMS
|
|
14
|
+
* await pullTranslations({ projectRoot: './my-project' });
|
|
15
|
+
*/
|
|
16
|
+
import path from 'path';
|
|
17
|
+
import { resolveConfig, resolveRouteParams, findProjectRoot as findProjectRootHelper, loadConfigFile, } from './config/resolve-config.js';
|
|
18
|
+
import { fetchRouteParams } from './core/api.js';
|
|
19
|
+
import { runSync } from './commands/sync.js';
|
|
20
|
+
import { runPull } from './commands/pull.js';
|
|
21
|
+
/**
|
|
22
|
+
* Scans codebase for translation keys and syncs them to the CMS.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* const result = await syncTranslations({
|
|
26
|
+
* projectRoot: './apps/web',
|
|
27
|
+
* dryRun: false,
|
|
28
|
+
* verbose: true,
|
|
29
|
+
* });
|
|
30
|
+
*
|
|
31
|
+
* console.log(`Synced ${result.keysAdded} new keys`);
|
|
32
|
+
*/
|
|
33
|
+
export async function syncTranslations(options = {}) {
|
|
34
|
+
const { projectRoot = findProjectRootHelper(), dryRun = false, force = false, reportPath, verbose = false, } = options;
|
|
35
|
+
if (verbose) {
|
|
36
|
+
// eslint-disable-next-line no-console
|
|
37
|
+
console.log(`[sync-translations] Syncing from ${projectRoot}...`);
|
|
38
|
+
}
|
|
39
|
+
const fileConfig = loadConfigFile(projectRoot);
|
|
40
|
+
const config = resolveConfig(projectRoot, fileConfig);
|
|
41
|
+
if (!config.cmsUrl || !config.projectId || !config.apiKey) {
|
|
42
|
+
throw new Error('Missing CMS configuration. Set NEXT_PUBLIC_CMS_URL, NEXT_PUBLIC_CMS_PROJECT_ID, and CMS_SYNC_API_KEY.');
|
|
43
|
+
}
|
|
44
|
+
// Fetch route params from CMS and merge with local config
|
|
45
|
+
const cmsRouteParams = await fetchRouteParams(config);
|
|
46
|
+
const userRouteParams = resolveRouteParams(projectRoot, fileConfig);
|
|
47
|
+
const scanOpts = {
|
|
48
|
+
excludedDirs: fileConfig.excludedDirs,
|
|
49
|
+
sourceExtensions: fileConfig.sourceExtensions,
|
|
50
|
+
routeParams: { ...cmsRouteParams, ...userRouteParams },
|
|
51
|
+
projectRoot,
|
|
52
|
+
};
|
|
53
|
+
const outputDir = fileConfig.outputDir ?? path.join(projectRoot, 'public', 'locales');
|
|
54
|
+
try {
|
|
55
|
+
await runSync(projectRoot, config, scanOpts, {
|
|
56
|
+
outputDir,
|
|
57
|
+
dryRun,
|
|
58
|
+
force,
|
|
59
|
+
reportPath,
|
|
60
|
+
mockDataPath: fileConfig.mockDataPath,
|
|
61
|
+
userRouteParams,
|
|
62
|
+
});
|
|
63
|
+
if (verbose) {
|
|
64
|
+
// eslint-disable-next-line no-console
|
|
65
|
+
console.log(`[sync-translations] Sync complete`);
|
|
66
|
+
}
|
|
67
|
+
// Return placeholder stats (actual stats are logged by runSync)
|
|
68
|
+
return {
|
|
69
|
+
keysAdded: 0,
|
|
70
|
+
keysUpdated: 0,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
if (verbose && error instanceof Error) {
|
|
75
|
+
// eslint-disable-next-line no-console
|
|
76
|
+
console.error('[sync-translations] Sync failed:', error.message);
|
|
77
|
+
}
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Fetches translations from the CMS and writes them as local JSON files.
|
|
83
|
+
*
|
|
84
|
+
* @example
|
|
85
|
+
* await pullTranslations({
|
|
86
|
+
* projectRoot: './apps/web',
|
|
87
|
+
* outputDir: './src/i18n/locales',
|
|
88
|
+
* force: true,
|
|
89
|
+
* });
|
|
90
|
+
*/
|
|
91
|
+
export async function pullTranslations(options = {}) {
|
|
92
|
+
const { projectRoot = findProjectRootHelper(), outputDir, force = false, ttl, environment, verbose = false, } = options;
|
|
93
|
+
if (verbose) {
|
|
94
|
+
// eslint-disable-next-line no-console
|
|
95
|
+
console.log(`[sync-translations] Pulling to ${projectRoot}...`);
|
|
96
|
+
}
|
|
97
|
+
const fileConfig = loadConfigFile(projectRoot);
|
|
98
|
+
const config = resolveConfig(projectRoot, fileConfig);
|
|
99
|
+
if (!config.cmsUrl || !config.projectId || !config.apiKey) {
|
|
100
|
+
throw new Error('Missing CMS configuration. Set NEXT_PUBLIC_CMS_URL, NEXT_PUBLIC_CMS_PROJECT_ID, and CMS_SYNC_API_KEY.');
|
|
101
|
+
}
|
|
102
|
+
// Build args array for runPull
|
|
103
|
+
const args = [];
|
|
104
|
+
if (force)
|
|
105
|
+
args.push('--force');
|
|
106
|
+
if (environment) {
|
|
107
|
+
args.push('--env');
|
|
108
|
+
args.push(environment);
|
|
109
|
+
}
|
|
110
|
+
if (ttl) {
|
|
111
|
+
args.push('--ttl');
|
|
112
|
+
args.push(String(ttl));
|
|
113
|
+
}
|
|
114
|
+
if (outputDir) {
|
|
115
|
+
args.push('--output');
|
|
116
|
+
args.push(outputDir);
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
await runPull(projectRoot, config, fileConfig, args);
|
|
120
|
+
if (verbose) {
|
|
121
|
+
// eslint-disable-next-line no-console
|
|
122
|
+
console.log(`[sync-translations] Pull complete`);
|
|
123
|
+
}
|
|
124
|
+
// Return placeholder stats
|
|
125
|
+
return {
|
|
126
|
+
locales: [],
|
|
127
|
+
fileCount: 0,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
catch (error) {
|
|
131
|
+
if (verbose && error instanceof Error) {
|
|
132
|
+
// eslint-disable-next-line no-console
|
|
133
|
+
console.error('[sync-translations] Pull failed:', error.message);
|
|
134
|
+
}
|
|
135
|
+
throw error;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Sync and pull in one operation (equivalent to CLI `sync` command)
|
|
140
|
+
*/
|
|
141
|
+
export async function syncAndPull(options = {}) {
|
|
142
|
+
try {
|
|
143
|
+
await syncTranslations(options);
|
|
144
|
+
await pullTranslations(options);
|
|
145
|
+
return { synced: true, pulled: true };
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return { synced: false, pulled: false };
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/bin.js
CHANGED
|
@@ -34,13 +34,17 @@ import { runSync } from './commands/sync.js';
|
|
|
34
34
|
// Helpers
|
|
35
35
|
// ---------------------------------------------------------------------------
|
|
36
36
|
/**
|
|
37
|
-
* Strip line and block comments from a JSONC string
|
|
38
|
-
*
|
|
37
|
+
* Strip `//` line comments and `/* … */` block comments from a JSONC string.
|
|
38
|
+
*
|
|
39
|
+
* String literals are copied verbatim (including any `//` or `/*` inside them)
|
|
40
|
+
* so that patterns like `"@/*"` or `"**\/*.ts"` in tsconfig paths are not
|
|
41
|
+
* corrupted. The result is valid JSON that `JSON.parse` can consume.
|
|
39
42
|
*/
|
|
40
43
|
function stripJsonComments(input) {
|
|
41
44
|
let result = '';
|
|
42
45
|
let i = 0;
|
|
43
46
|
while (i < input.length) {
|
|
47
|
+
// --- String literal: copy char-by-char, respecting escape sequences ---
|
|
44
48
|
if (input[i] === '"') {
|
|
45
49
|
result += '"';
|
|
46
50
|
i++;
|
|
@@ -49,20 +53,23 @@ function stripJsonComments(input) {
|
|
|
49
53
|
result += ch;
|
|
50
54
|
i++;
|
|
51
55
|
if (ch === '\\') {
|
|
56
|
+
// Escaped character — copy next char unconditionally
|
|
52
57
|
if (i < input.length)
|
|
53
58
|
result += input[i++];
|
|
54
59
|
}
|
|
55
60
|
else if (ch === '"') {
|
|
56
|
-
break;
|
|
61
|
+
break; // closing quote
|
|
57
62
|
}
|
|
58
63
|
}
|
|
59
64
|
continue;
|
|
60
65
|
}
|
|
66
|
+
// --- Line comment: skip everything up to the newline ---
|
|
61
67
|
if (input[i] === '/' && input[i + 1] === '/') {
|
|
62
68
|
while (i < input.length && input[i] !== '\n')
|
|
63
69
|
i++;
|
|
64
70
|
continue;
|
|
65
71
|
}
|
|
72
|
+
// --- Block comment: skip until closing */ ---
|
|
66
73
|
if (input[i] === '/' && input[i + 1] === '*') {
|
|
67
74
|
i += 2;
|
|
68
75
|
while (i < input.length) {
|
|
@@ -78,7 +85,15 @@ function stripJsonComments(input) {
|
|
|
78
85
|
}
|
|
79
86
|
return result;
|
|
80
87
|
}
|
|
81
|
-
/**
|
|
88
|
+
/**
|
|
89
|
+
* Load TypeScript path alias mappings from `tsconfig.json` at the project root.
|
|
90
|
+
*
|
|
91
|
+
* These mappings are passed to the scanner so that aliased imports such as
|
|
92
|
+
* `@/components/button` can be resolved to absolute file paths. tsconfig
|
|
93
|
+
* files are JSONC (JSON with comments) so we strip comments before parsing.
|
|
94
|
+
*
|
|
95
|
+
* Returns null when tsconfig.json is absent, unreadable, or has no `paths`.
|
|
96
|
+
*/
|
|
82
97
|
function loadTsConfigPathMappings(root) {
|
|
83
98
|
const tsconfigPath = path.join(root, 'tsconfig.json');
|
|
84
99
|
if (!fs.existsSync(tsconfigPath))
|
|
@@ -86,36 +101,49 @@ function loadTsConfigPathMappings(root) {
|
|
|
86
101
|
try {
|
|
87
102
|
const cleaned = stripJsonComments(fs.readFileSync(tsconfigPath, 'utf-8'));
|
|
88
103
|
const tsconfig = JSON.parse(cleaned);
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
104
|
+
// Drill into compilerOptions.paths — guard each level against unexpected shapes
|
|
105
|
+
if (typeof tsconfig !== 'object' || tsconfig === null)
|
|
106
|
+
return null;
|
|
107
|
+
if (!('compilerOptions' in tsconfig))
|
|
108
|
+
return null;
|
|
109
|
+
const opts = tsconfig.compilerOptions;
|
|
110
|
+
if (typeof opts !== 'object' || opts === null)
|
|
111
|
+
return null;
|
|
112
|
+
if (!('paths' in opts))
|
|
113
|
+
return null;
|
|
114
|
+
const paths = opts.paths;
|
|
115
|
+
if (typeof paths === 'object' && paths !== null)
|
|
116
|
+
return paths;
|
|
100
117
|
}
|
|
101
118
|
catch {
|
|
102
|
-
// Silently ignore tsconfig parse errors
|
|
119
|
+
// Silently ignore tsconfig parse errors — scanning continues without alias resolution
|
|
103
120
|
}
|
|
104
121
|
return null;
|
|
105
122
|
}
|
|
123
|
+
/** Return the value that follows `flag` in `args`, or undefined if absent. */
|
|
106
124
|
function getFlag(args, flag) {
|
|
107
125
|
const idx = args.indexOf(flag);
|
|
108
126
|
return idx !== -1 && args[idx + 1] ? args[idx + 1] : undefined;
|
|
109
127
|
}
|
|
128
|
+
/** Return true when any of the given flag strings is present in `args`. */
|
|
110
129
|
function hasFlag(args, ...flags) {
|
|
111
130
|
return flags.some(f => args.includes(f));
|
|
112
131
|
}
|
|
113
132
|
// ---------------------------------------------------------------------------
|
|
114
133
|
// Main
|
|
115
134
|
// ---------------------------------------------------------------------------
|
|
135
|
+
/** All valid subcommand names. Used for validation and dispatch. */
|
|
116
136
|
const SUBCOMMANDS = new Set(['sync', 'pull', 'status', 'watch', 'init']);
|
|
137
|
+
/**
|
|
138
|
+
* CLI entry point.
|
|
139
|
+
*
|
|
140
|
+
* Resolves config, loads tsconfig path mappings, and dispatches to the
|
|
141
|
+
* appropriate command handler. Config resolution and scanner setup are shared
|
|
142
|
+
* across all commands except `init` (which runs before a config file exists).
|
|
143
|
+
*/
|
|
117
144
|
async function main() {
|
|
118
145
|
const args = process.argv.slice(2);
|
|
146
|
+
// First non-flag argument is the subcommand; default to 'sync' when omitted
|
|
119
147
|
const subcommand = args.find(a => !a.startsWith('-')) ?? 'sync';
|
|
120
148
|
if (!SUBCOMMANDS.has(subcommand)) {
|
|
121
149
|
console.error(`Unknown subcommand: ${subcommand}`);
|
|
@@ -124,16 +152,21 @@ async function main() {
|
|
|
124
152
|
}
|
|
125
153
|
const root = findProjectRoot();
|
|
126
154
|
const fileConfig = loadConfigFile(root);
|
|
155
|
+
// `init` runs before a config file exists, so it short-circuits here
|
|
127
156
|
if (subcommand === 'init') {
|
|
128
157
|
await runInit(root);
|
|
129
158
|
return;
|
|
130
159
|
}
|
|
131
160
|
const config = resolveConfig(root, fileConfig);
|
|
161
|
+
// Path mappings let the scanner resolve aliased imports (e.g. @/components/…)
|
|
132
162
|
const pathMappings = loadTsConfigPathMappings(root);
|
|
163
|
+
// Route params from the CMS are merged with locally configured params;
|
|
164
|
+
// skip the network call for `pull` since it doesn't scan the codebase
|
|
133
165
|
let cmsRouteParams = {};
|
|
134
166
|
if (subcommand !== 'pull') {
|
|
135
167
|
cmsRouteParams = await fetchRouteParams(config);
|
|
136
168
|
}
|
|
169
|
+
// User-defined params (from config) take precedence over CMS-generated ones
|
|
137
170
|
const allRouteParams = resolveRouteParams(root, fileConfig);
|
|
138
171
|
const scanOpts = {
|
|
139
172
|
excludedDirs: fileConfig.excludedDirs,
|
|
@@ -155,13 +188,14 @@ async function main() {
|
|
|
155
188
|
await runPull(root, config, fileConfig, args);
|
|
156
189
|
return;
|
|
157
190
|
}
|
|
158
|
-
// sync (default)
|
|
191
|
+
// --- sync (default) ---
|
|
159
192
|
const outputDir = fileConfig.outputDir ?? path.join(root, 'public', 'locales');
|
|
160
193
|
const reportArg = getFlag(args, '--report');
|
|
161
194
|
await runSync(root, config, scanOpts, {
|
|
162
195
|
outputDir,
|
|
163
196
|
dryRun: hasFlag(args, '--dry-run'),
|
|
164
197
|
force: hasFlag(args, '--force'),
|
|
198
|
+
// Resolve report path relative to project root when not absolute
|
|
165
199
|
reportPath: reportArg
|
|
166
200
|
? path.isAbsolute(reportArg)
|
|
167
201
|
? reportArg
|
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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
|
|
1
|
+
{"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/init.d.ts
CHANGED
|
@@ -1,2 +1,10 @@
|
|
|
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
|
+
*/
|
|
1
9
|
export declare function runInit(root: string): Promise<void>;
|
|
2
10
|
//# sourceMappingURL=init.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAIA,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
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,CA6FzD"}
|
package/dist/commands/init.js
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
2
|
import fs from 'fs';
|
|
3
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
|
+
*/
|
|
4
12
|
export async function runInit(root) {
|
|
5
13
|
const { createInterface } = await import('readline');
|
|
14
|
+
// Use readline so we can show prompts and read answers synchronously one by one
|
|
6
15
|
const rl = createInterface({
|
|
7
16
|
input: process.stdin,
|
|
8
17
|
output: process.stdout,
|
|
@@ -11,6 +20,7 @@ export async function runInit(root) {
|
|
|
11
20
|
console.log('sync-translations init\n');
|
|
12
21
|
console.log('This creates .translationsrc.json in your project root.');
|
|
13
22
|
console.log('Values here override env vars for the sync-translations CLI.\n');
|
|
23
|
+
// Collect required config values from the user
|
|
14
24
|
const cmsUrl = await question('CMS URL (e.g. https://cms.example.com): ');
|
|
15
25
|
const projectId = await question('Project ID: ');
|
|
16
26
|
const apiKey = await question('API key: ');
|
|
@@ -18,8 +28,11 @@ export async function runInit(root) {
|
|
|
18
28
|
const pullTtlInput = await question('Pull TTL in seconds [300]: ');
|
|
19
29
|
const scaffoldInput = await question('Scaffold i18n files (settings, client, server, provider)? [Y/n]: ');
|
|
20
30
|
rl.close();
|
|
31
|
+
// Apply defaults for optional fields
|
|
21
32
|
const i18nDir = i18nDirInput.trim() || './src/lib/i18n';
|
|
33
|
+
// Dictionaries live one level deeper than the i18n dir
|
|
22
34
|
const outputDir = `${i18nDir.replace(/\/$/, '')}/dictionaries`;
|
|
35
|
+
// Build the config object — only include keys that the user actually provided
|
|
23
36
|
const config = {
|
|
24
37
|
$schema: './node_modules/@translation-cms/sync/schema.json',
|
|
25
38
|
};
|
|
@@ -32,17 +45,21 @@ export async function runInit(root) {
|
|
|
32
45
|
config['outputDir'] = outputDir;
|
|
33
46
|
if (pullTtlInput.trim()) {
|
|
34
47
|
const ttlSec = parseInt(pullTtlInput.trim(), 10);
|
|
48
|
+
// Convert seconds → milliseconds for the config field
|
|
35
49
|
if (!isNaN(ttlSec))
|
|
36
50
|
config['pullTtlMs'] = ttlSec * 1000;
|
|
37
51
|
}
|
|
52
|
+
// Write the config file
|
|
38
53
|
const configPath = path.join(root, '.translationsrc.json');
|
|
39
54
|
fs.writeFileSync(configPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
40
55
|
console.log(`\nCreated: ${configPath}`);
|
|
56
|
+
// Warn if an API key was written to disk — it should ideally stay in .env.local
|
|
41
57
|
if (config['apiKey']) {
|
|
42
58
|
console.log('\nWarning: .translationsrc.json contains an API key. Consider adding it to .gitignore:');
|
|
43
59
|
console.log(' echo ".translationsrc.json" >> .gitignore');
|
|
44
60
|
console.log('Or move the API key to CMS_SYNC_API_KEY in .env.local instead.');
|
|
45
61
|
}
|
|
62
|
+
// Default to scaffolding unless the user explicitly answers "n"
|
|
46
63
|
const doScaffold = scaffoldInput.trim().toLowerCase() !== 'n';
|
|
47
64
|
if (doScaffold) {
|
|
48
65
|
const absI18nDir = path.isAbsolute(i18nDir)
|
|
@@ -55,6 +72,7 @@ export async function runInit(root) {
|
|
|
55
72
|
console.log(` + src/lib/i18n/${f}`);
|
|
56
73
|
}
|
|
57
74
|
if (skipped.length > 0) {
|
|
75
|
+
// Files that already exist are left untouched to avoid overwriting customizations
|
|
58
76
|
console.log('\nSkipped (already exist):');
|
|
59
77
|
for (const f of skipped)
|
|
60
78
|
console.log(` ~ src/lib/i18n/${f}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAY;IACtC,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IAErD,MAAM,EAAE,GAAG,eAAe,CAAC;QACvB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACzB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAmB,EAAE,CACjD,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEzD,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CACP,gEAAgE,CACnE,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,0CAA0C,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,mCAAmC,CAAC,CAAC;IACzE,MAAM,YAAY,GAAG,MAAM,QAAQ,CAAC,6BAA6B,CAAC,CAAC;IACnE,MAAM,aAAa,GAAG,MAAM,QAAQ,CAChC,mEAAmE,CACtE,CAAC;IAEF,EAAE,CAAC,KAAK,EAAE,CAAC;IAEX,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,gBAAgB,CAAC;IACxD,MAAM,SAAS,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC;IAE/D,MAAM,MAAM,GAA4B;QACpC,OAAO,EAAE,kDAAkD;KAC9D,CAAC;IACF,IAAI,MAAM,CAAC,IAAI,EAAE;QAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IACpD,IAAI,SAAS,CAAC,IAAI,EAAE;QAAE,MAAM,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;IAC7D,IAAI,MAAM,CAAC,IAAI,EAAE;QAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IACpD,MAAM,CAAC,WAAW,CAAC,GAAG,SAAS,CAAC;IAChC,IAAI,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,MAAM,CAAC,WAAW,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;IAC5D,CAAC;IAED,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,CAAC;IAC3D,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACvE,OAAO,CAAC,GAAG,CAAC,cAAc,UAAU,EAAE,CAAC,CAAC;IAExC,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CACP,wFAAwF,CAC3F,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;QAC3D,OAAO,CAAC,GAAG,CACP,gEAAgE,CACnE,CAAC;IACN,CAAC;IAED,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC;IAC9D,IAAI,UAAU,EAAE,CAAC;QACb,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;YACvC,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAElC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,CAAC;QAEnE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,KAAK,MAAM,CAAC,IAAI,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;YAC1C,KAAK,MAAM,CAAC,IAAI,OAAO;gBAAE,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC;QAClE,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAC7B,OAAO,CAAC,GAAG,CACP,qFAAqF,CACxF,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CACP,uEAAuE,CAC1E,CAAC;IACN,CAAC;AACL,CAAC"}
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/pull.d.ts
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
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
|
+
*/
|
|
2
9
|
export declare function runPull(root: string, config: Config, fileConfig: TranslationsConfig, args: string[]): Promise<void>;
|
|
3
10
|
//# sourceMappingURL=pull.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
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,wBAAsB,OAAO,CACzB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,kBAAkB,EAC9B,IAAI,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,IAAI,CAAC,
|
|
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"}
|
package/dist/commands/pull.js
CHANGED
|
@@ -1,20 +1,33 @@
|
|
|
1
1
|
import path from 'path';
|
|
2
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
|
+
*/
|
|
3
10
|
export async function runPull(root, config, fileConfig, args) {
|
|
11
|
+
// --output overrides the config file value; fall back to public/locales
|
|
4
12
|
const outputArg = getFlag(args, '--output');
|
|
5
13
|
const outputDir = outputArg
|
|
6
14
|
? path.resolve(root, outputArg)
|
|
7
15
|
: fileConfig.outputDir
|
|
8
16
|
? path.resolve(root, fileConfig.outputDir)
|
|
9
17
|
: path.join(root, 'public', 'locales');
|
|
18
|
+
// --ttl overrides the config file value (already in ms)
|
|
10
19
|
const ttlArg = getFlag(args, '--ttl');
|
|
11
20
|
await pullTranslations(config, {
|
|
12
21
|
outputDir,
|
|
13
|
-
force: args.includes('--force'),
|
|
22
|
+
force: args.includes('--force'), // skip TTL cache check and always re-fetch
|
|
14
23
|
ttlMs: ttlArg ? parseInt(ttlArg, 10) : fileConfig.pullTtlMs,
|
|
15
|
-
env: getFlag(args, '--env'),
|
|
24
|
+
env: getFlag(args, '--env'), // target a specific environment (e.g. staging)
|
|
16
25
|
});
|
|
17
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
|
+
*/
|
|
18
31
|
function getFlag(args, flag) {
|
|
19
32
|
const idx = args.indexOf(flag);
|
|
20
33
|
return idx !== -1 && args[idx + 1] ? args[idx + 1] : undefined;
|
|
@@ -1 +1 @@
|
|
|
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,MAAM,CAAC,KAAK,UAAU,OAAO,CACzB,IAAY,EACZ,MAAc,EACd,UAA8B,EAC9B,IAAc;IAEd,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,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;
|
|
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,3 +1,15 @@
|
|
|
1
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
|
+
*/
|
|
2
14
|
export declare function runStatus(root: string, scanOpts: ScanOptions): void;
|
|
3
15
|
//# sourceMappingURL=status.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
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,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI,
|
|
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"}
|