( filePath: string, requiredVariants: TVariant[], )
| 10 | * @returns Object with valid flag and error message if invalid |
| 11 | */ |
| 12 | export function validateFilePath( |
| 13 | filePath: string, |
| 14 | requiredVariants: TVariant[], |
| 15 | ): { |
| 16 | valid: boolean |
| 17 | error?: string |
| 18 | missingVariants?: TVariant[] |
| 19 | } { |
| 20 | // Validate format |
| 21 | if (!filePath.includes(':') || filePath.split(':').length !== 2) { |
| 22 | return { |
| 23 | valid: false, |
| 24 | error: `Invalid filePath format: "${filePath}". Expected format: "type:name" (e.g., "network:ethereum")`, |
| 25 | } |
| 26 | } |
| 27 | |
| 28 | const [svgSourceType, svgFileName] = filePath.split(':') as [TType, string] |
| 29 | |
| 30 | // Validate type |
| 31 | const validTypes: TType[] = ['token', 'network', 'wallet', 'exchange'] |
| 32 | if (!validTypes.includes(svgSourceType)) { |
| 33 | return { |
| 34 | valid: false, |
| 35 | error: `Invalid type in filePath "${filePath}". Type must be one of: ${validTypes.join(', ')}`, |
| 36 | } |
| 37 | } |
| 38 | |
| 39 | // Check if all required variants exist |
| 40 | const svgBaseDir = path.join(SVG_SRC_DIR, `${svgSourceType}s`) |
| 41 | const missingVariants: TVariant[] = [] |
| 42 | |
| 43 | for (const variant of requiredVariants) { |
| 44 | const svgPath = path.join(svgBaseDir, variant, `${svgFileName}.svg`) |
| 45 | if (!fs.existsSync(svgPath)) { |
| 46 | missingVariants.push(variant) |
| 47 | } |
| 48 | } |
| 49 | |
| 50 | if (missingVariants.length > 0) { |
| 51 | return { |
| 52 | valid: false, |
| 53 | error: `Missing ${missingVariants.join(', ')} variant(s) for filePath "${filePath}". Expected files: ${missingVariants.map((v) => `${svgBaseDir}/${v}/${svgFileName}.svg`).join(', ')}`, |
| 54 | missingVariants, |
| 55 | } |
| 56 | } |
| 57 | |
| 58 | return { valid: true } |
| 59 | } |
| 60 | |
| 61 | /** |
| 62 | * Validates all filePath entries in metadata |
no outgoing calls
no test coverage detected