parent
03519220b8
commit
f3f13a3fae
25 changed files with 1228 additions and 0 deletions
@ -0,0 +1 @@ |
|||||||
|
/node_modules |
@ -0,0 +1,21 @@ |
|||||||
|
const express = require('express') |
||||||
|
const cors = require('cors') |
||||||
|
const helmet = require('helmet') |
||||||
|
const morgan = require('morgan') |
||||||
|
const bodyParser =require('body-parser') |
||||||
|
const {PORT} = require('./utils/configs/config') |
||||||
|
const { openDatabaseConnection, mongoose } = require('./utils/database') |
||||||
|
const midlleware = require('./src/middlewares/gateway_middleware') |
||||||
|
|
||||||
|
const app = express() |
||||||
|
app.use(helmet()) |
||||||
|
app.use(cors()) |
||||||
|
app.use(morgan('dev')) |
||||||
|
app.use(bodyParser.json()) |
||||||
|
app.use(midlleware) |
||||||
|
|
||||||
|
// Start Server
|
||||||
|
app.listen(process.env.PORT || PORT, () => { |
||||||
|
openDatabaseConnection() |
||||||
|
console.log(`Server started on port ${PORT}`) |
||||||
|
}) |
@ -0,0 +1,11 @@ |
|||||||
|
const mongoose = require('mongoose') |
||||||
|
const { forwardRequest } = require('./request_forwarding') |
||||||
|
const { logModel, serviceModel } = require('../data/models/index')(mongoose) |
||||||
|
const { resolveRequest } = require('./request_resolver')(logModel, serviceModel) |
||||||
|
const { resolveResponse } = require('./response_resolver') |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
forwardRequest, |
||||||
|
resolveRequest, |
||||||
|
resolveResponse |
||||||
|
} |
@ -0,0 +1,43 @@ |
|||||||
|
const axios = require('axios').default |
||||||
|
|
||||||
|
function forwardRequest(request) { |
||||||
|
return new Promise((resolve, reject) => { |
||||||
|
const method = request.method.toLowerCase() |
||||||
|
if ( method === 'get' ) { |
||||||
|
axios({ |
||||||
|
method: method, |
||||||
|
baseURL: request.host, |
||||||
|
url: request.path, |
||||||
|
responseType: 'json' |
||||||
|
}) |
||||||
|
.then(response => { |
||||||
|
console.log(response) |
||||||
|
resolve(response) |
||||||
|
}) |
||||||
|
.catch(err => { |
||||||
|
console.log(err) |
||||||
|
reject(err) |
||||||
|
}) |
||||||
|
} else { |
||||||
|
axios({ |
||||||
|
method: method, |
||||||
|
baseURL: request.host, |
||||||
|
url: request.path, |
||||||
|
responseType: 'json', |
||||||
|
data: request.body |
||||||
|
}) |
||||||
|
.then(response => { |
||||||
|
console.log(response) |
||||||
|
resolve(response) |
||||||
|
}) |
||||||
|
.catch(err => { |
||||||
|
console.log(err) |
||||||
|
reject(err) |
||||||
|
}) |
||||||
|
} |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
forwardRequest |
||||||
|
} |
@ -0,0 +1,66 @@ |
|||||||
|
const {validateAPIKey, grabRequest} = require('../helpers/index') // Helpers
|
||||||
|
|
||||||
|
function __resolveRequest(req, logModel, serviceModel, callback) { |
||||||
|
let request = grabRequest(req) |
||||||
|
if ( validateAPIKey(request.api_key) ) { |
||||||
|
serviceModel.getByID(request.app_id) |
||||||
|
.then(result => { |
||||||
|
if ( result ) { |
||||||
|
let flag = false |
||||||
|
for ( let i = 0; i < result.resourcePaths.length; i++ ) { |
||||||
|
if ( request.path === result.resourcePaths[i].path |
||||||
|
&& request.method == result.resourcePaths[i].method) { |
||||||
|
flag = true |
||||||
|
break |
||||||
|
} |
||||||
|
} |
||||||
|
if ( flag ) { |
||||||
|
logModel.addLog(new logModel({ |
||||||
|
path: request.path, |
||||||
|
service: request.app_id, |
||||||
|
ip_address: request.ip_address |
||||||
|
})) |
||||||
|
callback(result, request, null) |
||||||
|
} else { |
||||||
|
const err = { |
||||||
|
type: 'UNAUTHORIZED', |
||||||
|
module_source: 'request_resolver', |
||||||
|
message: 'Request method is not found.' |
||||||
|
} |
||||||
|
callback(null, null, err) |
||||||
|
} |
||||||
|
} else { |
||||||
|
const err = { |
||||||
|
type: 'NOT_FOUND', |
||||||
|
module_source: 'request_resolver', |
||||||
|
message: 'Host not found in the database' |
||||||
|
} |
||||||
|
callback(null, null, err) |
||||||
|
} |
||||||
|
}) |
||||||
|
.catch(_ => { |
||||||
|
const err = { |
||||||
|
type: 'SERVER_ERROR', |
||||||
|
module_source: 'request_resolver', |
||||||
|
message: 'Internal server Error. Please back later.' |
||||||
|
} |
||||||
|
callback(null, null, err) |
||||||
|
}) |
||||||
|
} else { |
||||||
|
const err = { |
||||||
|
type: 'UNAUTHORIZED', |
||||||
|
module_source: 'request_resolver', |
||||||
|
message: 'You\'re not allowed to do this action.' |
||||||
|
} |
||||||
|
callback(null, null, err) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = (logModel, serviceModel) => { |
||||||
|
return { |
||||||
|
resolveRequest: (req, callback) => { |
||||||
|
return __resolveRequest(req, logModel, serviceModel, callback) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
/** |
||||||
|
* Here, we're going to modify the response header |
||||||
|
*/ |
||||||
|
|
||||||
|
|
||||||
|
function __addSecureAndCacheHeaders(res) { |
||||||
|
// OWASP Secure Headers
|
||||||
|
res.set('X-Content-Type-Options', 'nosniff') |
||||||
|
res.set('X-XSS-Protection', '1; mode=block') |
||||||
|
res.set('X-Frame-Options', 'DENY') |
||||||
|
res.set('Strict-Transport-Security', 'max-age=63072000; includeSubDomains') |
||||||
|
|
||||||
|
// Avoid Caching Tokens
|
||||||
|
res.set('Cache-Control', 'no-cache, no-store, must-revalidate') |
||||||
|
res.set('Pragma', 'no-cache') |
||||||
|
res.set('Expires', '0') |
||||||
|
} |
||||||
|
|
||||||
|
function resolveResponse(res) { |
||||||
|
__addSecureAndCacheHeaders(res) |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
resolveResponse |
||||||
|
} |
@ -0,0 +1,9 @@ |
|||||||
|
const responseCacheAdapter = require('./response/index') |
||||||
|
|
||||||
|
function __getResponseCacheAdapter(redisClient) { return responseCacheAdapter(redisClient) } |
||||||
|
|
||||||
|
module.exports = (redisClient) => { |
||||||
|
return { |
||||||
|
responseCacheAdapter: __getResponseCacheAdapter(redisClient) |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,9 @@ |
|||||||
|
function __createCacheAdapter(redisClient) { |
||||||
|
const cacheAdapter = require('./res_cache')(redisClient) |
||||||
|
return cacheAdapter |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = (redisClient) => { |
||||||
|
const adapter = __createCacheAdapter(redisClient) |
||||||
|
return adapter |
||||||
|
} |
@ -0,0 +1,32 @@ |
|||||||
|
function __getResponseCache(service_id, path, redisClient) { |
||||||
|
return new Promise((resolve, reject) => { |
||||||
|
redisClient.hgetAsync(service_id, path) |
||||||
|
.then(result => { |
||||||
|
resolve(result) |
||||||
|
}, err => { |
||||||
|
reject(err) |
||||||
|
}) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
function __setCache(service_id, path, data, redisClient) { |
||||||
|
return new Promise((resolve, reject) => { |
||||||
|
redisClient.hsetAsync(service_id, path, data) |
||||||
|
.then(result => { |
||||||
|
resolve(result) |
||||||
|
}, err => { |
||||||
|
reject(err) |
||||||
|
}) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = (redisClient) => { |
||||||
|
return { |
||||||
|
getResponseCache: (service_id, path) => { |
||||||
|
return __getResponseCache(service_id, path, redisClient) |
||||||
|
}, |
||||||
|
setCache: (service_id, path, data) => { |
||||||
|
return __setCache(service_id, path, data, redisClient) |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,12 @@ |
|||||||
|
const logModel = require('./logs/index') |
||||||
|
const serviceModel = require('./services/index') |
||||||
|
|
||||||
|
function __getLogModel(mongoose) { return logModel(mongoose) } |
||||||
|
function __getServiceModel(mongoose) { return serviceModel(mongoose) } |
||||||
|
|
||||||
|
module.exports = (mongoose) => { |
||||||
|
return { |
||||||
|
logModel: __getLogModel(mongoose), |
||||||
|
serviceModel: __getServiceModel(mongoose) |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,34 @@ |
|||||||
|
/** |
||||||
|
* This is the data log model for monitoring the trafic for each service. |
||||||
|
*/ |
||||||
|
function __createModel(mongoose) { |
||||||
|
const schema = require('./schema')(mongoose) |
||||||
|
schema.statics.getAll = function() { |
||||||
|
return Promise((resolve, reject) => { |
||||||
|
this.find({}) |
||||||
|
.then(docs => { resolve(docs) }) |
||||||
|
.catch(err => { reject(err) }) |
||||||
|
}) |
||||||
|
} |
||||||
|
schema.statics.getByID = function(id) { |
||||||
|
return Promise((resolve, reject) => { |
||||||
|
this.findOne({_id: id}) |
||||||
|
.then(doc => { resolve(doc) }) |
||||||
|
.catch(err => { reject(err) }) |
||||||
|
}) |
||||||
|
} |
||||||
|
schema.statics.addLog = function(log) { |
||||||
|
return new Promise((resolve, reject) => { |
||||||
|
log.save() |
||||||
|
.then(result => {resolve(result)}) |
||||||
|
.catch(err => {reject(err)}) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
return schema |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = (mongoose) => { |
||||||
|
const schema = __createModel(mongoose) |
||||||
|
return mongoose.model('log_model', schema) |
||||||
|
} |
@ -0,0 +1,8 @@ |
|||||||
|
module.exports = (mongoose) => { |
||||||
|
return new mongoose.Schema({ |
||||||
|
request_time: {type: Date, default: new Date()}, |
||||||
|
path: {type: String, required: true}, |
||||||
|
service: {type: mongoose.Schema.Types.ObjectId, ref: 'services', required: true}, |
||||||
|
ip_address: {type: String, required: true} |
||||||
|
}, {collection: 'logs'}) |
||||||
|
} |
@ -0,0 +1,41 @@ |
|||||||
|
/** |
||||||
|
* This is the data service model for saving the service route. |
||||||
|
*/ |
||||||
|
function __createModel(mongoose) { |
||||||
|
const schema = require('./schema')(mongoose) |
||||||
|
schema.statics.getAll = function() { |
||||||
|
return Promise((resolve, reject) => { |
||||||
|
this.find({}) |
||||||
|
.then(docs => { resolve(docs) }) |
||||||
|
.catch(err => { reject(err) }) |
||||||
|
}) |
||||||
|
} |
||||||
|
schema.statics.getByID = function(id) { |
||||||
|
return Promise((resolve, reject) => { |
||||||
|
this.findOne({_id: id}) |
||||||
|
.then(doc => { resolve(doc) }) |
||||||
|
.catch(err => { reject(err) }) |
||||||
|
}) |
||||||
|
} |
||||||
|
schema.statics.addService = function(log) { |
||||||
|
return new Promise((resolve, reject) => { |
||||||
|
log.save() |
||||||
|
.then(result => {resolve(result)}) |
||||||
|
.catch(err => {reject(err)}) |
||||||
|
}) |
||||||
|
} |
||||||
|
schema.statics.deleteService = function(id) { |
||||||
|
return new Promise((resolve, reject) => { |
||||||
|
this.deleteOne({_id: id}) |
||||||
|
.then(result => { resolve(result) }) |
||||||
|
.catch(err => { reject(err) }) |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
return schema |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = (mongoose) => { |
||||||
|
const schema = __createModel(mongoose) |
||||||
|
return mongoose.model('service_model', schema) |
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
module.exports = (mongoose) => { |
||||||
|
return new mongoose.Schema({ |
||||||
|
service_name: {type: String, required: true}, |
||||||
|
host: {type: String, required: true}, |
||||||
|
port: {type: String, required: true}, |
||||||
|
resourcePaths: { |
||||||
|
type: [ |
||||||
|
{ |
||||||
|
path: { type: String, required: String }, |
||||||
|
method: { type: String, required: true } |
||||||
|
} |
||||||
|
], |
||||||
|
default: [] |
||||||
|
} |
||||||
|
}, {collection: 'services'}) |
||||||
|
} |
@ -0,0 +1,6 @@ |
|||||||
|
const { validateAPIKey } = require('./validation/http_signature_validation') |
||||||
|
const { grabRequest } = require('./webhooks/http_headers_grab') |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
validateAPIKey, grabRequest |
||||||
|
} |
@ -0,0 +1,15 @@ |
|||||||
|
const {SECRET_KEY, CRYPT_ALGORITHM, API_KEY} = require('../../../utils/configs/config') |
||||||
|
const crypto = require('crypto-js') |
||||||
|
|
||||||
|
function validateAPIKey(key) { |
||||||
|
let decryptedTextTemporary = '' |
||||||
|
if ( CRYPT_ALGORITHM === 'AES' ) { |
||||||
|
const decrypted = crypto.AES.decrypt(key, SECRET_KEY) |
||||||
|
decryptedTextTemporary = decrypted.toString(crypto.enc.Utf8) |
||||||
|
} |
||||||
|
return decryptedTextTemporary === API_KEY |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
validateAPIKey |
||||||
|
} |
@ -0,0 +1,3 @@ |
|||||||
|
/** |
||||||
|
* IP whitelist module |
||||||
|
*/ |
@ -0,0 +1,29 @@ |
|||||||
|
/** |
||||||
|
* This module would take necessary data from the HTTP Request Data and Request Headers |
||||||
|
* After we collect all the data we need. We passing it for validation from the validation module. |
||||||
|
* Such as http signature validation and ip whitelist validation or etc. |
||||||
|
*/ |
||||||
|
function grabRequest(req) { |
||||||
|
const ipAddress = (req.headers['x-forwarded-for'] || '').split(',').pop() ||
|
||||||
|
req.connection.remoteAddress ||
|
||||||
|
req.socket.remoteAddress ||
|
||||||
|
req.connection.socket.remoteAddress |
||||||
|
const apiSignatureKey = req.headers['api_key'] || '' |
||||||
|
return { |
||||||
|
ip_address: ipAddress, |
||||||
|
api_key: apiSignatureKey, |
||||||
|
host: req.headers['host'], |
||||||
|
user_Agent: req.headers['user-agent'] || '', |
||||||
|
method: req.method, |
||||||
|
path: req.path, |
||||||
|
originalUrl: req.originalUrl, |
||||||
|
query: req.query, |
||||||
|
params: req.params, |
||||||
|
app_id: req.headers['app_id'], |
||||||
|
body: req.body |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
grabRequest |
||||||
|
} |
@ -0,0 +1,35 @@ |
|||||||
|
const { forwardRequest, |
||||||
|
resolveRequest, |
||||||
|
resolveResponse } = require('../core/index') |
||||||
|
const router = require('express').Router() |
||||||
|
|
||||||
|
router.all('/api/*', (req, res, next) => { |
||||||
|
resolveResponse(res) |
||||||
|
resolveRequest(req, (result, request, error) => { |
||||||
|
if ( error ) { |
||||||
|
let status_code |
||||||
|
if ( error.hasOwnProperty('type') ) { |
||||||
|
if ( error.type === 'UNAUTHORIZED' ) { |
||||||
|
status_code = 401 |
||||||
|
} else if ( error.type === 'NOT_FOUND' ) { |
||||||
|
status_code = 404 |
||||||
|
} else { |
||||||
|
status_code = 500 |
||||||
|
} |
||||||
|
} else { |
||||||
|
status_code = 500 |
||||||
|
} |
||||||
|
res.status(status_code).json(error) |
||||||
|
} else { |
||||||
|
forwardRequest(request) |
||||||
|
.then(response => { |
||||||
|
res.json(response) |
||||||
|
}) |
||||||
|
.catch(err => { |
||||||
|
res.status(500).json(err) |
||||||
|
}) |
||||||
|
} |
||||||
|
}) |
||||||
|
}) |
||||||
|
|
||||||
|
module.exports = router |
@ -0,0 +1,12 @@ |
|||||||
|
const redis = require('redis') |
||||||
|
const bluebird = require('bluebird') |
||||||
|
|
||||||
|
bluebird.promisifyAll(redis) // Make everything on redis be async
|
||||||
|
|
||||||
|
const redisClient = redis.createClient({ |
||||||
|
port: 6379 |
||||||
|
}) |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
redisClient |
||||||
|
} |
@ -0,0 +1,7 @@ |
|||||||
|
module.exports = { |
||||||
|
DB_NAME: 'GATEWAY_DB', |
||||||
|
PORT: 8080, |
||||||
|
SECRET_KEY: 'Thanos_is_fucked_up+=$^532$#%^3422-YggDrasil-OrionStark_=-423053', |
||||||
|
CRYPT_ALGORITHM: 'AES', |
||||||
|
API_KEY: 'deef690f-7dd2-4eea-b4ed-3371c7a52a13' |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
const mongoose = require('mongoose') |
||||||
|
const { DB_NAME } = require('./configs/config') |
||||||
|
mongoose.set('runValidators', true) |
||||||
|
|
||||||
|
module.exports = { |
||||||
|
openDatabaseConnection: () => { |
||||||
|
console.log('Connecting to database') |
||||||
|
mongoose.connect(`mongodb://localhost:27017/${DB_NAME}`, { useNewUrlParser: true, useUnifiedTopology: true }) |
||||||
|
.then(result => { |
||||||
|
console.log(result) |
||||||
|
console.log('Connected to database') |
||||||
|
}) |
||||||
|
.catch(err => { |
||||||
|
console.log(err) |
||||||
|
throw Error(err) |
||||||
|
}) |
||||||
|
}, |
||||||
|
mongoose |
||||||
|
} |
@ -0,0 +1,750 @@ |
|||||||
|
{ |
||||||
|
"name": "api-gateway", |
||||||
|
"version": "1.0.0", |
||||||
|
"lockfileVersion": 1, |
||||||
|
"requires": true, |
||||||
|
"dependencies": { |
||||||
|
"accepts": { |
||||||
|
"version": "1.3.7", |
||||||
|
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", |
||||||
|
"integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", |
||||||
|
"requires": { |
||||||
|
"mime-types": "~2.1.24", |
||||||
|
"negotiator": "0.6.2" |
||||||
|
} |
||||||
|
}, |
||||||
|
"array-flatten": { |
||||||
|
"version": "1.1.1", |
||||||
|
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", |
||||||
|
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" |
||||||
|
}, |
||||||
|
"axios": { |
||||||
|
"version": "0.19.1", |
||||||
|
"resolved": "https://registry.npmjs.org/axios/-/axios-0.19.1.tgz", |
||||||
|
"integrity": "sha512-Yl+7nfreYKaLRvAvjNPkvfjnQHJM1yLBY3zhqAwcJSwR/6ETkanUgylgtIvkvz0xJ+p/vZuNw8X7Hnb7Whsbpw==", |
||||||
|
"requires": { |
||||||
|
"follow-redirects": "1.5.10" |
||||||
|
} |
||||||
|
}, |
||||||
|
"basic-auth": { |
||||||
|
"version": "2.0.1", |
||||||
|
"resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", |
||||||
|
"integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", |
||||||
|
"requires": { |
||||||
|
"safe-buffer": "5.1.2" |
||||||
|
} |
||||||
|
}, |
||||||
|
"bluebird": { |
||||||
|
"version": "3.7.2", |
||||||
|
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", |
||||||
|
"integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" |
||||||
|
}, |
||||||
|
"body-parser": { |
||||||
|
"version": "1.19.0", |
||||||
|
"resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", |
||||||
|
"integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", |
||||||
|
"requires": { |
||||||
|
"bytes": "3.1.0", |
||||||
|
"content-type": "~1.0.4", |
||||||
|
"debug": "2.6.9", |
||||||
|
"depd": "~1.1.2", |
||||||
|
"http-errors": "1.7.2", |
||||||
|
"iconv-lite": "0.4.24", |
||||||
|
"on-finished": "~2.3.0", |
||||||
|
"qs": "6.7.0", |
||||||
|
"raw-body": "2.4.0", |
||||||
|
"type-is": "~1.6.17" |
||||||
|
} |
||||||
|
}, |
||||||
|
"bowser": { |
||||||
|
"version": "2.8.1", |
||||||
|
"resolved": "https://registry.npmjs.org/bowser/-/bowser-2.8.1.tgz", |
||||||
|
"integrity": "sha512-FxxltGKqMHkVa3KtpA+kdnxH0caHPDewccyrK3vW1bsMw6Zco4vRPmMunowX0pXlDZqhxkKSpToADQI2Sk4OeQ==" |
||||||
|
}, |
||||||
|
"bson": { |
||||||
|
"version": "1.1.3", |
||||||
|
"resolved": "https://registry.npmjs.org/bson/-/bson-1.1.3.tgz", |
||||||
|
"integrity": "sha512-TdiJxMVnodVS7r0BdL42y/pqC9cL2iKynVwA0Ho3qbsQYr428veL3l7BQyuqiw+Q5SqqoT0m4srSY/BlZ9AxXg==" |
||||||
|
}, |
||||||
|
"bytes": { |
||||||
|
"version": "3.1.0", |
||||||
|
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", |
||||||
|
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" |
||||||
|
}, |
||||||
|
"camelize": { |
||||||
|
"version": "1.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.0.tgz", |
||||||
|
"integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" |
||||||
|
}, |
||||||
|
"content-disposition": { |
||||||
|
"version": "0.5.3", |
||||||
|
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", |
||||||
|
"integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", |
||||||
|
"requires": { |
||||||
|
"safe-buffer": "5.1.2" |
||||||
|
} |
||||||
|
}, |
||||||
|
"content-security-policy-builder": { |
||||||
|
"version": "2.1.0", |
||||||
|
"resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz", |
||||||
|
"integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ==" |
||||||
|
}, |
||||||
|
"content-type": { |
||||||
|
"version": "1.0.4", |
||||||
|
"resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", |
||||||
|
"integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" |
||||||
|
}, |
||||||
|
"cookie": { |
||||||
|
"version": "0.4.0", |
||||||
|
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", |
||||||
|
"integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" |
||||||
|
}, |
||||||
|
"cookie-signature": { |
||||||
|
"version": "1.0.6", |
||||||
|
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", |
||||||
|
"integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" |
||||||
|
}, |
||||||
|
"cors": { |
||||||
|
"version": "2.8.5", |
||||||
|
"resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", |
||||||
|
"integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", |
||||||
|
"requires": { |
||||||
|
"object-assign": "^4", |
||||||
|
"vary": "^1" |
||||||
|
} |
||||||
|
}, |
||||||
|
"crypto-js": { |
||||||
|
"version": "3.1.9-1", |
||||||
|
"resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-3.1.9-1.tgz", |
||||||
|
"integrity": "sha1-/aGedh/Ad+Af+/3G6f38WeiAbNg=" |
||||||
|
}, |
||||||
|
"dasherize": { |
||||||
|
"version": "2.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", |
||||||
|
"integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" |
||||||
|
}, |
||||||
|
"debug": { |
||||||
|
"version": "2.6.9", |
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", |
||||||
|
"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", |
||||||
|
"requires": { |
||||||
|
"ms": "2.0.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"depd": { |
||||||
|
"version": "1.1.2", |
||||||
|
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", |
||||||
|
"integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" |
||||||
|
}, |
||||||
|
"destroy": { |
||||||
|
"version": "1.0.4", |
||||||
|
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", |
||||||
|
"integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" |
||||||
|
}, |
||||||
|
"dns-prefetch-control": { |
||||||
|
"version": "0.2.0", |
||||||
|
"resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.2.0.tgz", |
||||||
|
"integrity": "sha512-hvSnros73+qyZXhHFjx2CMLwoj3Fe7eR9EJsFsqmcI1bB2OBWL/+0YzaEaKssCHnj/6crawNnUyw74Gm2EKe+Q==" |
||||||
|
}, |
||||||
|
"dont-sniff-mimetype": { |
||||||
|
"version": "1.1.0", |
||||||
|
"resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", |
||||||
|
"integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==" |
||||||
|
}, |
||||||
|
"double-ended-queue": { |
||||||
|
"version": "2.1.0-0", |
||||||
|
"resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", |
||||||
|
"integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=" |
||||||
|
}, |
||||||
|
"ee-first": { |
||||||
|
"version": "1.1.1", |
||||||
|
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", |
||||||
|
"integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" |
||||||
|
}, |
||||||
|
"encodeurl": { |
||||||
|
"version": "1.0.2", |
||||||
|
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", |
||||||
|
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" |
||||||
|
}, |
||||||
|
"escape-html": { |
||||||
|
"version": "1.0.3", |
||||||
|
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", |
||||||
|
"integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" |
||||||
|
}, |
||||||
|
"etag": { |
||||||
|
"version": "1.8.1", |
||||||
|
"resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", |
||||||
|
"integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" |
||||||
|
}, |
||||||
|
"expect-ct": { |
||||||
|
"version": "0.2.0", |
||||||
|
"resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.2.0.tgz", |
||||||
|
"integrity": "sha512-6SK3MG/Bbhm8MsgyJAylg+ucIOU71/FzyFalcfu5nY19dH8y/z0tBJU0wrNBXD4B27EoQtqPF/9wqH0iYAd04g==" |
||||||
|
}, |
||||||
|
"express": { |
||||||
|
"version": "4.17.1", |
||||||
|
"resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", |
||||||
|
"integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", |
||||||
|
"requires": { |
||||||
|
"accepts": "~1.3.7", |
||||||
|
"array-flatten": "1.1.1", |
||||||
|
"body-parser": "1.19.0", |
||||||
|
"content-disposition": "0.5.3", |
||||||
|
"content-type": "~1.0.4", |
||||||
|
"cookie": "0.4.0", |
||||||
|
"cookie-signature": "1.0.6", |
||||||
|
"debug": "2.6.9", |
||||||
|
"depd": "~1.1.2", |
||||||
|
"encodeurl": "~1.0.2", |
||||||
|
"escape-html": "~1.0.3", |
||||||
|
"etag": "~1.8.1", |
||||||
|
"finalhandler": "~1.1.2", |
||||||
|
"fresh": "0.5.2", |
||||||
|
"merge-descriptors": "1.0.1", |
||||||
|
"methods": "~1.1.2", |
||||||
|
"on-finished": "~2.3.0", |
||||||
|
"parseurl": "~1.3.3", |
||||||
|
"path-to-regexp": "0.1.7", |
||||||
|
"proxy-addr": "~2.0.5", |
||||||
|
"qs": "6.7.0", |
||||||
|
"range-parser": "~1.2.1", |
||||||
|
"safe-buffer": "5.1.2", |
||||||
|
"send": "0.17.1", |
||||||
|
"serve-static": "1.14.1", |
||||||
|
"setprototypeof": "1.1.1", |
||||||
|
"statuses": "~1.5.0", |
||||||
|
"type-is": "~1.6.18", |
||||||
|
"utils-merge": "1.0.1", |
||||||
|
"vary": "~1.1.2" |
||||||
|
} |
||||||
|
}, |
||||||
|
"feature-policy": { |
||||||
|
"version": "0.3.0", |
||||||
|
"resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", |
||||||
|
"integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ==" |
||||||
|
}, |
||||||
|
"finalhandler": { |
||||||
|
"version": "1.1.2", |
||||||
|
"resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", |
||||||
|
"integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", |
||||||
|
"requires": { |
||||||
|
"debug": "2.6.9", |
||||||
|
"encodeurl": "~1.0.2", |
||||||
|
"escape-html": "~1.0.3", |
||||||
|
"on-finished": "~2.3.0", |
||||||
|
"parseurl": "~1.3.3", |
||||||
|
"statuses": "~1.5.0", |
||||||
|
"unpipe": "~1.0.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"follow-redirects": { |
||||||
|
"version": "1.5.10", |
||||||
|
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", |
||||||
|
"integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", |
||||||
|
"requires": { |
||||||
|
"debug": "=3.1.0" |
||||||
|
}, |
||||||
|
"dependencies": { |
||||||
|
"debug": { |
||||||
|
"version": "3.1.0", |
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", |
||||||
|
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", |
||||||
|
"requires": { |
||||||
|
"ms": "2.0.0" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
"forwarded": { |
||||||
|
"version": "0.1.2", |
||||||
|
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", |
||||||
|
"integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" |
||||||
|
}, |
||||||
|
"frameguard": { |
||||||
|
"version": "3.1.0", |
||||||
|
"resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.1.0.tgz", |
||||||
|
"integrity": "sha512-TxgSKM+7LTA6sidjOiSZK9wxY0ffMPY3Wta//MqwmX0nZuEHc8QrkV8Fh3ZhMJeiH+Uyh/tcaarImRy8u77O7g==" |
||||||
|
}, |
||||||
|
"fresh": { |
||||||
|
"version": "0.5.2", |
||||||
|
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", |
||||||
|
"integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" |
||||||
|
}, |
||||||
|
"helmet": { |
||||||
|
"version": "3.21.2", |
||||||
|
"resolved": "https://registry.npmjs.org/helmet/-/helmet-3.21.2.tgz", |
||||||
|
"integrity": "sha512-okUo+MeWgg00cKB8Csblu8EXgcIoDyb5ZS/3u0W4spCimeVuCUvVZ6Vj3O2VJ1Sxpyb8jCDvzu0L1KKT11pkIg==", |
||||||
|
"requires": { |
||||||
|
"depd": "2.0.0", |
||||||
|
"dns-prefetch-control": "0.2.0", |
||||||
|
"dont-sniff-mimetype": "1.1.0", |
||||||
|
"expect-ct": "0.2.0", |
||||||
|
"feature-policy": "0.3.0", |
||||||
|
"frameguard": "3.1.0", |
||||||
|
"helmet-crossdomain": "0.4.0", |
||||||
|
"helmet-csp": "2.9.4", |
||||||
|
"hide-powered-by": "1.1.0", |
||||||
|
"hpkp": "2.0.0", |
||||||
|
"hsts": "2.2.0", |
||||||
|
"ienoopen": "1.1.0", |
||||||
|
"nocache": "2.1.0", |
||||||
|
"referrer-policy": "1.2.0", |
||||||
|
"x-xss-protection": "1.3.0" |
||||||
|
}, |
||||||
|
"dependencies": { |
||||||
|
"depd": { |
||||||
|
"version": "2.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", |
||||||
|
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
"helmet-crossdomain": { |
||||||
|
"version": "0.4.0", |
||||||
|
"resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz", |
||||||
|
"integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==" |
||||||
|
}, |
||||||
|
"helmet-csp": { |
||||||
|
"version": "2.9.4", |
||||||
|
"resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.9.4.tgz", |
||||||
|
"integrity": "sha512-qUgGx8+yk7Xl8XFEGI4MFu1oNmulxhQVTlV8HP8tV3tpfslCs30OZz/9uQqsWPvDISiu/NwrrCowsZBhFADYqg==", |
||||||
|
"requires": { |
||||||
|
"bowser": "^2.7.0", |
||||||
|
"camelize": "1.0.0", |
||||||
|
"content-security-policy-builder": "2.1.0", |
||||||
|
"dasherize": "2.0.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"hide-powered-by": { |
||||||
|
"version": "1.1.0", |
||||||
|
"resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz", |
||||||
|
"integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==" |
||||||
|
}, |
||||||
|
"hpkp": { |
||||||
|
"version": "2.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", |
||||||
|
"integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=" |
||||||
|
}, |
||||||
|
"hsts": { |
||||||
|
"version": "2.2.0", |
||||||
|
"resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz", |
||||||
|
"integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==", |
||||||
|
"requires": { |
||||||
|
"depd": "2.0.0" |
||||||
|
}, |
||||||
|
"dependencies": { |
||||||
|
"depd": { |
||||||
|
"version": "2.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", |
||||||
|
"integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
"http-errors": { |
||||||
|
"version": "1.7.2", |
||||||
|
"resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", |
||||||
|
"integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", |
||||||
|
"requires": { |
||||||
|
"depd": "~1.1.2", |
||||||
|
"inherits": "2.0.3", |
||||||
|
"setprototypeof": "1.1.1", |
||||||
|
"statuses": ">= 1.5.0 < 2", |
||||||
|
"toidentifier": "1.0.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"iconv-lite": { |
||||||
|
"version": "0.4.24", |
||||||
|
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", |
||||||
|
"integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", |
||||||
|
"requires": { |
||||||
|
"safer-buffer": ">= 2.1.2 < 3" |
||||||
|
} |
||||||
|
}, |
||||||
|
"ienoopen": { |
||||||
|
"version": "1.1.0", |
||||||
|
"resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.1.0.tgz", |
||||||
|
"integrity": "sha512-MFs36e/ca6ohEKtinTJ5VvAJ6oDRAYFdYXweUnGY9L9vcoqFOU4n2ZhmJ0C4z/cwGZ3YIQRSB3XZ1+ghZkY5NQ==" |
||||||
|
}, |
||||||
|
"inherits": { |
||||||
|
"version": "2.0.3", |
||||||
|
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", |
||||||
|
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" |
||||||
|
}, |
||||||
|
"ipaddr.js": { |
||||||
|
"version": "1.9.0", |
||||||
|
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", |
||||||
|
"integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" |
||||||
|
}, |
||||||
|
"kareem": { |
||||||
|
"version": "2.3.1", |
||||||
|
"resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz", |
||||||
|
"integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw==" |
||||||
|
}, |
||||||
|
"media-typer": { |
||||||
|
"version": "0.3.0", |
||||||
|
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", |
||||||
|
"integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" |
||||||
|
}, |
||||||
|
"memory-pager": { |
||||||
|
"version": "1.5.0", |
||||||
|
"resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", |
||||||
|
"integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", |
||||||
|
"optional": true |
||||||
|
}, |
||||||
|
"merge-descriptors": { |
||||||
|
"version": "1.0.1", |
||||||
|
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", |
||||||
|
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" |
||||||
|
}, |
||||||
|
"methods": { |
||||||
|
"version": "1.1.2", |
||||||
|
"resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", |
||||||
|
"integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" |
||||||
|
}, |
||||||
|
"mime": { |
||||||
|
"version": "1.6.0", |
||||||
|
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", |
||||||
|
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" |
||||||
|
}, |
||||||
|
"mime-db": { |
||||||
|
"version": "1.43.0", |
||||||
|
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.43.0.tgz", |
||||||
|
"integrity": "sha512-+5dsGEEovYbT8UY9yD7eE4XTc4UwJ1jBYlgaQQF38ENsKR3wj/8q8RFZrF9WIZpB2V1ArTVFUva8sAul1NzRzQ==" |
||||||
|
}, |
||||||
|
"mime-types": { |
||||||
|
"version": "2.1.26", |
||||||
|
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.26.tgz", |
||||||
|
"integrity": "sha512-01paPWYgLrkqAyrlDorC1uDwl2p3qZT7yl806vW7DvDoxwXi46jsjFbg+WdwotBIk6/MbEhO/dh5aZ5sNj/dWQ==", |
||||||
|
"requires": { |
||||||
|
"mime-db": "1.43.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"mongodb": { |
||||||
|
"version": "3.4.1", |
||||||
|
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.4.1.tgz", |
||||||
|
"integrity": "sha512-juqt5/Z42J4DcE7tG7UdVaTKmUC6zinF4yioPfpeOSNBieWSK6qCY+0tfGQcHLKrauWPDdMZVROHJOa8q2pWsA==", |
||||||
|
"requires": { |
||||||
|
"bson": "^1.1.1", |
||||||
|
"require_optional": "^1.0.1", |
||||||
|
"safe-buffer": "^5.1.2", |
||||||
|
"saslprep": "^1.0.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"mongoose": { |
||||||
|
"version": "5.8.7", |
||||||
|
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.8.7.tgz", |
||||||
|
"integrity": "sha512-PCCuTrdxpUmO86L1geXWE+9AvJRFuneIrMUT2hB/LXZ+5HIGOIfE6OSMU7cd8wFU7JRINP9V73zZ9YsmAbt+Iw==", |
||||||
|
"requires": { |
||||||
|
"bson": "~1.1.1", |
||||||
|
"kareem": "2.3.1", |
||||||
|
"mongodb": "3.4.1", |
||||||
|
"mongoose-legacy-pluralize": "1.0.2", |
||||||
|
"mpath": "0.6.0", |
||||||
|
"mquery": "3.2.2", |
||||||
|
"ms": "2.1.2", |
||||||
|
"regexp-clone": "1.0.0", |
||||||
|
"safe-buffer": "5.1.2", |
||||||
|
"sift": "7.0.1", |
||||||
|
"sliced": "1.0.1" |
||||||
|
}, |
||||||
|
"dependencies": { |
||||||
|
"ms": { |
||||||
|
"version": "2.1.2", |
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", |
||||||
|
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
"mongoose-legacy-pluralize": { |
||||||
|
"version": "1.0.2", |
||||||
|
"resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz", |
||||||
|
"integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ==" |
||||||
|
}, |
||||||
|
"morgan": { |
||||||
|
"version": "1.9.1", |
||||||
|
"resolved": "https://registry.npmjs.org/morgan/-/morgan-1.9.1.tgz", |
||||||
|
"integrity": "sha512-HQStPIV4y3afTiCYVxirakhlCfGkI161c76kKFca7Fk1JusM//Qeo1ej2XaMniiNeaZklMVrh3vTtIzpzwbpmA==", |
||||||
|
"requires": { |
||||||
|
"basic-auth": "~2.0.0", |
||||||
|
"debug": "2.6.9", |
||||||
|
"depd": "~1.1.2", |
||||||
|
"on-finished": "~2.3.0", |
||||||
|
"on-headers": "~1.0.1" |
||||||
|
} |
||||||
|
}, |
||||||
|
"mpath": { |
||||||
|
"version": "0.6.0", |
||||||
|
"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz", |
||||||
|
"integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw==" |
||||||
|
}, |
||||||
|
"mquery": { |
||||||
|
"version": "3.2.2", |
||||||
|
"resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz", |
||||||
|
"integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==", |
||||||
|
"requires": { |
||||||
|
"bluebird": "3.5.1", |
||||||
|
"debug": "3.1.0", |
||||||
|
"regexp-clone": "^1.0.0", |
||||||
|
"safe-buffer": "5.1.2", |
||||||
|
"sliced": "1.0.1" |
||||||
|
}, |
||||||
|
"dependencies": { |
||||||
|
"bluebird": { |
||||||
|
"version": "3.5.1", |
||||||
|
"resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", |
||||||
|
"integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" |
||||||
|
}, |
||||||
|
"debug": { |
||||||
|
"version": "3.1.0", |
||||||
|
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", |
||||||
|
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", |
||||||
|
"requires": { |
||||||
|
"ms": "2.0.0" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
"ms": { |
||||||
|
"version": "2.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", |
||||||
|
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" |
||||||
|
}, |
||||||
|
"negotiator": { |
||||||
|
"version": "0.6.2", |
||||||
|
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", |
||||||
|
"integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" |
||||||
|
}, |
||||||
|
"nocache": { |
||||||
|
"version": "2.1.0", |
||||||
|
"resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", |
||||||
|
"integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==" |
||||||
|
}, |
||||||
|
"object-assign": { |
||||||
|
"version": "4.1.1", |
||||||
|
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", |
||||||
|
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" |
||||||
|
}, |
||||||
|
"on-finished": { |
||||||
|
"version": "2.3.0", |
||||||
|
"resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", |
||||||
|
"integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", |
||||||
|
"requires": { |
||||||
|
"ee-first": "1.1.1" |
||||||
|
} |
||||||
|
}, |
||||||
|
"on-headers": { |
||||||
|
"version": "1.0.2", |
||||||
|
"resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", |
||||||
|
"integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" |
||||||
|
}, |
||||||
|
"parseurl": { |
||||||
|
"version": "1.3.3", |
||||||
|
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", |
||||||
|
"integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" |
||||||
|
}, |
||||||
|
"path-to-regexp": { |
||||||
|
"version": "0.1.7", |
||||||
|
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", |
||||||
|
"integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" |
||||||
|
}, |
||||||
|
"proxy-addr": { |
||||||
|
"version": "2.0.5", |
||||||
|
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", |
||||||
|
"integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", |
||||||
|
"requires": { |
||||||
|
"forwarded": "~0.1.2", |
||||||
|
"ipaddr.js": "1.9.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"qs": { |
||||||
|
"version": "6.7.0", |
||||||
|
"resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", |
||||||
|
"integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" |
||||||
|
}, |
||||||
|
"range-parser": { |
||||||
|
"version": "1.2.1", |
||||||
|
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", |
||||||
|
"integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" |
||||||
|
}, |
||||||
|
"raw-body": { |
||||||
|
"version": "2.4.0", |
||||||
|
"resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", |
||||||
|
"integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", |
||||||
|
"requires": { |
||||||
|
"bytes": "3.1.0", |
||||||
|
"http-errors": "1.7.2", |
||||||
|
"iconv-lite": "0.4.24", |
||||||
|
"unpipe": "1.0.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"redis": { |
||||||
|
"version": "2.8.0", |
||||||
|
"resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", |
||||||
|
"integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", |
||||||
|
"requires": { |
||||||
|
"double-ended-queue": "^2.1.0-0", |
||||||
|
"redis-commands": "^1.2.0", |
||||||
|
"redis-parser": "^2.6.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"redis-commands": { |
||||||
|
"version": "1.5.0", |
||||||
|
"resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.5.0.tgz", |
||||||
|
"integrity": "sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg==" |
||||||
|
}, |
||||||
|
"redis-parser": { |
||||||
|
"version": "2.6.0", |
||||||
|
"resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", |
||||||
|
"integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=" |
||||||
|
}, |
||||||
|
"referrer-policy": { |
||||||
|
"version": "1.2.0", |
||||||
|
"resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz", |
||||||
|
"integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA==" |
||||||
|
}, |
||||||
|
"regexp-clone": { |
||||||
|
"version": "1.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz", |
||||||
|
"integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw==" |
||||||
|
}, |
||||||
|
"require_optional": { |
||||||
|
"version": "1.0.1", |
||||||
|
"resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", |
||||||
|
"integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", |
||||||
|
"requires": { |
||||||
|
"resolve-from": "^2.0.0", |
||||||
|
"semver": "^5.1.0" |
||||||
|
} |
||||||
|
}, |
||||||
|
"resolve-from": { |
||||||
|
"version": "2.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", |
||||||
|
"integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" |
||||||
|
}, |
||||||
|
"safe-buffer": { |
||||||
|
"version": "5.1.2", |
||||||
|
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", |
||||||
|
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" |
||||||
|
}, |
||||||
|
"safer-buffer": { |
||||||
|
"version": "2.1.2", |
||||||
|
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", |
||||||
|
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" |
||||||
|
}, |
||||||
|
"saslprep": { |
||||||
|
"version": "1.0.3", |
||||||
|
"resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz", |
||||||
|
"integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==", |
||||||
|
"optional": true, |
||||||
|
"requires": { |
||||||
|
"sparse-bitfield": "^3.0.3" |
||||||
|
} |
||||||
|
}, |
||||||
|
"semver": { |
||||||
|
"version": "5.7.1", |
||||||
|
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", |
||||||
|
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" |
||||||
|
}, |
||||||
|
"send": { |
||||||
|
"version": "0.17.1", |
||||||
|
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", |
||||||
|
"integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", |
||||||
|
"requires": { |
||||||
|
"debug": "2.6.9", |
||||||
|
"depd": "~1.1.2", |
||||||
|
"destroy": "~1.0.4", |
||||||
|
"encodeurl": "~1.0.2", |
||||||
|
"escape-html": "~1.0.3", |
||||||
|
"etag": "~1.8.1", |
||||||
|
"fresh": "0.5.2", |
||||||
|
"http-errors": "~1.7.2", |
||||||
|
"mime": "1.6.0", |
||||||
|
"ms": "2.1.1", |
||||||
|
"on-finished": "~2.3.0", |
||||||
|
"range-parser": "~1.2.1", |
||||||
|
"statuses": "~1.5.0" |
||||||
|
}, |
||||||
|
"dependencies": { |
||||||
|
"ms": { |
||||||
|
"version": "2.1.1", |
||||||
|
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", |
||||||
|
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" |
||||||
|
} |
||||||
|
} |
||||||
|
}, |
||||||
|
"serve-static": { |
||||||
|
"version": "1.14.1", |
||||||
|
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", |
||||||
|
"integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", |
||||||
|
"requires": { |
||||||
|
"encodeurl": "~1.0.2", |
||||||
|
"escape-html": "~1.0.3", |
||||||
|
"parseurl": "~1.3.3", |
||||||
|
"send": "0.17.1" |
||||||
|
} |
||||||
|
}, |
||||||
|
"setprototypeof": { |
||||||
|
"version": "1.1.1", |
||||||
|
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", |
||||||
|
"integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" |
||||||
|
}, |
||||||
|
"sift": { |
||||||
|
"version": "7.0.1", |
||||||
|
"resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz", |
||||||
|
"integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g==" |
||||||
|
}, |
||||||
|
"sliced": { |
||||||
|
"version": "1.0.1", |
||||||
|
"resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz", |
||||||
|
"integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E=" |
||||||
|
}, |
||||||
|
"sparse-bitfield": { |
||||||
|
"version": "3.0.3", |
||||||
|
"resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", |
||||||
|
"integrity": "sha1-/0rm5oZWBWuks+eSqzM004JzyhE=", |
||||||
|
"optional": true, |
||||||
|
"requires": { |
||||||
|
"memory-pager": "^1.0.2" |
||||||
|
} |
||||||
|
}, |
||||||
|
"statuses": { |
||||||
|
"version": "1.5.0", |
||||||
|
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", |
||||||
|
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" |
||||||
|
}, |
||||||
|
"toidentifier": { |
||||||
|
"version": "1.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", |
||||||
|
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" |
||||||
|
}, |
||||||
|
"type-is": { |
||||||
|
"version": "1.6.18", |
||||||
|
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", |
||||||
|
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", |
||||||
|
"requires": { |
||||||
|
"media-typer": "0.3.0", |
||||||
|
"mime-types": "~2.1.24" |
||||||
|
} |
||||||
|
}, |
||||||
|
"unpipe": { |
||||||
|
"version": "1.0.0", |
||||||
|
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", |
||||||
|
"integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" |
||||||
|
}, |
||||||
|
"utils-merge": { |
||||||
|
"version": "1.0.1", |
||||||
|
"resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", |
||||||
|
"integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" |
||||||
|
}, |
||||||
|
"vary": { |
||||||
|
"version": "1.1.2", |
||||||
|
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", |
||||||
|
"integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" |
||||||
|
}, |
||||||
|
"x-xss-protection": { |
||||||
|
"version": "1.3.0", |
||||||
|
"resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz", |
||||||
|
"integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg==" |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,24 @@ |
|||||||
|
{ |
||||||
|
"name": "api-gateway", |
||||||
|
"version": "1.0.0", |
||||||
|
"description": "Simple API Gateway", |
||||||
|
"main": "app/server.js", |
||||||
|
"scripts": { |
||||||
|
"start": "nodemon ./app/server.js", |
||||||
|
"test": "echo \"Error: no test specified\" && exit 1" |
||||||
|
}, |
||||||
|
"author": "Robby Muhammad", |
||||||
|
"license": "MIT", |
||||||
|
"dependencies": { |
||||||
|
"axios": "^0.19.1", |
||||||
|
"bluebird": "^3.7.2", |
||||||
|
"body-parser": "^1.19.0", |
||||||
|
"cors": "^2.8.5", |
||||||
|
"crypto-js": "^3.1.9-1", |
||||||
|
"express": "^4.17.1", |
||||||
|
"helmet": "^3.21.2", |
||||||
|
"mongoose": "^5.8.7", |
||||||
|
"morgan": "^1.9.1", |
||||||
|
"redis": "^2.8.0" |
||||||
|
} |
||||||
|
} |
Loading…
Reference in new issue