├── client ├── src │ ├── components │ │ ├── Customer │ │ │ ├── customers.css │ │ │ ├── CreateCustomer.js │ │ │ ├── CustomerDetails.js │ │ │ └── customers.js │ │ └── Home.js │ ├── history.js │ ├── App.css │ ├── index.js │ ├── reducers │ │ ├── index.js │ │ └── customerReducer.js │ ├── constants │ │ └── ActionTypes.js │ ├── common │ │ ├── Footer.js │ │ └── Header.js │ ├── store │ │ └── configureStore.js │ ├── routes.js │ ├── App.js │ └── actions │ │ └── customerAction.js ├── .gitignore ├── public │ └── index.html ├── package.json └── README.md ├── server ├── .babelrc ├── hooked.js ├── src │ ├── routes │ │ └── api.js │ └── customer │ │ ├── customerModel.js │ │ ├── customerRoute.js │ │ └── customerController.js ├── package.json ├── server.js └── package-lock.json ├── customers_api.gif ├── Redux MERN CRUD Example .gif ├── .gitignore └── README.md /client/src/components/Customer/customers.css: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /server/.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "presets": ["es2015-node6"] 3 | } 4 | -------------------------------------------------------------------------------- /customers_api.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/senthilmca90/mern-crud/HEAD/customers_api.gif -------------------------------------------------------------------------------- /Redux MERN CRUD Example .gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/senthilmca90/mern-crud/HEAD/Redux MERN CRUD Example .gif -------------------------------------------------------------------------------- /server/hooked.js: -------------------------------------------------------------------------------- 1 | require('babel-register')({ 2 | presets: ['es2015-node6'] 3 | }); 4 | require('./server.js'); 5 | -------------------------------------------------------------------------------- /client/src/history.js: -------------------------------------------------------------------------------- 1 | import createHistory from 'history/createBrowserHistory' 2 | 3 | const history = createHistory() 4 | 5 | export default history -------------------------------------------------------------------------------- /client/src/App.css: -------------------------------------------------------------------------------- 1 | .footer { 2 | position: fixed; 3 | left: 0; 4 | bottom: 0; 5 | padding: 20px; 6 | width: 100%; 7 | text-align: center; 8 | } -------------------------------------------------------------------------------- /client/src/index.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import ReactDOM from 'react-dom'; 3 | import App from './App'; 4 | ReactDOM.render( 5 | 6 | , document.getElementById('root')); 7 | -------------------------------------------------------------------------------- /client/src/reducers/index.js: -------------------------------------------------------------------------------- 1 | import { combineReducers } from 'redux' 2 | import customers from "./customerReducer"; 3 | const rootReducer = combineReducers({ 4 | customers 5 | }) 6 | 7 | export default rootReducer 8 | -------------------------------------------------------------------------------- /server/src/routes/api.js: -------------------------------------------------------------------------------- 1 | import express from 'express'; 2 | import customerRoute from "../customer/customerRoute"; 3 | 4 | const app = express(); 5 | 6 | app.use('/customers',customerRoute); 7 | 8 | module.exports = app; -------------------------------------------------------------------------------- /client/.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | node_modules 5 | 6 | # production 7 | build 8 | 9 | # misc 10 | .DS_Store 11 | npm-debug.log 12 | -------------------------------------------------------------------------------- /client/src/components/Home.js: -------------------------------------------------------------------------------- 1 | import React from 'react' 2 | 3 | const Home = () => ( 4 |
5 |

Welcome to Home Page

