crystal-ball/componentry

View on GitHub
src/config/load-config.ts

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
import { lilconfigSync } from 'lilconfig'

import { alertStyles } from '../components/Alert/Alert.styles'
import { badgeStyles } from '../components/Badge/Badge.styles'
import { buttonStyles } from '../components/Button/Button.styles'
import { cardStyles } from '../components/Card/Card.styles'
import { closeStyles } from '../components/Close/Close.styles'
import { formGroupStyles } from '../components/FormGroup/FormGroup.styles'
import { iconStyles } from '../components/Icon/Icon.styles'
import { iconButtonStyles } from '../components/IconButton/IconButton.styles'
import { inputStyles } from '../components/Input/Input.styles'
import { linkStyles } from '../components/Link/Link.styles'
import { modalStyles } from '../components/Modal/Modal.styles'
import { paperStyles } from '../components/Paper/Paper.styles'
import { popoverStyles } from '../components/Popover/Popover.styles'
import { tableStyles } from '../components/Table/Table.styles'
import { textStyles } from '../components/Text/Text.styles'
import { tooltipStyles } from '../components/Tooltip/Tooltip.styles'
import { foundationStyles } from '../styles/foundation.styles'
import { statesStyles } from '../styles/states.styles'
import { Theme, createTheme } from '../theme/theme'
import { deepMerge } from '../utils/deep-merge'

import { type ComponentProps, type ComponentStyles } from './config'

export const loadConfig = (): {
  theme: Theme
  styles: ComponentStyles
  defaultProps: ComponentProps
} => {
  const userConfig = lilconfigSync('componentry').search()?.config ?? {}
  const theme = createTheme(userConfig.theme)

  return {
    theme,
    styles: deepMerge(
      {
        // FOUNDATION
        foundation: foundationStyles(theme),
        // COMPONENTS
        Alert: alertStyles(theme),
        Badge: badgeStyles(theme),
        Button: buttonStyles(theme),
        Card: cardStyles(theme),
        Close: closeStyles(),
        Icon: iconStyles(),
        FormGroup: formGroupStyles(theme),
        IconButton: iconButtonStyles(theme),
        Input: inputStyles(theme),
        Link: linkStyles(theme),
        Modal: modalStyles(theme),
        Paper: paperStyles(theme),
        Popover: popoverStyles(theme),
        Table: tableStyles(theme),
        Text: textStyles(theme),
        Tooltip: tooltipStyles(theme),
        // UTILITIES
        states: statesStyles(),
      },
      userConfig.styles ?? {},
    ),
    defaultProps: userConfig.defaultProps ?? {},
  }
}