@rrgayhart/load-machine v1.0.2
Load Machine
A small library that creates button assignments for loading a vending machine. Created for a Turing School of Software and Design lesson Build an NPM Module
Installation
  npm install @rrgayhart/load-machine
Usage
loadMachine(items, opts)
- items: required can be an array of multiple items or single object, string, number 
- opts: optional if included, will be an object allowing the following keys - height: max height of the vending machine - default: 8
 
- width: width of vending machine - default: 6
 
 - storage: an object with existing items 
  var loadMachine = require('load-machine');
  var candies = [
    {name: 'Twix Bar'},
    {name: 'Snickers'}
  ]
  var result = loadMachine(candies);
  // console.log(result)
  // {
    // a1: {name: 'Twix Bar'},
    // a2: {name: 'Snickers'}
  // }
  loadMachine({name: 'Smarties'})
  // {
    // a1: {name: 'Twix Bar'},
    // a2: {name: 'Snickers'},
    // a3: {name: 'Smarties'}
  // }Tests
  npm test
Contributing
In lieu of a formal style guide, take care to maintain the existing coding style. Add unit tests for any new or changed functionality. Lint and test your code.
Background
Relates to lesson Build an NPM Module
Steps I took to create this module
Creating
mkdir load-machine
cd load-machineWhere do we start writing code?
touch index.jsThis code is going to be used by other people. So write tests.
  npm i mocha -D
  npm i chai -D  mkdir test && touch test/test.jsUpdate scripts in the package.json
"scripts": {
  "test": "mocha --reporter spec"
}Packaging
Creating a User
  npm adduser
  npm loginNPM init
I have made sure my app is up on Github first (allows NPM to autofill the repository details, which is nice)
Now I'll set npm up by running:
  npm init --scope=usernameNote: I am namespacing my module, so that I don't hijack a name that someone else could use for a far better npm module than this one :D
The resulting JSON looks like:
{
  "name": "@rrgayhart/load-machine",
  "version": "1.0.0",
  "description": "'my first npm module'",
  "main": "index.js",
  "scripts": {
    "test": "mocha --reporter nyan",
    "lint": "eslint .",
    "lint-fix": "eslint . --fix"
  },
  "author": "Romeeka Gayhart",
  "license": "MIT",
  "devDependencies": {
    "chai": "^3.5.0",
    "eslint": "^3.19.0",
    "mocha": "^3.2.0"
  },
  "directories": {
    "test": "test"
  },
  "dependencies": {
    "chai": "^3.5.0",
    "eslint": "^3.19.0"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/rrgayhart/load-machine.git"
  },
  "keywords": [
    "vending",
    "machine"
  ],
  "bugs": {
    "url": "https://github.com/rrgayhart/load-machine/issues"
  },
  "homepage": "https://github.com/rrgayhart/load-machine#readme"
}Testing Locally
I wanted to test my module out in my project locally, before pushing it up to production.
In order to do that, I created a 'link'. See the npm-link documentation.
In my local module directory:
  cd load-machine
  npm linkIn the directory of the project where I am using my module:
cd project
git checkout -b 'npm-refactor'
npm link load-machineI can now use my local module as a module within my existing Vending Machine project!
  // in my actual project
  var loadMachine = require('load-machine');
  // ...
VendingMachine.prototype.loadMachine = function(input){
  loadMachine(input, {storage: this.inventory})
};Deploying to NPM
  npm publishBecause I scoped my module, I will have to tell NPM that I want it to be public.
So I actually used:
 npm publish --access=publicI can now go into my project and add the project directly
npm install --save @rrgayhart/load-machineAnd I will call use the module by requiring it by it's name (without the scope)
var loadMachine = require('load-machine')And if I instantly regret my actions....
  npm unpublish [PACKAGE NAME]