├── .gitignore ├── Dockerfile ├── LICENSE ├── Makefile ├── README.md ├── SETUP.md ├── bin └── gitlab-bot.js ├── lib ├── bot.js ├── index.js ├── plugin │ ├── comment-all-issues.js │ └── comment-all-notes-not-from-bot.js ├── resolver.js └── server.js ├── package-lock.json └── package.json /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .idea/ 3 | .env 4 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:9 2 | 3 | COPY . . 4 | RUN npm install 5 | 6 | EXPOSE 3000 7 | 8 | CMD ["npm", "run", "start"] 9 | 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2017 Hensel, Anita and Kollmann, Stefan 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .PHONY: build run 2 | 3 | PORT?=80 4 | 5 | build: 6 | docker build -t gitlab-bot:dev . 7 | 8 | run: build 9 | docker run --rm -p ${PORT}:3000 -it gitlab-bot:dev 10 | 11 | clean: 12 | docker rmi gitlab-bot:dev 13 | 14 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Gitlab Bot 2 | 3 | The purpose of the gitlab bot is to automate trivial tasks in project management using gitlab. This project is heavily inspired by [ProBot](https://github.com/probot/probot). 4 | 5 | At the hart of this bot is a plugin system. This can be used to register actions which should be triggered by certain events e.g. creating an issue. 6 | 7 | ## Install 8 | 9 | ``` 10 | $ npm install --save gitlab-bot my-awesome-gitlab-bot-plugin and-another-one 11 | ``` 12 | 13 | ## Usage 14 | 15 | After installing the plugins and gitlab bot itself, you need to tell the bot which plugins to load via the package.json. 16 | 17 | ```json 18 | { 19 | "name": "my-gitlab-bot-project", 20 | "version": "1.0.0", 21 | ... 22 | "gitlab-bot": { 23 | "plugins": [ 24 | "my-awesome-gitlab-bot-plugin", 25 | "and-another-one" 26 | ] 27 | } 28 | } 29 | ``` 30 | 31 | ## Development 32 | 33 | For a development evnironment see [SETUP.md](SETUP.md). 34 | 35 | ## Implementierung --- Just some notes of the developers 36 | 37 | [x] vorbereiten der Infrastruktur: Eintragen des Servers für Events im Gitlab; minimaler Webserver zum Testen, ob die Requests ankommen 38 | 39 | [x] Parsen der Events und definieren der Eventschnittstelle; erstes kleines, noch nicht ausgelagertes Plugin 40 | 41 | [x] Umsetzen der Pluginstruktur ähnlich wie in Probot 42 | 43 | [ ] Umwandeln des ersten "Plugins" in ein "richtiges" Plugin 44 | -------------------------------------------------------------------------------- /SETUP.md: -------------------------------------------------------------------------------- 1 | How to setup the server running gitlab bot 2 | ========================================== 3 | 4 | Get a up to date version of ubuntu or any other system being able to host docker as this project uses docker to provide an up to date node.js environment. 5 | 6 | Install docker 7 | -------------- 8 | 9 | ```shell 10 | sudo apt-get install \ 11 | apt-transport-https \ 12 | ca-certificates \ 13 | curl \ 14 | software-properties-common 15 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 16 | sudo add-apt-repository \ 17 | "deb [arch=amd64] https://download.docker.com/linux/ubuntu \ 18 | $(lsb_release -cs) \ 19 | stable" 20 | sudo apt-get update 21 | sudo apt-get install docker-ce 22 | ``` 23 | 24 | Start the project 25 | ----------------- 26 | 27 | Build the docker image and run it with port forwarding: 28 | ```shell 29 | make run 30 | ``` 31 | 32 | By default the containers port 3000 will be forwarded to the host port 80. This can be changed by providing an environment variable `PORT` like `PORT=8080 make run`. 33 | 34 | Remove the built docker image: 35 | ```shell 36 | make clean 37 | ``` 38 | 39 | -------------------------------------------------------------------------------- /bin/gitlab-bot.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | require('dotenv').config(); 4 | 5 | const pkgConf = require('pkg-conf'); 6 | 7 | const program = require('commander'); 8 | 9 | program 10 | .option('-p, --port ', 'Port to start the server on', process.env.PORT || 3000) 11 | .option('-w, --webhook-path ', 'URL path which receives webhooks. Ex: /webhook', process.env.WEBHOOK_PATH) 12 | .option('-s, --secret ', 'Webhook secret of the GitLab App', process.env.WEBHOOK_SECRET) 13 | .option('--usertoken ', 'Usertoken of the Gitlab Robot User', process.env.GITLAB_USERTOKEN) 14 | .option('--url ', 'Url of gitlab instance', process.env.URL) 15 | .parse(process.argv); 16 | 17 | const createBot = require('../'); 18 | 19 | const bot = createBot({ 20 | port: program.port, 21 | webhookPath: program.webhookPath, 22 | secret: program.secret, 23 | usertoken: program.usertoken, 24 | url: program.url 25 | }); 26 | 27 | pkgConf('gitlab-bot').then(pkg => { 28 | bot.setup(program.args.concat(pkg.plugins || [])); 29 | bot.start(); 30 | }); 31 | -------------------------------------------------------------------------------- /lib/bot.js: -------------------------------------------------------------------------------- 1 | const {EventEmitter} = require('promise-events'); 2 | const createGitlabClient = require('node-gitlab-api'); 3 | 4 | const reformatEventName = {"issue": "Issue", "merge_request": "MergeRequest", "commit": "Commit", "snippet": "Snippet"}; 5 | 6 | class Bot { 7 | 8 | constructor(usertoken, url, logger) { 9 | this.events = new EventEmitter(); 10 | this.logger = logger; 11 | 12 | this.client = createGitlabClient({ 13 | url: url, 14 | token: usertoken 15 | }); 16 | if (!this.authenticate()) { 17 | throw new Error("Authentication failed"); 18 | } 19 | } 20 | 21 | async authenticate() { 22 | try { 23 | await this.client.projects.all({per_page: 1, max_pages: 1}); //projects are not interesting. it should only be used for authentication 24 | return true; 25 | } catch (exception) { 26 | this.logger.error(exception); 27 | return false; 28 | } 29 | } 30 | 31 | async receive(event) { 32 | return this.events.emit('*', event).then(() => { 33 | return this.events.emit(event.event, event); 34 | }); 35 | } 36 | 37 | on(event, callback) { 38 | if (event.constructor === Array) { //recursively call for each event in the array 39 | event.forEach(e => this.on(e, callback)); 40 | return; 41 | } 42 | 43 | let [eventName, action] = event.split("."); 44 | 45 | if (action === 'note') { 46 | [eventName, action] = [action, reformatEventName[eventName]]; 47 | } 48 | 49 | return this.events.on(eventName, async event => { 50 | if (!action || action === event.payload.object_attributes.action || action === event.payload.object_attributes.noteable_type) { 51 | try { 52 | this.logger.debug({eventName, action}); 53 | await callback(event); 54 | } catch (exception) { 55 | this.logger.error(exception); 56 | } 57 | } 58 | }); 59 | } 60 | } 61 | 62 | module.exports = (...args) => new Bot(...args); -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | const createWebhook = require('node-gitlab-webhook'); 2 | const bunyan = require('bunyan'); 3 | const bunyanFormat = require('bunyan-format'); 4 | 5 | const resolve = require('./resolver'); 6 | 7 | const createRobot = require('./bot'); 8 | const createServer = require('./server'); 9 | 10 | module.exports = (options = {}) => { 11 | const logger = bunyan.createLogger({ 12 | name: 'gitlab-bot', 13 | level: process.env.LOG_LEVEL || 'info', 14 | stream: bunyanFormat({outputMode: process.env.LOG_FORMAT || 'short'}) 15 | }); 16 | 17 | const webhook = createWebhook({path: options.webhookPath || '/', secret: options.secret || 'development'}); 18 | const server = createServer(webhook); 19 | 20 | // Those default apps are currently only used for testing during development. 21 | const defaultApps = [ 22 | //require('./plugin/comment-all-issues'), 23 | //require('./plugin/comment-all-notes-not-from-bot') 24 | ]; 25 | 26 | webhook.on('*', event => { 27 | receive(event); 28 | }); 29 | 30 | let robots = []; 31 | 32 | function receive(event) { 33 | logger.info({event}, "Webhook received"); 34 | 35 | return Promise.all(robots.map(robot => robot.receive(event))); 36 | } 37 | 38 | function load(plugin) { 39 | let childLogger; 40 | if (typeof plugin === 'string') { 41 | childLogger = logger.child({plugin: plugin}); 42 | childLogger.info("Registering plugin"); 43 | 44 | plugin = resolve(plugin, options); 45 | } else { 46 | childLogger = logger.child(); 47 | } 48 | 49 | const robot = createRobot(options.usertoken, options.url, childLogger); 50 | plugin(robot); 51 | 52 | robots.push(robot); 53 | } 54 | 55 | return { 56 | server, 57 | 58 | start() { 59 | server.listen(options.port, () => { 60 | logger.info("Server is ready! Listening on port " + options.port); 61 | }); 62 | }, 63 | 64 | setup(apps) { 65 | apps.concat(defaultApps).forEach(app => load(app)); 66 | } 67 | }; 68 | }; -------------------------------------------------------------------------------- /lib/plugin/comment-all-issues.js: -------------------------------------------------------------------------------- 1 | module.exports = (robot) => { 2 | robot.on('issue.open', (event) => { 3 | console.log(event); 4 | robot.logger.info("Commenting on " + event.payload.object_attributes.title); 5 | robot.client.projects.issues.notes.create(event.payload.object_attributes.project_id, event.payload.object_attributes.iid, {body: "Stefan sagt: Ich machs!"}); 6 | }); 7 | }; -------------------------------------------------------------------------------- /lib/plugin/comment-all-notes-not-from-bot.js: -------------------------------------------------------------------------------- 1 | module.exports = (robot) => { 2 | robot.on(['issue.note', 'merge_request.note', 'snippet.note', 'commit.note'], (event) => { 3 | if(event.payload.object_attributes.author_id !== 1120){ 4 | robot.logger.info("Commenting on " + event.payload.object_attributes.title); 5 | } 6 | }); 7 | 8 | }; -------------------------------------------------------------------------------- /lib/resolver.js: -------------------------------------------------------------------------------- 1 | module.exports = (plugin, opts = {}) => { 2 | const basedir = opts.basedir || process.cwd(); 3 | const resolve = require ('resolve').sync; 4 | return require(resolve(plugin, {basedir})); 5 | } -------------------------------------------------------------------------------- /lib/server.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | 3 | module.exports = function (webhook) { 4 | const app = express(); 5 | 6 | app.use(webhook); 7 | app.get('/ping', (req, res) => { 8 | res.end('PONG'); 9 | }); 10 | 11 | return app; 12 | }; 13 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gitlab-bot", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.4", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", 10 | "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", 11 | "requires": { 12 | "mime-types": "2.1.17", 13 | "negotiator": "0.6.1" 14 | } 15 | }, 16 | "ajv": { 17 | "version": "5.5.2", 18 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 19 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 20 | "requires": { 21 | "co": "4.6.0", 22 | "fast-deep-equal": "1.0.0", 23 | "fast-json-stable-stringify": "2.0.0", 24 | "json-schema-traverse": "0.3.1" 25 | } 26 | }, 27 | "ansicolors": { 28 | "version": "0.2.1", 29 | "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.2.1.tgz", 30 | "integrity": "sha1-vgiVmQl7dKXJxKhKDNvNtivYeu8=" 31 | }, 32 | "ansistyles": { 33 | "version": "0.1.3", 34 | "resolved": "https://registry.npmjs.org/ansistyles/-/ansistyles-0.1.3.tgz", 35 | "integrity": "sha1-XeYEFb2gcbs3EnhUyGT0GyMlRTk=" 36 | }, 37 | "array-flatten": { 38 | "version": "1.1.1", 39 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 40 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 41 | }, 42 | "asn1": { 43 | "version": "0.2.3", 44 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 45 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 46 | }, 47 | "assert-plus": { 48 | "version": "1.0.0", 49 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 50 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 51 | }, 52 | "asynckit": { 53 | "version": "0.4.0", 54 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 55 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 56 | }, 57 | "aws-sign2": { 58 | "version": "0.7.0", 59 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 60 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 61 | }, 62 | "aws4": { 63 | "version": "1.6.0", 64 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", 65 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" 66 | }, 67 | "balanced-match": { 68 | "version": "1.0.0", 69 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 70 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 71 | "optional": true 72 | }, 73 | "bcrypt-pbkdf": { 74 | "version": "1.0.1", 75 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 76 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 77 | "optional": true, 78 | "requires": { 79 | "tweetnacl": "0.14.5" 80 | } 81 | }, 82 | "bl": { 83 | "version": "1.2.1", 84 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", 85 | "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", 86 | "requires": { 87 | "readable-stream": "2.3.3" 88 | } 89 | }, 90 | "bluebird": { 91 | "version": "3.5.1", 92 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 93 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 94 | }, 95 | "body-parser": { 96 | "version": "1.18.2", 97 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", 98 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", 99 | "requires": { 100 | "bytes": "3.0.0", 101 | "content-type": "1.0.4", 102 | "debug": "2.6.9", 103 | "depd": "1.1.1", 104 | "http-errors": "1.6.2", 105 | "iconv-lite": "0.4.19", 106 | "on-finished": "2.3.0", 107 | "qs": "6.5.1", 108 | "raw-body": "2.3.2", 109 | "type-is": "1.6.15" 110 | } 111 | }, 112 | "boom": { 113 | "version": "4.3.1", 114 | "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", 115 | "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", 116 | "requires": { 117 | "hoek": "4.2.0" 118 | } 119 | }, 120 | "brace-expansion": { 121 | "version": "1.1.8", 122 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", 123 | "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", 124 | "optional": true, 125 | "requires": { 126 | "balanced-match": "1.0.0", 127 | "concat-map": "0.0.1" 128 | } 129 | }, 130 | "bunyan": { 131 | "version": "1.8.12", 132 | "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.12.tgz", 133 | "integrity": "sha1-8VDw9nSKvdcq6uhPBEA74u8RN5c=", 134 | "requires": { 135 | "dtrace-provider": "0.8.5", 136 | "moment": "2.19.4", 137 | "mv": "2.1.1", 138 | "safe-json-stringify": "1.0.4" 139 | } 140 | }, 141 | "bunyan-format": { 142 | "version": "0.2.1", 143 | "resolved": "https://registry.npmjs.org/bunyan-format/-/bunyan-format-0.2.1.tgz", 144 | "integrity": "sha1-pLOw2ABwqGUnlBcmnj8A/wL7y0c=", 145 | "requires": { 146 | "ansicolors": "0.2.1", 147 | "ansistyles": "0.1.3", 148 | "xtend": "2.1.2" 149 | }, 150 | "dependencies": { 151 | "xtend": { 152 | "version": "2.1.2", 153 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.1.2.tgz", 154 | "integrity": "sha1-bv7MKk2tjmlixJAbM3znuoe10os=", 155 | "requires": { 156 | "object-keys": "0.4.0" 157 | } 158 | } 159 | } 160 | }, 161 | "bytes": { 162 | "version": "3.0.0", 163 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", 164 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" 165 | }, 166 | "caseless": { 167 | "version": "0.12.0", 168 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 169 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 170 | }, 171 | "co": { 172 | "version": "4.6.0", 173 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 174 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 175 | }, 176 | "combined-stream": { 177 | "version": "1.0.5", 178 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", 179 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", 180 | "requires": { 181 | "delayed-stream": "1.0.0" 182 | } 183 | }, 184 | "commander": { 185 | "version": "2.12.2", 186 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", 187 | "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==" 188 | }, 189 | "concat-map": { 190 | "version": "0.0.1", 191 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 192 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 193 | "optional": true 194 | }, 195 | "content-disposition": { 196 | "version": "0.5.2", 197 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", 198 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" 199 | }, 200 | "content-type": { 201 | "version": "1.0.4", 202 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 203 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 204 | }, 205 | "cookie": { 206 | "version": "0.3.1", 207 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", 208 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" 209 | }, 210 | "cookie-signature": { 211 | "version": "1.0.6", 212 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 213 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 214 | }, 215 | "core-util-is": { 216 | "version": "1.0.2", 217 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 218 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 219 | }, 220 | "cryptiles": { 221 | "version": "3.1.2", 222 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", 223 | "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", 224 | "requires": { 225 | "boom": "5.2.0" 226 | }, 227 | "dependencies": { 228 | "boom": { 229 | "version": "5.2.0", 230 | "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", 231 | "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", 232 | "requires": { 233 | "hoek": "4.2.0" 234 | } 235 | } 236 | } 237 | }, 238 | "crypto-random-string": { 239 | "version": "1.0.0", 240 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", 241 | "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=" 242 | }, 243 | "dashdash": { 244 | "version": "1.14.1", 245 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 246 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 247 | "requires": { 248 | "assert-plus": "1.0.0" 249 | } 250 | }, 251 | "debug": { 252 | "version": "2.6.9", 253 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 254 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 255 | "requires": { 256 | "ms": "2.0.0" 257 | } 258 | }, 259 | "delayed-stream": { 260 | "version": "1.0.0", 261 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 262 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 263 | }, 264 | "depd": { 265 | "version": "1.1.1", 266 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", 267 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" 268 | }, 269 | "destroy": { 270 | "version": "1.0.4", 271 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 272 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 273 | }, 274 | "dotenv": { 275 | "version": "4.0.0", 276 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-4.0.0.tgz", 277 | "integrity": "sha1-hk7xN5rO1Vzm+V3r7NzhefegzR0=" 278 | }, 279 | "dtrace-provider": { 280 | "version": "0.8.5", 281 | "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.5.tgz", 282 | "integrity": "sha1-mOu6Ihr6xG4cOf02hY2Pk2dSS5I=", 283 | "optional": true, 284 | "requires": { 285 | "nan": "2.8.0" 286 | } 287 | }, 288 | "ecc-jsbn": { 289 | "version": "0.1.1", 290 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 291 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 292 | "optional": true, 293 | "requires": { 294 | "jsbn": "0.1.1" 295 | } 296 | }, 297 | "ee-first": { 298 | "version": "1.1.1", 299 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 300 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 301 | }, 302 | "encodeurl": { 303 | "version": "1.0.1", 304 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", 305 | "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" 306 | }, 307 | "error-ex": { 308 | "version": "1.3.1", 309 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", 310 | "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", 311 | "requires": { 312 | "is-arrayish": "0.2.1" 313 | } 314 | }, 315 | "escape-html": { 316 | "version": "1.0.3", 317 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 318 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 319 | }, 320 | "etag": { 321 | "version": "1.8.1", 322 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 323 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 324 | }, 325 | "express": { 326 | "version": "4.16.2", 327 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", 328 | "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", 329 | "requires": { 330 | "accepts": "1.3.4", 331 | "array-flatten": "1.1.1", 332 | "body-parser": "1.18.2", 333 | "content-disposition": "0.5.2", 334 | "content-type": "1.0.4", 335 | "cookie": "0.3.1", 336 | "cookie-signature": "1.0.6", 337 | "debug": "2.6.9", 338 | "depd": "1.1.1", 339 | "encodeurl": "1.0.1", 340 | "escape-html": "1.0.3", 341 | "etag": "1.8.1", 342 | "finalhandler": "1.1.0", 343 | "fresh": "0.5.2", 344 | "merge-descriptors": "1.0.1", 345 | "methods": "1.1.2", 346 | "on-finished": "2.3.0", 347 | "parseurl": "1.3.2", 348 | "path-to-regexp": "0.1.7", 349 | "proxy-addr": "2.0.2", 350 | "qs": "6.5.1", 351 | "range-parser": "1.2.0", 352 | "safe-buffer": "5.1.1", 353 | "send": "0.16.1", 354 | "serve-static": "1.13.1", 355 | "setprototypeof": "1.1.0", 356 | "statuses": "1.3.1", 357 | "type-is": "1.6.15", 358 | "utils-merge": "1.0.1", 359 | "vary": "1.1.2" 360 | } 361 | }, 362 | "extend": { 363 | "version": "3.0.1", 364 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 365 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 366 | }, 367 | "extsprintf": { 368 | "version": "1.3.0", 369 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 370 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 371 | }, 372 | "fast-deep-equal": { 373 | "version": "1.0.0", 374 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", 375 | "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" 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 | }, 382 | "finalhandler": { 383 | "version": "1.1.0", 384 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", 385 | "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", 386 | "requires": { 387 | "debug": "2.6.9", 388 | "encodeurl": "1.0.1", 389 | "escape-html": "1.0.3", 390 | "on-finished": "2.3.0", 391 | "parseurl": "1.3.2", 392 | "statuses": "1.3.1", 393 | "unpipe": "1.0.0" 394 | } 395 | }, 396 | "find-up": { 397 | "version": "2.1.0", 398 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 399 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 400 | "requires": { 401 | "locate-path": "2.0.0" 402 | } 403 | }, 404 | "forever-agent": { 405 | "version": "0.6.1", 406 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 407 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 408 | }, 409 | "form-data": { 410 | "version": "2.3.1", 411 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", 412 | "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", 413 | "requires": { 414 | "asynckit": "0.4.0", 415 | "combined-stream": "1.0.5", 416 | "mime-types": "2.1.17" 417 | } 418 | }, 419 | "forwarded": { 420 | "version": "0.1.2", 421 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 422 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 423 | }, 424 | "fresh": { 425 | "version": "0.5.2", 426 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 427 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 428 | }, 429 | "getpass": { 430 | "version": "0.1.7", 431 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 432 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 433 | "requires": { 434 | "assert-plus": "1.0.0" 435 | } 436 | }, 437 | "glob": { 438 | "version": "6.0.4", 439 | "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", 440 | "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", 441 | "optional": true, 442 | "requires": { 443 | "inflight": "1.0.6", 444 | "inherits": "2.0.3", 445 | "minimatch": "3.0.4", 446 | "once": "1.4.0", 447 | "path-is-absolute": "1.0.1" 448 | } 449 | }, 450 | "graceful-fs": { 451 | "version": "4.1.11", 452 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 453 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" 454 | }, 455 | "har-schema": { 456 | "version": "2.0.0", 457 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 458 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 459 | }, 460 | "har-validator": { 461 | "version": "5.0.3", 462 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", 463 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", 464 | "requires": { 465 | "ajv": "5.5.2", 466 | "har-schema": "2.0.0" 467 | } 468 | }, 469 | "hawk": { 470 | "version": "6.0.2", 471 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", 472 | "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", 473 | "requires": { 474 | "boom": "4.3.1", 475 | "cryptiles": "3.1.2", 476 | "hoek": "4.2.0", 477 | "sntp": "2.1.0" 478 | } 479 | }, 480 | "hoek": { 481 | "version": "4.2.0", 482 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", 483 | "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" 484 | }, 485 | "http-errors": { 486 | "version": "1.6.2", 487 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", 488 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", 489 | "requires": { 490 | "depd": "1.1.1", 491 | "inherits": "2.0.3", 492 | "setprototypeof": "1.0.3", 493 | "statuses": "1.3.1" 494 | }, 495 | "dependencies": { 496 | "setprototypeof": { 497 | "version": "1.0.3", 498 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", 499 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" 500 | } 501 | } 502 | }, 503 | "http-signature": { 504 | "version": "1.2.0", 505 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 506 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 507 | "requires": { 508 | "assert-plus": "1.0.0", 509 | "jsprim": "1.4.1", 510 | "sshpk": "1.13.1" 511 | } 512 | }, 513 | "iconv-lite": { 514 | "version": "0.4.19", 515 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", 516 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" 517 | }, 518 | "inflight": { 519 | "version": "1.0.6", 520 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 521 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 522 | "optional": true, 523 | "requires": { 524 | "once": "1.4.0", 525 | "wrappy": "1.0.2" 526 | } 527 | }, 528 | "inherits": { 529 | "version": "2.0.3", 530 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 531 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 532 | }, 533 | "ipaddr.js": { 534 | "version": "1.5.2", 535 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", 536 | "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" 537 | }, 538 | "is-arrayish": { 539 | "version": "0.2.1", 540 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 541 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 542 | }, 543 | "is-typedarray": { 544 | "version": "1.0.0", 545 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 546 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 547 | }, 548 | "isarray": { 549 | "version": "1.0.0", 550 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 551 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 552 | }, 553 | "isstream": { 554 | "version": "0.1.2", 555 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 556 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 557 | }, 558 | "jsbn": { 559 | "version": "0.1.1", 560 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 561 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 562 | "optional": true 563 | }, 564 | "json-parse-better-errors": { 565 | "version": "1.0.1", 566 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", 567 | "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==" 568 | }, 569 | "json-schema": { 570 | "version": "0.2.3", 571 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 572 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 573 | }, 574 | "json-schema-traverse": { 575 | "version": "0.3.1", 576 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 577 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" 578 | }, 579 | "json-stringify-safe": { 580 | "version": "5.0.1", 581 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 582 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 583 | }, 584 | "jsprim": { 585 | "version": "1.4.1", 586 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 587 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 588 | "requires": { 589 | "assert-plus": "1.0.0", 590 | "extsprintf": "1.3.0", 591 | "json-schema": "0.2.3", 592 | "verror": "1.10.0" 593 | } 594 | }, 595 | "load-json-file": { 596 | "version": "4.0.0", 597 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", 598 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", 599 | "requires": { 600 | "graceful-fs": "4.1.11", 601 | "parse-json": "4.0.0", 602 | "pify": "3.0.0", 603 | "strip-bom": "3.0.0" 604 | } 605 | }, 606 | "locate-path": { 607 | "version": "2.0.0", 608 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 609 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 610 | "requires": { 611 | "p-locate": "2.0.0", 612 | "path-exists": "3.0.0" 613 | } 614 | }, 615 | "lodash": { 616 | "version": "4.17.4", 617 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 618 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" 619 | }, 620 | "media-typer": { 621 | "version": "0.3.0", 622 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 623 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 624 | }, 625 | "merge-descriptors": { 626 | "version": "1.0.1", 627 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 628 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 629 | }, 630 | "methods": { 631 | "version": "1.1.2", 632 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 633 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 634 | }, 635 | "mime": { 636 | "version": "1.4.1", 637 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", 638 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" 639 | }, 640 | "mime-db": { 641 | "version": "1.30.0", 642 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", 643 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" 644 | }, 645 | "mime-types": { 646 | "version": "2.1.17", 647 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", 648 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", 649 | "requires": { 650 | "mime-db": "1.30.0" 651 | } 652 | }, 653 | "minimatch": { 654 | "version": "3.0.4", 655 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 656 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 657 | "optional": true, 658 | "requires": { 659 | "brace-expansion": "1.1.8" 660 | } 661 | }, 662 | "minimist": { 663 | "version": "0.0.8", 664 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 665 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 666 | "optional": true 667 | }, 668 | "mkdirp": { 669 | "version": "0.5.1", 670 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 671 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 672 | "optional": true, 673 | "requires": { 674 | "minimist": "0.0.8" 675 | } 676 | }, 677 | "moment": { 678 | "version": "2.19.4", 679 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.4.tgz", 680 | "integrity": "sha512-1xFTAknSLfc47DIxHDUbnJWC+UwgWxATmymaxIPQpmMh7LBm7ZbwVEsuushqwL2GYZU0jie4xO+TK44hJPjNSQ==", 681 | "optional": true 682 | }, 683 | "ms": { 684 | "version": "2.0.0", 685 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 686 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 687 | }, 688 | "mv": { 689 | "version": "2.1.1", 690 | "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz", 691 | "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", 692 | "optional": true, 693 | "requires": { 694 | "mkdirp": "0.5.1", 695 | "ncp": "2.0.0", 696 | "rimraf": "2.4.5" 697 | } 698 | }, 699 | "nan": { 700 | "version": "2.8.0", 701 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", 702 | "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", 703 | "optional": true 704 | }, 705 | "ncp": { 706 | "version": "2.0.0", 707 | "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", 708 | "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", 709 | "optional": true 710 | }, 711 | "negotiator": { 712 | "version": "0.6.1", 713 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", 714 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" 715 | }, 716 | "node-gitlab-api": { 717 | "version": "2.1.1", 718 | "resolved": "https://registry.npmjs.org/node-gitlab-api/-/node-gitlab-api-2.1.1.tgz", 719 | "integrity": "sha512-yNBOS4R+E64fdXD8yO85nU2gcMthVx06tWD04HrnesNaJ2UMdS6SBf0YunUiR/3QWjvcmdHZHPbkWB0WsQ5kyQ==", 720 | "requires": { 721 | "parse-link-header": "1.0.1", 722 | "request": "2.83.0", 723 | "request-promise": "4.2.2", 724 | "tempy": "0.2.1" 725 | } 726 | }, 727 | "node-gitlab-webhook": { 728 | "version": "1.0.3", 729 | "resolved": "https://registry.npmjs.org/node-gitlab-webhook/-/node-gitlab-webhook-1.0.3.tgz", 730 | "integrity": "sha512-B6mrQ8ZHC6qQ5R+gyqqJO/6ElGsDSpyjBjLelYGW500YdA2pqL1H59K9S8TuiqmxX9DaO12qAZ6RyTS7ggHGyQ==", 731 | "requires": { 732 | "bl": "1.2.1" 733 | } 734 | }, 735 | "oauth-sign": { 736 | "version": "0.8.2", 737 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 738 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 739 | }, 740 | "object-keys": { 741 | "version": "0.4.0", 742 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.4.0.tgz", 743 | "integrity": "sha1-KKaq50KN0sOpLz2V8hM13SBOAzY=" 744 | }, 745 | "on-finished": { 746 | "version": "2.3.0", 747 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 748 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 749 | "requires": { 750 | "ee-first": "1.1.1" 751 | } 752 | }, 753 | "once": { 754 | "version": "1.4.0", 755 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 756 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 757 | "requires": { 758 | "wrappy": "1.0.2" 759 | } 760 | }, 761 | "p-limit": { 762 | "version": "1.2.0", 763 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", 764 | "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", 765 | "requires": { 766 | "p-try": "1.0.0" 767 | } 768 | }, 769 | "p-locate": { 770 | "version": "2.0.0", 771 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 772 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 773 | "requires": { 774 | "p-limit": "1.2.0" 775 | } 776 | }, 777 | "p-try": { 778 | "version": "1.0.0", 779 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 780 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" 781 | }, 782 | "parse-json": { 783 | "version": "4.0.0", 784 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 785 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 786 | "requires": { 787 | "error-ex": "1.3.1", 788 | "json-parse-better-errors": "1.0.1" 789 | } 790 | }, 791 | "parse-link-header": { 792 | "version": "1.0.1", 793 | "resolved": "https://registry.npmjs.org/parse-link-header/-/parse-link-header-1.0.1.tgz", 794 | "integrity": "sha1-vt/g0hGK64S+deewJUGeyKYRQKc=", 795 | "requires": { 796 | "xtend": "4.0.1" 797 | } 798 | }, 799 | "parseurl": { 800 | "version": "1.3.2", 801 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", 802 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" 803 | }, 804 | "path-exists": { 805 | "version": "3.0.0", 806 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 807 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 808 | }, 809 | "path-is-absolute": { 810 | "version": "1.0.1", 811 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 812 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 813 | "optional": true 814 | }, 815 | "path-parse": { 816 | "version": "1.0.5", 817 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", 818 | "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=" 819 | }, 820 | "path-to-regexp": { 821 | "version": "0.1.7", 822 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 823 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 824 | }, 825 | "performance-now": { 826 | "version": "2.1.0", 827 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 828 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 829 | }, 830 | "pify": { 831 | "version": "3.0.0", 832 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 833 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 834 | }, 835 | "pkg-conf": { 836 | "version": "2.1.0", 837 | "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-2.1.0.tgz", 838 | "integrity": "sha1-ISZRTKbyq/69FoWW3xi6V4Z/AFg=", 839 | "requires": { 840 | "find-up": "2.1.0", 841 | "load-json-file": "4.0.0" 842 | } 843 | }, 844 | "process-nextick-args": { 845 | "version": "1.0.7", 846 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 847 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 848 | }, 849 | "promise-events": { 850 | "version": "0.1.4", 851 | "resolved": "https://registry.npmjs.org/promise-events/-/promise-events-0.1.4.tgz", 852 | "integrity": "sha1-PIj66X5EjaaPf88Z1O4wjW5DLVs=" 853 | }, 854 | "proxy-addr": { 855 | "version": "2.0.2", 856 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", 857 | "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", 858 | "requires": { 859 | "forwarded": "0.1.2", 860 | "ipaddr.js": "1.5.2" 861 | } 862 | }, 863 | "punycode": { 864 | "version": "1.4.1", 865 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 866 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 867 | }, 868 | "qs": { 869 | "version": "6.5.1", 870 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", 871 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" 872 | }, 873 | "range-parser": { 874 | "version": "1.2.0", 875 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", 876 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" 877 | }, 878 | "raw-body": { 879 | "version": "2.3.2", 880 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", 881 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", 882 | "requires": { 883 | "bytes": "3.0.0", 884 | "http-errors": "1.6.2", 885 | "iconv-lite": "0.4.19", 886 | "unpipe": "1.0.0" 887 | } 888 | }, 889 | "readable-stream": { 890 | "version": "2.3.3", 891 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 892 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 893 | "requires": { 894 | "core-util-is": "1.0.2", 895 | "inherits": "2.0.3", 896 | "isarray": "1.0.0", 897 | "process-nextick-args": "1.0.7", 898 | "safe-buffer": "5.1.1", 899 | "string_decoder": "1.0.3", 900 | "util-deprecate": "1.0.2" 901 | } 902 | }, 903 | "request": { 904 | "version": "2.83.0", 905 | "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", 906 | "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", 907 | "requires": { 908 | "aws-sign2": "0.7.0", 909 | "aws4": "1.6.0", 910 | "caseless": "0.12.0", 911 | "combined-stream": "1.0.5", 912 | "extend": "3.0.1", 913 | "forever-agent": "0.6.1", 914 | "form-data": "2.3.1", 915 | "har-validator": "5.0.3", 916 | "hawk": "6.0.2", 917 | "http-signature": "1.2.0", 918 | "is-typedarray": "1.0.0", 919 | "isstream": "0.1.2", 920 | "json-stringify-safe": "5.0.1", 921 | "mime-types": "2.1.17", 922 | "oauth-sign": "0.8.2", 923 | "performance-now": "2.1.0", 924 | "qs": "6.5.1", 925 | "safe-buffer": "5.1.1", 926 | "stringstream": "0.0.5", 927 | "tough-cookie": "2.3.3", 928 | "tunnel-agent": "0.6.0", 929 | "uuid": "3.1.0" 930 | } 931 | }, 932 | "request-promise": { 933 | "version": "4.2.2", 934 | "resolved": "https://registry.npmjs.org/request-promise/-/request-promise-4.2.2.tgz", 935 | "integrity": "sha1-0epG1lSm7k+O5qT+oQGMIpEZBLQ=", 936 | "requires": { 937 | "bluebird": "3.5.1", 938 | "request-promise-core": "1.1.1", 939 | "stealthy-require": "1.1.1", 940 | "tough-cookie": "2.3.3" 941 | } 942 | }, 943 | "request-promise-core": { 944 | "version": "1.1.1", 945 | "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", 946 | "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", 947 | "requires": { 948 | "lodash": "4.17.4" 949 | } 950 | }, 951 | "resolve": { 952 | "version": "1.5.0", 953 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", 954 | "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", 955 | "requires": { 956 | "path-parse": "1.0.5" 957 | } 958 | }, 959 | "rimraf": { 960 | "version": "2.4.5", 961 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", 962 | "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", 963 | "optional": true, 964 | "requires": { 965 | "glob": "6.0.4" 966 | } 967 | }, 968 | "safe-buffer": { 969 | "version": "5.1.1", 970 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 971 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 972 | }, 973 | "safe-json-stringify": { 974 | "version": "1.0.4", 975 | "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.0.4.tgz", 976 | "integrity": "sha1-gaCY9Efku8P/MxKiQ1IbwGDvWRE=", 977 | "optional": true 978 | }, 979 | "send": { 980 | "version": "0.16.1", 981 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", 982 | "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", 983 | "requires": { 984 | "debug": "2.6.9", 985 | "depd": "1.1.1", 986 | "destroy": "1.0.4", 987 | "encodeurl": "1.0.1", 988 | "escape-html": "1.0.3", 989 | "etag": "1.8.1", 990 | "fresh": "0.5.2", 991 | "http-errors": "1.6.2", 992 | "mime": "1.4.1", 993 | "ms": "2.0.0", 994 | "on-finished": "2.3.0", 995 | "range-parser": "1.2.0", 996 | "statuses": "1.3.1" 997 | } 998 | }, 999 | "serve-static": { 1000 | "version": "1.13.1", 1001 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", 1002 | "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", 1003 | "requires": { 1004 | "encodeurl": "1.0.1", 1005 | "escape-html": "1.0.3", 1006 | "parseurl": "1.3.2", 1007 | "send": "0.16.1" 1008 | } 1009 | }, 1010 | "setprototypeof": { 1011 | "version": "1.1.0", 1012 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", 1013 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" 1014 | }, 1015 | "sntp": { 1016 | "version": "2.1.0", 1017 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", 1018 | "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", 1019 | "requires": { 1020 | "hoek": "4.2.0" 1021 | } 1022 | }, 1023 | "sshpk": { 1024 | "version": "1.13.1", 1025 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", 1026 | "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", 1027 | "requires": { 1028 | "asn1": "0.2.3", 1029 | "assert-plus": "1.0.0", 1030 | "bcrypt-pbkdf": "1.0.1", 1031 | "dashdash": "1.14.1", 1032 | "ecc-jsbn": "0.1.1", 1033 | "getpass": "0.1.7", 1034 | "jsbn": "0.1.1", 1035 | "tweetnacl": "0.14.5" 1036 | } 1037 | }, 1038 | "statuses": { 1039 | "version": "1.3.1", 1040 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", 1041 | "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" 1042 | }, 1043 | "stealthy-require": { 1044 | "version": "1.1.1", 1045 | "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", 1046 | "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" 1047 | }, 1048 | "string_decoder": { 1049 | "version": "1.0.3", 1050 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 1051 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 1052 | "requires": { 1053 | "safe-buffer": "5.1.1" 1054 | } 1055 | }, 1056 | "stringstream": { 1057 | "version": "0.0.5", 1058 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 1059 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" 1060 | }, 1061 | "strip-bom": { 1062 | "version": "3.0.0", 1063 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 1064 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" 1065 | }, 1066 | "temp-dir": { 1067 | "version": "1.0.0", 1068 | "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", 1069 | "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=" 1070 | }, 1071 | "tempy": { 1072 | "version": "0.2.1", 1073 | "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.2.1.tgz", 1074 | "integrity": "sha512-LB83o9bfZGrntdqPuRdanIVCPReam9SOZKW0fOy5I9X3A854GGWi0tjCqoXEk84XIEYBc/x9Hq3EFop/H5wJaw==", 1075 | "requires": { 1076 | "temp-dir": "1.0.0", 1077 | "unique-string": "1.0.0" 1078 | } 1079 | }, 1080 | "tough-cookie": { 1081 | "version": "2.3.3", 1082 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", 1083 | "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", 1084 | "requires": { 1085 | "punycode": "1.4.1" 1086 | } 1087 | }, 1088 | "tunnel-agent": { 1089 | "version": "0.6.0", 1090 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1091 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1092 | "requires": { 1093 | "safe-buffer": "5.1.1" 1094 | } 1095 | }, 1096 | "tweetnacl": { 1097 | "version": "0.14.5", 1098 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1099 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 1100 | "optional": true 1101 | }, 1102 | "type-is": { 1103 | "version": "1.6.15", 1104 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", 1105 | "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", 1106 | "requires": { 1107 | "media-typer": "0.3.0", 1108 | "mime-types": "2.1.17" 1109 | } 1110 | }, 1111 | "unique-string": { 1112 | "version": "1.0.0", 1113 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", 1114 | "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", 1115 | "requires": { 1116 | "crypto-random-string": "1.0.0" 1117 | } 1118 | }, 1119 | "unpipe": { 1120 | "version": "1.0.0", 1121 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1122 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1123 | }, 1124 | "util-deprecate": { 1125 | "version": "1.0.2", 1126 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1127 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1128 | }, 1129 | "utils-merge": { 1130 | "version": "1.0.1", 1131 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1132 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1133 | }, 1134 | "uuid": { 1135 | "version": "3.1.0", 1136 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", 1137 | "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" 1138 | }, 1139 | "vary": { 1140 | "version": "1.1.2", 1141 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1142 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1143 | }, 1144 | "verror": { 1145 | "version": "1.10.0", 1146 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1147 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1148 | "requires": { 1149 | "assert-plus": "1.0.0", 1150 | "core-util-is": "1.0.2", 1151 | "extsprintf": "1.3.0" 1152 | } 1153 | }, 1154 | "wrappy": { 1155 | "version": "1.0.2", 1156 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1157 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1158 | }, 1159 | "xtend": { 1160 | "version": "4.0.1", 1161 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 1162 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 1163 | } 1164 | } 1165 | } 1166 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gitlab-bot", 3 | "version": "1.1.0", 4 | "description": "A bot to automatically react on gitlab events. It should be able to enhance the bot with plugins.", 5 | "main": "lib/index.js", 6 | "bin": { 7 | "gitlab-bot": "./bin/gitlab-bot.js" 8 | }, 9 | "scripts": { 10 | "test": "echo \"Error: no test specified\" && exit 1", 11 | "start": "node bin/gitlab-bot" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "https://github.com/gopenguin/gitlab-bot" 16 | }, 17 | "author": "Anita Hensel, Stefan Kollmann", 18 | "license": "MIT", 19 | "dependencies": { 20 | "bunyan": "^1.8.12", 21 | "bunyan-format": "^0.2.1", 22 | "commander": "^2.12.2", 23 | "dotenv": "^4.0.0", 24 | "express": "^4.16.2", 25 | "node-gitlab-api": "^2.1.1", 26 | "node-gitlab-webhook": "^1.0.3", 27 | "pkg-conf": "^2.1.0", 28 | "promise-events": "^0.1.4", 29 | "resolve": "^1.5.0" 30 | } 31 | } 32 | --------------------------------------------------------------------------------