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.
- package/README.md +1329 -589
- package/dist/cli.js +5 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +11 -4
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/caption.d.ts.map +1 -1
- package/dist/commands/caption.js +74 -2
- package/dist/commands/caption.js.map +1 -1
- package/dist/commands/fonts.d.ts +3 -0
- package/dist/commands/fonts.d.ts.map +1 -0
- package/dist/commands/fonts.js +384 -0
- package/dist/commands/fonts.js.map +1 -0
- package/dist/commands/localize.d.ts.map +1 -1
- package/dist/commands/localize.js +150 -14
- package/dist/commands/localize.js.map +1 -1
- package/dist/commands/migrate.d.ts +3 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +123 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/style.d.ts.map +1 -1
- package/dist/commands/style.js +92 -1
- package/dist/commands/style.js.map +1 -1
- package/dist/core/compose.d.ts +4 -0
- package/dist/core/compose.d.ts.map +1 -1
- package/dist/core/compose.js +102 -9
- package/dist/core/compose.js.map +1 -1
- package/dist/services/fonts.d.ts +71 -0
- package/dist/services/fonts.d.ts.map +1 -0
- package/dist/services/fonts.js +314 -0
- package/dist/services/fonts.js.map +1 -0
- package/dist/services/translation.d.ts +18 -0
- package/dist/services/translation.d.ts.map +1 -0
- package/dist/services/translation.js +201 -0
- package/dist/services/translation.js.map +1 -0
- package/dist/types/ai.d.ts +25 -0
- package/dist/types/ai.d.ts.map +1 -0
- package/dist/types/ai.js +73 -0
- package/dist/types/ai.js.map +1 -0
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/language.d.ts +32 -0
- package/dist/utils/language.d.ts.map +1 -0
- package/dist/utils/language.js +103 -0
- package/dist/utils/language.js.map +1 -0
- 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;
|
|
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
|
|
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('--
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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;
|
|
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,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,YAAY,CAAC;AAG5B,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,MAAM,CAAC,OAAO,UAAU,WAAW;IACjC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC;SAC3B,WAAW,CAAC,iDAAiD,CAAC;SAC9D,cAAc,CAAC,iBAAiB,EAAE,iDAAiD,CAAC;SACpF,MAAM,CAAC,iBAAiB,EAAE,yDAAyD,CAAC;SACpF,MAAM,CAAC,gBAAgB,EAAE,qBAAqB,EAAE,aAAa,CAAC;SAC9D,MAAM,CAAC,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,CAAC;SAClD,MAAM,CAAC,UAAU,EAAE,mCAAmC,CAAC;SACvD,MAAM,CAAC,aAAa,EAAE,iCAAiC,CAAC;SACxD,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACrB,IAAI,CAAC;YACH,oBAAoB;YACpB,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,EAAE,CAAC;gBACpC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,0BAA0B,CAAC,CAAC;gBAC5D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;gBACpE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;gBAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,kBAAkB;YAClB,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC3E,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;YAE/B,eAAe;YACf,IAAI,aAAa,GAAG,IAAI,CAAC,KAAoB,CAAC;YAC9C,MAAM,eAAe,GAAG,kBAAkB,CAAC,kBAAkB,EAAE,CAAC;YAEhE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,oCAAoC,CAAC,CAAC,CAAC;gBAC7D,aAAa,GAAG,MAAM,MAAM,CAAC;oBAC3B,OAAO,EAAE,eAAe;oBACxB,OAAO,EAAE,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;wBAC/B,MAAM,IAAI,GAAG,kBAAkB,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;wBAChD,OAAO;4BACL,KAAK,EAAE,CAAC;4BACR,IAAI,EAAE,CAAC;4BACP,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,SAAS,SAAS,CAAC,CAAC,CAAC,EAAE;yBAChE,CAAC;oBACJ,CAAC,CAAC;iBACH,CAAgB,CAAC;YACpB,CAAC;YAED,MAAM,kBAAkB,CAAC,UAAU,EAAE,CAAC;YAEtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACrD,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACtE,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,EAAE,CAAC;YAEd,qCAAqC;YACrC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;YACrE,IAAI,OAAO,GAAa,EAAE,CAAC;YAE3B,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBACzC,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,+BAA+B;gBAC/B,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;oBAC5C,OAAO,GAAG,KAAK;yBACZ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;yBAChC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;gBACtC,CAAC;gBAAC,MAAM,CAAC;oBACP,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,wBAAwB,CAAC,CAAC;oBAC1D,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;oBAC3F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC;YAED,sBAAsB;YACtB,IAAI,eAAe,GAAG,CAAC,CAAC;YACxB,IAAI,YAAY,GAAG,CAAC,CAAC;YAErB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;gBAE9D,IAAI,CAAC;oBACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;oBACxD,MAAM,QAAQ,GAAiB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;oBAEnD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,CAAC;oBAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;oBAEpC,uCAAuC;oBACvC,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAU,CAAC;oBAE3C,KAAK,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC5D,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;4BAChC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;wBAChC,CAAC;6BAAM,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;4BAClD,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;4BACvC,IAAI,UAAU,EAAE,CAAC;gCACf,+EAA+E;gCAC/E,MAAM,uBAAuB,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,IAAY,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gCACtF,IAAI,CAAC,uBAAuB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oCAC/C,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gCACnC,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,IAAI,gBAAgB,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;wBAChC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,4BAA4B,CAAC,CAAC,CAAC;wBACrD,YAAY,EAAE,CAAC;wBACf,SAAS;oBACX,CAAC;oBAED,OAAO,CAAC,GAAG,CAAC,WAAW,gBAAgB,CAAC,IAAI,iCAAiC,CAAC,CAAC;oBAE/E,kBAAkB;oBAClB,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC,cAAc,CAC1D,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAC5B,eAAe,EACf,aAAa,EACb,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;wBACjB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;oBAC/D,CAAC,CACF,CAAC;oBAEF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,sBAAsB;oBAE1E,mCAAmC;oBACnC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;wBAChB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,0BAA0B,CAAC,CAAC,CAAC;wBACnD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,YAAY,CAAC,OAAO,EAAE,EAAE,CAAC;4BACnD,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;4BAC/C,KAAK,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gCACxD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;4BACrD,CAAC;4BACD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC;gCAC5B,OAAO,EAAE,8BAA8B;gCACvC,OAAO,EAAE,IAAI;6BACd,CAAC,CAAC;4BACH,IAAI,CAAC,OAAO,EAAE,CAAC;gCACb,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;4BAC5B,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,iCAAiC;oBACjC,KAAK,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC3D,IAAI,UAA8B,CAAC;wBAEnC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;4BAChC,UAAU,GAAG,OAAO,CAAC;4BACrB,2BAA2B;4BAC3B,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,OAAO,EAAkB,CAAC;wBACjE,CAAC;6BAAM,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;4BAClD,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;wBACnC,CAAC;wBAED,IAAI,UAAU,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;4BAC/C,MAAM,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;4BAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gCACvD,QAAQ,CAAC,QAAQ,CAAkB,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC;4BAC3D,CAAC;wBACH,CAAC;oBACH,CAAC;oBAED,wBAAwB;oBACxB,MAAM,EAAE,CAAC,SAAS,CAAC,YAAY,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;oBAE5E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,cAAc,YAAY,CAAC,IAAI,aAAa,CAAC,CAAC;oBAC3E,eAAe,IAAI,YAAY,CAAC,IAAI,CAAC;gBAEvC,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,sBAAsB,MAAM,GAAG,CAAC,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;gBACjH,CAAC;YACH,CAAC;YAED,UAAU;YACV,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,cAAc,eAAe,oBAAoB,CAAC,CAAC;YAC9E,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,WAAW,YAAY,6BAA6B,CAAC,CAAC;YACpF,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,wBAAwB,GAAG,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EACxF,EAAE,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAEjD,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"}
|
|
@@ -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"}
|