From 9537dfddba882bd93d9a429697fd44bc72428426 Mon Sep 17 00:00:00 2001 From: DivisionByZero Date: Thu, 26 Sep 2024 17:50:05 +0200 Subject: [PATCH 1/4] infra: update file structure for util/internal (#3141) --- src/faker.ts | 4 +- src/index.ts | 8 ++-- src/{ => internal}/locale-proxy.ts | 4 +- src/internal/mersenne.ts | 48 ------------------- src/{utils => internal}/types.ts | 0 src/modules/date/index.ts | 2 +- src/modules/string/index.ts | 2 +- src/simple-faker.ts | 2 +- src/utils/mersenne.ts | 48 +++++++++++++++++++ test/{ => internal}/locale-proxy.spec.ts | 4 +- test/modules/number.spec.ts | 2 +- test/scripts/apidocs/method.example.ts | 2 +- .../scripts/apidocs/verify-jsdoc-tags.spec.ts | 2 +- test/support/seeded-runs.ts | 2 +- .../__snapshots__/mersenne.spec.ts.snap | 0 .../mersenne-test-utils.ts | 0 test/{internal => utils}/mersenne.spec.ts | 6 +-- 17 files changed, 68 insertions(+), 68 deletions(-) rename src/{ => internal}/locale-proxy.ts (96%) rename src/{utils => internal}/types.ts (100%) create mode 100644 src/utils/mersenne.ts rename test/{ => internal}/locale-proxy.spec.ts (98%) rename test/{internal => utils}/__snapshots__/mersenne.spec.ts.snap (100%) rename test/{internal => utils}/mersenne-test-utils.ts (100%) rename test/{internal => utils}/mersenne.spec.ts (97%) diff --git a/src/faker.ts b/src/faker.ts index 5f5e14ce392..7b7f5e162a3 100644 --- a/src/faker.ts +++ b/src/faker.ts @@ -1,8 +1,8 @@ import type { LocaleDefinition, MetadataDefinition } from './definitions'; import { FakerError } from './errors/faker-error'; import { deprecated } from './internal/deprecated'; -import type { LocaleProxy } from './locale-proxy'; -import { createLocaleProxy } from './locale-proxy'; +import type { LocaleProxy } from './internal/locale-proxy'; +import { createLocaleProxy } from './internal/locale-proxy'; import { AirlineModule } from './modules/airline'; import { AnimalModule } from './modules/animal'; import { ColorModule } from './modules/color'; diff --git a/src/index.ts b/src/index.ts index 0b5903408da..f94b3aa0133 100644 --- a/src/index.ts +++ b/src/index.ts @@ -30,10 +30,6 @@ export type { export { FakerError } from './errors/faker-error'; export { Faker } from './faker'; export type { FakerOptions } from './faker'; -export { - generateMersenne32Randomizer, - generateMersenne53Randomizer, -} from './internal/mersenne'; export * from './locale'; export { fakerEN as faker } from './locale'; export * from './locales'; @@ -85,3 +81,7 @@ export type { WordModule } from './modules/word'; export type { Randomizer } from './randomizer'; export { SimpleFaker, simpleFaker } from './simple-faker'; export { mergeLocales } from './utils/merge-locales'; +export { + generateMersenne32Randomizer, + generateMersenne53Randomizer, +} from './utils/mersenne'; diff --git a/src/locale-proxy.ts b/src/internal/locale-proxy.ts similarity index 96% rename from src/locale-proxy.ts rename to src/internal/locale-proxy.ts index e99ba655156..dbb9f2779f2 100644 --- a/src/locale-proxy.ts +++ b/src/internal/locale-proxy.ts @@ -1,5 +1,5 @@ -import type { LocaleDefinition } from './definitions'; -import { FakerError } from './errors/faker-error'; +import type { LocaleDefinition } from '../definitions'; +import { FakerError } from '../errors/faker-error'; /** * A proxy for LocaleDefinition that marks all properties as required and throws an error when an entry is accessed that is not defined. diff --git a/src/internal/mersenne.ts b/src/internal/mersenne.ts index d01b5ee9b0e..351faa4e4b9 100644 --- a/src/internal/mersenne.ts +++ b/src/internal/mersenne.ts @@ -1,5 +1,3 @@ -import type { Randomizer } from '../randomizer'; - /** * Copyright (c) 2022-2023 Faker * @@ -325,49 +323,3 @@ export class MersenneTwister19937 { } // These real versions are due to Isaku Wada, 2002/01/09 } - -/** - * Generates a MersenneTwister19937 randomizer with 32 bits of precision. - * This is the default randomizer used by faker prior to v9.0. - */ -export function generateMersenne32Randomizer(): Randomizer { - const twister = new MersenneTwister19937(); - - twister.initGenrand(Math.ceil(Math.random() * Number.MAX_SAFE_INTEGER)); - - return { - next(): number { - return twister.genrandReal2(); - }, - seed(seed: number | number[]): void { - if (typeof seed === 'number') { - twister.initGenrand(seed); - } else if (Array.isArray(seed)) { - twister.initByArray(seed, seed.length); - } - }, - }; -} - -/** - * Generates a MersenneTwister19937 randomizer with 53 bits of precision. - * This is the default randomizer used by faker starting with v9.0. - */ -export function generateMersenne53Randomizer(): Randomizer { - const twister = new MersenneTwister19937(); - - twister.initGenrand(Math.ceil(Math.random() * Number.MAX_SAFE_INTEGER)); - - return { - next(): number { - return twister.genrandRes53(); - }, - seed(seed: number | number[]): void { - if (typeof seed === 'number') { - twister.initGenrand(seed); - } else if (Array.isArray(seed)) { - twister.initByArray(seed, seed.length); - } - }, - }; -} diff --git a/src/utils/types.ts b/src/internal/types.ts similarity index 100% rename from src/utils/types.ts rename to src/internal/types.ts diff --git a/src/modules/date/index.ts b/src/modules/date/index.ts index f2eac1cf80e..53204a03817 100644 --- a/src/modules/date/index.ts +++ b/src/modules/date/index.ts @@ -1,8 +1,8 @@ import type { Faker } from '../..'; import type { DateEntryDefinition } from '../../definitions'; import { FakerError } from '../../errors/faker-error'; +import { assertLocaleData } from '../../internal/locale-proxy'; import { SimpleModuleBase } from '../../internal/module-base'; -import { assertLocaleData } from '../../locale-proxy'; /** * Converts a date passed as a `string`, `number` or `Date` to a valid `Date` object. diff --git a/src/modules/string/index.ts b/src/modules/string/index.ts index cfee0dc13fe..7df31fc7f7d 100644 --- a/src/modules/string/index.ts +++ b/src/modules/string/index.ts @@ -1,6 +1,6 @@ import { FakerError } from '../../errors/faker-error'; import { SimpleModuleBase } from '../../internal/module-base'; -import type { LiteralUnion } from '../../utils/types'; +import type { LiteralUnion } from '../../internal/types'; export type Casing = 'upper' | 'lower' | 'mixed'; diff --git a/src/simple-faker.ts b/src/simple-faker.ts index e775cbc7b5d..743df923570 100644 --- a/src/simple-faker.ts +++ b/src/simple-faker.ts @@ -1,10 +1,10 @@ -import { generateMersenne53Randomizer } from './internal/mersenne'; import { DatatypeModule } from './modules/datatype'; import { SimpleDateModule } from './modules/date'; import { SimpleHelpersModule } from './modules/helpers'; import { NumberModule } from './modules/number'; import { StringModule } from './modules/string'; import type { Randomizer } from './randomizer'; +import { generateMersenne53Randomizer } from './utils/mersenne'; /** * This is a simplified Faker class that doesn't need any localized data to generate its output. diff --git a/src/utils/mersenne.ts b/src/utils/mersenne.ts new file mode 100644 index 00000000000..de415f9166e --- /dev/null +++ b/src/utils/mersenne.ts @@ -0,0 +1,48 @@ +import { MersenneTwister19937 } from '../internal/mersenne'; +import type { Randomizer } from '../randomizer'; + +/** + * Generates a MersenneTwister19937 randomizer with 32 bits of precision. + * This is the default randomizer used by faker prior to v9.0. + */ +export function generateMersenne32Randomizer(): Randomizer { + const twister = new MersenneTwister19937(); + + twister.initGenrand(Math.ceil(Math.random() * Number.MAX_SAFE_INTEGER)); + + return { + next(): number { + return twister.genrandReal2(); + }, + seed(seed: number | number[]): void { + if (typeof seed === 'number') { + twister.initGenrand(seed); + } else if (Array.isArray(seed)) { + twister.initByArray(seed, seed.length); + } + }, + }; +} + +/** + * Generates a MersenneTwister19937 randomizer with 53 bits of precision. + * This is the default randomizer used by faker starting with v9.0. + */ +export function generateMersenne53Randomizer(): Randomizer { + const twister = new MersenneTwister19937(); + + twister.initGenrand(Math.ceil(Math.random() * Number.MAX_SAFE_INTEGER)); + + return { + next(): number { + return twister.genrandRes53(); + }, + seed(seed: number | number[]): void { + if (typeof seed === 'number') { + twister.initGenrand(seed); + } else if (Array.isArray(seed)) { + twister.initByArray(seed, seed.length); + } + }, + }; +} diff --git a/test/locale-proxy.spec.ts b/test/internal/locale-proxy.spec.ts similarity index 98% rename from test/locale-proxy.spec.ts rename to test/internal/locale-proxy.spec.ts index c9c8928c76c..1b6e060b9ca 100644 --- a/test/locale-proxy.spec.ts +++ b/test/internal/locale-proxy.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; -import { FakerError, en } from '../src'; -import { createLocaleProxy } from '../src/locale-proxy'; +import { FakerError, en } from '../../src'; +import { createLocaleProxy } from '../../src/internal/locale-proxy'; describe('LocaleProxy', () => { const locale = createLocaleProxy(en); diff --git a/test/modules/number.spec.ts b/test/modules/number.spec.ts index f318fc5be09..f9adf9ff07d 100644 --- a/test/modules/number.spec.ts +++ b/test/modules/number.spec.ts @@ -1,8 +1,8 @@ import validator from 'validator'; import { describe, expect, it } from 'vitest'; import { FakerError, SimpleFaker, faker } from '../../src'; -import { MERSENNE_MAX_VALUE } from '../internal/mersenne-test-utils'; import { seededTests } from '../support/seeded-runs'; +import { MERSENNE_MAX_VALUE } from '../utils/mersenne-test-utils'; import { times } from './../support/times'; describe('number', () => { diff --git a/test/scripts/apidocs/method.example.ts b/test/scripts/apidocs/method.example.ts index e72f5f3ff9a..4ecdaee1ad7 100644 --- a/test/scripts/apidocs/method.example.ts +++ b/test/scripts/apidocs/method.example.ts @@ -1,7 +1,7 @@ import type { Casing, ColorFormat } from '../../../src'; import { FakerError } from '../../../src/errors/faker-error'; +import type { LiteralUnion } from '../../../src/internal/types'; import type { AlphaNumericChar } from '../../../src/modules/string'; -import type { LiteralUnion } from '../../../src/utils/types'; // explicitly export types so they show up in the docs as decomposed types export type { NumberColorFormat, StringColorFormat } from '../../../src'; export type { AlphaNumericChar, Casing, ColorFormat, LiteralUnion }; diff --git a/test/scripts/apidocs/verify-jsdoc-tags.spec.ts b/test/scripts/apidocs/verify-jsdoc-tags.spec.ts index ea5ed8b9b69..753ef9b3ce9 100644 --- a/test/scripts/apidocs/verify-jsdoc-tags.spec.ts +++ b/test/scripts/apidocs/verify-jsdoc-tags.spec.ts @@ -119,7 +119,7 @@ describe('verify JSDoc tags', () => { ); if (moduleName === 'randomizer') { - examples = `import { generateMersenne32Randomizer } from '${relativeImportPath}/internal/mersenne'; + examples = `import { generateMersenne32Randomizer } from '${relativeImportPath}/utils/mersenne'; const randomizer = generateMersenne32Randomizer(); diff --git a/test/support/seeded-runs.ts b/test/support/seeded-runs.ts index a05f185430d..dee0051c11b 100644 --- a/test/support/seeded-runs.ts +++ b/test/support/seeded-runs.ts @@ -1,6 +1,6 @@ import { describe, expect, describe as vi_describe, it as vi_it } from 'vitest'; import type { Faker } from '../../src/faker'; -import type { Callable, MethodOf } from '../../src/utils/types'; +import type { Callable, MethodOf } from '../../src/internal/types'; export const seededRuns = [42, 1337, 1211]; diff --git a/test/internal/__snapshots__/mersenne.spec.ts.snap b/test/utils/__snapshots__/mersenne.spec.ts.snap similarity index 100% rename from test/internal/__snapshots__/mersenne.spec.ts.snap rename to test/utils/__snapshots__/mersenne.spec.ts.snap diff --git a/test/internal/mersenne-test-utils.ts b/test/utils/mersenne-test-utils.ts similarity index 100% rename from test/internal/mersenne-test-utils.ts rename to test/utils/mersenne-test-utils.ts diff --git a/test/internal/mersenne.spec.ts b/test/utils/mersenne.spec.ts similarity index 97% rename from test/internal/mersenne.spec.ts rename to test/utils/mersenne.spec.ts index f0e48bd0f78..5e9e4c27bc6 100644 --- a/test/internal/mersenne.spec.ts +++ b/test/utils/mersenne.spec.ts @@ -1,10 +1,10 @@ import { beforeAll, beforeEach, describe, expect, it } from 'vitest'; +import { MersenneTwister19937 } from '../../src/internal/mersenne'; +import type { Randomizer } from '../../src/randomizer'; import { - MersenneTwister19937, generateMersenne32Randomizer, generateMersenne53Randomizer, -} from '../../src/internal/mersenne'; -import type { Randomizer } from '../../src/randomizer'; +} from '../../src/utils/mersenne'; import { seededRuns } from '../support/seeded-runs'; import { times } from '../support/times'; import { From d6bceb662de6559446fedb11de53a632a525aba0 Mon Sep 17 00:00:00 2001 From: Jeremie Lecomte Date: Thu, 26 Sep 2024 17:54:53 +0200 Subject: [PATCH 2/4] refactor(locale): update french legal entity types (#3142) --- src/locales/fr/company/legal_entity_type.ts | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/locales/fr/company/legal_entity_type.ts b/src/locales/fr/company/legal_entity_type.ts index 924f8fa7c19..6382799fd16 100644 --- a/src/locales/fr/company/legal_entity_type.ts +++ b/src/locales/fr/company/legal_entity_type.ts @@ -1 +1,14 @@ -export default ['EI', 'EURL', 'GIE', 'SA', 'SARL', 'SAS', 'SCOP', 'SEM']; +export default [ + 'EI', + 'EURL', + 'GIE', + 'SA', + 'SARL', + 'SAS', + 'SASU', + 'SCA', + 'SCOP', + 'SCS', + 'SEM', + 'SNC', +]; From 78b2a3a8b85679eeff27beccebcc404b0a5ff3cf Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Thu, 26 Sep 2024 18:00:14 +0200 Subject: [PATCH 3/4] fix(image): fix dataUri with type svg-base64 in browsers (#3144) --- src/internal/base64.ts | 24 ++++++++++++++++++++++++ src/modules/image/index.ts | 5 ++--- test/internal/base64.spec.ts | 18 ++++++++++++++++++ 3 files changed, 44 insertions(+), 3 deletions(-) create mode 100644 src/internal/base64.ts create mode 100644 test/internal/base64.spec.ts diff --git a/src/internal/base64.ts b/src/internal/base64.ts new file mode 100644 index 00000000000..b346538a88c --- /dev/null +++ b/src/internal/base64.ts @@ -0,0 +1,24 @@ +/** + * This works the same as `Buffer.from(input).toString('base64')` + * to work on both Node.js and browser environment. + * + * @internal + * + * @param input The string to encode to Base64. + * + * @returns Base64 encoded string. + * + * @see https://datatracker.ietf.org/doc/html/rfc4648 + * + * @example const encodedHeader = toBase64(JSON.stringify(header)); + */ +export const toBase64: (input: string) => string = + typeof Buffer === 'undefined' + ? (input) => { + const utf8Bytes = new TextEncoder().encode(input); + const binaryString = Array.from(utf8Bytes, (byte) => + String.fromCodePoint(byte) + ).join(''); + return btoa(binaryString); + } + : (input) => Buffer.from(input).toString('base64'); diff --git a/src/modules/image/index.ts b/src/modules/image/index.ts index babfa2dc8fa..76aa759e7f0 100644 --- a/src/modules/image/index.ts +++ b/src/modules/image/index.ts @@ -1,3 +1,4 @@ +import { toBase64 } from '../../internal/base64'; import { deprecated } from '../../internal/deprecated'; import { ModuleBase } from '../../internal/module-base'; @@ -388,8 +389,6 @@ export class ImageModule extends ModuleBase { return type === 'svg-uri' ? `data:image/svg+xml;charset=UTF-8,${encodeURIComponent(svgString)}` - : `data:image/svg+xml;base64,${Buffer.from(svgString).toString( - 'base64' - )}`; + : `data:image/svg+xml;base64,${toBase64(svgString)}`; } } diff --git a/test/internal/base64.spec.ts b/test/internal/base64.spec.ts new file mode 100644 index 00000000000..1243301ec6d --- /dev/null +++ b/test/internal/base64.spec.ts @@ -0,0 +1,18 @@ +import { describe, expect, it } from 'vitest'; +import { faker } from '../../src'; +import { toBase64 } from '../../src/internal/base64'; + +// This test is kind of useless, because during testing the Buffer object is always available. +describe('toBase64', () => { + it.each( + faker.helpers.multiple( + () => faker.string.alphanumeric({ length: { min: 0, max: 100 } }), + { count: 5 } + ) + )( + "should behave the same as `Buffer.from(value).toString('base64')`", + (value) => { + expect(toBase64(value)).toBe(Buffer.from(value).toString('base64')); + } + ); +}); From 4a8499a1630444ea5b2463cf3e2d687db6980428 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?FakerJS=20=F0=9F=A4=96?= Date: Thu, 26 Sep 2024 19:11:45 +0200 Subject: [PATCH 4/4] chore(release): 9.0.3 (#3146) * chore(release): 9.0.3 * Update usage.md --------- Co-authored-by: ST-DDT --- CHANGELOG.md | 12 ++++++++++++ docs/guide/usage.md | 2 +- package.json | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7effe87939c..e3907ffcd35 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,18 @@ All notable changes to this project will be documented in this file. See [commit-and-tag-version](https://github.com/absolute-version/commit-and-tag-version) for commit guidelines. +## [9.0.3](https://github.com/faker-js/faker/compare/v9.0.2...v9.0.3) (2024-09-26) + + +### Changed Locales + +* **locale:** update french legal entity types ([#3142](https://github.com/faker-js/faker/issues/3142)) ([d6bceb6](https://github.com/faker-js/faker/commit/d6bceb662de6559446fedb11de53a632a525aba0)) + + +### Bug Fixes + +* **image:** fix dataUri with type svg-base64 in browsers ([#3144](https://github.com/faker-js/faker/issues/3144)) ([78b2a3a](https://github.com/faker-js/faker/commit/78b2a3a8b85679eeff27beccebcc404b0a5ff3cf)) + ## [9.0.2](https://github.com/faker-js/faker/compare/v9.0.1...v9.0.2) (2024-09-23) diff --git a/docs/guide/usage.md b/docs/guide/usage.md index d63d628624e..b6be99ef90f 100644 --- a/docs/guide/usage.md +++ b/docs/guide/usage.md @@ -74,7 +74,7 @@ const randomEmail = faker.internet.email(); // Tomasa_Ferry14@hotmail.com ``` ::: info Note -It is highly recommended to use version tags when importing libraries in Deno, e.g: `import { faker } from "https://esm.sh/@faker-js/faker@v9.0.2"`. +It is highly recommended to use version tags when importing libraries in Deno, e.g: `import { faker } from "https://esm.sh/@faker-js/faker@v9.0.3"`. ::: ### Alternative CDN links diff --git a/package.json b/package.json index a3d5c9557ce..2c38e590614 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@faker-js/faker", - "version": "9.0.2", + "version": "9.0.3", "description": "Generate massive amounts of fake contextual data", "scripts": { "clean": "rimraf coverage .eslintcache dist docs/.vitepress/cache docs/.vitepress/dist node_modules",