From 4552688fd8e54bac82ca5faeb2d392dc5a41f7e4 Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Tue, 11 Jan 2022 16:53:15 +0100 Subject: [PATCH 1/3] feat: migrate system --- src/index.ts | 3 +- src/system.ts | 213 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 215 insertions(+), 1 deletion(-) create mode 100644 src/system.ts diff --git a/src/index.ts b/src/index.ts index ee741166ca5..f2f4520ef6f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -10,6 +10,7 @@ import { Internet } from './internet'; import { Mersenne } from './mersenne'; import { Name } from './name'; import { Random } from './random'; +import { System } from './system'; import { Time } from './time'; export interface FakerOptions { @@ -188,7 +189,7 @@ export class Faker { readonly music = new (require('./music'))(this); readonly name: Name = new Name(this); readonly phone = new (require('./phone_number'))(this); - readonly system = new (require('./system'))(this); + readonly system: System = new System(this); readonly time: Time = new Time(); readonly vehicle = new (require('./vehicle'))(this); readonly word = new (require('./word'))(this); diff --git a/src/system.ts b/src/system.ts new file mode 100644 index 00000000000..9a606bf94b6 --- /dev/null +++ b/src/system.ts @@ -0,0 +1,213 @@ +// generates fake data for many computer systems properties + +import type { Faker } from '.'; + +const commonFileTypes = ['video', 'audio', 'image', 'text', 'application']; + +const commonMimeTypes = [ + 'application/pdf', + 'audio/mpeg', + 'audio/wav', + 'image/png', + 'image/jpeg', + 'image/gif', + 'video/mp4', + 'video/mpeg', + 'text/html', +]; + +function setToArray(set: Set): T[] { + // shortcut if Array.from is available + if (Array.from) { + return Array.from(set); + } + + const array: T[] = []; + set.forEach((item) => { + array.push(item); + }); + return array; +} + +export class System { + constructor(private readonly faker: Faker) { + // Bind `this` so namespaced is working correctly + for (const name of Object.getOwnPropertyNames(System.prototype)) { + if (name === 'constructor' || typeof this[name] !== 'function') { + continue; + } + this[name] = this[name].bind(this); + } + } + + /** + * generates a file name + * + * @method faker.system.fileName + */ + fileName() { + var str = this.faker.random.words(); + str = + str.toLowerCase().replace(/\W/g, '_') + '.' + this.faker.system.fileExt(); + return str; + } + + /** + * commonFileName + * + * @method faker.system.commonFileName + * @param {string} ext + */ + commonFileName(ext) { + var str = this.faker.random.words(); + str = str.toLowerCase().replace(/\W/g, '_'); + str += '.' + (ext || this.faker.system.commonFileExt()); + return str; + } + + /** + * mimeType + * + * @method faker.system.mimeType + */ + mimeType() { + var typeSet = new Set(); + var extensionSet = new Set(); + var mimeTypes = this.faker.definitions.system.mimeTypes; + + Object.keys(mimeTypes).forEach(function (m) { + var type = m.split('/')[0]; + + typeSet.add(type); + + if (mimeTypes[m].extensions instanceof Array) { + mimeTypes[m].extensions.forEach(function (ext) { + extensionSet.add(ext); + }); + } + }); + + var types = setToArray(typeSet); + var extensions = setToArray(extensionSet); + var mimeTypeKeys = Object.keys(this.faker.definitions.system.mimeTypes); + + return this.faker.random.arrayElement(mimeTypeKeys); + } + + /** + * returns a commonly used file type + * + * @method faker.system.commonFileType + */ + commonFileType() { + return this.faker.random.arrayElement(commonFileTypes); + } + + /** + * returns a commonly used file extension + * + * @method faker.system.commonFileExt + */ + commonFileExt() { + return this.faker.system.fileExt( + this.faker.random.arrayElement(commonMimeTypes) + ); + } + + /** + * returns any file type available as mime-type + * + * @method faker.system.fileType + */ + fileType() { + var typeSet = new Set(); + var extensionSet = new Set(); + var mimeTypes = this.faker.definitions.system.mimeTypes; + + Object.keys(mimeTypes).forEach(function (m) { + var type = m.split('/')[0]; + + typeSet.add(type); + + if (mimeTypes[m].extensions instanceof Array) { + mimeTypes[m].extensions.forEach(function (ext) { + extensionSet.add(ext); + }); + } + }); + + var types = setToArray(typeSet); + var extensions = setToArray(extensionSet); + var mimeTypeKeys = Object.keys(this.faker.definitions.system.mimeTypes); + return this.faker.random.arrayElement(types); + } + + /** + * fileExt + * + * @method faker.system.fileExt + * @param {string} mimeType + */ + fileExt(mimeType) { + var typeSet = new Set(); + var extensionSet = new Set(); + var mimeTypes = this.faker.definitions.system.mimeTypes; + + Object.keys(mimeTypes).forEach(function (m) { + var type = m.split('/')[0]; + + typeSet.add(type); + + if (mimeTypes[m].extensions instanceof Array) { + mimeTypes[m].extensions.forEach(function (ext) { + extensionSet.add(ext); + }); + } + }); + + var types = setToArray(typeSet); + var extensions = setToArray(extensionSet); + var mimeTypeKeys = Object.keys(this.faker.definitions.system.mimeTypes); + + if (mimeType) { + var mimes = this.faker.definitions.system.mimeTypes; + return this.faker.random.arrayElement(mimes[mimeType].extensions); + } + + return this.faker.random.arrayElement(extensions); + } + + /** + * returns directory path + * + * @method faker.system.directoryPath + */ + directoryPath() { + var paths = this.faker.definitions.system.directoryPaths; + return this.faker.random.arrayElement(paths); + } + + /** + * returns file path + * + * @method faker.system.filePath + */ + filePath() { + return this.faker.fake( + '{{system.directoryPath}}/{{system.fileName}}.{{system.fileExt}}' + ); + } + + /** + * semver + * + * @method faker.system.semver + */ + semver() { + return [ + this.faker.datatype.number(9), + this.faker.datatype.number(9), + this.faker.datatype.number(9), + ].join('.'); + } +} From eb916a01746002fd373d74302648d736a3d5649a Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Tue, 11 Jan 2022 17:03:27 +0100 Subject: [PATCH 2/3] chore: improve --- src/system.ts | 80 +++++++++++++++++++++++++-------------------------- 1 file changed, 40 insertions(+), 40 deletions(-) diff --git a/src/system.ts b/src/system.ts index 9a606bf94b6..ecbb39691fd 100644 --- a/src/system.ts +++ b/src/system.ts @@ -46,7 +46,7 @@ export class System { * @method faker.system.fileName */ fileName() { - var str = this.faker.random.words(); + let str = this.faker.random.words(); str = str.toLowerCase().replace(/\W/g, '_') + '.' + this.faker.system.fileExt(); return str; @@ -56,10 +56,10 @@ export class System { * commonFileName * * @method faker.system.commonFileName - * @param {string} ext + * @param ext */ - commonFileName(ext) { - var str = this.faker.random.words(); + commonFileName(ext): string { + let str = this.faker.random.words(); str = str.toLowerCase().replace(/\W/g, '_'); str += '.' + (ext || this.faker.system.commonFileExt()); return str; @@ -71,31 +71,31 @@ export class System { * @method faker.system.mimeType */ mimeType() { - var typeSet = new Set(); - var extensionSet = new Set(); - var mimeTypes = this.faker.definitions.system.mimeTypes; + const typeSet = new Set(); + const extensionSet = new Set(); + const mimeTypes = this.faker.definitions.system.mimeTypes; - Object.keys(mimeTypes).forEach(function (m) { - var type = m.split('/')[0]; + Object.keys(mimeTypes).forEach((m) => { + const type = m.split('/')[0]; typeSet.add(type); if (mimeTypes[m].extensions instanceof Array) { - mimeTypes[m].extensions.forEach(function (ext) { + mimeTypes[m].extensions.forEach((ext) => { extensionSet.add(ext); }); } }); - var types = setToArray(typeSet); - var extensions = setToArray(extensionSet); - var mimeTypeKeys = Object.keys(this.faker.definitions.system.mimeTypes); + const types = setToArray(typeSet); + const extensions = setToArray(extensionSet); + const mimeTypeKeys = Object.keys(this.faker.definitions.system.mimeTypes); return this.faker.random.arrayElement(mimeTypeKeys); } /** - * returns a commonly used file type + * Returns a commonly used file type * * @method faker.system.commonFileType */ @@ -104,7 +104,7 @@ export class System { } /** - * returns a commonly used file extension + * Returns a commonly used file extension * * @method faker.system.commonFileExt */ @@ -115,30 +115,30 @@ export class System { } /** - * returns any file type available as mime-type + * Returns any file type available as mime-type * * @method faker.system.fileType */ fileType() { - var typeSet = new Set(); - var extensionSet = new Set(); - var mimeTypes = this.faker.definitions.system.mimeTypes; + const typeSet = new Set(); + const extensionSet = new Set(); + const mimeTypes = this.faker.definitions.system.mimeTypes; - Object.keys(mimeTypes).forEach(function (m) { - var type = m.split('/')[0]; + Object.keys(mimeTypes).forEach((m) => { + const type = m.split('/')[0]; typeSet.add(type); if (mimeTypes[m].extensions instanceof Array) { - mimeTypes[m].extensions.forEach(function (ext) { + mimeTypes[m].extensions.forEach((ext) => { extensionSet.add(ext); }); } }); - var types = setToArray(typeSet); - var extensions = setToArray(extensionSet); - var mimeTypeKeys = Object.keys(this.faker.definitions.system.mimeTypes); + const types = setToArray(typeSet); + const extensions = setToArray(extensionSet); + const mimeTypeKeys = Object.keys(this.faker.definitions.system.mimeTypes); return this.faker.random.arrayElement(types); } @@ -146,31 +146,31 @@ export class System { * fileExt * * @method faker.system.fileExt - * @param {string} mimeType + * @param mimeType */ fileExt(mimeType) { - var typeSet = new Set(); - var extensionSet = new Set(); - var mimeTypes = this.faker.definitions.system.mimeTypes; + const typeSet = new Set(); + const extensionSet = new Set(); + const mimeTypes = this.faker.definitions.system.mimeTypes; - Object.keys(mimeTypes).forEach(function (m) { - var type = m.split('/')[0]; + Object.keys(mimeTypes).forEach((m) => { + const type = m.split('/')[0]; typeSet.add(type); if (mimeTypes[m].extensions instanceof Array) { - mimeTypes[m].extensions.forEach(function (ext) { + mimeTypes[m].extensions.forEach((ext) => { extensionSet.add(ext); }); } }); - var types = setToArray(typeSet); - var extensions = setToArray(extensionSet); - var mimeTypeKeys = Object.keys(this.faker.definitions.system.mimeTypes); + const types = setToArray(typeSet); + const extensions = setToArray(extensionSet); + const mimeTypeKeys = Object.keys(this.faker.definitions.system.mimeTypes); if (mimeType) { - var mimes = this.faker.definitions.system.mimeTypes; + const mimes = this.faker.definitions.system.mimeTypes; return this.faker.random.arrayElement(mimes[mimeType].extensions); } @@ -178,12 +178,12 @@ export class System { } /** - * returns directory path + * Returns directory path * * @method faker.system.directoryPath */ - directoryPath() { - var paths = this.faker.definitions.system.directoryPaths; + directoryPath(): string { + const paths = this.faker.definitions.system.directoryPaths; return this.faker.random.arrayElement(paths); } @@ -203,7 +203,7 @@ export class System { * * @method faker.system.semver */ - semver() { + semver(): string { return [ this.faker.datatype.number(9), this.faker.datatype.number(9), From 44a9ef8035f7a207fc762533d5f9cecbcd9be62c Mon Sep 17 00:00:00 2001 From: Shinigami92 Date: Wed, 12 Jan 2022 20:22:09 +0100 Subject: [PATCH 3/3] chore: add types --- src/system.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/system.ts b/src/system.ts index ecbb39691fd..652cb277c95 100644 --- a/src/system.ts +++ b/src/system.ts @@ -148,9 +148,9 @@ export class System { * @method faker.system.fileExt * @param mimeType */ - fileExt(mimeType) { + fileExt(mimeType?: string): string { const typeSet = new Set(); - const extensionSet = new Set(); + const extensionSet = new Set(); const mimeTypes = this.faker.definitions.system.mimeTypes; Object.keys(mimeTypes).forEach((m) => {