diff --git a/README.md b/README.md
index 490cacb..dfbe303 100644
--- a/README.md
+++ b/README.md
@@ -1,58 +1,17 @@
- 01: Node Ecosystem
-===
+
Code Fellows-401 Lab 1
-## Submission Instructions
- * work in a fork of this repository
- * work in a branch on your fork
- * write all of your code in a directory named `lab-` + `` **e.g.** `lab-susan`
- * submit a pull request to this repository
- * submit a link to your pull request on canvas
- * submit a question, observation, and how long you spent on canvas
+The following lab contains 2 modules along with matching tests.
-## Resources
-* [node assert docs](https://nodejs.org/dist/latest-v4.x/docs/api/assert.html)
-* [mocha docs](http://mochajs.org/#getting-started)
+The first module, greet, contains a single function that accepts a single argument. The function then interpolates the argument in the form:
-## Requirements
+hello "argument"!
-#### Configuration
-
-* include the following:
- * **README.md** - contains documentation about your lab
- * **.gitignore** - contains a robust `.gitignore` file
- * **.eslintrc** - contains the provided `.eslintrc` file
- * **.eslintignore** - contains the provided `.eslintignore` file
- * **lib/** - should contain your modules
- * **test/** - should contain your unit tests
+If there is no argument given, an error is thrown.
+If the argument is not a string, null is returned.
-#### Feature Tasks
-* create a node.js module (`greet.js`) that exports a single function
- * the `greet` function should have a single parameter that should expect a string as it's input
- * the `greet` function should return the input name, concatenated with "hello "
- * the `greet` function should return `null` if the input is not a string
-* create a node.js module named `arithmetic.js`
- * this module should have `add` and `sub` methods
- * the `add` method should contain 2 parameters
- * these parameters should be numbers and the method should return the sum of the 2 numbers
- * the `sub` method should contain 2 parameters
- * these parameters should be numbers and the method should return the first number minus the second number
-* decide on the expected behavior for non-number inputs
-#### Testing
-* write a test the expects the greet module to return "hello world!"
- * this should happen when invoked with "world!" as a parameter
-* write a test for the `add` and `subtract` methods on the arithmetic module
- * this should ensure that your functions work with number inputs
-
-#### Documentation
-* write a description of your project (this should be in your `README.md` file)
-
-###### BONUS 1pt
-* write a test that expects the greet module to return null when you use non string values
-* write a test that ensures the functions work as expected with non number inputs
-
-## Rubric
-* 2pts configuration
-* 3pts feature tasks
-* 3pts tests
-* 2pts documentation
+The second module, arithmetic, contains an object with 2 attached methods.
+Each method requires 2 arguments.
+The first method, add, returns the sum of both arguments.
+The second method, sub returns the difference of both arguments.
+If either method is executed without 2 arguments, or either argument is not a number, an error is thrown.
diff --git a/config/.eslintignore b/config/.eslintignore
new file mode 100644
index 0000000..ae8da71
--- /dev/null
+++ b/config/.eslintignore
@@ -0,0 +1,6 @@
+
+**/node_modules/*
+**/vendor/*
+**/*.min.js
+**/coverage/*
+**/build/*
diff --git a/config/.eslintrc b/config/.eslintrc
new file mode 100644
index 0000000..8dc6807
--- /dev/null
+++ b/config/.eslintrc
@@ -0,0 +1,21 @@
+{
+ "rules": {
+ "no-console": "off",
+ "indent": [ "error", 2 ],
+ "quotes": [ "error", "single" ],
+ "semi": ["error", "always"],
+ "linebreak-style": [ "error", "unix" ]
+ },
+ "env": {
+ "es6": true,
+ "node": true,
+ "mocha": true,
+ "jasmine": true
+ },
+ "ecmaFeatures": {
+ "modules": true,
+ "experimentalObjectRestSpread": true,
+ "impliedStrict": true
+ },
+ "extends": "eslint:recommended"
+}
diff --git a/config/.gitignore b/config/.gitignore
new file mode 100644
index 0000000..345130c
--- /dev/null
+++ b/config/.gitignore
@@ -0,0 +1,136 @@
+# Created by https://www.gitignore.io/api/osx,vim,node,macos,windows
+
+### macOS ###
+*.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+### Node ###
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (http://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# Typescript v1 declaration files
+typings/
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+
+
+### OSX ###
+
+# Icon must end with two \r
+
+# Thumbnails
+
+# Files that might appear in the root of a volume
+
+# Directories potentially created on remote AFP share
+
+### Vim ###
+# swap
+[._]*.s[a-v][a-z]
+[._]*.sw[a-p]
+[._]s[a-v][a-z]
+[._]sw[a-p]
+# session
+Session.vim
+# temporary
+.netrwhist
+*~
+# auto-generated tag files
+tags
+
+### Windows ###
+# Windows thumbnail cache files
+Thumbs.db
+ehthumbs.db
+ehthumbs_vista.db
+
+# Folder config file
+Desktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+# End of https://www.gitignore.io/api/osx,vim,node,macos,windows
diff --git a/lab-eddie/lib/arithmetic.js b/lab-eddie/lib/arithmetic.js
new file mode 100644
index 0000000..a2cfcfe
--- /dev/null
+++ b/lab-eddie/lib/arithmetic.js
@@ -0,0 +1,15 @@
+'use strict';
+
+module.exports = exports = {};
+
+exports.add = function(x, y) {
+ if(arguments.length !== 2) throw new Error('You must enter 2 arguements!');
+ if(typeof x !== 'number' || typeof y !== 'number') throw new Error('Both arguements must be numbers!');
+ return x + y;
+}
+
+exports.sub = function(x, y) {
+ if(arguments.length !== 2) throw new Error('You must enter 2 arguements!');
+ if(typeof x !== 'number' || typeof y !== 'number') throw new Error('Both arguements must be numbers!');
+ return x - y;
+}
diff --git a/lab-eddie/lib/greet.js b/lab-eddie/lib/greet.js
new file mode 100644
index 0000000..6f4e3f4
--- /dev/null
+++ b/lab-eddie/lib/greet.js
@@ -0,0 +1,8 @@
+'use strict';
+
+module.exports = function(name) {
+ console.log(typeof name);
+ if (!name) throw new Error('No name arguement entered!');
+ if (typeof name !== 'string') return null;
+ return `hello ${name}!`;
+};
diff --git a/lab-eddie/test/arithmetic-test.js b/lab-eddie/test/arithmetic-test.js
new file mode 100644
index 0000000..00c2cbc
--- /dev/null
+++ b/lab-eddie/test/arithmetic-test.js
@@ -0,0 +1,62 @@
+'use strict';
+
+const arithmetic = require('../lib/arithmetic.js');
+const assert = require('assert');
+
+describe('Arithmetic Module', function() {
+ describe('#add', function() {
+ it('Should return the sum of both arguements', function() {
+ let sum = arithmetic.add(4, 7);
+ assert (4 + 7 === sum, 'Answer not equal to 11');
+ sum = arithmetic.add(9, 5);
+ assert (5 + 9 === sum, 'Answer not equal to 14');
+ });
+ it('Should throw error when not given 2 arguements', function() {
+ assert.throws(function () {
+ arithmetic.add(9);
+ }, 'Error not thrown');
+
+ assert.throws(function() {
+ arithmetic.add();
+ }, 'Error not thrown');
+ });
+
+ it('Should throw error when given a NaN arguement', function() {
+ assert.throws(function() {
+ arithmetic.add('a', 5);
+ }, 'Error not thrown');
+ assert.throws(function() {
+ arithmetic.add(1, 'c');
+ }, 'Error not thrown');
+ });
+
+ });
+
+ describe('#sub', function() {
+ it('Should return the difference of both arguements', function() {
+ let range = arithmetic.sub(7, 4);
+ assert (7 - 4 === range, 'Answer not equal to 11');
+ range = arithmetic.sub(9, 5);
+ assert (9 - 5 === range, 'Answer not equal to 11');
+ });
+
+ it('Should throw error when not given 2 arguements', function() {
+ assert.throws(function () {
+ arithmetic.sub(9);
+ }, 'Error not thrown');
+
+ assert.throws(function() {
+ arithmetic.sub();
+ }, 'Error not thrown');
+ });
+
+ it('Should throw error when given a NaN arguement', function() {
+ assert.throws(function() {
+ arithmetic.sub('a', 5);
+ }, 'Error not thrown');
+ assert.throws(function() {
+ arithmetic.sub(1, 'c');
+ }, 'Error not thrown');
+ });
+ });
+});
diff --git a/lab-eddie/test/greet-test.js b/lab-eddie/test/greet-test.js
new file mode 100644
index 0000000..d0bbbc2
--- /dev/null
+++ b/lab-eddie/test/greet-test.js
@@ -0,0 +1,20 @@
+'use strict';
+
+const greet = require('../lib/greet.js');
+const assert = require('assert');
+
+describe('Greet Module', function() {
+ it('should return hello world!', function() {
+ var result = greet('world');
+ assert.ok(result === 'hello world!', 'Not equal to hello world!');
+ });
+ it('should return null!', function() {
+ var result = greet(4);
+ assert.ok(result === null, 'Not equal to null');
+ });
+ it('should throw a missing name error when no arguements are given', function() {
+ assert.throws(function() {
+ greet();
+ }, 'error not thrown');
+ });
+});