From c5a100bfd08f4bea480ee334de968c8c81a56b25 Mon Sep 17 00:00:00 2001 From: Eric Cheng Date: Sun, 7 Aug 2022 18:30:35 -0400 Subject: [PATCH 01/16] feat: `datatype.hexadecimal` signature change --- src/modules/datatype/index.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/modules/datatype/index.ts b/src/modules/datatype/index.ts index 347013681b5..8bbbde43911 100644 --- a/src/modules/datatype/index.ts +++ b/src/modules/datatype/index.ts @@ -187,13 +187,18 @@ export class Datatype { /** * Returns a [hexadecimal](https://en.wikipedia.org/wiki/Hexadecimal) number. * - * @param length Length of the generated number. Defaults to `1`. + * @param options The optional options object. + * @param options.length Length of the generated number. Defaults to `1`. + * @param options.prefix Prefix for the generated number. Defaults to `''`. * * @example * faker.datatype.hexadecimal() // '0xb' * faker.datatype.hexadecimal(10) // '0xaE13F044fb' */ - hexadecimal(length = 1): string { + hexadecimal(options?: { length?: number; prefix?: string }): string { + const length = options?.length ?? 1; + const prefix = options?.prefix ?? ''; + let wholeString = ''; for (let i = 0; i < length; i++) { @@ -223,7 +228,7 @@ export class Datatype { ]); } - return `0x${wholeString}`; + return `${prefix}${wholeString}`; } /** From 92129229dfbff3168a6c49461f20e8b919b131af Mon Sep 17 00:00:00 2001 From: Eric Cheng Date: Sun, 7 Aug 2022 19:11:57 -0400 Subject: [PATCH 02/16] chore: update hex func examples with new params --- src/modules/datatype/index.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/modules/datatype/index.ts b/src/modules/datatype/index.ts index 8bbbde43911..6bb62268041 100644 --- a/src/modules/datatype/index.ts +++ b/src/modules/datatype/index.ts @@ -192,8 +192,10 @@ export class Datatype { * @param options.prefix Prefix for the generated number. Defaults to `''`. * * @example - * faker.datatype.hexadecimal() // '0xb' - * faker.datatype.hexadecimal(10) // '0xaE13F044fb' + * faker.datatype.hexadecimal() // 'b' + * faker.datatype.hexadecimal({ length: 10 }) // 'aE13F044fb' + * faker.datatype.hexadecimal({ prefix: '0x' }) // '0xE' + * faker.datatype.hexadecimal({ length: 10, prefix: '0x' }) // '0xz12a974fb1' */ hexadecimal(options?: { length?: number; prefix?: string }): string { const length = options?.length ?? 1; From 4626e4391cc43ea1e5e5a73581569d3c4e53e4c8 Mon Sep 17 00:00:00 2001 From: Eric Cheng Date: Sun, 7 Aug 2022 19:13:26 -0400 Subject: [PATCH 03/16] chore: update `datatype.hexadecimal` func calls --- src/modules/color/index.ts | 4 +++- src/modules/database/index.ts | 3 +-- src/modules/finance/index.ts | 4 +++- test/datatype.spec.ts | 12 ++++++------ 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/modules/color/index.ts b/src/modules/color/index.ts index 8b5fdba277c..921edaac5e5 100644 --- a/src/modules/color/index.ts +++ b/src/modules/color/index.ts @@ -297,7 +297,9 @@ export class Color { let color: string | number[]; let cssFunction: CSSFunction = 'rgb'; if (format === 'hex') { - color = this.faker.datatype.hexadecimal(includeAlpha ? 8 : 6).slice(2); + color = this.faker.datatype + .hexadecimal({ length: includeAlpha ? 8 : 6, prefix }) + .slice(prefix.length); color = formatHexColor(color, options); return color; } diff --git a/src/modules/database/index.ts b/src/modules/database/index.ts index 073d3f8a1dd..b887cc610e4 100644 --- a/src/modules/database/index.ts +++ b/src/modules/database/index.ts @@ -69,7 +69,6 @@ export class Database { * faker.database.mongodbObjectId() // 'e175cac316a79afdd0ad3afb' */ mongodbObjectId(): string { - // strip the "0x" from the hexadecimal output - return this.faker.datatype.hexadecimal(24).replace('0x', '').toLowerCase(); + return this.faker.datatype.hexadecimal({ length: 24 }).toLowerCase(); } } diff --git a/src/modules/finance/index.ts b/src/modules/finance/index.ts index 7085ea3654c..02f20f624e9 100644 --- a/src/modules/finance/index.ts +++ b/src/modules/finance/index.ts @@ -321,7 +321,9 @@ export class Finance { * faker.finance.ethereumAddress() // '0xf03dfeecbafc5147241cc4c4ca20b3c9dfd04c4a' */ ethereumAddress(): string { - const address = this.faker.datatype.hexadecimal(40).toLowerCase(); + const address = this.faker.datatype + .hexadecimal({ length: 40, prefix: '0x' }) + .toLowerCase(); return address; } diff --git a/test/datatype.spec.ts b/test/datatype.spec.ts index 56d4ea17f27..0de756b5465 100644 --- a/test/datatype.spec.ts +++ b/test/datatype.spec.ts @@ -59,7 +59,7 @@ describe('datatype', () => { t.itRepeated('boolean', 5); t.describe('hexadecimal', (t) => { - t.it('noArgs').it('with length', 42); + t.it('noArgs').it('with length', { length: 42 }); }); t.it('json'); @@ -323,14 +323,14 @@ describe('datatype', () => { describe('hexadecimal', () => { it('generates single hex character when no additional argument was provided', () => { const hex = faker.datatype.hexadecimal(); - expect(hex).toMatch(/^(0x)[0-9a-f]{1}$/i); - expect(hex.substring(2)).toHaveLength(1); + expect(hex).toMatch(/^[0-9a-f]{1}$/i); + expect(hex).toHaveLength(1); }); it('generates a random hex string', () => { - const hex = faker.datatype.hexadecimal(5); - expect(hex).toMatch(/^(0x)[0-9a-f]+$/i); - expect(hex.substring(2)).toHaveLength(5); + const hex = faker.datatype.hexadecimal({ length: 5 }); + expect(hex).toMatch(/^[0-9a-f]+$/i); + expect(hex).toHaveLength(5); }); }); From bf26ea703218dc5214997f81a05744c91f0651f1 Mon Sep 17 00:00:00 2001 From: Eric Cheng Date: Sun, 7 Aug 2022 19:14:21 -0400 Subject: [PATCH 04/16] test: update existing hexadecimal snapshot tests --- test/__snapshots__/datatype.spec.ts.snap | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/__snapshots__/datatype.spec.ts.snap b/test/__snapshots__/datatype.spec.ts.snap index e7b8e414320..6a722c60011 100644 --- a/test/__snapshots__/datatype.spec.ts.snap +++ b/test/__snapshots__/datatype.spec.ts.snap @@ -70,9 +70,9 @@ exports[`datatype > 42 > float > with min and max 1`] = `-0.43`; exports[`datatype > 42 > float > with min, max and precision 1`] = `-0.4261`; -exports[`datatype > 42 > hexadecimal > noArgs 1`] = `"0x8"`; +exports[`datatype > 42 > hexadecimal > noArgs 1`] = `"8"`; -exports[`datatype > 42 > hexadecimal > with length 1`] = `"0x8BE4ABdd39321aD7d3fe01FfCE404F4d6db0906bd8"`; +exports[`datatype > 42 > hexadecimal > with length 1`] = `"8BE4ABdd39321aD7d3fe01FfCE404F4d6db0906bd8"`; exports[`datatype > 42 > json 1`] = `"{\\"foo\\":79654,\\"bar\\":\\"2eiXX/J/*&\\",\\"bike\\":86617,\\"a\\":60111,\\"b\\":70807,\\"name\\":\\"\\\\\\"&{dnx4!1}\\",\\"prop\\":61748}"`; @@ -180,9 +180,9 @@ exports[`datatype > 1211 > float > with min and max 1`] = `61.07`; exports[`datatype > 1211 > float > with min, max and precision 1`] = `61.0658`; -exports[`datatype > 1211 > hexadecimal > noArgs 1`] = `"0xE"`; +exports[`datatype > 1211 > hexadecimal > noArgs 1`] = `"E"`; -exports[`datatype > 1211 > hexadecimal > with length 1`] = `"0xEaDB42F0e3f4A973fAB0AeefCE96DFCF49cD438dF9"`; +exports[`datatype > 1211 > hexadecimal > with length 1`] = `"EaDB42F0e3f4A973fAB0AeefCE96DFCF49cD438dF9"`; exports[`datatype > 1211 > json 1`] = `"{\\"foo\\":\\"Kti5-}$_/\`\\",\\"bar\\":76408,\\"bike\\":35403,\\"a\\":69406,\\"b\\":\\"l\\\\\\"h^]dnwI<\\",\\"name\\":\\"|p|5KWu3/C\\",\\"prop\\":\\"|Jh!E=x\\\\\\"RH\\"}"`; @@ -290,9 +290,9 @@ exports[`datatype > 1337 > float > with min and max 1`] = `-12.92`; exports[`datatype > 1337 > float > with min, max and precision 1`] = `-12.9153`; -exports[`datatype > 1337 > hexadecimal > noArgs 1`] = `"0x5"`; +exports[`datatype > 1337 > hexadecimal > noArgs 1`] = `"5"`; -exports[`datatype > 1337 > hexadecimal > with length 1`] = `"0x5c346ba075bd57F5A62B82d72AF39CBBB07a98cbA8"`; +exports[`datatype > 1337 > hexadecimal > with length 1`] = `"5c346ba075bd57F5A62B82d72AF39CBBB07a98cbA8"`; exports[`datatype > 1337 > json 1`] = `"{\\"foo\\":56052,\\"bar\\":21258,\\"bike\\":54308,\\"a\\":3397,\\"b\\":23538,\\"name\\":\\"X9@{:e=+kD\\",\\"prop\\":62850}"`; From e910c4e720f868a51cec3c87fe646ee7ec74e578 Mon Sep 17 00:00:00 2001 From: Eric Cheng Date: Sun, 7 Aug 2022 19:19:38 -0400 Subject: [PATCH 05/16] test: add seeded tests for new params --- test/__snapshots__/datatype.spec.ts.snap | 12 ++++++++++++ test/datatype.spec.ts | 5 ++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/test/__snapshots__/datatype.spec.ts.snap b/test/__snapshots__/datatype.spec.ts.snap index 6a722c60011..10f5d4b081c 100644 --- a/test/__snapshots__/datatype.spec.ts.snap +++ b/test/__snapshots__/datatype.spec.ts.snap @@ -74,6 +74,10 @@ exports[`datatype > 42 > hexadecimal > noArgs 1`] = `"8"`; exports[`datatype > 42 > hexadecimal > with length 1`] = `"8BE4ABdd39321aD7d3fe01FfCE404F4d6db0906bd8"`; +exports[`datatype > 42 > hexadecimal > with length and prefix 1`] = `"0x8BE4ABdd39321aD7d3fe"`; + +exports[`datatype > 42 > hexadecimal > with prefix 1`] = `"0x8"`; + exports[`datatype > 42 > json 1`] = `"{\\"foo\\":79654,\\"bar\\":\\"2eiXX/J/*&\\",\\"bike\\":86617,\\"a\\":60111,\\"b\\":70807,\\"name\\":\\"\\\\\\"&{dnx4!1}\\",\\"prop\\":61748}"`; exports[`datatype > 42 > number > noArgs 1`] = `37454`; @@ -184,6 +188,10 @@ exports[`datatype > 1211 > hexadecimal > noArgs 1`] = `"E"`; exports[`datatype > 1211 > hexadecimal > with length 1`] = `"EaDB42F0e3f4A973fAB0AeefCE96DFCF49cD438dF9"`; +exports[`datatype > 1211 > hexadecimal > with length and prefix 1`] = `"0xEaDB42F0e3f4A973fAB0"`; + +exports[`datatype > 1211 > hexadecimal > with prefix 1`] = `"0xE"`; + exports[`datatype > 1211 > json 1`] = `"{\\"foo\\":\\"Kti5-}$_/\`\\",\\"bar\\":76408,\\"bike\\":35403,\\"a\\":69406,\\"b\\":\\"l\\\\\\"h^]dnwI<\\",\\"name\\":\\"|p|5KWu3/C\\",\\"prop\\":\\"|Jh!E=x\\\\\\"RH\\"}"`; exports[`datatype > 1211 > number > noArgs 1`] = `92852`; @@ -294,6 +302,10 @@ exports[`datatype > 1337 > hexadecimal > noArgs 1`] = `"5"`; exports[`datatype > 1337 > hexadecimal > with length 1`] = `"5c346ba075bd57F5A62B82d72AF39CBBB07a98cbA8"`; +exports[`datatype > 1337 > hexadecimal > with length and prefix 1`] = `"0x5c346ba075bd57F5A62B"`; + +exports[`datatype > 1337 > hexadecimal > with prefix 1`] = `"0x5"`; + exports[`datatype > 1337 > json 1`] = `"{\\"foo\\":56052,\\"bar\\":21258,\\"bike\\":54308,\\"a\\":3397,\\"b\\":23538,\\"name\\":\\"X9@{:e=+kD\\",\\"prop\\":62850}"`; exports[`datatype > 1337 > number > noArgs 1`] = `26202`; diff --git a/test/datatype.spec.ts b/test/datatype.spec.ts index 0de756b5465..4bceb06f595 100644 --- a/test/datatype.spec.ts +++ b/test/datatype.spec.ts @@ -59,7 +59,10 @@ describe('datatype', () => { t.itRepeated('boolean', 5); t.describe('hexadecimal', (t) => { - t.it('noArgs').it('with length', { length: 42 }); + t.it('noArgs') + .it('with length', { length: 42 }) + .it('with prefix', { prefix: '0x' }) + .it('with length and prefix', { length: 20, prefix: '0x' }); }); t.it('json'); From ff400539734c5de2f97cf5e71ec4fda8097eba1b Mon Sep 17 00:00:00 2001 From: Eric Cheng Date: Sun, 7 Aug 2022 19:32:30 -0400 Subject: [PATCH 06/16] test: add unseeded tests for new params --- test/datatype.spec.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/test/datatype.spec.ts b/test/datatype.spec.ts index 4bceb06f595..298bc9760f0 100644 --- a/test/datatype.spec.ts +++ b/test/datatype.spec.ts @@ -330,11 +330,26 @@ describe('datatype', () => { expect(hex).toHaveLength(1); }); - it('generates a random hex string', () => { + it('generates a random hex string with a provided length', () => { const hex = faker.datatype.hexadecimal({ length: 5 }); expect(hex).toMatch(/^[0-9a-f]+$/i); expect(hex).toHaveLength(5); }); + + it('generates a hex string with a provided prefix', () => { + const hex = faker.datatype.hexadecimal({ prefix: '0x' }); + expect(hex).toMatch(/^(0x)[0-9a-f]+$/i); + expect(hex).toHaveLength(3); + }); + + it('generates a hex string with a provided prefix and length', () => { + const hex = faker.datatype.hexadecimal({ + prefix: '0x', + length: 7, + }); + expect(hex).toMatch(/^(0x)[0-9a-f]+$/i); + expect(hex.substring(2)).toHaveLength(7); + }); }); describe('json', () => { From 7894387bb773e86286b1d93c18dd754864218ef6 Mon Sep 17 00:00:00 2001 From: Eric Cheng Date: Mon, 8 Aug 2022 12:35:58 -0400 Subject: [PATCH 07/16] chore: rewrite func sig using deprecation workflow This should no longer be a breaking change. --- src/modules/datatype/index.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/modules/datatype/index.ts b/src/modules/datatype/index.ts index 6bb62268041..315f6937cfe 100644 --- a/src/modules/datatype/index.ts +++ b/src/modules/datatype/index.ts @@ -1,5 +1,6 @@ import type { Faker } from '../..'; import { FakerError } from '../../errors/faker-error'; +import { deprecated } from '../../internal/deprecated'; /** * Module to generate various primitive values and data types. @@ -197,7 +198,19 @@ export class Datatype { * faker.datatype.hexadecimal({ prefix: '0x' }) // '0xE' * faker.datatype.hexadecimal({ length: 10, prefix: '0x' }) // '0xz12a974fb1' */ - hexadecimal(options?: { length?: number; prefix?: string }): string { + hexadecimal(options?: { length?: number; prefix?: string } | number): string { + if (typeof options === 'number') { + deprecated({ + deprecated: 'faker.datatype.hexadecimal(length)', + proposed: 'faker.datatype.hexadecimal({ length })', + since: '7.4', + until: '8.0', + }); + options = { + length: options, + }; + } + const length = options?.length ?? 1; const prefix = options?.prefix ?? ''; From f93d6372a170cc970e600d96b7589538f442da3b Mon Sep 17 00:00:00 2001 From: Eric Cheng Date: Mon, 8 Aug 2022 12:55:05 -0400 Subject: [PATCH 08/16] feat: add `case` option --- src/modules/database/index.ts | 2 +- src/modules/datatype/index.ts | 22 +++++++++++++++++----- src/modules/finance/index.ts | 8 +++++--- 3 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/modules/database/index.ts b/src/modules/database/index.ts index b887cc610e4..5887ab097e5 100644 --- a/src/modules/database/index.ts +++ b/src/modules/database/index.ts @@ -69,6 +69,6 @@ export class Database { * faker.database.mongodbObjectId() // 'e175cac316a79afdd0ad3afb' */ mongodbObjectId(): string { - return this.faker.datatype.hexadecimal({ length: 24 }).toLowerCase(); + return this.faker.datatype.hexadecimal({ length: 24, case: 'lower' }); } } diff --git a/src/modules/datatype/index.ts b/src/modules/datatype/index.ts index 315f6937cfe..a0d1091eb17 100644 --- a/src/modules/datatype/index.ts +++ b/src/modules/datatype/index.ts @@ -191,14 +191,23 @@ export class Datatype { * @param options The optional options object. * @param options.length Length of the generated number. Defaults to `1`. * @param options.prefix Prefix for the generated number. Defaults to `''`. + * @param options.case Case of the generated number. Defaults to `'upper'`. * * @example - * faker.datatype.hexadecimal() // 'b' - * faker.datatype.hexadecimal({ length: 10 }) // 'aE13F044fb' + * faker.datatype.hexadecimal() // 'B' + * faker.datatype.hexadecimal({ length: 10 }) // 'AE13F044FB' * faker.datatype.hexadecimal({ prefix: '0x' }) // '0xE' - * faker.datatype.hexadecimal({ length: 10, prefix: '0x' }) // '0xz12a974fb1' + * faker.datatype.hexadecimal({ case: 'lower' }) // 'f' + * faker.datatype.hexadecimal({ length: 10, prefix: '0x' }) // '0F12A974FB1' + * faker.datatype.hexadecimal({ length: 10, case: 'lower' }) // 'eef38014fb' + * faker.datatype.hexadecimal({ prefix: '0x', case: 'lower' }) // '0xd' + * faker.datatype.hexadecimal({ length: 10, prefix: '0x', case: 'lower' }) // '0xfdc330a4b1' */ - hexadecimal(options?: { length?: number; prefix?: string } | number): string { + hexadecimal( + options?: + | { length?: number; prefix?: string; case?: 'lower' | 'upper' } + | number + ): string { if (typeof options === 'number') { deprecated({ deprecated: 'faker.datatype.hexadecimal(length)', @@ -213,6 +222,7 @@ export class Datatype { const length = options?.length ?? 1; const prefix = options?.prefix ?? ''; + const letterCase = options?.case ?? 'upper'; let wholeString = ''; @@ -243,7 +253,9 @@ export class Datatype { ]); } - return `${prefix}${wholeString}`; + return letterCase === 'upper' + ? `${prefix}${wholeString}`.toUpperCase() + : `${prefix}${wholeString}`.toLowerCase(); } /** diff --git a/src/modules/finance/index.ts b/src/modules/finance/index.ts index 02f20f624e9..f1b089e320c 100644 --- a/src/modules/finance/index.ts +++ b/src/modules/finance/index.ts @@ -321,9 +321,11 @@ export class Finance { * faker.finance.ethereumAddress() // '0xf03dfeecbafc5147241cc4c4ca20b3c9dfd04c4a' */ ethereumAddress(): string { - const address = this.faker.datatype - .hexadecimal({ length: 40, prefix: '0x' }) - .toLowerCase(); + const address = this.faker.datatype.hexadecimal({ + length: 40, + prefix: '0x', + case: 'lower', + }); return address; } From ef0b385105f9552d349b1131299b47a11cb57104 Mon Sep 17 00:00:00 2001 From: Eric Cheng Date: Mon, 8 Aug 2022 13:01:49 -0400 Subject: [PATCH 09/16] test: update hexadecimal tests for new param --- test/__snapshots__/datatype.spec.ts.snap | 24 +++++++++++++++--------- test/datatype.spec.ts | 12 ++++++++++-- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/test/__snapshots__/datatype.spec.ts.snap b/test/__snapshots__/datatype.spec.ts.snap index 10f5d4b081c..fbf2f1bdc18 100644 --- a/test/__snapshots__/datatype.spec.ts.snap +++ b/test/__snapshots__/datatype.spec.ts.snap @@ -72,11 +72,13 @@ exports[`datatype > 42 > float > with min, max and precision 1`] = `-0.4261`; exports[`datatype > 42 > hexadecimal > noArgs 1`] = `"8"`; -exports[`datatype > 42 > hexadecimal > with length 1`] = `"8BE4ABdd39321aD7d3fe01FfCE404F4d6db0906bd8"`; +exports[`datatype > 42 > hexadecimal > with casing 1`] = `"8"`; -exports[`datatype > 42 > hexadecimal > with length and prefix 1`] = `"0x8BE4ABdd39321aD7d3fe"`; +exports[`datatype > 42 > hexadecimal > with length 1`] = `"8BE4ABDD39321AD7D3FE01FFCE404F4D6DB0906BD8"`; -exports[`datatype > 42 > hexadecimal > with prefix 1`] = `"0x8"`; +exports[`datatype > 42 > hexadecimal > with length and prefix 1`] = `"0X8BE4ABDD39321AD7D3FE"`; + +exports[`datatype > 42 > hexadecimal > with prefix 1`] = `"0X8"`; exports[`datatype > 42 > json 1`] = `"{\\"foo\\":79654,\\"bar\\":\\"2eiXX/J/*&\\",\\"bike\\":86617,\\"a\\":60111,\\"b\\":70807,\\"name\\":\\"\\\\\\"&{dnx4!1}\\",\\"prop\\":61748}"`; @@ -186,11 +188,13 @@ exports[`datatype > 1211 > float > with min, max and precision 1`] = `61.0658`; exports[`datatype > 1211 > hexadecimal > noArgs 1`] = `"E"`; -exports[`datatype > 1211 > hexadecimal > with length 1`] = `"EaDB42F0e3f4A973fAB0AeefCE96DFCF49cD438dF9"`; +exports[`datatype > 1211 > hexadecimal > with casing 1`] = `"e"`; + +exports[`datatype > 1211 > hexadecimal > with length 1`] = `"EADB42F0E3F4A973FAB0AEEFCE96DFCF49CD438DF9"`; -exports[`datatype > 1211 > hexadecimal > with length and prefix 1`] = `"0xEaDB42F0e3f4A973fAB0"`; +exports[`datatype > 1211 > hexadecimal > with length and prefix 1`] = `"0XEADB42F0E3F4A973FAB0"`; -exports[`datatype > 1211 > hexadecimal > with prefix 1`] = `"0xE"`; +exports[`datatype > 1211 > hexadecimal > with prefix 1`] = `"0XE"`; exports[`datatype > 1211 > json 1`] = `"{\\"foo\\":\\"Kti5-}$_/\`\\",\\"bar\\":76408,\\"bike\\":35403,\\"a\\":69406,\\"b\\":\\"l\\\\\\"h^]dnwI<\\",\\"name\\":\\"|p|5KWu3/C\\",\\"prop\\":\\"|Jh!E=x\\\\\\"RH\\"}"`; @@ -300,11 +304,13 @@ exports[`datatype > 1337 > float > with min, max and precision 1`] = `-12.9153`; exports[`datatype > 1337 > hexadecimal > noArgs 1`] = `"5"`; -exports[`datatype > 1337 > hexadecimal > with length 1`] = `"5c346ba075bd57F5A62B82d72AF39CBBB07a98cbA8"`; +exports[`datatype > 1337 > hexadecimal > with casing 1`] = `"5"`; + +exports[`datatype > 1337 > hexadecimal > with length 1`] = `"5C346BA075BD57F5A62B82D72AF39CBBB07A98CBA8"`; -exports[`datatype > 1337 > hexadecimal > with length and prefix 1`] = `"0x5c346ba075bd57F5A62B"`; +exports[`datatype > 1337 > hexadecimal > with length and prefix 1`] = `"0X5C346BA075BD57F5A62B"`; -exports[`datatype > 1337 > hexadecimal > with prefix 1`] = `"0x5"`; +exports[`datatype > 1337 > hexadecimal > with prefix 1`] = `"0X5"`; exports[`datatype > 1337 > json 1`] = `"{\\"foo\\":56052,\\"bar\\":21258,\\"bike\\":54308,\\"a\\":3397,\\"b\\":23538,\\"name\\":\\"X9@{:e=+kD\\",\\"prop\\":62850}"`; diff --git a/test/datatype.spec.ts b/test/datatype.spec.ts index 298bc9760f0..dfbc105af5b 100644 --- a/test/datatype.spec.ts +++ b/test/datatype.spec.ts @@ -62,6 +62,7 @@ describe('datatype', () => { t.it('noArgs') .it('with length', { length: 42 }) .it('with prefix', { prefix: '0x' }) + .it('with casing', { case: 'lower' }) .it('with length and prefix', { length: 20, prefix: '0x' }); }); @@ -338,14 +339,21 @@ describe('datatype', () => { it('generates a hex string with a provided prefix', () => { const hex = faker.datatype.hexadecimal({ prefix: '0x' }); - expect(hex).toMatch(/^(0x)[0-9a-f]+$/i); + expect(hex).toMatch(/^(0x)[0-9A-F]+$/i); expect(hex).toHaveLength(3); }); - it('generates a hex string with a provided prefix and length', () => { + it('generates a hex string with a provided casing', () => { + const hex = faker.datatype.hexadecimal({ case: 'lower' }); + expect(hex).toMatch(/^[0-9a-f]+$/i); + expect(hex).toHaveLength(1); + }); + + it('generates a hex string with a provided prefix, length, and casing', () => { const hex = faker.datatype.hexadecimal({ prefix: '0x', length: 7, + case: 'lower', }); expect(hex).toMatch(/^(0x)[0-9a-f]+$/i); expect(hex.substring(2)).toHaveLength(7); From a030ff39e69a533955dbc332bf0f3a2ce326e0bb Mon Sep 17 00:00:00 2001 From: Eric Cheng Date: Mon, 8 Aug 2022 13:09:07 -0400 Subject: [PATCH 10/16] fix: only cast actual number to lowercase, not prefix --- src/modules/datatype/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/modules/datatype/index.ts b/src/modules/datatype/index.ts index a0d1091eb17..750313f36a2 100644 --- a/src/modules/datatype/index.ts +++ b/src/modules/datatype/index.ts @@ -254,8 +254,8 @@ export class Datatype { } return letterCase === 'upper' - ? `${prefix}${wholeString}`.toUpperCase() - : `${prefix}${wholeString}`.toLowerCase(); + ? `${prefix}${wholeString.toUpperCase()}` + : `${prefix}${wholeString.toLowerCase()}`; } /** From 0b177fef4d99064c4550eca22bb74f93b02c8d4f Mon Sep 17 00:00:00 2001 From: Eric Cheng Date: Mon, 8 Aug 2022 13:15:08 -0400 Subject: [PATCH 11/16] test: update seeded tests with new param --- test/__snapshots__/datatype.spec.ts.snap | 18 ++++++++++++------ test/datatype.spec.ts | 6 +++++- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/test/__snapshots__/datatype.spec.ts.snap b/test/__snapshots__/datatype.spec.ts.snap index fbf2f1bdc18..b527e10fdf6 100644 --- a/test/__snapshots__/datatype.spec.ts.snap +++ b/test/__snapshots__/datatype.spec.ts.snap @@ -76,9 +76,11 @@ exports[`datatype > 42 > hexadecimal > with casing 1`] = `"8"`; exports[`datatype > 42 > hexadecimal > with length 1`] = `"8BE4ABDD39321AD7D3FE01FFCE404F4D6DB0906BD8"`; -exports[`datatype > 42 > hexadecimal > with length and prefix 1`] = `"0X8BE4ABDD39321AD7D3FE"`; +exports[`datatype > 42 > hexadecimal > with length and prefix 1`] = `"0x8BE4ABDD39321AD7D3FE"`; -exports[`datatype > 42 > hexadecimal > with prefix 1`] = `"0X8"`; +exports[`datatype > 42 > hexadecimal > with length, prefix, and casing 1`] = `"0x8be4abdd39321ad7d3fe"`; + +exports[`datatype > 42 > hexadecimal > with prefix 1`] = `"0x8"`; exports[`datatype > 42 > json 1`] = `"{\\"foo\\":79654,\\"bar\\":\\"2eiXX/J/*&\\",\\"bike\\":86617,\\"a\\":60111,\\"b\\":70807,\\"name\\":\\"\\\\\\"&{dnx4!1}\\",\\"prop\\":61748}"`; @@ -192,9 +194,11 @@ exports[`datatype > 1211 > hexadecimal > with casing 1`] = `"e"`; exports[`datatype > 1211 > hexadecimal > with length 1`] = `"EADB42F0E3F4A973FAB0AEEFCE96DFCF49CD438DF9"`; -exports[`datatype > 1211 > hexadecimal > with length and prefix 1`] = `"0XEADB42F0E3F4A973FAB0"`; +exports[`datatype > 1211 > hexadecimal > with length and prefix 1`] = `"0xEADB42F0E3F4A973FAB0"`; + +exports[`datatype > 1211 > hexadecimal > with length, prefix, and casing 1`] = `"0xeadb42f0e3f4a973fab0"`; -exports[`datatype > 1211 > hexadecimal > with prefix 1`] = `"0XE"`; +exports[`datatype > 1211 > hexadecimal > with prefix 1`] = `"0xE"`; exports[`datatype > 1211 > json 1`] = `"{\\"foo\\":\\"Kti5-}$_/\`\\",\\"bar\\":76408,\\"bike\\":35403,\\"a\\":69406,\\"b\\":\\"l\\\\\\"h^]dnwI<\\",\\"name\\":\\"|p|5KWu3/C\\",\\"prop\\":\\"|Jh!E=x\\\\\\"RH\\"}"`; @@ -308,9 +312,11 @@ exports[`datatype > 1337 > hexadecimal > with casing 1`] = `"5"`; exports[`datatype > 1337 > hexadecimal > with length 1`] = `"5C346BA075BD57F5A62B82D72AF39CBBB07A98CBA8"`; -exports[`datatype > 1337 > hexadecimal > with length and prefix 1`] = `"0X5C346BA075BD57F5A62B"`; +exports[`datatype > 1337 > hexadecimal > with length and prefix 1`] = `"0x5C346BA075BD57F5A62B"`; + +exports[`datatype > 1337 > hexadecimal > with length, prefix, and casing 1`] = `"0x5c346ba075bd57f5a62b"`; -exports[`datatype > 1337 > hexadecimal > with prefix 1`] = `"0X5"`; +exports[`datatype > 1337 > hexadecimal > with prefix 1`] = `"0x5"`; exports[`datatype > 1337 > json 1`] = `"{\\"foo\\":56052,\\"bar\\":21258,\\"bike\\":54308,\\"a\\":3397,\\"b\\":23538,\\"name\\":\\"X9@{:e=+kD\\",\\"prop\\":62850}"`; diff --git a/test/datatype.spec.ts b/test/datatype.spec.ts index dfbc105af5b..22b5306ca03 100644 --- a/test/datatype.spec.ts +++ b/test/datatype.spec.ts @@ -63,7 +63,11 @@ describe('datatype', () => { .it('with length', { length: 42 }) .it('with prefix', { prefix: '0x' }) .it('with casing', { case: 'lower' }) - .it('with length and prefix', { length: 20, prefix: '0x' }); + .it('with length, prefix, and casing', { + length: 20, + prefix: '0x', + case: 'lower', + }); }); t.it('json'); From e88494a3fb21d6d0511d963a375c12d3130695df Mon Sep 17 00:00:00 2001 From: Eric Cheng Date: Mon, 8 Aug 2022 13:22:50 -0400 Subject: [PATCH 12/16] fix: typo in example --- src/modules/datatype/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/datatype/index.ts b/src/modules/datatype/index.ts index 750313f36a2..10047b4d472 100644 --- a/src/modules/datatype/index.ts +++ b/src/modules/datatype/index.ts @@ -198,7 +198,7 @@ export class Datatype { * faker.datatype.hexadecimal({ length: 10 }) // 'AE13F044FB' * faker.datatype.hexadecimal({ prefix: '0x' }) // '0xE' * faker.datatype.hexadecimal({ case: 'lower' }) // 'f' - * faker.datatype.hexadecimal({ length: 10, prefix: '0x' }) // '0F12A974FB1' + * faker.datatype.hexadecimal({ length: 10, prefix: '0x' }) // '0xF12A974FB1' * faker.datatype.hexadecimal({ length: 10, case: 'lower' }) // 'eef38014fb' * faker.datatype.hexadecimal({ prefix: '0x', case: 'lower' }) // '0xd' * faker.datatype.hexadecimal({ length: 10, prefix: '0x', case: 'lower' }) // '0xfdc330a4b1' From addfc252eceb1c69019e10103b3842c39826fe6b Mon Sep 17 00:00:00 2001 From: Eric Cheng Date: Mon, 8 Aug 2022 17:12:12 -0400 Subject: [PATCH 13/16] chore: apply code review suggestions from @ST-DDT Co-authored-by: ST-DDT --- src/modules/color/index.ts | 4 +--- src/modules/datatype/index.ts | 26 ++++++++++++------------ test/__snapshots__/datatype.spec.ts.snap | 12 +++-------- test/datatype.spec.ts | 4 ++-- 4 files changed, 19 insertions(+), 27 deletions(-) diff --git a/src/modules/color/index.ts b/src/modules/color/index.ts index 921edaac5e5..d64b7750545 100644 --- a/src/modules/color/index.ts +++ b/src/modules/color/index.ts @@ -297,9 +297,7 @@ export class Color { let color: string | number[]; let cssFunction: CSSFunction = 'rgb'; if (format === 'hex') { - color = this.faker.datatype - .hexadecimal({ length: includeAlpha ? 8 : 6, prefix }) - .slice(prefix.length); + color = this.faker.datatype.hexadecimal({ length: includeAlpha ? 8 : 6 }); color = formatHexColor(color, options); return color; } diff --git a/src/modules/datatype/index.ts b/src/modules/datatype/index.ts index 10047b4d472..63111f31849 100644 --- a/src/modules/datatype/index.ts +++ b/src/modules/datatype/index.ts @@ -195,18 +195,18 @@ export class Datatype { * * @example * faker.datatype.hexadecimal() // 'B' - * faker.datatype.hexadecimal({ length: 10 }) // 'AE13F044FB' + * faker.datatype.hexadecimal({ length: 10 }) // 'aE13d044cB' * faker.datatype.hexadecimal({ prefix: '0x' }) // '0xE' * faker.datatype.hexadecimal({ case: 'lower' }) // 'f' - * faker.datatype.hexadecimal({ length: 10, prefix: '0x' }) // '0xF12A974FB1' - * faker.datatype.hexadecimal({ length: 10, case: 'lower' }) // 'eef38014fb' + * faker.datatype.hexadecimal({ length: 10, prefix: '0x' }) // '0xf12a974eB1' + * faker.datatype.hexadecimal({ length: 10, case: 'upper' }) // 'E3F38014FB' * faker.datatype.hexadecimal({ prefix: '0x', case: 'lower' }) // '0xd' - * faker.datatype.hexadecimal({ length: 10, prefix: '0x', case: 'lower' }) // '0xfdc330a4b1' + * faker.datatype.hexadecimal({ length: 10, prefix: '0x', case: 'mixed' }) // '0xAdE330a4D1' */ hexadecimal( - options?: - | { length?: number; prefix?: string; case?: 'lower' | 'upper' } - | number + options: + | { length?: number; prefix?: string; case?: 'lower' | 'upper' | 'mixed' } + | number = {} ): string { if (typeof options === 'number') { deprecated({ @@ -220,9 +220,7 @@ export class Datatype { }; } - const length = options?.length ?? 1; - const prefix = options?.prefix ?? ''; - const letterCase = options?.case ?? 'upper'; + const { length = 1, prefix = '', case: letterCase = 'mixed' } = options; let wholeString = ''; @@ -253,9 +251,11 @@ export class Datatype { ]); } - return letterCase === 'upper' - ? `${prefix}${wholeString.toUpperCase()}` - : `${prefix}${wholeString.toLowerCase()}`; + return letterCase === 'mixed' + ? `${prefix}${wholeString}` + : letterCase === 'lower' + ? `${prefix}${wholeString.toLowerCase()}` + : `${prefix}${wholeString.toUpperCase()}`; } /** diff --git a/test/__snapshots__/datatype.spec.ts.snap b/test/__snapshots__/datatype.spec.ts.snap index b527e10fdf6..97f2d4c64e1 100644 --- a/test/__snapshots__/datatype.spec.ts.snap +++ b/test/__snapshots__/datatype.spec.ts.snap @@ -74,9 +74,7 @@ exports[`datatype > 42 > hexadecimal > noArgs 1`] = `"8"`; exports[`datatype > 42 > hexadecimal > with casing 1`] = `"8"`; -exports[`datatype > 42 > hexadecimal > with length 1`] = `"8BE4ABDD39321AD7D3FE01FFCE404F4D6DB0906BD8"`; - -exports[`datatype > 42 > hexadecimal > with length and prefix 1`] = `"0x8BE4ABDD39321AD7D3FE"`; +exports[`datatype > 42 > hexadecimal > with length 1`] = `"8BE4ABdd39321aD7d3fe01FfCE404F4d6db0906bd8"`; exports[`datatype > 42 > hexadecimal > with length, prefix, and casing 1`] = `"0x8be4abdd39321ad7d3fe"`; @@ -192,9 +190,7 @@ exports[`datatype > 1211 > hexadecimal > noArgs 1`] = `"E"`; exports[`datatype > 1211 > hexadecimal > with casing 1`] = `"e"`; -exports[`datatype > 1211 > hexadecimal > with length 1`] = `"EADB42F0E3F4A973FAB0AEEFCE96DFCF49CD438DF9"`; - -exports[`datatype > 1211 > hexadecimal > with length and prefix 1`] = `"0xEADB42F0E3F4A973FAB0"`; +exports[`datatype > 1211 > hexadecimal > with length 1`] = `"EaDB42F0e3f4A973fAB0AeefCE96DFCF49cD438dF9"`; exports[`datatype > 1211 > hexadecimal > with length, prefix, and casing 1`] = `"0xeadb42f0e3f4a973fab0"`; @@ -310,9 +306,7 @@ exports[`datatype > 1337 > hexadecimal > noArgs 1`] = `"5"`; exports[`datatype > 1337 > hexadecimal > with casing 1`] = `"5"`; -exports[`datatype > 1337 > hexadecimal > with length 1`] = `"5C346BA075BD57F5A62B82D72AF39CBBB07A98CBA8"`; - -exports[`datatype > 1337 > hexadecimal > with length and prefix 1`] = `"0x5C346BA075BD57F5A62B"`; +exports[`datatype > 1337 > hexadecimal > with length 1`] = `"5c346ba075bd57F5A62B82d72AF39CBBB07a98cbA8"`; exports[`datatype > 1337 > hexadecimal > with length, prefix, and casing 1`] = `"0x5c346ba075bd57f5a62b"`; diff --git a/test/datatype.spec.ts b/test/datatype.spec.ts index 22b5306ca03..a57139fdd0c 100644 --- a/test/datatype.spec.ts +++ b/test/datatype.spec.ts @@ -357,9 +357,9 @@ describe('datatype', () => { const hex = faker.datatype.hexadecimal({ prefix: '0x', length: 7, - case: 'lower', + case: 'upper', }); - expect(hex).toMatch(/^(0x)[0-9a-f]+$/i); + expect(hex).toMatch(/^(0x)[0-9A-F]+$/i); expect(hex.substring(2)).toHaveLength(7); }); }); From ec79eaf2099d6bf31b57b55423e7ec64734cd0a6 Mon Sep 17 00:00:00 2001 From: Eric Cheng Date: Mon, 8 Aug 2022 18:37:53 -0400 Subject: [PATCH 14/16] Update src/modules/datatype/index.ts Co-authored-by: ST-DDT --- src/modules/datatype/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/datatype/index.ts b/src/modules/datatype/index.ts index 63111f31849..7b3d7815f61 100644 --- a/src/modules/datatype/index.ts +++ b/src/modules/datatype/index.ts @@ -191,7 +191,7 @@ export class Datatype { * @param options The optional options object. * @param options.length Length of the generated number. Defaults to `1`. * @param options.prefix Prefix for the generated number. Defaults to `''`. - * @param options.case Case of the generated number. Defaults to `'upper'`. + * @param options.case Case of the generated number. Defaults to `'mixed'`. * * @example * faker.datatype.hexadecimal() // 'B' From b1a70549234afdcbd4e9939ded7387c0d2eaca68 Mon Sep 17 00:00:00 2001 From: Eric Cheng Date: Tue, 9 Aug 2022 10:33:58 -0400 Subject: [PATCH 15/16] Update src/modules/datatype/index.ts Co-authored-by: Shinigami --- src/modules/datatype/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/modules/datatype/index.ts b/src/modules/datatype/index.ts index 7b3d7815f61..db4e9cc73f3 100644 --- a/src/modules/datatype/index.ts +++ b/src/modules/datatype/index.ts @@ -212,7 +212,7 @@ export class Datatype { deprecated({ deprecated: 'faker.datatype.hexadecimal(length)', proposed: 'faker.datatype.hexadecimal({ length })', - since: '7.4', + since: '7.5', until: '8.0', }); options = { From 24ffdd9988e0d07e6abba7af41eccb6577943f22 Mon Sep 17 00:00:00 2001 From: Eric Cheng Date: Tue, 9 Aug 2022 18:29:07 -0400 Subject: [PATCH 16/16] chore: apply code review suggestion Co-authored-by: ST-DDT Co-authored-by: Shinigami --- src/modules/datatype/index.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/modules/datatype/index.ts b/src/modules/datatype/index.ts index db4e9cc73f3..671e8c6c53d 100644 --- a/src/modules/datatype/index.ts +++ b/src/modules/datatype/index.ts @@ -251,11 +251,13 @@ export class Datatype { ]); } - return letterCase === 'mixed' - ? `${prefix}${wholeString}` - : letterCase === 'lower' - ? `${prefix}${wholeString.toLowerCase()}` - : `${prefix}${wholeString.toUpperCase()}`; + if (letterCase === 'upper') { + wholeString = wholeString.toUpperCase(); + } else if (letterCase === 'lower') { + wholeString = wholeString.toLowerCase(); + } + + return `${prefix}${wholeString}`; } /**