appshot-cli 0.3.0 → 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.
@@ -0,0 +1,71 @@
1
+ export interface FontInfo {
2
+ name: string;
3
+ family?: string;
4
+ style?: string;
5
+ category?: 'system' | 'recommended' | 'web-safe';
6
+ fallback?: string;
7
+ installed?: boolean;
8
+ }
9
+ export interface FontCategory {
10
+ name: string;
11
+ fonts: FontInfo[];
12
+ }
13
+ export interface FontStatus {
14
+ name: string;
15
+ installed: boolean;
16
+ category?: 'system' | 'recommended' | 'web-safe';
17
+ fallback: string;
18
+ warning?: string;
19
+ }
20
+ export declare class FontService {
21
+ private static instance;
22
+ private systemFontsCache;
23
+ static getInstance(): FontService;
24
+ /**
25
+ * Get list of system fonts based on platform
26
+ */
27
+ getSystemFonts(): Promise<string[]>;
28
+ /**
29
+ * Get fonts on macOS using system_profiler
30
+ */
31
+ private getMacOSFonts;
32
+ /**
33
+ * Get fonts on Linux using fc-list
34
+ */
35
+ private getLinuxFonts;
36
+ /**
37
+ * Get fonts on Windows using PowerShell
38
+ */
39
+ private getWindowsFonts;
40
+ /**
41
+ * Get recommended fonts with installation status
42
+ */
43
+ getRecommendedFonts(): Promise<FontInfo[]>;
44
+ /**
45
+ * Get basic recommended fonts (without async check) for backward compatibility
46
+ */
47
+ getRecommendedFontsSync(): FontInfo[];
48
+ /**
49
+ * Get fonts organized by category with installation status
50
+ */
51
+ getFontCategories(): Promise<FontCategory[]>;
52
+ /**
53
+ * Check if a font is actually installed on the system
54
+ * This is the TRUTH - only returns true if font can actually be used
55
+ */
56
+ isFontInstalled(fontName: string): Promise<boolean>;
57
+ /**
58
+ * Validate if a font can be rendered
59
+ * NOW only checks if actually installed, not just "recommended"
60
+ */
61
+ validateFont(fontName: string): Promise<boolean>;
62
+ /**
63
+ * Get detailed status about a font
64
+ */
65
+ getFontStatus(fontName: string): Promise<FontStatus>;
66
+ /**
67
+ * Get a font's fallback chain (synchronous for backward compatibility)
68
+ */
69
+ getFontFallback(fontName: string): string;
70
+ }
71
+ //# sourceMappingURL=fonts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts.d.ts","sourceRoot":"","sources":["../../src/services/fonts.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,UAAU,CAAC;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,UAAU,CAAC;IACjD,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAc;IACrC,OAAO,CAAC,gBAAgB,CAAyB;WAEnC,WAAW,IAAI,WAAW;IAOxC;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IA8BzC;;OAEG;YACW,aAAa;IA8B3B;;OAEG;YACW,aAAa;IAwB3B;;OAEG;YACW,eAAe;IAkB7B;;OAEG;IACG,mBAAmB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IA8ChD;;OAEG;IACH,uBAAuB,IAAI,QAAQ,EAAE;IAcrC;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAsDlD;;;OAGG;IACG,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKzD;;;OAGG;IACG,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKtD;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAyB1D;;OAEG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;CAgD1C"}
@@ -0,0 +1,314 @@
1
+ import { exec } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import { platform } from 'os';
4
+ const execAsync = promisify(exec);
5
+ export class FontService {
6
+ static instance;
7
+ systemFontsCache = null;
8
+ static getInstance() {
9
+ if (!FontService.instance) {
10
+ FontService.instance = new FontService();
11
+ }
12
+ return FontService.instance;
13
+ }
14
+ /**
15
+ * Get list of system fonts based on platform
16
+ */
17
+ async getSystemFonts() {
18
+ if (this.systemFontsCache) {
19
+ return this.systemFontsCache;
20
+ }
21
+ const os = platform();
22
+ let fonts = [];
23
+ try {
24
+ switch (os) {
25
+ case 'darwin': // macOS
26
+ fonts = await this.getMacOSFonts();
27
+ break;
28
+ case 'linux':
29
+ fonts = await this.getLinuxFonts();
30
+ break;
31
+ case 'win32':
32
+ fonts = await this.getWindowsFonts();
33
+ break;
34
+ default:
35
+ console.warn(`Font detection not implemented for platform: ${os}`);
36
+ }
37
+ }
38
+ catch (error) {
39
+ console.error('Error detecting system fonts:', error);
40
+ }
41
+ this.systemFontsCache = fonts;
42
+ return fonts;
43
+ }
44
+ /**
45
+ * Get fonts on macOS using system_profiler
46
+ */
47
+ async getMacOSFonts() {
48
+ try {
49
+ const { stdout } = await execAsync('system_profiler SPFontsDataType -json', {
50
+ maxBuffer: 10 * 1024 * 1024 // 10MB buffer to handle large font lists
51
+ });
52
+ const data = JSON.parse(stdout);
53
+ const fonts = new Set();
54
+ // Parse the JSON structure
55
+ if (data.SPFontsDataType) {
56
+ for (const font of data.SPFontsDataType) {
57
+ // Extract typefaces
58
+ if (font.typefaces) {
59
+ for (const typefaceKey of Object.keys(font.typefaces)) {
60
+ const typeface = font.typefaces[typefaceKey];
61
+ if (typeface.family) {
62
+ fonts.add(typeface.family);
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+ return Array.from(fonts).sort();
69
+ }
70
+ catch (error) {
71
+ console.error('Error getting macOS fonts:', error);
72
+ return [];
73
+ }
74
+ }
75
+ /**
76
+ * Get fonts on Linux using fc-list
77
+ */
78
+ async getLinuxFonts() {
79
+ try {
80
+ const { stdout } = await execAsync('fc-list : family');
81
+ const fonts = new Set();
82
+ const lines = stdout.split('\n');
83
+ for (const line of lines) {
84
+ const fontName = line.trim();
85
+ if (fontName) {
86
+ // fc-list may return comma-separated font names
87
+ const names = fontName.split(',');
88
+ for (const name of names) {
89
+ fonts.add(name.trim());
90
+ }
91
+ }
92
+ }
93
+ return Array.from(fonts).sort();
94
+ }
95
+ catch {
96
+ console.warn('fc-list not available, using fallback fonts');
97
+ return this.getRecommendedFontsSync().map(f => f.name);
98
+ }
99
+ }
100
+ /**
101
+ * Get fonts on Windows using PowerShell
102
+ */
103
+ async getWindowsFonts() {
104
+ try {
105
+ const { stdout } = await execAsync('powershell -Command "[System.Reflection.Assembly]::LoadWithPartialName(\'System.Drawing\'); (New-Object System.Drawing.Text.InstalledFontCollection).Families | ForEach-Object { $_.Name }"');
106
+ const fonts = stdout
107
+ .split('\n')
108
+ .map(line => line.trim())
109
+ .filter(line => line.length > 0);
110
+ return fonts.sort();
111
+ }
112
+ catch {
113
+ console.warn('Could not get Windows fonts, using fallback fonts');
114
+ return this.getRecommendedFontsSync().map(f => f.name);
115
+ }
116
+ }
117
+ /**
118
+ * Get recommended fonts with installation status
119
+ */
120
+ async getRecommendedFonts() {
121
+ const systemFonts = await this.getSystemFonts();
122
+ const systemFontSet = new Set(systemFonts.map(f => f.toLowerCase()));
123
+ const fonts = [
124
+ // Sans-serif fonts (web-safe are usually installed)
125
+ { name: 'Helvetica', family: 'Helvetica', category: 'web-safe', fallback: 'Arial, sans-serif' },
126
+ { name: 'Arial', family: 'Arial', category: 'web-safe', fallback: 'Helvetica, sans-serif' },
127
+ { name: 'Roboto', family: 'Roboto', category: 'recommended', fallback: 'Arial, sans-serif' },
128
+ { name: 'Open Sans', family: 'Open Sans', category: 'recommended', fallback: 'Arial, sans-serif' },
129
+ { name: 'Montserrat', family: 'Montserrat', category: 'recommended', fallback: 'Arial, sans-serif' },
130
+ { name: 'Lato', family: 'Lato', category: 'recommended', fallback: 'Arial, sans-serif' },
131
+ { name: 'Poppins', family: 'Poppins', category: 'recommended', fallback: 'Arial, sans-serif' },
132
+ { name: 'Inter', family: 'Inter', category: 'recommended', fallback: 'Arial, sans-serif' },
133
+ // Serif fonts
134
+ { name: 'Georgia', family: 'Georgia', category: 'web-safe', fallback: 'Times New Roman, serif' },
135
+ { name: 'Times New Roman', family: 'Times New Roman', category: 'web-safe', fallback: 'Georgia, serif' },
136
+ { name: 'Playfair Display', family: 'Playfair Display', category: 'recommended', fallback: 'Georgia, serif' },
137
+ { name: 'Merriweather', family: 'Merriweather', category: 'recommended', fallback: 'Georgia, serif' },
138
+ // Monospace fonts
139
+ { name: 'Courier New', family: 'Courier New', category: 'web-safe', fallback: 'monospace' },
140
+ { name: 'Monaco', family: 'Monaco', category: 'web-safe', fallback: 'Courier New, monospace' },
141
+ { name: 'Consolas', family: 'Consolas', category: 'web-safe', fallback: 'Courier New, monospace' },
142
+ // Display fonts
143
+ { name: 'Impact', family: 'Impact', category: 'web-safe', fallback: 'Arial Black, sans-serif' },
144
+ { name: 'Arial Black', family: 'Arial Black', category: 'web-safe', fallback: 'Impact, sans-serif' },
145
+ // System fonts
146
+ { name: 'SF Pro', family: 'SF Pro', category: 'system', fallback: 'system-ui, -apple-system, sans-serif' },
147
+ { name: 'SF Pro Display', family: 'SF Pro Display', category: 'system', fallback: 'system-ui, -apple-system, sans-serif' },
148
+ { name: 'San Francisco', family: 'San Francisco', category: 'system', fallback: 'system-ui, -apple-system, sans-serif' },
149
+ { name: 'New York', family: 'New York', category: 'system', fallback: 'Georgia, serif' },
150
+ { name: 'Segoe UI', family: 'Segoe UI', category: 'system', fallback: 'system-ui, sans-serif' }
151
+ ];
152
+ // Mark which fonts are actually installed
153
+ for (const font of fonts) {
154
+ font.installed = systemFontSet.has(font.name.toLowerCase());
155
+ }
156
+ return fonts;
157
+ }
158
+ /**
159
+ * Get basic recommended fonts (without async check) for backward compatibility
160
+ */
161
+ getRecommendedFontsSync() {
162
+ return [
163
+ // Only return truly web-safe fonts that are almost always available
164
+ { name: 'Helvetica', family: 'Helvetica', category: 'web-safe', fallback: 'Arial, sans-serif' },
165
+ { name: 'Arial', family: 'Arial', category: 'web-safe', fallback: 'Helvetica, sans-serif' },
166
+ { name: 'Georgia', family: 'Georgia', category: 'web-safe', fallback: 'Times New Roman, serif' },
167
+ { name: 'Times New Roman', family: 'Times New Roman', category: 'web-safe', fallback: 'Georgia, serif' },
168
+ { name: 'Courier New', family: 'Courier New', category: 'web-safe', fallback: 'monospace' },
169
+ { name: 'Monaco', family: 'Monaco', category: 'web-safe', fallback: 'Courier New, monospace' },
170
+ { name: 'Impact', family: 'Impact', category: 'web-safe', fallback: 'Arial Black, sans-serif' },
171
+ { name: 'Arial Black', family: 'Arial Black', category: 'web-safe', fallback: 'Impact, sans-serif' }
172
+ ];
173
+ }
174
+ /**
175
+ * Get fonts organized by category with installation status
176
+ */
177
+ async getFontCategories() {
178
+ const systemFonts = await this.getSystemFonts();
179
+ const recommendedFonts = await this.getRecommendedFonts();
180
+ // Create a set of recommended font names for quick lookup
181
+ const recommendedNames = new Set(recommendedFonts.map(f => f.name.toLowerCase()));
182
+ // Filter system fonts to exclude ones already in recommended
183
+ const additionalSystemFonts = systemFonts
184
+ .filter(font => !recommendedNames.has(font.toLowerCase()))
185
+ .slice(0, 20) // Limit to top 20 to avoid overwhelming the user
186
+ .map(name => ({
187
+ name,
188
+ category: 'system',
189
+ installed: true // These are from system fonts, so they're installed
190
+ }));
191
+ // Separate installed vs not installed
192
+ const installedWebSafe = recommendedFonts.filter(f => f.category === 'web-safe' && f.installed);
193
+ const installedRecommended = recommendedFonts.filter(f => f.category === 'recommended' && f.installed);
194
+ const notInstalledRecommended = recommendedFonts.filter(f => f.category === 'recommended' && !f.installed);
195
+ const categories = [
196
+ {
197
+ name: 'Installed Fonts (Web-Safe)',
198
+ fonts: installedWebSafe
199
+ }
200
+ ];
201
+ if (installedRecommended.length > 0) {
202
+ categories.push({
203
+ name: 'Installed Fonts (Popular)',
204
+ fonts: installedRecommended
205
+ });
206
+ }
207
+ if (notInstalledRecommended.length > 0) {
208
+ categories.push({
209
+ name: 'Popular Fonts (Not Installed - Will Use Fallback)',
210
+ fonts: notInstalledRecommended
211
+ });
212
+ }
213
+ categories.push({
214
+ name: 'System Fonts',
215
+ fonts: [
216
+ ...recommendedFonts.filter(f => f.category === 'system' && f.installed),
217
+ ...additionalSystemFonts
218
+ ]
219
+ });
220
+ return categories;
221
+ }
222
+ /**
223
+ * Check if a font is actually installed on the system
224
+ * This is the TRUTH - only returns true if font can actually be used
225
+ */
226
+ async isFontInstalled(fontName) {
227
+ const systemFonts = await this.getSystemFonts();
228
+ return systemFonts.some(f => f.toLowerCase() === fontName.toLowerCase());
229
+ }
230
+ /**
231
+ * Validate if a font can be rendered
232
+ * NOW only checks if actually installed, not just "recommended"
233
+ */
234
+ async validateFont(fontName) {
235
+ // Only return true if font is ACTUALLY installed
236
+ return this.isFontInstalled(fontName);
237
+ }
238
+ /**
239
+ * Get detailed status about a font
240
+ */
241
+ async getFontStatus(fontName) {
242
+ const installed = await this.isFontInstalled(fontName);
243
+ const recommended = await this.getRecommendedFonts();
244
+ const fontInfo = recommended.find(f => f.name.toLowerCase() === fontName.toLowerCase());
245
+ const status = {
246
+ name: fontName,
247
+ installed,
248
+ category: fontInfo?.category,
249
+ fallback: this.getFontFallback(fontName)
250
+ };
251
+ if (!installed) {
252
+ if (fontInfo?.category === 'recommended') {
253
+ status.warning = `Font "${fontName}" is not installed. Install it from Google Fonts or the fallback (${status.fallback}) will be used.`;
254
+ }
255
+ else if (fontInfo?.category === 'system') {
256
+ status.warning = `System font "${fontName}" is not available on this machine. The fallback (${status.fallback}) will be used.`;
257
+ }
258
+ else {
259
+ status.warning = `Font "${fontName}" is not installed on your system. The fallback (${status.fallback}) will be used.`;
260
+ }
261
+ }
262
+ return status;
263
+ }
264
+ /**
265
+ * Get a font's fallback chain (synchronous for backward compatibility)
266
+ */
267
+ getFontFallback(fontName) {
268
+ // Use sync version for immediate fallback lookup
269
+ const recommended = this.getRecommendedFontsSync();
270
+ const font = recommended.find(f => f.name.toLowerCase() === fontName.toLowerCase());
271
+ if (font?.fallback) {
272
+ return font.fallback;
273
+ }
274
+ // Check extended list if not found in basic web-safe fonts
275
+ const extendedFonts = [
276
+ { name: 'Roboto', fallback: 'Arial, sans-serif' },
277
+ { name: 'Open Sans', fallback: 'Arial, sans-serif' },
278
+ { name: 'Montserrat', fallback: 'Arial, sans-serif' },
279
+ { name: 'Lato', fallback: 'Arial, sans-serif' },
280
+ { name: 'Poppins', fallback: 'Arial, sans-serif' },
281
+ { name: 'Inter', fallback: 'Arial, sans-serif' },
282
+ { name: 'Playfair Display', fallback: 'Georgia, serif' },
283
+ { name: 'Merriweather', fallback: 'Georgia, serif' },
284
+ { name: 'SF Pro', fallback: 'system-ui, -apple-system, sans-serif' },
285
+ { name: 'SF Pro Display', fallback: 'system-ui, -apple-system, sans-serif' },
286
+ { name: 'San Francisco', fallback: 'system-ui, -apple-system, sans-serif' },
287
+ { name: 'New York', fallback: 'Georgia, serif' },
288
+ { name: 'Segoe UI', fallback: 'system-ui, sans-serif' }
289
+ ];
290
+ const extendedFont = extendedFonts.find(f => f.name.toLowerCase() === fontName.toLowerCase());
291
+ if (extendedFont) {
292
+ return extendedFont.fallback;
293
+ }
294
+ // Default fallback based on font characteristics
295
+ const lowerFont = fontName.toLowerCase();
296
+ if (lowerFont.includes('serif') && !lowerFont.includes('sans')) {
297
+ // Serif font
298
+ return 'Georgia, Times New Roman, serif';
299
+ }
300
+ else if (lowerFont.includes('mono') || lowerFont.includes('code') || lowerFont.includes('console')) {
301
+ // Monospace font
302
+ return 'Courier New, Monaco, monospace';
303
+ }
304
+ else if (lowerFont.includes('display') || lowerFont.includes('headline')) {
305
+ // Display font
306
+ return 'Impact, Arial Black, sans-serif';
307
+ }
308
+ else {
309
+ // Default to sans-serif
310
+ return 'Arial, Helvetica, sans-serif';
311
+ }
312
+ }
313
+ }
314
+ //# sourceMappingURL=fonts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fonts.js","sourceRoot":"","sources":["../../src/services/fonts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAE9B,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAwBlC,MAAM,OAAO,WAAW;IACd,MAAM,CAAC,QAAQ,CAAc;IAC7B,gBAAgB,GAAoB,IAAI,CAAC;IAE1C,MAAM,CAAC,WAAW;QACvB,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC1B,WAAW,CAAC,QAAQ,GAAG,IAAI,WAAW,EAAE,CAAC;QAC3C,CAAC;QACD,OAAO,WAAW,CAAC,QAAQ,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,gBAAgB,CAAC;QAC/B,CAAC;QAED,MAAM,EAAE,GAAG,QAAQ,EAAE,CAAC;QACtB,IAAI,KAAK,GAAa,EAAE,CAAC;QAEzB,IAAI,CAAC;YACH,QAAQ,EAAE,EAAE,CAAC;gBACb,KAAK,QAAQ,EAAE,QAAQ;oBACrB,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnC,MAAM;gBACR,KAAK,OAAO;oBACV,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC;oBACnC,MAAM;gBACR,KAAK,OAAO;oBACV,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;oBACrC,MAAM;gBACR;oBACE,OAAO,CAAC,IAAI,CAAC,gDAAgD,EAAE,EAAE,CAAC,CAAC;YACrE,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,KAAK,CAAC,CAAC;QACxD,CAAC;QAED,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa;QACzB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,uCAAuC,EAAE;gBAC1E,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC,yCAAyC;aACtE,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAChC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;YAEhC,2BAA2B;YAC3B,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;oBACxC,oBAAoB;oBACpB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;wBACnB,KAAK,MAAM,WAAW,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;4BACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;4BAC7C,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gCACpB,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;4BAC7B,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,4BAA4B,EAAE,KAAK,CAAC,CAAC;YACnD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa;QACzB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,kBAAkB,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;YAEhC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACjC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,QAAQ,EAAE,CAAC;oBACb,gDAAgD;oBAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAClC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;wBACzB,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;YACH,CAAC;YAED,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;YAC5D,OAAO,IAAI,CAAC,uBAAuB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,eAAe;QAC3B,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAChC,6LAA6L,CAC9L,CAAC;YAEF,MAAM,KAAK,GAAG,MAAM;iBACjB,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBACxB,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAEnC,OAAO,KAAK,CAAC,IAAI,EAAE,CAAC;QACtB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;YAClE,OAAO,IAAI,CAAC,uBAAuB,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB;QACvB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAErE,MAAM,KAAK,GAAe;YACxB,oDAAoD;YACpD,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,mBAAmB,EAAE;YAC/F,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,uBAAuB,EAAE;YAC3F,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,mBAAmB,EAAE;YAC5F,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,mBAAmB,EAAE;YAClG,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,mBAAmB,EAAE;YACpG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,mBAAmB,EAAE;YACxF,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,mBAAmB,EAAE;YAC9F,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,mBAAmB,EAAE;YAE1F,cAAc;YACd,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,wBAAwB,EAAE;YAChG,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE;YACxG,EAAE,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE;YAC7G,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,aAAa,EAAE,QAAQ,EAAE,gBAAgB,EAAE;YAErG,kBAAkB;YAClB,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE;YAC3F,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,wBAAwB,EAAE;YAC9F,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,wBAAwB,EAAE;YAElG,gBAAgB;YAChB,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,yBAAyB,EAAE;YAC/F,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,oBAAoB,EAAE;YAEpG,eAAe;YACf,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,sCAAsC,EAAE;YAC1G,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,sCAAsC,EAAE;YAC1H,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,sCAAsC,EAAE;YACxH,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,gBAAgB,EAAE;YACxF,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,uBAAuB,EAAE;SAChG,CAAC;QAEF,0CAA0C;QAC1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,uBAAuB;QACrB,OAAO;YACL,oEAAoE;YACpE,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,mBAAmB,EAAE;YAC/F,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,uBAAuB,EAAE;YAC3F,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,wBAAwB,EAAE;YAChG,EAAE,IAAI,EAAE,iBAAiB,EAAE,MAAM,EAAE,iBAAiB,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE;YACxG,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE;YAC3F,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,wBAAwB,EAAE;YAC9F,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,yBAAyB,EAAE;YAC/F,EAAE,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,oBAAoB,EAAE;SACrG,CAAC;IACJ,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB;QACrB,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAChD,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QAE1D,0DAA0D;QAC1D,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;QAElF,6DAA6D;QAC7D,MAAM,qBAAqB,GAAG,WAAW;aACtC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;aACzD,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,iDAAiD;aAC9D,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACZ,IAAI;YACJ,QAAQ,EAAE,QAAiB;YAC3B,SAAS,EAAE,IAAI,CAAE,oDAAoD;SACtE,CAAC,CAAC,CAAC;QAEN,sCAAsC;QACtC,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;QAChG,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,aAAa,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;QACvG,MAAM,uBAAuB,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,aAAa,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAE3G,MAAM,UAAU,GAAmB;YACjC;gBACE,IAAI,EAAE,4BAA4B;gBAClC,KAAK,EAAE,gBAAgB;aACxB;SACF,CAAC;QAEF,IAAI,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpC,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,2BAA2B;gBACjC,KAAK,EAAE,oBAAoB;aAC5B,CAAC,CAAC;QACL,CAAC;QAED,IAAI,uBAAuB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvC,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,mDAAmD;gBACzD,KAAK,EAAE,uBAAuB;aAC/B,CAAC,CAAC;QACL,CAAC;QAED,UAAU,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE;gBACL,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,CAAC;gBACvE,GAAG,qBAAqB;aACzB;SACF,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAChD,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,iDAAiD;QACjD,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;QACvD,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAExF,MAAM,MAAM,GAAe;YACzB,IAAI,EAAE,QAAQ;YACd,SAAS;YACT,QAAQ,EAAE,QAAQ,EAAE,QAAQ;YAC5B,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;SACzC,CAAC;QAEF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,IAAI,QAAQ,EAAE,QAAQ,KAAK,aAAa,EAAE,CAAC;gBACzC,MAAM,CAAC,OAAO,GAAG,SAAS,QAAQ,qEAAqE,MAAM,CAAC,QAAQ,iBAAiB,CAAC;YAC1I,CAAC;iBAAM,IAAI,QAAQ,EAAE,QAAQ,KAAK,QAAQ,EAAE,CAAC;gBAC3C,MAAM,CAAC,OAAO,GAAG,gBAAgB,QAAQ,qDAAqD,MAAM,CAAC,QAAQ,iBAAiB,CAAC;YACjI,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,OAAO,GAAG,SAAS,QAAQ,oDAAoD,MAAM,CAAC,QAAQ,iBAAiB,CAAC;YACzH,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,QAAgB;QAC9B,iDAAiD;QACjD,MAAM,WAAW,GAAG,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAEpF,IAAI,IAAI,EAAE,QAAQ,EAAE,CAAC;YACnB,OAAO,IAAI,CAAC,QAAQ,CAAC;QACvB,CAAC;QAED,2DAA2D;QAC3D,MAAM,aAAa,GAA4C;YAC7D,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,mBAAmB,EAAE;YACjD,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,mBAAmB,EAAE;YACpD,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,mBAAmB,EAAE;YACrD,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,mBAAmB,EAAE;YAC/C,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,mBAAmB,EAAE;YAClD,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,mBAAmB,EAAE;YAChD,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,gBAAgB,EAAE;YACxD,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE;YACpD,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,sCAAsC,EAAE;YACpE,EAAE,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,sCAAsC,EAAE;YAC5E,EAAE,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,sCAAsC,EAAE;YAC3E,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,gBAAgB,EAAE;YAChD,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,uBAAuB,EAAE;SACxD,CAAC;QAEF,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9F,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,YAAY,CAAC,QAAQ,CAAC;QAC/B,CAAC;QAED,iDAAiD;QACjD,MAAM,SAAS,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QAEzC,IAAI,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/D,aAAa;YACb,OAAO,iCAAiC,CAAC;QAC3C,CAAC;aAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACrG,iBAAiB;YACjB,OAAO,gCAAgC,CAAC;QAC1C,CAAC;aAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3E,eAAe;YACf,OAAO,iCAAiC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,wBAAwB;YACxB,OAAO,8BAA8B,CAAC;QACxC,CAAC;IACH,CAAC;CACF"}
package/dist/types.d.ts CHANGED
@@ -27,6 +27,7 @@ export interface DeviceStyleConfig {
27
27
  captionSize?: number;
28
28
  captionPosition?: 'above' | 'overlay';
29
29
  captionBox?: CaptionBoxConfig;
30
+ captionFont?: string;
30
31
  }
31
32
  export interface DeviceConfig extends DeviceStyleConfig {
32
33
  input: string;
@@ -45,6 +46,7 @@ export interface AppshotConfig {
45
46
  devices: {
46
47
  [key: string]: DeviceConfig;
47
48
  };
49
+ defaultLanguage?: string;
48
50
  }
49
51
  export interface CaptionEntry {
50
52
  [lang: string]: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,CAAC;CACnF;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC/B,GAAG,CAAC,EAAE,gBAAgB,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC,UAAU,CAAC,EAAE,gBAAgB,CAAC;CAC/B;AAED,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE;QACP,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,kBAAkB,CAAC;IAChC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,GAAG,UAAU,CAAC;CACnF;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,CAAC;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC;IAC/B,GAAG,CAAC,EAAE,gBAAgB,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACtC,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,OAAO,EAAE;QACP,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,CAAC;KAC7B,CAAC;IACF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,CAAC;CAC3C;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CACxC;AAED,MAAM,WAAW,gBAAgB;IAC/B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,kBAAkB,CAAC;IAChC,SAAS,EAAE,gBAAgB,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB"}
@@ -0,0 +1,32 @@
1
+ import type { CaptionsFile, AppshotConfig } from '../types.js';
2
+ /**
3
+ * Get the system's default language code
4
+ * Uses Intl API first, then environment variables, finally defaults to 'en'
5
+ */
6
+ export declare function getSystemLanguage(): string;
7
+ /**
8
+ * Detect available languages from caption structure
9
+ * Returns empty array for simple string captions
10
+ */
11
+ export declare function detectLanguagesFromCaptions(captions: CaptionsFile): string[];
12
+ /**
13
+ * Resolve which languages to build based on priority:
14
+ * 1. CLI --langs flag (highest priority)
15
+ * 2. Languages detected from caption objects
16
+ * 3. Config defaultLanguage setting
17
+ * 4. System detected language
18
+ * 5. Fallback to 'en'
19
+ */
20
+ export declare function resolveLanguages(cliLangs: string[] | undefined, captions: CaptionsFile, config: AppshotConfig): {
21
+ languages: string[];
22
+ source: string;
23
+ };
24
+ /**
25
+ * Validate language code format (basic ISO 639-1 validation)
26
+ */
27
+ export declare function isValidLanguageCode(code: string): boolean;
28
+ /**
29
+ * Normalize language code to lowercase, preserving region if present
30
+ */
31
+ export declare function normalizeLanguageCode(code: string): string;
32
+ //# sourceMappingURL=language.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language.d.ts","sourceRoot":"","sources":["../../src/utils/language.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/D;;;GAGG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAoB1C;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,EAAE,CAW5E;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,EAC9B,QAAQ,EAAE,YAAY,EACtB,MAAM,EAAE,aAAa,GACpB;IAAE,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAwCzC;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGzD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO1D"}
@@ -0,0 +1,103 @@
1
+ /**
2
+ * Get the system's default language code
3
+ * Uses Intl API first, then environment variables, finally defaults to 'en'
4
+ */
5
+ export function getSystemLanguage() {
6
+ try {
7
+ // Try Intl API first (most reliable in Node.js)
8
+ const locale = Intl.DateTimeFormat().resolvedOptions().locale;
9
+ // Extract language code (e.g., 'en' from 'en-US')
10
+ return locale.split('-')[0].toLowerCase();
11
+ }
12
+ catch {
13
+ // Fall back to environment variables
14
+ const envLang = process.env.LANG || process.env.LC_ALL || process.env.LC_MESSAGES || '';
15
+ if (envLang) {
16
+ // Extract language code from POSIX locale (e.g., 'en' from 'en_US.UTF-8')
17
+ const match = envLang.match(/^([a-z]{2})/i);
18
+ if (match) {
19
+ return match[1].toLowerCase();
20
+ }
21
+ }
22
+ // Default to English
23
+ return 'en';
24
+ }
25
+ }
26
+ /**
27
+ * Detect available languages from caption structure
28
+ * Returns empty array for simple string captions
29
+ */
30
+ export function detectLanguagesFromCaptions(captions) {
31
+ const languages = new Set();
32
+ for (const [_, value] of Object.entries(captions)) {
33
+ if (typeof value === 'object' && value !== null) {
34
+ // Caption entry with language keys
35
+ Object.keys(value).forEach(lang => languages.add(lang));
36
+ }
37
+ }
38
+ return Array.from(languages).sort();
39
+ }
40
+ /**
41
+ * Resolve which languages to build based on priority:
42
+ * 1. CLI --langs flag (highest priority)
43
+ * 2. Languages detected from caption objects
44
+ * 3. Config defaultLanguage setting
45
+ * 4. System detected language
46
+ * 5. Fallback to 'en'
47
+ */
48
+ export function resolveLanguages(cliLangs, captions, config) {
49
+ // Priority 1: CLI languages
50
+ if (cliLangs && cliLangs.length > 0) {
51
+ return {
52
+ languages: cliLangs,
53
+ source: 'command line'
54
+ };
55
+ }
56
+ // Priority 2: Detect from captions
57
+ const captionLangs = detectLanguagesFromCaptions(captions);
58
+ if (captionLangs.length > 0) {
59
+ return {
60
+ languages: captionLangs,
61
+ source: 'caption files'
62
+ };
63
+ }
64
+ // Priority 3: Config default language
65
+ if (config.defaultLanguage) {
66
+ return {
67
+ languages: [config.defaultLanguage],
68
+ source: 'config setting'
69
+ };
70
+ }
71
+ // Priority 4: System language
72
+ const systemLang = getSystemLanguage();
73
+ if (systemLang !== 'en') {
74
+ return {
75
+ languages: [systemLang],
76
+ source: `system locale (${systemLang.toUpperCase()})`
77
+ };
78
+ }
79
+ // Priority 5: Fallback
80
+ return {
81
+ languages: ['en'],
82
+ source: 'default'
83
+ };
84
+ }
85
+ /**
86
+ * Validate language code format (basic ISO 639-1 validation)
87
+ */
88
+ export function isValidLanguageCode(code) {
89
+ // Basic validation: 2-3 letter codes, optionally with region (e.g., zh-CN)
90
+ return /^[a-z]{2,3}(-[A-Z]{2})?$/.test(code);
91
+ }
92
+ /**
93
+ * Normalize language code to lowercase, preserving region if present
94
+ */
95
+ export function normalizeLanguageCode(code) {
96
+ const parts = code.split('-');
97
+ if (parts.length === 2) {
98
+ // Preserve format like zh-CN
99
+ return `${parts[0].toLowerCase()}-${parts[1].toUpperCase()}`;
100
+ }
101
+ return code.toLowerCase();
102
+ }
103
+ //# sourceMappingURL=language.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language.js","sourceRoot":"","sources":["../../src/utils/language.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appshot-cli",
3
- "version": "0.3.0",
3
+ "version": "0.4.0",
4
4
  "description": "Generate App Store–ready screenshots with frames, gradients, and captions.",
5
5
  "bin": {
6
6
  "appshot": "bin/appshot.js"