From 525fedc91bd02f53330cfb40fe228b148dcf562b Mon Sep 17 00:00:00 2001 From: Matt Mayer <152770+matthewmayer@users.noreply.github.com> Date: Fri, 8 Nov 2024 17:57:53 +0700 Subject: fix(internet): ensure domainWord always returns a valid value in all locales (#3253) --- src/modules/internet/index.ts | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) (limited to 'src/modules') diff --git a/src/modules/internet/index.ts b/src/modules/internet/index.ts index 58c6e586..115bd215 100644 --- a/src/modules/internet/index.ts +++ b/src/modules/internet/index.ts @@ -595,9 +595,32 @@ export class InternetModule extends ModuleBase { * @since 2.0.1 */ domainWord(): string { - return this.faker.helpers - .slugify(`${this.faker.word.adjective()}-${this.faker.word.noun()}`) - .toLowerCase(); + // Generate an ASCII "word" in the form `noun-adjective` + // For locales with non-ASCII characters, we fall back to lorem words, or a random string + const isValidSlug = (slug: string): boolean => { + return /^[a-z][a-z-]*[a-z]$/i.exec(slug) !== null; + }; + + const makeValidSlug = (word: string): string => { + const slug1 = this.faker.helpers.slugify(word); + if (isValidSlug(slug1)) { + return slug1; + } + + const slug2 = this.faker.helpers.slugify(this.faker.lorem.word()); + if (isValidSlug(slug2)) { + return slug2; + } + + return this.faker.string.alpha({ + casing: 'lower', + length: this.faker.number.int({ min: 4, max: 8 }), + }); + }; + + const word1 = makeValidSlug(this.faker.word.adjective()); + const word2 = makeValidSlug(this.faker.word.noun()); + return `${word1}-${word2}`.toLowerCase(); } /** -- cgit v1.2.3