6 |
7 | ) 8 | 9 | 10 | export default Home; 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # See http://help.github.com/ignore-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /client/node_modules 5 | /server/node_modules 6 | 7 | # production 8 | build 9 | 10 | # misc 11 | .DS_Store 12 | npm-debug.log 13 | -------------------------------------------------------------------------------- /client/src/constants/ActionTypes.js: -------------------------------------------------------------------------------- 1 | export const GET_CUSTOMERS = "GET_CUSTOMERS"; 2 | export const VIEW_CUSTOMER = "VIEW_CUSTOMER"; 3 | export const ADD_CUSTOMER = "ADD_CUSTOMER"; 4 | export const DELETE_CUSTOMER = "DELETE_CUSTOMER"; 5 | export const UPDATE_CUSTOMER = "UPDATE_CUSTOMER"; -------------------------------------------------------------------------------- /client/src/common/Footer.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | 3 | const Footer = () => 4 | ( 5 | 10 | ) 11 | 12 | export default Footer; -------------------------------------------------------------------------------- /client/src/store/configureStore.js: -------------------------------------------------------------------------------- 1 | import {createStore, compose, applyMiddleware} from 'redux'; 2 | import thunk from 'redux-thunk'; 3 | import rootReducer from '../reducers'; 4 | // import { composeWithDevTools } from "redux-devtools-extension"; 5 | const middleware = [ 6 | thunk 7 | ] 8 | const withDevTools = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; 9 | 10 | export default createStore(rootReducer, withDevTools( 11 | applyMiddleware(...middleware) 12 | )) 13 | -------------------------------------------------------------------------------- /server/src/customer/customerModel.js: -------------------------------------------------------------------------------- 1 | import mongoose from "mongoose"; 2 | const Schema = mongoose.Schema; 3 | const AutoIncrement = require('mongoose-sequence')(mongoose); 4 | 5 | let customerSchema = new Schema({ 6 | firstName : {type:String, default : null}, 7 | lastName : {type:String, default : null}, 8 | },{timestamps : true 9 | }); 10 | 11 | customerSchema.plugin(AutoIncrement, {inc_field: 'customerId'}); 12 | const customer = mongoose.model('customer', customerSchema); 13 | module.exports = customer; -------------------------------------------------------------------------------- /server/src/customer/customerRoute.js: -------------------------------------------------------------------------------- 1 | import express from "express"; 2 | import customerController from "./customerController"; 3 | 4 | const router = express.Router(); 5 | const controller = new customerController(); 6 | 7 | router.post('/',controller.addCustomer); 8 | router.get('/',controller.getCustomers); 9 | router.get('/:id',controller.getCustomerById); 10 | router.get('/custom/:id',controller.getCustomerByCustomId); 11 | router.put('/',controller.updateCustomerById); 12 | router.delete('/',controller.deleteCustomerById); 13 | 14 | module.exports = router; 15 | 16 | 17 | -------------------------------------------------------------------------------- /client/public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Redux MERN CRUD Example 7 | 8 | 9 |
10 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /client/src/routes.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {Route, Switch} from 'react-router-dom'; 3 | import Home from './components/Home' 4 | 5 | import Customers from './components/Customer/customers' 6 | import CreateCustomer from './components/Customer/CreateCustomer' 7 | import CustomerDetails from "./components/Customer/CustomerDetails"; 8 | 9 | const routing = () =>( 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | ) 21 | export default routing; 22 | 23 | 24 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "crud-server", 3 | "version": "0.0.1", 4 | "description": "express server for mern crud app", 5 | "main": "server.js", 6 | "scripts": { 7 | "start": "nodemon hooked.js" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "" 12 | }, 13 | "keywords": [ 14 | "express", 15 | "server", 16 | "mern", 17 | "server", 18 | "app" 19 | ], 20 | "author": "Bipin Swarnkar", 21 | "license": "ISC", 22 | "dependencies": { 23 | "babel-preset-es2015-node6": "^0.4.0", 24 | "babel-register": "^6.26.0", 25 | "body-parser": "^1.18.3", 26 | "cors": "^2.8.4", 27 | "express": "^4.16.3", 28 | "mongoose": "^5.1.5", 29 | "mongoose-sequence": "^4.0.1", 30 | "morgan": "^1.9.0", 31 | "source-map-support": "^0.4.18" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mern-crud", 3 | "version": "0.0.1", 4 | "private": false, 5 | "devDependencies": { 6 | "react-scripts": "^1.1.4", 7 | "react-test-renderer": "^16.3.1" 8 | }, 9 | "dependencies": { 10 | "axios": "^0.18.0", 11 | "bootstrap": "^4.1.1", 12 | "express": "^4.16.3", 13 | "font-awesome": "^4.7.0", 14 | "history": "^4.7.2", 15 | "prop-types": "^15.6.2", 16 | "react": "^16.3.1", 17 | "react-dom": "^16.3.1", 18 | "react-redux": "^5.0.7", 19 | "react-router-dom": "^4.3.1", 20 | "react-router-redux": "^4.0.8", 21 | "redux": "^3.5.2", 22 | "redux-devtools-extension": "^2.13.5", 23 | "redux-thunk": "^2.3.0" 24 | }, 25 | "scripts": { 26 | "start": "react-scripts start", 27 | "build": "react-scripts build", 28 | "eject": "react-scripts eject", 29 | "test": "react-scripts test" 30 | }, 31 | "proxy": "http://localhost:3001/api/" 32 | } 33 | -------------------------------------------------------------------------------- /client/src/App.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import { Provider } from "react-redux"; 3 | import PropTypes from 'prop-types'; 4 | import '../node_modules/bootstrap/dist/css/bootstrap.min.css'; 5 | import '../node_modules/font-awesome/css/font-awesome.min.css'; 6 | import store from './store/configureStore'; 7 | import './App.css' 8 | import {Router} from 'react-router-dom'; 9 | 10 | import history from "./history" 11 | import Routes from './routes'; 12 | import Header from './common/Header' 13 | import Footer from './common/Footer' 14 | class App extends Component { 15 | 16 | static defaultProps = { 17 | store: PropTypes.object.isRequired, 18 | history: PropTypes.object.isRequired 19 | }; 20 | 21 | render = () => ( 22 |
23 | 24 | 25 |
26 |
27 | 28 |
29 |
30 |
31 |
32 |
33 | 34 | ) 35 | } 36 | 37 | export default App; 38 | -------------------------------------------------------------------------------- /client/src/common/Header.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import {Link} from 'react-router-dom'; 3 | const Header = () => 4 | ( 5 | 21 | ) 22 | 23 | export default Header; -------------------------------------------------------------------------------- /server/server.js: -------------------------------------------------------------------------------- 1 | import express from 'express'; 2 | import path from 'path'; 3 | import bodyParser from 'body-parser'; 4 | import logger from 'morgan'; 5 | import mongoose from 'mongoose'; 6 | import cors from 'cors'; 7 | import SourceMapSupport from 'source-map-support'; 8 | import routes from './src/routes/api'; 9 | // define our app using express 10 | const app = express(); 11 | 12 | app.use(cors()) 13 | 14 | app.use("/api/uploads", express.static(__dirname + '/uploads')); 15 | 16 | 17 | // configure app 18 | app.use(logger('dev')); 19 | app.use(bodyParser.json()); 20 | app.use(bodyParser.urlencoded({ extended:true })); 21 | app.use(express.static(path.join(__dirname, 'public'))); 22 | 23 | 24 | // set the port 25 | const port = process.env.PORT || 3001; 26 | 27 | // connect to database 28 | mongoose.Promise = global.Promise; 29 | mongoose.connect('mongodb://localhost/mern-crud'); 30 | SourceMapSupport.install(); 31 | app.get('/', (req,res) => { 32 | return res.end('Api working'); 33 | }) 34 | 35 | app.use('/api', routes); 36 | 37 | // catch 404 38 | app.use((req, res, next) => { 39 | res.status(404).send('

Page Not Found!

