From bee6054f8da67e26dcfdf572103eebabbd6443c0 Mon Sep 17 00:00:00 2001 From: Harsohail Brar <47438886+harsohailB@users.noreply.github.com> Date: Sun, 22 May 2022 13:14:09 -0600 Subject: [PATCH] feat: color module (#801) Co-authored-by: Shinigami --- docs/.vitepress/api-pages.ts | 1 + scripts/generateLocales.ts | 1 + src/definitions/color.ts | 15 + src/definitions/commerce.ts | 4 - src/definitions/definitions.ts | 2 + src/definitions/index.ts | 1 + src/faker.ts | 2 + src/index.ts | 9 + .../ar/{commerce/color.ts => color/human.ts} | 0 src/locales/ar/color/index.ts | 12 + src/locales/ar/commerce/index.ts | 2 - src/locales/ar/index.ts | 2 + .../az/{commerce/color.ts => color/human.ts} | 0 src/locales/az/color/index.ts | 12 + src/locales/az/commerce/index.ts | 2 - src/locales/az/index.ts | 2 + .../el/{commerce/color.ts => color/human.ts} | 0 src/locales/el/color/index.ts | 12 + src/locales/el/commerce/index.ts | 2 - src/locales/el/index.ts | 2 + .../en/{commerce/color.ts => color/human.ts} | 0 src/locales/en/color/index.ts | 14 + src/locales/en/color/space.ts | 43 ++ src/locales/en/commerce/index.ts | 2 - src/locales/en/index.ts | 2 + .../es/{commerce/color.ts => color/human.ts} | 0 src/locales/es/color/index.ts | 12 + src/locales/es/commerce/index.ts | 2 - src/locales/es/index.ts | 2 + .../{commerce/color.ts => color/human.ts} | 0 src/locales/es_MX/color/index.ts | 12 + src/locales/es_MX/commerce/index.ts | 2 - src/locales/es_MX/index.ts | 2 + .../fa/{commerce/color.ts => color/human.ts} | 0 src/locales/fa/color/index.ts | 12 + src/locales/fa/commerce/index.ts | 2 - src/locales/fa/index.ts | 2 + .../he/{commerce/color.ts => color/human.ts} | 0 src/locales/he/color/index.ts | 12 + src/locales/he/commerce/index.ts | 2 - src/locales/he/index.ts | 2 + .../hy/{commerce/color.ts => color/human.ts} | 0 src/locales/hy/color/index.ts | 12 + src/locales/hy/commerce/index.ts | 12 - src/locales/hy/index.ts | 4 +- .../lv/{commerce/color.ts => color/human.ts} | 0 src/locales/lv/color/index.ts | 12 + src/locales/lv/commerce/index.ts | 2 - src/locales/lv/index.ts | 2 + .../nl/{commerce/color.ts => color/human.ts} | 0 src/locales/nl/color/index.ts | 12 + src/locales/nl/commerce/index.ts | 2 - src/locales/nl/index.ts | 2 + .../{commerce/color.ts => color/human.ts} | 0 src/locales/pt_BR/color/index.ts | 12 + src/locales/pt_BR/commerce/index.ts | 2 - src/locales/pt_BR/index.ts | 2 + .../{commerce/color.ts => color/human.ts} | 0 src/locales/pt_PT/color/index.ts | 12 + src/locales/pt_PT/commerce/index.ts | 2 - src/locales/pt_PT/index.ts | 2 + .../ru/{commerce/color.ts => color/human.ts} | 0 src/locales/ru/color/index.ts | 12 + src/locales/ru/commerce/index.ts | 2 - src/locales/ru/index.ts | 2 + .../sv/{commerce/color.ts => color/human.ts} | 0 src/locales/sv/color/index.ts | 12 + src/locales/sv/commerce/index.ts | 2 - src/locales/sv/index.ts | 2 + .../tr/{commerce/color.ts => color/human.ts} | 0 src/locales/tr/color/index.ts | 12 + src/locales/tr/commerce/index.ts | 2 - src/locales/tr/index.ts | 2 + .../ur/{commerce/color.ts => color/human.ts} | 0 src/locales/ur/color/index.ts | 12 + src/locales/ur/commerce/index.ts | 2 - src/locales/ur/index.ts | 2 + src/modules/color/index.ts | 696 ++++++++++++++++++ src/modules/commerce/index.ts | 15 +- src/modules/random/index.ts | 2 +- src/modules/vehicle/index.ts | 2 +- test/color.spec.ts | 475 ++++++++++++ test/commerce.spec.ts | 2 +- test/vehicle.spec.ts | 2 +- 84 files changed, 1500 insertions(+), 58 deletions(-) create mode 100644 src/definitions/color.ts rename src/locales/ar/{commerce/color.ts => color/human.ts} (100%) create mode 100644 src/locales/ar/color/index.ts rename src/locales/az/{commerce/color.ts => color/human.ts} (100%) create mode 100644 src/locales/az/color/index.ts rename src/locales/el/{commerce/color.ts => color/human.ts} (100%) create mode 100644 src/locales/el/color/index.ts rename src/locales/en/{commerce/color.ts => color/human.ts} (100%) create mode 100644 src/locales/en/color/index.ts create mode 100644 src/locales/en/color/space.ts rename src/locales/es/{commerce/color.ts => color/human.ts} (100%) create mode 100644 src/locales/es/color/index.ts rename src/locales/es_MX/{commerce/color.ts => color/human.ts} (100%) create mode 100644 src/locales/es_MX/color/index.ts rename src/locales/fa/{commerce/color.ts => color/human.ts} (100%) create mode 100644 src/locales/fa/color/index.ts rename src/locales/he/{commerce/color.ts => color/human.ts} (100%) create mode 100644 src/locales/he/color/index.ts rename src/locales/hy/{commerce/color.ts => color/human.ts} (100%) create mode 100644 src/locales/hy/color/index.ts delete mode 100644 src/locales/hy/commerce/index.ts rename src/locales/lv/{commerce/color.ts => color/human.ts} (100%) create mode 100644 src/locales/lv/color/index.ts rename src/locales/nl/{commerce/color.ts => color/human.ts} (100%) create mode 100644 src/locales/nl/color/index.ts rename src/locales/pt_BR/{commerce/color.ts => color/human.ts} (100%) create mode 100644 src/locales/pt_BR/color/index.ts rename src/locales/pt_PT/{commerce/color.ts => color/human.ts} (100%) create mode 100644 src/locales/pt_PT/color/index.ts rename src/locales/ru/{commerce/color.ts => color/human.ts} (100%) create mode 100644 src/locales/ru/color/index.ts rename src/locales/sv/{commerce/color.ts => color/human.ts} (100%) create mode 100644 src/locales/sv/color/index.ts rename src/locales/tr/{commerce/color.ts => color/human.ts} (100%) create mode 100644 src/locales/tr/color/index.ts rename src/locales/ur/{commerce/color.ts => color/human.ts} (100%) create mode 100644 src/locales/ur/color/index.ts create mode 100644 src/modules/color/index.ts create mode 100644 test/color.spec.ts diff --git a/docs/.vitepress/api-pages.ts b/docs/.vitepress/api-pages.ts index ff4ccece630..975ef9c48c5 100644 --- a/docs/.vitepress/api-pages.ts +++ b/docs/.vitepress/api-pages.ts @@ -3,6 +3,7 @@ export const apiPages = [ { text: 'Address', link: '/api/address.html' }, { text: 'Animal', link: '/api/animal.html' }, + { text: 'Color', link: '/api/color.html' }, { text: 'Commerce', link: '/api/commerce.html' }, { text: 'Company', link: '/api/company.html' }, { text: 'Database', link: '/api/database.html' }, diff --git a/scripts/generateLocales.ts b/scripts/generateLocales.ts index 42a290d39ea..9fd3256b14d 100644 --- a/scripts/generateLocales.ts +++ b/scripts/generateLocales.ts @@ -47,6 +47,7 @@ type DefinitionsType = { const definitionsTypes: DefinitionsType = { address: 'AddressDefinitions', animal: 'AnimalDefinitions', + color: 'ColorDefinitions', commerce: 'CommerceDefinitions', company: 'CompanyDefinitions', database: 'DatabaseDefinitions', diff --git a/src/definitions/color.ts b/src/definitions/color.ts new file mode 100644 index 00000000000..a5bbd282015 --- /dev/null +++ b/src/definitions/color.ts @@ -0,0 +1,15 @@ +import type { LocaleEntry } from './definitions'; + +/** + * The possible definitions related to color. + */ +export type ColorDefinitions = LocaleEntry<{ + /** + * Human readable color names + */ + human: string[]; + /** + * Color space names. + */ + space: string[]; +}>; diff --git a/src/definitions/commerce.ts b/src/definitions/commerce.ts index 65aef4ba445..8157c1fcf37 100644 --- a/src/definitions/commerce.ts +++ b/src/definitions/commerce.ts @@ -4,10 +4,6 @@ import type { LocaleEntry } from './definitions'; * The possible definitions related to commerce. */ export type CommerceDefinitions = LocaleEntry<{ - /** - * Human readable color names - */ - color: string[]; /** * Department names inside a shop. */ diff --git a/src/definitions/definitions.ts b/src/definitions/definitions.ts index fae443bacaf..092c73a2807 100644 --- a/src/definitions/definitions.ts +++ b/src/definitions/definitions.ts @@ -1,5 +1,6 @@ import type { AddressDefinitions } from './address'; import type { AnimalDefinitions } from './animal'; +import type { ColorDefinitions } from './color'; import type { CommerceDefinitions } from './commerce'; import type { CompanyDefinitions } from './company'; import type { DatabaseDefinitions } from './database'; @@ -26,6 +27,7 @@ export type LocaleEntry = Partial & export interface Definitions { address: AddressDefinitions; animal: AnimalDefinitions; + color: ColorDefinitions; commerce: CommerceDefinitions; company: CompanyDefinitions; database: DatabaseDefinitions; diff --git a/src/definitions/index.ts b/src/definitions/index.ts index bcfcab0fc3a..7341e241e81 100644 --- a/src/definitions/index.ts +++ b/src/definitions/index.ts @@ -1,5 +1,6 @@ export type { AddressDefinitions } from './address'; export type { AnimalDefinitions } from './animal'; +export type { ColorDefinitions } from './color'; export type { CommerceDefinitions, CommerceProductNameDefinitions, diff --git a/src/faker.ts b/src/faker.ts index 3a7962c8fd0..a252a3e0986 100644 --- a/src/faker.ts +++ b/src/faker.ts @@ -3,6 +3,7 @@ import { FakerError } from './errors/faker-error'; import type { KnownLocale } from './locales'; import { Address } from './modules/address'; import { Animal } from './modules/animal'; +import { Color } from './modules/color'; import { Commerce } from './modules/commerce'; import { Company } from './modules/company'; import { Database } from './modules/database'; @@ -60,6 +61,7 @@ export class Faker { readonly address: Address = new Address(this); readonly animal: Animal = new Animal(this); + readonly color: Color = new Color(this); readonly commerce: Commerce = new Commerce(this); readonly company: Company = new Company(this); readonly database: Database = new Database(this); diff --git a/src/index.ts b/src/index.ts index 64223a0970e..d437fd9d5e9 100644 --- a/src/index.ts +++ b/src/index.ts @@ -4,6 +4,7 @@ import allLocales from './locales'; export type { AddressDefinitions, AnimalDefinitions, + ColorDefinitions, CommerceDefinitions, CommerceProductNameDefinitions, CompanyDefinitions, @@ -27,6 +28,14 @@ export type { } from './definitions'; export { FakerError } from './errors/faker-error'; export type { FakerOptions, UsableLocale, UsedLocales } from './faker'; +export type { + Casing, + ColorFormat, + CSSFunction, + CSSSpace, + NumberColorFormat, + StringColorFormat, +} from './modules/color'; export { Gender } from './modules/name'; export type { GenderType } from './modules/name'; export { Faker }; diff --git a/src/locales/ar/commerce/color.ts b/src/locales/ar/color/human.ts similarity index 100% rename from src/locales/ar/commerce/color.ts rename to src/locales/ar/color/human.ts diff --git a/src/locales/ar/color/index.ts b/src/locales/ar/color/index.ts new file mode 100644 index 00000000000..79cc39f02f3 --- /dev/null +++ b/src/locales/ar/color/index.ts @@ -0,0 +1,12 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { ColorDefinitions } from '../../..'; +import human from './human'; + +const color: ColorDefinitions = { + human, +}; + +export default color; diff --git a/src/locales/ar/commerce/index.ts b/src/locales/ar/commerce/index.ts index 823fcbd2d93..7e5f4475212 100644 --- a/src/locales/ar/commerce/index.ts +++ b/src/locales/ar/commerce/index.ts @@ -3,12 +3,10 @@ * Run 'pnpm run generate:locales' to update. */ import type { CommerceDefinitions } from '../../..'; -import color from './color'; import department from './department'; import product_name from './product_name'; const commerce: CommerceDefinitions = { - color, department, product_name, }; diff --git a/src/locales/ar/index.ts b/src/locales/ar/index.ts index e3e47d94632..643d2823fa6 100644 --- a/src/locales/ar/index.ts +++ b/src/locales/ar/index.ts @@ -5,6 +5,7 @@ import type { LocaleDefinition } from '../..'; import address from './address'; import cell_phone from './cell_phone'; +import color from './color'; import commerce from './commerce'; import date from './date'; import name_ from './name'; @@ -17,6 +18,7 @@ const ar: LocaleDefinition = { separator: ' & ', address, cell_phone, + color, commerce, date, name: name_, diff --git a/src/locales/az/commerce/color.ts b/src/locales/az/color/human.ts similarity index 100% rename from src/locales/az/commerce/color.ts rename to src/locales/az/color/human.ts diff --git a/src/locales/az/color/index.ts b/src/locales/az/color/index.ts new file mode 100644 index 00000000000..79cc39f02f3 --- /dev/null +++ b/src/locales/az/color/index.ts @@ -0,0 +1,12 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { ColorDefinitions } from '../../..'; +import human from './human'; + +const color: ColorDefinitions = { + human, +}; + +export default color; diff --git a/src/locales/az/commerce/index.ts b/src/locales/az/commerce/index.ts index 823fcbd2d93..7e5f4475212 100644 --- a/src/locales/az/commerce/index.ts +++ b/src/locales/az/commerce/index.ts @@ -3,12 +3,10 @@ * Run 'pnpm run generate:locales' to update. */ import type { CommerceDefinitions } from '../../..'; -import color from './color'; import department from './department'; import product_name from './product_name'; const commerce: CommerceDefinitions = { - color, department, product_name, }; diff --git a/src/locales/az/index.ts b/src/locales/az/index.ts index 05b10fd479e..55d7d8077f3 100644 --- a/src/locales/az/index.ts +++ b/src/locales/az/index.ts @@ -4,6 +4,7 @@ */ import type { LocaleDefinition } from '../..'; import address from './address'; +import color from './color'; import commerce from './commerce'; import company from './company'; import date from './date'; @@ -15,6 +16,7 @@ const az: LocaleDefinition = { title: 'Azerbaijani', separator: ' və ', address, + color, commerce, company, date, diff --git a/src/locales/el/commerce/color.ts b/src/locales/el/color/human.ts similarity index 100% rename from src/locales/el/commerce/color.ts rename to src/locales/el/color/human.ts diff --git a/src/locales/el/color/index.ts b/src/locales/el/color/index.ts new file mode 100644 index 00000000000..79cc39f02f3 --- /dev/null +++ b/src/locales/el/color/index.ts @@ -0,0 +1,12 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { ColorDefinitions } from '../../..'; +import human from './human'; + +const color: ColorDefinitions = { + human, +}; + +export default color; diff --git a/src/locales/el/commerce/index.ts b/src/locales/el/commerce/index.ts index 823fcbd2d93..7e5f4475212 100644 --- a/src/locales/el/commerce/index.ts +++ b/src/locales/el/commerce/index.ts @@ -3,12 +3,10 @@ * Run 'pnpm run generate:locales' to update. */ import type { CommerceDefinitions } from '../../..'; -import color from './color'; import department from './department'; import product_name from './product_name'; const commerce: CommerceDefinitions = { - color, department, product_name, }; diff --git a/src/locales/el/index.ts b/src/locales/el/index.ts index 430bdf68246..69b91f40dbc 100644 --- a/src/locales/el/index.ts +++ b/src/locales/el/index.ts @@ -7,6 +7,7 @@ import address from './address'; import app from './app'; import business from './business'; import cell_phone from './cell_phone'; +import color from './color'; import commerce from './commerce'; import company from './company'; import finance from './finance'; @@ -24,6 +25,7 @@ const el: LocaleDefinition = { app, business, cell_phone, + color, commerce, company, finance, diff --git a/src/locales/en/commerce/color.ts b/src/locales/en/color/human.ts similarity index 100% rename from src/locales/en/commerce/color.ts rename to src/locales/en/color/human.ts diff --git a/src/locales/en/color/index.ts b/src/locales/en/color/index.ts new file mode 100644 index 00000000000..2f84c198438 --- /dev/null +++ b/src/locales/en/color/index.ts @@ -0,0 +1,14 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { ColorDefinitions } from '../../..'; +import human from './human'; +import space from './space'; + +const color: ColorDefinitions = { + human, + space, +}; + +export default color; diff --git a/src/locales/en/color/space.ts b/src/locales/en/color/space.ts new file mode 100644 index 00000000000..2fe91419aed --- /dev/null +++ b/src/locales/en/color/space.ts @@ -0,0 +1,43 @@ +export default [ + 'CIE 1931 XYZ', + 'CIEUVW', + 'Uniform Color Spaces (UCSs)', + 'CIELUV', + 'CIELAB', + 'HSLuv', + 'sRGB', + 'Adobe RGB', + 'Adobe Wide Gamut RGB', + 'Rec. 2100', + 'ProPhoto RGB Color Space', + 'scRGB', + 'DCI-P3', + 'Display-P3', + 'Rec. 601', + 'Rec. 709', + 'Academy Color Encoding System (ACES)', + 'Rec. 2020', + 'YPbPr', + 'YDbDr', + 'YIQ', + 'xvYCC', + 'sYCC', + 'HSV', + 'HSL', + 'HWB', + 'RGBA', + 'HSLA', + 'LCh', + 'CMY', + 'CMYK', + 'Munsell Color System', + 'Natural Color System (NSC)', + 'Pantone Matching System (PMS)', + 'RAL', + 'Federal Standard 595C', + 'British Standard Colour (BS)', + 'HKS', + 'LMS', + 'RG', + 'RGK', +]; diff --git a/src/locales/en/commerce/index.ts b/src/locales/en/commerce/index.ts index 2f3f890d61b..dab2aa6966f 100644 --- a/src/locales/en/commerce/index.ts +++ b/src/locales/en/commerce/index.ts @@ -3,13 +3,11 @@ * Run 'pnpm run generate:locales' to update. */ import type { CommerceDefinitions } from '../../..'; -import color from './color'; import department from './department'; import product_description from './product_description'; import product_name from './product_name'; const commerce: CommerceDefinitions = { - color, department, product_description, product_name, diff --git a/src/locales/en/index.ts b/src/locales/en/index.ts index ded35323986..75bd0437199 100644 --- a/src/locales/en/index.ts +++ b/src/locales/en/index.ts @@ -8,6 +8,7 @@ import animal from './animal'; import app from './app'; import business from './business'; import cell_phone from './cell_phone'; +import color from './color'; import commerce from './commerce'; import company from './company'; import database from './database'; @@ -32,6 +33,7 @@ const en: LocaleDefinition = { app, business, cell_phone, + color, commerce, company, database, diff --git a/src/locales/es/commerce/color.ts b/src/locales/es/color/human.ts similarity index 100% rename from src/locales/es/commerce/color.ts rename to src/locales/es/color/human.ts diff --git a/src/locales/es/color/index.ts b/src/locales/es/color/index.ts new file mode 100644 index 00000000000..79cc39f02f3 --- /dev/null +++ b/src/locales/es/color/index.ts @@ -0,0 +1,12 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { ColorDefinitions } from '../../..'; +import human from './human'; + +const color: ColorDefinitions = { + human, +}; + +export default color; diff --git a/src/locales/es/commerce/index.ts b/src/locales/es/commerce/index.ts index 823fcbd2d93..7e5f4475212 100644 --- a/src/locales/es/commerce/index.ts +++ b/src/locales/es/commerce/index.ts @@ -3,12 +3,10 @@ * Run 'pnpm run generate:locales' to update. */ import type { CommerceDefinitions } from '../../..'; -import color from './color'; import department from './department'; import product_name from './product_name'; const commerce: CommerceDefinitions = { - color, department, product_name, }; diff --git a/src/locales/es/index.ts b/src/locales/es/index.ts index dd8a4775b36..b97f68a245d 100644 --- a/src/locales/es/index.ts +++ b/src/locales/es/index.ts @@ -5,6 +5,7 @@ import type { LocaleDefinition } from '../..'; import address from './address'; import cell_phone from './cell_phone'; +import color from './color'; import commerce from './commerce'; import company from './company'; import internet from './internet'; @@ -15,6 +16,7 @@ const es: LocaleDefinition = { title: 'Spanish', address, cell_phone, + color, commerce, company, internet, diff --git a/src/locales/es_MX/commerce/color.ts b/src/locales/es_MX/color/human.ts similarity index 100% rename from src/locales/es_MX/commerce/color.ts rename to src/locales/es_MX/color/human.ts diff --git a/src/locales/es_MX/color/index.ts b/src/locales/es_MX/color/index.ts new file mode 100644 index 00000000000..79cc39f02f3 --- /dev/null +++ b/src/locales/es_MX/color/index.ts @@ -0,0 +1,12 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { ColorDefinitions } from '../../..'; +import human from './human'; + +const color: ColorDefinitions = { + human, +}; + +export default color; diff --git a/src/locales/es_MX/commerce/index.ts b/src/locales/es_MX/commerce/index.ts index 823fcbd2d93..7e5f4475212 100644 --- a/src/locales/es_MX/commerce/index.ts +++ b/src/locales/es_MX/commerce/index.ts @@ -3,12 +3,10 @@ * Run 'pnpm run generate:locales' to update. */ import type { CommerceDefinitions } from '../../..'; -import color from './color'; import department from './department'; import product_name from './product_name'; const commerce: CommerceDefinitions = { - color, department, product_name, }; diff --git a/src/locales/es_MX/index.ts b/src/locales/es_MX/index.ts index 189829fa953..c60536e97d1 100644 --- a/src/locales/es_MX/index.ts +++ b/src/locales/es_MX/index.ts @@ -5,6 +5,7 @@ import type { LocaleDefinition } from '../..'; import address from './address'; import cell_phone from './cell_phone'; +import color from './color'; import commerce from './commerce'; import company from './company'; import internet from './internet'; @@ -18,6 +19,7 @@ const es_MX: LocaleDefinition = { separator: ' & ', address, cell_phone, + color, commerce, company, internet, diff --git a/src/locales/fa/commerce/color.ts b/src/locales/fa/color/human.ts similarity index 100% rename from src/locales/fa/commerce/color.ts rename to src/locales/fa/color/human.ts diff --git a/src/locales/fa/color/index.ts b/src/locales/fa/color/index.ts new file mode 100644 index 00000000000..79cc39f02f3 --- /dev/null +++ b/src/locales/fa/color/index.ts @@ -0,0 +1,12 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { ColorDefinitions } from '../../..'; +import human from './human'; + +const color: ColorDefinitions = { + human, +}; + +export default color; diff --git a/src/locales/fa/commerce/index.ts b/src/locales/fa/commerce/index.ts index 823fcbd2d93..7e5f4475212 100644 --- a/src/locales/fa/commerce/index.ts +++ b/src/locales/fa/commerce/index.ts @@ -3,12 +3,10 @@ * Run 'pnpm run generate:locales' to update. */ import type { CommerceDefinitions } from '../../..'; -import color from './color'; import department from './department'; import product_name from './product_name'; const commerce: CommerceDefinitions = { - color, department, product_name, }; diff --git a/src/locales/fa/index.ts b/src/locales/fa/index.ts index 9f53ec55417..b554f801c2b 100644 --- a/src/locales/fa/index.ts +++ b/src/locales/fa/index.ts @@ -5,6 +5,7 @@ import type { LocaleDefinition } from '../..'; import address from './address'; import cell_phone from './cell_phone'; +import color from './color'; import commerce from './commerce'; import company from './company'; import date from './date'; @@ -19,6 +20,7 @@ const fa: LocaleDefinition = { title: 'Farsi', address, cell_phone, + color, commerce, company, date, diff --git a/src/locales/he/commerce/color.ts b/src/locales/he/color/human.ts similarity index 100% rename from src/locales/he/commerce/color.ts rename to src/locales/he/color/human.ts diff --git a/src/locales/he/color/index.ts b/src/locales/he/color/index.ts new file mode 100644 index 00000000000..79cc39f02f3 --- /dev/null +++ b/src/locales/he/color/index.ts @@ -0,0 +1,12 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { ColorDefinitions } from '../../..'; +import human from './human'; + +const color: ColorDefinitions = { + human, +}; + +export default color; diff --git a/src/locales/he/commerce/index.ts b/src/locales/he/commerce/index.ts index 2f3f890d61b..dab2aa6966f 100644 --- a/src/locales/he/commerce/index.ts +++ b/src/locales/he/commerce/index.ts @@ -3,13 +3,11 @@ * Run 'pnpm run generate:locales' to update. */ import type { CommerceDefinitions } from '../../..'; -import color from './color'; import department from './department'; import product_description from './product_description'; import product_name from './product_name'; const commerce: CommerceDefinitions = { - color, department, product_description, product_name, diff --git a/src/locales/he/index.ts b/src/locales/he/index.ts index 1ab59ac8ae1..38a26a29361 100644 --- a/src/locales/he/index.ts +++ b/src/locales/he/index.ts @@ -5,6 +5,7 @@ import type { LocaleDefinition } from '../..'; import address from './address'; import cell_phone from './cell_phone'; +import color from './color'; import commerce from './commerce'; import date from './date'; import lorem from './lorem'; @@ -17,6 +18,7 @@ const he: LocaleDefinition = { separator: 'ו ', address, cell_phone, + color, commerce, date, lorem, diff --git a/src/locales/hy/commerce/color.ts b/src/locales/hy/color/human.ts similarity index 100% rename from src/locales/hy/commerce/color.ts rename to src/locales/hy/color/human.ts diff --git a/src/locales/hy/color/index.ts b/src/locales/hy/color/index.ts new file mode 100644 index 00000000000..79cc39f02f3 --- /dev/null +++ b/src/locales/hy/color/index.ts @@ -0,0 +1,12 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { ColorDefinitions } from '../../..'; +import human from './human'; + +const color: ColorDefinitions = { + human, +}; + +export default color; diff --git a/src/locales/hy/commerce/index.ts b/src/locales/hy/commerce/index.ts deleted file mode 100644 index 26b2864f1af..00000000000 --- a/src/locales/hy/commerce/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* - * This file is automatically generated. - * Run 'pnpm run generate:locales' to update. - */ -import type { CommerceDefinitions } from '../../..'; -import color from './color'; - -const commerce: CommerceDefinitions = { - color, -}; - -export default commerce; diff --git a/src/locales/hy/index.ts b/src/locales/hy/index.ts index 2f9da62ced9..1a1fb639a50 100644 --- a/src/locales/hy/index.ts +++ b/src/locales/hy/index.ts @@ -4,7 +4,7 @@ */ import type { LocaleDefinition } from '../..'; import address from './address'; -import commerce from './commerce'; +import color from './color'; import date from './date'; import internet from './internet'; import lorem from './lorem'; @@ -15,7 +15,7 @@ const hy: LocaleDefinition = { title: 'Armenian', separator: ' և ', address, - commerce, + color, date, internet, lorem, diff --git a/src/locales/lv/commerce/color.ts b/src/locales/lv/color/human.ts similarity index 100% rename from src/locales/lv/commerce/color.ts rename to src/locales/lv/color/human.ts diff --git a/src/locales/lv/color/index.ts b/src/locales/lv/color/index.ts new file mode 100644 index 00000000000..79cc39f02f3 --- /dev/null +++ b/src/locales/lv/color/index.ts @@ -0,0 +1,12 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { ColorDefinitions } from '../../..'; +import human from './human'; + +const color: ColorDefinitions = { + human, +}; + +export default color; diff --git a/src/locales/lv/commerce/index.ts b/src/locales/lv/commerce/index.ts index 823fcbd2d93..7e5f4475212 100644 --- a/src/locales/lv/commerce/index.ts +++ b/src/locales/lv/commerce/index.ts @@ -3,12 +3,10 @@ * Run 'pnpm run generate:locales' to update. */ import type { CommerceDefinitions } from '../../..'; -import color from './color'; import department from './department'; import product_name from './product_name'; const commerce: CommerceDefinitions = { - color, department, product_name, }; diff --git a/src/locales/lv/index.ts b/src/locales/lv/index.ts index 31fe8253057..527d7c3fcb8 100644 --- a/src/locales/lv/index.ts +++ b/src/locales/lv/index.ts @@ -5,6 +5,7 @@ import type { LocaleDefinition } from '../..'; import address from './address'; import cell_phone from './cell_phone'; +import color from './color'; import commerce from './commerce'; import company from './company'; import date from './date'; @@ -18,6 +19,7 @@ const lv: LocaleDefinition = { separator: ' un ', address, cell_phone, + color, commerce, company, date, diff --git a/src/locales/nl/commerce/color.ts b/src/locales/nl/color/human.ts similarity index 100% rename from src/locales/nl/commerce/color.ts rename to src/locales/nl/color/human.ts diff --git a/src/locales/nl/color/index.ts b/src/locales/nl/color/index.ts new file mode 100644 index 00000000000..79cc39f02f3 --- /dev/null +++ b/src/locales/nl/color/index.ts @@ -0,0 +1,12 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { ColorDefinitions } from '../../..'; +import human from './human'; + +const color: ColorDefinitions = { + human, +}; + +export default color; diff --git a/src/locales/nl/commerce/index.ts b/src/locales/nl/commerce/index.ts index 823fcbd2d93..7e5f4475212 100644 --- a/src/locales/nl/commerce/index.ts +++ b/src/locales/nl/commerce/index.ts @@ -3,12 +3,10 @@ * Run 'pnpm run generate:locales' to update. */ import type { CommerceDefinitions } from '../../..'; -import color from './color'; import department from './department'; import product_name from './product_name'; const commerce: CommerceDefinitions = { - color, department, product_name, }; diff --git a/src/locales/nl/index.ts b/src/locales/nl/index.ts index 7dc23561174..6e6fb8a55fa 100644 --- a/src/locales/nl/index.ts +++ b/src/locales/nl/index.ts @@ -4,6 +4,7 @@ */ import type { LocaleDefinition } from '../..'; import address from './address'; +import color from './color'; import commerce from './commerce'; import company from './company'; import date from './date'; @@ -16,6 +17,7 @@ import phone_number from './phone_number'; const nl: LocaleDefinition = { title: 'Dutch', address, + color, commerce, company, date, diff --git a/src/locales/pt_BR/commerce/color.ts b/src/locales/pt_BR/color/human.ts similarity index 100% rename from src/locales/pt_BR/commerce/color.ts rename to src/locales/pt_BR/color/human.ts diff --git a/src/locales/pt_BR/color/index.ts b/src/locales/pt_BR/color/index.ts new file mode 100644 index 00000000000..79cc39f02f3 --- /dev/null +++ b/src/locales/pt_BR/color/index.ts @@ -0,0 +1,12 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { ColorDefinitions } from '../../..'; +import human from './human'; + +const color: ColorDefinitions = { + human, +}; + +export default color; diff --git a/src/locales/pt_BR/commerce/index.ts b/src/locales/pt_BR/commerce/index.ts index 823fcbd2d93..7e5f4475212 100644 --- a/src/locales/pt_BR/commerce/index.ts +++ b/src/locales/pt_BR/commerce/index.ts @@ -3,12 +3,10 @@ * Run 'pnpm run generate:locales' to update. */ import type { CommerceDefinitions } from '../../..'; -import color from './color'; import department from './department'; import product_name from './product_name'; const commerce: CommerceDefinitions = { - color, department, product_name, }; diff --git a/src/locales/pt_BR/index.ts b/src/locales/pt_BR/index.ts index a23c5227aba..de563dcd424 100644 --- a/src/locales/pt_BR/index.ts +++ b/src/locales/pt_BR/index.ts @@ -4,6 +4,7 @@ */ import type { LocaleDefinition } from '../..'; import address from './address'; +import color from './color'; import commerce from './commerce'; import company from './company'; import date from './date'; @@ -15,6 +16,7 @@ import phone_number from './phone_number'; const pt_BR: LocaleDefinition = { title: 'Portuguese (Brazil)', address, + color, commerce, company, date, diff --git a/src/locales/pt_PT/commerce/color.ts b/src/locales/pt_PT/color/human.ts similarity index 100% rename from src/locales/pt_PT/commerce/color.ts rename to src/locales/pt_PT/color/human.ts diff --git a/src/locales/pt_PT/color/index.ts b/src/locales/pt_PT/color/index.ts new file mode 100644 index 00000000000..79cc39f02f3 --- /dev/null +++ b/src/locales/pt_PT/color/index.ts @@ -0,0 +1,12 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { ColorDefinitions } from '../../..'; +import human from './human'; + +const color: ColorDefinitions = { + human, +}; + +export default color; diff --git a/src/locales/pt_PT/commerce/index.ts b/src/locales/pt_PT/commerce/index.ts index 823fcbd2d93..7e5f4475212 100644 --- a/src/locales/pt_PT/commerce/index.ts +++ b/src/locales/pt_PT/commerce/index.ts @@ -3,12 +3,10 @@ * Run 'pnpm run generate:locales' to update. */ import type { CommerceDefinitions } from '../../..'; -import color from './color'; import department from './department'; import product_name from './product_name'; const commerce: CommerceDefinitions = { - color, department, product_name, }; diff --git a/src/locales/pt_PT/index.ts b/src/locales/pt_PT/index.ts index cd2281d8808..ca3a9f30263 100644 --- a/src/locales/pt_PT/index.ts +++ b/src/locales/pt_PT/index.ts @@ -5,6 +5,7 @@ import type { LocaleDefinition } from '../..'; import address from './address'; import cell_phone from './cell_phone'; +import color from './color'; import commerce from './commerce'; import date from './date'; import internet from './internet'; @@ -15,6 +16,7 @@ const pt_PT: LocaleDefinition = { title: 'Portuguese (Portugal)', address, cell_phone, + color, commerce, date, internet, diff --git a/src/locales/ru/commerce/color.ts b/src/locales/ru/color/human.ts similarity index 100% rename from src/locales/ru/commerce/color.ts rename to src/locales/ru/color/human.ts diff --git a/src/locales/ru/color/index.ts b/src/locales/ru/color/index.ts new file mode 100644 index 00000000000..79cc39f02f3 --- /dev/null +++ b/src/locales/ru/color/index.ts @@ -0,0 +1,12 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { ColorDefinitions } from '../../..'; +import human from './human'; + +const color: ColorDefinitions = { + human, +}; + +export default color; diff --git a/src/locales/ru/commerce/index.ts b/src/locales/ru/commerce/index.ts index 823fcbd2d93..7e5f4475212 100644 --- a/src/locales/ru/commerce/index.ts +++ b/src/locales/ru/commerce/index.ts @@ -3,12 +3,10 @@ * Run 'pnpm run generate:locales' to update. */ import type { CommerceDefinitions } from '../../..'; -import color from './color'; import department from './department'; import product_name from './product_name'; const commerce: CommerceDefinitions = { - color, department, product_name, }; diff --git a/src/locales/ru/index.ts b/src/locales/ru/index.ts index b536671482c..d8e94deedea 100644 --- a/src/locales/ru/index.ts +++ b/src/locales/ru/index.ts @@ -4,6 +4,7 @@ */ import type { LocaleDefinition } from '../..'; import address from './address'; +import color from './color'; import commerce from './commerce'; import company from './company'; import date from './date'; @@ -17,6 +18,7 @@ const ru: LocaleDefinition = { title: 'Russian', separator: ' и ', address, + color, commerce, company, date, diff --git a/src/locales/sv/commerce/color.ts b/src/locales/sv/color/human.ts similarity index 100% rename from src/locales/sv/commerce/color.ts rename to src/locales/sv/color/human.ts diff --git a/src/locales/sv/color/index.ts b/src/locales/sv/color/index.ts new file mode 100644 index 00000000000..79cc39f02f3 --- /dev/null +++ b/src/locales/sv/color/index.ts @@ -0,0 +1,12 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { ColorDefinitions } from '../../..'; +import human from './human'; + +const color: ColorDefinitions = { + human, +}; + +export default color; diff --git a/src/locales/sv/commerce/index.ts b/src/locales/sv/commerce/index.ts index 823fcbd2d93..7e5f4475212 100644 --- a/src/locales/sv/commerce/index.ts +++ b/src/locales/sv/commerce/index.ts @@ -3,12 +3,10 @@ * Run 'pnpm run generate:locales' to update. */ import type { CommerceDefinitions } from '../../..'; -import color from './color'; import department from './department'; import product_name from './product_name'; const commerce: CommerceDefinitions = { - color, department, product_name, }; diff --git a/src/locales/sv/index.ts b/src/locales/sv/index.ts index dc0f098593d..6c5ffe69f98 100644 --- a/src/locales/sv/index.ts +++ b/src/locales/sv/index.ts @@ -5,6 +5,7 @@ import type { LocaleDefinition } from '../..'; import address from './address'; import cell_phone from './cell_phone'; +import color from './color'; import commerce from './commerce'; import company from './company'; import date from './date'; @@ -17,6 +18,7 @@ const sv: LocaleDefinition = { title: 'Swedish', address, cell_phone, + color, commerce, company, date, diff --git a/src/locales/tr/commerce/color.ts b/src/locales/tr/color/human.ts similarity index 100% rename from src/locales/tr/commerce/color.ts rename to src/locales/tr/color/human.ts diff --git a/src/locales/tr/color/index.ts b/src/locales/tr/color/index.ts new file mode 100644 index 00000000000..79cc39f02f3 --- /dev/null +++ b/src/locales/tr/color/index.ts @@ -0,0 +1,12 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { ColorDefinitions } from '../../..'; +import human from './human'; + +const color: ColorDefinitions = { + human, +}; + +export default color; diff --git a/src/locales/tr/commerce/index.ts b/src/locales/tr/commerce/index.ts index 2f3f890d61b..dab2aa6966f 100644 --- a/src/locales/tr/commerce/index.ts +++ b/src/locales/tr/commerce/index.ts @@ -3,13 +3,11 @@ * Run 'pnpm run generate:locales' to update. */ import type { CommerceDefinitions } from '../../..'; -import color from './color'; import department from './department'; import product_description from './product_description'; import product_name from './product_name'; const commerce: CommerceDefinitions = { - color, department, product_description, product_name, diff --git a/src/locales/tr/index.ts b/src/locales/tr/index.ts index 7a7fac2ff9d..70a988b65af 100644 --- a/src/locales/tr/index.ts +++ b/src/locales/tr/index.ts @@ -5,6 +5,7 @@ import type { LocaleDefinition } from '../..'; import address from './address'; import cell_phone from './cell_phone'; +import color from './color'; import commerce from './commerce'; import internet from './internet'; import lorem from './lorem'; @@ -15,6 +16,7 @@ const tr: LocaleDefinition = { title: 'Turkish', address, cell_phone, + color, commerce, internet, lorem, diff --git a/src/locales/ur/commerce/color.ts b/src/locales/ur/color/human.ts similarity index 100% rename from src/locales/ur/commerce/color.ts rename to src/locales/ur/color/human.ts diff --git a/src/locales/ur/color/index.ts b/src/locales/ur/color/index.ts new file mode 100644 index 00000000000..79cc39f02f3 --- /dev/null +++ b/src/locales/ur/color/index.ts @@ -0,0 +1,12 @@ +/* + * This file is automatically generated. + * Run 'pnpm run generate:locales' to update. + */ +import type { ColorDefinitions } from '../../..'; +import human from './human'; + +const color: ColorDefinitions = { + human, +}; + +export default color; diff --git a/src/locales/ur/commerce/index.ts b/src/locales/ur/commerce/index.ts index 823fcbd2d93..7e5f4475212 100644 --- a/src/locales/ur/commerce/index.ts +++ b/src/locales/ur/commerce/index.ts @@ -3,12 +3,10 @@ * Run 'pnpm run generate:locales' to update. */ import type { CommerceDefinitions } from '../../..'; -import color from './color'; import department from './department'; import product_name from './product_name'; const commerce: CommerceDefinitions = { - color, department, product_name, }; diff --git a/src/locales/ur/index.ts b/src/locales/ur/index.ts index 49aae08e2a2..5794e793cbb 100644 --- a/src/locales/ur/index.ts +++ b/src/locales/ur/index.ts @@ -8,6 +8,7 @@ import animal from './animal'; import app from './app'; import business from './business'; import cell_phone from './cell_phone'; +import color from './color'; import commerce from './commerce'; import date from './date'; import finance from './finance'; @@ -25,6 +26,7 @@ const ur: LocaleDefinition = { app, business, cell_phone, + color, commerce, date, finance, diff --git a/src/modules/color/index.ts b/src/modules/color/index.ts new file mode 100644 index 00000000000..8b5fdba277c --- /dev/null +++ b/src/modules/color/index.ts @@ -0,0 +1,696 @@ +import type { Faker } from '../../faker'; + +/** + * Color space names supported by CSS. + */ +export const CSS_SPACES = [ + 'sRGB', + 'display-p3', + 'rec2020', + 'a98-rgb', + 'prophoto-rgb', + 'rec2020', +] as const; + +/** + * Functions supported by CSS to produce color. + */ +export const CSS_FUNCTIONS = [ + 'rgb', + 'rgba', + 'hsl', + 'hsla', + 'hwb', + 'cmyk', + 'lab', + 'lch', + 'color', +] as const; + +export type CSSFunction = typeof CSS_FUNCTIONS[number]; +export type CSSSpace = typeof CSS_SPACES[number]; +export type StringColorFormat = 'css' | 'binary'; +export type NumberColorFormat = 'decimal'; +export type ColorFormat = StringColorFormat | NumberColorFormat; +export type Casing = 'lower' | 'upper' | 'mixed'; + +/** + * Formats the hex format of a generated color string according + * to options specified by user. + * + * @param hexColor Hex color string to be formatted. + * @param options Options object. + * @param options.prefix Prefix of the generated hex color. Defaults to `'0x'`. + * @param options.casing Letter type case of the generated hex color. Defaults to `'mixed'`. + */ +function formatHexColor( + hexColor: string, + options?: { + prefix?: string; + casing?: Casing; + } +): string { + switch (options?.casing) { + case 'upper': + hexColor = hexColor.toUpperCase(); + break; + case 'lower': + hexColor = hexColor.toLowerCase(); + break; + } + if (options?.prefix) { + hexColor = options.prefix + hexColor; + } + return hexColor; +} + +/** + * Converts an array of numbers into binary string format. + * + * @param values Array of values to be converted. + */ +function toBinary(values: number[]): string { + const binary: string[] = values.map((value) => { + const isFloat = value % 1 !== 0; + if (isFloat) { + const buffer = new ArrayBuffer(4); + new DataView(buffer).setFloat32(0, value); + const bytes = new Uint8Array(buffer); + return toBinary(Array.from(bytes)).split(' ').join(''); + } + return (value >>> 0).toString(2).padStart(8, '0'); + }); + return binary.join(' '); +} + +/** + * Converts an array of numbers into CSS accepted format. + * + * @param values Array of values to be converted. + * @param cssFunction CSS function to be generated for the color. Defaults to `'rgb'`. + * @param space Color space to format CSS color function with. Defaults to `'sRGB'`. + */ +function toCSS( + values: number[], + cssFunction: CSSFunction = 'rgb', + space: CSSSpace = 'sRGB' +): string { + const percentage = (value: number) => Math.round(value * 100); + switch (cssFunction) { + case 'rgba': + return `rgba(${values[0]}, ${values[1]}, ${values[2]}, ${values[3]})`; + case 'color': + return `color(${space} ${values[0]} ${values[1]} ${values[2]})`; + case 'cmyk': + return `cmyk(${percentage(values[0])}%, ${percentage( + values[1] + )}%, ${percentage(values[2])}%, ${percentage(values[3])}%)`; + case 'hsl': + return `hsl(${values[0]}deg ${percentage(values[1])}% ${percentage( + values[2] + )}%)`; + case 'hsla': + return `hsl(${values[0]}deg ${percentage(values[1])}% ${percentage( + values[2] + )}% / ${percentage(values[3])})`; + case 'hwb': + return `hwb(${values[0]} ${percentage(values[1])}% ${percentage( + values[2] + )}%)`; + case 'lab': + return `lab(${percentage(values[0])}% ${values[1]} ${values[2]})`; + case 'lch': + return `lch(${percentage(values[0])}% ${values[1]} ${values[2]})`; + case 'rgb': + default: + return `rgb(${values[0]}, ${values[1]}, ${values[2]})`; + } +} + +/** + * Converts an array of color values to the specified color format. + * + * @param values Array of color values to be converted. + * @param format Format of generated RGB color. + * @param cssFunction CSS function to be generated for the color. Defaults to `'rgb'`. + * @param space Color space to format CSS color function with. Defaults to `'sRGB'`. + */ +function toColorFormat( + values: number[], + format: ColorFormat, + cssFunction: CSSFunction = 'rgb', + space: CSSSpace = 'sRGB' +): string | number[] { + switch (format) { + case 'css': + return toCSS(values, cssFunction, space); + case 'binary': + return toBinary(values); + default: + return values; + } +} + +/** + * Module to generate colors. + */ +export class Color { + constructor(private readonly faker: Faker) { + // Bind `this` so namespaced is working correctly + for (const name of Object.getOwnPropertyNames(Color.prototype)) { + if (name === 'constructor' || typeof this[name] !== 'function') { + continue; + } + this[name] = this[name].bind(this); + } + } + + /** + * Returns a random human readable color name. + * + * @example + * faker.color.human() // 'red' + */ + human(): string { + return this.faker.helpers.arrayElement(this.faker.definitions.color.human); + } + + /** + * Returns a random color space name from the worldwide accepted color spaces. + * Source: https://en.wikipedia.org/wiki/List_of_color_spaces_and_their_uses + * + * @example + * faker.color.space() // 'sRGB' + */ + space(): string { + return this.faker.helpers.arrayElement(this.faker.definitions.color.space); + } + + /** + * Returns a random css supported color function name. + * + * @example + * faker.color.cssSupportedFunction() // 'rgb' + */ + cssSupportedFunction(): string { + return this.faker.helpers.arrayElement(CSS_FUNCTIONS); + } + + /** + * Returns a random css supported color space name. + * + * @example + * faker.color.cssSupportedSpace() // 'display-p3' + */ + cssSupportedSpace(): string { + return this.faker.helpers.arrayElement(CSS_SPACES); + } + + /** + * Returns an RGB color. + * + * @example + * faker.color.rgb() // '0xffffFF' + */ + rgb(): string; + /** + * Returns an RGB color. + * + * @param options Options object. + * @param options.prefix Prefix of the generated hex color. Only applied when 'hex' format is used. Defaults to `'0x'`. + * @param options.casing Letter type case of the generated hex color. Only applied when `'hex'` format is used. Defaults to `'mixed'`. + * @param options.format Format of generated RGB color. Defaults to `hex`. + * @param options.includeAlpha Adds an alpha value to the color (RGBA). Defaults to `false`. + * + * @example + * faker.color.rgb() // '0xffffFF' + * faker.color.rgb({ prefix: '#' }) // '#ffffFF' + * faker.color.rgb({ casing: 'upper' }) // '0xFFFFFF' + * faker.color.rgb({ casing: 'lower' }) // '0xffffff' + * faker.color.rgb({ prefix: '#', casing: 'lower' }) // '#ffffff' + * faker.color.rgb({ format: 'hex', casing: 'lower' }) // '#ffffff' + * faker.color.rgb({ format: 'css' }) // 'rgb(255, 0, 0)' + * faker.color.rgb({ format: 'binary' }) // '10000000 00000000 11111111' + */ + rgb(options?: { + prefix?: string; + casing?: Casing; + format?: 'hex' | StringColorFormat; + includeAlpha?: boolean; + }): string; + /** + * Returns an RGB color. + * + * @param options Options object. + * @param options.format Format of generated RGB color. Defaults to `'hex'`. + * @param options.includeAlpha Adds an alpha value to the color (RGBA). Defaults to `false`. + * + * @example + * faker.color.rgb() // '0xffffFF' + * faker.color.rgb({ format: 'decimal' }) // [255, 255, 255] + * faker.color.rgb({ format: 'decimal', includeAlpha: true }) // [255, 255, 255, 0.4] + */ + rgb(options?: { + format?: NumberColorFormat; + includeAlpha?: boolean; + }): number[]; + /** + * Returns an RGB color. + * + * @param options Options object. + * @param options.prefix Prefix of the generated hex color. Only applied when `'hex'` format is used. Defaults to `'0x'`. + * @param options.casing Letter type case of the generated hex color. Only applied when `'hex'` format is used. Defaults to `'mixed'`. + * @param options.format Format of generated RGB color. Defaults to `'hex'`. + * @param options.includeAlpha Adds an alpha value to the color (RGBA). Defaults to `false`. + * + * @example + * faker.color.rgb() // '0xffffFF' + * faker.color.rgb({ prefix: '#' }) // '#ffffFF' + * faker.color.rgb({ casing: 'upper' }) // '0xFFFFFF' + * faker.color.rgb({ casing: 'lower' }) // '0xffffff' + * faker.color.rgb({ prefix: '#', casing: 'lower' }) // '#ffffff' + * faker.color.rgb({ format: 'hex', casing: 'lower' }) // '#ffffff' + * faker.color.rgb({ format: 'decimal' }) // [255, 255, 255] + * faker.color.rgb({ format: 'css' }) // 'rgb(255, 0, 0)' + * faker.color.rgb({ format: 'binary' }) // '10000000 00000000 11111111' + * faker.color.rgb({ format: 'decimal', includeAlpha: true }) // [255, 255, 255, 0.4] + */ + rgb(options?: { + prefix?: string; + casing?: Casing; + format?: 'hex' | ColorFormat; + includeAlpha?: boolean; + }): string | number[]; + rgb(options?: { + prefix?: string; + casing?: Casing; + format?: 'hex' | ColorFormat; + includeAlpha?: boolean; + }): string | number[] { + const { + format = 'hex', + includeAlpha = false, + prefix = '#', + casing = 'lower', + } = options || {}; + options = { format, includeAlpha, prefix, casing }; + let color: string | number[]; + let cssFunction: CSSFunction = 'rgb'; + if (format === 'hex') { + color = this.faker.datatype.hexadecimal(includeAlpha ? 8 : 6).slice(2); + color = formatHexColor(color, options); + return color; + } + color = Array.from({ length: 3 }).map(() => + this.faker.datatype.number({ min: 0, max: 255 }) + ); + if (includeAlpha) { + color.push( + this.faker.datatype.float({ min: 0, max: 1, precision: 0.01 }) + ); + cssFunction = 'rgba'; + } + return toColorFormat(color, format, cssFunction); + } + + /** + * Returns a CMYK color. + * + * @example + * faker.color.cmyk() // [0.31, 0.52, 0.32, 0.43] + */ + cmyk(): number[]; + /** + * Returns a CMYK color. + * + * @param options Options object. + * @param options.format Format of generated CMYK color. Defaults to `'decimal'`. + * + * @example + * faker.color.cmyk() // [0.31, 0.52, 0.32, 0.43] + * faker.color.cmyk({ format: 'css' }) // cmyk(100%, 0%, 0%, 0%) + * faker.color.cmyk({ format: 'binary' }) // (8-32 bits) x 4 + */ + cmyk(options?: { format?: StringColorFormat }): string; + /** + * Returns a CMYK color. + * + * @param options Options object. + * @param options.format Format of generated CMYK color. Defaults to `'decimal'`. + * + * @example + * faker.color.cmyk() // [0.31, 0.52, 0.32, 0.43] + * faker.color.cmyk({ format: 'decimal' }) // [0.31, 0.52, 0.32, 0.43] + */ + cmyk(options?: { format?: NumberColorFormat }): number[]; + /** + * Returns a CMYK color. + * + * @param options Options object. + * @param options.format Format of generated CMYK color. Defaults to `'decimal'`. + * + * @example + * faker.color.cmyk() // [0.31, 0.52, 0.32, 0.43] + * faker.color.cmyk({ format: 'decimal' }) // [0.31, 0.52, 0.32, 0.43] + * faker.color.cmyk({ format: 'css' }) // cmyk(100%, 0%, 0%, 0%) + * faker.color.cmyk({ format: 'binary' }) // (8-32 bits) x 4 + */ + cmyk(options?: { format?: ColorFormat }): string | number[]; + cmyk(options?: { format?: ColorFormat }): string | number[] { + const color: string | number[] = Array.from({ length: 4 }).map(() => + this.faker.datatype.float({ min: 0, max: 1, precision: 0.01 }) + ); + return toColorFormat(color, options?.format || 'decimal', 'cmyk'); + } + + /** + * Returns an HSL color. + * + * @example + * faker.color.hsl() // [201, 0.23, 0.32] + */ + hsl(): number[]; + /** + * Returns an HSL color. + * + * @param options Options object. + * @param options.format Format of generated HSL color. Defaults to `'decimal'`. + * @param options.includeAlpha Adds an alpha value to the color (RGBA). Defaults to `false`. + * + * @example + * faker.color.hsl() // [201, 0.23, 0.32] + * faker.color.hsl({ format: 'css' }) // hsl(0deg, 100%, 80%) + * faker.color.hsl({ format: 'css', includeAlpha: true }) // hsl(0deg 100% 50% / 0.5) + * faker.color.hsl({ format: 'binary' }) // (8-32 bits) x 3 + * faker.color.hsl({ format: 'binary', includeAlpha: true }) // (8-32 bits) x 4 + */ + hsl(options?: { format?: StringColorFormat; includeAlpha?: boolean }): string; + /** + * Returns an HSL color. + * + * @param options Options object. + * @param options.format Format of generated HSL color. Defaults to `'decimal'`. + * @param options.includeAlpha Adds an alpha value to the color (RGBA). Defaults to `false`. + * + * @example + * faker.color.hsl() // [201, 0.23, 0.32] + * faker.color.hsl({ format: 'decimal' }) // [300, 0.21, 0.52] + * faker.color.hsl({ format: 'decimal', includeAlpha: true }) // [300, 0.21, 0.52, 0.28] + */ + hsl(options?: { + format?: NumberColorFormat; + includeAlpha?: boolean; + }): number[]; + /** + * Returns an HSL color. + * + * @param options Options object. + * @param options.format Format of generated HSL color. Defaults to `'decimal'`. + * @param options.includeAlpha Adds an alpha value to the color (RGBA). Defaults to `false`. + * + * @example + * faker.color.hsl() // [201, 0.23, 0.32] + * faker.color.hsl({ format: 'decimal' }) // [300, 0.21, 0.52] + * faker.color.hsl({ format: 'decimal', includeAlpha: true }) // [300, 0.21, 0.52, 0.28] + * faker.color.hsl({ format: 'css' }) // hsl(0deg, 100%, 80%) + * faker.color.hsl({ format: 'css', includeAlpha: true }) // hsl(0deg 100% 50% / 0.5) + * faker.color.hsl({ format: 'binary' }) // (8-32 bits) x 3 + * faker.color.hsl({ format: 'binary', includeAlpha: true }) // (8-32 bits) x 4 + */ + hsl(options?: { + format?: ColorFormat; + includeAlpha?: boolean; + }): string | number[]; + hsl(options?: { + format?: ColorFormat; + includeAlpha?: boolean; + }): string | number[] { + const hsl: number[] = [this.faker.datatype.number({ min: 0, max: 360 })]; + for (let i = 0; i < (options?.includeAlpha ? 3 : 2); i++) { + hsl.push(this.faker.datatype.float({ min: 0, max: 1, precision: 0.01 })); + } + return toColorFormat( + hsl, + options?.format || 'decimal', + options?.includeAlpha ? 'hsla' : 'hsl' + ); + } + + /** + * Returns an HWB color. + * + * @example + * faker.color.hwb() // [201, 0.21, 0.31] + */ + hwb(): number[]; + /** + * Returns an HWB color. + * + * @param options Options object. + * @param options.format Format of generated RGB color. Defaults to `'decimal'`. + * + * @example + * faker.color.hwb() // [201, 0.21, 0.31] + * faker.color.hwb({ format: 'css' }) // hwb(194 0% 0%) + * faker.color.hwb({ format: 'binary' }) // (8-32 bits x 3) + */ + hwb(options?: { format?: StringColorFormat }): string; + /** + * Returns an HWB color. + * + * @param options Options object. + * @param options.format Format of generated RGB color. Defaults to `'decimal'`. + * + * @example + * faker.color.hwb() // [201, 0.21, 0.31] + * faker.color.hwb({ format: 'decimal' }) // [201, 0.21, 0.31] + */ + hwb(options?: { format?: NumberColorFormat }): number[]; + /** + * Returns an HWB color. + * + * @param options Options object. + * @param options.format Format of generated RGB color. Defaults to `'decimal'`. + * + * @example + * faker.color.hwb() // [201, 0.21, 0.31] + * faker.color.hwb({ format: 'decimal' }) // [201, 0.21, 0.31] + * faker.color.hwb({ format: 'css' }) // hwb(194 0% 0%) + * faker.color.hwb({ format: 'binary' }) // (8-32 bits x 3) + */ + hwb(options?: { format?: ColorFormat }): string | number[]; + /** + * Returns an HWB color. + * + * @param options Options object. + * @param options.format Format of generated RGB color. Defaults to `'decimal'`. + * + * @example + * faker.color.hwb() // [201, 0.21, 0.31] + * faker.color.hwb({ format: 'decimal' }) // [201, 0.21, 0.31] + * faker.color.hwb({ format: 'css' }) // hwb(194 0% 0%) + * faker.color.hwb({ format: 'binary' }) // (8-32 bits x 3) + */ + hwb(options?: { format?: ColorFormat }): string | number[] { + const hsl: number[] = [this.faker.datatype.number({ min: 0, max: 360 })]; + for (let i = 0; i < 2; i++) { + hsl.push(this.faker.datatype.float({ min: 0, max: 1, precision: 0.01 })); + } + return toColorFormat(hsl, options?.format || 'decimal', 'hwb'); + } + + /** + * Returns a LAB (CIELAB) color. + * + * @example + * faker.color.lab() // [0.832133, -80.3245, 100.1234] + */ + lab(): number[]; + /** + * Returns a LAB (CIELAB) color. + * + * @param options Options object. + * @param options.format Format of generated RGB color. Defaults to `'decimal'`. + * + * @example + * faker.color.lab() // [0.832133, -80.3245, 100.1234] + * faker.color.lab({ format: 'css' }) // lab(29.2345% 39.3825 20.0664) + * faker.color.lab({ format: 'binary' }) // (8-32 bits x 3) + */ + lab(options?: { format?: StringColorFormat }): string; + /** + * Returns a LAB (CIELAB) color. + * + * @param options Options object. + * @param options.format Format of generated RGB color. Defaults to `'decimal'`. + * + * @example + * faker.color.lab() // [0.832133, -80.3245, 100.1234] + * faker.color.lab({ format: 'decimal' }) // [0.856773, -80.2345, 100.2341] + */ + lab(options?: { format?: NumberColorFormat }): number[]; + /** + * Returns a LAB (CIELAB) color. + * + * @param options Options object. + * @param options.format Format of generated RGB color. Defaults to `'decimal'`. + * + * @example + * faker.color.lab() // [0.832133, -80.3245, 100.1234] + * faker.color.lab({ format: 'decimal' }) // [0.856773, -80.2345, 100.2341] + * faker.color.lab({ format: 'css' }) // lab(29.2345% 39.3825 20.0664) + * faker.color.lab({ format: 'binary' }) // (8-32 bits x 3) + */ + lab(options?: { format?: ColorFormat }): string | number[]; + lab(options?: { format?: ColorFormat }): string | number[] { + const lab = [ + this.faker.datatype.float({ min: 0, max: 1, precision: 0.000001 }), + ]; + for (let i = 0; i < 2; i++) { + lab.push( + this.faker.datatype.float({ min: -100, max: 100, precision: 0.0001 }) + ); + } + return toColorFormat(lab, options?.format || 'decimal', 'lab'); + } + + /** + * Returns an LCH color. Even though upper bound of + * chroma in LCH color space is theoretically unbounded, + * it is bounded to 230 as anything above will not + * make a noticeable difference in the browser. + * + * @example + * faker.color.lch() // [0.522345, 72.2, 56.2] + */ + lch(): number[]; + /** + * Returns an LCH color. Even though upper bound of + * chroma in LCH color space is theoretically unbounded, + * it is bounded to 230 as anything above will not + * make a noticeable difference in the browser. + * + * @param options Options object. + * @param options.format Format of generated RGB color. Defaults to `'decimal'`. + * + * @example + * faker.color.lch() // [0.522345, 72.2, 56.2] + * faker.color.lch({ format: 'css' }) // lch(52.2345% 72.2 56.2) + * faker.color.lch({ format: 'binary' }) // (8-32 bits x 3) + */ + lch(options?: { format?: StringColorFormat }): string; + /** + * Returns an LCH color. Even though upper bound of + * chroma in LCH color space is theoretically unbounded, + * it is bounded to 230 as anything above will not + * make a noticeable difference in the browser. + * + * @param options Options object. + * @param options.format Format of generated RGB color. Defaults to `'decimal'`. + * + * @example + * faker.color.lch() // [0.522345, 72.2, 56.2] + * faker.color.lch({ format: 'decimal' }) // [0.522345, 72.2, 56.2] + */ + lch(options?: { format?: NumberColorFormat }): number[]; + /** + * Returns an LCH color. Even though upper bound of + * chroma in LCH color space is theoretically unbounded, + * it is bounded to 230 as anything above will not + * make a noticeable difference in the browser. + * + * @param options Options object. + * @param options.format Format of generated RGB color. Defaults to `'decimal'`. + * + * @example + * faker.color.lch() // [0.522345, 72.2, 56.2] + * faker.color.lch({ format: 'decimal' }) // [0.522345, 72.2, 56.2] + * faker.color.lch({ format: 'css' }) // lch(52.2345% 72.2 56.2) + * faker.color.lch({ format: 'binary' }) // (8-32 bits x 3) + */ + lch(options?: { format?: ColorFormat }): string | number[]; + lch(options?: { format?: ColorFormat }): string | number[] { + const lch = [ + this.faker.datatype.float({ min: 0, max: 1, precision: 0.000001 }), + ]; + for (let i = 0; i < 2; i++) { + lch.push( + this.faker.datatype.number({ min: 0, max: 230, precision: 0.1 }) + ); + } + return toColorFormat(lch, options?.format || 'decimal', 'lch'); + } + + /** + * Returns a random color based on CSS color space specified. + * + * @example + * faker.color.colorByCSSColorSpace() // [0.93, 1, 0.82] + */ + colorByCSSColorSpace(): number[]; + /** + * Returns a random color based on CSS color space specified. + * + * @param options Options object. + * @param options.format Format of generated RGB color. Defaults to `'decimal'`. + * @param options.space Color space to generate the color for. Defaults to `'sRGB'`. + * + * @example + * faker.color.colorByCSSColorSpace() // [0.93, 1, 0.82] + * faker.color.colorByCSSColorSpace({ format: 'css', space: 'display-p3' }) // color(display-p3 0.12 1 0.23) + * faker.color.colorByCSSColorSpace({ format: 'binary' }) // (8-32 bits x 3) + */ + colorByCSSColorSpace(options?: { + format?: StringColorFormat; + space?: CSSSpace; + }): string; + /** + * Returns a random color based on CSS color space specified. + * + * @param options Options object. + * @param options.format Format of generated RGB color. Defaults to `'decimal'`. + * @param options.space Color space to generate the color for. Defaults to `'sRGB'`. + * + * @example + * faker.color.colorByCSSColorSpace() // [0.93, 1, 0.82] + * faker.color.colorByCSSColorSpace({ format: 'decimal' }) // [0.12, 0.21, 0.31] + */ + colorByCSSColorSpace(options?: { + format?: NumberColorFormat; + space?: CSSSpace; + }): number[]; + /** + * Returns a random color based on CSS color space specified. + * + * @param options Options object. + * @param options.format Format of generated RGB color. Defaults to `'decimal'`. + * @param options.space Color space to generate the color for. Defaults to `'sRGB'`. + * + * @example + * faker.color.colorByCSSColorSpace() // [0.93, 1, 0.82] + * faker.color.colorByCSSColorSpace({ format: 'decimal' }) // [0.12, 0.21, 0.31] + * faker.color.colorByCSSColorSpace({ format: 'css', space: 'display-p3' }) // color(display-p3 0.12 1 0.23) + * faker.color.colorByCSSColorSpace({ format: 'binary' }) // (8-32 bits x 3) + */ + colorByCSSColorSpace(options?: { + format?: ColorFormat; + space?: CSSSpace; + }): string | number[]; + colorByCSSColorSpace(options?: { + format?: ColorFormat; + space?: CSSSpace; + }): string | number[] { + if (options?.format === 'css' && !options?.space) { + options = { ...options, space: 'sRGB' }; + } + const color = Array.from({ length: 3 }).map(() => + this.faker.datatype.float({ min: 0, max: 1, precision: 0.0001 }) + ); + return toColorFormat( + color, + options?.format || 'decimal', + 'color', + options?.space + ); + } +} diff --git a/src/modules/commerce/index.ts b/src/modules/commerce/index.ts index 71ce96d6155..d17c473bed6 100644 --- a/src/modules/commerce/index.ts +++ b/src/modules/commerce/index.ts @@ -1,4 +1,5 @@ -import type { Faker } from '../..'; +import type { Faker } from '../../faker'; +import { deprecated } from '../../internal/deprecated'; /** * Module to generate commerce and product related entries. @@ -19,11 +20,17 @@ export class Commerce { * * @example * faker.commerce.color() // 'red' + * + * @deprecated */ color(): string { - return this.faker.helpers.arrayElement( - this.faker.definitions.commerce.color - ); + deprecated({ + deprecated: 'faker.commerce.color()', + proposed: 'faker.color.human()', + since: 'v7.0.0', + until: 'v8.0.0', + }); + return this.faker.color.human(); } /** diff --git a/src/modules/random/index.ts b/src/modules/random/index.ts index 57783c9bbf8..616dc4dd371 100644 --- a/src/modules/random/index.ts +++ b/src/modules/random/index.ts @@ -121,7 +121,7 @@ export class Random { this.faker.commerce.productAdjective, this.faker.commerce.productMaterial, this.faker.commerce.product, - this.faker.commerce.color, + this.faker.color.human, this.faker.company.catchPhraseAdjective, this.faker.company.catchPhraseDescriptor, diff --git a/src/modules/vehicle/index.ts b/src/modules/vehicle/index.ts index fb5cd9f9e91..903dab539e8 100644 --- a/src/modules/vehicle/index.ts +++ b/src/modules/vehicle/index.ts @@ -97,7 +97,7 @@ export class Vehicle { * faker.vehicle.color() // 'red' */ color(): string { - return this.faker.commerce.color(); + return this.faker.color.human(); } /** diff --git a/test/color.spec.ts b/test/color.spec.ts new file mode 100644 index 00000000000..9d438291783 --- /dev/null +++ b/test/color.spec.ts @@ -0,0 +1,475 @@ +import { afterEach, describe, expect, it } from 'vitest'; +import { faker } from '../src'; +import { CSS_FUNCTIONS, CSS_SPACES } from '../src/modules/color'; + +const seededRuns = [ + { + seed: 42, + expectations: { + human: 'grey', + space: 'Rec. 709', + cssSupportedFunction: 'hsla', + cssSupportedSpace: 'rec2020', + rgb: '#8be4ab', + hsl: [135, 0.8, 0.96], + hwb: [135, 0.8, 0.96], + cmyk: [0.37, 0.8, 0.96, 0.18], + lab: [0.37454, 59.3086, 90.1429], + lch: [0.37454, 183.2, 218.7], + colorByCSSColorSpace: [0.3745, 0.7966, 0.9508], + }, + }, + { + seed: 1337, + expectations: { + human: 'black', + space: 'ProPhoto RGB Color Space', + cssSupportedFunction: 'hsl', + cssSupportedSpace: 'display-p3', + rgb: '#5c346b', + hsl: [94, 0.56, 0.16], + hwb: [94, 0.56, 0.16], + cmyk: [0.26, 0.56, 0.16, 0.21], + lab: [0.262024, 12.106, -68.2632], + lch: [0.262024, 128.9, 36.5], + colorByCSSColorSpace: [0.262, 0.5605, 0.1586], + }, + }, + { + seed: 1211, + expectations: { + human: 'azure', + space: 'LMS', + cssSupportedFunction: 'color', + cssSupportedSpace: 'rec2020', + rgb: '#eadb42', + hsl: [335, 0.46, 0.9], + hwb: [335, 0.46, 0.9], + cmyk: [0.93, 0.46, 0.9, 0.78], + lab: [0.928521, -8.197, 78.6944], + lch: [0.928521, 105.6, 205.5], + colorByCSSColorSpace: [0.9286, 0.459, 0.8935], + }, + }, +]; + +const NON_SEEDED_BASED_RUN = 5; + +const functionNames = [ + 'human', + 'space', + 'cssSupportedFunction', + 'cssSupportedSpace', + 'rgb', + 'hsl', + 'hwb', + 'cmyk', + 'lab', + 'lch', + 'colorByCSSColorSpace', +]; + +describe('color', () => { + afterEach(() => { + faker.locale = 'en'; + }); + + for (const { seed, expectations } of seededRuns) { + describe(`seed: ${seed}`, () => { + for (const functionName of functionNames) { + it(`${functionName}()`, () => { + faker.seed(seed); + + const actual = faker.color[functionName](); + expect(actual).toEqual(expectations[functionName]); + }); + } + }); + } + + // Create and log-back the seed for debug purposes + faker.seed(Math.ceil(Math.random() * 1_000_000_000)); + + describe(`random seeded tests for seed ${JSON.stringify( + faker.seed() + )}`, () => { + for (let i = 1; i <= NON_SEEDED_BASED_RUN; i++) { + describe(`human()`, () => { + it('should return random human readable color from human color array', () => { + const color = faker.color.human(); + expect(faker.definitions.color.human).toContain(color); + }); + }); + + describe(`space()`, () => { + it('should return random color space from color space array', () => { + const space = faker.color.space(); + expect(faker.definitions.color.space).toContain(space); + }); + }); + + describe(`cssSupportedFunction()`, () => { + it('should return random css supported color function from css functions array', () => { + const func = faker.color.cssSupportedFunction(); + expect(CSS_FUNCTIONS).toContain(func); + }); + }); + + describe(`cssSupportedSpace()`, () => { + it('should return random css supported color space from css spaces array', () => { + const space = faker.color.cssSupportedSpace(); + expect(CSS_SPACES).toContain(space); + }); + }); + + describe(`rgb()`, () => { + it('should return a random rgb hex color', () => { + const color = faker.color.rgb(); + expect(color).match(/^(#[a-f0-9]{6})$/); + }); + }); + + describe(`rgb({ prefix: '0x' })`, () => { + it('should return a random rgb hex color with # prefix', () => { + const color = faker.color.rgb({ prefix: '0x' }); + expect(color).match(/^(0x[a-f0-9]{6})$/); + }); + }); + + describe(`rgbHex({ prefix: '0x', case: 'lower' })`, () => { + it('should return a random rgb hex color with # prefix and lower case only', () => { + const color = faker.color.rgb({ prefix: '0x', casing: 'lower' }); + expect(color).match(/^(0x[a-f0-9]{6})$/); + }); + }); + + describe(`rgb({ prefix: '0x', case: 'upper' })`, () => { + it('should return a random rgb hex color with # prefix and upper case only', () => { + const color = faker.color.rgb({ prefix: '0x', casing: 'upper' }); + expect(color).match(/^(0x[A-F0-9]{6})$/); + }); + }); + + describe(`rgb({ format: 'decimal' })`, () => { + it('should return a random rgb color in decimal format', () => { + const color = faker.color.rgb({ format: 'decimal' }); + expect(color).length(3); + color.forEach((value: number) => { + expect(value).toBeGreaterThanOrEqual(0); + expect(value).toBeLessThanOrEqual(255); + }); + }); + }); + + describe(`rgb({ format: 'css' })`, () => { + it('should return a random rgb color in css format', () => { + const color = faker.color.rgb({ format: 'css' }); + expect(color).match(/^(rgb\([0-9]{1,3}, [0-9]{1,3}, [0-9]{1,3}\))$/); + }); + }); + + describe(`rgb({ format: 'binary' })`, () => { + it('should return a random rgb color in binary format', () => { + const color = faker.color.rgb({ format: 'binary' }); + expect(color).match(/^([01]{8} [01]{8} [01]{8})$/); + }); + }); + + describe(`rgb({ includeAlpha: true })`, () => { + it('should return a random rgb color in hex format with alpha value', () => { + const color = faker.color.rgb({ includeAlpha: true }); + expect(color).match(/^(#[a-fA-F0-9]{8})$/); + }); + }); + + describe(`rgb({ format: 'decimal', includeAlpha: true })`, () => { + it('should return a random rgb color in hex format with alpha value', () => { + const color = faker.color.rgb({ + format: 'decimal', + includeAlpha: true, + }); + expect(color[color.length - 1]).toBeGreaterThanOrEqual(0); + expect(color[color.length - 1]).toBeLessThanOrEqual(1); + color.slice(0, 4).forEach((value: number) => { + expect(value).toBeGreaterThanOrEqual(0); + expect(value).toBeLessThanOrEqual(255); + }); + }); + }); + + describe(`rgb({ format: 'binary', includeAlpha: true })`, () => { + it('should return a random rgb color in binary format with alpha value', () => { + const color = faker.color.rgb({ + format: 'binary', + includeAlpha: true, + }); + expect(color).match(/^([01]{8} [01]{8} [01]{8} [01]{8,32})$/); + }); + }); + + describe(`rgb({ format: 'css', includeAlpha: true })`, () => { + it('should return a random rgb color in css format with alpha value', () => { + const color = faker.color.rgb({ format: 'css', includeAlpha: true }); + expect(color).match( + /^(rgba\([0-9]{1,3}, [0-9]{1,3}, [0-9]{1,3}, \d*\.?\d*\))$/ + ); + }); + }); + + describe(`cmyk()`, () => { + it('should return a random cmyk color', () => { + const color = faker.color.cmyk(); + expect(color).length(4); + color.forEach((value: number) => { + expect(value).toBeGreaterThanOrEqual(0); + expect(value).toBeLessThanOrEqual(1); + }); + }); + }); + + describe(`cmyk({ format: 'decimal' })`, () => { + it('should return a random cmyk color in decimal format', () => { + const color = faker.color.cmyk({ format: 'decimal' }); + expect(color).length(4); + color.forEach((value: number) => { + expect(value).toBeGreaterThanOrEqual(0); + expect(value).toBeLessThanOrEqual(1); + }); + }); + }); + + describe(`cmyk({ format: 'css' })`, () => { + it('should return a random cmyk color in css format', () => { + const color = faker.color.cmyk({ format: 'css' }); + expect(color).match( + /^(cmyk\([0-9]{1,3}%, [0-9]{1,3}%, [0-9]{1,3}%, [0-9]{1,3}%\))$/ + ); + }); + }); + + describe(`cmyk({ format: 'binary' })`, () => { + it('should return a random cmyk color in binary format', () => { + const color = faker.color.cmyk({ format: 'binary' }); + expect(color).match( + /^([01]{8,32} [01]{8,32} [01]{8,32} [01]{8,32})$/ + ); + }); + }); + + describe(`hsl()`, () => { + it('should return a random hsl color in decimal format', () => { + const color = faker.color.hsl(); + expect(color).length(3); + expect(color[0]).toBeGreaterThanOrEqual(0); + expect(color[0]).toBeLessThanOrEqual(360); + color.slice(1).forEach((value: number) => { + expect(value).toBeGreaterThanOrEqual(0); + expect(value).toBeLessThanOrEqual(1); + }); + }); + }); + + describe(`hsl({ format: 'css' })`, () => { + it('should return a random hsl color in css format', () => { + const color = faker.color.hsl({ format: 'css' }); + expect(color).match( + /^(hsl\([0-9]{1,3}deg [0-9]{1,3}% [0-9]{1,3}%\))$/ + ); + }); + }); + + describe(`hsl({ format: 'css', includeAlpha: true })`, () => { + it('should return a random hsl color in css format with an alpha value', () => { + const color = faker.color.hsl({ format: 'css', includeAlpha: true }); + expect(color).match( + /^(hsl\([0-9]{1,3}deg [0-9]{1,3}% [0-9]{1,3}% \/ \d*\.?\d*\))$/ + ); + }); + }); + + describe(`hsl({ format: 'binary' })`, () => { + it('should return a random hsl color in binary format', () => { + const color = faker.color.hsl({ format: 'binary' }); + expect(color).match(/^([01]{8,32} [01]{8,32} [01]{8,32})$/); + }); + }); + + describe(`hsl({ format: 'binary', includeAlpha: true })`, () => { + it('should return a random hsl color in binary format with an alpha value', () => { + const color = faker.color.hsl({ + format: 'binary', + includeAlpha: true, + }); + expect(color).match( + /^([01]{8,32} [01]{8,32} [01]{8,32} [01]{8,32})$/ + ); + }); + }); + + describe(`hwb()`, () => { + it('should return a random hwb color in decimal format', () => { + const color = faker.color.hwb(); + expect(color).length(3); + expect(color[0]).toBeGreaterThanOrEqual(0); + expect(color[0]).toBeLessThanOrEqual(360); + color.slice(1).forEach((value: number) => { + expect(value).toBeGreaterThanOrEqual(0); + expect(value).toBeLessThanOrEqual(1); + }); + }); + }); + + describe(`hwb({ format: 'decimal' })`, () => { + it('should return a random hwb color in decimal format', () => { + const color = faker.color.hwb(); + expect(color).length(3); + expect(color[0]).toBeGreaterThanOrEqual(0); + expect(color[0]).toBeLessThanOrEqual(360); + color.slice(1).forEach((value: number) => { + expect(value).toBeGreaterThanOrEqual(0); + expect(value).toBeLessThanOrEqual(1); + }); + }); + }); + + describe(`hwb({ format: 'css' })`, () => { + it('should return a random hwb color in css format', () => { + const color = faker.color.hwb({ format: 'css' }); + expect(color).match(/^(hwb\([0-9]{1,3} [0-9]{1,3}% [0-9]{1,3}%\))$/); + }); + }); + + describe(`hwb({ format: 'binary' })`, () => { + it('should return a random hwb color in binary format', () => { + const color = faker.color.hwb({ format: 'binary' }); + expect(color).match(/^([01]{8,32} [01]{8,32} [01]{8,32})$/); + }); + }); + + describe(`lab()`, () => { + it('should return a random lab color in decimal format', () => { + const color = faker.color.lab(); + expect(color).length(3); + expect(color[0]).toBeGreaterThanOrEqual(0); + expect(color[0]).toBeLessThanOrEqual(1); + color.forEach((value: number) => { + expect(value).toBeGreaterThanOrEqual(-100); + expect(value).toBeLessThanOrEqual(100); + }); + }); + }); + + describe(`lab({ format: 'decimal' })`, () => { + it('should return a random lab color in decimal format', () => { + const color = faker.color.lab({ format: 'decimal' }); + expect(color).length(3); + expect(color[0]).toBeGreaterThanOrEqual(0); + expect(color[0]).toBeLessThanOrEqual(1); + color.forEach((value: number) => { + expect(value).toBeGreaterThanOrEqual(-100); + expect(value).toBeLessThanOrEqual(100); + }); + }); + }); + + describe(`lab({ format: 'css' })`, () => { + it('should return a random lab color in css format', () => { + const color = faker.color.lab({ format: 'css' }); + expect(color).match( + /^(lab\((\d*\.?\d*|[0-9]{1,3})% -?\d*\.?\d* -?\d*\.?\d*\))$/ + ); + }); + }); + + describe(`lab({ format: 'binary' })`, () => { + it('should return a random lab color in binary format', () => { + const color = faker.color.lab({ format: 'binary' }); + expect(color).match(/^([01]{8,32} [01]{8,32} [01]{8,32})$/); + }); + }); + + describe(`lch()`, () => { + it('should return a random lch color in decimal format', () => { + const color = faker.color.lch(); + expect(color).length(3); + expect(color[0]).toBeGreaterThanOrEqual(0); + expect(color[0]).toBeLessThanOrEqual(1); + color.forEach((value: number) => { + expect(value).toBeGreaterThanOrEqual(0); + expect(value).toBeLessThanOrEqual(230); + }); + }); + }); + + describe(`lch({ format: 'decimal' })`, () => { + it('should return a random lch color in decimal format', () => { + const color = faker.color.lch({ format: 'decimal' }); + expect(color).length(3); + expect(color[0]).toBeGreaterThanOrEqual(0); + expect(color[0]).toBeLessThanOrEqual(1); + color.forEach((value: number) => { + expect(value).toBeGreaterThanOrEqual(0); + expect(value).toBeLessThanOrEqual(230); + }); + }); + }); + + describe(`lch({ format: 'css' })`, () => { + it('should return a random lch color in css format', () => { + const color = faker.color.lch({ format: 'css' }); + expect(color).match( + /^(lch\((\d*\.?\d*|[0-9]{1,3})% \d*\.?\d* \d*\.?\d*\))$/ + ); + }); + }); + + describe(`lch({ format: 'binary' })`, () => { + it('should return a random lch color in binary format', () => { + const color = faker.color.lch({ format: 'binary' }); + expect(color).match(/^([01]{8,32} [01]{8,32} [01]{8,32})$/); + }); + }); + + describe(`colorByCSSColorSpace()`, () => { + it('should return a random color for a CSS color space in decimal format', () => { + const color = faker.color.colorByCSSColorSpace(); + expect(color).length(3); + color.forEach((value: number) => { + expect(value).toBeGreaterThanOrEqual(0); + expect(value).toBeLessThanOrEqual(1); + }); + }); + }); + + describe(`colorByCSSColorSpace({ format: 'decimal' })`, () => { + it('should return a random color for a CSS color space in decimal format', () => { + const color = faker.color.colorByCSSColorSpace({ format: 'decimal' }); + expect(color).length(3); + color.forEach((value: number) => { + expect(value).toBeGreaterThanOrEqual(0); + expect(value).toBeLessThanOrEqual(1); + }); + }); + }); + + describe(`colorByCSSColorSpace({ format: 'css' })`, () => { + it('should return a random color for a CSS color space in css format', () => { + const color = faker.color.colorByCSSColorSpace({ + format: 'css', + space: 'prophoto-rgb', + }); + expect(color).match( + /^color\(prophoto-rgb \d*\.?\d* \d*\.?\d* \d*\.?\d*\)$/ + ); + }); + }); + + describe(`colorByCSSColorSpace({ format: 'binary' })`, () => { + it('should return a random color for a CSS color space in binary format', () => { + const color = faker.color.colorByCSSColorSpace({ format: 'binary' }); + expect(color).match(/^([01]{8,32} [01]{8,32} [01]{8,32})$/); + }); + }); + } + }); +}); diff --git a/test/commerce.spec.ts b/test/commerce.spec.ts index 87385aa7903..383b0a41c31 100644 --- a/test/commerce.spec.ts +++ b/test/commerce.spec.ts @@ -84,7 +84,7 @@ describe('commerce', () => { describe(`color()`, () => { it('should return random value from color array', () => { const actual = faker.commerce.color(); - expect(faker.definitions.commerce.color).toContain(actual); + expect(faker.definitions.color.human).toContain(actual); }); }); diff --git a/test/vehicle.spec.ts b/test/vehicle.spec.ts index d6440814bb7..a9c69b0a3d3 100644 --- a/test/vehicle.spec.ts +++ b/test/vehicle.spec.ts @@ -161,7 +161,7 @@ describe('vehicle', () => { expect(color).toBeTruthy(); expect(color).toBeTypeOf('string'); - expect(faker.definitions.commerce.color).toContain(color); + expect(faker.definitions.color.human).toContain(color); }); });