appshot-cli 0.2.2 → 0.4.0

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 (46) hide show
  1. package/README.md +1329 -589
  2. package/dist/cli.js +5 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/build.d.ts.map +1 -1
  5. package/dist/commands/build.js +11 -4
  6. package/dist/commands/build.js.map +1 -1
  7. package/dist/commands/caption.d.ts.map +1 -1
  8. package/dist/commands/caption.js +74 -2
  9. package/dist/commands/caption.js.map +1 -1
  10. package/dist/commands/fonts.d.ts +3 -0
  11. package/dist/commands/fonts.d.ts.map +1 -0
  12. package/dist/commands/fonts.js +384 -0
  13. package/dist/commands/fonts.js.map +1 -0
  14. package/dist/commands/localize.d.ts.map +1 -1
  15. package/dist/commands/localize.js +150 -14
  16. package/dist/commands/localize.js.map +1 -1
  17. package/dist/commands/migrate.d.ts +3 -0
  18. package/dist/commands/migrate.d.ts.map +1 -0
  19. package/dist/commands/migrate.js +123 -0
  20. package/dist/commands/migrate.js.map +1 -0
  21. package/dist/commands/style.d.ts.map +1 -1
  22. package/dist/commands/style.js +92 -1
  23. package/dist/commands/style.js.map +1 -1
  24. package/dist/core/compose.d.ts +4 -0
  25. package/dist/core/compose.d.ts.map +1 -1
  26. package/dist/core/compose.js +102 -9
  27. package/dist/core/compose.js.map +1 -1
  28. package/dist/services/fonts.d.ts +71 -0
  29. package/dist/services/fonts.d.ts.map +1 -0
  30. package/dist/services/fonts.js +314 -0
  31. package/dist/services/fonts.js.map +1 -0
  32. package/dist/services/translation.d.ts +18 -0
  33. package/dist/services/translation.d.ts.map +1 -0
  34. package/dist/services/translation.js +201 -0
  35. package/dist/services/translation.js.map +1 -0
  36. package/dist/types/ai.d.ts +25 -0
  37. package/dist/types/ai.d.ts.map +1 -0
  38. package/dist/types/ai.js +73 -0
  39. package/dist/types/ai.js.map +1 -0
  40. package/dist/types.d.ts +2 -0
  41. package/dist/types.d.ts.map +1 -1
  42. package/dist/utils/language.d.ts +32 -0
  43. package/dist/utils/language.d.ts.map +1 -0
  44. package/dist/utils/language.js +103 -0
  45. package/dist/utils/language.js.map +1 -0
  46. package/package.json +3 -1
