uui-build/ts/tasks/themeTokensGen/mixinsGenerator/tokenFormatters.ts (98 lines of code) (raw):

import { figmaVarComparator } from '../utils/sortingUtils'; import { GROUPS_CONFIG, TMainGroupConfig, TVar, TVarGroup } from './constants'; import { IThemeVar } from '../types/sharedTypes'; import { getThemeTokenTemplate } from '../templates/templates'; export function formatVarsAsMixin(params: { scssVars: TVar[], cssVars: TVar[] }): string { const { cssVars, scssVars } = params; // SCSS const scssVarsSorted = sortVariablesArr(scssVars); const scssVarsFormatted = formatBlockOfVariables({ arr: scssVarsSorted, indent: 0, title: 'Private Figma vars' }) || undefined; // CSS const cssVarsSortedAll = sortVariablesArr(cssVars); const cssVarsPublishedGrouped = groupVars(cssVarsSortedAll); const cssVarsPublishedGroupedFormatted = formatGroupedVars(cssVarsPublishedGrouped, 1); return getThemeTokenTemplate({ scssVars: scssVarsFormatted || '', cssVars: cssVarsPublishedGroupedFormatted, }); } function getVarGroupId(token: IThemeVar) { return Object.keys(GROUPS_CONFIG).find((key) => { const { condition } = GROUPS_CONFIG[key]; return condition(token); }) as string; } function groupVars(vars: TVar[]): Record<string, TVarGroup> { return Object.keys(GROUPS_CONFIG).reduce<Record<string, TVarGroup>>((acc, groupId) => { vars.forEach((item) => { const varGroupId = getVarGroupId(item.token); if (groupId === varGroupId) { if (!acc[groupId]) { acc[groupId] = { title: GROUPS_CONFIG[groupId].title, items: [] }; } acc[groupId].items.push(item); } }); return acc; }, {}); } function formatGroupedVars(grouped: Record<string, TVarGroup>, indent: number): string { const createInnerGroups = (arr: TVar[], mainGroupCfg: TMainGroupConfig) => { const innerGroups: Record<string, { title: string | undefined, items: TVar[] }> = {}; arr.forEach((v) => { const groupId = mainGroupCfg.getInnerGroupId(v); if (!innerGroups[groupId]) { innerGroups[groupId] = { title: mainGroupCfg.showInnerGroupTitle ? groupId : undefined, items: [] }; } innerGroups[groupId].items.push(v); }); return innerGroups; }; return Object.keys(grouped).reduce((acc, groupId, currentIndex) => { const block = grouped[groupId]; const innerGroups = createInnerGroups(block.items, GROUPS_CONFIG[groupId]); const innerGroupsFormatted = Object.values(innerGroups).map((ig) => { return formatBlockOfVariables({ arr: ig.items, indent, title: ig.title }); }).join('\n\n'); return acc + (currentIndex === 0 ? '' : '\n\n') + wrapBlockInComments({ str: innerGroupsFormatted, groupName: block.title, indent, compact: false }); }, ''); } function formatBlockOfVariables(params: { arr: TVar[], indent: number, title: string | undefined }): string { const { arr, title, indent } = params; const _alreadyAdded = new Set<string>(); const group = arr.reduce<string[]>((acc, { name, value }) => { const toAdd = `${getIndent(indent)}${name}: ${value};`; if (!_alreadyAdded.has(toAdd)) { _alreadyAdded.add(toAdd); acc.push(toAdd); } return acc; }, []).join('\n'); return wrapBlockInComments({ str: group, groupName: title, indent, compact: true }); } function getIndent(indent: number): string { return new Array(4 * indent).fill(' ').join(''); } function sortVariablesArr(arr: TVar[]) { return [...arr].sort((e1, e2) => figmaVarComparator(e1.token.cssVar as string, e2.token.cssVar as string)); } function wrapBlockInComments(params: { str: string, groupName: string | undefined, indent: number, compact: boolean }) { const { str, groupName, indent, compact } = params; if (str.trim() === '') { return ''; } if (groupName === undefined) { return str; } const I = getIndent(indent); let start; if (compact) { start = `${I}// "${groupName}"`; } else { const line = `/*** ${groupName} ***/`; const padding = `/${Array(line.length - 2).fill('*').join('')}/`; start = [padding, line, padding].map((l) => `${I}${l}`).join('\n') + '\n'; } return [ start, str, ].join('\n'); }