Unit tests & Adjustments for 3.7.0
diff --git a/README.md b/README.md
index 0f0afa5..ec14bee 100644
--- a/README.md
+++ b/README.md
@@ -96,7 +96,7 @@
 It can then be imported into your project like so.
 
 ```javascript
-import run, {ActionInterface} from "github-pages-deploy-action";
+import run from "github-pages-deploy-action";
 ```
 
 Calling the functions directly will require you to pass in an object containing the variables found in the configuration section, you'll also need to provide a `workspace` with a path to your project.
@@ -109,11 +109,12 @@
   branch: "gh-pages",
   folder: "build",
   repositoryName: "JamesIves/github-pages-deploy-action",
+  silent: true,
   workspace: "src/project/location",
 });
 ```
 
-For more information regarding the [action interface please click here](https://github.com/JamesIves/github-pages-deploy-action/blob/dev/src/constants.ts#L7).
+For more information regarding the [action interface please click here](https://github.com/JamesIves/github-pages-deploy-action/blob/dev/src/constants.ts#L7). 
 
 ## Configuration 📁
 
@@ -335,8 +336,4 @@
 
 This project would not be possible without all of our fantastic [contributors](https://github.com/JamesIves/github-pages-deploy-action/graphs/contributors).
 
-<a href="https://github.com/JamesIves/github-pages-deploy-action/graphs/contributors">
-  <img src="https://contributors-img.web.app/image?repo=JamesIves/github-pages-deploy-action" />
-</a>
-
 If you'd like to support the maintenance and upkeep of this project you can [donate via GitHub Sponsors](https://github.com/sponsors/JamesIves). This project is distributed under the [MIT](https://github.com/JamesIves/github-pages-deploy-action/blob/dev/LICENSE) license.
\ No newline at end of file
diff --git a/__tests__/git.test.ts b/__tests__/git.test.ts
index 1ef54c6..0ccb78b 100644
--- a/__tests__/git.test.ts
+++ b/__tests__/git.test.ts
@@ -23,7 +23,8 @@
 }))
 
 jest.mock('../src/execute', () => ({
-  execute: jest.fn()
+  __esModule: true,
+  execute: jest.fn(),
 }))
 
 describe('git', () => {
@@ -50,6 +51,33 @@
       await init(action)
       expect(execute).toBeCalledTimes(7)
     })
+
+    it('should catch when a function throws an error', async () => {
+
+      (execute as jest.Mock).mockImplementationOnce(() => {
+        throw new Error('Mocked throw');
+      });
+
+      Object.assign(action, {
+        silent: false,
+        repositoryPath: 'JamesIves/github-pages-deploy-action',
+        accessToken: '123',
+        branch: 'branch',
+        folder: '.',
+        preserve: true,
+        isTest: true,
+        pusher: {
+          name: 'asd',
+          email: 'as@cat'
+        }
+      })
+
+      try {
+        await init(action)
+      } catch (error) {
+        expect(error.message).toBe('There was an error initializing the repository: Mocked throw ❌');
+      }
+    })
   })
 
   describe('generateBranch', () => {
@@ -68,6 +96,30 @@
       await generateBranch(action)
       expect(execute).toBeCalledTimes(6)
     })
+
+    it('should catch when a function throws an error', async () => {
+
+      (execute as jest.Mock).mockImplementationOnce(() => {
+        throw new Error('Mocked throw');
+      });
+
+      Object.assign(action, {
+        silent: false,
+        accessToken: '123',
+        branch: 'branch',
+        folder: '.',
+        pusher: {
+          name: 'asd',
+          email: 'as@cat'
+        }
+      })
+
+      try {
+        await generateBranch(action)
+      } catch (error) {
+        expect(error.message).toBe('There was an error creating the deployment branch: There was an error switching to the base branch: Mocked throw ❌ ❌');
+      }
+    })
   })
 
   describe('switchToBaseBranch', () => {
@@ -103,6 +155,32 @@
       await switchToBaseBranch(action)
       expect(execute).toBeCalledTimes(1)
     })
+
+
+    it('should catch when a function throws an error', async () => {
+
+      (execute as jest.Mock).mockImplementationOnce(() => {
+        throw new Error('Mocked throw');
+      });
+
+      Object.assign(action, {
+        silent: false,
+        baseBranch: '123',
+        accessToken: '123',
+        branch: 'branch',
+        folder: '.',
+        pusher: {
+          name: 'asd',
+          email: 'as@cat'
+        }
+      })
+
+      try {
+        await switchToBaseBranch(action)
+      } catch (error) {
+        expect(error.message).toBe('There was an error switching to the base branch: Mocked throw ❌');
+      }
+    })
   })
 
   describe('deploy', () => {
@@ -276,5 +354,30 @@
       expect(rmRF).toBeCalledTimes(1)
       expect(response).toBe(Status.SKIPPED)
     })
+
+    it('should catch when a function throws an error', async () => {
+
+      (execute as jest.Mock).mockImplementationOnce(() => {
+        throw new Error('Mocked throw');
+      });
+
+      Object.assign(action, {
+        silent: false,
+        folder: 'assets',
+        branch: 'branch',
+        gitHubToken: '123',
+        lfs: true,
+        pusher: {
+          name: 'asd',
+          email: 'as@cat'
+        }
+      })
+
+      try {
+        await deploy(action)
+      } catch (error) {
+        expect(error.message).toBe('The deploy step encountered an error: Mocked throw ❌');
+      }
+    })
   })
 })
diff --git a/__tests__/util.test.ts b/__tests__/util.test.ts
index 0437586..1f21cf3 100644
--- a/__tests__/util.test.ts
+++ b/__tests__/util.test.ts
@@ -321,7 +321,7 @@
         checkParameters(action)
       } catch (e) {
         expect(e.message).toMatch(
-          `The ${action.folderPath} directory you're trying to deploy doesn't exist.`
+          `The directory you're trying to deploy named notARealFolder doesn't exist. Please double check the path and any prerequisite build scripts and try again. ❗`
         )
       }
     })
diff --git a/src/constants.ts b/src/constants.ts
index 8c56f2a..4484344 100644
--- a/src/constants.ts
+++ b/src/constants.ts
@@ -24,6 +24,7 @@
   email?: string
   /** The folder to deploy. */
   folder: string
+  /** The auto generated folder path. */
   folderPath?: string
   /** GitHub deployment token. */
   gitHubToken?: string | null
@@ -53,6 +54,26 @@
   workspace: string
 }
 
+/** The minimum required values to run the action as a node module. */
+export interface NodeActionInterface {
+  /** Deployment access token. */
+  accessToken?: string | null
+  /** The branch that the action should deploy to. */
+  branch: string
+  /** The folder to deploy. */
+  folder: string
+  /** GitHub deployment token. */
+  gitHubToken?: string | null
+  /** The repository path, for example JamesIves/github-pages-deploy-action. */
+  repositoryName: string
+  /** Determines if the action should run in silent mode or not. */
+  silent: boolean
+  /** Set to true if you're using an ssh client in your build step. */
+  ssh?: boolean | null
+  /** The folder where your deployment project lives. */
+  workspace: string
+}
+
 /* Required action data that gets initialized when running within the GitHub Actions environment. */
 export const action: ActionInterface = {
   accessToken: getInput('ACCESS_TOKEN'),
@@ -107,6 +128,7 @@
   workspace: process.env.GITHUB_WORKSPACE || ''
 }
 
+/**  */
 export type RequiredActionParameters = Pick<
   ActionInterface,
   'accessToken' | 'gitHubToken' | 'ssh' | 'branch' | 'folder'
diff --git a/src/lib.ts b/src/lib.ts
index 6569351..47ddb7a 100644
--- a/src/lib.ts
+++ b/src/lib.ts
@@ -1,5 +1,5 @@
 import {exportVariable, info, setFailed} from '@actions/core'
-import {action, ActionInterface, Status} from './constants'
+import {ActionInterface, Status, NodeActionInterface} from './constants'
 import {deploy, init} from './git'
 import {
   generateFolderPath,
@@ -13,7 +13,7 @@
  * @param {object} configuration - The action configuration.
  */
 export default async function run(
-  configuration: ActionInterface
+  configuration: ActionInterface | NodeActionInterface
 ): Promise<void> {
   let status: Status = Status.RUNNING
 
@@ -22,25 +22,25 @@
     GitHub Pages Deploy Action 🚀
 
     🚀 Getting Started Guide: https://github.com/marketplace/actions/deploy-to-github-pages
-    ❓ FAQ/Wiki: https://github.com/JamesIves/github-pages-deploy-action/wiki
-    🔧 Support: https://github.com/JamesIves/github-pages-deploy-action/issues
+    ❓ Discussions / Q&A: https://github.com/JamesIves/github-pages-deploy-action/discussions
+    🔧 Report a Bug: https://github.com/JamesIves/github-pages-deploy-action/issues
     ⭐ Contribute: https://github.com/JamesIves/github-pages-deploy-action/blob/dev/CONTRIBUTING.md
-    
-    📣 Maintained by James Ives (https://jamesiv.es)`)
+
+    📣 Maintained by James Ives (https://jamesiv.es)
+    ❤  Support: https://github.com/sponsors/JamesIves`)
 
     info('Checking configuration and starting deployment… 🚦')
 
-    const settings = {
-      ...action,
+    const settings: ActionInterface = {
       ...configuration
     }
 
-    // Defines the folder paths
+    // Defines the repository/folder paths and token types.
+    // Also verifies that the action has all of the required parameters.
     settings.folderPath = generateFolderPath(settings)
 
     checkParameters(settings)
 
-    // Defines the repository paths and token types.
     settings.repositoryPath = generateRepositoryPath(settings)
     settings.tokenType = generateTokenType(settings)
 
diff --git a/src/util.ts b/src/util.ts
index fc52f54..cde4c3d 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -3,6 +3,7 @@
 import {isDebug} from '@actions/core'
 import {ActionInterface, RequiredActionParameters} from './constants'
 
+/* Replaces all instances of a match in a string. */
 const replaceAll = (input: string, find: string, replace: string): string =>
   input.split(find).join(replace)
 
@@ -49,6 +50,7 @@
   return Boolean(nonNullParams.length)
 }
 
+/* Verifies the action has the required parameters to run, otherwise throw an error. */
 export const checkParameters = (action: ActionInterface): void => {
   if (!hasRequiredParameters(action, ['accessToken', 'gitHubToken', 'ssh'])) {
     throw new Error(
@@ -66,7 +68,7 @@
 
   if (!existsSync(action.folderPath as string)) {
     throw new Error(
-      `The ${action.folderPath} directory you're trying to deploy doesn't exist. ❗`
+      `The directory you're trying to deploy named ${action.folderPath} doesn't exist. Please double check the path and any prerequisite build scripts and try again. ❗`
     )
   }
 }