aboutsummaryrefslogtreecommitdiff
path: root/src/modules/git/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/git/index.ts')
-rw-r--r--src/modules/git/index.ts134
1 files changed, 134 insertions, 0 deletions
diff --git a/src/modules/git/index.ts b/src/modules/git/index.ts
new file mode 100644
index 00000000..e86f6648
--- /dev/null
+++ b/src/modules/git/index.ts
@@ -0,0 +1,134 @@
+import type { Faker } from '../..';
+
+/**
+ * Module to generate git related entries.
+ */
+export class Git {
+ private hexChars = [
+ '0',
+ '1',
+ '2',
+ '3',
+ '4',
+ '5',
+ '6',
+ '7',
+ '8',
+ '9',
+ 'a',
+ 'b',
+ 'c',
+ 'd',
+ 'e',
+ 'f',
+ ];
+
+ constructor(private readonly faker: Faker) {
+ // Bind `this` so namespaced is working correctly
+ for (const name of Object.getOwnPropertyNames(Git.prototype)) {
+ if (name === 'constructor' || typeof this[name] !== 'function') {
+ continue;
+ }
+ this[name] = this[name].bind(this);
+ }
+ }
+
+ /**
+ * Generates a random branch name.
+ *
+ * @example
+ * faker.git.branch() // 'feed-parse'
+ */
+ branch(): string {
+ const noun = this.faker.hacker.noun().replace(' ', '-');
+ const verb = this.faker.hacker.verb().replace(' ', '-');
+ return `${noun}-${verb}`;
+ }
+
+ /**
+ * Generates a random commit entry.
+ *
+ * @param options Options for the commit entry.
+ * @param options.merge Set to `true` to generate a merge message line.
+ * @param options.eol Choose the end of line character to use. Defaults to 'CRLF'.
+ * 'LF' = '\n',
+ * 'CRLF' = '\r\n'
+ *
+ * @example
+ * faker.git.commitEntry()
+ * // commit fe8c38a965d13d9794eb36918cb24cebe49a45c2
+ * // Author: Mable Harvey <[email protected]>
+ * // Date: Sat Feb 05 2022 15:09:18 GMT+0100 (Mitteleuropäische Normalzeit)
+ * //
+ * // copy primary system
+ */
+ commitEntry(
+ options: {
+ merge?: boolean;
+ eol?: 'LF' | 'CRLF';
+ } = {}
+ ): string {
+ const lines = [`commit ${this.faker.git.commitSha()}`];
+
+ if (options.merge || this.faker.datatype.number({ min: 0, max: 4 }) === 0) {
+ lines.push(`Merge: ${this.shortSha()} ${this.shortSha()}`);
+ }
+
+ lines.push(
+ `Author: ${this.faker.name.firstName()} ${this.faker.name.lastName()} <${this.faker.internet.email()}>`,
+ `Date: ${this.faker.date.recent().toString()}`,
+ '',
+ `\xa0\xa0\xa0\xa0${this.commitMessage()}`,
+ // to end with a eol char
+ ''
+ );
+
+ const eolOption = options.eol ?? 'CRLF';
+ const eolChar = eolOption === 'CRLF' ? '\r\n' : '\n';
+ const entry = lines.join(eolChar);
+
+ return entry;
+ }
+
+ /**
+ * Generates a random commit message.
+ *
+ * @example
+ * faker.git.commitMessage() // 'reboot cross-platform driver'
+ */
+ commitMessage(): string {
+ return `${this.faker.hacker.verb()} ${this.faker.hacker.adjective()} ${this.faker.hacker.noun()}`;
+ }
+
+ /**
+ * Generates a random commit sha (full).
+ *
+ * @example
+ * faker.git.commitSha() // '2c6e3880fd94ddb7ef72d34e683cdc0c47bec6e6'
+ */
+ commitSha(): string {
+ let commit = '';
+
+ for (let i = 0; i < 40; i++) {
+ commit += this.faker.helpers.arrayElement(this.hexChars);
+ }
+
+ return commit;
+ }
+
+ /**
+ * Generates a random commit sha (short).
+ *
+ * @example
+ * faker.git.shortSha() // '6155732'
+ */
+ shortSha(): string {
+ let shortSha = '';
+
+ for (let i = 0; i < 7; i++) {
+ shortSha += this.faker.helpers.arrayElement(this.hexChars);
+ }
+
+ return shortSha;
+ }
+}