i18nsmith 0.1.7 → 0.1.9

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 (80) hide show
  1. package/build.mjs +31 -0
  2. package/dist/index.js +109365 -22
  3. package/package.json +12 -7
  4. package/dist/commands/audit.js +0 -180
  5. package/dist/commands/audit.js.map +0 -1
  6. package/dist/commands/backup.js +0 -85
  7. package/dist/commands/backup.js.map +0 -1
  8. package/dist/commands/check.js +0 -151
  9. package/dist/commands/check.js.map +0 -1
  10. package/dist/commands/config.js +0 -235
  11. package/dist/commands/config.js.map +0 -1
  12. package/dist/commands/debug-patterns.js +0 -192
  13. package/dist/commands/debug-patterns.js.map +0 -1
  14. package/dist/commands/debug-patterns.test.js +0 -109
  15. package/dist/commands/debug-patterns.test.js.map +0 -1
  16. package/dist/commands/diagnose.js +0 -117
  17. package/dist/commands/diagnose.js.map +0 -1
  18. package/dist/commands/init.js +0 -450
  19. package/dist/commands/init.js.map +0 -1
  20. package/dist/commands/init.test.js +0 -74
  21. package/dist/commands/init.test.js.map +0 -1
  22. package/dist/commands/install-hooks.js +0 -52
  23. package/dist/commands/install-hooks.js.map +0 -1
  24. package/dist/commands/preflight.js +0 -417
  25. package/dist/commands/preflight.js.map +0 -1
  26. package/dist/commands/preflight.test.js +0 -108
  27. package/dist/commands/preflight.test.js.map +0 -1
  28. package/dist/commands/rename.js +0 -204
  29. package/dist/commands/rename.js.map +0 -1
  30. package/dist/commands/scaffold-adapter.js +0 -204
  31. package/dist/commands/scaffold-adapter.js.map +0 -1
  32. package/dist/commands/scaffold-adapter.test.js +0 -102
  33. package/dist/commands/scaffold-adapter.test.js.map +0 -1
  34. package/dist/commands/scan.js +0 -93
  35. package/dist/commands/scan.js.map +0 -1
  36. package/dist/commands/sync-seed.test.js +0 -86
  37. package/dist/commands/sync-seed.test.js.map +0 -1
  38. package/dist/commands/sync.js +0 -590
  39. package/dist/commands/sync.js.map +0 -1
  40. package/dist/commands/transform.js +0 -114
  41. package/dist/commands/transform.js.map +0 -1
  42. package/dist/commands/translate/csv-handler.js +0 -270
  43. package/dist/commands/translate/csv-handler.js.map +0 -1
  44. package/dist/commands/translate/executor.js +0 -117
  45. package/dist/commands/translate/executor.js.map +0 -1
  46. package/dist/commands/translate/index.js +0 -170
  47. package/dist/commands/translate/index.js.map +0 -1
  48. package/dist/commands/translate/reporter.js +0 -103
  49. package/dist/commands/translate/reporter.js.map +0 -1
  50. package/dist/commands/translate/types.js +0 -5
  51. package/dist/commands/translate/types.js.map +0 -1
  52. package/dist/commands/translate.js +0 -7
  53. package/dist/commands/translate.js.map +0 -1
  54. package/dist/commands/translate.test.js +0 -118
  55. package/dist/commands/translate.test.js.map +0 -1
  56. package/dist/e2e.test.js +0 -376
  57. package/dist/e2e.test.js.map +0 -1
  58. package/dist/index.js.map +0 -1
  59. package/dist/integration.test.js +0 -320
  60. package/dist/integration.test.js.map +0 -1
  61. package/dist/utils/diagnostics-exit.js +0 -49
  62. package/dist/utils/diagnostics-exit.js.map +0 -1
  63. package/dist/utils/diagnostics-exit.test.js +0 -40
  64. package/dist/utils/diagnostics-exit.test.js.map +0 -1
  65. package/dist/utils/diff-utils.js +0 -30
  66. package/dist/utils/diff-utils.js.map +0 -1
  67. package/dist/utils/diff-utils.test.js +0 -30
  68. package/dist/utils/diff-utils.test.js.map +0 -1
  69. package/dist/utils/exit-codes.js +0 -168
  70. package/dist/utils/exit-codes.js.map +0 -1
  71. package/dist/utils/package-manager.js +0 -40
  72. package/dist/utils/package-manager.js.map +0 -1
  73. package/dist/utils/pkg.js +0 -24
  74. package/dist/utils/pkg.js.map +0 -1
  75. package/dist/utils/provider-injector.js +0 -223
  76. package/dist/utils/provider-injector.js.map +0 -1
  77. package/dist/utils/provider-injector.test.js +0 -67
  78. package/dist/utils/provider-injector.test.js.map +0 -1
  79. package/dist/utils/scaffold.js +0 -197
  80. package/dist/utils/scaffold.js.map +0 -1
