├── .gitignore
├── .idea
├── misc.xml
├── modules.xml
├── resthub2.iml
├── vcs.xml
└── workspace.xml
├── README.md
├── api-routes.js
├── contactController.js
├── contactModel.js
├── index.js
├── package-lock.json
└── package.json
/.gitignore:
--------------------------------------------------------------------------------
1 | ./node_modules
2 | node_modules
--------------------------------------------------------------------------------
/.idea/misc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/resthub2.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/workspace.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 | 1562826786151
169 |
170 |
171 | 1562826786151
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 |
266 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # REST HUb 2.0
2 |
3 | An app demonstrating simple API implementation with NodeJs, Express and MongoDb
4 |
5 | The companion tutorial on building can be found here [How To Build Simple RESTful API With NodeJs, ExpressJs And MongoDb](https://medium.com/@dinyangetoh/how-to-build-simple-restful-api-with-nodejs-expressjs-and-mongodb-99348012925d)
6 |
7 | The `api` uri preceed all API endpoints and the following endpoints are currently available
8 | * GET `/api/contacts`
9 | * POST `/api/contacts`
10 | * GET `/api/contacts/:id`
11 | * PUT `/api/contacts/:id`
12 | * PATCH `/api/contacts/:id`
13 | * DELETE `/api/contacts/:id`
14 |
15 | The live app is available on heroku here
16 | https://resthub2.herokuapp.com
17 |
18 |
19 |
20 | Get in Touch
21 | ===============
22 |
23 | I am available on twitter, facebook, linkedin, gmail @dinyangetoh
--------------------------------------------------------------------------------
/api-routes.js:
--------------------------------------------------------------------------------
1 | // api-routes.js
2 | // Initialize express router
3 | let router = require('express').Router();
4 | // Set default API response
5 | router.get('/', function (req, res) {
6 | res.json({
7 | status: 'API Its Working',
8 | message: 'Welcome to RESTHub crafted with love!',
9 | });
10 | });
11 | // Import contact controller
12 | var contactController = require('./contactController');
13 | // Contact routes
14 | router.route('/contacts')
15 | .get(contactController.index)
16 | .post(contactController.new);
17 |
18 | router.route('/contacts/:contact_id')
19 | .get(contactController.view)
20 | .patch(contactController.update)
21 | .put(contactController.update)
22 | .delete(contactController.delete);
23 |
24 |
25 | // Export API routes
26 | module.exports = router;
--------------------------------------------------------------------------------
/contactController.js:
--------------------------------------------------------------------------------
1 | // contactController.js
2 | // Import contact model
3 | Contact = require('./contactModel');
4 | // Handle index actions
5 | exports.index = function (req, res) {
6 | Contact.get(function (err, contacts) {
7 | if (err) {
8 | res.json({
9 | status: "error",
10 | message: err,
11 | });
12 | }
13 | res.json({
14 | status: "success",
15 | message: "Contacts retrieved successfully",
16 | data: contacts
17 | });
18 | });
19 | };
20 | // Handle create contact actions
21 | exports.new = function (req, res) {
22 | var contact = new Contact();
23 | contact.name = req.body.name ? req.body.name : contact.name;
24 | contact.gender = req.body.gender;
25 | contact.email = req.body.email;
26 | contact.phone = req.body.phone;
27 | // save the contact and check for errors
28 | contact.save(function (err) {
29 | // Check for validation error
30 | if (err)
31 | res.json(err);
32 | else
33 | res.json({
34 | message: 'New contact created!',
35 | data: contact
36 | });
37 | });
38 | };
39 | // Handle view contact info
40 | exports.view = function (req, res) {
41 | Contact.findById(req.params.contact_id, function (err, contact) {
42 | if (err)
43 | res.send(err);
44 | res.json({
45 | message: 'Contact details loading..',
46 | data: contact
47 | });
48 | });
49 | };
50 | // Handle update contact info
51 | exports.update = function (req, res) {
52 | Contact.findById(req.params.contact_id, function (err, contact) {
53 | if (err)
54 | res.send(err);
55 | contact.name = req.body.name ? req.body.name : contact.name;
56 | contact.gender = req.body.gender;
57 | contact.email = req.body.email;
58 | contact.phone = req.body.phone;
59 | // save the contact and check for errors
60 | contact.save(function (err) {
61 | if (err)
62 | res.json(err);
63 | res.json({
64 | message: 'Contact Info updated',
65 | data: contact
66 | });
67 | });
68 | });
69 | };
70 | // Handle delete contact
71 | exports.delete = function (req, res) {
72 | Contact.remove({
73 | _id: req.params.contact_id
74 | }, function (err, contact) {
75 | if (err)
76 | res.send(err);
77 | res.json({
78 | status: "success",
79 | message: 'Contact deleted'
80 | });
81 | });
82 | };
--------------------------------------------------------------------------------
/contactModel.js:
--------------------------------------------------------------------------------
1 | // contactModel.js
2 | var mongoose = require('mongoose');
3 | // Setup schema
4 | var contactSchema = mongoose.Schema({
5 | name: {
6 | type: String,
7 | required: true
8 | },
9 | email: {
10 | type: String,
11 | required: true
12 | },
13 | gender: String,
14 | phone: String,
15 | create_date: {
16 | type: Date,
17 | default: Date.now
18 | }
19 | });
20 | // Export Contact model
21 | var Contact = module.exports = mongoose.model('contact', contactSchema);
22 | module.exports.get = function (callback, limit) {
23 | Contact.find(callback).limit(limit);
24 | }
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | // Import express
2 | let express = require('express');
3 | // Import Body parser
4 | let bodyParser = require('body-parser');
5 | // Import Mongoose
6 | let mongoose = require('mongoose');
7 | // Initialize the app
8 | let app = express();
9 |
10 | // Import routes
11 | let apiRoutes = require("./api-routes");
12 | // Configure bodyparser to handle post requests
13 | app.use(bodyParser.urlencoded({
14 | extended: true
15 | }));
16 | app.use(bodyParser.json());
17 | // Connect to Mongoose and set connection variable
18 | mongoose.connect('mongodb://localhost/resthub', { useNewUrlParser: true});
19 |
20 | // Heroku Mongoose connection
21 | // mongoose.connect('mongodb://heroku_5686p02g:sia8l3fni4jmu7qbn0ac1t75mf@ds349857.mlab.com:49857/heroku_5686p02g', { useNewUrlParser: true });
22 |
23 | var db = mongoose.connection;
24 |
25 | // Added check for DB connection
26 |
27 | if(!db)
28 | console.log("Error connecting db")
29 | else
30 | console.log("Db connected successfully")
31 |
32 | // Setup server port
33 | var port = process.env.PORT || 8080;
34 |
35 | // Send message for default URL
36 | app.get('/', (req, res) => res.send('Hello World with Express'));
37 |
38 | // Use Api routes in the App
39 | app.use('/api', apiRoutes);
40 | // Launch app to listen to specified port
41 | app.listen(port, function () {
42 | console.log("Running RestHub on port " + port);
43 | });
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "resthub2",
3 | "version": "2.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@types/bson": {
8 | "version": "4.0.5",
9 | "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.5.tgz",
10 | "integrity": "sha512-vVLwMUqhYJSQ/WKcE60eFqcyuWse5fGH+NMAXHuKrUAPoryq3ATxk5o4bgYNtg5aOM4APVg7Hnb3ASqUYG0PKg==",
11 | "requires": {
12 | "@types/node": "*"
13 | }
14 | },
15 | "@types/mongodb": {
16 | "version": "3.6.20",
17 | "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz",
18 | "integrity": "sha512-WcdpPJCakFzcWWD9juKoZbRtQxKIMYF/JIAM4JrNHrMcnJL6/a2NWjXxW7fo9hxboxxkg+icff8d7+WIEvKgYQ==",
19 | "requires": {
20 | "@types/bson": "*",
21 | "@types/node": "*"
22 | }
23 | },
24 | "@types/node": {
25 | "version": "18.14.1",
26 | "resolved": "https://registry.npmjs.org/@types/node/-/node-18.14.1.tgz",
27 | "integrity": "sha512-QH+37Qds3E0eDlReeboBxfHbX9omAcBCXEzswCu6jySP642jiM3cYSIkU/REqwhCUqXdonHFuBfJDiAJxMNhaQ=="
28 | },
29 | "accepts": {
30 | "version": "1.3.8",
31 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
32 | "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
33 | "requires": {
34 | "mime-types": "~2.1.34",
35 | "negotiator": "0.6.3"
36 | }
37 | },
38 | "array-flatten": {
39 | "version": "1.1.1",
40 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
41 | "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
42 | },
43 | "bl": {
44 | "version": "2.2.1",
45 | "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.1.tgz",
46 | "integrity": "sha512-6Pesp1w0DEX1N550i/uGV/TqucVL4AM/pgThFSN/Qq9si1/DF9aIHs1BxD8V/QU0HoeHO6cQRTAuYnLPKq1e4g==",
47 | "requires": {
48 | "readable-stream": "^2.3.5",
49 | "safe-buffer": "^5.1.1"
50 | }
51 | },
52 | "bluebird": {
53 | "version": "3.5.1",
54 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
55 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
56 | },
57 | "body-parser": {
58 | "version": "1.20.1",
59 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz",
60 | "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==",
61 | "requires": {
62 | "bytes": "3.1.2",
63 | "content-type": "~1.0.4",
64 | "debug": "2.6.9",
65 | "depd": "2.0.0",
66 | "destroy": "1.2.0",
67 | "http-errors": "2.0.0",
68 | "iconv-lite": "0.4.24",
69 | "on-finished": "2.4.1",
70 | "qs": "6.11.0",
71 | "raw-body": "2.5.1",
72 | "type-is": "~1.6.18",
73 | "unpipe": "1.0.0"
74 | }
75 | },
76 | "bson": {
77 | "version": "1.1.6",
78 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.6.tgz",
79 | "integrity": "sha512-EvVNVeGo4tHxwi8L6bPj3y3itEvStdwvvlojVxxbyYfoaxJ6keLgrTuKdyfEAszFK+H3olzBuafE0yoh0D1gdg=="
80 | },
81 | "bytes": {
82 | "version": "3.1.2",
83 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
84 | "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="
85 | },
86 | "call-bind": {
87 | "version": "1.0.2",
88 | "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
89 | "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
90 | "requires": {
91 | "function-bind": "^1.1.1",
92 | "get-intrinsic": "^1.0.2"
93 | }
94 | },
95 | "content-disposition": {
96 | "version": "0.5.4",
97 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
98 | "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
99 | "requires": {
100 | "safe-buffer": "5.2.1"
101 | },
102 | "dependencies": {
103 | "safe-buffer": {
104 | "version": "5.2.1",
105 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
106 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
107 | }
108 | }
109 | },
110 | "content-type": {
111 | "version": "1.0.4",
112 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
113 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
114 | },
115 | "cookie": {
116 | "version": "0.5.0",
117 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
118 | "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw=="
119 | },
120 | "cookie-signature": {
121 | "version": "1.0.6",
122 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
123 | "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
124 | },
125 | "core-util-is": {
126 | "version": "1.0.3",
127 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
128 | "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
129 | },
130 | "debug": {
131 | "version": "2.6.9",
132 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
133 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
134 | "requires": {
135 | "ms": "2.0.0"
136 | }
137 | },
138 | "denque": {
139 | "version": "1.5.1",
140 | "resolved": "https://registry.npmjs.org/denque/-/denque-1.5.1.tgz",
141 | "integrity": "sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw=="
142 | },
143 | "depd": {
144 | "version": "2.0.0",
145 | "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
146 | "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="
147 | },
148 | "destroy": {
149 | "version": "1.2.0",
150 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
151 | "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg=="
152 | },
153 | "ee-first": {
154 | "version": "1.1.1",
155 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
156 | "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
157 | },
158 | "encodeurl": {
159 | "version": "1.0.2",
160 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
161 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w=="
162 | },
163 | "escape-html": {
164 | "version": "1.0.3",
165 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
166 | "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
167 | },
168 | "etag": {
169 | "version": "1.8.1",
170 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
171 | "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="
172 | },
173 | "express": {
174 | "version": "4.18.2",
175 | "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz",
176 | "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==",
177 | "requires": {
178 | "accepts": "~1.3.8",
179 | "array-flatten": "1.1.1",
180 | "body-parser": "1.20.1",
181 | "content-disposition": "0.5.4",
182 | "content-type": "~1.0.4",
183 | "cookie": "0.5.0",
184 | "cookie-signature": "1.0.6",
185 | "debug": "2.6.9",
186 | "depd": "2.0.0",
187 | "encodeurl": "~1.0.2",
188 | "escape-html": "~1.0.3",
189 | "etag": "~1.8.1",
190 | "finalhandler": "1.2.0",
191 | "fresh": "0.5.2",
192 | "http-errors": "2.0.0",
193 | "merge-descriptors": "1.0.1",
194 | "methods": "~1.1.2",
195 | "on-finished": "2.4.1",
196 | "parseurl": "~1.3.3",
197 | "path-to-regexp": "0.1.7",
198 | "proxy-addr": "~2.0.7",
199 | "qs": "6.11.0",
200 | "range-parser": "~1.2.1",
201 | "safe-buffer": "5.2.1",
202 | "send": "0.18.0",
203 | "serve-static": "1.15.0",
204 | "setprototypeof": "1.2.0",
205 | "statuses": "2.0.1",
206 | "type-is": "~1.6.18",
207 | "utils-merge": "1.0.1",
208 | "vary": "~1.1.2"
209 | },
210 | "dependencies": {
211 | "safe-buffer": {
212 | "version": "5.2.1",
213 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
214 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
215 | }
216 | }
217 | },
218 | "finalhandler": {
219 | "version": "1.2.0",
220 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
221 | "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
222 | "requires": {
223 | "debug": "2.6.9",
224 | "encodeurl": "~1.0.2",
225 | "escape-html": "~1.0.3",
226 | "on-finished": "2.4.1",
227 | "parseurl": "~1.3.3",
228 | "statuses": "2.0.1",
229 | "unpipe": "~1.0.0"
230 | }
231 | },
232 | "forwarded": {
233 | "version": "0.2.0",
234 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
235 | "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="
236 | },
237 | "fresh": {
238 | "version": "0.5.2",
239 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
240 | "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q=="
241 | },
242 | "function-bind": {
243 | "version": "1.1.1",
244 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
245 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
246 | },
247 | "get-intrinsic": {
248 | "version": "1.1.3",
249 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz",
250 | "integrity": "sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==",
251 | "requires": {
252 | "function-bind": "^1.1.1",
253 | "has": "^1.0.3",
254 | "has-symbols": "^1.0.3"
255 | }
256 | },
257 | "has": {
258 | "version": "1.0.3",
259 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
260 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
261 | "requires": {
262 | "function-bind": "^1.1.1"
263 | }
264 | },
265 | "has-symbols": {
266 | "version": "1.0.3",
267 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
268 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
269 | },
270 | "http-errors": {
271 | "version": "2.0.0",
272 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
273 | "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
274 | "requires": {
275 | "depd": "2.0.0",
276 | "inherits": "2.0.4",
277 | "setprototypeof": "1.2.0",
278 | "statuses": "2.0.1",
279 | "toidentifier": "1.0.1"
280 | }
281 | },
282 | "iconv-lite": {
283 | "version": "0.4.24",
284 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
285 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
286 | "requires": {
287 | "safer-buffer": ">= 2.1.2 < 3"
288 | }
289 | },
290 | "inherits": {
291 | "version": "2.0.4",
292 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
293 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
294 | },
295 | "ipaddr.js": {
296 | "version": "1.9.1",
297 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
298 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="
299 | },
300 | "isarray": {
301 | "version": "1.0.0",
302 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
303 | "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ=="
304 | },
305 | "kareem": {
306 | "version": "2.3.2",
307 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.2.tgz",
308 | "integrity": "sha512-STHz9P7X2L4Kwn72fA4rGyqyXdmrMSdxqHx9IXon/FXluXieaFA6KJ2upcHAHxQPQ0LeM/OjLrhFxifHewOALQ=="
309 | },
310 | "media-typer": {
311 | "version": "0.3.0",
312 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
313 | "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ=="
314 | },
315 | "memory-pager": {
316 | "version": "1.5.0",
317 | "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz",
318 | "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==",
319 | "optional": true
320 | },
321 | "merge-descriptors": {
322 | "version": "1.0.1",
323 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
324 | "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
325 | },
326 | "methods": {
327 | "version": "1.1.2",
328 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
329 | "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w=="
330 | },
331 | "mime": {
332 | "version": "1.6.0",
333 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
334 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
335 | },
336 | "mime-db": {
337 | "version": "1.52.0",
338 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
339 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
340 | },
341 | "mime-types": {
342 | "version": "2.1.35",
343 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
344 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
345 | "requires": {
346 | "mime-db": "1.52.0"
347 | }
348 | },
349 | "mongodb": {
350 | "version": "3.7.3",
351 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.7.3.tgz",
352 | "integrity": "sha512-Psm+g3/wHXhjBEktkxXsFMZvd3nemI0r3IPsE0bU+4//PnvNWKkzhZcEsbPcYiWqe8XqXJJEg4Tgtr7Raw67Yw==",
353 | "requires": {
354 | "bl": "^2.2.1",
355 | "bson": "^1.1.4",
356 | "denque": "^1.4.1",
357 | "optional-require": "^1.1.8",
358 | "safe-buffer": "^5.1.2",
359 | "saslprep": "^1.0.0"
360 | },
361 | "dependencies": {
362 | "optional-require": {
363 | "version": "1.1.8",
364 | "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.1.8.tgz",
365 | "integrity": "sha512-jq83qaUb0wNg9Krv1c5OQ+58EK+vHde6aBPzLvPPqJm89UQWsvSuFy9X/OSNJnFeSOKo7btE0n8Nl2+nE+z5nA==",
366 | "requires": {
367 | "require-at": "^1.0.6"
368 | }
369 | }
370 | }
371 | },
372 | "mongoose": {
373 | "version": "5.13.16",
374 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.13.16.tgz",
375 | "integrity": "sha512-kBNB+BfaQjn3Jjh1SfdZZub70pde9dI0sA8VN6AnnCOeK4TzbLDyB0lBmPBOajppm6U9orde5YfTRyyVa1U45w==",
376 | "requires": {
377 | "@types/bson": "1.x || 4.0.x",
378 | "@types/mongodb": "^3.5.27",
379 | "bson": "^1.1.4",
380 | "kareem": "2.3.2",
381 | "mongodb": "3.7.3",
382 | "mongoose-legacy-pluralize": "1.0.2",
383 | "mpath": "0.8.4",
384 | "mquery": "3.2.5",
385 | "ms": "2.1.2",
386 | "optional-require": "1.0.x",
387 | "regexp-clone": "1.0.0",
388 | "safe-buffer": "5.2.1",
389 | "sift": "13.5.2",
390 | "sliced": "1.0.1"
391 | },
392 | "dependencies": {
393 | "ms": {
394 | "version": "2.1.2",
395 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
396 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
397 | }
398 | }
399 | },
400 | "mongoose-legacy-pluralize": {
401 | "version": "1.0.2",
402 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz",
403 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ=="
404 | },
405 | "mpath": {
406 | "version": "0.8.4",
407 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.4.tgz",
408 | "integrity": "sha512-DTxNZomBcTWlrMW76jy1wvV37X/cNNxPW1y2Jzd4DZkAaC5ZGsm8bfGfNOthcDuRJujXLqiuS6o3Tpy0JEoh7g=="
409 | },
410 | "mquery": {
411 | "version": "3.2.5",
412 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.5.tgz",
413 | "integrity": "sha512-VjOKHHgU84wij7IUoZzFRU07IAxd5kWJaDmyUzQlbjHjyoeK5TNeeo8ZsFDtTYnSgpW6n/nMNIHvE3u8Lbrf4A==",
414 | "requires": {
415 | "bluebird": "3.5.1",
416 | "debug": "3.1.0",
417 | "regexp-clone": "^1.0.0",
418 | "safe-buffer": "5.1.2",
419 | "sliced": "1.0.1"
420 | },
421 | "dependencies": {
422 | "debug": {
423 | "version": "3.1.0",
424 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
425 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
426 | "requires": {
427 | "ms": "2.0.0"
428 | }
429 | },
430 | "safe-buffer": {
431 | "version": "5.1.2",
432 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
433 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
434 | }
435 | }
436 | },
437 | "ms": {
438 | "version": "2.0.0",
439 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
440 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
441 | },
442 | "negotiator": {
443 | "version": "0.6.3",
444 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
445 | "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="
446 | },
447 | "object-inspect": {
448 | "version": "1.12.2",
449 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
450 | "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
451 | },
452 | "on-finished": {
453 | "version": "2.4.1",
454 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
455 | "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
456 | "requires": {
457 | "ee-first": "1.1.1"
458 | }
459 | },
460 | "optional-require": {
461 | "version": "1.0.3",
462 | "resolved": "https://registry.npmjs.org/optional-require/-/optional-require-1.0.3.tgz",
463 | "integrity": "sha512-RV2Zp2MY2aeYK5G+B/Sps8lW5NHAzE5QClbFP15j+PWmP+T9PxlJXBOOLoSAdgwFvS4t0aMR4vpedMkbHfh0nA=="
464 | },
465 | "parseurl": {
466 | "version": "1.3.3",
467 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
468 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
469 | },
470 | "path-to-regexp": {
471 | "version": "0.1.7",
472 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
473 | "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
474 | },
475 | "process-nextick-args": {
476 | "version": "2.0.1",
477 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
478 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
479 | },
480 | "proxy-addr": {
481 | "version": "2.0.7",
482 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
483 | "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
484 | "requires": {
485 | "forwarded": "0.2.0",
486 | "ipaddr.js": "1.9.1"
487 | }
488 | },
489 | "qs": {
490 | "version": "6.11.0",
491 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz",
492 | "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==",
493 | "requires": {
494 | "side-channel": "^1.0.4"
495 | }
496 | },
497 | "range-parser": {
498 | "version": "1.2.1",
499 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
500 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
501 | },
502 | "raw-body": {
503 | "version": "2.5.1",
504 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
505 | "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
506 | "requires": {
507 | "bytes": "3.1.2",
508 | "http-errors": "2.0.0",
509 | "iconv-lite": "0.4.24",
510 | "unpipe": "1.0.0"
511 | }
512 | },
513 | "readable-stream": {
514 | "version": "2.3.8",
515 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
516 | "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
517 | "requires": {
518 | "core-util-is": "~1.0.0",
519 | "inherits": "~2.0.3",
520 | "isarray": "~1.0.0",
521 | "process-nextick-args": "~2.0.0",
522 | "safe-buffer": "~5.1.1",
523 | "string_decoder": "~1.1.1",
524 | "util-deprecate": "~1.0.1"
525 | },
526 | "dependencies": {
527 | "safe-buffer": {
528 | "version": "5.1.2",
529 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
530 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
531 | }
532 | }
533 | },
534 | "regexp-clone": {
535 | "version": "1.0.0",
536 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz",
537 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw=="
538 | },
539 | "require-at": {
540 | "version": "1.0.6",
541 | "resolved": "https://registry.npmjs.org/require-at/-/require-at-1.0.6.tgz",
542 | "integrity": "sha512-7i1auJbMUrXEAZCOQ0VNJgmcT2VOKPRl2YGJwgpHpC9CE91Mv4/4UYIUm4chGJaI381ZDq1JUicFii64Hapd8g=="
543 | },
544 | "safe-buffer": {
545 | "version": "5.2.1",
546 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
547 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
548 | },
549 | "safer-buffer": {
550 | "version": "2.1.2",
551 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
552 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
553 | },
554 | "saslprep": {
555 | "version": "1.0.3",
556 | "resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
557 | "integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
558 | "optional": true,
559 | "requires": {
560 | "sparse-bitfield": "^3.0.3"
561 | }
562 | },
563 | "send": {
564 | "version": "0.18.0",
565 | "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
566 | "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
567 | "requires": {
568 | "debug": "2.6.9",
569 | "depd": "2.0.0",
570 | "destroy": "1.2.0",
571 | "encodeurl": "~1.0.2",
572 | "escape-html": "~1.0.3",
573 | "etag": "~1.8.1",
574 | "fresh": "0.5.2",
575 | "http-errors": "2.0.0",
576 | "mime": "1.6.0",
577 | "ms": "2.1.3",
578 | "on-finished": "2.4.1",
579 | "range-parser": "~1.2.1",
580 | "statuses": "2.0.1"
581 | },
582 | "dependencies": {
583 | "ms": {
584 | "version": "2.1.3",
585 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
586 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
587 | }
588 | }
589 | },
590 | "serve-static": {
591 | "version": "1.15.0",
592 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
593 | "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
594 | "requires": {
595 | "encodeurl": "~1.0.2",
596 | "escape-html": "~1.0.3",
597 | "parseurl": "~1.3.3",
598 | "send": "0.18.0"
599 | }
600 | },
601 | "setprototypeof": {
602 | "version": "1.2.0",
603 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
604 | "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
605 | },
606 | "side-channel": {
607 | "version": "1.0.4",
608 | "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
609 | "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
610 | "requires": {
611 | "call-bind": "^1.0.0",
612 | "get-intrinsic": "^1.0.2",
613 | "object-inspect": "^1.9.0"
614 | }
615 | },
616 | "sift": {
617 | "version": "13.5.2",
618 | "resolved": "https://registry.npmjs.org/sift/-/sift-13.5.2.tgz",
619 | "integrity": "sha512-+gxdEOMA2J+AI+fVsCqeNn7Tgx3M9ZN9jdi95939l1IJ8cZsqS8sqpJyOkic2SJk+1+98Uwryt/gL6XDaV+UZA=="
620 | },
621 | "sliced": {
622 | "version": "1.0.1",
623 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
624 | "integrity": "sha512-VZBmZP8WU3sMOZm1bdgTadsQbcscK0UM8oKxKVBs4XAhUo2Xxzm/OFMGBkPusxw9xL3Uy8LrzEqGqJhclsr0yA=="
625 | },
626 | "sparse-bitfield": {
627 | "version": "3.0.3",
628 | "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz",
629 | "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==",
630 | "optional": true,
631 | "requires": {
632 | "memory-pager": "^1.0.2"
633 | }
634 | },
635 | "statuses": {
636 | "version": "2.0.1",
637 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
638 | "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ=="
639 | },
640 | "string_decoder": {
641 | "version": "1.1.1",
642 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
643 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
644 | "requires": {
645 | "safe-buffer": "~5.1.0"
646 | },
647 | "dependencies": {
648 | "safe-buffer": {
649 | "version": "5.1.2",
650 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
651 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
652 | }
653 | }
654 | },
655 | "toidentifier": {
656 | "version": "1.0.1",
657 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
658 | "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="
659 | },
660 | "type-is": {
661 | "version": "1.6.18",
662 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
663 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
664 | "requires": {
665 | "media-typer": "0.3.0",
666 | "mime-types": "~2.1.24"
667 | }
668 | },
669 | "unpipe": {
670 | "version": "1.0.0",
671 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
672 | "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="
673 | },
674 | "util-deprecate": {
675 | "version": "1.0.2",
676 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
677 | "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
678 | },
679 | "utils-merge": {
680 | "version": "1.0.1",
681 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
682 | "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA=="
683 | },
684 | "vary": {
685 | "version": "1.1.2",
686 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
687 | "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="
688 | }
689 | }
690 | }
691 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "resthub2",
3 | "version": "2.0.0",
4 | "description": "A Node App demonstrating simple RESTFul API implementation",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1",
8 | "start": "node index.js"
9 |
10 | },
11 | "keywords": [
12 | "API",
13 | "resful",
14 | "json",
15 | "node",
16 | "mongodb",
17 | "express"
18 | ],
19 | "author": "David Inyang-Etoh",
20 | "license": "ISC",
21 | "dependencies": {
22 | "body-parser": "^1.20.1",
23 | "express": "^4.18.2",
24 | "mongoose": "^5.13.16"
25 | }
26 | }
27 |
--------------------------------------------------------------------------------