├── .eslintignore ├── .eslintrc ├── .gitignore ├── .jscsrc ├── .jshintignore ├── .jshintrc ├── .travis.yml ├── CHANGELOG.md ├── README.md ├── example ├── client.js └── server.js ├── index.js ├── lib ├── command.js ├── commands-list │ ├── ack-job.js │ ├── add-job.js │ ├── auth.js │ ├── del-job.js │ ├── dequeue.js │ ├── enqueue.js │ ├── fast-ack.js │ ├── get-job.js │ ├── hello.js │ ├── info.js │ ├── nack.js │ ├── qlen.js │ ├── qscan.js │ ├── show.js │ └── working.js ├── commands.js └── disqueue-client.js ├── package-lock.json ├── package.json ├── scripts └── eslint.sh ├── test ├── commands-list │ ├── ack-job.js │ ├── add-job.js │ ├── del-job.js │ ├── dequeue.js │ ├── enqueue.js │ ├── fast-ack.js │ ├── get-job.js │ ├── hello.js │ ├── info.js │ ├── nack.js │ ├── qlen.js │ ├── qscan.js │ ├── show.js │ └── working.js ├── disqueue-client.js ├── helper.js └── mocha.opts └── yarn.lock /.eslintignore: -------------------------------------------------------------------------------- 1 | node_modules/** 2 | -------------------------------------------------------------------------------- /.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "env" : { 3 | "node" : true, 4 | "browser" : true, 5 | "amd" : true, 6 | "mocha" : true 7 | }, 8 | 9 | "globals" : { 10 | "angular" : true 11 | }, 12 | 13 | "rules" : { 14 | 15 | // Possible Errors 16 | "comma-dangle" : [ 2, "never" ], 17 | "no-cond-assign" : [ 2, "always" ], 18 | "no-constant-condition" : 2, 19 | "no-debugger" : 2, 20 | "no-dupe-args" : 2, 21 | "no-dupe-keys" : 2, 22 | "no-duplicate-case" : 2, 23 | "no-empty-class" : 2, 24 | "no-empty" : 2, 25 | "no-ex-assign" : 2, 26 | "no-extra-boolean-cast" : 2, 27 | "no-extra-semi" : 2, 28 | "no-func-assign" : 2, 29 | "no-inner-declarations" : 2, 30 | "no-invalid-regexp" : 2, 31 | "no-irregular-whitespace" : 2, 32 | "no-negated-in-lhs" : 2, 33 | "no-obj-calls" : 2, 34 | "no-regex-spaces" : 2, 35 | "no-sparse-arrays" : 2, 36 | "use-isnan" : 2, 37 | "valid-typeof" : 2, 38 | 39 | // Best Practices 40 | "complexity" : [ 1, 10 ], 41 | "consistent-return" : 2, 42 | "curly" : [ 2, "all" ], 43 | "dot-notation" : 2, 44 | "eqeqeq" : 2, 45 | "guard-for-in" : 2, 46 | "no-alert" : 2, 47 | "no-caller" : 2, 48 | "no-else-return" : 2, 49 | "no-eq-null" : 2, 50 | "no-eval" : 2, 51 | "no-extend-native" : 2, 52 | "no-floating-decimal" : 2, 53 | "no-implied-eval" : 2, 54 | "no-labels" : 2, 55 | "no-lone-blocks" : 2, 56 | "no-loop-func" : 2, 57 | "no-multi-spaces" : 0, 58 | "no-native-reassign" : 2, 59 | "no-new" : 2, 60 | "no-new-func" : 2, 61 | "no-proto" : 2, 62 | "no-redeclare" : 2, 63 | "no-return-assign" : 2, 64 | "no-script-url" : 2, 65 | "no-self-compare" : 2, 66 | "no-unused-expressions" : 2, 67 | "no-with" : 2, 68 | "yoda" : [ 2, "never" ], 69 | 70 | // Strict Mode 71 | "no-extra-strict" : 2, 72 | "strict" : 2, 73 | 74 | // Variables 75 | "no-catch-shadow" : 2, 76 | "no-shadow" : 2, 77 | "no-shadow-restricted-names" : 2, 78 | "no-undef" : 2, 79 | "no-undef-init" : 2, 80 | "no-unused-vars" : 2, 81 | "no-use-before-define" : 2, 82 | 83 | // Node.js 84 | "handle-callback-err" : 2, 85 | "no-mixed-requires" : [ 2, true ], 86 | "no-path-concat" : 2, 87 | "no-process-exit" : 2, 88 | 89 | // Stylistic Issues 90 | "brace-style" : [ 2, "1tbs" ], 91 | "camelcase" : 2, 92 | "consistent-this" : [ 0, "self" ], 93 | "comma-spacing" : [ 2, { "before" : false, "after" : true } ], 94 | "key-spacing" : [ 2, { "beforeColon" : true, "afterColon" : true, "align" : "colon" } ], 95 | "max-nested-callbacks" : [ 1, 4 ], 96 | "new-cap" : 2, 97 | "new-parens" : 2, 98 | "no-array-constructor" : 2, 99 | "no-mixed-spaces-and-tabs" : 2, 100 | "no-nested-ternary" : 2, 101 | "no-new-object" : 2, 102 | "no-space-before-semi" : 2, 103 | "no-spaced-func" : 2, 104 | "no-ternary" : 2, 105 | "no-trailing-spaces" : 2, 106 | "no-underscore-dangle" : 2, 107 | "no-wrap-func" : 2, 108 | "one-var" : 0, 109 | "quote-props" : 2, 110 | "quotes" : [ 2, "single", "avoid-escape" ], 111 | "semi" : 2, 112 | "space-in-brackets" : [ 2, "always" ], 113 | "space-infix-ops" : 2, 114 | "space-return-throw-case" : 2, 115 | "space-unary-ops" : [ 2, { "words" : true, "nonwords" : false } ], 116 | 117 | // Legacy 118 | "no-bitwise" : 2, 119 | "max-params" : [ 2, 8 ], 120 | } 121 | } 122 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | 5 | # Runtime data 6 | pids 7 | *.pid 8 | *.seed 9 | 10 | # Directory for instrumented libs generated by jscoverage/JSCover 11 | lib-cov 12 | 13 | # Coverage directory used by tools like istanbul 14 | coverage 15 | 16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 17 | .grunt 18 | 19 | # node-waf configuration 20 | .lock-wscript 21 | 22 | # Compiled binary addons (http://nodejs.org/api/addons.html) 23 | build/Release 24 | 25 | # Dependency directory 26 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git 27 | node_modules 28 | 29 | .idea 30 | .vscode 31 | -------------------------------------------------------------------------------- /.jscsrc: -------------------------------------------------------------------------------- 1 | { 2 | "excludeFiles" : [ 3 | "node_modules/**", 4 | ".*/", 5 | "example/**" 6 | ], 7 | 8 | "requireCurlyBraces" : [ 9 | "if", 10 | "else", 11 | "for", 12 | "while", 13 | "do", 14 | "try", 15 | "catch", 16 | "default" 17 | ], 18 | 19 | "requireSpaceAfterKeywords" : [ 20 | "if", 21 | "else", 22 | "for", 23 | "while", 24 | "do", 25 | "switch", 26 | "return", 27 | "try", 28 | "catch" 29 | ], 30 | 31 | "requireSpaceBeforeBlockStatements" : true, 32 | 33 | "requireSpacesInFunctionExpression" : { 34 | "beforeOpeningRoundBrace" : true, 35 | "beforeOpeningCurlyBrace" : true 36 | }, 37 | 38 | "requireSpacesInAnonymousFunctionExpression" : { 39 | "beforeOpeningRoundBrace" : true, 40 | "beforeOpeningCurlyBrace" : true 41 | }, 42 | 43 | "requireSpacesInNamedFunctionExpression" : { 44 | "beforeOpeningRoundBrace" : true, 45 | "beforeOpeningCurlyBrace" : true 46 | }, 47 | 48 | "requireSpacesInFunctionDeclaration" : { 49 | "beforeOpeningRoundBrace" : true, 50 | "beforeOpeningCurlyBrace" : true 51 | }, 52 | 53 | "requireSpacesInFunction" : { 54 | "beforeOpeningRoundBrace" : true, 55 | "beforeOpeningCurlyBrace" : true 56 | }, 57 | 58 | "disallowMultipleVarDecl" : true, 59 | "requireBlocksOnNewline" : true, 60 | "disallowEmptyBlocks" : true, 61 | "requireSpacesInsideObjectBrackets" : "all", 62 | "requireSpacesInsideArrayBrackets" : "all", 63 | "requireSpacesInsideParentheses" : "all", 64 | "requireSpaceAfterObjectKeys" : true, 65 | "requireCommaBeforeLineBreak" : true, 66 | "requireAlignedObjectValues" : "skipWithLineBreak", 67 | 68 | "requireSpaceBeforeBinaryOperators" : [ 69 | "+", 70 | "-", 71 | "/", 72 | "*", 73 | "=", 74 | "==", 75 | "===", 76 | "!=", 77 | "!==" 78 | ], 79 | 80 | "requireSpaceAfterBinaryOperators" : [ 81 | "+", 82 | "-", 83 | "/", 84 | "*", 85 | "=", 86 | "==", 87 | "===", 88 | "!=", 89 | "!==" 90 | ], 91 | 92 | "disallowImplicitTypeConversion" : [ "numeric", "boolean", "binary", "string" ], 93 | "requireCamelCaseOrUpperCaseIdentifiers" : true, 94 | "disallowMultipleLineStrings" : true, 95 | "disallowMultipleLineBreaks" : true, 96 | "validateLineBreaks" : "LF", 97 | "validateQuoteMarks" : { "mark": "'", "escape": true }, 98 | "validateIndentation" : "\t", 99 | "disallowMixedSpacesAndTabs" : true, 100 | "disallowTrailingWhitespace" : true, 101 | "disallowTrailingComma" : true, 102 | "disallowKeywordsOnNewLine" : [ "else", "catch", "finally" ], 103 | "requireLineFeedAtFileEnd" : true, 104 | "requireCapitalizedConstructors" : true, 105 | "safeContextKeyword" : [ "self", "that" ], 106 | "requireDotNotation" : true, 107 | "disallowYodaConditions" : true, 108 | 109 | "validateJSDoc" : { 110 | "checkParamNames" : true, 111 | "checkRedundantParams" : true, 112 | "requireParamTypes" : true 113 | }, 114 | 115 | "requireSpaceAfterLineComment" : true 116 | } 117 | -------------------------------------------------------------------------------- /.jshintignore: -------------------------------------------------------------------------------- 1 | node_modules/** 2 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "bitwise" : true, 3 | "curly" : true, 4 | "eqeqeq" : true, 5 | "forin" : false, 6 | "latedef" : true, 7 | "newcap" : true, 8 | "noarg" : true, 9 | "noempty" : true, 10 | "undef" : true, 11 | "strict" : true, 12 | "trailing" : true, 13 | "evil" : false, 14 | "quotmark" : "single", 15 | "node" : true, 16 | "browser" : true, 17 | "sub" : true, 18 | "smarttabs" : true, 19 | "camelcase" : true, 20 | "maxparams" : 8, 21 | "unused" : "vars", 22 | 23 | "globals": { 24 | "after" : true, 25 | "afterEach" : true, 26 | "angular" : true, 27 | "before" : true, 28 | "beforeEach" : true, 29 | "browser" : true, 30 | "by" : true, 31 | "define" : true, 32 | "describe" : true, 33 | "element" : true, 34 | "expect" : true, 35 | "inject" : true, 36 | "it" : true, 37 | "jasmine" : true, 38 | "module" : true, 39 | "protractor" : true, 40 | "require" : true, 41 | "should" : true, 42 | "spyOn" : true 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: 4 | - "11.2.0" 5 | 6 | before_install: 7 | - npm install -g npm 8 | 9 | install: 10 | - npm install 11 | 12 | before_script: 13 | - git clone https://github.com/antirez/disque.git disque_server 14 | - "cd disque_server/src/ && make && PREFIX=../ make install && cd -" 15 | - "./disque_server/bin/disque-server &" 16 | - ./disque_server/bin/disque PING 17 | 18 | scripts: 19 | - npm test 20 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | ### 1.4.0 2 | * Add qscan command 3 | 4 | ### 1.3.1 5 | * Update uuid to version 3.0.0 6 | 7 | ### 1.3.0 8 | * Add configurable retry 9 | 10 | ### 1.2.0 11 | * Add working command 12 | 13 | ### 1.1.0 14 | * Add decorators from disqueu raw 15 | * Complete tests for existing commands 16 | 17 | ### 1.0.0 18 | * Refactor disqueue client 19 | * Removed RPC 20 | * Cleaner commands list 21 | 22 | ### 0.2.0 23 | * Remove register listeners 24 | * Add tcp names 25 | 26 | ### 0.1.7 27 | * Add options as default when instantiating Disqueue and use default. 28 | 29 | ### 0.1.6 30 | * Supported auth 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # disqueue-node client 2 | [![Build Status](https://travis-ci.org/gideonairex/disqueue-node.svg?branch=master)](https://travis-ci.org/gideonairex/disqueue-node)[![Dependency Status](https://david-dm.org/gideonairex/disqueue-node.svg)](https://david-dm.org/gideonairex/disqueue-node)[![Code Climate](https://codeclimate.com/github/gideonairex/disqueue-node/badges/gpa.svg)](https://codeclimate.com/github/gideonairex/disqueue-node)[![Stories in Ready](https://badge.waffle.io/gideonairex/disqueue-node.png?label=ready&title=Ready)](https://waffle.io/gideonairex/disqueue-node) 3 | 4 | This is a Disqueue client using node.js. 5 | 6 | ## Setup 7 | Install [Disque](https://github.com/antirez/disque) 8 | 9 | ## How to use 10 | Connect to disqueue then you can use the connected disqueue( [examples](https://github.com/gideonairex/disqueue-node/tree/master/example) ) 11 | 12 | ## Options 13 | ```javascript 14 | var options = { 15 | 'host' : , // defaults to '127.0.0.1' 16 | 'port' : , // defaults to 7777 17 | 'auth' : { 18 | 'password' : 'gideonairex' 19 | }, 20 | 'retryMax' : , // defaults to 5 21 | 'retryCount' : // defaults to 200 ms 22 | }; 23 | 24 | var disqueue = new Disqueue( options ); 25 | ``` 26 | 27 | ## API 28 | 29 | __ACKJOB__ 30 | ```javascript 31 | disqueue.ackJob( , callback ); 32 | ``` 33 | 34 | __ADDJOB__ 35 | ```javascript 36 | disqueue.addJob( { 37 | 'queue' : , 38 | 'job' : , 39 | 'timeout' : , // optional defaults to 0 40 | 'replicate' : , // optional 41 | 'delay' : , // optional 42 | 'retry' : , // optional 43 | 'ttl' : , // optional 44 | 'maxlen' : , // optional 45 | 'async' : // optional defaults to false 46 | }, callback ) 47 | ``` 48 | 49 | __AUTH__ 50 | ```javascript 51 | disqueue.auth( { 52 | 'password' : 53 | }. callback ); 54 | ``` 55 | 56 | __DEL__ 57 | ```javascript 58 | disqueue.delJob( , callback ); 59 | ``` 60 | 61 | __DEQUEUE__ 62 | ```javascript 63 | disqueue.dequeue( , callback ); 64 | ``` 65 | 66 | __ENQUEUE__ 67 | ```javascript 68 | disqueue.enqueue( , callback ); 69 | ``` 70 | 71 | __FASTACK__ 72 | ```javascript 73 | disqueue.fastAck( , callback ); 74 | ``` 75 | 76 | __GETJOB__ 77 | ```javascript 78 | disqueue.getJob( { 79 | 'queue' : , // can be a string or an array of queues 80 | 'count' : , 81 | 'withcounters' : , // optional defaults to false 82 | 'nohang' : // optional defaults to false 83 | }, callback ) 84 | ``` 85 | 86 | __HELLO__ 87 | ```javascript 88 | disqueue.hello( {}, callback ); 89 | ``` 90 | 91 | __INFO__ 92 | ```javascript 93 | disqueue.info( {}, callback ); 94 | ``` 95 | 96 | __NACK__ 97 | ```javascript 98 | disqueue.nack( , callback ); 99 | ``` 100 | 101 | __QLEN__ 102 | ```javascript 103 | disqueue.qlen( , callback ); 104 | ``` 105 | 106 | __QSCAN__ 107 | ```javascript 108 | disqueue.qscan( { 109 | 'count' : int, // optional 110 | 'busyloop' : true, // optional defaults to false 111 | 'maxlen' : int, // optional 112 | 'minlen' : int, // optional 113 | 'importrate' : int // optional 114 | }, callback ) 115 | ``` 116 | 117 | __SHOW__ 118 | ```javascript 119 | disqueue.show( , callback ); 120 | ``` 121 | 122 | __WORKING__ 123 | ```javascript 124 | disqueue.working( , callback ); 125 | ``` 126 | 127 | ## Authentication 128 | To connect to disque just add password 129 | ```javascript 130 | var options = { 131 | 'auth' : { 132 | 'password' : 'gideonairex' 133 | } 134 | }; 135 | var disqueue = new Disqueue( options ); 136 | 137 | diqueue.on( 'connected', function () {} ); 138 | ``` 139 | Or you just add options and use the default port and host 140 | ```javascript 141 | var options = { 142 | 'host' : '127.0.0.1', 143 | 'port' : 7777, 144 | 'auth' : { 145 | 'password' : 'gideonairex' 146 | } 147 | }; 148 | var disqueue = new Disqueue( options ); 149 | 150 | diqueue.on( 'connected', function () {} ); 151 | ``` 152 | 153 | ## Usage 154 | ```javascript 155 | var Disqueue = require( 'disqueue-node' ); 156 | var disqueue = new Disqueue(); 157 | diqueue.on( 'connected', function () { 158 | disqueue.addJob( { 159 | 'queue' : 'test', 160 | 'job' : 'hello world' 161 | }, function ( error, addJobResult ) { 162 | } ); 163 | } ); 164 | ``` 165 | 166 | ## Test 167 | ``` 168 | npm test 169 | npm run lint 170 | ``` 171 | 172 | ## Todo 173 | 1. Complete all commands 174 | 2. Benchmark 175 | -------------------------------------------------------------------------------- /example/client.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var http = require( 'http' ); 4 | var Disqueue = require( '../lib/disqueue-client' ); 5 | 6 | var disque = new Disqueue( { 7 | //'auth' : { 8 | //'password' : 'gideonairex' 9 | //} 10 | 'retryMax' : 5, 11 | 'retryDelay' : 2000 12 | } ); 13 | 14 | disque.on( 'error', function ( error ) { 15 | console.log( error ); 16 | } ); 17 | 18 | disque.on( 'connected', function () { 19 | console.log( 'connected' ); 20 | } ); 21 | 22 | var server = http.createServer( function ( request, reply ) { 23 | disque.addJob( { 24 | 'queue' : 'test', 25 | 'job' : 'Hello world', 26 | 'delay' : 2, 27 | 'ttl' : 3 28 | }, function ( error, data ) { 29 | 30 | console.log( error ); 31 | reply.end( data ); 32 | 33 | } ); 34 | 35 | } ); 36 | 37 | server.listen( 9991 ); 38 | -------------------------------------------------------------------------------- /example/server.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Disqueue = require( '../lib/disqueue-client' ); 4 | 5 | var disque = new Disqueue( { 6 | //'auth' : { 7 | //'password' : 'gideonairex' 8 | //} 9 | } ); 10 | 11 | disque.on( 'error', function ( error ) { 12 | console.log( error ); 13 | } ); 14 | 15 | function getJob () { 16 | 17 | disque.getJob( { 18 | 'count' : 10, 19 | 'queue' : [ 'test', 'test2' ] 20 | }, function ( error, data ) { 21 | 22 | console.log( data ); 23 | var jobIds = []; 24 | 25 | if ( data ) { 26 | 27 | data.forEach( function ( job ) { 28 | disque.show( job.jobId, function ( errorDetail, jobDetail ) { 29 | console.log( jobDetail ); 30 | } ); 31 | jobIds.push( job.jobId ); 32 | } ); 33 | 34 | 35 | disque.nack( jobIds, function ( errorNack, nack ) { 36 | console.log( nack ); 37 | } ); 38 | 39 | disque.fastAck( jobIds, function ( errorFastAck, ack ) { 40 | console.log( ack ); 41 | } ); 42 | 43 | getJob(); 44 | } else { 45 | getJob(); 46 | } 47 | 48 | } ); 49 | 50 | } 51 | 52 | disque.on('connected', function () { 53 | getJob(); 54 | }); 55 | 56 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = require( './lib/disqueue-client' ); 4 | -------------------------------------------------------------------------------- /lib/command.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function ( commandMeta, args, callback ) { 4 | 5 | this.commandMeta = commandMeta; 6 | this.args = args; 7 | 8 | this.callback = callback; 9 | if ( commandMeta.decorator ) { 10 | this.callback = commandMeta.decorator( callback ); 11 | } 12 | 13 | this.collate = function ( cb ) { 14 | var command = commandMeta.handler( args ); 15 | if ( command instanceof Error ) { 16 | return cb( command ); 17 | } 18 | 19 | cb( null, command ); 20 | }; 21 | 22 | }; 23 | -------------------------------------------------------------------------------- /lib/commands-list/ack-job.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function ( jobIds ) { 4 | 5 | var command = [ 'ACKJOB' ]; 6 | 7 | if ( typeof jobIds === 'object' ) { 8 | command = command.concat( jobIds ); 9 | } else { 10 | command.push( jobIds ); 11 | } 12 | 13 | return command; 14 | 15 | }; 16 | -------------------------------------------------------------------------------- /lib/commands-list/add-job.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function ( options ) { 4 | 5 | var defaultTimeout = 0; 6 | var command = [ 'ADDJOB' ]; 7 | 8 | if ( !options.queue ) { 9 | return new Error( 'Should have a queue' ); 10 | } 11 | 12 | /** 13 | * queue 14 | * 15 | */ 16 | command.push( options.queue ); 17 | 18 | if ( !options.job ) { 19 | return new Error( 'Should have a job' ); 20 | } 21 | 22 | /** 23 | * ms-timeout 24 | * 25 | */ 26 | command.push( options.job ); 27 | command.push( options.timeout || defaultTimeout ); 28 | 29 | /** 30 | * REPLICATE 31 | * 32 | */ 33 | if ( options.replicate ) { 34 | command.push( 'REPLICATE' ); 35 | command.push( options.replicate ); 36 | } 37 | 38 | /** 39 | * DELAY 40 | * 41 | */ 42 | if ( options.delay ) { 43 | command.push( 'DELAY' ); 44 | command.push( options.delay ); 45 | } 46 | 47 | /** 48 | * RETRY 49 | * 50 | */ 51 | if ( options.retry ) { 52 | command.push( 'RETRY' ); 53 | command.push( options.retry ); 54 | } 55 | 56 | /** 57 | * TTL 58 | * 59 | */ 60 | if ( options.ttl ) { 61 | command.push( 'TTL' ); 62 | command.push( options.ttl ); 63 | } 64 | 65 | /** 66 | * MAXLEN 67 | * 68 | */ 69 | if ( options.maxlen ) { 70 | command.push( 'MAXLEN' ); 71 | command.push( options.maxlen ); 72 | } 73 | 74 | /** 75 | * ASYNC 76 | * 77 | */ 78 | if ( options.async ) { 79 | command.push( 'ASYNC' ); 80 | } 81 | 82 | return command; 83 | 84 | }; 85 | -------------------------------------------------------------------------------- /lib/commands-list/auth.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function ( options ) { 4 | 5 | return [ 'AUTH', options.password ]; 6 | 7 | }; 8 | -------------------------------------------------------------------------------- /lib/commands-list/del-job.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function ( jobIds ) { 4 | 5 | var command = [ 'DELJOB' ]; 6 | 7 | if ( typeof jobIds === 'object' ) { 8 | command = command.concat( jobIds ); 9 | } else { 10 | command.push( jobIds ); 11 | } 12 | 13 | return command; 14 | 15 | }; 16 | -------------------------------------------------------------------------------- /lib/commands-list/dequeue.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function ( jobIds ) { 4 | 5 | var command = [ 'DEQUEUE' ]; 6 | 7 | if ( typeof jobIds === 'object' ) { 8 | command = command.concat( jobIds ); 9 | } else { 10 | command.push( jobIds ); 11 | } 12 | 13 | return command; 14 | 15 | }; 16 | -------------------------------------------------------------------------------- /lib/commands-list/enqueue.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function ( jobIds ) { 4 | 5 | var command = [ 'ENQUEUE' ]; 6 | 7 | if ( typeof jobIds === 'object' ) { 8 | command = command.concat( jobIds ); 9 | } else { 10 | command.push( jobIds ); 11 | } 12 | 13 | return command; 14 | 15 | }; 16 | -------------------------------------------------------------------------------- /lib/commands-list/fast-ack.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function ( jobIds ) { 4 | 5 | var command = [ 'FASTACK' ]; 6 | 7 | if ( typeof jobIds === 'object' ) { 8 | command = command.concat( jobIds ); 9 | } else { 10 | command.push( jobIds ); 11 | } 12 | 13 | return command; 14 | 15 | }; 16 | -------------------------------------------------------------------------------- /lib/commands-list/get-job.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | /* 5 | * Command handler 6 | * 7 | */ 8 | 'handler' : function ( options ) { 9 | var queue; 10 | var defaultCount = 10; 11 | var command = [ 'GETJOB' ]; 12 | 13 | if ( options.nohang ) { 14 | command.push( 'NOHANG' ); 15 | } 16 | 17 | /** 18 | * Attach count 19 | * 20 | */ 21 | command.push( 'COUNT' ); 22 | command.push( options.count || defaultCount ); 23 | if ( options.withcounters ) { 24 | command.push( 'WITHCOUNTERS' ); 25 | } 26 | command.push( 'FROM' ); 27 | 28 | if ( typeof options.queue === 'object' ) { 29 | queue = options.queue; 30 | } else { 31 | queue = [ options.queue ]; 32 | } 33 | 34 | return command.concat( queue ); 35 | }, 36 | /* 37 | * Decorate result 38 | * 39 | */ 40 | 'decorator' : function ( callback ) { 41 | return function ( error, data ) { 42 | if ( error ) { 43 | return callback( error ); 44 | } 45 | var jobs = []; 46 | 47 | if ( !data ) { 48 | return callback( error, jobs ); 49 | } 50 | 51 | for ( var i = 0; i < data.length; ++i ) { 52 | var job = { 53 | 'queue' : data[ i ][ 0 ], 54 | 'jobId' : data[ i ][ 1 ], 55 | 'body' : data[ i ][ 2 ] 56 | }; 57 | 58 | if ( data[ i ][ 3 ] === 'nacks' ) { 59 | job.nacks = data[ i ][ 4 ]; 60 | } 61 | 62 | if ( data[ i ][ 5 ] === 'additional-deliveries' ) { 63 | job.additionalDeliveries = data[ i ][ 6 ]; 64 | } 65 | 66 | jobs.push( job ); 67 | } 68 | return callback( error, jobs ); 69 | }; 70 | } 71 | }; 72 | -------------------------------------------------------------------------------- /lib/commands-list/hello.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | /* 5 | * Command handler 6 | * 7 | */ 8 | 'handler' : function () { 9 | return [ 'HELLO' ]; 10 | }, 11 | /* 12 | * Decorate result 13 | * 14 | */ 15 | 'decorator' : function ( callback ) { 16 | return function ( error, data ) { 17 | if ( error ) { 18 | return callback( error ); 19 | } 20 | 21 | var parsedData = {}; 22 | parsedData.version = data[ 0 ]; 23 | parsedData.nodeId = data[ 1 ]; 24 | parsedData.nodeIds = data[ 2 ]; 25 | 26 | return callback( error, parsedData ); 27 | }; 28 | } 29 | }; 30 | -------------------------------------------------------------------------------- /lib/commands-list/info.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | /* 5 | * Command handler 6 | * 7 | */ 8 | 'handler' : function () { 9 | return [ 'INFO' ]; 10 | }, 11 | /* 12 | * Decorate result 13 | * 14 | */ 15 | 'decorator' : function ( callback ) { 16 | return function ( error, data ) { 17 | if ( error ) { 18 | return callback( error ); 19 | } 20 | 21 | var parsedStatus = {}; 22 | var statuses = data.split( '#' ); 23 | statuses.shift(); 24 | 25 | for ( var i = 0; i < statuses.length; ++i ) { 26 | var status = statuses[ i ]; 27 | var statusBody = status.split( '\r\n' ); 28 | 29 | // Remove excess 30 | statusBody.pop(); 31 | statusBody.pop(); 32 | var statusType = statusBody.shift().trim().toLowerCase(); 33 | parsedStatus[ statusType ] = {}; 34 | 35 | for ( var j = 0; j < statusBody.length; ++j ) { 36 | var statusTypeSub = statusBody[ j ].split( ':' ); 37 | parsedStatus[ statusType ][ statusTypeSub[ 0 ] ] = statusTypeSub[ 1 ]; 38 | } 39 | } 40 | 41 | return callback( error, parsedStatus ); 42 | }; 43 | } 44 | }; 45 | -------------------------------------------------------------------------------- /lib/commands-list/nack.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function ( jobIds ) { 4 | 5 | var command = [ 'NACK' ]; 6 | 7 | if ( typeof jobIds === 'object' ) { 8 | command = command.concat( jobIds ); 9 | } else { 10 | command.push( jobIds ); 11 | } 12 | 13 | return command; 14 | 15 | }; 16 | -------------------------------------------------------------------------------- /lib/commands-list/qlen.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function ( queue ) { 4 | 5 | return [ 'QLEN', queue ]; 6 | 7 | }; 8 | -------------------------------------------------------------------------------- /lib/commands-list/qscan.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | /* 5 | * Command handler 6 | * 7 | */ 8 | 'handler' : function ( options ) { 9 | var queue; 10 | var defaultCount = 10; 11 | var command = [ 'QSCAN' ]; 12 | 13 | /** 14 | * Attach count 15 | */ 16 | command.push( 'COUNT' ); 17 | command.push( options.count || defaultCount ); 18 | 19 | if ( options.busyloop ) { 20 | command.push( 'BUSYLOOP' ); 21 | } 22 | 23 | if ( options.minlen ) { 24 | command.push( 'MINLEN' ); 25 | command.push( parseInt( options.minlen ) ); 26 | } 27 | 28 | if ( options.maxlen ) { 29 | command.push( 'MAXLEN' ); 30 | command.push( parseInt( options.maxlen ) ); 31 | } 32 | 33 | if ( options.importrate ) { 34 | command.push( 'IMPORTRATE' ); 35 | command.push( parseInt( options.importrate ) ); 36 | } 37 | 38 | command.push( options.cursor || 0 ); 39 | 40 | return command; 41 | }, 42 | /* 43 | * Decorate result 44 | * 45 | */ 46 | 'decorator' : function ( callback ) { 47 | return function ( error, data ) { 48 | if ( error ) { 49 | return callback( error ); 50 | } 51 | 52 | var queues = {}; 53 | 54 | if ( !data ) { 55 | return callback( error, queues ); 56 | } 57 | 58 | queues.cursor = parseInt( data[ 0 ] ); 59 | queues.queues = data[ 1 ]; 60 | 61 | return callback( error, queues ); 62 | }; 63 | } 64 | }; 65 | -------------------------------------------------------------------------------- /lib/commands-list/show.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = { 4 | /* 5 | * Command handler 6 | * 7 | */ 8 | 'handler' : function ( jobId ) { 9 | return [ 'SHOW', jobId ]; 10 | }, 11 | /* 12 | * Decorate result 13 | * 14 | */ 15 | 'decorator' : function ( callback ) { 16 | return function ( error, data ) { 17 | if ( error ) { 18 | return callback( error ); 19 | } else if ( !data ) { 20 | return callback( error, null ); 21 | } 22 | var parsedResult = {}; 23 | 24 | for ( var i = 0; i < data.length; i += 2 ) { 25 | var key = data[ i ]; 26 | var value = data[ i + 1 ]; 27 | parsedResult[ key ] = value; 28 | } 29 | return callback( error, parsedResult ); 30 | }; 31 | } 32 | }; 33 | -------------------------------------------------------------------------------- /lib/commands-list/working.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | module.exports = function ( jobId ) { 4 | var command = [ 'WORKING', jobId ]; 5 | return command; 6 | }; 7 | -------------------------------------------------------------------------------- /lib/commands.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /** 4 | * To do 5 | * 'slowlog', 6 | * 'debug', 7 | * 'monitor', 8 | * 'info', 9 | * 'jscan', 10 | * 'time', 11 | * 'latency', 12 | * 'qscan', 13 | * 'qpeek', 14 | * 'config', 15 | * 'loadjob', 16 | * 'shutdown', 17 | * 'client', 18 | * 'command' 19 | */ 20 | 21 | module.exports = [ 22 | 23 | { 24 | 'command' : 'addJob', 25 | 'handler' : require( './commands-list/add-job' ) 26 | }, 27 | 28 | { 29 | 'command' : 'ackJob', 30 | 'handler' : require( './commands-list/ack-job' ) 31 | }, 32 | 33 | { 34 | 'command' : 'dequeue', 35 | 'handler' : require( './commands-list/dequeue' ) 36 | }, 37 | 38 | { 39 | 'command' : 'delJob', 40 | 'handler' : require( './commands-list/del-job' ) 41 | }, 42 | 43 | { 44 | 'command' : 'auth', 45 | 'handler' : require( './commands-list/auth' ) 46 | }, 47 | 48 | { 49 | 'command' : 'hello', 50 | 'handler' : require( './commands-list/hello' ).handler, 51 | 'decorator' : require( './commands-list/hello' ).decorator 52 | }, 53 | 54 | { 55 | 'command' : 'enqueue', 56 | 'handler' : require( './commands-list/enqueue' ) 57 | }, 58 | 59 | { 60 | 'command' : 'getJob', 61 | 'handler' : require( './commands-list/get-job' ).handler, 62 | 'decorator' : require( './commands-list/get-job' ).decorator 63 | }, 64 | 65 | { 66 | 'command' : 'nack', 67 | 'handler' : require( './commands-list/nack' ) 68 | }, 69 | 70 | { 71 | 'command' : 'fastAck', 72 | 'handler' : require( './commands-list/fast-ack' ) 73 | }, 74 | 75 | { 76 | 'command' : 'info', 77 | 'handler' : require( './commands-list/info' ).handler, 78 | 'decorator' : require( './commands-list/info' ).decorator 79 | }, 80 | 81 | { 82 | 'command' : 'qlen', 83 | 'handler' : require( './commands-list/qlen' ) 84 | }, 85 | 86 | { 87 | 'command' : 'show', 88 | 'handler' : require( './commands-list/show' ).handler, 89 | 'decorator' : require( './commands-list/show' ).decorator 90 | }, 91 | 92 | { 93 | 'command' : 'working', 94 | 'handler' : require( './commands-list/working' ) 95 | }, 96 | 97 | { 98 | 'command' : 'qscan', 99 | 'handler' : require( './commands-list/qscan' ).handler, 100 | 'decorator' : require( './commands-list/qscan' ).decorator 101 | } 102 | 103 | ]; 104 | -------------------------------------------------------------------------------- /lib/disqueue-client.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | /*eslint-disable no-constant-condition*/ 4 | 5 | var redis = require('redis'); 6 | var Parser = require( 'redis-parser' ); 7 | var Queue = require( 'double-ended-queue' ); 8 | var _ = require( 'lodash' ); 9 | var EventEmitter = require( 'events' ).EventEmitter; 10 | var util = require( 'util' ); 11 | 12 | var CommandObj = require( './command' ); 13 | var commands = require( './commands' ); 14 | 15 | /* 16 | * Default config 17 | * 18 | */ 19 | var defaultPort = 7711; 20 | var defaultHost = '127.0.0.1'; 21 | 22 | /** 23 | * Constants 24 | */ 25 | var bufStar = Buffer.from('*', 'ascii'); 26 | var bufDollar = Buffer.from('$', 'ascii'); 27 | var bufCrlf = Buffer.from('\r\n', 'ascii'); 28 | 29 | /* 30 | * Debugger 31 | * 32 | */ 33 | function debug ( message ) { 34 | 35 | if ( exports.debugMode ) { 36 | console.log( message ); 37 | } 38 | 39 | } 40 | 41 | exports.debugMode = /\bdisque\b/i.test( process.env.NODE_DEBUG ); 42 | 43 | function DisqueClient ( netOptions, options ) { 44 | 45 | debug( 'Construct disqueClient' ); 46 | 47 | var self = this; 48 | 49 | this.options = options || {}; 50 | this.initRetry(); 51 | 52 | this.connection = netOptions; 53 | this.connection.retry_strategy = function retry_strategy(strategyOptions) { 54 | if (strategyOptions.attempt > self.retryMax) { 55 | var e = new Error('retryMax exceeded'); 56 | self.onError(e); 57 | return e; 58 | } 59 | 60 | return self.retryDelay; 61 | }; 62 | 63 | this.address = [ netOptions.host, netOptions.port ].join(':'); 64 | this.commandQueue = new Queue(); 65 | 66 | this.redisClient = redis.createClient(this.connection); 67 | this.netStream = this.redisClient.stream; 68 | this.attachStreams(); 69 | 70 | } 71 | 72 | util.inherits( DisqueClient, EventEmitter ); 73 | 74 | /** 75 | * Retry configurations 76 | * 77 | */ 78 | DisqueClient.prototype.initRetry = function () { 79 | this.retryMax = this.options.retryMax || 5; 80 | this.retryDelay = this.options.retryDelay || 200; 81 | }; 82 | 83 | /** 84 | * Attach streams 85 | * 86 | */ 87 | DisqueClient.prototype.attachStreams = function () { 88 | 89 | var self = this; 90 | 91 | this.redisClient.on( 'ready', function () { 92 | self.onConnect(); 93 | }); 94 | 95 | this.redisClient.on('error', function (error) { 96 | self.onError( error ); 97 | }); 98 | 99 | this.redisClient.on( 'end', function () { 100 | self.connectionGone( 'end' ); 101 | } ); 102 | 103 | this.netStream.on( 'drain', function () { 104 | self.drain(); 105 | } ); 106 | 107 | }; 108 | 109 | /** 110 | * 'connect' 111 | * 112 | */ 113 | DisqueClient.prototype.onConnect = function () { 114 | 115 | debug( 'Connected' ); 116 | 117 | var self = this; 118 | 119 | self.initParser(); 120 | 121 | self.connected = true; 122 | self.emit('connected'); 123 | 124 | if ( self.options.auth ) { 125 | 126 | debug( 'Authenticating' ); 127 | 128 | self.auth( { 129 | 'password' : self.options.auth.password 130 | }, function ( error ) { 131 | 132 | if ( error ) { 133 | throw ( error ); 134 | } 135 | 136 | self.onReady(); 137 | 138 | } ); 139 | 140 | } else { 141 | 142 | self.onReady(); 143 | 144 | } 145 | }; 146 | 147 | /** 148 | * 'ready' 149 | * 150 | * 151 | */ 152 | DisqueClient.prototype.onReady = function () { 153 | 154 | this.ready = true; 155 | this.emit( 'ready' ); 156 | 157 | }; 158 | 159 | /** 160 | * Initialize redis-parser 161 | * 162 | */ 163 | DisqueClient.prototype.initParser = function () { 164 | 165 | debug( 'Initialize parser' ); 166 | 167 | var self = this; 168 | 169 | self.parser = new Parser( { 170 | 'return_buffers' : self.returnBuffers || false, 171 | 'returnReply' : function (reply) { 172 | self.sendReply(reply); 173 | }, 174 | 'returnError' : function (error) { 175 | self.sendError(error); 176 | } 177 | } ); 178 | 179 | self.redisClient.reply_parser = self.parser; 180 | }; 181 | 182 | /** 183 | * redis-parser error and reply handlers 184 | * 185 | */ 186 | DisqueClient.prototype.sendError = function ( error ) { 187 | 188 | var commandCreated = this.commandQueue.shift(); 189 | commandCreated.callback( error ); 190 | 191 | }; 192 | 193 | DisqueClient.prototype.sendReply = function ( reply ) { 194 | 195 | var commandCreated = this.commandQueue.shift(); 196 | commandCreated.callback( null, reply ); 197 | 198 | }; 199 | 200 | /** 201 | * send command 202 | * 203 | */ 204 | DisqueClient.prototype.sendCommand = function ( commandCreated ) { 205 | 206 | var self = this; 207 | 208 | commandCreated.collate( function ( error, collatedCommand ) { 209 | 210 | if ( error ) { 211 | return commandCreated.callback( error ); 212 | } 213 | 214 | self.commandQueue.push( commandCreated ); 215 | self.write( collatedCommand ); 216 | 217 | } ); 218 | 219 | }; 220 | 221 | /** 222 | * write 223 | * 224 | */ 225 | DisqueClient.prototype.write = function (collatedCommand) { 226 | var bufLen = Buffer.from(String(collatedCommand.length), 'ascii'); 227 | var parts = [ bufStar, bufLen, bufCrlf ]; 228 | var size = 3 + bufLen.length; 229 | 230 | for (var i = 0; i < collatedCommand.length; i++) { 231 | var arg = collatedCommand[ i ]; 232 | if (!Buffer.isBuffer(arg)) { 233 | arg = Buffer.from(String(arg)); 234 | } 235 | 236 | bufLen = Buffer.from(String(arg.length), 'ascii'); 237 | parts = parts.concat([ bufDollar, bufLen, bufCrlf, arg, bufCrlf ]); 238 | size += 5 + bufLen.length + arg.length; 239 | } 240 | 241 | this.netStream.write.apply( this.netStream, [ Buffer.concat(parts, size) ]); 242 | }; 243 | 244 | /** 245 | * 'error' 246 | * 247 | */ 248 | DisqueClient.prototype.onError = function ( error ) { 249 | 250 | debug( error ); 251 | this.emit('error', error); 252 | 253 | }; 254 | 255 | /** 256 | * create commands 257 | * 258 | */ 259 | _( commands ).forEach( function ( commandMeta ) { 260 | 261 | DisqueClient.prototype[ commandMeta.command ] = function ( options, callback ) { 262 | var commandCreated = new CommandObj( commandMeta, options, callback ); 263 | this.sendCommand( commandCreated ); 264 | }; 265 | 266 | } ); 267 | 268 | /** 269 | * 'retry' 270 | * 271 | */ 272 | var retry = function ( self ) { 273 | 274 | self.redisClient = redis.createClient(self.connection); 275 | self.netStream = self.redisClient.stream; 276 | self.attachStreams(); 277 | 278 | }; 279 | 280 | /** 281 | * 'close' or 'end' 282 | * 283 | */ 284 | DisqueClient.prototype.connectionGone = function ( reason ) { 285 | 286 | debug( [ 'Connection gone reason:', reason ].join( ' ' ) ); 287 | 288 | this.connected = false; 289 | this.ready = false; 290 | 291 | }; 292 | 293 | /** 294 | * 'drain' 295 | * 296 | */ 297 | DisqueClient.prototype.drain = function () { 298 | this.emit( 'drain' ); 299 | }; 300 | 301 | /* 302 | * Create TCP connection 303 | * 304 | */ 305 | function createConnection ( options ) { 306 | 307 | debug( 'Create connection' ); 308 | 309 | options = options || {}; 310 | 311 | var netOptions = { 312 | 'port' : options.port || defaultPort, 313 | 'host' : options.host || defaultHost 314 | }; 315 | 316 | var disqueClient = new DisqueClient( netOptions, options ); 317 | 318 | return disqueClient; 319 | 320 | } 321 | 322 | module.exports = createConnection; 323 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "disqueue-node", 3 | "version": "2.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.5.5", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", 10 | "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.0.0" 14 | } 15 | }, 16 | "@babel/highlight": { 17 | "version": "7.5.0", 18 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", 19 | "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", 20 | "dev": true, 21 | "requires": { 22 | "chalk": "^2.0.0", 23 | "esutils": "^2.0.2", 24 | "js-tokens": "^4.0.0" 25 | } 26 | }, 27 | "acorn": { 28 | "version": "6.3.0", 29 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.3.0.tgz", 30 | "integrity": "sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==", 31 | "dev": true 32 | }, 33 | "acorn-jsx": { 34 | "version": "5.0.2", 35 | "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", 36 | "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", 37 | "dev": true 38 | }, 39 | "ajv": { 40 | "version": "6.10.2", 41 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", 42 | "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", 43 | "dev": true, 44 | "requires": { 45 | "fast-deep-equal": "^2.0.1", 46 | "fast-json-stable-stringify": "^2.0.0", 47 | "json-schema-traverse": "^0.4.1", 48 | "uri-js": "^4.2.2" 49 | } 50 | }, 51 | "ansi-escapes": { 52 | "version": "3.2.0", 53 | "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", 54 | "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", 55 | "dev": true 56 | }, 57 | "ansi-regex": { 58 | "version": "3.0.0", 59 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 60 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 61 | "dev": true 62 | }, 63 | "ansi-styles": { 64 | "version": "3.2.1", 65 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 66 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 67 | "dev": true, 68 | "requires": { 69 | "color-convert": "^1.9.0" 70 | } 71 | }, 72 | "argparse": { 73 | "version": "1.0.10", 74 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 75 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 76 | "dev": true, 77 | "requires": { 78 | "sprintf-js": "~1.0.2" 79 | } 80 | }, 81 | "astral-regex": { 82 | "version": "1.0.0", 83 | "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 84 | "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", 85 | "dev": true 86 | }, 87 | "balanced-match": { 88 | "version": "1.0.0", 89 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 90 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 91 | "dev": true 92 | }, 93 | "bluebird": { 94 | "version": "3.7.0", 95 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.0.tgz", 96 | "integrity": "sha512-aBQ1FxIa7kSWCcmKHlcHFlT2jt6J/l4FzC7KcPELkOJOsPOb/bccdhmIrKDfXhwFrmc7vDoDrrepFvGqjyXGJg==" 97 | }, 98 | "brace-expansion": { 99 | "version": "1.1.11", 100 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 101 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 102 | "dev": true, 103 | "requires": { 104 | "balanced-match": "^1.0.0", 105 | "concat-map": "0.0.1" 106 | } 107 | }, 108 | "browser-stdout": { 109 | "version": "1.3.1", 110 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 111 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 112 | "dev": true 113 | }, 114 | "callsites": { 115 | "version": "3.1.0", 116 | "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", 117 | "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", 118 | "dev": true 119 | }, 120 | "chalk": { 121 | "version": "2.4.2", 122 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 123 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 124 | "dev": true, 125 | "requires": { 126 | "ansi-styles": "^3.2.1", 127 | "escape-string-regexp": "^1.0.5", 128 | "supports-color": "^5.3.0" 129 | } 130 | }, 131 | "chardet": { 132 | "version": "0.7.0", 133 | "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", 134 | "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", 135 | "dev": true 136 | }, 137 | "cli-cursor": { 138 | "version": "2.1.0", 139 | "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", 140 | "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", 141 | "dev": true, 142 | "requires": { 143 | "restore-cursor": "^2.0.0" 144 | } 145 | }, 146 | "cli-width": { 147 | "version": "2.2.0", 148 | "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", 149 | "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", 150 | "dev": true 151 | }, 152 | "color-convert": { 153 | "version": "1.9.3", 154 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 155 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 156 | "dev": true, 157 | "requires": { 158 | "color-name": "1.1.3" 159 | } 160 | }, 161 | "color-name": { 162 | "version": "1.1.3", 163 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 164 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 165 | "dev": true 166 | }, 167 | "colors": { 168 | "version": "1.4.0", 169 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 170 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" 171 | }, 172 | "commander": { 173 | "version": "2.15.1", 174 | "resolved": "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz", 175 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", 176 | "dev": true 177 | }, 178 | "concat-map": { 179 | "version": "0.0.1", 180 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 181 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 182 | "dev": true 183 | }, 184 | "cross-spawn": { 185 | "version": "6.0.5", 186 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 187 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 188 | "dev": true, 189 | "requires": { 190 | "nice-try": "^1.0.4", 191 | "path-key": "^2.0.1", 192 | "semver": "^5.5.0", 193 | "shebang-command": "^1.2.0", 194 | "which": "^1.2.9" 195 | } 196 | }, 197 | "debug": { 198 | "version": "4.1.1", 199 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 200 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 201 | "dev": true, 202 | "requires": { 203 | "ms": "^2.1.1" 204 | } 205 | }, 206 | "deep-is": { 207 | "version": "0.1.3", 208 | "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", 209 | "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", 210 | "dev": true 211 | }, 212 | "diff": { 213 | "version": "3.5.0", 214 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 215 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 216 | "dev": true 217 | }, 218 | "doctrine": { 219 | "version": "3.0.0", 220 | "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", 221 | "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", 222 | "dev": true, 223 | "requires": { 224 | "esutils": "^2.0.2" 225 | } 226 | }, 227 | "double-ended-queue": { 228 | "version": "0.9.7", 229 | "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-0.9.7.tgz", 230 | "integrity": "sha1-iuCnJl32bNw/B9zlWOlxattYarg=" 231 | }, 232 | "emoji-regex": { 233 | "version": "7.0.3", 234 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 235 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 236 | "dev": true 237 | }, 238 | "escape-string-regexp": { 239 | "version": "1.0.5", 240 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 241 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 242 | "dev": true 243 | }, 244 | "eslint": { 245 | "version": "5.16.0", 246 | "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.16.0.tgz", 247 | "integrity": "sha512-S3Rz11i7c8AA5JPv7xAH+dOyq/Cu/VXHiHXBPOU1k/JAM5dXqQPt3qcrhpHSorXmrpu2g0gkIBVXAqCpzfoZIg==", 248 | "dev": true, 249 | "requires": { 250 | "@babel/code-frame": "^7.0.0", 251 | "ajv": "^6.9.1", 252 | "chalk": "^2.1.0", 253 | "cross-spawn": "^6.0.5", 254 | "debug": "^4.0.1", 255 | "doctrine": "^3.0.0", 256 | "eslint-scope": "^4.0.3", 257 | "eslint-utils": "^1.3.1", 258 | "eslint-visitor-keys": "^1.0.0", 259 | "espree": "^5.0.1", 260 | "esquery": "^1.0.1", 261 | "esutils": "^2.0.2", 262 | "file-entry-cache": "^5.0.1", 263 | "functional-red-black-tree": "^1.0.1", 264 | "glob": "^7.1.2", 265 | "globals": "^11.7.0", 266 | "ignore": "^4.0.6", 267 | "import-fresh": "^3.0.0", 268 | "imurmurhash": "^0.1.4", 269 | "inquirer": "^6.2.2", 270 | "js-yaml": "^3.13.0", 271 | "json-stable-stringify-without-jsonify": "^1.0.1", 272 | "levn": "^0.3.0", 273 | "lodash": "^4.17.11", 274 | "minimatch": "^3.0.4", 275 | "mkdirp": "^0.5.1", 276 | "natural-compare": "^1.4.0", 277 | "optionator": "^0.8.2", 278 | "path-is-inside": "^1.0.2", 279 | "progress": "^2.0.0", 280 | "regexpp": "^2.0.1", 281 | "semver": "^5.5.1", 282 | "strip-ansi": "^4.0.0", 283 | "strip-json-comments": "^2.0.1", 284 | "table": "^5.2.3", 285 | "text-table": "^0.2.0" 286 | } 287 | }, 288 | "eslint-scope": { 289 | "version": "4.0.3", 290 | "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", 291 | "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", 292 | "dev": true, 293 | "requires": { 294 | "esrecurse": "^4.1.0", 295 | "estraverse": "^4.1.1" 296 | } 297 | }, 298 | "eslint-utils": { 299 | "version": "1.4.2", 300 | "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", 301 | "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", 302 | "dev": true, 303 | "requires": { 304 | "eslint-visitor-keys": "^1.0.0" 305 | } 306 | }, 307 | "eslint-visitor-keys": { 308 | "version": "1.1.0", 309 | "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", 310 | "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", 311 | "dev": true 312 | }, 313 | "espree": { 314 | "version": "5.0.1", 315 | "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.1.tgz", 316 | "integrity": "sha512-qWAZcWh4XE/RwzLJejfcofscgMc9CamR6Tn1+XRXNzrvUSSbiAjGOI/fggztjIi7y9VLPqnICMIPiGyr8JaZ0A==", 317 | "dev": true, 318 | "requires": { 319 | "acorn": "^6.0.7", 320 | "acorn-jsx": "^5.0.0", 321 | "eslint-visitor-keys": "^1.0.0" 322 | } 323 | }, 324 | "esprima": { 325 | "version": "4.0.1", 326 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 327 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 328 | "dev": true 329 | }, 330 | "esquery": { 331 | "version": "1.0.1", 332 | "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", 333 | "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", 334 | "dev": true, 335 | "requires": { 336 | "estraverse": "^4.0.0" 337 | } 338 | }, 339 | "esrecurse": { 340 | "version": "4.2.1", 341 | "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", 342 | "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", 343 | "dev": true, 344 | "requires": { 345 | "estraverse": "^4.1.0" 346 | } 347 | }, 348 | "estraverse": { 349 | "version": "4.3.0", 350 | "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", 351 | "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", 352 | "dev": true 353 | }, 354 | "esutils": { 355 | "version": "2.0.3", 356 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", 357 | "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 358 | "dev": true 359 | }, 360 | "external-editor": { 361 | "version": "3.1.0", 362 | "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", 363 | "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", 364 | "dev": true, 365 | "requires": { 366 | "chardet": "^0.7.0", 367 | "iconv-lite": "^0.4.24", 368 | "tmp": "^0.0.33" 369 | } 370 | }, 371 | "fast-deep-equal": { 372 | "version": "2.0.1", 373 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 374 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 375 | "dev": true 376 | }, 377 | "fast-json-stable-stringify": { 378 | "version": "2.0.0", 379 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 380 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 381 | "dev": true 382 | }, 383 | "fast-levenshtein": { 384 | "version": "2.0.6", 385 | "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", 386 | "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", 387 | "dev": true 388 | }, 389 | "figures": { 390 | "version": "2.0.0", 391 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 392 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 393 | "dev": true, 394 | "requires": { 395 | "escape-string-regexp": "^1.0.5" 396 | } 397 | }, 398 | "file-entry-cache": { 399 | "version": "5.0.1", 400 | "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 401 | "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", 402 | "dev": true, 403 | "requires": { 404 | "flat-cache": "^2.0.1" 405 | } 406 | }, 407 | "flat-cache": { 408 | "version": "2.0.1", 409 | "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", 410 | "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", 411 | "dev": true, 412 | "requires": { 413 | "flatted": "^2.0.0", 414 | "rimraf": "2.6.3", 415 | "write": "1.0.3" 416 | } 417 | }, 418 | "flatted": { 419 | "version": "2.0.1", 420 | "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", 421 | "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", 422 | "dev": true 423 | }, 424 | "fs.realpath": { 425 | "version": "1.0.0", 426 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 427 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 428 | "dev": true 429 | }, 430 | "functional-red-black-tree": { 431 | "version": "1.0.1", 432 | "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", 433 | "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", 434 | "dev": true 435 | }, 436 | "glob": { 437 | "version": "7.1.4", 438 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 439 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 440 | "dev": true, 441 | "requires": { 442 | "fs.realpath": "^1.0.0", 443 | "inflight": "^1.0.4", 444 | "inherits": "2", 445 | "minimatch": "^3.0.4", 446 | "once": "^1.3.0", 447 | "path-is-absolute": "^1.0.0" 448 | } 449 | }, 450 | "globals": { 451 | "version": "11.12.0", 452 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", 453 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", 454 | "dev": true 455 | }, 456 | "growl": { 457 | "version": "1.10.5", 458 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 459 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 460 | "dev": true 461 | }, 462 | "has-flag": { 463 | "version": "3.0.0", 464 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 465 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 466 | "dev": true 467 | }, 468 | "he": { 469 | "version": "1.1.1", 470 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 471 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 472 | "dev": true 473 | }, 474 | "iconv-lite": { 475 | "version": "0.4.24", 476 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 477 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 478 | "dev": true, 479 | "requires": { 480 | "safer-buffer": ">= 2.1.2 < 3" 481 | } 482 | }, 483 | "ignore": { 484 | "version": "4.0.6", 485 | "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 486 | "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", 487 | "dev": true 488 | }, 489 | "import-fresh": { 490 | "version": "3.1.0", 491 | "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", 492 | "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", 493 | "dev": true, 494 | "requires": { 495 | "parent-module": "^1.0.0", 496 | "resolve-from": "^4.0.0" 497 | } 498 | }, 499 | "imurmurhash": { 500 | "version": "0.1.4", 501 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 502 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", 503 | "dev": true 504 | }, 505 | "inflight": { 506 | "version": "1.0.6", 507 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 508 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 509 | "dev": true, 510 | "requires": { 511 | "once": "^1.3.0", 512 | "wrappy": "1" 513 | } 514 | }, 515 | "inherits": { 516 | "version": "2.0.3", 517 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 518 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 519 | "dev": true 520 | }, 521 | "inquirer": { 522 | "version": "6.5.2", 523 | "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", 524 | "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", 525 | "dev": true, 526 | "requires": { 527 | "ansi-escapes": "^3.2.0", 528 | "chalk": "^2.4.2", 529 | "cli-cursor": "^2.1.0", 530 | "cli-width": "^2.0.0", 531 | "external-editor": "^3.0.3", 532 | "figures": "^2.0.0", 533 | "lodash": "^4.17.12", 534 | "mute-stream": "0.0.7", 535 | "run-async": "^2.2.0", 536 | "rxjs": "^6.4.0", 537 | "string-width": "^2.1.0", 538 | "strip-ansi": "^5.1.0", 539 | "through": "^2.3.6" 540 | }, 541 | "dependencies": { 542 | "ansi-regex": { 543 | "version": "4.1.0", 544 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 545 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 546 | "dev": true 547 | }, 548 | "strip-ansi": { 549 | "version": "5.2.0", 550 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 551 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 552 | "dev": true, 553 | "requires": { 554 | "ansi-regex": "^4.1.0" 555 | } 556 | } 557 | } 558 | }, 559 | "is-fullwidth-code-point": { 560 | "version": "2.0.0", 561 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 562 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 563 | "dev": true 564 | }, 565 | "is-promise": { 566 | "version": "2.1.0", 567 | "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", 568 | "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", 569 | "dev": true 570 | }, 571 | "isexe": { 572 | "version": "2.0.0", 573 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 574 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 575 | "dev": true 576 | }, 577 | "js-tokens": { 578 | "version": "4.0.0", 579 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 580 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 581 | "dev": true 582 | }, 583 | "js-yaml": { 584 | "version": "3.13.1", 585 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 586 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 587 | "dev": true, 588 | "requires": { 589 | "argparse": "^1.0.7", 590 | "esprima": "^4.0.0" 591 | } 592 | }, 593 | "json-schema-traverse": { 594 | "version": "0.4.1", 595 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 596 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 597 | "dev": true 598 | }, 599 | "json-stable-stringify-without-jsonify": { 600 | "version": "1.0.1", 601 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 602 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", 603 | "dev": true 604 | }, 605 | "levn": { 606 | "version": "0.3.0", 607 | "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", 608 | "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", 609 | "dev": true, 610 | "requires": { 611 | "prelude-ls": "~1.1.2", 612 | "type-check": "~0.3.2" 613 | } 614 | }, 615 | "lodash": { 616 | "version": "4.17.15", 617 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 618 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 619 | }, 620 | "mimic-fn": { 621 | "version": "1.2.0", 622 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 623 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", 624 | "dev": true 625 | }, 626 | "minimatch": { 627 | "version": "3.0.4", 628 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 629 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 630 | "dev": true, 631 | "requires": { 632 | "brace-expansion": "^1.1.7" 633 | } 634 | }, 635 | "minimist": { 636 | "version": "0.0.8", 637 | "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 638 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 639 | "dev": true 640 | }, 641 | "mkdirp": { 642 | "version": "0.5.1", 643 | "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 644 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 645 | "dev": true, 646 | "requires": { 647 | "minimist": "0.0.8" 648 | } 649 | }, 650 | "mocha": { 651 | "version": "5.2.0", 652 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", 653 | "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", 654 | "dev": true, 655 | "requires": { 656 | "browser-stdout": "1.3.1", 657 | "commander": "2.15.1", 658 | "debug": "3.1.0", 659 | "diff": "3.5.0", 660 | "escape-string-regexp": "1.0.5", 661 | "glob": "7.1.2", 662 | "growl": "1.10.5", 663 | "he": "1.1.1", 664 | "minimatch": "3.0.4", 665 | "mkdirp": "0.5.1", 666 | "supports-color": "5.4.0" 667 | }, 668 | "dependencies": { 669 | "debug": { 670 | "version": "3.1.0", 671 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 672 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 673 | "dev": true, 674 | "requires": { 675 | "ms": "2.0.0" 676 | } 677 | }, 678 | "glob": { 679 | "version": "7.1.2", 680 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 681 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 682 | "dev": true, 683 | "requires": { 684 | "fs.realpath": "^1.0.0", 685 | "inflight": "^1.0.4", 686 | "inherits": "2", 687 | "minimatch": "^3.0.4", 688 | "once": "^1.3.0", 689 | "path-is-absolute": "^1.0.0" 690 | } 691 | }, 692 | "ms": { 693 | "version": "2.0.0", 694 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 695 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 696 | "dev": true 697 | }, 698 | "supports-color": { 699 | "version": "5.4.0", 700 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 701 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 702 | "dev": true, 703 | "requires": { 704 | "has-flag": "^3.0.0" 705 | } 706 | } 707 | } 708 | }, 709 | "ms": { 710 | "version": "2.1.2", 711 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 712 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", 713 | "dev": true 714 | }, 715 | "mute-stream": { 716 | "version": "0.0.7", 717 | "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", 718 | "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", 719 | "dev": true 720 | }, 721 | "natural-compare": { 722 | "version": "1.4.0", 723 | "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", 724 | "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 725 | "dev": true 726 | }, 727 | "nice-try": { 728 | "version": "1.0.5", 729 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 730 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", 731 | "dev": true 732 | }, 733 | "once": { 734 | "version": "1.4.0", 735 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 736 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 737 | "dev": true, 738 | "requires": { 739 | "wrappy": "1" 740 | } 741 | }, 742 | "onetime": { 743 | "version": "2.0.1", 744 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", 745 | "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", 746 | "dev": true, 747 | "requires": { 748 | "mimic-fn": "^1.0.0" 749 | } 750 | }, 751 | "optionator": { 752 | "version": "0.8.2", 753 | "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", 754 | "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", 755 | "dev": true, 756 | "requires": { 757 | "deep-is": "~0.1.3", 758 | "fast-levenshtein": "~2.0.4", 759 | "levn": "~0.3.0", 760 | "prelude-ls": "~1.1.2", 761 | "type-check": "~0.3.2", 762 | "wordwrap": "~1.0.0" 763 | } 764 | }, 765 | "os-tmpdir": { 766 | "version": "1.0.2", 767 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 768 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", 769 | "dev": true 770 | }, 771 | "parent-module": { 772 | "version": "1.0.1", 773 | "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", 774 | "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", 775 | "dev": true, 776 | "requires": { 777 | "callsites": "^3.0.0" 778 | } 779 | }, 780 | "path-is-absolute": { 781 | "version": "1.0.1", 782 | "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 783 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 784 | "dev": true 785 | }, 786 | "path-is-inside": { 787 | "version": "1.0.2", 788 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 789 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", 790 | "dev": true 791 | }, 792 | "path-key": { 793 | "version": "2.0.1", 794 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 795 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", 796 | "dev": true 797 | }, 798 | "prelude-ls": { 799 | "version": "1.1.2", 800 | "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", 801 | "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", 802 | "dev": true 803 | }, 804 | "progress": { 805 | "version": "2.0.3", 806 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 807 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 808 | "dev": true 809 | }, 810 | "punycode": { 811 | "version": "2.1.1", 812 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 813 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 814 | "dev": true 815 | }, 816 | "redis": { 817 | "version": "2.8.0", 818 | "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", 819 | "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", 820 | "requires": { 821 | "double-ended-queue": "^2.1.0-0", 822 | "redis-commands": "^1.2.0", 823 | "redis-parser": "^2.6.0" 824 | }, 825 | "dependencies": { 826 | "double-ended-queue": { 827 | "version": "2.1.0-0", 828 | "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", 829 | "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=" 830 | }, 831 | "redis-parser": { 832 | "version": "2.6.0", 833 | "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", 834 | "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=" 835 | } 836 | } 837 | }, 838 | "redis-commands": { 839 | "version": "1.4.0", 840 | "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.4.0.tgz", 841 | "integrity": "sha512-cu8EF+MtkwI4DLIT0x9P8qNTLFhQD4jLfxLR0cCNkeGzs87FN6879JOJwNQR/1zD7aSYNbU0hgsV9zGY71Itvw==" 842 | }, 843 | "redis-errors": { 844 | "version": "1.2.0", 845 | "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", 846 | "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" 847 | }, 848 | "redis-parser": { 849 | "version": "3.0.0", 850 | "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", 851 | "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", 852 | "requires": { 853 | "redis-errors": "^1.0.0" 854 | } 855 | }, 856 | "regexpp": { 857 | "version": "2.0.1", 858 | "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", 859 | "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", 860 | "dev": true 861 | }, 862 | "resolve-from": { 863 | "version": "4.0.0", 864 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 865 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 866 | "dev": true 867 | }, 868 | "restore-cursor": { 869 | "version": "2.0.0", 870 | "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", 871 | "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", 872 | "dev": true, 873 | "requires": { 874 | "onetime": "^2.0.0", 875 | "signal-exit": "^3.0.2" 876 | } 877 | }, 878 | "rimraf": { 879 | "version": "2.6.3", 880 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 881 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 882 | "dev": true, 883 | "requires": { 884 | "glob": "^7.1.3" 885 | } 886 | }, 887 | "run-async": { 888 | "version": "2.3.0", 889 | "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", 890 | "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", 891 | "dev": true, 892 | "requires": { 893 | "is-promise": "^2.1.0" 894 | } 895 | }, 896 | "rxjs": { 897 | "version": "6.5.3", 898 | "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.3.tgz", 899 | "integrity": "sha512-wuYsAYYFdWTAnAaPoKGNhfpWwKZbJW+HgAJ+mImp+Epl7BG8oNWBCTyRM8gba9k4lk8BgWdoYm21Mo/RYhhbgA==", 900 | "dev": true, 901 | "requires": { 902 | "tslib": "^1.9.0" 903 | } 904 | }, 905 | "safer-buffer": { 906 | "version": "2.1.2", 907 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 908 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 909 | "dev": true 910 | }, 911 | "semver": { 912 | "version": "5.7.1", 913 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 914 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 915 | "dev": true 916 | }, 917 | "shebang-command": { 918 | "version": "1.2.0", 919 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 920 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 921 | "dev": true, 922 | "requires": { 923 | "shebang-regex": "^1.0.0" 924 | } 925 | }, 926 | "shebang-regex": { 927 | "version": "1.0.0", 928 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 929 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", 930 | "dev": true 931 | }, 932 | "should": { 933 | "version": "7.1.1", 934 | "resolved": "https://registry.npmjs.org/should/-/should-7.1.1.tgz", 935 | "integrity": "sha1-ZGTEi298Hh8YrASDV4+i3VXCxuA=", 936 | "dev": true, 937 | "requires": { 938 | "should-equal": "0.5.0", 939 | "should-format": "0.3.1", 940 | "should-type": "0.2.0" 941 | } 942 | }, 943 | "should-equal": { 944 | "version": "0.5.0", 945 | "resolved": "http://registry.npmjs.org/should-equal/-/should-equal-0.5.0.tgz", 946 | "integrity": "sha1-x5fxNfMGf+tp6+zbMGscP+IbPm8=", 947 | "dev": true, 948 | "requires": { 949 | "should-type": "0.2.0" 950 | } 951 | }, 952 | "should-format": { 953 | "version": "0.3.1", 954 | "resolved": "https://registry.npmjs.org/should-format/-/should-format-0.3.1.tgz", 955 | "integrity": "sha1-LLt4JGFnCs5CkrKx7EaNuM+Z4zA=", 956 | "dev": true, 957 | "requires": { 958 | "should-type": "0.2.0" 959 | } 960 | }, 961 | "should-type": { 962 | "version": "0.2.0", 963 | "resolved": "https://registry.npmjs.org/should-type/-/should-type-0.2.0.tgz", 964 | "integrity": "sha1-ZwfvlVKdmJ3MCY/gdTqx+RNrt/Y=", 965 | "dev": true 966 | }, 967 | "signal-exit": { 968 | "version": "3.0.2", 969 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 970 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", 971 | "dev": true 972 | }, 973 | "slice-ansi": { 974 | "version": "2.1.0", 975 | "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 976 | "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", 977 | "dev": true, 978 | "requires": { 979 | "ansi-styles": "^3.2.0", 980 | "astral-regex": "^1.0.0", 981 | "is-fullwidth-code-point": "^2.0.0" 982 | } 983 | }, 984 | "sprintf-js": { 985 | "version": "1.0.3", 986 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 987 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 988 | "dev": true 989 | }, 990 | "string-width": { 991 | "version": "2.1.1", 992 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 993 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 994 | "dev": true, 995 | "requires": { 996 | "is-fullwidth-code-point": "^2.0.0", 997 | "strip-ansi": "^4.0.0" 998 | } 999 | }, 1000 | "strip-ansi": { 1001 | "version": "4.0.0", 1002 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1003 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1004 | "dev": true, 1005 | "requires": { 1006 | "ansi-regex": "^3.0.0" 1007 | } 1008 | }, 1009 | "strip-json-comments": { 1010 | "version": "2.0.1", 1011 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1012 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1013 | "dev": true 1014 | }, 1015 | "supports-color": { 1016 | "version": "5.5.0", 1017 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 1018 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 1019 | "dev": true, 1020 | "requires": { 1021 | "has-flag": "^3.0.0" 1022 | } 1023 | }, 1024 | "table": { 1025 | "version": "5.4.6", 1026 | "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", 1027 | "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", 1028 | "dev": true, 1029 | "requires": { 1030 | "ajv": "^6.10.2", 1031 | "lodash": "^4.17.14", 1032 | "slice-ansi": "^2.1.0", 1033 | "string-width": "^3.0.0" 1034 | }, 1035 | "dependencies": { 1036 | "ansi-regex": { 1037 | "version": "4.1.0", 1038 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1039 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 1040 | "dev": true 1041 | }, 1042 | "string-width": { 1043 | "version": "3.1.0", 1044 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1045 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1046 | "dev": true, 1047 | "requires": { 1048 | "emoji-regex": "^7.0.1", 1049 | "is-fullwidth-code-point": "^2.0.0", 1050 | "strip-ansi": "^5.1.0" 1051 | } 1052 | }, 1053 | "strip-ansi": { 1054 | "version": "5.2.0", 1055 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1056 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1057 | "dev": true, 1058 | "requires": { 1059 | "ansi-regex": "^4.1.0" 1060 | } 1061 | } 1062 | } 1063 | }, 1064 | "text-table": { 1065 | "version": "0.2.0", 1066 | "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", 1067 | "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 1068 | "dev": true 1069 | }, 1070 | "through": { 1071 | "version": "2.3.8", 1072 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 1073 | "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", 1074 | "dev": true 1075 | }, 1076 | "tmp": { 1077 | "version": "0.0.33", 1078 | "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", 1079 | "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", 1080 | "dev": true, 1081 | "requires": { 1082 | "os-tmpdir": "~1.0.2" 1083 | } 1084 | }, 1085 | "tslib": { 1086 | "version": "1.10.0", 1087 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", 1088 | "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", 1089 | "dev": true 1090 | }, 1091 | "type-check": { 1092 | "version": "0.3.2", 1093 | "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", 1094 | "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", 1095 | "dev": true, 1096 | "requires": { 1097 | "prelude-ls": "~1.1.2" 1098 | } 1099 | }, 1100 | "uri-js": { 1101 | "version": "4.2.2", 1102 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1103 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1104 | "dev": true, 1105 | "requires": { 1106 | "punycode": "^2.1.0" 1107 | } 1108 | }, 1109 | "uuid": { 1110 | "version": "3.3.3", 1111 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", 1112 | "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" 1113 | }, 1114 | "which": { 1115 | "version": "1.3.1", 1116 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1117 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1118 | "dev": true, 1119 | "requires": { 1120 | "isexe": "^2.0.0" 1121 | } 1122 | }, 1123 | "wordwrap": { 1124 | "version": "1.0.0", 1125 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", 1126 | "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", 1127 | "dev": true 1128 | }, 1129 | "wrappy": { 1130 | "version": "1.0.2", 1131 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1132 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 1133 | "dev": true 1134 | }, 1135 | "write": { 1136 | "version": "1.0.3", 1137 | "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", 1138 | "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", 1139 | "dev": true, 1140 | "requires": { 1141 | "mkdirp": "^0.5.1" 1142 | } 1143 | } 1144 | } 1145 | } 1146 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "disqueue-node", 3 | "version": "2.0.2", 4 | "description": "node.js client for disque ( rpc )", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "mocha", 8 | "lint": "./scripts/eslint.sh", 9 | "eslint": "eslint", 10 | "mocha": "mocha" 11 | }, 12 | "repository": { 13 | "type": "git", 14 | "url": "git+ssh://git@github.com/gideonairex/disqueue-node.git" 15 | }, 16 | "keywords": [ 17 | "node.js", 18 | "client", 19 | "disque", 20 | "rpc" 21 | ], 22 | "author": "Gideon Rosales", 23 | "license": "MIT", 24 | "dependencies": { 25 | "bluebird": "^3.7.0", 26 | "colors": "^1.4.0", 27 | "double-ended-queue": "^0.9.7", 28 | "lodash": "^4.17.15", 29 | "redis": "^2.8.0", 30 | "redis-parser": "^3.0.0", 31 | "uuid": "^3.3.3" 32 | }, 33 | "devDependencies": { 34 | "eslint": "^5.16.0", 35 | "mocha": "^5.2.0", 36 | "should": "^7.1.1" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /scripts/eslint.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | npm run eslint -- --quiet --eslintrc ./ 4 | -------------------------------------------------------------------------------- /test/commands-list/ack-job.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Disqueue = require( '../../' ); 4 | 5 | require( 'should' ); 6 | 7 | describe( '"ACKJOB"', function () { 8 | describe( 'successful ackJob', function () { 9 | var disqueue; 10 | var data; 11 | 12 | before( function ( done ) { 13 | disqueue = new Disqueue(); 14 | disqueue.on( 'connected', function () { 15 | done(); 16 | } ); 17 | } ); 18 | 19 | before( function ( done ) { 20 | disqueue.addJob( { 21 | 'queue' : 'ack-job-test', 22 | 'job' : 'Hello world' 23 | }, function ( error, result ) { 24 | disqueue.ackJob( result, function ( errorAckJob, resultAckJob ) { 25 | data = resultAckJob; 26 | done(); 27 | } ); 28 | } ); 29 | } ); 30 | 31 | it( 'should return true', function () { 32 | data.should.equal( 1 ); 33 | } ); 34 | } ); 35 | } ); 36 | -------------------------------------------------------------------------------- /test/commands-list/add-job.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Disqueue = require( '../../' ); 4 | 5 | describe( '"ADDJOB"', function () { 6 | describe( 'successful addJob', function () { 7 | var disqueue; 8 | var data; 9 | 10 | before( function ( done ) { 11 | disqueue = new Disqueue(); 12 | disqueue.on( 'connected', function () { 13 | done(); 14 | } ); 15 | } ); 16 | 17 | before( function ( done ) { 18 | disqueue.addJob( { 19 | 'queue' : 'test', 20 | 'job' : 'Hello world' 21 | }, function ( error, result ) { 22 | data = result; 23 | done(); 24 | } ); 25 | } ); 26 | 27 | it( 'should return object', function () { 28 | data.length.should.equal( 40 ); 29 | } ); 30 | } ); 31 | 32 | describe( 'fail addJob', function () { 33 | var disqueue; 34 | var errorObj; 35 | 36 | before( function ( done ) { 37 | disqueue = new Disqueue(); 38 | disqueue.on( 'connected', function () { 39 | done(); 40 | } ); 41 | } ); 42 | 43 | before( function ( done ) { 44 | disqueue.addJob( {}, function ( error ) { 45 | errorObj = error; 46 | done(); 47 | } ); 48 | } ); 49 | 50 | it( 'should return object', function () { 51 | errorObj.message.should.equal( 'Should have a queue' ); 52 | } ); 53 | } ); 54 | } ); 55 | -------------------------------------------------------------------------------- /test/commands-list/del-job.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Disqueue = require( '../../' ); 4 | 5 | require( 'should' ); 6 | 7 | describe( '"DELJOB"', function () { 8 | describe( 'successful delJob', function () { 9 | var disqueue; 10 | var data; 11 | 12 | before( function ( done ) { 13 | disqueue = new Disqueue(); 14 | disqueue.on( 'connected', function () { 15 | done(); 16 | } ); 17 | } ); 18 | 19 | before( function ( done ) { 20 | disqueue.addJob( { 21 | 'queue' : 'del-job-test', 22 | 'job' : 'Hello world' 23 | }, function ( error, result ) { 24 | disqueue.delJob( result, function ( errorDeleteJob, resultDeleteJob ) { 25 | data = resultDeleteJob; 26 | done(); 27 | } ); 28 | } ); 29 | } ); 30 | 31 | it( 'should return true', function () { 32 | data.should.equal( 1 ); 33 | } ); 34 | } ); 35 | } ); 36 | -------------------------------------------------------------------------------- /test/commands-list/dequeue.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Disqueue = require( '../../' ); 4 | 5 | require( 'should' ); 6 | 7 | describe( '"DEQUEUE"', function () { 8 | describe( 'successful dequeue', function () { 9 | var disqueue; 10 | var data; 11 | 12 | before( function ( done ) { 13 | disqueue = new Disqueue(); 14 | disqueue.on( 'connected', function () { 15 | done(); 16 | } ); 17 | } ); 18 | 19 | before( function ( done ) { 20 | disqueue.addJob( { 21 | 'queue' : 'dequeue-job-test', 22 | 'job' : 'Hello world 1' 23 | }, function ( error1, result1 ) { 24 | disqueue.addJob( { 25 | 'queue' : 'dequeue-job-test', 26 | 'job' : 'Hello world 2' 27 | }, function ( error2, result2 ) { 28 | disqueue.dequeue( [ result1, result2 ], function ( errorDeleteJob, resultDequeueJob ) { 29 | data = resultDequeueJob; 30 | done(); 31 | } ); 32 | } ); 33 | } ); 34 | } ); 35 | 36 | it( 'should return 2', function () { 37 | data.should.equal( 2 ); 38 | } ); 39 | } ); 40 | } ); 41 | -------------------------------------------------------------------------------- /test/commands-list/enqueue.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Disqueue = require( '../../' ); 4 | 5 | require( 'should' ); 6 | 7 | describe( '"ENQUEUE"', function () { 8 | describe( 'successful enqueue', function () { 9 | var disqueue; 10 | var data; 11 | 12 | before( function ( done ) { 13 | disqueue = new Disqueue(); 14 | disqueue.on( 'connected', function () { 15 | done(); 16 | } ); 17 | } ); 18 | 19 | before( function ( done ) { 20 | disqueue.addJob( { 21 | 'queue' : 'enqueue-job-test', 22 | 'job' : 'Hello world 1' 23 | }, function ( error, result1 ) { 24 | disqueue.dequeue( [ result1 ], function () { 25 | disqueue.enqueue( [ result1 ], function ( errorEnqueue, resultEnqueueJob ) { 26 | data = resultEnqueueJob; 27 | done(); 28 | } ); 29 | } ); 30 | } ); 31 | } ); 32 | 33 | it( 'should return 1', function () { 34 | data.should.equal( 1 ); 35 | } ); 36 | } ); 37 | } ); 38 | -------------------------------------------------------------------------------- /test/commands-list/fast-ack.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Disqueue = require( '../../' ); 4 | 5 | require( 'should' ); 6 | 7 | describe( '"FASTACK"', function () { 8 | describe( 'successful ackJob', function () { 9 | var disqueue; 10 | var data; 11 | 12 | before( function ( done ) { 13 | disqueue = new Disqueue(); 14 | disqueue.on( 'connected', function () { 15 | done(); 16 | } ); 17 | } ); 18 | 19 | before( function ( done ) { 20 | disqueue.addJob( { 21 | 'queue' : 'fast-ack-job-test', 22 | 'job' : 'Hello world' 23 | }, function ( error, result ) { 24 | disqueue.fastAck( result, function ( errorFastAckJob, resultFastAckJob ) { 25 | data = resultFastAckJob; 26 | done(); 27 | } ); 28 | } ); 29 | } ); 30 | 31 | it( 'should return true', function () { 32 | data.should.equal( 1 ); 33 | } ); 34 | } ); 35 | } ); 36 | -------------------------------------------------------------------------------- /test/commands-list/get-job.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Disqueue = require( '../../' ); 4 | 5 | require( 'should' ); 6 | 7 | describe( '"GETJOB"', function () { 8 | describe( 'successful getJob', function () { 9 | var disqueue; 10 | var data; 11 | 12 | before( function ( done ) { 13 | disqueue = new Disqueue(); 14 | disqueue.on( 'connected', function () { 15 | done(); 16 | } ); 17 | } ); 18 | 19 | before( function ( done ) { 20 | disqueue.addJob( { 21 | 'queue' : 'get-job-test', 22 | 'job' : 'Hello world' 23 | }, function () { 24 | disqueue.getJob( { 25 | 'count' : 10, 26 | 'queue' : 'get-job-test' 27 | }, function ( errorGetJob, resultGetJob ) { 28 | data = resultGetJob; 29 | done(); 30 | } ); 31 | } ); 32 | } ); 33 | 34 | it( 'should return object', function () { 35 | for ( var i = 0; i < data.length; ++i ) { 36 | data[ i ].should.have.property( 'queue' ).and.be.instanceof( String ); 37 | data[ i ].should.have.property( 'jobId' ).and.be.instanceof( String ); 38 | data[ i ].should.have.property( 'body' ).and.be.instanceof( String ); 39 | } 40 | } ); 41 | } ); 42 | 43 | describe( 'successful getJob with counters', function () { 44 | var disqueue; 45 | var data; 46 | 47 | before( function ( done ) { 48 | disqueue = new Disqueue(); 49 | disqueue.on( 'connected', function () { 50 | done(); 51 | } ); 52 | } ); 53 | 54 | before( function ( done ) { 55 | disqueue.addJob( { 56 | 'queue' : 'get-job-withcounters-test', 57 | 'job' : 'Hello world' 58 | }, function () { 59 | disqueue.getJob( { 60 | 'count' : 10, 61 | 'queue' : 'get-job-withcounters-test', 62 | 'withcounters' : true 63 | }, function ( errorGetJob, resultGetJob ) { 64 | data = resultGetJob; 65 | done(); 66 | } ); 67 | } ); 68 | } ); 69 | 70 | it( 'should return object', function () { 71 | for ( var i = 0; i < data.length; ++i ) { 72 | data[ i ].should.have.property( 'queue' ).and.be.instanceof( String ); 73 | data[ i ].should.have.property( 'jobId' ).and.be.instanceof( String ); 74 | data[ i ].should.have.property( 'body' ).and.be.instanceof( String ); 75 | data[ i ].should.have.property( 'nacks' ).and.be.instanceof( Number ); 76 | data[ i ].should.have.property( 'additionalDeliveries' ).and.be.instanceof( Number ); 77 | } 78 | } ); 79 | } ); 80 | 81 | describe( 'no data in queue', function () { 82 | var disqueue; 83 | var data; 84 | 85 | before( function ( done ) { 86 | disqueue = new Disqueue(); 87 | disqueue.on( 'connected', function () { 88 | done(); 89 | } ); 90 | } ); 91 | 92 | before( function ( done ) { 93 | disqueue.getJob( { 94 | 'count' : 10, 95 | 'queue' : 'get-job-withoutdata-test', 96 | 'withcounters' : true, 97 | 'nohang' : true 98 | }, function ( errorGetJob, resultGetJob ) { 99 | data = resultGetJob; 100 | done(); 101 | } ); 102 | } ); 103 | 104 | it( 'should return empty array', function () { 105 | data.length.should.equal( 0 ); 106 | } ); 107 | } ); 108 | } ); 109 | -------------------------------------------------------------------------------- /test/commands-list/hello.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Disqueue = require( '../../' ); 4 | 5 | describe( '"HELLO"', function () { 6 | describe( 'successful get hello', function () { 7 | var disqueue; 8 | var data; 9 | 10 | before( function ( done ) { 11 | disqueue = new Disqueue(); 12 | disqueue.on( 'connected', function () { 13 | done(); 14 | } ); 15 | } ); 16 | 17 | before( function ( done ) { 18 | disqueue.hello( {}, function ( disqueueError, result ) { 19 | data = result; 20 | done(); 21 | } ); 22 | } ); 23 | 24 | it( 'should return info object', function () { 25 | data.should.have.property( 'version' ); 26 | data.should.have.property( 'nodeId' ); 27 | data.should.have.property( 'nodeIds' ); 28 | } ); 29 | } ); 30 | } ); 31 | -------------------------------------------------------------------------------- /test/commands-list/info.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Disqueue = require( '../../' ); 4 | 5 | describe( '"INFO"', function () { 6 | describe( 'successful get info', function () { 7 | var disqueue; 8 | var data; 9 | 10 | before( function ( done ) { 11 | disqueue = new Disqueue(); 12 | disqueue.on( 'connected', function () { 13 | done(); 14 | } ); 15 | } ); 16 | 17 | before( function ( done ) { 18 | disqueue.info( {}, function ( disqueueError, result ) { 19 | data = result; 20 | done(); 21 | } ); 22 | } ); 23 | 24 | it( 'should return info object', function () { 25 | /* 26 | * server properties 27 | * 28 | */ 29 | data.should.have.property( 'server' ); 30 | data.server.should.have.property( 'disque_version' ); 31 | data.server.should.have.property( 'disque_git_sha1' ); 32 | data.server.should.have.property( 'disque_git_dirty' ); 33 | data.server.should.have.property( 'disque_build_id' ); 34 | data.server.should.have.property( 'os' ); 35 | data.server.should.have.property( 'arch_bits' ); 36 | data.server.should.have.property( 'multiplexing_api' ); 37 | data.server.should.have.property( 'gcc_version' ); 38 | data.server.should.have.property( 'process_id' ); 39 | data.server.should.have.property( 'run_id' ); 40 | data.server.should.have.property( 'tcp_port' ); 41 | data.server.should.have.property( 'uptime_in_seconds' ); 42 | data.server.should.have.property( 'uptime_in_days' ); 43 | data.server.should.have.property( 'hz' ); 44 | data.server.should.have.property( 'executable' ); 45 | data.server.should.have.property( 'config_file' ); 46 | 47 | /* 48 | * clients properties 49 | * 50 | */ 51 | data.should.have.property( 'clients' ); 52 | data.clients.should.have.property( 'connected_clients' ); 53 | data.clients.should.have.property( 'client_longest_output_list' ); 54 | data.clients.should.have.property( 'client_biggest_input_buf' ); 55 | data.clients.should.have.property( 'blocked_clients' ); 56 | 57 | /* 58 | * memory properties 59 | * 60 | */ 61 | data.should.have.property( 'memory' ); 62 | data.memory.should.have.property( 'used_memory' ); 63 | data.memory.should.have.property( 'used_memory_human' ); 64 | data.memory.should.have.property( 'used_memory_rss' ); 65 | data.memory.should.have.property( 'used_memory_peak' ); 66 | data.memory.should.have.property( 'used_memory_peak_human' ); 67 | data.memory.should.have.property( 'mem_fragmentation_ratio' ); 68 | data.memory.should.have.property( 'mem_allocator' ); 69 | 70 | /* 71 | * jobs properties 72 | * 73 | */ 74 | data.should.have.property( 'jobs' ); 75 | data.jobs.should.have.property( 'registered_jobs' ); 76 | 77 | /* 78 | * queues properties 79 | * 80 | */ 81 | data.should.have.property( 'queues' ); 82 | data.queues.should.have.property( 'registered_queues' ); 83 | 84 | /* 85 | * persistence properties 86 | * 87 | */ 88 | data.should.have.property( 'persistence' ); 89 | data.persistence.should.have.property( 'loading' ); 90 | data.persistence.should.have.property( 'aof_enabled' ); 91 | data.persistence.should.have.property( 'aof_state' ); 92 | data.persistence.should.have.property( 'aof_rewrite_in_progress' ); 93 | data.persistence.should.have.property( 'aof_rewrite_scheduled' ); 94 | data.persistence.should.have.property( 'aof_last_rewrite_time_sec' ); 95 | data.persistence.should.have.property( 'aof_current_rewrite_time_sec' ); 96 | data.persistence.should.have.property( 'aof_last_bgrewrite_status' ); 97 | data.persistence.should.have.property( 'aof_last_write_status' ); 98 | 99 | /* 100 | * stats 101 | * 102 | */ 103 | data.should.have.property( 'stats' ); 104 | data.stats.should.have.property( 'total_connections_received' ); 105 | data.stats.should.have.property( 'total_commands_processed' ); 106 | data.stats.should.have.property( 'instantaneous_ops_per_sec' ); 107 | data.stats.should.have.property( 'total_net_input_bytes' ); 108 | data.stats.should.have.property( 'total_net_output_bytes' ); 109 | data.stats.should.have.property( 'instantaneous_input_kbps' ); 110 | data.stats.should.have.property( 'instantaneous_output_kbps' ); 111 | data.stats.should.have.property( 'rejected_connections' ); 112 | data.stats.should.have.property( 'latest_fork_usec' ); 113 | 114 | /* 115 | * cpu 116 | * 117 | */ 118 | data.should.have.property( 'cpu' ); 119 | data.cpu.should.have.property( 'used_cpu_sys' ); 120 | data.cpu.should.have.property( 'used_cpu_user' ); 121 | data.cpu.should.have.property( 'used_cpu_sys_children' ); 122 | } ); 123 | } ); 124 | } ); 125 | -------------------------------------------------------------------------------- /test/commands-list/nack.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Disqueue = require( '../../' ); 4 | 5 | require( 'should' ); 6 | 7 | describe( '"NACK"', function () { 8 | describe( 'successful nack', function () { 9 | var disqueue; 10 | var data; 11 | 12 | before( function ( done ) { 13 | disqueue = new Disqueue(); 14 | disqueue.on( 'connected', function () { 15 | done(); 16 | } ); 17 | } ); 18 | 19 | before( function ( done ) { 20 | disqueue.addJob( { 21 | 'queue' : 'ack-job-test', 22 | 'job' : 'Hello world' 23 | }, function ( error, result ) { 24 | disqueue.dequeue( result, function () { 25 | disqueue.nack( result, function ( errorAckJob, resultNackJob ) { 26 | data = resultNackJob; 27 | done(); 28 | } ); 29 | } ); 30 | } ); 31 | } ); 32 | 33 | it( 'should return true', function () { 34 | data.should.equal( 1 ); 35 | } ); 36 | } ); 37 | } ); 38 | -------------------------------------------------------------------------------- /test/commands-list/qlen.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Disqueue = require( '../../' ); 4 | 5 | require( 'should' ); 6 | 7 | describe( '"QLEN"', function () { 8 | describe( 'successful qlen', function () { 9 | var disqueue; 10 | var data; 11 | 12 | before( function ( done ) { 13 | disqueue = new Disqueue(); 14 | disqueue.on( 'connected', function () { 15 | done(); 16 | } ); 17 | } ); 18 | 19 | before( function ( done ) { 20 | disqueue.addJob( { 21 | 'queue' : 'qlen-job-test', 22 | 'job' : 'Hello world' 23 | }, function () { 24 | disqueue.qlen( 'qlen-job-test', function ( errorQlen, resultQlen ) { 25 | data = resultQlen; 26 | disqueue.getJob( { 27 | 'queue' : 'qlen-job-test', 28 | 'count' : 10 29 | }, function ( getError, getJobs ) { 30 | disqueue.fastAck( getJobs[ 0 ].jobId, function () { 31 | done(); 32 | } ); 33 | } ); 34 | } ); 35 | } ); 36 | } ); 37 | 38 | it( 'should return object', function () { 39 | data.should.equal( 1 ); 40 | } ); 41 | } ); 42 | } ); 43 | -------------------------------------------------------------------------------- /test/commands-list/qscan.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Disqueue = require( '../../' ); 4 | 5 | require( 'should' ); 6 | 7 | describe( '"QSCAN"', function () { 8 | describe( 'successful qscan', function () { 9 | var disqueue; 10 | var data; 11 | 12 | before( function ( done ) { 13 | disqueue = new Disqueue(); 14 | disqueue.on( 'connected', function () { 15 | done(); 16 | } ); 17 | } ); 18 | 19 | before( function ( done ) { 20 | disqueue.addJob( { 21 | 'queue' : 'qscan-test', 22 | 'job' : 'Hello world' 23 | }, function () { 24 | disqueue.qscan( { 25 | 'count' : 10, 26 | }, function ( errorQscan, resultQscan ) { 27 | data = resultQscan; 28 | done(); 29 | } ); 30 | } ); 31 | } ); 32 | 33 | it( 'should return queues object', function () { 34 | data.should.have.property( 'cursor' ); 35 | data.should.have.property( 'queues' ); 36 | data['queues'].should.be.Array(); 37 | 38 | for ( var i = 0; i < data[ 'queues' ].length; ++i ) { 39 | data[ 'queues' ][ i ].should.be.String(); 40 | } 41 | } ); 42 | } ); 43 | 44 | describe( 'successful qscan with busyloop', function () { 45 | var disqueue; 46 | var data; 47 | 48 | before( function ( done ) { 49 | disqueue = new Disqueue(); 50 | disqueue.on( 'connected', function () { 51 | done(); 52 | } ); 53 | } ); 54 | 55 | before( function ( done ) { 56 | disqueue.addJob( { 57 | 'queue' : 'qscan-withbusyloop-test', 58 | 'job' : 'Hello world' 59 | }, function () { 60 | disqueue.qscan( { 61 | 'count' : 3, 62 | 'busyloop' : true 63 | }, function ( errorQscan, resultQscan ) { 64 | data = resultQscan; 65 | done(); 66 | } ); 67 | } ); 68 | } ); 69 | 70 | it( 'should return object', function () { 71 | data.should.be.Object(); 72 | data.cursor.should.be.Number(); 73 | data.queues.should.be.Array(); 74 | data.queues[0].should.be.String(); 75 | } ); 76 | } ); 77 | } ); 78 | -------------------------------------------------------------------------------- /test/commands-list/show.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Disqueue = require( '../../' ); 4 | /* eslint handle-callback-err: 1 */ 5 | var should = require( 'should' ); 6 | 7 | describe( '"SHOW"', function () { 8 | describe( 'successful show', function () { 9 | var disqueue; 10 | var data; 11 | var job; 12 | var id; 13 | 14 | before( function ( done ) { 15 | disqueue = new Disqueue(); 16 | disqueue.on( 'connected', function () { 17 | done(); 18 | } ); 19 | } ); 20 | 21 | before( function ( done ) { 22 | job = { 23 | 'queue' : 'show-job-test', 24 | 'job' : 'Hello world' 25 | }; 26 | 27 | disqueue.addJob( job, function () { 28 | disqueue.getJob( { 29 | 'count' : 10, 30 | 'queue' : 'show-job-test' 31 | }, function ( errorGetJob, resultGetJob ) { 32 | id = resultGetJob[ 0 ].jobId; 33 | disqueue.show( resultGetJob[ 0 ].jobId, function ( errorShow, resultShow ) { 34 | data = resultShow; 35 | done(); 36 | } ); 37 | } ); 38 | } ); 39 | } ); 40 | 41 | it( 'should return object', function () { 42 | data.should.have.property( 'id' ).and.be.equal( id ); 43 | data.should.have.property( 'body' ).and.be.equal( job.job ); 44 | data.should.have.property( 'queue' ).and.be.equal( job.queue ); 45 | data.should.have.property( 'state' ); 46 | data.should.have.property( 'repl' ); 47 | data.should.have.property( 'ttl' ); 48 | data.should.have.property( 'ctime' ); 49 | data.should.have.property( 'delay' ); 50 | data.should.have.property( 'retry' ); 51 | data.should.have.property( 'nacks' ); 52 | data.should.have.property( 'additional-deliveries' ); 53 | data.should.have.property( 'nodes-delivered' ); 54 | data.should.have.property( 'nodes-confirmed' ); 55 | data.should.have.property( 'next-requeue-within' ); 56 | data.should.have.property( 'next-awake-within' ); 57 | } ); 58 | } ); 59 | 60 | describe( 'successful show, even for non-existent job', function () { 61 | var disqueue; 62 | 63 | before( function ( done ) { 64 | disqueue = new Disqueue(); 65 | disqueue.on( 'connected', function () { 66 | done(); 67 | } ); 68 | } ); 69 | 70 | it( 'should return null when job does not exist', function ( done ) { 71 | disqueue.show( 'D-0ca28763-cEPWFkFi4lF6unhxsfQCAto7-05a1', function ( err, job ) { 72 | should( job ).equal( null ); 73 | done(); 74 | } ); 75 | } ); 76 | } ); 77 | 78 | } ); 79 | -------------------------------------------------------------------------------- /test/commands-list/working.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Disqueue = require( '../../' ); 4 | 5 | require( 'should' ); 6 | 7 | describe( '"WORKING"', function () { 8 | describe( 'successful working', function () { 9 | var disqueue; 10 | var data; 11 | 12 | before( function ( done ) { 13 | disqueue = new Disqueue(); 14 | disqueue.on( 'connected', function () { 15 | done(); 16 | } ); 17 | } ); 18 | 19 | before( function ( done ) { 20 | disqueue.addJob( { 21 | 'queue' : 'working-job-test', 22 | 'job' : 'Hello world' 23 | }, function ( errorAddJob, addJob ) { 24 | disqueue.working( addJob, function ( errorWorking, resultWorking ) { 25 | data = resultWorking; 26 | done(); 27 | } ); 28 | } ); 29 | } ); 30 | 31 | it( 'should return default retry 300', function () { 32 | data.should.be.equal( 300 ); 33 | } ); 34 | } ); 35 | } ); 36 | -------------------------------------------------------------------------------- /test/disqueue-client.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Disqueue = require( '../' ); 4 | 5 | require( 'should' ); 6 | 7 | describe( 'disqueue construct', function () { 8 | 9 | describe( 'should create an instance of disqueue', function () { 10 | 11 | var disqueue; 12 | 13 | before( function ( done ) { 14 | 15 | disqueue = new Disqueue(); 16 | disqueue.on( 'connected', function () { 17 | done(); 18 | } ); 19 | 20 | } ); 21 | 22 | it( 'should connect', function () { 23 | 24 | disqueue.connected.should.be.equal( true ); 25 | disqueue.ready.should.be.equal( true ); 26 | 27 | } ); 28 | 29 | } ); 30 | 31 | describe( 'should not connect with invalid port and host', function () { 32 | 33 | var disqueue; 34 | 35 | before( function ( done ) { 36 | 37 | disqueue = new Disqueue({ 38 | 'port': 9999, 39 | 'host': 'invalid', 40 | 'retryMax': 1 41 | }); 42 | 43 | disqueue.on('error', function () { 44 | done(); 45 | }); 46 | } ); 47 | 48 | it( 'should emit error', function () { 49 | 50 | disqueue.connected.should.be.equal( false ); 51 | disqueue.ready.should.be.equal( false ); 52 | 53 | } ); 54 | 55 | } ); 56 | 57 | } ); 58 | -------------------------------------------------------------------------------- /test/helper.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var Disque = require( '../' ); 4 | 5 | module.exports = function () { 6 | 7 | return { 8 | 'disqueProcess' : function () { 9 | return new Disque(); 10 | } 11 | }; 12 | 13 | }; 14 | -------------------------------------------------------------------------------- /test/mocha.opts: -------------------------------------------------------------------------------- 1 | --reporter spec 2 | --ui bdd 3 | --recursive 4 | --timeout 5000 5 | --bail 6 | --exit -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.0.0" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" 8 | dependencies: 9 | "@babel/highlight" "^7.0.0" 10 | 11 | "@babel/highlight@^7.0.0": 12 | version "7.0.0" 13 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" 14 | dependencies: 15 | chalk "^2.0.0" 16 | esutils "^2.0.2" 17 | js-tokens "^4.0.0" 18 | 19 | acorn-jsx@^5.0.0: 20 | version "5.0.1" 21 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.1.tgz#32a064fd925429216a09b141102bfdd185fae40e" 22 | 23 | acorn@^6.0.2: 24 | version "6.0.4" 25 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754" 26 | 27 | ajv@^6.5.3: 28 | version "6.5.5" 29 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.5.tgz#cf97cdade71c6399a92c6d6c4177381291b781a1" 30 | dependencies: 31 | fast-deep-equal "^2.0.1" 32 | fast-json-stable-stringify "^2.0.0" 33 | json-schema-traverse "^0.4.1" 34 | uri-js "^4.2.2" 35 | 36 | ansi-escapes@^3.0.0: 37 | version "3.1.0" 38 | resolved "http://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" 39 | 40 | ansi-regex@^3.0.0: 41 | version "3.0.0" 42 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 43 | 44 | ansi-styles@^3.2.1: 45 | version "3.2.1" 46 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 47 | dependencies: 48 | color-convert "^1.9.0" 49 | 50 | argparse@^1.0.7: 51 | version "1.0.9" 52 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" 53 | dependencies: 54 | sprintf-js "~1.0.2" 55 | 56 | balanced-match@^0.4.1: 57 | version "0.4.2" 58 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" 59 | 60 | balanced-match@^1.0.0: 61 | version "1.0.0" 62 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 63 | 64 | bluebird@^3.5.3: 65 | version "3.5.3" 66 | resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" 67 | 68 | brace-expansion@^1.0.0: 69 | version "1.1.6" 70 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.6.tgz#7197d7eaa9b87e648390ea61fc66c84427420df9" 71 | dependencies: 72 | balanced-match "^0.4.1" 73 | concat-map "0.0.1" 74 | 75 | brace-expansion@^1.1.7: 76 | version "1.1.11" 77 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 78 | dependencies: 79 | balanced-match "^1.0.0" 80 | concat-map "0.0.1" 81 | 82 | browser-stdout@1.3.1: 83 | version "1.3.1" 84 | resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" 85 | 86 | caller-path@^0.1.0: 87 | version "0.1.0" 88 | resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" 89 | dependencies: 90 | callsites "^0.2.0" 91 | 92 | callsites@^0.2.0: 93 | version "0.2.0" 94 | resolved "http://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" 95 | 96 | chalk@^2.0.0, chalk@^2.1.0: 97 | version "2.4.1" 98 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 99 | dependencies: 100 | ansi-styles "^3.2.1" 101 | escape-string-regexp "^1.0.5" 102 | supports-color "^5.3.0" 103 | 104 | chardet@^0.7.0: 105 | version "0.7.0" 106 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 107 | 108 | circular-json@^0.3.1: 109 | version "0.3.3" 110 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 111 | 112 | cli-cursor@^2.1.0: 113 | version "2.1.0" 114 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 115 | dependencies: 116 | restore-cursor "^2.0.0" 117 | 118 | cli-width@^2.0.0: 119 | version "2.2.0" 120 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 121 | 122 | color-convert@^1.9.0: 123 | version "1.9.3" 124 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 125 | dependencies: 126 | color-name "1.1.3" 127 | 128 | color-name@1.1.3: 129 | version "1.1.3" 130 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 131 | 132 | colors@^1.3.2: 133 | version "1.3.2" 134 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" 135 | 136 | commander@2.15.1: 137 | version "2.15.1" 138 | resolved "http://registry.npmjs.org/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f" 139 | 140 | concat-map@0.0.1: 141 | version "0.0.1" 142 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 143 | 144 | cross-spawn@^6.0.5: 145 | version "6.0.5" 146 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 147 | dependencies: 148 | nice-try "^1.0.4" 149 | path-key "^2.0.1" 150 | semver "^5.5.0" 151 | shebang-command "^1.2.0" 152 | which "^1.2.9" 153 | 154 | debug@3.1.0: 155 | version "3.1.0" 156 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 157 | dependencies: 158 | ms "2.0.0" 159 | 160 | debug@^4.0.1: 161 | version "4.1.0" 162 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" 163 | dependencies: 164 | ms "^2.1.1" 165 | 166 | deep-is@~0.1.3: 167 | version "0.1.3" 168 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 169 | 170 | diff@3.5.0: 171 | version "3.5.0" 172 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 173 | 174 | doctrine@^2.1.0: 175 | version "2.1.0" 176 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 177 | dependencies: 178 | esutils "^2.0.2" 179 | 180 | double-ended-queue@^0.9.7: 181 | version "0.9.7" 182 | resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-0.9.7.tgz#8ae0a7265df66cdc3f07dce558e9716adb586ab8" 183 | 184 | double-ended-queue@^2.1.0-0: 185 | version "2.1.0-0" 186 | resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c" 187 | 188 | escape-string-regexp@1.0.5, escape-string-regexp@^1.0.5: 189 | version "1.0.5" 190 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 191 | 192 | eslint-scope@^4.0.0: 193 | version "4.0.0" 194 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" 195 | dependencies: 196 | esrecurse "^4.1.0" 197 | estraverse "^4.1.1" 198 | 199 | eslint-utils@^1.3.1: 200 | version "1.3.1" 201 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" 202 | 203 | eslint-visitor-keys@^1.0.0: 204 | version "1.0.0" 205 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 206 | 207 | eslint@^5.9.0: 208 | version "5.9.0" 209 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.9.0.tgz#b234b6d15ef84b5849c6de2af43195a2d59d408e" 210 | dependencies: 211 | "@babel/code-frame" "^7.0.0" 212 | ajv "^6.5.3" 213 | chalk "^2.1.0" 214 | cross-spawn "^6.0.5" 215 | debug "^4.0.1" 216 | doctrine "^2.1.0" 217 | eslint-scope "^4.0.0" 218 | eslint-utils "^1.3.1" 219 | eslint-visitor-keys "^1.0.0" 220 | espree "^4.0.0" 221 | esquery "^1.0.1" 222 | esutils "^2.0.2" 223 | file-entry-cache "^2.0.0" 224 | functional-red-black-tree "^1.0.1" 225 | glob "^7.1.2" 226 | globals "^11.7.0" 227 | ignore "^4.0.6" 228 | imurmurhash "^0.1.4" 229 | inquirer "^6.1.0" 230 | is-resolvable "^1.1.0" 231 | js-yaml "^3.12.0" 232 | json-stable-stringify-without-jsonify "^1.0.1" 233 | levn "^0.3.0" 234 | lodash "^4.17.5" 235 | minimatch "^3.0.4" 236 | mkdirp "^0.5.1" 237 | natural-compare "^1.4.0" 238 | optionator "^0.8.2" 239 | path-is-inside "^1.0.2" 240 | pluralize "^7.0.0" 241 | progress "^2.0.0" 242 | regexpp "^2.0.1" 243 | require-uncached "^1.0.3" 244 | semver "^5.5.1" 245 | strip-ansi "^4.0.0" 246 | strip-json-comments "^2.0.1" 247 | table "^5.0.2" 248 | text-table "^0.2.0" 249 | 250 | espree@^4.0.0: 251 | version "4.1.0" 252 | resolved "https://registry.yarnpkg.com/espree/-/espree-4.1.0.tgz#728d5451e0fd156c04384a7ad89ed51ff54eb25f" 253 | dependencies: 254 | acorn "^6.0.2" 255 | acorn-jsx "^5.0.0" 256 | eslint-visitor-keys "^1.0.0" 257 | 258 | esprima@^4.0.0: 259 | version "4.0.1" 260 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 261 | 262 | esquery@^1.0.1: 263 | version "1.0.1" 264 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" 265 | dependencies: 266 | estraverse "^4.0.0" 267 | 268 | esrecurse@^4.1.0: 269 | version "4.1.0" 270 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.1.0.tgz#4713b6536adf7f2ac4f327d559e7756bff648220" 271 | dependencies: 272 | estraverse "~4.1.0" 273 | object-assign "^4.0.1" 274 | 275 | estraverse@^4.0.0, estraverse@^4.1.1: 276 | version "4.2.0" 277 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 278 | 279 | estraverse@~4.1.0: 280 | version "4.1.1" 281 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.1.1.tgz#f6caca728933a850ef90661d0e17982ba47111a2" 282 | 283 | esutils@^2.0.2: 284 | version "2.0.2" 285 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 286 | 287 | external-editor@^3.0.0: 288 | version "3.0.3" 289 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" 290 | dependencies: 291 | chardet "^0.7.0" 292 | iconv-lite "^0.4.24" 293 | tmp "^0.0.33" 294 | 295 | fast-deep-equal@^2.0.1: 296 | version "2.0.1" 297 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 298 | 299 | fast-json-stable-stringify@^2.0.0: 300 | version "2.0.0" 301 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 302 | 303 | fast-levenshtein@~2.0.4: 304 | version "2.0.6" 305 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 306 | 307 | figures@^2.0.0: 308 | version "2.0.0" 309 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 310 | dependencies: 311 | escape-string-regexp "^1.0.5" 312 | 313 | file-entry-cache@^2.0.0: 314 | version "2.0.0" 315 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 316 | dependencies: 317 | flat-cache "^1.2.1" 318 | object-assign "^4.0.1" 319 | 320 | flat-cache@^1.2.1: 321 | version "1.3.4" 322 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" 323 | dependencies: 324 | circular-json "^0.3.1" 325 | graceful-fs "^4.1.2" 326 | rimraf "~2.6.2" 327 | write "^0.2.1" 328 | 329 | fs.realpath@^1.0.0: 330 | version "1.0.0" 331 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 332 | 333 | functional-red-black-tree@^1.0.1: 334 | version "1.0.1" 335 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 336 | 337 | glob@7.1.2: 338 | version "7.1.2" 339 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 340 | dependencies: 341 | fs.realpath "^1.0.0" 342 | inflight "^1.0.4" 343 | inherits "2" 344 | minimatch "^3.0.4" 345 | once "^1.3.0" 346 | path-is-absolute "^1.0.0" 347 | 348 | glob@^7.0.5: 349 | version "7.1.1" 350 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" 351 | dependencies: 352 | fs.realpath "^1.0.0" 353 | inflight "^1.0.4" 354 | inherits "2" 355 | minimatch "^3.0.2" 356 | once "^1.3.0" 357 | path-is-absolute "^1.0.0" 358 | 359 | glob@^7.1.2: 360 | version "7.1.3" 361 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 362 | dependencies: 363 | fs.realpath "^1.0.0" 364 | inflight "^1.0.4" 365 | inherits "2" 366 | minimatch "^3.0.4" 367 | once "^1.3.0" 368 | path-is-absolute "^1.0.0" 369 | 370 | globals@^11.7.0: 371 | version "11.9.0" 372 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249" 373 | 374 | graceful-fs@^4.1.2: 375 | version "4.1.15" 376 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" 377 | 378 | growl@1.10.5: 379 | version "1.10.5" 380 | resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" 381 | 382 | has-flag@^3.0.0: 383 | version "3.0.0" 384 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 385 | 386 | he@1.1.1: 387 | version "1.1.1" 388 | resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" 389 | 390 | iconv-lite@^0.4.24: 391 | version "0.4.24" 392 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 393 | dependencies: 394 | safer-buffer ">= 2.1.2 < 3" 395 | 396 | ignore@^4.0.6: 397 | version "4.0.6" 398 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 399 | 400 | imurmurhash@^0.1.4: 401 | version "0.1.4" 402 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 403 | 404 | inflight@^1.0.4: 405 | version "1.0.6" 406 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 407 | dependencies: 408 | once "^1.3.0" 409 | wrappy "1" 410 | 411 | inherits@2: 412 | version "2.0.3" 413 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 414 | 415 | inquirer@^6.1.0: 416 | version "6.2.0" 417 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" 418 | dependencies: 419 | ansi-escapes "^3.0.0" 420 | chalk "^2.0.0" 421 | cli-cursor "^2.1.0" 422 | cli-width "^2.0.0" 423 | external-editor "^3.0.0" 424 | figures "^2.0.0" 425 | lodash "^4.17.10" 426 | mute-stream "0.0.7" 427 | run-async "^2.2.0" 428 | rxjs "^6.1.0" 429 | string-width "^2.1.0" 430 | strip-ansi "^4.0.0" 431 | through "^2.3.6" 432 | 433 | is-fullwidth-code-point@^2.0.0: 434 | version "2.0.0" 435 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 436 | 437 | is-promise@^2.1.0: 438 | version "2.1.0" 439 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 440 | 441 | is-resolvable@^1.1.0: 442 | version "1.1.0" 443 | resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" 444 | 445 | isexe@^2.0.0: 446 | version "2.0.0" 447 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 448 | 449 | js-tokens@^4.0.0: 450 | version "4.0.0" 451 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 452 | 453 | js-yaml@^3.12.0: 454 | version "3.12.0" 455 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" 456 | dependencies: 457 | argparse "^1.0.7" 458 | esprima "^4.0.0" 459 | 460 | json-schema-traverse@^0.4.1: 461 | version "0.4.1" 462 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 463 | 464 | json-stable-stringify-without-jsonify@^1.0.1: 465 | version "1.0.1" 466 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 467 | 468 | levn@^0.3.0, levn@~0.3.0: 469 | version "0.3.0" 470 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 471 | dependencies: 472 | prelude-ls "~1.1.2" 473 | type-check "~0.3.2" 474 | 475 | lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.5: 476 | version "4.17.11" 477 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 478 | 479 | mimic-fn@^1.0.0: 480 | version "1.2.0" 481 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 482 | 483 | minimatch@3.0.4, minimatch@^3.0.4: 484 | version "3.0.4" 485 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 486 | dependencies: 487 | brace-expansion "^1.1.7" 488 | 489 | minimatch@^3.0.2: 490 | version "3.0.3" 491 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" 492 | dependencies: 493 | brace-expansion "^1.0.0" 494 | 495 | minimist@0.0.8: 496 | version "0.0.8" 497 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 498 | 499 | mkdirp@0.5.1, mkdirp@^0.5.1: 500 | version "0.5.1" 501 | resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 502 | dependencies: 503 | minimist "0.0.8" 504 | 505 | mocha@^5.2.0: 506 | version "5.2.0" 507 | resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6" 508 | dependencies: 509 | browser-stdout "1.3.1" 510 | commander "2.15.1" 511 | debug "3.1.0" 512 | diff "3.5.0" 513 | escape-string-regexp "1.0.5" 514 | glob "7.1.2" 515 | growl "1.10.5" 516 | he "1.1.1" 517 | minimatch "3.0.4" 518 | mkdirp "0.5.1" 519 | supports-color "5.4.0" 520 | 521 | ms@2.0.0: 522 | version "2.0.0" 523 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 524 | 525 | ms@^2.1.1: 526 | version "2.1.1" 527 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 528 | 529 | mute-stream@0.0.7: 530 | version "0.0.7" 531 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 532 | 533 | natural-compare@^1.4.0: 534 | version "1.4.0" 535 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 536 | 537 | nice-try@^1.0.4: 538 | version "1.0.5" 539 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 540 | 541 | object-assign@^4.0.1: 542 | version "4.1.1" 543 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 544 | 545 | once@^1.3.0: 546 | version "1.4.0" 547 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 548 | dependencies: 549 | wrappy "1" 550 | 551 | onetime@^2.0.0: 552 | version "2.0.1" 553 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 554 | dependencies: 555 | mimic-fn "^1.0.0" 556 | 557 | optionator@^0.8.2: 558 | version "0.8.2" 559 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 560 | dependencies: 561 | deep-is "~0.1.3" 562 | fast-levenshtein "~2.0.4" 563 | levn "~0.3.0" 564 | prelude-ls "~1.1.2" 565 | type-check "~0.3.2" 566 | wordwrap "~1.0.0" 567 | 568 | os-tmpdir@~1.0.2: 569 | version "1.0.2" 570 | resolved "http://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 571 | 572 | path-is-absolute@^1.0.0: 573 | version "1.0.1" 574 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 575 | 576 | path-is-inside@^1.0.2: 577 | version "1.0.2" 578 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 579 | 580 | path-key@^2.0.1: 581 | version "2.0.1" 582 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 583 | 584 | pluralize@^7.0.0: 585 | version "7.0.0" 586 | resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" 587 | 588 | prelude-ls@~1.1.2: 589 | version "1.1.2" 590 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 591 | 592 | progress@^2.0.0: 593 | version "2.0.1" 594 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31" 595 | 596 | punycode@^2.1.0: 597 | version "2.1.1" 598 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 599 | 600 | redis-commands@^1.2.0: 601 | version "1.4.0" 602 | resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.4.0.tgz#52f9cf99153efcce56a8f86af986bd04e988602f" 603 | 604 | redis-errors@^1.0.0: 605 | version "1.2.0" 606 | resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" 607 | 608 | redis-parser@^2.6.0: 609 | version "2.6.0" 610 | resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b" 611 | 612 | redis-parser@^3.0.0: 613 | version "3.0.0" 614 | resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" 615 | dependencies: 616 | redis-errors "^1.0.0" 617 | 618 | redis@^2.8.0: 619 | version "2.8.0" 620 | resolved "https://registry.yarnpkg.com/redis/-/redis-2.8.0.tgz#202288e3f58c49f6079d97af7a10e1303ae14b02" 621 | dependencies: 622 | double-ended-queue "^2.1.0-0" 623 | redis-commands "^1.2.0" 624 | redis-parser "^2.6.0" 625 | 626 | regexpp@^2.0.1: 627 | version "2.0.1" 628 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" 629 | 630 | require-uncached@^1.0.3: 631 | version "1.0.3" 632 | resolved "http://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" 633 | dependencies: 634 | caller-path "^0.1.0" 635 | resolve-from "^1.0.0" 636 | 637 | resolve-from@^1.0.0: 638 | version "1.0.1" 639 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" 640 | 641 | restore-cursor@^2.0.0: 642 | version "2.0.0" 643 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 644 | dependencies: 645 | onetime "^2.0.0" 646 | signal-exit "^3.0.2" 647 | 648 | rimraf@~2.6.2: 649 | version "2.6.2" 650 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 651 | dependencies: 652 | glob "^7.0.5" 653 | 654 | run-async@^2.2.0: 655 | version "2.3.0" 656 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 657 | dependencies: 658 | is-promise "^2.1.0" 659 | 660 | rxjs@^6.1.0: 661 | version "6.3.3" 662 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.3.3.tgz#3c6a7fa420e844a81390fb1158a9ec614f4bad55" 663 | dependencies: 664 | tslib "^1.9.0" 665 | 666 | "safer-buffer@>= 2.1.2 < 3": 667 | version "2.1.2" 668 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 669 | 670 | semver@^5.5.0, semver@^5.5.1: 671 | version "5.6.0" 672 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 673 | 674 | shebang-command@^1.2.0: 675 | version "1.2.0" 676 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 677 | dependencies: 678 | shebang-regex "^1.0.0" 679 | 680 | shebang-regex@^1.0.0: 681 | version "1.0.0" 682 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 683 | 684 | should-equal@0.5.0: 685 | version "0.5.0" 686 | resolved "https://registry.yarnpkg.com/should-equal/-/should-equal-0.5.0.tgz#c797f135f3067feb69ebecdb306b1c3fe21b3e6f" 687 | dependencies: 688 | should-type "0.2.0" 689 | 690 | should-format@0.3.1: 691 | version "0.3.1" 692 | resolved "https://registry.yarnpkg.com/should-format/-/should-format-0.3.1.tgz#2cbb782461670ace4292b2b1ec468db8cf99e330" 693 | dependencies: 694 | should-type "0.2.0" 695 | 696 | should-type@0.2.0: 697 | version "0.2.0" 698 | resolved "https://registry.yarnpkg.com/should-type/-/should-type-0.2.0.tgz#6707ef95529d989dcc098fe0753ab1f9136bb7f6" 699 | 700 | should@^7.1.1: 701 | version "7.1.1" 702 | resolved "https://registry.yarnpkg.com/should/-/should-7.1.1.tgz#6464c48b6f7c1e1f18ac0483578fa2dd55c2c6e0" 703 | dependencies: 704 | should-equal "0.5.0" 705 | should-format "0.3.1" 706 | should-type "0.2.0" 707 | 708 | signal-exit@^3.0.2: 709 | version "3.0.2" 710 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 711 | 712 | slice-ansi@1.0.0: 713 | version "1.0.0" 714 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" 715 | dependencies: 716 | is-fullwidth-code-point "^2.0.0" 717 | 718 | sprintf-js@~1.0.2: 719 | version "1.0.3" 720 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 721 | 722 | string-width@^2.1.0, string-width@^2.1.1: 723 | version "2.1.1" 724 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 725 | dependencies: 726 | is-fullwidth-code-point "^2.0.0" 727 | strip-ansi "^4.0.0" 728 | 729 | strip-ansi@^4.0.0: 730 | version "4.0.0" 731 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 732 | dependencies: 733 | ansi-regex "^3.0.0" 734 | 735 | strip-json-comments@^2.0.1: 736 | version "2.0.1" 737 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 738 | 739 | supports-color@5.4.0: 740 | version "5.4.0" 741 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54" 742 | dependencies: 743 | has-flag "^3.0.0" 744 | 745 | supports-color@^5.3.0: 746 | version "5.5.0" 747 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 748 | dependencies: 749 | has-flag "^3.0.0" 750 | 751 | table@^5.0.2: 752 | version "5.1.0" 753 | resolved "https://registry.yarnpkg.com/table/-/table-5.1.0.tgz#69a54644f6f01ad1628f8178715b408dc6bf11f7" 754 | dependencies: 755 | ajv "^6.5.3" 756 | lodash "^4.17.10" 757 | slice-ansi "1.0.0" 758 | string-width "^2.1.1" 759 | 760 | text-table@^0.2.0: 761 | version "0.2.0" 762 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 763 | 764 | through@^2.3.6: 765 | version "2.3.8" 766 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 767 | 768 | tmp@^0.0.33: 769 | version "0.0.33" 770 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 771 | dependencies: 772 | os-tmpdir "~1.0.2" 773 | 774 | tslib@^1.9.0: 775 | version "1.9.3" 776 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 777 | 778 | type-check@~0.3.2: 779 | version "0.3.2" 780 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 781 | dependencies: 782 | prelude-ls "~1.1.2" 783 | 784 | uri-js@^4.2.2: 785 | version "4.2.2" 786 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 787 | dependencies: 788 | punycode "^2.1.0" 789 | 790 | uuid@^3.3.2: 791 | version "3.3.2" 792 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" 793 | 794 | which@^1.2.9: 795 | version "1.3.1" 796 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 797 | dependencies: 798 | isexe "^2.0.0" 799 | 800 | wordwrap@~1.0.0: 801 | version "1.0.0" 802 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 803 | 804 | wrappy@1: 805 | version "1.0.2" 806 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 807 | 808 | write@^0.2.1: 809 | version "0.2.1" 810 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 811 | dependencies: 812 | mkdirp "^0.5.1" 813 | --------------------------------------------------------------------------------