@@ -1,117 +0,0 @@
1
- import fs from 'fs/promises';
2
- import path from 'path';
3
- import chalk from 'chalk';
4
- import { loadConfig, diagnoseWorkspace } from '@i18nsmith/core';
5
- import { getDiagnosisExitSignal } from '../utils/diagnostics-exit.js';
6
- function printDiagnosisReport(report) {
7
- console.log(chalk.green(`Locales directory: ${report.localesDir}`));
8
- console.log(chalk.blue('\nLocales'));
9
- if (report.localeFiles.length === 0) {
10
- console.log(chalk.yellow(' • No locale files detected.'));
11
- }
12
- else {
13
- for (const entry of report.localeFiles) {
14
- const relPath = path.relative(process.cwd(), entry.path);
15
- const status = entry.missing
16
- ? chalk.red('missing')
17
- : entry.parseError
18
- ? chalk.red('invalid JSON')
19
- : `${entry.keyCount} keys`;
20
- console.log(` • ${entry.locale} — ${status}${entry.missing ? '' : ` (${relPath})`}`);
21
- }
22
- }
23
- console.log(chalk.blue('\nRuntime packages'));
24
- if (report.runtimePackages.length === 0) {
25
- console.log(chalk.yellow(' • None detected in package.json.'));
26
- }
27
- else {
28
- for (const pkg of report.runtimePackages) {
29
- console.log(` • ${pkg.name}@${pkg.version ?? 'latest'} (${pkg.source})`);
30
- }
31
- }
32
- console.log(chalk.blue('\nProvider candidates'));
33
- if (report.providerFiles.length === 0) {
34
- console.log(chalk.gray(' • No provider files discovered.'));
35
- }
36
- else {
37
- for (const provider of report.providerFiles) {
38
- const flags = [];
39
- if (provider.frameworkHint !== 'unknown') {
40
- flags.push(provider.frameworkHint);
41
- }
42
- if (provider.hasI18nProvider) {
43
- flags.push('wraps <I18nProvider>');
44
- }
45
- if (provider.usesTranslationHook) {
46
- flags.push('imports translation hook');
47
- }
48
- const flagLabel = flags.length ? ` (${flags.join(', ')})` : '';
49
- console.log(` • ${provider.relativePath}${flagLabel}`);
50
- }
51
- }
52
- console.log(chalk.blue('\nTranslation usage'));
53
- console.log(` • Files scanned: ${report.translationUsage.filesExamined} — ` +
54
- `${report.translationUsage.hookOccurrences} ${report.translationUsage.hookName} hooks, ` +
55
- `${report.translationUsage.identifierOccurrences} ${report.translationUsage.translationIdentifier}() calls`);
56
- if (report.translationUsage.hookExampleFiles.length) {
57
- console.log(chalk.gray(` Examples: ${report.translationUsage.hookExampleFiles.concat(report.translationUsage.identifierExampleFiles).slice(0, 5).join(', ')}`));
58
- }
59
- if (report.actionableItems.length) {
60
- console.log(chalk.blue('\nActionable items'));
61
- for (const item of report.actionableItems) {
62
- const label = item.severity === 'error' ? chalk.red('ERROR') : item.severity === 'warn' ? chalk.yellow('WARN') : chalk.cyan('INFO');
63
- console.log(` • [${label}] ${item.message}`);
64
- }
65
- }
66
- if (report.recommendations.length) {
67
- console.log(chalk.blue('\nRecommendations'));
68
- for (const rec of report.recommendations) {
69
- console.log(` • ${rec}`);
70
- }
71
- }
72
- if (report.conflicts.length) {
73
- console.log(chalk.red('\nConflicts'));
74
- for (const conflict of report.conflicts) {
75
- const files = conflict.files?.length ? ` (${conflict.files.join(', ')})` : '';
76
- console.log(` • ${conflict.message}${files}`);
77
- }
78
- }
79
- }
80
- export function registerDiagnose(program) {
81
- program
82
- .command('diagnose')
83
- .description('Detect existing i18n assets and potential merge conflicts')
84
- .option('-c, --config <path>', 'Path to i18nsmith config file', 'i18n.config.json')
85
- .option('--json', 'Print raw JSON results', false)
86
- .option('--report <path>', 'Write JSON report to a file (for CI or editors)')
87
- .action(async (options) => {
88
- console.log(chalk.blue('Running repository diagnostics...'));
89
- try {
90
- const config = await loadConfig(options.config);
91
- const report = await diagnoseWorkspace(config);
92
- if (options.report) {
93
- const outputPath = path.resolve(process.cwd(), options.report);
94
- await fs.mkdir(path.dirname(outputPath), { recursive: true });
95
- await fs.writeFile(outputPath, JSON.stringify(report, null, 2));
96
- console.log(chalk.green(`Diagnosis report written to ${outputPath}`));
97
- }
98
- if (options.json) {
99
- console.log(JSON.stringify(report, null, 2));
100
- }
101
- else {
102
- printDiagnosisReport(report);
103
- }
104
- const exitSignal = getDiagnosisExitSignal(report);
105
- if (exitSignal) {
106
- console.error(chalk.red(`\nBlocking conflicts detected (${report.conflicts.length}).`));
107
- console.error(chalk.red(`Exit code ${exitSignal.code}: ${exitSignal.reason}`));
108
- process.exitCode = exitSignal.code;
109
- }
110
- }
111
- catch (error) {
112
- console.error(chalk.red('Diagnose failed:'), error.message);
113
- process.exitCode = 1;
114
- }
115
- });
116
- }
117
- //# sourceMappingURL=diagnose.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"diagnose.js","sourceRoot":"","sources":["../../src/commands/diagnose.ts"],"names":[],"mappings":"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"}
@@ -1,450 +0,0 @@
1
- import inquirer from 'inquirer';
2
- import fs from 'fs/promises';
3
- import path from 'path';
4
- import chalk from 'chalk';
5
- import { diagnoseWorkspace, ensureGitignore } from '@i18nsmith/core';
6
- import { scaffoldTranslationContext, scaffoldI18next } from '../utils/scaffold.js';
7
- import { hasDependency, readPackageJson } from '../utils/pkg.js';
8
- /**
9
- * Parse a comma-separated list of glob patterns, respecting brace expansions.
10
- * Brace-expanded globs like `src/**\/*.{ts,tsx}` are kept as a single token.
11
- */
12
- export function parseGlobList(value) {
13
- const result = [];
14
- let current = '';
15
- let braceDepth = 0;
16
- for (const char of value) {
17
- if (char === '{') {
18
- braceDepth++;
19
- current += char;
20
- }
21
- else if (char === '}') {
22
- braceDepth = Math.max(0, braceDepth - 1);
23
- current += char;
24
- }
25
- else if (char === ',' && braceDepth === 0) {
26
- const trimmed = current.trim();
27
- if (trimmed)
28
- result.push(trimmed);
29
- current = '';
30
- }
31
- else {
32
- current += char;
33
- }
34
- }
35
- const trimmed = current.trim();
36
- if (trimmed)
37
- result.push(trimmed);
38
- return result;
39
- }
40
- /**
41
- * Run init in non-interactive mode with sensible defaults.
42
- * Auto-detects existing adapters and locales.
43
- */
44
- async function runNonInteractiveInit(commandOptions) {
45
- const workspaceRoot = process.cwd();
46
- const configPath = path.join(workspaceRoot, 'i18n.config.json');
47
- // Check if config already exists
48
- try {
49
- await fs.access(configPath);
50
- if (!commandOptions.merge) {
51
- console.log(chalk.yellow('Config file already exists. Use --merge to update existing config.'));
52
- console.log(chalk.dim(` ${configPath}`));
53
- return;
54
- }
55
- }
56
- catch {
57
- // Config doesn't exist, proceed
58
- }
59
- // Create a minimal config for diagnostics
60
- const minimalConfig = {
61
- version: 1,
62
- sourceLanguage: 'en',
63
- targetLanguages: [],
64
- localesDir: 'locales',
65
- include: ['src/**/*.{ts,tsx,js,jsx}'],
66
- exclude: ['node_modules/**'],
67
- minTextLength: 1,
68
- translation: { provider: 'manual' },
69
- translationAdapter: { module: 'react-i18next', hookName: 'useTranslation' },
70
- keyGeneration: { namespace: 'common', shortHashLen: 6 },
71
- seedTargetLocales: false,
72
- };
73
- // Try to detect existing setup
74
- let detectedAdapter;
75
- let detectedLocales = [];
76
- try {
77
- const report = await diagnoseWorkspace(minimalConfig, { workspaceRoot });
78
- // Detect adapter files
79
- if (report.adapterFiles.length > 0) {
80
- detectedAdapter = report.adapterFiles[0].path;
81
- console.log(chalk.blue(`Detected adapter: ${detectedAdapter}`));
82
- }
83
- // Detect existing locales
84
- const existingLocales = report.localeFiles.filter((entry) => !entry.missing && !entry.parseError);
85
- if (existingLocales.length > 0) {
86
- detectedLocales = existingLocales.map((entry) => entry.locale);
87
- console.log(chalk.blue(`Detected locales: ${detectedLocales.join(', ')}`));
88
- }
89
- }
90
- catch (error) {
91
- console.log(chalk.dim(`Could not run diagnostics: ${error.message}`));
92
- }
93
- // Determine source and target languages from detected locales
94
- let sourceLanguage = 'en';
95
- let targetLanguages = [];
96
- if (detectedLocales.length > 0) {
97
- // Use 'en' as source if present, otherwise first detected locale
98
- if (detectedLocales.includes('en')) {
99
- sourceLanguage = 'en';
100
- targetLanguages = detectedLocales.filter((l) => l !== 'en');
101
- }
102
- else {
103
- sourceLanguage = detectedLocales[0];
104
- targetLanguages = detectedLocales.slice(1);
105
- }
106
- }
107
- // Build the config
108
- const config = {
109
- version: 1,
110
- sourceLanguage,
111
- targetLanguages,
112
- localesDir: 'locales',
113
- include: [
114
- 'src/**/*.{ts,tsx,js,jsx}',
115
- 'app/**/*.{ts,tsx,js,jsx}',
116
- 'pages/**/*.{ts,tsx,js,jsx}',
117
- 'components/**/*.{ts,tsx,js,jsx}',
118
- ],
119
- exclude: ['node_modules/**', '**/*.test.*'],
120
- minTextLength: 1,
121
- translation: { provider: 'manual' },
122
- translationAdapter: {
123
- module: detectedAdapter ?? 'react-i18next',
124
- hookName: 'useTranslation',
125
- },
126
- keyGeneration: {
127
- namespace: 'common',
128
- shortHashLen: 6,
129
- },
130
- seedTargetLocales: false,
131
- };
132
- try {
133
- await fs.writeFile(configPath, JSON.stringify(config, null, 2));
134
- console.log(chalk.green(`\n✓ Configuration created at ${configPath}`));
135
- console.log(chalk.dim(' Source language: ' + sourceLanguage));
136
- if (targetLanguages.length > 0) {
137
- console.log(chalk.dim(' Target languages: ' + targetLanguages.join(', ')));
138
- }
139
- if (detectedAdapter) {
140
- console.log(chalk.dim(' Adapter: ' + detectedAdapter));
141
- }
142
- // Ensure .gitignore has i18nsmith artifacts
143
- const gitignoreResult = await ensureGitignore(workspaceRoot);
144
- if (gitignoreResult.updated) {
145
- console.log(chalk.green(`✓ Updated .gitignore with i18nsmith artifacts`));
146
- }
147
- console.log(chalk.blue('\nRun "i18nsmith check" to verify your setup.'));
148
- }
149
- catch (error) {
150
- console.error(chalk.red('Failed to write configuration file:'), error);
151
- }
152
- }
153
- export function registerInit(program) {
154
- program
155
- .command('init')
156
- .description('Initialize i18nsmith configuration')
157
- .option('--merge', 'Merge with existing locales/runtimes when detected', false)
158
- .option('-y, --yes', 'Skip prompts and use defaults (non-interactive mode)', false)
159
- .action(async (commandOptions) => {
160
- console.log(chalk.blue('Initializing i18nsmith configuration...'));
161
- // Non-interactive mode with sensible defaults
162
- if (commandOptions.yes) {
163
- await runNonInteractiveInit(commandOptions);
164
- return;
165
- }
166
- const answers = await inquirer.prompt([
167
- {
168
- type: 'input',
169
- name: 'sourceLanguage',
170
- message: 'What is the source language?',
171
- default: 'en',
172
- },
173
- {
174
- type: 'input',
175
- name: 'targetLanguages',
176
- message: 'Which target languages do you need? (comma separated)',
177
- default: 'fr',
178
- },
179
- {
180
- type: 'input',
181
- name: 'localesDir',
182
- message: 'Where should locale files be stored?',
183
- default: 'locales',
184
- },
185
- {
186
- type: 'input',
187
- name: 'include',
188
- message: 'Which files should be scanned? (comma separated glob patterns)',
189
- default: 'src/**/*.{ts,tsx,js,jsx}, app/**/*.{ts,tsx,js,jsx}, pages/**/*.{ts,tsx,js,jsx}, components/**/*.{ts,tsx,js,jsx}',
190
- },
191
- {
192
- type: 'input',
193
- name: 'exclude',
194
- message: 'Which files should be excluded? (comma separated glob patterns)',
195
- default: 'node_modules/**,**/*.test.*',
196
- },
197
- {
198
- type: 'input',
199
- name: 'minTextLength',
200
- message: 'Minimum length for translatable text?',
201
- default: '1',
202
- validate: (input) => {
203
- const num = parseInt(input, 10);
204
- return !isNaN(num) && num >= 0 ? true : 'Please enter a non-negative number';
205
- },
206
- },
207
- {
208
- type: 'list',
209
- name: 'service',
210
- message: 'Which translation service do you want to use?',
211
- choices: ['google', 'deepl', 'manual'],
212
- default: 'google',
213
- },
214
- {
215
- type: 'input',
216
- name: 'translationSecretEnvVar',
217
- message: 'Name of the environment variable containing your translation API key',
218
- when: (answers) => answers.service !== 'manual',
219
- default: (answers) => answers.service === 'deepl' ? 'DEEPL_API_KEY' : 'GOOGLE_TRANSLATE_API_KEY',
220
- },
221
- {
222
- type: 'list',
223
- name: 'adapterPreset',
224
- message: 'How should transformed components access translations?',
225
- choices: [
226
- { name: 'react-i18next (default)', value: 'react-i18next' },
227
- { name: 'Custom hook/module', value: 'custom' },
228
- ],
229
- default: 'react-i18next',
230
- },
231
- {
232
- type: 'input',
233
- name: 'customAdapterModule',
234
- message: 'Provide the module specifier for your translation hook (e.g. "@/contexts/translation-context")',
235
- when: (answers) => answers.adapterPreset === 'custom',
236
- validate: (input) => (input && input.trim().length > 0 ? true : 'Module specifier cannot be empty'),
237
- },
238
- {
239
- type: 'input',
240
- name: 'customAdapterHook',
241
- message: 'Name of the hook/function to import (default: useTranslation)',
242
- when: (answers) => answers.adapterPreset === 'custom',
243
- default: 'useTranslation',
244
- },
245
- {
246
- type: 'confirm',
247
- name: 'scaffoldAdapter',
248
- message: 'Scaffold a lightweight translation context file?',
249
- when: (answers) => answers.adapterPreset === 'custom',
250
- default: true,
251
- },
252
- {
253
- type: 'input',
254
- name: 'scaffoldAdapterPath',
255
- message: 'Path to scaffold the translation context file (relative to project root)',
256
- when: (answers) => answers.scaffoldAdapter,
257
- default: 'src/contexts/translation-context.tsx',
258
- },
259
- {
260
- type: 'confirm',
261
- name: 'scaffoldReactRuntime',
262
- message: 'Scaffold i18next initializer and provider?',
263
- when: (answers) => answers.adapterPreset === 'react-i18next',
264
- default: true,
265
- },
266
- {
267
- type: 'input',
268
- name: 'reactI18nPath',
269
- message: 'Path for i18next initializer (e.g. src/lib/i18n.ts)',
270
- when: (answers) => answers.scaffoldReactRuntime,
271
- default: 'src/lib/i18n.ts',
272
- },
273
- {
274
- type: 'input',
275
- name: 'reactProviderPath',
276
- message: 'Path for I18nProvider component (e.g. src/components/i18n-provider.tsx)',
277
- when: (answers) => answers.scaffoldReactRuntime,
278
- default: 'src/components/i18n-provider.tsx',
279
- },
280
- {
281
- type: 'input',
282
- name: 'keyNamespace',
283
- message: 'Namespace prefix for generated keys',
284
- default: 'common',
285
- },
286
- {
287
- type: 'input',
288
- name: 'shortHashLen',
289
- message: 'Length of short hash suffix for keys',
290
- default: '6',
291
- validate: (input) => {
292
- const num = parseInt(input, 10);
293
- return !isNaN(num) && num > 0 ? true : 'Please enter a positive number';
294
- },
295
- },
296
- {
297
- type: 'confirm',
298
- name: 'seedTargetLocales',
299
- message: 'Seed target locale files with empty values?',
300
- default: false,
301
- },
302
- ]);
303
- const adapterModule = answers.adapterPreset === 'custom'
304
- ? answers.customAdapterModule?.trim()
305
- : 'react-i18next';
306
- const adapterHook = answers.adapterPreset === 'custom'
307
- ? (answers.customAdapterHook?.trim() || 'useTranslation')
308
- : 'useTranslation';
309
- const translationConfig = answers.service === 'manual'
310
- ? { provider: 'manual' }
311
- : {
312
- provider: answers.service,
313
- secretEnvVar: answers.translationSecretEnvVar?.trim() || undefined,
314
- concurrency: 5,
315
- };
316
- const config = {
317
- version: 1,
318
- sourceLanguage: answers.sourceLanguage,
319
- targetLanguages: parseGlobList(answers.targetLanguages),
320
- localesDir: answers.localesDir,
321
- include: parseGlobList(answers.include),
322
- exclude: parseGlobList(answers.exclude),
323
- minTextLength: parseInt(answers.minTextLength, 10),
324
- translation: translationConfig,
325
- translationAdapter: {
326
- module: adapterModule ?? 'react-i18next',
327
- hookName: adapterHook,
328
- },
329
- keyGeneration: {
330
- namespace: answers.keyNamespace,
331
- shortHashLen: parseInt(answers.shortHashLen, 10),
332
- },
333
- seedTargetLocales: answers.seedTargetLocales,
334
- };
335
- const workspaceRoot = process.cwd();
336
- const mergeDecision = await maybePromptMergeStrategy(config, workspaceRoot, Boolean(commandOptions.merge));
337
- if (mergeDecision?.aborted) {
338
- console.log(chalk.yellow('Aborting init to avoid overwriting existing i18n assets. Re-run with --merge to bypass.'));
339
- return;
340
- }
341
- const configPath = path.join(workspaceRoot, 'i18n.config.json');
342
- try {
343
- await fs.writeFile(configPath, JSON.stringify(config, null, 2));
344
- console.log(chalk.green(`\nConfiguration created at ${configPath}`));
345
- // Ensure .gitignore has i18nsmith artifacts
346
- const gitignoreResult = await ensureGitignore(workspaceRoot);
347
- if (gitignoreResult.updated) {
348
- console.log(chalk.green(`Updated .gitignore with i18nsmith artifacts`));
349
- }
350
- if (answers.scaffoldAdapter && answers.scaffoldAdapterPath) {
351
- try {
352
- await scaffoldTranslationContext(answers.scaffoldAdapterPath, answers.sourceLanguage, {
353
- localesDir: answers.localesDir,
354
- });
355
- console.log(chalk.green(`Translation context scaffolded at ${answers.scaffoldAdapterPath}`));
356
- }
357
- catch (error) {
358
- console.warn(chalk.yellow(`Skipping adapter scaffold: ${error.message}`));
359
- }
360
- }
361
- if (answers.adapterPreset === 'react-i18next' &&
362
- answers.scaffoldReactRuntime &&
363
- answers.reactI18nPath &&
364
- answers.reactProviderPath) {
365
- try {
366
- await scaffoldI18next(answers.reactI18nPath, answers.reactProviderPath, answers.sourceLanguage, answers.localesDir);
367
- console.log(chalk.green('react-i18next runtime scaffolded:'));
368
- console.log(chalk.green(` • ${answers.reactI18nPath}`));
369
- console.log(chalk.green(` • ${answers.reactProviderPath}`));
370
- console.log(chalk.blue('\nWrap your app with the provider (e.g. Next.js providers.tsx):'));
371
- console.log(chalk.cyan(`import { I18nProvider } from '${answers.reactProviderPath.replace(/\\/g, '/').replace(/\.tsx?$/, '')}';\n<I18nProvider>{children}</I18nProvider>`));
372
- }
373
- catch (error) {
374
- console.warn(chalk.yellow(`Skipping i18next scaffold: ${error.message}`));
375
- }
376
- }
377
- if (answers.adapterPreset === 'react-i18next') {
378
- const pkg = await readPackageJson();
379
- const missingDeps = ['react-i18next', 'i18next'].filter((dep) => !hasDependency(pkg, dep));
380
- if (missingDeps.length) {
381
- console.log(chalk.yellow('\nDependencies missing for react-i18next adapter:'));
382
- missingDeps.forEach((dep) => console.log(chalk.yellow(` • ${dep}`)));
383
- console.log(chalk.blue('Install them with:'));
384
- console.log(chalk.cyan(' pnpm add react-i18next i18next'));
385
- }
386
- }
387
- if (mergeDecision?.strategy) {
388
- console.log(chalk.blue(`Merge strategy selected: ${mergeDecision.strategy}. Use this when running i18nsmith sync or diagnose to reconcile locales.`));
389
- }
390
- }
391
- catch (error) {
392
- console.error(chalk.red('Failed to write configuration file:'), error);
393
- }
394
- });
395
- }
396
- async function maybePromptMergeStrategy(config, workspaceRoot, mergeRequested) {
397
- try {
398
- const report = await diagnoseWorkspace(config, { workspaceRoot });
399
- const existingLocales = report.localeFiles.filter((entry) => !entry.missing && !entry.parseError);
400
- const hasRuntime = report.adapterFiles.length > 0 || report.providerFiles.some((provider) => provider.hasI18nProvider);
401
- if (!existingLocales.length && !hasRuntime) {
402
- return { strategy: null, aborted: false };
403
- }
404
- console.log(chalk.yellow('\nExisting i18n assets detected:'));
405
- if (existingLocales.length) {
406
- const localeList = existingLocales.map((entry) => entry.locale).join(', ');
407
- console.log(` • Locales: ${localeList}`);
408
- }
409
- if (hasRuntime) {
410
- console.log(' • Runtime files already present.');
411
- }
412
- if (report.conflicts.length) {
413
- for (const conflict of report.conflicts) {
414
- console.log(chalk.red(` • ${conflict.message}`));
415
- }
416
- }
417
- if (!mergeRequested) {
418
- const { proceed } = await inquirer.prompt([
419
- {
420
- type: 'confirm',
421
- name: 'proceed',
422
- message: 'Merge with the existing setup instead of overwriting?',
423
- default: true,
424
- },
425
- ]);
426
- if (!proceed) {
427
- return { strategy: null, aborted: true };
428
- }
429
- }
430
- const { strategy } = await inquirer.prompt([
431
- {
432
- type: 'list',
433
- name: 'strategy',
434
- message: 'Choose a merge strategy for existing locale keys',
435
- choices: [
436
- { name: 'Keep source values (append new keys only)', value: 'keep-source' },
437
- { name: 'Overwrite with placeholders (backup first)', value: 'overwrite' },
438
- { name: 'Interactive review during sync', value: 'interactive' },
439
- ],
440
- default: 'keep-source',
441
- },
442
- ]);
443
- return { strategy, aborted: false };
444
- }
445
- catch (error) {
446
- console.warn(chalk.gray(`Skipping merge diagnostics: ${error.message}`));
447
- return { strategy: null, aborted: false };
448
- }
449
- }
450
- //# sourceMappingURL=init.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}