@gameroom/kit
Version:
Node kit for the Gameroom API
41 lines (40 loc) • 1.4 kB
JavaScript
module.exports = class Color extends String {
constructor(data) {
if (!data) {
super(data)
return Color.random()
}
if (data instanceof Color) {
} else if (data instanceof Object && data.r >= 0 && data.r <= 255 && data.g >= 0 && data.g <= 255 && data.b >= 0 && data.b <= 255) {
data = `#${data.r.toString(16).padStart(2, 0)}${data.g.toString(16).padStart(2, 0)}${data.b.toString(16).padStart(2, 0)}`
} else if (typeof data !== 'string') {
throw new Error(`invalid Color data: ${data}`)
} else if (!data.startsWith('#') || (data.length !== 7 && data.length !== 4)) {
throw new Error(`invalid Color data: ${data}`)
}
super(data)
}
static random() {
return new Color(`#${((Math.random() * (1 << 24)) | 0).toString(16).padStart(6, 0)}`)
}
toRGB() {
const str = typeof this === 'object' ? this.toString() : this
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(str)
return result
? {
r: parseInt(result[1], 16),
g: parseInt(result[2], 16),
b: parseInt(result[3], 16)
}
: null
}
toRGBString() {
const object = this.toRGB()
return `rgb(${object.r}, ${object.g}, ${object.b})`
}
toString() {
return Object.keys(this)
.sort((a, b) => (parseInt(a, 10) < parseInt(b, 10) ? -1 : 1))
.reduce((a, i) => (a += this[i]), '')
}
}