You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					291 lines
				
				6.3 KiB
			
		
		
			
		
	
	
					291 lines
				
				6.3 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								import { system } from '../src'
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('returns a style parser', () => {
							 | 
						||
| 
								 | 
							
								  const parser = system({
							 | 
						||
| 
								 | 
							
								    color: true,
							 | 
						||
| 
								 | 
							
								    backgroundColor: {
							 | 
						||
| 
								 | 
							
								      property: 'backgroundColor',
							 | 
						||
| 
								 | 
							
								      scale: 'colors',
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    mx: {
							 | 
						||
| 
								 | 
							
								      scale: 'space',
							 | 
						||
| 
								 | 
							
								      properties: ['marginLeft', 'marginRight'],
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  expect(typeof parser).toBe('function')
							 | 
						||
| 
								 | 
							
								  const styles = parser({
							 | 
						||
| 
								 | 
							
								    theme: {
							 | 
						||
| 
								 | 
							
								      space: [0, 4, 8, 16, 32],
							 | 
						||
| 
								 | 
							
								      colors: {
							 | 
						||
| 
								 | 
							
								        primary: 'rebeccapurple',
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    color: 'tomato',
							 | 
						||
| 
								 | 
							
								    backgroundColor: 'primary',
							 | 
						||
| 
								 | 
							
								    mx: [2, 3, 4],
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  expect(styles).toEqual({
							 | 
						||
| 
								 | 
							
								    color: 'tomato',
							 | 
						||
| 
								 | 
							
								    backgroundColor: 'rebeccapurple',
							 | 
						||
| 
								 | 
							
								    marginLeft: 8,
							 | 
						||
| 
								 | 
							
								    marginRight: 8,
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 40em)': {
							 | 
						||
| 
								 | 
							
								      marginLeft: 16,
							 | 
						||
| 
								 | 
							
								      marginRight: 16,
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 52em)': {
							 | 
						||
| 
								 | 
							
								      marginLeft: 32,
							 | 
						||
| 
								 | 
							
								      marginRight: 32,
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('merges multiple responsive styles', () => {
							 | 
						||
| 
								 | 
							
								  const parser = system({
							 | 
						||
| 
								 | 
							
								    margin: true,
							 | 
						||
| 
								 | 
							
								    padding: true,
							 | 
						||
| 
								 | 
							
								    width: true,
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  const styles = parser({
							 | 
						||
| 
								 | 
							
								    margin: [0, 4, 8],
							 | 
						||
| 
								 | 
							
								    padding: [16, 32, 64],
							 | 
						||
| 
								 | 
							
								    width: ['100%', '50%'],
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  expect(styles).toEqual({
							 | 
						||
| 
								 | 
							
								    margin: 0,
							 | 
						||
| 
								 | 
							
								    padding: 16,
							 | 
						||
| 
								 | 
							
								    width: '100%',
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 40em)': {
							 | 
						||
| 
								 | 
							
								      margin: 4,
							 | 
						||
| 
								 | 
							
								      padding: 32,
							 | 
						||
| 
								 | 
							
								      width: '50%',
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 52em)': {
							 | 
						||
| 
								 | 
							
								      margin: 8,
							 | 
						||
| 
								 | 
							
								      padding: 64,
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('merges multiple responsive object styles', () => {
							 | 
						||
| 
								 | 
							
								  const parser = system({
							 | 
						||
| 
								 | 
							
								    margin: true,
							 | 
						||
| 
								 | 
							
								    padding: true,
							 | 
						||
| 
								 | 
							
								    width: true,
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  const styles = parser({
							 | 
						||
| 
								 | 
							
								    margin: { _: 0, 0: 4, 1: 8 },
							 | 
						||
| 
								 | 
							
								    padding: { _: 16, 0: 32, 1: 64 },
							 | 
						||
| 
								 | 
							
								    width: { _: '100%', 0: '50%' },
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  expect(styles).toEqual({
							 | 
						||
| 
								 | 
							
								    margin: 0,
							 | 
						||
| 
								 | 
							
								    padding: 16,
							 | 
						||
| 
								 | 
							
								    width: '100%',
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 40em)': {
							 | 
						||
| 
								 | 
							
								      margin: 4,
							 | 
						||
| 
								 | 
							
								      padding: 32,
							 | 
						||
| 
								 | 
							
								      width: '50%',
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 52em)': {
							 | 
						||
| 
								 | 
							
								      margin: 8,
							 | 
						||
| 
								 | 
							
								      padding: 64,
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('gets values from theme', () => {
							 | 
						||
| 
								 | 
							
								  const parser = system({
							 | 
						||
| 
								 | 
							
								    mx: {
							 | 
						||
| 
								 | 
							
								      properties: ['marginLeft', 'marginRight'],
							 | 
						||
| 
								 | 
							
								      scale: 'space',
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    color: {
							 | 
						||
| 
								 | 
							
								      property: 'color',
							 | 
						||
| 
								 | 
							
								      scale: 'colors',
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  const style = parser({
							 | 
						||
| 
								 | 
							
								    theme: {
							 | 
						||
| 
								 | 
							
								      colors: {
							 | 
						||
| 
								 | 
							
								        primary: 'tomato',
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      space: [0, 6, 12, 24, 48, 96],
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    mx: [0, 1, 2, 3],
							 | 
						||
| 
								 | 
							
								    color: ['primary', 'black'],
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  expect(style).toEqual({
							 | 
						||
| 
								 | 
							
								    color: 'tomato',
							 | 
						||
| 
								 | 
							
								    marginLeft: 0,
							 | 
						||
| 
								 | 
							
								    marginRight: 0,
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 40em)': {
							 | 
						||
| 
								 | 
							
								      color: 'black',
							 | 
						||
| 
								 | 
							
								      marginLeft: 6,
							 | 
						||
| 
								 | 
							
								      marginRight: 6,
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 52em)': {
							 | 
						||
| 
								 | 
							
								      marginLeft: 12,
							 | 
						||
| 
								 | 
							
								      marginRight: 12,
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 64em)': {
							 | 
						||
| 
								 | 
							
								      marginLeft: 24,
							 | 
						||
| 
								 | 
							
								      marginRight: 24,
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('gets 0 index values from theme', () => {
							 | 
						||
| 
								 | 
							
								  const parser = system({
							 | 
						||
| 
								 | 
							
								    width: {
							 | 
						||
| 
								 | 
							
								      property: 'width',
							 | 
						||
| 
								 | 
							
								      scale: 'sizes',
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  const style = parser({
							 | 
						||
| 
								 | 
							
								    theme: {
							 | 
						||
| 
								 | 
							
								      sizes: [ 24, 48 ],
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    width: 0,
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  expect(style).toEqual({ width: 24 })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('ignores null values', () => {
							 | 
						||
| 
								 | 
							
								  const parser = system({
							 | 
						||
| 
								 | 
							
								    color: true,
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  const style = parser({ color: null })
							 | 
						||
| 
								 | 
							
								  expect(style).toEqual({})
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('returns a noop function with no arguments', () => {
							 | 
						||
| 
								 | 
							
								  const parser = system()
							 | 
						||
| 
								 | 
							
								  expect(typeof parser).toBe('function')
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('skips null values in arrays', () => {
							 | 
						||
| 
								 | 
							
								  const parser = system({
							 | 
						||
| 
								 | 
							
								    fontSize: true,
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  const style = parser({
							 | 
						||
| 
								 | 
							
								    fontSize: [ 16, null, null, 18 ],
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  expect(style).toEqual({
							 | 
						||
| 
								 | 
							
								    fontSize: 16,
							 | 
						||
| 
								 | 
							
								    // omitting these keys cause issues when using multiple
							 | 
						||
| 
								 | 
							
								    // responsive props together #561 #551 #549
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 40em)': {},
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 52em)': {},
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 64em)': {
							 | 
						||
| 
								 | 
							
								      fontSize: 18,
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('includes single property functions', () => {
							 | 
						||
| 
								 | 
							
								  const parser = system({
							 | 
						||
| 
								 | 
							
								    color: true,
							 | 
						||
| 
								 | 
							
								    backgroundColor: true,
							 | 
						||
| 
								 | 
							
								    width: true,
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  const a = parser.color({ color: 'tomato', backgroundColor: 'nope'  })
							 | 
						||
| 
								 | 
							
								  const b = parser.width({ width: '100%', color: 'tomato', backgroundColor: 'nope'  })
							 | 
						||
| 
								 | 
							
								  expect(a).toEqual({ color: 'tomato' })
							 | 
						||
| 
								 | 
							
								  expect(b).toEqual({ width: '100%' })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('parser configs can be composed manually', () => {
							 | 
						||
| 
								 | 
							
								  const color = system({ color: true, backgroundColor: true })
							 | 
						||
| 
								 | 
							
								  const layout = system({ width: true, height: true })
							 | 
						||
| 
								 | 
							
								  const composed = system({ ...color.config, ...layout.config })
							 | 
						||
| 
								 | 
							
								  const style = composed({
							 | 
						||
| 
								 | 
							
								    color: 'tomato',
							 | 
						||
| 
								 | 
							
								    backgroundColor: 'black',
							 | 
						||
| 
								 | 
							
								    width: '100%',
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  expect(style).toEqual({
							 | 
						||
| 
								 | 
							
								    color: 'tomato',
							 | 
						||
| 
								 | 
							
								    backgroundColor: 'black',
							 | 
						||
| 
								 | 
							
								    width: '100%',
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('supports non-array breakpoints object', () => {
							 | 
						||
| 
								 | 
							
								  const parser = system({
							 | 
						||
| 
								 | 
							
								    margin: true,
							 | 
						||
| 
								 | 
							
								    padding: true,
							 | 
						||
| 
								 | 
							
								    width: true,
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  const styles = parser({
							 | 
						||
| 
								 | 
							
								    theme: {
							 | 
						||
| 
								 | 
							
								      disableStyledSystemCache: true,
							 | 
						||
| 
								 | 
							
								      breakpoints: {
							 | 
						||
| 
								 | 
							
								        sm: '32em',
							 | 
						||
| 
								 | 
							
								        md: '40em',
							 | 
						||
| 
								 | 
							
								        lg: '64em',
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    margin: { _: 0, sm: 4, md: 8 },
							 | 
						||
| 
								 | 
							
								    padding: { _: 16, lg: 64 },
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  expect(styles).toEqual({
							 | 
						||
| 
								 | 
							
								    margin: 0,
							 | 
						||
| 
								 | 
							
								    padding: 16,
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 32em)': {
							 | 
						||
| 
								 | 
							
								      margin: 4,
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 40em)': {
							 | 
						||
| 
								 | 
							
								      margin: 8,
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 64em)': {
							 | 
						||
| 
								 | 
							
								      padding: 64,
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('sorts media queries when responsive object values are used', () => {
							 | 
						||
| 
								 | 
							
								  const parser = system({
							 | 
						||
| 
								 | 
							
								    margin: true,
							 | 
						||
| 
								 | 
							
								    padding: true,
							 | 
						||
| 
								 | 
							
								    color: true,
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  const styles = parser({
							 | 
						||
| 
								 | 
							
								    theme: {
							 | 
						||
| 
								 | 
							
								      disableStyledSystemCache: true,
							 | 
						||
| 
								 | 
							
								      breakpoints: {
							 | 
						||
| 
								 | 
							
								        sm: '32em',
							 | 
						||
| 
								 | 
							
								        md: '40em',
							 | 
						||
| 
								 | 
							
								        lg: '64em',
							 | 
						||
| 
								 | 
							
								        xl: '128em',
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    padding: { _: 16, lg: 64, xl: 128 },
							 | 
						||
| 
								 | 
							
								    margin: { sm: 4, md: 8 },
							 | 
						||
| 
								 | 
							
								    color: { lg: 'tomato' },
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  expect(Object.keys(styles)).toEqual([
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 32em)',
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 40em)',
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 64em)',
							 | 
						||
| 
								 | 
							
								    '@media screen and (min-width: 128em)',
							 | 
						||
| 
								 | 
							
								    'padding',
							 | 
						||
| 
								 | 
							
								  ])
							 | 
						||
| 
								 | 
							
								})
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								test('transforms values', () => {
							 | 
						||
| 
								 | 
							
								  const parser = system({
							 | 
						||
| 
								 | 
							
								    margin: {
							 | 
						||
| 
								 | 
							
								      property: 'margin',
							 | 
						||
| 
								 | 
							
								      transform: (n, scale, props) => {
							 | 
						||
| 
								 | 
							
								        const m = props.multiply || 1
							 | 
						||
| 
								 | 
							
								        return m * n
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  })
							 | 
						||
| 
								 | 
							
								  const a = parser({ margin: 8 })
							 | 
						||
| 
								 | 
							
								  const b = parser({ margin: 12, multiply: 2 })
							 | 
						||
| 
								 | 
							
								  expect(a).toEqual({ margin: 8 })
							 | 
						||
| 
								 | 
							
								  expect(b).toEqual({ margin: 24 })
							 | 
						||
| 
								 | 
							
								})
							 |