├── 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 |
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 |
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 |
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 |
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 | | First Name |
44 | Last Name |
45 | Handle |
46 |
47 |
48 |
49 |
50 | {
51 | customers.map((customer,index) =>
52 |
53 | | {customer.firstName} |
54 | {customer.lastName} |
55 | this.viewCustomer(customer)}>
56 | this.deleteCustomer(customer)}> |
57 |
58 | )
59 | }
60 |
61 |
62 |
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 |
--------------------------------------------------------------------------------