From 3970f3f11feb67d741fe40e9b4f937e7cec915a0 Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Wed, 12 Jan 2022 18:03:35 +0100 Subject: [PATCH] feat: migrate commerce --- src/commerce.ts | 151 ++++++++++++++++++++++++++++++++++++++++++++++++ src/index.ts | 3 +- 2 files changed, 153 insertions(+), 1 deletion(-) create mode 100644 src/commerce.ts diff --git a/src/commerce.ts b/src/commerce.ts new file mode 100644 index 00000000000..61a5f5a1011 --- /dev/null +++ b/src/commerce.ts @@ -0,0 +1,151 @@ +import type { Faker } from '.'; + +export class Commerce { + constructor(private readonly faker: Faker) { + // Bind `this` so namespaced is working correctly + for (const name of Object.getOwnPropertyNames(Commerce.prototype)) { + if (name === 'constructor' || typeof this[name] !== 'function') { + continue; + } + this[name] = this[name].bind(this); + } + } + + /** + * color + * + * @method faker.commerce.color + */ + color(): string { + return this.faker.random.arrayElement( + this.faker.definitions.commerce.color + ); + } + + /** + * department + * + * @method faker.commerce.department + */ + department(): string { + return this.faker.random.arrayElement( + this.faker.definitions.commerce.department + ); + } + + /** + * productName + * + * @method faker.commerce.productName + */ + productName(): string { + return ( + this.faker.commerce.productAdjective() + + ' ' + + this.faker.commerce.productMaterial() + + ' ' + + this.faker.commerce.product() + ); + } + + /** + * price + * + * @method faker.commerce.price + * @param min + * @param max + * @param dec + * @param symbol + */ + price( + min: number = 1, + max: number = 1000, + dec: number = 2, + symbol: string = '' + ): string { + if (min < 0 || max < 0) { + return symbol + 0.0; + } + + const randValue = this.faker.datatype.number({ max: max, min: min }); + + return ( + symbol + + (Math.round(randValue * Math.pow(10, dec)) / Math.pow(10, dec)).toFixed( + dec + ) + ); + } + + // TODO @Shinigami92 2022-01-12: unimplemented member functions + + /* + categories (num) { + var categories = []; + + do { + var category = this.faker.random.arrayElement(this.faker.definitions.commerce.department); + if(categories.indexOf(category) === -1) { + categories.push(category); + } + } while(categories.length < num); + + return categories; + }; + + */ + /* + mergeCategories (categories) { + var separator = this.faker.definitions.separator || " &"; + // TODO: find undefined here + categories = categories || this.faker.definitions.commerce.categories; + var commaSeparated = categories.slice(0, -1).join(', '); + + return [commaSeparated, categories[categories.length - 1]].join(separator + " "); + }; + */ + + /** + * productAdjective + * + * @method faker.commerce.productAdjective + */ + productAdjective(): string { + return this.faker.random.arrayElement( + this.faker.definitions.commerce.product_name.adjective + ); + } + + /** + * productMaterial + * + * @method faker.commerce.productMaterial + */ + productMaterial(): string { + return this.faker.random.arrayElement( + this.faker.definitions.commerce.product_name.material + ); + } + + /** + * product + * + * @method faker.commerce.product + */ + product(): string { + return this.faker.random.arrayElement( + this.faker.definitions.commerce.product_name.product + ); + } + + /** + * productDescription + * + * @method faker.commerce.productDescription + */ + productDescription(): string { + return this.faker.random.arrayElement( + this.faker.definitions.commerce.product_description + ); + } +} diff --git a/src/index.ts b/src/index.ts index f3cde69e8ad..7b0c5e07a11 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,3 +1,4 @@ +import { Commerce } from './commerce'; import { Datatype } from './datatype'; import { Mersenne } from './mersenne'; import { Random } from './random'; @@ -163,7 +164,7 @@ export class Faker { readonly address = new (require('./address'))(this); readonly animal = new (require('./animal'))(this); - readonly commerce = new (require('./commerce'))(this); + readonly commerce: Commerce = new Commerce(this); readonly company = new (require('./company'))(this); readonly database = new (require('./database'))(this); readonly date = new (require('./date'))(this);