import { Matcher, PrimitiveValue, Value } from '../../shared/to-javascript/tokenToAstToken.js'; import { renderBorder } from './tokenTypes/border.js'; import { renderBreakpoint } from './tokenTypes/breakpoint.js'; import { renderColor } from './tokenTypes/color.js'; import { renderDimension } from './tokenTypes/dimension.js'; import { renderDuration } from './tokenTypes/duration.js'; import { renderFont } from './tokenTypes/font.js'; import { renderGradient } from './tokenTypes/gradient.js'; import { renderGradients } from './tokenTypes/gradients.js'; import { renderOpacity } from './tokenTypes/opacity.js'; import { renderRadii } from './tokenTypes/radii.js'; import { renderRadius } from './tokenTypes/radius.js'; import { renderShadow } from './tokenTypes/shadow.js'; import { renderShadows } from './tokenTypes/shadows.js'; import { renderSpacing } from './tokenTypes/spacing.js'; import { renderSpacings } from './tokenTypes/spacings.js'; import { renderTextStyle } from './tokenTypes/textStyle.js'; import { renderTransition } from './tokenTypes/transition.js'; import { renderZIndex } from './tokenTypes/zIndex.js'; function wrapValue( converter: (value: JsonValue) => PrimitiveValue | Record, ): (value: JsonValue) => Value { return (json: JsonValue) => { let value = converter(json); if (!Array.isArray(value) && typeof value === 'object') { value = Object.entries(value).reduce((acc, [key, value]) => { if (typeof value !== 'object') { acc[key] = { value }; } else { acc[key] = value; } return acc; }, {} as { [key: string]: { value: string | number } }); } return { value }; }; } export const matcher: Matcher = { dimension: wrapValue(renderDimension), breakpoint: wrapValue(renderBreakpoint), color: wrapValue(renderColor), duration: wrapValue(renderDuration), zIndex: wrapValue(renderZIndex), border: wrapValue(renderBorder), font: wrapValue(renderFont), gradient: v => { const value = renderGradient(v); if (!value) return undefined; return { value }; }, gradients: wrapValue(renderGradients), opacity: wrapValue(renderOpacity), radius: wrapValue(renderRadius), radii: wrapValue(renderRadii), shadow: wrapValue(renderShadow), shadows: wrapValue(renderShadows), spacing: wrapValue(renderSpacing), spacings: wrapValue(renderSpacings), textStyle: wrapValue(renderTextStyle), transition: wrapValue(renderTransition), };