import { capitalize } 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 const ${name} = ${value};\n`; }, ''); } // When class name already exists, we prefix it function sanitizeType(name: SpecifyDesignTokenTypeName) { switch (name) { case 'border': case 'color': case 'breakpoint': case 'dimension': case 'font': case 'fontWeight': case 'gradient': case 'opacity': case 'shadow': case 'textStyle': case 'duration': case 'radius': return `${name}_`; default: return name; } } // We scope all tokens in a class to avoid name conflicts as everything can be renamed export function convertedToDart(input: ConvertedOutput): string { return `// ignore_for_file: camel_case_types import 'dart:core'; import 'package:flutter/painting.dart'; import 'package:flutter/animation.dart'; ${Object.entries(input).reduce((acc, [type, map]) => { return ( acc + `class ${capitalize(sanitizeType(type as SpecifyDesignTokenTypeName))} {\n` + renderMap(map) + '}\n\n' ); }, '')}`; }