dominicegginton/hex-color-converter

View on GitHub
lib/index.js

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
'use strict'

const opacity = require('hex-color-opacity')

const convert = (color) => {
  if (typeof color !== 'string') throw new Error('Invalid rgb(a) color value')
  if (/^#([A-Fa-f0-9]{3}$|[A-Fa-f0-9]{6}$|[A-Fa-f0-9]{8}$)$/.test(color)) return color
  const rgb = /rgb\((\d{1,3}), ?(\d{1,3}), ?(\d{1,3})\)/.exec(color)
  const rgba = /rgba\((\d{1,3}), ?(\d{1,3}), ?(\d{1,3}), ?(1|(0(?:\.\d{1,2})?))\)/.exec(color)
  if (rgb !== null) {
    let hexadecimal = '#'
    if (rgb[1].length > 1) hexadecimal += Number(rgb[1]).toString(16)
    else hexadecimal += '0' + Number(rgb[1]).toString(16)
    if (rgb[2].length > 1) hexadecimal += Number(rgb[2]).toString(16)
    else hexadecimal += '0' + Number(rgb[2]).toString(16)
    if (rgb[3].length > 1) hexadecimal += Number(rgb[3]).toString(16)
    else hexadecimal += '0' + Number(rgb[3]).toString(16)
    return hexadecimal.toUpperCase()
  } else if (rgba !== null) {
    let hexadecimal = '#'
    if (rgba[1].length > 1) hexadecimal += Number(rgba[1]).toString(16)
    else hexadecimal += '0' + Number(rgba[1]).toString(16)
    if (rgba[2].length > 1) hexadecimal += Number(rgba[2]).toString(16)
    else hexadecimal += '0' + Number(rgba[2]).toString(16)
    if (rgba[3].length > 1) hexadecimal += Number(rgba[3]).toString(16)
    else hexadecimal += '0' + Number(rgba[3]).toString(16)
    hexadecimal = opacity(hexadecimal, Number(rgba[4]))
    return hexadecimal.toUpperCase()
  } else throw new Error('Invalid rgb(a) color value')
}

module.exports = convert