appshot-cli 0.9.0 → 0.9.2

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 (47) hide show
  1. package/README.md +320 -1
  2. package/dist/cli.js +6 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/commands/export.d.ts +3 -0
  5. package/dist/commands/export.d.ts.map +1 -0
  6. package/dist/commands/export.js +382 -0
  7. package/dist/commands/export.js.map +1 -0
  8. package/dist/commands/order.d.ts +3 -0
  9. package/dist/commands/order.d.ts.map +1 -0
  10. package/dist/commands/order.js +321 -0
  11. package/dist/commands/order.js.map +1 -0
  12. package/dist/core/compose.d.ts.map +1 -1
  13. package/dist/core/compose.js +71 -138
  14. package/dist/core/compose.js.map +1 -1
  15. package/dist/core/layout-utils.d.ts +12 -0
  16. package/dist/core/layout-utils.d.ts.map +1 -0
  17. package/dist/core/layout-utils.js +28 -0
  18. package/dist/core/layout-utils.js.map +1 -0
  19. package/dist/core/text-utils.d.ts +1 -1
  20. package/dist/core/text-utils.d.ts.map +1 -1
  21. package/dist/core/text-utils.js +5 -9
  22. package/dist/core/text-utils.js.map +1 -1
  23. package/dist/services/doctor.js +1 -1
  24. package/dist/services/export-validator.d.ts +23 -0
  25. package/dist/services/export-validator.d.ts.map +1 -0
  26. package/dist/services/export-validator.js +209 -0
  27. package/dist/services/export-validator.js.map +1 -0
  28. package/dist/services/fastlane-config-generator.d.ts +17 -0
  29. package/dist/services/fastlane-config-generator.d.ts.map +1 -0
  30. package/dist/services/fastlane-config-generator.js +343 -0
  31. package/dist/services/fastlane-config-generator.js.map +1 -0
  32. package/dist/services/fastlane-language-mapper.d.ts +33 -0
  33. package/dist/services/fastlane-language-mapper.d.ts.map +1 -0
  34. package/dist/services/fastlane-language-mapper.js +167 -0
  35. package/dist/services/fastlane-language-mapper.js.map +1 -0
  36. package/dist/services/screenshot-order.d.ts +41 -0
  37. package/dist/services/screenshot-order.d.ts.map +1 -0
  38. package/dist/services/screenshot-order.js +211 -0
  39. package/dist/services/screenshot-order.js.map +1 -0
  40. package/dist/services/screenshot-organizer.d.ts +44 -0
  41. package/dist/services/screenshot-organizer.d.ts.map +1 -0
  42. package/dist/services/screenshot-organizer.js +234 -0
  43. package/dist/services/screenshot-organizer.js.map +1 -0
  44. package/dist/templates/registry.d.ts.map +1 -1
  45. package/dist/templates/registry.js +49 -159
  46. package/dist/templates/registry.js.map +1 -1
  47. package/package.json +1 -1