@@ -0,0 +1,384 @@
1
+ import { Command } from 'commander';
2
+ import pc from 'picocolors';
3
+ import inquirer from 'inquirer';
4
+ import { promises as fs } from 'fs';
5
+ import path from 'path';
6
+ import { FontService } from '../services/fonts.js';
7
+ import { loadConfig } from '../core/files.js';
8
+ /**
9
+ * Save configuration to .appshot/config.json
10
+ */
11
+ async function saveConfig(config) {
12
+ const configPath = path.join(process.cwd(), '.appshot', 'config.json');
13
+ await fs.writeFile(configPath, JSON.stringify(config, null, 2));
14
+ }
15
+ export default function fontsCmd() {
16
+ const cmd = new Command('fonts')
17
+ .description('List available fonts for captions')
18
+ .option('--all', 'Show all system fonts')
19
+ .option('--recommended', 'Show only recommended fonts')
20
+ .option('--json', 'Output as JSON')
21
+ .option('--validate <font>', 'Check if a font is available')
22
+ .option('--set <font>', 'Set the caption font')
23
+ .option('--select', 'Interactive font selection')
24
+ .option('--device <name>', 'Set font for specific device (use with --set or --select)')
25
+ .action(async (options) => {
26
+ const fontService = FontService.getInstance();
27
+ // Set font mode
28
+ if (options.set) {
29
+ await handleSetFont(options.set, options.device, fontService);
30
+ return;
31
+ }
32
+ // Interactive selection mode
33
+ if (options.select) {
34
+ await handleSelectFont(options.device, fontService);
35
+ return;
36
+ }
37
+ // Validate a specific font
38
+ if (options.validate) {
39
+ const fontStatus = await fontService.getFontStatus(options.validate);
40
+ if (options.json) {
41
+ console.log(JSON.stringify(fontStatus));
42
+ }
43
+ else {
44
+ if (fontStatus.installed) {
45
+ console.log(pc.green(`✓ Font "${options.validate}" is installed and available`));
46
+ }
47
+ else {
48
+ console.log(pc.red(`✗ Font "${options.validate}" is NOT installed on your system`));
49
+ console.log(pc.yellow(`⚠ If used, will fall back to: ${fontStatus.fallback}`));
50
+ if (fontStatus.warning) {
51
+ console.log(pc.dim(fontStatus.warning));
52
+ }
53
+ }
54
+ }
55
+ return;
56
+ }
57
+ // Show only recommended fonts
58
+ if (options.recommended) {
59
+ const recommended = await fontService.getRecommendedFonts();
60
+ if (options.json) {
61
+ console.log(JSON.stringify(recommended, null, 2));
62
+ return;
63
+ }
64
+ console.log(pc.bold('\n📝 Recommended Fonts for Captions\n'));
65
+ // Group by category and installation status
66
+ const webSafeInstalled = recommended.filter(f => f.category === 'web-safe' && f.installed);
67
+ const webSafeNotInstalled = recommended.filter(f => f.category === 'web-safe' && !f.installed);
68
+ const popularInstalled = recommended.filter(f => f.category === 'recommended' && f.installed);
69
+ const popularNotInstalled = recommended.filter(f => f.category === 'recommended' && !f.installed);
70
+ const systemInstalled = recommended.filter(f => f.category === 'system' && f.installed);
71
+ if (webSafeInstalled.length > 0) {
72
+ console.log(pc.cyan('Web-Safe Fonts (installed):'));
73
+ for (const font of webSafeInstalled) {
74
+ console.log(pc.green(` ✓ ${font.name}`));
75
+ }
76
+ console.log();
77
+ }
78
+ if (webSafeNotInstalled.length > 0) {
79
+ console.log(pc.cyan('Web-Safe Fonts (not installed):'));
80
+ for (const font of webSafeNotInstalled) {
81
+ console.log(pc.yellow(` ⚠ ${font.name}`) + pc.dim(` → ${font.fallback}`));
82
+ }
83
+ console.log();
84
+ }
85
+ if (popularInstalled.length > 0) {
86
+ console.log(pc.cyan('Popular Fonts (installed):'));
87
+ for (const font of popularInstalled) {
88
+ console.log(pc.green(` ✓ ${font.name}`));
89
+ }
90
+ console.log();
91
+ }
92
+ if (popularNotInstalled.length > 0) {
93
+ console.log(pc.cyan('Popular Fonts (not installed - will use fallback):'));
94
+ for (const font of popularNotInstalled) {
95
+ console.log(pc.yellow(` ⚠ ${font.name}`) + pc.dim(` → ${font.fallback}`));
96
+ }
97
+ console.log();
98
+ }
99
+ if (systemInstalled.length > 0) {
100
+ console.log(pc.cyan('System Fonts (installed):'));
101
+ for (const font of systemInstalled) {
102
+ console.log(pc.green(` ✓ ${font.name}`));
103
+ }
104
+ console.log();
105
+ }
106
+ console.log(pc.dim('✓ = Installed and will render correctly'));
107
+ console.log(pc.dim('⚠ = Not installed, will use fallback font shown'));
108
+ return;
109
+ }
110
+ // Show all fonts or categorized view
111
+ if (options.all) {
112
+ console.log(pc.bold('\n🔍 Detecting system fonts...\n'));
113
+ const systemFonts = await fontService.getSystemFonts();
114
+ if (options.json) {
115
+ console.log(JSON.stringify(systemFonts, null, 2));
116
+ return;
117
+ }
118
+ if (systemFonts.length === 0) {
119
+ console.log(pc.yellow('Could not detect system fonts on this platform'));
120
+ console.log(pc.dim('Use --recommended to see web-safe fonts that work everywhere'));
121
+ return;
122
+ }
123
+ console.log(pc.cyan(`Found ${systemFonts.length} system fonts:\n`));
124
+ // Display in columns for better readability
125
+ const columns = 3;
126
+ const columnWidth = 30;
127
+ for (let i = 0; i < systemFonts.length; i += columns) {
128
+ let row = '';
129
+ for (let j = 0; j < columns && i + j < systemFonts.length; j++) {
130
+ const font = systemFonts[i + j];
131
+ row += font.padEnd(columnWidth);
132
+ }
133
+ console.log(row);
134
+ }
135
+ console.log();
136
+ console.log(pc.dim('Note: Not all system fonts may render correctly in SVG'));
137
+ console.log(pc.dim('Use --recommended for fonts that are guaranteed to work'));
138
+ }
139
+ else {
140
+ // Default: Show categorized view
141
+ const categories = await fontService.getFontCategories();
142
+ if (options.json) {
143
+ console.log(JSON.stringify(categories, null, 2));
144
+ return;
145
+ }
146
+ console.log(pc.bold('\n🎨 Available Fonts for Captions\n'));
147
+ for (const category of categories) {
148
+ console.log(pc.cyan(`${category.name}:`));
149
+ const fonts = category.fonts.slice(0, 15); // Limit display
150
+ for (const font of fonts) {
151
+ const marker = font.category === 'web-safe' ? pc.green('●') :
152
+ font.category === 'recommended' ? pc.blue('●') :
153
+ pc.gray('●');
154
+ console.log(` ${marker} ${font.name || font}`);
155
+ }
156
+ if (category.fonts.length > 15) {
157
+ console.log(pc.dim(` ... and ${category.fonts.length - 15} more`));
158
+ }
159
+ console.log();
160
+ }
161
+ console.log(pc.dim('Legend:'));
162
+ console.log(` ${pc.green('●')} Web-safe (works everywhere)`);
163
+ console.log(` ${pc.blue('●')} Popular (widely supported)`);
164
+ console.log(` ${pc.gray('●')} System (platform-specific)`);
165
+ console.log();
166
+ console.log(pc.dim('Tips:'));
167
+ console.log(pc.dim('• Use --set "Font Name" to set caption font directly'));
168
+ console.log(pc.dim('• Use --select for interactive font selection'));
169
+ console.log(pc.dim('• Use --device <name> to set device-specific fonts'));
170
+ console.log(pc.dim('• Use --validate "Font Name" to check availability'));
171
+ console.log(pc.dim('• Or use "appshot style" for full configuration'));
172
+ }
173
+ });
174
+ return cmd;
175
+ }
176
+ /**
177
+ * Handle --set option: set font directly
178
+ */
179
+ async function handleSetFont(fontName, deviceName, fontService) {
180
+ try {
181
+ // Get detailed font status
182
+ const fontStatus = await fontService.getFontStatus(fontName);
183
+ if (!fontStatus.installed) {
184
+ console.error(pc.red(`✗ Font "${fontName}" is not installed on your system`));
185
+ console.log(pc.yellow(`⚠ Fallback will be used: ${fontStatus.fallback}`));
186
+ console.log();
187
+ // Ask if they want to continue anyway
188
+ const answer = await inquirer.prompt([{
189
+ type: 'confirm',
190
+ name: 'continue',
191
+ message: 'Do you want to set this font anyway? (It will use the fallback)',
192
+ default: false
193
+ }]);
194
+ if (!answer.continue) {
195
+ console.log(pc.dim('Font not changed'));
196
+ return;
197
+ }
198
+ console.log(pc.yellow('⚠ Warning: Setting font that will use fallback'));
199
+ }
200
+ // Load current config
201
+ const config = await loadConfig();
202
+ if (deviceName) {
203
+ // Set device-specific font
204
+ if (!config.devices[deviceName]) {
205
+ console.error(pc.red(`Device "${deviceName}" not found in configuration`));
206
+ console.log(pc.dim('Available devices: ' + Object.keys(config.devices).join(', ')));
207
+ process.exit(1);
208
+ }
209
+ // Set device-specific font
210
+ config.devices[deviceName].captionFont = fontName;
211
+ }
212
+ else {
213
+ // Set global font
214
+ config.caption.font = fontName;
215
+ }
216
+ // Save config
217
+ await saveConfig(config);
218
+ if (deviceName) {
219
+ console.log(pc.green('✓'), `Set font to "${fontName}" for device: ${deviceName}`);
220
+ }
221
+ else {
222
+ console.log(pc.green('✓'), `Set caption font to "${fontName}"`);
223
+ }
224
+ }
225
+ catch (error) {
226
+ console.error(pc.red('Error setting font:'), error);
227
+ process.exit(1);
228
+ }
229
+ }
230
+ /**
231
+ * Handle --select option: interactive font selection
232
+ */
233
+ async function handleSelectFont(deviceName, fontService) {
234
+ try {
235
+ // Load current config to show current font
236
+ const config = await loadConfig();
237
+ let currentFont = config.caption.font;
238
+ let isDeviceSpecific = false;
239
+ console.log(pc.bold('\n🎨 Font Selection\n'));
240
+ if (deviceName) {
241
+ if (!config.devices[deviceName]) {
242
+ console.error(pc.red(`Device "${deviceName}" not found in configuration`));
243
+ console.log(pc.dim('Available devices: ' + Object.keys(config.devices).join(', ')));
244
+ process.exit(1);
245
+ }
246
+ console.log(pc.dim(`Configuring font for device: ${deviceName}`));
247
+ // Check if device has specific font, otherwise use global
248
+ if (config.devices[deviceName].captionFont) {
249
+ currentFont = config.devices[deviceName].captionFont;
250
+ isDeviceSpecific = true;
251
+ }
252
+ }
253
+ const fontSource = isDeviceSpecific ? `${deviceName} device` : 'global';
254
+ console.log(pc.dim(`Current font: ${currentFont} (${fontSource})\n`));
255
+ // Get font categories for selection
256
+ const categories = await fontService.getFontCategories();
257
+ const recommended = await fontService.getRecommendedFonts();
258
+ // Build selection choices
259
+ const choices = [];
260
+ // Add current font at the top
261
+ const currentFontStatus = await fontService.getFontStatus(currentFont);
262
+ const currentStatus = currentFontStatus.installed ? pc.green('✓') : pc.yellow('⚠');
263
+ choices.push({
264
+ name: `${currentStatus} Keep current: ${currentFont}`,
265
+ value: currentFont
266
+ });
267
+ choices.push(new inquirer.Separator());
268
+ // Web-Safe fonts (installed)
269
+ const webSafeInstalled = recommended.filter(f => f.category === 'web-safe' && f.installed);
270
+ if (webSafeInstalled.length > 0) {
271
+ choices.push(new inquirer.Separator(pc.green('── Installed Web-Safe Fonts ──')));
272
+ for (const font of webSafeInstalled) {
273
+ const marker = font.name === currentFont ? pc.cyan('● ') : ' ';
274
+ choices.push({ name: `${marker}${pc.green('✓')} ${font.name}`, value: font.name });
275
+ }
276
+ }
277
+ // Popular fonts (separate installed and not installed)
278
+ const popularInstalled = recommended.filter(f => f.category === 'recommended' && f.installed);
279
+ const popularNotInstalled = recommended.filter(f => f.category === 'recommended' && !f.installed);
280
+ if (popularInstalled.length > 0) {
281
+ choices.push(new inquirer.Separator(pc.blue('── Installed Popular Fonts ──')));
282
+ for (const font of popularInstalled) {
283
+ const marker = font.name === currentFont ? pc.cyan('● ') : ' ';
284
+ choices.push({ name: `${marker}${pc.green('✓')} ${font.name}`, value: font.name });
285
+ }
286
+ }
287
+ if (popularNotInstalled.length > 0) {
288
+ choices.push(new inquirer.Separator(pc.yellow('── Popular Fonts (Not Installed - Will Use Fallback) ──')));
289
+ for (const font of popularNotInstalled) {
290
+ const marker = font.name === currentFont ? pc.cyan('● ') : ' ';
291
+ choices.push({
292
+ name: `${marker}${pc.yellow('⚠')} ${font.name} → ${pc.dim(font.fallback)}`,
293
+ value: font.name
294
+ });
295
+ }
296
+ }
297
+ // System fonts (limited to first 10 to avoid overwhelming)
298
+ const systemCategory = categories.find(c => c.name === 'System Fonts');
299
+ if (systemCategory && systemCategory.fonts.length > 0) {
300
+ choices.push(new inquirer.Separator(pc.gray('── System Fonts (top 10) ──')));
301
+ const systemFonts = systemCategory.fonts
302
+ .filter(f => f.category === 'system' || !recommended.some(r => r.name === f.name))
303
+ .slice(0, 10);
304
+ for (const font of systemFonts) {
305
+ const fontName = typeof font === 'string' ? font : font.name;
306
+ const marker = fontName === currentFont ? pc.cyan('● ') : ' ';
307
+ choices.push({ name: `${marker}${fontName}`, value: fontName });
308
+ }
309
+ }
310
+ // Custom font option
311
+ choices.push(new inquirer.Separator('── Custom ──'));
312
+ choices.push({ name: pc.dim('Enter custom font name...'), value: '__custom__' });
313
+ const answer = await inquirer.prompt([{
314
+ type: 'list',
315
+ name: 'font',
316
+ message: 'Select a font:',
317
+ choices: choices,
318
+ pageSize: 15
319
+ }]);
320
+ let selectedFont = answer.font;
321
+ // Handle custom font input
322
+ if (selectedFont === '__custom__') {
323
+ const customAnswer = await inquirer.prompt([{
324
+ type: 'input',
325
+ name: 'customFont',
326
+ message: 'Enter font name:',
327
+ validate: async (input) => {
328
+ if (!input.trim())
329
+ return 'Font name cannot be empty';
330
+ const fontStatus = await fontService.getFontStatus(input.trim());
331
+ if (!fontStatus.installed) {
332
+ return `Font "${input}" is not installed. It will use fallback: ${fontStatus.fallback}. Type it again to confirm.`;
333
+ }
334
+ return true;
335
+ }
336
+ }]);
337
+ selectedFont = customAnswer.customFont.trim();
338
+ }
339
+ // Don't save if user selected current font
340
+ if (selectedFont === currentFont) {
341
+ console.log(pc.dim('No changes made'));
342
+ return;
343
+ }
344
+ // Check if selected font is installed
345
+ const selectedFontStatus = await fontService.getFontStatus(selectedFont);
346
+ if (!selectedFontStatus.installed) {
347
+ console.log();
348
+ console.log(pc.yellow(`⚠ Warning: "${selectedFont}" is not installed on your system`));
349
+ console.log(pc.dim(`Fallback will be used: ${selectedFontStatus.fallback}`));
350
+ const answer = await inquirer.prompt([{
351
+ type: 'confirm',
352
+ name: 'proceed',
353
+ message: 'Do you want to use this font anyway?',
354
+ default: false
355
+ }]);
356
+ if (!answer.proceed) {
357
+ console.log(pc.dim('Font not changed'));
358
+ return;
359
+ }
360
+ }
361
+ // Update config
362
+ if (deviceName) {
363
+ config.devices[deviceName].captionFont = selectedFont;
364
+ }
365
+ else {
366
+ config.caption.font = selectedFont;
367
+ }
368
+ await saveConfig(config);
369
+ if (deviceName) {
370
+ console.log(pc.green('✓'), `Set font to "${selectedFont}" for device: ${deviceName}`);
371
+ }
372
+ else {
373
+ console.log(pc.green('✓'), `Set caption font to "${selectedFont}"`);
374
+ }
375
+ if (!selectedFontStatus.installed) {
376
+ console.log(pc.yellow(`Remember: This font will render as ${selectedFontStatus.fallback}`));
377
+ }
378
+ }
379
+ catch (error) {
380
+ console.error(pc.red('Error selecting font:'), error);
381
+ process.exit(1);
382
+ }
383
+ }
384
+ //# sourceMappingURL=fonts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts.js","sourceRoot":"","sources":["../../src/commands/fonts.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"localize.d.ts","sourceRoot":"","sources":["../../src/commands/localize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,MAAM,CAAC,OAAO,UAAU,WAAW,YA0BlC"}
1
+ {"version":3,"file":"localize.d.ts","sourceRoot":"","sources":["../../src/commands/localize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,MAAM,CAAC,OAAO,UAAU,WAAW,YAyLlC"}
@@ -1,26 +1,162 @@
1
1
  import { Command } from 'commander';
2
+ import { select, confirm } from '@inquirer/prompts';
3
+ import { promises as fs } from 'fs';
4
+ import path from 'path';
2
5
  import pc from 'picocolors';
6
+ import { translationService } from '../services/translation.js';
3
7
  export default function localizeCmd() {
4
8
  return new Command('localize')
5
- .description('Generate translations into specified languages (requires API key)')
9
+ .description('Generate translations for all captions using AI')
6
10
  .requiredOption('--langs <codes>', 'comma-separated language codes (e.g., fr,de,es)')
7
11
  .option('--device <name>', 'specific device (iphone|ipad|mac|watch), or all devices')
8
- .option('--provider <name>', 'translation provider (openai|deepl)', 'openai')
12
+ .option('--model <name>', 'OpenAI model to use', 'gpt-4o-mini')
13
+ .option('--source <lang>', 'source language', 'en')
9
14
  .option('--review', 'review translations before saving')
15
+ .option('--overwrite', 'overwrite existing translations')
10
16
  .action(async (opts) => {
11
17
  try {
12
- console.log(pc.bold('Localization (Coming Soon)'));
13
- console.log('\nThis feature will:');
14
- console.log(' Read existing English captions from captions.json');
15
- console.log(' Translate them using your chosen provider');
16
- console.log(' Save translations back to captions.json');
17
- console.log('\nConfiguration:');
18
- console.log(' Languages:', pc.cyan(opts.langs));
19
- console.log(' Device:', pc.cyan(opts.device || 'all'));
20
- console.log(' Provider:', pc.cyan(opts.provider));
21
- console.log('\n' + pc.dim('Set API keys via environment variables:'));
22
- console.log(pc.dim(' • OPENAI_API_KEY for OpenAI'));
23
- console.log(pc.dim(' • DEEPL_API_KEY for DeepL'));
18
+ // Check for API key
19
+ if (!translationService.hasApiKey()) {
20
+ console.error(pc.red('Error:'), 'OpenAI API key not found');
21
+ console.log(pc.dim('Set the OPENAI_API_KEY environment variable:'));
22
+ console.log(pc.dim(' export OPENAI_API_KEY="your-api-key"'));
23
+ process.exit(1);
24
+ }
25
+ // Parse languages
26
+ const targetLanguages = opts.langs.split(',').map((l) => l.trim());
27
+ const sourceLang = opts.source;
28
+ // Select model
29
+ let selectedModel = opts.model;
30
+ const availableModels = translationService.getAvailableModels();
31
+ if (!availableModels.includes(selectedModel)) {
32
+ console.log(pc.yellow('\nSelect AI model for translation:'));
33
+ selectedModel = await select({
34
+ message: 'Choose model:',
35
+ choices: availableModels.map(m => {
36
+ const info = translationService.getModelInfo(m);
37
+ return {
38
+ value: m,
39
+ name: m,
40
+ description: info ? `Max output: ${info.maxTokens} tokens` : ''
41
+ };
42
+ })
43
+ });
44
+ }
45
+ await translationService.loadConfig();
46
+ console.log(pc.bold('\n📝 Batch Translation'));
47
+ console.log('Source language:', pc.cyan(sourceLang));
48
+ console.log('Target languages:', pc.cyan(targetLanguages.join(', ')));
49
+ console.log('Model:', pc.cyan(selectedModel));
50
+ console.log();
51
+ // Determine which devices to process
52
+ const captionsDir = path.join(process.cwd(), '.appshot', 'captions');
53
+ let devices = [];
54
+ if (opts.device && opts.device !== 'all') {
55
+ devices = [opts.device];
56
+ }
57
+ else {
58
+ // Get all device caption files
59
+ try {
60
+ const files = await fs.readdir(captionsDir);
61
+ devices = files
62
+ .filter(f => f.endsWith('.json'))
63
+ .map(f => f.replace('.json', ''));
64
+ }
65
+ catch {
66
+ console.error(pc.red('Error:'), 'No caption files found');
67
+ console.log(pc.dim('Run'), pc.cyan('appshot caption'), pc.dim('to create captions first'));
68
+ process.exit(1);
69
+ }
70
+ }
71
+ // Process each device
72
+ let totalTranslated = 0;
73
+ let totalSkipped = 0;
74
+ for (const device of devices) {
75
+ const captionsFile = path.join(captionsDir, `${device}.json`);
76
+ try {
77
+ const content = await fs.readFile(captionsFile, 'utf8');
78
+ const captions = JSON.parse(content);
79
+ console.log(pc.cyan(`\n${device.toUpperCase()}`));
80
+ console.log(pc.dim('─'.repeat(40)));
81
+ // Collect unique captions to translate
82
+ const textsToTranslate = new Set();
83
+ for (const [_filename, caption] of Object.entries(captions)) {
84
+ if (typeof caption === 'string') {
85
+ textsToTranslate.add(caption);
86
+ }
87
+ else if (caption && typeof caption === 'object') {
88
+ const sourceText = caption[sourceLang];
89
+ if (sourceText) {
90
+ // Check if we should translate (no existing translations or overwrite enabled)
91
+ const hasExistingTranslations = targetLanguages.some((lang) => caption[lang]);
92
+ if (!hasExistingTranslations || opts.overwrite) {
93
+ textsToTranslate.add(sourceText);
94
+ }
95
+ }
96
+ }
97
+ }
98
+ if (textsToTranslate.size === 0) {
99
+ console.log(pc.yellow(' No captions to translate'));
100
+ totalSkipped++;
101
+ continue;
102
+ }
103
+ console.log(` Found ${textsToTranslate.size} unique caption(s) to translate`);
104
+ // Batch translate
105
+ const translations = await translationService.translateBatch(Array.from(textsToTranslate), targetLanguages, selectedModel, (current, total) => {
106
+ process.stdout.write(`\r Translating: ${current}/${total}`);
107
+ });
108
+ process.stdout.write('\r' + ' '.repeat(50) + '\r'); // Clear progress line
109
+ // Review translations if requested
110
+ if (opts.review) {
111
+ console.log(pc.yellow('\n Review translations:'));
112
+ for (const [text, trans] of translations.entries()) {
113
+ console.log(`\n Original: ${pc.white(text)}`);
114
+ for (const [lang, translation] of Object.entries(trans)) {
115
+ console.log(` ${lang}: ${pc.green(translation)}`);
116
+ }
117
+ const proceed = await confirm({
118
+ message: ' Accept these translations?',
119
+ default: true
120
+ });
121
+ if (!proceed) {
122
+ translations.delete(text);
123
+ }
124
+ }
125
+ }
126
+ // Apply translations to captions
127
+ for (const [filename, caption] of Object.entries(captions)) {
128
+ let sourceText;
129
+ if (typeof caption === 'string') {
130
+ sourceText = caption;
131
+ // Convert to object format
132
+ captions[filename] = { [sourceLang]: caption };
133
+ }
134
+ else if (caption && typeof caption === 'object') {
135
+ sourceText = caption[sourceLang];
136
+ }
137
+ if (sourceText && translations.has(sourceText)) {
138
+ const trans = translations.get(sourceText);
139
+ for (const [lang, translation] of Object.entries(trans)) {
140
+ captions[filename][lang] = translation;
141
+ }
142
+ }
143
+ }
144
+ // Save updated captions
145
+ await fs.writeFile(captionsFile, JSON.stringify(captions, null, 2), 'utf8');
146
+ console.log(pc.green(' ✓'), `Translated ${translations.size} caption(s)`);
147
+ totalTranslated += translations.size;
148
+ }
149
+ catch (error) {
150
+ console.error(pc.red(` Error processing ${device}:`), error instanceof Error ? error.message : String(error));
151
+ }
152
+ }
153
+ // Summary
154
+ console.log(pc.bold('\n📊 Summary'));
155
+ console.log(pc.green('✓'), `Translated ${totalTranslated} unique caption(s)`);
156
+ if (totalSkipped > 0) {
157
+ console.log(pc.yellow('⚠'), `Skipped ${totalSkipped} device(s) with no captions`);
158
+ }
159
+ console.log(pc.dim('\nRun'), pc.cyan('appshot build --langs ' + targetLanguages.join(',')), pc.dim('to generate localized screenshots'));
24
160
  }
25
161
  catch (error) {
26
162
  console.error(pc.red('Error:'), error instanceof Error ? error.message : String(error));
@@ -1 +1 @@
1
- {"version":3,"file":"localize.js","sourceRoot":"","sources":["../../src/commands/localize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,CAAC,OAAO,UAAU,WAAW;IACjC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;SAC3B,WAAW,CAAC,mEAAmE,CAAC;SAChF,cAAc,CAAC,iBAAiB,EAAE,iDAAiD,CAAC;SACpF,MAAM,CAAC,iBAAiB,EAAE,yDAAyD,CAAC;SACpF,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,EAAE,QAAQ,CAAC;SAC5E,MAAM,CAAC,UAAU,EAAE,mCAAmC,CAAC;SACvD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;YAC3D,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,cAAc,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YACnD,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,+BAA+B,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YACxF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"localize.js","sourceRoot":"","sources":["../../src/commands/localize.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export default function migrateCmd(): Command;
3
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,MAAM,CAAC,OAAO,UAAU,UAAU,IAAI,OAAO,CAgB5C"}