├── .gitignore ├── README.md ├── api.js ├── businessrules.js ├── cli.js ├── config.js ├── consumer.js ├── docker-compose.yaml ├── events.js ├── package-lock.json ├── package.json └── utils.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .vscode 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Nodejs Kafka 2 | 3 | 4 | ## Setup 5 | 6 | Make sure you have following on your local machine installed 7 | > docker - 18.03.1 8 | > docker-compose - 1.21.1 9 | > node - 9.9.0 10 | > npm - 5.6.0 11 | 12 | Install Project 13 | 14 | npm install 15 | docker-compose up 16 | 17 | Create Kafka Topics 18 | 19 | docker run --rm -it --net=host landoop/fast-data-dev kafka-topics --zookeeper 127.0.0.1:2181 --topic requests --replication-factor 1 --partitions 100 --create 20 | docker run --rm -it --net=host landoop/fast-data-dev kafka-topics --zookeeper 127.0.0.1:2181 --topic finalevents --replication-factor 1 --partitions 100 --create 21 | 22 | Kafka UI 23 | 24 | Visit http://127.0.0.1:3030 to inspect your kafka broker, topics, partitions etc. 25 | 26 | 27 | 28 | ## Usage 29 | 30 | Terminal1: Start Consumer (you can start multiple in different terminals to spread the load) 31 | 32 | node consumer.js 33 | 34 | Terminal2: Start API 35 | 36 | node api.js 37 | 38 | Terminal3: Start CLI 39 | 40 | node cli.js 41 | 42 | Start interacting with the CLI and observe what the API / Consumer does 43 | -------------------------------------------------------------------------------- /api.js: -------------------------------------------------------------------------------- 1 | var express = require('express'); 2 | var bodyParser = require('body-parser'); 3 | const Bluebird = require('bluebird'); 4 | var shortid = require('shortid'); 5 | var kafka = require('kafka-node'); 6 | var redisClient = require('redis').createClient(); 7 | const { 8 | TOPIC, 9 | PRODUCER_CONFIG, 10 | KAFKA_HOST, 11 | PUBSUB_TOPIC, 12 | API_PORT, 13 | API_CON_TIMEOUT 14 | } = require('./config'); 15 | const { getPartition, throwIf, isValidEvent } = require('./utils'); 16 | 17 | var app = express(); 18 | const client = new kafka.KafkaClient({ kafkaHost: KAFKA_HOST }); 19 | const producer = new kafka.Producer(client, PRODUCER_CONFIG, getPartition); 20 | const admin = new kafka.Admin(client); 21 | 22 | const produceMsg = Bluebird.promisify(producer.send.bind(producer)); 23 | const offetGet = Bluebird.promisify(admin.describeGroups.bind(admin)); 24 | 25 | app.use(bodyParser.json()); 26 | 27 | const map = {}; 28 | 29 | function startListener(deps) { 30 | deps.redis.psubscribe(PUBSUB_TOPIC + ':*'); 31 | deps.redis.on('pmessage', function(pattern, channel, message) { 32 | const id = channel.split(':')[1]; 33 | if (deps.map[id]) { 34 | deps.map[id].resolve(JSON.parse(message)); 35 | delete deps.map[id]; 36 | } 37 | // TODO: flush cache, because maybe some entries may never be deleted 38 | }); 39 | } 40 | 41 | function timeout(time) { 42 | return new Promise((_, reject) => { 43 | setTimeout(() => reject(new Error('REMOTE_CALL_TIMEOUT')), time); 44 | }); 45 | } 46 | 47 | function enrichPayloadMaybe(payload) { 48 | switch (payload.eventId) { 49 | case 'createJobRequest': { 50 | return Object.assign({}, payload, { jobRequestId: shortid.generate() }); 51 | } 52 | default: { 53 | return payload; 54 | } 55 | } 56 | } 57 | 58 | function createRemoteCall(requestId) { 59 | const remoteCall = Bluebird.defer(); 60 | map[requestId] = remoteCall; 61 | return remoteCall.promise; 62 | } 63 | 64 | async function produceRouteHandler(req, res, next) { 65 | try { 66 | const payload = req.body; 67 | const enrichedPayload = enrichPayloadMaybe(payload); 68 | throwIf(!isValidEvent(enrichedPayload), new Error('EVENT_NOT_VALID')) 69 | console.log('request -> ', enrichedPayload); 70 | const remoteCall = createRemoteCall(payload.requestId); 71 | const [ 72 | kafkaCallResult, 73 | remoteCallResult, 74 | offsetResult 75 | ] = await Bluebird.all([ 76 | produceMsg([ 77 | { 78 | topic: TOPIC, 79 | messages: [ 80 | JSON.stringify({ 81 | ...enrichedPayload 82 | }) 83 | ], 84 | key: enrichedPayload.jobRequestId 85 | } 86 | ]), 87 | Bluebird.race([remoteCall, timeout(API_CON_TIMEOUT)]) 88 | ]); 89 | if (remoteCallResult.res === 'FAIL') { 90 | throw new Error(remoteCallResult.error); // blubble up 91 | } else { 92 | res.json({ ok: true, remoteCallResult }); 93 | } 94 | } catch (e) { 95 | res.json({ ok: false, error: e.message }); 96 | } 97 | } 98 | 99 | app.post('/produce', produceRouteHandler); 100 | 101 | app.listen(API_PORT, () => { 102 | console.log('API up'); 103 | startListener({ redis: redisClient, map }); 104 | }); 105 | -------------------------------------------------------------------------------- /businessrules.js: -------------------------------------------------------------------------------- 1 | function throwIf(val, error) { 2 | if (val) throw error; 3 | } 4 | 5 | function BusinessError(msg) { 6 | return new Error(msg); 7 | } 8 | 9 | const mustExists = (payload, agg) => throwIf(!agg, BusinessError('NOT_FOUND')); 10 | const mustBeCleanerOfJob = (payload, agg) => 11 | throwIf( 12 | agg.cleaners.indexOf(payload.cleanerId) === -1, 13 | BusinessError('MUST_BE_CLEANER_OF_JOB') 14 | ); 15 | const notYetAnswered = (payload, agg) => { 16 | throwIf( 17 | agg.answers[payload.cleanerId], 18 | BusinessError('YOU_ALREADY_ANSWERED') 19 | ); 20 | }; 21 | const jobNotYetAccepted = (payload, agg) => { 22 | throwIf(agg.acceptedCleaner, BusinessError('JOB_ALREADY_ACCEPTED')); 23 | }; 24 | 25 | module.exports = { 26 | mustExists, 27 | mustBeCleanerOfJob, 28 | notYetAnswered, 29 | jobNotYetAccepted 30 | }; 31 | -------------------------------------------------------------------------------- /cli.js: -------------------------------------------------------------------------------- 1 | const Rx = require('rxjs/Rx'); 2 | const inquirer = require('inquirer'); 3 | const Bluebird = require('bluebird'); 4 | const request = require('request'); 5 | var shortid = require('shortid'); 6 | 7 | const { ENDPOINT_URL } = require('./config'); 8 | const { 9 | isValidEvent, 10 | getEventIds, 11 | getEventMockFunc, 12 | getEventSchema 13 | } = require('./utils'); 14 | 15 | const askSendRequest = { 16 | name: 'request', 17 | type: 'expand', 18 | message: 'Send Request', 19 | choices: [ 20 | { key: 'y', name: 'Yes', value: 'yes' }, 21 | { key: 'n', name: 'No', value: 'no' } 22 | ] 23 | }; 24 | 25 | const askWhichEvent = { 26 | name: 'eventId', 27 | type: 'list', 28 | message: 'EventId', 29 | choices: getEventIds() 30 | }; 31 | 32 | var prompts = new Rx.Subject(); 33 | 34 | function reducer(state = {}) { 35 | return action => { 36 | state[action.name] = action.answer; 37 | }; 38 | } 39 | 40 | function mapEventIdToData(eventId) { 41 | const questions = []; 42 | const eventResolved = getEventSchema(eventId); 43 | Object.keys(eventResolved).forEach(key => { 44 | const val = eventResolved[key]; 45 | if (val.type === 'string') { 46 | questions.push({ 47 | name: key, 48 | type: 'input', 49 | message: 'Value for ' + key 50 | }); 51 | } 52 | }); 53 | return { questions }; 54 | } 55 | 56 | function mapEventIdToMockData(eventId, state) { 57 | const resolvedMockDataFunc = getEventMockFunc(eventId); 58 | return resolvedMockDataFunc(state); 59 | } 60 | 61 | function validate(state, cb, cbFail) { 62 | const payload = mapEventIdToMockData(state.eventId, state); 63 | if (isValidEvent(payload)) { 64 | cb(payload); 65 | } else { 66 | cbFail && cbFail(); 67 | } 68 | } 69 | 70 | function flushState(state) { 71 | Object.keys(state).forEach(key => { 72 | delete state[key]; 73 | }); 74 | } 75 | 76 | function sendRequest(payload, endpoint, ui, requestId, cb) { 77 | var options = { 78 | method: 'post', 79 | body: Object.assign({}, payload, { requestId }), 80 | json: true, 81 | url: endpoint 82 | }; 83 | let bar = '.'; 84 | const inter = setInterval(() => { 85 | bar += '.'; 86 | ui.updateBottomBar(bar); 87 | }, 100); 88 | request(options, function(err, res, body) { 89 | clearInterval(inter); 90 | if (err) { 91 | console.error('error posting json: ', err); 92 | cb(); 93 | } 94 | console.log(JSON.stringify(body, null, 2)); 95 | cb(); 96 | }); 97 | } 98 | 99 | function handleSendRequest(deps, ans) { 100 | if (ans.answer === askSendRequest.choices[0].value) { 101 | validate(deps.state, payload => { 102 | sendRequest(payload, ENDPOINT_URL, deps.ui, deps.requestId, () => { 103 | ui.updateBottomBar(''); 104 | deps.prompts.next(askSendRequest); 105 | }); 106 | }); 107 | } 108 | if (ans.answer === askSendRequest.choices[1].value) { 109 | flushState(deps.state); 110 | delete deps.requestId; 111 | deps.prompts.next(askWhichEvent); 112 | } 113 | } 114 | 115 | function filterQuestions(eventId) { 116 | return e => { 117 | if (eventId === 'createJobRequest') { 118 | return e.name !== 'eventId' && e.name !== 'jobRequestId'; // jobrequestid gets filled serverside 119 | } else { 120 | return e.name !== 'eventId'; 121 | } 122 | }; 123 | } 124 | 125 | function handleEventChoose(deps, ans) { 126 | deps.reduce(ans); 127 | deps.requestId = shortid.generate(); 128 | const { questions } = mapEventIdToData(deps.state.eventId); 129 | const filteredQuestions = questions.filter( 130 | filterQuestions(deps.state.eventId) 131 | ); // filter val which is set by first question 132 | filteredQuestions.forEach(e => deps.prompts.next(e)); 133 | if (filteredQuestions.length === 0) { 134 | validate(deps.state, () => deps.prompts.next(askSendRequest)); 135 | } 136 | } 137 | 138 | function handleDefault(deps, ans) { 139 | deps.reduce(ans); 140 | validate(deps.state, () => deps.prompts.next(askSendRequest)); 141 | } 142 | 143 | function handleAnswer(deps) { 144 | return ans => { 145 | switch (ans.name) { 146 | case askSendRequest.name: 147 | return handleSendRequest(deps, ans); 148 | case askWhichEvent.name: 149 | return handleEventChoose(deps, ans); 150 | default: 151 | return handleDefault(deps, ans); 152 | } 153 | }; 154 | } 155 | 156 | const state = {}; 157 | const reduce = reducer(state); 158 | const ui = new inquirer.ui.BottomBar(); 159 | ui.updateBottomBar(''); 160 | inquirer 161 | .prompt(prompts) 162 | .ui.process.subscribe( 163 | handleAnswer({ state, prompts, reduce, ui }), 164 | err => console.log('Error: ', err), 165 | () => console.log('Bye') 166 | ); 167 | 168 | prompts.next(askWhichEvent); // start action 169 | -------------------------------------------------------------------------------- /config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | TOPIC: 'requests', 3 | TOPIC_EVENTS: 'finalevents', 4 | KAFKA_HOST: '127.0.0.1:9092', 5 | PUBSUB_TOPIC: 'responses', 6 | MONGO_URL: 'mongodb://localhost:27017/db1', 7 | MONGO_COLLECTION: 'test', 8 | ENDPOINT_URL: 'http://127.0.0.1:3000/produce', 9 | API_PORT: 3000, 10 | API_CON_TIMEOUT: 5000, // ms 11 | PRODUCER_CONFIG: { 12 | requireAcks: 1, 13 | ackTimeoutMs: 100, 14 | partitionerType: 4 15 | } 16 | }; 17 | -------------------------------------------------------------------------------- /consumer.js: -------------------------------------------------------------------------------- 1 | var kafka = require('kafka-node'); 2 | const streamToObservable = require('stream-to-observable'); 3 | const Rx = require('rxjs/Rx'); 4 | const async = require('async'); 5 | const Bluebird = require('bluebird'); 6 | const { 7 | KAFKA_HOST, 8 | TOPIC, 9 | PRODUCER_CONFIG, 10 | TOPIC_EVENTS, 11 | PUBSUB_TOPIC, 12 | MONGO_URL, 13 | MONGO_COLLECTION 14 | } = require('./config'); 15 | const { getPartition, getBusinessRulesOfEvent } = require('./utils'); 16 | const client = new kafka.Client(); 17 | const consumerGroup = new kafka.ConsumerGroupStream( 18 | { 19 | kafkaHost: KAFKA_HOST, 20 | groupId: 'ExampleTestGroup', 21 | sessionTimeout: 15000, 22 | protocol: ['roundrobin'], 23 | fromOffset: 'latest', 24 | asyncPush: false, 25 | autoCommit: false 26 | }, 27 | TOPIC 28 | ); 29 | const producer = new kafka.Producer(client, PRODUCER_CONFIG, getPartition); 30 | var redisClient = require('redis').createClient(); 31 | const _ = require('lodash'); 32 | 33 | var MongoClient = require('mongodb').MongoClient; 34 | 35 | class Response { 36 | static Pass(doc) { 37 | return new Response({ res: 'PASS', doc }); 38 | } 39 | static Success(doc) { 40 | return new Response({ res: 'SUCCESS', doc }); 41 | } 42 | static Fail(doc, error) { 43 | return new Response({ res: 'FAIL', doc, error }); 44 | } 45 | constructor(obj) { 46 | this.res = obj.res; 47 | this.error = obj.error; 48 | this.doc = obj.doc; 49 | } 50 | } 51 | Response.errors = { 52 | PROCESSING_ERROR: 'PROCESSING_ERROR' 53 | }; 54 | 55 | const reducer = (state, key) => () => { 56 | state[key] = state[key] + 1; 57 | }; 58 | 59 | const process = deps => async message => { 60 | const json = JSON.parse(message.value); 61 | debug('process')(message); 62 | try { 63 | await Bluebird.promisify( 64 | async.retryable( 65 | { 66 | times: 3, 67 | interval: function(retryCount) { 68 | return 50 * Math.pow(2, retryCount); 69 | } 70 | }, 71 | processTask 72 | ) 73 | ).bind(async)(deps, message, json); 74 | } catch (e) { 75 | console.log(e); 76 | await deps.pubsub( 77 | PUBSUB_TOPIC + ':' + json.requestId, 78 | JSON.stringify(Response.Fail(message, Response.errors.PROCESSING_ERROR)) 79 | ); 80 | // maybe commit to fail topic 81 | await deps.commit(message, true); // commit offset 82 | } 83 | return message; 84 | }; 85 | 86 | function mustBeResponse(input) { 87 | if (!input instanceof Response) { 88 | throw new Error('runAction must return ResponseClass'); 89 | } 90 | } 91 | 92 | async function processTask(deps, message, payload) { 93 | debug('run')(message); 94 | const res = await runAction(deps, message, payload); 95 | mustBeResponse(res); 96 | await deps.producer([ 97 | { 98 | topic: TOPIC_EVENTS, 99 | messages: [message.value], 100 | key: message.key 101 | } 102 | ]); // forward message to final event store 103 | await deps.pubsub( 104 | PUBSUB_TOPIC + ':' + payload.requestId, 105 | JSON.stringify(res) 106 | ); 107 | await deps.commit(message, true); // commit offset 108 | return message; 109 | } 110 | 111 | const debug = part => msg => { 112 | console.log(part + ' -> ' + new Date(), JSON.parse(msg.value).requestId); 113 | }; 114 | 115 | const pauseOrResume = (state, stream) => () => { 116 | if (state.in - state.out > 20 && !stream.isPaused()) { 117 | console.log('pause'); 118 | stream.pause(); 119 | } 120 | if (state.in - state.out <= 20 && stream.isPaused()) { 121 | console.log('unpause'); 122 | stream.resume(); 123 | } 124 | }; 125 | 126 | const connectMongo = function(cb) { 127 | MongoClient.connect(MONGO_URL, (err, client) => { 128 | if (err) return console.log(err); 129 | cb(client.db().collection(MONGO_COLLECTION)); 130 | }); 131 | }; 132 | 133 | async function duplicationCheck(deps, payload) { 134 | return await deps.mongo.findOne({ 135 | requestsHandled: { $in: [payload.requestId] } 136 | }); 137 | } 138 | 139 | async function loadAggregate(deps, payload) { 140 | return await deps.mongo.findOne({ 141 | jobRequestId: payload.jobRequestId 142 | }); 143 | // could validate aggregate here 144 | } 145 | 146 | // TODO: add write concerns 147 | async function updateAggregate(deps, payload, agg) { 148 | // could validate aggregate here 149 | const res = await deps.mongo.findOneAndUpdate( 150 | { 151 | jobRequestId: payload.jobRequestId 152 | }, 153 | { $set: agg }, 154 | { new: true } 155 | ); 156 | if (res.ok !== 1) throw new Error('mongo error'); 157 | return res.value; 158 | } 159 | 160 | // TODO: add write concerns 161 | async function createAggregate(deps, payload, agg) { 162 | return await deps.mongo.insert(agg); 163 | } 164 | 165 | function reduceBr(array) { 166 | return (deps, payload, agg) => { 167 | _.each(array, f => f(payload, agg)); 168 | }; 169 | } 170 | 171 | async function createHandler(deps, payload, message) { 172 | const dup = await duplicationCheck(deps, payload); 173 | if (dup) return Response.Pass(dup); 174 | const [err] = runBusinessLogic(deps, payload, {}); 175 | if (err) return Response.Fail(message, err); 176 | const newAgg = aggregateReducer(payload, {}); 177 | await createAggregate(deps, payload, newAgg); 178 | return Response.Success(newAgg); 179 | } 180 | 181 | async function defaultHandler(deps, payload, message) { 182 | const dup = await duplicationCheck(deps, payload); 183 | if (dup) return Response.Pass(dup); 184 | const agg = await loadAggregate(deps, payload); 185 | const [err] = runBusinessLogic(deps, payload, agg); 186 | if (err) return Response.Fail(message, err); 187 | const newAgg = aggregateReducer(payload, agg); 188 | await updateAggregate(deps, payload, newAgg); 189 | return Response.Success(newAgg); 190 | } 191 | 192 | const eventActions = { 193 | createJobRequest: createHandler, 194 | accepteJobRequest: defaultHandler, 195 | declineJobRequest: defaultHandler 196 | }; 197 | 198 | function addRequestId(requestsHandled=[], requestId) { 199 | if (!requestId) return requestsHandled; // if not defined skip 200 | return _.uniq([...requestsHandled, requestId]); 201 | } 202 | 203 | function aggregateReducer(payload, agg) { 204 | switch (payload.eventId) { 205 | case 'accepteJobRequest': { 206 | return { 207 | ...agg, 208 | acceptedCleaner: payload.cleanerId, 209 | answers: { ...agg.answers, [payload.cleanerId]: 'accepted' }, 210 | requestsHandled: addRequestId(agg.requestsHandled, payload.requestId) 211 | }; 212 | } 213 | case 'declineJobRequest': { 214 | return { 215 | ...agg, 216 | acceptedCleaner: payload.cleanerId, 217 | answers: { ...agg.answers, [payload.cleanerId]: 'declined' }, 218 | requestsHandled: addRequestId(agg.requestsHandled, payload.requestId) 219 | }; 220 | } 221 | case 'createJobRequest': { 222 | return { 223 | cleaners: payload.cleaners, 224 | tasks: payload.tasks, 225 | jobRequestId: payload.jobRequestId, 226 | answers: {}, 227 | requestsHandled: addRequestId(agg.requestsHandled, payload.requestId) 228 | }; 229 | } 230 | default: { 231 | return agg; 232 | } 233 | } 234 | } 235 | 236 | function runBusinessLogic(deps, payload, agg) { 237 | const rules = deps.getBusinessRulesOfEvent(payload.eventId); 238 | try { 239 | reduceBr(rules)(deps, payload, agg); 240 | return []; 241 | } catch (e) { 242 | return [e.message]; 243 | } 244 | } 245 | 246 | function resolveHandler(sources = {}) { 247 | return (source, id) => { 248 | const resolvedAction = sources[source][id]; 249 | if (!resolvedAction) 250 | throw new Error( 251 | 'handler not found for id:' + id + ' in source:' + source 252 | ); 253 | return resolvedAction; 254 | }; 255 | } 256 | 257 | // execute command 258 | async function runAction(deps, message, payload) { 259 | const resolvedAction = deps.getHandler('eventActions', payload.eventId); 260 | return await resolvedAction(deps, payload, message); 261 | } 262 | 263 | const flow = deps => 264 | streamToObservable(deps.stream) 265 | .do(debug('in')) 266 | .do(reducer(state, 'in')) 267 | .do(pauseOrResume(state, consumerGroup)) 268 | .flatMap(process(deps), null, 1) // concurrency 1 269 | .do(reducer(state, 'out')) 270 | .do(pauseOrResume(state, consumerGroup)) 271 | .do(debug('out')); 272 | 273 | const state = { in: 0, out: 0 }; 274 | 275 | connectMongo(mongo => { 276 | console.log('mongo connected'); 277 | client.once('ready', () => { 278 | console.log('kafka ready'); 279 | flow({ 280 | pubsub: Bluebird.promisify(redisClient.publish).bind(redisClient), 281 | commit: Bluebird.promisify(consumerGroup.commit.bind(consumerGroup)), 282 | producer: Bluebird.promisify(producer.send.bind(producer)), 283 | mongo, 284 | stream: consumerGroup, 285 | getBusinessRulesOfEvent, 286 | getHandler: resolveHandler({ 287 | eventActions 288 | }) 289 | }).subscribe(_.noop); 290 | }); 291 | }); 292 | -------------------------------------------------------------------------------- /docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | mongo: 4 | image: "mongo" 5 | ports: 6 | - "27017:27017" 7 | redis: 8 | image: "redis" 9 | ports: 10 | - "6379:6379" 11 | kafka: 12 | image: "landoop/fast-data-dev" 13 | environment: 14 | - ADV_HOST=127.0.0.1 15 | ports: 16 | - "2181:2181" 17 | - "3030:3030" 18 | - "8081:8081" 19 | - "8082:8082" 20 | - "9092:9092" -------------------------------------------------------------------------------- /events.js: -------------------------------------------------------------------------------- 1 | const { 2 | mustExists, 3 | mustBeCleanerOfJob, 4 | notYetAnswered, 5 | jobNotYetAccepted 6 | } = require('./businessrules'); 7 | 8 | module.exports = { 9 | createJobRequest: { 10 | SCHEMA: { 11 | eventId: { type: 'string', equal: 'createJobRequest' }, 12 | cleaners: { type: 'array', items: { type: 'string' } }, 13 | jobRequestId: { type: 'string' }, 14 | tasks: { 15 | type: 'array', 16 | items: { 17 | type: 'object', 18 | props: { 19 | id: { type: 'string' }, 20 | name: { type: 'string' }, 21 | done: { type: 'boolean' } 22 | } 23 | } 24 | } 25 | }, 26 | MOCK: ({}) => ({ 27 | eventId: 'createJobRequest', 28 | cleaners: ['cleaner1', 'cleaner2'], 29 | jobRequestId: '_WILL_BE_REPLACED_BY_API_', 30 | tasks: [ 31 | { 32 | id: 'task1', 33 | name: 'task1name', 34 | done: false 35 | } 36 | ] 37 | }), 38 | RULES: [] 39 | }, 40 | accepteJobRequest: { 41 | SCHEMA: { 42 | eventId: { type: 'string', equal: 'accepteJobRequest' }, 43 | jobRequestId: { type: 'string' }, 44 | cleanerId: { type: 'string' } 45 | }, 46 | MOCK: ({ jobRequestId, cleanerId }) => ({ 47 | eventId: 'accepteJobRequest', 48 | jobRequestId, 49 | cleanerId 50 | }), 51 | RULES: [mustExists, mustBeCleanerOfJob, notYetAnswered, jobNotYetAccepted] 52 | }, 53 | declineJobRequest: { 54 | SCHEMA: { 55 | eventId: { type: 'string', equal: 'declineJobRequest' }, 56 | jobRequestId: { type: 'string' }, 57 | cleanerId: { type: 'string' } 58 | }, 59 | MOCK: ({ jobRequestId, cleanerId }) => ({ 60 | eventId: 'declineJobRequest', 61 | jobRequestId, 62 | cleanerId 63 | }), 64 | RULES: [mustExists, mustBeCleanerOfJob, notYetAnswered] 65 | } 66 | // startJobRequest: { 67 | // eventId: { type: 'string', equal: 'startJobRequest' }, 68 | // jobRequestId: { type: 'string' } 69 | // }, 70 | // finishJobRequestTask: { 71 | // eventId: { type: 'string', equal: 'finishJobRequestTask' }, 72 | // jobRequestId: { type: 'string' }, 73 | // taskId: { type: 'string' } 74 | // }, 75 | // finishJobRequest: { 76 | // eventId: { type: 'string', equal: 'finishJobRequest' }, 77 | // jobRequestId: { type: 'string' } 78 | // } 79 | }; 80 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kafka", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.1.1", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 11 | "optional": true 12 | }, 13 | "accepts": { 14 | "version": "1.3.5", 15 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz", 16 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=", 17 | "requires": { 18 | "mime-types": "2.1.18", 19 | "negotiator": "0.6.1" 20 | } 21 | }, 22 | "acorn": { 23 | "version": "5.5.3", 24 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.5.3.tgz", 25 | "integrity": "sha512-jd5MkIUlbbmb07nXH0DT3y7rDVtkzDi4XZOUVWAer8ajmF/DTSSbl5oNFyDOl/OXA33Bl79+ypHhl2pN20VeOQ==" 26 | }, 27 | "acorn-jsx": { 28 | "version": "3.0.1", 29 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", 30 | "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", 31 | "requires": { 32 | "acorn": "3.3.0" 33 | }, 34 | "dependencies": { 35 | "acorn": { 36 | "version": "3.3.0", 37 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", 38 | "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=" 39 | } 40 | } 41 | }, 42 | "ajv": { 43 | "version": "5.5.2", 44 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 45 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 46 | "requires": { 47 | "co": "4.6.0", 48 | "fast-deep-equal": "1.1.0", 49 | "fast-json-stable-stringify": "2.0.0", 50 | "json-schema-traverse": "0.3.1" 51 | } 52 | }, 53 | "ajv-keywords": { 54 | "version": "2.1.1", 55 | "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", 56 | "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=" 57 | }, 58 | "ansi-escapes": { 59 | "version": "3.1.0", 60 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", 61 | "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==" 62 | }, 63 | "ansi-regex": { 64 | "version": "2.1.1", 65 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 66 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 67 | }, 68 | "ansi-styles": { 69 | "version": "3.2.1", 70 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 71 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 72 | "requires": { 73 | "color-convert": "1.9.1" 74 | } 75 | }, 76 | "any-observable": { 77 | "version": "0.2.0", 78 | "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.2.0.tgz", 79 | "integrity": "sha1-xnhwBYADV5AJCD9UrAq6+1wz0kI=" 80 | }, 81 | "aproba": { 82 | "version": "1.2.0", 83 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 84 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", 85 | "optional": true 86 | }, 87 | "are-we-there-yet": { 88 | "version": "1.1.4", 89 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", 90 | "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", 91 | "optional": true, 92 | "requires": { 93 | "delegates": "1.0.0", 94 | "readable-stream": "2.3.6" 95 | } 96 | }, 97 | "argparse": { 98 | "version": "1.0.10", 99 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 100 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 101 | "requires": { 102 | "sprintf-js": "1.0.3" 103 | } 104 | }, 105 | "array-flatten": { 106 | "version": "1.1.1", 107 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 108 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 109 | }, 110 | "array-union": { 111 | "version": "1.0.2", 112 | "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", 113 | "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", 114 | "requires": { 115 | "array-uniq": "1.0.3" 116 | } 117 | }, 118 | "array-uniq": { 119 | "version": "1.0.3", 120 | "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", 121 | "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" 122 | }, 123 | "arrify": { 124 | "version": "1.0.1", 125 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 126 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" 127 | }, 128 | "asn1": { 129 | "version": "0.2.3", 130 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 131 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 132 | }, 133 | "assert-plus": { 134 | "version": "1.0.0", 135 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 136 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 137 | }, 138 | "async": { 139 | "version": "2.6.0", 140 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", 141 | "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", 142 | "requires": { 143 | "lodash": "4.17.10" 144 | } 145 | }, 146 | "asynckit": { 147 | "version": "0.4.0", 148 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 149 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 150 | }, 151 | "aws-sign2": { 152 | "version": "0.7.0", 153 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 154 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 155 | }, 156 | "aws4": { 157 | "version": "1.7.0", 158 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", 159 | "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" 160 | }, 161 | "babel-code-frame": { 162 | "version": "6.26.0", 163 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 164 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 165 | "requires": { 166 | "chalk": "1.1.3", 167 | "esutils": "2.0.2", 168 | "js-tokens": "3.0.2" 169 | }, 170 | "dependencies": { 171 | "ansi-styles": { 172 | "version": "2.2.1", 173 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 174 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" 175 | }, 176 | "chalk": { 177 | "version": "1.1.3", 178 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 179 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 180 | "requires": { 181 | "ansi-styles": "2.2.1", 182 | "escape-string-regexp": "1.0.5", 183 | "has-ansi": "2.0.0", 184 | "strip-ansi": "3.0.1", 185 | "supports-color": "2.0.0" 186 | } 187 | }, 188 | "supports-color": { 189 | "version": "2.0.0", 190 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 191 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" 192 | } 193 | } 194 | }, 195 | "balanced-match": { 196 | "version": "1.0.0", 197 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 198 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 199 | }, 200 | "bcrypt-pbkdf": { 201 | "version": "1.0.1", 202 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 203 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 204 | "optional": true, 205 | "requires": { 206 | "tweetnacl": "0.14.5" 207 | } 208 | }, 209 | "binary": { 210 | "version": "0.3.0", 211 | "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", 212 | "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", 213 | "requires": { 214 | "buffers": "0.1.1", 215 | "chainsaw": "0.1.0" 216 | } 217 | }, 218 | "bindings": { 219 | "version": "1.3.0", 220 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.3.0.tgz", 221 | "integrity": "sha512-DpLh5EzMR2kzvX1KIlVC0VkC3iZtHKTgdtZ0a3pglBZdaQFjt5S9g9xd1lE+YvXyfd6mtCeRnrUfOLYiTMlNSw==", 222 | "optional": true 223 | }, 224 | "bl": { 225 | "version": "1.2.2", 226 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", 227 | "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", 228 | "requires": { 229 | "readable-stream": "2.3.6", 230 | "safe-buffer": "5.1.2" 231 | } 232 | }, 233 | "block-stream": { 234 | "version": "0.0.9", 235 | "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", 236 | "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", 237 | "optional": true, 238 | "requires": { 239 | "inherits": "2.0.3" 240 | } 241 | }, 242 | "bluebird": { 243 | "version": "3.5.1", 244 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 245 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 246 | }, 247 | "body-parser": { 248 | "version": "1.18.2", 249 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", 250 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", 251 | "requires": { 252 | "bytes": "3.0.0", 253 | "content-type": "1.0.4", 254 | "debug": "2.6.9", 255 | "depd": "1.1.2", 256 | "http-errors": "1.6.3", 257 | "iconv-lite": "0.4.19", 258 | "on-finished": "2.3.0", 259 | "qs": "6.5.1", 260 | "raw-body": "2.3.2", 261 | "type-is": "1.6.16" 262 | }, 263 | "dependencies": { 264 | "iconv-lite": { 265 | "version": "0.4.19", 266 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 267 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 268 | } 269 | } 270 | }, 271 | "boom": { 272 | "version": "4.3.1", 273 | "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", 274 | "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", 275 | "requires": { 276 | "hoek": "4.2.1" 277 | } 278 | }, 279 | "brace-expansion": { 280 | "version": "1.1.11", 281 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 282 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 283 | "requires": { 284 | "balanced-match": "1.0.0", 285 | "concat-map": "0.0.1" 286 | } 287 | }, 288 | "bson": { 289 | "version": "1.0.6", 290 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.0.6.tgz", 291 | "integrity": "sha512-D8zmlb46xfuK2gGvKmUjIklQEouN2nQ0LEHHeZ/NoHM2LDiMk2EYzZ5Ntw/Urk+bgMDosOZxaRzXxvhI5TcAVQ==" 292 | }, 293 | "buffer-crc32": { 294 | "version": "0.2.13", 295 | "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", 296 | "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" 297 | }, 298 | "buffer-from": { 299 | "version": "1.0.0", 300 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", 301 | "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==" 302 | }, 303 | "buffermaker": { 304 | "version": "1.2.0", 305 | "resolved": "https://registry.npmjs.org/buffermaker/-/buffermaker-1.2.0.tgz", 306 | "integrity": "sha1-u3MlLsCIK3Y56bVWuCnav8LK4bo=", 307 | "requires": { 308 | "long": "1.1.2" 309 | } 310 | }, 311 | "buffers": { 312 | "version": "0.1.1", 313 | "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", 314 | "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" 315 | }, 316 | "bytes": { 317 | "version": "3.0.0", 318 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 319 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 320 | }, 321 | "caller-path": { 322 | "version": "0.1.0", 323 | "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", 324 | "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", 325 | "requires": { 326 | "callsites": "0.2.0" 327 | } 328 | }, 329 | "callsites": { 330 | "version": "0.2.0", 331 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", 332 | "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=" 333 | }, 334 | "caseless": { 335 | "version": "0.12.0", 336 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 337 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 338 | }, 339 | "chainsaw": { 340 | "version": "0.1.0", 341 | "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", 342 | "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", 343 | "requires": { 344 | "traverse": "0.3.9" 345 | } 346 | }, 347 | "chalk": { 348 | "version": "2.4.1", 349 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", 350 | "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", 351 | "requires": { 352 | "ansi-styles": "3.2.1", 353 | "escape-string-regexp": "1.0.5", 354 | "supports-color": "5.4.0" 355 | } 356 | }, 357 | "chardet": { 358 | "version": "0.4.2", 359 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", 360 | "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" 361 | }, 362 | "circular-json": { 363 | "version": "0.3.3", 364 | "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", 365 | "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==" 366 | }, 367 | "cli-cursor": { 368 | "version": "2.1.0", 369 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 370 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 371 | "requires": { 372 | "restore-cursor": "2.0.0" 373 | } 374 | }, 375 | "cli-width": { 376 | "version": "2.2.0", 377 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 378 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" 379 | }, 380 | "co": { 381 | "version": "4.6.0", 382 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 383 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 384 | }, 385 | "code-point-at": { 386 | "version": "1.1.0", 387 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 388 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 389 | }, 390 | "color-convert": { 391 | "version": "1.9.1", 392 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", 393 | "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", 394 | "requires": { 395 | "color-name": "1.1.3" 396 | } 397 | }, 398 | "color-name": { 399 | "version": "1.1.3", 400 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 401 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 402 | }, 403 | "colors": { 404 | "version": "1.2.1", 405 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.2.1.tgz", 406 | "integrity": "sha512-s8+wktIuDSLffCywiwSxQOMqtPxML11a/dtHE17tMn4B1MSWw/C22EKf7M2KGUBcDaVFEGT+S8N02geDXeuNKg==" 407 | }, 408 | "combined-stream": { 409 | "version": "1.0.6", 410 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", 411 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", 412 | "requires": { 413 | "delayed-stream": "1.0.0" 414 | } 415 | }, 416 | "concat-map": { 417 | "version": "0.0.1", 418 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 419 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 420 | }, 421 | "concat-stream": { 422 | "version": "1.6.2", 423 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 424 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 425 | "requires": { 426 | "buffer-from": "1.0.0", 427 | "inherits": "2.0.3", 428 | "readable-stream": "2.3.6", 429 | "typedarray": "0.0.6" 430 | } 431 | }, 432 | "console-control-strings": { 433 | "version": "1.1.0", 434 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 435 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 436 | }, 437 | "content-disposition": { 438 | "version": "0.5.2", 439 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 440 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 441 | }, 442 | "content-type": { 443 | "version": "1.0.4", 444 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 445 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 446 | }, 447 | "cookie": { 448 | "version": "0.3.1", 449 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 450 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 451 | }, 452 | "cookie-signature": { 453 | "version": "1.0.6", 454 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 455 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 456 | }, 457 | "core-util-is": { 458 | "version": "1.0.2", 459 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 460 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 461 | }, 462 | "cross-spawn": { 463 | "version": "5.1.0", 464 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 465 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 466 | "requires": { 467 | "lru-cache": "4.1.2", 468 | "shebang-command": "1.2.0", 469 | "which": "1.3.0" 470 | } 471 | }, 472 | "cryptiles": { 473 | "version": "3.1.2", 474 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", 475 | "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", 476 | "requires": { 477 | "boom": "5.2.0" 478 | }, 479 | "dependencies": { 480 | "boom": { 481 | "version": "5.2.0", 482 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 483 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 484 | "requires": { 485 | "hoek": "4.2.1" 486 | } 487 | } 488 | } 489 | }, 490 | "cycle": { 491 | "version": "1.0.3", 492 | "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz", 493 | "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=" 494 | }, 495 | "dashdash": { 496 | "version": "1.14.1", 497 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 498 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 499 | "requires": { 500 | "assert-plus": "1.0.0" 501 | } 502 | }, 503 | "debug": { 504 | "version": "2.6.9", 505 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 506 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 507 | "requires": { 508 | "ms": "2.0.0" 509 | } 510 | }, 511 | "deep-equal": { 512 | "version": "0.2.2", 513 | "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-0.2.2.tgz", 514 | "integrity": "sha1-hLdFiW80xoTpjyzg5Cq69Du6AX0=" 515 | }, 516 | "deep-is": { 517 | "version": "0.1.3", 518 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 519 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=" 520 | }, 521 | "del": { 522 | "version": "2.2.2", 523 | "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", 524 | "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", 525 | "requires": { 526 | "globby": "5.0.0", 527 | "is-path-cwd": "1.0.0", 528 | "is-path-in-cwd": "1.0.1", 529 | "object-assign": "4.1.1", 530 | "pify": "2.3.0", 531 | "pinkie-promise": "2.0.1", 532 | "rimraf": "2.6.2" 533 | } 534 | }, 535 | "delayed-stream": { 536 | "version": "1.0.0", 537 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 538 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 539 | }, 540 | "delegates": { 541 | "version": "1.0.0", 542 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 543 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", 544 | "optional": true 545 | }, 546 | "depd": { 547 | "version": "1.1.2", 548 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 549 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 550 | }, 551 | "destroy": { 552 | "version": "1.0.4", 553 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 554 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 555 | }, 556 | "doctrine": { 557 | "version": "2.1.0", 558 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", 559 | "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", 560 | "requires": { 561 | "esutils": "2.0.2" 562 | } 563 | }, 564 | "double-ended-queue": { 565 | "version": "2.1.0-0", 566 | "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", 567 | "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=" 568 | }, 569 | "ecc-jsbn": { 570 | "version": "0.1.1", 571 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 572 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 573 | "optional": true, 574 | "requires": { 575 | "jsbn": "0.1.1" 576 | } 577 | }, 578 | "ee-first": { 579 | "version": "1.1.1", 580 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 581 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 582 | }, 583 | "encodeurl": { 584 | "version": "1.0.2", 585 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 586 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 587 | }, 588 | "escape-html": { 589 | "version": "1.0.3", 590 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 591 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 592 | }, 593 | "escape-string-regexp": { 594 | "version": "1.0.5", 595 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 596 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 597 | }, 598 | "eslint": { 599 | "version": "4.19.1", 600 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", 601 | "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", 602 | "requires": { 603 | "ajv": "5.5.2", 604 | "babel-code-frame": "6.26.0", 605 | "chalk": "2.4.1", 606 | "concat-stream": "1.6.2", 607 | "cross-spawn": "5.1.0", 608 | "debug": "3.1.0", 609 | "doctrine": "2.1.0", 610 | "eslint-scope": "3.7.1", 611 | "eslint-visitor-keys": "1.0.0", 612 | "espree": "3.5.4", 613 | "esquery": "1.0.1", 614 | "esutils": "2.0.2", 615 | "file-entry-cache": "2.0.0", 616 | "functional-red-black-tree": "1.0.1", 617 | "glob": "7.1.2", 618 | "globals": "11.5.0", 619 | "ignore": "3.3.8", 620 | "imurmurhash": "0.1.4", 621 | "inquirer": "3.3.0", 622 | "is-resolvable": "1.1.0", 623 | "js-yaml": "3.11.0", 624 | "json-stable-stringify-without-jsonify": "1.0.1", 625 | "levn": "0.3.0", 626 | "lodash": "4.17.10", 627 | "minimatch": "3.0.4", 628 | "mkdirp": "0.5.1", 629 | "natural-compare": "1.4.0", 630 | "optionator": "0.8.2", 631 | "path-is-inside": "1.0.2", 632 | "pluralize": "7.0.0", 633 | "progress": "2.0.0", 634 | "regexpp": "1.1.0", 635 | "require-uncached": "1.0.3", 636 | "semver": "5.3.0", 637 | "strip-ansi": "4.0.0", 638 | "strip-json-comments": "2.0.1", 639 | "table": "4.0.2", 640 | "text-table": "0.2.0" 641 | }, 642 | "dependencies": { 643 | "ansi-regex": { 644 | "version": "3.0.0", 645 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 646 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 647 | }, 648 | "debug": { 649 | "version": "3.1.0", 650 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 651 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 652 | "requires": { 653 | "ms": "2.0.0" 654 | } 655 | }, 656 | "inquirer": { 657 | "version": "3.3.0", 658 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", 659 | "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", 660 | "requires": { 661 | "ansi-escapes": "3.1.0", 662 | "chalk": "2.4.1", 663 | "cli-cursor": "2.1.0", 664 | "cli-width": "2.2.0", 665 | "external-editor": "2.2.0", 666 | "figures": "2.0.0", 667 | "lodash": "4.17.10", 668 | "mute-stream": "0.0.7", 669 | "run-async": "2.3.0", 670 | "rx-lite": "4.0.8", 671 | "rx-lite-aggregates": "4.0.8", 672 | "string-width": "2.1.1", 673 | "strip-ansi": "4.0.0", 674 | "through": "2.3.8" 675 | } 676 | }, 677 | "is-fullwidth-code-point": { 678 | "version": "2.0.0", 679 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 680 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 681 | }, 682 | "string-width": { 683 | "version": "2.1.1", 684 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 685 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 686 | "requires": { 687 | "is-fullwidth-code-point": "2.0.0", 688 | "strip-ansi": "4.0.0" 689 | } 690 | }, 691 | "strip-ansi": { 692 | "version": "4.0.0", 693 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 694 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 695 | "requires": { 696 | "ansi-regex": "3.0.0" 697 | } 698 | } 699 | } 700 | }, 701 | "eslint-scope": { 702 | "version": "3.7.1", 703 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", 704 | "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", 705 | "requires": { 706 | "esrecurse": "4.2.1", 707 | "estraverse": "4.2.0" 708 | } 709 | }, 710 | "eslint-visitor-keys": { 711 | "version": "1.0.0", 712 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", 713 | "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==" 714 | }, 715 | "espree": { 716 | "version": "3.5.4", 717 | "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", 718 | "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", 719 | "requires": { 720 | "acorn": "5.5.3", 721 | "acorn-jsx": "3.0.1" 722 | } 723 | }, 724 | "esprima": { 725 | "version": "4.0.0", 726 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", 727 | "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==" 728 | }, 729 | "esquery": { 730 | "version": "1.0.1", 731 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 732 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 733 | "requires": { 734 | "estraverse": "4.2.0" 735 | } 736 | }, 737 | "esrecurse": { 738 | "version": "4.2.1", 739 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 740 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 741 | "requires": { 742 | "estraverse": "4.2.0" 743 | } 744 | }, 745 | "estraverse": { 746 | "version": "4.2.0", 747 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", 748 | "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=" 749 | }, 750 | "esutils": { 751 | "version": "2.0.2", 752 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 753 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" 754 | }, 755 | "etag": { 756 | "version": "1.8.1", 757 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 758 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 759 | }, 760 | "express": { 761 | "version": "4.16.3", 762 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz", 763 | "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=", 764 | "requires": { 765 | "accepts": "1.3.5", 766 | "array-flatten": "1.1.1", 767 | "body-parser": "1.18.2", 768 | "content-disposition": "0.5.2", 769 | "content-type": "1.0.4", 770 | "cookie": "0.3.1", 771 | "cookie-signature": "1.0.6", 772 | "debug": "2.6.9", 773 | "depd": "1.1.2", 774 | "encodeurl": "1.0.2", 775 | "escape-html": "1.0.3", 776 | "etag": "1.8.1", 777 | "finalhandler": "1.1.1", 778 | "fresh": "0.5.2", 779 | "merge-descriptors": "1.0.1", 780 | "methods": "1.1.2", 781 | "on-finished": "2.3.0", 782 | "parseurl": "1.3.2", 783 | "path-to-regexp": "0.1.7", 784 | "proxy-addr": "2.0.3", 785 | "qs": "6.5.1", 786 | "range-parser": "1.2.0", 787 | "safe-buffer": "5.1.1", 788 | "send": "0.16.2", 789 | "serve-static": "1.13.2", 790 | "setprototypeof": "1.1.0", 791 | "statuses": "1.4.0", 792 | "type-is": "1.6.16", 793 | "utils-merge": "1.0.1", 794 | "vary": "1.1.2" 795 | }, 796 | "dependencies": { 797 | "safe-buffer": { 798 | "version": "5.1.1", 799 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 800 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 801 | } 802 | } 803 | }, 804 | "extend": { 805 | "version": "3.0.1", 806 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 807 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 808 | }, 809 | "external-editor": { 810 | "version": "2.2.0", 811 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", 812 | "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", 813 | "requires": { 814 | "chardet": "0.4.2", 815 | "iconv-lite": "0.4.21", 816 | "tmp": "0.0.33" 817 | } 818 | }, 819 | "extsprintf": { 820 | "version": "1.3.0", 821 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 822 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 823 | }, 824 | "eyes": { 825 | "version": "0.1.8", 826 | "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", 827 | "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=" 828 | }, 829 | "fast-deep-equal": { 830 | "version": "1.1.0", 831 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 832 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" 833 | }, 834 | "fast-json-stable-stringify": { 835 | "version": "2.0.0", 836 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 837 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 838 | }, 839 | "fast-levenshtein": { 840 | "version": "2.0.6", 841 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 842 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" 843 | }, 844 | "fastest-validator": { 845 | "version": "0.6.6", 846 | "resolved": "https://registry.npmjs.org/fastest-validator/-/fastest-validator-0.6.6.tgz", 847 | "integrity": "sha512-cVifwIpI9mGnxKxugOgp78PVuwVkDmES6GwaL14Ejeayk2vwzq7oODJwXkC6OlaKERZMuyNGkbEyde2bfG9yMg==" 848 | }, 849 | "figures": { 850 | "version": "2.0.0", 851 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 852 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 853 | "requires": { 854 | "escape-string-regexp": "1.0.5" 855 | } 856 | }, 857 | "file-entry-cache": { 858 | "version": "2.0.0", 859 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", 860 | "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", 861 | "requires": { 862 | "flat-cache": "1.3.0", 863 | "object-assign": "4.1.1" 864 | } 865 | }, 866 | "finalhandler": { 867 | "version": "1.1.1", 868 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz", 869 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==", 870 | "requires": { 871 | "debug": "2.6.9", 872 | "encodeurl": "1.0.2", 873 | "escape-html": "1.0.3", 874 | "on-finished": "2.3.0", 875 | "parseurl": "1.3.2", 876 | "statuses": "1.4.0", 877 | "unpipe": "1.0.0" 878 | } 879 | }, 880 | "flat-cache": { 881 | "version": "1.3.0", 882 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", 883 | "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", 884 | "requires": { 885 | "circular-json": "0.3.3", 886 | "del": "2.2.2", 887 | "graceful-fs": "4.1.11", 888 | "write": "0.2.1" 889 | } 890 | }, 891 | "forever-agent": { 892 | "version": "0.6.1", 893 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 894 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 895 | }, 896 | "form-data": { 897 | "version": "2.3.2", 898 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", 899 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", 900 | "requires": { 901 | "asynckit": "0.4.0", 902 | "combined-stream": "1.0.6", 903 | "mime-types": "2.1.18" 904 | } 905 | }, 906 | "forwarded": { 907 | "version": "0.1.2", 908 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 909 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 910 | }, 911 | "fresh": { 912 | "version": "0.5.2", 913 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 914 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 915 | }, 916 | "fs.realpath": { 917 | "version": "1.0.0", 918 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 919 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 920 | }, 921 | "fstream": { 922 | "version": "1.0.11", 923 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", 924 | "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", 925 | "requires": { 926 | "graceful-fs": "4.1.11", 927 | "inherits": "2.0.3", 928 | "mkdirp": "0.5.1", 929 | "rimraf": "2.6.2" 930 | } 931 | }, 932 | "functional-red-black-tree": { 933 | "version": "1.0.1", 934 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 935 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=" 936 | }, 937 | "gauge": { 938 | "version": "2.7.4", 939 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 940 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 941 | "optional": true, 942 | "requires": { 943 | "aproba": "1.2.0", 944 | "console-control-strings": "1.1.0", 945 | "has-unicode": "2.0.1", 946 | "object-assign": "4.1.1", 947 | "signal-exit": "3.0.2", 948 | "string-width": "1.0.2", 949 | "strip-ansi": "3.0.1", 950 | "wide-align": "1.1.2" 951 | } 952 | }, 953 | "getpass": { 954 | "version": "0.1.7", 955 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 956 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 957 | "requires": { 958 | "assert-plus": "1.0.0" 959 | } 960 | }, 961 | "glob": { 962 | "version": "7.1.2", 963 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 964 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 965 | "requires": { 966 | "fs.realpath": "1.0.0", 967 | "inflight": "1.0.6", 968 | "inherits": "2.0.3", 969 | "minimatch": "3.0.4", 970 | "once": "1.4.0", 971 | "path-is-absolute": "1.0.1" 972 | } 973 | }, 974 | "globals": { 975 | "version": "11.5.0", 976 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.5.0.tgz", 977 | "integrity": "sha512-hYyf+kI8dm3nORsiiXUQigOU62hDLfJ9G01uyGMxhc6BKsircrUhC4uJPQPUSuq2GrTmiiEt7ewxlMdBewfmKQ==" 978 | }, 979 | "globby": { 980 | "version": "5.0.0", 981 | "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", 982 | "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", 983 | "requires": { 984 | "array-union": "1.0.2", 985 | "arrify": "1.0.1", 986 | "glob": "7.1.2", 987 | "object-assign": "4.1.1", 988 | "pify": "2.3.0", 989 | "pinkie-promise": "2.0.1" 990 | } 991 | }, 992 | "graceful-fs": { 993 | "version": "4.1.11", 994 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 995 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" 996 | }, 997 | "har-schema": { 998 | "version": "2.0.0", 999 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 1000 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 1001 | }, 1002 | "har-validator": { 1003 | "version": "5.0.3", 1004 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", 1005 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", 1006 | "requires": { 1007 | "ajv": "5.5.2", 1008 | "har-schema": "2.0.0" 1009 | } 1010 | }, 1011 | "has-ansi": { 1012 | "version": "2.0.0", 1013 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 1014 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 1015 | "requires": { 1016 | "ansi-regex": "2.1.1" 1017 | } 1018 | }, 1019 | "has-flag": { 1020 | "version": "3.0.0", 1021 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 1022 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 1023 | }, 1024 | "has-unicode": { 1025 | "version": "2.0.1", 1026 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 1027 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", 1028 | "optional": true 1029 | }, 1030 | "hawk": { 1031 | "version": "6.0.2", 1032 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", 1033 | "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", 1034 | "requires": { 1035 | "boom": "4.3.1", 1036 | "cryptiles": "3.1.2", 1037 | "hoek": "4.2.1", 1038 | "sntp": "2.1.0" 1039 | } 1040 | }, 1041 | "hoek": { 1042 | "version": "4.2.1", 1043 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", 1044 | "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==" 1045 | }, 1046 | "http-errors": { 1047 | "version": "1.6.3", 1048 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", 1049 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", 1050 | "requires": { 1051 | "depd": "1.1.2", 1052 | "inherits": "2.0.3", 1053 | "setprototypeof": "1.1.0", 1054 | "statuses": "1.4.0" 1055 | } 1056 | }, 1057 | "http-signature": { 1058 | "version": "1.2.0", 1059 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 1060 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 1061 | "requires": { 1062 | "assert-plus": "1.0.0", 1063 | "jsprim": "1.4.1", 1064 | "sshpk": "1.14.1" 1065 | } 1066 | }, 1067 | "i": { 1068 | "version": "0.3.6", 1069 | "resolved": "https://registry.npmjs.org/i/-/i-0.3.6.tgz", 1070 | "integrity": "sha1-2WyScyB28HJxG2sQ/X1PZa2O4j0=" 1071 | }, 1072 | "iconv-lite": { 1073 | "version": "0.4.21", 1074 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.21.tgz", 1075 | "integrity": "sha512-En5V9za5mBt2oUA03WGD3TwDv0MKAruqsuxstbMUZaj9W9k/m1CV/9py3l0L5kw9Bln8fdHQmzHSYtvpvTLpKw==", 1076 | "requires": { 1077 | "safer-buffer": "2.1.2" 1078 | } 1079 | }, 1080 | "ignore": { 1081 | "version": "3.3.8", 1082 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.8.tgz", 1083 | "integrity": "sha512-pUh+xUQQhQzevjRHHFqqcTy0/dP/kS9I8HSrUydhihjuD09W6ldVWFtIrwhXdUJHis3i2rZNqEHpZH/cbinFbg==" 1084 | }, 1085 | "imurmurhash": { 1086 | "version": "0.1.4", 1087 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 1088 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 1089 | }, 1090 | "inflight": { 1091 | "version": "1.0.6", 1092 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1093 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1094 | "requires": { 1095 | "once": "1.4.0", 1096 | "wrappy": "1.0.2" 1097 | } 1098 | }, 1099 | "inherits": { 1100 | "version": "2.0.3", 1101 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 1102 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 1103 | }, 1104 | "inquirer": { 1105 | "version": "5.2.0", 1106 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-5.2.0.tgz", 1107 | "integrity": "sha512-E9BmnJbAKLPGonz0HeWHtbKf+EeSP93paWO3ZYoUpq/aowXvYGjjCSuashhXPpzbArIjBbji39THkxTz9ZeEUQ==", 1108 | "requires": { 1109 | "ansi-escapes": "3.1.0", 1110 | "chalk": "2.4.1", 1111 | "cli-cursor": "2.1.0", 1112 | "cli-width": "2.2.0", 1113 | "external-editor": "2.2.0", 1114 | "figures": "2.0.0", 1115 | "lodash": "4.17.10", 1116 | "mute-stream": "0.0.7", 1117 | "run-async": "2.3.0", 1118 | "rxjs": "5.5.10", 1119 | "string-width": "2.1.1", 1120 | "strip-ansi": "4.0.0", 1121 | "through": "2.3.8" 1122 | }, 1123 | "dependencies": { 1124 | "ansi-regex": { 1125 | "version": "3.0.0", 1126 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1127 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 1128 | }, 1129 | "is-fullwidth-code-point": { 1130 | "version": "2.0.0", 1131 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1132 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 1133 | }, 1134 | "rxjs": { 1135 | "version": "5.5.10", 1136 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.10.tgz", 1137 | "integrity": "sha512-SRjimIDUHJkon+2hFo7xnvNC4ZEHGzCRwh9P7nzX3zPkCGFEg/tuElrNR7L/rZMagnK2JeH2jQwPRpmyXyLB6A==", 1138 | "requires": { 1139 | "symbol-observable": "1.0.1" 1140 | } 1141 | }, 1142 | "string-width": { 1143 | "version": "2.1.1", 1144 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1145 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1146 | "requires": { 1147 | "is-fullwidth-code-point": "2.0.0", 1148 | "strip-ansi": "4.0.0" 1149 | } 1150 | }, 1151 | "strip-ansi": { 1152 | "version": "4.0.0", 1153 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1154 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1155 | "requires": { 1156 | "ansi-regex": "3.0.0" 1157 | } 1158 | } 1159 | } 1160 | }, 1161 | "ipaddr.js": { 1162 | "version": "1.6.0", 1163 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", 1164 | "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=" 1165 | }, 1166 | "is-fullwidth-code-point": { 1167 | "version": "1.0.0", 1168 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 1169 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 1170 | "requires": { 1171 | "number-is-nan": "1.0.1" 1172 | } 1173 | }, 1174 | "is-path-cwd": { 1175 | "version": "1.0.0", 1176 | "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", 1177 | "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=" 1178 | }, 1179 | "is-path-in-cwd": { 1180 | "version": "1.0.1", 1181 | "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", 1182 | "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", 1183 | "requires": { 1184 | "is-path-inside": "1.0.1" 1185 | } 1186 | }, 1187 | "is-path-inside": { 1188 | "version": "1.0.1", 1189 | "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", 1190 | "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", 1191 | "requires": { 1192 | "path-is-inside": "1.0.2" 1193 | } 1194 | }, 1195 | "is-promise": { 1196 | "version": "2.1.0", 1197 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 1198 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" 1199 | }, 1200 | "is-resolvable": { 1201 | "version": "1.1.0", 1202 | "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", 1203 | "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==" 1204 | }, 1205 | "is-typedarray": { 1206 | "version": "1.0.0", 1207 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 1208 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 1209 | }, 1210 | "isarray": { 1211 | "version": "1.0.0", 1212 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1213 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1214 | }, 1215 | "isexe": { 1216 | "version": "2.0.0", 1217 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1218 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 1219 | }, 1220 | "isstream": { 1221 | "version": "0.1.2", 1222 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 1223 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 1224 | }, 1225 | "js-tokens": { 1226 | "version": "3.0.2", 1227 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 1228 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" 1229 | }, 1230 | "js-yaml": { 1231 | "version": "3.11.0", 1232 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", 1233 | "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", 1234 | "requires": { 1235 | "argparse": "1.0.10", 1236 | "esprima": "4.0.0" 1237 | } 1238 | }, 1239 | "jsbn": { 1240 | "version": "0.1.1", 1241 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 1242 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 1243 | "optional": true 1244 | }, 1245 | "json-schema": { 1246 | "version": "0.2.3", 1247 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 1248 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 1249 | }, 1250 | "json-schema-traverse": { 1251 | "version": "0.3.1", 1252 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 1253 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" 1254 | }, 1255 | "json-stable-stringify-without-jsonify": { 1256 | "version": "1.0.1", 1257 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1258 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" 1259 | }, 1260 | "json-stringify-safe": { 1261 | "version": "5.0.1", 1262 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1263 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 1264 | }, 1265 | "jsprim": { 1266 | "version": "1.4.1", 1267 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 1268 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 1269 | "requires": { 1270 | "assert-plus": "1.0.0", 1271 | "extsprintf": "1.3.0", 1272 | "json-schema": "0.2.3", 1273 | "verror": "1.10.0" 1274 | } 1275 | }, 1276 | "kafka-node": { 1277 | "version": "2.6.1", 1278 | "resolved": "https://registry.npmjs.org/kafka-node/-/kafka-node-2.6.1.tgz", 1279 | "integrity": "sha512-tpivkSLjiGHRLwx0YN87fMUATOK4NYWESJneHlpikEBNNA5od7fW/ikovS3tWooMqG4Nri55vPFRUNiNvNBWZA==", 1280 | "requires": { 1281 | "async": "2.6.0", 1282 | "binary": "0.3.0", 1283 | "bl": "1.2.2", 1284 | "buffer-crc32": "0.2.13", 1285 | "buffermaker": "1.2.0", 1286 | "debug": "2.6.9", 1287 | "lodash": "4.17.10", 1288 | "minimatch": "3.0.4", 1289 | "nested-error-stacks": "2.0.0", 1290 | "node-zookeeper-client": "0.2.2", 1291 | "optional": "0.1.4", 1292 | "retry": "0.10.1", 1293 | "snappy": "6.0.2", 1294 | "uuid": "3.2.1" 1295 | } 1296 | }, 1297 | "levn": { 1298 | "version": "0.3.0", 1299 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 1300 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 1301 | "requires": { 1302 | "prelude-ls": "1.1.2", 1303 | "type-check": "0.3.2" 1304 | } 1305 | }, 1306 | "lodash": { 1307 | "version": "4.17.10", 1308 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", 1309 | "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" 1310 | }, 1311 | "long": { 1312 | "version": "1.1.2", 1313 | "resolved": "https://registry.npmjs.org/long/-/long-1.1.2.tgz", 1314 | "integrity": "sha1-6u9ZUcp1UdlpJrgtokLbnWso+1M=" 1315 | }, 1316 | "lru-cache": { 1317 | "version": "4.1.2", 1318 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.2.tgz", 1319 | "integrity": "sha512-wgeVXhrDwAWnIF/yZARsFnMBtdFXOg1b8RIrhilp+0iDYN4mdQcNZElDZ0e4B64BhaxeQ5zN7PMyvu7we1kPeQ==", 1320 | "requires": { 1321 | "pseudomap": "1.0.2", 1322 | "yallist": "2.1.2" 1323 | } 1324 | }, 1325 | "media-typer": { 1326 | "version": "0.3.0", 1327 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 1328 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 1329 | }, 1330 | "merge-descriptors": { 1331 | "version": "1.0.1", 1332 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 1333 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 1334 | }, 1335 | "methods": { 1336 | "version": "1.1.2", 1337 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 1338 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 1339 | }, 1340 | "mime": { 1341 | "version": "1.4.1", 1342 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 1343 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 1344 | }, 1345 | "mime-db": { 1346 | "version": "1.33.0", 1347 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", 1348 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" 1349 | }, 1350 | "mime-types": { 1351 | "version": "2.1.18", 1352 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", 1353 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", 1354 | "requires": { 1355 | "mime-db": "1.33.0" 1356 | } 1357 | }, 1358 | "mimic-fn": { 1359 | "version": "1.2.0", 1360 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 1361 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" 1362 | }, 1363 | "minimatch": { 1364 | "version": "3.0.4", 1365 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1366 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1367 | "requires": { 1368 | "brace-expansion": "1.1.11" 1369 | } 1370 | }, 1371 | "minimist": { 1372 | "version": "0.0.8", 1373 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 1374 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 1375 | }, 1376 | "mkdirp": { 1377 | "version": "0.5.1", 1378 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 1379 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 1380 | "requires": { 1381 | "minimist": "0.0.8" 1382 | } 1383 | }, 1384 | "mongodb": { 1385 | "version": "3.0.7", 1386 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.0.7.tgz", 1387 | "integrity": "sha512-n/14kMJEoARXz1qhpNPhUocqy+z5130jhqgEIX1Tsl8UVpHrndQ8et+VmgC4yPK/I8Tcgc93JEMQCHTekBUnNA==", 1388 | "requires": { 1389 | "mongodb-core": "3.0.7" 1390 | } 1391 | }, 1392 | "mongodb-core": { 1393 | "version": "3.0.7", 1394 | "resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.0.7.tgz", 1395 | "integrity": "sha512-z6YufO7s40wLiv2ssFshqoLS4+Kf+huhHq6KZ7gDArsKNzXYjAwTMnhEIJ9GQ8fIfBGs5tBLNPfbIDoCKGPmOw==", 1396 | "requires": { 1397 | "bson": "1.0.6", 1398 | "require_optional": "1.0.1" 1399 | } 1400 | }, 1401 | "ms": { 1402 | "version": "2.0.0", 1403 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 1404 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 1405 | }, 1406 | "mute-stream": { 1407 | "version": "0.0.7", 1408 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 1409 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" 1410 | }, 1411 | "nan": { 1412 | "version": "2.10.0", 1413 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", 1414 | "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==", 1415 | "optional": true 1416 | }, 1417 | "natural-compare": { 1418 | "version": "1.4.0", 1419 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 1420 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=" 1421 | }, 1422 | "ncp": { 1423 | "version": "1.0.1", 1424 | "resolved": "https://registry.npmjs.org/ncp/-/ncp-1.0.1.tgz", 1425 | "integrity": "sha1-0VNn5cuHQyuhF9K/gP30Wuz7QkY=" 1426 | }, 1427 | "negotiator": { 1428 | "version": "0.6.1", 1429 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 1430 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 1431 | }, 1432 | "nested-error-stacks": { 1433 | "version": "2.0.0", 1434 | "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.0.0.tgz", 1435 | "integrity": "sha1-mLL/rvtGEPo5NvHnFDXTBwDeKEA=", 1436 | "requires": { 1437 | "inherits": "2.0.3" 1438 | } 1439 | }, 1440 | "node-gyp": { 1441 | "version": "3.6.2", 1442 | "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", 1443 | "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", 1444 | "optional": true, 1445 | "requires": { 1446 | "fstream": "1.0.11", 1447 | "glob": "7.1.2", 1448 | "graceful-fs": "4.1.11", 1449 | "minimatch": "3.0.4", 1450 | "mkdirp": "0.5.1", 1451 | "nopt": "3.0.6", 1452 | "npmlog": "4.1.2", 1453 | "osenv": "0.1.5", 1454 | "request": "2.85.0", 1455 | "rimraf": "2.6.2", 1456 | "semver": "5.3.0", 1457 | "tar": "2.2.1", 1458 | "which": "1.3.0" 1459 | } 1460 | }, 1461 | "node-zookeeper-client": { 1462 | "version": "0.2.2", 1463 | "resolved": "https://registry.npmjs.org/node-zookeeper-client/-/node-zookeeper-client-0.2.2.tgz", 1464 | "integrity": "sha1-CXvaAZme749gLOBotjJgAGnb9oU=", 1465 | "requires": { 1466 | "async": "0.2.10", 1467 | "underscore": "1.4.4" 1468 | }, 1469 | "dependencies": { 1470 | "async": { 1471 | "version": "0.2.10", 1472 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 1473 | "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" 1474 | } 1475 | } 1476 | }, 1477 | "nopt": { 1478 | "version": "3.0.6", 1479 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 1480 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 1481 | "optional": true, 1482 | "requires": { 1483 | "abbrev": "1.1.1" 1484 | } 1485 | }, 1486 | "npmlog": { 1487 | "version": "4.1.2", 1488 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 1489 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 1490 | "optional": true, 1491 | "requires": { 1492 | "are-we-there-yet": "1.1.4", 1493 | "console-control-strings": "1.1.0", 1494 | "gauge": "2.7.4", 1495 | "set-blocking": "2.0.0" 1496 | } 1497 | }, 1498 | "number-is-nan": { 1499 | "version": "1.0.1", 1500 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1501 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 1502 | }, 1503 | "oauth-sign": { 1504 | "version": "0.8.2", 1505 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 1506 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 1507 | }, 1508 | "object-assign": { 1509 | "version": "4.1.1", 1510 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1511 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1512 | }, 1513 | "on-finished": { 1514 | "version": "2.3.0", 1515 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 1516 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 1517 | "requires": { 1518 | "ee-first": "1.1.1" 1519 | } 1520 | }, 1521 | "once": { 1522 | "version": "1.4.0", 1523 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1524 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1525 | "requires": { 1526 | "wrappy": "1.0.2" 1527 | } 1528 | }, 1529 | "onetime": { 1530 | "version": "2.0.1", 1531 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 1532 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 1533 | "requires": { 1534 | "mimic-fn": "1.2.0" 1535 | } 1536 | }, 1537 | "optional": { 1538 | "version": "0.1.4", 1539 | "resolved": "https://registry.npmjs.org/optional/-/optional-0.1.4.tgz", 1540 | "integrity": "sha512-gtvrrCfkE08wKcgXaVwQVgwEQ8vel2dc5DDBn9RLQZ3YtmtkBss6A2HY6BnJH4N/4Ku97Ri/SF8sNWE2225WJw==" 1541 | }, 1542 | "optionator": { 1543 | "version": "0.8.2", 1544 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 1545 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 1546 | "requires": { 1547 | "deep-is": "0.1.3", 1548 | "fast-levenshtein": "2.0.6", 1549 | "levn": "0.3.0", 1550 | "prelude-ls": "1.1.2", 1551 | "type-check": "0.3.2", 1552 | "wordwrap": "1.0.0" 1553 | } 1554 | }, 1555 | "os-homedir": { 1556 | "version": "1.0.2", 1557 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1558 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", 1559 | "optional": true 1560 | }, 1561 | "os-tmpdir": { 1562 | "version": "1.0.2", 1563 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1564 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 1565 | }, 1566 | "osenv": { 1567 | "version": "0.1.5", 1568 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 1569 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 1570 | "optional": true, 1571 | "requires": { 1572 | "os-homedir": "1.0.2", 1573 | "os-tmpdir": "1.0.2" 1574 | } 1575 | }, 1576 | "parseurl": { 1577 | "version": "1.3.2", 1578 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 1579 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 1580 | }, 1581 | "path-is-absolute": { 1582 | "version": "1.0.1", 1583 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1584 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1585 | }, 1586 | "path-is-inside": { 1587 | "version": "1.0.2", 1588 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1589 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" 1590 | }, 1591 | "path-to-regexp": { 1592 | "version": "0.1.7", 1593 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 1594 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 1595 | }, 1596 | "performance-now": { 1597 | "version": "2.1.0", 1598 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1599 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 1600 | }, 1601 | "pify": { 1602 | "version": "2.3.0", 1603 | "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", 1604 | "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" 1605 | }, 1606 | "pinkie": { 1607 | "version": "2.0.4", 1608 | "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", 1609 | "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" 1610 | }, 1611 | "pinkie-promise": { 1612 | "version": "2.0.1", 1613 | "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", 1614 | "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", 1615 | "requires": { 1616 | "pinkie": "2.0.4" 1617 | } 1618 | }, 1619 | "pkginfo": { 1620 | "version": "0.4.1", 1621 | "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.4.1.tgz", 1622 | "integrity": "sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8=" 1623 | }, 1624 | "pluralize": { 1625 | "version": "7.0.0", 1626 | "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", 1627 | "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==" 1628 | }, 1629 | "prelude-ls": { 1630 | "version": "1.1.2", 1631 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 1632 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=" 1633 | }, 1634 | "process-nextick-args": { 1635 | "version": "2.0.0", 1636 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", 1637 | "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" 1638 | }, 1639 | "progress": { 1640 | "version": "2.0.0", 1641 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", 1642 | "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=" 1643 | }, 1644 | "prompt": { 1645 | "version": "1.0.0", 1646 | "resolved": "https://registry.npmjs.org/prompt/-/prompt-1.0.0.tgz", 1647 | "integrity": "sha1-jlcSPDlquYiJf7Mn/Trtw+c15P4=", 1648 | "requires": { 1649 | "colors": "1.2.1", 1650 | "pkginfo": "0.4.1", 1651 | "read": "1.0.7", 1652 | "revalidator": "0.1.8", 1653 | "utile": "0.3.0", 1654 | "winston": "2.1.1" 1655 | } 1656 | }, 1657 | "proxy-addr": { 1658 | "version": "2.0.3", 1659 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", 1660 | "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", 1661 | "requires": { 1662 | "forwarded": "0.1.2", 1663 | "ipaddr.js": "1.6.0" 1664 | } 1665 | }, 1666 | "pseudomap": { 1667 | "version": "1.0.2", 1668 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1669 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 1670 | }, 1671 | "punycode": { 1672 | "version": "1.4.1", 1673 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1674 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 1675 | }, 1676 | "qs": { 1677 | "version": "6.5.1", 1678 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 1679 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" 1680 | }, 1681 | "range-parser": { 1682 | "version": "1.2.0", 1683 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 1684 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 1685 | }, 1686 | "raw-body": { 1687 | "version": "2.3.2", 1688 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", 1689 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", 1690 | "requires": { 1691 | "bytes": "3.0.0", 1692 | "http-errors": "1.6.2", 1693 | "iconv-lite": "0.4.19", 1694 | "unpipe": "1.0.0" 1695 | }, 1696 | "dependencies": { 1697 | "depd": { 1698 | "version": "1.1.1", 1699 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 1700 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 1701 | }, 1702 | "http-errors": { 1703 | "version": "1.6.2", 1704 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", 1705 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", 1706 | "requires": { 1707 | "depd": "1.1.1", 1708 | "inherits": "2.0.3", 1709 | "setprototypeof": "1.0.3", 1710 | "statuses": "1.4.0" 1711 | } 1712 | }, 1713 | "iconv-lite": { 1714 | "version": "0.4.19", 1715 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 1716 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 1717 | }, 1718 | "setprototypeof": { 1719 | "version": "1.0.3", 1720 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", 1721 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" 1722 | } 1723 | } 1724 | }, 1725 | "read": { 1726 | "version": "1.0.7", 1727 | "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", 1728 | "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", 1729 | "requires": { 1730 | "mute-stream": "0.0.7" 1731 | } 1732 | }, 1733 | "readable-stream": { 1734 | "version": "2.3.6", 1735 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1736 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1737 | "requires": { 1738 | "core-util-is": "1.0.2", 1739 | "inherits": "2.0.3", 1740 | "isarray": "1.0.0", 1741 | "process-nextick-args": "2.0.0", 1742 | "safe-buffer": "5.1.2", 1743 | "string_decoder": "1.1.1", 1744 | "util-deprecate": "1.0.2" 1745 | } 1746 | }, 1747 | "redis": { 1748 | "version": "2.8.0", 1749 | "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", 1750 | "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", 1751 | "requires": { 1752 | "double-ended-queue": "2.1.0-0", 1753 | "redis-commands": "1.3.5", 1754 | "redis-parser": "2.6.0" 1755 | } 1756 | }, 1757 | "redis-commands": { 1758 | "version": "1.3.5", 1759 | "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.5.tgz", 1760 | "integrity": "sha512-foGF8u6MXGFF++1TZVC6icGXuMYPftKXt1FBT2vrfU9ZATNtZJ8duRC5d1lEfE8hyVe3jhelHGB91oB7I6qLsA==" 1761 | }, 1762 | "redis-parser": { 1763 | "version": "2.6.0", 1764 | "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", 1765 | "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=" 1766 | }, 1767 | "regexpp": { 1768 | "version": "1.1.0", 1769 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", 1770 | "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==" 1771 | }, 1772 | "request": { 1773 | "version": "2.85.0", 1774 | "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz", 1775 | "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==", 1776 | "requires": { 1777 | "aws-sign2": "0.7.0", 1778 | "aws4": "1.7.0", 1779 | "caseless": "0.12.0", 1780 | "combined-stream": "1.0.6", 1781 | "extend": "3.0.1", 1782 | "forever-agent": "0.6.1", 1783 | "form-data": "2.3.2", 1784 | "har-validator": "5.0.3", 1785 | "hawk": "6.0.2", 1786 | "http-signature": "1.2.0", 1787 | "is-typedarray": "1.0.0", 1788 | "isstream": "0.1.2", 1789 | "json-stringify-safe": "5.0.1", 1790 | "mime-types": "2.1.18", 1791 | "oauth-sign": "0.8.2", 1792 | "performance-now": "2.1.0", 1793 | "qs": "6.5.1", 1794 | "safe-buffer": "5.1.2", 1795 | "stringstream": "0.0.5", 1796 | "tough-cookie": "2.3.4", 1797 | "tunnel-agent": "0.6.0", 1798 | "uuid": "3.2.1" 1799 | } 1800 | }, 1801 | "require-uncached": { 1802 | "version": "1.0.3", 1803 | "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", 1804 | "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", 1805 | "requires": { 1806 | "caller-path": "0.1.0", 1807 | "resolve-from": "1.0.1" 1808 | } 1809 | }, 1810 | "require_optional": { 1811 | "version": "1.0.1", 1812 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz", 1813 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==", 1814 | "requires": { 1815 | "resolve-from": "2.0.0", 1816 | "semver": "5.3.0" 1817 | }, 1818 | "dependencies": { 1819 | "resolve-from": { 1820 | "version": "2.0.0", 1821 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", 1822 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=" 1823 | } 1824 | } 1825 | }, 1826 | "resolve-from": { 1827 | "version": "1.0.1", 1828 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", 1829 | "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=" 1830 | }, 1831 | "restore-cursor": { 1832 | "version": "2.0.0", 1833 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 1834 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 1835 | "requires": { 1836 | "onetime": "2.0.1", 1837 | "signal-exit": "3.0.2" 1838 | } 1839 | }, 1840 | "retry": { 1841 | "version": "0.10.1", 1842 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", 1843 | "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=" 1844 | }, 1845 | "revalidator": { 1846 | "version": "0.1.8", 1847 | "resolved": "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz", 1848 | "integrity": "sha1-/s5hv6DBtSoga9axgZgYS91SOjs=" 1849 | }, 1850 | "rimraf": { 1851 | "version": "2.6.2", 1852 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1853 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1854 | "requires": { 1855 | "glob": "7.1.2" 1856 | } 1857 | }, 1858 | "run-async": { 1859 | "version": "2.3.0", 1860 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 1861 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 1862 | "requires": { 1863 | "is-promise": "2.1.0" 1864 | } 1865 | }, 1866 | "rx-lite": { 1867 | "version": "4.0.8", 1868 | "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", 1869 | "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=" 1870 | }, 1871 | "rx-lite-aggregates": { 1872 | "version": "4.0.8", 1873 | "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", 1874 | "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", 1875 | "requires": { 1876 | "rx-lite": "4.0.8" 1877 | } 1878 | }, 1879 | "rxjs": { 1880 | "version": "5.5.2", 1881 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.2.tgz", 1882 | "integrity": "sha512-oRYoIKWBU3Ic37fLA5VJu31VqQO4bWubRntcHSJ+cwaDQBwdnZ9x4zmhJfm/nFQ2E82/I4loSioHnACamrKGgA==", 1883 | "requires": { 1884 | "symbol-observable": "1.0.1" 1885 | } 1886 | }, 1887 | "safe-buffer": { 1888 | "version": "5.1.2", 1889 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1890 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1891 | }, 1892 | "safer-buffer": { 1893 | "version": "2.1.2", 1894 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1895 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1896 | }, 1897 | "semver": { 1898 | "version": "5.3.0", 1899 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", 1900 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" 1901 | }, 1902 | "send": { 1903 | "version": "0.16.2", 1904 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", 1905 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", 1906 | "requires": { 1907 | "debug": "2.6.9", 1908 | "depd": "1.1.2", 1909 | "destroy": "1.0.4", 1910 | "encodeurl": "1.0.2", 1911 | "escape-html": "1.0.3", 1912 | "etag": "1.8.1", 1913 | "fresh": "0.5.2", 1914 | "http-errors": "1.6.3", 1915 | "mime": "1.4.1", 1916 | "ms": "2.0.0", 1917 | "on-finished": "2.3.0", 1918 | "range-parser": "1.2.0", 1919 | "statuses": "1.4.0" 1920 | } 1921 | }, 1922 | "serve-static": { 1923 | "version": "1.13.2", 1924 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz", 1925 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", 1926 | "requires": { 1927 | "encodeurl": "1.0.2", 1928 | "escape-html": "1.0.3", 1929 | "parseurl": "1.3.2", 1930 | "send": "0.16.2" 1931 | } 1932 | }, 1933 | "set-blocking": { 1934 | "version": "2.0.0", 1935 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1936 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 1937 | "optional": true 1938 | }, 1939 | "setprototypeof": { 1940 | "version": "1.1.0", 1941 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 1942 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 1943 | }, 1944 | "shebang-command": { 1945 | "version": "1.2.0", 1946 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1947 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1948 | "requires": { 1949 | "shebang-regex": "1.0.0" 1950 | } 1951 | }, 1952 | "shebang-regex": { 1953 | "version": "1.0.0", 1954 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1955 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 1956 | }, 1957 | "shortid": { 1958 | "version": "2.2.8", 1959 | "resolved": "https://registry.npmjs.org/shortid/-/shortid-2.2.8.tgz", 1960 | "integrity": "sha1-AzsRfWoul1gE9vCWnb59PQs1UTE=" 1961 | }, 1962 | "signal-exit": { 1963 | "version": "3.0.2", 1964 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1965 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 1966 | }, 1967 | "slice-ansi": { 1968 | "version": "1.0.0", 1969 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", 1970 | "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", 1971 | "requires": { 1972 | "is-fullwidth-code-point": "2.0.0" 1973 | }, 1974 | "dependencies": { 1975 | "is-fullwidth-code-point": { 1976 | "version": "2.0.0", 1977 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1978 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 1979 | } 1980 | } 1981 | }, 1982 | "snappy": { 1983 | "version": "6.0.2", 1984 | "resolved": "https://registry.npmjs.org/snappy/-/snappy-6.0.2.tgz", 1985 | "integrity": "sha512-s9JN//fDqVN0z4Zg8ZUS8ruPHToKi3OMnzaap2nycKpMmeI0TJt3onKbAhHn6dqH6bHPvEPiqm/0JmNtsfBnQg==", 1986 | "optional": true, 1987 | "requires": { 1988 | "bindings": "1.3.0", 1989 | "nan": "2.10.0", 1990 | "node-gyp": "3.6.2" 1991 | } 1992 | }, 1993 | "sntp": { 1994 | "version": "2.1.0", 1995 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", 1996 | "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", 1997 | "requires": { 1998 | "hoek": "4.2.1" 1999 | } 2000 | }, 2001 | "sprintf-js": { 2002 | "version": "1.0.3", 2003 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 2004 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 2005 | }, 2006 | "sshpk": { 2007 | "version": "1.14.1", 2008 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", 2009 | "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", 2010 | "requires": { 2011 | "asn1": "0.2.3", 2012 | "assert-plus": "1.0.0", 2013 | "bcrypt-pbkdf": "1.0.1", 2014 | "dashdash": "1.14.1", 2015 | "ecc-jsbn": "0.1.1", 2016 | "getpass": "0.1.7", 2017 | "jsbn": "0.1.1", 2018 | "tweetnacl": "0.14.5" 2019 | } 2020 | }, 2021 | "stack-trace": { 2022 | "version": "0.0.10", 2023 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 2024 | "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" 2025 | }, 2026 | "statuses": { 2027 | "version": "1.4.0", 2028 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", 2029 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" 2030 | }, 2031 | "stream-to-observable": { 2032 | "version": "0.2.0", 2033 | "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.2.0.tgz", 2034 | "integrity": "sha1-WdbqOT2HwsDdrBCqDVYbxrpvDhA=", 2035 | "requires": { 2036 | "any-observable": "0.2.0" 2037 | } 2038 | }, 2039 | "string-width": { 2040 | "version": "1.0.2", 2041 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 2042 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 2043 | "requires": { 2044 | "code-point-at": "1.1.0", 2045 | "is-fullwidth-code-point": "1.0.0", 2046 | "strip-ansi": "3.0.1" 2047 | } 2048 | }, 2049 | "string_decoder": { 2050 | "version": "1.1.1", 2051 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 2052 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 2053 | "requires": { 2054 | "safe-buffer": "5.1.2" 2055 | } 2056 | }, 2057 | "stringstream": { 2058 | "version": "0.0.5", 2059 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 2060 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" 2061 | }, 2062 | "strip-ansi": { 2063 | "version": "3.0.1", 2064 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 2065 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 2066 | "requires": { 2067 | "ansi-regex": "2.1.1" 2068 | } 2069 | }, 2070 | "strip-json-comments": { 2071 | "version": "2.0.1", 2072 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 2073 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 2074 | }, 2075 | "supports-color": { 2076 | "version": "5.4.0", 2077 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 2078 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 2079 | "requires": { 2080 | "has-flag": "3.0.0" 2081 | } 2082 | }, 2083 | "symbol-observable": { 2084 | "version": "1.0.1", 2085 | "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.0.1.tgz", 2086 | "integrity": "sha1-g0D8RwLDEi310iKI+IKD9RPT/dQ=" 2087 | }, 2088 | "table": { 2089 | "version": "4.0.2", 2090 | "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", 2091 | "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", 2092 | "requires": { 2093 | "ajv": "5.5.2", 2094 | "ajv-keywords": "2.1.1", 2095 | "chalk": "2.4.1", 2096 | "lodash": "4.17.10", 2097 | "slice-ansi": "1.0.0", 2098 | "string-width": "2.1.1" 2099 | }, 2100 | "dependencies": { 2101 | "ansi-regex": { 2102 | "version": "3.0.0", 2103 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 2104 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 2105 | }, 2106 | "is-fullwidth-code-point": { 2107 | "version": "2.0.0", 2108 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 2109 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 2110 | }, 2111 | "string-width": { 2112 | "version": "2.1.1", 2113 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2114 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 2115 | "requires": { 2116 | "is-fullwidth-code-point": "2.0.0", 2117 | "strip-ansi": "4.0.0" 2118 | } 2119 | }, 2120 | "strip-ansi": { 2121 | "version": "4.0.0", 2122 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 2123 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 2124 | "requires": { 2125 | "ansi-regex": "3.0.0" 2126 | } 2127 | } 2128 | } 2129 | }, 2130 | "tar": { 2131 | "version": "2.2.1", 2132 | "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", 2133 | "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", 2134 | "optional": true, 2135 | "requires": { 2136 | "block-stream": "0.0.9", 2137 | "fstream": "1.0.11", 2138 | "inherits": "2.0.3" 2139 | } 2140 | }, 2141 | "text-table": { 2142 | "version": "0.2.0", 2143 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 2144 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" 2145 | }, 2146 | "through": { 2147 | "version": "2.3.8", 2148 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2149 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" 2150 | }, 2151 | "tmp": { 2152 | "version": "0.0.33", 2153 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 2154 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 2155 | "requires": { 2156 | "os-tmpdir": "1.0.2" 2157 | } 2158 | }, 2159 | "tough-cookie": { 2160 | "version": "2.3.4", 2161 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", 2162 | "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", 2163 | "requires": { 2164 | "punycode": "1.4.1" 2165 | } 2166 | }, 2167 | "traverse": { 2168 | "version": "0.3.9", 2169 | "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", 2170 | "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" 2171 | }, 2172 | "tunnel-agent": { 2173 | "version": "0.6.0", 2174 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 2175 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 2176 | "requires": { 2177 | "safe-buffer": "5.1.2" 2178 | } 2179 | }, 2180 | "tweetnacl": { 2181 | "version": "0.14.5", 2182 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 2183 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 2184 | "optional": true 2185 | }, 2186 | "type-check": { 2187 | "version": "0.3.2", 2188 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 2189 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 2190 | "requires": { 2191 | "prelude-ls": "1.1.2" 2192 | } 2193 | }, 2194 | "type-is": { 2195 | "version": "1.6.16", 2196 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", 2197 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", 2198 | "requires": { 2199 | "media-typer": "0.3.0", 2200 | "mime-types": "2.1.18" 2201 | } 2202 | }, 2203 | "typedarray": { 2204 | "version": "0.0.6", 2205 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 2206 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 2207 | }, 2208 | "underscore": { 2209 | "version": "1.4.4", 2210 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", 2211 | "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=" 2212 | }, 2213 | "unpipe": { 2214 | "version": "1.0.0", 2215 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 2216 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 2217 | }, 2218 | "util-deprecate": { 2219 | "version": "1.0.2", 2220 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 2221 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 2222 | }, 2223 | "utile": { 2224 | "version": "0.3.0", 2225 | "resolved": "https://registry.npmjs.org/utile/-/utile-0.3.0.tgz", 2226 | "integrity": "sha1-E1LDQOuCDk2N26A5pPv6oy7U7zo=", 2227 | "requires": { 2228 | "async": "0.9.2", 2229 | "deep-equal": "0.2.2", 2230 | "i": "0.3.6", 2231 | "mkdirp": "0.5.1", 2232 | "ncp": "1.0.1", 2233 | "rimraf": "2.6.2" 2234 | }, 2235 | "dependencies": { 2236 | "async": { 2237 | "version": "0.9.2", 2238 | "resolved": "https://registry.npmjs.org/async/-/async-0.9.2.tgz", 2239 | "integrity": "sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0=" 2240 | } 2241 | } 2242 | }, 2243 | "utils-merge": { 2244 | "version": "1.0.1", 2245 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 2246 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 2247 | }, 2248 | "uuid": { 2249 | "version": "3.2.1", 2250 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", 2251 | "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" 2252 | }, 2253 | "vary": { 2254 | "version": "1.1.2", 2255 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 2256 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 2257 | }, 2258 | "verror": { 2259 | "version": "1.10.0", 2260 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 2261 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 2262 | "requires": { 2263 | "assert-plus": "1.0.0", 2264 | "core-util-is": "1.0.2", 2265 | "extsprintf": "1.3.0" 2266 | } 2267 | }, 2268 | "which": { 2269 | "version": "1.3.0", 2270 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", 2271 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", 2272 | "requires": { 2273 | "isexe": "2.0.0" 2274 | } 2275 | }, 2276 | "wide-align": { 2277 | "version": "1.1.2", 2278 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", 2279 | "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", 2280 | "optional": true, 2281 | "requires": { 2282 | "string-width": "1.0.2" 2283 | } 2284 | }, 2285 | "winston": { 2286 | "version": "2.1.1", 2287 | "resolved": "https://registry.npmjs.org/winston/-/winston-2.1.1.tgz", 2288 | "integrity": "sha1-PJNJ0ZYgf9G9/51LxD73JRDjoS4=", 2289 | "requires": { 2290 | "async": "1.0.0", 2291 | "colors": "1.0.3", 2292 | "cycle": "1.0.3", 2293 | "eyes": "0.1.8", 2294 | "isstream": "0.1.2", 2295 | "pkginfo": "0.3.1", 2296 | "stack-trace": "0.0.10" 2297 | }, 2298 | "dependencies": { 2299 | "async": { 2300 | "version": "1.0.0", 2301 | "resolved": "https://registry.npmjs.org/async/-/async-1.0.0.tgz", 2302 | "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=" 2303 | }, 2304 | "colors": { 2305 | "version": "1.0.3", 2306 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", 2307 | "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=" 2308 | }, 2309 | "pkginfo": { 2310 | "version": "0.3.1", 2311 | "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", 2312 | "integrity": "sha1-Wyn2qB9wcXFC4J52W76rl7T4HiE=" 2313 | } 2314 | } 2315 | }, 2316 | "wordwrap": { 2317 | "version": "1.0.0", 2318 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 2319 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" 2320 | }, 2321 | "wrappy": { 2322 | "version": "1.0.2", 2323 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2324 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 2325 | }, 2326 | "write": { 2327 | "version": "0.2.1", 2328 | "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", 2329 | "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", 2330 | "requires": { 2331 | "mkdirp": "0.5.1" 2332 | } 2333 | }, 2334 | "yallist": { 2335 | "version": "2.1.2", 2336 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 2337 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 2338 | } 2339 | } 2340 | } 2341 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kafka", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "api.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "author": "", 10 | "license": "ISC", 11 | "dependencies": { 12 | "async": "^2.6.0", 13 | "bluebird": "^3.5.1", 14 | "body-parser": "^1.18.2", 15 | "eslint": "^4.19.1", 16 | "express": "^4.16.3", 17 | "fastest-validator": "^0.6.6", 18 | "inquirer": "^5.2.0", 19 | "kafka-node": "^2.6.1", 20 | "lodash": "^4.17.10", 21 | "mongodb": "^3.0.7", 22 | "prompt": "^1.0.0", 23 | "redis": "^2.8.0", 24 | "request": "^2.85.0", 25 | "rxjs": "^5.5.2", 26 | "shortid": "^2.2.8", 27 | "stream-to-observable": "^0.2.0" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /utils.js: -------------------------------------------------------------------------------- 1 | const events = require('./events'); 2 | let Validator = require('fastest-validator'); 3 | const v = new Validator(); 4 | 5 | const hashCode = function(stringOrBuffer) { 6 | let hash = 0; 7 | if (stringOrBuffer) { 8 | const string = stringOrBuffer.toString(); 9 | const length = string.length; 10 | 11 | for (let i = 0; i < length; i++) { 12 | hash = (hash * 31 + string.charCodeAt(i)) & 0x7fffffff; 13 | } 14 | } 15 | 16 | return hash === 0 ? 1 : hash; 17 | }; 18 | 19 | function getPartition(partitions, key) { 20 | key = key || ''; 21 | 22 | const index = hashCode(key) % partitions.length; 23 | return partitions[index]; 24 | } 25 | 26 | function getEventSchema(eventId) { 27 | const schema = events[eventId]; 28 | if (!schema || !schema.SCHEMA) throw new Error('schema for eventId('+eventId+') not found'); 29 | return schema.SCHEMA; 30 | } 31 | 32 | function getEventMockFunc(eventId) { 33 | const schema = events[eventId]; 34 | if (!schema || !schema.MOCK) throw new Error('mock for eventId('+eventId+') not found'); 35 | return schema.MOCK; 36 | } 37 | 38 | function getBusinessRulesOfEvent(eventId) { 39 | const schema = events[eventId]; 40 | if (!schema) throw new Error('schema for eventId('+eventId+') not found'); 41 | return schema.RULES || []; 42 | } 43 | 44 | function isValidEvent(payload) { 45 | const schema = getEventSchema(payload.eventId); 46 | return (v.validate(payload, schema) === true) 47 | } 48 | 49 | function throwIf(val, error) { 50 | if (val) throw error; 51 | } 52 | 53 | function getEventIds() { 54 | return Object.keys(events) 55 | } 56 | 57 | module.exports = { 58 | getPartition, 59 | isValidEvent, 60 | throwIf, 61 | getEventIds, 62 | getEventSchema, 63 | getEventMockFunc, 64 | getBusinessRulesOfEvent 65 | }; 66 | --------------------------------------------------------------------------------