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.
- package/README.md +320 -1
- package/dist/cli.js +6 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/export.d.ts +3 -0
- package/dist/commands/export.d.ts.map +1 -0
- package/dist/commands/export.js +382 -0
- package/dist/commands/export.js.map +1 -0
- package/dist/commands/order.d.ts +3 -0
- package/dist/commands/order.d.ts.map +1 -0
- package/dist/commands/order.js +321 -0
- package/dist/commands/order.js.map +1 -0
- package/dist/core/compose.d.ts.map +1 -1
- package/dist/core/compose.js +71 -138
- package/dist/core/compose.js.map +1 -1
- package/dist/core/layout-utils.d.ts +12 -0
- package/dist/core/layout-utils.d.ts.map +1 -0
- package/dist/core/layout-utils.js +28 -0
- package/dist/core/layout-utils.js.map +1 -0
- package/dist/core/text-utils.d.ts +1 -1
- package/dist/core/text-utils.d.ts.map +1 -1
- package/dist/core/text-utils.js +5 -9
- package/dist/core/text-utils.js.map +1 -1
- package/dist/services/doctor.js +1 -1
- package/dist/services/export-validator.d.ts +23 -0
- package/dist/services/export-validator.d.ts.map +1 -0
- package/dist/services/export-validator.js +209 -0
- package/dist/services/export-validator.js.map +1 -0
- package/dist/services/fastlane-config-generator.d.ts +17 -0
- package/dist/services/fastlane-config-generator.d.ts.map +1 -0
- package/dist/services/fastlane-config-generator.js +343 -0
- package/dist/services/fastlane-config-generator.js.map +1 -0
- package/dist/services/fastlane-language-mapper.d.ts +33 -0
- package/dist/services/fastlane-language-mapper.d.ts.map +1 -0
- package/dist/services/fastlane-language-mapper.js +167 -0
- package/dist/services/fastlane-language-mapper.js.map +1 -0
- package/dist/services/screenshot-order.d.ts +41 -0
- package/dist/services/screenshot-order.d.ts.map +1 -0
- package/dist/services/screenshot-order.js +211 -0
- package/dist/services/screenshot-order.js.map +1 -0
- package/dist/services/screenshot-organizer.d.ts +44 -0
- package/dist/services/screenshot-organizer.d.ts.map +1 -0
- package/dist/services/screenshot-organizer.js +234 -0
- package/dist/services/screenshot-organizer.js.map +1 -0
- package/dist/templates/registry.d.ts.map +1 -1
- package/dist/templates/registry.js +49 -159
- package/dist/templates/registry.js.map +1 -1
- 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,
|
|
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"}
|