'); 40 | }); 41 | 42 | // start the server 43 | app.listen(port,() => { 44 | console.log(`App Server Listening at ${port}`); 45 | }); 46 | -------------------------------------------------------------------------------- /client/src/reducers/customerReducer.js: -------------------------------------------------------------------------------- 1 | import {GET_CUSTOMERS, VIEW_CUSTOMER, ADD_CUSTOMER, DELETE_CUSTOMER, UPDATE_CUSTOMER} from '../constants/ActionTypes' 2 | const initialState = { 3 | customers : [], 4 | customer : {} 5 | } 6 | const customerReducer = (state = initialState, action) => { 7 | switch (action.type) { 8 | 9 | case ADD_CUSTOMER: 10 | return { 11 | ...state, 12 | customers : [...state.customers,...action.payload] 13 | } 14 | case GET_CUSTOMERS: 15 | return { 16 | ...state, 17 | customers : action.payload, 18 | customer : { 19 | isSingleCustomerView : false 20 | } 21 | } 22 | 23 | case DELETE_CUSTOMER: 24 | let customers = state.customers.filter(customer => 25 | customer._id !== action.payload._id 26 | ) 27 | return { 28 | ...state, 29 | customers : customers 30 | } 31 | 32 | case UPDATE_CUSTOMER: 33 | return { 34 | ...state, 35 | customer : {isSingleCustomerView : false}, 36 | refreshList : false 37 | }; 38 | 39 | case VIEW_CUSTOMER: 40 | return { 41 | ...state, 42 | customers : action.payload, 43 | customer : { 44 | isSingleCustomerView : false 45 | } 46 | }; 47 | default: 48 | return state 49 | } 50 | } 51 | 52 | export default customerReducer; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # mern-crud 2 | 3 | 4 | ## Getting Started 5 | 6 | 7 | ## Preview 8 | Preview 9 | 10 | Express(server) 11 | --------------- 12 | 13 | ```sh 14 | git clone https://github.com/senthilmca90/mern-crud.git 15 | 16 | cd mern-crud/server 17 | npm install 18 | npm start 19 | ``` 20 | Open [http://localhost:3001](http://localhost:3001)
21 | 22 | Check [http://localhost:3001/api/customers](http://localhost:3001/api/customers) 23 | 24 | output 25 | ------- 26 | 27 | ``` 28 | { 29 | "success": true, 30 | "message": "Customers fetched successfully", 31 | "customers": [] 32 | } 33 | ``` 34 | Postman 35 | -------- 36 | Post API 37 | -------- 38 | [http://localhost:3001/api/customers](http://localhost:3001/api/customers) 39 | ``` 40 | { 41 | "firstName": "senthil", 42 | "lastName": "kumar" 43 | } 44 | ``` 45 | Output 46 | ------ 47 | ``` 48 | { 49 | "success": true, 50 | "message": "Customer fetched successfully", 51 | "result": { 52 | "firstName": "senthil", 53 | "lastName": "kumar", 54 | "_id": "5b376579a6555b0b9c7861ae", 55 | "createdAt": "2018-06-30T11:11:53.703Z", 56 | "updatedAt": "2018-06-30T11:11:53.703Z", 57 | "customerId": 1, 58 | "__v": 0 59 | } 60 | } 61 | 62 | ``` 63 | 64 | 65 | React-Rdux(client) - Side 66 | ------------------------- 67 | 68 | 69 | ## Preview 70 | Preview 71 | 72 | ``` 73 | cd mern-crud/client 74 | npm install 75 | npm start 76 | ``` 77 | Open [http://localhost:3000](http://localhost:3000)
78 | 79 | -------------------------------------------------------------------------------- /client/src/actions/customerAction.js: -------------------------------------------------------------------------------- 1 | import {GET_CUSTOMERS, ADD_CUSTOMER,DELETE_CUSTOMER } from '../constants/ActionTypes'; 2 | import axios from "axios"; 3 | import history from '../history' 4 | const API_URL = 'http://localhost:3001/api/'; 5 | 6 | export const getCustomers = () => dispatch => { 7 | return fetch(API_URL+'customers') 8 | .then((response) => { 9 | return response.json(); 10 | }) 11 | .then(result => { 12 | console.log("customers actions ", result); 13 | dispatch({ 14 | type: GET_CUSTOMERS, 15 | payload: result.customers 16 | }); 17 | }); 18 | } 19 | 20 | 21 | export const addCustomer = (customer) => { 22 | console.log("customer ", customer); 23 | return (dispatch) => { 24 | return axios.post(API_URL+'customers/', customer) 25 | .then((res) => { 26 | console.log("response ", res); 27 | dispatch({ type: ADD_CUSTOMER, payload : res.data.result }) 28 | history.push(`/customers`) 29 | 30 | }); 31 | } 32 | } 33 | 34 | export const updateCustomer = (customer) => { 35 | console.log("udpate customer customer customer ", customer); 36 | return (dispatch) => { 37 | return axios.put(API_URL+'customers/', customer) 38 | .then((res) => { 39 | console.log("response ", res); 40 | 41 | history.push(`/customers`) 42 | }); 43 | } 44 | } 45 | 46 | export const deleteCustomer = (customer) => { 47 | return (dispatch) => { 48 | return axios.delete(API_URL+'customers', {data : customer}) 49 | .then((res) => { 50 | dispatch({ type: DELETE_CUSTOMER, payload : customer }) 51 | }); 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /client/README.md: -------------------------------------------------------------------------------- 1 | # Redux TodoMVC Example 2 | 3 | This project template was built with [Create React App](https://github.com/facebookincubator/create-react-app), which provides a simple way to start React projects with no build configuration needed. 4 | 5 | Projects built with Create-React-App include support for ES6 syntax, as well as several unofficial / not-yet-final forms of Javascript syntax such as Class Properties and JSX. See the list of [language features and polyfills supported by Create-React-App](https://github.com/facebookincubator/create-react-app/blob/master/packages/react-scripts/template/README.md#supported-language-features-and-polyfills) for more information. 6 | 7 | ## Available Scripts 8 | 9 | In the project directory, you can run: 10 | 11 | ### `npm start` 12 | 13 | Runs the app in the development mode.
14 | Open [http://localhost:3000](http://localhost:3000) to view it in the browser. 15 | 16 | The page will reload if you make edits.
17 | You will also see any lint errors in the console. 18 | 19 | ### `npm run build` 20 | 21 | Builds the app for production to the `build` folder.
22 | It correctly bundles React in production mode and optimizes the build for the best performance. 23 | 24 | The build is minified and the filenames include the hashes.
25 | Your app is ready to be deployed! 26 | 27 | ### `npm run eject` 28 | 29 | **Note: this is a one-way operation. Once you `eject`, you can’t go back!** 30 | 31 | If you aren’t satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project. 32 | 33 | Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point you’re on your own. 34 | 35 | You don’t have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldn’t feel obligated to use this feature. However we understand that this tool wouldn’t be useful if you couldn’t customize it when you are ready for it. 36 | -------------------------------------------------------------------------------- /server/src/customer/customerController.js: -------------------------------------------------------------------------------- 1 | import customerModel from "./customerModel"; 2 | 3 | class Customer { 4 | 5 | } 6 | 7 | Customer.prototype.getCustomers = (req,res) => { 8 | customerModel.find({},(err,customers) => { 9 | if(err){ 10 | res.send(err); 11 | }else{ 12 | console.log("result customers", customers); 13 | res.send({'success':true,'message':'Customers fetched successfully',customers}); 14 | } 15 | }) 16 | } 17 | 18 | Customer.prototype.getCustomerById = (req,res) => { 19 | let id = req.params.id; 20 | customerModel.findById(id,(err,result) => { 21 | if(err){ 22 | res.send(err); 23 | }else{ 24 | res.send(result); 25 | } 26 | }) 27 | } 28 | 29 | Customer.prototype.getCustomerByCustomId = (req,res) => { 30 | let id = req.body.id; 31 | customerModel.findOne({customerId : id},(err,result) => { 32 | if(err){ 33 | res.send(err); 34 | }else{ 35 | res.send({'success':true,'message':'Customer fetched successfully',result}); 36 | } 37 | }) 38 | } 39 | 40 | Customer.prototype.addCustomer = (req,res) => { 41 | let obj = req.body; 42 | console.log("obj ", obj); 43 | let model = new customerModel(obj); 44 | console.log("model ", model); 45 | model.save((err,result)=>{ 46 | if(err){ 47 | res.send(err); 48 | }else{ 49 | res.send({'success':true,'message':'Customer fetched successfully',result}); 50 | } 51 | }) 52 | } 53 | 54 | Customer.prototype.updateCustomerById = (req,res) => { 55 | let id = req.body._id; 56 | customerModel.findByIdAndUpdate(id,{ firstName : req.body.firstName,lastName : req.body.lastName},(err,result) => { 57 | if(err){ 58 | res.send(err); 59 | }else{ 60 | res.send(result); 61 | } 62 | }) 63 | } 64 | 65 | Customer.prototype.deleteCustomerById = (req,res) => { 66 | let id = req.body._id; 67 | console.log("delete customer ", req.body); 68 | customerModel.findByIdAndRemove(id,(err,result) => { 69 | if(err){ 70 | res.send(err); 71 | }else{ 72 | res.send(result); 73 | } 74 | }) 75 | } 76 | 77 | module.exports = Customer; 78 | -------------------------------------------------------------------------------- /client/src/components/Customer/CreateCustomer.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import {connect } from 'react-redux'; 3 | import {addCustomer} from '../../actions/customerAction' 4 | 5 | class CreateCustomer extends Component { 6 | 7 | constructor() { 8 | super(); 9 | this.state = { 10 | customer : { 11 | firstName : "", 12 | lastName : "" 13 | } 14 | }; 15 | this.handleChangeFor = this.handleChangeFor.bind(this); 16 | this.handleSubmit = this.handleSubmit.bind(this); 17 | } 18 | handleChangeFor = (propertyName) => (event) => { 19 | const { customer } = this.state; 20 | const customerDetails = { 21 | ...customer, 22 | [propertyName]: event.target.value 23 | }; 24 | this.setState({ customer: customerDetails }); 25 | } 26 | 27 | handleSubmit(event) { 28 | event.preventDefault(); 29 | console.log("test ", this.state.customer) 30 | this.props.addCustomer(this.state.customer); 31 | } 32 | render() { 33 | 34 | return ( 35 |
36 |
37 | 38 | 45 |
46 |
47 | 48 | 55 |
56 | 59 |
60 | ); 61 | } 62 | } 63 | 64 | const mapStateToProps = (state) => ({ 65 | customer: state.customer 66 | }) 67 | 68 | const mapDispatchToProps = (dispatch) => ({ 69 | addCustomer: (data) => dispatch(addCustomer(data)) 70 | }) 71 | 72 | export default connect(mapStateToProps, mapDispatchToProps)(CreateCustomer); -------------------------------------------------------------------------------- /client/src/components/Customer/CustomerDetails.js: -------------------------------------------------------------------------------- 1 | import React from 'react'; 2 | import { updateCustomer } from '../../actions/customerAction'; 3 | import {connect } from 'react-redux'; 4 | import history from '../../history' 5 | 6 | class CustomerDetails extends React.Component { 7 | constructor(props){ 8 | super(props); 9 | const location = history.location 10 | this.state = location.state; 11 | this.handleUpdate = this.handleUpdate.bind(this); 12 | } 13 | 14 | handleChangeFor = (propertyName) => (event) => { 15 | const { customer } = this.state; 16 | const customerDetails = { 17 | ...customer, 18 | [propertyName]: event.target.value 19 | }; 20 | this.setState({ customer: customerDetails }); 21 | } 22 | 23 | handleUpdate(event) { 24 | event.preventDefault(); 25 | console.log("this.state ", this.state) 26 | console.log("this.props ", this.props) 27 | this.props.updateCustomer(this.state.customer); 28 | } 29 | 30 | render(){ 31 | 32 | return( 33 |
34 |

Customer Detail

35 |
36 |
37 | { 38 |
39 |
40 | 41 | 49 |
50 |
51 | 52 | 60 |
61 | 64 |
65 | 66 | } 67 | 68 |
69 | ); 70 | } 71 | } 72 | 73 | const mapStateToProps = (state) => { 74 | return { 75 | customers: state.customers 76 | } 77 | } 78 | const mapDispatchToProps = (dispatch) => { 79 | return { 80 | updateCustomer : customer => dispatch(updateCustomer(customer)) 81 | } 82 | } 83 | 84 | export default connect(mapStateToProps,mapDispatchToProps)(CustomerDetails); -------------------------------------------------------------------------------- /client/src/components/Customer/customers.js: -------------------------------------------------------------------------------- 1 | import React, { Component } from 'react'; 2 | import {Link} from 'react-router-dom'; 3 | import PropTypes from 'prop-types' 4 | import {connect } from 'react-redux'; 5 | import {getCustomers, deleteCustomer} from '../../actions/customerAction' 6 | import './customers.css'; 7 | import history from "../../history" 8 | class Customers extends Component { 9 | 10 | constructor(props){ 11 | super(props); 12 | this.viewCustomer = this.viewCustomer.bind(this); 13 | } 14 | 15 | componentDidMount() { 16 | this.props.getCustomers(); 17 | } 18 | static propTypes = { 19 | getCustomers: PropTypes.func.isRequired, 20 | customers: PropTypes.object.isRequired 21 | } 22 | 23 | deleteCustomer(customer){ 24 | console.log(`delete customer `, customer); 25 | this.props.deleteCustomer(customer); 26 | } 27 | viewCustomer = (viewCustomerDetails) => { 28 | console.log("this.state ", viewCustomerDetails); 29 | history.push('/customer/view', {'customer' : viewCustomerDetails}) 30 | } 31 | 32 | render() { 33 | 34 | const { customers } = this.props.customers; 35 | 36 | const customerList = ( 37 |
38 | 39 |
40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | { 51 | customers.map((customer,index) => 52 | 53 | 54 | 55 | 57 | 58 | ) 59 | } 60 | 61 | 62 |
First NameLast NameHandle
{customer.firstName}{customer.lastName} this.viewCustomer(customer)}>   56 | this.deleteCustomer(customer)}>
63 |
64 |
65 | ) 66 | 67 | 68 | return ( 69 |
70 |
71 | 72 |
73 |
74 | { 75 | customers.length ==0 ? 'No Customers Create New Customers' :customerList 76 | } 77 |
78 |
79 | ); 80 | } 81 | } 82 | 83 | const mapStateToProps = (state) => ({ 84 | customers: state.customers 85 | }) 86 | 87 | const mapDispatchToProps = (dispatch) => ({ 88 | getCustomers: () => dispatch(getCustomers()), 89 | deleteCustomer: (customer) => dispatch(deleteCustomer(customer)) 90 | }) 91 | 92 | export default connect(mapStateToProps, mapDispatchToProps)(Customers); 93 | -------------------------------------------------------------------------------- /server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "crud-server", 3 | "version": "0.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.5", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 10 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 11 | "requires": { 12 | "mime-types": "~2.1.18", 13 | "negotiator": "0.6.1" 14 | } 15 | }, 16 | "ansi-regex": { 17 | "version": "2.1.1", 18 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 19 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 20 | }, 21 | "ansi-styles": { 22 | "version": "2.2.1", 23 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 24 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 25 | }, 26 | "array-flatten": { 27 | "version": "1.1.1", 28 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 29 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 30 | }, 31 | "async": { 32 | "version": "2.6.0", 33 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", 34 | "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", 35 | "requires": { 36 | "lodash": "^4.14.0" 37 | } 38 | }, 39 | "babel-code-frame": { 40 | "version": "6.26.0", 41 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 42 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 43 | "requires": { 44 | "chalk": "^1.1.3", 45 | "esutils": "^2.0.2", 46 | "js-tokens": "^3.0.2" 47 | } 48 | }, 49 | "babel-core": { 50 | "version": "6.26.3", 51 | "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", 52 | "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", 53 | "requires": { 54 | "babel-code-frame": "^6.26.0", 55 | "babel-generator": "^6.26.0", 56 | "babel-helpers": "^6.24.1", 57 | "babel-messages": "^6.23.0", 58 | "babel-register": "^6.26.0", 59 | "babel-runtime": "^6.26.0", 60 | "babel-template": "^6.26.0", 61 | "babel-traverse": "^6.26.0", 62 | "babel-types": "^6.26.0", 63 | "babylon": "^6.18.0", 64 | "convert-source-map": "^1.5.1", 65 | "debug": "^2.6.9", 66 | "json5": "^0.5.1", 67 | "lodash": "^4.17.4", 68 | "minimatch": "^3.0.4", 69 | "path-is-absolute": "^1.0.1", 70 | "private": "^0.1.8", 71 | "slash": "^1.0.0", 72 | "source-map": "^0.5.7" 73 | } 74 | }, 75 | "babel-generator": { 76 | "version": "6.26.1", 77 | "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", 78 | "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", 79 | "requires": { 80 | "babel-messages": "^6.23.0", 81 | "babel-runtime": "^6.26.0", 82 | "babel-types": "^6.26.0", 83 | "detect-indent": "^4.0.0", 84 | "jsesc": "^1.3.0", 85 | "lodash": "^4.17.4", 86 | "source-map": "^0.5.7", 87 | "trim-right": "^1.0.1" 88 | } 89 | }, 90 | "babel-helper-call-delegate": { 91 | "version": "6.24.1", 92 | "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", 93 | "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", 94 | "requires": { 95 | "babel-helper-hoist-variables": "^6.24.1", 96 | "babel-runtime": "^6.22.0", 97 | "babel-traverse": "^6.24.1", 98 | "babel-types": "^6.24.1" 99 | } 100 | }, 101 | "babel-helper-function-name": { 102 | "version": "6.24.1", 103 | "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", 104 | "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", 105 | "requires": { 106 | "babel-helper-get-function-arity": "^6.24.1", 107 | "babel-runtime": "^6.22.0", 108 | "babel-template": "^6.24.1", 109 | "babel-traverse": "^6.24.1", 110 | "babel-types": "^6.24.1" 111 | } 112 | }, 113 | "babel-helper-get-function-arity": { 114 | "version": "6.24.1", 115 | "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", 116 | "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", 117 | "requires": { 118 | "babel-runtime": "^6.22.0", 119 | "babel-types": "^6.24.1" 120 | } 121 | }, 122 | "babel-helper-hoist-variables": { 123 | "version": "6.24.1", 124 | "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", 125 | "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", 126 | "requires": { 127 | "babel-runtime": "^6.22.0", 128 | "babel-types": "^6.24.1" 129 | } 130 | }, 131 | "babel-helpers": { 132 | "version": "6.24.1", 133 | "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", 134 | "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", 135 | "requires": { 136 | "babel-runtime": "^6.22.0", 137 | "babel-template": "^6.24.1" 138 | } 139 | }, 140 | "babel-messages": { 141 | "version": "6.23.0", 142 | "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", 143 | "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", 144 | "requires": { 145 | "babel-runtime": "^6.22.0" 146 | } 147 | }, 148 | "babel-plugin-transform-es2015-destructuring": { 149 | "version": "6.23.0", 150 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", 151 | "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", 152 | "requires": { 153 | "babel-runtime": "^6.22.0" 154 | } 155 | }, 156 | "babel-plugin-transform-es2015-function-name": { 157 | "version": "6.24.1", 158 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", 159 | "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", 160 | "requires": { 161 | "babel-helper-function-name": "^6.24.1", 162 | "babel-runtime": "^6.22.0", 163 | "babel-types": "^6.24.1" 164 | } 165 | }, 166 | "babel-plugin-transform-es2015-modules-commonjs": { 167 | "version": "6.26.2", 168 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz", 169 | "integrity": "sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==", 170 | "requires": { 171 | "babel-plugin-transform-strict-mode": "^6.24.1", 172 | "babel-runtime": "^6.26.0", 173 | "babel-template": "^6.26.0", 174 | "babel-types": "^6.26.0" 175 | } 176 | }, 177 | "babel-plugin-transform-es2015-parameters": { 178 | "version": "6.24.1", 179 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", 180 | "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", 181 | "requires": { 182 | "babel-helper-call-delegate": "^6.24.1", 183 | "babel-helper-get-function-arity": "^6.24.1", 184 | "babel-runtime": "^6.22.0", 185 | "babel-template": "^6.24.1", 186 | "babel-traverse": "^6.24.1", 187 | "babel-types": "^6.24.1" 188 | } 189 | }, 190 | "babel-plugin-transform-strict-mode": { 191 | "version": "6.24.1", 192 | "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", 193 | "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", 194 | "requires": { 195 | "babel-runtime": "^6.22.0", 196 | "babel-types": "^6.24.1" 197 | } 198 | }, 199 | "babel-preset-es2015-node6": { 200 | "version": "0.4.0", 201 | "resolved": "https://registry.npmjs.org/babel-preset-es2015-node6/-/babel-preset-es2015-node6-0.4.0.tgz", 202 | "integrity": "sha1-+Ik/gbZTN0eSTGVzSIZ71jtPncI=", 203 | "requires": { 204 | "babel-plugin-transform-es2015-destructuring": "^6.6.5", 205 | "babel-plugin-transform-es2015-function-name": "^6.5.0", 206 | "babel-plugin-transform-es2015-modules-commonjs": "^6.7.4", 207 | "babel-plugin-transform-es2015-parameters": "^6.8.0" 208 | } 209 | }, 210 | "babel-register": { 211 | "version": "6.26.0", 212 | "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", 213 | "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", 214 | "requires": { 215 | "babel-core": "^6.26.0", 216 | "babel-runtime": "^6.26.0", 217 | "core-js": "^2.5.0", 218 | "home-or-tmp": "^2.0.0", 219 | "lodash": "^4.17.4", 220 | "mkdirp": "^0.5.1", 221 | "source-map-support": "^0.4.15" 222 | } 223 | }, 224 | "babel-runtime": { 225 | "version": "6.26.0", 226 | "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", 227 | "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", 228 | "requires": { 229 | "core-js": "^2.4.0", 230 | "regenerator-runtime": "^0.11.0" 231 | } 232 | }, 233 | "babel-template": { 234 | "version": "6.26.0", 235 | "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", 236 | "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", 237 | "requires": { 238 | "babel-runtime": "^6.26.0", 239 | "babel-traverse": "^6.26.0", 240 | "babel-types": "^6.26.0", 241 | "babylon": "^6.18.0", 242 | "lodash": "^4.17.4" 243 | } 244 | }, 245 | "babel-traverse": { 246 | "version": "6.26.0", 247 | "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", 248 | "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", 249 | "requires": { 250 | "babel-code-frame": "^6.26.0", 251 | "babel-messages": "^6.23.0", 252 | "babel-runtime": "^6.26.0", 253 | "babel-types": "^6.26.0", 254 | "babylon": "^6.18.0", 255 | "debug": "^2.6.8", 256 | "globals": "^9.18.0", 257 | "invariant": "^2.2.2", 258 | "lodash": "^4.17.4" 259 | } 260 | }, 261 | "babel-types": { 262 | "version": "6.26.0", 263 | "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", 264 | "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", 265 | "requires": { 266 | "babel-runtime": "^6.26.0", 267 | "esutils": "^2.0.2", 268 | "lodash": "^4.17.4", 269 | "to-fast-properties": "^1.0.3" 270 | } 271 | }, 272 | "babylon": { 273 | "version": "6.18.0", 274 | "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", 275 | "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==" 276 | }, 277 | "balanced-match": { 278 | "version": "1.0.0", 279 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 280 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 281 | }, 282 | "basic-auth": { 283 | "version": "2.0.0", 284 | "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.0.tgz", 285 | "integrity": "sha1-AV2z81PgLlY3d1X5YnQuiYHnu7o=", 286 | "requires": { 287 | "safe-buffer": "5.1.1" 288 | }, 289 | "dependencies": { 290 | "safe-buffer": { 291 | "version": "5.1.1", 292 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 293 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 294 | } 295 | } 296 | }, 297 | "bluebird": { 298 | "version": "3.5.0", 299 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", 300 | "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" 301 | }, 302 | "body-parser": { 303 | "version": "1.18.3", 304 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz", 305 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=", 306 | "requires": { 307 | "bytes": "3.0.0", 308 | "content-type": "~1.0.4", 309 | "debug": "2.6.9", 310 | "depd": "~1.1.2", 311 | "http-errors": "~1.6.3", 312 | "iconv-lite": "0.4.23", 313 | "on-finished": "~2.3.0", 314 | "qs": "6.5.2", 315 | "raw-body": "2.3.3", 316 | "type-is": "~1.6.16" 317 | } 318 | }, 319 | "brace-expansion": { 320 | "version": "1.1.11", 321 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 322 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 323 | "requires": { 324 | "balanced-match": "^1.0.0", 325 | "concat-map": "0.0.1" 326 | } 327 | }, 328 | "bson": { 329 | "version": "1.0.9", 330 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.9.tgz", 331 | "integrity": "sha512-IQX9/h7WdMBIW/q/++tGd+emQr0XMdeZ6icnT/74Xk9fnabWn+gZgpE+9V+gujL3hhJOoNrnDVY7tWdzc7NUTg==" 332 | }, 333 | "bytes": { 334 | "version": "3.0.0", 335 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 336 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 337 | }, 338 | "chalk": { 339 | "version": "1.1.3", 340 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 341 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 342 | "requires": { 343 | "ansi-styles": "^2.2.1", 344 | "escape-string-regexp": "^1.0.2", 345 | "has-ansi": "^2.0.0", 346 | "strip-ansi": "^3.0.0", 347 | "supports-color": "^2.0.0" 348 | } 349 | }, 350 | "concat-map": { 351 | "version": "0.0.1", 352 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 353 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 354 | }, 355 | "content-disposition": { 356 | "version": "0.5.2", 357 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 358 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 359 | }, 360 | "content-type": { 361 | "version": "1.0.4", 362 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 363 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 364 | }, 365 | "convert-source-map": { 366 | "version": "1.5.1", 367 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", 368 | "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" 369 | }, 370 | "cookie": { 371 | "version": "0.3.1", 372 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 373 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 374 | }, 375 | "cookie-signature": { 376 | "version": "1.0.6", 377 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 378 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 379 | }, 380 | "core-js": { 381 | "version": "2.5.7", 382 | "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", 383 | "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==" 384 | }, 385 | "cors": { 386 | "version": "2.8.4", 387 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.4.tgz", 388 | "integrity": "sha1-K9OB8usgECAQXNUOpZ2mMJBpRoY=", 389 | "requires": { 390 | "object-assign": "^4", 391 | "vary": "^1" 392 | } 393 | }, 394 | "debug": { 395 | "version": "2.6.9", 396 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 397 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 398 | "requires": { 399 | "ms": "2.0.0" 400 | } 401 | }, 402 | "depd": { 403 | "version": "1.1.2", 404 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 405 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 406 | }, 407 | "destroy": { 408 | "version": "1.0.4", 409 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 410 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 411 | }, 412 | "detect-indent": { 413 | "version": "4.0.0", 414 | "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", 415 | "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", 416 | "requires": { 417 | "repeating": "^2.0.0" 418 | } 419 | }, 420 | "ee-first": { 421 | "version": "1.1.1", 422 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 423 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 424 | }, 425 | "encodeurl": { 426 | "version": "1.0.2", 427 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 428 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 429 | }, 430 | "escape-html": { 431 | "version": "1.0.3", 432 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 433 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 434 | }, 435 | "escape-string-regexp": { 436 | "version": "1.0.5", 437 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 438 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 439 | }, 440 | "esutils": { 441 | "version": "2.0.2", 442 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 443 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" 444 | }, 445 | "etag": { 446 | "version": "1.8.1", 447 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 448 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 449 | }, 450 | "express": { 451 | "version": "4.16.3", 452 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", 453 | "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", 454 | "requires": { 455 | "accepts": "~1.3.5", 456 | "array-flatten": "1.1.1", 457 | "body-parser": "1.18.2", 458 | "content-disposition": "0.5.2", 459 | "content-type": "~1.0.4", 460 | "cookie": "0.3.1", 461 | "cookie-signature": "1.0.6", 462 | "debug": "2.6.9", 463 | "depd": "~1.1.2", 464 | "encodeurl": "~1.0.2", 465 | "escape-html": "~1.0.3", 466 | "etag": "~1.8.1", 467 | "finalhandler": "1.1.1", 468 | "fresh": "0.5.2", 469 | "merge-descriptors": "1.0.1", 470 | "methods": "~1.1.2", 471 | "on-finished": "~2.3.0", 472 | "parseurl": "~1.3.2", 473 | "path-to-regexp": "0.1.7", 474 | "proxy-addr": "~2.0.3", 475 | "qs": "6.5.1", 476 | "range-parser": "~1.2.0", 477 | "safe-buffer": "5.1.1", 478 | "send": "0.16.2", 479 | "serve-static": "1.13.2", 480 | "setprototypeof": "1.1.0", 481 | "statuses": "~1.4.0", 482 | "type-is": "~1.6.16", 483 | "utils-merge": "1.0.1", 484 | "vary": "~1.1.2" 485 | }, 486 | "dependencies": { 487 | "body-parser": { 488 | "version": "1.18.2", 489 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", 490 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", 491 | "requires": { 492 | "bytes": "3.0.0", 493 | "content-type": "~1.0.4", 494 | "debug": "2.6.9", 495 | "depd": "~1.1.1", 496 | "http-errors": "~1.6.2", 497 | "iconv-lite": "0.4.19", 498 | "on-finished": "~2.3.0", 499 | "qs": "6.5.1", 500 | "raw-body": "2.3.2", 501 | "type-is": "~1.6.15" 502 | } 503 | }, 504 | "iconv-lite": { 505 | "version": "0.4.19", 506 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 507 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 508 | }, 509 | "qs": { 510 | "version": "6.5.1", 511 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 512 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" 513 | }, 514 | "raw-body": { 515 | "version": "2.3.2", 516 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", 517 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", 518 | "requires": { 519 | "bytes": "3.0.0", 520 | "http-errors": "1.6.2", 521 | "iconv-lite": "0.4.19", 522 | "unpipe": "1.0.0" 523 | }, 524 | "dependencies": { 525 | "depd": { 526 | "version": "1.1.1", 527 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 528 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 529 | }, 530 | "http-errors": { 531 | "version": "1.6.2", 532 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", 533 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", 534 | "requires": { 535 | "depd": "1.1.1", 536 | "inherits": "2.0.3", 537 | "setprototypeof": "1.0.3", 538 | "statuses": ">= 1.3.1 < 2" 539 | } 540 | }, 541 | "setprototypeof": { 542 | "version": "1.0.3", 543 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", 544 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" 545 | } 546 | } 547 | }, 548 | "safe-buffer": { 549 | "version": "5.1.1", 550 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 551 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 552 | }, 553 | "statuses": { 554 | "version": "1.4.0", 555 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 556 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 557 | } 558 | } 559 | }, 560 | "finalhandler": { 561 | "version": "1.1.1", 562 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 563 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 564 | "requires": { 565 | "debug": "2.6.9", 566 | "encodeurl": "~1.0.2", 567 | "escape-html": "~1.0.3", 568 | "on-finished": "~2.3.0", 569 | "parseurl": "~1.3.2", 570 | "statuses": "~1.4.0", 571 | "unpipe": "~1.0.0" 572 | }, 573 | "dependencies": { 574 | "statuses": { 575 | "version": "1.4.0", 576 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 577 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 578 | } 579 | } 580 | }, 581 | "forwarded": { 582 | "version": "0.1.2", 583 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 584 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 585 | }, 586 | "fresh": { 587 | "version": "0.5.2", 588 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 589 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 590 | }, 591 | "globals": { 592 | "version": "9.18.0", 593 | "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", 594 | "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" 595 | }, 596 | "has-ansi": { 597 | "version": "2.0.0", 598 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 599 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 600 | "requires": { 601 | "ansi-regex": "^2.0.0" 602 | } 603 | }, 604 | "home-or-tmp": { 605 | "version": "2.0.0", 606 | "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", 607 | "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", 608 | "requires": { 609 | "os-homedir": "^1.0.0", 610 | "os-tmpdir": "^1.0.1" 611 | } 612 | }, 613 | "http-errors": { 614 | "version": "1.6.3", 615 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 616 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 617 | "requires": { 618 | "depd": "~1.1.2", 619 | "inherits": "2.0.3", 620 | "setprototypeof": "1.1.0", 621 | "statuses": ">= 1.4.0 < 2" 622 | } 623 | }, 624 | "iconv-lite": { 625 | "version": "0.4.23", 626 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 627 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 628 | "requires": { 629 | "safer-buffer": ">= 2.1.2 < 3" 630 | } 631 | }, 632 | "inherits": { 633 | "version": "2.0.3", 634 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 635 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 636 | }, 637 | "invariant": { 638 | "version": "2.2.4", 639 | "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", 640 | "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", 641 | "requires": { 642 | "loose-envify": "^1.0.0" 643 | } 644 | }, 645 | "ipaddr.js": { 646 | "version": "1.6.0", 647 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", 648 | "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" 649 | }, 650 | "is-finite": { 651 | "version": "1.0.2", 652 | "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", 653 | "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", 654 | "requires": { 655 | "number-is-nan": "^1.0.0" 656 | } 657 | }, 658 | "js-tokens": { 659 | "version": "3.0.2", 660 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 661 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" 662 | }, 663 | "jsesc": { 664 | "version": "1.3.0", 665 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", 666 | "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=" 667 | }, 668 | "json5": { 669 | "version": "0.5.1", 670 | "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", 671 | "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" 672 | }, 673 | "kareem": { 674 | "version": "2.2.1", 675 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.2.1.tgz", 676 | "integrity": "sha512-xpDFy8OxkFM+vK6pXy6JmH92ibeEFUuDWzas5M9L7MzVmHW3jzwAHxodCPV/BYkf4A31bVDLyonrMfp9RXb/oA==" 677 | }, 678 | "lodash": { 679 | "version": "4.17.10", 680 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", 681 | "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" 682 | }, 683 | "lodash.get": { 684 | "version": "4.4.2", 685 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 686 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" 687 | }, 688 | "loose-envify": { 689 | "version": "1.3.1", 690 | "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", 691 | "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", 692 | "requires": { 693 | "js-tokens": "^3.0.0" 694 | } 695 | }, 696 | "media-typer": { 697 | "version": "0.3.0", 698 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 699 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 700 | }, 701 | "merge-descriptors": { 702 | "version": "1.0.1", 703 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 704 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 705 | }, 706 | "methods": { 707 | "version": "1.1.2", 708 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 709 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 710 | }, 711 | "mime": { 712 | "version": "1.4.1", 713 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 714 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 715 | }, 716 | "mime-db": { 717 | "version": "1.33.0", 718 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", 719 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" 720 | }, 721 | "mime-types": { 722 | "version": "2.1.18", 723 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", 724 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", 725 | "requires": { 726 | "mime-db": "~1.33.0" 727 | } 728 | }, 729 | "minimatch": { 730 | "version": "3.0.4", 731 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 732 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 733 | "requires": { 734 | "brace-expansion": "^1.1.7" 735 | } 736 | }, 737 | "minimist": { 738 | "version": "0.0.8", 739 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 740 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 741 | }, 742 | "mkdirp": { 743 | "version": "0.5.1", 744 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 745 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 746 | "requires": { 747 | "minimist": "0.0.8" 748 | } 749 | }, 750 | "mongodb": { 751 | "version": "3.0.9", 752 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.0.9.tgz", 753 | "integrity": "sha512-2NJzruJu15/1YF6+H55f1wfLQb1M6/+hU96+L5sPv07PDZDPvZEDJBtCjFQorpbW9D2aqsem7mFVUKPhVwwRog==", 754 | "requires": { 755 | "mongodb-core": "3.0.8" 756 | } 757 | }, 758 | "mongodb-core": { 759 | "version": "3.0.8", 760 | "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.0.8.tgz", 761 | "integrity": "sha512-dFxfhH9N7ohuQnINyIl6dqEF8sYOE0WKuymrFf3L3cipJNrx+S8rAbNOTwa00/fuJCjBMJNFsaA+R2N16//UIw==", 762 | "requires": { 763 | "bson": "~1.0.4", 764 | "require_optional": "^1.0.1" 765 | } 766 | }, 767 | "mongoose": { 768 | "version": "5.1.5", 769 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.1.5.tgz", 770 | "integrity": "sha512-/bDtFRvWZclE4Fxw5ntofGA2Zm+lgJJw9WHZK4aWotVNK5MEDxrfPp+W/gk4whv0t4AO9JxmyAD4jfotjARSiA==", 771 | "requires": { 772 | "async": "2.6.1", 773 | "bson": "~1.0.5", 774 | "kareem": "2.2.1", 775 | "lodash.get": "4.4.2", 776 | "mongodb": "3.0.9", 777 | "mongoose-legacy-pluralize": "1.0.2", 778 | "mpath": "0.4.1", 779 | "mquery": "3.0.0", 780 | "ms": "2.0.0", 781 | "regexp-clone": "0.0.1", 782 | "sliced": "1.0.1" 783 | }, 784 | "dependencies": { 785 | "async": { 786 | "version": "2.6.1", 787 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", 788 | "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", 789 | "requires": { 790 | "lodash": "^4.17.10" 791 | } 792 | } 793 | } 794 | }, 795 | "mongoose-legacy-pluralize": { 796 | "version": "1.0.2", 797 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", 798 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" 799 | }, 800 | "mongoose-sequence": { 801 | "version": "4.0.1", 802 | "resolved": "https://registry.npmjs.org/mongoose-sequence/-/mongoose-sequence-4.0.1.tgz", 803 | "integrity": "sha512-xM1mu28bwZVTIdpwYzvSzv2krID+FOhjOFZe+SkKbDevBawfxoWBhKkGkVEZ/nT2r5G68so7vS3Hz8CMlb5qoA==", 804 | "requires": { 805 | "async": "^2.5.0", 806 | "lodash": "^4.6.1" 807 | } 808 | }, 809 | "morgan": { 810 | "version": "1.9.0", 811 | "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.0.tgz", 812 | "integrity": "sha1-0B+mxlhZt2/PMbPLU6OCGjEdgFE=", 813 | "requires": { 814 | "basic-auth": "~2.0.0", 815 | "debug": "2.6.9", 816 | "depd": "~1.1.1", 817 | "on-finished": "~2.3.0", 818 | "on-headers": "~1.0.1" 819 | } 820 | }, 821 | "mpath": { 822 | "version": "0.4.1", 823 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.4.1.tgz", 824 | "integrity": "sha512-NNY/MpBkALb9jJmjpBlIi6GRoLveLUM0pJzgbp9vY9F7IQEb/HREC/nxrixechcQwd1NevOhJnWWV8QQQRE+OA==" 825 | }, 826 | "mquery": { 827 | "version": "3.0.0", 828 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.0.0.tgz", 829 | "integrity": "sha512-WL1Lk8v4l8VFSSwN3yCzY9TXw+fKVYKn6f+w86TRzOLSE8k1yTgGaLBPUByJQi8VcLbOdnUneFV/y3Kv874pnQ==", 830 | "requires": { 831 | "bluebird": "3.5.0", 832 | "debug": "2.6.9", 833 | "regexp-clone": "0.0.1", 834 | "sliced": "0.0.5" 835 | }, 836 | "dependencies": { 837 | "sliced": { 838 | "version": "0.0.5", 839 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-0.0.5.tgz", 840 | "integrity": "sha1-XtwETKTrb3gW1Qui/GPiXY/kcH8=" 841 | } 842 | } 843 | }, 844 | "ms": { 845 | "version": "2.0.0", 846 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 847 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 848 | }, 849 | "negotiator": { 850 | "version": "0.6.1", 851 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 852 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 853 | }, 854 | "number-is-nan": { 855 | "version": "1.0.1", 856 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 857 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 858 | }, 859 | "object-assign": { 860 | "version": "4.1.1", 861 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 862 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 863 | }, 864 | "on-finished": { 865 | "version": "2.3.0", 866 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 867 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 868 | "requires": { 869 | "ee-first": "1.1.1" 870 | } 871 | }, 872 | "on-headers": { 873 | "version": "1.0.1", 874 | "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", 875 | "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" 876 | }, 877 | "os-homedir": { 878 | "version": "1.0.2", 879 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 880 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" 881 | }, 882 | "os-tmpdir": { 883 | "version": "1.0.2", 884 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 885 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 886 | }, 887 | "parseurl": { 888 | "version": "1.3.2", 889 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 890 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 891 | }, 892 | "path-is-absolute": { 893 | "version": "1.0.1", 894 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 895 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 896 | }, 897 | "path-to-regexp": { 898 | "version": "0.1.7", 899 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 900 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 901 | }, 902 | "private": { 903 | "version": "0.1.8", 904 | "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", 905 | "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==" 906 | }, 907 | "proxy-addr": { 908 | "version": "2.0.3", 909 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", 910 | "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", 911 | "requires": { 912 | "forwarded": "~0.1.2", 913 | "ipaddr.js": "1.6.0" 914 | } 915 | }, 916 | "qs": { 917 | "version": "6.5.2", 918 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 919 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 920 | }, 921 | "range-parser": { 922 | "version": "1.2.0", 923 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 924 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 925 | }, 926 | "raw-body": { 927 | "version": "2.3.3", 928 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz", 929 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==", 930 | "requires": { 931 | "bytes": "3.0.0", 932 | "http-errors": "1.6.3", 933 | "iconv-lite": "0.4.23", 934 | "unpipe": "1.0.0" 935 | } 936 | }, 937 | "regenerator-runtime": { 938 | "version": "0.11.1", 939 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", 940 | "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" 941 | }, 942 | "regexp-clone": { 943 | "version": "0.0.1", 944 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-0.0.1.tgz", 945 | "integrity": "sha1-p8LgmJH9vzj7sQ03b7cwA+aKxYk=" 946 | }, 947 | "repeating": { 948 | "version": "2.0.1", 949 | "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", 950 | "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", 951 | "requires": { 952 | "is-finite": "^1.0.0" 953 | } 954 | }, 955 | "require_optional": { 956 | "version": "1.0.1", 957 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 958 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 959 | "requires": { 960 | "resolve-from": "^2.0.0", 961 | "semver": "^5.1.0" 962 | } 963 | }, 964 | "resolve-from": { 965 | "version": "2.0.0", 966 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 967 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 968 | }, 969 | "safer-buffer": { 970 | "version": "2.1.2", 971 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 972 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 973 | }, 974 | "semver": { 975 | "version": "5.5.0", 976 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", 977 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" 978 | }, 979 | "send": { 980 | "version": "0.16.2", 981 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 982 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 983 | "requires": { 984 | "debug": "2.6.9", 985 | "depd": "~1.1.2", 986 | "destroy": "~1.0.4", 987 | "encodeurl": "~1.0.2", 988 | "escape-html": "~1.0.3", 989 | "etag": "~1.8.1", 990 | "fresh": "0.5.2", 991 | "http-errors": "~1.6.2", 992 | "mime": "1.4.1", 993 | "ms": "2.0.0", 994 | "on-finished": "~2.3.0", 995 | "range-parser": "~1.2.0", 996 | "statuses": "~1.4.0" 997 | }, 998 | "dependencies": { 999 | "statuses": { 1000 | "version": "1.4.0", 1001 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 1002 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 1003 | } 1004 | } 1005 | }, 1006 | "serve-static": { 1007 | "version": "1.13.2", 1008 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 1009 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 1010 | "requires": { 1011 | "encodeurl": "~1.0.2", 1012 | "escape-html": "~1.0.3", 1013 | "parseurl": "~1.3.2", 1014 | "send": "0.16.2" 1015 | } 1016 | }, 1017 | "setprototypeof": { 1018 | "version": "1.1.0", 1019 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 1020 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 1021 | }, 1022 | "slash": { 1023 | "version": "1.0.0", 1024 | "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", 1025 | "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" 1026 | }, 1027 | "sliced": { 1028 | "version": "1.0.1", 1029 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", 1030 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" 1031 | }, 1032 | "source-map": { 1033 | "version": "0.5.7", 1034 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1035 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" 1036 | }, 1037 | "source-map-support": { 1038 | "version": "0.4.18", 1039 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", 1040 | "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", 1041 | "requires": { 1042 | "source-map": "^0.5.6" 1043 | } 1044 | }, 1045 | "statuses": { 1046 | "version": "1.5.0", 1047 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1048 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1049 | }, 1050 | "strip-ansi": { 1051 | "version": "3.0.1", 1052 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1053 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1054 | "requires": { 1055 | "ansi-regex": "^2.0.0" 1056 | } 1057 | }, 1058 | "supports-color": { 1059 | "version": "2.0.0", 1060 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 1061 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 1062 | }, 1063 | "to-fast-properties": { 1064 | "version": "1.0.3", 1065 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", 1066 | "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=" 1067 | }, 1068 | "trim-right": { 1069 | "version": "1.0.1", 1070 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", 1071 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=" 1072 | }, 1073 | "type-is": { 1074 | "version": "1.6.16", 1075 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 1076 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 1077 | "requires": { 1078 | "media-typer": "0.3.0", 1079 | "mime-types": "~2.1.18" 1080 | } 1081 | }, 1082 | "unpipe": { 1083 | "version": "1.0.0", 1084 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1085 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1086 | }, 1087 | "utils-merge": { 1088 | "version": "1.0.1", 1089 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1090 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1091 | }, 1092 | "vary": { 1093 | "version": "1.1.2", 1094 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1095 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1096 | } 1097 | } 1098 | } 1099 | --------------------------------------------------------------------------------