UNPKG

@gameroom/kit

Version:

Node kit for the Gameroom API

41 lines (40 loc) 1.4 kB
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]), '') } }