diff --git a/src/definitions/definitions.ts b/src/definitions/definitions.ts index d207ec123f3..4fcd5b0e2f8 100644 --- a/src/definitions/definitions.ts +++ b/src/definitions/definitions.ts @@ -29,29 +29,49 @@ export type LocaleEntry> = { } & Record; // Unsupported & custom entries /** - * The definitions as used by the translations/locales. + * The internal types for the definitions. */ -export type LocaleDefinition = { - metadata?: MetadataDefinition; - airline?: AirlineDefinition; - animal?: AnimalDefinition; - book?: BookDefinition; - color?: ColorDefinition; - commerce?: CommerceDefinition; - company?: CompanyDefinition; - database?: DatabaseDefinition; - date?: DateDefinition; - finance?: FinanceDefinition; - food?: FoodDefinition; - hacker?: HackerDefinition; - internet?: InternetDefinition; - location?: LocationDefinition; - lorem?: LoremDefinition; - music?: MusicDefinition; - person?: PersonDefinition; - phone_number?: PhoneNumberDefinition; - science?: ScienceDefinition; - system?: SystemDefinition; - vehicle?: VehicleDefinition; - word?: WordDefinition; -} & Record>; +type RawLocaleDefinition = { + metadata: MetadataDefinition; + airline: AirlineDefinition; + animal: AnimalDefinition; + book: BookDefinition; + color: ColorDefinition; + commerce: CommerceDefinition; + company: CompanyDefinition; + database: DatabaseDefinition; + date: DateDefinition; + finance: FinanceDefinition; + food: FoodDefinition; + hacker: HackerDefinition; + internet: InternetDefinition; + location: LocationDefinition; + lorem: LoremDefinition; + music: MusicDefinition; + person: PersonDefinition; + phone_number: PhoneNumberDefinition; + science: ScienceDefinition; + system: SystemDefinition; + vehicle: VehicleDefinition; + word: WordDefinition; +}; + +/** + * Helper type to undo `LocaleEntry` wrapping. + */ +type DefinedLocaleEntry = T extends LocaleEntry ? U : never; + +/** + * Helper type containing the well known locale definitions as used by this library, assuming all values are present. + * + * This type is mainly used for `resolveLocaleData()` to enable auto completion. + */ +export type DefinedLocaleDefinition = { + [K in keyof RawLocaleDefinition]: DefinedLocaleEntry; +}; + +/** + * The extensible definitions as used by the translations/locales. + */ +export type LocaleDefinition = Partial & + Record>; diff --git a/src/faker.ts b/src/faker.ts index 627a628ae73..95f15e1efc2 100644 --- a/src/faker.ts +++ b/src/faker.ts @@ -60,6 +60,12 @@ import { generateMersenne53Randomizer } from './utils/mersenne'; * customFaker.music.genre(); // throws Error as this data is not available in `es` */ export class Faker extends SimpleFaker { + /** + * The definitions for the current locale. + * + * @deprecated Use `faker.fakerCore.locale` and `resolveLocaleData()` instead. + */ + // eslint-disable-next-line @typescript-eslint/no-deprecated readonly definitions: LocaleProxy; readonly airline: AirlineModule = new AirlineModule(this); @@ -87,8 +93,12 @@ export class Faker extends SimpleFaker { readonly vehicle: VehicleModule = new VehicleModule(this); readonly word: WordModule = new WordModule(this); + /** + * The raw definitions for the current locale. + * + * @deprecated Use `faker.fakerCore.locale` instead. + */ get rawDefinitions(): LocaleDefinition { - // TODO @ST-DDT 2024-05-14: Should we deprecate this? return this.fakerCore.locale; } @@ -201,6 +211,7 @@ export class Faker extends SimpleFaker { this.fakerCore = fakerCore; // super({ fakerCore }); + // eslint-disable-next-line @typescript-eslint/no-deprecated this.definitions = createLocaleProxy(this.rawDefinitions); } diff --git a/src/index.ts b/src/index.ts index a8c4ecea739..2bf8542d98d 100644 --- a/src/index.ts +++ b/src/index.ts @@ -88,3 +88,4 @@ export { generateMersenne32Randomizer, generateMersenne53Randomizer, } from './utils/mersenne'; +export { resolveLocaleData } from './utils/resolve-locale-data'; diff --git a/src/internal/locale-proxy.ts b/src/internal/locale-proxy.ts index dbb9f2779f2..6df876eb6e6 100644 --- a/src/internal/locale-proxy.ts +++ b/src/internal/locale-proxy.ts @@ -1,8 +1,11 @@ +/* eslint-disable @typescript-eslint/no-deprecated */ 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. + * + * @deprecated Use `faker.fakerCore.locale` and `resolveLocaleData()` instead. */ export type LocaleProxy = Readonly<{ [key in keyof LocaleDefinition]-?: LocaleProxyCategory; diff --git a/src/modules/airline/index.ts b/src/modules/airline/index.ts index e8ac47c58c2..64b88c2ec69 100644 --- a/src/modules/airline/index.ts +++ b/src/modules/airline/index.ts @@ -5,6 +5,7 @@ * operations. */ import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; export enum Aircraft { Narrowbody = 'narrowbody', @@ -88,7 +89,7 @@ export class AirlineModule extends ModuleBase { */ airport(): Airport { return this.faker.helpers.arrayElement( - this.faker.definitions.airline.airport + resolveLocaleData(this.faker.fakerCore, 'airline', 'airport') ); } @@ -102,7 +103,7 @@ export class AirlineModule extends ModuleBase { */ airline(): Airline { return this.faker.helpers.arrayElement( - this.faker.definitions.airline.airline + resolveLocaleData(this.faker.fakerCore, 'airline', 'airline') ); } @@ -116,7 +117,7 @@ export class AirlineModule extends ModuleBase { */ airplane(): Airplane { return this.faker.helpers.arrayElement( - this.faker.definitions.airline.airplane + resolveLocaleData(this.faker.fakerCore, 'airline', 'airplane') ); } diff --git a/src/modules/animal/index.ts b/src/modules/animal/index.ts index 5a885bbd739..5de60e278c7 100644 --- a/src/modules/animal/index.ts +++ b/src/modules/animal/index.ts @@ -1,4 +1,5 @@ import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; /** * Module to generate animal related entries. @@ -21,7 +22,9 @@ export class AnimalModule extends ModuleBase { * @since 5.5.0 */ dog(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.animal.dog); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'animal', 'dog') + ); } /** @@ -33,7 +36,9 @@ export class AnimalModule extends ModuleBase { * @since 5.5.0 */ cat(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.animal.cat); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'animal', 'cat') + ); } /** @@ -45,7 +50,9 @@ export class AnimalModule extends ModuleBase { * @since 5.5.0 */ snake(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.animal.snake); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'animal', 'snake') + ); } /** @@ -57,7 +64,9 @@ export class AnimalModule extends ModuleBase { * @since 5.5.0 */ bear(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.animal.bear); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'animal', 'bear') + ); } /** @@ -69,7 +78,9 @@ export class AnimalModule extends ModuleBase { * @since 5.5.0 */ lion(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.animal.lion); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'animal', 'lion') + ); } /** @@ -82,7 +93,7 @@ export class AnimalModule extends ModuleBase { */ cetacean(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.animal.cetacean + resolveLocaleData(this.faker.fakerCore, 'animal', 'cetacean') ); } @@ -95,7 +106,9 @@ export class AnimalModule extends ModuleBase { * @since 5.5.0 */ horse(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.animal.horse); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'animal', 'horse') + ); } /** @@ -107,7 +120,9 @@ export class AnimalModule extends ModuleBase { * @since 5.5.0 */ bird(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.animal.bird); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'animal', 'bird') + ); } /** @@ -119,7 +134,9 @@ export class AnimalModule extends ModuleBase { * @since 5.5.0 */ cow(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.animal.cow); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'animal', 'cow') + ); } /** @@ -131,7 +148,9 @@ export class AnimalModule extends ModuleBase { * @since 5.5.0 */ fish(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.animal.fish); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'animal', 'fish') + ); } /** @@ -144,7 +163,7 @@ export class AnimalModule extends ModuleBase { */ crocodilia(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.animal.crocodilia + resolveLocaleData(this.faker.fakerCore, 'animal', 'crocodilia') ); } @@ -158,7 +177,7 @@ export class AnimalModule extends ModuleBase { */ insect(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.animal.insect + resolveLocaleData(this.faker.fakerCore, 'animal', 'insect') ); } @@ -172,7 +191,7 @@ export class AnimalModule extends ModuleBase { */ rabbit(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.animal.rabbit + resolveLocaleData(this.faker.fakerCore, 'animal', 'rabbit') ); } @@ -186,7 +205,7 @@ export class AnimalModule extends ModuleBase { */ rodent(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.animal.rodent + resolveLocaleData(this.faker.fakerCore, 'animal', 'rodent') ); } @@ -199,6 +218,8 @@ export class AnimalModule extends ModuleBase { * @since 5.5.0 */ type(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.animal.type); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'animal', 'type') + ); } } diff --git a/src/modules/book/index.ts b/src/modules/book/index.ts index 86e168d2ad4..797c68df4e8 100644 --- a/src/modules/book/index.ts +++ b/src/modules/book/index.ts @@ -1,4 +1,5 @@ import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; /** * Module to generate book related entries. @@ -26,7 +27,9 @@ export class BookModule extends ModuleBase { * @since 9.1.0 */ author(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.book.author); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'book', 'author') + ); } /** @@ -38,7 +41,9 @@ export class BookModule extends ModuleBase { * @since 9.1.0 */ format(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.book.format); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'book', 'format') + ); } /** @@ -50,7 +55,9 @@ export class BookModule extends ModuleBase { * @since 9.1.0 */ genre(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.book.genre); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'book', 'genre') + ); } /** @@ -63,7 +70,7 @@ export class BookModule extends ModuleBase { */ publisher(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.book.publisher + resolveLocaleData(this.faker.fakerCore, 'book', 'publisher') ); } @@ -76,7 +83,9 @@ export class BookModule extends ModuleBase { * @since 9.1.0 */ series(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.book.series); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'book', 'series') + ); } /** @@ -88,6 +97,8 @@ export class BookModule extends ModuleBase { * @since 9.1.0 */ title(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.book.title); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'book', 'title') + ); } } diff --git a/src/modules/color/index.ts b/src/modules/color/index.ts index 2b355062168..8ed0640f988 100644 --- a/src/modules/color/index.ts +++ b/src/modules/color/index.ts @@ -1,4 +1,5 @@ import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; /** * Color space names supported by CSS. @@ -209,7 +210,9 @@ export class ColorModule extends ModuleBase { * @since 7.0.0 */ human(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.color.human); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'color', 'human') + ); } /** @@ -222,7 +225,9 @@ export class ColorModule extends ModuleBase { * @since 7.0.0 */ space(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.color.space); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'color', 'space') + ); } /** diff --git a/src/modules/commerce/index.ts b/src/modules/commerce/index.ts index 61dd9a9c2b9..99261880f89 100644 --- a/src/modules/commerce/index.ts +++ b/src/modules/commerce/index.ts @@ -1,5 +1,6 @@ import { FakerError } from '../../errors/faker-error'; import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; // Source for official prefixes: https://www.isbn-international.org/range_file_generation const ISBN_LENGTH_RULES: Record< @@ -96,7 +97,7 @@ export class CommerceModule extends ModuleBase { */ department(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.commerce.department + resolveLocaleData(this.faker.fakerCore, 'commerce', 'department') ); } @@ -218,7 +219,8 @@ export class CommerceModule extends ModuleBase { */ productAdjective(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.commerce.product_name.adjective + resolveLocaleData(this.faker.fakerCore, 'commerce', 'product_name') + .adjective ); } @@ -232,7 +234,8 @@ export class CommerceModule extends ModuleBase { */ productMaterial(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.commerce.product_name.material + resolveLocaleData(this.faker.fakerCore, 'commerce', 'product_name') + .material ); } @@ -246,7 +249,8 @@ export class CommerceModule extends ModuleBase { */ product(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.commerce.product_name.product + resolveLocaleData(this.faker.fakerCore, 'commerce', 'product_name') + .product ); } @@ -260,7 +264,7 @@ export class CommerceModule extends ModuleBase { */ productDescription(): string { return this.faker.helpers.fake( - this.faker.definitions.commerce.product_description + resolveLocaleData(this.faker.fakerCore, 'commerce', 'product_description') ); } diff --git a/src/modules/company/index.ts b/src/modules/company/index.ts index b4e8befd79a..8b305b54efb 100644 --- a/src/modules/company/index.ts +++ b/src/modules/company/index.ts @@ -1,4 +1,5 @@ import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; /** * Module to generate company related entries. @@ -24,7 +25,9 @@ export class CompanyModule extends ModuleBase { * @since 7.4.0 */ name(): string { - return this.faker.helpers.fake(this.faker.definitions.company.name_pattern); + return this.faker.helpers.fake( + resolveLocaleData(this.faker.fakerCore, 'company', 'name_pattern') + ); } /** @@ -65,7 +68,7 @@ export class CompanyModule extends ModuleBase { */ catchPhraseAdjective(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.company.adjective + resolveLocaleData(this.faker.fakerCore, 'company', 'adjective') ); } @@ -79,7 +82,7 @@ export class CompanyModule extends ModuleBase { */ catchPhraseDescriptor(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.company.descriptor + resolveLocaleData(this.faker.fakerCore, 'company', 'descriptor') ); } @@ -92,7 +95,9 @@ export class CompanyModule extends ModuleBase { * @since 2.0.1 */ catchPhraseNoun(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.company.noun); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'company', 'noun') + ); } /** @@ -105,7 +110,7 @@ export class CompanyModule extends ModuleBase { */ buzzAdjective(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.company.buzz_adjective + resolveLocaleData(this.faker.fakerCore, 'company', 'buzz_adjective') ); } @@ -119,7 +124,7 @@ export class CompanyModule extends ModuleBase { */ buzzVerb(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.company.buzz_verb + resolveLocaleData(this.faker.fakerCore, 'company', 'buzz_verb') ); } @@ -133,7 +138,7 @@ export class CompanyModule extends ModuleBase { */ buzzNoun(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.company.buzz_noun + resolveLocaleData(this.faker.fakerCore, 'company', 'buzz_noun') ); } } diff --git a/src/modules/database/index.ts b/src/modules/database/index.ts index 6c3595cc4fc..4c2da85e466 100644 --- a/src/modules/database/index.ts +++ b/src/modules/database/index.ts @@ -1,4 +1,5 @@ import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; /** * Module to generate database related entries. @@ -20,7 +21,7 @@ export class DatabaseModule extends ModuleBase { */ column(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.database.column + resolveLocaleData(this.faker.fakerCore, 'database', 'column') ); } @@ -34,7 +35,7 @@ export class DatabaseModule extends ModuleBase { */ type(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.database.type + resolveLocaleData(this.faker.fakerCore, 'database', 'type') ); } @@ -48,7 +49,7 @@ export class DatabaseModule extends ModuleBase { */ collation(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.database.collation + resolveLocaleData(this.faker.fakerCore, 'database', 'collation') ); } @@ -62,7 +63,7 @@ export class DatabaseModule extends ModuleBase { */ engine(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.database.engine + resolveLocaleData(this.faker.fakerCore, 'database', 'engine') ); } diff --git a/src/modules/date/index.ts b/src/modules/date/index.ts index 06890a5d462..c21732941ef 100644 --- a/src/modules/date/index.ts +++ b/src/modules/date/index.ts @@ -4,6 +4,7 @@ import { FakerError } from '../../errors/faker-error'; import { toDate } from '../../internal/date'; import { assertLocaleData } from '../../internal/locale-proxy'; import { SimpleModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; /** * Module to generate dates (without methods requiring localized data). @@ -602,7 +603,7 @@ export class DateModule extends SimpleDateModule { ): string { const { abbreviated = false, context = false } = options; - const source = this.faker.definitions.date.month; + const source = resolveLocaleData(this.faker.fakerCore, 'date', 'month'); let type: keyof DateEntryDefinition; if (abbreviated) { const useContext = context && source['abbr_context'] != null; @@ -654,7 +655,7 @@ export class DateModule extends SimpleDateModule { ): string { const { abbreviated = false, context = false } = options; - const source = this.faker.definitions.date.weekday; + const source = resolveLocaleData(this.faker.fakerCore, 'date', 'weekday'); let type: keyof DateEntryDefinition; if (abbreviated) { const useContext = context && source['abbr_context'] != null; @@ -684,7 +685,7 @@ export class DateModule extends SimpleDateModule { */ timeZone(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.date.time_zone + resolveLocaleData(this.faker.fakerCore, 'date', 'time_zone') ); } } diff --git a/src/modules/finance/index.ts b/src/modules/finance/index.ts index 0e9a6883994..48b3d193f45 100644 --- a/src/modules/finance/index.ts +++ b/src/modules/finance/index.ts @@ -1,5 +1,6 @@ import { FakerError } from '../../errors/faker-error'; import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; import type { BitcoinAddressFamilyType, BitcoinNetworkType } from './bitcoin'; import { BitcoinAddressFamily, @@ -160,7 +161,7 @@ export class FinanceModule extends ModuleBase { accountName(): string { return [ this.faker.helpers.arrayElement( - this.faker.definitions.finance.account_type + resolveLocaleData(this.faker.fakerCore, 'finance', 'account_type') ), 'Account', ].join(' '); @@ -425,7 +426,7 @@ export class FinanceModule extends ModuleBase { */ transactionType(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.finance.transaction_type + resolveLocaleData(this.faker.fakerCore, 'finance', 'transaction_type') ); } @@ -443,7 +444,7 @@ export class FinanceModule extends ModuleBase { */ currency(): Currency { return this.faker.helpers.arrayElement( - this.faker.definitions.finance.currency + resolveLocaleData(this.faker.fakerCore, 'finance', 'currency') ); } @@ -650,7 +651,11 @@ export class FinanceModule extends ModuleBase { const { issuer = '' } = options; let format: string; - const localeFormat = this.faker.definitions.finance.credit_card; + const localeFormat = resolveLocaleData( + this.faker.fakerCore, + 'finance', + 'credit_card' + ); const normalizedIssuer = issuer.toLowerCase(); if (normalizedIssuer in localeFormat) { format = this.faker.helpers.arrayElement(localeFormat[normalizedIssuer]); @@ -690,7 +695,7 @@ export class FinanceModule extends ModuleBase { */ creditCardIssuer(): string { return this.faker.helpers.objectKey( - this.faker.definitions.finance.credit_card + resolveLocaleData(this.faker.fakerCore, 'finance', 'credit_card') ) as string; } diff --git a/src/modules/food/index.ts b/src/modules/food/index.ts index 45b91f3047e..6b2c4741f35 100644 --- a/src/modules/food/index.ts +++ b/src/modules/food/index.ts @@ -1,4 +1,5 @@ import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; /** * Module for generating food-related data. * @@ -19,7 +20,7 @@ export class FoodModule extends ModuleBase { */ adjective(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.food.adjective + resolveLocaleData(this.faker.fakerCore, 'food', 'adjective') ); } @@ -33,7 +34,7 @@ export class FoodModule extends ModuleBase { */ description(): string { return this.faker.helpers.fake( - this.faker.definitions.food.description_pattern + resolveLocaleData(this.faker.fakerCore, 'food', 'description_pattern') ); } @@ -54,12 +55,16 @@ export class FoodModule extends ModuleBase { .join(' '); if (this.faker.datatype.boolean()) { return toTitleCase( - this.faker.helpers.fake(this.faker.definitions.food.dish_pattern) + this.faker.helpers.fake( + resolveLocaleData(this.faker.fakerCore, 'food', 'dish_pattern') + ) ); } return toTitleCase( - this.faker.helpers.arrayElement(this.faker.definitions.food.dish) + this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'food', 'dish') + ) ); } @@ -73,7 +78,7 @@ export class FoodModule extends ModuleBase { */ ethnicCategory(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.food.ethnic_category + resolveLocaleData(this.faker.fakerCore, 'food', 'ethnic_category') ); } @@ -86,7 +91,9 @@ export class FoodModule extends ModuleBase { * @since 9.0.0 */ fruit(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.food.fruit); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'food', 'fruit') + ); } /** @@ -99,7 +106,7 @@ export class FoodModule extends ModuleBase { */ ingredient(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.food.ingredient + resolveLocaleData(this.faker.fakerCore, 'food', 'ingredient') ); } @@ -112,7 +119,9 @@ export class FoodModule extends ModuleBase { * @since 9.0.0 */ meat(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.food.meat); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'food', 'meat') + ); } /** @@ -124,7 +133,9 @@ export class FoodModule extends ModuleBase { * @since 9.0.0 */ spice(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.food.spice); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'food', 'spice') + ); } /** @@ -137,7 +148,7 @@ export class FoodModule extends ModuleBase { */ vegetable(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.food.vegetable + resolveLocaleData(this.faker.fakerCore, 'food', 'vegetable') ); } } diff --git a/src/modules/hacker/index.ts b/src/modules/hacker/index.ts index 3a0f9dab1cd..1c4adbf486c 100644 --- a/src/modules/hacker/index.ts +++ b/src/modules/hacker/index.ts @@ -1,4 +1,5 @@ import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; /** * Module to generate hacker/IT words and phrases. @@ -26,7 +27,7 @@ export class HackerModule extends ModuleBase { */ abbreviation(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.hacker.abbreviation + resolveLocaleData(this.faker.fakerCore, 'hacker', 'abbreviation') ); } @@ -40,7 +41,7 @@ export class HackerModule extends ModuleBase { */ adjective(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.hacker.adjective + resolveLocaleData(this.faker.fakerCore, 'hacker', 'adjective') ); } @@ -53,7 +54,9 @@ export class HackerModule extends ModuleBase { * @since 2.0.1 */ noun(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.hacker.noun); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'hacker', 'noun') + ); } /** @@ -65,7 +68,9 @@ export class HackerModule extends ModuleBase { * @since 2.0.1 */ verb(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.hacker.verb); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'hacker', 'verb') + ); } /** @@ -78,7 +83,7 @@ export class HackerModule extends ModuleBase { */ ingverb(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.hacker.ingverb + resolveLocaleData(this.faker.fakerCore, 'hacker', 'ingverb') ); } @@ -101,7 +106,7 @@ export class HackerModule extends ModuleBase { }; const phrase = this.faker.helpers.arrayElement( - this.faker.definitions.hacker.phrase + resolveLocaleData(this.faker.fakerCore, 'hacker', 'phrase') ); return this.faker.helpers.mustache(phrase, data); } diff --git a/src/modules/helpers/eval.ts b/src/modules/helpers/eval.ts index 5c34fbe6b35..813e7d3394d 100644 --- a/src/modules/helpers/eval.ts +++ b/src/modules/helpers/eval.ts @@ -66,7 +66,7 @@ const REGEX_DOT_OR_BRACKET = /\.|\(/; export function fakeEval( expression: string, faker: Faker, - entrypoints: ReadonlyArray = [faker, faker.rawDefinitions] + entrypoints: ReadonlyArray = [faker, faker.fakerCore.locale] ): unknown { if (expression.length === 0) { throw new FakerError('Eval expression cannot be empty.'); diff --git a/src/modules/helpers/index.ts b/src/modules/helpers/index.ts index 0f57f5af982..74431c24134 100644 --- a/src/modules/helpers/index.ts +++ b/src/modules/helpers/index.ts @@ -665,7 +665,7 @@ export class SimpleHelpersModule extends SimpleModuleBase { * * @example * faker.helpers.uniqueArray(faker.word.sample, 50) - * faker.helpers.uniqueArray(faker.definitions.person.first_name, 6) + * faker.helpers.uniqueArray(resolveLocaleData(faker.fakerCore, 'person', 'first_name'), 6) * faker.helpers.uniqueArray(["Hello", "World", "Goodbye"], 2) * * @since 6.0.0 diff --git a/src/modules/internet/index.ts b/src/modules/internet/index.ts index 3e7759f29ff..1133514800f 100644 --- a/src/modules/internet/index.ts +++ b/src/modules/internet/index.ts @@ -1,6 +1,7 @@ import { FakerError } from '../../errors/faker-error'; import { deprecated } from '../../internal/deprecated'; import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; import { charMapping } from './char-mappings'; import * as random_ua from './user-agent'; @@ -165,7 +166,7 @@ export class InternetModule extends ModuleBase { firstName, lastName, provider = this.faker.helpers.arrayElement( - this.faker.definitions.internet.free_email + resolveLocaleData(this.faker.fakerCore, 'internet', 'free_email') ), allowSpecialCharacters = false, } = options; @@ -240,7 +241,7 @@ export class InternetModule extends ModuleBase { const { firstName, lastName, allowSpecialCharacters = false } = options; const provider = this.faker.helpers.arrayElement( - this.faker.definitions.internet.example_email + resolveLocaleData(this.faker.fakerCore, 'internet', 'example_email') ); return this.email({ @@ -506,19 +507,21 @@ export class InternetModule extends ModuleBase { /** * A list of the HTTP status code types that should be used. * - * @default Object.keys(faker.definitions.internet.http_status_code) + * @default Object.keys(resolveLocaleData(faker.fakerCore, 'internet', 'http_status_code')) */ types?: ReadonlyArray; } = {} ): number { const { types = Object.keys( - this.faker.definitions.internet.http_status_code + resolveLocaleData(this.faker.fakerCore, 'internet', 'http_status_code') ) as HTTPStatusCodeType[], } = options; const httpStatusCodeType = this.faker.helpers.arrayElement(types); return this.faker.helpers.arrayElement( - this.faker.definitions.internet.http_status_code[httpStatusCodeType] + resolveLocaleData(this.faker.fakerCore, 'internet', 'http_status_code')[ + httpStatusCodeType + ] ); } @@ -580,7 +583,7 @@ export class InternetModule extends ModuleBase { */ domainSuffix(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.internet.domain_suffix + resolveLocaleData(this.faker.fakerCore, 'internet', 'domain_suffix') ); } @@ -1006,17 +1009,19 @@ export class InternetModule extends ModuleBase { /** * A list of the emoji types that should be used. * - * @default Object.keys(faker.definitions.internet.emoji) + * @default Object.keys(resolveLocaleData(faker.fakerCore, 'internet', 'emoji')) */ types?: ReadonlyArray; } = {} ): string { const { - types = Object.keys(this.faker.definitions.internet.emoji) as EmojiType[], + types = Object.keys( + resolveLocaleData(this.faker.fakerCore, 'internet', 'emoji') + ) as EmojiType[], } = options; const emojiType = this.faker.helpers.arrayElement(types); return this.faker.helpers.arrayElement( - this.faker.definitions.internet.emoji[emojiType] + resolveLocaleData(this.faker.fakerCore, 'internet', 'emoji')[emojiType] ); } } diff --git a/src/modules/location/index.ts b/src/modules/location/index.ts index 4a49e029501..e33c0851895 100644 --- a/src/modules/location/index.ts +++ b/src/modules/location/index.ts @@ -1,5 +1,6 @@ import { FakerError } from '../../errors/faker-error'; import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; /** * Module to generate addresses and locations. Prior to Faker 8.0.0, this module was known as `faker.address`. @@ -47,7 +48,7 @@ export class LocationModule extends ModuleBase { * * This won't be used if the state option is specified. * - * @default faker.definitions.location.postcode + * @default resolveLocaleData(faker.fakerCore, 'location', 'postcode') */ format?: string; } = {} @@ -59,8 +60,11 @@ export class LocationModule extends ModuleBase { const { state } = options; if (state != null) { - const zipPattern = - this.faker.definitions.location.postcode_by_state[state]; + const zipPattern = resolveLocaleData( + this.faker.fakerCore, + 'location', + 'postcode_by_state' + )[state]; if (zipPattern == null) { throw new FakerError( @@ -71,7 +75,9 @@ export class LocationModule extends ModuleBase { return this.faker.helpers.fake(zipPattern); } - let { format = this.faker.definitions.location.postcode } = options; + let { + format = resolveLocaleData(this.faker.fakerCore, 'location', 'postcode'), + } = options; if (typeof format === 'string') { format = [format]; } @@ -92,7 +98,7 @@ export class LocationModule extends ModuleBase { */ city(): string { return this.faker.helpers.fake( - this.faker.definitions.location.city_pattern + resolveLocaleData(this.faker.fakerCore, 'location', 'city_pattern') ); } @@ -106,7 +112,9 @@ export class LocationModule extends ModuleBase { */ buildingNumber(): string { return this.faker.helpers - .arrayElement(this.faker.definitions.location.building_number) + .arrayElement( + resolveLocaleData(this.faker.fakerCore, 'location', 'building_number') + ) .replaceAll(/#+/g, (m) => this.faker.string.numeric({ length: m.length, @@ -125,7 +133,7 @@ export class LocationModule extends ModuleBase { */ street(): string { return this.faker.helpers.fake( - this.faker.definitions.location.street_pattern + resolveLocaleData(this.faker.fakerCore, 'location', 'street_pattern') ); } @@ -161,7 +169,11 @@ export class LocationModule extends ModuleBase { const { useFullAddress } = options; - const formats = this.faker.definitions.location.street_address; + const formats = resolveLocaleData( + this.faker.fakerCore, + 'location', + 'street_address' + ); const format = formats[useFullAddress ? 'full' : 'normal']; return this.faker.helpers.fake(format); @@ -178,7 +190,9 @@ export class LocationModule extends ModuleBase { */ secondaryAddress(): string { return this.faker.helpers - .fake(this.faker.definitions.location.secondary_address) + .fake( + resolveLocaleData(this.faker.fakerCore, 'location', 'secondary_address') + ) .replaceAll(/#+/g, (m) => this.faker.string.numeric({ length: m.length, @@ -198,7 +212,7 @@ export class LocationModule extends ModuleBase { */ county(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.location.county + resolveLocaleData(this.faker.fakerCore, 'location', 'county') ); } @@ -212,7 +226,7 @@ export class LocationModule extends ModuleBase { */ country(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.location.country + resolveLocaleData(this.faker.fakerCore, 'location', 'country') ); } @@ -226,7 +240,7 @@ export class LocationModule extends ModuleBase { */ continent(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.location.continent + resolveLocaleData(this.faker.fakerCore, 'location', 'continent') ); } @@ -289,7 +303,7 @@ export class LocationModule extends ModuleBase { })(); return this.faker.helpers.arrayElement( - this.faker.definitions.location.country_code + resolveLocaleData(this.faker.fakerCore, 'location', 'country_code') )[key]; } @@ -324,8 +338,8 @@ export class LocationModule extends ModuleBase { ): string { const { abbreviated = false } = options; const stateDataSet = abbreviated - ? this.faker.definitions.location.state_abbr - : this.faker.definitions.location.state; + ? resolveLocaleData(this.faker.fakerCore, 'location', 'state_abbr') + : resolveLocaleData(this.faker.fakerCore, 'location', 'state'); return this.faker.helpers.arrayElement(stateDataSet); } @@ -444,14 +458,18 @@ export class LocationModule extends ModuleBase { if (!abbreviated) { return this.faker.helpers.arrayElement([ - ...this.faker.definitions.location.direction.cardinal, - ...this.faker.definitions.location.direction.ordinal, + ...resolveLocaleData(this.faker.fakerCore, 'location', 'direction') + .cardinal, + ...resolveLocaleData(this.faker.fakerCore, 'location', 'direction') + .ordinal, ]); } return this.faker.helpers.arrayElement([ - ...this.faker.definitions.location.direction.cardinal_abbr, - ...this.faker.definitions.location.direction.ordinal_abbr, + ...resolveLocaleData(this.faker.fakerCore, 'location', 'direction') + .cardinal_abbr, + ...resolveLocaleData(this.faker.fakerCore, 'location', 'direction') + .ordinal_abbr, ]); } @@ -483,12 +501,14 @@ export class LocationModule extends ModuleBase { if (!abbreviated) { return this.faker.helpers.arrayElement( - this.faker.definitions.location.direction.cardinal + resolveLocaleData(this.faker.fakerCore, 'location', 'direction') + .cardinal ); } return this.faker.helpers.arrayElement( - this.faker.definitions.location.direction.cardinal_abbr + resolveLocaleData(this.faker.fakerCore, 'location', 'direction') + .cardinal_abbr ); } @@ -520,12 +540,13 @@ export class LocationModule extends ModuleBase { if (!abbreviated) { return this.faker.helpers.arrayElement( - this.faker.definitions.location.direction.ordinal + resolveLocaleData(this.faker.fakerCore, 'location', 'direction').ordinal ); } return this.faker.helpers.arrayElement( - this.faker.definitions.location.direction.ordinal_abbr + resolveLocaleData(this.faker.fakerCore, 'location', 'direction') + .ordinal_abbr ); } @@ -625,7 +646,7 @@ export class LocationModule extends ModuleBase { */ timeZone(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.location.time_zone + resolveLocaleData(this.faker.fakerCore, 'location', 'time_zone') ); } } diff --git a/src/modules/lorem/index.ts b/src/modules/lorem/index.ts index 785b5a960d3..58357599b11 100644 --- a/src/modules/lorem/index.ts +++ b/src/modules/lorem/index.ts @@ -1,4 +1,5 @@ import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; import { filterWordListByLength } from '../word/filter-word-list-by-length'; /** @@ -79,7 +80,7 @@ export class LoremModule extends ModuleBase { return this.faker.helpers.arrayElement( filterWordListByLength({ ...opts, - wordList: this.faker.definitions.lorem.word, + wordList: resolveLocaleData(this.faker.fakerCore, 'lorem', 'word'), }) ); } diff --git a/src/modules/music/index.ts b/src/modules/music/index.ts index e3d56715b1c..a586a4fd2cc 100644 --- a/src/modules/music/index.ts +++ b/src/modules/music/index.ts @@ -1,4 +1,5 @@ import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; /** * Module to generate music related entries. @@ -27,7 +28,9 @@ export class MusicModule extends ModuleBase { * @since 9.0.0 */ album(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.music.album); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'music', 'album') + ); } /** @@ -39,7 +42,9 @@ export class MusicModule extends ModuleBase { * @since 9.0.0 */ artist(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.music.artist); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'music', 'artist') + ); } /** @@ -51,7 +56,9 @@ export class MusicModule extends ModuleBase { * @since 5.2.0 */ genre(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.music.genre); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'music', 'genre') + ); } /** @@ -64,7 +71,7 @@ export class MusicModule extends ModuleBase { */ songName(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.music.song_name + resolveLocaleData(this.faker.fakerCore, 'music', 'song_name') ); } } diff --git a/src/modules/person/index.ts b/src/modules/person/index.ts index 4baf1274769..3c4bc101761 100644 --- a/src/modules/person/index.ts +++ b/src/modules/person/index.ts @@ -1,6 +1,7 @@ import type { Faker } from '../..'; import type { PersonEntryDefinition } from '../../definitions/person'; import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; export enum Sex { Female = 'female', @@ -84,7 +85,7 @@ export class PersonModule extends ModuleBase { selectDefinition( this.faker, sex, - this.faker.definitions.person.first_name + resolveLocaleData(this.faker.fakerCore, 'person', 'first_name') ) ); } @@ -103,19 +104,23 @@ export class PersonModule extends ModuleBase { * @since 8.0.0 */ lastName(sex?: SexType): string { - if (this.faker.rawDefinitions.person?.last_name_pattern != null) { + if (this.faker.fakerCore.locale.person?.last_name_pattern != null) { const pattern = this.faker.helpers.weightedArrayElement( selectDefinition( this.faker, sex, - this.faker.rawDefinitions.person.last_name_pattern + this.faker.fakerCore.locale.person.last_name_pattern ) ); return this.faker.helpers.fake(pattern); } return this.faker.helpers.arrayElement( - selectDefinition(this.faker, sex, this.faker.definitions.person.last_name) + selectDefinition( + this.faker, + sex, + resolveLocaleData(this.faker.fakerCore, 'person', 'last_name') + ) ); } @@ -137,7 +142,7 @@ export class PersonModule extends ModuleBase { selectDefinition( this.faker, sex, - this.faker.definitions.person.middle_name + resolveLocaleData(this.faker.fakerCore, 'person', 'middle_name') ) ); } @@ -188,7 +193,7 @@ export class PersonModule extends ModuleBase { } = options; const fullNamePattern: string = this.faker.helpers.weightedArrayElement( - this.faker.definitions.person.name + resolveLocaleData(this.faker.fakerCore, 'person', 'name') ); const fullName = this.faker.helpers.mustache(fullNamePattern, { @@ -213,7 +218,7 @@ export class PersonModule extends ModuleBase { */ gender(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.person.gender + resolveLocaleData(this.faker.fakerCore, 'person', 'gender') ); } @@ -232,7 +237,9 @@ export class PersonModule extends ModuleBase { * @since 8.0.0 */ sex(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.person.sex); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'person', 'sex') + ); } /** @@ -259,9 +266,9 @@ export class PersonModule extends ModuleBase { * @since 8.0.0 */ bio(): string { - const { bio_pattern } = this.faker.definitions.person; - - return this.faker.helpers.fake(bio_pattern); + return this.faker.helpers.fake( + resolveLocaleData(this.faker.fakerCore, 'person', 'bio_pattern') + ); } /** @@ -278,7 +285,11 @@ export class PersonModule extends ModuleBase { */ prefix(sex?: SexType): string { return this.faker.helpers.arrayElement( - selectDefinition(this.faker, sex, this.faker.definitions.person.prefix) + selectDefinition( + this.faker, + sex, + resolveLocaleData(this.faker.fakerCore, 'person', 'prefix') + ) ); } @@ -293,7 +304,7 @@ export class PersonModule extends ModuleBase { suffix(): string { // TODO @Shinigami92 2022-03-21: Add female_suffix and male_suffix return this.faker.helpers.arrayElement( - this.faker.definitions.person.suffix + resolveLocaleData(this.faker.fakerCore, 'person', 'suffix') ); } @@ -307,7 +318,7 @@ export class PersonModule extends ModuleBase { */ jobTitle(): string { return this.faker.helpers.fake( - this.faker.definitions.person.job_title_pattern + resolveLocaleData(this.faker.fakerCore, 'person', 'job_title_pattern') ); } @@ -321,7 +332,7 @@ export class PersonModule extends ModuleBase { */ jobDescriptor(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.person.job_descriptor + resolveLocaleData(this.faker.fakerCore, 'person', 'job_descriptor') ); } @@ -335,7 +346,7 @@ export class PersonModule extends ModuleBase { */ jobArea(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.person.job_area + resolveLocaleData(this.faker.fakerCore, 'person', 'job_area') ); } @@ -349,7 +360,7 @@ export class PersonModule extends ModuleBase { */ jobType(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.person.job_type + resolveLocaleData(this.faker.fakerCore, 'person', 'job_type') ); } @@ -363,7 +374,7 @@ export class PersonModule extends ModuleBase { */ zodiacSign(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.person.western_zodiac_sign + resolveLocaleData(this.faker.fakerCore, 'person', 'western_zodiac_sign') ); } } diff --git a/src/modules/phone/index.ts b/src/modules/phone/index.ts index 0d670f58e9e..1330c71ae7f 100644 --- a/src/modules/phone/index.ts +++ b/src/modules/phone/index.ts @@ -1,4 +1,5 @@ import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; import { legacyReplaceSymbolWithNumber } from '../helpers'; /** @@ -40,7 +41,11 @@ export class PhoneModule extends ModuleBase { } = {} ): string { const { style = 'human' } = options; - const formats = this.faker.definitions.phone_number.format; + const formats = resolveLocaleData( + this.faker.fakerCore, + 'phone_number', + 'format' + ); const definitions = formats[style]; if (!definitions) { diff --git a/src/modules/science/index.ts b/src/modules/science/index.ts index 525ff8bf0cc..4a5f3440045 100644 --- a/src/modules/science/index.ts +++ b/src/modules/science/index.ts @@ -1,4 +1,5 @@ import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; /** * The possible definitions related to elements. @@ -49,7 +50,7 @@ export class ScienceModule extends ModuleBase { */ chemicalElement(): ChemicalElement { return this.faker.helpers.arrayElement( - this.faker.definitions.science.chemical_element + resolveLocaleData(this.faker.fakerCore, 'science', 'chemical_element') ); } @@ -64,6 +65,8 @@ export class ScienceModule extends ModuleBase { * @since 7.2.0 */ unit(): Unit { - return this.faker.helpers.arrayElement(this.faker.definitions.science.unit); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'science', 'unit') + ); } } diff --git a/src/modules/system/index.ts b/src/modules/system/index.ts index aec3525e747..1ff30a41e8e 100644 --- a/src/modules/system/index.ts +++ b/src/modules/system/index.ts @@ -1,4 +1,5 @@ import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; const commonFileTypes = ['video', 'audio', 'image', 'text', 'application']; @@ -114,7 +115,9 @@ export class SystemModule extends ModuleBase { * @since 3.1.0 */ mimeType(): string { - const mimeTypeKeys = Object.keys(this.faker.definitions.system.mime_type); + const mimeTypeKeys = Object.keys( + resolveLocaleData(this.faker.fakerCore, 'system', 'mime_type') + ); return this.faker.helpers.arrayElement(mimeTypeKeys); } @@ -152,7 +155,11 @@ export class SystemModule extends ModuleBase { * @since 3.1.0 */ fileType(): string { - const mimeTypes = this.faker.definitions.system.mime_type; + const mimeTypes = resolveLocaleData( + this.faker.fakerCore, + 'system', + 'mime_type' + ); const typeSet = new Set( Object.keys(mimeTypes).map((key) => key.split('/')[0]) @@ -172,7 +179,11 @@ export class SystemModule extends ModuleBase { * @since 3.1.0 */ fileExt(mimeType?: string): string { - const mimeTypes = this.faker.definitions.system.mime_type; + const mimeTypes = resolveLocaleData( + this.faker.fakerCore, + 'system', + 'mime_type' + ); if (typeof mimeType === 'string') { return this.faker.helpers.arrayElement(mimeTypes[mimeType].extensions); @@ -193,7 +204,11 @@ export class SystemModule extends ModuleBase { * @since 3.1.0 */ directoryPath(): string { - const paths = this.faker.definitions.system.directory_path; + const paths = resolveLocaleData( + this.faker.fakerCore, + 'system', + 'directory_path' + ); return this.faker.helpers.arrayElement(paths); } diff --git a/src/modules/vehicle/index.ts b/src/modules/vehicle/index.ts index d032465a42d..2b49bb1f9dc 100644 --- a/src/modules/vehicle/index.ts +++ b/src/modules/vehicle/index.ts @@ -1,4 +1,5 @@ import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; /** * Module to generate vehicle related entries. @@ -32,7 +33,7 @@ export class VehicleModule extends ModuleBase { */ manufacturer(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.vehicle.manufacturer + resolveLocaleData(this.faker.fakerCore, 'vehicle', 'manufacturer') ); } @@ -46,7 +47,7 @@ export class VehicleModule extends ModuleBase { */ model(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.vehicle.model + resolveLocaleData(this.faker.fakerCore, 'vehicle', 'model') ); } @@ -59,7 +60,9 @@ export class VehicleModule extends ModuleBase { * @since 5.0.0 */ type(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.vehicle.type); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'vehicle', 'type') + ); } /** @@ -71,7 +74,9 @@ export class VehicleModule extends ModuleBase { * @since 5.0.0 */ fuel(): string { - return this.faker.helpers.arrayElement(this.faker.definitions.vehicle.fuel); + return this.faker.helpers.arrayElement( + resolveLocaleData(this.faker.fakerCore, 'vehicle', 'fuel') + ); } /** @@ -142,7 +147,7 @@ export class VehicleModule extends ModuleBase { */ bicycle(): string { return this.faker.helpers.arrayElement( - this.faker.definitions.vehicle.bicycle_type + resolveLocaleData(this.faker.fakerCore, 'vehicle', 'bicycle_type') ); } } diff --git a/src/modules/word/index.ts b/src/modules/word/index.ts index ce46210b9db..cc75aa056fe 100644 --- a/src/modules/word/index.ts +++ b/src/modules/word/index.ts @@ -1,5 +1,6 @@ import { FakerError } from '../../errors/faker-error'; import { ModuleBase } from '../../internal/module-base'; +import { resolveLocaleData } from '../../utils/resolve-locale-data'; import { filterWordListByLength } from './filter-word-list-by-length'; /** @@ -71,7 +72,7 @@ export class WordModule extends ModuleBase { return this.faker.helpers.arrayElement( filterWordListByLength({ ...opts, - wordList: this.faker.definitions.word.adjective, + wordList: resolveLocaleData(this.faker.fakerCore, 'word', 'adjective'), }) ); } @@ -141,7 +142,7 @@ export class WordModule extends ModuleBase { return this.faker.helpers.arrayElement( filterWordListByLength({ ...opts, - wordList: this.faker.definitions.word.adverb, + wordList: resolveLocaleData(this.faker.fakerCore, 'word', 'adverb'), }) ); } @@ -211,7 +212,11 @@ export class WordModule extends ModuleBase { return this.faker.helpers.arrayElement( filterWordListByLength({ ...opts, - wordList: this.faker.definitions.word.conjunction, + wordList: resolveLocaleData( + this.faker.fakerCore, + 'word', + 'conjunction' + ), }) ); } @@ -281,7 +286,11 @@ export class WordModule extends ModuleBase { return this.faker.helpers.arrayElement( filterWordListByLength({ ...opts, - wordList: this.faker.definitions.word.interjection, + wordList: resolveLocaleData( + this.faker.fakerCore, + 'word', + 'interjection' + ), }) ); } @@ -351,7 +360,7 @@ export class WordModule extends ModuleBase { return this.faker.helpers.arrayElement( filterWordListByLength({ ...opts, - wordList: this.faker.definitions.word.noun, + wordList: resolveLocaleData(this.faker.fakerCore, 'word', 'noun'), }) ); } @@ -421,7 +430,11 @@ export class WordModule extends ModuleBase { return this.faker.helpers.arrayElement( filterWordListByLength({ ...opts, - wordList: this.faker.definitions.word.preposition, + wordList: resolveLocaleData( + this.faker.fakerCore, + 'word', + 'preposition' + ), }) ); } @@ -491,7 +504,7 @@ export class WordModule extends ModuleBase { return this.faker.helpers.arrayElement( filterWordListByLength({ ...opts, - wordList: this.faker.definitions.word.verb, + wordList: resolveLocaleData(this.faker.fakerCore, 'word', 'verb'), }) ); } diff --git a/src/utils/resolve-locale-data.ts b/src/utils/resolve-locale-data.ts new file mode 100644 index 00000000000..d499ae79878 --- /dev/null +++ b/src/utils/resolve-locale-data.ts @@ -0,0 +1,68 @@ +import type { FakerCore } from '../core'; +import type { DefinedLocaleDefinition } from '../definitions/definitions'; +import { assertLocaleData } from '../internal/locale-proxy'; + +/** + * Returns the locale data for the given category and entry. + * + * If the category or entry is missing or explicitly absent, an error is thrown. + * + * @param core The core to get the locale data from. + * @param category The category to get the locale data from. + * @param entry The entry to get the locale data from. + * + * @example + * resolveLocaleData(fakerCore, 'food', 'fruit'); // ['apple', 'apricot', ...] + * + * @since v10.0.0 + */ +export function resolveLocaleData< + const TCategory extends keyof DefinedLocaleDefinition, + const TEntry extends keyof DefinedLocaleDefinition[TCategory], +>( + core: FakerCore, + category: TCategory, + entry: TEntry +): DefinedLocaleDefinition[TCategory][TEntry]; +/** + * Returns the locale data for the given category and entry. + * + * If the category or entry is missing or explicitly absent, an error is thrown. + * + * @param core The core to get the locale data from. + * @param category The category to get the locale data from. + * @param entry The entry to get the locale data from. + * + * @example + * resolveLocaleData(fakerCore, 'food', 'fruit'); // ['apple', 'apricot', ...] + * + * @since v10.0.0 + */ +export function resolveLocaleData( + core: FakerCore, + category: string, + entry: string +): unknown; +/** + * Returns the locale data for the given category and entry. + * + * If the category or entry is missing or explicitly absent, an error is thrown. + * + * @param core The core to get the locale data from. + * @param category The category to get the locale data from. + * @param entry The entry to get the locale data from. + * + * @example + * resolveLocaleData(fakerCore, 'food', 'fruit'); // ['apple', 'apricot', ...] + * + * @since v10.0.0 + */ +export function resolveLocaleData( + core: FakerCore, + category: string, + entry: string +): unknown { + const value = core.locale[category]?.[entry]; + assertLocaleData(value, category, entry); + return value; +} diff --git a/test/faker.spec.ts b/test/faker.spec.ts index 6d928d63652..be4ba523f8f 100644 --- a/test/faker.spec.ts +++ b/test/faker.spec.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-deprecated */ import type { MockInstance } from 'vitest'; import { describe, expect, it, vi } from 'vitest'; import { Faker, faker } from '../src'; diff --git a/test/locale-imports.spec.ts b/test/locale-imports.spec.ts index b9a823b2e5d..6d9c0434a5c 100644 --- a/test/locale-imports.spec.ts +++ b/test/locale-imports.spec.ts @@ -1,6 +1,6 @@ import { describe, expect, it } from 'vitest'; import type { Faker } from '../src'; -import { allLocales } from '../src'; +import { allLocales, resolveLocaleData } from '../src'; import { keys } from '../src/internal/keys'; describe.each(keys(allLocales))('locale imports', (locale) => { @@ -12,7 +12,7 @@ describe.each(keys(allLocales))('locale imports', (locale) => { expect(faker).toBeDefined(); expect(faker.string.alpha()).toBeTypeOf('string'); - expect(faker.definitions.metadata.title).toBe( + expect(resolveLocaleData(faker.fakerCore, 'metadata', 'title')).toBe( allLocales[locale].metadata?.title ); }); @@ -24,7 +24,7 @@ describe.each(keys(allLocales))('locale imports', (locale) => { expect(faker).toBeDefined(); expect(faker.string.alpha()).toBeTypeOf('string'); - expect(faker.definitions.metadata.title).toBe( + expect(resolveLocaleData(faker.fakerCore, 'metadata', 'title')).toBe( allLocales[locale].metadata?.title ); }); diff --git a/test/modules/airline.spec.ts b/test/modules/airline.spec.ts index bf674570c76..df93377fad2 100644 --- a/test/modules/airline.spec.ts +++ b/test/modules/airline.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { Aircraft, faker } from '../../src'; +import { Aircraft, faker, resolveLocaleData } from '../../src'; import { seededTests } from '../support/seeded-runs'; import { times } from './../support/times'; @@ -47,21 +47,27 @@ describe('airline', () => { describe(`airport()`, () => { it('should return a random value from airport array', () => { const airport = faker.airline.airport(); - expect(faker.definitions.airline.airport).toContainEqual(airport); + expect( + resolveLocaleData(faker.fakerCore, 'airline', 'airport') + ).toContainEqual(airport); }); }); describe(`airline()`, () => { it('should return a random value from airline array', () => { const airline = faker.airline.airline(); - expect(faker.definitions.airline.airline).toContainEqual(airline); + expect( + resolveLocaleData(faker.fakerCore, 'airline', 'airline') + ).toContainEqual(airline); }); }); describe(`airplane()`, () => { it('should return a random value from airplane array', () => { const airplane = faker.airline.airplane(); - expect(faker.definitions.airline.airplane).toContainEqual(airplane); + expect( + resolveLocaleData(faker.fakerCore, 'airline', 'airplane') + ).toContainEqual(airplane); }); }); diff --git a/test/modules/animal.spec.ts b/test/modules/animal.spec.ts index ed9aa8222de..3031caa1b76 100644 --- a/test/modules/animal.spec.ts +++ b/test/modules/animal.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { faker } from '../../src'; +import { faker, resolveLocaleData } from '../../src'; import { seededTests } from '../support/seeded-runs'; import { times } from './../support/times'; @@ -34,7 +34,9 @@ describe('animal', () => { describe.each(functionNames)('%s()', (functionName) => { it(`should return random value from ${functionName} array`, () => { const actual = faker.animal[functionName](); - expect(faker.definitions.animal[functionName]).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'animal', functionName) + ).toContain(actual); }); }); } diff --git a/test/modules/book.spec.ts b/test/modules/book.spec.ts index 4da4a410b51..b30760e6393 100644 --- a/test/modules/book.spec.ts +++ b/test/modules/book.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { faker } from '../../src'; +import { faker, resolveLocaleData } from '../../src'; import { seededTests } from '../support/seeded-runs'; import { times } from '../support/times'; @@ -19,7 +19,9 @@ describe('book', () => { expect(author).toBeTruthy(); expect(author).toBeTypeOf('string'); - expect(faker.definitions.book.author).toContain(author); + expect( + resolveLocaleData(faker.fakerCore, 'book', 'author') + ).toContain(author); }); }); @@ -29,7 +31,9 @@ describe('book', () => { expect(format).toBeTruthy(); expect(format).toBeTypeOf('string'); - expect(faker.definitions.book.format).toContain(format); + expect( + resolveLocaleData(faker.fakerCore, 'book', 'format') + ).toContain(format); }); }); @@ -39,7 +43,9 @@ describe('book', () => { expect(genre).toBeTruthy(); expect(genre).toBeTypeOf('string'); - expect(faker.definitions.book.genre).toContain(genre); + expect(resolveLocaleData(faker.fakerCore, 'book', 'genre')).toContain( + genre + ); }); }); @@ -49,7 +55,9 @@ describe('book', () => { expect(publisher).toBeTruthy(); expect(publisher).toBeTypeOf('string'); - expect(faker.definitions.book.publisher).toContain(publisher); + expect( + resolveLocaleData(faker.fakerCore, 'book', 'publisher') + ).toContain(publisher); }); }); @@ -59,7 +67,9 @@ describe('book', () => { expect(series).toBeTruthy(); expect(series).toBeTypeOf('string'); - expect(faker.definitions.book.series).toContain(series); + expect( + resolveLocaleData(faker.fakerCore, 'book', 'series') + ).toContain(series); }); }); @@ -69,7 +79,9 @@ describe('book', () => { expect(title).toBeTruthy(); expect(title).toBeTypeOf('string'); - expect(faker.definitions.book.title).toContain(title); + expect(resolveLocaleData(faker.fakerCore, 'book', 'title')).toContain( + title + ); }); }); } diff --git a/test/modules/color.spec.ts b/test/modules/color.spec.ts index 9eb64d61c50..91071284f20 100644 --- a/test/modules/color.spec.ts +++ b/test/modules/color.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { CssFunction, CssSpace, faker } from '../../src'; +import { CssFunction, CssSpace, faker, resolveLocaleData } from '../../src'; import { seededTests } from '../support/seeded-runs'; import { times } from './../support/times'; @@ -31,14 +31,18 @@ describe('color', () => { 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); + expect( + resolveLocaleData(faker.fakerCore, '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); + expect( + resolveLocaleData(faker.fakerCore, 'color', 'space') + ).toContain(space); }); }); diff --git a/test/modules/commerce.spec.ts b/test/modules/commerce.spec.ts index ceca3a1376b..5c66eec8f4b 100644 --- a/test/modules/commerce.spec.ts +++ b/test/modules/commerce.spec.ts @@ -1,6 +1,6 @@ import validator from 'validator'; import { describe, expect, it } from 'vitest'; -import { faker } from '../../src'; +import { faker, resolveLocaleData } from '../../src'; import { seededTests } from '../support/seeded-runs'; import { times } from './../support/times'; @@ -54,7 +54,9 @@ describe('commerce', () => { describe(`department()`, () => { it('should return random value from department array', () => { const department = faker.commerce.department(); - expect(faker.definitions.commerce.department).toContain(department); + expect( + resolveLocaleData(faker.fakerCore, 'commerce', 'department') + ).toContain(department); }); }); @@ -64,15 +66,18 @@ describe('commerce', () => { expect(name.split(' ').length).toBeGreaterThanOrEqual(3); const parts = name.split(' '); - expect(faker.definitions.commerce.product_name.adjective).toContain( - parts[0] - ); - expect(faker.definitions.commerce.product_name.material).toContain( - parts[1] - ); - expect(faker.definitions.commerce.product_name.product).toContain( - parts[2] - ); + expect( + resolveLocaleData(faker.fakerCore, 'commerce', 'product_name') + .adjective + ).toContain(parts[0]); + expect( + resolveLocaleData(faker.fakerCore, 'commerce', 'product_name') + .material + ).toContain(parts[1]); + expect( + resolveLocaleData(faker.fakerCore, 'commerce', 'product_name') + .product + ).toContain(parts[2]); }); }); @@ -162,27 +167,30 @@ describe('commerce', () => { describe(`productAdjective()`, () => { it('should return random value from product adjective array', () => { const actual = faker.commerce.productAdjective(); - expect(faker.definitions.commerce.product_name.adjective).toContain( - actual - ); + expect( + resolveLocaleData(faker.fakerCore, 'commerce', 'product_name') + .adjective + ).toContain(actual); }); }); describe(`productMaterial()`, () => { it('should return random value from product material array', () => { const actual = faker.commerce.productMaterial(); - expect(faker.definitions.commerce.product_name.material).toContain( - actual - ); + expect( + resolveLocaleData(faker.fakerCore, 'commerce', 'product_name') + .material + ).toContain(actual); }); }); describe(`product()`, () => { it('should return random value from product array', () => { const actual = faker.commerce.product(); - expect(faker.definitions.commerce.product_name.product).toContain( - actual - ); + expect( + resolveLocaleData(faker.fakerCore, 'commerce', 'product_name') + .product + ).toContain(actual); }); }); diff --git a/test/modules/company.spec.ts b/test/modules/company.spec.ts index 7e1d08d1d7b..755957ab454 100644 --- a/test/modules/company.spec.ts +++ b/test/modules/company.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { faker } from '../../src'; +import { faker, resolveLocaleData } from '../../src'; import { seededTests } from '../support/seeded-runs'; import { times } from './../support/times'; @@ -64,7 +64,9 @@ describe('company', () => { expect(actual).toBeTruthy(); expect(actual).toBeTypeOf('string'); - expect(faker.definitions.company.adjective).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'company', 'adjective') + ).toContain(actual); }); }); @@ -74,7 +76,9 @@ describe('company', () => { expect(actual).toBeTruthy(); expect(actual).toBeTypeOf('string'); - expect(faker.definitions.company.descriptor).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'company', 'descriptor') + ).toContain(actual); }); }); @@ -84,7 +88,9 @@ describe('company', () => { expect(actual).toBeTruthy(); expect(actual).toBeTypeOf('string'); - expect(faker.definitions.company.noun).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'company', 'noun') + ).toContain(actual); }); }); @@ -94,7 +100,9 @@ describe('company', () => { expect(actual).toBeTruthy(); expect(actual).toBeTypeOf('string'); - expect(faker.definitions.company.buzz_adjective).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'company', 'buzz_adjective') + ).toContain(actual); }); }); @@ -104,7 +112,9 @@ describe('company', () => { expect(actual).toBeTruthy(); expect(actual).toBeTypeOf('string'); - expect(faker.definitions.company.buzz_verb).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'company', 'buzz_verb') + ).toContain(actual); }); }); @@ -114,7 +124,9 @@ describe('company', () => { expect(actual).toBeTruthy(); expect(actual).toBeTypeOf('string'); - expect(faker.definitions.company.buzz_noun).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'company', 'buzz_noun') + ).toContain(actual); }); }); } diff --git a/test/modules/database.spec.ts b/test/modules/database.spec.ts index fd386a682fc..8f172285c2e 100644 --- a/test/modules/database.spec.ts +++ b/test/modules/database.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { faker } from '../../src'; +import { faker, resolveLocaleData } from '../../src'; import { seededTests } from '../support/seeded-runs'; import { times } from './../support/times'; @@ -18,7 +18,9 @@ describe('database', () => { const column = faker.database.column(); expect(column).toBeTruthy(); expect(column).toBeTypeOf('string'); - expect(faker.definitions.database.column).toContain(column); + expect( + resolveLocaleData(faker.fakerCore, 'database', 'column') + ).toContain(column); }); }); @@ -27,7 +29,9 @@ describe('database', () => { const collation = faker.database.collation(); expect(collation).toBeTruthy(); expect(collation).toBeTypeOf('string'); - expect(faker.definitions.database.collation).toContain(collation); + expect( + resolveLocaleData(faker.fakerCore, 'database', 'collation') + ).toContain(collation); }); }); @@ -36,7 +40,9 @@ describe('database', () => { const engine = faker.database.engine(); expect(engine).toBeTruthy(); expect(engine).toBeTypeOf('string'); - expect(faker.definitions.database.engine).toContain(engine); + expect( + resolveLocaleData(faker.fakerCore, 'database', 'engine') + ).toContain(engine); }); }); @@ -45,7 +51,9 @@ describe('database', () => { const type = faker.database.type(); expect(type).toBeTruthy(); expect(type).toBeTypeOf('string'); - expect(faker.definitions.database.type).toContain(type); + expect( + resolveLocaleData(faker.fakerCore, 'database', 'type') + ).toContain(type); }); }); diff --git a/test/modules/date.spec.ts b/test/modules/date.spec.ts index e30da8d9580..d7daf111b2a 100644 --- a/test/modules/date.spec.ts +++ b/test/modules/date.spec.ts @@ -1,5 +1,11 @@ import { afterEach, describe, expect, it, vi } from 'vitest'; -import { FakerError, allLocales, faker, fakerAZ } from '../../src'; +import { + FakerError, + allLocales, + faker, + fakerAZ, + resolveLocaleData, +} from '../../src'; import { seededTests } from '../support/seeded-runs'; import { times } from './../support/times'; @@ -447,18 +453,24 @@ describe('date', () => { describe('month()', () => { it('should return random value from date.month.wide array by default', () => { const month = faker.date.month(); - expect(faker.definitions.date.month.wide).toContain(month); + expect( + resolveLocaleData(faker.fakerCore, 'date', 'month').wide + ).toContain(month); }); it('should return random value from date.month.wide_context array for context option', () => { // Use a locale which has a wide_context array const month = fakerAZ.date.month({ context: true }); - expect(fakerAZ.definitions.date.month.wide_context).toContain(month); + expect( + resolveLocaleData(fakerAZ.fakerCore, 'date', 'month').wide_context + ).toContain(month); }); it('should return random value from date.month.abbr array for abbreviated option', () => { const month = faker.date.month({ abbreviated: true }); - expect(faker.definitions.date.month.abbr).toContain(month); + expect( + resolveLocaleData(faker.fakerCore, 'date', 'month').abbr + ).toContain(month); }); it('should return random value from date.month.abbr_context array for abbreviated and context option', () => { @@ -467,39 +479,49 @@ describe('date', () => { abbreviated: true, context: true, }); - expect(fakerAZ.definitions.date.month.abbr_context).toContain(month); + expect( + resolveLocaleData(fakerAZ.fakerCore, 'date', 'month').abbr_context + ).toContain(month); }); it('should return random value from date.month.wide array for context option when date.month.wide_context array is missing', () => { // Use a locale (e.g. the default en) which has no wide_context array const month = faker.date.month({ context: true }); - expect(faker.definitions.date.month.wide).toContain(month); + expect( + resolveLocaleData(faker.fakerCore, 'date', 'month').wide + ).toContain(month); }); it('should return random value from date.month.abbr array for abbreviated and context option when date.month.abbr_context array is missing', () => { // Use a locale (e.g. the default en) which has no abbr_context array const month = faker.date.month({ abbreviated: true, context: true }); - expect(faker.definitions.date.month.abbr).toContain(month); + expect( + resolveLocaleData(faker.fakerCore, 'date', 'month').abbr + ).toContain(month); }); }); describe('weekday()', () => { it('should return random value from date.weekday.wide array by default', () => { const weekday = faker.date.weekday(); - expect(faker.definitions.date.weekday.wide).toContain(weekday); + expect( + resolveLocaleData(faker.fakerCore, 'date', 'weekday').wide + ).toContain(weekday); }); it('should return random value from date.weekday.wide_context array for context option', () => { // Use a locale (e.g. az) which has a wide_context array const weekday = fakerAZ.date.weekday({ context: true }); - expect(fakerAZ.definitions.date.weekday.wide_context).toContain( - weekday - ); + expect( + resolveLocaleData(fakerAZ.fakerCore, 'date', 'weekday').wide_context + ).toContain(weekday); }); it('should return random value from date.weekday.abbr array for abbreviated option', () => { const weekday = faker.date.weekday({ abbreviated: true }); - expect(faker.definitions.date.weekday.abbr).toContain(weekday); + expect( + resolveLocaleData(faker.fakerCore, 'date', 'weekday').abbr + ).toContain(weekday); }); it('should return random value from date.weekday.abbr_context array for abbreviated and context option', () => { @@ -508,15 +530,17 @@ describe('date', () => { abbreviated: true, context: true, }); - expect(fakerAZ.definitions.date.weekday.abbr_context).toContain( - weekday - ); + expect( + resolveLocaleData(fakerAZ.fakerCore, 'date', 'weekday').abbr_context + ).toContain(weekday); }); it('should return random value from date.weekday.wide array for context option when date.weekday.wide_context array is missing', () => { // Use a locale (e.g. the default en) which has no wide_context array const weekday = faker.date.weekday({ context: true }); - expect(faker.definitions.date.weekday.wide).toContain(weekday); + expect( + resolveLocaleData(faker.fakerCore, 'date', 'weekday').wide + ).toContain(weekday); }); it('should return random value from date.weekday.abbr array for abbreviated and context option when date.weekday.abbr_context array is missing', () => { @@ -525,7 +549,9 @@ describe('date', () => { abbreviated: true, context: true, }); - expect(faker.definitions.date.weekday.abbr).toContain(weekday); + expect( + resolveLocaleData(faker.fakerCore, 'date', 'weekday').abbr + ).toContain(weekday); }); }); @@ -659,7 +685,9 @@ describe('date', () => { describe('timeZone', () => { it('should return a random timezone', () => { const actual = faker.date.timeZone(); - expect(faker.definitions.date.time_zone).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'date', 'time_zone') + ).toContain(actual); }); }); } diff --git a/test/modules/finance.spec.ts b/test/modules/finance.spec.ts index ee19b17a843..79ceb6b490b 100644 --- a/test/modules/finance.spec.ts +++ b/test/modules/finance.spec.ts @@ -1,6 +1,6 @@ import isCreditCard from 'validator/lib/isCreditCard'; import { describe, expect, it } from 'vitest'; -import { faker, fakerZH_CN } from '../../src'; +import { faker, fakerZH_CN, resolveLocaleData } from '../../src'; import { FakerError } from '../../src/errors/faker-error'; import { BitcoinAddressFamily, @@ -510,9 +510,11 @@ describe('finance', () => { it('should return a string', () => { const issuer = faker.finance.creditCardIssuer(); expect(issuer).toBeTypeOf('string'); - expect(Object.keys(faker.definitions.finance.credit_card)).toContain( - issuer - ); + expect( + Object.keys( + resolveLocaleData(faker.fakerCore, 'finance', 'credit_card') + ) + ).toContain(issuer); }); }); diff --git a/test/modules/food.spec.ts b/test/modules/food.spec.ts index 473a191b1c5..1f980452899 100644 --- a/test/modules/food.spec.ts +++ b/test/modules/food.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { faker } from '../../src'; +import { faker, resolveLocaleData } from '../../src'; import { seededTests } from '../support/seeded-runs'; import { times } from './../support/times'; @@ -32,7 +32,9 @@ describe('food', () => { describe('adjective', () => { it(`should return random value from adjective array`, () => { const actual = faker.food.adjective(); - expect(faker.definitions.food.adjective).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'food', 'adjective') + ).toContain(actual); }); }); @@ -46,42 +48,54 @@ describe('food', () => { describe('ethnicCategory', () => { it(`should return random value from ethnic_category array`, () => { const actual = faker.food.ethnicCategory(); - expect(faker.definitions.food.ethnic_category).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'food', 'ethnic_category') + ).toContain(actual); }); }); describe('fruit', () => { it(`should return random value from fruit array`, () => { const actual = faker.food.fruit(); - expect(faker.definitions.food.fruit).toContain(actual); + expect(resolveLocaleData(faker.fakerCore, 'food', 'fruit')).toContain( + actual + ); }); }); describe('ingredient', () => { it(`should return random value from ingredient array`, () => { const actual = faker.food.ingredient(); - expect(faker.definitions.food.ingredient).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'food', 'ingredient') + ).toContain(actual); }); }); describe('meat', () => { it(`should return random value from meat array`, () => { const actual = faker.food.meat(); - expect(faker.definitions.food.meat).toContain(actual); + expect(resolveLocaleData(faker.fakerCore, 'food', 'meat')).toContain( + actual + ); }); }); describe('spice', () => { it(`should return random value from spice array`, () => { const actual = faker.food.spice(); - expect(faker.definitions.food.spice).toContain(actual); + expect(resolveLocaleData(faker.fakerCore, 'food', 'spice')).toContain( + actual + ); }); }); describe('vegetable', () => { it(`should return random value from vegetable array`, () => { const actual = faker.food.vegetable(); - expect(faker.definitions.food.vegetable).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'food', 'vegetable') + ).toContain(actual); }); }); } diff --git a/test/modules/hacker.spec.ts b/test/modules/hacker.spec.ts index e1dbd190b4a..a62ff59e94e 100644 --- a/test/modules/hacker.spec.ts +++ b/test/modules/hacker.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { faker } from '../../src'; +import { faker, resolveLocaleData } from '../../src'; import { seededTests } from '../support/seeded-runs'; import { times } from './../support/times'; @@ -19,7 +19,9 @@ describe('hacker', () => { expect(abbreviation).toBeTypeOf('string'); expect(abbreviation.length).toBeGreaterThan(0); - expect(faker.definitions.hacker.abbreviation).toContain(abbreviation); + expect( + resolveLocaleData(faker.fakerCore, 'hacker', 'abbreviation') + ).toContain(abbreviation); }); }); @@ -29,7 +31,9 @@ describe('hacker', () => { expect(adjective).toBeTypeOf('string'); expect(adjective.length).toBeGreaterThan(0); - expect(faker.definitions.hacker.adjective).toContain(adjective); + expect( + resolveLocaleData(faker.fakerCore, 'hacker', 'adjective') + ).toContain(adjective); }); }); @@ -39,7 +43,9 @@ describe('hacker', () => { expect(noun).toBeTypeOf('string'); expect(noun.length).toBeGreaterThan(0); - expect(faker.definitions.hacker.noun).toContain(noun); + expect( + resolveLocaleData(faker.fakerCore, 'hacker', 'noun') + ).toContain(noun); }); }); @@ -49,7 +55,9 @@ describe('hacker', () => { expect(verb).toBeTypeOf('string'); expect(verb.length).toBeGreaterThan(0); - expect(faker.definitions.hacker.verb).toContain(verb); + expect( + resolveLocaleData(faker.fakerCore, 'hacker', 'verb') + ).toContain(verb); }); }); @@ -59,7 +67,9 @@ describe('hacker', () => { expect(ingverb).toBeTypeOf('string'); expect(ingverb.length).toBeGreaterThan(0); - expect(faker.definitions.hacker.ingverb).toContain(ingverb); + expect( + resolveLocaleData(faker.fakerCore, 'hacker', 'ingverb') + ).toContain(ingverb); }); }); diff --git a/test/modules/helpers-eval.spec.ts b/test/modules/helpers-eval.spec.ts index aef1492f433..c90a511e44c 100644 --- a/test/modules/helpers-eval.spec.ts +++ b/test/modules/helpers-eval.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it, vi } from 'vitest'; -import { FakerError, faker } from '../../src'; +import { FakerError, faker, resolveLocaleData } from '../../src'; import { fakeEval } from '../../src/modules/helpers/eval'; describe('fakeEval()', () => { @@ -96,22 +96,28 @@ describe('fakeEval()', () => { it('supports returning complex objects', () => { const actual = fakeEval('airline.airline', faker); expect(actual).toBeTypeOf('object'); - expect(faker.definitions.airline.airline).toContain(actual); + expect(resolveLocaleData(faker.fakerCore, 'airline', 'airline')).toContain( + actual + ); }); it('supports patterns after a function call', () => { const actual = fakeEval('airline.airline().name', faker); expect(actual).toBeTypeOf('string'); - expect(faker.definitions.airline.airline.map(({ name }) => name)).toContain( - actual - ); // function().name + expect( + resolveLocaleData(faker.fakerCore, 'airline', 'airline').map( + ({ name }) => name + ) + ).toContain(actual); // function().name }); it('supports patterns after a function reference', () => { const actual = fakeEval('airline.airline.iataCode', faker); expect(actual).toBeTypeOf('string'); expect( - faker.definitions.airline.airline.map(({ iataCode }) => iataCode) + resolveLocaleData(faker.fakerCore, 'airline', 'airline').map( + ({ iataCode }) => iataCode + ) ).toContain(actual); }); @@ -125,12 +131,14 @@ describe('fakeEval()', () => { it('requires a function for parameters', () => { // TODO @ST-DDT 2023-12-11: Replace in v10 - // expect(faker.definitions.person.first_name.generic).toBeDefined(); + // expect(resolveLocaleData(faker.fakerCore, 'person', 'first_name').generic).toBeDefined(); //expect(() => fakeEval('person.first_name().generic', faker)).toThrow( // new FakerError(`Cannot resolve expression 'person.first_name'`) // ); const actual = fakeEval('person.first_name().generic', faker); - expect(faker.definitions.person.first_name.generic ?? []).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'person', 'first_name').generic ?? [] + ).toContain(actual); }); it('requires a valid expression (missing value)', () => { diff --git a/test/modules/helpers.spec.ts b/test/modules/helpers.spec.ts index 13c66f371b8..db94105e77f 100644 --- a/test/modules/helpers.spec.ts +++ b/test/modules/helpers.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { FakerError, faker } from '../../src'; +import { FakerError, faker, resolveLocaleData } from '../../src'; import { luhnCheck } from '../../src/modules/helpers/luhn-check'; import { seededTests } from '../support/seeded-runs'; import { times } from './../support/times'; @@ -676,7 +676,7 @@ describe('helpers', () => { it('definition array returns unique array', () => { const length = faker.number.int({ min: 1, max: 6 }); const unique = faker.helpers.uniqueArray( - faker.definitions.hacker.noun, + resolveLocaleData(faker.fakerCore, 'hacker', 'noun'), length ); expect(unique).not.toContainDuplicates(); @@ -945,7 +945,9 @@ describe('helpers', () => { const actual = faker.helpers.fake('{{airline.airline.iataCode}}'); expect(actual).toBeTypeOf('string'); expect( - faker.definitions.airline.airline.map(({ iataCode }) => iataCode) + resolveLocaleData(faker.fakerCore, 'airline', 'airline').map( + ({ iataCode }) => iataCode + ) ).toContain(actual); }); @@ -954,15 +956,15 @@ describe('helpers', () => { }); it('should be able to return locale definition strings', () => { - expect(faker.definitions.cell_phone?.formats).toContain( - faker.helpers.fake('{{cell_phone.formats}}') - ); + expect( + resolveLocaleData(faker.fakerCore, 'cell_phone', 'formats') + ).toContain(faker.helpers.fake('{{cell_phone.formats}}')); }); it('should be able to return locale definition strings that starts with the name of an existing module', () => { - expect(faker.definitions.location.city_name).toContain( - faker.helpers.fake('{{location.city_name}}') - ); + expect( + resolveLocaleData(faker.fakerCore, 'location', 'city_name') + ).toContain(faker.helpers.fake('{{location.city_name}}')); }); it('should be able to pass multiple static templates', () => { @@ -972,7 +974,9 @@ describe('helpers', () => { }); it('should be able to pass multiple dynamic templates', () => { - expect(faker.definitions.company.buzz_noun).toContain( + expect( + resolveLocaleData(faker.fakerCore, 'company', 'buzz_noun') + ).toContain( faker.helpers.fake([ '{{company.buzz_noun}}', '{{company.buzzNoun}}', @@ -1021,13 +1025,16 @@ describe('helpers', () => { }); it('should support deprecated module aliases', () => { - expect(faker.definitions.location.state).toContain( - faker.helpers.fake('{{address.state}}') - ); + expect( + resolveLocaleData(faker.fakerCore, 'location', 'state') + ).toContain(faker.helpers.fake('{{address.state}}')); expect([ - ...(faker.definitions.person.first_name.female ?? []), - ...(faker.definitions.person.first_name.generic ?? []), - ...(faker.definitions.person.first_name.male ?? []), + ...(resolveLocaleData(faker.fakerCore, 'person', 'first_name') + .female ?? []), + ...(resolveLocaleData(faker.fakerCore, 'person', 'first_name') + .generic ?? []), + ...(resolveLocaleData(faker.fakerCore, 'person', 'first_name') + .male ?? []), ]).toContain(faker.helpers.fake('{{name.firstName}}')); }); diff --git a/test/modules/internet.spec.ts b/test/modules/internet.spec.ts index f96671eb661..cbfaa8f32f1 100644 --- a/test/modules/internet.spec.ts +++ b/test/modules/internet.spec.ts @@ -1,6 +1,6 @@ import validator from 'validator'; import { describe, expect, it } from 'vitest'; -import { allFakers, faker } from '../../src'; +import { allFakers, faker, resolveLocaleData } from '../../src'; import { FakerError } from '../../src/errors/faker-error'; import { IPv4Network } from '../../src/modules/internet'; import { seededTests } from '../support/seeded-runs'; @@ -168,7 +168,9 @@ describe('internet', () => { expect(email).toSatisfy(validator.isEmail); const [, suffix] = email.split('@'); - expect(faker.definitions.internet.free_email).toContain(suffix); + expect( + resolveLocaleData(faker.fakerCore, 'internet', 'free_email') + ).toContain(suffix); }); it.each(Object.entries(allFakers))( @@ -199,7 +201,9 @@ describe('internet', () => { expect(prefix).toMatch( /^(Aiden\.Harann55((\d{1,2})|([._][A-Za-z]*(\d{1,2})?)))/ ); - expect(faker.definitions.internet.free_email).toContain(suffix); + expect( + resolveLocaleData(faker.fakerCore, 'internet', 'free_email') + ).toContain(suffix); }); it('should not allow an email that starts or ends with a .', () => { @@ -244,7 +248,9 @@ describe('internet', () => { expect(prefix).includes('Aiden'); expect(prefix).includes('Harann'); expect(prefix).toMatch(/^Aiden[._]Harann\d*/); - expect(faker.definitions.internet.free_email).toContain(suffix); + expect( + resolveLocaleData(faker.fakerCore, 'internet', 'free_email') + ).toContain(suffix); }); it('should return a valid email for very long names', () => { @@ -286,7 +292,9 @@ describe('internet', () => { const [prefix, suffix] = email.split('@'); expect(prefix).toMatch(/^Mike[.!#$%&'*+-/=?^_`{|}~]Smith\d*/); - expect(faker.definitions.internet.free_email).toContain(suffix); + expect( + resolveLocaleData(faker.fakerCore, 'internet', 'free_email') + ).toContain(suffix); }); }); @@ -301,7 +309,9 @@ describe('internet', () => { const suffix = email.split('@')[1]; expect(suffix).toMatch(/^example\.(com|net|org)$/); - expect(faker.definitions.internet.example_email).toContain(suffix); + expect( + resolveLocaleData(faker.fakerCore, 'internet', 'example_email') + ).toContain(suffix); }); it('should return an email with the example suffix and given firstName', () => { @@ -316,7 +326,9 @@ describe('internet', () => { const [prefix, suffix] = email.split('@'); expect(suffix).toMatch(/^example\.(com|net|org)$/); - expect(faker.definitions.internet.example_email).toContain(suffix); + expect( + resolveLocaleData(faker.fakerCore, 'internet', 'example_email') + ).toContain(suffix); expect(prefix).toMatch(/^Aiden.Harann55/); }); @@ -335,7 +347,9 @@ describe('internet', () => { expect(email).includes('Harann'); expect(suffix).toMatch(/^example\.(com|net|org)$/); - expect(faker.definitions.internet.example_email).toContain(suffix); + expect( + resolveLocaleData(faker.fakerCore, 'internet', 'example_email') + ).toContain(suffix); expect(prefix).toMatch(/^Aiden[._]Harann\d*/); }); @@ -353,7 +367,9 @@ describe('internet', () => { const [prefix, suffix] = email.split('@'); expect(suffix).toMatch(/^example\.(com|net|org)$/); - expect(faker.definitions.internet.example_email).toContain(suffix); + expect( + resolveLocaleData(faker.fakerCore, 'internet', 'example_email') + ).toContain(suffix); expect(prefix).includes('Mike'); expect(prefix).includes('Smith'); expect(prefix).toMatch(/^Mike[.!#$%&'*+-/=?^_`{|}~]Smith\d*/); @@ -631,7 +647,9 @@ describe('internet', () => { const [prefix, suffix] = domainName.split('.'); expect(prefix).toSatisfy(validator.isSlug); - expect(faker.definitions.internet.domain_suffix).toContain(suffix); + expect( + resolveLocaleData(faker.fakerCore, 'internet', 'domain_suffix') + ).toContain(suffix); }); }); @@ -641,9 +659,9 @@ describe('internet', () => { expect(domainSuffix).toBeTruthy(); expect(domainSuffix).toBeTypeOf('string'); - expect(faker.definitions.internet.domain_suffix).toContain( - domainSuffix - ); + expect( + resolveLocaleData(faker.fakerCore, 'internet', 'domain_suffix') + ).toContain(domainSuffix); }); }); diff --git a/test/modules/location.spec.ts b/test/modules/location.spec.ts index 2be7c4896a3..2301dec2935 100644 --- a/test/modules/location.spec.ts +++ b/test/modules/location.spec.ts @@ -5,6 +5,7 @@ import { faker, fakerEN_CA, fakerEN_US, + resolveLocaleData, } from '../../src'; import { seededTests } from '../support/seeded-runs'; import { times } from './../support/times'; @@ -153,7 +154,9 @@ describe('location', () => { expect(actual).toBeTruthy(); expect(actual).toBeTypeOf('string'); - expect(faker.definitions.location.continent).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'location', 'continent') + ).toContain(actual); }); }); @@ -412,7 +415,9 @@ describe('location', () => { describe('timeZone', () => { it('should return a random timezone', () => { const actual = faker.location.timeZone(); - expect(faker.definitions.location.time_zone).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'location', 'time_zone') + ).toContain(actual); }); }); } diff --git a/test/modules/lorem.spec.ts b/test/modules/lorem.spec.ts index 4f5c5aba2b5..d8218fdca54 100644 --- a/test/modules/lorem.spec.ts +++ b/test/modules/lorem.spec.ts @@ -1,6 +1,6 @@ import validator from 'validator'; import { describe, expect, it } from 'vitest'; -import { faker } from '../../src'; +import { faker, resolveLocaleData } from '../../src'; import { seededTests } from '../support/seeded-runs'; import { times } from './../support/times'; @@ -43,7 +43,9 @@ describe('lorem', () => { expect(actual).toBeTruthy(); expect(actual).toBeTypeOf('string'); - expect(faker.definitions.lorem.word).toContain(actual); + expect(resolveLocaleData(faker.fakerCore, 'lorem', 'word')).toContain( + actual + ); }); // INFO @Shinigami92 2022-02-11: Seems there are only words with a max length of 14 characters @@ -54,7 +56,9 @@ describe('lorem', () => { expect(actual).toBeTruthy(); expect(actual).toBeTypeOf('string'); - expect(faker.definitions.lorem.word).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'lorem', 'word') + ).toContain(actual); expect(actual).toHaveLength(length); } ); @@ -72,7 +76,9 @@ describe('lorem', () => { expect(words).toHaveLength(3); for (const word of words) { - expect(faker.definitions.lorem.word).toContain(word); + expect( + resolveLocaleData(faker.fakerCore, 'lorem', 'word') + ).toContain(word); } }); @@ -89,7 +95,9 @@ describe('lorem', () => { expect(words).toHaveLength(num); for (const word of words) { - expect(faker.definitions.lorem.word).toContain(word); + expect( + resolveLocaleData(faker.fakerCore, 'lorem', 'word') + ).toContain(word); } } ); @@ -106,7 +114,9 @@ describe('lorem', () => { expect(words.length).toBeLessThanOrEqual(20); for (const word of words) { - expect(faker.definitions.lorem.word).toContain(word); + expect( + resolveLocaleData(faker.fakerCore, 'lorem', 'word') + ).toContain(word); } }); }); diff --git a/test/modules/music.spec.ts b/test/modules/music.spec.ts index c422c290f5b..daccfff6d0c 100644 --- a/test/modules/music.spec.ts +++ b/test/modules/music.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { faker } from '../../src'; +import { faker, resolveLocaleData } from '../../src'; import { seededTests } from '../support/seeded-runs'; import { times } from './../support/times'; @@ -19,7 +19,9 @@ describe('music', () => { expect(album).toBeTruthy(); expect(album).toBeTypeOf('string'); - expect(faker.definitions.music.album).toContain(album); + expect( + resolveLocaleData(faker.fakerCore, 'music', 'album') + ).toContain(album); }); }); @@ -29,7 +31,9 @@ describe('music', () => { expect(artist).toBeTruthy(); expect(artist).toBeTypeOf('string'); - expect(faker.definitions.music.artist).toContain(artist); + expect( + resolveLocaleData(faker.fakerCore, 'music', 'artist') + ).toContain(artist); }); }); @@ -39,7 +43,9 @@ describe('music', () => { expect(genre).toBeTruthy(); expect(genre).toBeTypeOf('string'); - expect(faker.definitions.music.genre).toContain(genre); + expect( + resolveLocaleData(faker.fakerCore, 'music', 'genre') + ).toContain(genre); }); }); @@ -49,7 +55,9 @@ describe('music', () => { expect(songName).toBeTruthy(); expect(songName).toBeTypeOf('string'); - expect(faker.definitions.music.song_name).toContain(songName); + expect( + resolveLocaleData(faker.fakerCore, 'music', 'song_name') + ).toContain(songName); }); }); } diff --git a/test/modules/person.spec.ts b/test/modules/person.spec.ts index 922da6e50ce..4cc8debf052 100644 --- a/test/modules/person.spec.ts +++ b/test/modules/person.spec.ts @@ -1,5 +1,12 @@ import { describe, expect, it } from 'vitest'; -import { Sex, faker, fakerAZ, fakerMK, fakerUK } from '../../src'; +import { + Sex, + faker, + fakerAZ, + fakerMK, + fakerUK, + resolveLocaleData, +} from '../../src'; import { seededTests } from '../support/seeded-runs'; import { times } from './../support/times'; @@ -53,19 +60,28 @@ describe('person', () => { }); it('should return a sex-specific first name', () => { + const { female = [], male = [] } = resolveLocaleData( + faker.fakerCore, + 'person', + 'first_name' + ); + let name = faker.person.firstName('female'); - expect(faker.definitions.person.first_name.female).toContain(name); + expect(female).toContain(name); name = faker.person.firstName('male'); - expect(faker.definitions.person.first_name.male).toContain(name); + expect(male).toContain(name); }); it('should return a sex-specific first name when no sex-specific first name was defined', () => { const name = fakerAZ.person.firstName(); - expect([ - ...(fakerAZ.definitions.person.first_name.female ?? []), - ...(fakerAZ.definitions.person.first_name.male ?? []), - ]).toContain(name); + const { male = [], female = [] } = resolveLocaleData( + fakerAZ.fakerCore, + 'person', + 'first_name' + ); + + expect([...female, ...male]).toContain(name); }); }); @@ -78,11 +94,17 @@ describe('person', () => { }); it('should return a sex-specific last name', () => { + const { female = [], male = [] } = resolveLocaleData( + fakerAZ.fakerCore, + 'person', + 'last_name' + ); + let name = fakerAZ.person.lastName('female'); - expect(fakerAZ.definitions.person.last_name.female).toContain(name); + expect(female).toContain(name); name = fakerAZ.person.lastName('male'); - expect(fakerAZ.definitions.person.last_name.male).toContain(name); + expect(male).toContain(name); }); }); @@ -95,22 +117,34 @@ describe('person', () => { }); it('should return a middle name when passed en locale', () => { + const { + female = [], + generic = [], + male = [], + } = resolveLocaleData(faker.fakerCore, 'person', 'middle_name'); + let name = faker.person.middleName(); - expect(faker.definitions.person.middle_name.generic).toContain(name); + expect(generic).toContain(name); name = faker.person.middleName('female'); - expect(faker.definitions.person.middle_name.female).toContain(name); + expect(female).toContain(name); name = faker.person.middleName('male'); - expect(faker.definitions.person.middle_name.male).toContain(name); + expect(male).toContain(name); }); it('should return a sex-specific middle name', () => { + const { female = [], male = [] } = resolveLocaleData( + fakerUK.fakerCore, + 'person', + 'middle_name' + ); + let name = fakerUK.person.middleName('female'); - expect(fakerUK.definitions.person.middle_name.female).toContain(name); + expect(female).toContain(name); name = fakerUK.person.middleName('male'); - expect(fakerUK.definitions.person.middle_name.male).toContain(name); + expect(male).toContain(name); }); }); @@ -124,10 +158,10 @@ describe('person', () => { it('should return a female sex-specific name without firstName and lastName', () => { const female_specific = [ - ...(fakerMK.rawDefinitions.person?.prefix?.female ?? []), - ...(fakerMK.rawDefinitions.person?.first_name?.female ?? []), - ...(fakerMK.rawDefinitions.person?.last_name?.female ?? []), - // ...(fakerMK.rawDefinitions.person?.suffix ?? []), Not applicable + ...(fakerMK.fakerCore.locale.person?.prefix?.female ?? []), + ...(fakerMK.fakerCore.locale.person?.first_name?.female ?? []), + ...(fakerMK.fakerCore.locale.person?.last_name?.female ?? []), + // ...(fakerMK.fakerCore.locale.person?.suffix ?? []), Not applicable ]; const fullName = fakerMK.person.fullName({ sex: 'female' }); @@ -140,9 +174,9 @@ describe('person', () => { it('should return a male sex-specific name without firstName and lastName', () => { const male_specific = [ - ...(fakerMK.rawDefinitions.person?.prefix?.male ?? []), - ...(fakerMK.rawDefinitions.person?.first_name?.male ?? []), - ...(fakerMK.rawDefinitions.person?.last_name?.male ?? []), + ...(fakerMK.fakerCore.locale.person?.prefix?.male ?? []), + ...(fakerMK.fakerCore.locale.person?.first_name?.male ?? []), + ...(fakerMK.fakerCore.locale.person?.last_name?.male ?? []), // ...(fakerMK.rawDefinitions.person?.suffix ?? []), Not applicable ]; @@ -156,10 +190,10 @@ describe('person', () => { it('should return a female sex-specific name with given firstName and lastName', () => { const male_specific = [ - ...(fakerMK.rawDefinitions.person?.prefix?.female ?? []), + ...(fakerMK.fakerCore.locale.person?.prefix?.female ?? []), 'firstName', 'lastName', - // ...(fakerMK.rawDefinitions.person?.suffix ?? []), Not applicable + // ...(fakerMK.fakerCore.locale.person?.suffix ?? []), Not applicable ]; const fullName = fakerMK.person.fullName({ @@ -176,10 +210,10 @@ describe('person', () => { it('should return a male sex-specific name with given firstName and lastName', () => { const male_specific = [ - ...(fakerMK.rawDefinitions.person?.prefix?.male ?? []), + ...(fakerMK.fakerCore.locale.person?.prefix?.male ?? []), 'firstName', 'lastName', - // ...(fakerMK.rawDefinitions.person?.suffix ?? []), Not applicable + // ...(fakerMK.fakerCore.locale.person?.suffix ?? []), Not applicable ]; const fullName = fakerMK.person.fullName({ @@ -200,7 +234,9 @@ describe('person', () => { const gender = faker.person.gender(); expect(gender).toBeTypeOf('string'); - expect(faker.definitions.person.gender).toContain(gender); + expect( + resolveLocaleData(faker.fakerCore, 'person', 'gender') + ).toContain(gender); }); }); @@ -209,7 +245,9 @@ describe('person', () => { const sex = faker.person.sex(); expect(sex).toBeTypeOf('string'); - expect(faker.definitions.person.sex).toContain(sex); + expect(resolveLocaleData(faker.fakerCore, 'person', 'sex')).toContain( + sex + ); }); }); @@ -227,21 +265,27 @@ describe('person', () => { const prefix = faker.person.prefix(); expect(prefix).toBeTypeOf('string'); - expect(faker.definitions.person.prefix.generic).toContain(prefix); + expect( + resolveLocaleData(faker.fakerCore, 'person', 'prefix').generic + ).toContain(prefix); }); it('should return a female prefix with given string', () => { const prefix = fakerMK.person.prefix('female'); expect(prefix).toBeTypeOf('string'); - expect(fakerMK.definitions.person.prefix.female).toContain(prefix); + expect( + resolveLocaleData(fakerMK.fakerCore, 'person', 'prefix').female + ).toContain(prefix); }); it('should return a male prefix with given string', () => { const prefix = fakerMK.person.prefix('male'); expect(prefix).toBeTypeOf('string'); - expect(fakerMK.definitions.person.prefix.male).toContain(prefix); + expect( + resolveLocaleData(fakerMK.fakerCore, 'person', 'prefix').male + ).toContain(prefix); }); }); @@ -250,7 +294,9 @@ describe('person', () => { const suffix = faker.person.suffix(); expect(suffix).toBeTypeOf('string'); - expect(faker.definitions.person.suffix).toContain(suffix); + expect( + resolveLocaleData(faker.fakerCore, 'person', 'suffix') + ).toContain(suffix); }); }); @@ -262,9 +308,15 @@ describe('person', () => { const [descriptor, level, job] = jobTitle.split(' '); - expect(faker.definitions.person.job_descriptor).toContain(descriptor); - expect(faker.definitions.person.job_area).toContain(level); - expect(faker.definitions.person.job_type).toContain(job); + expect( + resolveLocaleData(faker.fakerCore, 'person', 'job_descriptor') + ).toContain(descriptor); + expect( + resolveLocaleData(faker.fakerCore, 'person', 'job_area') + ).toContain(level); + expect( + resolveLocaleData(faker.fakerCore, 'person', 'job_type') + ).toContain(job); }); }); @@ -274,7 +326,9 @@ describe('person', () => { expect(descriptor).toBeTypeOf('string'); - expect(faker.definitions.person.job_descriptor).toContain(descriptor); + expect( + resolveLocaleData(faker.fakerCore, 'person', 'job_descriptor') + ).toContain(descriptor); }); }); @@ -284,7 +338,9 @@ describe('person', () => { expect(level).toBeTypeOf('string'); - expect(faker.definitions.person.job_area).toContain(level); + expect( + resolveLocaleData(faker.fakerCore, 'person', 'job_area') + ).toContain(level); }); }); @@ -294,7 +350,9 @@ describe('person', () => { expect(job).toBeTypeOf('string'); - expect(faker.definitions.person.job_type).toContain(job); + expect( + resolveLocaleData(faker.fakerCore, 'person', 'job_type') + ).toContain(job); }); }); @@ -304,7 +362,9 @@ describe('person', () => { expect(sign).toBeTypeOf('string'); - expect(faker.definitions.person.western_zodiac_sign).toContain(sign); + expect( + resolveLocaleData(faker.fakerCore, 'person', 'western_zodiac_sign') + ).toContain(sign); }); }); } diff --git a/test/modules/science.spec.ts b/test/modules/science.spec.ts index 051fecbb3cf..d37b901e2ca 100644 --- a/test/modules/science.spec.ts +++ b/test/modules/science.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { faker } from '../../src'; +import { faker, resolveLocaleData } from '../../src'; import { seededTests } from '../support/seeded-runs'; import { times } from './../support/times'; @@ -28,9 +28,11 @@ describe('science', () => { expect(name).toBeTypeOf('string'); expect(() => { - faker.definitions.science.chemical_element.find( - (element) => element.name === name - ); + resolveLocaleData( + faker.fakerCore, + 'science', + 'chemical_element' + ).find((element) => element.name === name); }).toBeTruthy(); }); @@ -39,9 +41,11 @@ describe('science', () => { expect(symbol).toBeTypeOf('string'); expect(() => { - faker.definitions.science.chemical_element.find( - (element) => element.symbol === symbol - ); + resolveLocaleData( + faker.fakerCore, + 'science', + 'chemical_element' + ).find((element) => element.symbol === symbol); }).toBeTruthy(); }); @@ -50,9 +54,11 @@ describe('science', () => { expect(atomicNumber).toBeTypeOf('number'); expect(() => { - faker.definitions.science.chemical_element.find( - (element) => element.atomicNumber === atomicNumber - ); + resolveLocaleData( + faker.fakerCore, + 'science', + 'chemical_element' + ).find((element) => element.atomicNumber === atomicNumber); }).toBeTruthy(); }); }); @@ -69,7 +75,9 @@ describe('science', () => { expect(name).toBeTypeOf('string'); expect(() => { - faker.definitions.science.unit.find((unit) => unit.name === name); + resolveLocaleData(faker.fakerCore, 'science', 'unit').find( + (unit) => unit.name === name + ); }).toBeTruthy(); }); @@ -78,7 +86,7 @@ describe('science', () => { expect(symbol).toBeTypeOf('string'); expect(() => { - faker.definitions.science.unit.find( + resolveLocaleData(faker.fakerCore, 'science', 'unit').find( (unit) => unit.symbol === symbol ); }).toBeTruthy(); diff --git a/test/modules/vehicle.spec.ts b/test/modules/vehicle.spec.ts index 93f93b91626..c278ea8c556 100644 --- a/test/modules/vehicle.spec.ts +++ b/test/modules/vehicle.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { faker } from '../../src'; +import { faker, resolveLocaleData } from '../../src'; import { seededTests } from '../support/seeded-runs'; import { times } from './../support/times'; @@ -39,9 +39,9 @@ describe('vehicle', () => { expect(manufacturer).toBeTruthy(); expect(manufacturer).toBeTypeOf('string'); - expect(faker.definitions.vehicle.manufacturer).toContain( - manufacturer - ); + expect( + resolveLocaleData(faker.fakerCore, 'vehicle', 'manufacturer') + ).toContain(manufacturer); }); }); @@ -51,7 +51,9 @@ describe('vehicle', () => { expect(model).toBeTruthy(); expect(model).toBeTypeOf('string'); - expect(faker.definitions.vehicle.model).toContain(model); + expect( + resolveLocaleData(faker.fakerCore, 'vehicle', 'model') + ).toContain(model); }); }); @@ -61,7 +63,9 @@ describe('vehicle', () => { expect(type).toBeTruthy(); expect(type).toBeTypeOf('string'); - expect(faker.definitions.vehicle.type).toContain(type); + expect( + resolveLocaleData(faker.fakerCore, 'vehicle', 'type') + ).toContain(type); }); }); @@ -71,7 +75,9 @@ describe('vehicle', () => { expect(fuel).toBeTruthy(); expect(fuel).toBeTypeOf('string'); - expect(faker.definitions.vehicle.fuel).toContain(fuel); + expect( + resolveLocaleData(faker.fakerCore, 'vehicle', 'fuel') + ).toContain(fuel); }); }); @@ -81,7 +87,9 @@ describe('vehicle', () => { expect(color).toBeTruthy(); expect(color).toBeTypeOf('string'); - expect(faker.definitions.color.human).toContain(color); + expect( + resolveLocaleData(faker.fakerCore, 'color', 'human') + ).toContain(color); }); }); @@ -120,7 +128,9 @@ describe('vehicle', () => { expect(bicycle).toBeTruthy(); expect(bicycle).toBeTypeOf('string'); - expect(faker.definitions.vehicle.bicycle_type).toContain(bicycle); + expect( + resolveLocaleData(faker.fakerCore, 'vehicle', 'bicycle_type') + ).toContain(bicycle); }); }); } diff --git a/test/modules/word.spec.ts b/test/modules/word.spec.ts index 121cce84f8b..34d139da3c3 100644 --- a/test/modules/word.spec.ts +++ b/test/modules/word.spec.ts @@ -1,5 +1,5 @@ import { describe, expect, it } from 'vitest'; -import { faker } from '../../src'; +import { faker, resolveLocaleData } from '../../src'; import { filterWordListByLength } from '../../src/modules/word/filter-word-list-by-length'; import { seededTests } from '../support/seeded-runs'; import { times } from './../support/times'; @@ -128,7 +128,9 @@ describe('word', () => { expect(actual).toBeTruthy(); expect(actual).toBeTypeOf('string'); - expect(faker.definitions.word.adjective).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'word', 'adjective') + ).toContain(actual); }); }); @@ -138,7 +140,9 @@ describe('word', () => { expect(actual).toBeTruthy(); expect(actual).toBeTypeOf('string'); - expect(faker.definitions.word.adverb).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'word', 'adverb') + ).toContain(actual); }); }); @@ -148,7 +152,9 @@ describe('word', () => { expect(actual).toBeTruthy(); expect(actual).toBeTypeOf('string'); - expect(faker.definitions.word.conjunction).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'word', 'conjunction') + ).toContain(actual); }); }); @@ -158,7 +164,9 @@ describe('word', () => { expect(actual).toBeTruthy(); expect(actual).toBeTypeOf('string'); - expect(faker.definitions.word.interjection).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'word', 'interjection') + ).toContain(actual); }); }); @@ -168,7 +176,9 @@ describe('word', () => { expect(actual).toBeTruthy(); expect(actual).toBeTypeOf('string'); - expect(faker.definitions.word.noun).toContain(actual); + expect(resolveLocaleData(faker.fakerCore, 'word', 'noun')).toContain( + actual + ); }); }); @@ -178,7 +188,9 @@ describe('word', () => { expect(actual).toBeTruthy(); expect(actual).toBeTypeOf('string'); - expect(faker.definitions.word.preposition).toContain(actual); + expect( + resolveLocaleData(faker.fakerCore, 'word', 'preposition') + ).toContain(actual); }); }); @@ -188,7 +200,9 @@ describe('word', () => { expect(actual).toBeTruthy(); expect(actual).toBeTypeOf('string'); - expect(faker.definitions.word.verb).toContain(actual); + expect(resolveLocaleData(faker.fakerCore, 'word', 'verb')).toContain( + actual + ); }); }); } diff --git a/test/scripts/apidocs/verify-jsdoc-tags.spec.ts b/test/scripts/apidocs/verify-jsdoc-tags.spec.ts index 0456d8ee477..fded4f0c4e8 100644 --- a/test/scripts/apidocs/verify-jsdoc-tags.spec.ts +++ b/test/scripts/apidocs/verify-jsdoc-tags.spec.ts @@ -138,6 +138,10 @@ ${examples}`; ...new Set(examples.match(/(? 0) { examples = `import { ${imports.join( ', '