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,108 +0,0 @@
1
- /**
2
- * Tests for the preflight onboarding check command
3
- */
4
- import { describe, it, expect, beforeEach, afterEach } from 'vitest';
5
- import fs from 'fs/promises';
6
- import path from 'path';
7
- import os from 'os';
8
- // We'll test the core validation logic by importing the module
9
- // For now, test the file structure and utilities
10
- describe('preflight command', () => {
11
- let tmpDir;
12
- beforeEach(async () => {
13
- tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), 'i18nsmith-preflight-test-'));
14
- });
15
- afterEach(async () => {
16
- await fs.rm(tmpDir, { recursive: true, force: true });
17
- });
18
- describe('config file detection', () => {
19
- it('should detect when config file exists', async () => {
20
- const config = {
21
- sourceLanguage: 'en',
22
- targetLanguages: ['fr', 'de'],
23
- localesDir: 'locales',
24
- include: ['src/**/*.tsx'],
25
- };
26
- await fs.writeFile(path.join(tmpDir, 'i18n.config.json'), JSON.stringify(config));
27
- const configPath = path.join(tmpDir, 'i18n.config.json');
28
- const exists = await fs.access(configPath).then(() => true).catch(() => false);
29
- expect(exists).toBe(true);
30
- });
31
- it('should detect when config file is missing', async () => {
32
- const configPath = path.join(tmpDir, 'i18n.config.json');
33
- const exists = await fs.access(configPath).then(() => true).catch(() => false);
34
- expect(exists).toBe(false);
35
- });
36
- });
37
- describe('locales directory validation', () => {
38
- it('should detect when locales directory exists', async () => {
39
- await fs.mkdir(path.join(tmpDir, 'locales'));
40
- const localesPath = path.join(tmpDir, 'locales');
41
- const stats = await fs.stat(localesPath);
42
- expect(stats.isDirectory()).toBe(true);
43
- });
44
- it('should detect when locales directory is missing', async () => {
45
- const localesPath = path.join(tmpDir, 'locales');
46
- const exists = await fs.access(localesPath).then(() => true).catch(() => false);
47
- expect(exists).toBe(false);
48
- });
49
- });
50
- describe('source locale validation', () => {
51
- it('should detect valid source locale file', async () => {
52
- await fs.mkdir(path.join(tmpDir, 'locales'));
53
- await fs.writeFile(path.join(tmpDir, 'locales', 'en.json'), JSON.stringify({ 'hello.world': 'Hello World' }));
54
- const localePath = path.join(tmpDir, 'locales', 'en.json');
55
- const content = await fs.readFile(localePath, 'utf8');
56
- const data = JSON.parse(content);
57
- expect(data).toHaveProperty('hello.world');
58
- });
59
- it('should detect invalid JSON in locale file', async () => {
60
- await fs.mkdir(path.join(tmpDir, 'locales'));
61
- await fs.writeFile(path.join(tmpDir, 'locales', 'en.json'), '{ invalid json }');
62
- const localePath = path.join(tmpDir, 'locales', 'en.json');
63
- const content = await fs.readFile(localePath, 'utf8');
64
- expect(() => JSON.parse(content)).toThrow();
65
- });
66
- });
67
- describe('write permission checks', () => {
68
- it('should be able to write to temp directory', async () => {
69
- const testFile = path.join(tmpDir, '.write-test');
70
- await fs.writeFile(testFile, 'test');
71
- const content = await fs.readFile(testFile, 'utf8');
72
- await fs.unlink(testFile);
73
- expect(content).toBe('test');
74
- });
75
- });
76
- describe('config validation', () => {
77
- it('should validate source language is present', () => {
78
- const config = {
79
- sourceLanguage: 'en',
80
- targetLanguages: ['fr'],
81
- localesDir: 'locales',
82
- include: ['src/**/*.tsx'],
83
- };
84
- expect(config.sourceLanguage).toBe('en');
85
- expect(config.sourceLanguage.length).toBeGreaterThanOrEqual(2);
86
- });
87
- it('should detect missing target languages', () => {
88
- const config = {
89
- sourceLanguage: 'en',
90
- targetLanguages: [],
91
- localesDir: 'locales',
92
- include: ['src/**/*.tsx'],
93
- };
94
- expect(config.targetLanguages.length).toBe(0);
95
- });
96
- it('should detect node_modules in include patterns', () => {
97
- const config = {
98
- sourceLanguage: 'en',
99
- targetLanguages: ['fr'],
100
- localesDir: 'locales',
101
- include: ['src/**/*.tsx', 'node_modules/**/*.tsx'],
102
- };
103
- const hasNodeModules = config.include.some(p => p.includes('node_modules'));
104
- expect(hasNodeModules).toBe(true);
105
- });
106
- });
107
- });
108
- //# sourceMappingURL=preflight.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"preflight.test.js","sourceRoot":"","sources":["../../src/commands/preflight.test.ts"],"names":[],"mappings":"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"}
@@ -1,204 +0,0 @@
1
- import chalk from 'chalk';
2
- import path from 'node:path';
3
- import { promises as fs } from 'node:fs';
4
- import { loadConfig, KeyRenamer } from '@i18nsmith/core';
5
- /**
6
- * Registers rename-related commands (rename-key, rename-keys)
7
- */
8
- export function registerRename(program) {
9
- program
10
- .command('rename-key')
11
- .description('Rename translation keys across source files and locale JSON')
12
- .argument('<oldKey>', 'Existing translation key')
13
- .argument('<newKey>', 'Replacement translation key')
14
- .option('-c, --config <path>', 'Path to i18nsmith config file', 'i18n.config.json')
15
- .option('--json', 'Print raw JSON results', false)
16
- .option('--report <path>', 'Write JSON summary to a file (for CI or editors)')
17
- .option('--write', 'Write changes to disk (defaults to dry-run)', false)
18
- .action(async (oldKey, newKey, options) => {
19
- console.log(chalk.blue(options.write ? 'Renaming translation key...' : 'Planning key rename (dry-run)...'));
20
- try {
21
- const config = await loadConfig(options.config);
22
- const renamer = new KeyRenamer(config);
23
- const summary = await renamer.rename(oldKey, newKey, { write: options.write });
24
- if (options.report) {
25
- const outputPath = path.resolve(process.cwd(), options.report);
26
- await fs.mkdir(path.dirname(outputPath), { recursive: true });
27
- await fs.writeFile(outputPath, JSON.stringify(summary, null, 2));
28
- console.log(chalk.green(`Rename report written to ${outputPath}`));
29
- }
30
- if (options.json) {
31
- console.log(JSON.stringify(summary, null, 2));
32
- return;
33
- }
34
- printRenameSummary(summary);
35
- if (!options.write) {
36
- console.log(chalk.cyan('\nšŸ“‹ DRY RUN - No files were modified'));
37
- console.log(chalk.yellow('Run again with --write to apply changes.'));
38
- }
39
- }
40
- catch (error) {
41
- console.error(chalk.red('Rename failed:'), error.message);
42
- process.exitCode = 1;
43
- }
44
- });
45
- program
46
- .command('rename-keys')
47
- .description('Rename multiple translation keys using a mapping file')
48
- .requiredOption('-m, --map <path>', 'Path to JSON map file (object or array of {"from","to"})')
49
- .option('-c, --config <path>', 'Path to i18nsmith config file', 'i18n.config.json')
50
- .option('--json', 'Print raw JSON results', false)
51
- .option('--report <path>', 'Write JSON summary to a file (for CI or editors)')
52
- .option('--write', 'Write changes to disk (defaults to dry-run)', false)
53
- .option('--diff', 'Display unified diffs for files that would change', false)
54
- .action(async (options) => {
55
- console.log(chalk.blue(options.write ? 'Renaming translation keys from map...' : 'Planning batch rename (dry-run)...'));
56
- try {
57
- const config = await loadConfig(options.config);
58
- const mappings = await loadRenameMappings(options.map);
59
- const renamer = new KeyRenamer(config);
60
- const summary = await renamer.renameBatch(mappings, { write: options.write, diff: options.diff });
61
- if (options.report) {
62
- const outputPath = path.resolve(process.cwd(), options.report);
63
- await fs.mkdir(path.dirname(outputPath), { recursive: true });
64
- await fs.writeFile(outputPath, JSON.stringify(summary, null, 2));
65
- console.log(chalk.green(`Batch rename report written to ${outputPath}`));
66
- }
67
- if (options.json) {
68
- console.log(JSON.stringify(summary, null, 2));
69
- return;
70
- }
71
- printRenameBatchSummary(summary);
72
- // Print source file diffs if requested
73
- if (options.diff && summary.diffs.length > 0) {
74
- console.log(chalk.blue('\nSource file changes:'));
75
- for (const diff of summary.diffs) {
76
- console.log(chalk.cyan(`\n--- ${diff.relativePath} (${diff.changes} change${diff.changes === 1 ? '' : 's'}) ---`));
77
- console.log(diff.diff);
78
- }
79
- }
80
- if (!options.write) {
81
- console.log(chalk.cyan('\nšŸ“‹ DRY RUN - No files were modified'));
82
- console.log(chalk.yellow('Run again with --write to apply changes.'));
83
- }
84
- }
85
- catch (error) {
86
- console.error(chalk.red('Batch rename failed:'), error.message);
87
- process.exitCode = 1;
88
- }
89
- });
90
- }
91
- function printRenameSummary(summary) {
92
- console.log(chalk.green(`Updated ${summary.occurrences} occurrence${summary.occurrences === 1 ? '' : 's'} across ${summary.filesUpdated.length} file${summary.filesUpdated.length === 1 ? '' : 's'}.`));
93
- if (summary.filesUpdated.length) {
94
- console.log(chalk.blue('Files updated:'));
95
- summary.filesUpdated.forEach((file) => console.log(` • ${file}`));
96
- }
97
- if (summary.localeStats.length) {
98
- console.log(chalk.blue('Locale updates:'));
99
- summary.localeStats.forEach((stat) => {
100
- console.log(` • ${stat.locale}: ${stat.added.length} added, ${stat.updated.length} updated, ${stat.removed.length} removed (total ${stat.totalKeys})`);
101
- });
102
- }
103
- else if (summary.localePreview.length) {
104
- console.log(chalk.blue('Locale impact preview:'));
105
- summary.localePreview.forEach((preview) => {
106
- const status = preview.missing
107
- ? chalk.yellow('missing source key')
108
- : preview.duplicate
109
- ? chalk.red('destination already exists')
110
- : chalk.green('ready');
111
- console.log(` • ${preview.locale}: ${status}`);
112
- });
113
- }
114
- if (summary.missingLocales.length) {
115
- console.log(chalk.yellow(`Locales missing the original key: ${summary.missingLocales.join(', ')}. Update them manually if needed.`));
116
- }
117
- }
118
- function printRenameBatchSummary(summary) {
119
- console.log(chalk.green(`Updated ${summary.occurrences} occurrence${summary.occurrences === 1 ? '' : 's'} across ${summary.filesUpdated.length} file${summary.filesUpdated.length === 1 ? '' : 's'}.`));
120
- if (summary.mappingSummaries.length === 0) {
121
- console.log(chalk.yellow('No mappings were applied.'));
122
- }
123
- else {
124
- console.log(chalk.blue('Mappings:'));
125
- summary.mappingSummaries.slice(0, 50).forEach((mapping) => {
126
- const refLabel = `${mapping.occurrences} reference${mapping.occurrences === 1 ? '' : 's'}`;
127
- console.log(` • ${mapping.from} → ${mapping.to} (${refLabel})`);
128
- const duplicates = mapping.localePreview
129
- .filter((preview) => preview.duplicate)
130
- .map((preview) => preview.locale);
131
- const missing = mapping.missingLocales;
132
- const annotations = [
133
- missing.length ? `missing locales: ${missing.join(', ')}` : null,
134
- duplicates.length ? `target already exists in: ${duplicates.join(', ')}` : null,
135
- ].filter(Boolean);
136
- if (annotations.length) {
137
- console.log(chalk.gray(` ${annotations.join(' Ā· ')}`));
138
- }
139
- });
140
- if (summary.mappingSummaries.length > 50) {
141
- console.log(chalk.gray(` ...and ${summary.mappingSummaries.length - 50} more.`));
142
- }
143
- }
144
- if (summary.filesUpdated.length) {
145
- console.log(chalk.blue('Files updated:'));
146
- summary.filesUpdated.forEach((file) => console.log(` • ${file}`));
147
- }
148
- if (summary.localeStats.length) {
149
- console.log(chalk.blue('Locale updates:'));
150
- summary.localeStats.forEach((stat) => {
151
- console.log(` • ${stat.locale}: ${stat.added.length} added, ${stat.updated.length} updated, ${stat.removed.length} removed (total ${stat.totalKeys})`);
152
- });
153
- }
154
- }
155
- async function loadRenameMappings(mapPath) {
156
- if (!mapPath) {
157
- throw new Error('A path to the rename map is required.');
158
- }
159
- const resolvedPath = path.isAbsolute(mapPath) ? mapPath : path.resolve(process.cwd(), mapPath);
160
- let fileContents;
161
- try {
162
- fileContents = await fs.readFile(resolvedPath, 'utf8');
163
- }
164
- catch (error) {
165
- const err = error;
166
- if (err.code === 'ENOENT') {
167
- throw new Error(`Rename map not found at ${resolvedPath}.`);
168
- }
169
- throw new Error(`Unable to read rename map at ${resolvedPath}: ${err.message}`);
170
- }
171
- let parsed;
172
- try {
173
- parsed = JSON.parse(fileContents);
174
- }
175
- catch (error) {
176
- throw new Error(`Rename map contains invalid JSON: ${error.message}`);
177
- }
178
- const mappings = normalizeRenameMap(parsed);
179
- if (!mappings.length) {
180
- throw new Error('Rename map is empty. Provide at least one {"from": "foo", "to": "bar"} entry.');
181
- }
182
- return mappings;
183
- }
184
- function normalizeRenameMap(input) {
185
- if (Array.isArray(input)) {
186
- return input
187
- .map((item) => {
188
- if (typeof item !== 'object' || item === null) {
189
- return undefined;
190
- }
191
- const from = 'from' in item ? String(item.from ?? '') : '';
192
- const to = 'to' in item ? String(item.to ?? '') : '';
193
- return { from: from.trim(), to: to.trim() };
194
- })
195
- .filter((entry) => Boolean(entry && entry.from && entry.to && entry.from !== entry.to));
196
- }
197
- if (input && typeof input === 'object') {
198
- return Object.entries(input)
199
- .map(([from, to]) => ({ from: from.trim(), to: typeof to === 'string' ? to.trim() : '' }))
200
- .filter((entry) => Boolean(entry.from) && Boolean(entry.to) && entry.from !== entry.to);
201
- }
202
- throw new Error('Rename map must be either an object ("old":"new") or an array of {"from","to"}.');
203
- }
204
- //# sourceMappingURL=rename.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rename.js","sourceRoot":"","sources":["../../src/commands/rename.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,UAAU,EAA4E,MAAM,iBAAiB,CAAC;AAcnI;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,YAAY,CAAC;SACrB,WAAW,CAAC,6DAA6D,CAAC;SAC1E,QAAQ,CAAC,UAAU,EAAE,0BAA0B,CAAC;SAChD,QAAQ,CAAC,UAAU,EAAE,6BAA6B,CAAC;SACnD,MAAM,CAAC,qBAAqB,EAAE,+BAA+B,EAAE,kBAAkB,CAAC;SAClF,MAAM,CAAC,QAAQ,EAAE,wBAAwB,EAAE,KAAK,CAAC;SACjD,MAAM,CAAC,iBAAiB,EAAE,kDAAkD,CAAC;SAC7E,MAAM,CAAC,SAAS,EAAE,6CAA6C,EAAE,KAAK,CAAC;SACvE,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,MAAc,EAAE,OAA0C,EAAE,EAAE;QAC3F,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAE5G,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;YAE/E,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC/D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,4BAA4B,UAAU,EAAE,CAAC,CAAC,CAAC;YACrE,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC9C,OAAO;YACT,CAAC;YAED,kBAAkB,CAAC,OAAO,CAAC,CAAC;YAE5B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;gBACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;YACrE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,OAAO;SACJ,OAAO,CAAC,aAAa,CAAC;SACtB,WAAW,CAAC,uDAAuD,CAAC;SACpE,cAAc,CAAC,kBAAkB,EAAE,0DAA0D,CAAC;SAC9F,MAAM,CAAC,qBAAqB,EAAE,+BAA+B,EAAE,kBAAkB,CAAC;SAClF,MAAM,CAAC,QAAQ,EAAE,wBAAwB,EAAE,KAAK,CAAC;SACjD,MAAM,CAAC,iBAAiB,EAAE,kDAAkD,CAAC;SAC7E,MAAM,CAAC,SAAS,EAAE,6CAA6C,EAAE,KAAK,CAAC;SACvE,MAAM,CAAC,QAAQ,EAAE,mDAAmD,EAAE,KAAK,CAAC;SAC5E,MAAM,CAAC,KAAK,EAAE,OAAyB,EAAE,EAAE;QAC1C,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,uCAAuC,CAAC,CAAC,CAAC,oCAAoC,CAAC,CAC3G,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAChD,MAAM,QAAQ,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACvD,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;YACvC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YAElG,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBAC/D,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9D,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,kCAAkC,UAAU,EAAE,CAAC,CAAC,CAAC;YAC3E,CAAC;YAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC9C,OAAO;YACT,CAAC;YAED,uBAAuB,CAAC,OAAO,CAAC,CAAC;YAEjC,uCAAuC;YACvC,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;gBAClD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;oBACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,OAAO,UAAU,IAAI,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;oBACnH,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,CAAC;gBACjE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC;YACxE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAG,KAAe,CAAC,OAAO,CAAC,CAAC;YAC3E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,kBAAkB,CAAC,OAAyB;IACnD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CACT,WAAW,OAAO,CAAC,WAAW,cAAc,OAAO,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,OAAO,CAAC,YAAY,CAAC,MAAM,QAAQ,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAC9K,CACF,CAAC;IAEF,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACnC,OAAO,CAAC,GAAG,CACT,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,WAAW,IAAI,CAAC,OAAO,CAAC,MAAM,aAAa,IAAI,CAAC,OAAO,CAAC,MAAM,mBAAmB,IAAI,CAAC,SAAS,GAAG,CAC3I,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;QAClD,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACxC,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO;gBAC5B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC;gBACpC,CAAC,CAAC,OAAO,CAAC,SAAS;oBACnB,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,CAAC;oBACzC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;QAClC,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CACV,qCAAqC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAC1G,CACF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAC,OAA8B;IAC7D,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,KAAK,CACT,WAAW,OAAO,CAAC,WAAW,cAAc,OAAO,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,WAAW,OAAO,CAAC,YAAY,CAAC,MAAM,QAAQ,OAAO,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,CAC9K,CACF,CAAC;IAEF,IAAI,OAAO,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,2BAA2B,CAAC,CAAC,CAAC;IACzD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;QACrC,OAAO,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YACxD,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,WAAW,aAAa,OAAO,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YAC3F,OAAO,CAAC,GAAG,CAAC,OAAO,OAAO,CAAC,IAAI,MAAM,OAAO,CAAC,EAAE,KAAK,QAAQ,GAAG,CAAC,CAAC;YAEjE,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa;iBACrC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC;iBACtC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC;YAEvC,MAAM,WAAW,GAAG;gBAClB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,oBAAoB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;gBAChE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,6BAA6B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;aAChF,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YAElB,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;gBACvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAC9D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,EAAE,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,gBAAgB,CAAC,MAAM,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IAED,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;QAChC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;QAC1C,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAC3C,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACnC,OAAO,CAAC,GAAG,CACT,OAAO,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,KAAK,CAAC,MAAM,WAAW,IAAI,CAAC,OAAO,CAAC,MAAM,aAAa,IAAI,CAAC,OAAO,CAAC,MAAM,mBAAmB,IAAI,CAAC,SAAS,GAAG,CAC3I,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAAe;IAC/C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAC;IAC/F,IAAI,YAAoB,CAAC;IAEzB,IAAI,CAAC;QACH,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAA8B,CAAC;QAC3C,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,2BAA2B,YAAY,GAAG,CAAC,CAAC;QAC9D,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,gCAAgC,YAAY,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,qCAAsC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC5C,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;IACnG,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAc;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK;aACT,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACZ,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC9C,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAE,IAAgC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACxF,MAAM,EAAE,GAAG,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAE,IAAgC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAClF,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9C,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,KAAK,EAA6B,EAAE,CAC3C,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC,CACpE,CAAC;IACN,CAAC;IAED,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC;aACpD,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;aACzF,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,IAAI,KAAK,CAAC,iFAAiF,CAAC,CAAC;AACrG,CAAC"}
@@ -1,204 +0,0 @@
1
- import inquirer from 'inquirer';
2
- import chalk from 'chalk';
3
- import { diagnoseWorkspace, loadConfig } from '@i18nsmith/core';
4
- import { scaffoldTranslationContext, scaffoldI18next } from '../utils/scaffold.js';
5
- import { readPackageJson, hasDependency } from '../utils/pkg.js';
6
- import { detectPackageManager, installDependencies } from '../utils/package-manager.js';
7
- import { maybeInjectProvider } from '../utils/provider-injector.js';
8
- export function registerScaffoldAdapter(program) {
9
- program
10
- .command('scaffold-adapter')
11
- .description('Scaffold translation adapter files')
12
- .option('-t, --type <type>', 'Adapter type: custom or react-i18next')
13
- .option('-l, --source-language <lang>', 'Source language code', 'en')
14
- .option('-p, --path <path>', 'Path for custom adapter file', 'src/contexts/translation-context.tsx')
15
- .option('--i18n-path <path>', 'Path for react-i18next initializer', 'src/lib/i18n.ts')
16
- .option('--provider-path <path>', 'Path for I18nProvider component', 'src/components/i18n-provider.tsx')
17
- .option('--locales-dir <dir>', 'Locales directory relative to project root', 'locales')
18
- .option('-f, --force', 'Overwrite files if they already exist', false)
19
- .option('--install-deps', 'Automatically install adapter dependencies when missing', false)
20
- .option('--dry-run', 'Preview provider injection changes without modifying files', false)
21
- .option('--no-skip-if-detected', 'Force scaffolding even if existing adapters/providers are detected')
22
- .action(async (options) => {
23
- console.log(chalk.blue('Scaffolding translation resources...'));
24
- const answers = await inquirer.prompt([
25
- {
26
- type: 'list',
27
- name: 'type',
28
- message: 'Choose adapter type',
29
- choices: [
30
- { name: 'Custom context (zero dependencies)', value: 'custom' },
31
- { name: 'react-i18next (standard)', value: 'react-i18next' },
32
- ],
33
- default: options.type || 'custom',
34
- },
35
- {
36
- type: 'input',
37
- name: 'sourceLanguage',
38
- message: 'Source language code',
39
- default: options.sourceLanguage || 'en',
40
- },
41
- {
42
- type: 'input',
43
- name: 'localesDir',
44
- message: 'Locales directory (relative to project root)',
45
- default: options.localesDir || 'locales',
46
- },
47
- {
48
- type: 'input',
49
- name: 'filePath',
50
- message: 'Path to scaffold translation context file',
51
- default: options.path || 'src/contexts/translation-context.tsx',
52
- when: (answers) => answers.type === 'custom',
53
- },
54
- {
55
- type: 'input',
56
- name: 'i18nPath',
57
- message: 'Path for i18next initializer (i18n.ts)',
58
- default: options.i18nPath || 'src/lib/i18n.ts',
59
- when: (answers) => answers.type === 'react-i18next',
60
- },
61
- {
62
- type: 'input',
63
- name: 'providerPath',
64
- message: 'Path for I18nProvider component',
65
- default: options.providerPath || 'src/components/i18n-provider.tsx',
66
- when: (answers) => answers.type === 'react-i18next',
67
- },
68
- {
69
- type: 'confirm',
70
- name: 'force',
71
- message: 'Overwrite files if they exist?',
72
- default: Boolean(options.force),
73
- },
74
- ]);
75
- if ((options.skipIfDetected ?? true) && !options.force && !answers.force) {
76
- const detection = await detectExistingRuntime();
77
- if (detection) {
78
- console.log(chalk.yellow(`Existing i18n runtime detected (${detection}). Skipping scaffold. Use --no-skip-if-detected or --force to override.`));
79
- return;
80
- }
81
- }
82
- try {
83
- const dryRun = Boolean(options.dryRun);
84
- if (answers.type === 'custom') {
85
- const result = await scaffoldTranslationContext(answers.filePath, answers.sourceLanguage, {
86
- localesDir: answers.localesDir,
87
- force: answers.force,
88
- dryRun,
89
- });
90
- if (dryRun) {
91
- console.log(chalk.blue('\nšŸ“‹ DRY RUN - No files were modified\n'));
92
- console.log(chalk.cyan(`Would create: ${result.path}`));
93
- console.log(chalk.gray('─'.repeat(60)));
94
- console.log(result.content);
95
- console.log(chalk.gray('─'.repeat(60)));
96
- }
97
- else {
98
- console.log(chalk.green(`Translation context scaffolded at ${result.path}`));
99
- }
100
- console.log(chalk.blue('\nUpdate your i18n.config.json:'));
101
- console.log(`{
102
- "translationAdapter": {
103
- "module": "${answers.filePath.replace(/\\\\/g, '/').replace(/\.tsx?$/, '')}",
104
- "hookName": "useTranslation"
105
- }
106
- }`);
107
- }
108
- else if (answers.type === 'react-i18next') {
109
- const { i18nPath, providerPath, i18nResult, providerResult } = await scaffoldI18next(answers.i18nPath, answers.providerPath, answers.sourceLanguage, answers.localesDir, { force: answers.force, dryRun });
110
- if (dryRun) {
111
- console.log(chalk.blue('\nšŸ“‹ DRY RUN - No files were modified\n'));
112
- console.log(chalk.cyan(`Would create: ${i18nResult.path}`));
113
- console.log(chalk.gray('─'.repeat(60)));
114
- console.log(i18nResult.content);
115
- console.log(chalk.gray('─'.repeat(60)));
116
- console.log(chalk.cyan(`\nWould create: ${providerResult.path}`));
117
- console.log(chalk.gray('─'.repeat(60)));
118
- console.log(providerResult.content);
119
- console.log(chalk.gray('─'.repeat(60)));
120
- }
121
- else {
122
- console.log(chalk.green('\nScaffolded react-i18next runtime:'));
123
- console.log(chalk.green(` • ${i18nPath}`));
124
- console.log(chalk.green(` • ${providerPath}`));
125
- }
126
- const pkg = await readPackageJson();
127
- const missingDeps = ['react-i18next', 'i18next'].filter((dep) => !hasDependency(pkg, dep));
128
- if (missingDeps.length) {
129
- console.log(chalk.yellow('\nDependencies missing:'));
130
- missingDeps.forEach((dep) => console.log(chalk.yellow(` • ${dep}`)));
131
- if (dryRun) {
132
- console.log(chalk.blue('\nIn write mode, install them with:'));
133
- console.log(chalk.cyan(' pnpm add react-i18next i18next'));
134
- }
135
- else if (options.installDeps) {
136
- try {
137
- const manager = await detectPackageManager();
138
- console.log(chalk.blue(`\nInstalling dependencies with ${manager}...`));
139
- await installDependencies(manager, missingDeps);
140
- console.log(chalk.green('Dependencies installed successfully.'));
141
- }
142
- catch (error) {
143
- console.error(chalk.red('Failed to install dependencies automatically:'), error.message);
144
- console.log(chalk.blue('You can install them manually:'));
145
- console.log(chalk.cyan(' pnpm add react-i18next i18next'));
146
- }
147
- }
148
- else {
149
- console.log(chalk.blue('Install them with:'));
150
- console.log(chalk.cyan(' pnpm add react-i18next i18next'));
151
- }
152
- }
153
- console.log(chalk.blue('\nWrap your app with the provider (e.g. Next.js providers.tsx):'));
154
- console.log(chalk.cyan(`import { I18nProvider } from '${answers.providerPath.replace(/\\\\/g, '/').replace(/\.tsx?$/, '')}';`));
155
- console.log(chalk.cyan('<I18nProvider>{children}</I18nProvider>'));
156
- const injectionResult = await maybeInjectProvider({
157
- providerComponentPath: providerPath,
158
- dryRun: Boolean(options.dryRun),
159
- });
160
- if (injectionResult.status === 'injected') {
161
- console.log(chalk.green(`\nUpdated ${injectionResult.file} to wrap <I18nProvider>.`));
162
- }
163
- else if (injectionResult.status === 'preview') {
164
- console.log(chalk.blue(`\nProvider dry-run for ${injectionResult.file}: changes previewed below (no files modified).`));
165
- console.log(injectionResult.diff.trimEnd());
166
- }
167
- else if (injectionResult.status === 'skipped') {
168
- console.log(chalk.yellow(`\nProvider file ${injectionResult.file} already uses I18nProvider. Skipping injection.`));
169
- }
170
- else if (injectionResult.status === 'failed') {
171
- console.log(chalk.red(`\nCould not safely inject I18nProvider into ${injectionResult.file}: ${injectionResult.reason}\n` +
172
- 'Please manually wrap your layout or providers file with <I18nProvider> and rerun.'));
173
- }
174
- else {
175
- console.log(chalk.gray('\nNo Next.js provider file detected for automatic injection.'));
176
- }
177
- }
178
- }
179
- catch (error) {
180
- console.error(chalk.red('Failed to scaffold adapter:'), error.message);
181
- }
182
- });
183
- }
184
- async function detectExistingRuntime() {
185
- try {
186
- const config = await loadConfig();
187
- const report = await diagnoseWorkspace(config);
188
- if (report.adapterFiles.length) {
189
- return report.adapterFiles.map((adapter) => adapter.path).join(', ');
190
- }
191
- const provider = report.providerFiles.find((entry) => entry.hasI18nProvider);
192
- if (provider) {
193
- return provider.relativePath;
194
- }
195
- }
196
- catch (error) {
197
- if (error.message?.includes('Config file not found')) {
198
- return null;
199
- }
200
- console.warn(chalk.gray(`Skipping adapter detection: ${error.message}`));
201
- }
202
- return null;
203
- }
204
- //# sourceMappingURL=scaffold-adapter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaffold-adapter.js","sourceRoot":"","sources":["../../src/commands/scaffold-adapter.ts"],"names":[],"mappings":"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"}