(
value: unknown
)
| 36 | } |
| 37 | |
| 38 | export function parseExtensionsData( |
| 39 | value: unknown |
| 40 | ): Record<string, Record<string, ExtensionConfig>> { |
| 41 | if (!isRecord(value)) throw new Error('Invalid extensions data: expected object'); |
| 42 | |
| 43 | const result: Record<string, Record<string, ExtensionConfig>> = {}; |
| 44 | const seenPaths = new Set<string>(); |
| 45 | |
| 46 | for (const [category, entries] of Object.entries(value)) { |
| 47 | if (!isRecord(entries)) { |
| 48 | throw new Error(`Invalid extensions data.${category}: expected object`); |
| 49 | } |
| 50 | |
| 51 | result[category] = {}; |
| 52 | |
| 53 | for (const [key, entry] of Object.entries(entries)) { |
| 54 | const parsed = parseExtensionConfig( |
| 55 | entry, |
| 56 | `extensions data.${category}.${key}`, |
| 57 | category |
| 58 | ); |
| 59 | if (seenPaths.has(parsed.path)) { |
| 60 | throw new Error(`Duplicate extension path: ${parsed.path}`); |
| 61 | } |
| 62 | seenPaths.add(parsed.path); |
| 63 | result[category][key] = parsed; |
| 64 | } |
| 65 | } |
| 66 | |
| 67 | return result; |
| 68 | } |
no test coverage detected