import { upperFirst } from 'lodash-es'; import { ConvertedOutput } from './convertTokens.js'; import { SpecifyDesignTokenTypeName } from '@specifyapp/specify-design-token-format'; function renderMap(input: { [name: string]: string }) { return Object.entries(input).reduce((acc, [name, value]) => { return acc + ` static let ${name} = ${value}\n`; }, ''); } // When class name already exists, we prefix it function sanitizeType(name: SpecifyDesignTokenTypeName) { switch (name) { case 'radius': return 'BorderRadius'; case 'color': case 'font': case 'gradient': case 'duration': return `${name}_`; default: return name; } } // We scope all tokens in a class to avoid name conflicts as everything can be renamed export function convertedToSwift(input: ConvertedOutput, scopeName: string): string { return `import SwiftUI class ${scopeName} { ${Object.entries(input).reduce((acc, [type, map]) => { return ( acc + ` class ${upperFirst(sanitizeType(type as SpecifyDesignTokenTypeName))} {\n` + renderMap(map) + ' }\n\n' ); }, '')} }`; }