@@ -0,0 +1,211 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ import pc from 'picocolors';
4
+ const CONFIG_VERSION = '1.0';
5
+ const ORDER_FILE = '.appshot/screenshot-order.json';
6
+ /**
7
+ * Load screenshot order configuration
8
+ */
9
+ export async function loadOrderConfig(projectPath) {
10
+ try {
11
+ const configPath = path.join(projectPath || process.cwd(), ORDER_FILE);
12
+ const content = await fs.readFile(configPath, 'utf-8');
13
+ return JSON.parse(content);
14
+ }
15
+ catch (error) {
16
+ // Silently return null for missing file, but log other errors
17
+ if (error.code !== 'ENOENT') {
18
+ console.error('Error loading order config:', error);
19
+ }
20
+ return null;
21
+ }
22
+ }
23
+ /**
24
+ * Save screenshot order configuration
25
+ */
26
+ export async function saveOrderConfig(orders, projectPath) {
27
+ const configPath = path.join(projectPath || process.cwd(), ORDER_FILE);
28
+ const configDir = path.dirname(configPath);
29
+ // Ensure directory exists
30
+ await fs.mkdir(configDir, { recursive: true });
31
+ // Load existing config or create new
32
+ const existing = await loadOrderConfig(projectPath);
33
+ const config = {
34
+ version: CONFIG_VERSION,
35
+ orders,
36
+ created: existing?.created || new Date().toISOString(),
37
+ modified: new Date().toISOString()
38
+ };
39
+ await fs.writeFile(configPath, JSON.stringify(config, null, 2));
40
+ }
41
+ /**
42
+ * Apply ordering to screenshots based on saved configuration
43
+ */
44
+ export function applyOrder(screenshots, device, orderConfig) {
45
+ if (!orderConfig || !orderConfig.orders[device]) {
46
+ // No order config, try to detect existing numeric prefixes
47
+ return sortByExistingPrefixes(screenshots);
48
+ }
49
+ const deviceOrder = orderConfig.orders[device];
50
+ const ordered = [];
51
+ const remaining = new Set(screenshots);
52
+ // Create a map of clean names to actual filenames for matching
53
+ const cleanToActual = new Map();
54
+ for (const file of screenshots) {
55
+ // Remove numeric prefix for matching
56
+ const cleanName = file.replace(/^\d+[-_.]/, '');
57
+ cleanToActual.set(cleanName, file);
58
+ }
59
+ // First, add screenshots in the defined order
60
+ for (const orderedFile of deviceOrder) {
61
+ // Clean the ordered filename too (in case it has prefixes)
62
+ const cleanOrderedFile = orderedFile.replace(/^\d+[-_.]/, '');
63
+ // Try to find a match by clean name
64
+ const actualFile = cleanToActual.get(cleanOrderedFile) ||
65
+ cleanToActual.get(orderedFile) || // Also try exact match
66
+ (remaining.has(orderedFile) ? orderedFile : null); // Fallback to exact
67
+ if (actualFile && remaining.has(actualFile)) {
68
+ ordered.push(actualFile);
69
+ remaining.delete(actualFile);
70
+ }
71
+ }
72
+ // Then add any remaining screenshots (new ones not in config)
73
+ const sortedRemaining = Array.from(remaining).sort();
74
+ ordered.push(...sortedRemaining);
75
+ return ordered;
76
+ }
77
+ /**
78
+ * Sort screenshots by existing numeric prefixes if present
79
+ */
80
+ function sortByExistingPrefixes(screenshots) {
81
+ // Check if any files have numeric prefixes
82
+ const withPrefixes = screenshots.map(file => {
83
+ // Match patterns like: 01_, 1-, 1., 1_
84
+ const match = file.match(/^(\d+)[-_.]/);
85
+ return {
86
+ file,
87
+ prefix: match ? parseInt(match[1], 10) : null
88
+ };
89
+ });
90
+ const hasPrefixes = withPrefixes.some(item => item.prefix !== null);
91
+ if (!hasPrefixes) {
92
+ // No prefixes found, use smart defaults
93
+ return applySmartDefaults(screenshots);
94
+ }
95
+ // Sort by prefix, then alphabetically for those without
96
+ return withPrefixes.sort((a, b) => {
97
+ if (a.prefix !== null && b.prefix !== null) {
98
+ return a.prefix - b.prefix;
99
+ }
100
+ if (a.prefix !== null)
101
+ return -1;
102
+ if (b.prefix !== null)
103
+ return 1;
104
+ return a.file.localeCompare(b.file);
105
+ }).map(item => item.file);
106
+ }
107
+ /**
108
+ * Apply smart defaults for common screenshot naming patterns
109
+ */
110
+ function applySmartDefaults(screenshots) {
111
+ const priority = {
112
+ // Home/main screens get top priority
113
+ 'home': 1,
114
+ 'main': 1,
115
+ 'dashboard': 2,
116
+ 'overview': 2,
117
+ // Feature screens
118
+ 'features': 10,
119
+ 'feature': 10,
120
+ // Content screens
121
+ 'feed': 20,
122
+ 'list': 21,
123
+ 'detail': 22,
124
+ 'details': 22,
125
+ // Interactive screens
126
+ 'search': 30,
127
+ 'filter': 31,
128
+ 'sort': 32,
129
+ // User screens
130
+ 'profile': 40,
131
+ 'account': 41,
132
+ 'settings': 42,
133
+ // Other common screens
134
+ 'about': 50,
135
+ 'help': 51,
136
+ 'support': 52
137
+ };
138
+ return screenshots.sort((a, b) => {
139
+ // Remove extension for comparison
140
+ const aName = path.parse(a).name.toLowerCase();
141
+ const bName = path.parse(b).name.toLowerCase();
142
+ // Check for exact matches first
143
+ const aPriority = priority[aName] || 100;
144
+ const bPriority = priority[bName] || 100;
145
+ if (aPriority !== bPriority) {
146
+ return aPriority - bPriority;
147
+ }
148
+ // Check for partial matches
149
+ for (const [pattern, value] of Object.entries(priority)) {
150
+ const aContains = aName.includes(pattern);
151
+ const bContains = bName.includes(pattern);
152
+ if (aContains && !bContains)
153
+ return -1;
154
+ if (!aContains && bContains)
155
+ return 1;
156
+ if (aContains && bContains) {
157
+ return value - value; // Same priority, continue
158
+ }
159
+ }
160
+ // Fallback to alphabetical
161
+ return a.localeCompare(b);
162
+ });
163
+ }
164
+ /**
165
+ * Get available screenshots for a device
166
+ */
167
+ export async function getAvailableScreenshots(device, sourcePath, language = 'en') {
168
+ const baseDir = sourcePath || './final';
169
+ const devicePath = path.join(baseDir, device, language);
170
+ try {
171
+ const files = await fs.readdir(devicePath);
172
+ return files.filter(f => f.match(/\.(png|jpg|jpeg)$/i) && !f.startsWith('.')).sort();
173
+ }
174
+ catch {
175
+ return [];
176
+ }
177
+ }
178
+ /**
179
+ * Add numeric prefixes to filenames based on order
180
+ */
181
+ export function addNumericPrefixes(filenames, startFrom = 1) {
182
+ return filenames.map((file, index) => {
183
+ // Check if file already has a numeric prefix
184
+ if (/^\d+[-_.]/.test(file)) {
185
+ // Remove existing prefix
186
+ file = file.replace(/^\d+[-_.]/, '');
187
+ }
188
+ const num = String(startFrom + index).padStart(2, '0');
189
+ return `${num}_${file}`;
190
+ });
191
+ }
192
+ /**
193
+ * Remove numeric prefixes from filenames
194
+ */
195
+ export function removeNumericPrefixes(filenames) {
196
+ return filenames.map(file => {
197
+ // Remove patterns like: 01_, 1-, 1., 1_
198
+ return file.replace(/^\d+[-_.]/, '');
199
+ });
200
+ }
201
+ /**
202
+ * Display current order for review
203
+ */
204
+ export function displayOrder(screenshots, device) {
205
+ console.log(`\n${pc.bold(`Screenshot order for ${device}:`)}`);
206
+ screenshots.forEach((file, index) => {
207
+ const num = String(index + 1).padStart(2, '0');
208
+ console.log(` ${pc.dim(num)}. ${file}`);
209
+ });
210
+ }
211
+ //# sourceMappingURL=screenshot-order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot-order.js","sourceRoot":"","sources":["../../src/services/screenshot-order.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ export interface OrganizeOptions {
2
+ source: string;
3
+ output: string;
4
+ languageMap: Map<string, string>;
5
+ devices?: string[];
6
+ flatten?: boolean;
7
+ prefixDevice?: boolean;
8
+ devicePrefixes?: Record<string, string>;
9
+ orderConfig?: any;
10
+ applyOrder?: boolean;
11
+ copy?: boolean;
12
+ clean?: boolean;
13
+ dryRun?: boolean;
14
+ verbose?: boolean;
15
+ }
16
+ export interface OrganizeResult {
17
+ processed: number;
18
+ skipped: number;
19
+ errors: number;
20
+ byLanguage: Record<string, number>;
21
+ byDevice: Record<string, number>;
22
+ actions?: FileAction[];
23
+ }
24
+ export interface FileAction {
25
+ source: string;
26
+ destination: string;
27
+ device: string;
28
+ language: string;
29
+ renamed?: boolean;
30
+ specialHandling?: string;
31
+ }
32
+ /**
33
+ * Organize screenshots for Fastlane export
34
+ */
35
+ export declare function organizeScreenshots(options: OrganizeOptions): Promise<OrganizeResult>;
36
+ /**
37
+ * Detect available languages from source directory
38
+ */
39
+ export declare function detectAvailableLanguages(sourceDir: string): Promise<Map<string, Set<string>>>;
40
+ /**
41
+ * Get unique languages across all devices
42
+ */
43
+ export declare function getAllLanguages(sourceDir: string): Promise<string[]>;
44
+ //# sourceMappingURL=screenshot-organizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot-organizer.d.ts","sourceRoot":"","sources":["../../src/services/screenshot-organizer.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,WAAW,CAAC,EAAE,GAAG,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,UAAU,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAiGD;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC,CA4I3F;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAwBnG;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAW1E"}
@@ -0,0 +1,234 @@
1
+ import { promises as fs } from 'fs';
2
+ import path from 'path';
3
+ import sharp from 'sharp';
4
+ /**
5
+ * Default device prefixes for filename
6
+ */
7
+ const DEFAULT_DEVICE_PREFIXES = {
8
+ iphone: 'iPhone_',
9
+ ipad: 'iPad_',
10
+ mac: 'Mac_',
11
+ watch: 'Watch_'
12
+ };
13
+ /**
14
+ * Check if image has iPad Pro 12.9" 3rd gen dimensions
15
+ */
16
+ async function isIpadPro3rdGen(imagePath) {
17
+ try {
18
+ const metadata = await sharp(imagePath).metadata();
19
+ const { width = 0, height = 0 } = metadata;
20
+ // iPad Pro 12.9" (3rd generation) resolution
21
+ return (width === 2048 && height === 2732) ||
22
+ (width === 2732 && height === 2048);
23
+ }
24
+ catch {
25
+ return false;
26
+ }
27
+ }
28
+ /**
29
+ * Generate appropriate filename for special devices
30
+ */
31
+ async function generateFilename(originalName, device, imagePath, options) {
32
+ let filename = originalName;
33
+ let specialHandling;
34
+ // Add device prefix if requested
35
+ if (options.prefixDevice) {
36
+ const prefixes = options.devicePrefixes || DEFAULT_DEVICE_PREFIXES;
37
+ const prefix = prefixes[device];
38
+ if (prefix && !filename.startsWith(prefix)) {
39
+ filename = `${prefix}${filename}`;
40
+ }
41
+ }
42
+ // Special handling for iPad Pro 3rd gen
43
+ if (device === 'ipad' && await isIpadPro3rdGen(imagePath)) {
44
+ // Check if already has the identifier
45
+ if (!filename.includes('IPAD_PRO') &&
46
+ !filename.includes('ipadPro129') &&
47
+ !filename.includes('iPad Pro (12.9-inch) (3rd generation)')) {
48
+ // Remove any existing ipad prefix before adding the special one
49
+ filename = filename.replace(/^(ipad_|iPad_)/i, '');
50
+ filename = `IPAD_PRO_3GEN_129_${filename}`;
51
+ specialHandling = 'iPad Pro 12.9" (3rd gen) naming applied';
52
+ }
53
+ }
54
+ return { name: filename, specialHandling };
55
+ }
56
+ /**
57
+ * Create a file operation (copy or symlink)
58
+ */
59
+ async function createFileOperation(source, destination, useCopy) {
60
+ // Ensure destination directory exists
61
+ await fs.mkdir(path.dirname(destination), { recursive: true });
62
+ if (useCopy) {
63
+ await fs.copyFile(source, destination);
64
+ }
65
+ else {
66
+ // Create relative symlink for portability
67
+ const relPath = path.relative(path.dirname(destination), source);
68
+ // Remove existing symlink if it exists
69
+ try {
70
+ await fs.unlink(destination);
71
+ }
72
+ catch {
73
+ // File doesn't exist, which is fine
74
+ }
75
+ await fs.symlink(relPath, destination);
76
+ }
77
+ }
78
+ /**
79
+ * Organize screenshots for Fastlane export
80
+ */
81
+ export async function organizeScreenshots(options) {
82
+ const result = {
83
+ processed: 0,
84
+ skipped: 0,
85
+ errors: 0,
86
+ byLanguage: {},
87
+ byDevice: {},
88
+ actions: options.dryRun ? [] : undefined
89
+ };
90
+ // Use specified devices or default to all
91
+ const allDevices = ['iphone', 'ipad', 'mac', 'watch'];
92
+ const devices = options.devices && options.devices.length > 0
93
+ ? options.devices.filter(d => allDevices.includes(d.toLowerCase()))
94
+ : allDevices;
95
+ // Initialize counters
96
+ for (const [, targetLang] of options.languageMap) {
97
+ result.byLanguage[targetLang] = 0;
98
+ }
99
+ for (const device of allDevices) {
100
+ result.byDevice[device] = 0;
101
+ }
102
+ // Clean output directory if requested
103
+ if (options.clean && !options.dryRun) {
104
+ try {
105
+ await fs.rm(options.output, { recursive: true, force: true });
106
+ }
107
+ catch {
108
+ // Directory might not exist
109
+ }
110
+ }
111
+ // Process each device and language combination
112
+ for (const device of devices) {
113
+ const deviceDir = path.join(options.source, device);
114
+ try {
115
+ await fs.access(deviceDir);
116
+ }
117
+ catch {
118
+ // Device directory doesn't exist, skip
119
+ continue;
120
+ }
121
+ for (const [sourceLang, targetLang] of options.languageMap) {
122
+ const langSourceDir = path.join(deviceDir, sourceLang);
123
+ try {
124
+ await fs.access(langSourceDir);
125
+ }
126
+ catch {
127
+ // Language directory doesn't exist for this device, skip
128
+ continue;
129
+ }
130
+ // Get all image files
131
+ const files = await fs.readdir(langSourceDir);
132
+ let screenshots = files.filter(f => f.match(/\.(png|jpg|jpeg)$/i) && !f.startsWith('.'));
133
+ // Apply ordering if requested
134
+ if (options.applyOrder && options.orderConfig) {
135
+ const { applyOrder } = await import('../services/screenshot-order.js');
136
+ screenshots = applyOrder(screenshots, device, options.orderConfig);
137
+ }
138
+ // Process screenshots with optional ordering
139
+ for (let i = 0; i < screenshots.length; i++) {
140
+ const screenshot = screenshots[i];
141
+ const sourcePath = path.join(langSourceDir, screenshot);
142
+ // When applying order, strip existing numeric prefixes so we don't double-prefix
143
+ const cleanName = options.applyOrder
144
+ ? screenshot.replace(/^\d+[-_.]/, '')
145
+ : screenshot;
146
+ // Generate output filename using the clean base name
147
+ const { name: baseOutputName, specialHandling } = await generateFilename(cleanName, device, sourcePath, options);
148
+ // Add numeric prefix if ordering is applied
149
+ let outputName = baseOutputName;
150
+ if (options.applyOrder) {
151
+ // Remove any existing numeric prefix to avoid double-prefixing
152
+ const baseWithoutPrefix = baseOutputName.replace(/^\d+[-_.]/, '');
153
+ outputName = `${String(i + 1).padStart(2, '0')}_${baseWithoutPrefix}`;
154
+ }
155
+ // Determine output path
156
+ const destDir = options.flatten
157
+ ? path.join(options.output, targetLang)
158
+ : path.join(options.output, targetLang, device);
159
+ const destPath = path.join(destDir, outputName);
160
+ if (options.dryRun) {
161
+ // Record action for dry run
162
+ result.actions.push({
163
+ source: sourcePath,
164
+ destination: destPath,
165
+ device,
166
+ language: targetLang,
167
+ renamed: outputName !== screenshot,
168
+ specialHandling
169
+ });
170
+ }
171
+ else {
172
+ // Perform actual file operation
173
+ try {
174
+ await createFileOperation(sourcePath, destPath, options.copy || false);
175
+ if (options.verbose) {
176
+ console.log(` ✓ ${device}/${sourceLang}/${screenshot} → ${targetLang}/${outputName}`);
177
+ if (specialHandling) {
178
+ console.log(` ${specialHandling}`);
179
+ }
180
+ }
181
+ result.processed++;
182
+ result.byLanguage[targetLang]++;
183
+ result.byDevice[device]++;
184
+ }
185
+ catch (error) {
186
+ result.errors++;
187
+ if (options.verbose) {
188
+ console.error(` ✗ Failed to process ${screenshot}: ${error}`);
189
+ }
190
+ }
191
+ }
192
+ }
193
+ }
194
+ }
195
+ return result;
196
+ }
197
+ /**
198
+ * Detect available languages from source directory
199
+ */
200
+ export async function detectAvailableLanguages(sourceDir) {
201
+ const languagesByDevice = new Map();
202
+ const devices = ['iphone', 'ipad', 'mac', 'watch'];
203
+ for (const device of devices) {
204
+ const devicePath = path.join(sourceDir, device);
205
+ try {
206
+ await fs.access(devicePath);
207
+ const entries = await fs.readdir(devicePath, { withFileTypes: true });
208
+ const langs = entries
209
+ .filter(entry => entry.isDirectory() && !entry.name.startsWith('.'))
210
+ .map(entry => entry.name);
211
+ if (langs.length > 0) {
212
+ languagesByDevice.set(device, new Set(langs));
213
+ }
214
+ }
215
+ catch {
216
+ // Device directory doesn't exist
217
+ }
218
+ }
219
+ return languagesByDevice;
220
+ }
221
+ /**
222
+ * Get unique languages across all devices
223
+ */
224
+ export async function getAllLanguages(sourceDir) {
225
+ const languagesByDevice = await detectAvailableLanguages(sourceDir);
226
+ const allLanguages = new Set();
227
+ for (const [, languages] of languagesByDevice) {
228
+ for (const lang of languages) {
229
+ allLanguages.add(lang);
230
+ }
231
+ }
232
+ return Array.from(allLanguages).sort();
233
+ }
234
+ //# sourceMappingURL=screenshot-organizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"screenshot-organizer.js","sourceRoot":"","sources":["../../src/services/screenshot-organizer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/templates/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACd,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;IAC5C,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,cAAc,CAAC;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,UAAU,EAAE,gBAAgB,CAAC;IAG7B,WAAW,EAAE;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;QACpD,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IAGF,YAAY,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAGrC,eAAe,CAAC,EAAE;QAChB,MAAM,CAAC,EAAE,sBAAsB,CAAC;QAChC,IAAI,CAAC,EAAE,sBAAsB,CAAC;QAC9B,GAAG,CAAC,EAAE,sBAAsB,CAAC;QAC7B,KAAK,CAAC,EAAE,sBAAsB,CAAC;KAChC,CAAC;IAGF,kBAAkB,CAAC,EAAE;QACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC;CACH;AAGD,eAAO,MAAM,SAAS,EAAE,kBAAkB,EA2mBzC,CAAC;AAEF;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAEtE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAE7E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,OAAO,CAAC,aAAa,CAAC,GACrC,OAAO,CAAC,aAAa,CAAC,CAkDxB;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,GAAG;IACjE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,EAAE,MAAM,EAAE,CAAC;CACf,CAmCA"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/templates/registry.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAChB,uBAAuB,EACvB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACd,MAAM,aAAa,CAAC;AAErB,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;IAC5C,aAAa,CAAC,EAAE,mBAAmB,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,SAAS,GAAG,cAAc,CAAC;IACjF,OAAO,CAAC,EAAE,MAAM,CAAC;IAGjB,UAAU,EAAE,gBAAgB,CAAC;IAG7B,WAAW,EAAE;QACX,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,MAAM,CAAC;QACpD,YAAY,CAAC,EAAE,OAAO,CAAC;QACvB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC;IAGF,YAAY,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAGrC,eAAe,CAAC,EAAE;QAChB,MAAM,CAAC,EAAE,sBAAsB,CAAC;QAChC,IAAI,CAAC,EAAE,sBAAsB,CAAC;QAC9B,GAAG,CAAC,EAAE,sBAAsB,CAAC;QAC7B,KAAK,CAAC,EAAE,sBAAsB,CAAC;KAChC,CAAC;IAGF,kBAAkB,CAAC,EAAE;QACnB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;QACpB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;KAChB,CAAC;CACH;AAGD,eAAO,MAAM,SAAS,EAAE,kBAAkB,EA4ezC,CAAC;AAEF;;GAEG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,kBAAkB,GAAG,SAAS,CAEtE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,kBAAkB,EAAE,CAE7E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAEhD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,OAAO,CAAC,aAAa,CAAC,GACrC,OAAO,CAAC,aAAa,CAAC,CAuExB;AAED;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,UAAU,EAAE,MAAM,GAAG;IACjE,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,GAAG,EAAE,MAAM,EAAE,CAAC;CACf,CAmCA"}