diff options
| author | Shinigami <[email protected]> | 2022-05-03 15:48:20 +0200 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-05-03 15:48:20 +0200 |
| commit | a2da7c496e9a3741d165ddfe6128b50837fec361 (patch) | |
| tree | 88d371bc19487bc8a34d9043035aed8e4fedd7d5 /src/modules/commerce | |
| parent | cc46a0c19af2752b6210c24b715fcce20197b6d9 (diff) | |
| download | faker-a2da7c496e9a3741d165ddfe6128b50837fec361.tar.xz faker-a2da7c496e9a3741d165ddfe6128b50837fec361.zip | |
refactor!: reorganize src folder (#909)
Diffstat (limited to 'src/modules/commerce')
| -rw-r--r-- | src/modules/commerce/index.ts | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/src/modules/commerce/index.ts b/src/modules/commerce/index.ts new file mode 100644 index 00000000..71ce96d6 --- /dev/null +++ b/src/modules/commerce/index.ts @@ -0,0 +1,133 @@ +import type { Faker } from '../..'; + +/** + * Module to generate commerce and product related entries. + */ +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); + } + } + + /** + * Returns a human readable color name. + * + * @example + * faker.commerce.color() // 'red' + */ + color(): string { + return this.faker.helpers.arrayElement( + this.faker.definitions.commerce.color + ); + } + + /** + * Returns a department inside a shop. + * + * @example + * faker.commerce.department() // 'Garden' + */ + department(): string { + return this.faker.helpers.arrayElement( + this.faker.definitions.commerce.department + ); + } + + /** + * Generates a random descriptive product name. + * + * @example + * faker.commerce.productName() // 'Incredible Soft Gloves' + */ + productName(): string { + return `${this.productAdjective()} ${this.productMaterial()} ${this.product()}`; + } + + /** + * Generates a price between min and max (inclusive). + * + * @param min The minimum price. Defaults to `1`. + * @param max The maximum price. Defaults to `1000`. + * @param dec The number of decimal places. Defaults to `2`. + * @param symbol The currency value to use. Defaults to `''`. + * + * @example + * faker.commerce.price() // 828.00 + * faker.commerce.price(100) // 904.00 + * faker.commerce.price(100, 200) // 154.00 + * faker.commerce.price(100, 200, 0) // 133 + * faker.commerce.price(100, 200, 0, '$') // $114 + */ + 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 + ) + ); + } + + /** + * Returns an adjective describing a product. + * + * @example + * faker.commerce.productAdjective() // 'Handcrafted' + */ + productAdjective(): string { + return this.faker.helpers.arrayElement( + this.faker.definitions.commerce.product_name.adjective + ); + } + + /** + * Returns a material of a product. + * + * @example + * faker.commerce.productMaterial() // 'Rubber' + */ + productMaterial(): string { + return this.faker.helpers.arrayElement( + this.faker.definitions.commerce.product_name.material + ); + } + + /** + * Returns a short product name. + * + * @example + * faker.commerce.product() // 'Computer' + */ + product(): string { + return this.faker.helpers.arrayElement( + this.faker.definitions.commerce.product_name.product + ); + } + + /** + * Returns a product description. + * + * @example + * faker.commerce.productDescription() // 'Andy shoes are designed to keeping...' + */ + productDescription(): string { + return this.faker.helpers.arrayElement( + this.faker.definitions.commerce.product_description + ); + } +} |
