From 422a2099722f527da4ee25c7ab0725dfb9eed940 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Tue, 19 Dec 2017 13:18:09 -0200 Subject: [PATCH 001/126] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3d7f71e..c3c495e 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ It uses the [Backstage Functions Sandbox](https://github.com/backstage/functions ## Running locally without Docker ### Requirements - Redis 3.0+ -- NodeJS 6.10.2 +- NodeJS 8.9.1 ### Download the project ```bash From 7a9571abf2fcb3f78ac8573bd5aeaeb97bfcee7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Tue, 19 Dec 2017 14:57:10 -0200 Subject: [PATCH 002/126] status: Add state of ErrorTracker --- lib/domain/ErrorTracker.js | 34 +++++ lib/domain/status.js | 43 +++++- lib/http/routers/StatusRouter.js | 17 +-- npm-shrinkwrap.json | 123 ++++++++++++++---- package.json | 2 +- .../domain/storage/storage-redis.test.js | 4 +- test/unit/domain/LogStorage.test.js | 2 +- test/unit/domain/Metric.test.js | 7 +- test/unit/domain/status.test.js | 59 +++++++-- 9 files changed, 232 insertions(+), 59 deletions(-) diff --git a/lib/domain/ErrorTracker.js b/lib/domain/ErrorTracker.js index 946f042..c6fa6d3 100644 --- a/lib/domain/ErrorTracker.js +++ b/lib/domain/ErrorTracker.js @@ -1,4 +1,5 @@ const raven = require('raven'); +const request = require('request'); const https = require('https'); const { parseError } = require('raven/lib/parsers'); const { getModules, getCulprit } = require('raven/lib/utils'); @@ -106,6 +107,39 @@ class ErrorTracker { notifySentryGlobal(ctx); }); } + + static get name() { + return 'Sentry'; + } + + static async ping() { + const dsn = globalSentryDSNClient.dsn; + + if (!dsn) { + return 'SENTRY_DSN is not setted yet'; + } + + const url = `${dsn.protocol}://${dsn.host}/api/0/`; + + return new Promise((resolve, reject) => { + request({ + url, + timeout: 3000, + }, (err, response) => { + if (err) { + reject(err); + return; + } + + if (response.statusCode === 200) { + resolve('OK'); + return; + } + + reject(new Error(`HTTP status: ${response.statusCode} requesting sentry`)); + }); + }); + } } module.exports = ErrorTracker; diff --git a/lib/domain/status.js b/lib/domain/status.js index 2b91c03..b3e1461 100644 --- a/lib/domain/status.js +++ b/lib/domain/status.js @@ -1,26 +1,55 @@ +const ErrorTracker = require('./ErrorTracker'); + + class Status { constructor(storage) { this.storage = storage; } async run() { - const startTime = new Date().getTime(); + this.services = []; + this.startTime = new Date().getTime(); + try { const reply = await this.storage.ping(); - return { + this.push({ name: this.storage.name, status: 'WORKING', message: reply.toString(), - time: (new Date().getTime() - startTime), - }; + }); } catch (error) { - return { + this.push({ name: this.storage.name, status: 'FAILED', message: error.toString(), - time: (new Date().getTime() - startTime), - }; + }); } + + try { + const reply = await ErrorTracker.ping(); + this.push({ + name: ErrorTracker.name, + status: 'WORKING', + message: reply, + }); + } catch (error) { + this.push({ + name: ErrorTracker.name, + status: 'FAILED', + message: error.toString(), + }); + } + + return this.services; + } + + push({ name, status, message }) { + this.services.push({ + name, + status, + message, + time: (new Date().getTime() - this.startTime), + }); } } diff --git a/lib/http/routers/StatusRouter.js b/lib/http/routers/StatusRouter.js index 47bdc30..ab8521e 100644 --- a/lib/http/routers/StatusRouter.js +++ b/lib/http/routers/StatusRouter.js @@ -6,16 +6,17 @@ const router = new Router(); router.get('/', async (req, res) => { const memoryStorage = req.app.get('memoryStorage'); - const status = new Status(memoryStorage); - const output = await status.run(); - const statusCode = output.status === 'WORKING' ? 200 : 500; + const services = await new Status(memoryStorage).run(); + const failedServices = services.filter(s => s.status !== 'WORKING'); - if (statusCode === 500) { - log.error(output.message); + let statusCode = 200; + + for (const failedService of failedServices) { + statusCode = 500; + log.error(failedService.message); } - res.status(statusCode).json({ - services: [output], - }); + + res.status(statusCode).json({ services }); }); module.exports = router; diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 521e727..f51a828 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1645,12 +1645,12 @@ } }, "formatio": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz", - "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", + "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", "dev": true, "requires": { - "samsam": "1.1.2" + "samsam": "1.3.0" } }, "formidable": { @@ -3512,6 +3512,12 @@ "integrity": "sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE=", "dev": true }, + "just-extend": { + "version": "1.1.27", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz", + "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==", + "dev": true + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -3695,6 +3701,12 @@ "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, "lodash.isarguments": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", @@ -3766,9 +3778,9 @@ "dev": true }, "lolex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz", - "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.1.tgz", + "integrity": "sha512-mQuW55GhduF3ppo+ZRUTz1PRjEh1hS5BbqU7d8D0ez2OKxHDod7StPPeAVKisZR5aLkHZjdGWSL42LSONUJsZw==", "dev": true }, "longest": { @@ -4006,6 +4018,42 @@ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" }, + "nise": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.2.0.tgz", + "integrity": "sha512-q9jXh3UNsMV28KeqI43ILz5+c3l+RiNW8mhurEwCKckuHQbL+hTJIKKTiUlCPKlgQ/OukFvSnKB/Jk3+sFbkGA==", + "dev": true, + "requires": { + "formatio": "1.2.0", + "just-extend": "1.1.27", + "lolex": "1.6.0", + "path-to-regexp": "1.7.0", + "text-encoding": "0.6.4" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "lolex": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", + "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + } + } + }, "nodemon": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.12.1.tgz", @@ -6524,9 +6572,9 @@ "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" }, "samsam": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz", - "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", "dev": true }, "semver": { @@ -6631,15 +6679,41 @@ "dev": true }, "sinon": { - "version": "1.17.7", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz", - "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.1.3.tgz", + "integrity": "sha512-c7u0ZuvBRX1eXuB4jN3BRCAOGiUTlM8SE3TxbJHrNiHUKL7wonujMOB6Fi1gQc00U91IscFORQHDga/eccqpbw==", "dev": true, "requires": { - "formatio": "1.1.1", - "lolex": "1.3.2", - "samsam": "1.1.2", - "util": "0.10.3" + "diff": "3.2.0", + "formatio": "1.2.0", + "lodash.get": "4.4.2", + "lolex": "2.3.1", + "nise": "1.2.0", + "supports-color": "4.5.0", + "type-detect": "4.0.5" + }, + "dependencies": { + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "type-detect": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.5.tgz", + "integrity": "sha512-N9IvkQslUGYGC24RkJk1ba99foK6TkwC2FHAEBlQFBP0RxQZS8ZpJuAZcwiY/w9ZJHFQb1aOXBI60OdxhTrwEQ==", + "dev": true + } } }, "slice-ansi": { @@ -6893,6 +6967,12 @@ "execa": "0.7.0" } }, + "text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", + "dev": true + }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", @@ -7112,15 +7192,6 @@ "os-homedir": "1.0.2" } }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", diff --git a/package.json b/package.json index fb6aec7..878bbc4 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "mocha": "^3.0.2", "nodemon": "^1.10.2", "nyc": "^11.3.0", - "sinon": "^1.17.6", + "sinon": "^4.1.3", "supertest": "^2.0.0" } } diff --git a/test/integration/domain/storage/storage-redis.test.js b/test/integration/domain/storage/storage-redis.test.js index 0f12b8e..70d8adf 100644 --- a/test/integration/domain/storage/storage-redis.test.js +++ b/test/integration/domain/storage/storage-redis.test.js @@ -480,8 +480,8 @@ describe('StorageRedis', () => { before(() => { sandbox = sinon.sandbox.create(); fakeWorker = new FakeWorker(); - sandbox.stub(storage, 'worker', fakeWorker); - sandbox.stub(storage, 'ping', () => new Promise(() => {})); + sandbox.stub(storage, 'worker').value(fakeWorker); + sandbox.stub(storage, 'ping').callsFake(() => new Promise(() => {})); }); after(() => { diff --git a/test/unit/domain/LogStorage.test.js b/test/unit/domain/LogStorage.test.js index 3ce4d63..583d363 100644 --- a/test/unit/domain/LogStorage.test.js +++ b/test/unit/domain/LogStorage.test.js @@ -51,7 +51,7 @@ describe('GelfLogStorage', () => { gelfServer.listen(); sandbox = sinon.sandbox.create(); - sandbox.stub(config.log, 'fieldsFromHTTPHeaders', { + sandbox.stub(config.log, 'fieldsFromHTTPHeaders').value({ rid: 'x-rid', clientId: 'x-client-id', }); diff --git a/test/unit/domain/Metric.test.js b/test/unit/domain/Metric.test.js index d8bff39..5357ea0 100644 --- a/test/unit/domain/Metric.test.js +++ b/test/unit/domain/Metric.test.js @@ -12,9 +12,8 @@ describe('Metric', () => { before((done) => { sandbox = sinon.sandbox.create(); - sandbox.stub(config.metric, 'client', 'functions-test'); - sandbox.stub(config.metric, 'udpHost', 'localhost'); - + sandbox.stub(config.metric, 'client').value('functions-test'); + sandbox.stub(config.metric, 'udpHost').value('localhost'); const server = dgram.createSocket('udp4'); @@ -28,7 +27,7 @@ describe('Metric', () => { }); server.on('listening', () => { - sandbox.stub(config.metric, 'udpPort', server.address().port); + sandbox.stub(config.metric, 'udpPort').value(server.address().port); done(); }); diff --git a/test/unit/domain/status.test.js b/test/unit/domain/status.test.js index 6e76300..77f4b9a 100644 --- a/test/unit/domain/status.test.js +++ b/test/unit/domain/status.test.js @@ -1,5 +1,7 @@ const expect = require('chai').expect; +const sinon = require('sinon'); const Status = require('../../../lib/domain/status'); +const ErrorTracker = require('../../../lib/domain/ErrorTracker'); const NotWorkingStorage = require('../../fakes/NotWorkingStorage'); const WorkingStorage = require('../../fakes/WorkingStorage'); @@ -8,26 +10,63 @@ describe('Status', () => { const status1 = new Status(new WorkingStorage()); const status2 = new Status(new NotWorkingStorage()); const properties = ['name', 'status', 'message', 'time']; + let sinonSandbox; + + beforeEach(() => { + sinonSandbox = sinon.sandbox.create(); + }); + + afterEach(() => { + sinonSandbox.restore(); + }); it('should contain mandatory properties on response', async () => { - const output1 = await status1.run(); - const output2 = await status2.run(); + sinonSandbox.stub(ErrorTracker, 'ping').resolves('Mocked'); + const services1 = await status1.run(); + const services2 = await status2.run(); - expect(output1).to.include.keys(properties); - expect(output2).to.include.keys(properties); + expect(services1[0]).to.include.keys(properties); + expect(services2[0]).to.include.keys(properties); + + expect(services1[1]).to.include.keys(properties); + expect(services2[1]).to.include.keys(properties); }); - describe('when service is up', () => { + describe('when storage service is up', () => { it('should show WORKING status', async () => { - const output = await status1.run(); - expect(output.status).to.eq('WORKING'); + sinonSandbox.stub(ErrorTracker, 'ping').resolves('Mocked'); + const services = await status1.run(); + expect(services[0].status).to.eq('WORKING'); }); }); - describe('when service is down', () => { + describe('when storage service is down', () => { it('should show FAILED status', async () => { - const output = await status2.run(); - expect(output.status).to.eq('FAILED'); + sinonSandbox.stub(ErrorTracker, 'ping').resolves('Mocked'); + const services = await status2.run(); + expect(services[0].status).to.eq('FAILED'); + }); + }); + + describe('when error tracker is up', () => { + it('should show WORKING status', async () => { + sinonSandbox.stub(ErrorTracker, 'ping').resolves('Mocked'); + const services = await status1.run(); + + expect(services[1].name).to.be.eql('Sentry'); + expect(services[1].status).to.be.eql('WORKING'); + expect(services[1].message).to.be.eql('Mocked'); + }); + }); + + describe('when error tracker is down', () => { + it('should show FAILED status', async () => { + sinonSandbox.stub(ErrorTracker, 'ping').rejects(new Error('Foo')); + const services = await status2.run(); + + expect(services[1].name).to.be.eql('Sentry'); + expect(services[1].status).to.be.eql('FAILED'); + expect(services[1].message).to.be.eql('Error: Foo'); }); }); }); From 247109018fd8304ac86f47cc33c64a304fa43f96 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Wed, 20 Dec 2017 09:57:26 -0200 Subject: [PATCH 003/126] GelfStorage: add support to limit size of full_message --- lib/domain/LogStorage.js | 10 ++++++++-- lib/support/config.js | 1 + npm-shrinkwrap.json | 6 +++--- package.json | 2 +- test/unit/domain/LogStorage.test.js | 23 +++++++++++++++++++++++ 5 files changed, 36 insertions(+), 6 deletions(-) diff --git a/lib/domain/LogStorage.js b/lib/domain/LogStorage.js index 890f983..bc030f0 100644 --- a/lib/domain/LogStorage.js +++ b/lib/domain/LogStorage.js @@ -28,7 +28,7 @@ class StdoutLogStorage { class GelfLogStorage { constructor(namespace, id, req) { - this.stream = new MemoryStream(); + this.stream = new MemoryStream(config.log.maxFullMessage); this.console = new PrefixLog(null, this.stream, this.stream); this.file = `${namespace}/${id}.js`; this.namespace = namespace; @@ -36,8 +36,14 @@ class GelfLogStorage { } flush({ status, requestTime }) { + let fullMessage = this.stream.buffer.join(''); + + if (this.stream.truncated) { + fullMessage += '\ntruncated'; + } + const message = Object.assign({ - full_message: this.stream.buffer.join(''), + full_message: fullMessage, status, request_time: requestTime, group: this.namespace, diff --git a/lib/support/config.js b/lib/support/config.js index 24d9b0f..1d9c99a 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -29,6 +29,7 @@ module.exports = { port: ConfigDiscovery.getInt('LOG_PORT', 12201), fields: ConfigDiscovery.getObject('LOG_FIELDS'), fieldsFromHTTPHeaders: ConfigDiscovery.getObject('LOG_FIELDS_FROM_HTTP_HEADERS'), + maxFullMessage: ConfigDiscovery.getInt('LOG_MAX_FULL_MESSAGE', 3000), morganFormat: process.env.LOG_MONGAN_FORMAT || 'tiny', }, http: { diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index f51a828..5e2af91 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@globocom/backstage-functions-sandbox": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@globocom/backstage-functions-sandbox/-/backstage-functions-sandbox-0.3.2.tgz", - "integrity": "sha512-gh8uZp6MCDBo/4RZGkGopfCEKdOq5qCLpcIu2qd4/j1a0pR8d8Z6F//84xL7FdO68NSLpXFVd6WVFWqOFGCPlw==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@globocom/backstage-functions-sandbox/-/backstage-functions-sandbox-0.3.3.tgz", + "integrity": "sha512-mueZieclLNPBoif4F8d3AcW9eVSlPnaqfv+Lr+qRrg37SqoxTfXBcX+7ekHGWCOC7VSV/365QLrF8Qflf4HSJw==", "requires": { "once": "1.4.0", "stack-trace": "0.0.9" diff --git a/package.json b/package.json index 878bbc4..d181c6e 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "author": "Backstage Team ", "license": "MIT", "dependencies": { - "@globocom/backstage-functions-sandbox": "^0.3.2", + "@globocom/backstage-functions-sandbox": "^0.3.3", "async": "^2.0.1", "body-parser": "^1.15.2", "deepcopy": "^0.6.3", diff --git a/test/unit/domain/LogStorage.test.js b/test/unit/domain/LogStorage.test.js index 583d363..5a5d377 100644 --- a/test/unit/domain/LogStorage.test.js +++ b/test/unit/domain/LogStorage.test.js @@ -178,5 +178,28 @@ describe('GelfLogStorage', () => { expect(receivedMsg.level).to.be.eql(3); }); }); + + describe('when exist a console overflow', () => { + before((done) => { + for (let i = 0; i < 1000; i += 1) { + logStorage.console.info(`line ${i}`); + } + + gelfServer.once('message', (msg) => { + receivedMsg = msg; + done(); + }); + + logStorage.flush({ + status: 500, + requestTime: 20, + }); + }); + + it('should truncate the `full_message` attribute', () => { + expect(receivedMsg.full_message.length).to.be.eql(3010); + expect(receivedMsg.full_message.endsWith('\ntruncated')).to.be.true; + }); + }); }); }); From fb08f01be26423b6eb586bacf4caadf948acc185 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Thu, 21 Dec 2017 10:19:13 -0200 Subject: [PATCH 004/126] ErrorTracker: prefix the culprit with filename --- lib/domain/ErrorTracker.js | 4 +++- test/unit/domain/ErrorTracker.test.js | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/domain/ErrorTracker.js b/lib/domain/ErrorTracker.js index c6fa6d3..6e87012 100644 --- a/lib/domain/ErrorTracker.js +++ b/lib/domain/ErrorTracker.js @@ -67,7 +67,9 @@ function filterFrames(ctx, filename, code) { }); if (frames.length > 0) { - ctx.culprit = getCulprit(frames[frames.length - 1]); + ctx.culprit = `${filename}: ${getCulprit(frames[frames.length - 1])}`; + } else { + ctx.culprit = filename; } exception.stacktrace.frames = frames; diff --git a/test/unit/domain/ErrorTracker.test.js b/test/unit/domain/ErrorTracker.test.js index 22e61d8..c9e870a 100644 --- a/test/unit/domain/ErrorTracker.test.js +++ b/test/unit/domain/ErrorTracker.test.js @@ -102,7 +102,7 @@ describe('ErrorTracker', () => { }); it('should contains the culprit', () => { - expect(resultCtx.culprit).to.be.eql('testing at main'); + expect(resultCtx.culprit).to.be.eql('testing/testing.js: testing at main'); }); it('should contains the event_id', () => { From be8c156e6d184d2b1a3cbbfd246e66a49ee6d075 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Fri, 22 Dec 2017 12:17:23 -0200 Subject: [PATCH 005/126] ErrorTracker: add prefix on event message --- lib/domain/ErrorTracker.js | 2 ++ test/unit/domain/ErrorTracker.test.js | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/domain/ErrorTracker.js b/lib/domain/ErrorTracker.js index 6e87012..cf41c49 100644 --- a/lib/domain/ErrorTracker.js +++ b/lib/domain/ErrorTracker.js @@ -74,6 +74,8 @@ function filterFrames(ctx, filename, code) { exception.stacktrace.frames = frames; } + + ctx.message = `${filename}: ${ctx.message}`; } class ErrorTracker { diff --git a/test/unit/domain/ErrorTracker.test.js b/test/unit/domain/ErrorTracker.test.js index c9e870a..3b890e2 100644 --- a/test/unit/domain/ErrorTracker.test.js +++ b/test/unit/domain/ErrorTracker.test.js @@ -141,7 +141,7 @@ describe('ErrorTracker', () => { }); it('should contains the message', () => { - expect(resultCtx.message).to.be.eql('Error: testing'); + expect(resultCtx.message).to.be.eql('testing/testing.js: Error: testing'); }); }); }); From 7bf46695a50fcae7751ccadbbc492280b94c32fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Wed, 27 Dec 2017 18:14:06 -0200 Subject: [PATCH 006/126] schemas: add json-hyper-link to update namespace settings --- lib/domain/schemas.js | 8 ++++++++ test/unit/http/routers/SchemaRouter.test.js | 16 ++++++++++++++++ 2 files changed, 24 insertions(+) diff --git a/lib/domain/schemas.js b/lib/domain/schemas.js index b17dc65..563337c 100644 --- a/lib/domain/schemas.js +++ b/lib/domain/schemas.js @@ -47,6 +47,14 @@ const functionLinks = [ href: '/functions/{namespace}/{id}/env/{envVar}', method: 'DELETE', }, + { + rel: 'update-namespace', + href: '/namespaces/{namespace}', + method: 'PUT', + schema: { + type: 'object', + }, + }, ]; const functionsItemLinks = [ diff --git a/test/unit/http/routers/SchemaRouter.test.js b/test/unit/http/routers/SchemaRouter.test.js index 5a4952f..e56dc4b 100644 --- a/test/unit/http/routers/SchemaRouter.test.js +++ b/test/unit/http/routers/SchemaRouter.test.js @@ -92,6 +92,14 @@ describe('GET /_schema/:schema', () => { method: 'DELETE', rel: 'env-unset', }, + { + href: `http://${host}/namespaces/{namespace}`, + method: 'PUT', + rel: 'update-namespace', + schema: { + type: 'object', + }, + }, { href: `http://${host}/functions/{namespace}/{id}`, method: 'POST', @@ -179,6 +187,14 @@ describe('GET /_schema/:schema', () => { method: 'DELETE', rel: 'env-unset', }, + { + href: `http://${host}/namespaces/{namespace}`, + method: 'PUT', + rel: 'update-namespace', + schema: { + type: 'object', + }, + }, ]); }) .expect(200, done); From e342eac20f56867335573af56bb8b8d2873133e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Fri, 29 Dec 2017 11:00:18 -0200 Subject: [PATCH 007/126] Add json-hyperlink to refer namespace --- lib/domain/schemas.js | 4 ++++ test/unit/http/routers/SchemaRouter.test.js | 8 ++++++++ 2 files changed, 12 insertions(+) diff --git a/lib/domain/schemas.js b/lib/domain/schemas.js index 563337c..220a797 100644 --- a/lib/domain/schemas.js +++ b/lib/domain/schemas.js @@ -47,6 +47,10 @@ const functionLinks = [ href: '/functions/{namespace}/{id}/env/{envVar}', method: 'DELETE', }, + { + rel: 'namespace', + href: '/namespaces/{namespace}', + }, { rel: 'update-namespace', href: '/namespaces/{namespace}', diff --git a/test/unit/http/routers/SchemaRouter.test.js b/test/unit/http/routers/SchemaRouter.test.js index e56dc4b..bddd563 100644 --- a/test/unit/http/routers/SchemaRouter.test.js +++ b/test/unit/http/routers/SchemaRouter.test.js @@ -92,6 +92,10 @@ describe('GET /_schema/:schema', () => { method: 'DELETE', rel: 'env-unset', }, + { + href: `http://${host}/namespaces/{namespace}`, + rel: 'namespace', + }, { href: `http://${host}/namespaces/{namespace}`, method: 'PUT', @@ -187,6 +191,10 @@ describe('GET /_schema/:schema', () => { method: 'DELETE', rel: 'env-unset', }, + { + href: `http://${host}/namespaces/{namespace}`, + rel: 'namespace', + }, { href: `http://${host}/namespaces/{namespace}`, method: 'PUT', From 51030843b7bb7f3eb855ed53da1ec4e54ccccf0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Mon, 8 Jan 2018 10:02:58 -0200 Subject: [PATCH 008/126] Upgrade backstage-functions-sandbox to version 0.4.0 --- npm-shrinkwrap.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 5e2af91..7611bfa 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@globocom/backstage-functions-sandbox": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@globocom/backstage-functions-sandbox/-/backstage-functions-sandbox-0.3.3.tgz", - "integrity": "sha512-mueZieclLNPBoif4F8d3AcW9eVSlPnaqfv+Lr+qRrg37SqoxTfXBcX+7ekHGWCOC7VSV/365QLrF8Qflf4HSJw==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@globocom/backstage-functions-sandbox/-/backstage-functions-sandbox-0.4.0.tgz", + "integrity": "sha1-NVow7OQumAcKsiONfp9KGz1d0Vo=", "requires": { "once": "1.4.0", "stack-trace": "0.0.9" diff --git a/package.json b/package.json index d181c6e..e8d288a 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "author": "Backstage Team ", "license": "MIT", "dependencies": { - "@globocom/backstage-functions-sandbox": "^0.3.3", + "@globocom/backstage-functions-sandbox": "^0.4.0", "async": "^2.0.1", "body-parser": "^1.15.2", "deepcopy": "^0.6.3", From 258b19efbb48fa6426bad48959212767627981e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Mon, 8 Jan 2018 10:39:28 -0200 Subject: [PATCH 009/126] Pipeline: fix tests to handle new errors --- test/unit/domain/Pipeline.test.js | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/test/unit/domain/Pipeline.test.js b/test/unit/domain/Pipeline.test.js index f339c24..755bd34 100644 --- a/test/unit/domain/Pipeline.test.js +++ b/test/unit/domain/Pipeline.test.js @@ -131,17 +131,27 @@ describe('Pipeline', () => { }); it('should be able to run one function with 404', async () => { - const result = await new Pipeline(sandbox, req, [step404]).run(); - expect(result.body.error).to.be.eql('Not found an item'); - expect(result.status).to.be.eql(404); + try { + await new Pipeline(sandbox, req, [step404]).run(); + } catch (err) { + expect(err.message).to.be.eql('Not found an item'); + expect(err.statusCode).to.be.eql(404); + return; + } + + throw new Error('Not raised an error'); }); it('should be able to run three functions with 404', async () => { - const result = await new Pipeline(sandbox, req, [step200, step404, step200b]).run(); - expect(result.body.error).to.be.eql('Not found an item'); - expect(result.body.namespace).to.be.eql('backstage'); - expect(result.body.functionId).to.be.eql('step404'); - expect(result.status).to.be.eql(404); + try { + await new Pipeline(sandbox, req, [step200, step404, step200b]).run(); + } catch (err) { + expect(err.message).to.be.eql('Not found an item'); + expect(err.statusCode).to.be.eql(404); + return; + } + + throw new Error('Not raised an error'); }); it('should fail if the first function fail', async () => { From e1218a23859fb00638d4873bfdcdb286892cee48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Mon, 8 Jan 2018 14:58:38 -0200 Subject: [PATCH 010/126] ErrorTracker: send to sentry just statusCodes >= 500 --- lib/domain/ErrorTracker.js | 8 ++++++++ test/unit/domain/ErrorTracker.test.js | 22 ++++++++++++++++++++-- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/lib/domain/ErrorTracker.js b/lib/domain/ErrorTracker.js index cf41c49..3594fdd 100644 --- a/lib/domain/ErrorTracker.js +++ b/lib/domain/ErrorTracker.js @@ -78,6 +78,10 @@ function filterFrames(ctx, filename, code) { ctx.message = `${filename}: ${ctx.message}`; } +function filterStatusCode(statusCode) { + return statusCode !== 408 && statusCode < 500; +} + class ErrorTracker { constructor({ sentryDSN, filename, extra, tags, code, breadcrumbs, sentryClient }) { this.sentryDSN = sentryDSN; @@ -91,6 +95,10 @@ class ErrorTracker { } notify(err) { + if (err.statusCode && filterStatusCode(err.statusCode)) { + return; + } + parseError(err, { extra: this.extra, tags: this.tags }, (ctx) => { filterFrames(ctx, this.filename, this.code); diff --git a/test/unit/domain/ErrorTracker.test.js b/test/unit/domain/ErrorTracker.test.js index 3b890e2..0f427f6 100644 --- a/test/unit/domain/ErrorTracker.test.js +++ b/test/unit/domain/ErrorTracker.test.js @@ -8,6 +8,7 @@ class FakeSentryDSN extends EventEmitter { constructor() { super(); this.nextEventID = '6701c255-9431-46f4-a59e-eda424742dab'; + this.sent = false; } generateEventId() { return this.nextEventID; @@ -18,6 +19,7 @@ class FakeSentryDSN extends EventEmitter { } send(ctx, callback) { + this.sent = true; this.emit('sent', ctx); callback(null); } @@ -26,6 +28,8 @@ class FakeSentryDSN extends EventEmitter { describe('ErrorTracker', () => { describe('#notify', () => { let resultCtx; + let sentryClient; + let errTracker; before((done) => { const err = new Error('testing'); @@ -40,9 +44,9 @@ describe('ErrorTracker', () => { throw new Error('testing'); } `; - const sentryClient = new FakeSentryDSN(); + sentryClient = new FakeSentryDSN(); - const errTracker = new ErrorTracker({ + errTracker = new ErrorTracker({ sentryDSN: 'http://my-sentry/project', filename: 'testing/testing.js', extra: { @@ -143,5 +147,19 @@ describe('ErrorTracker', () => { it('should contains the message', () => { expect(resultCtx.message).to.be.eql('testing/testing.js: Error: testing'); }); + + describe('when err contains a non error status code', () => { + before(() => { + sentryClient.sent = false; + + const err = new Error('Not a critical error'); + err.statusCode = 404; + errTracker.notify(err); + }); + + it('should ignore error and not send to sentry', () => { + expect(sentryClient.sent).to.be.false; + }); + }); }); }); From 868d8f7ec8d56213d3224d6013484966daf5953d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Wed, 21 Mar 2018 14:58:44 -0300 Subject: [PATCH 011/126] Upgrade backstage-functions-sandbox to version 0.4.1 --- npm-shrinkwrap.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 7611bfa..88f8bbf 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@globocom/backstage-functions-sandbox": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@globocom/backstage-functions-sandbox/-/backstage-functions-sandbox-0.4.0.tgz", - "integrity": "sha1-NVow7OQumAcKsiONfp9KGz1d0Vo=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@globocom/backstage-functions-sandbox/-/backstage-functions-sandbox-0.4.1.tgz", + "integrity": "sha512-5eOxg/t4hzGb0aIukia4WW3seE8sxT2jVFXhy0sAION9H+a7TlJ8PhTctpp9EhRnWX+GevmeE784xwMNoVo3Eg==", "requires": { "once": "1.4.0", "stack-trace": "0.0.9" diff --git a/package.json b/package.json index e8d288a..596073e 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "author": "Backstage Team ", "license": "MIT", "dependencies": { - "@globocom/backstage-functions-sandbox": "^0.4.0", + "@globocom/backstage-functions-sandbox": "^0.4.1", "async": "^2.0.1", "body-parser": "^1.15.2", "deepcopy": "^0.6.3", From ba2aef030ecd0089c3273638771d7de5d20cdd8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Wed, 28 Mar 2018 18:52:27 -0300 Subject: [PATCH 012/126] Update backstage-functions-sandbox to 0.5.0 --- npm-shrinkwrap.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 88f8bbf..0934ec9 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@globocom/backstage-functions-sandbox": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@globocom/backstage-functions-sandbox/-/backstage-functions-sandbox-0.4.1.tgz", - "integrity": "sha512-5eOxg/t4hzGb0aIukia4WW3seE8sxT2jVFXhy0sAION9H+a7TlJ8PhTctpp9EhRnWX+GevmeE784xwMNoVo3Eg==", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@globocom/backstage-functions-sandbox/-/backstage-functions-sandbox-0.5.0.tgz", + "integrity": "sha512-rwr/rGv6sbdYfzi9X6dNlNFz2EqByxsShp8WwRGof1bwVS7YDnFjmwbq71JlOXFe5UAvjIGkTm1VtOkSBtJf9Q==", "requires": { "once": "1.4.0", "stack-trace": "0.0.9" diff --git a/package.json b/package.json index 596073e..926510a 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "author": "Backstage Team ", "license": "MIT", "dependencies": { - "@globocom/backstage-functions-sandbox": "^0.4.1", + "@globocom/backstage-functions-sandbox": "^0.5.0", "async": "^2.0.1", "body-parser": "^1.15.2", "deepcopy": "^0.6.3", From 05d7f9d2102392be13a3186e49d625d5479ce464 Mon Sep 17 00:00:00 2001 From: Marcelo Jorge Vieira Date: Tue, 10 Apr 2018 16:29:16 -0300 Subject: [PATCH 013/126] New storage: InMemory --- lib/domain/getStorage.js | 12 + lib/domain/storage/InMemory.js | 190 +++++++++++ lib/http/routes.js | 6 +- lib/support/config.js | 1 + test/unit/domain/storageInMemory.test.js | 406 +++++++++++++++++++++++ 5 files changed, 613 insertions(+), 2 deletions(-) create mode 100644 lib/domain/getStorage.js create mode 100644 lib/domain/storage/InMemory.js create mode 100644 test/unit/domain/storageInMemory.test.js diff --git a/lib/domain/getStorage.js b/lib/domain/getStorage.js new file mode 100644 index 0000000..212ce90 --- /dev/null +++ b/lib/domain/getStorage.js @@ -0,0 +1,12 @@ +const StorageRedis = require('../domain/storage/redis'); +const StorageInMemory = require('../domain/storage/InMemory'); +const config = require('../support/config'); + +const DEFAULT_STORAGES = { + redis: StorageRedis, + inmemory: StorageInMemory, +}; + +const getStorage = DEFAULT_STORAGES[config.storageName]; + +module.exports = getStorage; diff --git a/lib/domain/storage/InMemory.js b/lib/domain/storage/InMemory.js new file mode 100644 index 0000000..067e446 --- /dev/null +++ b/lib/domain/storage/InMemory.js @@ -0,0 +1,190 @@ +const Storage = require('../storage'); +const uuidV4 = require('uuid/v4'); +const Paginator = require('../paginator'); + +const ERR_FUNCTION_NOT_FOUND = new Error('Function not found'); +const ERR_ENV_NOT_FOUND = new Error('Env variable not found'); + +ERR_FUNCTION_NOT_FOUND.statusCode = 404; +ERR_ENV_NOT_FOUND.statusCode = 404; + + +function storageKey(namespace, codeId) { + return `code:${namespace}/${codeId}`; +} + +async function getMultiCodes(storage, codes, preCache) { + const keys = codes.map(({ namespace, id }) => storageKey(namespace, id)); + + return keys.map((key) => { + if (key in storage.storage) { + return preCache(storage.storage[key]); + } + return null; + }); +} + + +class StorageInMemory extends Storage { + + constructor() { + super('InMemory'); + this.storage = {}; + this.namespaces = []; + } + + async postCode(namespace, id, code) { + await this.putCode(namespace, id, code); + return [1, 1]; + } + + async putCode(namespace, id, code) { + const key = storageKey(namespace, id); + const storage = this.storage[key]; + const updated = new Date().toISOString(); + const data = { + id, + namespace, + created: (storage && storage.created) ? storage.created : updated, + versionID: uuidV4(), + updated, + code: (storage && storage.code) ? storage.code : null, + }; + const functionCode = (storage && storage.code) ? storage.code : code; + + if (functionCode == null) { + data.created = data.updated; + } + + if (code.code) { + data.code = code.code; + data.hash = code.hash; + } + + if (code.env) { + data.env = JSON.stringify(code.env); + } + + this.storage[key] = data; + + return 'OK'; + } + + async getCode(namespace, id) { + const key = storageKey(namespace, id); + + const data = this.storage[key]; + if (!data || !data.code) { + return null; + } + + const namespaceSettings = await this.getNamespace(namespace); + if (namespaceSettings) { + delete namespaceSettings.namespace; + } + + const result = { + id, + namespace, + code: data.code, + hash: data.hash, + created: data.created, + updated: data.updated, + namespaceSettings, + versionID: data.versionID || null, + }; + + if (data.env) { + result.env = JSON.parse(data.env); + } + + return result; + } + + async deleteCode(namespace, id) { + const key = storageKey(namespace, id); + delete this.storage[key]; + return 1; + } + + async getCodeByCache(namespace, id, { preCache }) { + const item = await this.getCode(namespace, id); + return preCache(item); + } + + async listNamespaces(page = 1, perPage = 10) { + const total = this.storage.length; + const paginator = new Paginator(page, perPage, total); + + if (!paginator.isValid) { + throw new Error(paginator.error); + } + + const result = { + items: this.namespaces, + page: paginator.page, + perPage: paginator.perPage, + }; + + if (paginator.previousPage) { + result.previousPage = paginator.previousPage; + } + + if (paginator.nextPage) { + result.nextPage = paginator.nextPage; + } + + return result; + } + + async getNamespace(namespace) { + return this.namespaces[namespace] || null; + } + + putNamespace(namespace, data) { + this.namespaces[namespace] = data; + } + + deleteNamespace(namespace) { + delete this.namespaces[namespace]; + } + + async deleteCodeEnviromentVariable(namespace, id, env) { + const code = await this.getCode(namespace, id); + + if (!code) { + throw ERR_FUNCTION_NOT_FOUND; + } + + if (!code.env || !code.env[env]) { + throw ERR_ENV_NOT_FOUND; + } + + delete code.env[env]; + + return this.putCode(namespace, id, { env: code.env }); + } + + async putCodeEnviromentVariable(namespace, id, env, value) { + const code = await this.getCode(namespace, id); + + if (!code) { + throw ERR_FUNCTION_NOT_FOUND; + } + + if (!code.env) { + code.env = {}; + } + + code.env[env] = value; + + return this.putCode(namespace, id, { env: code.env }); + } + + async getCodesByCache(codes, { preCache }) { + return Promise.all(await getMultiCodes(this, codes, preCache)); + } + +} + +module.exports = StorageInMemory; diff --git a/lib/http/routes.js b/lib/http/routes.js index f7387ed..f96338f 100644 --- a/lib/http/routes.js +++ b/lib/http/routes.js @@ -10,12 +10,14 @@ const StatusRouter = require('./routers/StatusRouter'); const DebugRouter = require('./routers/DebugRouter'); const NamespacesRouter = require('./routers/NamespacesRouter'); const FunctionsRouter = require('./routers/FunctionsRouter'); -const RedisStorage = require('../domain/storage/redis'); + const parseExposeEnv = require('../support/parseExposeEnv'); const config = require('../support/config'); const FunctionsRequest = require('./FunctionsRequest'); +const Storage = require('../domain/getStorage'); + morgan.token('response-sectime', (req, res) => { /* eslint no-underscore-dangle: ["error", { "allow": ["_header", "_startAt"] }] */ if (!res._header || !req._startAt) { @@ -32,7 +34,7 @@ app.use(morgan(config.log.morganFormat)); app.disable('x-powered-by'); app.enable('trust proxy'); -app.set('memoryStorage', new RedisStorage()); +app.set('memoryStorage', new Storage()); app.set('sandbox', new Sandbox({ env: parseExposeEnv(), globalModules: config.defaultGlobalModules, diff --git a/lib/support/config.js b/lib/support/config.js index 1d9c99a..9bed376 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -37,4 +37,5 @@ module.exports = { useCertFile: ConfigDiscovery.getBool('FUNCTIONS_USE_SSL_CERT_FILE', false), certFile: process.env.SSL_CERT_FILE, }, + storageName: process.env.STORAGE || 'redis', }; diff --git a/test/unit/domain/storageInMemory.test.js b/test/unit/domain/storageInMemory.test.js new file mode 100644 index 0000000..b1aa71d --- /dev/null +++ b/test/unit/domain/storageInMemory.test.js @@ -0,0 +1,406 @@ +const expect = require('chai').expect; +const uuidV4 = require('uuid/v4'); +const StorageInMemory = require('../../../lib/domain/storage/InMemory'); + +const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/; + + +describe('StorageInMemory', () => { + let storage; + + before(() => { + storage = new StorageInMemory(); + }); + + describe('#putCode() and #getCode()', () => { + it('should write a hash for the code', async () => { + const code = { + id: 'test', + code: 'a = 1;', + hash: '123', + env: { + CLIENT_ID: 'my client id', + MY_VAR: 'my var', + }, + }; + const x = await storage.putCode('backstage', 'test', code); + expect(x).to.be.eql('OK'); + + const code2 = await storage.getCode('backstage', 'test'); + + expect(code2.id).to.be.eql('test'); + expect(code2.namespace).to.be.eql('backstage'); + expect(code2.code).to.be.eql('a = 1;'); + expect(code2.hash).to.be.eql('123'); + expect(code2.versionID).to.match(UUID_REGEX); + expect(code2.env.CLIENT_ID).to.be.eql('my client id'); + expect(code2.env.MY_VAR).to.be.eql('my var'); + }); + + it('should have a created equal updated for new function', async () => { + const code = { + id: uuidV4(), + code: 'a = 2;', + hash: '123', + }; + + const x = await storage.putCode('backstage', code.id, code); + expect(x).to.be.eql('OK'); + + const code2 = await storage.getCode('backstage', code.id); + expect(code2.created).to.be.eql(code2.updated); + }); + }); + + + describe('#getCode()', () => { + describe('when code id is not found', () => { + it('should yield a null', async () => { + const code = await storage.getCode('backstage', 'not-found'); + expect(code).to.be.null; + }); + }); + + // when code is found is already tested above + }); + + describe('#delete()', () => { + it('should write a hash for the code', async () => { + const id = 'test'; + const namespace = 'backstage'; + const code = { + id, + code: 'a = 1;', + hash: '123', + }; + const putResponse = await storage.putCode(namespace, id, code); + expect(putResponse).to.be.eql('OK'); + + const deleteResponse = await storage.deleteCode(namespace, id); + expect(deleteResponse).to.be.eql(1); + + const code2 = await storage.getCode(namespace, id); + expect(code2).to.be.null; + }); + }); + + describe('#getCodeByCache', () => { + describe('when code is not found in storage', () => { + it('should populate item by preCache', async () => { + const preCache = code => code; + const namespace = 'backstage'; + const id = 'cache-000'; + const cacheResponse = await storage.getCodeByCache(namespace, id, { preCache }); + expect(cacheResponse).to.be.null; + }); + }); + + describe('when code is not found in cache', () => { + it('should populate item by preCache', async () => { + const preCache = (code) => { + code.preCached = true; + preCache.called = true; + return code; + }; + + const namespace = 'backstage'; + const id = 'cache-01'; + const code = { + id, + code: 'b = 1;', + hash: '123', + }; + + const putResponse = await storage.putCode(namespace, id, code); + expect(putResponse).to.be.eql('OK'); + + const cacheResponse = await storage.getCodeByCache(namespace, id, { preCache }); + + expect(cacheResponse.preCached).to.be.true; + expect(preCache.called).to.be.true; + }); + }); + + describe('when code is found in cache and is changed', () => { + it('should repopulate changed item', async () => { + const preCache = (code) => { + code.preCachedByHash = code.hash; + preCache.called = true; + return code; + }; + + const namespace = 'backstage'; + const id = 'cache-03'; + const code = { + id, + code: 'c = 1;', + hash: '123a', + }; + + const putResponse = await storage.putCode(namespace, id, code); + + expect(putResponse).to.be.eql('OK'); + // populate the cache + let cacheResponse = await storage.getCodeByCache(namespace, id, { preCache }); + expect(cacheResponse.preCachedByHash).to.be.eql('123a'); + + // change item in database + code.code = 'd = 2;'; + code.hash = '123b'; + const lastVersionID = cacheResponse.versionID; + await storage.putCode(namespace, id, code); + preCache.called = false; + + cacheResponse = await storage.getCodeByCache(namespace, id, { preCache }); + + expect(cacheResponse.id).to.be.eql(id); + expect(cacheResponse.code).to.be.eql('d = 2;'); + expect(cacheResponse.preCachedByHash).to.be.eql('123b'); + expect(cacheResponse.hash).to.be.eql('123b'); + expect(cacheResponse.versionID).to.match(UUID_REGEX); + expect(cacheResponse.versionID).to.be.not.eql(lastVersionID); + expect(preCache.called).to.be.true; + }); + }); + }); + + describe('getCodesByCache', () => { + const preCache = (code) => { + code.preCached = true; + code.preCachedByVersionID = code.versionID; + return code; + }; + + let code1; + let code2; + + beforeEach(() => { + code1 = { + namespace: 'backstage', + id: 'code1', + code: 'c = 1;', + hash: '123a', + }; + + code2 = { + namespace: 'backstage', + id: 'code2', + code: 'c = 1;', + hash: '123b', + }; + }); + + describe('when all codes are not found', () => { + it('should return null for each code', async () => { + code1.id = 'not-found1'; + code2.id = 'not-found2'; + + const result = await storage.getCodesByCache([code1, code2], { preCache }); + expect(result).to.be.eql([null, null]); + }); + }); + + describe('when all codes are found', () => { + it('should return all codes', async () => { + const [putResponse1, putResponse2] = await Promise.all([ + storage.putCode(code1.namespace, code1.id, code1), + storage.putCode(code2.namespace, code2.id, code2), + ]); + + expect(putResponse1).to.be.eql('OK'); + expect(putResponse2).to.be.eql('OK'); + + const [result1, result2] = await storage.getCodesByCache([code1, code2], { preCache }); + expect(result1.preCached).to.be.true; + expect(result2.preCached).to.be.true; + }); + }); + + describe('when some code are updated', () => { + it('should return all codes', async () => { + const [putResponse1, putResponse2] = await Promise.all([ + storage.putCode(code1.namespace, code1.id, code1), + storage.putCode(code2.namespace, code2.id, code2), + ]); + + expect(putResponse1).to.be.eql('OK'); + expect(putResponse2).to.be.eql('OK'); + + const [savedCode1, savedCode2] = await Promise.all([ + storage.getCode(code1.namespace, code1.id), + storage.getCode(code2.namespace, code2.id), + ]); + + const code1VersionID = savedCode1.versionID; + const code2VersionID = savedCode2.versionID; + + let [result1, result2] = await storage + .getCodesByCache([code1, code2], { preCache }); + + expect(result1.preCached).to.be.true; + expect(result2.preCached).to.be.true; + code2.code = 'console.info("changed");'; + + const putResponse = await storage.putCode(code2.namespace, code2.id, code2); + expect(putResponse).to.be.eql('OK'); + + [result1, result2] = await storage.getCodesByCache([code1, code2], { preCache }); + expect(result1.preCachedByVersionID).to.be.eql(code1VersionID); + expect(result2.preCachedByVersionID).to.be.not.eql(code2VersionID); + }); + }); + }); + + describe('#putCodeEnviromentVariable', () => { + describe('when target function is found', () => { + it('should set enviroment variable', async () => { + const varName = 'MY_SKIP'; + const code = { + namespace: 'backstage', + id: 'test-env', + code: 'a = 1;', + hash: '123', + }; + const x = await storage.putCode(code.namespace, code.id, code); + expect(x).to.be.eql('OK'); + + await storage.putCodeEnviromentVariable(code.namespace, code.id, varName, 'true'); + + const { env, code: source } = await storage.getCode(code.namespace, code.id); + expect(source).to.be.eql(code.code); + expect(env).to.be.eql({ + MY_SKIP: 'true', + }); + }); + }); + + describe('when target function is not found', () => { + it('should raise an error', async () => { + try { + await storage.putCodeEnviromentVariable('backstage', 'test-env-not-found', 'MY_SKIP', 'true'); + } catch (err) { + expect(err.message).to.be.eql('Function not found'); + expect(err.statusCode).to.be.eql(404); + return; + } + + throw new Error('Not raised an expection'); + }); + }); + }); + + describe('#deleteCodeEnviromentVariable', () => { + describe('when target function and target enviroment var is found', () => { + it('should unset enviroment variable', async () => { + const varName = 'TO_BE_DELETE'; + const code = { + namespace: 'backstage', + id: 'test-env-unset', + code: 'a = 1;', + hash: '123', + env: {}, + }; + code.env[varName] = 'me'; + + const x = await storage.putCode(code.namespace, code.id, code); + expect(x).to.be.eql('OK'); + + await storage.deleteCodeEnviromentVariable(code.namespace, code.id, varName); + + const { env, code: source } = await storage.getCode(code.namespace, code.id); + expect(source).to.be.eql(code.code); + expect(env).to.be.eql({}); + }); + }); + + describe('when target enviroment var is not found', () => { + it('should unset enviroment variable', async () => { + const varName = 'TO_BE_DELETE'; + const code = { + namespace: 'backstage', + id: 'test-env-unset', + code: 'a = 1;', + hash: '123', + env: { + TO_MAINTAIN: 'true', + }, + }; + + try { + const x = await storage.putCode(code.namespace, code.id, code); + expect(x).to.be.eql('OK'); + await storage.deleteCodeEnviromentVariable(code.namespace, code.id, varName); + throw new Error('Not raised an expection'); + } catch (err) { + expect(err.message).to.be.eql('Env variable not found'); + expect(err.statusCode).to.be.eql(404); + } + + const { env, code: source } = await storage.getCode(code.namespace, code.id); + expect(source).to.be.eql(code.code); + expect(env).to.be.eql({ + TO_MAINTAIN: 'true', + }); + }); + }); + + describe('when function is not found', () => { + it('should unset enviroment variable', async () => { + const varName = 'TO_BE_DELETE'; + const code = { + namespace: 'backstage', + id: 'test-env-not-found', + }; + + try { + await storage.deleteCodeEnviromentVariable(code.namespace, code.id, varName); + } catch (err) { + expect(err.message).to.be.eql('Function not found'); + expect(err.statusCode).to.be.eql(404); + return; + } + + throw new Error('Not raised an expection'); + }); + }); + }); + + describe('#getNamespace', () => { + describe('when namespace it is not exist', () => { + it('should return null', async () => { + const result = await storage.getNamespace('not-found'); + expect(result).to.be.null; + }); + }); + + describe('when namespace exists', () => { + it('should return related namespace', async () => { + await storage.putNamespace('will-found', { + namespace: 'will-found', + sentryDSN: 'http://my-sentry.io/foo', + }); + + const { namespace, sentryDSN } = await storage.getNamespace('will-found'); + expect(sentryDSN).to.be.eql('http://my-sentry.io/foo'); + expect(namespace).to.be.eql('will-found'); + }); + }); + }); + + describe('#deleteNamespace', () => { + it('should remove namespace', async () => { + await storage.putNamespace('will-delete', { + namespace: 'will-delete', + sentryDSN: 'http://my-sentry.io/foo', + }); + + const { namespace } = await storage.getNamespace('will-delete'); + expect(namespace).to.be.eql('will-delete'); + + await storage.deleteNamespace(namespace); + + const result = await storage.getNamespace('will-delete'); + expect(result).to.be.null; + }); + }); +}); From c507a1e0175b3b73872bc0bec9ab70642f87bda7 Mon Sep 17 00:00:00 2001 From: Marcelo Jorge Vieira Date: Tue, 10 Apr 2018 16:29:34 -0300 Subject: [PATCH 014/126] Run local without redis --- Makefile | 5 ++++- Procfile.sandbox | 1 + package.json | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 Procfile.sandbox diff --git a/Makefile b/Makefile index 93f05d0..225bce8 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -.PHONY: run setup test setup_upgrade install_node setup_nvm lint clean +.PHONY: run run-sandbox setup test setup_upgrade install_node setup_nvm lint clean DESIRED_NODE_VERSION = v$(shell cat .node-version) CURRENT_NODE_VERSION = $(shell node --version) @@ -19,6 +19,9 @@ setup: install_node run: npm run start_dev +run-sandbox: + npm run start_sandbox + test: npm test $(MAKE) lint diff --git a/Procfile.sandbox b/Procfile.sandbox new file mode 100644 index 0000000..751bacc --- /dev/null +++ b/Procfile.sandbox @@ -0,0 +1 @@ +web: ./node_modules/.bin/nodemon lib/app.js diff --git a/package.json b/package.json index 926510a..bb4f53e 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "test": "REDIS_KEY_PREFIX=test nyc mocha --recursive test/", "send_cover": "nyc report --reporter=text-lcov | coveralls", "start_dev": "nf -j Procfile.local -e .env.local start", + "start_sandbox": "NUM_CPUS=1 STORAGE=inmemory nf -j Procfile.sandbox -e .env.local start", "lint": "eslint lib test" }, "repository": { From 2a7f38a21895e992c0f1293fbff92d34e5dd4a1c Mon Sep 17 00:00:00 2001 From: Marcelo Jorge Vieira Date: Wed, 11 Apr 2018 17:06:50 -0300 Subject: [PATCH 015/126] Release 0.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index bb4f53e..f6aed34 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.1.0", + "version": "0.2.0", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From 95bdc18252ba0ef6de71e43db2bef68201cc93bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A1rbara=20Correia?= Date: Wed, 11 Apr 2018 17:27:28 -0300 Subject: [PATCH 016/126] Post depreciation --- lib/domain/storage.js | 1 - lib/domain/storage/redis.js | 27 ---- lib/http/routers/FunctionsRouter.js | 61 --------- .../http/routers/FunctionsRouter.test.js | 46 ------- test/unit/domain/storage.test.js | 7 - .../unit/http/routers/FunctionsRouter.test.js | 125 ------------------ 6 files changed, 267 deletions(-) diff --git a/lib/domain/storage.js b/lib/domain/storage.js index acfda93..b25a374 100644 --- a/lib/domain/storage.js +++ b/lib/domain/storage.js @@ -23,7 +23,6 @@ class Storage { ping() { throw ERR_UNIMPLEMENTED_METHOD; } listNamespaces() { throw ERR_UNIMPLEMENTED_METHOD; } - postCode() { throw ERR_UNIMPLEMENTED_METHOD; } putCode() { throw ERR_UNIMPLEMENTED_METHOD; } getCode() { throw ERR_UNIMPLEMENTED_METHOD; } deleteCode() { throw ERR_UNIMPLEMENTED_METHOD; } diff --git a/lib/domain/storage/redis.js b/lib/domain/storage/redis.js index 37fb0a4..cf8e5c9 100644 --- a/lib/domain/storage/redis.js +++ b/lib/domain/storage/redis.js @@ -163,33 +163,6 @@ class StorageRedis extends Storage { return this.client.zrem('namespaces', 0, `${namespace}:${id}`); } - postCode(namespace, id, code) { - const key = redisKey(namespace, id); - const pipeline = this.client.pipeline(); - const created = new Date().toISOString(); - - pipeline.hsetnx(key, 'code', code.code); - pipeline.hsetnx(key, 'hash', code.hash); - pipeline.hsetnx(key, 'versionID', uuidV4()); - pipeline.hsetnx(key, 'created', created); - pipeline.hsetnx(key, 'updated', created); - - if (code.env) { - pipeline.hsetnx(key, 'env', code.env); - } - - return pipeline.exec((err, results) => { - const codeResult = results[0][1]; - const hashResult = results[1][1]; - - // Only save namespace and its member - // when code and hash don't exist - if (codeResult === 1 && hashResult === 1) { - this.setNamespaceMember(namespace, id); - } - }); - } - async putCode(namespace, id, code) { const key = redisKey(namespace, id); const data = { versionID: uuidV4(), updated: new Date().toISOString() }; diff --git a/lib/http/routers/FunctionsRouter.js b/lib/http/routers/FunctionsRouter.js index ec8985a..ac75b75 100644 --- a/lib/http/routers/FunctionsRouter.js +++ b/lib/http/routers/FunctionsRouter.js @@ -16,7 +16,6 @@ const SchemaResponse = require('../SchemaResponse'); const router = new Router(); const { bodyParserLimit } = require('../../support/config'); - function codeFileName(namespace, codeId) { return `${namespace}/${codeId}.js`; } @@ -41,66 +40,6 @@ router.all('/:namespace/:id*', (req, res, next) => { next(); }); -router.post('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), async (req, res) => { - const validationResult = new Validator().validate(req.body, schemas['functions/item']); - const memoryStorage = req.app.get('memoryStorage'); - - if (!validationResult.valid) { - const error = 'Invalid instance'; - const details = validationResult.errors.map(e => e.toString()); - - res.status(400).json({ error, details }); - return; - } - - const namespace = req.params.namespace; - const id = req.params.id; - const { - code, - env, - } = req.body; - const sandbox = req.app.get('sandbox'); - const filename = codeFileName(namespace, id); - const invalid = sandbox.testSyntaxError(filename, code, { - console: new StdoutLogStorage(namespace, id).console, - }); - - if (invalid) { - req.log.error(`Failed to post code: ${invalid.error}`); - res.status(400).json(invalid); - return; - } - - const hash = crypto.createHash('sha1').update(code).digest('hex'); - const data = { id, code, hash }; - - if (env) { - data.env = env; - } - - try { - const result = await memoryStorage.postCode(namespace, id, data); - const codeResult = result[0][1]; - const hashResult = result[1][1]; - - // When code and hash are already saved - // we respond with a 400 - Bad Request - if (codeResult === 0 || hashResult === 0) { - res.status(400).json({ error: `The key ${namespace}:${id} already exists` }); - return; - } - - res.set({ ETag: data.hash }); - - new SchemaResponse(new FunctionsRequest(req), res, 'functions/item').json(data); - } catch (err) { - req.log.error(`${err}`); - req.log.error(`${err.stack}`); - res.status(500).json({ error: err.message }); - } -}); - - router.put('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), async (req, res) => { const validationResult = new Validator().validate(req.body, schemas['functions/item']); const memoryStorage = req.app.get('memoryStorage'); diff --git a/test/integration/domain/http/routers/FunctionsRouter.test.js b/test/integration/domain/http/routers/FunctionsRouter.test.js index 84d1b77..a43ec4d 100644 --- a/test/integration/domain/http/routers/FunctionsRouter.test.js +++ b/test/integration/domain/http/routers/FunctionsRouter.test.js @@ -3,52 +3,6 @@ const expect = require('chai').expect; const routes = require('../../../../../lib/http/routes'); describe('FunctionRouter integration', () => { - describe('POST /functions/:namespace/:id', () => { - describe('when code is correct', () => { - const code = ` - function main(req, res) { - res.send({ foo: 'bar' }); - } - `; - - it('should put the code at the function', (done) => { - request(routes) - .post('/functions/function-router-test/test1') - .send({ code }) - .expect('content-type', /json/) - .expect(200) - .end((err, res) => { - if (err) { - done(err); - } - expect(res.body.code).to.be.eql(code); - expect(res.body.id).to.be.eql('test1'); - done(); - }); - }); - }); - - describe('when code already exists', () => { - const code = ` - function main(req, res) { - res.send({ foo: 'bar' }); - } - `; - - it('should returns 400 - Bad Request', (done) => { - request(routes) - .post('/functions/function-router-test/test1') - .send({ code }) - .expect('content-type', /json/) - .expect(400) - .end((err, res) => { - expect(res.body.error).to.be.eql('The key function-router-test:test1 already exists'); - done(); - }); - }); - }); - }); - describe('PUT /functions/:namespace/:id', () => { describe('when code is correct', () => { const code = ` diff --git a/test/unit/domain/storage.test.js b/test/unit/domain/storage.test.js index 9dca214..886ec7e 100644 --- a/test/unit/domain/storage.test.js +++ b/test/unit/domain/storage.test.js @@ -11,13 +11,6 @@ describe('storage', () => { }); }); - describe('#postCode', () => { - it('should throws an unimplemented error', () => { - const fn = () => storage.postCode(); - expect(fn).to.throw(Error, /unimplemented method for Storage interface/); - }); - }); - describe('#putCode', () => { it('should throws an unimplemented error', () => { const fn = () => storage.putCode(); diff --git a/test/unit/http/routers/FunctionsRouter.test.js b/test/unit/http/routers/FunctionsRouter.test.js index 91a1dbd..cf5cd7c 100644 --- a/test/unit/http/routers/FunctionsRouter.test.js +++ b/test/unit/http/routers/FunctionsRouter.test.js @@ -30,131 +30,6 @@ describe('GET /functions', () => { }); }); -describe('POST /functions/:namespace/:id', () => { - before(() => { - routes.set('memoryStorage', new FakeStorage()); - }); - - describe('when code is correct and does not exists', () => { - it('should return the code', (done) => { - const code = 'function main() {}'; - - request(routes) - .post('/functions/backstage/correct') - .send({ code }) - .expect('Content-Type', /json/) - .expect((res) => { - expect(res.profile).to.endsWith('/_schemas/functions/item'); - }) - .expect(() => { - const memoryStorage = routes.get('memoryStorage'); - expect(memoryStorage.lastPutCode).to.be.eql({ - id: 'correct', - hash: 'c177063dc3780c2fe9b4fdc913650e8147c9b8b0', - code, - }); - }) - .expect(200, { - id: 'correct', - code: 'function main() {}', - hash: 'c177063dc3780c2fe9b4fdc913650e8147c9b8b0', - }, done); - }); - }); - - describe('when code is correct and exists', () => { - it('should returns an error', (done) => { - const code = 'function main() {}'; - - request(routes) - .post('/functions/backstage/exists') - .send({ code }) - .expect('Content-Type', /json/) - .expect(500, { - error: 'Code already exists', - }, done); - }); - }); - - describe('when return any error from storage', () => { - it('should return the code', (done) => { - const code = 'function main() {}'; - - request(routes) - .post('/functions/backstage/error') - .send({ code }) - .expect('Content-Type', /json/) - .expect(500, { - error: 'Storage error', - }, done); - }); - }); - - describe('when code has a syntax error', () => { - it('should return a error', (done) => { - request(routes) - .post('/functions/backstage/invalid') - .send({ code: '{)' }) - .expect('Content-Type', /application\/json/) - .expect(400, { - error: 'SyntaxError: Unexpected token )', - stack: '', - }, done); - }); - }); - - describe('when code has a logic error', () => { - it('should return a error', (done) => { - const code = `let a = {}; - function c() { - a.b(); - }; - c()`; - - request(routes) - .post('/functions/codes/crazy') - .send({ code }) - .expect('Content-Type', /json/) - .expect(400, { - error: 'TypeError: a.b is not a function', - stack: 'at c (codes/crazy.js:3)\nat codes/crazy.js:5\nat codes/crazy.js:6', - }, done); - }); - }); - - describe('when code has a timeout error', () => { - it('should return a error', (done) => { - const code = 'while(1) {};'; - - request(routes) - .post('/functions/codes/timeout') - .send({ code }) - .expect('Content-Type', /json/) - .expect(400, { - error: 'Error: Script execution timed out.', - stack: '', - }, done); - }); - }); - - describe('when code is not a string', () => { - it('should return a error', (done) => { - const code = { wrong: 'yes' }; - - request(routes) - .post('/functions/codes/invalid') - .send({ code }) - .expect('Content-Type', /^application\/json/) - .expect(400, { - error: 'Invalid instance', - details: [ - 'instance.code is not of a type(s) string', - ], - }, done); - }); - }); -}); - describe('PUT /functions/:namespace/:id', () => { before(() => { routes.set('memoryStorage', new FakeStorage()); From fe6912ea317aa330faf8007442122e546e301e8d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A1rbara=20Correia?= Date: Thu, 12 Apr 2018 13:55:27 -0300 Subject: [PATCH 017/126] New instructions in README. --- README.md | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index c3c495e..ba5a9e7 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,7 @@ docker-compose up ``` ## How to use -### Creating a function +### Function Structure Your function will have a file, which you define any name you want, and it has to have a function called `main`, with two parameters: `req` and `res`. Req represents the `Request` and Res represents the `Response`. At the end of your code, you'll have to use the `send` method. @@ -68,25 +68,16 @@ function main(req, res) { res.send({ say: `Hello ${name}!` }) } ``` +### Setting a function -To store your function, you can make a `POST` request to `/functions/:namespace/:name`: -```bash -curl -i -X POST http://localhost:8100/functions/example/hello-world \ - -H 'content-type: application/json' \ - -d '{"code":"function main(req, res) {\n const name = (req.body && req.body.name) || \"World\"\n res.send({ say: `Hello ${name}!` })\n}\n"}' -``` - -*ps: if already exists, it will not be updated* - -### Updating a function -To update your function, you can make a `PUT` request to `/functions/:namespace/:name`: +To set your function, you can make a `PUT` request to `/functions/:namespace/:name`: ```bash curl -i -X PUT http://localhost:8100/functions/example/hello-world \ -H 'content-type: application/json' \ -d '{"code":"function main(req, res) {\n const name = (req.body && req.body.name) || \"World\"\n res.send({ say: `Hello ${name}! Nice meeting you...` })\n}\n"}' ``` -*ps: if it doesn't exists, it will be created* +*Ps: if it doesn't exists, it will be created* ### Deleting a function To delete your function, you can make a `DELETE` request to `/functions/:namespace/:name`: From b077b69eb398368295f976e75bd863e909f7d0df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Thu, 12 Apr 2018 14:15:45 -0300 Subject: [PATCH 018/126] clean Storage.postCode references --- lib/domain/storage.js | 2 +- lib/domain/storage/InMemory.js | 5 ----- test/fakes/FakeStorage.js | 12 ------------ 3 files changed, 1 insertion(+), 18 deletions(-) diff --git a/lib/domain/storage.js b/lib/domain/storage.js index b25a374..4a05846 100644 --- a/lib/domain/storage.js +++ b/lib/domain/storage.js @@ -6,7 +6,7 @@ /* eslint class-methods-use-this: [ 'error', { "exceptMethods": ['ping', 'listNamespaces', - 'postCode', 'putCode', 'getCode', 'deleteCode', + 'putCode', 'getCode', 'deleteCode', 'getCodeByCache', 'getCodesByCache', 'putCodeEnviromentVariable', 'deleteCodeEnviromentVariable', diff --git a/lib/domain/storage/InMemory.js b/lib/domain/storage/InMemory.js index 067e446..9c43981 100644 --- a/lib/domain/storage/InMemory.js +++ b/lib/domain/storage/InMemory.js @@ -33,11 +33,6 @@ class StorageInMemory extends Storage { this.namespaces = []; } - async postCode(namespace, id, code) { - await this.putCode(namespace, id, code); - return [1, 1]; - } - async putCode(namespace, id, code) { const key = storageKey(namespace, id); const storage = this.storage[key]; diff --git a/test/fakes/FakeStorage.js b/test/fakes/FakeStorage.js index 65a3ac4..c201b8b 100644 --- a/test/fakes/FakeStorage.js +++ b/test/fakes/FakeStorage.js @@ -36,18 +36,6 @@ class FakeStorage extends Storage { }; } - async postCode(namespace, id, code) { - this.lastPutCode = code; - - if (id === 'exists') { - throw new Error('Code already exists'); - } else if (id === 'error') { - throw new Error('Storage error'); - } - - return [1, 1]; - } - async putCode(namespace, id, code) { this.lastPutCode = code; if (id === 'error') { From 407b3b27b96e1070eba26326c030cc64fc492974 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Thu, 12 Apr 2018 14:17:24 -0300 Subject: [PATCH 019/126] 0.2.1 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 0934ec9..8580da4 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.1.0", + "version": "0.2.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index f6aed34..74f5a0c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.0", + "version": "0.2.1", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From 378bd6f0c0e6dea07dcf3c6c0ba701f464997b98 Mon Sep 17 00:00:00 2001 From: Denis Aoki Date: Fri, 27 Apr 2018 18:33:34 -0300 Subject: [PATCH 020/126] Add search route in functions --- lib/domain/storage.js | 3 +- lib/domain/storage/InMemory.js | 60 ++++++++++++++++- lib/domain/storage/redis.js | 64 +++++++++++++++---- lib/http/routers/FunctionsRouter.js | 9 ++- test/fakes/FakeStorage.js | 24 ++++++- .../domain/storage/storage-redis.test.js | 56 ++++++++++++++++ test/unit/domain/storage.test.js | 7 ++ test/unit/domain/storageInMemory.test.js | 55 +++++++++++++++- .../unit/http/routers/FunctionsRouter.test.js | 32 ++++++++++ 9 files changed, 291 insertions(+), 19 deletions(-) diff --git a/lib/domain/storage.js b/lib/domain/storage.js index 4a05846..3ce08c8 100644 --- a/lib/domain/storage.js +++ b/lib/domain/storage.js @@ -5,7 +5,7 @@ /* eslint class-methods-use-this: [ 'error', { "exceptMethods": ['ping', - 'listNamespaces', + 'listNamespaces', 'search', 'putCode', 'getCode', 'deleteCode', 'getCodeByCache', 'getCodesByCache', 'putCodeEnviromentVariable', @@ -23,6 +23,7 @@ class Storage { ping() { throw ERR_UNIMPLEMENTED_METHOD; } listNamespaces() { throw ERR_UNIMPLEMENTED_METHOD; } + search() { throw ERR_UNIMPLEMENTED_METHOD; } putCode() { throw ERR_UNIMPLEMENTED_METHOD; } getCode() { throw ERR_UNIMPLEMENTED_METHOD; } deleteCode() { throw ERR_UNIMPLEMENTED_METHOD; } diff --git a/lib/domain/storage/InMemory.js b/lib/domain/storage/InMemory.js index 9c43981..9e651c4 100644 --- a/lib/domain/storage/InMemory.js +++ b/lib/domain/storage/InMemory.js @@ -13,6 +13,18 @@ function storageKey(namespace, codeId) { return `code:${namespace}/${codeId}`; } +function functionInMemoryKey(namespace, id) { + return `${namespace}:${id}`; +} + +function getFunctionInMemoryKey(functionStorageKey) { + const items = functionStorageKey.split(':'); + return { + namespace: items[0], + id: items[1], + }; +} + async function getMultiCodes(storage, codes, preCache) { const keys = codes.map(({ namespace, id }) => storageKey(namespace, id)); @@ -30,7 +42,8 @@ class StorageInMemory extends Storage { constructor() { super('InMemory'); this.storage = {}; - this.namespaces = []; + this.namespaces = {}; + this.rangeNamespaces = []; } async putCode(namespace, id, code) { @@ -61,10 +74,18 @@ class StorageInMemory extends Storage { } this.storage[key] = data; + this.setNamespaceMember(namespace, id); return 'OK'; } + setNamespaceMember(namespace, id) { + const key = functionInMemoryKey(namespace, id); + if (!this.rangeNamespaces.includes(key)) { + this.rangeNamespaces.push(key); + } + } + async getCode(namespace, id) { const key = storageKey(namespace, id); @@ -108,15 +129,48 @@ class StorageInMemory extends Storage { } async listNamespaces(page = 1, perPage = 10) { - const total = this.storage.length; + const total = this.rangeNamespaces.length; + const paginator = new Paginator(page, perPage, total); + + if (!paginator.isValid) { + throw new Error(paginator.error); + } + + const result = { + items: this.rangeNamespaces.map(namespace => getFunctionInMemoryKey(namespace)), + page: paginator.page, + perPage: paginator.perPage, + }; + + if (paginator.previousPage) { + result.previousPage = paginator.previousPage; + } + + if (paginator.nextPage) { + result.nextPage = paginator.nextPage; + } + + return result; + } + + async search(namespace, id, page = 1, perPage = 10) { + const total = this.rangeNamespaces.length; const paginator = new Paginator(page, perPage, total); if (!paginator.isValid) { throw new Error(paginator.error); } + const functionKey = functionInMemoryKey(namespace, id || ''); + const items = []; + this.rangeNamespaces.forEach((key) => { + if (key.includes(functionKey)) { + items.push(getFunctionInMemoryKey(key)); + } + }); + const result = { - items: this.namespaces, + items, page: paginator.page, perPage: paginator.perPage, }; diff --git a/lib/domain/storage/redis.js b/lib/domain/storage/redis.js index cf8e5c9..1da1231 100644 --- a/lib/domain/storage/redis.js +++ b/lib/domain/storage/redis.js @@ -22,6 +22,18 @@ function namespaceRedisKey(namespace) { return `namespace:${namespace}`; } +function functionRedisKey(namespace, id) { + return `${namespace}:${id}`; +} + +function getFunctionRedisKey(functionKey) { + const items = functionKey.split(':'); + return { + namespace: items[0], + id: items[1], + }; +} + async function getCodeAndPopulateCache(storage, namespace, id, preCache) { log.info('Get code from database, namespace:', namespace, 'codeId:', id, 'and store on cache'); @@ -126,20 +138,50 @@ class StorageRedis extends Storage { throw new Error(paginator.error); } - const items = await this.client.zrange('namespaces', paginator.start, paginator.stop); - const list = []; + const keys = await this.client.zrange('namespaces', paginator.start, paginator.stop); + const items = keys.map(key => getFunctionRedisKey(key)); + + const result = { + items, + page: paginator.page, + perPage: paginator.perPage, + }; - for (let item of items) { - item = item.split(':'); + if (paginator.previousPage) { + result.previousPage = paginator.previousPage; + } - list.push({ - namespace: item[0], - id: item[1], - }); + if (paginator.nextPage) { + result.nextPage = paginator.nextPage; } + return result; + } + + async search(namespace, id, page = 1, perPage = 10) { + const total = await this.client.zcount('namespaces', '-inf', '+inf'); + + const paginator = new Paginator(page, perPage, total); + + if (!paginator.isValid) { + throw new Error(paginator.error); + } + + const minRange = `[${functionRedisKey(namespace, id || '*')}`; + const maxRange = `[${functionRedisKey(namespace, id || '\xff')}`; + const keys = await this.client.zrangebylex( + 'namespaces', + minRange, + maxRange, + 'limit', + paginator.start, + paginator.stop + ); + + const items = keys.map(key => getFunctionRedisKey(key)); + const result = { - items: list, + items, page: paginator.page, perPage: paginator.perPage, }; @@ -156,11 +198,11 @@ class StorageRedis extends Storage { } setNamespaceMember(namespace, id) { - return this.client.zadd('namespaces', 0, `${namespace}:${id}`); + return this.client.zadd('namespaces', 0, functionRedisKey(namespace, id)); } deleteNamespaceMember(namespace, id) { - return this.client.zrem('namespaces', 0, `${namespace}:${id}`); + return this.client.zrem('namespaces', 0, functionRedisKey(namespace, id)); } async putCode(namespace, id, code) { diff --git a/lib/http/routers/FunctionsRouter.js b/lib/http/routers/FunctionsRouter.js index ac75b75..cc1fa58 100644 --- a/lib/http/routers/FunctionsRouter.js +++ b/lib/http/routers/FunctionsRouter.js @@ -24,10 +24,16 @@ router.get('/', async (req, res) => { const memoryStorage = req.app.get('memoryStorage'); const page = parseInt(req.query.page || '1', 10); const perPage = parseInt(req.query.perPage || '10', 10); + const { namespace, id } = req.query; const functionsRequest = new FunctionsRequest(req); try { - const list = await memoryStorage.listNamespaces(page, perPage); + let list = {}; + if (namespace) { + list = await memoryStorage.search(namespace, id, page, perPage); + } else { + list = await memoryStorage.listNamespaces(page, perPage); + } new SchemaResponse(functionsRequest, res, 'functions/list').json(list); } catch (err) { log.error(`Error listing namespaces and its functions: ${err}`); @@ -164,7 +170,6 @@ router.get('/:namespace/:id', async (req, res) => { } }); - router.delete('/:namespace/:id', async (req, res) => { const namespace = req.params.namespace; const id = req.params.id; diff --git a/test/fakes/FakeStorage.js b/test/fakes/FakeStorage.js index c201b8b..34920dd 100644 --- a/test/fakes/FakeStorage.js +++ b/test/fakes/FakeStorage.js @@ -1,6 +1,6 @@ /* eslint class-methods-use-this: ['error', { "exceptMethods": [ 'listNamespaces', 'getCode', 'deleteCode', 'getCodeByCache', 'compileCode', 'runScript', - 'getNamespace', 'deleteNamespace' + 'getNamespace', 'deleteNamespace', 'search' ]}]*/ const Sandbox = require('@globocom/backstage-functions-sandbox'); @@ -24,6 +24,28 @@ class FakeStorage extends Storage { }; } + async search(namespace, id) { + if (id === 'function1' && namespace === 'namespace1') { + return { + items: [ + { namespace: 'namespace1', id: 'function1' }, + ], + }; + } + if (namespace === 'namespace1') { + return { + items: [ + { namespace: 'namespace1', id: 'function1' }, + { namespace: 'namespace1', id: 'function2' }, + ], + }; + } + if (namespace === 'error' || id === 'error') { + throw new Error('Storage error'); + } + return { items: [] }; + } + async getCode(namespace, id) { if (id === 'not-found') { return null; diff --git a/test/integration/domain/storage/storage-redis.test.js b/test/integration/domain/storage/storage-redis.test.js index 70d8adf..26a44a8 100644 --- a/test/integration/domain/storage/storage-redis.test.js +++ b/test/integration/domain/storage/storage-redis.test.js @@ -497,4 +497,60 @@ describe('StorageRedis', () => { }); }); }); + + describe('#search()', () => { + describe('with valid values', () => { + beforeEach(() => { + storage.setNamespaceMember('namespace1', 'function1'); + storage.setNamespaceMember('namespace1', 'function2'); + storage.setNamespaceMember('namespace2', 'function1'); + }); + + it('with namespace', async () => { + const list = await storage.search('namespace1'); + expect(list).to.deep.equal({ + items: [ + { + id: 'function1', + namespace: 'namespace1', + }, + { + id: 'function2', + namespace: 'namespace1', + }, + ], + nextPage: 2, + page: 1, + perPage: 10, + }); + }); + + it('with namespace and id', async () => { + const list = await storage.search('namespace1', 'function1'); + expect(list).to.deep.equal({ + items: [ + { + id: 'function1', + namespace: 'namespace1', + }, + ], + nextPage: 2, + page: 1, + perPage: 10, + }); + }); + }); + + describe('with invalid values', () => { + it('without namespace and function id', async () => { + const list = await storage.search('invalid-namespace', 'id'); + expect(list).to.deep.equal({ + items: [], + nextPage: 2, + page: 1, + perPage: 10, + }); + }); + }); + }); }); diff --git a/test/unit/domain/storage.test.js b/test/unit/domain/storage.test.js index 886ec7e..6cda656 100644 --- a/test/unit/domain/storage.test.js +++ b/test/unit/domain/storage.test.js @@ -38,4 +38,11 @@ describe('storage', () => { expect(fn).to.throw(Error, /unimplemented method for Storage interface/); }); }); + + describe('#search', () => { + it('should throws an unimplemented error', () => { + const fn = () => storage.search(); + expect(fn).to.throw(Error, /unimplemented method for Storage interface/); + }); + }); }); diff --git a/test/unit/domain/storageInMemory.test.js b/test/unit/domain/storageInMemory.test.js index b1aa71d..c263b14 100644 --- a/test/unit/domain/storageInMemory.test.js +++ b/test/unit/domain/storageInMemory.test.js @@ -8,7 +8,7 @@ const UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12 describe('StorageInMemory', () => { let storage; - before(() => { + beforeEach(() => { storage = new StorageInMemory(); }); @@ -403,4 +403,57 @@ describe('StorageInMemory', () => { expect(result).to.be.null; }); }); + + describe('#search', () => { + describe('with valid values', () => { + beforeEach(() => { + storage.setNamespaceMember('namespace1', 'function1'); + storage.setNamespaceMember('namespace1', 'function2'); + storage.setNamespaceMember('namespace2', 'function1'); + }); + + it('with namespace', async () => { + const list = await storage.search('namespace1'); + expect(list).to.deep.equal({ + items: [ + { + id: 'function1', + namespace: 'namespace1', + }, + { + id: 'function2', + namespace: 'namespace1', + }, + ], + page: 1, + perPage: 10, + }); + }); + + it('with namespace and id', async () => { + const list = await storage.search('namespace1', 'function1'); + expect(list).to.deep.equal({ + items: [ + { + id: 'function1', + namespace: 'namespace1', + }, + ], + page: 1, + perPage: 10, + }); + }); + }); + + describe('with invalid values', () => { + it('without namespace and function id', async () => { + const list = await storage.search('invalid-namespace', 'id'); + expect(list).to.deep.equal({ + items: [], + page: 1, + perPage: 10, + }); + }); + }); + }); }); diff --git a/test/unit/http/routers/FunctionsRouter.test.js b/test/unit/http/routers/FunctionsRouter.test.js index cf5cd7c..23c083a 100644 --- a/test/unit/http/routers/FunctionsRouter.test.js +++ b/test/unit/http/routers/FunctionsRouter.test.js @@ -28,6 +28,37 @@ describe('GET /functions', () => { }) .expect(200, done); }); + + it('search by namespace', (done) => { + request(routes) + .get('/functions?namespace=namespace1') + .expect('Content-Type', /json/) + .expect(200, { + items: [ + { namespace: 'namespace1', id: 'function1' }, + { namespace: 'namespace1', id: 'function2' }, + ], + }, done); + }); + + it('search by namespace and function id', (done) => { + request(routes) + .get('/functions?namespace=namespace1&id=function1') + .expect('Content-Type', /json/) + .expect(200, { + items: [ + { namespace: 'namespace1', id: 'function1' }, + ], + }, done); + }); + + it('should fail the request with 500 error', (done) => { + request(routes) + .get('/functions?namespace=error') + .expect(500, { + error: 'Storage error', + }, done); + }); }); describe('PUT /functions/:namespace/:id', () => { @@ -390,3 +421,4 @@ describe('DELETE /functions/:namespace/:id/env/:env', () => { }); }); }); + From 6d095e354544193c80c1d8ef686be47a1ee0c3b4 Mon Sep 17 00:00:00 2001 From: Maycon Medeiros Date: Thu, 3 May 2018 15:00:31 -0300 Subject: [PATCH 021/126] 0.2.2 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 8580da4..da7a21f 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.1", + "version": "0.2.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 74f5a0c..4aa28e9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.1", + "version": "0.2.2", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From c6030fd3ad47ea36608eb19f8c2246c83695e5d6 Mon Sep 17 00:00:00 2001 From: Janilton Maciel Date: Thu, 3 May 2018 15:23:05 -0300 Subject: [PATCH 022/126] redis storage: fixing zrangebylex count --- lib/domain/storage/redis.js | 2 +- .../domain/storage/storage-redis.test.js | 29 ++++++++++++++++++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/lib/domain/storage/redis.js b/lib/domain/storage/redis.js index 1da1231..ca40c35 100644 --- a/lib/domain/storage/redis.js +++ b/lib/domain/storage/redis.js @@ -175,7 +175,7 @@ class StorageRedis extends Storage { maxRange, 'limit', paginator.start, - paginator.stop + paginator.perPage ); const items = keys.map(key => getFunctionRedisKey(key)); diff --git a/test/integration/domain/storage/storage-redis.test.js b/test/integration/domain/storage/storage-redis.test.js index 26a44a8..a43f1d2 100644 --- a/test/integration/domain/storage/storage-redis.test.js +++ b/test/integration/domain/storage/storage-redis.test.js @@ -498,12 +498,16 @@ describe('StorageRedis', () => { }); }); + describe('#search()', () => { describe('with valid values', () => { - beforeEach(() => { + before(() => { storage.setNamespaceMember('namespace1', 'function1'); storage.setNamespaceMember('namespace1', 'function2'); storage.setNamespaceMember('namespace2', 'function1'); + for (let i = 1; i <= 25; i += 1) { + storage.setNamespaceMember('namespace3', `function${i}`); + } }); it('with namespace', async () => { @@ -539,6 +543,29 @@ describe('StorageRedis', () => { perPage: 10, }); }); + + it('with page 1', async () => { + const list = await storage.search('namespace3'); + expect(list.items).to.have.lengthOf(10); + }); + + it('with page 2', async () => { + const page = 2; + const list = await storage.search('namespace3', '', page); + expect(list.items).to.have.lengthOf(10); + }); + + it('with page 3', async () => { + const page = 3; + const list = await storage.search('namespace3', '', page); + expect(list.items).to.have.lengthOf(5); + }); + + it('with perPage 5', async () => { + const perPage = 5; + const list = await storage.search('namespace3', '', 1, perPage); + expect(list.items).to.have.lengthOf(perPage); + }); }); describe('with invalid values', () => { From a7bd4716d395544a004c131f11be7269f822464d Mon Sep 17 00:00:00 2001 From: Maycon Medeiros Date: Tue, 5 Jun 2018 10:29:47 -0300 Subject: [PATCH 023/126] Create DSN cache to avoid posible race conditions --- lib/domain/ErrorTracker.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/domain/ErrorTracker.js b/lib/domain/ErrorTracker.js index 3594fdd..b6acbc2 100644 --- a/lib/domain/ErrorTracker.js +++ b/lib/domain/ErrorTracker.js @@ -11,9 +11,18 @@ const log = require('../support/log'); raven.config(); raven.disableConsoleAlerts(); const globalSentryDSNClient = new raven.Client(); +const cache = {}; ravenHTTPSTransport.agent = https.globalAgent; +function getRavenClient(DSN) { + if (!cache[DSN]) { + cache[DSN] = new raven.Client(DSN); + } + + return cache[DSN]; +} + function applyContext(frame, lines) { const linesOfContext = 7; const realLine = frame.lineno - 2; @@ -91,7 +100,7 @@ class ErrorTracker { this.tags = tags; this.breadcrumbs = breadcrumbs || []; - this.sentryClient = sentryClient || globalSentryDSNClient; + this.sentryClient = sentryClient || getRavenClient(sentryDSN); } notify(err) { @@ -107,7 +116,6 @@ class ErrorTracker { ctx.modules = getSandboxModules(); if (this.sentryDSN) { - this.sentryClient.config(this.sentryDSN); ctx.event_id = this.sentryClient.generateEventId(); this.sentryClient.send(ctx, (publishErr) => { if (publishErr) { From c1c3c5afebdce84fce132b33a0b1029573ef016c Mon Sep 17 00:00:00 2001 From: Maycon Medeiros Date: Tue, 5 Jun 2018 10:36:07 -0300 Subject: [PATCH 024/126] 0.2.3 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index da7a21f..2a8fe53 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.2", + "version": "0.2.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 4aa28e9..5f1ff6f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.2", + "version": "0.2.3", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From 52e2fd67a0e9b3135dfe6630802a61bd7cbec0d9 Mon Sep 17 00:00:00 2001 From: Maycon Medeiros Date: Tue, 5 Jun 2018 10:51:08 -0300 Subject: [PATCH 025/126] 0.2.4 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 2a8fe53..60ad693 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.3", + "version": "0.2.4", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5f1ff6f..12ef680 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.3", + "version": "0.2.4", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From f837a6ddfc6623c84b787978d2933a5d222addc6 Mon Sep 17 00:00:00 2001 From: "jonathan.silva" Date: Tue, 16 Apr 2019 18:29:30 -0300 Subject: [PATCH 026/126] Include .nyc_output on .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 3fa43e7..3d9793b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,4 +2,5 @@ node_modules .DS_Store dump.rdb coverage -npm-debug.log \ No newline at end of file +npm-debug.log +.nyc_output \ No newline at end of file From 9df561d9deca3af478b48e5d00d62d8432d5da12 Mon Sep 17 00:00:00 2001 From: "jonathan.silva" Date: Tue, 16 Apr 2019 18:32:47 -0300 Subject: [PATCH 027/126] Update Dockerfile --- Dockerfile | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/Dockerfile b/Dockerfile index 83e9b7e..2d67bb2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,4 @@ -FROM mhart/alpine-node:6.10.2 - +FROM mhart/alpine-node:8.15.1 RUN apk add --no-cache make gcc g++ python WORKDIR /application/functions ADD lib lib @@ -7,6 +6,3 @@ ADD package.json . ADD npm-shrinkwrap.json . RUN npm install - -EXPOSE 8100 -CMD ["node", "lib/app.js"] From d85f6c99bcd3028d24b00bfd732664b0b6e9f5a8 Mon Sep 17 00:00:00 2001 From: "jonathan.silva" Date: Tue, 16 Apr 2019 18:35:30 -0300 Subject: [PATCH 028/126] Update docker-compose.yml version and improve redis volume name --- docker-compose.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 4e4d068..836d22f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,4 @@ -version: '2' +version: '3' services: web: container_name: functions_app @@ -15,12 +15,12 @@ services: container_name: functions_db image: redis volumes: - - functions_vol:/data + - redis_vol:/data networks: - functions_net volumes: - functions_vol: + redis_vol: networks: functions_net: From f5ac3a676ee3fa7955df88d9329b1a0447b7bd3e Mon Sep 17 00:00:00 2001 From: "jonathan.silva" Date: Tue, 16 Apr 2019 20:18:01 -0300 Subject: [PATCH 029/126] Add node_modules as volume and start the application --- docker-compose.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 836d22f..d3da34c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -9,6 +9,10 @@ services: - functions_net depends_on: - redis + command: node lib/app.js + volumes: + - .:/application/functions + - node_vol:/application/functions/node_modules environment: REDIS_ENDPOINT: redis://redis:6379/0 redis: @@ -21,6 +25,7 @@ services: volumes: redis_vol: + node_vol: networks: functions_net: From 03059da389c10b884d9aae995b86aeb5d28dada1 Mon Sep 17 00:00:00 2001 From: "jonathan.silva" Date: Tue, 16 Apr 2019 20:33:07 -0300 Subject: [PATCH 030/126] Add run, stop and test via container --- Makefile | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Makefile b/Makefile index 225bce8..5b0e5c1 100644 --- a/Makefile +++ b/Makefile @@ -26,6 +26,16 @@ test: npm test $(MAKE) lint +rund: + docker-compose up -d + +stopd: + docker-compose down + +testd: rund + @echo 'Running tests in container' + @docker exec -t functions_app make test + setup_upgrade: clean npm install npm shrinkwrap From 4fb01aa3f2add6f12ce078c2ac93edcace03f46b Mon Sep 17 00:00:00 2001 From: "jonathan.silva" Date: Thu, 18 Apr 2019 16:36:26 -0300 Subject: [PATCH 031/126] Update docker hub repository --- Makefile | 4 ++-- docker-compose.yml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index 5b0e5c1..714ba44 100644 --- a/Makefile +++ b/Makefile @@ -73,7 +73,7 @@ clean: -rm -rf node_modules docker_build: - docker build -t globobackstage/functions . + docker build -t globocom/functions . docker_push: - docker push globobackstage/functions + docker push globocom/functions diff --git a/docker-compose.yml b/docker-compose.yml index d3da34c..a556eba 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,7 +2,7 @@ version: '3' services: web: container_name: functions_app - image: globobackstage/functions + image: globocom/functions ports: - "8100:8100" networks: From be92902d23c90663b02b8246826b5b6fefcdec65 Mon Sep 17 00:00:00 2001 From: "jonathan.silva" Date: Thu, 18 Apr 2019 18:10:40 -0300 Subject: [PATCH 032/126] Fix tests to be compatible with Node v11 --- test/unit/http/routers/FunctionsRouter.test.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/unit/http/routers/FunctionsRouter.test.js b/test/unit/http/routers/FunctionsRouter.test.js index 23c083a..735045f 100644 --- a/test/unit/http/routers/FunctionsRouter.test.js +++ b/test/unit/http/routers/FunctionsRouter.test.js @@ -144,10 +144,10 @@ describe('PUT /functions/:namespace/:id', () => { .put('/functions/codes/timeout') .send({ code }) .expect('Content-Type', /json/) - .expect(400, { - error: 'Error: Script execution timed out.', - stack: '', - }, done); + .expect((res) => { + expect(res.body.error).to.include('Error: Script execution timed out'); + }) + .expect(400, done); }); }); From 15d2f391f4e7a3456f752e29098adef0e0d79819 Mon Sep 17 00:00:00 2001 From: "jonathan.silva" Date: Wed, 24 Apr 2019 17:13:13 -0300 Subject: [PATCH 033/126] Add node_modules to .dockerignore --- .dockerignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..3c3629e --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +node_modules From e35ade17d6a6842ad32c18ca1d85cf974ce76e37 Mon Sep 17 00:00:00 2001 From: "jonathan.silva" Date: Wed, 24 Apr 2019 17:43:26 -0300 Subject: [PATCH 034/126] Update docker-compose file dedicated to tests --- docker-compose-dev.yml | 26 -------------------------- docker-compose-test.yml | 31 +++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 26 deletions(-) delete mode 100644 docker-compose-dev.yml create mode 100644 docker-compose-test.yml diff --git a/docker-compose-dev.yml b/docker-compose-dev.yml deleted file mode 100644 index c1ac3c1..0000000 --- a/docker-compose-dev.yml +++ /dev/null @@ -1,26 +0,0 @@ -version: '2' -services: - web: - container_name: functions_app_dev - build: . - ports: - - "127.0.0.1:8100:8100" - networks: - - functions_net_dev - environment: - REDIS_ENDPOINT: redis://redis:6379/0 - depends_on: - - redis - redis: - container_name: functions_db_dev - image: redis - volumes: - - functions_vol_dev:/data - networks: - - functions_net_dev - -volumes: - functions_vol_dev: - -networks: - functions_net_dev: diff --git a/docker-compose-test.yml b/docker-compose-test.yml new file mode 100644 index 0000000..1f1bd8a --- /dev/null +++ b/docker-compose-test.yml @@ -0,0 +1,31 @@ +version: '3' +services: + web: + container_name: functions_app_test + image: globocom/functions + ports: + - "127.0.0.1:8100:8100" + networks: + - functions_net_test + environment: + REDIS_ENDPOINT: redis://redis:6379/0 + depends_on: + - redis + command: node lib/app.js + volumes: + - .:/application/functions + - node_test_vol:/application/functions/node_modules + redis: + container_name: functions_db_test + image: redis + volumes: + - redis_test_vol:/data + networks: + - functions_net_test + +volumes: + redis_test_vol: + node_test_vol: + +networks: + functions_net_test: From d2ecdeeab0287594638a4569bd4a08b2f5815881 Mon Sep 17 00:00:00 2001 From: "jonathan.silva" Date: Wed, 24 Apr 2019 17:44:28 -0300 Subject: [PATCH 035/126] Update testd to use test containers --- Makefile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 714ba44..cd61ef8 100644 --- a/Makefile +++ b/Makefile @@ -32,9 +32,13 @@ rund: stopd: docker-compose down -testd: rund +testd: stopd + @echo 'Starting test containers' + docker-compose -f docker-compose-test.yml up -d @echo 'Running tests in container' - @docker exec -t functions_app make test + @docker exec -t functions_app_test make test + @echo 'Stopping test containers' + docker-compose -f docker-compose-test.yml down -v setup_upgrade: clean npm install From 6adf72766f467d7ca12ad976a7f0fab822bf1996 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Fri, 3 May 2019 17:10:04 -0300 Subject: [PATCH 036/126] domain/logstorage: creating feature multiple log hosts --- lib/domain/LogStorage.js | 48 +++++++++++++++++++++++++++++++++------- package.json | 2 +- 2 files changed, 41 insertions(+), 9 deletions(-) diff --git a/lib/domain/LogStorage.js b/lib/domain/LogStorage.js index bc030f0..650b392 100644 --- a/lib/domain/LogStorage.js +++ b/lib/domain/LogStorage.js @@ -33,6 +33,44 @@ class GelfLogStorage { this.file = `${namespace}/${id}.js`; this.namespace = namespace; this.fields = extractHTTPFields(req); + this.gelfClients = GelfLogStorage.prepareGelfClients(); + } + + static prepareGelfClients() { + const gelfClientList = []; + + // support to old version of code. remove this when migrated. + if (Array.isArray(config.log.host)) { + for (let i = 0; i < config.log.host.lenght; i += 1) { + const client = gelf.setConfig({ + fields: config.log.fields, + adapterOptions: { + host: config.log.host[i], + port: config.log.port, + }, + }); + gelfClientList.append(client); + } + } else { + const client = gelf.setConfig({ + fields: config.log.fields, + adapterOptions: { + host: config.log.host, + port: config.log.port, + }, + }); + + gelfClientList.append(client); + } + + return gelfClientList; + } + + sendLog({ level, message }) { + for (let i = 0; i < this.gelfClients.length; i += 1) { + const client = this.gelfClients[i]; + client[level](message); + } } flush({ status, requestTime }) { @@ -57,7 +95,8 @@ class GelfLogStorage { level = 'warn'; } const statusMsg = STATUS_CODES[status]; - gelf[level](`Function "${this.file}" was executed with status ${status} "${statusMsg}"`, message); + + this.sendLog(level, `Function "${this.file}" was executed with status ${status} "${statusMsg}"`, message); return message; } } @@ -67,12 +106,5 @@ exports.StdoutLogStorage = StdoutLogStorage; exports.GelfLogStorage = GelfLogStorage; if (config.log.type === 'gelf') { - gelf.setConfig({ - fields: config.log.fields, - adapterOptions: { - host: config.log.host, - port: config.log.port, - }, - }); exports.DefaultLogStorage = GelfLogStorage; } diff --git a/package.json b/package.json index 12ef680..7b99f04 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Remote serverless code executor", "main": "index.js", "scripts": { - "test": "REDIS_KEY_PREFIX=test nyc mocha --recursive test/", + "test": "REDIS_KEY_PREFIX=test nyc mocha --ui bdd --recursive test/", "send_cover": "nyc report --reporter=text-lcov | coveralls", "start_dev": "nf -j Procfile.local -e .env.local start", "start_sandbox": "NUM_CPUS=1 STORAGE=inmemory nf -j Procfile.sandbox -e .env.local start", From 5c948c778852bf694e9392a85193abb042963172 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Fri, 3 May 2019 18:30:47 -0300 Subject: [PATCH 037/126] domain/logstorage: fix problem in prepareGelfClients --- lib/domain/LogStorage.js | 8 ++++---- package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/domain/LogStorage.js b/lib/domain/LogStorage.js index 650b392..ab0a5fb 100644 --- a/lib/domain/LogStorage.js +++ b/lib/domain/LogStorage.js @@ -49,7 +49,7 @@ class GelfLogStorage { port: config.log.port, }, }); - gelfClientList.append(client); + gelfClientList.push(client); } } else { const client = gelf.setConfig({ @@ -60,16 +60,16 @@ class GelfLogStorage { }, }); - gelfClientList.append(client); + gelfClientList.push(client); } return gelfClientList; } - sendLog({ level, message }) { + sendLog(level, stringMessage, messageObject) { for (let i = 0; i < this.gelfClients.length; i += 1) { const client = this.gelfClients[i]; - client[level](message); + client[level](stringMessage, messageObject); } } diff --git a/package.json b/package.json index 7b99f04..a10e94a 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Remote serverless code executor", "main": "index.js", "scripts": { - "test": "REDIS_KEY_PREFIX=test nyc mocha --ui bdd --recursive test/", + "test": "REDIS_KEY_PREFIX=test nyc mocha --ui bdd --recursive test/", "send_cover": "nyc report --reporter=text-lcov | coveralls", "start_dev": "nf -j Procfile.local -e .env.local start", "start_sandbox": "NUM_CPUS=1 STORAGE=inmemory nf -j Procfile.sandbox -e .env.local start", From 53c7ba16bde29246fef63bf1ede9b2b9c7832675 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Mon, 6 May 2019 17:19:56 -0300 Subject: [PATCH 038/126] LogStorage: fix typo and increases coverage --- lib/domain/LogStorage.js | 4 ++-- test/unit/domain/LogStorage.test.js | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/lib/domain/LogStorage.js b/lib/domain/LogStorage.js index ab0a5fb..4528354 100644 --- a/lib/domain/LogStorage.js +++ b/lib/domain/LogStorage.js @@ -38,10 +38,9 @@ class GelfLogStorage { static prepareGelfClients() { const gelfClientList = []; - // support to old version of code. remove this when migrated. if (Array.isArray(config.log.host)) { - for (let i = 0; i < config.log.host.lenght; i += 1) { + for (let i = 0; i < config.log.host.length; i += 1) { const client = gelf.setConfig({ fields: config.log.fields, adapterOptions: { @@ -49,6 +48,7 @@ class GelfLogStorage { port: config.log.port, }, }); + gelfClientList.push(client); } } else { diff --git a/test/unit/domain/LogStorage.test.js b/test/unit/domain/LogStorage.test.js index 5a5d377..891cf6b 100644 --- a/test/unit/domain/LogStorage.test.js +++ b/test/unit/domain/LogStorage.test.js @@ -76,6 +76,17 @@ describe('GelfLogStorage', () => { expect(stderr.buf).to.be.an.instanceof(MemoryStream); }); + it('should have a gelfClients property in GelfLogStorage', () => { + expect(logStorage).to.have.property('gelfClients'); + }); + + it('should initialize more than one gelfClient when config.log.host is a list', () => { + config.log.host = ['localhost', 'localhost']; + const newLogStorage = new GelfLogStorage('test-namespace', 'test-id', req); + expect(newLogStorage.gelfClients.length).to.be.eql(2); + config.log.host = 'localhost'; + }); + describe('#flush', () => { let receivedMsg; From 9f67a5ddaa5e3a83bb1f9415d55a892dfaa65909 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Mon, 6 May 2019 18:24:59 -0300 Subject: [PATCH 039/126] domain/logStorage: change name of parameters in sendLog --- lib/domain/LogStorage.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/domain/LogStorage.js b/lib/domain/LogStorage.js index 4528354..dd11e94 100644 --- a/lib/domain/LogStorage.js +++ b/lib/domain/LogStorage.js @@ -66,10 +66,10 @@ class GelfLogStorage { return gelfClientList; } - sendLog(level, stringMessage, messageObject) { + sendLog(level, shortMessage, fullMessage) { for (let i = 0; i < this.gelfClients.length; i += 1) { const client = this.gelfClients[i]; - client[level](stringMessage, messageObject); + client[level](shortMessage, fullMessage); } } From 27d8e39f7cfe5d95ef4805c14ca79c070be28fcf Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Tue, 7 May 2019 18:02:32 -0300 Subject: [PATCH 040/126] domain/LogStorage.js: now gelfClients are different --- lib/domain/LogStorage.js | 10 ++++++--- test/unit/domain/LogStorage.test.js | 34 +++++++++++++++++++++-------- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/lib/domain/LogStorage.js b/lib/domain/LogStorage.js index dd11e94..5fd8db8 100644 --- a/lib/domain/LogStorage.js +++ b/lib/domain/LogStorage.js @@ -6,7 +6,7 @@ const { const { STATUS_CODES } = require('http'); const gelf = require('gelf-pro'); const config = require('../support/config'); - +const lodash = require('lodash'); function extractHTTPFields(req) { const fields = {}; @@ -37,11 +37,15 @@ class GelfLogStorage { } static prepareGelfClients() { + let client; const gelfClientList = []; + // support to old version of code. remove this when migrated. if (Array.isArray(config.log.host)) { for (let i = 0; i < config.log.host.length; i += 1) { - const client = gelf.setConfig({ + client = lodash.cloneDeep(gelf); + + client = client.setConfig({ fields: config.log.fields, adapterOptions: { host: config.log.host[i], @@ -52,7 +56,7 @@ class GelfLogStorage { gelfClientList.push(client); } } else { - const client = gelf.setConfig({ + client = gelf.setConfig({ fields: config.log.fields, adapterOptions: { host: config.log.host, diff --git a/test/unit/domain/LogStorage.test.js b/test/unit/domain/LogStorage.test.js index 891cf6b..8ac4dd7 100644 --- a/test/unit/domain/LogStorage.test.js +++ b/test/unit/domain/LogStorage.test.js @@ -28,7 +28,6 @@ describe('StdoutLogStorage', () => { }); }); - describe('GelfLogStorage', () => { /* eslint no-underscore-dangle: ["error", { "allow": [ "_stdout", "_stderr", "_status", "_request_time", "_group", "_file", @@ -45,6 +44,7 @@ describe('GelfLogStorage', () => { let gelfServer; let sandbox; let logStorage; + let newLogStorage; before(() => { gelfServer = new Graygelf(); @@ -76,15 +76,31 @@ describe('GelfLogStorage', () => { expect(stderr.buf).to.be.an.instanceof(MemoryStream); }); - it('should have a gelfClients property in GelfLogStorage', () => { - expect(logStorage).to.have.property('gelfClients'); - }); + describe('when has more than one host in config.log.host', () => { + before(() => { + config.log.host = ['localhost', '127.0.0.1']; + newLogStorage = new GelfLogStorage('test-namespace', 'test-id', req); + }); + + after(() => { + config.log.host = 'localhost'; + }); + + it('should be different gelfClients', () => { + const client1 = newLogStorage.gelfClients[0].config.adapterOptions.host; + const client2 = newLogStorage.gelfClients[1].config.adapterOptions.host; - it('should initialize more than one gelfClient when config.log.host is a list', () => { - config.log.host = ['localhost', 'localhost']; - const newLogStorage = new GelfLogStorage('test-namespace', 'test-id', req); - expect(newLogStorage.gelfClients.length).to.be.eql(2); - config.log.host = 'localhost'; + expect(client1 === client2).to.be.false; + expect(newLogStorage.gelfClients[0] === newLogStorage.gelfClients[1]).to.be.false; + }); + + it('should have a gelfClients property in GelfLogStorage', () => { + expect(newLogStorage).to.have.property('gelfClients'); + }); + + it('should initialize more than one gelfClient', () => { + expect(newLogStorage.gelfClients.length).to.be.eql(2); + }); }); describe('#flush', () => { From df86ecf833c0dfd7d3322305f6472787555e54e2 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Thu, 9 May 2019 15:50:54 -0300 Subject: [PATCH 041/126] domain/LogStorage: now config.log.host use ConfigDiscovery.getList --- lib/domain/LogStorage.js | 23 +++++------------------ lib/support/config.js | 2 +- 2 files changed, 6 insertions(+), 19 deletions(-) diff --git a/lib/domain/LogStorage.js b/lib/domain/LogStorage.js index 5fd8db8..0bfa1ae 100644 --- a/lib/domain/LogStorage.js +++ b/lib/domain/LogStorage.js @@ -40,26 +40,13 @@ class GelfLogStorage { let client; const gelfClientList = []; - // support to old version of code. remove this when migrated. - if (Array.isArray(config.log.host)) { - for (let i = 0; i < config.log.host.length; i += 1) { - client = lodash.cloneDeep(gelf); - - client = client.setConfig({ - fields: config.log.fields, - adapterOptions: { - host: config.log.host[i], - port: config.log.port, - }, - }); - - gelfClientList.push(client); - } - } else { - client = gelf.setConfig({ + for (const host of config.log.host) { + client = lodash.cloneDeep(gelf); + + client = client.setConfig({ fields: config.log.fields, adapterOptions: { - host: config.log.host, + host, port: config.log.port, }, }); diff --git a/lib/support/config.js b/lib/support/config.js index 9bed376..1e70289 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -25,7 +25,7 @@ module.exports = { }, log: { type: process.env.LOG_TYPE || 'local', - host: process.env.LOG_HOST || 'localhost', + host: ConfigDiscovery.getList(process.env.LOG_HOST, ['localhost']), port: ConfigDiscovery.getInt('LOG_PORT', 12201), fields: ConfigDiscovery.getObject('LOG_FIELDS'), fieldsFromHTTPHeaders: ConfigDiscovery.getObject('LOG_FIELDS_FROM_HTTP_HEADERS'), From 2ac9496b89e61d57fd5d9c1520edbdd736fc29ee Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Thu, 9 May 2019 16:11:34 -0300 Subject: [PATCH 042/126] config.js: change config.log.host to hosts --- lib/domain/LogStorage.js | 2 +- lib/support/config.js | 2 +- test/unit/domain/LogStorage.test.js | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/domain/LogStorage.js b/lib/domain/LogStorage.js index 0bfa1ae..9fa98dd 100644 --- a/lib/domain/LogStorage.js +++ b/lib/domain/LogStorage.js @@ -40,7 +40,7 @@ class GelfLogStorage { let client; const gelfClientList = []; - for (const host of config.log.host) { + for (const host of config.log.hosts) { client = lodash.cloneDeep(gelf); client = client.setConfig({ diff --git a/lib/support/config.js b/lib/support/config.js index 1e70289..dac29f6 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -25,7 +25,7 @@ module.exports = { }, log: { type: process.env.LOG_TYPE || 'local', - host: ConfigDiscovery.getList(process.env.LOG_HOST, ['localhost']), + hosts: ConfigDiscovery.getList(process.env.LOG_HOST, ['localhost']), port: ConfigDiscovery.getInt('LOG_PORT', 12201), fields: ConfigDiscovery.getObject('LOG_FIELDS'), fieldsFromHTTPHeaders: ConfigDiscovery.getObject('LOG_FIELDS_FROM_HTTP_HEADERS'), diff --git a/test/unit/domain/LogStorage.test.js b/test/unit/domain/LogStorage.test.js index 8ac4dd7..fe243d1 100644 --- a/test/unit/domain/LogStorage.test.js +++ b/test/unit/domain/LogStorage.test.js @@ -76,14 +76,14 @@ describe('GelfLogStorage', () => { expect(stderr.buf).to.be.an.instanceof(MemoryStream); }); - describe('when has more than one host in config.log.host', () => { + describe('when has more than one host in config.log.hosts', () => { before(() => { - config.log.host = ['localhost', '127.0.0.1']; + config.log.hosts = ['localhost', '127.0.0.1']; newLogStorage = new GelfLogStorage('test-namespace', 'test-id', req); }); after(() => { - config.log.host = 'localhost'; + config.log.hosts = 'localhost'; }); it('should be different gelfClients', () => { From 5551ce9c37ead184a390aa0ebb0f24eb1f32e978 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Fri, 10 May 2019 14:51:05 -0300 Subject: [PATCH 043/126] domain:logStorage.js: change fullMessage to extra --- lib/domain/LogStorage.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/domain/LogStorage.js b/lib/domain/LogStorage.js index 9fa98dd..dec20c6 100644 --- a/lib/domain/LogStorage.js +++ b/lib/domain/LogStorage.js @@ -57,10 +57,10 @@ class GelfLogStorage { return gelfClientList; } - sendLog(level, shortMessage, fullMessage) { + sendLog(level, shortMessage, extra) { for (let i = 0; i < this.gelfClients.length; i += 1) { const client = this.gelfClients[i]; - client[level](shortMessage, fullMessage); + client[level](shortMessage, extra); } } From 66deb23327d9c2d20c9eef6a4c2fb963b408f5af Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Fri, 10 May 2019 17:45:52 -0300 Subject: [PATCH 044/126] package.json: bumped version to 0.2.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a10e94a..44d8562 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.4", + "version": "0.2.5", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From bb8bd52d7efe11ef6d64bb0a35ae762d4d18e4fc Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Fri, 10 May 2019 17:47:32 -0300 Subject: [PATCH 045/126] package.json: bumped version to 0.2.5 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a10e94a..44d8562 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.4", + "version": "0.2.5", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From ec907ff5472a35bcf0defafcec2b321498114b8f Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Fri, 10 May 2019 17:52:45 -0300 Subject: [PATCH 046/126] package.json: bumped version to 0.2.6 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 44d8562..ea4b095 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.5", + "version": "0.2.6", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From fde74767feed6f236a55414eda02762ef693f3a9 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Tue, 14 May 2019 12:00:47 -0300 Subject: [PATCH 047/126] lib/domain/LogStorage.js: add log in sendLog --- lib/domain/LogStorage.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/domain/LogStorage.js b/lib/domain/LogStorage.js index dec20c6..b66f52f 100644 --- a/lib/domain/LogStorage.js +++ b/lib/domain/LogStorage.js @@ -7,6 +7,7 @@ const { STATUS_CODES } = require('http'); const gelf = require('gelf-pro'); const config = require('../support/config'); const lodash = require('lodash'); +const log = require('../support/log'); function extractHTTPFields(req) { const fields = {}; @@ -61,6 +62,7 @@ class GelfLogStorage { for (let i = 0; i < this.gelfClients.length; i += 1) { const client = this.gelfClients[i]; client[level](shortMessage, extra); + log.info('log sent to gelfServer:', client.config.adapterOptions, 'message:', shortMessage); } } From 92577e9f7dea119a06fa1c17c350758097fecae3 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Tue, 14 May 2019 14:41:54 -0300 Subject: [PATCH 048/126] lib/domain/LogStorage.js: change for in sendLog method --- lib/domain/LogStorage.js | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/domain/LogStorage.js b/lib/domain/LogStorage.js index b66f52f..d10d21d 100644 --- a/lib/domain/LogStorage.js +++ b/lib/domain/LogStorage.js @@ -59,10 +59,9 @@ class GelfLogStorage { } sendLog(level, shortMessage, extra) { - for (let i = 0; i < this.gelfClients.length; i += 1) { - const client = this.gelfClients[i]; - client[level](shortMessage, extra); - log.info('log sent to gelfServer:', client.config.adapterOptions, 'message:', shortMessage); + for (const gelfClient of this.gelfClients) { + gelfClient[level](shortMessage, extra); + log.info('log sent to gelfServer:', gelfClient.config.adapterOptions, 'message:', shortMessage); } } From cc4456e426f403542fbaae71d6ebe9ef96bb7e24 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Wed, 15 May 2019 11:10:08 -0300 Subject: [PATCH 049/126] package.json: bumped version to 0.2.7 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ea4b095..b978527 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.6", + "version": "0.2.7", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From 57e4cc666ad23d8fb586f38497b674449a939852 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Wed, 15 May 2019 15:13:49 -0300 Subject: [PATCH 050/126] config.js: change name of enviroment variable to LOG_HOSTS --- lib/support/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/support/config.js b/lib/support/config.js index dac29f6..8391d6a 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -25,7 +25,7 @@ module.exports = { }, log: { type: process.env.LOG_TYPE || 'local', - hosts: ConfigDiscovery.getList(process.env.LOG_HOST, ['localhost']), + hosts: ConfigDiscovery.getList('LOG_HOSTS', ['localhost']), port: ConfigDiscovery.getInt('LOG_PORT', 12201), fields: ConfigDiscovery.getObject('LOG_FIELDS'), fieldsFromHTTPHeaders: ConfigDiscovery.getObject('LOG_FIELDS_FROM_HTTP_HEADERS'), From 9c141d7df3958a3f2911dedd5983df98c8413698 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Wed, 15 May 2019 15:14:57 -0300 Subject: [PATCH 051/126] package.json: bumped version to 0.2.8 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b978527..a8d4c9c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.7", + "version": "0.2.8", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From 062664a523ab7260dc2170ad1f4d4d4725471794 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Thu, 16 May 2019 15:34:07 -0300 Subject: [PATCH 052/126] change client gelf-pro to gelf --- lib/domain/LogStorage.js | 29 +++++++++++++++++------------ npm-shrinkwrap.json | 26 +++++++++++++++----------- package.json | 2 +- test/unit/domain/LogStorage.test.js | 22 +++++++++++----------- 4 files changed, 44 insertions(+), 35 deletions(-) diff --git a/lib/domain/LogStorage.js b/lib/domain/LogStorage.js index d10d21d..e3acf9b 100644 --- a/lib/domain/LogStorage.js +++ b/lib/domain/LogStorage.js @@ -4,9 +4,8 @@ const { } = require('@globocom/backstage-functions-sandbox'); const { STATUS_CODES } = require('http'); -const gelf = require('gelf-pro'); +const Gelf = require('gelf'); const config = require('../support/config'); -const lodash = require('lodash'); const log = require('../support/log'); function extractHTTPFields(req) { @@ -42,14 +41,15 @@ class GelfLogStorage { const gelfClientList = []; for (const host of config.log.hosts) { - client = lodash.cloneDeep(gelf); - - client = client.setConfig({ - fields: config.log.fields, - adapterOptions: { - host, - port: config.log.port, - }, + client = new Gelf({ + graylogHostname: host, + graylogPort: config.log.port, + connection: 'wan', + maxChunkSizeWan: 1420, + }); + + client.on('error', (err) => { + log.error('Failed to send log graylogServer err: %s', err); }); gelfClientList.push(client); @@ -59,9 +59,14 @@ class GelfLogStorage { } sendLog(level, shortMessage, extra) { + const message = Object.assign({ + level, + short_message: shortMessage, + }, config.log.fields, this.fields, extra); + for (const gelfClient of this.gelfClients) { - gelfClient[level](shortMessage, extra); - log.info('log sent to gelfServer:', gelfClient.config.adapterOptions, 'message:', shortMessage); + gelfClient.emit('gelf.log', message); + log.info('log sent to gelfServer:', gelfClient.config.graylogHostname, 'message:', shortMessage); } } diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 60ad693..9fb5882 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.4", + "version": "0.2.8", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2705,22 +2705,26 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "gelf-pro": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gelf-pro/-/gelf-pro-1.1.0.tgz", - "integrity": "sha1-0Twh8cOr2QO0F6xCh+a6CxL2+zY=", + "gelf": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/gelf/-/gelf-2.0.1.tgz", + "integrity": "sha512-77duTNPkUgcwFRl+kbmPx2YGMF4e030xBVVsKix5mruTAjuROW36WxmpVSk8MkiZC1D68JYNNb+kfJeZG/D5VQ==", "requires": { - "async": "2.0.1", - "lodash": "4.16.4" + "async": "2.6.2" }, "dependencies": { "async": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/async/-/async-2.0.1.tgz", - "integrity": "sha1-twnMAoCpw28J9FNr6CPIOKkEniU=", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", + "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", "requires": { - "lodash": "4.16.4" + "lodash": "4.17.11" } + }, + "lodash": { + "version": "4.17.11", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", + "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" } } }, diff --git a/package.json b/package.json index a8d4c9c..8448523 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "body-parser": "^1.15.2", "deepcopy": "^0.6.3", "express": "^4.14.0", - "gelf-pro": "^1.1.0", + "gelf": "^2.0.1", "ioredis": "^3.1.4", "jsonschema": "^1.1.0", "lodash": "^4.16.2", diff --git a/test/unit/domain/LogStorage.test.js b/test/unit/domain/LogStorage.test.js index fe243d1..04bb210 100644 --- a/test/unit/domain/LogStorage.test.js +++ b/test/unit/domain/LogStorage.test.js @@ -87,8 +87,8 @@ describe('GelfLogStorage', () => { }); it('should be different gelfClients', () => { - const client1 = newLogStorage.gelfClients[0].config.adapterOptions.host; - const client2 = newLogStorage.gelfClients[1].config.adapterOptions.host; + const client1 = newLogStorage.gelfClients[0].config.graylogHostname; + const client2 = newLogStorage.gelfClients[1].config.graylogHostname; expect(client1 === client2).to.be.false; expect(newLogStorage.gelfClients[0] === newLogStorage.gelfClients[1]).to.be.false; @@ -136,31 +136,31 @@ describe('GelfLogStorage', () => { }); it('should receive full_message attribute', () => { - expect(receivedMsg._status).to.be.eql(200); + expect(receivedMsg.status).to.be.eql(200); }); it('should receive request_time attribute', () => { - expect(receivedMsg._request_time).to.be.eql(20); + expect(receivedMsg.request_time).to.be.eql(20); }); it('should receive group attribute', () => { - expect(receivedMsg._group).to.be.eql('test-namespace'); + expect(receivedMsg.group).to.be.eql('test-namespace'); }); it('should receive file attribute', () => { - expect(receivedMsg._file).to.be.eql('test-namespace/test-id.js'); + expect(receivedMsg.file).to.be.eql('test-namespace/test-id.js'); }); it('should receive rid attribute extracted from HTTP header setting', () => { - expect(receivedMsg._rid).to.be.eql('my-rid'); + expect(receivedMsg.rid).to.be.eql('my-rid'); }); it('should receive clientId attribute extracted from HTTP header setting', () => { - expect(receivedMsg._clientId).to.be.eql('my-client-id'); + expect(receivedMsg.clientId).to.be.eql('my-client-id'); }); it('should receive level attribute', () => { - expect(receivedMsg.level).to.be.eql(6); + expect(receivedMsg.level).to.be.eql('info'); }); }); @@ -181,7 +181,7 @@ describe('GelfLogStorage', () => { }); it('should receive level attribute', () => { - expect(receivedMsg.level).to.be.eql(4); + expect(receivedMsg.level).to.be.eql('warn'); }); }); @@ -202,7 +202,7 @@ describe('GelfLogStorage', () => { }); it('should receive level attribute', () => { - expect(receivedMsg.level).to.be.eql(3); + expect(receivedMsg.level).to.be.eql('error'); }); }); From 772b98931b975e6c7f147861a08a694f24f7b8fe Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Fri, 17 May 2019 12:02:00 -0300 Subject: [PATCH 053/126] logStorage: change way how sent message to gelf --- lib/domain/LogStorage.js | 59 +++++++++++++++++++++-------- test/unit/domain/LogStorage.test.js | 18 ++++----- 2 files changed, 53 insertions(+), 24 deletions(-) diff --git a/lib/domain/LogStorage.js b/lib/domain/LogStorage.js index e3acf9b..eb16f50 100644 --- a/lib/domain/LogStorage.js +++ b/lib/domain/LogStorage.js @@ -34,6 +34,19 @@ class GelfLogStorage { this.namespace = namespace; this.fields = extractHTTPFields(req); this.gelfClients = GelfLogStorage.prepareGelfClients(); + this.logLevels = { + emerg: 0, + panic: 0, + alert: 1, + crit: 2, + error: 3, + err: 3, + warn: 4, + warning: 4, + notice: 5, + info: 6, + debug: 7, + }; } static prepareGelfClients() { @@ -58,15 +71,25 @@ class GelfLogStorage { return gelfClientList; } - sendLog(level, shortMessage, extra) { - const message = Object.assign({ - level, - short_message: shortMessage, - }, config.log.fields, this.fields, extra); + static prepareExtraFields(extra) { + const auxObject = {}; + + Object.keys(extra).forEach((key) => { + if (key.startsWith('_')) { + auxObject[key] = extra[key]; + } else { + const keyName = `_${key}`; + auxObject[keyName] = extra[key]; + } + }); + return auxObject; + } + + sendLog(message) { for (const gelfClient of this.gelfClients) { gelfClient.emit('gelf.log', message); - log.info('log sent to gelfServer:', gelfClient.config.graylogHostname, 'message:', shortMessage); + log.debug('sent to gelfServer:', gelfClient.config.graylogHostname, 'message:', message); } } @@ -77,14 +100,6 @@ class GelfLogStorage { fullMessage += '\ntruncated'; } - const message = Object.assign({ - full_message: fullMessage, - status, - request_time: requestTime, - group: this.namespace, - file: this.file, - }, this.fields); - let level = 'info'; if (status >= 500) { level = 'error'; @@ -92,8 +107,22 @@ class GelfLogStorage { level = 'warn'; } const statusMsg = STATUS_CODES[status]; + const shortMessage = `Function "${this.file}" was executed with status ${status} "${statusMsg}"`; + + const extra = Object.assign({ + status, + request_time: requestTime, + group: this.namespace, + file: this.file, + }, this.fields); + + const message = Object.assign({ + full_message: fullMessage, + level: this.logLevels[level], + short_message: shortMessage, + }, config.log.fields, GelfLogStorage.prepareExtraFields(extra)); - this.sendLog(level, `Function "${this.file}" was executed with status ${status} "${statusMsg}"`, message); + this.sendLog(message); return message; } } diff --git a/test/unit/domain/LogStorage.test.js b/test/unit/domain/LogStorage.test.js index 04bb210..9c494d8 100644 --- a/test/unit/domain/LogStorage.test.js +++ b/test/unit/domain/LogStorage.test.js @@ -136,31 +136,31 @@ describe('GelfLogStorage', () => { }); it('should receive full_message attribute', () => { - expect(receivedMsg.status).to.be.eql(200); + expect(receivedMsg._status).to.be.eql(200); }); it('should receive request_time attribute', () => { - expect(receivedMsg.request_time).to.be.eql(20); + expect(receivedMsg._request_time).to.be.eql(20); }); it('should receive group attribute', () => { - expect(receivedMsg.group).to.be.eql('test-namespace'); + expect(receivedMsg._group).to.be.eql('test-namespace'); }); it('should receive file attribute', () => { - expect(receivedMsg.file).to.be.eql('test-namespace/test-id.js'); + expect(receivedMsg._file).to.be.eql('test-namespace/test-id.js'); }); it('should receive rid attribute extracted from HTTP header setting', () => { - expect(receivedMsg.rid).to.be.eql('my-rid'); + expect(receivedMsg._rid).to.be.eql('my-rid'); }); it('should receive clientId attribute extracted from HTTP header setting', () => { - expect(receivedMsg.clientId).to.be.eql('my-client-id'); + expect(receivedMsg._clientId).to.be.eql('my-client-id'); }); it('should receive level attribute', () => { - expect(receivedMsg.level).to.be.eql('info'); + expect(receivedMsg.level).to.be.eql(6); }); }); @@ -181,7 +181,7 @@ describe('GelfLogStorage', () => { }); it('should receive level attribute', () => { - expect(receivedMsg.level).to.be.eql('warn'); + expect(receivedMsg.level).to.be.eql(4); }); }); @@ -202,7 +202,7 @@ describe('GelfLogStorage', () => { }); it('should receive level attribute', () => { - expect(receivedMsg.level).to.be.eql('error'); + expect(receivedMsg.level).to.be.eql(3); }); }); From 7954caa19f84580e2443347d1600695334455198 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Fri, 17 May 2019 14:30:16 -0300 Subject: [PATCH 054/126] LogStorage.test.js: create test to prepareExtraFields --- test/unit/domain/LogStorage.test.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/unit/domain/LogStorage.test.js b/test/unit/domain/LogStorage.test.js index 9c494d8..0f23e67 100644 --- a/test/unit/domain/LogStorage.test.js +++ b/test/unit/domain/LogStorage.test.js @@ -70,6 +70,11 @@ describe('GelfLogStorage', () => { expect(stdout.buf).to.be.an.instanceof(MemoryStream); }); + it('should prefix extra fields with _', () => { + const extra = { a: 1, b: 2, _c: 3 }; + expect(GelfLogStorage.prepareExtraFields(extra)).to.be.eqls({ _a: 1, _b: 2, _c: 3 }); + }); + it('should create prefixed stdout console', () => { const stderr = logStorage.console._stderr; expect(stderr.prefix).to.be.eql('error:'); From f54622bd4c1ca5e72e80a13f48648bac101d977d Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Mon, 20 May 2019 10:59:05 -0300 Subject: [PATCH 055/126] package.json: bumped version to 0.2.9rc --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8448523..59a9fe4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.8", + "version": "0.2.9rc", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From b1928ca51848f6a555906eddf1950e0d04612caa Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Mon, 20 May 2019 14:29:39 -0300 Subject: [PATCH 056/126] lib/domain/LogStorage.js: add config.log.fields to extra fields --- lib/domain/LogStorage.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/domain/LogStorage.js b/lib/domain/LogStorage.js index eb16f50..edf5ee2 100644 --- a/lib/domain/LogStorage.js +++ b/lib/domain/LogStorage.js @@ -114,13 +114,13 @@ class GelfLogStorage { request_time: requestTime, group: this.namespace, file: this.file, - }, this.fields); + }, this.fields, config.log.fields); const message = Object.assign({ full_message: fullMessage, level: this.logLevels[level], short_message: shortMessage, - }, config.log.fields, GelfLogStorage.prepareExtraFields(extra)); + }, GelfLogStorage.prepareExtraFields(extra)); this.sendLog(message); return message; From 8ac22a5c289f5eb5f1e26d886e2f2a9de6cb1e7f Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Mon, 20 May 2019 14:33:54 -0300 Subject: [PATCH 057/126] package.json: bumped version 0.2.10rc --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 59a9fe4..33134c1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.9rc", + "version": "0.2.10rc", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From 785edfbe4dbf8dd3376c21024a2fdeaf21daa18e Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Mon, 3 Jun 2019 15:19:06 -0300 Subject: [PATCH 058/126] package.json: create version 0.2.10 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 33134c1..1dbdfb7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.10rc", + "version": "0.2.10", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From a04a09d51bc4e57fabfc1a7759847929fd5c551c Mon Sep 17 00:00:00 2001 From: "jonathan.silva" Date: Tue, 4 Jun 2019 12:01:06 -0300 Subject: [PATCH 059/126] Update badges source after GitHub org migration --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ba5a9e7..1db6c7e 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ -[![Build Status](https://travis-ci.org/backstage/functions.png?branch=master)](https://travis-ci.org/backstage/functions) -[![Coverage Status](https://coveralls.io/repos/github/backstage/functions/badge.svg?branch=master)](https://coveralls.io/github/backstage/functions?branch=master) +[![Build Status](https://travis-ci.org/globocom/functions.png?branch=master)](https://travis-ci.org/globocom/functions) +[![Coverage Status](https://coveralls.io/repos/github/globocom/functions/badge.svg?branch=master)](https://coveralls.io/github/globocom/functions?branch=master) # Backstage Functions Backstage Functions is an Open Source [Serverless](http://martinfowler.com/articles/serverless.html) Platform able to store and execute code. From 1f295af1bc4a90b15665b58851f2f2d057854872 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Wed, 5 Jun 2019 12:51:31 -0300 Subject: [PATCH 060/126] LogStorage.js: change maxChunkSize --- lib/domain/LogStorage.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/domain/LogStorage.js b/lib/domain/LogStorage.js index edf5ee2..935451f 100644 --- a/lib/domain/LogStorage.js +++ b/lib/domain/LogStorage.js @@ -58,7 +58,7 @@ class GelfLogStorage { graylogHostname: host, graylogPort: config.log.port, connection: 'wan', - maxChunkSizeWan: 1420, + maxChunkSizeWan: config.log.maxFullMessage, }); client.on('error', (err) => { From 73c0b2e7cf266c38754efadb3c5dd4b8dc4f48d8 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Wed, 5 Jun 2019 12:58:12 -0300 Subject: [PATCH 061/126] LogStorage.js: create config maxChunkSize --- lib/domain/LogStorage.js | 2 +- lib/support/config.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/domain/LogStorage.js b/lib/domain/LogStorage.js index 935451f..99947f0 100644 --- a/lib/domain/LogStorage.js +++ b/lib/domain/LogStorage.js @@ -58,7 +58,7 @@ class GelfLogStorage { graylogHostname: host, graylogPort: config.log.port, connection: 'wan', - maxChunkSizeWan: config.log.maxFullMessage, + maxChunkSizeWan: config.log.maxChunkSize, }); client.on('error', (err) => { diff --git a/lib/support/config.js b/lib/support/config.js index 8391d6a..7d1c10d 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -30,6 +30,7 @@ module.exports = { fields: ConfigDiscovery.getObject('LOG_FIELDS'), fieldsFromHTTPHeaders: ConfigDiscovery.getObject('LOG_FIELDS_FROM_HTTP_HEADERS'), maxFullMessage: ConfigDiscovery.getInt('LOG_MAX_FULL_MESSAGE', 3000), + maxChunkSize: ConfigDiscovery.getInt('LOG_MAX_CHUNK_SIZE', 32766), morganFormat: process.env.LOG_MONGAN_FORMAT || 'tiny', }, http: { From 954fecb044dd3a6b594350d6f1a9790e6ee524b7 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Wed, 5 Jun 2019 13:00:17 -0300 Subject: [PATCH 062/126] package.json: bumped version to 0.2.11rc --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1dbdfb7..14ba2b3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.10", + "version": "0.2.11rc", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From 7547311ef710320047739e71479a8f54d565f081 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Wed, 5 Jun 2019 14:28:10 -0300 Subject: [PATCH 063/126] logStorage.js: now GelfLogStorage reuse gelfClientList --- lib/domain/LogStorage.js | 10 +++++++--- test/unit/domain/LogStorage.test.js | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/lib/domain/LogStorage.js b/lib/domain/LogStorage.js index 99947f0..69dcbf2 100644 --- a/lib/domain/LogStorage.js +++ b/lib/domain/LogStorage.js @@ -50,8 +50,12 @@ class GelfLogStorage { } static prepareGelfClients() { + if (GelfLogStorage.gelfClientList) { + return GelfLogStorage.gelfClientList; + } + let client; - const gelfClientList = []; + GelfLogStorage.gelfClientList = []; for (const host of config.log.hosts) { client = new Gelf({ @@ -65,10 +69,10 @@ class GelfLogStorage { log.error('Failed to send log graylogServer err: %s', err); }); - gelfClientList.push(client); + GelfLogStorage.gelfClientList.push(client); } - return gelfClientList; + return GelfLogStorage.gelfClientList; } static prepareExtraFields(extra) { diff --git a/test/unit/domain/LogStorage.test.js b/test/unit/domain/LogStorage.test.js index 0f23e67..a9ff230 100644 --- a/test/unit/domain/LogStorage.test.js +++ b/test/unit/domain/LogStorage.test.js @@ -56,6 +56,7 @@ describe('GelfLogStorage', () => { clientId: 'x-client-id', }); + config.log.hosts = ['localhost', '127.0.0.1']; logStorage = new GelfLogStorage('test-namespace', 'test-id', req); }); @@ -83,7 +84,6 @@ describe('GelfLogStorage', () => { describe('when has more than one host in config.log.hosts', () => { before(() => { - config.log.hosts = ['localhost', '127.0.0.1']; newLogStorage = new GelfLogStorage('test-namespace', 'test-id', req); }); From babebf5febe8737baf6390b7c5cd72906e1d7b45 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Wed, 5 Jun 2019 14:38:01 -0300 Subject: [PATCH 064/126] package.json: bumped version to 0.2.12rc --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 14ba2b3..4c870ae 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.11rc", + "version": "0.2.12rc", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From 403ceb65cb43c00f436f2e3d82f261defe892354 Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Thu, 6 Jun 2019 11:21:56 -0300 Subject: [PATCH 065/126] package.json: bumped version to 0.2.12 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 4c870ae..5786ef3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.12rc", + "version": "0.2.12", "description": "Remote serverless code executor", "main": "index.js", "scripts": { @@ -60,4 +60,4 @@ "sinon": "^4.1.3", "supertest": "^2.0.0" } -} + From 39c933d94f027988911274aa82cf99f269f1a54d Mon Sep 17 00:00:00 2001 From: Sergio Jorge Date: Thu, 6 Jun 2019 11:24:56 -0300 Subject: [PATCH 066/126] package.json: fix bracket --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5786ef3..c636640 100644 --- a/package.json +++ b/package.json @@ -60,4 +60,4 @@ "sinon": "^4.1.3", "supertest": "^2.0.0" } - +} From 8258d481f74e49f38d29a4baa86e241470e9b44c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Sun, 30 Jun 2019 18:18:49 -0300 Subject: [PATCH 067/126] Add support to expose metrics using open metrics format (prometheus) --- lib/app.js | 8 ++ lib/domain/Metric.js | 78 ++++++++++++++------ lib/domain/Pipeline.js | 13 ++-- lib/domain/storage/redis.js | 2 +- lib/http/routers/FunctionsRouter.js | 11 +-- lib/http/routers/MetricsRouter.js | 21 ++++++ lib/support/config.js | 1 + npm-shrinkwrap.json | 8 ++ package.json | 1 + test/unit/domain/Metric.test.js | 58 +++------------ test/unit/http/routers/MetricsRouter.test.js | 39 ++++++++++ 11 files changed, 154 insertions(+), 86 deletions(-) create mode 100644 lib/http/routers/MetricsRouter.js create mode 100644 test/unit/http/routers/MetricsRouter.test.js diff --git a/lib/app.js b/lib/app.js index d935335..93fca04 100644 --- a/lib/app.js +++ b/lib/app.js @@ -1,11 +1,19 @@ const cluster = require('cluster'); +const express = require('express'); const log = require('./support/log'); const routes = require('./http/routes'); +const MetricsRouter = require('./http/routers/MetricsRouter'); const config = require('./support/config'); const globalImport = require('./support/globalImport'); const setupHTTPClient = require('./support/setupHTTPClient'); if (cluster.isMaster && config.useNodeCluster) { + const metricsApp = express(); + metricsApp.use('/metrics', MetricsRouter); + metricsApp.listen(config.metricsPort, () => { + log.info(`Functions metrics is beating on port ${config.metricsPort}`); + }); + // Fork workers. for (let i = 0; i < config.numCPUs; i += 1) { cluster.fork(); diff --git a/lib/domain/Metric.js b/lib/domain/Metric.js index 3666d02..12c9dae 100644 --- a/lib/domain/Metric.js +++ b/lib/domain/Metric.js @@ -1,9 +1,54 @@ -const dgram = require('dgram'); -const config = require('../support/config'); -const log = require('../support/log'); +const prometheusClient = require('prom-client'); -const sender = dgram.createSocket('udp4'); +prometheusClient.collectDefaultMetrics({ prefix: 'backstage_functions_' }); +const functionRunHistogram = new prometheusClient.Histogram({ + name: 'backstage_functions_function_run_duration_seconds', + help: 'How many time spent to run a function in seconds', + buckets: [ + 0.001, + 0.002, + 0.005, + 0.010, + 0.020, + 0.050, + 0.100, + 0.200, + 0.500, + 1, + 2, + 5, + 10, + 15, + 20, + ], + labelNames: ['namespace', 'id'], +}); + + +function normalizeStatusCode(status) { + if (status < 200) { + return '1xx'; + } else if (status < 300) { + return '2xx'; + } else if (status < 400) { + return '3xx'; + } else if (status < 500) { + return '4xx'; + } + return '5xx'; +} + +const functionRunCounter = new prometheusClient.Counter({ + name: 'backstage_functions_function_run_total', + help: 'What is the status code of a function', + labelNames: ['namespace', 'id', 'status'], +}); + +const redisLeaksCounter = new prometheusClient.Counter({ + name: 'backstage_functions_redis_leaks_total', + help: 'How many redis leaks in backstage functions', +}); class Metric { constructor(metric) { @@ -11,26 +56,17 @@ class Metric { this.start = Date.now(); } - finish(options) { - const spent = Date.now() - this.start; + observeFunctionRun({ namespace, id, status }) { + const spent = (Date.now() - this.start) / 1000; - if (!config.metric.client) { - return spent; - } + functionRunHistogram.labels(namespace, id).observe(spent); + functionRunCounter.labels(namespace, id, normalizeStatusCode(status)).inc(); - const buf = JSON.stringify(Object.assign({ - client: config.metric.client, - metric: this.metric, - time: spent, - }, options || {})); - - sender.send(buf, config.metric.udpPort, config.metric.udpHost, (err) => { - if (err) { - log.error('Failed to sent udp metric: %s', err.message); - } - }); + return spent; + } - return spent / 1000; + static observeRedisLeak() { + redisLeaksCounter.inc(); } } diff --git a/lib/domain/Pipeline.js b/lib/domain/Pipeline.js index 49a55a6..2f9c743 100644 --- a/lib/domain/Pipeline.js +++ b/lib/domain/Pipeline.js @@ -14,7 +14,7 @@ class Pipeline { this.req = req; this.steps = steps; this.previousResult = null; - this.totalMetric = new Metric('pipeline-run'); + this.breadcrumbs = []; } run() { @@ -35,8 +35,9 @@ class Pipeline { try { const result = await this.sandbox.runScript(step.script, this.req, options); - const spent = metric.finish({ - filename, + const spent = metric.observeFunctionRun({ + namespace: step.namespace, + id: step.id, status: result.status, }); @@ -70,10 +71,10 @@ class Pipeline { } catch (err) { const status = err.statusCode || 500; - const spent = metric.finish({ - filename, + const spent = metric.observeFunctionRun({ + namespace: step.namespace, + id: step.id, status, - error: err.message, }); logStorage.console.error(`Failed to run function: ${err.message}, ${spent} seconds`); diff --git a/lib/domain/storage/redis.js b/lib/domain/storage/redis.js index ca40c35..f732c23 100644 --- a/lib/domain/storage/redis.js +++ b/lib/domain/storage/redis.js @@ -327,7 +327,7 @@ class StorageRedis extends Storage { async checkConnectionLeak() { const timeoutID = setTimeout(() => { log.error('Redis connection leak detected'); - new Metric('redis-connection-leak').finish(); + Metric.observeRedisLeak(); this.worker.disconnect(); setTimeout(() => { diff --git a/lib/http/routers/FunctionsRouter.js b/lib/http/routers/FunctionsRouter.js index cc1fa58..76317fc 100644 --- a/lib/http/routers/FunctionsRouter.js +++ b/lib/http/routers/FunctionsRouter.js @@ -224,10 +224,7 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a res.status(result.status); res.json(result.body); - const spent = metric.finish({ - filename, - status: result.status, - }); + const spent = metric.observeFunctionRun({ namespace, id, status: result.status }); logStorage.flush({ status: result.status, @@ -239,11 +236,7 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a const status = err.statusCode || 500; res.status(status).json({ error: err.message }); - const spent = metric.finish({ - filename, - status, - error: err.message, - }); + const spent = metric.observeFunctionRun({ namespace, id, status }); const logResult = logStorage.flush({ status, diff --git a/lib/http/routers/MetricsRouter.js b/lib/http/routers/MetricsRouter.js new file mode 100644 index 0000000..3bd3f7e --- /dev/null +++ b/lib/http/routers/MetricsRouter.js @@ -0,0 +1,21 @@ +const Router = require('express').Router; +const prometheusClient = require('prom-client'); +const log = require('../../support/log'); + +const router = new Router(); +const aggregatorRegistry = new prometheusClient.AggregatorRegistry(); + +router.get('/', (req, res) => { + aggregatorRegistry.clusterMetrics((err, metrics) => { + if (err) { + log.error(err); + res.send(`Error: ${err}`); + res.status(500); + return; + } + res.set('Content-Type', aggregatorRegistry.contentType); + res.send(metrics); + }); +}); + +module.exports = router; diff --git a/lib/support/config.js b/lib/support/config.js index 7d1c10d..5f60c98 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -11,6 +11,7 @@ const DEFAULT_GLOBAL_MODULES = [ module.exports = { port: ConfigDiscovery.getInt('PORT', 8100), + metricsPort: ConfigDiscovery.getInt('METRICS_PORT', 8101), useNodeCluster: ConfigDiscovery.getBool('USE_NODE_CLUSTER', true), numCPUs: ConfigDiscovery.getInt('NUM_CPUS', numCPUs), syncTimeout: ConfigDiscovery.getInt('CODE_SYNC_TIMEOUT', 100), diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 9fb5882..19bebb3 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -6197,6 +6197,14 @@ "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", "dev": true }, + "prom-client": { + "version": "11.5.3", + "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-11.5.3.tgz", + "integrity": "sha512-iz22FmTbtkyL2vt0MdDFY+kWof+S9UB/NACxSn2aJcewtw+EERsen0urSkZ2WrHseNdydsvcxCTAnPcSMZZv4Q==", + "requires": { + "tdigest": "0.1.1" + } + }, "proxy-addr": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.2.tgz", diff --git a/package.json b/package.json index c636640..cb61d9d 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "jsonschema": "^1.1.0", "lodash": "^4.16.2", "morgan": "^1.7.0", + "prom-client": "^11.5.3", "raven": "^2.2.1", "request": "^2.81.0", "stack-trace": "^0.0.9", diff --git a/test/unit/domain/Metric.test.js b/test/unit/domain/Metric.test.js index 5357ea0..fc0af68 100644 --- a/test/unit/domain/Metric.test.js +++ b/test/unit/domain/Metric.test.js @@ -1,60 +1,20 @@ -const dgram = require('dgram'); const expect = require('chai').expect; -const sinon = require('sinon'); +const prometheusClient = require('prom-client'); -const config = require('../../../lib/support/config'); const Metric = require('../../../lib/domain/Metric'); describe('Metric', () => { - let sandbox; - let onMessage; - - before((done) => { - sandbox = sinon.sandbox.create(); - sandbox.stub(config.metric, 'client').value('functions-test'); - sandbox.stub(config.metric, 'udpHost').value('localhost'); - - const server = dgram.createSocket('udp4'); - - server.on('error', (err) => { - done(err); - server.close(); + describe('#observeFunctionRun', () => { + beforeEach(() => { + prometheusClient.register.resetMetrics(); }); - server.on('message', (msg) => { - onMessage(msg); + it('should increment metrics in registry', () => { + new Metric().observeFunctionRun({ namespace: 'xpto', id: 'blah', status: 403 }); + const data = prometheusClient.register.metrics(); + expect(data).to.be.include('backstage_functions_function_run_total{namespace="xpto",id="blah",status="4xx"} 1'); + expect(data).to.be.include('backstage_functions_function_run_duration_seconds_bucket{le="0.05",namespace="xpto",id="blah"} 1'); }); - - server.on('listening', () => { - sandbox.stub(config.metric, 'udpPort').value(server.address().port); - done(); - }); - - server.bind(0); - }); - - after(() => { - sandbox.restore(); - }); - - it('should send metric by udp', (done) => { - let spent; - const metric = new Metric('test-metric'); - setTimeout(() => { - spent = metric.finish({ - test: 'testing', - }); - }, 100); - - onMessage = (msg) => { - const data = JSON.parse(msg); - expect(data.client).to.be.eql('functions-test'); - expect(data.metric).to.be.eql('test-metric'); - expect(data.time).to.be.below(120); // time in milleseconds - expect(spent).to.be.below(1); // time in seconds - expect(data.test).to.be.eql('testing'); - done(); - }; }); }); diff --git a/test/unit/http/routers/MetricsRouter.test.js b/test/unit/http/routers/MetricsRouter.test.js new file mode 100644 index 0000000..03666fd --- /dev/null +++ b/test/unit/http/routers/MetricsRouter.test.js @@ -0,0 +1,39 @@ +const request = require('supertest'); +const express = require('express'); +const sinon = require('sinon'); + +const prometheusClient = require('prom-client'); + +const expect = require('chai').expect; +const MetricsRouter = require('../../../../lib/http/routers/MetricsRouter'); + +describe('GET /metrics', () => { + let sandbox; + + beforeEach(() => { + sandbox = sinon.sandbox.create(); + sandbox.stub(prometheusClient.AggregatorRegistry.prototype, 'clusterMetrics').yields(null, 'my_metric_total 1'); + }); + + afterEach(() => { + sandbox.restore(); + }); + + it('should returns OK text string', (done) => { + const app = express(); + app.use('/metrics', MetricsRouter); + + request(app) + .get('/metrics') + .expect((res) => { + expect(res.text).to.be.eql('my_metric_total 1'); + }) + .end((err) => { + if (err) { + done(err); + } else { + done(); + } + }); + }); +}); From 14747436bf1956522c95e2d1f17d8a8b414ddb9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Sun, 30 Jun 2019 18:23:31 -0300 Subject: [PATCH 068/126] Add missing dependencies --- npm-shrinkwrap.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 19bebb3..c2043f2 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -319,6 +319,11 @@ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "dev": true }, + "bintrees": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz", + "integrity": "sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ=" + }, "bluebird": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", @@ -6970,6 +6975,14 @@ } } }, + "tdigest": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/tdigest/-/tdigest-0.1.1.tgz", + "integrity": "sha1-Ljyyw56kSeVdHmzZEReszKRYgCE=", + "requires": { + "bintrees": "1.0.1" + } + }, "term-size": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/term-size/-/term-size-1.2.0.tgz", From f230fd16b82514ea980d5158ecf25526f29e20ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Thu, 8 Aug 2019 17:48:43 -0300 Subject: [PATCH 069/126] Add metrics for pipeline and overview --- lib/domain/Metric.js | 73 ++++++++++++++++++++++------- lib/http/routers/FunctionsRouter.js | 4 ++ test/unit/domain/Metric.test.js | 17 +++++++ 3 files changed, 76 insertions(+), 18 deletions(-) diff --git a/lib/domain/Metric.js b/lib/domain/Metric.js index 12c9dae..7e58fa6 100644 --- a/lib/domain/Metric.js +++ b/lib/domain/Metric.js @@ -2,29 +2,42 @@ const prometheusClient = require('prom-client'); prometheusClient.collectDefaultMetrics({ prefix: 'backstage_functions_' }); +const buckets = [ + 0.001, + 0.002, + 0.005, + 0.010, + 0.020, + 0.050, + 0.100, + 0.200, + 0.500, + 1, + 2, + 5, + 10, + 15, + 20, +]; + const functionRunHistogram = new prometheusClient.Histogram({ name: 'backstage_functions_function_run_duration_seconds', help: 'How many time spent to run a function in seconds', - buckets: [ - 0.001, - 0.002, - 0.005, - 0.010, - 0.020, - 0.050, - 0.100, - 0.200, - 0.500, - 1, - 2, - 5, - 10, - 15, - 20, - ], + buckets, labelNames: ['namespace', 'id'], }); +const functionOverviewRunHistogram = new prometheusClient.Histogram({ + name: 'backstage_functions_overview_run_duration_seconds', + help: 'How many time spent to run all functions in seconds', + buckets, +}); + +const functionPipelineHistogram = new prometheusClient.Histogram({ + name: 'backstage_functions_pipeline_run_duration_seconds', + help: 'How many time spent to run a function pipeline in seconds', + buckets, +}); function normalizeStatusCode(status) { if (status < 200) { @@ -39,12 +52,24 @@ function normalizeStatusCode(status) { return '5xx'; } +const functionOverviewRunCounter = new prometheusClient.Counter({ + name: 'backstage_functions_overview_run_total', + help: 'What the portion of executions by status codes', + labelNames: ['status'], +}); + const functionRunCounter = new prometheusClient.Counter({ name: 'backstage_functions_function_run_total', help: 'What is the status code of a function', labelNames: ['namespace', 'id', 'status'], }); +const functionPipelineCounter = new prometheusClient.Counter({ + name: 'backstage_functions_pipeline_run_total', + help: 'What is the status code of pipelines', + labelNames: ['status'], +}); + const redisLeaksCounter = new prometheusClient.Counter({ name: 'backstage_functions_redis_leaks_total', help: 'How many redis leaks in backstage functions', @@ -58,13 +83,25 @@ class Metric { observeFunctionRun({ namespace, id, status }) { const spent = (Date.now() - this.start) / 1000; + const normalizedStatusCode = normalizeStatusCode(status); + + functionOverviewRunHistogram.observe(spent); + functionOverviewRunCounter.labels(normalizedStatusCode).inc(); functionRunHistogram.labels(namespace, id).observe(spent); - functionRunCounter.labels(namespace, id, normalizeStatusCode(status)).inc(); + functionRunCounter.labels(namespace, id, normalizedStatusCode).inc(); return spent; } + observePipelineRun(status) { + const spent = (Date.now() - this.start) / 1000; + const normalizedStatusCode = normalizeStatusCode(status); + + functionPipelineHistogram.observe(spent); + functionPipelineCounter.labels(normalizedStatusCode).inc(); + } + static observeRedisLeak() { redisLeaksCounter.inc(); } diff --git a/lib/http/routers/FunctionsRouter.js b/lib/http/routers/FunctionsRouter.js index 76317fc..70e50d3 100644 --- a/lib/http/routers/FunctionsRouter.js +++ b/lib/http/routers/FunctionsRouter.js @@ -274,6 +274,8 @@ router.put('/pipeline', bodyParser.json({ limit: bodyParserLimit }), async (req, return { namespace, id }; }); + const metric = new Metric('pipeline-run'); + try { const codes = await memoryStorage.getCodesByCache(steps, { preCache: (code) => { @@ -296,9 +298,11 @@ router.put('/pipeline', bodyParser.json({ limit: bodyParserLimit }), async (req, res.set(result.headers); res.status(result.status); + metric.observePipelineRun(result.status); res.json(result.body); } catch (err) { const status = err.statusCode || 500; + metric.observePipelineRun(status); res.status(status).json({ error: err.message }); } }); diff --git a/test/unit/domain/Metric.test.js b/test/unit/domain/Metric.test.js index fc0af68..587ea1a 100644 --- a/test/unit/domain/Metric.test.js +++ b/test/unit/domain/Metric.test.js @@ -15,6 +15,23 @@ describe('Metric', () => { const data = prometheusClient.register.metrics(); expect(data).to.be.include('backstage_functions_function_run_total{namespace="xpto",id="blah",status="4xx"} 1'); expect(data).to.be.include('backstage_functions_function_run_duration_seconds_bucket{le="0.05",namespace="xpto",id="blah"} 1'); + + expect(data).to.be.include('backstage_functions_overview_run_total{status="4xx"} 1'); + expect(data).to.be.include('backstage_functions_overview_run_duration_seconds_bucket{le="0.05"} 1'); + }); + }); + + describe('#observePipelineRun', () => { + beforeEach(() => { + prometheusClient.register.resetMetrics(); + }); + + it('should increment metrics in registry', () => { + new Metric().observePipelineRun(403); + const data = prometheusClient.register.metrics(); + + expect(data).to.be.include('backstage_functions_pipeline_run_total{status="4xx"} 1'); + expect(data).to.be.include('backstage_functions_pipeline_run_duration_seconds_bucket{le="0.05"} 1'); }); }); }); From 58f9c966be9fcfc5477b83fadfa95ee25cdf264f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Fri, 9 Aug 2019 11:49:19 -0300 Subject: [PATCH 070/126] package.json: bumped version to 0.2.13 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cb61d9d..cfc9b6e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.12", + "version": "0.2.13", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From 49fb42f5d818ba0c4be7e5682f892897a0a0a4a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Sun, 22 Sep 2019 19:24:29 -0300 Subject: [PATCH 071/126] Remove prefix from process metrics when we prefix default metrics grafana dashboards can be usable without a change --- lib/domain/Metric.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/domain/Metric.js b/lib/domain/Metric.js index 7e58fa6..f9aa667 100644 --- a/lib/domain/Metric.js +++ b/lib/domain/Metric.js @@ -1,6 +1,6 @@ const prometheusClient = require('prom-client'); -prometheusClient.collectDefaultMetrics({ prefix: 'backstage_functions_' }); +prometheusClient.collectDefaultMetrics(); const buckets = [ 0.001, From d868244e8c42b338add02d391753962a145e1343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Tue, 24 Sep 2019 10:12:22 -0300 Subject: [PATCH 072/126] 0.2.14 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index c2043f2..de2de3b 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.8", + "version": "0.2.14", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index cfc9b6e..1d8516f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.13", + "version": "0.2.14", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From 092dfea0b37eb3c0f10b40df819a03fec2a50c40 Mon Sep 17 00:00:00 2001 From: Marcelo Jorge Vieira Date: Wed, 11 Sep 2019 15:36:14 -0300 Subject: [PATCH 073/126] Update .travis.yml --- .travis.yml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 9df50f3..b630fe6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -8,11 +8,6 @@ node_js: - "8.9.1" - "8" - "node" -notifications: - email: - - backstage1@corp.globo.com - slack: - secure: RGXv00o6a2lTXeBN0YvMkADgDpTxrSl0zNjZ/czu98ADwjJIt+Omsj9CqKjpUkQYjZNNOkm+Ak+WYnsHHe3LA+hJIVshFs0HyOlTo400AAK+q3w4YiAbt60e/a3efsqyS3hRm6HwwNTgRTHWQj2h86i/nHPU0krA4R7nI7K0RgrowFCeJmZkOOB8uAj0SYX30/qKMfMWV7V4uH0L+lrtNY8lKgX4Lr54v/J2JpeP8VvB9h1jRcYdLfMBayYvNnrMUCRFPyTpky27WGY97SLMje1cILPfSfXoXJJPxZnUoP9bjF5Eauts+wHjh5ULjCDSev/AuJ6Z2p6qjTPsFx8Qrr/wERl1NyUvajyheLOpKr30dyzLZ0EFYrHlCB0pmodbdsuo9x/flCqLUaVL+djPEibRgTt08Del63dqsM2YY0xMufk87ivPEJHccHBa3ym3iFuQgTmeGGhSNmxrnH+wQnxnRyj5ofgQkx1sSlQj+84qFSMrIIWvEO9cnIhLti3rUirryiPElWJepVMuRpfUJ7QQ8mT+yM/o62cVcK/s4Y5nd3myaPX12qPxKBW2T6eqWiSo5QdLSKDDQgIrtDcs1P8cvp1UJV8scTqrxGa3Yu3qVOxnpvLIn0FWL6UvPysmaxJJVJ34rtMQRX7y7gyx7aAm2bZKBbNLhS+J2HCsVJw= env: - CXX=g++-4.8 REDIS_ENDPOINT=redis://localhost:6379/0 services: From 1a3a6e2e68c9415a26aaa8aa57366942c2a43f39 Mon Sep 17 00:00:00 2001 From: Denis Aoki Date: Mon, 23 Mar 2020 13:57:38 -0300 Subject: [PATCH 074/126] Get the sentryDSN configuration by the environment variable or by the namespace settings --- lib/domain/Pipeline.js | 3 +- lib/domain/storage.js | 11 +++++ lib/domain/storage/InMemory.js | 3 +- lib/domain/storage/redis.js | 2 + lib/http/routers/FunctionsRouter.js | 3 +- .../domain/storage/storage-redis.test.js | 44 +++++++++++++++++++ test/unit/domain/storage.test.js | 31 +++++++++++++ test/unit/domain/storageInMemory.test.js | 44 +++++++++++++++++++ 8 files changed, 136 insertions(+), 5 deletions(-) diff --git a/lib/domain/Pipeline.js b/lib/domain/Pipeline.js index 2f9c743..7515b62 100644 --- a/lib/domain/Pipeline.js +++ b/lib/domain/Pipeline.js @@ -85,8 +85,7 @@ class Pipeline { requestTime: spent, }); - const { namespaceSettings } = step; - const { sentryDSN } = namespaceSettings || {}; + const { sentryDSN } = step; const extra = Object.assign({ body: this.req.body }, logResult || {}); const errTracker = new ErrorTracker({ diff --git a/lib/domain/storage.js b/lib/domain/storage.js index 3ce08c8..71538f6 100644 --- a/lib/domain/storage.js +++ b/lib/domain/storage.js @@ -21,6 +21,17 @@ class Storage { this.name = name; } + static getSentryByEnvOrNamespace(code) { + const { namespaceSettings, env } = code; + if (env && env.sentryDSN) return env.sentryDSN; + + if (namespaceSettings && namespaceSettings.sentryDSN) { + return namespaceSettings.sentryDSN; + } + + return null; + } + ping() { throw ERR_UNIMPLEMENTED_METHOD; } listNamespaces() { throw ERR_UNIMPLEMENTED_METHOD; } search() { throw ERR_UNIMPLEMENTED_METHOD; } diff --git a/lib/domain/storage/InMemory.js b/lib/domain/storage/InMemory.js index 9e651c4..574f079 100644 --- a/lib/domain/storage/InMemory.js +++ b/lib/domain/storage/InMemory.js @@ -36,7 +36,6 @@ async function getMultiCodes(storage, codes, preCache) { }); } - class StorageInMemory extends Storage { constructor() { @@ -114,6 +113,8 @@ class StorageInMemory extends Storage { result.env = JSON.parse(data.env); } + result.sentryDSN = Storage.getSentryByEnvOrNamespace(result); + return result; } diff --git a/lib/domain/storage/redis.js b/lib/domain/storage/redis.js index f732c23..ff93bca 100644 --- a/lib/domain/storage/redis.js +++ b/lib/domain/storage/redis.js @@ -254,6 +254,8 @@ class StorageRedis extends Storage { result.env = JSON.parse(data.env); } + result.sentryDSN = Storage.getSentryByEnvOrNamespace(result); + return result; } diff --git a/lib/http/routers/FunctionsRouter.js b/lib/http/routers/FunctionsRouter.js index 70e50d3..3e0e2fe 100644 --- a/lib/http/routers/FunctionsRouter.js +++ b/lib/http/routers/FunctionsRouter.js @@ -243,8 +243,7 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a requestTime: spent, }); - const { namespaceSettings } = code; - const { sentryDSN } = namespaceSettings || {}; + const { sentryDSN } = code; const extra = Object.assign({ body: req.body }, logResult || {}); const errTracker = new ErrorTracker({ diff --git a/test/integration/domain/storage/storage-redis.test.js b/test/integration/domain/storage/storage-redis.test.js index a43f1d2..269b8d4 100644 --- a/test/integration/domain/storage/storage-redis.test.js +++ b/test/integration/domain/storage/storage-redis.test.js @@ -80,6 +80,50 @@ describe('StorageRedis', () => { }); // when code is found is already tested above + + describe('sentryDSN', () => { + beforeEach(async () => { + this.namespace = 'backstage'; + this.code = { + id: 'test', + code: 'a = 1;', + hash: '123', + }; + await storage.deleteNamespace(this.namespace); + await storage.deleteCode(this.namespace, this.code.id); + }); + + it('when is configured in the namespace', async () => { + const x = await storage.putCode(this.namespace, this.code.id, this.code); + expect(x).to.be.eql('OK'); + await storage.putNamespace(this.namespace, { + namespace: this.namespace, + sentryDSN: 'http://my-sentry.io/foo', + }); + + const result = await storage.getCode(this.namespace, this.code.id); + expect(result.sentryDSN).to.be.eql('http://my-sentry.io/foo'); + }); + + it('when is configured in the env', async () => { + this.code.env = { + sentryDSN: 'http://my-sentry.io/fooenv', + }; + const x = await storage.putCode(this.namespace, this.code.id, this.code); + expect(x).to.be.eql('OK'); + + const result = await storage.getCode(this.namespace, this.code.id); + expect(result.sentryDSN).to.be.eql('http://my-sentry.io/fooenv'); + }); + + it('when isn`t configured', async () => { + const x = await storage.putCode(this.namespace, this.code.id, this.code); + expect(x).to.be.eql('OK'); + + const result = await storage.getCode(this.namespace, this.code.id); + expect(result.sentryDSN).to.be.null; + }); + }); }); describe('#delete()', () => { diff --git a/test/unit/domain/storage.test.js b/test/unit/domain/storage.test.js index 6cda656..1aa2737 100644 --- a/test/unit/domain/storage.test.js +++ b/test/unit/domain/storage.test.js @@ -45,4 +45,35 @@ describe('storage', () => { expect(fn).to.throw(Error, /unimplemented method for Storage interface/); }); }); + + describe('#getSentryByEnvOrNamespace', () => { + it('should return sentryDSN from env', async () => { + const code = { + env: { + sentryDSN: 'http://my-sentry.io/fooenv', + }, + namespaceSettings: { + sentryDSN: 'http://my-sentry.io/foo', + }, + }; + const sentry = await Storage.getSentryByEnvOrNamespace(code); + expect(sentry).to.be.eql('http://my-sentry.io/fooenv'); + }); + + it('should return sentryDSN from namespace', async () => { + const code = { + namespaceSettings: { + sentryDSN: 'http://my-sentry.io/foo', + }, + }; + + const sentry = await Storage.getSentryByEnvOrNamespace(code); + expect(sentry).to.be.eql('http://my-sentry.io/foo'); + }); + + it('should return null when sentryDSN isn`t configured', async () => { + const sentry = await Storage.getSentryByEnvOrNamespace({}); + expect(sentry).to.be.null; + }); + }); }); diff --git a/test/unit/domain/storageInMemory.test.js b/test/unit/domain/storageInMemory.test.js index c263b14..274b92f 100644 --- a/test/unit/domain/storageInMemory.test.js +++ b/test/unit/domain/storageInMemory.test.js @@ -64,6 +64,50 @@ describe('StorageInMemory', () => { // when code is found is already tested above }); + describe('sentryDSN', () => { + beforeEach(async () => { + this.namespace = 'backstage'; + this.code = { + id: 'test', + code: 'a = 1;', + hash: '123', + }; + await storage.deleteNamespace(this.namespace); + await storage.deleteCode(this.namespace, this.code.id); + }); + + it('when is configured in the namespace', async () => { + const x = await storage.putCode(this.namespace, this.code.id, this.code); + expect(x).to.be.eql('OK'); + await storage.putNamespace(this.namespace, { + namespace: this.namespace, + sentryDSN: 'http://my-sentry.io/foo', + }); + + const result = await storage.getCode(this.namespace, this.code.id); + expect(result.sentryDSN).to.be.eql('http://my-sentry.io/foo'); + }); + + it('when is configured in the env', async () => { + this.code.env = { + sentryDSN: 'http://my-sentry.io/fooenv', + }; + const x = await storage.putCode(this.namespace, this.code.id, this.code); + expect(x).to.be.eql('OK'); + + const result = await storage.getCode(this.namespace, this.code.id); + expect(result.sentryDSN).to.be.eql('http://my-sentry.io/fooenv'); + }); + + it('when isn`t configured', async () => { + const x = await storage.putCode(this.namespace, this.code.id, this.code); + expect(x).to.be.eql('OK'); + + const result = await storage.getCode(this.namespace, this.code.id); + expect(result.sentryDSN).to.be.null; + }); + }); + describe('#delete()', () => { it('should write a hash for the code', async () => { const id = 'test'; From f2103eeeea4636b3ef81613a5726e4a245681a20 Mon Sep 17 00:00:00 2001 From: "sergio.junior" Date: Mon, 30 Mar 2020 16:05:35 -0300 Subject: [PATCH 075/126] package.json: bumped version to 0.2.15 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1d8516f..cf0f486 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.14", + "version": "0.2.15", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From fc337af77561cf72c524edc9e2a3c55b7ca0a69f Mon Sep 17 00:00:00 2001 From: "sergio.junior" Date: Fri, 15 May 2020 10:35:47 -0300 Subject: [PATCH 076/126] add node-fetch version "^2.6.0" to DEFAULT_GLOBAL_MODULES --- lib/support/config.js | 1 + npm-shrinkwrap.json | 2320 +++++++++++++++++++++-------------------- package.json | 1 + 3 files changed, 1188 insertions(+), 1134 deletions(-) diff --git a/lib/support/config.js b/lib/support/config.js index 5f60c98..bb21580 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -7,6 +7,7 @@ const DEFAULT_GLOBAL_MODULES = [ 'async', 'request', 'uuid', + 'node-fetch', ]; module.exports = { diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index de2de3b..660c6fa 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.14", + "version": "0.2.15", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -9,8 +9,8 @@ "resolved": "https://registry.npmjs.org/@globocom/backstage-functions-sandbox/-/backstage-functions-sandbox-0.5.0.tgz", "integrity": "sha512-rwr/rGv6sbdYfzi9X6dNlNFz2EqByxsShp8WwRGof1bwVS7YDnFjmwbq71JlOXFe5UAvjIGkTm1VtOkSBtJf9Q==", "requires": { - "once": "1.4.0", - "stack-trace": "0.0.9" + "once": "^1.4.0", + "stack-trace": "^0.0.9" } }, "abbrev": { @@ -24,7 +24,7 @@ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", "requires": { - "mime-types": "2.1.12", + "mime-types": "~2.1.11", "negotiator": "0.6.1" } }, @@ -40,7 +40,7 @@ "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", "dev": true, "requires": { - "acorn": "3.3.0" + "acorn": "^3.0.4" }, "dependencies": { "acorn": { @@ -56,8 +56,8 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "ajv-keywords": { @@ -71,10 +71,11 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, + "optional": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "amdefine": { @@ -89,7 +90,7 @@ "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", "dev": true, "requires": { - "string-width": "2.1.1" + "string-width": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -110,8 +111,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -120,7 +121,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -149,8 +150,8 @@ "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", "dev": true, "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" } }, "argparse": { @@ -159,7 +160,7 @@ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "sprintf-js": "~1.0.2" } }, "arr-diff": { @@ -168,7 +169,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { @@ -206,7 +207,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "1.0.3" + "array-uniq": "^1.0.1" } }, "array-uniq": { @@ -227,8 +228,8 @@ "integrity": "sha1-VWpcU2LAhkgyPdrrnenRS8GGTJA=", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.9.0" + "define-properties": "^1.1.2", + "es-abstract": "^1.7.0" } }, "arrify": { @@ -258,7 +259,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.1.2.tgz", "integrity": "sha1-YSpKtF70KnDN6Aa62G7m2wR+g4U=", "requires": { - "lodash": "4.16.4" + "lodash": "^4.14.0" } }, "async-each": { @@ -288,9 +289,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "balanced-match": { @@ -310,7 +311,7 @@ "integrity": "sha1-PKdrhSQccXC/fZcD57mqdGMAQNQ=", "optional": true, "requires": { - "tweetnacl": "0.14.3" + "tweetnacl": "^0.14.3" } }, "binary-extensions": { @@ -335,15 +336,15 @@ "integrity": "sha1-11eM9PHRHV9uqATO813Hp/9trmc=", "requires": { "bytes": "2.4.0", - "content-type": "1.0.2", - "debug": "2.2.0", - "depd": "1.1.0", - "http-errors": "1.5.0", + "content-type": "~1.0.2", + "debug": "~2.2.0", + "depd": "~1.1.0", + "http-errors": "~1.5.0", "iconv-lite": "0.4.13", - "on-finished": "2.3.0", + "on-finished": "~2.3.0", "qs": "6.2.0", - "raw-body": "2.1.7", - "type-is": "1.6.13" + "raw-body": "~2.1.7", + "type-is": "~1.6.13" } }, "boom": { @@ -351,7 +352,7 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "boxen": { @@ -360,13 +361,13 @@ "integrity": "sha1-Px1AMsMP/qnUsCwyLq8up0HcvOU=", "dev": true, "requires": { - "ansi-align": "2.0.0", - "camelcase": "4.1.0", - "chalk": "2.3.0", - "cli-boxes": "1.0.0", - "string-width": "2.1.1", - "term-size": "1.2.0", - "widest-line": "1.0.0" + "ansi-align": "^2.0.0", + "camelcase": "^4.0.0", + "chalk": "^2.0.1", + "cli-boxes": "^1.0.0", + "string-width": "^2.0.0", + "term-size": "^1.2.0", + "widest-line": "^1.0.0" }, "dependencies": { "ansi-regex": { @@ -381,7 +382,7 @@ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "camelcase": { @@ -396,9 +397,9 @@ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" } }, "has-flag": { @@ -419,8 +420,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -429,7 +430,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } }, "supports-color": { @@ -438,7 +439,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } } } @@ -449,7 +450,7 @@ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -459,9 +460,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "browser-stdout": { @@ -487,7 +488,7 @@ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", "dev": true, "requires": { - "callsites": "0.2.0" + "callsites": "^0.2.0" } }, "callsites": { @@ -522,8 +523,8 @@ "dev": true, "optional": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chai": { @@ -532,9 +533,9 @@ "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=", "dev": true, "requires": { - "assertion-error": "1.0.2", - "deep-eql": "0.1.3", - "type-detect": "1.0.0" + "assertion-error": "^1.0.1", + "deep-eql": "^0.1.3", + "type-detect": "^1.0.0" } }, "chai-string": { @@ -549,11 +550,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "chokidar": { @@ -562,15 +563,15 @@ "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", "dev": true, "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.3", - "glob-parent": "2.0.0", - "inherits": "2.0.1", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" } }, "circular-json": { @@ -591,7 +592,7 @@ "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^1.0.1" } }, "cli-width": { @@ -607,8 +608,8 @@ "dev": true, "optional": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" }, "dependencies": { @@ -643,7 +644,7 @@ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "^1.1.1" } }, "color-name": { @@ -662,7 +663,7 @@ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "commander": { @@ -671,7 +672,7 @@ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", "dev": true, "requires": { - "graceful-readlink": "1.0.1" + "graceful-readlink": ">= 1.0.0" } }, "component-emitter": { @@ -692,9 +693,9 @@ "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" }, "dependencies": { "inherits": { @@ -711,12 +712,12 @@ "integrity": "sha512-5oNkD/L++l0O6xGXxb1EWS7SivtjfGQlRyxJsYgE0Z495/L81e2h4/d3r969hoPXuFItzNOKMtsXgYG4c7dYvw==", "dev": true, "requires": { - "dot-prop": "4.2.0", - "graceful-fs": "4.1.11", - "make-dir": "1.1.0", - "unique-string": "1.0.0", - "write-file-atomic": "2.3.0", - "xdg-basedir": "3.0.0" + "dot-prop": "^4.1.0", + "graceful-fs": "^4.1.2", + "make-dir": "^1.0.0", + "unique-string": "^1.0.0", + "write-file-atomic": "^2.0.0", + "xdg-basedir": "^3.0.0" } }, "contains-path": { @@ -782,8 +783,8 @@ "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "2.7.3" + "argparse": "^1.0.7", + "esprima": "^2.6.0" } }, "minimist": { @@ -804,26 +805,26 @@ "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", "dev": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.5.0", - "caseless": "0.11.0", - "combined-stream": "1.0.5", - "extend": "3.0.0", - "forever-agent": "0.6.1", - "form-data": "2.1.1", - "har-validator": "2.0.6", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.12", - "oauth-sign": "0.8.2", - "qs": "6.3.2", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.4.3", - "uuid": "3.0.1" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~2.0.6", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "qs": "~6.3.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "~0.4.1", + "uuid": "^3.0.0" } } } @@ -834,7 +835,7 @@ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", "dev": true, "requires": { - "capture-stack-trace": "1.0.0" + "capture-stack-trace": "^1.0.0" } }, "cross-spawn": { @@ -843,9 +844,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } }, "cryptiles": { @@ -853,7 +854,7 @@ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "requires": { - "boom": "2.10.1" + "boom": "2.x.x" } }, "crypto-random-string": { @@ -873,7 +874,7 @@ "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", "dev": true, "requires": { - "es5-ext": "0.10.35" + "es5-ext": "^0.10.9" } }, "damerau-levenshtein": { @@ -887,7 +888,7 @@ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.0.tgz", "integrity": "sha1-KeSGxUGL8PNWA0qZPVFoajPoQUE=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -952,8 +953,8 @@ "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", "dev": true, "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" + "foreach": "^2.0.5", + "object-keys": "^1.0.8" } }, "del": { @@ -962,13 +963,13 @@ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", "dev": true, "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" } }, "delayed-stream": { @@ -1003,8 +1004,8 @@ "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", "dev": true, "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } }, "dot-prop": { @@ -1013,7 +1014,7 @@ "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", "dev": true, "requires": { - "is-obj": "1.0.1" + "is-obj": "^1.0.0" } }, "duplexer": { @@ -1034,7 +1035,7 @@ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", "optional": true, "requires": { - "jsbn": "0.1.0" + "jsbn": "~0.1.0" } }, "ee-first": { @@ -1053,11 +1054,11 @@ "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", "dev": true, "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" + "es-to-primitive": "^1.1.1", + "function-bind": "^1.1.1", + "has": "^1.0.1", + "is-callable": "^1.1.3", + "is-regex": "^1.0.4" } }, "es-to-primitive": { @@ -1066,9 +1067,9 @@ "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", "dev": true, "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" + "is-callable": "^1.1.1", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.1" } }, "es5-ext": { @@ -1077,8 +1078,8 @@ "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", "dev": true, "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "es6-iterator": "~2.0.1", + "es6-symbol": "~3.1.1" } }, "es6-iterator": { @@ -1087,9 +1088,9 @@ "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" } }, "es6-map": { @@ -1098,12 +1099,12 @@ "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", + "es6-set": "~0.1.5", + "es6-symbol": "~3.1.1", + "event-emitter": "~0.3.5" } }, "es6-promise": { @@ -1118,11 +1119,11 @@ "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", + "d": "1", + "es5-ext": "~0.10.14", + "es6-iterator": "~2.0.1", "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "event-emitter": "~0.3.5" } }, "es6-symbol": { @@ -1131,8 +1132,8 @@ "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35" + "d": "1", + "es5-ext": "~0.10.14" } }, "es6-weak-map": { @@ -1141,10 +1142,10 @@ "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "d": "1", + "es5-ext": "^0.10.14", + "es6-iterator": "^2.0.1", + "es6-symbol": "^3.1.1" } }, "escape-html": { @@ -1164,11 +1165,11 @@ "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", "dev": true, "requires": { - "esprima": "2.7.3", - "estraverse": "1.9.3", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.2.0" + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" }, "dependencies": { "esprima": { @@ -1191,10 +1192,10 @@ "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", "dev": true, "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" + "es6-map": "^0.1.3", + "es6-weak-map": "^2.0.1", + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" } }, "eslint": { @@ -1203,41 +1204,41 @@ "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "chalk": "1.1.3", - "concat-stream": "1.6.0", - "debug": "2.2.0", - "doctrine": "2.0.0", - "escope": "3.6.0", - "espree": "3.5.2", - "esquery": "1.0.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "glob": "7.1.2", - "globals": "9.18.0", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "inquirer": "0.12.0", - "is-my-json-valid": "2.16.1", - "is-resolvable": "1.0.0", - "js-yaml": "3.10.0", - "json-stable-stringify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.16.4", - "mkdirp": "0.5.1", - "natural-compare": "1.4.0", - "optionator": "0.8.2", - "path-is-inside": "1.0.2", - "pluralize": "1.2.1", - "progress": "1.1.8", - "require-uncached": "1.0.3", - "shelljs": "0.7.8", - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1", - "table": "3.8.3", - "text-table": "0.2.0", - "user-home": "2.0.0" + "babel-code-frame": "^6.16.0", + "chalk": "^1.1.3", + "concat-stream": "^1.5.2", + "debug": "^2.1.1", + "doctrine": "^2.0.0", + "escope": "^3.6.0", + "espree": "^3.4.0", + "esquery": "^1.0.0", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "file-entry-cache": "^2.0.0", + "glob": "^7.0.3", + "globals": "^9.14.0", + "ignore": "^3.2.0", + "imurmurhash": "^0.1.4", + "inquirer": "^0.12.0", + "is-my-json-valid": "^2.10.0", + "is-resolvable": "^1.0.0", + "js-yaml": "^3.5.1", + "json-stable-stringify": "^1.0.0", + "levn": "^0.3.0", + "lodash": "^4.0.0", + "mkdirp": "^0.5.0", + "natural-compare": "^1.4.0", + "optionator": "^0.8.2", + "path-is-inside": "^1.0.1", + "pluralize": "^1.2.1", + "progress": "^1.1.8", + "require-uncached": "^1.0.2", + "shelljs": "^0.7.5", + "strip-bom": "^3.0.0", + "strip-json-comments": "~2.0.1", + "table": "^3.7.8", + "text-table": "~0.2.0", + "user-home": "^2.0.0" } }, "eslint-config-airbnb": { @@ -1246,7 +1247,7 @@ "integrity": "sha1-qygrdWol8D0ErCZMJNZzoIqAMnA=", "dev": true, "requires": { - "eslint-config-airbnb-base": "8.0.0" + "eslint-config-airbnb-base": "^8.0.0" } }, "eslint-config-airbnb-base": { @@ -1261,9 +1262,9 @@ "integrity": "sha1-Wt2BBujJKNssuiMrzZ76hG49oWw=", "dev": true, "requires": { - "debug": "2.2.0", - "object-assign": "4.1.1", - "resolve": "1.5.0" + "debug": "^2.2.0", + "object-assign": "^4.0.1", + "resolve": "^1.1.6" } }, "eslint-plugin-import": { @@ -1272,22 +1273,22 @@ "integrity": "sha1-svoH68xTUE0PKkR3WC7Iv/GHG58=", "dev": true, "requires": { - "builtin-modules": "1.1.1", - "contains-path": "0.1.0", - "debug": "2.2.0", - "doctrine": "1.3.0", - "es6-map": "0.1.5", - "es6-set": "0.1.5", - "eslint-import-resolver-node": "0.2.3", - "has": "1.0.1", - "lodash.cond": "4.5.2", - "lodash.endswith": "4.2.1", - "lodash.find": "4.6.0", - "lodash.findindex": "4.6.0", - "minimatch": "3.0.4", - "object-assign": "4.1.1", - "pkg-dir": "1.0.0", - "pkg-up": "1.0.0" + "builtin-modules": "^1.1.1", + "contains-path": "^0.1.0", + "debug": "^2.2.0", + "doctrine": "1.3.x", + "es6-map": "^0.1.3", + "es6-set": "^0.1.4", + "eslint-import-resolver-node": "^0.2.0", + "has": "^1.0.1", + "lodash.cond": "^4.3.0", + "lodash.endswith": "^4.0.1", + "lodash.find": "^4.3.0", + "lodash.findindex": "^4.3.0", + "minimatch": "^3.0.3", + "object-assign": "^4.0.1", + "pkg-dir": "^1.0.0", + "pkg-up": "^1.0.0" }, "dependencies": { "doctrine": { @@ -1296,8 +1297,8 @@ "integrity": "sha1-E+dWgrVVGEJCdvfBc3g0Vu+RPSY=", "dev": true, "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } } } @@ -1308,9 +1309,9 @@ "integrity": "sha1-TjXLcbin23AqxBXIBuuOjZ6mxl0=", "dev": true, "requires": { - "damerau-levenshtein": "1.0.4", - "jsx-ast-utils": "1.4.1", - "object-assign": "4.1.1" + "damerau-levenshtein": "^1.0.0", + "jsx-ast-utils": "^1.0.0", + "object-assign": "^4.0.1" } }, "eslint-plugin-react": { @@ -1319,11 +1320,11 @@ "integrity": "sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g=", "dev": true, "requires": { - "array.prototype.find": "2.0.4", - "doctrine": "1.5.0", - "has": "1.0.1", - "jsx-ast-utils": "1.4.1", - "object.assign": "4.0.4" + "array.prototype.find": "^2.0.1", + "doctrine": "^1.2.2", + "has": "^1.0.1", + "jsx-ast-utils": "^1.3.4", + "object.assign": "^4.0.4" }, "dependencies": { "doctrine": { @@ -1332,8 +1333,8 @@ "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { - "esutils": "2.0.2", - "isarray": "1.0.0" + "esutils": "^2.0.2", + "isarray": "^1.0.0" } } } @@ -1344,8 +1345,8 @@ "integrity": "sha512-sadKeYwaR/aJ3stC2CdvgXu1T16TdYN+qwCpcWbMnGJ8s0zNWemzrvb2GbD4OhmJ/fwpJjudThAlLobGbWZbCQ==", "dev": true, "requires": { - "acorn": "5.2.1", - "acorn-jsx": "3.0.1" + "acorn": "^5.2.1", + "acorn-jsx": "^3.0.0" } }, "esprima": { @@ -1360,7 +1361,7 @@ "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", "dev": true, "requires": { - "estraverse": "4.2.0" + "estraverse": "^4.0.0" } }, "esrecurse": { @@ -1369,8 +1370,8 @@ "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", "dev": true, "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" + "estraverse": "^4.1.0", + "object-assign": "^4.0.1" } }, "estraverse": { @@ -1396,8 +1397,8 @@ "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", "dev": true, "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35" + "d": "1", + "es5-ext": "~0.10.14" } }, "event-stream": { @@ -1406,13 +1407,13 @@ "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { - "duplexer": "0.1.1", - "from": "0.1.7", - "map-stream": "0.1.0", + "duplexer": "~0.1.1", + "from": "~0", + "map-stream": "~0.1.0", "pause-stream": "0.0.11", - "split": "0.3.3", - "stream-combiner": "0.0.4", - "through": "2.3.8" + "split": "0.3", + "stream-combiner": "~0.0.4", + "through": "~2.3.1" } }, "eventemitter3": { @@ -1427,13 +1428,13 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "exit-hook": { @@ -1448,7 +1449,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -1457,7 +1458,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.3" + "fill-range": "^2.1.0" } }, "express": { @@ -1465,32 +1466,32 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.14.0.tgz", "integrity": "sha1-we4/Qs3Ikfs9xlCoki1R7IR9DWY=", "requires": { - "accepts": "1.3.3", + "accepts": "~1.3.3", "array-flatten": "1.1.1", "content-disposition": "0.5.1", - "content-type": "1.0.2", + "content-type": "~1.0.2", "cookie": "0.3.1", "cookie-signature": "1.0.6", - "debug": "2.2.0", - "depd": "1.1.0", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.7.0", + "debug": "~2.2.0", + "depd": "~1.1.0", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.7.0", "finalhandler": "0.5.0", "fresh": "0.3.0", "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.1", "path-to-regexp": "0.1.7", - "proxy-addr": "1.1.2", + "proxy-addr": "~1.1.2", "qs": "6.2.0", - "range-parser": "1.2.0", + "range-parser": "~1.2.0", "send": "0.14.1", - "serve-static": "1.11.1", - "type-is": "1.6.13", + "serve-static": "~1.11.1", + "type-is": "~1.6.13", "utils-merge": "1.0.0", - "vary": "1.1.0" + "vary": "~1.1.0" } }, "extend": { @@ -1504,7 +1505,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "extsprintf": { @@ -1529,8 +1530,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "file-entry-cache": { @@ -1539,8 +1540,8 @@ "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", "dev": true, "requires": { - "flat-cache": "1.3.0", - "object-assign": "4.1.1" + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" } }, "filename-regex": { @@ -1555,11 +1556,11 @@ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "finalhandler": { @@ -1567,11 +1568,11 @@ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.0.tgz", "integrity": "sha1-6VCKvs6bbbqHGmlCodeRG5GRGsc=", "requires": { - "debug": "2.2.0", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "statuses": "1.3.0", - "unpipe": "1.0.0" + "debug": "~2.2.0", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "statuses": "~1.3.0", + "unpipe": "~1.0.0" } }, "find-up": { @@ -1580,8 +1581,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "flat-cache": { @@ -1590,10 +1591,10 @@ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" } }, "flexbuffer": { @@ -1613,7 +1614,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "foreach": { @@ -1628,10 +1629,10 @@ "integrity": "sha1-AKzSD5274vedBGl7zKKnfuAO4DE=", "dev": true, "requires": { - "commander": "2.9.0", - "http-proxy": "1.11.3", - "mustache": "2.3.0", - "shell-quote": "1.4.3" + "commander": "~2.9.0", + "http-proxy": "~1.11.1", + "mustache": "^2.2.1", + "shell-quote": "~1.4.2" } }, "forever-agent": { @@ -1644,9 +1645,9 @@ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.1.tgz", "integrity": "sha1-St8DQuGnmvoehMjDIKn/yCOSofM=", "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.12" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" } }, "formatio": { @@ -1655,7 +1656,7 @@ "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", "dev": true, "requires": { - "samsam": "1.3.0" + "samsam": "1.x" } }, "formidable": { @@ -1693,8 +1694,8 @@ "dev": true, "optional": true, "requires": { - "nan": "2.8.0", - "node-pre-gyp": "0.6.39" + "nan": "^2.3.0", + "node-pre-gyp": "^0.6.39" }, "dependencies": { "abbrev": { @@ -1711,15 +1712,16 @@ "dev": true, "optional": true, "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" + "co": "^4.6.0", + "json-stable-stringify": "^1.0.1" } }, "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.1.1", @@ -1735,8 +1737,8 @@ "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, "asn1": { @@ -1778,7 +1780,8 @@ "version": "0.4.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true + "dev": true, + "optional": true }, "bcrypt-pbkdf": { "version": "1.0.1", @@ -1787,7 +1790,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "0.14.5" + "tweetnacl": "^0.14.3" } }, "block-stream": { @@ -1795,8 +1798,9 @@ "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "dev": true, + "optional": true, "requires": { - "inherits": "2.0.3" + "inherits": "~2.0.0" } }, "boom": { @@ -1804,8 +1808,9 @@ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", "dev": true, + "optional": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "brace-expansion": { @@ -1813,8 +1818,9 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", "dev": true, + "optional": true, "requires": { - "balanced-match": "0.4.2", + "balanced-match": "^0.4.1", "concat-map": "0.0.1" } }, @@ -1822,7 +1828,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true + "dev": true, + "optional": true }, "caseless": { "version": "0.12.0", @@ -1842,42 +1849,48 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true + "dev": true, + "optional": true }, "combined-stream": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", "dev": true, + "optional": true, "requires": { - "delayed-stream": "1.0.0" + "delayed-stream": "~1.0.0" } }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "dev": true, + "optional": true }, "cryptiles": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", "dev": true, + "optional": true, "requires": { - "boom": "2.10.1" + "boom": "2.x.x" } }, "dashdash": { @@ -1887,7 +1900,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -1920,7 +1933,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true + "dev": true, + "optional": true }, "delegates": { "version": "1.0.0", @@ -1943,7 +1957,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "extend": { @@ -1957,7 +1971,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", - "dev": true + "dev": true, + "optional": true }, "forever-agent": { "version": "0.6.1", @@ -1982,18 +1997,20 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "dev": true, + "optional": true }, "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "dev": true, + "optional": true, "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" } }, "fstream-ignore": { @@ -2003,9 +2020,9 @@ "dev": true, "optional": true, "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" } }, "gauge": { @@ -2015,14 +2032,14 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "getpass": { @@ -2032,7 +2049,7 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -2049,20 +2066,22 @@ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, + "optional": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true + "dev": true, + "optional": true }, "har-schema": { "version": "1.0.5", @@ -2094,18 +2113,20 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "dev": true, + "optional": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "hoek": { "version": "2.16.3", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true + "dev": true, + "optional": true }, "http-signature": { "version": "1.1.1", @@ -2114,9 +2135,9 @@ "dev": true, "optional": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "inflight": { @@ -2124,16 +2145,18 @@ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, + "optional": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.4", @@ -2147,6 +2170,7 @@ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, + "optional": true, "requires": { "number-is-nan": "1.0.1" } @@ -2162,7 +2186,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true + "dev": true, + "optional": true }, "isstream": { "version": "0.1.2", @@ -2178,7 +2203,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "jsbn": "~0.1.0" } }, "jsbn": { @@ -2202,7 +2227,7 @@ "dev": true, "optional": true, "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -2245,13 +2270,15 @@ "version": "1.27.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", - "dev": true + "dev": true, + "optional": true }, "mime-types": { "version": "2.1.15", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", "dev": true, + "optional": true, "requires": { "mime-db": "1.27.0" } @@ -2261,6 +2288,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, + "optional": true, "requires": { "brace-expansion": "1.1.7" } @@ -2269,13 +2297,15 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true + "dev": true, + "optional": true }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -2294,17 +2324,17 @@ "dev": true, "optional": true, "requires": { - "detect-libc": "1.0.2", + "detect-libc": "^1.0.2", "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^2.2.1", + "tar-pack": "^3.4.0" } }, "nopt": { @@ -2314,8 +2344,8 @@ "dev": true, "optional": true, "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" + "abbrev": "1", + "osenv": "^0.1.4" } }, "npmlog": { @@ -2325,17 +2355,18 @@ "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true + "dev": true, + "optional": true }, "oauth-sign": { "version": "0.8.2", @@ -2356,8 +2387,9 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, + "optional": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -2389,7 +2421,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "dev": true, + "optional": true }, "performance-now": { "version": "0.2.0", @@ -2402,7 +2435,8 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true + "dev": true, + "optional": true }, "punycode": { "version": "1.4.1", @@ -2425,10 +2459,10 @@ "dev": true, "optional": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -2445,14 +2479,15 @@ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", "dev": true, + "optional": true, "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" } }, "request": { @@ -2462,28 +2497,28 @@ "dev": true, "optional": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" } }, "rimraf": { @@ -2491,15 +2526,17 @@ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", "dev": true, + "optional": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "safe-buffer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", - "dev": true + "dev": true, + "optional": true }, "semver": { "version": "5.3.0", @@ -2527,8 +2564,9 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "dev": true, + "optional": true, "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "sshpk": { @@ -2538,15 +2576,15 @@ "dev": true, "optional": true, "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" }, "dependencies": { "assert-plus": { @@ -2563,10 +2601,11 @@ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, + "optional": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -2574,8 +2613,9 @@ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", "dev": true, + "optional": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "^5.0.1" } }, "stringstream": { @@ -2590,8 +2630,9 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, + "optional": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -2606,10 +2647,11 @@ "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "dev": true, + "optional": true, "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" } }, "tar-pack": { @@ -2619,14 +2661,14 @@ "dev": true, "optional": true, "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.1", + "tar": "^2.2.1", + "uid-number": "^0.0.6" } }, "tough-cookie": { @@ -2636,7 +2678,7 @@ "dev": true, "optional": true, "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tunnel-agent": { @@ -2646,7 +2688,7 @@ "dev": true, "optional": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "^5.0.1" } }, "tweetnacl": { @@ -2667,7 +2709,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "dev": true, + "optional": true }, "uuid": { "version": "3.0.1", @@ -2693,14 +2736,15 @@ "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2" } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "dev": true, + "optional": true } } }, @@ -2715,7 +2759,7 @@ "resolved": "https://registry.npmjs.org/gelf/-/gelf-2.0.1.tgz", "integrity": "sha512-77duTNPkUgcwFRl+kbmPx2YGMF4e030xBVVsKix5mruTAjuROW36WxmpVSk8MkiZC1D68JYNNb+kfJeZG/D5VQ==", "requires": { - "async": "2.6.2" + "async": "^2.5.0" }, "dependencies": { "async": { @@ -2723,7 +2767,7 @@ "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", "requires": { - "lodash": "4.17.11" + "lodash": "^4.17.11" } }, "lodash": { @@ -2745,7 +2789,7 @@ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", "dev": true, "requires": { - "is-property": "1.0.2" + "is-property": "^1.0.0" } }, "get-stream": { @@ -2759,7 +2803,7 @@ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz", "integrity": "sha1-KD/9n8ElaECHUxHBtg6MQBhxEOY=", "requires": { - "assert-plus": "1.0.0" + "assert-plus": "^1.0.0" }, "dependencies": { "assert-plus": { @@ -2775,12 +2819,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.1", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-base": { @@ -2789,8 +2833,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" } }, "glob-parent": { @@ -2799,7 +2843,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "global-dirs": { @@ -2808,7 +2852,7 @@ "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", "dev": true, "requires": { - "ini": "1.3.5" + "ini": "^1.3.4" } }, "globals": { @@ -2823,12 +2867,12 @@ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", "dev": true, "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "got": { @@ -2837,17 +2881,17 @@ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", "dev": true, "requires": { - "create-error-class": "3.0.2", - "duplexer3": "0.1.4", - "get-stream": "3.0.0", - "is-redirect": "1.0.0", - "is-retry-allowed": "1.1.0", - "is-stream": "1.1.0", - "lowercase-keys": "1.0.0", - "safe-buffer": "5.1.1", - "timed-out": "4.0.1", - "unzip-response": "2.0.1", - "url-parse-lax": "1.0.0" + "create-error-class": "^3.0.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-redirect": "^1.0.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "lowercase-keys": "^1.0.0", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "unzip-response": "^2.0.1", + "url-parse-lax": "^1.0.0" } }, "graceful-fs": { @@ -2874,10 +2918,10 @@ "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "dev": true, "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" }, "dependencies": { "async": { @@ -2892,7 +2936,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -2908,10 +2952,10 @@ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", "dev": true, "requires": { - "chalk": "1.1.3", - "commander": "2.9.0", - "is-my-json-valid": "2.16.1", - "pinkie-promise": "2.0.1" + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" } }, "has": { @@ -2920,7 +2964,7 @@ "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", "dev": true, "requires": { - "function-bind": "1.1.1" + "function-bind": "^1.0.2" } }, "has-ansi": { @@ -2929,7 +2973,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -2943,10 +2987,10 @@ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" } }, "he": { @@ -2967,7 +3011,7 @@ "requires": { "inherits": "2.0.1", "setprototypeof": "1.0.1", - "statuses": "1.3.0" + "statuses": ">= 1.3.0 < 2" } }, "http-proxy": { @@ -2976,8 +3020,8 @@ "integrity": "sha1-GRXciIdR4qa/PCq/yxgI+obHI1M=", "dev": true, "requires": { - "eventemitter3": "1.2.0", - "requires-port": "0.0.1" + "eventemitter3": "1.x.x", + "requires-port": "0.x.x" } }, "http-signature": { @@ -2985,9 +3029,9 @@ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.3.1", - "sshpk": "1.10.1" + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" } }, "iconv-lite": { @@ -3025,8 +3069,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -3046,19 +3090,19 @@ "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "ansi-regex": "2.1.1", - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-width": "2.2.0", - "figures": "1.7.0", - "lodash": "4.16.4", - "readline2": "1.0.1", - "run-async": "0.1.0", - "rx-lite": "3.1.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "through": "2.3.8" + "ansi-escapes": "^1.1.0", + "ansi-regex": "^2.0.0", + "chalk": "^1.0.0", + "cli-cursor": "^1.0.1", + "cli-width": "^2.0.0", + "figures": "^1.3.5", + "lodash": "^4.3.0", + "readline2": "^1.0.1", + "run-async": "^0.1.0", + "rx-lite": "^3.1.2", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "through": "^2.3.6" } }, "interpret": { @@ -3072,29 +3116,29 @@ "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-3.1.4.tgz", "integrity": "sha512-gz9h5BVDh5DVfzGAzyUsE/NBABLuDN5inIFKKRq66h9mqtpBFSM5HaOxKgkJLwMhQihZPkadq/xaZP4dlrHwXA==", "requires": { - "bluebird": "3.5.1", - "cluster-key-slot": "1.0.8", - "debug": "2.2.0", - "denque": "1.2.2", + "bluebird": "^3.3.4", + "cluster-key-slot": "^1.0.6", + "debug": "^2.2.0", + "denque": "^1.1.0", "flexbuffer": "0.0.6", - "lodash.assign": "4.2.0", - "lodash.bind": "4.2.1", - "lodash.clone": "4.5.0", - "lodash.clonedeep": "4.5.0", - "lodash.defaults": "4.2.0", - "lodash.difference": "4.5.0", - "lodash.flatten": "4.4.0", - "lodash.foreach": "4.5.0", - "lodash.isempty": "4.4.0", - "lodash.keys": "4.2.0", - "lodash.noop": "3.0.1", - "lodash.partial": "4.2.1", - "lodash.pick": "4.4.0", - "lodash.sample": "4.2.1", - "lodash.shuffle": "4.2.0", - "lodash.values": "4.3.0", - "redis-commands": "1.3.1", - "redis-parser": "2.6.0" + "lodash.assign": "^4.2.0", + "lodash.bind": "^4.2.1", + "lodash.clone": "^4.5.0", + "lodash.clonedeep": "^4.5.0", + "lodash.defaults": "^4.2.0", + "lodash.difference": "^4.5.0", + "lodash.flatten": "^4.4.0", + "lodash.foreach": "^4.5.0", + "lodash.isempty": "^4.4.0", + "lodash.keys": "^4.2.0", + "lodash.noop": "^3.0.1", + "lodash.partial": "^4.2.1", + "lodash.pick": "^4.4.0", + "lodash.sample": "^4.2.1", + "lodash.shuffle": "^4.2.0", + "lodash.values": "^4.3.0", + "redis-commands": "^1.2.0", + "redis-parser": "^2.4.0" }, "dependencies": { "lodash.assign": { @@ -3125,7 +3169,7 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.11.0" + "binary-extensions": "^1.0.0" } }, "is-buffer": { @@ -3158,7 +3202,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -3179,7 +3223,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { @@ -3188,7 +3232,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-installed-globally": { @@ -3197,8 +3241,8 @@ "integrity": "sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA=", "dev": true, "requires": { - "global-dirs": "0.1.1", - "is-path-inside": "1.0.0" + "global-dirs": "^0.1.0", + "is-path-inside": "^1.0.0" } }, "is-my-json-valid": { @@ -3207,10 +3251,10 @@ "integrity": "sha512-ochPsqWS1WXj8ZnMIV0vnNXooaMhp7cyL4FMSIPKTtnV0Ha/T19G2b9kkhcNsabV9bxYkze7/aLZJb/bYuFduQ==", "dev": true, "requires": { - "generate-function": "2.0.0", - "generate-object-property": "1.2.0", - "jsonpointer": "4.0.1", - "xtend": "4.0.1" + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "^4.0.0", + "xtend": "^4.0.0" } }, "is-npm": { @@ -3225,7 +3269,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-obj": { @@ -3246,7 +3290,7 @@ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", "dev": true, "requires": { - "is-path-inside": "1.0.0" + "is-path-inside": "^1.0.0" } }, "is-path-inside": { @@ -3255,7 +3299,7 @@ "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", "dev": true, "requires": { - "path-is-inside": "1.0.2" + "path-is-inside": "^1.0.1" } }, "is-posix-bracket": { @@ -3288,7 +3332,7 @@ "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { - "has": "1.0.1" + "has": "^1.0.1" } }, "is-resolvable": { @@ -3297,7 +3341,7 @@ "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", "dev": true, "requires": { - "tryit": "1.0.3" + "tryit": "^1.0.1" } }, "is-retry-allowed": { @@ -3355,20 +3399,20 @@ "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", "dev": true, "requires": { - "abbrev": "1.0.9", - "async": "1.5.2", - "escodegen": "1.8.1", - "esprima": "2.7.3", - "glob": "5.0.15", - "handlebars": "4.0.11", - "js-yaml": "3.10.0", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "once": "1.4.0", - "resolve": "1.1.7", - "supports-color": "3.2.3", - "which": "1.3.0", - "wordwrap": "1.0.0" + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" }, "dependencies": { "async": { @@ -3389,11 +3433,11 @@ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", "dev": true, "requires": { - "inflight": "1.0.6", - "inherits": "2.0.1", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "resolve": { @@ -3408,7 +3452,7 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -3419,11 +3463,11 @@ "integrity": "sha1-TxwVkr4QTVkfkzy/nA8vUoStzwA=", "dev": true, "requires": { - "chalk": "1.1.3", - "coveralls": "2.13.3", - "minimist": "1.2.0", - "rimraf": "2.6.2", - "sum-up": "1.0.3" + "chalk": "^1.0.0", + "coveralls": "^2.11.2", + "minimist": "^1.1.1", + "rimraf": "^2.3.4", + "sum-up": "^1.0.1" }, "dependencies": { "minimist": { @@ -3440,7 +3484,7 @@ "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", "optional": true, "requires": { - "jsbn": "0.1.0" + "jsbn": "~0.1.0" } }, "js-tokens": { @@ -3455,8 +3499,8 @@ "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" + "argparse": "^1.0.7", + "esprima": "^4.0.0" } }, "jsbn": { @@ -3475,7 +3519,7 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "requires": { - "jsonify": "0.0.0" + "jsonify": "~0.0.0" } }, "json-stringify-safe": { @@ -3533,7 +3577,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } }, "latest-version": { @@ -3542,7 +3586,7 @@ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", "dev": true, "requires": { - "package-json": "4.0.1" + "package-json": "^4.0.0" } }, "lazy-cache": { @@ -3564,8 +3608,8 @@ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, "lodash": { @@ -3579,8 +3623,8 @@ "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", "dev": true, "requires": { - "lodash._basecopy": "3.0.1", - "lodash.keys": "3.1.2" + "lodash._basecopy": "^3.0.0", + "lodash.keys": "^3.0.0" } }, "lodash._basecopy": { @@ -3607,9 +3651,9 @@ "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", "dev": true, "requires": { - "lodash._bindcallback": "3.0.1", - "lodash._isiterateecall": "3.0.9", - "lodash.restparam": "3.6.1" + "lodash._bindcallback": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash.restparam": "^3.0.0" } }, "lodash._getnative": { @@ -3630,9 +3674,9 @@ "integrity": "sha1-POnwI0tLIiPilrj6CsH+6OvKZPo=", "dev": true, "requires": { - "lodash._baseassign": "3.2.0", - "lodash._createassigner": "3.1.1", - "lodash.keys": "3.1.2" + "lodash._baseassign": "^3.0.0", + "lodash._createassigner": "^3.0.0", + "lodash.keys": "^3.0.0" } }, "lodash.bind": { @@ -3662,9 +3706,9 @@ "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", "dev": true, "requires": { - "lodash._baseassign": "3.2.0", - "lodash._basecreate": "3.0.3", - "lodash._isiterateecall": "3.0.9" + "lodash._baseassign": "^3.0.0", + "lodash._basecreate": "^3.0.0", + "lodash._isiterateecall": "^3.0.0" } }, "lodash.defaults": { @@ -3673,8 +3717,8 @@ "integrity": "sha1-xzCLGNv4vJNy1wGnNJPGEZK9Liw=", "dev": true, "requires": { - "lodash.assign": "3.2.0", - "lodash.restparam": "3.6.1" + "lodash.assign": "^3.0.0", + "lodash.restparam": "^3.0.0" } }, "lodash.difference": { @@ -3739,9 +3783,9 @@ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "dev": true, "requires": { - "lodash._getnative": "3.9.1", - "lodash.isarguments": "3.1.0", - "lodash.isarray": "3.0.4" + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" } }, "lodash.noop": { @@ -3796,7 +3840,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true + "dev": true, + "optional": true }, "lowercase-keys": { "version": "1.0.0", @@ -3810,8 +3855,8 @@ "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "lsmod": { @@ -3825,7 +3870,7 @@ "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^3.0.0" }, "dependencies": { "pify": { @@ -3863,19 +3908,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "mime": { @@ -3893,7 +3938,7 @@ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.12.tgz", "integrity": "sha1-FSuiVndwIN1GY/VMLnvCY4HnFyk=", "requires": { - "mime-db": "1.24.0" + "mime-db": "~1.24.0" } }, "minimatch": { @@ -3902,7 +3947,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -3955,12 +4000,12 @@ "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.1", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "ms": { @@ -3975,7 +4020,7 @@ "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -3985,11 +4030,11 @@ "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.7.0.tgz", "integrity": "sha1-6xDKjlDRq+D409rVwCAdBS2YHGI=", "requires": { - "basic-auth": "1.0.4", - "debug": "2.2.0", - "depd": "1.1.0", - "on-finished": "2.3.0", - "on-headers": "1.0.1" + "basic-auth": "~1.0.3", + "debug": "~2.2.0", + "depd": "~1.1.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.1" } }, "ms": { @@ -4033,11 +4078,11 @@ "integrity": "sha512-q9jXh3UNsMV28KeqI43ILz5+c3l+RiNW8mhurEwCKckuHQbL+hTJIKKTiUlCPKlgQ/OukFvSnKB/Jk3+sFbkGA==", "dev": true, "requires": { - "formatio": "1.2.0", - "just-extend": "1.1.27", - "lolex": "1.6.0", - "path-to-regexp": "1.7.0", - "text-encoding": "0.6.4" + "formatio": "^1.2.0", + "just-extend": "^1.1.26", + "lolex": "^1.6.0", + "path-to-regexp": "^1.7.0", + "text-encoding": "^0.6.4" }, "dependencies": { "isarray": { @@ -4063,22 +4108,27 @@ } } }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, "nodemon": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.12.1.tgz", "integrity": "sha1-mWpW3EnZ8Wu/G3ik3gjxNjSzh40=", "dev": true, "requires": { - "chokidar": "1.7.0", - "debug": "2.6.9", - "es6-promise": "3.3.1", - "ignore-by-default": "1.0.1", - "lodash.defaults": "3.1.2", - "minimatch": "3.0.4", - "ps-tree": "1.1.0", - "touch": "3.1.0", + "chokidar": "^1.7.0", + "debug": "^2.6.8", + "es6-promise": "^3.3.1", + "ignore-by-default": "^1.0.1", + "lodash.defaults": "^3.1.2", + "minimatch": "^3.0.4", + "ps-tree": "^1.1.0", + "touch": "^3.1.0", "undefsafe": "0.0.3", - "update-notifier": "2.3.0" + "update-notifier": "^2.2.0" }, "dependencies": { "debug": { @@ -4104,7 +4154,7 @@ "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", "dev": true, "requires": { - "abbrev": "1.0.9" + "abbrev": "1" } }, "normalize-path": { @@ -4113,7 +4163,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "npm-run-path": { @@ -4122,7 +4172,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "number-is-nan": { @@ -4137,33 +4187,33 @@ "integrity": "sha512-oUu0WHt1k/JMIODvAYXX6C50Mupw2GO34P/Jdg2ty9xrLufBthHiKR2gf08aF+9S0abW1fl24R7iKRBXzibZmg==", "dev": true, "requires": { - "archy": "1.0.0", - "arrify": "1.0.1", - "caching-transform": "1.0.1", - "convert-source-map": "1.5.0", - "debug-log": "1.0.1", - "default-require-extensions": "1.0.0", - "find-cache-dir": "0.1.1", - "find-up": "2.1.0", - "foreground-child": "1.5.6", - "glob": "7.1.2", - "istanbul-lib-coverage": "1.1.1", - "istanbul-lib-hook": "1.1.0", - "istanbul-lib-instrument": "1.9.1", - "istanbul-lib-report": "1.1.2", - "istanbul-lib-source-maps": "1.2.2", - "istanbul-reports": "1.1.3", - "md5-hex": "1.3.0", - "merge-source-map": "1.0.4", - "micromatch": "2.3.11", - "mkdirp": "0.5.1", - "resolve-from": "2.0.0", - "rimraf": "2.6.2", - "signal-exit": "3.0.2", - "spawn-wrap": "1.3.8", - "test-exclude": "4.1.1", - "yargs": "10.0.3", - "yargs-parser": "8.0.0" + "archy": "^1.0.0", + "arrify": "^1.0.1", + "caching-transform": "^1.0.0", + "convert-source-map": "^1.3.0", + "debug-log": "^1.0.1", + "default-require-extensions": "^1.0.0", + "find-cache-dir": "^0.1.1", + "find-up": "^2.1.0", + "foreground-child": "^1.5.3", + "glob": "^7.0.6", + "istanbul-lib-coverage": "^1.1.1", + "istanbul-lib-hook": "^1.1.0", + "istanbul-lib-instrument": "^1.9.1", + "istanbul-lib-report": "^1.1.2", + "istanbul-lib-source-maps": "^1.2.2", + "istanbul-reports": "^1.1.3", + "md5-hex": "^1.2.0", + "merge-source-map": "^1.0.2", + "micromatch": "^2.3.11", + "mkdirp": "^0.5.0", + "resolve-from": "^2.0.0", + "rimraf": "^2.5.4", + "signal-exit": "^3.0.1", + "spawn-wrap": "=1.3.8", + "test-exclude": "^4.1.1", + "yargs": "^10.0.3", + "yargs-parser": "^8.0.0" }, "dependencies": { "align-text": { @@ -4171,10 +4221,11 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, + "optional": true, "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" } }, "amdefine": { @@ -4201,7 +4252,7 @@ "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", "dev": true, "requires": { - "default-require-extensions": "1.0.0" + "default-require-extensions": "^1.0.0" } }, "archy": { @@ -4216,7 +4267,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "arr-flatten": "^1.0.1" } }, "arr-flatten": { @@ -4249,9 +4300,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" } }, "babel-generator": { @@ -4260,14 +4311,14 @@ "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.7", - "trim-right": "1.0.1" + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "detect-indent": "^4.0.0", + "jsesc": "^1.3.0", + "lodash": "^4.17.4", + "source-map": "^0.5.6", + "trim-right": "^1.0.1" } }, "babel-messages": { @@ -4276,7 +4327,7 @@ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "babel-runtime": "^6.22.0" } }, "babel-runtime": { @@ -4285,8 +4336,8 @@ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" } }, "babel-template": { @@ -4295,11 +4346,11 @@ "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.4" + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" } }, "babel-traverse": { @@ -4308,15 +4359,15 @@ "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" + "babel-code-frame": "^6.26.0", + "babel-messages": "^6.23.0", + "babel-runtime": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "debug": "^2.6.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" } }, "babel-types": { @@ -4325,10 +4376,10 @@ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" } }, "babylon": { @@ -4349,7 +4400,7 @@ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, @@ -4359,9 +4410,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" } }, "builtin-modules": { @@ -4376,9 +4427,9 @@ "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", "dev": true, "requires": { - "md5-hex": "1.3.0", - "mkdirp": "0.5.1", - "write-file-atomic": "1.3.4" + "md5-hex": "^1.2.0", + "mkdirp": "^0.5.1", + "write-file-atomic": "^1.1.4" } }, "camelcase": { @@ -4395,8 +4446,8 @@ "dev": true, "optional": true, "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" } }, "chalk": { @@ -4405,11 +4456,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "cliui": { @@ -4419,8 +4470,8 @@ "dev": true, "optional": true, "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", + "center-align": "^0.1.1", + "right-align": "^0.1.1", "wordwrap": "0.0.2" }, "dependencies": { @@ -4469,8 +4520,8 @@ "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", "dev": true, "requires": { - "lru-cache": "4.1.1", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "which": "^1.2.9" } }, "debug": { @@ -4500,7 +4551,7 @@ "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", "dev": true, "requires": { - "strip-bom": "2.0.0" + "strip-bom": "^2.0.0" } }, "detect-indent": { @@ -4509,7 +4560,7 @@ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", "dev": true, "requires": { - "repeating": "2.0.1" + "repeating": "^2.0.0" } }, "error-ex": { @@ -4518,7 +4569,7 @@ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", "dev": true, "requires": { - "is-arrayish": "0.2.1" + "is-arrayish": "^0.2.1" } }, "escape-string-regexp": { @@ -4539,13 +4590,13 @@ "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" }, "dependencies": { "cross-spawn": { @@ -4554,9 +4605,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" } } } @@ -4567,7 +4618,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "0.1.1" + "is-posix-bracket": "^0.1.0" } }, "expand-range": { @@ -4576,7 +4627,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "2.2.3" + "fill-range": "^2.1.0" } }, "extglob": { @@ -4585,7 +4636,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "filename-regex": { @@ -4600,11 +4651,11 @@ "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", "dev": true, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" } }, "find-cache-dir": { @@ -4613,9 +4664,9 @@ "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", "dev": true, "requires": { - "commondir": "1.0.1", - "mkdirp": "0.5.1", - "pkg-dir": "1.0.0" + "commondir": "^1.0.1", + "mkdirp": "^0.5.1", + "pkg-dir": "^1.0.0" } }, "find-up": { @@ -4624,7 +4675,7 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, "for-in": { @@ -4639,7 +4690,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "1.0.2" + "for-in": "^1.0.1" } }, "foreground-child": { @@ -4648,8 +4699,8 @@ "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", "dev": true, "requires": { - "cross-spawn": "4.0.2", - "signal-exit": "3.0.2" + "cross-spawn": "^4", + "signal-exit": "^3.0.0" } }, "fs.realpath": { @@ -4676,12 +4727,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "dev": true, "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-base": { @@ -4690,8 +4741,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" } }, "glob-parent": { @@ -4700,7 +4751,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^2.0.0" } }, "globals": { @@ -4721,10 +4772,10 @@ "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", "dev": true, "requires": { - "async": "1.5.2", - "optimist": "0.6.1", - "source-map": "0.4.4", - "uglify-js": "2.8.29" + "async": "^1.4.0", + "optimist": "^0.6.1", + "source-map": "^0.4.4", + "uglify-js": "^2.6" }, "dependencies": { "source-map": { @@ -4733,7 +4784,7 @@ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", "dev": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } } } @@ -4744,7 +4795,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { @@ -4771,8 +4822,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { @@ -4787,7 +4838,7 @@ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "invert-kv": { @@ -4814,7 +4865,7 @@ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "builtin-modules": "^1.0.0" } }, "is-dotfile": { @@ -4829,7 +4880,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "2.0.0" + "is-primitive": "^2.0.0" } }, "is-extendable": { @@ -4850,7 +4901,7 @@ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-fullwidth-code-point": { @@ -4859,7 +4910,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "is-glob": { @@ -4868,7 +4919,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^1.0.0" } }, "is-number": { @@ -4877,7 +4928,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" } }, "is-posix-bracket": { @@ -4937,7 +4988,7 @@ "integrity": "sha512-U3qEgwVDUerZ0bt8cfl3dSP3S6opBoOtk3ROO5f2EfBr/SRiD9FQqzwaZBqFORu8W7O0EXpai+k7kxHK13beRg==", "dev": true, "requires": { - "append-transform": "0.4.0" + "append-transform": "^0.4.0" } }, "istanbul-lib-instrument": { @@ -4946,13 +4997,13 @@ "integrity": "sha512-RQmXeQ7sphar7k7O1wTNzVczF9igKpaeGQAG9qR2L+BS4DCJNTI9nytRmIVYevwO0bbq+2CXvJmYDuz0gMrywA==", "dev": true, "requires": { - "babel-generator": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "istanbul-lib-coverage": "1.1.1", - "semver": "5.4.1" + "babel-generator": "^6.18.0", + "babel-template": "^6.16.0", + "babel-traverse": "^6.18.0", + "babel-types": "^6.18.0", + "babylon": "^6.18.0", + "istanbul-lib-coverage": "^1.1.1", + "semver": "^5.3.0" } }, "istanbul-lib-report": { @@ -4961,10 +5012,10 @@ "integrity": "sha512-UTv4VGx+HZivJQwAo1wnRwe1KTvFpfi/NYwN7DcsrdzMXwpRT/Yb6r4SBPoHWj4VuQPakR32g4PUUeyKkdDkBA==", "dev": true, "requires": { - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "path-parse": "1.0.5", - "supports-color": "3.2.3" + "istanbul-lib-coverage": "^1.1.1", + "mkdirp": "^0.5.1", + "path-parse": "^1.0.5", + "supports-color": "^3.1.2" }, "dependencies": { "supports-color": { @@ -4973,7 +5024,7 @@ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", "dev": true, "requires": { - "has-flag": "1.0.0" + "has-flag": "^1.0.0" } } } @@ -4984,11 +5035,11 @@ "integrity": "sha512-8BfdqSfEdtip7/wo1RnrvLpHVEd8zMZEDmOFEnpC6dg0vXflHt9nvoAyQUzig2uMSXfF2OBEYBV3CVjIL9JvaQ==", "dev": true, "requires": { - "debug": "3.1.0", - "istanbul-lib-coverage": "1.1.1", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "source-map": "0.5.7" + "debug": "^3.1.0", + "istanbul-lib-coverage": "^1.1.1", + "mkdirp": "^0.5.1", + "rimraf": "^2.6.1", + "source-map": "^0.5.3" }, "dependencies": { "debug": { @@ -5008,7 +5059,7 @@ "integrity": "sha512-ZEelkHh8hrZNI5xDaKwPMFwDsUf5wIEI2bXAFGp1e6deR2mnEKBPhLJEgr4ZBt8Gi6Mj38E/C8kcy9XLggVO2Q==", "dev": true, "requires": { - "handlebars": "4.0.11" + "handlebars": "^4.0.3" } }, "js-tokens": { @@ -5029,7 +5080,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "^1.1.5" } }, "lazy-cache": { @@ -5045,7 +5096,7 @@ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^1.0.0" } }, "load-json-file": { @@ -5054,11 +5105,11 @@ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" } }, "locate-path": { @@ -5067,8 +5118,8 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" }, "dependencies": { "path-exists": { @@ -5089,7 +5140,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true + "dev": true, + "optional": true }, "loose-envify": { "version": "1.3.1", @@ -5097,7 +5149,7 @@ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0" } }, "lru-cache": { @@ -5106,8 +5158,8 @@ "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "md5-hex": { @@ -5116,7 +5168,7 @@ "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", "dev": true, "requires": { - "md5-o-matic": "0.1.1" + "md5-o-matic": "^0.1.1" } }, "md5-o-matic": { @@ -5131,7 +5183,7 @@ "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "mimic-fn": "^1.0.0" } }, "merge-source-map": { @@ -5140,7 +5192,7 @@ "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "^0.5.6" } }, "micromatch": { @@ -5149,19 +5201,19 @@ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", "dev": true, "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" } }, "mimic-fn": { @@ -5176,7 +5228,7 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { @@ -5206,10 +5258,10 @@ "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", "dev": true, "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" + "hosted-git-info": "^2.1.4", + "is-builtin-module": "^1.0.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { @@ -5218,7 +5270,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "1.1.0" + "remove-trailing-separator": "^1.0.1" } }, "npm-run-path": { @@ -5227,7 +5279,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, "number-is-nan": { @@ -5248,8 +5300,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "once": { @@ -5258,7 +5310,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "optimist": { @@ -5267,8 +5319,8 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" } }, "os-homedir": { @@ -5283,9 +5335,9 @@ "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", "dev": true, "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" + "execa": "^0.7.0", + "lcid": "^1.0.0", + "mem": "^1.1.0" } }, "p-finally": { @@ -5306,7 +5358,7 @@ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.1.0" + "p-limit": "^1.1.0" } }, "parse-glob": { @@ -5315,10 +5367,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, "parse-json": { @@ -5327,7 +5379,7 @@ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.2.0" } }, "path-exists": { @@ -5336,7 +5388,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -5363,9 +5415,9 @@ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" } }, "pify": { @@ -5386,7 +5438,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -5395,7 +5447,7 @@ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" }, "dependencies": { "find-up": { @@ -5404,8 +5456,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } } } @@ -5428,8 +5480,8 @@ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -5438,7 +5490,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -5447,7 +5499,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "^1.1.5" } } } @@ -5458,7 +5510,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.5" + "is-buffer": "^1.1.5" } } } @@ -5469,9 +5521,9 @@ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" } }, "read-pkg-up": { @@ -5480,8 +5532,8 @@ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" }, "dependencies": { "find-up": { @@ -5490,8 +5542,8 @@ "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" } } } @@ -5508,7 +5560,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "remove-trailing-separator": { @@ -5535,7 +5587,7 @@ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", "dev": true, "requires": { - "is-finite": "1.0.2" + "is-finite": "^1.0.0" } }, "require-directory": { @@ -5563,7 +5615,7 @@ "dev": true, "optional": true, "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { @@ -5572,7 +5624,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "semver": { @@ -5593,7 +5645,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -5626,12 +5678,12 @@ "integrity": "sha512-Yfkd7Yiwz4RcBPrDWzvhnTzQINBHNqOEhUzOdWZ67Y9b4wzs3Gz6ymuptQmRBpzlpOzroM7jwzmBdRec7JJ0UA==", "dev": true, "requires": { - "foreground-child": "1.5.6", - "mkdirp": "0.5.1", - "os-homedir": "1.0.2", - "rimraf": "2.6.2", - "signal-exit": "3.0.2", - "which": "1.3.0" + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.3.3", + "signal-exit": "^3.0.2", + "which": "^1.2.4" } }, "spdx-correct": { @@ -5640,7 +5692,7 @@ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", "dev": true, "requires": { - "spdx-license-ids": "1.2.2" + "spdx-license-ids": "^1.0.2" } }, "spdx-expression-parse": { @@ -5661,8 +5713,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, "dependencies": { "ansi-regex": { @@ -5683,7 +5735,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -5694,7 +5746,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -5703,7 +5755,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "is-utf8": "^0.2.0" } }, "strip-eof": { @@ -5724,11 +5776,11 @@ "integrity": "sha512-35+Asrsk3XHJDBgf/VRFexPgh3UyETv8IAn/LRTiZjVy6rjPVqdEk8dJcJYBzl1w0XCJM48lvTy8SfEsCWS4nA==", "dev": true, "requires": { - "arrify": "1.0.1", - "micromatch": "2.3.11", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "require-main-filename": "1.0.1" + "arrify": "^1.0.1", + "micromatch": "^2.3.11", + "object-assign": "^4.1.0", + "read-pkg-up": "^1.0.1", + "require-main-filename": "^1.0.1" } }, "to-fast-properties": { @@ -5750,9 +5802,9 @@ "dev": true, "optional": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "yargs": { @@ -5762,9 +5814,9 @@ "dev": true, "optional": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } @@ -5783,8 +5835,8 @@ "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", "dev": true, "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "spdx-correct": "~1.0.0", + "spdx-expression-parse": "~1.0.0" } }, "which": { @@ -5793,7 +5845,7 @@ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -5821,8 +5873,8 @@ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" }, "dependencies": { "string-width": { @@ -5831,9 +5883,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -5850,9 +5902,9 @@ "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "slide": "1.1.6" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "slide": "^1.1.5" } }, "y18n": { @@ -5873,18 +5925,18 @@ "integrity": "sha512-DqBpQ8NAUX4GyPP/ijDGHsJya4tYqLQrjPr95HNsr1YwL3+daCfvBwg7+gIC6IdJhR2kATh3hb61vjzMWEtjdw==", "dev": true, "requires": { - "cliui": "3.2.0", - "decamelize": "1.2.0", - "find-up": "2.1.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "8.0.0" + "cliui": "^3.2.0", + "decamelize": "^1.1.1", + "find-up": "^2.1.0", + "get-caller-file": "^1.0.1", + "os-locale": "^2.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1", + "yargs-parser": "^8.0.0" }, "dependencies": { "cliui": { @@ -5893,9 +5945,9 @@ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" }, "dependencies": { "string-width": { @@ -5904,9 +5956,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } } } @@ -5919,7 +5971,7 @@ "integrity": "sha1-IdR2Mw5agieaS4gTRb8GYQLiGcY=", "dev": true, "requires": { - "camelcase": "4.1.0" + "camelcase": "^4.1.0" }, "dependencies": { "camelcase": { @@ -5955,9 +6007,9 @@ "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", "dev": true, "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.1", - "object-keys": "1.0.11" + "define-properties": "^1.1.2", + "function-bind": "^1.1.0", + "object-keys": "^1.0.10" } }, "object.omit": { @@ -5966,8 +6018,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" } }, "on-finished": { @@ -5988,7 +6040,7 @@ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { @@ -6003,8 +6055,8 @@ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", "dev": true, "requires": { - "minimist": "0.0.8", - "wordwrap": "0.0.3" + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" }, "dependencies": { "wordwrap": { @@ -6021,12 +6073,12 @@ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", "dev": true, "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" } }, "os-homedir": { @@ -6047,10 +6099,10 @@ "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", "dev": true, "requires": { - "got": "6.7.1", - "registry-auth-token": "3.3.1", - "registry-url": "3.1.0", - "semver": "5.4.1" + "got": "^6.7.1", + "registry-auth-token": "^3.0.1", + "registry-url": "^3.0.3", + "semver": "^5.1.0" } }, "parse-glob": { @@ -6059,10 +6111,10 @@ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" } }, "parseurl": { @@ -6076,7 +6128,7 @@ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", "dev": true, "requires": { - "pinkie-promise": "2.0.1" + "pinkie-promise": "^2.0.0" } }, "path-is-absolute": { @@ -6114,7 +6166,7 @@ "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { - "through": "2.3.8" + "through": "~2.3" } }, "performance-now": { @@ -6140,7 +6192,7 @@ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", "dev": true, "requires": { - "pinkie": "2.0.4" + "pinkie": "^2.0.0" } }, "pkg-dir": { @@ -6149,7 +6201,7 @@ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", "dev": true, "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" } }, "pkg-up": { @@ -6158,7 +6210,7 @@ "integrity": "sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY=", "dev": true, "requires": { - "find-up": "1.1.2" + "find-up": "^1.0.0" } }, "pkginfo": { @@ -6207,7 +6259,7 @@ "resolved": "https://registry.npmjs.org/prom-client/-/prom-client-11.5.3.tgz", "integrity": "sha512-iz22FmTbtkyL2vt0MdDFY+kWof+S9UB/NACxSn2aJcewtw+EERsen0urSkZ2WrHseNdydsvcxCTAnPcSMZZv4Q==", "requires": { - "tdigest": "0.1.1" + "tdigest": "^0.1.1" } }, "proxy-addr": { @@ -6215,7 +6267,7 @@ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.2.tgz", "integrity": "sha1-tMxfImENlTWCTBI675089zxAujc=", "requires": { - "forwarded": "0.1.0", + "forwarded": "~0.1.0", "ipaddr.js": "1.1.1" } }, @@ -6225,7 +6277,7 @@ "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", "dev": true, "requires": { - "event-stream": "3.3.4" + "event-stream": "~3.3.0" } }, "pseudomap": { @@ -6250,8 +6302,8 @@ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", "dev": true, "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" + "is-number": "^3.0.0", + "kind-of": "^4.0.0" }, "dependencies": { "is-number": { @@ -6260,7 +6312,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "3.2.2" + "kind-of": "^3.0.2" }, "dependencies": { "kind-of": { @@ -6269,7 +6321,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -6280,7 +6332,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "1.1.6" + "is-buffer": "^1.1.5" } } } @@ -6325,10 +6377,10 @@ "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", "dev": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.5", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" }, "dependencies": { "minimist": { @@ -6345,13 +6397,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" }, "dependencies": { "inherits": { @@ -6368,10 +6420,10 @@ "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" } }, "readline2": { @@ -6380,8 +6432,8 @@ "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", "mute-stream": "0.0.5" } }, @@ -6391,7 +6443,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.5.0" + "resolve": "^1.1.6" } }, "redis-commands": { @@ -6410,7 +6462,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "is-equal-shallow": "^0.1.3" } }, "registry-auth-token": { @@ -6419,8 +6471,8 @@ "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", "dev": true, "requires": { - "rc": "1.2.2", - "safe-buffer": "5.1.1" + "rc": "^1.1.6", + "safe-buffer": "^5.0.1" } }, "registry-url": { @@ -6429,7 +6481,7 @@ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", "dev": true, "requires": { - "rc": "1.2.2" + "rc": "^1.0.1" } }, "remove-trailing-separator": { @@ -6455,28 +6507,28 @@ "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.5.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.0", - "forever-agent": "0.6.1", - "form-data": "2.1.1", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.12", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" }, "dependencies": { "caseless": { @@ -6489,8 +6541,8 @@ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" + "ajv": "^4.9.1", + "har-schema": "^1.0.5" } }, "qs": { @@ -6503,7 +6555,7 @@ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.0.1" } } } @@ -6514,8 +6566,8 @@ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", "dev": true, "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" + "caller-path": "^0.1.0", + "resolve-from": "^1.0.0" } }, "requires-port": { @@ -6530,7 +6582,7 @@ "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.5" } }, "resolve-from": { @@ -6545,8 +6597,8 @@ "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "exit-hook": "^1.0.0", + "onetime": "^1.0.0" } }, "right-align": { @@ -6556,7 +6608,7 @@ "dev": true, "optional": true, "requires": { - "align-text": "0.1.4" + "align-text": "^0.1.1" } }, "rimraf": { @@ -6565,7 +6617,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "7.1.2" + "glob": "^7.0.5" } }, "run-async": { @@ -6574,7 +6626,7 @@ "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", "dev": true, "requires": { - "once": "1.4.0" + "once": "^1.3.0" } }, "rx-lite": { @@ -6606,7 +6658,7 @@ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", "dev": true, "requires": { - "semver": "5.4.1" + "semver": "^5.0.3" } }, "send": { @@ -6614,19 +6666,19 @@ "resolved": "https://registry.npmjs.org/send/-/send-0.14.1.tgz", "integrity": "sha1-qVSYQyU5L1FTKndgdg5FlZjIn3o=", "requires": { - "debug": "2.2.0", - "depd": "1.1.0", - "destroy": "1.0.4", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.7.0", + "debug": "~2.2.0", + "depd": "~1.1.0", + "destroy": "~1.0.4", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "etag": "~1.7.0", "fresh": "0.3.0", - "http-errors": "1.5.0", + "http-errors": "~1.5.0", "mime": "1.3.4", "ms": "0.7.1", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.0" + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.3.0" } }, "serve-static": { @@ -6634,9 +6686,9 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.11.1.tgz", "integrity": "sha1-1sznaTUF9zPHWd5Xvvwa92wPCAU=", "requires": { - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "parseurl": "1.3.1", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "parseurl": "~1.3.1", "send": "0.14.1" } }, @@ -6657,7 +6709,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { @@ -6672,10 +6724,10 @@ "integrity": "sha1-lSxE4LHtkBPvU5WBecxkPod3Rms=", "dev": true, "requires": { - "array-filter": "0.0.1", - "array-map": "0.0.0", - "array-reduce": "0.0.0", - "jsonify": "0.0.0" + "array-filter": "~0.0.0", + "array-map": "~0.0.0", + "array-reduce": "~0.0.0", + "jsonify": "~0.0.0" } }, "shelljs": { @@ -6684,9 +6736,9 @@ "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", "dev": true, "requires": { - "glob": "7.1.2", - "interpret": "1.0.4", - "rechoir": "0.6.2" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" } }, "signal-exit": { @@ -6701,13 +6753,13 @@ "integrity": "sha512-c7u0ZuvBRX1eXuB4jN3BRCAOGiUTlM8SE3TxbJHrNiHUKL7wonujMOB6Fi1gQc00U91IscFORQHDga/eccqpbw==", "dev": true, "requires": { - "diff": "3.2.0", + "diff": "^3.1.0", "formatio": "1.2.0", - "lodash.get": "4.4.2", - "lolex": "2.3.1", - "nise": "1.2.0", - "supports-color": "4.5.0", - "type-detect": "4.0.5" + "lodash.get": "^4.4.2", + "lolex": "^2.2.0", + "nise": "^1.2.0", + "supports-color": "^4.4.0", + "type-detect": "^4.0.5" }, "dependencies": { "has-flag": { @@ -6722,7 +6774,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } }, "type-detect": { @@ -6744,7 +6796,7 @@ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", "requires": { - "hoek": "2.16.3" + "hoek": "2.x.x" } }, "source-map": { @@ -6754,7 +6806,7 @@ "dev": true, "optional": true, "requires": { - "amdefine": "1.0.1" + "amdefine": ">=0.0.4" } }, "split": { @@ -6763,7 +6815,7 @@ "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "dev": true, "requires": { - "through": "2.3.8" + "through": "2" } }, "sprintf-js": { @@ -6777,15 +6829,15 @@ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.10.1.tgz", "integrity": "sha1-MOGl0ykkSXShr2FREznVla9mOLA=", "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.0", - "dashdash": "1.14.0", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.6", - "jodid25519": "1.0.2", - "jsbn": "0.1.0", - "tweetnacl": "0.14.3" + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" }, "dependencies": { "assert-plus": { @@ -6811,7 +6863,7 @@ "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { - "duplexer": "0.1.1" + "duplexer": "~0.1.1" } }, "string-width": { @@ -6820,9 +6872,9 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { @@ -6831,7 +6883,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "~5.1.0" } }, "stringstream": { @@ -6845,7 +6897,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -6872,7 +6924,7 @@ "integrity": "sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4=", "dev": true, "requires": { - "chalk": "1.1.3" + "chalk": "^1.0.0" } }, "superagent": { @@ -6881,16 +6933,16 @@ "integrity": "sha1-cDUpoHFOV+EjlZ3e+84ZOy5Q0RU=", "dev": true, "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.1", - "debug": "2.2.0", - "extend": "3.0.0", + "component-emitter": "^1.2.0", + "cookiejar": "^2.0.6", + "debug": "^2.2.0", + "extend": "^3.0.0", "form-data": "1.0.0-rc4", - "formidable": "1.1.1", - "methods": "1.1.2", - "mime": "1.3.4", - "qs": "6.2.0", - "readable-stream": "2.3.3" + "formidable": "^1.0.17", + "methods": "^1.1.1", + "mime": "^1.3.4", + "qs": "^6.1.0", + "readable-stream": "^2.0.5" }, "dependencies": { "async": { @@ -6905,9 +6957,9 @@ "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=", "dev": true, "requires": { - "async": "1.5.2", - "combined-stream": "1.0.5", - "mime-types": "2.1.12" + "async": "^1.5.2", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.10" } } } @@ -6918,8 +6970,8 @@ "integrity": "sha1-oFgIHXiPFRXUcA11Aogea3WeRM0=", "dev": true, "requires": { - "methods": "1.1.2", - "superagent": "2.3.0" + "methods": "1.x", + "superagent": "^2.0.0" } }, "supports-color": { @@ -6934,12 +6986,12 @@ "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", "dev": true, "requires": { - "ajv": "4.11.8", - "ajv-keywords": "1.5.1", - "chalk": "1.1.3", - "lodash": "4.16.4", + "ajv": "^4.7.0", + "ajv-keywords": "^1.0.0", + "chalk": "^1.1.1", + "lodash": "^4.0.0", "slice-ansi": "0.0.4", - "string-width": "2.1.1" + "string-width": "^2.0.0" }, "dependencies": { "ansi-regex": { @@ -6960,8 +7012,8 @@ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" } }, "strip-ansi": { @@ -6970,7 +7022,7 @@ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { - "ansi-regex": "3.0.0" + "ansi-regex": "^3.0.0" } } } @@ -6989,7 +7041,7 @@ "integrity": "sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk=", "dev": true, "requires": { - "execa": "0.7.0" + "execa": "^0.7.0" } }, "text-encoding": { @@ -7021,7 +7073,7 @@ "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", "dev": true, "requires": { - "nopt": "1.0.10" + "nopt": "~1.0.10" }, "dependencies": { "nopt": { @@ -7030,7 +7082,7 @@ "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", "dev": true, "requires": { - "abbrev": "1.0.9" + "abbrev": "1" } } } @@ -7040,7 +7092,7 @@ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", "requires": { - "punycode": "1.4.1" + "punycode": "^1.4.1" } }, "tryit": { @@ -7067,7 +7119,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "type-detect": { @@ -7082,7 +7134,7 @@ "integrity": "sha1-boO6e8MM0zp7sLf7AHN6IIW/nQg=", "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.12" + "mime-types": "~2.1.11" } }, "typedarray": { @@ -7098,9 +7150,9 @@ "dev": true, "optional": true, "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" }, "dependencies": { "source-map": { @@ -7131,7 +7183,7 @@ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", "dev": true, "requires": { - "crypto-random-string": "1.0.0" + "crypto-random-string": "^1.0.0" } }, "unpipe": { @@ -7151,15 +7203,15 @@ "integrity": "sha1-TognpruRUUCrCTVZ1wFOPruDdFE=", "dev": true, "requires": { - "boxen": "1.2.2", - "chalk": "2.3.0", - "configstore": "3.1.1", - "import-lazy": "2.1.0", - "is-installed-globally": "0.1.0", - "is-npm": "1.0.0", - "latest-version": "3.1.0", - "semver-diff": "2.1.0", - "xdg-basedir": "3.0.0" + "boxen": "^1.2.1", + "chalk": "^2.0.1", + "configstore": "^3.0.0", + "import-lazy": "^2.1.0", + "is-installed-globally": "^0.1.0", + "is-npm": "^1.0.0", + "latest-version": "^3.0.0", + "semver-diff": "^2.0.0", + "xdg-basedir": "^3.0.0" }, "dependencies": { "ansi-styles": { @@ -7168,7 +7220,7 @@ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "color-convert": "1.9.1" + "color-convert": "^1.9.0" } }, "chalk": { @@ -7177,9 +7229,9 @@ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" } }, "has-flag": { @@ -7194,7 +7246,7 @@ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^2.0.0" } } } @@ -7205,7 +7257,7 @@ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", "dev": true, "requires": { - "prepend-http": "1.0.4" + "prepend-http": "^1.0.1" } }, "user-home": { @@ -7214,7 +7266,7 @@ "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", "dev": true, "requires": { - "os-homedir": "1.0.2" + "os-homedir": "^1.0.0" } }, "util-deprecate": { @@ -7252,7 +7304,7 @@ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "widest-line": { @@ -7261,7 +7313,7 @@ "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", "dev": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.1" } }, "window-size": { @@ -7276,13 +7328,13 @@ "resolved": "https://registry.npmjs.org/winston/-/winston-2.2.0.tgz", "integrity": "sha1-LIU92Hq1UqjoSF1yy7+aIobwKbc=", "requires": { - "async": "1.0.0", - "colors": "1.0.3", - "cycle": "1.0.3", - "eyes": "0.1.8", - "isstream": "0.1.2", - "pkginfo": "0.3.1", - "stack-trace": "0.0.9" + "async": "~1.0.0", + "colors": "1.0.x", + "cycle": "1.0.x", + "eyes": "0.1.x", + "isstream": "0.1.x", + "pkginfo": "0.3.x", + "stack-trace": "0.0.x" }, "dependencies": { "async": { @@ -7309,7 +7361,7 @@ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", "dev": true, "requires": { - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" } }, "write-file-atomic": { @@ -7318,9 +7370,9 @@ "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "imurmurhash": "0.1.4", - "signal-exit": "3.0.2" + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" } }, "xdg-basedir": { @@ -7348,9 +7400,9 @@ "dev": true, "optional": true, "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", "window-size": "0.1.0" } } diff --git a/package.json b/package.json index cf0f486..5baf00e 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "jsonschema": "^1.1.0", "lodash": "^4.16.2", "morgan": "^1.7.0", + "node-fetch": "^2.6.0", "prom-client": "^11.5.3", "raven": "^2.2.1", "request": "^2.81.0", From a0f85b809f0a3510f04a44edbd7db64efc160882 Mon Sep 17 00:00:00 2001 From: "sergio.junior" Date: Fri, 15 May 2020 10:37:03 -0300 Subject: [PATCH 077/126] package.json: bumped version to 0.2.16 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 5baf00e..e63eede 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.15", + "version": "0.2.16", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From 4bb61b9807be2cb3ba81527a8f0d13cb68a777f7 Mon Sep 17 00:00:00 2001 From: "sergio.junior" Date: Fri, 15 May 2020 11:04:10 -0300 Subject: [PATCH 078/126] test/unit/http/routers/FunctionsRouter.test: fix test to run equal in all versions of node --- test/unit/http/routers/FunctionsRouter.test.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/test/unit/http/routers/FunctionsRouter.test.js b/test/unit/http/routers/FunctionsRouter.test.js index 735045f..3affa87 100644 --- a/test/unit/http/routers/FunctionsRouter.test.js +++ b/test/unit/http/routers/FunctionsRouter.test.js @@ -110,10 +110,11 @@ describe('PUT /functions/:namespace/:id', () => { .put('/functions/backstage/invalid') .send({ code: '{)' }) .expect('Content-Type', /application\/json/) - .expect(400, { - error: 'SyntaxError: Unexpected token )', - stack: '', - }, done); + .expect((res) => { + expect(res.body.error).to.deep.include('Unexpected token'); + expect(res.body.stack).to.be.equal(''); + }) + .expect(400, done); }); }); From d97e7f2671736539385c766ad6c5b08c4cbf8b68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Wed, 15 Jul 2020 16:27:29 -0300 Subject: [PATCH 079/126] Add example how to instrument a node-js application --- lib/app.js | 4 +- lib/http/routes.js | 4 ++ lib/support/config.js | 2 + lib/support/tracing.js | 19 +++++++ npm-shrinkwrap.json | 112 ++++++++++++++++++++++++++++++++++++++++- package.json | 3 ++ 6 files changed, 141 insertions(+), 3 deletions(-) create mode 100644 lib/support/tracing.js diff --git a/lib/app.js b/lib/app.js index 93fca04..d121b3e 100644 --- a/lib/app.js +++ b/lib/app.js @@ -11,7 +11,7 @@ if (cluster.isMaster && config.useNodeCluster) { const metricsApp = express(); metricsApp.use('/metrics', MetricsRouter); metricsApp.listen(config.metricsPort, () => { - log.info(`Functions metrics is beating on port ${config.metricsPort}`); + log.info(`Functions metrics is listening on port ${config.metricsPort}`); }); // Fork workers. @@ -35,6 +35,6 @@ if (cluster.isMaster && config.useNodeCluster) { globalImport(); // Makes sure to load some support libraries to run the functions setupHTTPClient(); routes.listen(config.port, () => { - log.info(`Functions beating on port ${config.port}`); + log.info(`Functions is listening on port ${config.port}`); }); } diff --git a/lib/http/routes.js b/lib/http/routes.js index f96338f..bf598cd 100644 --- a/lib/http/routes.js +++ b/lib/http/routes.js @@ -1,5 +1,6 @@ const express = require('express'); const morgan = require('morgan'); +const expressOpentracing = require('express-opentracing'); const Sandbox = require('@globocom/backstage-functions-sandbox'); @@ -13,6 +14,7 @@ const FunctionsRouter = require('./routers/FunctionsRouter'); const parseExposeEnv = require('../support/parseExposeEnv'); const config = require('../support/config'); +const tracer = require('../support/tracing'); const FunctionsRequest = require('./FunctionsRequest'); @@ -31,6 +33,8 @@ morgan.token('response-sectime', (req, res) => { const app = express(); app.use(morgan(config.log.morganFormat)); +app.use(expressOpentracing.default({ tracer })); + app.disable('x-powered-by'); app.enable('trust proxy'); diff --git a/lib/support/config.js b/lib/support/config.js index bb21580..1fc20f9 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -41,4 +41,6 @@ module.exports = { certFile: process.env.SSL_CERT_FILE, }, storageName: process.env.STORAGE || 'redis', + opentracingEngine: process.env.OPENTRACING_ENGINE || 'no-op', + opentracingService: ConfigDiscovery.getPossibleString(['OPENTRACING_SERVICE', 'TSURU_APPNAME'], 'functions'), }; diff --git a/lib/support/tracing.js b/lib/support/tracing.js new file mode 100644 index 0000000..57a67a1 --- /dev/null +++ b/lib/support/tracing.js @@ -0,0 +1,19 @@ +const jaegerClient = require('jaeger-client'); +const opentracing = require('opentracing'); +const config = require('./config'); + +function setupTracer() { + if (config.opentracingEngine !== 'jaeger') { + // this is a no-op tracer + return new opentracing.Tracer(); + } + + const jaegerConfig = { + serviceName: config.opentracingService, + }; + const options = {}; + return jaegerClient.initTracerFromEnv(jaegerConfig, options); +} + +const tracer = setupTracer(); +module.exports = tracer; diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 660c6fa..d9b4d9d 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.15", + "version": "0.2.16", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -126,6 +126,11 @@ } } }, + "ansi-color": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-color/-/ansi-color-0.2.1.tgz", + "integrity": "sha1-PnXAN0dSF1RO12Oo21cJ+prlv5o=" + }, "ansi-escapes": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", @@ -471,6 +476,17 @@ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", "dev": true }, + "bufrw": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/bufrw/-/bufrw-1.3.0.tgz", + "integrity": "sha512-jzQnSbdJqhIltU9O5KUiTtljP9ccw2u5ix59McQy4pV2xGhVLhRZIndY8GIrgh5HjXa6+QJ9AQhOd2QWQizJFQ==", + "requires": { + "ansi-color": "0.2.1", + "error": "7.0.2", + "hexer": "1.5.0", + "xtend": "4.0.1" + } + }, "builtin-modules": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", @@ -1048,6 +1064,15 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" }, + "error": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", + "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", + "requires": { + "string-template": "0.2.1", + "xtend": "4.0.1" + } + }, "es-abstract": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", @@ -1494,6 +1519,14 @@ "vary": "~1.1.0" } }, + "express-opentracing": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/express-opentracing/-/express-opentracing-0.1.1.tgz", + "integrity": "sha512-urVTRTn/Y9/oSjy/P+IOWOl2Db0MnLqS7qYicHWk7vbL6ld+TNRp0DRx5G7cK2mLQ+/Ovpt8c4WLyG97VmtEdA==", + "requires": { + "opentracing": "0.14.4" + } + }, "extend": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", @@ -2999,6 +3032,24 @@ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", "dev": true }, + "hexer": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/hexer/-/hexer-1.5.0.tgz", + "integrity": "sha1-uGzoCFmOip0YksVx887dhvyfBlM=", + "requires": { + "ansi-color": "0.2.1", + "minimist": "1.2.5", + "process": "0.10.1", + "xtend": "4.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + } + } + }, "hoek": { "version": "2.16.3", "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", @@ -3478,6 +3529,25 @@ } } }, + "jaeger-client": { + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/jaeger-client/-/jaeger-client-3.18.0.tgz", + "integrity": "sha512-xZ9WvZDWLkZFq7SObpLwu1asMCKCgBRNcDxxGSvK+ZQ7OZyJC5xPlU+rJa4+s/P6autPBVwHpqMGbOERFxWuuA==", + "requires": { + "node-int64": "0.4.0", + "opentracing": "0.14.4", + "thriftrw": "3.12.0", + "uuid": "3.4.0", + "xorshift": "0.2.1" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + } + } + }, "jodid25519": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", @@ -3836,6 +3906,11 @@ "integrity": "sha512-mQuW55GhduF3ppo+ZRUTz1PRjEh1hS5BbqU7d8D0ez2OKxHDod7StPPeAVKisZR5aLkHZjdGWSL42LSONUJsZw==", "dev": true }, + "long": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/long/-/long-2.4.0.tgz", + "integrity": "sha1-n6GAux2VAM3CnEFWdmoZleH0Uk8=" + }, "longest": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", @@ -4113,6 +4188,11 @@ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=" + }, "nodemon": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.12.1.tgz", @@ -6049,6 +6129,11 @@ "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", "dev": true }, + "opentracing": { + "version": "0.14.4", + "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.4.tgz", + "integrity": "sha512-nNnZDkUNExBwEpb7LZaeMeQgvrlO8l4bgY/LvGNZCR0xG/dGWqHqjKrAmR5GUoYo0FIz38kxasvA1aevxWs2CA==" + }, "optimist": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", @@ -6242,6 +6327,11 @@ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", "dev": true }, + "process": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/process/-/process-0.10.1.tgz", + "integrity": "sha1-hCRXzFHP7XLcd1r+6vuMYDQ3JyU=" + }, "process-nextick-args": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", @@ -6866,6 +6956,11 @@ "duplexer": "~0.1.1" } }, + "string-template": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", + "integrity": "sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=" + }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -7056,6 +7151,16 @@ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, + "thriftrw": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/thriftrw/-/thriftrw-3.12.0.tgz", + "integrity": "sha512-4YZvR4DPEI41n4Opwr4jmrLGG4hndxr7387kzRFIIzxHQjarPusH4lGXrugvgb7TtPrfZVTpZCVe44/xUxowEw==", + "requires": { + "bufrw": "1.3.0", + "error": "7.0.2", + "long": "2.4.0" + } + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -7381,6 +7486,11 @@ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", "dev": true }, + "xorshift": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xorshift/-/xorshift-0.2.1.tgz", + "integrity": "sha1-/NgiZ+k1HBPw+5xzMH8lMx0pxjo=" + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", diff --git a/package.json b/package.json index e63eede..6ba0e03 100644 --- a/package.json +++ b/package.json @@ -31,12 +31,15 @@ "body-parser": "^1.15.2", "deepcopy": "^0.6.3", "express": "^4.14.0", + "express-opentracing": "^0.1.1", "gelf": "^2.0.1", "ioredis": "^3.1.4", + "jaeger-client": "^3.18.0", "jsonschema": "^1.1.0", "lodash": "^4.16.2", "morgan": "^1.7.0", "node-fetch": "^2.6.0", + "opentracing": "^0.14.4", "prom-client": "^11.5.3", "raven": "^2.2.1", "request": "^2.81.0", From e7f69215c22d18eed0e9139612d16d6475dabb97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Sat, 18 Jul 2020 16:23:38 -0300 Subject: [PATCH 080/126] Add tracing about function runs --- Makefile | 15 +++++++++++++++ lib/domain/Pipeline.js | 16 +++++++++++++++- lib/http/routers/FunctionsRouter.js | 29 +++++++++++++++++++++++++++-- lib/http/routes.js | 2 +- lib/support/tracing.js | 14 +++++++++++++- 5 files changed, 71 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index cd61ef8..061fa85 100644 --- a/Makefile +++ b/Makefile @@ -26,6 +26,21 @@ test: npm test $(MAKE) lint +run-local-jaeger: + - docker rm -f /jaeger + docker run -d --name jaeger \ + -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \ + -p 5775:5775/udp \ + -p 6831:6831/udp \ + -p 6832:6832/udp \ + -p 5778:5778 \ + -p 16686:16686 \ + -p 14268:14268 \ + -p 14250:14250 \ + -p 9411:9411 \ + jaegertracing/all-in-one:1.18 + xdg-open http://localhost:16686/search + rund: docker-compose up -d diff --git a/lib/domain/Pipeline.js b/lib/domain/Pipeline.js index 7515b62..73c61b2 100644 --- a/lib/domain/Pipeline.js +++ b/lib/domain/Pipeline.js @@ -3,18 +3,20 @@ const Metric = require('./Metric'); const { DefaultLogStorage } = require('./LogStorage'); const ErrorTracker = require('./ErrorTracker'); +const { tracer, reportError } = require('../support/tracing'); function codeFileName(namespace, codeId) { return `${namespace}/${codeId}.js`; } class Pipeline { - constructor(sandbox, req, steps) { + constructor(sandbox, req, steps, span) { this.sandbox = sandbox; this.req = req; this.steps = steps; this.previousResult = null; + this.span = span; this.breadcrumbs = []; } run() { @@ -27,10 +29,18 @@ class Pipeline { const metric = new Metric('function-run'); const filename = codeFileName(step.namespace, step.id); const logStorage = new DefaultLogStorage(step.namespace, step.id, this.req); + const span = tracer.startSpan('run function', { + childOf: this.span, + tags: { + 'function.namespace': step.namespace, + 'function.id': step.id, + }, + }); const options = { console: logStorage.console, env: step.env, + span, }; try { @@ -50,6 +60,7 @@ class Pipeline { this.previousResult = result; this.pushBreadcrumb(filename, result); if (result.status === 304) { + span.log({ message: 'Not modified' }); if (previousResult) { result.status = previousResult.status; result.body = deepcopy(previousResult.body); @@ -60,15 +71,18 @@ class Pipeline { result.body.namespace = step.namespace; result.body.functionId = step.id; + span.finish(); return result; } + span.finish(); if (this.steps.length === 0) { return result; } return this.runStep(); } catch (err) { + reportError(span, err); const status = err.statusCode || 500; const spent = metric.observeFunctionRun({ diff --git a/lib/http/routers/FunctionsRouter.js b/lib/http/routers/FunctionsRouter.js index 3e0e2fe..6e3925d 100644 --- a/lib/http/routers/FunctionsRouter.js +++ b/lib/http/routers/FunctionsRouter.js @@ -15,6 +15,7 @@ const SchemaResponse = require('../SchemaResponse'); const router = new Router(); const { bodyParserLimit } = require('../../support/config'); +const { tracer, reportError } = require('../../support/tracing'); function codeFileName(namespace, codeId) { return `${namespace}/${codeId}.js`; @@ -193,6 +194,13 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a const metric = new Metric('function-run'); const logStorage = new DefaultLogStorage(namespace, id, req); + const span = tracer.startSpan('run function', { + childOf: req.span, + tags: { + 'function.namespace': namespace, + 'function.id': id, + }, + }); let code; try { @@ -206,9 +214,11 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a if (!code) { const error = new Error(`Code '${namespace}/${id}' is not found`); error.statusCode = 404; + reportError(span, error); throw error; } } catch (err) { + reportError(span, err); res.status(err.statusCode || 500).json({ error: err.message }); return; } @@ -217,12 +227,14 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a const options = { console: logStorage.console, env: code.env, + span, }; const result = await sandbox.runScript(code.script, req, options); res.set(result.headers); res.status(result.status); res.json(result.body); + span.finish(); const spent = metric.observeFunctionRun({ namespace, id, status: result.status }); @@ -231,6 +243,7 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a requestTime: spent, }); } catch (err) { + reportError(span, err); logStorage.console.error(`Failed to run function: ${err}`); logStorage.console.error(err.stack); const status = err.statusCode || 500; @@ -264,8 +277,17 @@ router.put('/pipeline', bodyParser.json({ limit: bodyParserLimit }), async (req, let { steps } = req.query; + const span = tracer.startSpan('run pipeline', { + childOf: req.span, + tags: { + 'function.steps': Array.isArray(steps) ? steps.join(', ') : '', + }, + }); + if (!steps) { - res.status(400).json({ error: 'Pass step by querystring is required' }); + const err = new Error('Pass step by querystring is required'); + reportError(span, err); + res.status(400).json({ error: err.message }); return; } steps = steps.map((step) => { @@ -289,17 +311,20 @@ router.put('/pipeline', bodyParser.json({ limit: bodyParserLimit }), async (req, const { namespace, id } = steps[i]; const e = new Error(`Code '${namespace}/${id}' is not found`); e.statusCode = 404; + reportError(span, e); throw e; } } - const result = await new Pipeline(sandbox, req, codes).run(); + const result = await new Pipeline(sandbox, req, codes, span).run(); res.set(result.headers); res.status(result.status); + span.finish(); metric.observePipelineRun(result.status); res.json(result.body); } catch (err) { + reportError(span, err); const status = err.statusCode || 500; metric.observePipelineRun(status); res.status(status).json({ error: err.message }); diff --git a/lib/http/routes.js b/lib/http/routes.js index bf598cd..c78deb9 100644 --- a/lib/http/routes.js +++ b/lib/http/routes.js @@ -14,7 +14,7 @@ const FunctionsRouter = require('./routers/FunctionsRouter'); const parseExposeEnv = require('../support/parseExposeEnv'); const config = require('../support/config'); -const tracer = require('../support/tracing'); +const { tracer } = require('../support/tracing'); const FunctionsRequest = require('./FunctionsRequest'); diff --git a/lib/support/tracing.js b/lib/support/tracing.js index 57a67a1..1f629b9 100644 --- a/lib/support/tracing.js +++ b/lib/support/tracing.js @@ -16,4 +16,16 @@ function setupTracer() { } const tracer = setupTracer(); -module.exports = tracer; + +function reportError(span, err) { + span.setTag(opentracing.Tags.ERROR, true); + span.log({ + event: 'error', + message: err.message, + stack: err.stack, + 'error.object': err, + }); + span.finish(); +} + +module.exports = { tracer, reportError }; From 7150f25ab31ffa1db6765d266af7299240011732 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Mon, 20 Jul 2020 09:21:21 -0300 Subject: [PATCH 081/126] Add tests for pipeline using opentracing spans --- lib/domain/Pipeline.js | 4 ++-- test/unit/domain/Pipeline.test.js | 37 ++++++++++++++++++++++--------- 2 files changed, 29 insertions(+), 12 deletions(-) diff --git a/lib/domain/Pipeline.js b/lib/domain/Pipeline.js index 73c61b2..b409889 100644 --- a/lib/domain/Pipeline.js +++ b/lib/domain/Pipeline.js @@ -3,7 +3,7 @@ const Metric = require('./Metric'); const { DefaultLogStorage } = require('./LogStorage'); const ErrorTracker = require('./ErrorTracker'); -const { tracer, reportError } = require('../support/tracing'); +const { reportError } = require('../support/tracing'); function codeFileName(namespace, codeId) { return `${namespace}/${codeId}.js`; @@ -29,7 +29,7 @@ class Pipeline { const metric = new Metric('function-run'); const filename = codeFileName(step.namespace, step.id); const logStorage = new DefaultLogStorage(step.namespace, step.id, this.req); - const span = tracer.startSpan('run function', { + const span = this.span.tracer().startSpan('run function', { childOf: this.span, tags: { 'function.namespace': step.namespace, diff --git a/test/unit/domain/Pipeline.test.js b/test/unit/domain/Pipeline.test.js index 755bd34..35efe8c 100644 --- a/test/unit/domain/Pipeline.test.js +++ b/test/unit/domain/Pipeline.test.js @@ -1,4 +1,5 @@ const expect = require('chai').expect; +const opentracing = require('opentracing'); const Pipeline = require('../../../lib/domain/Pipeline'); @@ -16,6 +17,8 @@ describe('Pipeline', () => { let step200b; let step404; let stepCrash; + let tracer; + let span; beforeEach(() => { req = { @@ -82,49 +85,56 @@ describe('Pipeline', () => { } `), }; + tracer = new opentracing.MockTracer(); + span = tracer.startSpan('test span'); }); it('should be able to run unique function', async () => { - const result = await new Pipeline(sandbox, req, [step200]).run(); + const result = await new Pipeline(sandbox, req, [step200], span).run(); expect(result.body.ok).to.be.eql(true); expect(result.status).to.be.eql(200); }); it('should be able to run unique function with 304', async () => { - const result = await new Pipeline(sandbox, req, [step304]).run(); + const result = await new Pipeline(sandbox, req, [step304], span).run(); expect(result.status).to.be.eql(304); expect(result.body).to.be.eql(null); }); it('should be able to run two functions', async () => { - const result = await new Pipeline(sandbox, req, [step200, step200b]).run(); + const result = await new Pipeline(sandbox, req, [step200, step200b], span).run(); expect(result.body.ok).to.be.eql(true); expect(result.body.ok2).to.be.eql(true); expect(result.status).to.be.eql(200); }); it('should be able to run three functions', async () => { - const result = await new Pipeline(sandbox, req, [step200, step200b, step200env]).run(); + const result = await new Pipeline(sandbox, req, [step200, step200b, step200env], span).run(); expect(result.body.ok).to.be.eql(true); expect(result.body.ok2).to.be.eql(true); expect(result.body.env.STEP_VAR).to.be.eql('foo'); expect(result.status).to.be.eql(200); + + const mockSpanReport = tracer.report(); + const spans = mockSpanReport.spans.filter(s => s.operationName() === 'run function'); + expect(spans.length).to.be.eql(3); + expect(spans[0].durationMs()).to.be.gte(0); }); it('should be able to run two functions, one with 304', async () => { - const result = await new Pipeline(sandbox, req, [step200, step304]).run(); + const result = await new Pipeline(sandbox, req, [step200, step304], span).run(); expect(result.body.ok).to.be.eql(true); expect(result.status).to.be.eql(200); }); it('should be able to run three functions, two with 304', async () => { - const result = await new Pipeline(sandbox, req, [step200, step304, step304]).run(); + const result = await new Pipeline(sandbox, req, [step200, step304, step304], span).run(); expect(result.body.ok).to.be.eql(true); expect(result.status).to.be.eql(200); }); it('should be able to run three functions, one with 304', async () => { - const result = await new Pipeline(sandbox, req, [step200, step304, step200b]).run(); + const result = await new Pipeline(sandbox, req, [step200, step304, step200b], span).run(); expect(result.body.ok).to.be.eql(true); expect(result.body.ok2).to.be.eql(true); expect(result.status).to.be.eql(200); @@ -132,7 +142,7 @@ describe('Pipeline', () => { it('should be able to run one function with 404', async () => { try { - await new Pipeline(sandbox, req, [step404]).run(); + await new Pipeline(sandbox, req, [step404], span).run(); } catch (err) { expect(err.message).to.be.eql('Not found an item'); expect(err.statusCode).to.be.eql(404); @@ -144,7 +154,7 @@ describe('Pipeline', () => { it('should be able to run three functions with 404', async () => { try { - await new Pipeline(sandbox, req, [step200, step404, step200b]).run(); + await new Pipeline(sandbox, req, [step200, step404, step200b], span).run(); } catch (err) { expect(err.message).to.be.eql('Not found an item'); expect(err.statusCode).to.be.eql(404); @@ -156,11 +166,18 @@ describe('Pipeline', () => { it('should fail if the first function fail', async () => { try { - await new Pipeline(sandbox, req, [step200, stepCrash]).run(); + await new Pipeline(sandbox, req, [step200, stepCrash], span).run(); throw new Error('Not failed'); } catch (err) { expect(err.message).to.be.eql('res.undefinedMethod is not a function'); } + + const mockSpanReport = tracer.report(); + const spans = mockSpanReport.spans.filter(s => s.operationName() === 'run function'); + expect(spans.length).to.be.eql(2); + expect(spans[0].durationMs()).to.be.gte(0); + expect(spans[0].tags()).to.be.eql({}); + expect(spans[1].tags()).to.be.eql({ error: true }); }); }); }); From b06fae977b10fa37bb9630d1bae578c9f3c54ca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Mon, 20 Jul 2020 09:59:37 -0300 Subject: [PATCH 082/126] Add proxy logs to tracer support --- lib/domain/SpanConsoleWrapper.js | 30 +++++++++++++++++++++++++++++ lib/http/routers/FunctionsRouter.js | 11 ++++++----- 2 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 lib/domain/SpanConsoleWrapper.js diff --git a/lib/domain/SpanConsoleWrapper.js b/lib/domain/SpanConsoleWrapper.js new file mode 100644 index 0000000..92c5e3a --- /dev/null +++ b/lib/domain/SpanConsoleWrapper.js @@ -0,0 +1,30 @@ +const { Console } = require('console'); +const { Writable } = require('stream'); + +class SpanConsoleStream extends Writable { + constructor(level, console, span) { + super(); + this.level = level; + this.console = console; + this.span = span; + } + + _write(chunk, encoding, done) { + const message = chunk.toString().trim(); + this.console[this.level](message); + this.span.log({ level: this.level, message }); + done(); + } +} + + +class SpanConsoleWrapper extends Console { + constructor(console, span) { + super( + new SpanConsoleStream('info', console, span), + new SpanConsoleStream('error', console, span), + ); + } +} + +module.exports = SpanConsoleWrapper; diff --git a/lib/http/routers/FunctionsRouter.js b/lib/http/routers/FunctionsRouter.js index 6e3925d..a6d79f8 100644 --- a/lib/http/routers/FunctionsRouter.js +++ b/lib/http/routers/FunctionsRouter.js @@ -11,11 +11,12 @@ const ErrorTracker = require('../../domain/ErrorTracker'); const { StdoutLogStorage, DefaultLogStorage } = require('../../domain/LogStorage'); const FunctionsRequest = require('../FunctionsRequest'); const Metric = require('../../domain/Metric'); +const SpanConsoleWrapper = require('../../domain/SpanConsoleWrapper'); const SchemaResponse = require('../SchemaResponse'); const router = new Router(); const { bodyParserLimit } = require('../../support/config'); -const { tracer, reportError } = require('../../support/tracing'); +const { reportError } = require('../../support/tracing'); function codeFileName(namespace, codeId) { return `${namespace}/${codeId}.js`; @@ -194,7 +195,7 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a const metric = new Metric('function-run'); const logStorage = new DefaultLogStorage(namespace, id, req); - const span = tracer.startSpan('run function', { + const span = req.span.tracer().startSpan('run function', { childOf: req.span, tags: { 'function.namespace': namespace, @@ -225,7 +226,7 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a try { const options = { - console: logStorage.console, + console: new SpanConsoleWrapper(logStorage.console, span), env: code.env, span, }; @@ -243,9 +244,9 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a requestTime: spent, }); } catch (err) { - reportError(span, err); logStorage.console.error(`Failed to run function: ${err}`); logStorage.console.error(err.stack); + reportError(span, err); const status = err.statusCode || 500; res.status(status).json({ error: err.message }); @@ -277,7 +278,7 @@ router.put('/pipeline', bodyParser.json({ limit: bodyParserLimit }), async (req, let { steps } = req.query; - const span = tracer.startSpan('run pipeline', { + const span = req.span.tracer().startSpan('run pipeline', { childOf: req.span, tags: { 'function.steps': Array.isArray(steps) ? steps.join(', ') : '', From 325affca6a05678f2b381e740d5bd1b16f5e7857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Mon, 20 Jul 2020 10:08:41 -0300 Subject: [PATCH 083/126] Add proxy logs to tracer support in pipeline --- lib/domain/Pipeline.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/domain/Pipeline.js b/lib/domain/Pipeline.js index b409889..71114ff 100644 --- a/lib/domain/Pipeline.js +++ b/lib/domain/Pipeline.js @@ -3,6 +3,7 @@ const Metric = require('./Metric'); const { DefaultLogStorage } = require('./LogStorage'); const ErrorTracker = require('./ErrorTracker'); +const SpanConsoleWrapper = require('./SpanConsoleWrapper'); const { reportError } = require('../support/tracing'); function codeFileName(namespace, codeId) { @@ -38,7 +39,7 @@ class Pipeline { }); const options = { - console: logStorage.console, + console: new SpanConsoleWrapper(logStorage.console, span), env: step.env, span, }; @@ -82,9 +83,7 @@ class Pipeline { return this.runStep(); } catch (err) { - reportError(span, err); const status = err.statusCode || 500; - const spent = metric.observeFunctionRun({ namespace: step.namespace, id: step.id, @@ -93,6 +92,7 @@ class Pipeline { logStorage.console.error(`Failed to run function: ${err.message}, ${spent} seconds`); logStorage.console.error(err.stack); + reportError(span, err); const logResult = logStorage.flush({ status, From c1053d34958c36c86b5f682e7e4cb626f6383a21 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wilson=20J=C3=BAnior?= Date: Tue, 21 Jul 2020 09:32:20 -0300 Subject: [PATCH 084/126] tracing: Add support to B3 propagation --- lib/support/config.js | 1 + lib/support/tracing.js | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/support/config.js b/lib/support/config.js index 1fc20f9..1563f38 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -43,4 +43,5 @@ module.exports = { storageName: process.env.STORAGE || 'redis', opentracingEngine: process.env.OPENTRACING_ENGINE || 'no-op', opentracingService: ConfigDiscovery.getPossibleString(['OPENTRACING_SERVICE', 'TSURU_APPNAME'], 'functions'), + jaegerPropagation: process.env.JAEGER_PROPAGATION || 'jaeger', }; diff --git a/lib/support/tracing.js b/lib/support/tracing.js index 1f629b9..77bb2ff 100644 --- a/lib/support/tracing.js +++ b/lib/support/tracing.js @@ -12,7 +12,19 @@ function setupTracer() { serviceName: config.opentracingService, }; const options = {}; - return jaegerClient.initTracerFromEnv(jaegerConfig, options); + const tracer = jaegerClient.initTracerFromEnv(jaegerConfig, options); + + if (config.jaegerPropagation === 'b3') { + const httpCodec = new jaegerClient.ZipkinB3TextMapCodec({ urlEncoding: true }); + + tracer.registerInjector(opentracing.FORMAT_HTTP_HEADERS, httpCodec); + tracer.registerExtractor(opentracing.FORMAT_HTTP_HEADERS, httpCodec); + + const textCodec = new jaegerClient.ZipkinB3TextMapCodec({ urlEncoding: false }); + tracer.registerInjector(opentracing.FORMAT_TEXT_MAP, textCodec); + tracer.registerExtractor(opentracing.FORMAT_TEXT_MAP, textCodec); + } + return tracer; } const tracer = setupTracer(); From 43b6d74574113fe888f5efe5f153cb5b13b038ed Mon Sep 17 00:00:00 2001 From: "sergio.junior" Date: Fri, 25 Sep 2020 10:35:24 -0300 Subject: [PATCH 085/126] package.json: bumped version to 0.2.17 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6ba0e03..5279936 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.16", + "version": "0.2.17", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From fabf491d5a05fffea55d05b5827087e6d98f8d2b Mon Sep 17 00:00:00 2001 From: "sergio.junior" Date: Fri, 25 Sep 2020 11:12:24 -0300 Subject: [PATCH 086/126] package.json: change version of globocom/backstage-functions-sandbox to 0.5.3 --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5279936..aaa07af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.17", + "version": "0.2.18", "description": "Remote serverless code executor", "main": "index.js", "scripts": { @@ -26,7 +26,7 @@ "author": "Backstage Team ", "license": "MIT", "dependencies": { - "@globocom/backstage-functions-sandbox": "^0.5.0", + "@globocom/backstage-functions-sandbox": "^0.5.3", "async": "^2.0.1", "body-parser": "^1.15.2", "deepcopy": "^0.6.3", From f7cf926938ce1a67e3cb354b68cd9ba5a5b6cbf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Sat, 15 May 2021 17:08:16 -0300 Subject: [PATCH 087/126] wip: Otel integration --- .env.local | 7 +- .node-version | 1 - conf/redis-cluster/node1/sentinel.conf | 12 +- conf/redis-cluster/node2/sentinel.conf | 10 +- conf/redis-cluster/node3/sentinel.conf | 10 +- lib/http/routes.js | 7 - lib/support/config.js | 9 + lib/support/opentelemetry.js | 47 + npm-shrinkwrap.json | 2043 ++++----- package.json | 7 +- yarn-error.log | 5248 ++++++++++++++++++++++++ 11 files changed, 6132 insertions(+), 1269 deletions(-) delete mode 100644 .node-version create mode 100644 lib/support/opentelemetry.js create mode 100644 yarn-error.log diff --git a/.env.local b/.env.local index f5f7314..b10f6b4 100644 --- a/.env.local +++ b/.env.local @@ -1 +1,6 @@ -PORT=8100 \ No newline at end of file +PORT=8100 +OTEL_COLLECTOR_HOST=localhost +OTEL_COLLECTOR_PORT=4317 +#OTEL_COLLECTOR_HOST=http://otel-collector.dev.globoi.com +#OTEL_COLLECTOR_PORT=55680 +OTEL_EXPORTER_SERVICE=backstage-functions diff --git a/.node-version b/.node-version deleted file mode 100644 index 910f631..0000000 --- a/.node-version +++ /dev/null @@ -1 +0,0 @@ -8.9.1 \ No newline at end of file diff --git a/conf/redis-cluster/node1/sentinel.conf b/conf/redis-cluster/node1/sentinel.conf index 0f25463..f23fcd7 100644 --- a/conf/redis-cluster/node1/sentinel.conf +++ b/conf/redis-cluster/node1/sentinel.conf @@ -10,5 +10,13 @@ port 16380 sentinel monitor redis-cluster 127.0.0.1 6380 2 sentinel down-after-milliseconds redis-cluster 5000 sentinel failover-timeout redis-cluster 10000 -sentinel config-epoch redis-cluster 0 -dir . +sentinel config-epoch redis-cluster 2 +dir "/home/markiing/Globo/functions" +# Generated by CONFIG REWRITE +maxclients 4064 +sentinel leader-epoch redis-cluster 0 +sentinel known-slave redis-cluster 127.0.0.1 6382 +sentinel known-slave redis-cluster 127.0.0.1 6381 +sentinel known-sentinel redis-cluster 127.0.0.1 16381 e42de72f23291aac6a8684bbb24ab071c35e03a1 +sentinel known-sentinel redis-cluster 127.0.0.1 16382 227a4dccd28524dd5ca3aff6610a8d2fd9009e99 +sentinel current-epoch 2 diff --git a/conf/redis-cluster/node2/sentinel.conf b/conf/redis-cluster/node2/sentinel.conf index 0346be8..3267d6c 100644 --- a/conf/redis-cluster/node2/sentinel.conf +++ b/conf/redis-cluster/node2/sentinel.conf @@ -11,4 +11,12 @@ sentinel monitor redis-cluster 127.0.0.1 6380 2 sentinel down-after-milliseconds redis-cluster 5000 sentinel failover-timeout redis-cluster 10000 sentinel config-epoch redis-cluster 2 -dir . +dir "/home/markiing/Globo/functions" +# Generated by CONFIG REWRITE +maxclients 4064 +sentinel leader-epoch redis-cluster 0 +sentinel known-slave redis-cluster 127.0.0.1 6381 +sentinel known-slave redis-cluster 127.0.0.1 6382 +sentinel known-sentinel redis-cluster 127.0.0.1 16380 94e5255bc9dcb31d5ca0d553d41b4f7b1e3d2438 +sentinel known-sentinel redis-cluster 127.0.0.1 16382 227a4dccd28524dd5ca3aff6610a8d2fd9009e99 +sentinel current-epoch 2 diff --git a/conf/redis-cluster/node3/sentinel.conf b/conf/redis-cluster/node3/sentinel.conf index d7d61fa..0a24e02 100644 --- a/conf/redis-cluster/node3/sentinel.conf +++ b/conf/redis-cluster/node3/sentinel.conf @@ -12,4 +12,12 @@ sentinel down-after-milliseconds redis-cluster 5000 sentinel failover-timeout redis-cluster 10000 sentinel config-epoch redis-cluster 2 -dir . +dir "/home/markiing/Globo/functions" +# Generated by CONFIG REWRITE +maxclients 4064 +sentinel leader-epoch redis-cluster 0 +sentinel known-slave redis-cluster 127.0.0.1 6381 +sentinel known-slave redis-cluster 127.0.0.1 6382 +sentinel known-sentinel redis-cluster 127.0.0.1 16380 94e5255bc9dcb31d5ca0d553d41b4f7b1e3d2438 +sentinel known-sentinel redis-cluster 127.0.0.1 16381 e42de72f23291aac6a8684bbb24ab071c35e03a1 +sentinel current-epoch 2 diff --git a/lib/http/routes.js b/lib/http/routes.js index c78deb9..881c52d 100644 --- a/lib/http/routes.js +++ b/lib/http/routes.js @@ -1,6 +1,5 @@ const express = require('express'); const morgan = require('morgan'); -const expressOpentracing = require('express-opentracing'); const Sandbox = require('@globocom/backstage-functions-sandbox'); @@ -14,7 +13,6 @@ const FunctionsRouter = require('./routers/FunctionsRouter'); const parseExposeEnv = require('../support/parseExposeEnv'); const config = require('../support/config'); -const { tracer } = require('../support/tracing'); const FunctionsRequest = require('./FunctionsRequest'); @@ -31,13 +29,9 @@ morgan.token('response-sectime', (req, res) => { }); const app = express(); - app.use(morgan(config.log.morganFormat)); -app.use(expressOpentracing.default({ tracer })); - app.disable('x-powered-by'); app.enable('trust proxy'); - app.set('memoryStorage', new Storage()); app.set('sandbox', new Sandbox({ env: parseExposeEnv(), @@ -48,7 +42,6 @@ app.set('sandbox', new Sandbox({ app.get('/', (req, res) => { const backstageRequest = new FunctionsRequest(req); - new SchemaResponse(backstageRequest, res, 'root') .json({ name: 'Backstage functions', diff --git a/lib/support/config.js b/lib/support/config.js index 1563f38..dbcfd0a 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -40,6 +40,15 @@ module.exports = { useCertFile: ConfigDiscovery.getBool('FUNCTIONS_USE_SSL_CERT_FILE', false), certFile: process.env.SSL_CERT_FILE, }, + otel: { + engine: process.env.OTEL_EXPORTER_ENGINE, + collector: { + host: process.env.OTEL_COLLECTOR_HOST || 'no-op', //jaeger, zipkin, apm, etc... + port: process.env.OTEL_COLLECTOR_PORT || 55680 + }, + service: process.env.OTEL_EXPORTER_SERVICE + }, + useOpenTelemetry: process.env.USE_OPENTELEMETRY || false, storageName: process.env.STORAGE || 'redis', opentracingEngine: process.env.OPENTRACING_ENGINE || 'no-op', opentracingService: ConfigDiscovery.getPossibleString(['OPENTRACING_SERVICE', 'TSURU_APPNAME'], 'functions'), diff --git a/lib/support/opentelemetry.js b/lib/support/opentelemetry.js new file mode 100644 index 0000000..a742f5f --- /dev/null +++ b/lib/support/opentelemetry.js @@ -0,0 +1,47 @@ +const { BatchSpanProcessor, BasicTracerProvider } = require('@opentelemetry/tracing') +const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http'); +const { ExpressInstrumentation } = require('@opentelemetry/instrumentation-express') +const { registerInstrumentations } = require('@opentelemetry/instrumentation') +const { CollectorTraceExporter } = require('@opentelemetry/exporter-collector-grpc') + +const opentelemetry = require('@opentelemetry/api') +const OtelConfig = require('./config').otel; + +const collectorOptions = { + serviceName: OtelConfig.service, + url: `${OtelConfig.collector.host}:${OtelConfig.collector.port}`, + concurrencyLimit: 10 +} + +const provider = new BasicTracerProvider() +const exporter = new CollectorTraceExporter(collectorOptions) + +provider.addSpanProcessor(new BatchSpanProcessor(exporter, { + maxQueueSize: 1000, + scheduledDelayMillis: 30000 +})) + +registerInstrumentations({ + instrumentations: [ + new ExpressInstrumentation(), + new HttpInstrumentation({responseHook: (span, _) => { + const { attributes: attrs = {} } = span + span.updateName(`${attrs['http.method']} ${attrs['http.target']}`) + span.setAttribute('functions.route', attrs['http.route']) + span.setAttribute('functions.url',attrs['http.url']) + }}), + ] +}) + +provider.register(); +const context = opentelemetry.context +const tracer = opentelemetry.trace.getTracer(OtelConfig.service) + +function reportError(span, err) { + //span.setTag(opentracing.Tags.ERROR, true); + console.log('Recording Exception', err) + span.recordException(err) + span.end() +} + +module.exports = { tracer, context, opentelemetry, reportError } \ No newline at end of file diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index d9b4d9d..fcad275 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,18 +1,395 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.16", + "version": "0.2.18", "lockfileVersion": 1, "requires": true, "dependencies": { "@globocom/backstage-functions-sandbox": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@globocom/backstage-functions-sandbox/-/backstage-functions-sandbox-0.5.0.tgz", - "integrity": "sha512-rwr/rGv6sbdYfzi9X6dNlNFz2EqByxsShp8WwRGof1bwVS7YDnFjmwbq71JlOXFe5UAvjIGkTm1VtOkSBtJf9Q==", + "version": "0.5.3", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@globocom/backstage-functions-sandbox/-/backstage-functions-sandbox-0.5.3.tgz", + "integrity": "sha1-cn/CrIwUaxhIttW9/XcL0uvmQwo=", "requires": { "once": "^1.4.0", "stack-trace": "^0.0.9" } }, + "@grpc/grpc-js": { + "version": "1.3.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@grpc/grpc-js/-/grpc-js-1.3.0.tgz", + "integrity": "sha1-xv66rwDOf1O17FLHzz4qRyW4K8s=", + "requires": { + "@types/node": ">=12.12.47" + } + }, + "@grpc/proto-loader": { + "version": "0.6.1", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@grpc/proto-loader/-/proto-loader-0.6.1.tgz", + "integrity": "sha1-rWPox9KiOwF1x47rwm3t9rCvCws=", + "requires": { + "@types/long": "^4.0.1", + "lodash.camelcase": "^4.3.0", + "long": "^4.0.0", + "protobufjs": "^6.10.0", + "yargs": "^16.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U=" + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha1-oCZe5lVHb8gHrqnfPfjfd4OAi08=", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=" + }, + "long": { + "version": "4.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/long/-/long-4.0.0.tgz", + "integrity": "sha1-mntxz7fTYaGU6lVSQckvdGjVvyg=" + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha1-2v1PlVmnWFz7pSnGoKT3NIjr1MU=", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=", + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha1-HIK/D2tqZur85+8w43b0mhJHf2Y=", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "@opentelemetry/api": { + "version": "1.0.0-rc.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/api/-/api-1.0.0-rc.0.tgz", + "integrity": "sha1-DHw/XhKF+ZzttWPXStGtuYIrUUQ=" + }, + "@opentelemetry/api-metrics": { + "version": "0.19.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/api-metrics/-/api-metrics-0.19.0.tgz", + "integrity": "sha1-O1lEzob0VRy/8a/cHQZK3xii22g=" + }, + "@opentelemetry/context-async-hooks": { + "version": "0.19.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/context-async-hooks/-/context-async-hooks-0.19.0.tgz", + "integrity": "sha1-uVm2yIDIkU+TGlJwUdqGyzFx0Os=" + }, + "@opentelemetry/core": { + "version": "0.19.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/core/-/core-0.19.0.tgz", + "integrity": "sha1-UBjhbR0wgdoGV0duWNnC3OfFEaI=", + "requires": { + "semver": "^7.1.3" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/semver/-/semver-7.3.5.tgz", + "integrity": "sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc=", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=" + } + } + }, + "@opentelemetry/exporter-collector": { + "version": "0.19.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/exporter-collector/-/exporter-collector-0.19.0.tgz", + "integrity": "sha1-OI9whBh57WwNXv9jT7HWeY/pZ2g=", + "requires": { + "@opentelemetry/api-metrics": "0.19.0", + "@opentelemetry/core": "0.19.0", + "@opentelemetry/metrics": "0.19.0", + "@opentelemetry/resources": "0.19.0", + "@opentelemetry/tracing": "0.19.0" + } + }, + "@opentelemetry/exporter-collector-grpc": { + "version": "0.19.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/exporter-collector-grpc/-/exporter-collector-grpc-0.19.0.tgz", + "integrity": "sha1-LLoxW3u0OZlT6+HRx2xXTIbvmf8=", + "requires": { + "@grpc/grpc-js": "^1.2.12", + "@grpc/proto-loader": "^0.6.0", + "@opentelemetry/core": "0.19.0", + "@opentelemetry/exporter-collector": "0.19.0", + "@opentelemetry/metrics": "0.19.0", + "@opentelemetry/resources": "0.19.0", + "@opentelemetry/tracing": "0.19.0" + } + }, + "@opentelemetry/instrumentation": { + "version": "0.19.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/instrumentation/-/instrumentation-0.19.0.tgz", + "integrity": "sha1-IZAV+CE0wp5q6rXgAjXmGHocsfQ=", + "requires": { + "@opentelemetry/api-metrics": "0.19.0", + "require-in-the-middle": "^5.0.3", + "semver": "^7.3.2", + "shimmer": "^1.2.1" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/semver/-/semver-7.3.5.tgz", + "integrity": "sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc=", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=" + } + } + }, + "@opentelemetry/instrumentation-express": { + "version": "0.16.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/instrumentation-express/-/instrumentation-express-0.16.0.tgz", + "integrity": "sha1-Tv3DEvM2Mqn0JMGgrdzoEuMcKSM=", + "requires": { + "@opentelemetry/api": "^1.0.0-rc.0", + "@opentelemetry/core": "^0.19.0", + "@opentelemetry/instrumentation": "^0.19.0", + "@opentelemetry/semantic-conventions": "^0.19.0" + } + }, + "@opentelemetry/instrumentation-http": { + "version": "0.19.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/instrumentation-http/-/instrumentation-http-0.19.0.tgz", + "integrity": "sha1-tUNyCcdCGqWfLwY1Irfv6c8zbPY=", + "requires": { + "@opentelemetry/instrumentation": "0.19.0", + "@opentelemetry/semantic-conventions": "0.19.0", + "semver": "^7.1.3" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/semver/-/semver-7.3.5.tgz", + "integrity": "sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc=", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=" + } + } + }, + "@opentelemetry/metrics": { + "version": "0.19.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/metrics/-/metrics-0.19.0.tgz", + "integrity": "sha1-jsQJICo3Ogm1BSYdd0nzuynhRH0=", + "requires": { + "@opentelemetry/api-metrics": "0.19.0", + "@opentelemetry/core": "0.19.0", + "@opentelemetry/resources": "0.19.0", + "lodash.merge": "^4.6.2" + } + }, + "@opentelemetry/node": { + "version": "0.19.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/node/-/node-0.19.0.tgz", + "integrity": "sha1-UYGw6smtPUcFKIMqlRaRSidCbpU=", + "requires": { + "@opentelemetry/context-async-hooks": "0.19.0", + "@opentelemetry/core": "0.19.0", + "@opentelemetry/propagator-b3": "0.19.0", + "@opentelemetry/propagator-jaeger": "0.19.0", + "@opentelemetry/tracing": "0.19.0", + "semver": "^7.1.3" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/semver/-/semver-7.3.5.tgz", + "integrity": "sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc=", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=" + } + } + }, + "@opentelemetry/propagator-b3": { + "version": "0.19.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/propagator-b3/-/propagator-b3-0.19.0.tgz", + "integrity": "sha1-Dmh2sHBbTDVu1BSY/jKME+94r9s=" + }, + "@opentelemetry/propagator-jaeger": { + "version": "0.19.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/propagator-jaeger/-/propagator-jaeger-0.19.0.tgz", + "integrity": "sha1-Z+XOCYaUcMpsse0nmmZc4ghK61E=", + "requires": { + "@opentelemetry/core": "0.19.0" + } + }, + "@opentelemetry/resources": { + "version": "0.19.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/resources/-/resources-0.19.0.tgz", + "integrity": "sha1-OBNhD4lWoBo1P9lhrDk8AJlebT8=", + "requires": { + "@opentelemetry/core": "0.19.0" + } + }, + "@opentelemetry/semantic-conventions": { + "version": "0.19.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/semantic-conventions/-/semantic-conventions-0.19.0.tgz", + "integrity": "sha1-Pkm0W1JCbGJ0CiT89YGMtpC0Ru8=" + }, + "@opentelemetry/tracing": { + "version": "0.19.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/tracing/-/tracing-0.19.0.tgz", + "integrity": "sha1-jJTPK20lQtiGaphjGCWWX1285cQ=", + "requires": { + "@opentelemetry/core": "0.19.0", + "@opentelemetry/resources": "0.19.0", + "@opentelemetry/semantic-conventions": "0.19.0", + "lodash.merge": "^4.6.2" + } + }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha1-TIVzDlm5ofHzSQR9vyQpYDS7JzU=" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha1-fvN/DQEPsCitGtWXIuUG2SYoFcs=" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" + }, + "@types/long": { + "version": "4.0.1", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@types/long/-/long-4.0.1.tgz", + "integrity": "sha1-RZxl+hhn2v5qjzIsTFFpVmPMVek=" + }, + "@types/node": { + "version": "15.0.2", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@types/node/-/node-15.0.2.tgz", + "integrity": "sha1-UenAkg0bRZNuoENBqj4uWNM5+2c=" + }, "abbrev": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", @@ -71,7 +448,6 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, - "optional": true, "requires": { "kind-of": "^3.0.2", "longest": "^1.0.1", @@ -325,6 +701,16 @@ "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", "dev": true }, + "bindings": { + "version": "1.5.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha1-EDU8npRTNLwFEabZCzj7x8nFBN8=", + "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, "bintrees": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/bintrees/-/bintrees-1.0.1.tgz", @@ -481,10 +867,10 @@ "resolved": "https://registry.npmjs.org/bufrw/-/bufrw-1.3.0.tgz", "integrity": "sha512-jzQnSbdJqhIltU9O5KUiTtljP9ccw2u5ix59McQy4pV2xGhVLhRZIndY8GIrgh5HjXa6+QJ9AQhOd2QWQizJFQ==", "requires": { - "ansi-color": "0.2.1", - "error": "7.0.2", - "hexer": "1.5.0", - "xtend": "4.0.1" + "ansi-color": "^0.2.1", + "error": "^7.0.0", + "hexer": "^1.5.0", + "xtend": "^4.0.0" } }, "builtin-modules": { @@ -1059,6 +1445,11 @@ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha1-6Bj9ac5cz8tARZT4QpY79TFkzDc=" + }, "encodeurl": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", @@ -1069,8 +1460,8 @@ "resolved": "https://registry.npmjs.org/error/-/error-7.0.2.tgz", "integrity": "sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI=", "requires": { - "string-template": "0.2.1", - "xtend": "4.0.1" + "string-template": "~0.2.1", + "xtend": "~4.0.0" } }, "es-abstract": { @@ -1173,6 +1564,11 @@ "es6-symbol": "^3.1.1" } }, + "escalade": { + "version": "3.1.1", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha1-2M/ccACWXFoBdLSoLqpcBVJ0LkA=" + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -1524,7 +1920,7 @@ "resolved": "https://registry.npmjs.org/express-opentracing/-/express-opentracing-0.1.1.tgz", "integrity": "sha512-urVTRTn/Y9/oSjy/P+IOWOl2Db0MnLqS7qYicHWk7vbL6ld+TNRp0DRx5G7cK2mLQ+/Ovpt8c4WLyG97VmtEdA==", "requires": { - "opentracing": "0.14.4" + "opentracing": "^0.14.0" } }, "extend": { @@ -1559,1233 +1955,189 @@ }, "figures": { "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^1.1.3", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "finalhandler": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.0.tgz", - "integrity": "sha1-6VCKvs6bbbqHGmlCodeRG5GRGsc=", - "requires": { - "debug": "~2.2.0", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "statuses": "~1.3.0", - "unpipe": "~1.0.0" - } - }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "del": "^2.0.2", - "graceful-fs": "^4.1.2", - "write": "^0.2.1" - } - }, - "flexbuffer": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/flexbuffer/-/flexbuffer-0.0.6.tgz", - "integrity": "sha1-A5/fI/iCPkQMOPMnfm/vEXQhWzA=" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "foreman": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/foreman/-/foreman-2.0.0.tgz", - "integrity": "sha1-AKzSD5274vedBGl7zKKnfuAO4DE=", - "dev": true, - "requires": { - "commander": "~2.9.0", - "http-proxy": "~1.11.1", - "mustache": "^2.2.1", - "shell-quote": "~1.4.2" - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.1.tgz", - "integrity": "sha1-St8DQuGnmvoehMjDIKn/yCOSofM=", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.5", - "mime-types": "^2.1.12" - } - }, - "formatio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", - "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", - "dev": true, - "requires": { - "samsam": "1.x" - } - }, - "formidable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", - "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", - "dev": true - }, - "forwarded": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", - "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=" - }, - "fresh": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", - "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" - }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", - "dev": true, - "optional": true, - "requires": { - "nan": "^2.3.0", - "node-pre-gyp": "^0.6.39" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", - "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "dev": true, - "optional": true, - "requires": { - "co": "^4.6.0", - "json-stable-stringify": "^1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true, - "optional": true - }, - "aproba": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", - "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "dev": true, - "optional": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^2.0.6" - } - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true, - "optional": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "optional": true, - "requires": { - "inherits": "~2.0.0" - } - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.x.x" - } - }, - "brace-expansion": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", - "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", - "dev": true, - "optional": true, - "requires": { - "balanced-match": "^0.4.1", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", - "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", - "dev": true, - "optional": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true, - "optional": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "dev": true, - "optional": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true, - "optional": true - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", - "dev": true, - "optional": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true, - "optional": true - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.x.x" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", - "dev": true, - "optional": true - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", - "dev": true, - "optional": true - }, - "detect-libc": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.2.tgz", - "integrity": "sha1-ca1dIEvxempsqPRQxhRUBm70YeE=", - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", - "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", - "dev": true, - "optional": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true, - "optional": true - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "optional": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", - "dev": true, - "optional": true, - "requires": { - "fstream": "^1.0.0", - "inherits": "2", - "minimatch": "^3.0.0" - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "dev": true, - "optional": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "optional": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true, - "optional": true - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "dev": true, - "optional": true, - "requires": { - "boom": "2.x.x", - "cryptiles": "2.x.x", - "hoek": "2.x.x", - "sntp": "1.x.x" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", - "dev": true, - "optional": true - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "^0.2.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "optional": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true, - "optional": true - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "optional": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true, - "optional": true - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", - "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", - "dev": true, - "optional": true, - "requires": { - "jsbn": "~0.1.0" - } - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "optional": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", - "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", - "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", - "dev": true, - "optional": true - }, - "mime-types": { - "version": "2.1.15", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", - "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", - "dev": true, - "optional": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "optional": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true, - "optional": true - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "optional": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.39", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz", - "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==", - "dev": true, - "optional": true, - "requires": { - "detect-libc": "^1.0.2", - "hawk": "3.1.3", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "npmlog": "^4.0.2", - "rc": "^1.1.7", - "request": "2.81.0", - "rimraf": "^2.6.1", - "semver": "^5.3.0", - "tar": "^2.2.1", - "tar-pack": "^3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "optional": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", - "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true, - "optional": true - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "optional": true, - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true, - "optional": true - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true, - "optional": true - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", - "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", - "dev": true, - "optional": true, - "requires": { - "deep-extend": "~0.4.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", - "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", - "dev": true, - "optional": true, - "requires": { - "buffer-shims": "~1.0.0", - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "string_decoder": "~1.0.0", - "util-deprecate": "~1.0.1" - } - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "~0.6.0", - "aws4": "^1.2.1", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.0", - "forever-agent": "~0.6.1", - "form-data": "~2.1.1", - "har-validator": "~4.2.1", - "hawk": "~3.1.3", - "http-signature": "~1.1.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.7", - "oauth-sign": "~0.8.1", - "performance-now": "^0.2.0", - "qs": "~6.4.0", - "safe-buffer": "^5.0.1", - "stringstream": "~0.0.4", - "tough-cookie": "~2.3.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.0.0" - } - }, - "rimraf": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "dev": true, - "optional": true, - "requires": { - "glob": "^7.0.5" - } - }, - "safe-buffer": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", - "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", - "dev": true, - "optional": true - }, - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "dev": true, - "optional": true, - "requires": { - "hoek": "2.x.x" - } - }, - "sshpk": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", - "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", - "dev": true, - "optional": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jodid25519": "^1.0.0", - "jsbn": "~0.1.0", - "tweetnacl": "~0.14.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true, - "optional": true - } - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "optional": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "string_decoder": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", - "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "optional": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "optional": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "tar-pack": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", - "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", - "dev": true, - "optional": true, - "requires": { - "debug": "^2.2.0", - "fstream": "^1.0.10", - "fstream-ignore": "^1.0.5", - "once": "^1.3.3", - "readable-stream": "^2.1.4", - "rimraf": "^2.5.1", - "tar": "^2.2.1", - "uid-number": "^0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", - "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", - "dev": true, - "optional": true, - "requires": { - "punycode": "^1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true, - "optional": true - }, - "uuid": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", - "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", - "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "dev": true, - "optional": true, - "requires": { - "string-width": "^1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true, - "optional": true - } + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "^1.2.1", + "object-assign": "^4.0.1" + } + }, + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90=", + "dev": true, + "optional": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "finalhandler": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.5.0.tgz", + "integrity": "sha1-6VCKvs6bbbqHGmlCodeRG5GRGsc=", + "requires": { + "debug": "~2.2.0", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "statuses": "~1.3.0", + "unpipe": "~1.0.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "^0.3.1", + "del": "^2.0.2", + "graceful-fs": "^4.1.2", + "write": "^0.2.1" + } + }, + "flexbuffer": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/flexbuffer/-/flexbuffer-0.0.6.tgz", + "integrity": "sha1-A5/fI/iCPkQMOPMnfm/vEXQhWzA=" + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "^1.0.1" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "foreman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreman/-/foreman-2.0.0.tgz", + "integrity": "sha1-AKzSD5274vedBGl7zKKnfuAO4DE=", + "dev": true, + "requires": { + "commander": "~2.9.0", + "http-proxy": "~1.11.1", + "mustache": "^2.2.1", + "shell-quote": "~1.4.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.1.tgz", + "integrity": "sha1-St8DQuGnmvoehMjDIKn/yCOSofM=", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "formatio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", + "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", + "dev": true, + "requires": { + "samsam": "1.x" + } + }, + "formidable": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", + "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", + "dev": true + }, + "forwarded": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.0.tgz", + "integrity": "sha1-Ge+YdMSuHCl7zweP3mOgm2aoQ2M=" + }, + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg=", + "dev": true, + "optional": true, + "requires": { + "bindings": "^1.5.0", + "nan": "^2.12.1" } }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "gelf": { "version": "2.0.1", @@ -2825,6 +2177,11 @@ "is-property": "^1.0.0" } }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha1-T5RBKoLbMvNuOwuXQfipf+sDH34=" + }, "get-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", @@ -3037,10 +2394,10 @@ "resolved": "https://registry.npmjs.org/hexer/-/hexer-1.5.0.tgz", "integrity": "sha1-uGzoCFmOip0YksVx887dhvyfBlM=", "requires": { - "ansi-color": "0.2.1", - "minimist": "1.2.5", - "process": "0.10.1", - "xtend": "4.0.1" + "ansi-color": "^0.2.1", + "minimist": "^1.1.0", + "process": "^0.10.0", + "xtend": "^4.0.0" }, "dependencies": { "minimist": { @@ -3235,6 +2592,24 @@ "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", "dev": true }, + "is-core-module": { + "version": "2.4.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha1-jp/I4VAnsBFBgCbpjw5vTYYwXME=", + "requires": { + "has": "^1.0.3" + }, + "dependencies": { + "has": { + "version": "1.0.3", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has/-/has-1.0.3.tgz", + "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "requires": { + "function-bind": "^1.1.1" + } + } + } + }, "is-date-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", @@ -3534,11 +2909,11 @@ "resolved": "https://registry.npmjs.org/jaeger-client/-/jaeger-client-3.18.0.tgz", "integrity": "sha512-xZ9WvZDWLkZFq7SObpLwu1asMCKCgBRNcDxxGSvK+ZQ7OZyJC5xPlU+rJa4+s/P6autPBVwHpqMGbOERFxWuuA==", "requires": { - "node-int64": "0.4.0", - "opentracing": "0.14.4", - "thriftrw": "3.12.0", - "uuid": "3.4.0", - "xorshift": "0.2.1" + "node-int64": "^0.4.0", + "opentracing": "^0.14.4", + "thriftrw": "^3.5.0", + "uuid": "^3.2.1", + "xorshift": "^0.2.0" }, "dependencies": { "uuid": { @@ -3754,6 +3129,11 @@ "resolved": "https://registry.npmjs.org/lodash.bind/-/lodash.bind-4.2.1.tgz", "integrity": "sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU=" }, + "lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" + }, "lodash.clone": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz", @@ -3858,6 +3238,11 @@ "lodash.isarray": "^3.0.0" } }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha1-VYqlO0O2YeGSWgr9+japoQhf5Xo=" + }, "lodash.noop": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lodash.noop/-/lodash.noop-3.0.1.tgz", @@ -3915,8 +3300,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "optional": true + "dev": true }, "lowercase-keys": { "version": "1.0.0", @@ -4100,6 +3484,11 @@ } } }, + "module-details-from-path": { + "version": "1.0.3", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/module-details-from-path/-/module-details-from-path-1.0.3.tgz", + "integrity": "sha1-EUyUlnPiqKNenTV4hSeqN7Z52is=" + }, "morgan": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.7.0.tgz", @@ -4130,9 +3519,9 @@ "dev": true }, "nan": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "version": "2.14.2", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/nan/-/nan-2.14.2.tgz", + "integrity": "sha1-9TdkAGlRaPTMaUrJOT0MlYXu6hk=", "dev": true, "optional": true }, @@ -4301,7 +3690,6 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, - "optional": true, "requires": { "kind-of": "^3.0.2", "longest": "^1.0.1", @@ -5220,8 +4608,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true, - "optional": true + "dev": true }, "loose-envify": { "version": "1.3.1", @@ -6352,6 +5739,33 @@ "tdigest": "^0.1.1" } }, + "protobufjs": { + "version": "6.11.2", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/protobufjs/-/protobufjs-6.11.2.tgz", + "integrity": "sha1-3jn6vU7TK+qgjpux4w0IVEwe34s=", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "dependencies": { + "long": { + "version": "4.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/long/-/long-4.0.0.tgz", + "integrity": "sha1-mntxz7fTYaGU6lVSQckvdGjVvyg=" + } + } + }, "proxy-addr": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-1.1.2.tgz", @@ -6650,6 +6064,50 @@ } } }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-in-the-middle": { + "version": "5.1.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz", + "integrity": "sha1-t2j4ADd7R1JtAmu/Wn9yfxbrQS8=", + "requires": { + "debug": "^4.1.1", + "module-details-from-path": "^1.0.3", + "resolve": "^1.12.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/debug/-/debug-4.3.1.tgz", + "integrity": "sha1-8NIpxQXgxtjEmsVT0bE9wYP2su4=", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ms/-/ms-2.1.2.tgz", + "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=" + }, + "resolve": { + "version": "1.20.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=", + "requires": { + "is-core-module": "^2.2.0", + "path-parse": "^1.0.6" + } + } + } + }, "require-uncached": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", @@ -6831,6 +6289,11 @@ "rechoir": "^0.6.2" } }, + "shimmer": { + "version": "1.2.1", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha1-YQhZ994ye1h+/r9QH7QxF/mv8zc=" + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -7156,9 +6619,9 @@ "resolved": "https://registry.npmjs.org/thriftrw/-/thriftrw-3.12.0.tgz", "integrity": "sha512-4YZvR4DPEI41n4Opwr4jmrLGG4hndxr7387kzRFIIzxHQjarPusH4lGXrugvgb7TtPrfZVTpZCVe44/xUxowEw==", "requires": { - "bufrw": "1.3.0", + "bufrw": "^1.3.0", "error": "7.0.2", - "long": "2.4.0" + "long": "^2.4.0" } }, "through": { @@ -7455,6 +6918,67 @@ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha1-Z+FFz/UQpqaYS98RUpEdadLrnkM=", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha1-OIU59VF5vzkznIGvMKZU1p+Hy3U=" + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha1-7dgDYornHATIWuegkG7a00tkiTc=", + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha1-8Rb4Bk/pCz94RKOJl8C3UFEmnx0=" + }, + "string-width": { + "version": "4.2.2", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/string-width/-/string-width-4.2.2.tgz", + "integrity": "sha1-2v1PlVmnWFz7pSnGoKT3NIjr1MU=", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha1-CxVx3XZpzNTz4G4U7x7tJiJa5TI=", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -7494,8 +7018,12 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha1-f0k00PfKjFb5UxSTndzS3ZHOHVU=" }, "yallist": { "version": "2.1.2", @@ -7515,6 +7043,11 @@ "decamelize": "^1.0.0", "window-size": "0.1.0" } + }, + "yargs-parser": { + "version": "20.2.7", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/yargs-parser/-/yargs-parser-20.2.7.tgz", + "integrity": "sha1-Yd+FwRPt+1p6TjbriqYO9CPLyQo=" } } } diff --git a/package.json b/package.json index aaa07af..0a54c46 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "scripts": { "test": "REDIS_KEY_PREFIX=test nyc mocha --ui bdd --recursive test/", "send_cover": "nyc report --reporter=text-lcov | coveralls", - "start_dev": "nf -j Procfile.local -e .env.local start", + "start_dev": "which nf && nf -j Procfile.local -e .env.local start", "start_sandbox": "NUM_CPUS=1 STORAGE=inmemory nf -j Procfile.sandbox -e .env.local start", "lint": "eslint lib test" }, @@ -27,6 +27,11 @@ "license": "MIT", "dependencies": { "@globocom/backstage-functions-sandbox": "^0.5.3", + "@opentelemetry/core": "^0.19.0", + "@opentelemetry/exporter-collector-grpc": "^0.19.0", + "@opentelemetry/instrumentation-express": "^0.16.0", + "@opentelemetry/instrumentation-http": "^0.19.0", + "@opentelemetry/node": "^0.19.0", "async": "^2.0.1", "body-parser": "^1.15.2", "deepcopy": "^0.6.3", diff --git a/yarn-error.log b/yarn-error.log new file mode 100644 index 0000000..d083f8d --- /dev/null +++ b/yarn-error.log @@ -0,0 +1,5248 @@ +Arguments: + /usr/local/bin/node /usr/local/bin/yarn + +PATH: + /home/markiing/.pyenv/plugins/pyenv-virtualenv/shims:/home/markiing/.pyenv/shims:/home/markiing/.pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Program Files/Common Files/Oracle/Java/javapath:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0/:/mnt/c/Program Files (x86)/Intel/Intel(R) Management Engine Components/DAL:/mnt/c/Program Files/Intel/Intel(R) Management Engine Components/DAL:/mnt/c/Program Files/NVIDIA Corporation/NVIDIA NvDLISR:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/Program Files (x86)/NVIDIA Corporation/PhysX/Common:/mnt/f/Android/Sdk/platform-tools:/mnt/f/Softwares/Git/cmd:/mnt/f/Softwares/Nodejs/:/mnt/c/ProgramData/chocolatey/bin:/mnt/f/Softwares/Vagrant/bin:/mnt/c/Program Files/dotnet/:/mnt/f/Softwares/Geth:/mnt/c/Program Files/Docker/Docker/resources/bin:/mnt/c/ProgramData/DockerDesktop/version-bin:/mnt/c/Users/Marcus/AppData/Local/Microsoft/WindowsApps:/mnt/f/Softwares/Microsoft VS Code/bin:/mnt/c/Users/Marcus/AppData/Roaming/npm:/mnt/c/Users/Marcus/.dotnet/tools://home/markiing/bin_go/go/bin/go://home/markiing/.local/bin://home/markiing/bin_go/go/bin/go://home/markiing/.local/bin + +Yarn version: + 1.22.5 + +Node version: + 8.9.1 + +Platform: + linux x64 + +Trace: + SyntaxError: /home/markiing/Globo/functions/package.json: Unexpected token / in JSON at position 924 + at JSON.parse () + at /usr/local/lib/node_modules/yarn/lib/cli.js:1625:59 + at Generator.next () + at step (/usr/local/lib/node_modules/yarn/lib/cli.js:310:30) + at /usr/local/lib/node_modules/yarn/lib/cli.js:321:13 + at + +npm manifest: + { + "name": "@globocom/backstage-functions", + "version": "0.2.18", + "description": "Remote serverless code executor", + "main": "index.js", + "scripts": { + "test": "REDIS_KEY_PREFIX=test nyc mocha --ui bdd --recursive test/", + "send_cover": "nyc report --reporter=text-lcov | coveralls", + "start_dev": "which nf && nf -j Procfile.local -e .env.local start", + "start_sandbox": "NUM_CPUS=1 STORAGE=inmemory nf -j Procfile.sandbox -e .env.local start", + "lint": "eslint lib test" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/backstage/functions.git" + }, + "keywords": [ + "serverless", + "sandbox", + "functions", + "backstage" + ], + "engines": { + "node": ">=8.9.1" + }, + "author": "Backstage Team ", + "license": "MIT", + "dependencies": { + "@globocom/backstage-functions-sandbox": "^0.5.3", + "@opentelemetry/core": "^0.19.0", + //"@opentelemetry/exporter-collector": "^0.19.0", + //"@opentelemetry/exporter-collector-grpc": "^0.19.0", + //"@opentelemetry/instrumentation-express": "^0.16.0", + //"@opentelemetry/instrumentation-http": "^0.19.0", + "@opentelemetry/node": "^0.19.0", + "async": "^2.0.1", + "body-parser": "^1.15.2", + "deepcopy": "^0.6.3", + "elastic-apm-node-opentracing": "^2.0.0", + "express": "^4.14.0", + "express-opentracing": "^0.1.1", + "gelf": "^2.0.1", + "ioredis": "^3.1.4", + "jaeger-client": "^3.18.0", + "jsonschema": "^1.1.0", + "lodash": "^4.16.2", + "morgan": "^1.7.0", + "node-fetch": "^2.6.0", + "opentracing": "^0.14.4", + "prom-client": "^11.5.3", + "raven": "^2.2.1", + "request": "^2.81.0", + "stack-trace": "^0.0.9", + "uuid": "^3.0.1", + "winston": "^2.2.0" + }, + "devDependencies": { + "chai": "^3.5.0", + "chai-string": "^1.2.0", + "deepcopy": "^0.6.3", + "eslint": "^3.6.1", + "eslint-config-airbnb": "^12.0.0", + "eslint-plugin-import": "^1.16.0", + "eslint-plugin-jsx-a11y": "^2.2.2", + "eslint-plugin-react": "^6.3.0", + "foreman": "^2.0.0", + "istanbul": "^0.4.5", + "istanbul-coveralls": "^1.0.3", + "mocha": "^3.0.2", + "nodemon": "^1.10.2", + "nyc": "^11.3.0", + "sinon": "^4.1.3", + "supertest": "^2.0.0" + } + } + +yarn manifest: + No manifest + +Lockfile: + # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. + # yarn lockfile v1 + + + "@globocom/backstage-functions-sandbox@^0.5.3": + version "0.5.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@globocom/backstage-functions-sandbox/-/backstage-functions-sandbox-0.5.3.tgz#727fc2ac8c146b1848b6d5bdfd770bd2ebe6430a" + integrity sha1-cn/CrIwUaxhIttW9/XcL0uvmQwo= + dependencies: + once "^1.4.0" + stack-trace "^0.0.9" + + "@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.7.0": + version "1.8.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" + integrity sha1-OALd0hpQqUm2ch3dcto25n5/Gy0= + dependencies: + type-detect "4.0.8" + + "@sinonjs/formatio@^2.0.0": + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@sinonjs/formatio/-/formatio-2.0.0.tgz#84db7e9eb5531df18a8c5e0bfb6e449e55e654b2" + integrity sha1-hNt+nrVTHfGKjF4L+25EnlXmVLI= + dependencies: + samsam "1.3.0" + + "@sinonjs/formatio@^3.2.1": + version "3.2.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@sinonjs/formatio/-/formatio-3.2.2.tgz#771c60dfa75ea7f2d68e3b94c7e888a78781372c" + integrity sha1-dxxg36dep/LWjjuUx+iIp4eBNyw= + dependencies: + "@sinonjs/commons" "^1" + "@sinonjs/samsam" "^3.1.0" + + "@sinonjs/samsam@^3.1.0": + version "3.3.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@sinonjs/samsam/-/samsam-3.3.3.tgz#46682efd9967b259b81136b9f120fd54585feb4a" + integrity sha1-Rmgu/Zlnslm4ETa58SD9VFhf60o= + dependencies: + "@sinonjs/commons" "^1.3.0" + array-from "^2.1.1" + lodash "^4.17.15" + + "@sinonjs/text-encoding@^0.7.1": + version "0.7.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" + integrity sha1-jaXGUwkVZT86Hzj9XxAdjD+AecU= + + abbrev@1: + version "1.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" + integrity sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg= + + abbrev@1.0.x: + version "1.0.9" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" + integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= + + accepts@~1.3.7: + version "1.3.7" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" + integrity sha1-UxvHJlF6OytB+FACHGzBXqq1B80= + dependencies: + mime-types "~2.1.24" + negotiator "0.6.2" + + acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= + dependencies: + acorn "^3.0.4" + + acorn@^3.0.4: + version "3.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= + + acorn@^5.5.0: + version "5.7.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" + integrity sha1-Po2KmUfQWZoXltECJddDL0pKz14= + + ajv-keywords@^1.0.0: + version "1.5.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" + integrity sha1-MU3QpLM2j609/NxU7eYXG4htrzw= + + ajv@^4.7.0: + version "4.11.8" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" + integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY= + dependencies: + co "^4.6.0" + json-stable-stringify "^1.0.1" + + ajv@^6.12.3: + version "6.12.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ= + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + + amdefine@>=0.0.4: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= + + ansi-align@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" + integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= + dependencies: + string-width "^2.0.0" + + ansi-color@^0.2.1: + version "0.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ansi-color/-/ansi-color-0.2.1.tgz#3e75c037475217544ed763a8db5709fa9ae5bf9a" + integrity sha1-PnXAN0dSF1RO12Oo21cJ+prlv5o= + + ansi-escapes@^1.1.0: + version "1.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" + integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= + + ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= + + ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= + + ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= + + ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= + dependencies: + color-convert "^1.9.0" + + anymatch@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" + integrity sha1-vLJLTzeTTZqnrBe0ra+J58du8us= + dependencies: + micromatch "^3.1.4" + normalize-path "^2.1.1" + + append-transform@^0.4.0: + version "0.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" + integrity sha1-126/jKlNJ24keja61EpLdKthGZE= + dependencies: + default-require-extensions "^1.0.0" + + archy@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= + + argparse@^1.0.7: + version "1.0.10" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= + dependencies: + sprintf-js "~1.0.2" + + arr-diff@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= + dependencies: + arr-flatten "^1.0.1" + + arr-diff@^4.0.0: + version "4.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" + integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= + + arr-flatten@^1.0.1, arr-flatten@^1.1.0: + version "1.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + integrity sha1-NgSLv/TntH4TZkQxbJlmnqWukfE= + + arr-union@^3.1.0: + version "3.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" + integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= + + array-filter@~0.0.0: + version "0.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" + integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= + + array-flatten@1.1.1: + version "1.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" + integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= + + array-from@^2.1.1: + version "2.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" + integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= + + array-map@~0.0.0: + version "0.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" + integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= + + array-reduce@~0.0.0: + version "0.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" + integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= + + array-unique@^0.2.1: + version "0.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= + + array-unique@^0.3.2: + version "0.3.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" + integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= + + array.prototype.find@^2.0.1: + version "2.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/array.prototype.find/-/array.prototype.find-2.1.1.tgz#3baca26108ca7affb08db06bf0be6cb3115a969c" + integrity sha1-O6yiYQjKev+wjbBr8L5ssxFalpw= + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.4" + + arrify@^1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= + + asn1@~0.2.3: + version "0.2.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" + integrity sha1-jSR136tVO7M+d7VOWeiAu4ziMTY= + dependencies: + safer-buffer "~2.1.0" + + assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= + + assert-plus@^0.2.0: + version "0.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + integrity sha1-104bh+ev/A24qttwIfP+SBAasjQ= + + assertion-error@^1.0.1: + version "1.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" + integrity sha1-5gtrDo8wG9l+U3UhW9pAbIURjAs= + + assign-symbols@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" + integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= + + async-each@^1.0.1: + version "1.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" + integrity sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8= + + async@1.x, async@^1.5.2: + version "1.5.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" + integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= + + async@^2.0.1, async@^2.5.0: + version "2.6.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" + integrity sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8= + dependencies: + lodash "^4.17.14" + + async@~1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k= + + asynckit@^0.4.0: + version "0.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= + + atob@^2.1.2: + version "2.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" + integrity sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k= + + aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + integrity sha1-FDQt0428yU0OW4fXY81jYSwOeU8= + + aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= + + aws4@^1.2.1, aws4@^1.8.0: + version "1.11.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" + integrity sha1-1h9G2DslGSUOJ4Ta9bCUeai0HFk= + + babel-code-frame@^6.16.0, babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + + babel-generator@^6.18.0: + version "6.26.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + integrity sha1-GERAjTuPDTWkBOp6wYDwh6YBvZA= + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + + babel-messages@^6.23.0: + version "6.23.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" + integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= + dependencies: + babel-runtime "^6.22.0" + + babel-runtime@^6.22.0, babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + + babel-template@^6.16.0: + version "6.26.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + + babel-traverse@^6.18.0, babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + + babel-types@^6.18.0, babel-types@^6.26.0: + version "6.26.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + + babylon@^6.18.0: + version "6.18.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + integrity sha1-ry87iPpvXB5MY00aD46sT1WzleM= + + balanced-match@^1.0.0: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4= + + base@^0.11.1: + version "0.11.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" + integrity sha1-e95c7RRbbVUakNuH+DxVi060io8= + dependencies: + cache-base "^1.0.1" + class-utils "^0.3.5" + component-emitter "^1.2.1" + define-property "^1.0.0" + isobject "^3.0.1" + mixin-deep "^1.2.0" + pascalcase "^0.1.1" + + basic-auth@~2.0.1: + version "2.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" + integrity sha1-uZgnm/R844NEtPPPkW1Gebv1Hjo= + dependencies: + safe-buffer "5.1.2" + + bcrypt-pbkdf@^1.0.0: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" + integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= + dependencies: + tweetnacl "^0.14.3" + + binary-extensions@^1.0.0: + version "1.13.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" + integrity sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U= + + bindings@^1.5.0: + version "1.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" + integrity sha1-EDU8npRTNLwFEabZCzj7x8nFBN8= + dependencies: + file-uri-to-path "1.0.0" + + bintrees@1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/bintrees/-/bintrees-1.0.1.tgz#0e655c9b9c2435eaab68bf4027226d2b55a34524" + integrity sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ= + + bluebird@^3.3.4: + version "3.7.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" + integrity sha1-nyKcFb4nJFT/qXOs4NvueaGww28= + + body-parser@1.19.0, body-parser@^1.15.2: + version "1.19.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" + integrity sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io= + dependencies: + bytes "3.1.0" + content-type "~1.0.4" + debug "2.6.9" + depd "~1.1.2" + http-errors "1.7.2" + iconv-lite "0.4.24" + on-finished "~2.3.0" + qs "6.7.0" + raw-body "2.4.0" + type-is "~1.6.17" + + boom@2.x.x: + version "2.10.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + integrity sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8= + dependencies: + hoek "2.x.x" + + boxen@^1.2.1: + version "1.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" + integrity sha1-VcbDmouljZxhrSLNh3Uy3rZlogs= + dependencies: + ansi-align "^2.0.0" + camelcase "^4.0.0" + chalk "^2.0.1" + cli-boxes "^1.0.0" + string-width "^2.0.0" + term-size "^1.2.0" + widest-line "^2.0.0" + + brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + + braces@^1.8.2: + version "1.8.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + + braces@^2.3.1, braces@^2.3.2: + version "2.3.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" + integrity sha1-WXn9PxTNUxVl5fot8av/8d+u5yk= + dependencies: + arr-flatten "^1.1.0" + array-unique "^0.3.2" + extend-shallow "^2.0.1" + fill-range "^4.0.0" + isobject "^3.0.1" + repeat-element "^1.1.2" + snapdragon "^0.8.1" + snapdragon-node "^2.0.1" + split-string "^3.0.2" + to-regex "^3.0.1" + + browser-stdout@1.3.0: + version "1.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" + integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= + + buffer-from@^1.0.0: + version "1.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + integrity sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8= + + bufrw@^1.3.0: + version "1.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/bufrw/-/bufrw-1.3.0.tgz#28d6cfdaf34300376836310f5c31d57eeb40c8fa" + integrity sha1-KNbP2vNDADdoNjEPXDHVfutAyPo= + dependencies: + ansi-color "^0.2.1" + error "^7.0.0" + hexer "^1.5.0" + xtend "^4.0.0" + + builtin-modules@^1.1.1: + version "1.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= + + bytes@3.1.0: + version "3.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" + integrity sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY= + + cache-base@^1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" + integrity sha1-Cn9GQWgxyLZi7jb+TnxZ129marI= + dependencies: + collection-visit "^1.0.0" + component-emitter "^1.2.1" + get-value "^2.0.6" + has-value "^1.0.0" + isobject "^3.0.1" + set-value "^2.0.0" + to-object-path "^0.3.0" + union-value "^1.0.0" + unset-value "^1.0.0" + + caching-transform@^1.0.0: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" + integrity sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE= + dependencies: + md5-hex "^1.2.0" + mkdirp "^0.5.1" + write-file-atomic "^1.1.4" + + call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" + integrity sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw= + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + + caller-path@^0.1.0: + version "0.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= + dependencies: + callsites "^0.2.0" + + callsites@^0.2.0: + version "0.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= + + camelcase@^4.0.0, camelcase@^4.1.0: + version "4.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= + + capture-stack-trace@^1.0.0: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" + integrity sha1-psC74fOPOqC5Ijjstv9Cw0TUE10= + + caseless@~0.11.0: + version "0.11.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + integrity sha1-cVuW6phBWTzDMGeSP17GDr2k99c= + + caseless@~0.12.0: + version "0.12.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= + + chai-string@^1.2.0: + version "1.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/chai-string/-/chai-string-1.5.0.tgz#0bdb2d8a5f1dbe90bc78ec493c1c1c180dd4d3d2" + integrity sha1-C9stil8dvpC8eOxJPBwcGA3U09I= + + chai@^3.5.0: + version "3.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" + integrity sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc= + dependencies: + assertion-error "^1.0.1" + deep-eql "^0.1.3" + type-detect "^1.0.0" + + chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: + version "1.1.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + + chalk@^2.0.1: + version "2.4.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ= + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + + charenc@0.0.2: + version "0.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" + integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= + + chokidar@^2.1.8: + version "2.1.8" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" + integrity sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc= + dependencies: + anymatch "^2.0.0" + async-each "^1.0.1" + braces "^2.3.2" + glob-parent "^3.1.0" + inherits "^2.0.3" + is-binary-path "^1.0.0" + is-glob "^4.0.0" + normalize-path "^3.0.0" + path-is-absolute "^1.0.0" + readdirp "^2.2.1" + upath "^1.1.1" + optionalDependencies: + fsevents "^1.2.7" + + ci-info@^1.5.0: + version "1.6.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" + integrity sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc= + + circular-json@^0.3.1: + version "0.3.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + integrity sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY= + + class-utils@^0.3.5: + version "0.3.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" + integrity sha1-+TNprouafOAv1B+q0MqDAzGQxGM= + dependencies: + arr-union "^3.1.0" + define-property "^0.2.5" + isobject "^3.0.0" + static-extend "^0.1.1" + + cli-boxes@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" + integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= + + cli-cursor@^1.0.1: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" + integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= + dependencies: + restore-cursor "^1.0.1" + + cli-width@^2.0.0: + version "2.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" + integrity sha1-sEM9C06chH7xiGik7xb9X8gnHEg= + + cliui@^4.0.0: + version "4.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + integrity sha1-NIQi2+gtgAswIu709qwQvy5NG0k= + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + + cluster-key-slot@^1.0.6: + version "1.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d" + integrity sha1-MEdLKpgfsSFyaVgzBSvA0BM20Q0= + + co@^4.6.0: + version "4.6.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= + + code-point-at@^1.0.0: + version "1.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" + integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= + + collection-visit@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" + integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= + dependencies: + map-visit "^1.0.0" + object-visit "^1.0.0" + + color-convert@^1.9.0: + version "1.9.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= + dependencies: + color-name "1.1.3" + + color-name@1.1.3: + version "1.1.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= + + colors@1.0.x: + version "1.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= + + combined-stream@^1.0.5, combined-stream@^1.0.6, combined-stream@~1.0.5, combined-stream@~1.0.6: + version "1.0.8" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha1-w9RaizT9cwYxoRCoolIGgrMdWn8= + dependencies: + delayed-stream "~1.0.0" + + commander@2.9.0, commander@~2.9.0: + version "2.9.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" + integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= + dependencies: + graceful-readlink ">= 1.0.0" + + commander@^2.9.0: + version "2.20.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha1-/UhehMA+tIgcIHIrpIA16FMa6zM= + + commondir@^1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= + + component-emitter@^1.2.0, component-emitter@^1.2.1: + version "1.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" + integrity sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A= + + concat-map@0.0.1: + version "0.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= + + concat-stream@^1.5.2: + version "1.6.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + integrity sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ= + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + + configstore@^3.0.0: + version "3.1.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/configstore/-/configstore-3.1.5.tgz#e9af331fadc14dabd544d3e7e76dc446a09a530f" + integrity sha1-6a8zH63BTavVRNPn523ERqCaUw8= + dependencies: + dot-prop "^4.2.1" + graceful-fs "^4.1.2" + make-dir "^1.0.0" + unique-string "^1.0.0" + write-file-atomic "^2.0.0" + xdg-basedir "^3.0.0" + + contains-path@^0.1.0: + version "0.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" + integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= + + content-disposition@0.5.3: + version "0.5.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" + integrity sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70= + dependencies: + safe-buffer "5.1.2" + + content-type@~1.0.4: + version "1.0.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" + integrity sha1-4TjMdeBAxyexlm/l5fjJruJW/js= + + convert-source-map@^1.5.1: + version "1.7.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" + integrity sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI= + dependencies: + safe-buffer "~5.1.1" + + cookie-signature@1.0.6: + version "1.0.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" + integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= + + cookie@0.3.1: + version "0.3.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" + integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= + + cookie@0.4.0: + version "0.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" + integrity sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo= + + cookiejar@^2.0.6: + version "2.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" + integrity sha1-3YojVTB1L5iPmghE8/xYnjERElw= + + copy-descriptor@^0.1.0: + version "0.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" + integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= + + core-js@^2.4.0: + version "2.6.12" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" + integrity sha1-2TM9+nsGXjR8xWgiGdb2kIWcwuw= + + core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= + + coveralls@^2.11.2: + version "2.13.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/coveralls/-/coveralls-2.13.3.tgz#9ad7c2ae527417f361e8b626483f48ee92dd2bc7" + integrity sha1-mtfCrlJ0F/Nh6LYmSD9I7pLdK8c= + dependencies: + js-yaml "3.6.1" + lcov-parse "0.0.10" + log-driver "1.2.5" + minimist "1.2.0" + request "2.79.0" + + create-error-class@^3.0.0: + version "3.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" + integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= + dependencies: + capture-stack-trace "^1.0.0" + + cross-spawn@^4: + version "4.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" + integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE= + dependencies: + lru-cache "^4.0.1" + which "^1.2.9" + + cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + + crypt@0.0.2: + version "0.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" + integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= + + cryptiles@2.x.x: + version "2.0.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + integrity sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g= + dependencies: + boom "2.x.x" + + crypto-random-string@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" + integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= + + cycle@1.0.x: + version "1.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI= + + d@1, d@^1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" + integrity sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o= + dependencies: + es5-ext "^0.10.50" + type "^1.0.1" + + damerau-levenshtein@^1.0.0: + version "1.0.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" + integrity sha1-FDwWQcs9hcYMMjKeJoma3qhwF5E= + + dashdash@^1.12.0: + version "1.14.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= + dependencies: + assert-plus "^1.0.0" + + debug-log@^1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" + integrity sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8= + + debug@2.6.8: + version "2.6.8" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + integrity sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw= + dependencies: + ms "2.0.0" + + debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + integrity sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8= + dependencies: + ms "2.0.0" + + debug@^3.1.0, debug@^3.2.6: + version "3.2.7" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" + integrity sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o= + dependencies: + ms "^2.1.1" + + decamelize@^1.1.1: + version "1.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= + + decode-uri-component@^0.2.0: + version "0.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" + integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= + + deep-eql@^0.1.3: + version "0.1.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" + integrity sha1-71WKyrjeJSBs1xOQbXTlaTDrafI= + dependencies: + type-detect "0.1.1" + + deep-extend@^0.6.0: + version "0.6.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + integrity sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw= + + deep-is@~0.1.3: + version "0.1.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= + + deepcopy@^0.6.3: + version "0.6.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/deepcopy/-/deepcopy-0.6.3.tgz#634780f2f8656ab771af8fa8431ed1ccee55c7b0" + integrity sha1-Y0eA8vhlardxr4+oQx7RzO5Vx7A= + + default-require-extensions@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" + integrity sha1-836hXT4T/9m0N9M+GnW1+5eHTLg= + dependencies: + strip-bom "^2.0.0" + + define-properties@^1.1.3: + version "1.1.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" + integrity sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE= + dependencies: + object-keys "^1.0.12" + + define-property@^0.2.5: + version "0.2.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" + integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= + dependencies: + is-descriptor "^0.1.0" + + define-property@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" + integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= + dependencies: + is-descriptor "^1.0.0" + + define-property@^2.0.2: + version "2.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" + integrity sha1-1Flono1lS6d+AqgX+HENcCyxbp0= + dependencies: + is-descriptor "^1.0.2" + isobject "^3.0.1" + + delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= + + denque@^1.1.0: + version "1.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/denque/-/denque-1.5.0.tgz#773de0686ff2d8ec2ff92914316a47b73b1c73de" + integrity sha1-dz3gaG/y2Owv+SkUMWpHtzscc94= + + depd@~1.1.2: + version "1.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= + + depd@~2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" + integrity sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8= + + destroy@~1.0.4: + version "1.0.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" + integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= + + detect-indent@^4.0.0: + version "4.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" + integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= + dependencies: + repeating "^2.0.0" + + diff@3.2.0: + version "3.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" + integrity sha1-yc45Okt8vQsFinJck98pkCeGj/k= + + diff@^3.1.0: + version "3.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" + integrity sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI= + + doctrine@1.3.x: + version "1.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/doctrine/-/doctrine-1.3.0.tgz#13e75682b55518424276f7c173783456ef913d26" + integrity sha1-E+dWgrVVGEJCdvfBc3g0Vu+RPSY= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + + doctrine@^1.2.2: + version "1.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" + integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= + dependencies: + esutils "^2.0.2" + isarray "^1.0.0" + + doctrine@^2.0.0: + version "2.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + integrity sha1-XNAfwQFiG0LEzX9dGmYkNxbT850= + dependencies: + esutils "^2.0.2" + + dot-prop@^4.2.1: + version "4.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" + integrity sha1-RYhBlKcfws2nHLtLzrOk3S9DO6Q= + dependencies: + is-obj "^1.0.0" + + duplexer3@^0.1.4: + version "0.1.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" + integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= + + ecc-jsbn@~0.1.1: + version "0.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" + integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= + dependencies: + jsbn "~0.1.0" + safer-buffer "^2.1.0" + + ee-first@1.1.1: + version "1.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" + integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= + + elastic-apm-node-opentracing@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/elastic-apm-node-opentracing/-/elastic-apm-node-opentracing-2.0.0.tgz#91271aab5a1f4c3424758f062aa06c92b047962f" + integrity sha1-kScaq1ofTDQkdY8GKqBskrBHli8= + dependencies: + opentracing "^0.14.3" + + encodeurl@~1.0.2: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" + integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= + + error-ex@^1.2.0: + version "1.3.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" + integrity sha1-tKxAZIEH/c3PriQvQovqihTU8b8= + dependencies: + is-arrayish "^0.2.1" + + error@7.0.2: + version "7.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" + integrity sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI= + dependencies: + string-template "~0.2.1" + xtend "~4.0.0" + + error@^7.0.0: + version "7.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894" + integrity sha1-6rIaRom19oT8g9qEoOOQ3oLZSJQ= + dependencies: + string-template "~0.2.1" + + es-abstract@^1.17.4: + version "1.18.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" + integrity sha1-q4CzWe7Lft5MKYAAOQvFrD7HtaQ= + dependencies: + call-bind "^1.0.2" + es-to-primitive "^1.2.1" + function-bind "^1.1.1" + get-intrinsic "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.2" + is-callable "^1.2.3" + is-negative-zero "^2.0.1" + is-regex "^1.1.2" + is-string "^1.0.5" + object-inspect "^1.9.0" + object-keys "^1.1.1" + object.assign "^4.1.2" + string.prototype.trimend "^1.0.4" + string.prototype.trimstart "^1.0.4" + unbox-primitive "^1.0.0" + + es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" + integrity sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo= + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + + es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14: + version "0.10.53" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" + integrity sha1-k8WjrP2+8nUiCtcmRK0C7hg2jeE= + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.3" + next-tick "~1.0.0" + + es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + + es6-map@^0.1.3: + version "0.1.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" + integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA= + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-set "~0.1.5" + es6-symbol "~3.1.1" + event-emitter "~0.3.5" + + es6-set@^0.1.4, es6-set@~0.1.5: + version "0.1.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" + integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE= + dependencies: + d "1" + es5-ext "~0.10.14" + es6-iterator "~2.0.1" + es6-symbol "3.1.1" + event-emitter "~0.3.5" + + es6-symbol@3.1.1: + version "3.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= + dependencies: + d "1" + es5-ext "~0.10.14" + + es6-symbol@^3.1.1, es6-symbol@~3.1.1, es6-symbol@~3.1.3: + version "3.1.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" + integrity sha1-utXTwbzawoJp9MszHkMceKxwXRg= + dependencies: + d "^1.0.1" + ext "^1.1.2" + + es6-weak-map@^2.0.1: + version "2.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" + integrity sha1-ttofFswswNm+Q+a9v8Xn383zHVM= + dependencies: + d "1" + es5-ext "^0.10.46" + es6-iterator "^2.0.3" + es6-symbol "^3.1.1" + + escape-html@~1.0.3: + version "1.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= + + escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= + + escodegen@1.8.x: + version "1.8.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" + integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= + dependencies: + esprima "^2.7.1" + estraverse "^1.9.1" + esutils "^2.0.2" + optionator "^0.8.1" + optionalDependencies: + source-map "~0.2.0" + + escope@^3.6.0: + version "3.6.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" + integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM= + dependencies: + es6-map "^0.1.3" + es6-weak-map "^2.0.1" + esrecurse "^4.1.0" + estraverse "^4.1.1" + + eslint-config-airbnb-base@^8.0.0: + version "8.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eslint-config-airbnb-base/-/eslint-config-airbnb-base-8.0.0.tgz#c5e958a469ab8af76aff068b43d784e5afe74ca7" + integrity sha1-xelYpGmrivdq/waLQ9eE5a/nTKc= + + eslint-config-airbnb@^12.0.0: + version "12.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eslint-config-airbnb/-/eslint-config-airbnb-12.0.0.tgz#ab282b756a25f03d04ac264c24d673a08a803270" + integrity sha1-qygrdWol8D0ErCZMJNZzoIqAMnA= + dependencies: + eslint-config-airbnb-base "^8.0.0" + + eslint-import-resolver-node@^0.2.0: + version "0.2.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c" + integrity sha1-Wt2BBujJKNssuiMrzZ76hG49oWw= + dependencies: + debug "^2.2.0" + object-assign "^4.0.1" + resolve "^1.1.6" + + eslint-plugin-import@^1.16.0: + version "1.16.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eslint-plugin-import/-/eslint-plugin-import-1.16.0.tgz#b2fa07ebcc53504d0f2a4477582ec8bff1871b9f" + integrity sha1-svoH68xTUE0PKkR3WC7Iv/GHG58= + dependencies: + builtin-modules "^1.1.1" + contains-path "^0.1.0" + debug "^2.2.0" + doctrine "1.3.x" + es6-map "^0.1.3" + es6-set "^0.1.4" + eslint-import-resolver-node "^0.2.0" + has "^1.0.1" + lodash.cond "^4.3.0" + lodash.endswith "^4.0.1" + lodash.find "^4.3.0" + lodash.findindex "^4.3.0" + minimatch "^3.0.3" + object-assign "^4.0.1" + pkg-dir "^1.0.0" + pkg-up "^1.0.0" + + eslint-plugin-jsx-a11y@^2.2.2: + version "2.2.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-2.2.3.tgz#4e35cb71b8a7db702ac415c806eb8e8d9ea6c65d" + integrity sha1-TjXLcbin23AqxBXIBuuOjZ6mxl0= + dependencies: + damerau-levenshtein "^1.0.0" + jsx-ast-utils "^1.0.0" + object-assign "^4.0.1" + + eslint-plugin-react@^6.3.0: + version "6.10.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz#c5435beb06774e12c7db2f6abaddcbf900cd3f78" + integrity sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g= + dependencies: + array.prototype.find "^2.0.1" + doctrine "^1.2.2" + has "^1.0.1" + jsx-ast-utils "^1.3.4" + object.assign "^4.0.4" + + eslint@^3.6.1: + version "3.19.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" + integrity sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw= + dependencies: + babel-code-frame "^6.16.0" + chalk "^1.1.3" + concat-stream "^1.5.2" + debug "^2.1.1" + doctrine "^2.0.0" + escope "^3.6.0" + espree "^3.4.0" + esquery "^1.0.0" + estraverse "^4.2.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + glob "^7.0.3" + globals "^9.14.0" + ignore "^3.2.0" + imurmurhash "^0.1.4" + inquirer "^0.12.0" + is-my-json-valid "^2.10.0" + is-resolvable "^1.0.0" + js-yaml "^3.5.1" + json-stable-stringify "^1.0.0" + levn "^0.3.0" + lodash "^4.0.0" + mkdirp "^0.5.0" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.1" + pluralize "^1.2.1" + progress "^1.1.8" + require-uncached "^1.0.2" + shelljs "^0.7.5" + strip-bom "^3.0.0" + strip-json-comments "~2.0.1" + table "^3.7.8" + text-table "~0.2.0" + user-home "^2.0.0" + + espree@^3.4.0: + version "3.5.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + integrity sha1-sPRHGHyKi+2US4FaZgvd9d610ac= + dependencies: + acorn "^5.5.0" + acorn-jsx "^3.0.0" + + esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1: + version "2.7.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" + integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= + + esprima@^4.0.0: + version "4.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha1-E7BM2z5sXRnfkatph6hpVhmwqnE= + + esquery@^1.0.0: + version "1.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" + integrity sha1-IUj/w4uC6McFff7UhCWz5h8PJKU= + dependencies: + estraverse "^5.1.0" + + esrecurse@^4.1.0: + version "4.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha1-eteWTWeauyi+5yzsY3WLHF0smSE= + dependencies: + estraverse "^5.2.0" + + estraverse@^1.9.1: + version "1.9.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" + integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= + + estraverse@^4.1.1, estraverse@^4.2.0: + version "4.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0= + + estraverse@^5.1.0, estraverse@^5.2.0: + version "5.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" + integrity sha1-MH30JUfmzHMk088DwVXVzbjFOIA= + + esutils@^2.0.2: + version "2.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q= + + etag@~1.8.1: + version "1.8.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" + integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= + + event-emitter@~0.3.5: + version "0.3.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" + integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= + dependencies: + d "1" + es5-ext "~0.10.14" + + eventemitter3@1.x.x: + version "1.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" + integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= + + execa@^0.7.0: + version "0.7.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + + exit-hook@^1.0.0: + version "1.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" + integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= + + expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= + dependencies: + is-posix-bracket "^0.1.0" + + expand-brackets@^2.1.4: + version "2.1.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" + integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= + dependencies: + debug "^2.3.3" + define-property "^0.2.5" + extend-shallow "^2.0.1" + posix-character-classes "^0.1.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + + expand-range@^1.8.1: + version "1.8.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= + dependencies: + fill-range "^2.1.0" + + express-opentracing@^0.1.1: + version "0.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/express-opentracing/-/express-opentracing-0.1.1.tgz#5a6244c5d4dd41117d1805922fb08d21328f7a4d" + integrity sha1-WmJExdTdQRF9GAWSL7CNITKPek0= + dependencies: + opentracing "^0.14.0" + + express@^4.14.0: + version "4.17.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" + integrity sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ= + dependencies: + accepts "~1.3.7" + array-flatten "1.1.1" + body-parser "1.19.0" + content-disposition "0.5.3" + content-type "~1.0.4" + cookie "0.4.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "~1.1.2" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "~1.1.2" + fresh "0.5.2" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "~2.3.0" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.5" + qs "6.7.0" + range-parser "~1.2.1" + safe-buffer "5.1.2" + send "0.17.1" + serve-static "1.14.1" + setprototypeof "1.1.1" + statuses "~1.5.0" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + + ext@^1.1.2: + version "1.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" + integrity sha1-ia56BxWPedNVF4gpBDJAd+Q3kkQ= + dependencies: + type "^2.0.0" + + extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= + dependencies: + is-extendable "^0.1.0" + + extend-shallow@^3.0.0, extend-shallow@^3.0.2: + version "3.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" + integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= + dependencies: + assign-symbols "^1.0.0" + is-extendable "^1.0.1" + + extend@^3.0.0, extend@~3.0.0, extend@~3.0.2: + version "3.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" + integrity sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo= + + extglob@^0.3.1: + version "0.3.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= + dependencies: + is-extglob "^1.0.0" + + extglob@^2.0.4: + version "2.0.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" + integrity sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM= + dependencies: + array-unique "^0.3.2" + define-property "^1.0.0" + expand-brackets "^2.1.4" + extend-shallow "^2.0.1" + fragment-cache "^0.2.1" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + + extsprintf@1.3.0: + version "1.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= + + extsprintf@^1.2.0: + version "1.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= + + eyes@0.1.x: + version "0.1.8" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= + + fast-deep-equal@^3.1.1: + version "3.1.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU= + + fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM= + + fast-levenshtein@~2.0.6: + version "2.0.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= + + figures@^1.3.5: + version "1.7.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" + integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= + dependencies: + escape-string-regexp "^1.0.5" + object-assign "^4.1.0" + + file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + + file-uri-to-path@1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" + integrity sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90= + + filename-regex@^2.0.0: + version "2.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= + + fill-range@^2.1.0: + version "2.2.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" + integrity sha1-6x53OrsFbc2N8r/favWbizqTZWU= + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^3.0.0" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + + fill-range@^4.0.0: + version "4.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" + integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= + dependencies: + extend-shallow "^2.0.1" + is-number "^3.0.0" + repeat-string "^1.6.1" + to-regex-range "^2.1.0" + + finalhandler@~1.1.2: + version "1.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" + integrity sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0= + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "~2.3.0" + parseurl "~1.3.3" + statuses "~1.5.0" + unpipe "~1.0.0" + + find-cache-dir@^0.1.1: + version "0.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" + integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= + dependencies: + commondir "^1.0.1" + mkdirp "^0.5.1" + pkg-dir "^1.0.0" + + find-up@^1.0.0: + version "1.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + + find-up@^2.1.0: + version "2.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + + flat-cache@^1.2.1: + version "1.3.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" + integrity sha1-LC73dSXMKSkAff/6HdMUqpyd7m8= + dependencies: + circular-json "^0.3.1" + graceful-fs "^4.1.2" + rimraf "~2.6.2" + write "^0.2.1" + + flexbuffer@0.0.6: + version "0.0.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/flexbuffer/-/flexbuffer-0.0.6.tgz#039fdf23f8823e440c38f3277e6fef1174215b30" + integrity sha1-A5/fI/iCPkQMOPMnfm/vEXQhWzA= + + for-in@^1.0.1, for-in@^1.0.2: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= + + for-own@^0.1.4: + version "0.1.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= + dependencies: + for-in "^1.0.1" + + foreground-child@^1.5.3, foreground-child@^1.5.6: + version "1.5.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" + integrity sha1-T9ca0t/elnibmApcCilZN8svXOk= + dependencies: + cross-spawn "^4" + signal-exit "^3.0.0" + + foreman@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/foreman/-/foreman-2.0.0.tgz#00acd20f9dbbe2f79d04697bcca2a77ee00ee031" + integrity sha1-AKzSD5274vedBGl7zKKnfuAO4DE= + dependencies: + commander "~2.9.0" + http-proxy "~1.11.1" + mustache "^2.2.1" + shell-quote "~1.4.2" + + forever-agent@~0.6.1: + version "0.6.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= + + form-data@1.0.0-rc4: + version "1.0.0-rc4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/form-data/-/form-data-1.0.0-rc4.tgz#05ac6bc22227b43e4461f488161554699d4f8b5e" + integrity sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14= + dependencies: + async "^1.5.2" + combined-stream "^1.0.5" + mime-types "^2.1.10" + + form-data@~2.1.1: + version "2.1.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + integrity sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE= + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + + form-data@~2.3.2: + version "2.3.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" + integrity sha1-3M5SwF9kTymManq5Nr1yTO/786Y= + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.6" + mime-types "^2.1.12" + + formidable@^1.0.17: + version "1.2.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9" + integrity sha1-v2muopcpgmdfAIZTQrmCmG9rjdk= + + forwarded@~0.1.2: + version "0.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" + integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= + + fragment-cache@^0.2.1: + version "0.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" + integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= + dependencies: + map-cache "^0.2.2" + + fresh@0.5.2: + version "0.5.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" + integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= + + fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= + + fsevents@^1.2.7: + version "1.2.13" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" + integrity sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg= + dependencies: + bindings "^1.5.0" + nan "^2.12.1" + + function-bind@^1.1.1: + version "1.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0= + + gelf@^2.0.1: + version "2.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/gelf/-/gelf-2.0.1.tgz#3973c746b09f62de6cf05811407939471158bb0e" + integrity sha1-OXPHRrCfYt5s8FgRQHk5RxFYuw4= + dependencies: + async "^2.5.0" + + generate-function@^2.0.0: + version "2.3.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" + integrity sha1-8GlhdpDBDIaOc7hGV0Z2T5fDR58= + dependencies: + is-property "^1.0.2" + + generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + integrity sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA= + dependencies: + is-property "^1.0.0" + + get-caller-file@^1.0.1: + version "1.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" + integrity sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o= + + get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: + version "1.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" + integrity sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y= + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-symbols "^1.0.1" + + get-stream@^3.0.0: + version "3.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= + + get-value@^2.0.3, get-value@^2.0.6: + version "2.0.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" + integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= + + getpass@^0.1.1: + version "0.1.7" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= + dependencies: + assert-plus "^1.0.0" + + glob-base@^0.3.0: + version "0.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + + glob-parent@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= + dependencies: + is-glob "^2.0.0" + + glob-parent@^3.1.0: + version "3.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + + glob@7.1.1: + version "7.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + integrity sha1-gFIR3wT6rxxjo2ADBs31reULLsg= + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + + glob@^5.0.15: + version "5.0.15" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + + glob@^7.0.0, glob@^7.0.3, glob@^7.0.6, glob@^7.1.3: + version "7.1.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY= + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + + global-dirs@^0.1.0: + version "0.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" + integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= + dependencies: + ini "^1.3.4" + + globals@^9.14.0, globals@^9.18.0: + version "9.18.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" + integrity sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo= + + got@^6.7.1: + version "6.7.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" + integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= + dependencies: + create-error-class "^3.0.0" + duplexer3 "^0.1.4" + get-stream "^3.0.0" + is-redirect "^1.0.0" + is-retry-allowed "^1.0.0" + is-stream "^1.0.0" + lowercase-keys "^1.0.0" + safe-buffer "^5.0.1" + timed-out "^4.0.0" + unzip-response "^2.0.1" + url-parse-lax "^1.0.0" + + graceful-fs@^4.1.11, graceful-fs@^4.1.2: + version "4.2.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" + integrity sha1-/wQLKwhTsjw9MQJ1I3BvGIXXa+4= + + "graceful-readlink@>= 1.0.0": + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" + integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= + + growl@1.9.2: + version "1.9.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8= + + handlebars@^4.0.1, handlebars@^4.0.3: + version "4.7.7" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" + integrity sha1-nOM0FqrQLb1sj6+oJA1dmABJRaE= + dependencies: + minimist "^1.2.5" + neo-async "^2.6.0" + source-map "^0.6.1" + wordwrap "^1.0.0" + optionalDependencies: + uglify-js "^3.1.4" + + har-schema@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= + + har-validator@~2.0.6: + version "2.0.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + integrity sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0= + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + + har-validator@~5.1.3: + version "5.1.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" + integrity sha1-HwgDufjLIMD6E4It8ezds2veHv0= + dependencies: + ajv "^6.12.3" + har-schema "^2.0.0" + + has-ansi@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= + dependencies: + ansi-regex "^2.0.0" + + has-bigints@^1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" + integrity sha1-ZP5qywIGc+O3jbA1pa9pqp0HsRM= + + has-flag@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" + integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= + + has-flag@^3.0.0: + version "3.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= + + has-symbols@^1.0.1, has-symbols@^1.0.2: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" + integrity sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM= + + has-value@^0.3.1: + version "0.3.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" + integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= + dependencies: + get-value "^2.0.3" + has-values "^0.1.4" + isobject "^2.0.0" + + has-value@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" + integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= + dependencies: + get-value "^2.0.6" + has-values "^1.0.0" + isobject "^3.0.0" + + has-values@^0.1.4: + version "0.1.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" + integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= + + has-values@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" + integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + + has@^1.0.1, has@^1.0.3: + version "1.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y= + dependencies: + function-bind "^1.1.1" + + hawk@~3.1.3: + version "3.1.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + integrity sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ= + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + + he@1.1.1: + version "1.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" + integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= + + hexer@^1.5.0: + version "1.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/hexer/-/hexer-1.5.0.tgz#b86ce808598e8a9d1892c571f3cedd86fc9f0653" + integrity sha1-uGzoCFmOip0YksVx887dhvyfBlM= + dependencies: + ansi-color "^0.2.1" + minimist "^1.1.0" + process "^0.10.0" + xtend "^4.0.0" + + hoek@2.x.x: + version "2.16.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= + + hosted-git-info@^2.1.4: + version "2.8.9" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k= + + http-errors@1.7.2: + version "1.7.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" + integrity sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8= + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + + http-errors@~1.7.2: + version "1.7.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" + integrity sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY= + dependencies: + depd "~1.1.2" + inherits "2.0.4" + setprototypeof "1.1.1" + statuses ">= 1.5.0 < 2" + toidentifier "1.0.0" + + http-proxy@~1.11.1: + version "1.11.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/http-proxy/-/http-proxy-1.11.3.tgz#1915dc888751e2a6bf3c2abfcb1808fa86c72353" + integrity sha1-GRXciIdR4qa/PCq/yxgI+obHI1M= + dependencies: + eventemitter3 "1.x.x" + requires-port "0.x.x" + + http-signature@~1.1.0: + version "1.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + integrity sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8= + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + + http-signature@~1.2.0: + version "1.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + + iconv-lite@0.4.24: + version "0.4.24" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs= + dependencies: + safer-buffer ">= 2.1.2 < 3" + + ignore-by-default@^1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" + integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= + + ignore@^3.2.0: + version "3.3.10" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + integrity sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM= + + import-lazy@^2.1.0: + version "2.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" + integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= + + imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= + + inflight@^1.0.4: + version "1.0.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= + dependencies: + once "^1.3.0" + wrappy "1" + + inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w= + + inherits@2.0.3: + version "2.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= + + ini@^1.3.4, ini@~1.3.0: + version "1.3.8" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + integrity sha1-op2kJbSIBvNHZ6Tvzjlyaa8oQyw= + + inquirer@^0.12.0: + version "0.12.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" + integrity sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34= + dependencies: + ansi-escapes "^1.1.0" + ansi-regex "^2.0.0" + chalk "^1.0.0" + cli-cursor "^1.0.1" + cli-width "^2.0.0" + figures "^1.3.5" + lodash "^4.3.0" + readline2 "^1.0.1" + run-async "^0.1.0" + rx-lite "^3.1.2" + string-width "^1.0.1" + strip-ansi "^3.0.0" + through "^2.3.6" + + interpret@^1.0.0: + version "1.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" + integrity sha1-Zlq4vE2iendKQFhOgS4+D6RbGh4= + + invariant@^2.2.2: + version "2.2.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + integrity sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY= + dependencies: + loose-envify "^1.0.0" + + invert-kv@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" + integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= + + ioredis@^3.1.4: + version "3.2.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ioredis/-/ioredis-3.2.2.tgz#b7d5ff3afd77bb9718bb2821329b894b9a44c00b" + integrity sha1-t9X/Ov13u5cYuyghMpuJS5pEwAs= + dependencies: + bluebird "^3.3.4" + cluster-key-slot "^1.0.6" + debug "^2.6.9" + denque "^1.1.0" + flexbuffer "0.0.6" + lodash.assign "^4.2.0" + lodash.bind "^4.2.1" + lodash.clone "^4.5.0" + lodash.clonedeep "^4.5.0" + lodash.defaults "^4.2.0" + lodash.difference "^4.5.0" + lodash.flatten "^4.4.0" + lodash.foreach "^4.5.0" + lodash.isempty "^4.4.0" + lodash.keys "^4.2.0" + lodash.noop "^3.0.1" + lodash.partial "^4.2.1" + lodash.pick "^4.4.0" + lodash.sample "^4.2.1" + lodash.shuffle "^4.2.0" + lodash.values "^4.3.0" + redis-commands "^1.2.0" + redis-parser "^2.4.0" + + ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" + integrity sha1-v/OFQ+64mEglB5/zoqjmy9RngbM= + + is-accessor-descriptor@^0.1.6: + version "0.1.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" + integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= + dependencies: + kind-of "^3.0.2" + + is-accessor-descriptor@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" + integrity sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY= + dependencies: + kind-of "^6.0.0" + + is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= + + is-bigint@^1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" + integrity sha1-aSMFHfy8dkJ4VAuc4OazITql68I= + + is-binary-path@^1.0.0: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" + integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= + dependencies: + binary-extensions "^1.0.0" + + is-boolean-object@^1.1.0: + version "1.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" + integrity sha1-4qqtOjqPyjTCj27uE1sVbtJYf/A= + dependencies: + call-bind "^1.0.0" + + is-buffer@^1.1.5, is-buffer@~1.1.6: + version "1.1.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + integrity sha1-76ouqdqg16suoTqXsritUf776L4= + + is-callable@^1.1.4, is-callable@^1.2.3: + version "1.2.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" + integrity sha1-ix4FALc6HXbHBIdjbzaOUZ3o244= + + is-ci@^1.0.10: + version "1.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" + integrity sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw= + dependencies: + ci-info "^1.5.0" + + is-core-module@^2.2.0: + version "2.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" + integrity sha1-lwN+89UiJNhRY/VZeytj2a/tmBo= + dependencies: + has "^1.0.3" + + is-data-descriptor@^0.1.4: + version "0.1.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" + integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= + dependencies: + kind-of "^3.0.2" + + is-data-descriptor@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" + integrity sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc= + dependencies: + kind-of "^6.0.0" + + is-date-object@^1.0.1: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" + integrity sha1-vac28s2P0G0yhE53Q7+nSUw7/X4= + + is-descriptor@^0.1.0: + version "0.1.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" + integrity sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco= + dependencies: + is-accessor-descriptor "^0.1.6" + is-data-descriptor "^0.1.4" + kind-of "^5.0.0" + + is-descriptor@^1.0.0, is-descriptor@^1.0.2: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" + integrity sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw= + dependencies: + is-accessor-descriptor "^1.0.0" + is-data-descriptor "^1.0.0" + kind-of "^6.0.2" + + is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= + + is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= + dependencies: + is-primitive "^2.0.0" + + is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= + + is-extendable@^1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" + integrity sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ= + dependencies: + is-plain-object "^2.0.4" + + is-extglob@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= + + is-extglob@^2.1.0, is-extglob@^2.1.1: + version "2.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= + + is-finite@^1.0.0: + version "1.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" + integrity sha1-kEE1x3+0LAZB1qobzbxNqo2ggvM= + + is-fullwidth-code-point@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" + integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= + dependencies: + number-is-nan "^1.0.0" + + is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= + + is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= + dependencies: + is-extglob "^1.0.0" + + is-glob@^3.1.0: + version "3.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= + dependencies: + is-extglob "^2.1.0" + + is-glob@^4.0.0: + version "4.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" + integrity sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw= + dependencies: + is-extglob "^2.1.1" + + is-installed-globally@^0.1.0: + version "0.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" + integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= + dependencies: + global-dirs "^0.1.0" + is-path-inside "^1.0.0" + + is-my-ip-valid@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" + integrity sha1-ezUbjo7dTTmV1NBmaA5mTZRpaCQ= + + is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: + version "2.20.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-my-json-valid/-/is-my-json-valid-2.20.5.tgz#5eca6a8232a687f68869b7361be1612e7512e5df" + integrity sha1-XspqgjKmh/aIabc2G+FhLnUS5d8= + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + is-my-ip-valid "^1.0.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + + is-negative-zero@^2.0.1: + version "2.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" + integrity sha1-PedGwY3aIxkkGlNnWQjY92bxHCQ= + + is-npm@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" + integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= + + is-number-object@^1.0.4: + version "1.0.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" + integrity sha1-NqyV50HPGLKD/B3fXoPaeY4+wZc= + + is-number@^2.1.0: + version "2.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= + dependencies: + kind-of "^3.0.2" + + is-number@^3.0.0: + version "3.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= + dependencies: + kind-of "^3.0.2" + + is-number@^4.0.0: + version "4.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" + integrity sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8= + + is-obj@^1.0.0: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= + + is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= + dependencies: + path-is-inside "^1.0.1" + + is-plain-object@^2.0.3, is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc= + dependencies: + isobject "^3.0.1" + + is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= + + is-primitive@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= + + is-property@^1.0.0, is-property@^1.0.2: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ= + + is-redirect@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" + integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= + + is-regex@^1.1.2: + version "1.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" + integrity sha1-gcjr3k2xQvLPHFP8htakV4gmYlE= + dependencies: + call-bind "^1.0.2" + has-symbols "^1.0.1" + + is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + integrity sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg= + + is-retry-allowed@^1.0.0: + version "1.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" + integrity sha1-13hIi9CkZmo76KFIK58rqv7eqLQ= + + is-stream@^1.0.0, is-stream@^1.1.0: + version "1.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= + + is-string@^1.0.5: + version "1.0.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" + integrity sha1-QEk+0ZjvP/R3uMf5L2ROyCpc06Y= + + is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" + integrity sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc= + dependencies: + has-symbols "^1.0.1" + + is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= + + is-utf8@^0.2.0: + version "0.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= + + is-windows@^1.0.2: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0= + + isarray@0.0.1: + version "0.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= + + isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= + + isexe@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= + + isobject@^2.0.0: + version "2.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= + dependencies: + isarray "1.0.0" + + isobject@^3.0.0, isobject@^3.0.1: + version "3.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= + + isstream@0.1.x, isstream@~0.1.2: + version "0.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= + + istanbul-coveralls@^1.0.3: + version "1.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/istanbul-coveralls/-/istanbul-coveralls-1.0.3.tgz#4f1c1592be104d591f933cbf9c0f2f5284adcf00" + integrity sha1-TxwVkr4QTVkfkzy/nA8vUoStzwA= + dependencies: + chalk "^1.0.0" + coveralls "^2.11.2" + minimist "^1.1.1" + rimraf "^2.3.4" + sum-up "^1.0.1" + + istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.1: + version "1.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" + integrity sha1-zPftzQoLubj3Kf7rCTBHD5r2ZPA= + + istanbul-lib-hook@^1.1.0: + version "1.2.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86" + integrity sha1-vGvwfxKmQfvxyFOR0Nqo8K6mv4Y= + dependencies: + append-transform "^0.4.0" + + istanbul-lib-instrument@^1.10.0: + version "1.10.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" + integrity sha1-H1XtEKw8R/K93dUweTUSZ1TQqco= + dependencies: + babel-generator "^6.18.0" + babel-template "^6.16.0" + babel-traverse "^6.18.0" + babel-types "^6.18.0" + babylon "^6.18.0" + istanbul-lib-coverage "^1.2.1" + semver "^5.3.0" + + istanbul-lib-report@^1.1.3: + version "1.1.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c" + integrity sha1-8qZX/GKC+WFwqvKB6zCkWPf0Fww= + dependencies: + istanbul-lib-coverage "^1.2.1" + mkdirp "^0.5.1" + path-parse "^1.0.5" + supports-color "^3.1.2" + + istanbul-lib-source-maps@^1.2.3: + version "1.2.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f" + integrity sha1-N7n/ZhWA+PyhEjJ1LuQuCMZnXY8= + dependencies: + debug "^3.1.0" + istanbul-lib-coverage "^1.2.1" + mkdirp "^0.5.1" + rimraf "^2.6.1" + source-map "^0.5.3" + + istanbul-reports@^1.4.0: + version "1.5.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a" + integrity sha1-l+Tb87UV6MSEyuoV1lJO69P/Tho= + dependencies: + handlebars "^4.0.3" + + istanbul@^0.4.5: + version "0.4.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" + integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= + dependencies: + abbrev "1.0.x" + async "1.x" + escodegen "1.8.x" + esprima "2.7.x" + glob "^5.0.15" + handlebars "^4.0.1" + js-yaml "3.x" + mkdirp "0.5.x" + nopt "3.x" + once "1.x" + resolve "1.1.x" + supports-color "^3.1.0" + which "^1.1.1" + wordwrap "^1.0.0" + + jaeger-client@^3.18.0: + version "3.18.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/jaeger-client/-/jaeger-client-3.18.1.tgz#a8c7a778244ba117f4fb8775eb6aa5508703564e" + integrity sha1-qMeneCRLoRf0+4d162qlUIcDVk4= + dependencies: + node-int64 "^0.4.0" + opentracing "^0.14.4" + thriftrw "^3.5.0" + uuid "^3.2.1" + xorshift "^0.2.0" + + "js-tokens@^3.0.0 || ^4.0.0": + version "4.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha1-GSA/tZmR35jjoocFDUZHzerzJJk= + + js-tokens@^3.0.2: + version "3.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= + + js-yaml@3.6.1: + version "3.6.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" + integrity sha1-bl/mfYsgXOTSL60Ft3geja3MSzA= + dependencies: + argparse "^1.0.7" + esprima "^2.6.0" + + js-yaml@3.x, js-yaml@^3.5.1: + version "3.14.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha1-2ugS/bOCX6MGYJqHFzg8UMNqBTc= + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + + jsbn@~0.1.0: + version "0.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= + + jsesc@^1.3.0: + version "1.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" + integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= + + json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA= + + json-schema@0.2.3: + version "0.2.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= + + json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= + dependencies: + jsonify "~0.0.0" + + json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= + + json3@3.3.2: + version "3.3.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" + integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= + + jsonify@~0.0.0: + version "0.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= + + jsonpointer@^4.0.0: + version "4.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/jsonpointer/-/jsonpointer-4.1.0.tgz#501fb89986a2389765ba09e6053299ceb4f2c2cc" + integrity sha1-UB+4mYaiOJdlugnmBTKZzrTywsw= + + jsonschema@^1.1.0: + version "1.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2" + integrity sha1-Gvo0xLwiGQ2OQicewXrIs0BPh7I= + + jsprim@^1.2.2: + version "1.4.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + + jsx-ast-utils@^1.0.0, jsx-ast-utils@^1.3.4: + version "1.4.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" + integrity sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE= + + just-extend@^4.0.2: + version "4.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" + integrity sha1-715Ymvth5dZrJOynSUCaiTmox0Q= + + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: + version "3.2.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= + dependencies: + is-buffer "^1.1.5" + + kind-of@^4.0.0: + version "4.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= + dependencies: + is-buffer "^1.1.5" + + kind-of@^5.0.0: + version "5.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" + integrity sha1-cpyR4thXt6QZofmqZWhcTDP1hF0= + + kind-of@^6.0.0, kind-of@^6.0.2: + version "6.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0= + + latest-version@^3.0.0: + version "3.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" + integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= + dependencies: + package-json "^4.0.0" + + lcid@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" + integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= + dependencies: + invert-kv "^1.0.0" + + lcov-parse@0.0.10: + version "0.0.10" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" + integrity sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM= + + levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + + load-json-file@^1.0.0: + version "1.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + + locate-path@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + + lodash._baseassign@^3.0.0: + version "3.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" + integrity sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4= + dependencies: + lodash._basecopy "^3.0.0" + lodash.keys "^3.0.0" + + lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= + + lodash._basecreate@^3.0.0: + version "3.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" + integrity sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE= + + lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= + + lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= + + lodash.assign@^4.2.0: + version "4.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" + integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= + + lodash.bind@^4.2.1: + version "4.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" + integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= + + lodash.clone@^4.5.0: + version "4.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" + integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= + + lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= + + lodash.cond@^4.3.0: + version "4.5.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" + integrity sha1-9HGh2khr5g9quVXRcRVSPdHSVdU= + + lodash.create@3.1.1: + version "3.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" + integrity sha1-1/KEnw29p+BGgruM1yqwIkYd6+c= + dependencies: + lodash._baseassign "^3.0.0" + lodash._basecreate "^3.0.0" + lodash._isiterateecall "^3.0.0" + + lodash.defaults@^4.2.0: + version "4.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" + integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= + + lodash.difference@^4.5.0: + version "4.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" + integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= + + lodash.endswith@^4.0.1: + version "4.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" + integrity sha1-/tWawXOO0+I27dcGTsRWRIs3vAk= + + lodash.find@^4.3.0: + version "4.6.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" + integrity sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E= + + lodash.findindex@^4.3.0: + version "4.6.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.findindex/-/lodash.findindex-4.6.0.tgz#a3245dee61fb9b6e0624b535125624bb69c11106" + integrity sha1-oyRd7mH7m24GJLU1ElYku2nBEQY= + + lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" + integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= + + lodash.foreach@^4.5.0: + version "4.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" + integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= + + lodash.get@^4.4.2: + version "4.4.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= + + lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= + + lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= + + lodash.isempty@^4.4.0: + version "4.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" + integrity sha1-b4bL7di+TsmHvpqvM8loTbGzHn4= + + lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + + lodash.keys@^4.2.0: + version "4.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.keys/-/lodash.keys-4.2.0.tgz#a08602ac12e4fb83f91fc1fb7a360a4d9ba35205" + integrity sha1-oIYCrBLk+4P5H8H7ejYKTZujUgU= + + lodash.noop@^3.0.1: + version "3.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.noop/-/lodash.noop-3.0.1.tgz#38188f4d650a3a474258439b96ec45b32617133c" + integrity sha1-OBiPTWUKOkdCWEObluxFsyYXEzw= + + lodash.partial@^4.2.1: + version "4.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.partial/-/lodash.partial-4.2.1.tgz#49f3d8cfdaa3bff8b3a91d127e923245418961d4" + integrity sha1-SfPYz9qjv/izqR0SfpIyRUGJYdQ= + + lodash.pick@^4.4.0: + version "4.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" + integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= + + lodash.sample@^4.2.1: + version "4.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.sample/-/lodash.sample-4.2.1.tgz#5e4291b0c753fa1abeb0aab8fb29df1b66f07f6d" + integrity sha1-XkKRsMdT+hq+sKq4+ynfG2bwf20= + + lodash.shuffle@^4.2.0: + version "4.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.shuffle/-/lodash.shuffle-4.2.0.tgz#145b5053cf875f6f5c2a33f48b6e9948c6ec7b4b" + integrity sha1-FFtQU8+HX29cKjP0i26ZSMbse0s= + + lodash.values@^4.3.0: + version "4.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" + integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= + + lodash@^4.0.0, lodash@^4.16.2, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.3.0: + version "4.17.21" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw= + + log-driver@1.2.5: + version "1.2.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" + integrity sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY= + + lolex@^2.2.0: + version "2.7.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" + integrity sha1-ETAB1Wv8fgLVbjYpHMXEE9GqBzM= + + lolex@^5.0.1: + version "5.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" + integrity sha1-lTaU0JjOfAe8XtbQ5CvGwMbVo2c= + dependencies: + "@sinonjs/commons" "^1.7.0" + + long@^2.4.0: + version "2.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/long/-/long-2.4.0.tgz#9fa180bb1d9500cdc29c4156766a1995e1f4524f" + integrity sha1-n6GAux2VAM3CnEFWdmoZleH0Uk8= + + loose-envify@^1.0.0: + version "1.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8= + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + + lowercase-keys@^1.0.0: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" + integrity sha1-b54wtHCE2XGnyCD/FabFFnt0wm8= + + lru-cache@^4.0.1: + version "4.1.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80= + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + + make-dir@^1.0.0: + version "1.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" + integrity sha1-ecEDO4BRW9bSTsmTPoYMp17ifww= + dependencies: + pify "^3.0.0" + + map-cache@^0.2.2: + version "0.2.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" + integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= + + map-visit@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" + integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= + dependencies: + object-visit "^1.0.0" + + math-random@^1.0.1: + version "1.0.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" + integrity sha1-XdaUPJOFSCZwFtTjTwV1gwgMUUw= + + md5-hex@^1.2.0: + version "1.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" + integrity sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ= + dependencies: + md5-o-matic "^0.1.1" + + md5-o-matic@^0.1.1: + version "0.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" + integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= + + md5@^2.2.1: + version "2.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" + integrity sha1-w9qaaq46MLRreww0m4exENw72k8= + dependencies: + charenc "0.0.2" + crypt "0.0.2" + is-buffer "~1.1.6" + + media-typer@0.3.0: + version "0.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" + integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= + + mem@^1.1.0: + version "1.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= + dependencies: + mimic-fn "^1.0.0" + + merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" + integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= + + merge-source-map@^1.1.0: + version "1.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" + integrity sha1-L93n5gIJOfcJBqaPLXrmheTIxkY= + dependencies: + source-map "^0.6.1" + + methods@1.x, methods@^1.1.1, methods@~1.1.2: + version "1.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" + integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= + + micromatch@^2.3.11: + version "2.3.11" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= + dependencies: + arr-diff "^2.0.0" + array-unique "^0.2.1" + braces "^1.8.2" + expand-brackets "^0.1.4" + extglob "^0.3.1" + filename-regex "^2.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.1" + kind-of "^3.0.2" + normalize-path "^2.0.1" + object.omit "^2.0.0" + parse-glob "^3.0.4" + regex-cache "^0.4.2" + + micromatch@^3.1.10, micromatch@^3.1.4: + version "3.1.10" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" + integrity sha1-cIWbyVyYQJUvNZoGij/En57PrCM= + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + braces "^2.3.1" + define-property "^2.0.2" + extend-shallow "^3.0.2" + extglob "^2.0.4" + fragment-cache "^0.2.1" + kind-of "^6.0.2" + nanomatch "^1.2.9" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.2" + + mime-db@1.47.0: + version "1.47.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" + integrity sha1-jLMT5Zll08Bc+/iYkVomevRqM1w= + + mime-types@^2.1.10, mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.7: + version "2.1.30" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" + integrity sha1-bnvotMR5gl+F7WMmaV23P5MF1i0= + dependencies: + mime-db "1.47.0" + + mime@1.6.0, mime@^1.3.4: + version "1.6.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + integrity sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE= + + mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + integrity sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI= + + "minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: + version "3.0.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM= + dependencies: + brace-expansion "^1.1.7" + + minimist@0.0.8: + version "0.0.8" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= + + minimist@1.2.0: + version "1.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= + + minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: + version "1.2.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" + integrity sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI= + + mixin-deep@^1.2.0: + version "1.3.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" + integrity sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY= + dependencies: + for-in "^1.0.2" + is-extendable "^1.0.1" + + mkdirp@0.5.1: + version "0.5.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= + dependencies: + minimist "0.0.8" + + mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" + integrity sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8= + dependencies: + minimist "^1.2.5" + + mocha@^3.0.2: + version "3.5.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" + integrity sha1-HgSA/jbS2lhY0etqzDhBiybqog0= + dependencies: + browser-stdout "1.3.0" + commander "2.9.0" + debug "2.6.8" + diff "3.2.0" + escape-string-regexp "1.0.5" + glob "7.1.1" + growl "1.9.2" + he "1.1.1" + json3 "3.3.2" + lodash.create "3.1.1" + mkdirp "0.5.1" + supports-color "3.1.2" + + morgan@^1.7.0: + version "1.10.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" + integrity sha1-CRd4q8H8R801CYJGU9rh+qtrF9c= + dependencies: + basic-auth "~2.0.1" + debug "2.6.9" + depd "~2.0.0" + on-finished "~2.3.0" + on-headers "~1.0.2" + + ms@2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" + integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= + + ms@2.1.1: + version "2.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + integrity sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo= + + ms@^2.1.1: + version "2.1.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha1-V0yBOM4dK1hh8LRFedut1gxmFbI= + + mustache@^2.2.1: + version "2.3.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5" + integrity sha1-ptTZw/kdEzWauImoEpVPkjCj0MU= + + mute-stream@0.0.5: + version "0.0.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" + integrity sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA= + + nan@^2.12.1: + version "2.14.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" + integrity sha1-9TdkAGlRaPTMaUrJOT0MlYXu6hk= + + nanomatch@^1.2.9: + version "1.2.13" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" + integrity sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk= + dependencies: + arr-diff "^4.0.0" + array-unique "^0.3.2" + define-property "^2.0.2" + extend-shallow "^3.0.2" + fragment-cache "^0.2.1" + is-windows "^1.0.2" + kind-of "^6.0.2" + object.pick "^1.3.0" + regex-not "^1.0.0" + snapdragon "^0.8.1" + to-regex "^3.0.1" + + natural-compare@^1.4.0: + version "1.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= + + negotiator@0.6.2: + version "0.6.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" + integrity sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs= + + neo-async@^2.6.0: + version "2.6.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha1-tKr7k+OustgXTKU88WOrfXMIMF8= + + next-tick@~1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= + + nise@^1.2.0: + version "1.5.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/nise/-/nise-1.5.3.tgz#9d2cfe37d44f57317766c6e9408a359c5d3ac1f7" + integrity sha1-nSz+N9RPVzF3ZsbpQIo1nF06wfc= + dependencies: + "@sinonjs/formatio" "^3.2.1" + "@sinonjs/text-encoding" "^0.7.1" + just-extend "^4.0.2" + lolex "^5.0.1" + path-to-regexp "^1.7.0" + + node-fetch@^2.6.0: + version "2.6.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha1-BFvTI2Mfdu0uK1VXM5RBa2OaAFI= + + node-int64@^0.4.0: + version "0.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" + integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= + + nodemon@^1.10.2: + version "1.19.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/nodemon/-/nodemon-1.19.4.tgz#56db5c607408e0fdf8920d2b444819af1aae0971" + integrity sha1-VttcYHQI4P34kg0rREgZrxquCXE= + dependencies: + chokidar "^2.1.8" + debug "^3.2.6" + ignore-by-default "^1.0.1" + minimatch "^3.0.4" + pstree.remy "^1.1.7" + semver "^5.7.1" + supports-color "^5.5.0" + touch "^3.1.0" + undefsafe "^2.0.2" + update-notifier "^2.5.0" + + nopt@3.x: + version "3.0.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" + integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= + dependencies: + abbrev "1" + + nopt@~1.0.10: + version "1.0.10" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" + integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= + dependencies: + abbrev "1" + + normalize-package-data@^2.3.2: + version "2.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" + integrity sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg= + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + + normalize-path@^2.0.1, normalize-path@^2.1.1: + version "2.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= + dependencies: + remove-trailing-separator "^1.0.1" + + normalize-path@^3.0.0: + version "3.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU= + + npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= + dependencies: + path-key "^2.0.0" + + number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= + + nyc@^11.3.0: + version "11.9.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/nyc/-/nyc-11.9.0.tgz#4106e89e8fbe73623a1fc8b6ecb7abaa271ae1e4" + integrity sha1-QQbono++c2I6H8i27Lerqica4eQ= + dependencies: + archy "^1.0.0" + arrify "^1.0.1" + caching-transform "^1.0.0" + convert-source-map "^1.5.1" + debug-log "^1.0.1" + default-require-extensions "^1.0.0" + find-cache-dir "^0.1.1" + find-up "^2.1.0" + foreground-child "^1.5.3" + glob "^7.0.6" + istanbul-lib-coverage "^1.1.2" + istanbul-lib-hook "^1.1.0" + istanbul-lib-instrument "^1.10.0" + istanbul-lib-report "^1.1.3" + istanbul-lib-source-maps "^1.2.3" + istanbul-reports "^1.4.0" + md5-hex "^1.2.0" + merge-source-map "^1.1.0" + micromatch "^3.1.10" + mkdirp "^0.5.0" + resolve-from "^2.0.0" + rimraf "^2.6.2" + signal-exit "^3.0.1" + spawn-wrap "^1.4.2" + test-exclude "^4.2.0" + yargs "11.1.0" + yargs-parser "^8.0.0" + + oauth-sign@~0.8.1: + version "0.8.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= + + oauth-sign@~0.9.0: + version "0.9.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" + integrity sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU= + + object-assign@^4.0.1, object-assign@^4.1.0: + version "4.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= + + object-copy@^0.1.0: + version "0.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" + integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= + dependencies: + copy-descriptor "^0.1.0" + define-property "^0.2.5" + kind-of "^3.0.3" + + object-inspect@^1.9.0: + version "1.10.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/object-inspect/-/object-inspect-1.10.2.tgz#b6385a3e2b7cae0b5eafcf90cddf85d128767f30" + integrity sha1-tjhaPit8rgter8+Qzd+F0Sh2fzA= + + object-keys@^1.0.12, object-keys@^1.1.1: + version "1.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" + integrity sha1-HEfyct8nfzsdrwYWd9nILiMixg4= + + object-visit@^1.0.0: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" + integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= + dependencies: + isobject "^3.0.0" + + object.assign@^4.0.4, object.assign@^4.1.2: + version "4.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" + integrity sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA= + dependencies: + call-bind "^1.0.0" + define-properties "^1.1.3" + has-symbols "^1.0.1" + object-keys "^1.1.1" + + object.omit@^2.0.0: + version "2.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + + object.pick@^1.3.0: + version "1.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" + integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= + dependencies: + isobject "^3.0.1" + + on-finished@~2.3.0: + version "2.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" + integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= + dependencies: + ee-first "1.1.1" + + on-headers@~1.0.2: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" + integrity sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8= + + once@1.x, once@^1.3.0, once@^1.4.0: + version "1.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= + dependencies: + wrappy "1" + + onetime@^1.0.0: + version "1.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" + integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= + + opentracing@^0.14.0, opentracing@^0.14.3, opentracing@^0.14.4: + version "0.14.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/opentracing/-/opentracing-0.14.5.tgz#891fa92cd90a24e64f99bc964370227310926c85" + integrity sha1-iR+pLNkKJOZPmbyWQ3AicxCSbIU= + + optionator@^0.8.1, optionator@^0.8.2: + version "0.8.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" + integrity sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU= + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.6" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + word-wrap "~1.2.3" + + os-homedir@^1.0.0, os-homedir@^1.0.1: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" + integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= + + os-locale@^2.0.0: + version "2.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + integrity sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I= + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + + p-finally@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= + + p-limit@^1.1.0: + version "1.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + integrity sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg= + dependencies: + p-try "^1.0.0" + + p-locate@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= + dependencies: + p-limit "^1.1.0" + + p-try@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= + + package-json@^4.0.0: + version "4.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" + integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= + dependencies: + got "^6.7.1" + registry-auth-token "^3.0.1" + registry-url "^3.0.3" + semver "^5.1.0" + + parse-glob@^3.0.4: + version "3.0.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + + parse-json@^2.2.0: + version "2.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= + dependencies: + error-ex "^1.2.0" + + parseurl@~1.3.3: + version "1.3.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" + integrity sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ= + + pascalcase@^0.1.1: + version "0.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" + integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= + + path-dirname@^1.0.0: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= + + path-exists@^2.0.0: + version "2.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= + dependencies: + pinkie-promise "^2.0.0" + + path-exists@^3.0.0: + version "3.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= + + path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= + + path-is-inside@^1.0.1: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" + integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= + + path-key@^2.0.0: + version "2.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= + + path-parse@^1.0.5, path-parse@^1.0.6: + version "1.0.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" + integrity sha1-1i27VnlAXXLEc37FhgDp3c8G0kw= + + path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" + integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= + + path-to-regexp@^1.7.0: + version "1.8.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" + integrity sha1-iHs7qdhDk+h6CgufTLdWGYtTVIo= + dependencies: + isarray "0.0.1" + + path-type@^1.0.0: + version "1.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + + performance-now@^2.1.0: + version "2.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= + + pify@^2.0.0: + version "2.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= + + pify@^3.0.0: + version "3.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" + integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= + + pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= + dependencies: + pinkie "^2.0.0" + + pinkie@^2.0.0: + version "2.0.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= + + pkg-dir@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" + integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= + dependencies: + find-up "^1.0.0" + + pkg-up@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" + integrity sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY= + dependencies: + find-up "^1.0.0" + + pluralize@^1.2.1: + version "1.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" + integrity sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU= + + posix-character-classes@^0.1.0: + version "0.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" + integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= + + prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= + + prepend-http@^1.0.1: + version "1.0.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" + integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= + + preserve@^0.2.0: + version "0.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= + + process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" + integrity sha1-eCDZsWEgzFXKmud5JoCufbptf+I= + + process@^0.10.0: + version "0.10.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/process/-/process-0.10.1.tgz#842457cc51cfed72dc775afeeafb8c6034372725" + integrity sha1-hCRXzFHP7XLcd1r+6vuMYDQ3JyU= + + progress@^1.1.8: + version "1.1.8" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" + integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74= + + prom-client@^11.5.3: + version "11.5.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/prom-client/-/prom-client-11.5.3.tgz#5fedfce1083bac6c2b223738e966d0e1643756f8" + integrity sha1-X+384Qg7rGwrIjc46WbQ4WQ3Vvg= + dependencies: + tdigest "^0.1.1" + + proxy-addr@~2.0.5: + version "2.0.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" + integrity sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8= + dependencies: + forwarded "~0.1.2" + ipaddr.js "1.9.1" + + pseudomap@^1.0.2: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= + + psl@^1.1.28: + version "1.8.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" + integrity sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ= + + pstree.remy@^1.1.7: + version "1.1.8" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" + integrity sha1-wkIiT0pnwh9oaDm720rCgrg3PTo= + + punycode@^1.4.1: + version "1.4.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= + + punycode@^2.1.0, punycode@^2.1.1: + version "2.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" + integrity sha1-tYsBCsQMIsVldhbI0sLALHv0eew= + + qs@6.7.0: + version "6.7.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" + integrity sha1-QdwaAV49WB8WIXdr4xr7KHapsbw= + + qs@^6.1.0: + version "6.10.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" + integrity sha1-STFIL6jWR6Wqt5nFJx0hM7mB+2o= + dependencies: + side-channel "^1.0.4" + + qs@~6.3.0: + version "6.3.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" + integrity sha1-51vV9uJoEioqDgvaYwslUMFmUCw= + + qs@~6.5.2: + version "6.5.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" + integrity sha1-yzroBuh0BERYTvFUzo7pjUA/PjY= + + randomatic@^3.0.0: + version "3.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" + integrity sha1-t3bvxZN1mE42xTey9RofCv8Noe0= + dependencies: + is-number "^4.0.0" + kind-of "^6.0.0" + math-random "^1.0.1" + + range-parser@~1.2.1: + version "1.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" + integrity sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE= + + raven@^2.2.1: + version "2.6.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/raven/-/raven-2.6.4.tgz#458d4a380c8fbb59e0150c655625aaf60c167ea3" + integrity sha1-RY1KOAyPu1ngFQxlViWq9gwWfqM= + dependencies: + cookie "0.3.1" + md5 "^2.2.1" + stack-trace "0.0.10" + timed-out "4.0.1" + uuid "3.3.2" + + raw-body@2.4.0: + version "2.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" + integrity sha1-oc5vucm8NWylLoklarWQWeE9AzI= + dependencies: + bytes "3.1.0" + http-errors "1.7.2" + iconv-lite "0.4.24" + unpipe "1.0.0" + + rc@^1.0.1, rc@^1.1.6: + version "1.2.8" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + integrity sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0= + dependencies: + deep-extend "^0.6.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + + read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + + read-pkg@^1.0.0: + version "1.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + + readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.2.2: + version "2.3.7" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" + integrity sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c= + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + + readdirp@^2.2.1: + version "2.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" + integrity sha1-DodiKjMlqjPokihcr4tOhGUppSU= + dependencies: + graceful-fs "^4.1.11" + micromatch "^3.1.10" + readable-stream "^2.0.2" + + readline2@^1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" + integrity sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + mute-stream "0.0.5" + + rechoir@^0.6.2: + version "0.6.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= + dependencies: + resolve "^1.1.6" + + redis-commands@^1.2.0: + version "1.7.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/redis-commands/-/redis-commands-1.7.0.tgz#15a6fea2d58281e27b1cd1acfb4b293e278c3a89" + integrity sha1-Fab+otWCgeJ7HNGs+0spPieMOok= + + redis-parser@^2.4.0: + version "2.6.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b" + integrity sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs= + + regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + integrity sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk= + + regex-cache@^0.4.2: + version "0.4.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + integrity sha1-db3FiioUls7EihKDW8VMjVYjNt0= + dependencies: + is-equal-shallow "^0.1.3" + + regex-not@^1.0.0, regex-not@^1.0.2: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" + integrity sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw= + dependencies: + extend-shallow "^3.0.2" + safe-regex "^1.1.0" + + registry-auth-token@^3.0.1: + version "3.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" + integrity sha1-10RoFUM/XV7WQxzV3KIQSPZrOX4= + dependencies: + rc "^1.1.6" + safe-buffer "^5.0.1" + + registry-url@^3.0.3: + version "3.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" + integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= + dependencies: + rc "^1.0.1" + + remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= + + repeat-element@^1.1.2: + version "1.1.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha1-vmgVIIR6tYx1aKx1+/rSjtQtOek= + + repeat-string@^1.5.2, repeat-string@^1.6.1: + version "1.6.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= + + repeating@^2.0.0: + version "2.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= + dependencies: + is-finite "^1.0.0" + + request@2.79.0: + version "2.79.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" + integrity sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4= + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + uuid "^3.0.0" + + request@^2.81.0: + version "2.88.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" + integrity sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM= + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.8.0" + caseless "~0.12.0" + combined-stream "~1.0.6" + extend "~3.0.2" + forever-agent "~0.6.1" + form-data "~2.3.2" + har-validator "~5.1.3" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.19" + oauth-sign "~0.9.0" + performance-now "^2.1.0" + qs "~6.5.2" + safe-buffer "^5.1.2" + tough-cookie "~2.5.0" + tunnel-agent "^0.6.0" + uuid "^3.3.2" + + require-directory@^2.1.1: + version "2.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= + + require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= + + require-uncached@^1.0.2: + version "1.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + + requires-port@0.x.x: + version "0.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/requires-port/-/requires-port-0.0.1.tgz#4b4414411d9df7c855995dd899a8c78a2951c16d" + integrity sha1-S0QUQR2d98hVmV3YmajHiilRwW0= + + resolve-from@^1.0.0: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= + + resolve-from@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" + integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= + + resolve-url@^0.2.1: + version "0.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" + integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= + + resolve@1.1.x: + version "1.1.7" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" + integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= + + resolve@^1.1.6, resolve@^1.10.0: + version "1.20.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" + integrity sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU= + dependencies: + is-core-module "^2.2.0" + path-parse "^1.0.6" + + restore-cursor@^1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" + integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE= + dependencies: + exit-hook "^1.0.0" + onetime "^1.0.0" + + ret@~0.1.10: + version "0.1.15" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" + integrity sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w= + + rimraf@^2.3.4, rimraf@^2.6.1, rimraf@^2.6.2: + version "2.7.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w= + dependencies: + glob "^7.1.3" + + rimraf@~2.6.2: + version "2.6.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" + integrity sha1-stEE/g2Psnz54KHNqCYt04M8bKs= + dependencies: + glob "^7.1.3" + + run-async@^0.1.0: + version "0.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" + integrity sha1-yK1KXhEGYeQCp9IbUw4AnyX444k= + dependencies: + once "^1.3.0" + + rx-lite@^3.1.2: + version "3.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" + integrity sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI= + + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0= + + safe-buffer@^5.0.1, safe-buffer@^5.1.2: + version "5.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= + + safe-regex@^1.1.0: + version "1.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" + integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= + dependencies: + ret "~0.1.10" + + "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: + version "2.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= + + samsam@1.3.0: + version "1.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" + integrity sha1-jR2TUOJWItow3j5EumkrUiGrfFA= + + semver-diff@^2.0.0: + version "2.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" + integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= + dependencies: + semver "^5.0.3" + + "semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.7.1: + version "5.7.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" + integrity sha1-qVT5Ma66UI0we78Gnv8MAclhFvc= + + send@0.17.1: + version "0.17.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" + integrity sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg= + dependencies: + debug "2.6.9" + depd "~1.1.2" + destroy "~1.0.4" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "~1.7.2" + mime "1.6.0" + ms "2.1.1" + on-finished "~2.3.0" + range-parser "~1.2.1" + statuses "~1.5.0" + + serve-static@1.14.1: + version "1.14.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" + integrity sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk= + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.17.1" + + set-blocking@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= + + set-value@^2.0.0, set-value@^2.0.1: + version "2.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" + integrity sha1-oY1AUw5vB95CKMfe/kInr4ytAFs= + dependencies: + extend-shallow "^2.0.1" + is-extendable "^0.1.1" + is-plain-object "^2.0.3" + split-string "^3.0.1" + + setprototypeof@1.1.1: + version "1.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" + integrity sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM= + + shebang-command@^1.2.0: + version "1.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= + dependencies: + shebang-regex "^1.0.0" + + shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= + + shell-quote@~1.4.2: + version "1.4.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/shell-quote/-/shell-quote-1.4.3.tgz#952c44e0b1ed9013ef53958179cc643e8777466b" + integrity sha1-lSxE4LHtkBPvU5WBecxkPod3Rms= + dependencies: + array-filter "~0.0.0" + array-map "~0.0.0" + array-reduce "~0.0.0" + jsonify "~0.0.0" + + shelljs@^0.7.5: + version "0.7.8" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" + integrity sha1-3svPh0sNHl+3LhSxZKloMEjprLM= + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.2" + + side-channel@^1.0.4: + version "1.0.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" + integrity sha1-785cj9wQTudRslxY1CkAEfpeos8= + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + + signal-exit@^3.0.0, signal-exit@^3.0.1, signal-exit@^3.0.2: + version "3.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" + integrity sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw= + + sinon@^4.1.3: + version "4.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/sinon/-/sinon-4.5.0.tgz#427ae312a337d3c516804ce2754e8c0d5028cb04" + integrity sha1-QnrjEqM308UWgEzidU6MDVAoywQ= + dependencies: + "@sinonjs/formatio" "^2.0.0" + diff "^3.1.0" + lodash.get "^4.4.2" + lolex "^2.2.0" + nise "^1.2.0" + supports-color "^5.1.0" + type-detect "^4.0.5" + + slice-ansi@0.0.4: + version "0.0.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" + integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= + + slide@^1.1.5: + version "1.1.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" + integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= + + snapdragon-node@^2.0.1: + version "2.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" + integrity sha1-bBdfhv8UvbByRWPo88GwIaKGhTs= + dependencies: + define-property "^1.0.0" + isobject "^3.0.0" + snapdragon-util "^3.0.1" + + snapdragon-util@^3.0.1: + version "3.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" + integrity sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI= + dependencies: + kind-of "^3.2.0" + + snapdragon@^0.8.1: + version "0.8.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" + integrity sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0= + dependencies: + base "^0.11.1" + debug "^2.2.0" + define-property "^0.2.5" + extend-shallow "^2.0.1" + map-cache "^0.2.2" + source-map "^0.5.6" + source-map-resolve "^0.5.0" + use "^3.1.0" + + sntp@1.x.x: + version "1.0.9" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + integrity sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg= + dependencies: + hoek "2.x.x" + + source-map-resolve@^0.5.0: + version "0.5.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" + integrity sha1-GQhmvs51U+H48mei7oLGBrVQmho= + dependencies: + atob "^2.1.2" + decode-uri-component "^0.2.0" + resolve-url "^0.2.1" + source-map-url "^0.4.0" + urix "^0.1.0" + + source-map-url@^0.4.0: + version "0.4.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" + integrity sha1-CvZmBadFpaL5HPG7+KevvCg97FY= + + source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: + version "0.5.7" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= + + source-map@^0.6.1: + version "0.6.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha1-dHIq8y6WFOnCh6jQu95IteLxomM= + + source-map@~0.2.0: + version "0.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" + integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= + dependencies: + amdefine ">=0.0.4" + + spawn-wrap@^1.4.2: + version "1.4.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/spawn-wrap/-/spawn-wrap-1.4.3.tgz#81b7670e170cca247d80bf5faf0cfb713bdcf848" + integrity sha1-gbdnDhcMyiR9gL9frwz7cTvc+Eg= + dependencies: + foreground-child "^1.5.6" + mkdirp "^0.5.0" + os-homedir "^1.0.1" + rimraf "^2.6.2" + signal-exit "^3.0.2" + which "^1.3.0" + + spdx-correct@^3.0.0: + version "3.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" + integrity sha1-3s6BrJweZxPl99G28X1Gj6U9iak= + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + + spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" + integrity sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0= + + spdx-expression-parse@^3.0.0: + version "3.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" + integrity sha1-z3D1BILu/cmOPOCmgz5KU87rpnk= + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + + spdx-license-ids@^3.0.0: + version "3.0.7" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" + integrity sha1-6cGKQQ5e1+EkQqVJ+9ivp2cDjWU= + + split-string@^3.0.1, split-string@^3.0.2: + version "3.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" + integrity sha1-fLCd2jqGWFcFxks5pkZgOGguj+I= + dependencies: + extend-shallow "^3.0.0" + + sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= + + sshpk@^1.7.0: + version "1.16.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" + integrity sha1-+2YcC+8ps520B2nuOfpwCT1vaHc= + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + bcrypt-pbkdf "^1.0.0" + dashdash "^1.12.0" + ecc-jsbn "~0.1.1" + getpass "^0.1.1" + jsbn "~0.1.0" + safer-buffer "^2.0.2" + tweetnacl "~0.14.0" + + stack-trace@0.0.10, stack-trace@0.0.x: + version "0.0.10" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= + + stack-trace@^0.0.9: + version "0.0.9" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" + integrity sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU= + + static-extend@^0.1.1: + version "0.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" + integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= + dependencies: + define-property "^0.2.5" + object-copy "^0.1.0" + + "statuses@>= 1.5.0 < 2", statuses@~1.5.0: + version "1.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" + integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= + + string-template@~0.2.1: + version "0.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" + integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= + + string-width@^1.0.1: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" + integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= + dependencies: + code-point-at "^1.0.0" + is-fullwidth-code-point "^1.0.0" + strip-ansi "^3.0.0" + + string-width@^2.0.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4= + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + + string.prototype.trimend@^1.0.4: + version "1.0.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" + integrity sha1-51rpDClCxjUEaGwYsoe0oLGkX4A= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + + string.prototype.trimstart@^1.0.4: + version "1.0.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" + integrity sha1-s2OZr0qymZtMnGSL16P7K7Jv7u0= + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + + string_decoder@~1.1.1: + version "1.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + integrity sha1-nPFhG6YmhdcDCunkujQUnDrwP8g= + dependencies: + safe-buffer "~5.1.0" + + stringstream@~0.0.4: + version "0.0.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" + integrity sha1-eIAiWw1K0Q4wkn0Weh1vL9OzOnI= + + strip-ansi@^3.0.0, strip-ansi@^3.0.1: + version "3.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= + dependencies: + ansi-regex "^2.0.0" + + strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= + dependencies: + ansi-regex "^3.0.0" + + strip-bom@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= + dependencies: + is-utf8 "^0.2.0" + + strip-bom@^3.0.0: + version "3.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= + + strip-eof@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= + + strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= + + sum-up@^1.0.1: + version "1.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" + integrity sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4= + dependencies: + chalk "^1.0.0" + + superagent@^2.0.0: + version "2.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/superagent/-/superagent-2.3.0.tgz#703529a0714e57e123959ddefbce193b2e50d115" + integrity sha1-cDUpoHFOV+EjlZ3e+84ZOy5Q0RU= + dependencies: + component-emitter "^1.2.0" + cookiejar "^2.0.6" + debug "^2.2.0" + extend "^3.0.0" + form-data "1.0.0-rc4" + formidable "^1.0.17" + methods "^1.1.1" + mime "^1.3.4" + qs "^6.1.0" + readable-stream "^2.0.5" + + supertest@^2.0.0: + version "2.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/supertest/-/supertest-2.0.1.tgz#a058081d788f1515d4700d7502881e6b759e44cd" + integrity sha1-oFgIHXiPFRXUcA11Aogea3WeRM0= + dependencies: + methods "1.x" + superagent "^2.0.0" + + supports-color@3.1.2: + version "3.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" + integrity sha1-cqJiiU2dQIuVbKBf83su2KbiotU= + dependencies: + has-flag "^1.0.0" + + supports-color@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= + + supports-color@^3.1.0, supports-color@^3.1.2: + version "3.2.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" + integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= + dependencies: + has-flag "^1.0.0" + + supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.5.0: + version "5.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= + dependencies: + has-flag "^3.0.0" + + table@^3.7.8: + version "3.8.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" + integrity sha1-K7xULw/amGGnVdOUf+/Ys/UThV8= + dependencies: + ajv "^4.7.0" + ajv-keywords "^1.0.0" + chalk "^1.1.1" + lodash "^4.0.0" + slice-ansi "0.0.4" + string-width "^2.0.0" + + tdigest@^0.1.1: + version "0.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/tdigest/-/tdigest-0.1.1.tgz#2e3cb2c39ea449e55d1e6cd91117accca4588021" + integrity sha1-Ljyyw56kSeVdHmzZEReszKRYgCE= + dependencies: + bintrees "1.0.1" + + term-size@^1.2.0: + version "1.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= + dependencies: + execa "^0.7.0" + + test-exclude@^4.2.0: + version "4.2.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" + integrity sha1-qaXmRHTkOYM5JFoKdprXwvSpfCA= + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + + text-table@~0.2.0: + version "0.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= + + thriftrw@^3.5.0: + version "3.12.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/thriftrw/-/thriftrw-3.12.0.tgz#30857847755e7f036b2e0a79d11c9f55075539d9" + integrity sha1-MIV4R3VefwNrLgp50RyfVQdVOdk= + dependencies: + bufrw "^1.3.0" + error "7.0.2" + long "^2.4.0" + + through@^2.3.6: + version "2.3.8" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= + + timed-out@4.0.1, timed-out@^4.0.0: + version "4.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" + integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= + + to-fast-properties@^1.0.3: + version "1.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" + integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= + + to-object-path@^0.3.0: + version "0.3.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" + integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= + dependencies: + kind-of "^3.0.2" + + to-regex-range@^2.1.0: + version "2.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" + integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= + dependencies: + is-number "^3.0.0" + repeat-string "^1.6.1" + + to-regex@^3.0.1, to-regex@^3.0.2: + version "3.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" + integrity sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4= + dependencies: + define-property "^2.0.2" + extend-shallow "^3.0.2" + regex-not "^1.0.2" + safe-regex "^1.1.0" + + toidentifier@1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" + integrity sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM= + + touch@^3.1.0: + version "3.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" + integrity sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds= + dependencies: + nopt "~1.0.10" + + tough-cookie@~2.3.0: + version "2.3.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" + integrity sha1-7GDO44rGdQY//JelwYlwV47oNlU= + dependencies: + punycode "^1.4.1" + + tough-cookie@~2.5.0: + version "2.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" + integrity sha1-zZ+yoKodWhK0c72fuW+j3P9lreI= + dependencies: + psl "^1.1.28" + punycode "^2.1.1" + + trim-right@^1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" + integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= + + tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= + dependencies: + safe-buffer "^5.0.1" + + tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + integrity sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us= + + tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= + + type-check@~0.3.2: + version "0.3.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= + dependencies: + prelude-ls "~1.1.2" + + type-detect@0.1.1: + version "0.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" + integrity sha1-C6XsKohWQORw6k6FBZcZANrFiCI= + + type-detect@4.0.8, type-detect@^4.0.5: + version "4.0.8" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" + integrity sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw= + + type-detect@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" + integrity sha1-diIXzAbbJY7EiQihKY6LlRIejqI= + + type-is@~1.6.17, type-is@~1.6.18: + version "1.6.18" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" + integrity sha1-TlUs0F3wlGfcvE73Od6J8s83wTE= + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + + type@^1.0.1: + version "1.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" + integrity sha1-hI3XaY2vo+VKbEeedZxLw/GIR6A= + + type@^2.0.0: + version "2.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" + integrity sha1-Ci54wud5B7JSq+XymMGwHGPw2z0= + + typedarray@^0.0.6: + version "0.0.6" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= + + uglify-js@^3.1.4: + version "3.13.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/uglify-js/-/uglify-js-3.13.4.tgz#592588bb9f47ae03b24916e2471218d914955574" + integrity sha1-WSWIu59HrgOySRbiRxIY2RSVVXQ= + + unbox-primitive@^1.0.0: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" + integrity sha1-CF4hViXsMWJXTciFmr7nilmxRHE= + dependencies: + function-bind "^1.1.1" + has-bigints "^1.0.1" + has-symbols "^1.0.2" + which-boxed-primitive "^1.0.2" + + undefsafe@^2.0.2: + version "2.0.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae" + integrity sha1-axZucJStRjE7IgLafsws18xueq4= + dependencies: + debug "^2.2.0" + + union-value@^1.0.0: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" + integrity sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc= + dependencies: + arr-union "^3.1.0" + get-value "^2.0.6" + is-extendable "^0.1.1" + set-value "^2.0.1" + + unique-string@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" + integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= + dependencies: + crypto-random-string "^1.0.0" + + unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" + integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= + + unset-value@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" + integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= + dependencies: + has-value "^0.3.1" + isobject "^3.0.0" + + unzip-response@^2.0.1: + version "2.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" + integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= + + upath@^1.1.1: + version "1.2.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" + integrity sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ= + + update-notifier@^2.5.0: + version "2.5.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" + integrity sha1-0HRFk+E/Fh5AassdlAi3LK0Ir/Y= + dependencies: + boxen "^1.2.1" + chalk "^2.0.1" + configstore "^3.0.0" + import-lazy "^2.1.0" + is-ci "^1.0.10" + is-installed-globally "^0.1.0" + is-npm "^1.0.0" + latest-version "^3.0.0" + semver-diff "^2.0.0" + xdg-basedir "^3.0.0" + + uri-js@^4.2.2: + version "4.4.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34= + dependencies: + punycode "^2.1.0" + + urix@^0.1.0: + version "0.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" + integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= + + url-parse-lax@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" + integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= + dependencies: + prepend-http "^1.0.1" + + use@^3.1.0: + version "3.1.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" + integrity sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8= + + user-home@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" + integrity sha1-nHC/2Babwdy/SGBODwS4tJzenp8= + dependencies: + os-homedir "^1.0.0" + + util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= + + utils-merge@1.0.1: + version "1.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" + integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= + + uuid@3.3.2: + version "3.3.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" + integrity sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE= + + uuid@^3.0.0, uuid@^3.0.1, uuid@^3.2.1, uuid@^3.3.2: + version "3.4.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" + integrity sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4= + + validate-npm-package-license@^3.0.1: + version "3.0.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" + integrity sha1-/JH2uce6FchX9MssXe/uw51PQQo= + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + + vary@~1.1.2: + version "1.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" + integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= + + verror@1.10.0: + version "1.10.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + + which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" + integrity sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY= + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + + which-module@^2.0.0: + version "2.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= + + which@^1.1.1, which@^1.2.9, which@^1.3.0: + version "1.3.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo= + dependencies: + isexe "^2.0.0" + + widest-line@^2.0.0: + version "2.0.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha1-dDh2RzDsfvQ4HOTfgvuYpTFCo/w= + dependencies: + string-width "^2.1.1" + + winston@^2.2.0: + version "2.4.5" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/winston/-/winston-2.4.5.tgz#f2e431d56154c4ea765545fc1003bd340c95b59a" + integrity sha1-8uQx1WFUxOp2VUX8EAO9NAyVtZo= + dependencies: + async "~1.0.0" + colors "1.0.x" + cycle "1.0.x" + eyes "0.1.x" + isstream "0.1.x" + stack-trace "0.0.x" + + word-wrap@~1.2.3: + version "1.2.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" + integrity sha1-YQY29rH3A4kb00dxzLF/uTtHB5w= + + wordwrap@^1.0.0: + version "1.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= + + wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + + wrappy@1: + version "1.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= + + write-file-atomic@^1.1.4: + version "1.3.4" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" + integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8= + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + slide "^1.1.5" + + write-file-atomic@^2.0.0: + version "2.4.3" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" + integrity sha1-H9Lprh3z51uNjDZ0Q8aS1MqB9IE= + dependencies: + graceful-fs "^4.1.11" + imurmurhash "^0.1.4" + signal-exit "^3.0.2" + + write@^0.2.1: + version "0.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= + dependencies: + mkdirp "^0.5.1" + + xdg-basedir@^3.0.0: + version "3.0.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" + integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= + + xorshift@^0.2.0: + version "0.2.1" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/xorshift/-/xorshift-0.2.1.tgz#fcd82267e9351c13f0fb9c73307f25331d29c63a" + integrity sha1-/NgiZ+k1HBPw+5xzMH8lMx0pxjo= + + xtend@^4.0.0, xtend@~4.0.0: + version "4.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" + integrity sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q= + + y18n@^3.2.1: + version "3.2.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" + integrity sha1-hckBvWRwznH8S7cjrSCbcPfyhpY= + + yallist@^2.1.2: + version "2.1.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= + + yargs-parser@^8.0.0: + version "8.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + integrity sha1-8TdqM7Ziml0GN4KUTacyYx6WaVA= + dependencies: + camelcase "^4.1.0" + + yargs-parser@^9.0.2: + version "9.0.2" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" + integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= + dependencies: + camelcase "^4.1.0" + + yargs@11.1.0: + version "11.1.0" + resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" + integrity sha1-kLhpk07W6HERXqL/WLA/RyTtLXc= + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^9.0.2" From 15a515497da20a214e80b11d55bfad0d951877f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Sat, 15 May 2021 18:15:09 -0300 Subject: [PATCH 088/126] Calling next fn in express execution pipeline --- lib/http/routers/DebugRouter.js | 3 ++- lib/http/routers/FunctionsRouter.js | 25 +++++++++++++++++-------- lib/http/routers/HealthcheckRouter.js | 3 ++- lib/http/routers/NamespacesRouter.js | 9 ++++++--- lib/http/routers/SchemasRouter.js | 3 ++- lib/http/routers/StatusRouter.js | 3 ++- 6 files changed, 31 insertions(+), 15 deletions(-) diff --git a/lib/http/routers/DebugRouter.js b/lib/http/routers/DebugRouter.js index 17a176e..d9006a9 100644 --- a/lib/http/routers/DebugRouter.js +++ b/lib/http/routers/DebugRouter.js @@ -12,7 +12,7 @@ function socketStats(sockets) { })); } -router.get('/http_stats', (req, res) => { +router.get('/http_stats', (req, res, next) => { res.json({ http: { sockets: socketStats(http.globalAgent.sockets), @@ -23,6 +23,7 @@ router.get('/http_stats', (req, res) => { freeSockets: socketStats(https.globalAgent.freeSockets), }, }); + next() }); module.exports = router; diff --git a/lib/http/routers/FunctionsRouter.js b/lib/http/routers/FunctionsRouter.js index a6d79f8..9350670 100644 --- a/lib/http/routers/FunctionsRouter.js +++ b/lib/http/routers/FunctionsRouter.js @@ -22,7 +22,7 @@ function codeFileName(namespace, codeId) { return `${namespace}/${codeId}.js`; } -router.get('/', async (req, res) => { +router.get('/', async (req, res, next) => { const memoryStorage = req.app.get('memoryStorage'); const page = parseInt(req.query.page || '1', 10); const perPage = parseInt(req.query.perPage || '10', 10); @@ -41,6 +41,7 @@ router.get('/', async (req, res) => { log.error(`Error listing namespaces and its functions: ${err}`); res.status(500).json({ error: err.message }); } + next() }); router.all('/:namespace/:id*', (req, res, next) => { @@ -48,7 +49,7 @@ router.all('/:namespace/:id*', (req, res, next) => { next(); }); -router.put('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), async (req, res) => { +router.put('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), async (req, res, next) => { const validationResult = new Validator().validate(req.body, schemas['functions/item']); const memoryStorage = req.app.get('memoryStorage'); @@ -96,9 +97,11 @@ router.put('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), async log.error(`[${namespace}:${id}] ${err}`); res.status(500).json({ error: err.message }); } + + next() }); -router.put('/:namespace/:id/env/:env', bodyParser.json({ strict: false, limit: bodyParserLimit }), async (req, res) => { +router.put('/:namespace/:id/env/:env', bodyParser.json({ strict: false, limit: bodyParserLimit }), async (req, res, next) => { const validationResult = new Validator().validate(req.body, schemas['functions/env']); const memoryStorage = req.app.get('memoryStorage'); @@ -124,9 +127,10 @@ router.put('/:namespace/:id/env/:env', bodyParser.json({ strict: false, limit: b log.error(`[${namespace}:${id}] Failed to set enviroment variable ${env}, error: ${err}`); res.status(err.statusCode || 500).json({ error: err.message }); } + next() }); -router.delete('/:namespace/:id/env/:env', async (req, res) => { +router.delete('/:namespace/:id/env/:env', async (req, res, next) => { const { namespace, id, @@ -142,9 +146,10 @@ router.delete('/:namespace/:id/env/:env', async (req, res) => { log.error(`[${namespace}:${id}] Failed to unset enviroment variable ${env}, error: ${err}`); res.status(err.statusCode || 500).json({ error: err.message }); } + next() }); -router.get('/:namespace/:id', async (req, res) => { +router.get('/:namespace/:id', async (req, res, next) => { const { namespace, id, @@ -170,9 +175,10 @@ router.get('/:namespace/:id', async (req, res) => { req.log.error(`${err.stack}`); res.status(500).json({ error: err.message }); } + next() }); -router.delete('/:namespace/:id', async (req, res) => { +router.delete('/:namespace/:id', async (req, res, next) => { const namespace = req.params.namespace; const id = req.params.id; const memoryStorage = req.app.get('memoryStorage'); @@ -184,10 +190,11 @@ router.delete('/:namespace/:id', async (req, res) => { req.log.error(`Failed to delete code id: ${err}`); res.status(500).json({ error: err.message }); } + next() }); -router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), async (req, res) => { +router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), async (req, res,next) => { const { namespace, id } = req.params; const memoryStorage = req.app.get('memoryStorage'); const sandbox = req.app.get('sandbox'); @@ -269,10 +276,11 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a }); errTracker.notify(err); } + next() }); -router.put('/pipeline', bodyParser.json({ limit: bodyParserLimit }), async (req, res) => { +router.put('/pipeline', bodyParser.json({ limit: bodyParserLimit }), async (req, res, next) => { const memoryStorage = req.app.get('memoryStorage'); const sandbox = req.app.get('sandbox'); @@ -330,6 +338,7 @@ router.put('/pipeline', bodyParser.json({ limit: bodyParserLimit }), async (req, metric.observePipelineRun(status); res.status(status).json({ error: err.message }); } + next() }); module.exports = router; diff --git a/lib/http/routers/HealthcheckRouter.js b/lib/http/routers/HealthcheckRouter.js index 06ea9b3..10e97e3 100644 --- a/lib/http/routers/HealthcheckRouter.js +++ b/lib/http/routers/HealthcheckRouter.js @@ -4,7 +4,7 @@ const log = require('../../support/log'); const router = new Router(); -router.get('/', async (req, res) => { +router.get('/', async (req, res, next) => { const memoryStorage = req.app.get('memoryStorage'); try { await memoryStorage.ping(); @@ -13,6 +13,7 @@ router.get('/', async (req, res) => { log.error(err); res.status(500).send(`Error: ${err.message}`); } + next() }); module.exports = router; diff --git a/lib/http/routers/NamespacesRouter.js b/lib/http/routers/NamespacesRouter.js index 994e6ee..70fd3f0 100644 --- a/lib/http/routers/NamespacesRouter.js +++ b/lib/http/routers/NamespacesRouter.js @@ -10,7 +10,7 @@ const router = new Router(); const { bodyParserLimit } = require('../../support/config'); const log = require('../../support/log'); -router.put('/:namespace', bodyParser.json({ limit: bodyParserLimit }), async (req, res) => { +router.put('/:namespace', bodyParser.json({ limit: bodyParserLimit }), async (req, res, next) => { try { const validationResult = new Validator().validate(req.body, schemas['namespaces/item']); const memoryStorage = req.app.get('memoryStorage'); @@ -37,9 +37,10 @@ router.put('/:namespace', bodyParser.json({ limit: bodyParserLimit }), async (re log.error(err.stack); res.status(500).json({ error: err.message }); } + next() }); -router.get('/:namespace', async (req, res) => { +router.get('/:namespace', async (req, res, next) => { const { namespace, } = req.params; @@ -61,10 +62,11 @@ router.get('/:namespace', async (req, res) => { log.error(err.stack); res.status(500).json({ error: err.message }); } + next() }); -router.delete('/:namespace', async (req, res) => { +router.delete('/:namespace', async (req, res, next) => { const namespace = req.params.namespace; const memoryStorage = req.app.get('memoryStorage'); @@ -76,6 +78,7 @@ router.delete('/:namespace', async (req, res) => { log.error(err.stack); res.status(500).json({ error: err.message }); } + next() }); module.exports = router; diff --git a/lib/http/routers/SchemasRouter.js b/lib/http/routers/SchemasRouter.js index e0ee2f3..54c0c3a 100644 --- a/lib/http/routers/SchemasRouter.js +++ b/lib/http/routers/SchemasRouter.js @@ -6,7 +6,7 @@ const FunctionsRequest = require('../FunctionsRequest'); const router = new Router(); -router.get('/*', (req, res) => { +router.get('/*', (req, res, next) => { const name = req.params[0]; if (schemas[name]) { const schema = schemas[name]; @@ -16,6 +16,7 @@ router.get('/*', (req, res) => { } else { res.status(404).json({ error: 'Schema not found' }); } + next() }); module.exports = router; diff --git a/lib/http/routers/StatusRouter.js b/lib/http/routers/StatusRouter.js index ab8521e..d28a277 100644 --- a/lib/http/routers/StatusRouter.js +++ b/lib/http/routers/StatusRouter.js @@ -4,7 +4,7 @@ const Status = require('../../domain/status'); const router = new Router(); -router.get('/', async (req, res) => { +router.get('/', async (req, res, next) => { const memoryStorage = req.app.get('memoryStorage'); const services = await new Status(memoryStorage).run(); const failedServices = services.filter(s => s.status !== 'WORKING'); @@ -17,6 +17,7 @@ router.get('/', async (req, res) => { } res.status(statusCode).json({ services }); + next() }); module.exports = router; From a6c9e4a5ffc2b24470a8fe4b260bb6e8812f8811 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 18 May 2021 09:50:30 -0300 Subject: [PATCH 089/126] Calling next() function --- lib/domain/Pipeline.js | 2 ++ lib/http/routers/DebugRouter.js | 2 +- lib/http/routers/HealthcheckRouter.js | 2 +- lib/http/routers/NamespacesRouter.js | 6 +++--- lib/http/routers/SchemasRouter.js | 2 +- lib/http/routers/StatusRouter.js | 2 +- 6 files changed, 9 insertions(+), 7 deletions(-) diff --git a/lib/domain/Pipeline.js b/lib/domain/Pipeline.js index 71114ff..0124816 100644 --- a/lib/domain/Pipeline.js +++ b/lib/domain/Pipeline.js @@ -5,6 +5,7 @@ const { DefaultLogStorage } = require('./LogStorage'); const ErrorTracker = require('./ErrorTracker'); const SpanConsoleWrapper = require('./SpanConsoleWrapper'); const { reportError } = require('../support/tracing'); +const { sendOtelError } = require('../support/opentelemetry'); function codeFileName(namespace, codeId) { return `${namespace}/${codeId}.js`; @@ -93,6 +94,7 @@ class Pipeline { logStorage.console.error(`Failed to run function: ${err.message}, ${spent} seconds`); logStorage.console.error(err.stack); reportError(span, err); + sendOtelError(this.req, err); const logResult = logStorage.flush({ status, diff --git a/lib/http/routers/DebugRouter.js b/lib/http/routers/DebugRouter.js index d9006a9..4f50559 100644 --- a/lib/http/routers/DebugRouter.js +++ b/lib/http/routers/DebugRouter.js @@ -23,7 +23,7 @@ router.get('/http_stats', (req, res, next) => { freeSockets: socketStats(https.globalAgent.freeSockets), }, }); - next() + next(); }); module.exports = router; diff --git a/lib/http/routers/HealthcheckRouter.js b/lib/http/routers/HealthcheckRouter.js index 10e97e3..af26849 100644 --- a/lib/http/routers/HealthcheckRouter.js +++ b/lib/http/routers/HealthcheckRouter.js @@ -13,7 +13,7 @@ router.get('/', async (req, res, next) => { log.error(err); res.status(500).send(`Error: ${err.message}`); } - next() + next(); }); module.exports = router; diff --git a/lib/http/routers/NamespacesRouter.js b/lib/http/routers/NamespacesRouter.js index 70fd3f0..01a7d82 100644 --- a/lib/http/routers/NamespacesRouter.js +++ b/lib/http/routers/NamespacesRouter.js @@ -37,7 +37,7 @@ router.put('/:namespace', bodyParser.json({ limit: bodyParserLimit }), async (re log.error(err.stack); res.status(500).json({ error: err.message }); } - next() + next(); }); router.get('/:namespace', async (req, res, next) => { @@ -62,7 +62,7 @@ router.get('/:namespace', async (req, res, next) => { log.error(err.stack); res.status(500).json({ error: err.message }); } - next() + next(); }); @@ -78,7 +78,7 @@ router.delete('/:namespace', async (req, res, next) => { log.error(err.stack); res.status(500).json({ error: err.message }); } - next() + next(); }); module.exports = router; diff --git a/lib/http/routers/SchemasRouter.js b/lib/http/routers/SchemasRouter.js index 54c0c3a..995bc50 100644 --- a/lib/http/routers/SchemasRouter.js +++ b/lib/http/routers/SchemasRouter.js @@ -16,7 +16,7 @@ router.get('/*', (req, res, next) => { } else { res.status(404).json({ error: 'Schema not found' }); } - next() + next(); }); module.exports = router; diff --git a/lib/http/routers/StatusRouter.js b/lib/http/routers/StatusRouter.js index d28a277..ed3cc10 100644 --- a/lib/http/routers/StatusRouter.js +++ b/lib/http/routers/StatusRouter.js @@ -17,7 +17,7 @@ router.get('/', async (req, res, next) => { } res.status(statusCode).json({ services }); - next() + next(); }); module.exports = router; From c4656463b301c87874e9854198ca4c8631566d9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 18 May 2021 09:57:01 -0300 Subject: [PATCH 090/126] chore: Implemeting opentelemetry instrumentation --- lib/http/routers/FunctionsRouter.js | 26 +++++++---- lib/http/routes.js | 17 +++++++- lib/support/config.js | 17 +++++--- lib/support/opentelemetry.js | 68 +++++++++++++++++------------ npm-shrinkwrap.json | 65 +++++++++++++++------------ package.json | 3 ++ 6 files changed, 122 insertions(+), 74 deletions(-) diff --git a/lib/http/routers/FunctionsRouter.js b/lib/http/routers/FunctionsRouter.js index 9350670..333ad7c 100644 --- a/lib/http/routers/FunctionsRouter.js +++ b/lib/http/routers/FunctionsRouter.js @@ -17,6 +17,7 @@ const SchemaResponse = require('../SchemaResponse'); const router = new Router(); const { bodyParserLimit } = require('../../support/config'); const { reportError } = require('../../support/tracing'); +const { sendOtelError } = require('../../support/opentelemetry'); function codeFileName(namespace, codeId) { return `${namespace}/${codeId}.js`; @@ -41,7 +42,7 @@ router.get('/', async (req, res, next) => { log.error(`Error listing namespaces and its functions: ${err}`); res.status(500).json({ error: err.message }); } - next() + next(); }); router.all('/:namespace/:id*', (req, res, next) => { @@ -98,7 +99,7 @@ router.put('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), async res.status(500).json({ error: err.message }); } - next() + next(); }); router.put('/:namespace/:id/env/:env', bodyParser.json({ strict: false, limit: bodyParserLimit }), async (req, res, next) => { @@ -127,7 +128,7 @@ router.put('/:namespace/:id/env/:env', bodyParser.json({ strict: false, limit: b log.error(`[${namespace}:${id}] Failed to set enviroment variable ${env}, error: ${err}`); res.status(err.statusCode || 500).json({ error: err.message }); } - next() + next(); }); router.delete('/:namespace/:id/env/:env', async (req, res, next) => { @@ -146,7 +147,7 @@ router.delete('/:namespace/:id/env/:env', async (req, res, next) => { log.error(`[${namespace}:${id}] Failed to unset enviroment variable ${env}, error: ${err}`); res.status(err.statusCode || 500).json({ error: err.message }); } - next() + next(); }); router.get('/:namespace/:id', async (req, res, next) => { @@ -175,7 +176,7 @@ router.get('/:namespace/:id', async (req, res, next) => { req.log.error(`${err.stack}`); res.status(500).json({ error: err.message }); } - next() + next(); }); router.delete('/:namespace/:id', async (req, res, next) => { @@ -190,11 +191,11 @@ router.delete('/:namespace/:id', async (req, res, next) => { req.log.error(`Failed to delete code id: ${err}`); res.status(500).json({ error: err.message }); } - next() + next(); }); -router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), async (req, res,next) => { +router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), async (req, res, next) => { const { namespace, id } = req.params; const memoryStorage = req.app.get('memoryStorage'); const sandbox = req.app.get('sandbox'); @@ -223,10 +224,12 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a const error = new Error(`Code '${namespace}/${id}' is not found`); error.statusCode = 404; reportError(span, error); + sendOtelError(req, error); throw error; } } catch (err) { reportError(span, err); + sendOtelError(req, err); res.status(err.statusCode || 500).json({ error: err.message }); return; } @@ -254,6 +257,8 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a logStorage.console.error(`Failed to run function: ${err}`); logStorage.console.error(err.stack); reportError(span, err); + sendOtelError(req, err); + const status = err.statusCode || 500; res.status(status).json({ error: err.message }); @@ -276,7 +281,7 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a }); errTracker.notify(err); } - next() + next(); }); @@ -296,6 +301,7 @@ router.put('/pipeline', bodyParser.json({ limit: bodyParserLimit }), async (req, if (!steps) { const err = new Error('Pass step by querystring is required'); reportError(span, err); + sendOtelError(req, err); res.status(400).json({ error: err.message }); return; } @@ -321,6 +327,7 @@ router.put('/pipeline', bodyParser.json({ limit: bodyParserLimit }), async (req, const e = new Error(`Code '${namespace}/${id}' is not found`); e.statusCode = 404; reportError(span, e); + sendOtelError(req, e); throw e; } } @@ -334,11 +341,12 @@ router.put('/pipeline', bodyParser.json({ limit: bodyParserLimit }), async (req, res.json(result.body); } catch (err) { reportError(span, err); + sendOtelError(req, err); const status = err.statusCode || 500; metric.observePipelineRun(status); res.status(status).json({ error: err.message }); } - next() + next(); }); module.exports = router; diff --git a/lib/http/routes.js b/lib/http/routes.js index 881c52d..eddb258 100644 --- a/lib/http/routes.js +++ b/lib/http/routes.js @@ -1,5 +1,6 @@ const express = require('express'); const morgan = require('morgan'); +const expressOpentracing = require('express-opentracing'); const Sandbox = require('@globocom/backstage-functions-sandbox'); @@ -12,8 +13,12 @@ const NamespacesRouter = require('./routers/NamespacesRouter'); const FunctionsRouter = require('./routers/FunctionsRouter'); const parseExposeEnv = require('../support/parseExposeEnv'); + const config = require('../support/config'); +const { StartSpanMiddleware, FinalizeSpanMiddleware } = require('../support/opentelemetry'); + +const { tracer } = require('../support/tracing'); const FunctionsRequest = require('./FunctionsRequest'); const Storage = require('../domain/getStorage'); @@ -27,9 +32,11 @@ morgan.token('response-sectime', (req, res) => { const secs = diff[0] + (diff[1] * 1e-9); return secs.toFixed(3); }); - const app = express(); +const traceEngine = config.trace.engine app.use(morgan(config.log.morganFormat)); +app.use(expressOpentracing.default({ tracer })); + app.disable('x-powered-by'); app.enable('trust proxy'); app.set('memoryStorage', new Storage()); @@ -48,6 +55,11 @@ app.get('/', (req, res) => { }); }); + +if (traceEngine.toLowerCase() === 'opentelemetry') { + app.use(StartSpanMiddleware); +} + app.use('/healthcheck', HealthcheckRouter); app.use('/status', StatusRouter); app.use('/_debug', DebugRouter); @@ -55,5 +67,8 @@ app.use('/_schemas', SchemasRouter); app.use('/functions', FunctionsRouter); app.use('/namespaces', NamespacesRouter); +if (traceEngine.toLowerCase() === 'opentelemetry') { + app.use(FinalizeSpanMiddleware); +} module.exports = app; diff --git a/lib/support/config.js b/lib/support/config.js index dbcfd0a..71d6bae 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -40,15 +40,18 @@ module.exports = { useCertFile: ConfigDiscovery.getBool('FUNCTIONS_USE_SSL_CERT_FILE', false), certFile: process.env.SSL_CERT_FILE, }, - otel: { - engine: process.env.OTEL_EXPORTER_ENGINE, - collector: { - host: process.env.OTEL_COLLECTOR_HOST || 'no-op', //jaeger, zipkin, apm, etc... - port: process.env.OTEL_COLLECTOR_PORT || 55680 + trace: { + engine: process.env.TRACE_ENGINE || 'opentracing', + otel: { + collector: { + host: process.env.OTEL_COLLECTOR_HOST || 'no-op', + port: process.env.OTEL_COLLECTOR_PORT || 55680, + }, + service: process.env.OTEL_EXPORTER_SERVICE, }, - service: process.env.OTEL_EXPORTER_SERVICE }, - useOpenTelemetry: process.env.USE_OPENTELEMETRY || false, + + storageName: process.env.STORAGE || 'redis', opentracingEngine: process.env.OPENTRACING_ENGINE || 'no-op', opentracingService: ConfigDiscovery.getPossibleString(['OPENTRACING_SERVICE', 'TSURU_APPNAME'], 'functions'), diff --git a/lib/support/opentelemetry.js b/lib/support/opentelemetry.js index a742f5f..9822508 100644 --- a/lib/support/opentelemetry.js +++ b/lib/support/opentelemetry.js @@ -1,11 +1,12 @@ -const { BatchSpanProcessor, BasicTracerProvider } = require('@opentelemetry/tracing') +const { BatchSpanProcessor } = require('@opentelemetry/tracing'); const { HttpInstrumentation } = require('@opentelemetry/instrumentation-http'); -const { ExpressInstrumentation } = require('@opentelemetry/instrumentation-express') -const { registerInstrumentations } = require('@opentelemetry/instrumentation') -const { CollectorTraceExporter } = require('@opentelemetry/exporter-collector-grpc') +const { ExpressInstrumentation } = require('@opentelemetry/instrumentation-express'); +const { registerInstrumentations } = require('@opentelemetry/instrumentation'); +const { CollectorTraceExporter } = require('@opentelemetry/exporter-collector-grpc'); +const { NodeTracerProvider } = require('@opentelemetry/node'); -const opentelemetry = require('@opentelemetry/api') -const OtelConfig = require('./config').otel; +const opentelemetry = require('@opentelemetry/api'); +const OtelConfig = require('./config').trace.otel; const collectorOptions = { serviceName: OtelConfig.service, @@ -13,35 +14,46 @@ const collectorOptions = { concurrencyLimit: 10 } -const provider = new BasicTracerProvider() -const exporter = new CollectorTraceExporter(collectorOptions) +const provider = new NodeTracerProvider(); +const exporter = new CollectorTraceExporter(collectorOptions); provider.addSpanProcessor(new BatchSpanProcessor(exporter, { - maxQueueSize: 1000, - scheduledDelayMillis: 30000 -})) + maxQueueSize: 1000, + scheduledDelayMillis: 30000, +})); registerInstrumentations({ instrumentations: [ new ExpressInstrumentation(), - new HttpInstrumentation({responseHook: (span, _) => { - const { attributes: attrs = {} } = span - span.updateName(`${attrs['http.method']} ${attrs['http.target']}`) - span.setAttribute('functions.route', attrs['http.route']) - span.setAttribute('functions.url',attrs['http.url']) - }}), - ] -}) + new HttpInstrumentation({ responseHook: (span) => { + const { attributes: attrs = {} } = span; + span.updateName(`${attrs['http.method']} ${attrs['http.target']}`); + span.setAttribute('functions.route', attrs['http.route']); + span.setAttribute('functions.url', attrs['http.url']); + } }), + ], +}); provider.register(); -const context = opentelemetry.context -const tracer = opentelemetry.trace.getTracer(OtelConfig.service) - -function reportError(span, err) { - //span.setTag(opentracing.Tags.ERROR, true); - console.log('Recording Exception', err) - span.recordException(err) - span.end() +const tracer = opentelemetry.trace.getTracer(OtelConfig.service); + +function sendOtelError(req, error) { + if (req.otelSpan && req.otelSpan.recordException) { + req.otelSpan.recordException(error); + } +} + + +function StartSpanMiddleware(req, res, next) { + const span = tracer.startSpan(req.path); + req.otelSpan = span; + next(); +} + +function FinalizeSpanMiddleware(req, res, next) { + const { otelSpan } = req; + if (otelSpan && otelSpan.end) otelSpan.end(); + next(); } -module.exports = { tracer, context, opentelemetry, reportError } \ No newline at end of file +module.exports = { sendOtelError, StartSpanMiddleware, FinalizeSpanMiddleware }; diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index fcad275..1b5a249 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -93,9 +93,9 @@ } }, "@opentelemetry/api": { - "version": "1.0.0-rc.0", - "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/api/-/api-1.0.0-rc.0.tgz", - "integrity": "sha1-DHw/XhKF+ZzttWPXStGtuYIrUUQ=" + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-0.18.1.tgz", + "integrity": "sha512-pKNxHe3AJ5T2N5G3AlT9gx6FyF5K2FS9ZNc+FipC+f1CpVF/EY+JHTJ749dnM2kWIgZTbDJFiGMuc0FYjNSCOg==" }, "@opentelemetry/api-metrics": { "version": "0.19.0", @@ -166,8 +166,8 @@ }, "@opentelemetry/instrumentation": { "version": "0.19.0", - "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/instrumentation/-/instrumentation-0.19.0.tgz", - "integrity": "sha1-IZAV+CE0wp5q6rXgAjXmGHocsfQ=", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.19.0.tgz", + "integrity": "sha512-rvbJZNzgqVDO7/lvKdXoS6WJviJyV+d0lb43tF4cgFyXBvqNGCg8imS/Si4tBF0md1OvOjU+qNvjBKr/whXWOg==", "requires": { "@opentelemetry/api-metrics": "0.19.0", "require-in-the-middle": "^5.0.3", @@ -177,24 +177,24 @@ "dependencies": { "lru-cache": { "version": "6.0.0", - "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha1-bW/mVw69lqr5D8rR2vo7JWbbOpQ=", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { "yallist": "^4.0.0" } }, "semver": { "version": "7.3.5", - "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/semver/-/semver-7.3.5.tgz", - "integrity": "sha1-C2Ich5NI2JmOSw5L6Us/EuYBjvc=", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", "requires": { "lru-cache": "^6.0.0" } }, "yallist": { "version": "4.0.0", - "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha1-m7knkNnA7/7GO+c1GeEaNQGaOnI=" + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, @@ -207,6 +207,13 @@ "@opentelemetry/core": "^0.19.0", "@opentelemetry/instrumentation": "^0.19.0", "@opentelemetry/semantic-conventions": "^0.19.0" + }, + "dependencies": { + "@opentelemetry/api": { + "version": "1.0.0-rc.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.0.0-rc.0.tgz", + "integrity": "sha512-iXKByCMfrlO5S6Oh97BuM56tM2cIBB0XsL/vWF/AtJrJEKx4MC/Xdu0xDsGXMGcNWpqF7ujMsjjnp0+UHBwnDQ==" + } } }, "@opentelemetry/instrumentation-http": { @@ -317,8 +324,8 @@ }, "@opentelemetry/tracing": { "version": "0.19.0", - "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/tracing/-/tracing-0.19.0.tgz", - "integrity": "sha1-jJTPK20lQtiGaphjGCWWX1285cQ=", + "resolved": "https://registry.npmjs.org/@opentelemetry/tracing/-/tracing-0.19.0.tgz", + "integrity": "sha512-RUmPZLQi4+nlHwTFpHqU45TMW+osIraDtf0jcFKLacKltGIft65tVxIEVn1uF9N9eG7NZzjXLo3jsvCzpavJ8Q==", "requires": { "@opentelemetry/core": "0.19.0", "@opentelemetry/resources": "0.19.0", @@ -2594,16 +2601,16 @@ }, "is-core-module": { "version": "2.4.0", - "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-core-module/-/is-core-module-2.4.0.tgz", - "integrity": "sha1-jp/I4VAnsBFBgCbpjw5vTYYwXME=", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz", + "integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==", "requires": { "has": "^1.0.3" }, "dependencies": { "has": { "version": "1.0.3", - "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has/-/has-1.0.3.tgz", - "integrity": "sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y=", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { "function-bind": "^1.1.1" } @@ -6071,8 +6078,8 @@ }, "require-in-the-middle": { "version": "5.1.0", - "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz", - "integrity": "sha1-t2j4ADd7R1JtAmu/Wn9yfxbrQS8=", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-5.1.0.tgz", + "integrity": "sha512-M2rLKVupQfJ5lf9OvqFGIT+9iVLnTmjgbOmpil12hiSQNn5zJTKGPoIisETNjfK+09vP3rpm1zJajmErpr2sEQ==", "requires": { "debug": "^4.1.1", "module-details-from-path": "^1.0.3", @@ -6081,26 +6088,26 @@ "dependencies": { "debug": { "version": "4.3.1", - "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/debug/-/debug-4.3.1.tgz", - "integrity": "sha1-8NIpxQXgxtjEmsVT0bE9wYP2su4=", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", "requires": { "ms": "2.1.2" } }, "ms": { "version": "2.1.2", - "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ms/-/ms-2.1.2.tgz", - "integrity": "sha1-0J0fNXtEP0kzgqjrPM0YOHKuYAk=" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "path-parse": { "version": "1.0.6", - "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha1-1i27VnlAXXLEc37FhgDp3c8G0kw=" + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "resolve": { "version": "1.20.0", - "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU=", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", + "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", "requires": { "is-core-module": "^2.2.0", "path-parse": "^1.0.6" @@ -6291,8 +6298,8 @@ }, "shimmer": { "version": "1.2.1", - "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/shimmer/-/shimmer-1.2.1.tgz", - "integrity": "sha1-YQhZ994ye1h+/r9QH7QxF/mv8zc=" + "resolved": "https://registry.npmjs.org/shimmer/-/shimmer-1.2.1.tgz", + "integrity": "sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==" }, "signal-exit": { "version": "3.0.2", diff --git a/package.json b/package.json index 0a54c46..af6d2f0 100644 --- a/package.json +++ b/package.json @@ -27,11 +27,14 @@ "license": "MIT", "dependencies": { "@globocom/backstage-functions-sandbox": "^0.5.3", + "@opentelemetry/api": "^0.18.1", "@opentelemetry/core": "^0.19.0", "@opentelemetry/exporter-collector-grpc": "^0.19.0", + "@opentelemetry/instrumentation": "^0.19.0", "@opentelemetry/instrumentation-express": "^0.16.0", "@opentelemetry/instrumentation-http": "^0.19.0", "@opentelemetry/node": "^0.19.0", + "@opentelemetry/tracing": "^0.19.0", "async": "^2.0.1", "body-parser": "^1.15.2", "deepcopy": "^0.6.3", From b2c41e04a089ef9b69e23fd49c7781ce1a08f691 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 18 May 2021 14:54:46 -0300 Subject: [PATCH 091/126] 0.2.19-next.0 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 1b5a249..f135065 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.18", + "version": "0.2.19-next.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index af6d2f0..6bb4b2f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.18", + "version": "0.2.19-next.0", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From 50adca219c7d4e777058658decf9f2768423bb09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 18 May 2021 14:55:06 -0300 Subject: [PATCH 092/126] 0.2.19-rc.0 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index f135065..fecfa94 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.19-next.0", + "version": "0.2.19-rc.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 6bb4b2f..dffd8f9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.19-next.0", + "version": "0.2.19-rc.0", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From bda475713d321ba89acccb16d087f8ce9c3a25ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 18 May 2021 15:00:30 -0300 Subject: [PATCH 093/126] Update required node version --- .travis.yml | 2 +- README.md | 2 +- package.json | 2 +- yarn-error.log | 5248 ------------------------------------------------ 4 files changed, 3 insertions(+), 5251 deletions(-) delete mode 100644 yarn-error.log diff --git a/.travis.yml b/.travis.yml index b630fe6..d1ca29e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,7 +5,7 @@ cache: - node_modules node_js: - "7" - - "8.9.1" + - "8.13.0" - "8" - "node" env: diff --git a/README.md b/README.md index 1db6c7e..417778e 100644 --- a/README.md +++ b/README.md @@ -22,7 +22,7 @@ It uses the [Backstage Functions Sandbox](https://github.com/backstage/functions ## Running locally without Docker ### Requirements - Redis 3.0+ -- NodeJS 8.9.1 +- NodeJS 8.13.0 ### Download the project ```bash diff --git a/package.json b/package.json index dffd8f9..41727ca 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,7 @@ "backstage" ], "engines": { - "node": ">=8.9.1" + "node": ">=8.13.0" }, "author": "Backstage Team ", "license": "MIT", diff --git a/yarn-error.log b/yarn-error.log deleted file mode 100644 index d083f8d..0000000 --- a/yarn-error.log +++ /dev/null @@ -1,5248 +0,0 @@ -Arguments: - /usr/local/bin/node /usr/local/bin/yarn - -PATH: - /home/markiing/.pyenv/plugins/pyenv-virtualenv/shims:/home/markiing/.pyenv/shims:/home/markiing/.pyenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/mnt/c/Program Files/Common Files/Oracle/Java/javapath:/mnt/c/Windows/system32:/mnt/c/Windows:/mnt/c/Windows/System32/Wbem:/mnt/c/Windows/System32/WindowsPowerShell/v1.0/:/mnt/c/Program Files (x86)/Intel/Intel(R) Management Engine Components/DAL:/mnt/c/Program Files/Intel/Intel(R) Management Engine Components/DAL:/mnt/c/Program Files/NVIDIA Corporation/NVIDIA NvDLISR:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/Program Files (x86)/NVIDIA Corporation/PhysX/Common:/mnt/f/Android/Sdk/platform-tools:/mnt/f/Softwares/Git/cmd:/mnt/f/Softwares/Nodejs/:/mnt/c/ProgramData/chocolatey/bin:/mnt/f/Softwares/Vagrant/bin:/mnt/c/Program Files/dotnet/:/mnt/f/Softwares/Geth:/mnt/c/Program Files/Docker/Docker/resources/bin:/mnt/c/ProgramData/DockerDesktop/version-bin:/mnt/c/Users/Marcus/AppData/Local/Microsoft/WindowsApps:/mnt/f/Softwares/Microsoft VS Code/bin:/mnt/c/Users/Marcus/AppData/Roaming/npm:/mnt/c/Users/Marcus/.dotnet/tools://home/markiing/bin_go/go/bin/go://home/markiing/.local/bin://home/markiing/bin_go/go/bin/go://home/markiing/.local/bin - -Yarn version: - 1.22.5 - -Node version: - 8.9.1 - -Platform: - linux x64 - -Trace: - SyntaxError: /home/markiing/Globo/functions/package.json: Unexpected token / in JSON at position 924 - at JSON.parse () - at /usr/local/lib/node_modules/yarn/lib/cli.js:1625:59 - at Generator.next () - at step (/usr/local/lib/node_modules/yarn/lib/cli.js:310:30) - at /usr/local/lib/node_modules/yarn/lib/cli.js:321:13 - at - -npm manifest: - { - "name": "@globocom/backstage-functions", - "version": "0.2.18", - "description": "Remote serverless code executor", - "main": "index.js", - "scripts": { - "test": "REDIS_KEY_PREFIX=test nyc mocha --ui bdd --recursive test/", - "send_cover": "nyc report --reporter=text-lcov | coveralls", - "start_dev": "which nf && nf -j Procfile.local -e .env.local start", - "start_sandbox": "NUM_CPUS=1 STORAGE=inmemory nf -j Procfile.sandbox -e .env.local start", - "lint": "eslint lib test" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/backstage/functions.git" - }, - "keywords": [ - "serverless", - "sandbox", - "functions", - "backstage" - ], - "engines": { - "node": ">=8.9.1" - }, - "author": "Backstage Team ", - "license": "MIT", - "dependencies": { - "@globocom/backstage-functions-sandbox": "^0.5.3", - "@opentelemetry/core": "^0.19.0", - //"@opentelemetry/exporter-collector": "^0.19.0", - //"@opentelemetry/exporter-collector-grpc": "^0.19.0", - //"@opentelemetry/instrumentation-express": "^0.16.0", - //"@opentelemetry/instrumentation-http": "^0.19.0", - "@opentelemetry/node": "^0.19.0", - "async": "^2.0.1", - "body-parser": "^1.15.2", - "deepcopy": "^0.6.3", - "elastic-apm-node-opentracing": "^2.0.0", - "express": "^4.14.0", - "express-opentracing": "^0.1.1", - "gelf": "^2.0.1", - "ioredis": "^3.1.4", - "jaeger-client": "^3.18.0", - "jsonschema": "^1.1.0", - "lodash": "^4.16.2", - "morgan": "^1.7.0", - "node-fetch": "^2.6.0", - "opentracing": "^0.14.4", - "prom-client": "^11.5.3", - "raven": "^2.2.1", - "request": "^2.81.0", - "stack-trace": "^0.0.9", - "uuid": "^3.0.1", - "winston": "^2.2.0" - }, - "devDependencies": { - "chai": "^3.5.0", - "chai-string": "^1.2.0", - "deepcopy": "^0.6.3", - "eslint": "^3.6.1", - "eslint-config-airbnb": "^12.0.0", - "eslint-plugin-import": "^1.16.0", - "eslint-plugin-jsx-a11y": "^2.2.2", - "eslint-plugin-react": "^6.3.0", - "foreman": "^2.0.0", - "istanbul": "^0.4.5", - "istanbul-coveralls": "^1.0.3", - "mocha": "^3.0.2", - "nodemon": "^1.10.2", - "nyc": "^11.3.0", - "sinon": "^4.1.3", - "supertest": "^2.0.0" - } - } - -yarn manifest: - No manifest - -Lockfile: - # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. - # yarn lockfile v1 - - - "@globocom/backstage-functions-sandbox@^0.5.3": - version "0.5.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@globocom/backstage-functions-sandbox/-/backstage-functions-sandbox-0.5.3.tgz#727fc2ac8c146b1848b6d5bdfd770bd2ebe6430a" - integrity sha1-cn/CrIwUaxhIttW9/XcL0uvmQwo= - dependencies: - once "^1.4.0" - stack-trace "^0.0.9" - - "@sinonjs/commons@^1", "@sinonjs/commons@^1.3.0", "@sinonjs/commons@^1.7.0": - version "1.8.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@sinonjs/commons/-/commons-1.8.3.tgz#3802ddd21a50a949b6721ddd72da36e67e7f1b2d" - integrity sha1-OALd0hpQqUm2ch3dcto25n5/Gy0= - dependencies: - type-detect "4.0.8" - - "@sinonjs/formatio@^2.0.0": - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@sinonjs/formatio/-/formatio-2.0.0.tgz#84db7e9eb5531df18a8c5e0bfb6e449e55e654b2" - integrity sha1-hNt+nrVTHfGKjF4L+25EnlXmVLI= - dependencies: - samsam "1.3.0" - - "@sinonjs/formatio@^3.2.1": - version "3.2.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@sinonjs/formatio/-/formatio-3.2.2.tgz#771c60dfa75ea7f2d68e3b94c7e888a78781372c" - integrity sha1-dxxg36dep/LWjjuUx+iIp4eBNyw= - dependencies: - "@sinonjs/commons" "^1" - "@sinonjs/samsam" "^3.1.0" - - "@sinonjs/samsam@^3.1.0": - version "3.3.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@sinonjs/samsam/-/samsam-3.3.3.tgz#46682efd9967b259b81136b9f120fd54585feb4a" - integrity sha1-Rmgu/Zlnslm4ETa58SD9VFhf60o= - dependencies: - "@sinonjs/commons" "^1.3.0" - array-from "^2.1.1" - lodash "^4.17.15" - - "@sinonjs/text-encoding@^0.7.1": - version "0.7.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz#8da5c6530915653f3a1f38fd5f101d8c3f8079c5" - integrity sha1-jaXGUwkVZT86Hzj9XxAdjD+AecU= - - abbrev@1: - version "1.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - integrity sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg= - - abbrev@1.0.x: - version "1.0.9" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135" - integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU= - - accepts@~1.3.7: - version "1.3.7" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha1-UxvHJlF6OytB+FACHGzBXqq1B80= - dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" - - acorn-jsx@^3.0.0: - version "3.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" - integrity sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s= - dependencies: - acorn "^3.0.4" - - acorn@^3.0.4: - version "3.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" - integrity sha1-ReN/s56No/JbruP/U2niu18iAXo= - - acorn@^5.5.0: - version "5.7.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/acorn/-/acorn-5.7.4.tgz#3e8d8a9947d0599a1796d10225d7432f4a4acf5e" - integrity sha1-Po2KmUfQWZoXltECJddDL0pKz14= - - ajv-keywords@^1.0.0: - version "1.5.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ajv-keywords/-/ajv-keywords-1.5.1.tgz#314dd0a4b3368fad3dfcdc54ede6171b886daf3c" - integrity sha1-MU3QpLM2j609/NxU7eYXG4htrzw= - - ajv@^4.7.0: - version "4.11.8" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - integrity sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY= - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - - ajv@^6.12.3: - version "6.12.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" - integrity sha1-uvWmLoArB9l3A0WG+MO69a3ybfQ= - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - - amdefine@>=0.0.4: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" - integrity sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU= - - ansi-align@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" - integrity sha1-w2rsy6VjuJzrVW82kPCx2eNUf38= - dependencies: - string-width "^2.0.0" - - ansi-color@^0.2.1: - version "0.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ansi-color/-/ansi-color-0.2.1.tgz#3e75c037475217544ed763a8db5709fa9ae5bf9a" - integrity sha1-PnXAN0dSF1RO12Oo21cJ+prlv5o= - - ansi-escapes@^1.1.0: - version "1.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" - integrity sha1-06ioOzGapneTZisT52HHkRQiMG4= - - ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= - - ansi-regex@^3.0.0: - version "3.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" - integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= - - ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= - - ansi-styles@^3.2.1: - version "3.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" - integrity sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0= - dependencies: - color-convert "^1.9.0" - - anymatch@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/anymatch/-/anymatch-2.0.0.tgz#bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb" - integrity sha1-vLJLTzeTTZqnrBe0ra+J58du8us= - dependencies: - micromatch "^3.1.4" - normalize-path "^2.1.1" - - append-transform@^0.4.0: - version "0.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" - integrity sha1-126/jKlNJ24keja61EpLdKthGZE= - dependencies: - default-require-extensions "^1.0.0" - - archy@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" - integrity sha1-+cjBN1fMHde8N5rHeyxipcKGjEA= - - argparse@^1.0.7: - version "1.0.10" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" - integrity sha1-vNZ5HqWuCXJeF+WtmIE0zUCz2RE= - dependencies: - sprintf-js "~1.0.2" - - arr-diff@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - integrity sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8= - dependencies: - arr-flatten "^1.0.1" - - arr-diff@^4.0.0: - version "4.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - - arr-flatten@^1.0.1, arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha1-NgSLv/TntH4TZkQxbJlmnqWukfE= - - arr-union@^3.1.0: - version "3.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - - array-filter@~0.0.0: - version "0.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" - integrity sha1-fajPLiZijtcygDWB/SH2fKzS7uw= - - array-flatten@1.1.1: - version "1.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" - integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= - - array-from@^2.1.1: - version "2.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/array-from/-/array-from-2.1.1.tgz#cfe9d8c26628b9dc5aecc62a9f5d8f1f352c1195" - integrity sha1-z+nYwmYoudxa7MYqn12PHzUsEZU= - - array-map@~0.0.0: - version "0.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" - integrity sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI= - - array-reduce@~0.0.0: - version "0.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" - integrity sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys= - - array-unique@^0.2.1: - version "0.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - integrity sha1-odl8yvy8JiXMcPrc6zalDFiwGlM= - - array-unique@^0.3.2: - version "0.3.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - - array.prototype.find@^2.0.1: - version "2.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/array.prototype.find/-/array.prototype.find-2.1.1.tgz#3baca26108ca7affb08db06bf0be6cb3115a969c" - integrity sha1-O6yiYQjKev+wjbBr8L5ssxFalpw= - dependencies: - define-properties "^1.1.3" - es-abstract "^1.17.4" - - arrify@^1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= - - asn1@~0.2.3: - version "0.2.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/asn1/-/asn1-0.2.4.tgz#8d2475dfab553bb33e77b54e59e880bb8ce23136" - integrity sha1-jSR136tVO7M+d7VOWeiAu4ziMTY= - dependencies: - safer-buffer "~2.1.0" - - assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU= - - assert-plus@^0.2.0: - version "0.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - integrity sha1-104bh+ev/A24qttwIfP+SBAasjQ= - - assertion-error@^1.0.1: - version "1.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" - integrity sha1-5gtrDo8wG9l+U3UhW9pAbIURjAs= - - assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - - async-each@^1.0.1: - version "1.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf" - integrity sha1-tyfb+H12UWAvBvTUrDh/R9kbDL8= - - async@1.x, async@^1.5.2: - version "1.5.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= - - async@^2.0.1, async@^2.5.0: - version "2.6.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff" - integrity sha1-1yYl4jRKNlbjo61Pp0n6gymdgv8= - dependencies: - lodash "^4.17.14" - - async@~1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" - integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k= - - asynckit@^0.4.0: - version "0.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - - atob@^2.1.2: - version "2.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha1-bZUX654DDSQ2ZmZR6GvZ9vE1M8k= - - aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - integrity sha1-FDQt0428yU0OW4fXY81jYSwOeU8= - - aws-sign2@~0.7.0: - version "0.7.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" - integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg= - - aws4@^1.2.1, aws4@^1.8.0: - version "1.11.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59" - integrity sha1-1h9G2DslGSUOJ4Ta9bCUeai0HFk= - - babel-code-frame@^6.16.0, babel-code-frame@^6.26.0: - version "6.26.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" - integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= - dependencies: - chalk "^1.1.3" - esutils "^2.0.2" - js-tokens "^3.0.2" - - babel-generator@^6.18.0: - version "6.26.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" - integrity sha1-GERAjTuPDTWkBOp6wYDwh6YBvZA= - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.7" - trim-right "^1.0.1" - - babel-messages@^6.23.0: - version "6.23.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4= - dependencies: - babel-runtime "^6.22.0" - - babel-runtime@^6.22.0, babel-runtime@^6.26.0: - version "6.26.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - - babel-template@^6.16.0: - version "6.26.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI= - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - - babel-traverse@^6.18.0, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4= - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - - babel-types@^6.18.0, babel-types@^6.26.0: - version "6.26.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc= - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - - babylon@^6.18.0: - version "6.18.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - integrity sha1-ry87iPpvXB5MY00aD46sT1WzleM= - - balanced-match@^1.0.0: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" - integrity sha1-6D46fj8wCzTLnYf2FfoMvzV2kO4= - - base@^0.11.1: - version "0.11.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha1-e95c7RRbbVUakNuH+DxVi060io8= - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - - basic-auth@~2.0.1: - version "2.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" - integrity sha1-uZgnm/R844NEtPPPkW1Gebv1Hjo= - dependencies: - safe-buffer "5.1.2" - - bcrypt-pbkdf@^1.0.0: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e" - integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4= - dependencies: - tweetnacl "^0.14.3" - - binary-extensions@^1.0.0: - version "1.13.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" - integrity sha1-WYr+VHVbKGilMw0q/51Ou1Mgm2U= - - bindings@^1.5.0: - version "1.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" - integrity sha1-EDU8npRTNLwFEabZCzj7x8nFBN8= - dependencies: - file-uri-to-path "1.0.0" - - bintrees@1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/bintrees/-/bintrees-1.0.1.tgz#0e655c9b9c2435eaab68bf4027226d2b55a34524" - integrity sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ= - - bluebird@^3.3.4: - version "3.7.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" - integrity sha1-nyKcFb4nJFT/qXOs4NvueaGww28= - - body-parser@1.19.0, body-parser@^1.15.2: - version "1.19.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/body-parser/-/body-parser-1.19.0.tgz#96b2709e57c9c4e09a6fd66a8fd979844f69f08a" - integrity sha1-lrJwnlfJxOCab9Zqj9l5hE9p8Io= - dependencies: - bytes "3.1.0" - content-type "~1.0.4" - debug "2.6.9" - depd "~1.1.2" - http-errors "1.7.2" - iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.7.0" - raw-body "2.4.0" - type-is "~1.6.17" - - boom@2.x.x: - version "2.10.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - integrity sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8= - dependencies: - hoek "2.x.x" - - boxen@^1.2.1: - version "1.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" - integrity sha1-VcbDmouljZxhrSLNh3Uy3rZlogs= - dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^2.0.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^1.2.0" - widest-line "^2.0.0" - - brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha1-PH/L9SnYcibz0vUrlm/1Jx60Qd0= - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - - braces@^1.8.2: - version "1.8.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - integrity sha1-uneWLhLf+WnWt2cR6RS3N4V79qc= - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - - braces@^2.3.1, braces@^2.3.2: - version "2.3.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha1-WXn9PxTNUxVl5fot8av/8d+u5yk= - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - - browser-stdout@1.3.0: - version "1.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" - integrity sha1-81HTKWnTL6XXpVZxVCY9korjvR8= - - buffer-from@^1.0.0: - version "1.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" - integrity sha1-MnE7wCj3XAL9txDXx7zsHyxgcO8= - - bufrw@^1.3.0: - version "1.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/bufrw/-/bufrw-1.3.0.tgz#28d6cfdaf34300376836310f5c31d57eeb40c8fa" - integrity sha1-KNbP2vNDADdoNjEPXDHVfutAyPo= - dependencies: - ansi-color "^0.2.1" - error "^7.0.0" - hexer "^1.5.0" - xtend "^4.0.0" - - builtin-modules@^1.1.1: - version "1.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= - - bytes@3.1.0: - version "3.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6" - integrity sha1-9s95M6Ng4FiPqf3oVlHNx/gF0fY= - - cache-base@^1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha1-Cn9GQWgxyLZi7jb+TnxZ129marI= - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" - - caching-transform@^1.0.0: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/caching-transform/-/caching-transform-1.0.1.tgz#6dbdb2f20f8d8fbce79f3e94e9d1742dcdf5c0a1" - integrity sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE= - dependencies: - md5-hex "^1.2.0" - mkdirp "^0.5.1" - write-file-atomic "^1.1.4" - - call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw= - dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" - - caller-path@^0.1.0: - version "0.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" - integrity sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8= - dependencies: - callsites "^0.2.0" - - callsites@^0.2.0: - version "0.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" - integrity sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo= - - camelcase@^4.0.0, camelcase@^4.1.0: - version "4.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - integrity sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0= - - capture-stack-trace@^1.0.0: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" - integrity sha1-psC74fOPOqC5Ijjstv9Cw0TUE10= - - caseless@~0.11.0: - version "0.11.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" - integrity sha1-cVuW6phBWTzDMGeSP17GDr2k99c= - - caseless@~0.12.0: - version "0.12.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw= - - chai-string@^1.2.0: - version "1.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/chai-string/-/chai-string-1.5.0.tgz#0bdb2d8a5f1dbe90bc78ec493c1c1c180dd4d3d2" - integrity sha1-C9stil8dvpC8eOxJPBwcGA3U09I= - - chai@^3.5.0: - version "3.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/chai/-/chai-3.5.0.tgz#4d02637b067fe958bdbfdd3a40ec56fef7373247" - integrity sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc= - dependencies: - assertion-error "^1.0.1" - deep-eql "^0.1.3" - type-detect "^1.0.0" - - chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: - version "1.1.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - - chalk@^2.0.1: - version "2.4.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" - integrity sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ= - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - - charenc@0.0.2: - version "0.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/charenc/-/charenc-0.0.2.tgz#c0a1d2f3a7092e03774bfa83f14c0fc5790a8667" - integrity sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc= - - chokidar@^2.1.8: - version "2.1.8" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/chokidar/-/chokidar-2.1.8.tgz#804b3a7b6a99358c3c5c61e71d8728f041cff917" - integrity sha1-gEs6e2qZNYw8XGHnHYco8EHP+Rc= - dependencies: - anymatch "^2.0.0" - async-each "^1.0.1" - braces "^2.3.2" - glob-parent "^3.1.0" - inherits "^2.0.3" - is-binary-path "^1.0.0" - is-glob "^4.0.0" - normalize-path "^3.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.2.1" - upath "^1.1.1" - optionalDependencies: - fsevents "^1.2.7" - - ci-info@^1.5.0: - version "1.6.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ci-info/-/ci-info-1.6.0.tgz#2ca20dbb9ceb32d4524a683303313f0304b1e497" - integrity sha1-LKINu5zrMtRSSmgzAzE/AwSx5Jc= - - circular-json@^0.3.1: - version "0.3.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" - integrity sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY= - - class-utils@^0.3.5: - version "0.3.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha1-+TNprouafOAv1B+q0MqDAzGQxGM= - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - - cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - integrity sha1-T6kXw+WclKAEzWH47lCdplFocUM= - - cli-cursor@^1.0.1: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" - integrity sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc= - dependencies: - restore-cursor "^1.0.1" - - cli-width@^2.0.0: - version "2.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cli-width/-/cli-width-2.2.1.tgz#b0433d0b4e9c847ef18868a4ef16fd5fc8271c48" - integrity sha1-sEM9C06chH7xiGik7xb9X8gnHEg= - - cliui@^4.0.0: - version "4.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" - integrity sha1-NIQi2+gtgAswIu709qwQvy5NG0k= - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - - cluster-key-slot@^1.0.6: - version "1.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz#30474b2a981fb12172695833052bc0d01336d10d" - integrity sha1-MEdLKpgfsSFyaVgzBSvA0BM20Q0= - - co@^4.6.0: - version "4.6.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - integrity sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ= - - code-point-at@^1.0.0: - version "1.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= - - collection-visit@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - - color-convert@^1.9.0: - version "1.9.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg= - dependencies: - color-name "1.1.3" - - color-name@1.1.3: - version "1.1.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - - colors@1.0.x: - version "1.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" - integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= - - combined-stream@^1.0.5, combined-stream@^1.0.6, combined-stream@~1.0.5, combined-stream@~1.0.6: - version "1.0.8" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha1-w9RaizT9cwYxoRCoolIGgrMdWn8= - dependencies: - delayed-stream "~1.0.0" - - commander@2.9.0, commander@~2.9.0: - version "2.9.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - integrity sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q= - dependencies: - graceful-readlink ">= 1.0.0" - - commander@^2.9.0: - version "2.20.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" - integrity sha1-/UhehMA+tIgcIHIrpIA16FMa6zM= - - commondir@^1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" - integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= - - component-emitter@^1.2.0, component-emitter@^1.2.1: - version "1.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha1-FuQHD7qK4ptnnyIVhT7hgasuq8A= - - concat-map@0.0.1: - version "0.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - - concat-stream@^1.5.2: - version "1.6.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" - integrity sha1-kEvfGUzTEi/Gdcd/xKw9T/D9GjQ= - dependencies: - buffer-from "^1.0.0" - inherits "^2.0.3" - readable-stream "^2.2.2" - typedarray "^0.0.6" - - configstore@^3.0.0: - version "3.1.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/configstore/-/configstore-3.1.5.tgz#e9af331fadc14dabd544d3e7e76dc446a09a530f" - integrity sha1-6a8zH63BTavVRNPn523ERqCaUw8= - dependencies: - dot-prop "^4.2.1" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^3.0.0" - - contains-path@^0.1.0: - version "0.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" - integrity sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo= - - content-disposition@0.5.3: - version "0.5.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/content-disposition/-/content-disposition-0.5.3.tgz#e130caf7e7279087c5616c2007d0485698984fbd" - integrity sha1-4TDK9+cnkIfFYWwgB9BIVpiYT70= - dependencies: - safe-buffer "5.1.2" - - content-type@~1.0.4: - version "1.0.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" - integrity sha1-4TjMdeBAxyexlm/l5fjJruJW/js= - - convert-source-map@^1.5.1: - version "1.7.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/convert-source-map/-/convert-source-map-1.7.0.tgz#17a2cb882d7f77d3490585e2ce6c524424a3a442" - integrity sha1-F6LLiC1/d9NJBYXizmxSRCSjpEI= - dependencies: - safe-buffer "~5.1.1" - - cookie-signature@1.0.6: - version "1.0.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" - integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= - - cookie@0.3.1: - version "0.3.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" - integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= - - cookie@0.4.0: - version "0.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cookie/-/cookie-0.4.0.tgz#beb437e7022b3b6d49019d088665303ebe9c14ba" - integrity sha1-vrQ35wIrO21JAZ0IhmUwPr6cFLo= - - cookiejar@^2.0.6: - version "2.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" - integrity sha1-3YojVTB1L5iPmghE8/xYnjERElw= - - copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= - - core-js@^2.4.0: - version "2.6.12" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec" - integrity sha1-2TM9+nsGXjR8xWgiGdb2kIWcwuw= - - core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - - coveralls@^2.11.2: - version "2.13.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/coveralls/-/coveralls-2.13.3.tgz#9ad7c2ae527417f361e8b626483f48ee92dd2bc7" - integrity sha1-mtfCrlJ0F/Nh6LYmSD9I7pLdK8c= - dependencies: - js-yaml "3.6.1" - lcov-parse "0.0.10" - log-driver "1.2.5" - minimist "1.2.0" - request "2.79.0" - - create-error-class@^3.0.0: - version "3.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= - dependencies: - capture-stack-trace "^1.0.0" - - cross-spawn@^4: - version "4.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41" - integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE= - dependencies: - lru-cache "^4.0.1" - which "^1.2.9" - - cross-spawn@^5.0.1: - version "5.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" - integrity sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk= - dependencies: - lru-cache "^4.0.1" - shebang-command "^1.2.0" - which "^1.2.9" - - crypt@0.0.2: - version "0.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/crypt/-/crypt-0.0.2.tgz#88d7ff7ec0dfb86f713dc87bbb42d044d3e6c41b" - integrity sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs= - - cryptiles@2.x.x: - version "2.0.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - integrity sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g= - dependencies: - boom "2.x.x" - - crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - integrity sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4= - - cycle@1.0.x: - version "1.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" - integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI= - - d@1, d@^1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a" - integrity sha1-hpgJU3LVjb7jRv/Qxwk/mfj561o= - dependencies: - es5-ext "^0.10.50" - type "^1.0.1" - - damerau-levenshtein@^1.0.0: - version "1.0.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz#143c1641cb3d85c60c32329e26899adea8701791" - integrity sha1-FDwWQcs9hcYMMjKeJoma3qhwF5E= - - dashdash@^1.12.0: - version "1.14.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA= - dependencies: - assert-plus "^1.0.0" - - debug-log@^1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" - integrity sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8= - - debug@2.6.8: - version "2.6.8" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" - integrity sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw= - dependencies: - ms "2.0.0" - - debug@2.6.9, debug@^2.1.1, debug@^2.2.0, debug@^2.3.3, debug@^2.6.8, debug@^2.6.9: - version "2.6.9" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - integrity sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8= - dependencies: - ms "2.0.0" - - debug@^3.1.0, debug@^3.2.6: - version "3.2.7" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a" - integrity sha1-clgLfpFF+zm2Z2+cXl+xALk0F5o= - dependencies: - ms "^2.1.1" - - decamelize@^1.1.1: - version "1.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA= - - decode-uri-component@^0.2.0: - version "0.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/decode-uri-component/-/decode-uri-component-0.2.0.tgz#eb3913333458775cb84cd1a1fae062106bb87545" - integrity sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU= - - deep-eql@^0.1.3: - version "0.1.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/deep-eql/-/deep-eql-0.1.3.tgz#ef558acab8de25206cd713906d74e56930eb69f2" - integrity sha1-71WKyrjeJSBs1xOQbXTlaTDrafI= - dependencies: - type-detect "0.1.1" - - deep-extend@^0.6.0: - version "0.6.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" - integrity sha1-xPp8lUBKF6nD6Mp+FTcxK3NjMKw= - - deep-is@~0.1.3: - version "0.1.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" - integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= - - deepcopy@^0.6.3: - version "0.6.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/deepcopy/-/deepcopy-0.6.3.tgz#634780f2f8656ab771af8fa8431ed1ccee55c7b0" - integrity sha1-Y0eA8vhlardxr4+oQx7RzO5Vx7A= - - default-require-extensions@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" - integrity sha1-836hXT4T/9m0N9M+GnW1+5eHTLg= - dependencies: - strip-bom "^2.0.0" - - define-properties@^1.1.3: - version "1.1.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" - integrity sha1-z4jabL7ib+bbcJT2HYcMvYTO6fE= - dependencies: - object-keys "^1.0.12" - - define-property@^0.2.5: - version "0.2.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - - define-property@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - - define-property@^2.0.2: - version "2.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha1-1Flono1lS6d+AqgX+HENcCyxbp0= - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - - delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - - denque@^1.1.0: - version "1.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/denque/-/denque-1.5.0.tgz#773de0686ff2d8ec2ff92914316a47b73b1c73de" - integrity sha1-dz3gaG/y2Owv+SkUMWpHtzscc94= - - depd@~1.1.2: - version "1.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - - depd@~2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" - integrity sha1-tpYWPMdXVg0JzyLMj60Vcbeedt8= - - destroy@~1.0.4: - version "1.0.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - - detect-indent@^4.0.0: - version "4.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg= - dependencies: - repeating "^2.0.0" - - diff@3.2.0: - version "3.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" - integrity sha1-yc45Okt8vQsFinJck98pkCeGj/k= - - diff@^3.1.0: - version "3.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" - integrity sha1-gAwN0eCov7yVg1wgKtIg/jF+WhI= - - doctrine@1.3.x: - version "1.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/doctrine/-/doctrine-1.3.0.tgz#13e75682b55518424276f7c173783456ef913d26" - integrity sha1-E+dWgrVVGEJCdvfBc3g0Vu+RPSY= - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - - doctrine@^1.2.2: - version "1.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/doctrine/-/doctrine-1.5.0.tgz#379dce730f6166f76cefa4e6707a159b02c5a6fa" - integrity sha1-N53Ocw9hZvds76TmcHoVmwLFpvo= - dependencies: - esutils "^2.0.2" - isarray "^1.0.0" - - doctrine@^2.0.0: - version "2.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" - integrity sha1-XNAfwQFiG0LEzX9dGmYkNxbT850= - dependencies: - esutils "^2.0.2" - - dot-prop@^4.2.1: - version "4.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/dot-prop/-/dot-prop-4.2.1.tgz#45884194a71fc2cda71cbb4bceb3a4dd2f433ba4" - integrity sha1-RYhBlKcfws2nHLtLzrOk3S9DO6Q= - dependencies: - is-obj "^1.0.0" - - duplexer3@^0.1.4: - version "0.1.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - integrity sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI= - - ecc-jsbn@~0.1.1: - version "0.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9" - integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk= - dependencies: - jsbn "~0.1.0" - safer-buffer "^2.1.0" - - ee-first@1.1.1: - version "1.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" - integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= - - elastic-apm-node-opentracing@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/elastic-apm-node-opentracing/-/elastic-apm-node-opentracing-2.0.0.tgz#91271aab5a1f4c3424758f062aa06c92b047962f" - integrity sha1-kScaq1ofTDQkdY8GKqBskrBHli8= - dependencies: - opentracing "^0.14.3" - - encodeurl@~1.0.2: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" - integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= - - error-ex@^1.2.0: - version "1.3.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf" - integrity sha1-tKxAZIEH/c3PriQvQovqihTU8b8= - dependencies: - is-arrayish "^0.2.1" - - error@7.0.2: - version "7.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/error/-/error-7.0.2.tgz#a5f75fff4d9926126ddac0ea5dc38e689153cb02" - integrity sha1-pfdf/02ZJhJt2sDqXcOOaJFTywI= - dependencies: - string-template "~0.2.1" - xtend "~4.0.0" - - error@^7.0.0: - version "7.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/error/-/error-7.2.1.tgz#eab21a4689b5f684fc83da84a0e390de82d94894" - integrity sha1-6rIaRom19oT8g9qEoOOQ3oLZSJQ= - dependencies: - string-template "~0.2.1" - - es-abstract@^1.17.4: - version "1.18.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es-abstract/-/es-abstract-1.18.0.tgz#ab80b359eecb7ede4c298000390bc5ac3ec7b5a4" - integrity sha1-q4CzWe7Lft5MKYAAOQvFrD7HtaQ= - dependencies: - call-bind "^1.0.2" - es-to-primitive "^1.2.1" - function-bind "^1.1.1" - get-intrinsic "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.2" - is-callable "^1.2.3" - is-negative-zero "^2.0.1" - is-regex "^1.1.2" - is-string "^1.0.5" - object-inspect "^1.9.0" - object-keys "^1.1.1" - object.assign "^4.1.2" - string.prototype.trimend "^1.0.4" - string.prototype.trimstart "^1.0.4" - unbox-primitive "^1.0.0" - - es-to-primitive@^1.2.1: - version "1.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a" - integrity sha1-5VzUyc3BiLzvsDs2bHNjI/xciYo= - dependencies: - is-callable "^1.1.4" - is-date-object "^1.0.1" - is-symbol "^1.0.2" - - es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@~0.10.14: - version "0.10.53" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es5-ext/-/es5-ext-0.10.53.tgz#93c5a3acfdbef275220ad72644ad02ee18368de1" - integrity sha1-k8WjrP2+8nUiCtcmRK0C7hg2jeE= - dependencies: - es6-iterator "~2.0.3" - es6-symbol "~3.1.3" - next-tick "~1.0.0" - - es6-iterator@^2.0.3, es6-iterator@~2.0.1, es6-iterator@~2.0.3: - version "2.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" - integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c= - dependencies: - d "1" - es5-ext "^0.10.35" - es6-symbol "^3.1.1" - - es6-map@^0.1.3: - version "0.1.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es6-map/-/es6-map-0.1.5.tgz#9136e0503dcc06a301690f0bb14ff4e364e949f0" - integrity sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA= - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-set "~0.1.5" - es6-symbol "~3.1.1" - event-emitter "~0.3.5" - - es6-set@^0.1.4, es6-set@~0.1.5: - version "0.1.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" - integrity sha1-0rPsXU2ADO2BjbU40ol02wpzzLE= - dependencies: - d "1" - es5-ext "~0.10.14" - es6-iterator "~2.0.1" - es6-symbol "3.1.1" - event-emitter "~0.3.5" - - es6-symbol@3.1.1: - version "3.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" - integrity sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc= - dependencies: - d "1" - es5-ext "~0.10.14" - - es6-symbol@^3.1.1, es6-symbol@~3.1.1, es6-symbol@~3.1.3: - version "3.1.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18" - integrity sha1-utXTwbzawoJp9MszHkMceKxwXRg= - dependencies: - d "^1.0.1" - ext "^1.1.2" - - es6-weak-map@^2.0.1: - version "2.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/es6-weak-map/-/es6-weak-map-2.0.3.tgz#b6da1f16cc2cc0d9be43e6bdbfc5e7dfcdf31d53" - integrity sha1-ttofFswswNm+Q+a9v8Xn383zHVM= - dependencies: - d "1" - es5-ext "^0.10.46" - es6-iterator "^2.0.3" - es6-symbol "^3.1.1" - - escape-html@~1.0.3: - version "1.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" - integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= - - escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: - version "1.0.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= - - escodegen@1.8.x: - version "1.8.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018" - integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg= - dependencies: - esprima "^2.7.1" - estraverse "^1.9.1" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.2.0" - - escope@^3.6.0: - version "3.6.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/escope/-/escope-3.6.0.tgz#e01975e812781a163a6dadfdd80398dc64c889c3" - integrity sha1-4Bl16BJ4GhY6ba392AOY3GTIicM= - dependencies: - es6-map "^0.1.3" - es6-weak-map "^2.0.1" - esrecurse "^4.1.0" - estraverse "^4.1.1" - - eslint-config-airbnb-base@^8.0.0: - version "8.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eslint-config-airbnb-base/-/eslint-config-airbnb-base-8.0.0.tgz#c5e958a469ab8af76aff068b43d784e5afe74ca7" - integrity sha1-xelYpGmrivdq/waLQ9eE5a/nTKc= - - eslint-config-airbnb@^12.0.0: - version "12.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eslint-config-airbnb/-/eslint-config-airbnb-12.0.0.tgz#ab282b756a25f03d04ac264c24d673a08a803270" - integrity sha1-qygrdWol8D0ErCZMJNZzoIqAMnA= - dependencies: - eslint-config-airbnb-base "^8.0.0" - - eslint-import-resolver-node@^0.2.0: - version "0.2.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eslint-import-resolver-node/-/eslint-import-resolver-node-0.2.3.tgz#5add8106e8c928db2cba232bcd9efa846e3da16c" - integrity sha1-Wt2BBujJKNssuiMrzZ76hG49oWw= - dependencies: - debug "^2.2.0" - object-assign "^4.0.1" - resolve "^1.1.6" - - eslint-plugin-import@^1.16.0: - version "1.16.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eslint-plugin-import/-/eslint-plugin-import-1.16.0.tgz#b2fa07ebcc53504d0f2a4477582ec8bff1871b9f" - integrity sha1-svoH68xTUE0PKkR3WC7Iv/GHG58= - dependencies: - builtin-modules "^1.1.1" - contains-path "^0.1.0" - debug "^2.2.0" - doctrine "1.3.x" - es6-map "^0.1.3" - es6-set "^0.1.4" - eslint-import-resolver-node "^0.2.0" - has "^1.0.1" - lodash.cond "^4.3.0" - lodash.endswith "^4.0.1" - lodash.find "^4.3.0" - lodash.findindex "^4.3.0" - minimatch "^3.0.3" - object-assign "^4.0.1" - pkg-dir "^1.0.0" - pkg-up "^1.0.0" - - eslint-plugin-jsx-a11y@^2.2.2: - version "2.2.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-2.2.3.tgz#4e35cb71b8a7db702ac415c806eb8e8d9ea6c65d" - integrity sha1-TjXLcbin23AqxBXIBuuOjZ6mxl0= - dependencies: - damerau-levenshtein "^1.0.0" - jsx-ast-utils "^1.0.0" - object-assign "^4.0.1" - - eslint-plugin-react@^6.3.0: - version "6.10.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eslint-plugin-react/-/eslint-plugin-react-6.10.3.tgz#c5435beb06774e12c7db2f6abaddcbf900cd3f78" - integrity sha1-xUNb6wZ3ThLH2y9qut3L+QDNP3g= - dependencies: - array.prototype.find "^2.0.1" - doctrine "^1.2.2" - has "^1.0.1" - jsx-ast-utils "^1.3.4" - object.assign "^4.0.4" - - eslint@^3.6.1: - version "3.19.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eslint/-/eslint-3.19.0.tgz#c8fc6201c7f40dd08941b87c085767386a679acc" - integrity sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw= - dependencies: - babel-code-frame "^6.16.0" - chalk "^1.1.3" - concat-stream "^1.5.2" - debug "^2.1.1" - doctrine "^2.0.0" - escope "^3.6.0" - espree "^3.4.0" - esquery "^1.0.0" - estraverse "^4.2.0" - esutils "^2.0.2" - file-entry-cache "^2.0.0" - glob "^7.0.3" - globals "^9.14.0" - ignore "^3.2.0" - imurmurhash "^0.1.4" - inquirer "^0.12.0" - is-my-json-valid "^2.10.0" - is-resolvable "^1.0.0" - js-yaml "^3.5.1" - json-stable-stringify "^1.0.0" - levn "^0.3.0" - lodash "^4.0.0" - mkdirp "^0.5.0" - natural-compare "^1.4.0" - optionator "^0.8.2" - path-is-inside "^1.0.1" - pluralize "^1.2.1" - progress "^1.1.8" - require-uncached "^1.0.2" - shelljs "^0.7.5" - strip-bom "^3.0.0" - strip-json-comments "~2.0.1" - table "^3.7.8" - text-table "~0.2.0" - user-home "^2.0.0" - - espree@^3.4.0: - version "3.5.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" - integrity sha1-sPRHGHyKi+2US4FaZgvd9d610ac= - dependencies: - acorn "^5.5.0" - acorn-jsx "^3.0.0" - - esprima@2.7.x, esprima@^2.6.0, esprima@^2.7.1: - version "2.7.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE= - - esprima@^4.0.0: - version "4.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" - integrity sha1-E7BM2z5sXRnfkatph6hpVhmwqnE= - - esquery@^1.0.0: - version "1.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha1-IUj/w4uC6McFff7UhCWz5h8PJKU= - dependencies: - estraverse "^5.1.0" - - esrecurse@^4.1.0: - version "4.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" - integrity sha1-eteWTWeauyi+5yzsY3WLHF0smSE= - dependencies: - estraverse "^5.2.0" - - estraverse@^1.9.1: - version "1.9.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44" - integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q= - - estraverse@^4.1.1, estraverse@^4.2.0: - version "4.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" - integrity sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0= - - estraverse@^5.1.0, estraverse@^5.2.0: - version "5.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/estraverse/-/estraverse-5.2.0.tgz#307df42547e6cc7324d3cf03c155d5cdb8c53880" - integrity sha1-MH30JUfmzHMk088DwVXVzbjFOIA= - - esutils@^2.0.2: - version "2.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" - integrity sha1-dNLrTeC42hKTcRkQ1Qd1ubcQ72Q= - - etag@~1.8.1: - version "1.8.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" - integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= - - event-emitter@~0.3.5: - version "0.3.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39" - integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk= - dependencies: - d "1" - es5-ext "~0.10.14" - - eventemitter3@1.x.x: - version "1.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" - integrity sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg= - - execa@^0.7.0: - version "0.7.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" - integrity sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c= - dependencies: - cross-spawn "^5.0.1" - get-stream "^3.0.0" - is-stream "^1.1.0" - npm-run-path "^2.0.0" - p-finally "^1.0.0" - signal-exit "^3.0.0" - strip-eof "^1.0.0" - - exit-hook@^1.0.0: - version "1.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" - integrity sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g= - - expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - integrity sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s= - dependencies: - is-posix-bracket "^0.1.0" - - expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - - expand-range@^1.8.1: - version "1.8.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - integrity sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc= - dependencies: - fill-range "^2.1.0" - - express-opentracing@^0.1.1: - version "0.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/express-opentracing/-/express-opentracing-0.1.1.tgz#5a6244c5d4dd41117d1805922fb08d21328f7a4d" - integrity sha1-WmJExdTdQRF9GAWSL7CNITKPek0= - dependencies: - opentracing "^0.14.0" - - express@^4.14.0: - version "4.17.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" - integrity sha1-RJH8OGBc9R+GKdOcK10Cb5ikwTQ= - dependencies: - accepts "~1.3.7" - array-flatten "1.1.1" - body-parser "1.19.0" - content-disposition "0.5.3" - content-type "~1.0.4" - cookie "0.4.0" - cookie-signature "1.0.6" - debug "2.6.9" - depd "~1.1.2" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - finalhandler "~1.1.2" - fresh "0.5.2" - merge-descriptors "1.0.1" - methods "~1.1.2" - on-finished "~2.3.0" - parseurl "~1.3.3" - path-to-regexp "0.1.7" - proxy-addr "~2.0.5" - qs "6.7.0" - range-parser "~1.2.1" - safe-buffer "5.1.2" - send "0.17.1" - serve-static "1.14.1" - setprototypeof "1.1.1" - statuses "~1.5.0" - type-is "~1.6.18" - utils-merge "1.0.1" - vary "~1.1.2" - - ext@^1.1.2: - version "1.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ext/-/ext-1.4.0.tgz#89ae7a07158f79d35517882904324077e4379244" - integrity sha1-ia56BxWPedNVF4gpBDJAd+Q3kkQ= - dependencies: - type "^2.0.0" - - extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - - extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - - extend@^3.0.0, extend@~3.0.0, extend@~3.0.2: - version "3.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha1-+LETa0Bx+9jrFAr/hYsQGewpFfo= - - extglob@^0.3.1: - version "0.3.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - integrity sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE= - dependencies: - is-extglob "^1.0.0" - - extglob@^2.0.4: - version "2.0.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha1-rQD+TcYSqSMuhxhxHcXLWrAoVUM= - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - - extsprintf@1.3.0: - version "1.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU= - - extsprintf@^1.2.0: - version "1.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8= - - eyes@0.1.x: - version "0.1.8" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" - integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= - - fast-deep-equal@^3.1.1: - version "3.1.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" - integrity sha1-On1WtVnWy8PrUSMlJE5hmmXGxSU= - - fast-json-stable-stringify@^2.0.0: - version "2.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" - integrity sha1-h0v2nG9ATCtdmcSBNBOZ/VWJJjM= - - fast-levenshtein@~2.0.6: - version "2.0.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" - integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= - - figures@^1.3.5: - version "1.7.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" - integrity sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4= - dependencies: - escape-string-regexp "^1.0.5" - object-assign "^4.1.0" - - file-entry-cache@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" - integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= - dependencies: - flat-cache "^1.2.1" - object-assign "^4.0.1" - - file-uri-to-path@1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" - integrity sha1-VTp7hEb/b2hDWcRF8eN6BdrMM90= - - filename-regex@^2.0.0: - version "2.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - integrity sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY= - - fill-range@^2.1.0: - version "2.2.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fill-range/-/fill-range-2.2.4.tgz#eb1e773abb056dcd8df2bfdf6af59b8b3a936565" - integrity sha1-6x53OrsFbc2N8r/favWbizqTZWU= - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^3.0.0" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - - fill-range@^4.0.0: - version "4.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - - finalhandler@~1.1.2: - version "1.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha1-t+fQAP/RGTjQ/bBTUG9uur6fWH0= - dependencies: - debug "2.6.9" - encodeurl "~1.0.2" - escape-html "~1.0.3" - on-finished "~2.3.0" - parseurl "~1.3.3" - statuses "~1.5.0" - unpipe "~1.0.0" - - find-cache-dir@^0.1.1: - version "0.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/find-cache-dir/-/find-cache-dir-0.1.1.tgz#c8defae57c8a52a8a784f9e31c57c742e993a0b9" - integrity sha1-yN765XyKUqinhPnjHFfHQumToLk= - dependencies: - commondir "^1.0.1" - mkdirp "^0.5.1" - pkg-dir "^1.0.0" - - find-up@^1.0.0: - version "1.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8= - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - - find-up@^2.1.0: - version "2.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - - flat-cache@^1.2.1: - version "1.3.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/flat-cache/-/flat-cache-1.3.4.tgz#2c2ef77525cc2929007dfffa1dd314aa9c9dee6f" - integrity sha1-LC73dSXMKSkAff/6HdMUqpyd7m8= - dependencies: - circular-json "^0.3.1" - graceful-fs "^4.1.2" - rimraf "~2.6.2" - write "^0.2.1" - - flexbuffer@0.0.6: - version "0.0.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/flexbuffer/-/flexbuffer-0.0.6.tgz#039fdf23f8823e440c38f3277e6fef1174215b30" - integrity sha1-A5/fI/iCPkQMOPMnfm/vEXQhWzA= - - for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - - for-own@^0.1.4: - version "0.1.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - integrity sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4= - dependencies: - for-in "^1.0.1" - - foreground-child@^1.5.3, foreground-child@^1.5.6: - version "1.5.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/foreground-child/-/foreground-child-1.5.6.tgz#4fd71ad2dfde96789b980a5c0a295937cb2f5ce9" - integrity sha1-T9ca0t/elnibmApcCilZN8svXOk= - dependencies: - cross-spawn "^4" - signal-exit "^3.0.0" - - foreman@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/foreman/-/foreman-2.0.0.tgz#00acd20f9dbbe2f79d04697bcca2a77ee00ee031" - integrity sha1-AKzSD5274vedBGl7zKKnfuAO4DE= - dependencies: - commander "~2.9.0" - http-proxy "~1.11.1" - mustache "^2.2.1" - shell-quote "~1.4.2" - - forever-agent@~0.6.1: - version "0.6.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE= - - form-data@1.0.0-rc4: - version "1.0.0-rc4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/form-data/-/form-data-1.0.0-rc4.tgz#05ac6bc22227b43e4461f488161554699d4f8b5e" - integrity sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14= - dependencies: - async "^1.5.2" - combined-stream "^1.0.5" - mime-types "^2.1.10" - - form-data@~2.1.1: - version "2.1.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - integrity sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE= - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - - form-data@~2.3.2: - version "2.3.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6" - integrity sha1-3M5SwF9kTymManq5Nr1yTO/786Y= - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - - formidable@^1.0.17: - version "1.2.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9" - integrity sha1-v2muopcpgmdfAIZTQrmCmG9rjdk= - - forwarded@~0.1.2: - version "0.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" - integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= - - fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - - fresh@0.5.2: - version "0.5.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" - integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= - - fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - - fsevents@^1.2.7: - version "1.2.13" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/fsevents/-/fsevents-1.2.13.tgz#f325cb0455592428bcf11b383370ef70e3bfcc38" - integrity sha1-8yXLBFVZJCi88Rs4M3DvcOO/zDg= - dependencies: - bindings "^1.5.0" - nan "^2.12.1" - - function-bind@^1.1.1: - version "1.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0= - - gelf@^2.0.1: - version "2.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/gelf/-/gelf-2.0.1.tgz#3973c746b09f62de6cf05811407939471158bb0e" - integrity sha1-OXPHRrCfYt5s8FgRQHk5RxFYuw4= - dependencies: - async "^2.5.0" - - generate-function@^2.0.0: - version "2.3.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/generate-function/-/generate-function-2.3.1.tgz#f069617690c10c868e73b8465746764f97c3479f" - integrity sha1-8GlhdpDBDIaOc7hGV0Z2T5fDR58= - dependencies: - is-property "^1.0.2" - - generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - integrity sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA= - dependencies: - is-property "^1.0.0" - - get-caller-file@^1.0.1: - version "1.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a" - integrity sha1-+Xj6TJDR3+f/LWvtoqUV5xO9z0o= - - get-intrinsic@^1.0.2, get-intrinsic@^1.1.1: - version "1.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6" - integrity sha1-FfWfN2+FXERpY5SPDSTNNje0q8Y= - dependencies: - function-bind "^1.1.1" - has "^1.0.3" - has-symbols "^1.0.1" - - get-stream@^3.0.0: - version "3.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= - - get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - - getpass@^0.1.1: - version "0.1.7" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo= - dependencies: - assert-plus "^1.0.0" - - glob-base@^0.3.0: - version "0.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - integrity sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q= - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - - glob-parent@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - integrity sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg= - dependencies: - is-glob "^2.0.0" - - glob-parent@^3.1.0: - version "3.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - integrity sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4= - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - - glob@7.1.1: - version "7.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" - integrity sha1-gFIR3wT6rxxjo2ADBs31reULLsg= - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" - - glob@^5.0.15: - version "5.0.15" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E= - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - - glob@^7.0.0, glob@^7.0.3, glob@^7.0.6, glob@^7.1.3: - version "7.1.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha1-FB8zuBp8JJLhJVlDB0gMRmeSeKY= - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - - global-dirs@^0.1.0: - version "0.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/global-dirs/-/global-dirs-0.1.1.tgz#b319c0dd4607f353f3be9cca4c72fc148c49f445" - integrity sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU= - dependencies: - ini "^1.3.4" - - globals@^9.14.0, globals@^9.18.0: - version "9.18.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - integrity sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo= - - got@^6.7.1: - version "6.7.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= - dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - - graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.2.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha1-/wQLKwhTsjw9MQJ1I3BvGIXXa+4= - - "graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= - - growl@1.9.2: - version "1.9.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" - integrity sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8= - - handlebars@^4.0.1, handlebars@^4.0.3: - version "4.7.7" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha1-nOM0FqrQLb1sj6+oJA1dmABJRaE= - dependencies: - minimist "^1.2.5" - neo-async "^2.6.0" - source-map "^0.6.1" - wordwrap "^1.0.0" - optionalDependencies: - uglify-js "^3.1.4" - - har-schema@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" - integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI= - - har-validator@~2.0.6: - version "2.0.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" - integrity sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0= - dependencies: - chalk "^1.1.1" - commander "^2.9.0" - is-my-json-valid "^2.12.4" - pinkie-promise "^2.0.0" - - har-validator@~5.1.3: - version "5.1.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd" - integrity sha1-HwgDufjLIMD6E4It8ezds2veHv0= - dependencies: - ajv "^6.12.3" - har-schema "^2.0.0" - - has-ansi@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= - dependencies: - ansi-regex "^2.0.0" - - has-bigints@^1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113" - integrity sha1-ZP5qywIGc+O3jbA1pa9pqp0HsRM= - - has-flag@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo= - - has-flag@^3.0.0: - version "3.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" - integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= - - has-symbols@^1.0.1, has-symbols@^1.0.2: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423" - integrity sha1-Fl0wcMADCXUqEjakeTMeOsVvFCM= - - has-value@^0.3.1: - version "0.3.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - - has-value@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - - has-values@^0.1.4: - version "0.1.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - - has-values@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - - has@^1.0.1, has@^1.0.3: - version "1.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha1-ci18v8H2qoJB8W3YFOAR4fQeh5Y= - dependencies: - function-bind "^1.1.1" - - hawk@~3.1.3: - version "3.1.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - integrity sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ= - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - - he@1.1.1: - version "1.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" - integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0= - - hexer@^1.5.0: - version "1.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/hexer/-/hexer-1.5.0.tgz#b86ce808598e8a9d1892c571f3cedd86fc9f0653" - integrity sha1-uGzoCFmOip0YksVx887dhvyfBlM= - dependencies: - ansi-color "^0.2.1" - minimist "^1.1.0" - process "^0.10.0" - xtend "^4.0.0" - - hoek@2.x.x: - version "2.16.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - integrity sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0= - - hosted-git-info@^2.1.4: - version "2.8.9" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" - integrity sha1-3/wL+aIcAiCQkPKqaUKeFBTa8/k= - - http-errors@1.7.2: - version "1.7.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" - integrity sha1-T1ApzxMjnzEDblsuVSkrz7zIXI8= - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - - http-errors@~1.7.2: - version "1.7.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/http-errors/-/http-errors-1.7.3.tgz#6c619e4f9c60308c38519498c14fbb10aacebb06" - integrity sha1-bGGeT5xgMIw4UZSYwU+7EKrOuwY= - dependencies: - depd "~1.1.2" - inherits "2.0.4" - setprototypeof "1.1.1" - statuses ">= 1.5.0 < 2" - toidentifier "1.0.0" - - http-proxy@~1.11.1: - version "1.11.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/http-proxy/-/http-proxy-1.11.3.tgz#1915dc888751e2a6bf3c2abfcb1808fa86c72353" - integrity sha1-GRXciIdR4qa/PCq/yxgI+obHI1M= - dependencies: - eventemitter3 "1.x.x" - requires-port "0.x.x" - - http-signature@~1.1.0: - version "1.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - integrity sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8= - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - - http-signature@~1.2.0: - version "1.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" - integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE= - dependencies: - assert-plus "^1.0.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - - iconv-lite@0.4.24: - version "0.4.24" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha1-ICK0sl+93CHS9SSXSkdKr+czkIs= - dependencies: - safer-buffer ">= 2.1.2 < 3" - - ignore-by-default@^1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09" - integrity sha1-SMptcvbGo68Aqa1K5odr44ieKwk= - - ignore@^3.2.0: - version "3.3.10" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" - integrity sha1-Cpf7h2mG6AgcYxFg+PnziRV/AEM= - - import-lazy@^2.1.0: - version "2.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" - integrity sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM= - - imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= - - inflight@^1.0.4: - version "1.0.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - - inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha1-D6LGT5MpF8NDOg3tVTY6rjdBa3w= - - inherits@2.0.3: - version "2.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= - - ini@^1.3.4, ini@~1.3.0: - version "1.3.8" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" - integrity sha1-op2kJbSIBvNHZ6Tvzjlyaa8oQyw= - - inquirer@^0.12.0: - version "0.12.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/inquirer/-/inquirer-0.12.0.tgz#1ef2bfd63504df0bc75785fff8c2c41df12f077e" - integrity sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34= - dependencies: - ansi-escapes "^1.1.0" - ansi-regex "^2.0.0" - chalk "^1.0.0" - cli-cursor "^1.0.1" - cli-width "^2.0.0" - figures "^1.3.5" - lodash "^4.3.0" - readline2 "^1.0.1" - run-async "^0.1.0" - rx-lite "^3.1.2" - string-width "^1.0.1" - strip-ansi "^3.0.0" - through "^2.3.6" - - interpret@^1.0.0: - version "1.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/interpret/-/interpret-1.4.0.tgz#665ab8bc4da27a774a40584e812e3e0fa45b1a1e" - integrity sha1-Zlq4vE2iendKQFhOgS4+D6RbGh4= - - invariant@^2.2.2: - version "2.2.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" - integrity sha1-YQ88ksk1nOHbYW5TgAjSP/NRWOY= - dependencies: - loose-envify "^1.0.0" - - invert-kv@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY= - - ioredis@^3.1.4: - version "3.2.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ioredis/-/ioredis-3.2.2.tgz#b7d5ff3afd77bb9718bb2821329b894b9a44c00b" - integrity sha1-t9X/Ov13u5cYuyghMpuJS5pEwAs= - dependencies: - bluebird "^3.3.4" - cluster-key-slot "^1.0.6" - debug "^2.6.9" - denque "^1.1.0" - flexbuffer "0.0.6" - lodash.assign "^4.2.0" - lodash.bind "^4.2.1" - lodash.clone "^4.5.0" - lodash.clonedeep "^4.5.0" - lodash.defaults "^4.2.0" - lodash.difference "^4.5.0" - lodash.flatten "^4.4.0" - lodash.foreach "^4.5.0" - lodash.isempty "^4.4.0" - lodash.keys "^4.2.0" - lodash.noop "^3.0.1" - lodash.partial "^4.2.1" - lodash.pick "^4.4.0" - lodash.sample "^4.2.1" - lodash.shuffle "^4.2.0" - lodash.values "^4.3.0" - redis-commands "^1.2.0" - redis-parser "^2.4.0" - - ipaddr.js@1.9.1: - version "1.9.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" - integrity sha1-v/OFQ+64mEglB5/zoqjmy9RngbM= - - is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - - is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha1-FpwvbT3x+ZJhgHI2XJsOofaHhlY= - dependencies: - kind-of "^6.0.0" - - is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0= - - is-bigint@^1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-bigint/-/is-bigint-1.0.1.tgz#6923051dfcbc764278540b9ce0e6b3213aa5ebc2" - integrity sha1-aSMFHfy8dkJ4VAuc4OazITql68I= - - is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - integrity sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg= - dependencies: - binary-extensions "^1.0.0" - - is-boolean-object@^1.1.0: - version "1.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-boolean-object/-/is-boolean-object-1.1.0.tgz#e2aaad3a3a8fca34c28f6eee135b156ed2587ff0" - integrity sha1-4qqtOjqPyjTCj27uE1sVbtJYf/A= - dependencies: - call-bind "^1.0.0" - - is-buffer@^1.1.5, is-buffer@~1.1.6: - version "1.1.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha1-76ouqdqg16suoTqXsritUf776L4= - - is-callable@^1.1.4, is-callable@^1.2.3: - version "1.2.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-callable/-/is-callable-1.2.3.tgz#8b1e0500b73a1d76c70487636f368e519de8db8e" - integrity sha1-ix4FALc6HXbHBIdjbzaOUZ3o244= - - is-ci@^1.0.10: - version "1.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-ci/-/is-ci-1.2.1.tgz#e3779c8ee17fccf428488f6e281187f2e632841c" - integrity sha1-43ecjuF/zPQoSI9uKBGH8uYyhBw= - dependencies: - ci-info "^1.5.0" - - is-core-module@^2.2.0: - version "2.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-core-module/-/is-core-module-2.2.0.tgz#97037ef3d52224d85163f5597b2b63d9afed981a" - integrity sha1-lwN+89UiJNhRY/VZeytj2a/tmBo= - dependencies: - has "^1.0.3" - - is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - - is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha1-2Eh2Mh0Oet0DmQQGq7u9NrqSaMc= - dependencies: - kind-of "^6.0.0" - - is-date-object@^1.0.1: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-date-object/-/is-date-object-1.0.2.tgz#bda736f2cd8fd06d32844e7743bfa7494c3bfd7e" - integrity sha1-vac28s2P0G0yhE53Q7+nSUw7/X4= - - is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha1-Nm2CQN3kh8pRgjsaufB6EKeCUco= - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - - is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha1-OxWXRqZmBLBPjIFSS6NlxfFNhuw= - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - - is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - integrity sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE= - - is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - integrity sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ= - dependencies: - is-primitive "^2.0.0" - - is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - - is-extendable@^1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha1-p0cPnkJnM9gb2B4RVSZOOjUHyrQ= - dependencies: - is-plain-object "^2.0.4" - - is-extglob@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - integrity sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA= - - is-extglob@^2.1.0, is-extglob@^2.1.1: - version "2.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - - is-finite@^1.0.0: - version "1.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3" - integrity sha1-kEE1x3+0LAZB1qobzbxNqo2ggvM= - - is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs= - dependencies: - number-is-nan "^1.0.0" - - is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - - is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - integrity sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM= - dependencies: - is-extglob "^1.0.0" - - is-glob@^3.1.0: - version "3.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - integrity sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo= - dependencies: - is-extglob "^2.1.0" - - is-glob@^4.0.0: - version "4.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha1-dWfb6fL14kZ7x3q4PEopSCQHpdw= - dependencies: - is-extglob "^2.1.1" - - is-installed-globally@^0.1.0: - version "0.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-installed-globally/-/is-installed-globally-0.1.0.tgz#0dfd98f5a9111716dd535dda6492f67bf3d25a80" - integrity sha1-Df2Y9akRFxbdU13aZJL2e/PSWoA= - dependencies: - global-dirs "^0.1.0" - is-path-inside "^1.0.0" - - is-my-ip-valid@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" - integrity sha1-ezUbjo7dTTmV1NBmaA5mTZRpaCQ= - - is-my-json-valid@^2.10.0, is-my-json-valid@^2.12.4: - version "2.20.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-my-json-valid/-/is-my-json-valid-2.20.5.tgz#5eca6a8232a687f68869b7361be1612e7512e5df" - integrity sha1-XspqgjKmh/aIabc2G+FhLnUS5d8= - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - is-my-ip-valid "^1.0.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - - is-negative-zero@^2.0.1: - version "2.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-negative-zero/-/is-negative-zero-2.0.1.tgz#3de746c18dda2319241a53675908d8f766f11c24" - integrity sha1-PedGwY3aIxkkGlNnWQjY92bxHCQ= - - is-npm@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - integrity sha1-8vtjpl5JBbQGyGBydloaTceTufQ= - - is-number-object@^1.0.4: - version "1.0.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-number-object/-/is-number-object-1.0.4.tgz#36ac95e741cf18b283fc1ddf5e83da798e3ec197" - integrity sha1-NqyV50HPGLKD/B3fXoPaeY4+wZc= - - is-number@^2.1.0: - version "2.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - integrity sha1-Afy7s5NGOlSPL0ZszhbezknbkI8= - dependencies: - kind-of "^3.0.2" - - is-number@^3.0.0: - version "3.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - - is-number@^4.0.0: - version "4.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" - integrity sha1-ACbjf1RU1z41bf5lZGmYZ8an8P8= - - is-obj@^1.0.0: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - integrity sha1-PkcprB9f3gJc19g6iW2rn09n2w8= - - is-path-inside@^1.0.0: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" - integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= - dependencies: - path-is-inside "^1.0.1" - - is-plain-object@^2.0.3, is-plain-object@^2.0.4: - version "2.0.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" - integrity sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc= - dependencies: - isobject "^3.0.1" - - is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - integrity sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q= - - is-primitive@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - integrity sha1-IHurkWOEmcB7Kt8kCkGochADRXU= - - is-property@^1.0.0, is-property@^1.0.2: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - integrity sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ= - - is-redirect@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= - - is-regex@^1.1.2: - version "1.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-regex/-/is-regex-1.1.2.tgz#81c8ebde4db142f2cf1c53fc86d6a45788266251" - integrity sha1-gcjr3k2xQvLPHFP8htakV4gmYlE= - dependencies: - call-bind "^1.0.2" - has-symbols "^1.0.1" - - is-resolvable@^1.0.0: - version "1.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" - integrity sha1-+xj4fOH+uSUWnJpAfBkxijIG7Yg= - - is-retry-allowed@^1.0.0: - version "1.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" - integrity sha1-13hIi9CkZmo76KFIK58rqv7eqLQ= - - is-stream@^1.0.0, is-stream@^1.1.0: - version "1.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= - - is-string@^1.0.5: - version "1.0.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" - integrity sha1-QEk+0ZjvP/R3uMf5L2ROyCpc06Y= - - is-symbol@^1.0.2, is-symbol@^1.0.3: - version "1.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" - integrity sha1-OOEBS55jKb4N6dJKQU/XRB7GGTc= - dependencies: - has-symbols "^1.0.1" - - is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= - - is-utf8@^0.2.0: - version "0.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI= - - is-windows@^1.0.2: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha1-0YUOuXkezRjmGCzhKjDzlmNLsZ0= - - isarray@0.0.1: - version "0.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8= - - isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - - isexe@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= - - isobject@^2.0.0: - version "2.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - - isobject@^3.0.0, isobject@^3.0.1: - version "3.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" - integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= - - isstream@0.1.x, isstream@~0.1.2: - version "0.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= - - istanbul-coveralls@^1.0.3: - version "1.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/istanbul-coveralls/-/istanbul-coveralls-1.0.3.tgz#4f1c1592be104d591f933cbf9c0f2f5284adcf00" - integrity sha1-TxwVkr4QTVkfkzy/nA8vUoStzwA= - dependencies: - chalk "^1.0.0" - coveralls "^2.11.2" - minimist "^1.1.1" - rimraf "^2.3.4" - sum-up "^1.0.1" - - istanbul-lib-coverage@^1.1.2, istanbul-lib-coverage@^1.2.1: - version "1.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0" - integrity sha1-zPftzQoLubj3Kf7rCTBHD5r2ZPA= - - istanbul-lib-hook@^1.1.0: - version "1.2.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86" - integrity sha1-vGvwfxKmQfvxyFOR0Nqo8K6mv4Y= - dependencies: - append-transform "^0.4.0" - - istanbul-lib-instrument@^1.10.0: - version "1.10.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca" - integrity sha1-H1XtEKw8R/K93dUweTUSZ1TQqco= - dependencies: - babel-generator "^6.18.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babylon "^6.18.0" - istanbul-lib-coverage "^1.2.1" - semver "^5.3.0" - - istanbul-lib-report@^1.1.3: - version "1.1.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c" - integrity sha1-8qZX/GKC+WFwqvKB6zCkWPf0Fww= - dependencies: - istanbul-lib-coverage "^1.2.1" - mkdirp "^0.5.1" - path-parse "^1.0.5" - supports-color "^3.1.2" - - istanbul-lib-source-maps@^1.2.3: - version "1.2.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f" - integrity sha1-N7n/ZhWA+PyhEjJ1LuQuCMZnXY8= - dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^1.2.1" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" - - istanbul-reports@^1.4.0: - version "1.5.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a" - integrity sha1-l+Tb87UV6MSEyuoV1lJO69P/Tho= - dependencies: - handlebars "^4.0.3" - - istanbul@^0.4.5: - version "0.4.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b" - integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs= - dependencies: - abbrev "1.0.x" - async "1.x" - escodegen "1.8.x" - esprima "2.7.x" - glob "^5.0.15" - handlebars "^4.0.1" - js-yaml "3.x" - mkdirp "0.5.x" - nopt "3.x" - once "1.x" - resolve "1.1.x" - supports-color "^3.1.0" - which "^1.1.1" - wordwrap "^1.0.0" - - jaeger-client@^3.18.0: - version "3.18.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/jaeger-client/-/jaeger-client-3.18.1.tgz#a8c7a778244ba117f4fb8775eb6aa5508703564e" - integrity sha1-qMeneCRLoRf0+4d162qlUIcDVk4= - dependencies: - node-int64 "^0.4.0" - opentracing "^0.14.4" - thriftrw "^3.5.0" - uuid "^3.2.1" - xorshift "^0.2.0" - - "js-tokens@^3.0.0 || ^4.0.0": - version "4.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" - integrity sha1-GSA/tZmR35jjoocFDUZHzerzJJk= - - js-tokens@^3.0.2: - version "3.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" - integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= - - js-yaml@3.6.1: - version "3.6.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" - integrity sha1-bl/mfYsgXOTSL60Ft3geja3MSzA= - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - - js-yaml@3.x, js-yaml@^3.5.1: - version "3.14.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" - integrity sha1-2ugS/bOCX6MGYJqHFzg8UMNqBTc= - dependencies: - argparse "^1.0.7" - esprima "^4.0.0" - - jsbn@~0.1.0: - version "0.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM= - - jsesc@^1.3.0: - version "1.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s= - - json-schema-traverse@^0.4.1: - version "0.4.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" - integrity sha1-afaofZUTq4u4/mO9sJecRI5oRmA= - - json-schema@0.2.3: - version "0.2.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - integrity sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM= - - json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - integrity sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8= - dependencies: - jsonify "~0.0.0" - - json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus= - - json3@3.3.2: - version "3.3.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - integrity sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE= - - jsonify@~0.0.0: - version "0.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - integrity sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM= - - jsonpointer@^4.0.0: - version "4.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/jsonpointer/-/jsonpointer-4.1.0.tgz#501fb89986a2389765ba09e6053299ceb4f2c2cc" - integrity sha1-UB+4mYaiOJdlugnmBTKZzrTywsw= - - jsonschema@^1.1.0: - version "1.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/jsonschema/-/jsonschema-1.4.0.tgz#1afa34c4bc22190d8e42271ec17ac8b3404f87b2" - integrity sha1-Gvo0xLwiGQ2OQicewXrIs0BPh7I= - - jsprim@^1.2.2: - version "1.4.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - integrity sha1-MT5mvB5cwG5Di8G3SZwuXFastqI= - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - - jsx-ast-utils@^1.0.0, jsx-ast-utils@^1.3.4: - version "1.4.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/jsx-ast-utils/-/jsx-ast-utils-1.4.1.tgz#3867213e8dd79bf1e8f2300c0cfc1efb182c0df1" - integrity sha1-OGchPo3Xm/Ho8jAMDPwe+xgsDfE= - - just-extend@^4.0.2: - version "4.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/just-extend/-/just-extend-4.2.1.tgz#ef5e589afb61e5d66b24eca749409a8939a8c744" - integrity sha1-715Ymvth5dZrJOynSUCaiTmox0Q= - - kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - - kind-of@^4.0.0: - version "4.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - - kind-of@^5.0.0: - version "5.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha1-cpyR4thXt6QZofmqZWhcTDP1hF0= - - kind-of@^6.0.0, kind-of@^6.0.2: - version "6.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" - integrity sha1-B8BQNKbDSfoG4k+jWqdttFgM5N0= - - latest-version@^3.0.0: - version "3.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" - integrity sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU= - dependencies: - package-json "^4.0.0" - - lcid@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU= - dependencies: - invert-kv "^1.0.0" - - lcov-parse@0.0.10: - version "0.0.10" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" - integrity sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM= - - levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - - load-json-file@^1.0.0: - version "1.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA= - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - - locate-path@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" - integrity sha1-K1aLJl7slExtnA3pw9u7ygNUzY4= - dependencies: - p-locate "^2.0.0" - path-exists "^3.0.0" - - lodash._baseassign@^3.0.0: - version "3.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" - integrity sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4= - dependencies: - lodash._basecopy "^3.0.0" - lodash.keys "^3.0.0" - - lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - integrity sha1-jaDmqHbPNEwK2KVIghEd08XHyjY= - - lodash._basecreate@^3.0.0: - version "3.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" - integrity sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE= - - lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U= - - lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - integrity sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw= - - lodash.assign@^4.2.0: - version "4.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7" - integrity sha1-DZnzzNem0mHRm9rrkkUAXShYCOc= - - lodash.bind@^4.2.1: - version "4.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35" - integrity sha1-euMBfpOWIqwxt9fX3LGzTbFpDTU= - - lodash.clone@^4.5.0: - version "4.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" - integrity sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y= - - lodash.clonedeep@^4.5.0: - version "4.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" - integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8= - - lodash.cond@^4.3.0: - version "4.5.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.cond/-/lodash.cond-4.5.2.tgz#f471a1da486be60f6ab955d17115523dd1d255d5" - integrity sha1-9HGh2khr5g9quVXRcRVSPdHSVdU= - - lodash.create@3.1.1: - version "3.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" - integrity sha1-1/KEnw29p+BGgruM1yqwIkYd6+c= - dependencies: - lodash._baseassign "^3.0.0" - lodash._basecreate "^3.0.0" - lodash._isiterateecall "^3.0.0" - - lodash.defaults@^4.2.0: - version "4.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c" - integrity sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw= - - lodash.difference@^4.5.0: - version "4.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.difference/-/lodash.difference-4.5.0.tgz#9ccb4e505d486b91651345772885a2df27fd017c" - integrity sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw= - - lodash.endswith@^4.0.1: - version "4.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" - integrity sha1-/tWawXOO0+I27dcGTsRWRIs3vAk= - - lodash.find@^4.3.0: - version "4.6.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" - integrity sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E= - - lodash.findindex@^4.3.0: - version "4.6.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.findindex/-/lodash.findindex-4.6.0.tgz#a3245dee61fb9b6e0624b535125624bb69c11106" - integrity sha1-oyRd7mH7m24GJLU1ElYku2nBEQY= - - lodash.flatten@^4.4.0: - version "4.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.flatten/-/lodash.flatten-4.4.0.tgz#f31c22225a9632d2bbf8e4addbef240aa765a61f" - integrity sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8= - - lodash.foreach@^4.5.0: - version "4.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53" - integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM= - - lodash.get@^4.4.2: - version "4.4.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" - integrity sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk= - - lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - integrity sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo= - - lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - integrity sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U= - - lodash.isempty@^4.4.0: - version "4.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.isempty/-/lodash.isempty-4.4.0.tgz#6f86cbedd8be4ec987be9aaf33c9684db1b31e7e" - integrity sha1-b4bL7di+TsmHvpqvM8loTbGzHn4= - - lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - integrity sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo= - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - - lodash.keys@^4.2.0: - version "4.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.keys/-/lodash.keys-4.2.0.tgz#a08602ac12e4fb83f91fc1fb7a360a4d9ba35205" - integrity sha1-oIYCrBLk+4P5H8H7ejYKTZujUgU= - - lodash.noop@^3.0.1: - version "3.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.noop/-/lodash.noop-3.0.1.tgz#38188f4d650a3a474258439b96ec45b32617133c" - integrity sha1-OBiPTWUKOkdCWEObluxFsyYXEzw= - - lodash.partial@^4.2.1: - version "4.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.partial/-/lodash.partial-4.2.1.tgz#49f3d8cfdaa3bff8b3a91d127e923245418961d4" - integrity sha1-SfPYz9qjv/izqR0SfpIyRUGJYdQ= - - lodash.pick@^4.4.0: - version "4.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" - integrity sha1-UvBWEP/53tQiYRRB7R/BI6AwAbM= - - lodash.sample@^4.2.1: - version "4.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.sample/-/lodash.sample-4.2.1.tgz#5e4291b0c753fa1abeb0aab8fb29df1b66f07f6d" - integrity sha1-XkKRsMdT+hq+sKq4+ynfG2bwf20= - - lodash.shuffle@^4.2.0: - version "4.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.shuffle/-/lodash.shuffle-4.2.0.tgz#145b5053cf875f6f5c2a33f48b6e9948c6ec7b4b" - integrity sha1-FFtQU8+HX29cKjP0i26ZSMbse0s= - - lodash.values@^4.3.0: - version "4.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347" - integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c= - - lodash@^4.0.0, lodash@^4.16.2, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.3.0: - version "4.17.21" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" - integrity sha1-Z5WRxWTDv/quhFTPCz3zcMPWkRw= - - log-driver@1.2.5: - version "1.2.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" - integrity sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY= - - lolex@^2.2.0: - version "2.7.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lolex/-/lolex-2.7.5.tgz#113001d56bfc7e02d56e36291cc5c413d1aa0733" - integrity sha1-ETAB1Wv8fgLVbjYpHMXEE9GqBzM= - - lolex@^5.0.1: - version "5.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lolex/-/lolex-5.1.2.tgz#953694d098ce7c07bc5ed6d0e42bc6c0c6d5a367" - integrity sha1-lTaU0JjOfAe8XtbQ5CvGwMbVo2c= - dependencies: - "@sinonjs/commons" "^1.7.0" - - long@^2.4.0: - version "2.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/long/-/long-2.4.0.tgz#9fa180bb1d9500cdc29c4156766a1995e1f4524f" - integrity sha1-n6GAux2VAM3CnEFWdmoZleH0Uk8= - - loose-envify@^1.0.0: - version "1.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" - integrity sha1-ce5R+nvkyuwaY4OffmgtgTLTDK8= - dependencies: - js-tokens "^3.0.0 || ^4.0.0" - - lowercase-keys@^1.0.0: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" - integrity sha1-b54wtHCE2XGnyCD/FabFFnt0wm8= - - lru-cache@^4.0.1: - version "4.1.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" - integrity sha1-i75Q6oW+1ZvJ4z3KuCNe6bz0Q80= - dependencies: - pseudomap "^1.0.2" - yallist "^2.1.2" - - make-dir@^1.0.0: - version "1.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" - integrity sha1-ecEDO4BRW9bSTsmTPoYMp17ifww= - dependencies: - pify "^3.0.0" - - map-cache@^0.2.2: - version "0.2.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - - map-visit@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - - math-random@^1.0.1: - version "1.0.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/math-random/-/math-random-1.0.4.tgz#5dd6943c938548267016d4e34f057583080c514c" - integrity sha1-XdaUPJOFSCZwFtTjTwV1gwgMUUw= - - md5-hex@^1.2.0: - version "1.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/md5-hex/-/md5-hex-1.3.0.tgz#d2c4afe983c4370662179b8cad145219135046c4" - integrity sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ= - dependencies: - md5-o-matic "^0.1.1" - - md5-o-matic@^0.1.1: - version "0.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/md5-o-matic/-/md5-o-matic-0.1.1.tgz#822bccd65e117c514fab176b25945d54100a03c3" - integrity sha1-givM1l4RfFFPqxdrJZRdVBAKA8M= - - md5@^2.2.1: - version "2.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/md5/-/md5-2.3.0.tgz#c3da9a6aae3a30b46b7b0c349b87b110dc3bda4f" - integrity sha1-w9qaaq46MLRreww0m4exENw72k8= - dependencies: - charenc "0.0.2" - crypt "0.0.2" - is-buffer "~1.1.6" - - media-typer@0.3.0: - version "0.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" - integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= - - mem@^1.1.0: - version "1.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - integrity sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y= - dependencies: - mimic-fn "^1.0.0" - - merge-descriptors@1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" - integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= - - merge-source-map@^1.1.0: - version "1.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/merge-source-map/-/merge-source-map-1.1.0.tgz#2fdde7e6020939f70906a68f2d7ae685e4c8c646" - integrity sha1-L93n5gIJOfcJBqaPLXrmheTIxkY= - dependencies: - source-map "^0.6.1" - - methods@1.x, methods@^1.1.1, methods@~1.1.2: - version "1.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - - micromatch@^2.3.11: - version "2.3.11" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - integrity sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU= - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - - micromatch@^3.1.10, micromatch@^3.1.4: - version "3.1.10" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha1-cIWbyVyYQJUvNZoGij/En57PrCM= - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - - mime-db@1.47.0: - version "1.47.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" - integrity sha1-jLMT5Zll08Bc+/iYkVomevRqM1w= - - mime-types@^2.1.10, mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.7: - version "2.1.30" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" - integrity sha1-bnvotMR5gl+F7WMmaV23P5MF1i0= - dependencies: - mime-db "1.47.0" - - mime@1.6.0, mime@^1.3.4: - version "1.6.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" - integrity sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE= - - mimic-fn@^1.0.0: - version "1.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" - integrity sha1-ggyGo5M0ZA6ZUWkovQP8qIBX0CI= - - "minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4: - version "3.0.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM= - dependencies: - brace-expansion "^1.1.7" - - minimist@0.0.8: - version "0.0.8" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= - - minimist@1.2.0: - version "1.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ= - - minimist@^1.1.0, minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5: - version "1.2.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602" - integrity sha1-Z9ZgFLZqaoqqDAg8X9WN9OTpdgI= - - mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha1-ESC0PcNZp4Xc5ltVuC4lfM9HlWY= - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - - mkdirp@0.5.1: - version "0.5.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= - dependencies: - minimist "0.0.8" - - mkdirp@0.5.x, mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha1-2Rzv1i0UNsoPQWIOJRKI1CAJne8= - dependencies: - minimist "^1.2.5" - - mocha@^3.0.2: - version "3.5.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mocha/-/mocha-3.5.3.tgz#1e0480fe36d2da5858d1eb6acc38418b26eaa20d" - integrity sha1-HgSA/jbS2lhY0etqzDhBiybqog0= - dependencies: - browser-stdout "1.3.0" - commander "2.9.0" - debug "2.6.8" - diff "3.2.0" - escape-string-regexp "1.0.5" - glob "7.1.1" - growl "1.9.2" - he "1.1.1" - json3 "3.3.2" - lodash.create "3.1.1" - mkdirp "0.5.1" - supports-color "3.1.2" - - morgan@^1.7.0: - version "1.10.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" - integrity sha1-CRd4q8H8R801CYJGU9rh+qtrF9c= - dependencies: - basic-auth "~2.0.1" - debug "2.6.9" - depd "~2.0.0" - on-finished "~2.3.0" - on-headers "~1.0.2" - - ms@2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= - - ms@2.1.1: - version "2.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" - integrity sha1-MKWGTrPrsKZvLr5tcnrwagnYbgo= - - ms@^2.1.1: - version "2.1.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha1-V0yBOM4dK1hh8LRFedut1gxmFbI= - - mustache@^2.2.1: - version "2.3.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mustache/-/mustache-2.3.2.tgz#a6d4d9c3f91d13359ab889a812954f9230a3d0c5" - integrity sha1-ptTZw/kdEzWauImoEpVPkjCj0MU= - - mute-stream@0.0.5: - version "0.0.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" - integrity sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA= - - nan@^2.12.1: - version "2.14.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" - integrity sha1-9TdkAGlRaPTMaUrJOT0MlYXu6hk= - - nanomatch@^1.2.9: - version "1.2.13" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha1-uHqKpPwN6P5r6IiVs4mD/yZb0Rk= - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - - natural-compare@^1.4.0: - version "1.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" - integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= - - negotiator@0.6.2: - version "0.6.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha1-/qz3zPUlp3rpY0Q2pkiD/+yjRvs= - - neo-async@^2.6.0: - version "2.6.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" - integrity sha1-tKr7k+OustgXTKU88WOrfXMIMF8= - - next-tick@~1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" - integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= - - nise@^1.2.0: - version "1.5.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/nise/-/nise-1.5.3.tgz#9d2cfe37d44f57317766c6e9408a359c5d3ac1f7" - integrity sha1-nSz+N9RPVzF3ZsbpQIo1nF06wfc= - dependencies: - "@sinonjs/formatio" "^3.2.1" - "@sinonjs/text-encoding" "^0.7.1" - just-extend "^4.0.2" - lolex "^5.0.1" - path-to-regexp "^1.7.0" - - node-fetch@^2.6.0: - version "2.6.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha1-BFvTI2Mfdu0uK1VXM5RBa2OaAFI= - - node-int64@^0.4.0: - version "0.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - integrity sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs= - - nodemon@^1.10.2: - version "1.19.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/nodemon/-/nodemon-1.19.4.tgz#56db5c607408e0fdf8920d2b444819af1aae0971" - integrity sha1-VttcYHQI4P34kg0rREgZrxquCXE= - dependencies: - chokidar "^2.1.8" - debug "^3.2.6" - ignore-by-default "^1.0.1" - minimatch "^3.0.4" - pstree.remy "^1.1.7" - semver "^5.7.1" - supports-color "^5.5.0" - touch "^3.1.0" - undefsafe "^2.0.2" - update-notifier "^2.5.0" - - nopt@3.x: - version "3.0.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" - integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= - dependencies: - abbrev "1" - - nopt@~1.0.10: - version "1.0.10" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/nopt/-/nopt-1.0.10.tgz#6ddd21bd2a31417b92727dd585f8a6f37608ebee" - integrity sha1-bd0hvSoxQXuScn3Vhfim83YI6+4= - dependencies: - abbrev "1" - - normalize-package-data@^2.3.2: - version "2.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8" - integrity sha1-5m2xg4sgDB38IzIl0SyzZSDiNKg= - dependencies: - hosted-git-info "^2.1.4" - resolve "^1.10.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - - normalize-path@^2.0.1, normalize-path@^2.1.1: - version "2.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - integrity sha1-GrKLVW4Zg2Oowab35vogE3/mrtk= - dependencies: - remove-trailing-separator "^1.0.1" - - normalize-path@^3.0.0: - version "3.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" - integrity sha1-Dc1p/yOhybEf0JeDFmRKA4ghamU= - - npm-run-path@^2.0.0: - version "2.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" - integrity sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8= - dependencies: - path-key "^2.0.0" - - number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0= - - nyc@^11.3.0: - version "11.9.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/nyc/-/nyc-11.9.0.tgz#4106e89e8fbe73623a1fc8b6ecb7abaa271ae1e4" - integrity sha1-QQbono++c2I6H8i27Lerqica4eQ= - dependencies: - archy "^1.0.0" - arrify "^1.0.1" - caching-transform "^1.0.0" - convert-source-map "^1.5.1" - debug-log "^1.0.1" - default-require-extensions "^1.0.0" - find-cache-dir "^0.1.1" - find-up "^2.1.0" - foreground-child "^1.5.3" - glob "^7.0.6" - istanbul-lib-coverage "^1.1.2" - istanbul-lib-hook "^1.1.0" - istanbul-lib-instrument "^1.10.0" - istanbul-lib-report "^1.1.3" - istanbul-lib-source-maps "^1.2.3" - istanbul-reports "^1.4.0" - md5-hex "^1.2.0" - merge-source-map "^1.1.0" - micromatch "^3.1.10" - mkdirp "^0.5.0" - resolve-from "^2.0.0" - rimraf "^2.6.2" - signal-exit "^3.0.1" - spawn-wrap "^1.4.2" - test-exclude "^4.2.0" - yargs "11.1.0" - yargs-parser "^8.0.0" - - oauth-sign@~0.8.1: - version "0.8.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - integrity sha1-Rqarfwrq2N6unsBWV4C31O/rnUM= - - oauth-sign@~0.9.0: - version "0.9.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" - integrity sha1-R6ewFrqmi1+g7PPe4IqFxnmsZFU= - - object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= - - object-copy@^0.1.0: - version "0.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - - object-inspect@^1.9.0: - version "1.10.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/object-inspect/-/object-inspect-1.10.2.tgz#b6385a3e2b7cae0b5eafcf90cddf85d128767f30" - integrity sha1-tjhaPit8rgter8+Qzd+F0Sh2fzA= - - object-keys@^1.0.12, object-keys@^1.1.1: - version "1.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" - integrity sha1-HEfyct8nfzsdrwYWd9nILiMixg4= - - object-visit@^1.0.0: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - - object.assign@^4.0.4, object.assign@^4.1.2: - version "4.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" - integrity sha1-DtVKNC7Os3s4/3brgxoOeIy2OUA= - dependencies: - call-bind "^1.0.0" - define-properties "^1.1.3" - has-symbols "^1.0.1" - object-keys "^1.1.1" - - object.omit@^2.0.0: - version "2.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - integrity sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo= - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - - object.pick@^1.3.0: - version "1.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - - on-finished@~2.3.0: - version "2.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" - integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= - dependencies: - ee-first "1.1.1" - - on-headers@~1.0.2: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" - integrity sha1-dysK5qqlJcOZ5Imt+tkMQD6zwo8= - - once@1.x, once@^1.3.0, once@^1.4.0: - version "1.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - - onetime@^1.0.0: - version "1.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" - integrity sha1-ofeDj4MUxRbwXs78vEzP4EtO14k= - - opentracing@^0.14.0, opentracing@^0.14.3, opentracing@^0.14.4: - version "0.14.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/opentracing/-/opentracing-0.14.5.tgz#891fa92cd90a24e64f99bc964370227310926c85" - integrity sha1-iR+pLNkKJOZPmbyWQ3AicxCSbIU= - - optionator@^0.8.1, optionator@^0.8.2: - version "0.8.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" - integrity sha1-hPodA2/p08fiHZmIS2ARZ+yPtJU= - dependencies: - deep-is "~0.1.3" - fast-levenshtein "~2.0.6" - levn "~0.3.0" - prelude-ls "~1.1.2" - type-check "~0.3.2" - word-wrap "~1.2.3" - - os-homedir@^1.0.0, os-homedir@^1.0.1: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - integrity sha1-/7xJiDNuDoM94MFox+8VISGqf7M= - - os-locale@^2.0.0: - version "2.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - integrity sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I= - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - - p-finally@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" - integrity sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4= - - p-limit@^1.1.0: - version "1.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" - integrity sha1-uGvV8MJWkJEcdZD8v8IBDVSzzLg= - dependencies: - p-try "^1.0.0" - - p-locate@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" - integrity sha1-IKAQOyIqcMj9OcwuWAaA893l7EM= - dependencies: - p-limit "^1.1.0" - - p-try@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" - integrity sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M= - - package-json@^4.0.0: - version "4.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= - dependencies: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" - - parse-glob@^3.0.4: - version "3.0.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - integrity sha1-ssN2z7EfNVE7rdFz7wu246OIORw= - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - - parse-json@^2.2.0: - version "2.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck= - dependencies: - error-ex "^1.2.0" - - parseurl@~1.3.3: - version "1.3.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" - integrity sha1-naGee+6NEt/wUT7Vt2lXeTvC6NQ= - - pascalcase@^0.1.1: - version "0.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - - path-dirname@^1.0.0: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - integrity sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA= - - path-exists@^2.0.0: - version "2.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s= - dependencies: - pinkie-promise "^2.0.0" - - path-exists@^3.0.0: - version "3.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" - integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= - - path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - - path-is-inside@^1.0.1: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= - - path-key@^2.0.0: - version "2.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - - path-parse@^1.0.5, path-parse@^1.0.6: - version "1.0.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" - integrity sha1-1i27VnlAXXLEc37FhgDp3c8G0kw= - - path-to-regexp@0.1.7: - version "0.1.7" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" - integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= - - path-to-regexp@^1.7.0: - version "1.8.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-to-regexp/-/path-to-regexp-1.8.0.tgz#887b3ba9d84393e87a0a0b9f4cb756198b53548a" - integrity sha1-iHs7qdhDk+h6CgufTLdWGYtTVIo= - dependencies: - isarray "0.0.1" - - path-type@^1.0.0: - version "1.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE= - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - - performance-now@^2.1.0: - version "2.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" - integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= - - pify@^2.0.0: - version "2.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= - - pify@^3.0.0: - version "3.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" - integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY= - - pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= - dependencies: - pinkie "^2.0.0" - - pinkie@^2.0.0: - version "2.0.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= - - pkg-dir@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4" - integrity sha1-ektQio1bstYp1EcFb/TpyTFM89Q= - dependencies: - find-up "^1.0.0" - - pkg-up@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pkg-up/-/pkg-up-1.0.0.tgz#3e08fb461525c4421624a33b9f7e6d0af5b05a26" - integrity sha1-Pgj7RhUlxEIWJKM7n35tCvWwWiY= - dependencies: - find-up "^1.0.0" - - pluralize@^1.2.1: - version "1.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pluralize/-/pluralize-1.2.1.tgz#d1a21483fd22bb41e58a12fa3421823140897c45" - integrity sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU= - - posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - - prelude-ls@~1.1.2: - version "1.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" - integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= - - prepend-http@^1.0.1: - version "1.0.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - - preserve@^0.2.0: - version "0.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks= - - process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha1-eCDZsWEgzFXKmud5JoCufbptf+I= - - process@^0.10.0: - version "0.10.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/process/-/process-0.10.1.tgz#842457cc51cfed72dc775afeeafb8c6034372725" - integrity sha1-hCRXzFHP7XLcd1r+6vuMYDQ3JyU= - - progress@^1.1.8: - version "1.1.8" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" - integrity sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74= - - prom-client@^11.5.3: - version "11.5.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/prom-client/-/prom-client-11.5.3.tgz#5fedfce1083bac6c2b223738e966d0e1643756f8" - integrity sha1-X+384Qg7rGwrIjc46WbQ4WQ3Vvg= - dependencies: - tdigest "^0.1.1" - - proxy-addr@~2.0.5: - version "2.0.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/proxy-addr/-/proxy-addr-2.0.6.tgz#fdc2336505447d3f2f2c638ed272caf614bbb2bf" - integrity sha1-/cIzZQVEfT8vLGOO0nLK9hS7sr8= - dependencies: - forwarded "~0.1.2" - ipaddr.js "1.9.1" - - pseudomap@^1.0.2: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM= - - psl@^1.1.28: - version "1.8.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24" - integrity sha1-kyb4vPsBOtzABf3/BWrM4CDlHCQ= - - pstree.remy@^1.1.7: - version "1.1.8" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/pstree.remy/-/pstree.remy-1.1.8.tgz#c242224f4a67c21f686839bbdb4ac282b8373d3a" - integrity sha1-wkIiT0pnwh9oaDm720rCgrg3PTo= - - punycode@^1.4.1: - version "1.4.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= - - punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha1-tYsBCsQMIsVldhbI0sLALHv0eew= - - qs@6.7.0: - version "6.7.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" - integrity sha1-QdwaAV49WB8WIXdr4xr7KHapsbw= - - qs@^6.1.0: - version "6.10.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" - integrity sha1-STFIL6jWR6Wqt5nFJx0hM7mB+2o= - dependencies: - side-channel "^1.0.4" - - qs@~6.3.0: - version "6.3.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" - integrity sha1-51vV9uJoEioqDgvaYwslUMFmUCw= - - qs@~6.5.2: - version "6.5.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" - integrity sha1-yzroBuh0BERYTvFUzo7pjUA/PjY= - - randomatic@^3.0.0: - version "3.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/randomatic/-/randomatic-3.1.1.tgz#b776efc59375984e36c537b2f51a1f0aff0da1ed" - integrity sha1-t3bvxZN1mE42xTey9RofCv8Noe0= - dependencies: - is-number "^4.0.0" - kind-of "^6.0.0" - math-random "^1.0.1" - - range-parser@~1.2.1: - version "1.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" - integrity sha1-PPNwI9GZ4cJNGlW4SADC8+ZGgDE= - - raven@^2.2.1: - version "2.6.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/raven/-/raven-2.6.4.tgz#458d4a380c8fbb59e0150c655625aaf60c167ea3" - integrity sha1-RY1KOAyPu1ngFQxlViWq9gwWfqM= - dependencies: - cookie "0.3.1" - md5 "^2.2.1" - stack-trace "0.0.10" - timed-out "4.0.1" - uuid "3.3.2" - - raw-body@2.4.0: - version "2.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/raw-body/-/raw-body-2.4.0.tgz#a1ce6fb9c9bc356ca52e89256ab59059e13d0332" - integrity sha1-oc5vucm8NWylLoklarWQWeE9AzI= - dependencies: - bytes "3.1.0" - http-errors "1.7.2" - iconv-lite "0.4.24" - unpipe "1.0.0" - - rc@^1.0.1, rc@^1.1.6: - version "1.2.8" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" - integrity sha1-zZJL9SAKB1uDwYjNa54hG3/A0+0= - dependencies: - deep-extend "^0.6.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - - read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI= - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - - read-pkg@^1.0.0: - version "1.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg= - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - - readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.2.2: - version "2.3.7" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha1-Hsoc9xGu+BTAT2IlKjamL2yyO1c= - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - - readdirp@^2.2.1: - version "2.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/readdirp/-/readdirp-2.2.1.tgz#0e87622a3325aa33e892285caf8b4e846529a525" - integrity sha1-DodiKjMlqjPokihcr4tOhGUppSU= - dependencies: - graceful-fs "^4.1.11" - micromatch "^3.1.10" - readable-stream "^2.0.2" - - readline2@^1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35" - integrity sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - mute-stream "0.0.5" - - rechoir@^0.6.2: - version "0.6.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= - dependencies: - resolve "^1.1.6" - - redis-commands@^1.2.0: - version "1.7.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/redis-commands/-/redis-commands-1.7.0.tgz#15a6fea2d58281e27b1cd1acfb4b293e278c3a89" - integrity sha1-Fab+otWCgeJ7HNGs+0spPieMOok= - - redis-parser@^2.4.0: - version "2.6.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/redis-parser/-/redis-parser-2.6.0.tgz#52ed09dacac108f1a631c07e9b69941e7a19504b" - integrity sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs= - - regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha1-vgWtf5v30i4Fb5cmzuUBf78Z4uk= - - regex-cache@^0.4.2: - version "0.4.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - integrity sha1-db3FiioUls7EihKDW8VMjVYjNt0= - dependencies: - is-equal-shallow "^0.1.3" - - regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha1-H07OJ+ALC2XgJHpoEOaoXYOldSw= - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - - registry-auth-token@^3.0.1: - version "3.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" - integrity sha1-10RoFUM/XV7WQxzV3KIQSPZrOX4= - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - - registry-url@^3.0.3: - version "3.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= - dependencies: - rc "^1.0.1" - - remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - integrity sha1-wkvOKig62tW8P1jg1IJJuSN52O8= - - repeat-element@^1.1.2: - version "1.1.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha1-vmgVIIR6tYx1aKx1+/rSjtQtOek= - - repeat-string@^1.5.2, repeat-string@^1.6.1: - version "1.6.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - - repeating@^2.0.0: - version "2.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo= - dependencies: - is-finite "^1.0.0" - - request@2.79.0: - version "2.79.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" - integrity sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4= - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.11.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~2.0.6" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - qs "~6.3.0" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "~0.4.1" - uuid "^3.0.0" - - request@^2.81.0: - version "2.88.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" - integrity sha1-1zyRhzHLWofaBH4gcjQUb2ZNErM= - dependencies: - aws-sign2 "~0.7.0" - aws4 "^1.8.0" - caseless "~0.12.0" - combined-stream "~1.0.6" - extend "~3.0.2" - forever-agent "~0.6.1" - form-data "~2.3.2" - har-validator "~5.1.3" - http-signature "~1.2.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.19" - oauth-sign "~0.9.0" - performance-now "^2.1.0" - qs "~6.5.2" - safe-buffer "^5.1.2" - tough-cookie "~2.5.0" - tunnel-agent "^0.6.0" - uuid "^3.3.2" - - require-directory@^2.1.1: - version "2.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - - require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= - - require-uncached@^1.0.2: - version "1.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" - integrity sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM= - dependencies: - caller-path "^0.1.0" - resolve-from "^1.0.0" - - requires-port@0.x.x: - version "0.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/requires-port/-/requires-port-0.0.1.tgz#4b4414411d9df7c855995dd899a8c78a2951c16d" - integrity sha1-S0QUQR2d98hVmV3YmajHiilRwW0= - - resolve-from@^1.0.0: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" - integrity sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY= - - resolve-from@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/resolve-from/-/resolve-from-2.0.0.tgz#9480ab20e94ffa1d9e80a804c7ea147611966b57" - integrity sha1-lICrIOlP+h2egKgEx+oUdhGWa1c= - - resolve-url@^0.2.1: - version "0.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - - resolve@1.1.x: - version "1.1.7" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= - - resolve@^1.1.6, resolve@^1.10.0: - version "1.20.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" - integrity sha1-YpoBP7P3B1XW8LeTXMHCxTeLGXU= - dependencies: - is-core-module "^2.2.0" - path-parse "^1.0.6" - - restore-cursor@^1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" - integrity sha1-NGYfRohjJ/7SmRR5FSJS35LapUE= - dependencies: - exit-hook "^1.0.0" - onetime "^1.0.0" - - ret@~0.1.10: - version "0.1.15" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" - integrity sha1-uKSCXVvbH8P29Twrwz+BOIaBx7w= - - rimraf@^2.3.4, rimraf@^2.6.1, rimraf@^2.6.2: - version "2.7.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" - integrity sha1-NXl/E6f9rcVmFCwp1PB8ytSD4+w= - dependencies: - glob "^7.1.3" - - rimraf@~2.6.2: - version "2.6.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha1-stEE/g2Psnz54KHNqCYt04M8bKs= - dependencies: - glob "^7.1.3" - - run-async@^0.1.0: - version "0.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389" - integrity sha1-yK1KXhEGYeQCp9IbUw4AnyX444k= - dependencies: - once "^1.3.0" - - rx-lite@^3.1.2: - version "3.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102" - integrity sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI= - - safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha1-mR7GnSluAxN0fVm9/St0XDX4go0= - - safe-buffer@^5.0.1, safe-buffer@^5.1.2: - version "5.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha1-Hq+fqb2x/dTsdfWPnNtOa3gn7sY= - - safe-regex@^1.1.0: - version "1.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - - "safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: - version "2.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" - integrity sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo= - - samsam@1.3.0: - version "1.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" - integrity sha1-jR2TUOJWItow3j5EumkrUiGrfFA= - - semver-diff@^2.0.0: - version "2.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - integrity sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY= - dependencies: - semver "^5.0.3" - - "semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.7.1: - version "5.7.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" - integrity sha1-qVT5Ma66UI0we78Gnv8MAclhFvc= - - send@0.17.1: - version "0.17.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8" - integrity sha1-wdiwWfeQD3Rm3Uk4vcROEd2zdsg= - dependencies: - debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" - encodeurl "~1.0.2" - escape-html "~1.0.3" - etag "~1.8.1" - fresh "0.5.2" - http-errors "~1.7.2" - mime "1.6.0" - ms "2.1.1" - on-finished "~2.3.0" - range-parser "~1.2.1" - statuses "~1.5.0" - - serve-static@1.14.1: - version "1.14.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/serve-static/-/serve-static-1.14.1.tgz#666e636dc4f010f7ef29970a88a674320898b2f9" - integrity sha1-Zm5jbcTwEPfvKZcKiKZ0MgiYsvk= - dependencies: - encodeurl "~1.0.2" - escape-html "~1.0.3" - parseurl "~1.3.3" - send "0.17.1" - - set-blocking@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc= - - set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha1-oY1AUw5vB95CKMfe/kInr4ytAFs= - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" - - setprototypeof@1.1.1: - version "1.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/setprototypeof/-/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" - integrity sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM= - - shebang-command@^1.2.0: - version "1.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - - shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - - shell-quote@~1.4.2: - version "1.4.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/shell-quote/-/shell-quote-1.4.3.tgz#952c44e0b1ed9013ef53958179cc643e8777466b" - integrity sha1-lSxE4LHtkBPvU5WBecxkPod3Rms= - dependencies: - array-filter "~0.0.0" - array-map "~0.0.0" - array-reduce "~0.0.0" - jsonify "~0.0.0" - - shelljs@^0.7.5: - version "0.7.8" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" - integrity sha1-3svPh0sNHl+3LhSxZKloMEjprLM= - dependencies: - glob "^7.0.0" - interpret "^1.0.0" - rechoir "^0.6.2" - - side-channel@^1.0.4: - version "1.0.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" - integrity sha1-785cj9wQTudRslxY1CkAEfpeos8= - dependencies: - call-bind "^1.0.0" - get-intrinsic "^1.0.2" - object-inspect "^1.9.0" - - signal-exit@^3.0.0, signal-exit@^3.0.1, signal-exit@^3.0.2: - version "3.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/signal-exit/-/signal-exit-3.0.3.tgz#a1410c2edd8f077b08b4e253c8eacfcaf057461c" - integrity sha1-oUEMLt2PB3sItOJTyOrPyvBXRhw= - - sinon@^4.1.3: - version "4.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/sinon/-/sinon-4.5.0.tgz#427ae312a337d3c516804ce2754e8c0d5028cb04" - integrity sha1-QnrjEqM308UWgEzidU6MDVAoywQ= - dependencies: - "@sinonjs/formatio" "^2.0.0" - diff "^3.1.0" - lodash.get "^4.4.2" - lolex "^2.2.0" - nise "^1.2.0" - supports-color "^5.1.0" - type-detect "^4.0.5" - - slice-ansi@0.0.4: - version "0.0.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" - integrity sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU= - - slide@^1.1.5: - version "1.1.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - integrity sha1-VusCfWW00tzmyy4tMsTUr8nh1wc= - - snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha1-bBdfhv8UvbByRWPo88GwIaKGhTs= - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - - snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha1-+VZHlIbyrNeXAGk/b3uAXkWrVuI= - dependencies: - kind-of "^3.2.0" - - snapdragon@^0.8.1: - version "0.8.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha1-ZJIufFZbDhQgS6GqfWlkJ40lGC0= - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - - sntp@1.x.x: - version "1.0.9" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - integrity sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg= - dependencies: - hoek "2.x.x" - - source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha1-GQhmvs51U+H48mei7oLGBrVQmho= - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - - source-map-url@^0.4.0: - version "0.4.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha1-CvZmBadFpaL5HPG7+KevvCg97FY= - - source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7: - version "0.5.7" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= - - source-map@^0.6.1: - version "0.6.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - integrity sha1-dHIq8y6WFOnCh6jQu95IteLxomM= - - source-map@~0.2.0: - version "0.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d" - integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50= - dependencies: - amdefine ">=0.0.4" - - spawn-wrap@^1.4.2: - version "1.4.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/spawn-wrap/-/spawn-wrap-1.4.3.tgz#81b7670e170cca247d80bf5faf0cfb713bdcf848" - integrity sha1-gbdnDhcMyiR9gL9frwz7cTvc+Eg= - dependencies: - foreground-child "^1.5.6" - mkdirp "^0.5.0" - os-homedir "^1.0.1" - rimraf "^2.6.2" - signal-exit "^3.0.2" - which "^1.3.0" - - spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha1-3s6BrJweZxPl99G28X1Gj6U9iak= - dependencies: - spdx-expression-parse "^3.0.0" - spdx-license-ids "^3.0.0" - - spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha1-PyjOGnegA3JoPq3kpDMYNSeiFj0= - - spdx-expression-parse@^3.0.0: - version "3.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679" - integrity sha1-z3D1BILu/cmOPOCmgz5KU87rpnk= - dependencies: - spdx-exceptions "^2.1.0" - spdx-license-ids "^3.0.0" - - spdx-license-ids@^3.0.0: - version "3.0.7" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz#e9c18a410e5ed7e12442a549fbd8afa767038d65" - integrity sha1-6cGKQQ5e1+EkQqVJ+9ivp2cDjWU= - - split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha1-fLCd2jqGWFcFxks5pkZgOGguj+I= - dependencies: - extend-shallow "^3.0.0" - - sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= - - sshpk@^1.7.0: - version "1.16.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877" - integrity sha1-+2YcC+8ps520B2nuOfpwCT1vaHc= - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - bcrypt-pbkdf "^1.0.0" - dashdash "^1.12.0" - ecc-jsbn "~0.1.1" - getpass "^0.1.1" - jsbn "~0.1.0" - safer-buffer "^2.0.2" - tweetnacl "~0.14.0" - - stack-trace@0.0.10, stack-trace@0.0.x: - version "0.0.10" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= - - stack-trace@^0.0.9: - version "0.0.9" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" - integrity sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU= - - static-extend@^0.1.1: - version "0.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - - "statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - - string-template@~0.2.1: - version "0.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" - integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0= - - string-width@^1.0.1: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M= - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - - string-width@^2.0.0, string-width@^2.1.1: - version "2.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" - integrity sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4= - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^4.0.0" - - string.prototype.trimend@^1.0.4: - version "1.0.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80" - integrity sha1-51rpDClCxjUEaGwYsoe0oLGkX4A= - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - - string.prototype.trimstart@^1.0.4: - version "1.0.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed" - integrity sha1-s2OZr0qymZtMnGSL16P7K7Jv7u0= - dependencies: - call-bind "^1.0.2" - define-properties "^1.1.3" - - string_decoder@~1.1.1: - version "1.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha1-nPFhG6YmhdcDCunkujQUnDrwP8g= - dependencies: - safe-buffer "~5.1.0" - - stringstream@~0.0.4: - version "0.0.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/stringstream/-/stringstream-0.0.6.tgz#7880225b0d4ad10e30927d167a1d6f2fd3b33a72" - integrity sha1-eIAiWw1K0Q4wkn0Weh1vL9OzOnI= - - strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= - dependencies: - ansi-regex "^2.0.0" - - strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= - dependencies: - ansi-regex "^3.0.0" - - strip-bom@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4= - dependencies: - is-utf8 "^0.2.0" - - strip-bom@^3.0.0: - version "3.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= - - strip-eof@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - integrity sha1-u0P/VZim6wXYm1n80SnJgzE2Br8= - - strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= - - sum-up@^1.0.1: - version "1.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/sum-up/-/sum-up-1.0.3.tgz#1c661f667057f63bcb7875aa1438bc162525156e" - integrity sha1-HGYfZnBX9jvLeHWqFDi8FiUlFW4= - dependencies: - chalk "^1.0.0" - - superagent@^2.0.0: - version "2.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/superagent/-/superagent-2.3.0.tgz#703529a0714e57e123959ddefbce193b2e50d115" - integrity sha1-cDUpoHFOV+EjlZ3e+84ZOy5Q0RU= - dependencies: - component-emitter "^1.2.0" - cookiejar "^2.0.6" - debug "^2.2.0" - extend "^3.0.0" - form-data "1.0.0-rc4" - formidable "^1.0.17" - methods "^1.1.1" - mime "^1.3.4" - qs "^6.1.0" - readable-stream "^2.0.5" - - supertest@^2.0.0: - version "2.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/supertest/-/supertest-2.0.1.tgz#a058081d788f1515d4700d7502881e6b759e44cd" - integrity sha1-oFgIHXiPFRXUcA11Aogea3WeRM0= - dependencies: - methods "1.x" - superagent "^2.0.0" - - supports-color@3.1.2: - version "3.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" - integrity sha1-cqJiiU2dQIuVbKBf83su2KbiotU= - dependencies: - has-flag "^1.0.0" - - supports-color@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= - - supports-color@^3.1.0, supports-color@^3.1.2: - version "3.2.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= - dependencies: - has-flag "^1.0.0" - - supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.5.0: - version "5.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" - integrity sha1-4uaaRKyHcveKHsCzW2id9lMO/I8= - dependencies: - has-flag "^3.0.0" - - table@^3.7.8: - version "3.8.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/table/-/table-3.8.3.tgz#2bbc542f0fda9861a755d3947fefd8b3f513855f" - integrity sha1-K7xULw/amGGnVdOUf+/Ys/UThV8= - dependencies: - ajv "^4.7.0" - ajv-keywords "^1.0.0" - chalk "^1.1.1" - lodash "^4.0.0" - slice-ansi "0.0.4" - string-width "^2.0.0" - - tdigest@^0.1.1: - version "0.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/tdigest/-/tdigest-0.1.1.tgz#2e3cb2c39ea449e55d1e6cd91117accca4588021" - integrity sha1-Ljyyw56kSeVdHmzZEReszKRYgCE= - dependencies: - bintrees "1.0.1" - - term-size@^1.2.0: - version "1.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" - integrity sha1-RYuDiH8oj8Vtb/+/rSYuJmOO+mk= - dependencies: - execa "^0.7.0" - - test-exclude@^4.2.0: - version "4.2.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/test-exclude/-/test-exclude-4.2.3.tgz#a9a5e64474e4398339245a0a769ad7c2f4a97c20" - integrity sha1-qaXmRHTkOYM5JFoKdprXwvSpfCA= - dependencies: - arrify "^1.0.1" - micromatch "^2.3.11" - object-assign "^4.1.0" - read-pkg-up "^1.0.1" - require-main-filename "^1.0.1" - - text-table@~0.2.0: - version "0.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" - integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= - - thriftrw@^3.5.0: - version "3.12.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/thriftrw/-/thriftrw-3.12.0.tgz#30857847755e7f036b2e0a79d11c9f55075539d9" - integrity sha1-MIV4R3VefwNrLgp50RyfVQdVOdk= - dependencies: - bufrw "^1.3.0" - error "7.0.2" - long "^2.4.0" - - through@^2.3.6: - version "2.3.8" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - - timed-out@4.0.1, timed-out@^4.0.0: - version "4.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= - - to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc= - - to-object-path@^0.3.0: - version "0.3.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - - to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - - to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha1-E8/dmzNlUvMLUfM6iuG0Knp1mc4= - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - - toidentifier@1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" - integrity sha1-fhvjRw8ed5SLxD2Uo8j013UrpVM= - - touch@^3.1.0: - version "3.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/touch/-/touch-3.1.0.tgz#fe365f5f75ec9ed4e56825e0bb76d24ab74af83b" - integrity sha1-/jZfX3XsntTlaCXgu3bSSrdK+Ds= - dependencies: - nopt "~1.0.10" - - tough-cookie@~2.3.0: - version "2.3.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" - integrity sha1-7GDO44rGdQY//JelwYlwV47oNlU= - dependencies: - punycode "^1.4.1" - - tough-cookie@~2.5.0: - version "2.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2" - integrity sha1-zZ+yoKodWhK0c72fuW+j3P9lreI= - dependencies: - psl "^1.1.28" - punycode "^2.1.1" - - trim-right@^1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM= - - tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0= - dependencies: - safe-buffer "^5.0.1" - - tunnel-agent@~0.4.1: - version "0.4.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" - integrity sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us= - - tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q= - - type-check@~0.3.2: - version "0.3.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" - integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= - dependencies: - prelude-ls "~1.1.2" - - type-detect@0.1.1: - version "0.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/type-detect/-/type-detect-0.1.1.tgz#0ba5ec2a885640e470ea4e8505971900dac58822" - integrity sha1-C6XsKohWQORw6k6FBZcZANrFiCI= - - type-detect@4.0.8, type-detect@^4.0.5: - version "4.0.8" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/type-detect/-/type-detect-4.0.8.tgz#7646fb5f18871cfbb7749e69bd39a6388eb7450c" - integrity sha1-dkb7XxiHHPu3dJ5pvTmmOI63RQw= - - type-detect@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/type-detect/-/type-detect-1.0.0.tgz#762217cc06db258ec48908a1298e8b95121e8ea2" - integrity sha1-diIXzAbbJY7EiQihKY6LlRIejqI= - - type-is@~1.6.17, type-is@~1.6.18: - version "1.6.18" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" - integrity sha1-TlUs0F3wlGfcvE73Od6J8s83wTE= - dependencies: - media-typer "0.3.0" - mime-types "~2.1.24" - - type@^1.0.1: - version "1.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" - integrity sha1-hI3XaY2vo+VKbEeedZxLw/GIR6A= - - type@^2.0.0: - version "2.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/type/-/type-2.5.0.tgz#0a2e78c2e77907b252abe5f298c1b01c63f0db3d" - integrity sha1-Ci54wud5B7JSq+XymMGwHGPw2z0= - - typedarray@^0.0.6: - version "0.0.6" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" - integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= - - uglify-js@^3.1.4: - version "3.13.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/uglify-js/-/uglify-js-3.13.4.tgz#592588bb9f47ae03b24916e2471218d914955574" - integrity sha1-WSWIu59HrgOySRbiRxIY2RSVVXQ= - - unbox-primitive@^1.0.0: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471" - integrity sha1-CF4hViXsMWJXTciFmr7nilmxRHE= - dependencies: - function-bind "^1.1.1" - has-bigints "^1.0.1" - has-symbols "^1.0.2" - which-boxed-primitive "^1.0.2" - - undefsafe@^2.0.2: - version "2.0.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/undefsafe/-/undefsafe-2.0.3.tgz#6b166e7094ad46313b2202da7ecc2cd7cc6e7aae" - integrity sha1-axZucJStRjE7IgLafsws18xueq4= - dependencies: - debug "^2.2.0" - - union-value@^1.0.0: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha1-C2/nuDWuzaYcbqTU8CwUIh4QmEc= - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - - unique-string@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - integrity sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo= - dependencies: - crypto-random-string "^1.0.0" - - unpipe@1.0.0, unpipe@~1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" - integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= - - unset-value@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - - unzip-response@^2.0.1: - version "2.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= - - upath@^1.1.1: - version "1.2.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" - integrity sha1-j2bbzVWog6za5ECK+LA1pQRMGJQ= - - update-notifier@^2.5.0: - version "2.5.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/update-notifier/-/update-notifier-2.5.0.tgz#d0744593e13f161e406acb1d9408b72cad08aff6" - integrity sha1-0HRFk+E/Fh5AassdlAi3LK0Ir/Y= - dependencies: - boxen "^1.2.1" - chalk "^2.0.1" - configstore "^3.0.0" - import-lazy "^2.1.0" - is-ci "^1.0.10" - is-installed-globally "^0.1.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" - - uri-js@^4.2.2: - version "4.4.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" - integrity sha1-mxpSWVIlhZ5V9mnZKPiMbFfyp34= - dependencies: - punycode "^2.1.0" - - urix@^0.1.0: - version "0.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - - url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" - - use@^3.1.0: - version "3.1.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha1-1QyMrHmhn7wg8pEfVuuXP04QBw8= - - user-home@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f" - integrity sha1-nHC/2Babwdy/SGBODwS4tJzenp8= - dependencies: - os-homedir "^1.0.0" - - util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - - utils-merge@1.0.1: - version "1.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" - integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= - - uuid@3.3.2: - version "3.3.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131" - integrity sha1-G0r0lV6zB3xQHCOHL8ZROBFYcTE= - - uuid@^3.0.0, uuid@^3.0.1, uuid@^3.2.1, uuid@^3.3.2: - version "3.4.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4= - - validate-npm-package-license@^3.0.1: - version "3.0.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a" - integrity sha1-/JH2uce6FchX9MssXe/uw51PQQo= - dependencies: - spdx-correct "^3.0.0" - spdx-expression-parse "^3.0.0" - - vary@~1.1.2: - version "1.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" - integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= - - verror@1.10.0: - version "1.10.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA= - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - - which-boxed-primitive@^1.0.2: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6" - integrity sha1-E3V7yJsgmwSf5dhkMOIc9AqJqOY= - dependencies: - is-bigint "^1.0.1" - is-boolean-object "^1.1.0" - is-number-object "^1.0.4" - is-string "^1.0.5" - is-symbol "^1.0.3" - - which-module@^2.0.0: - version "2.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= - - which@^1.1.1, which@^1.2.9, which@^1.3.0: - version "1.3.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha1-pFBD1U9YBTFtqNYvn1CRjT2nCwo= - dependencies: - isexe "^2.0.0" - - widest-line@^2.0.0: - version "2.0.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" - integrity sha1-dDh2RzDsfvQ4HOTfgvuYpTFCo/w= - dependencies: - string-width "^2.1.1" - - winston@^2.2.0: - version "2.4.5" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/winston/-/winston-2.4.5.tgz#f2e431d56154c4ea765545fc1003bd340c95b59a" - integrity sha1-8uQx1WFUxOp2VUX8EAO9NAyVtZo= - dependencies: - async "~1.0.0" - colors "1.0.x" - cycle "1.0.x" - eyes "0.1.x" - isstream "0.1.x" - stack-trace "0.0.x" - - word-wrap@~1.2.3: - version "1.2.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/word-wrap/-/word-wrap-1.2.3.tgz#610636f6b1f703891bd34771ccb17fb93b47079c" - integrity sha1-YQY29rH3A4kb00dxzLF/uTtHB5w= - - wordwrap@^1.0.0: - version "1.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" - integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= - - wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU= - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - - wrappy@1: - version "1.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - - write-file-atomic@^1.1.4: - version "1.3.4" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/write-file-atomic/-/write-file-atomic-1.3.4.tgz#f807a4f0b1d9e913ae7a48112e6cc3af1991b45f" - integrity sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8= - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - slide "^1.1.5" - - write-file-atomic@^2.0.0: - version "2.4.3" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/write-file-atomic/-/write-file-atomic-2.4.3.tgz#1fd2e9ae1df3e75b8d8c367443c692d4ca81f481" - integrity sha1-H9Lprh3z51uNjDZ0Q8aS1MqB9IE= - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - signal-exit "^3.0.2" - - write@^0.2.1: - version "0.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" - integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= - dependencies: - mkdirp "^0.5.1" - - xdg-basedir@^3.0.0: - version "3.0.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - integrity sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ= - - xorshift@^0.2.0: - version "0.2.1" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/xorshift/-/xorshift-0.2.1.tgz#fcd82267e9351c13f0fb9c73307f25331d29c63a" - integrity sha1-/NgiZ+k1HBPw+5xzMH8lMx0pxjo= - - xtend@^4.0.0, xtend@~4.0.0: - version "4.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" - integrity sha1-u3J3n1+kZRhrH0OPZ0+jR/2121Q= - - y18n@^3.2.1: - version "3.2.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696" - integrity sha1-hckBvWRwznH8S7cjrSCbcPfyhpY= - - yallist@^2.1.2: - version "2.1.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI= - - yargs-parser@^8.0.0: - version "8.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" - integrity sha1-8TdqM7Ziml0GN4KUTacyYx6WaVA= - dependencies: - camelcase "^4.1.0" - - yargs-parser@^9.0.2: - version "9.0.2" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077" - integrity sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc= - dependencies: - camelcase "^4.1.0" - - yargs@11.1.0: - version "11.1.0" - resolved "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77" - integrity sha1-kLhpk07W6HERXqL/WLA/RyTtLXc= - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^9.0.2" From 69d58951405157865d2f7d1c8d51ee0ed25f6bba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 18 May 2021 15:00:35 -0300 Subject: [PATCH 094/126] 0.2.19-rc.1 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index fecfa94..09d417e 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.19-rc.0", + "version": "0.2.19-rc.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 41727ca..794212d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.19-rc.0", + "version": "0.2.19-rc.1", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From f28e98126bc505335a30be928adf66dc96198ba2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Mon, 24 May 2021 14:36:35 -0300 Subject: [PATCH 095/126] feat: Adding ioRedis instrumentation --- lib/domain/Pipeline.js | 2 -- lib/http/routers/FunctionsRouter.js | 11 +++-------- lib/http/routes.js | 1 - lib/support/opentelemetry.js | 20 ++++++++++++-------- npm-shrinkwrap.json | 17 +++++++++++++++++ package.json | 1 + 6 files changed, 33 insertions(+), 19 deletions(-) diff --git a/lib/domain/Pipeline.js b/lib/domain/Pipeline.js index 0124816..71114ff 100644 --- a/lib/domain/Pipeline.js +++ b/lib/domain/Pipeline.js @@ -5,7 +5,6 @@ const { DefaultLogStorage } = require('./LogStorage'); const ErrorTracker = require('./ErrorTracker'); const SpanConsoleWrapper = require('./SpanConsoleWrapper'); const { reportError } = require('../support/tracing'); -const { sendOtelError } = require('../support/opentelemetry'); function codeFileName(namespace, codeId) { return `${namespace}/${codeId}.js`; @@ -94,7 +93,6 @@ class Pipeline { logStorage.console.error(`Failed to run function: ${err.message}, ${spent} seconds`); logStorage.console.error(err.stack); reportError(span, err); - sendOtelError(this.req, err); const logResult = logStorage.flush({ status, diff --git a/lib/http/routers/FunctionsRouter.js b/lib/http/routers/FunctionsRouter.js index 333ad7c..818f553 100644 --- a/lib/http/routers/FunctionsRouter.js +++ b/lib/http/routers/FunctionsRouter.js @@ -17,7 +17,7 @@ const SchemaResponse = require('../SchemaResponse'); const router = new Router(); const { bodyParserLimit } = require('../../support/config'); const { reportError } = require('../../support/tracing'); -const { sendOtelError } = require('../../support/opentelemetry'); +const { RecordOtelError } = require('../../support/opentelemetry') function codeFileName(namespace, codeId) { return `${namespace}/${codeId}.js`; @@ -224,12 +224,10 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a const error = new Error(`Code '${namespace}/${id}' is not found`); error.statusCode = 404; reportError(span, error); - sendOtelError(req, error); throw error; } } catch (err) { reportError(span, err); - sendOtelError(req, err); res.status(err.statusCode || 500).json({ error: err.message }); return; } @@ -257,7 +255,6 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a logStorage.console.error(`Failed to run function: ${err}`); logStorage.console.error(err.stack); reportError(span, err); - sendOtelError(req, err); const status = err.statusCode || 500; res.status(status).json({ error: err.message }); @@ -280,8 +277,8 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a code: code.code, }); errTracker.notify(err); + RecordOtelError(err) } - next(); }); @@ -301,7 +298,6 @@ router.put('/pipeline', bodyParser.json({ limit: bodyParserLimit }), async (req, if (!steps) { const err = new Error('Pass step by querystring is required'); reportError(span, err); - sendOtelError(req, err); res.status(400).json({ error: err.message }); return; } @@ -327,7 +323,6 @@ router.put('/pipeline', bodyParser.json({ limit: bodyParserLimit }), async (req, const e = new Error(`Code '${namespace}/${id}' is not found`); e.statusCode = 404; reportError(span, e); - sendOtelError(req, e); throw e; } } @@ -341,7 +336,7 @@ router.put('/pipeline', bodyParser.json({ limit: bodyParserLimit }), async (req, res.json(result.body); } catch (err) { reportError(span, err); - sendOtelError(req, err); + RecordOtelError(err) const status = err.statusCode || 500; metric.observePipelineRun(status); res.status(status).json({ error: err.message }); diff --git a/lib/http/routes.js b/lib/http/routes.js index eddb258..da8fae5 100644 --- a/lib/http/routes.js +++ b/lib/http/routes.js @@ -55,7 +55,6 @@ app.get('/', (req, res) => { }); }); - if (traceEngine.toLowerCase() === 'opentelemetry') { app.use(StartSpanMiddleware); } diff --git a/lib/support/opentelemetry.js b/lib/support/opentelemetry.js index 9822508..bdc9fc7 100644 --- a/lib/support/opentelemetry.js +++ b/lib/support/opentelemetry.js @@ -4,6 +4,8 @@ const { ExpressInstrumentation } = require('@opentelemetry/instrumentation-expre const { registerInstrumentations } = require('@opentelemetry/instrumentation'); const { CollectorTraceExporter } = require('@opentelemetry/exporter-collector-grpc'); const { NodeTracerProvider } = require('@opentelemetry/node'); +const { IORedisInstrumentation } = require('@opentelemetry/instrumentation-ioredis') + const opentelemetry = require('@opentelemetry/api'); const OtelConfig = require('./config').trace.otel; @@ -24,25 +26,20 @@ provider.addSpanProcessor(new BatchSpanProcessor(exporter, { registerInstrumentations({ instrumentations: [ - new ExpressInstrumentation(), + new IORedisInstrumentation(), new HttpInstrumentation({ responseHook: (span) => { const { attributes: attrs = {} } = span; span.updateName(`${attrs['http.method']} ${attrs['http.target']}`); span.setAttribute('functions.route', attrs['http.route']); span.setAttribute('functions.url', attrs['http.url']); } }), + new ExpressInstrumentation() ], }); provider.register(); const tracer = opentelemetry.trace.getTracer(OtelConfig.service); -function sendOtelError(req, error) { - if (req.otelSpan && req.otelSpan.recordException) { - req.otelSpan.recordException(error); - } -} - function StartSpanMiddleware(req, res, next) { const span = tracer.startSpan(req.path); @@ -56,4 +53,11 @@ function FinalizeSpanMiddleware(req, res, next) { next(); } -module.exports = { sendOtelError, StartSpanMiddleware, FinalizeSpanMiddleware }; +function RecordOtelError(err) { + const span = tracer.startSpan('Exception Throwed') + span.recordException(err.stack) + span.setStatus({code: opentelemetry.SpanStatusCode.ERROR }) + span.end() +} + +module.exports = { StartSpanMiddleware, FinalizeSpanMiddleware, RecordOtelError }; diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 09d417e..c9483a0 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -249,6 +249,23 @@ } } }, + "@opentelemetry/instrumentation-ioredis": { + "version": "0.16.0", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.16.0.tgz", + "integrity": "sha1-7yx7Mr2irzDCNXp6AqK4iWiPgzc=", + "requires": { + "@opentelemetry/api": "^1.0.0-rc.0", + "@opentelemetry/instrumentation": "^0.19.0", + "@opentelemetry/semantic-conventions": "^0.19.0" + }, + "dependencies": { + "@opentelemetry/api": { + "version": "1.0.0-rc.3", + "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/api/-/api-1.0.0-rc.3.tgz", + "integrity": "sha1-kD723d8EQQ0JBy1DoGC4fMwWJUU=" + } + } + }, "@opentelemetry/metrics": { "version": "0.19.0", "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@opentelemetry/metrics/-/metrics-0.19.0.tgz", diff --git a/package.json b/package.json index 794212d..246d925 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "@opentelemetry/instrumentation": "^0.19.0", "@opentelemetry/instrumentation-express": "^0.16.0", "@opentelemetry/instrumentation-http": "^0.19.0", + "@opentelemetry/instrumentation-ioredis": "^0.16.0", "@opentelemetry/node": "^0.19.0", "@opentelemetry/tracing": "^0.19.0", "async": "^2.0.1", From 70bd64c1d4c883c2d1bf3180da2e58c83101db49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Mon, 24 May 2021 14:36:53 -0300 Subject: [PATCH 096/126] 0.3.0-rc.0 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index c9483a0..0339b95 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.19-rc.1", + "version": "0.3.0-rc.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 246d925..5dbd78f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.2.19-rc.1", + "version": "0.3.0-rc.0", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From 184ea8c993a50537f434427fb1668d496c2cda1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 25 May 2021 16:21:16 -0300 Subject: [PATCH 097/126] adding ignore outgoing requests and incoming paths --- lib/support/opentelemetry.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/support/opentelemetry.js b/lib/support/opentelemetry.js index bdc9fc7..bbfce45 100644 --- a/lib/support/opentelemetry.js +++ b/lib/support/opentelemetry.js @@ -32,7 +32,10 @@ registerInstrumentations({ span.updateName(`${attrs['http.method']} ${attrs['http.target']}`); span.setAttribute('functions.route', attrs['http.route']); span.setAttribute('functions.url', attrs['http.url']); - } }), + }, + ignoreOutgoingUrls: [/.*\/agent_listener/, /.*\/sampling/], + ignoreIncomingPaths: [/.*\/healthcheck/, /.*\/metrics/, /.*\/sampling/] + }), new ExpressInstrumentation() ], }); @@ -40,7 +43,6 @@ registerInstrumentations({ provider.register(); const tracer = opentelemetry.trace.getTracer(OtelConfig.service); - function StartSpanMiddleware(req, res, next) { const span = tracer.startSpan(req.path); req.otelSpan = span; From 06bb63b650c8050a47f8bfa158758712449d2979 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 25 May 2021 16:24:20 -0300 Subject: [PATCH 098/126] 0.3.0-rc.1 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 0339b95..28594b8 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.3.0-rc.0", + "version": "0.3.0-rc.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5dbd78f..ed58eba 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.3.0-rc.0", + "version": "0.3.0-rc.1", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From 9a7fe611524d08b1ac6b3dbe83aef0e6ab7e1422 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 25 May 2021 18:12:02 -0300 Subject: [PATCH 099/126] Adding node service name --- lib/support/config.js | 2 +- lib/support/opentelemetry.js | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/support/config.js b/lib/support/config.js index 71d6bae..d7bb50f 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -11,6 +11,7 @@ const DEFAULT_GLOBAL_MODULES = [ ]; module.exports = { + host: process.env.HOSTNAME || "localhost", port: ConfigDiscovery.getInt('PORT', 8100), metricsPort: ConfigDiscovery.getInt('METRICS_PORT', 8101), useNodeCluster: ConfigDiscovery.getBool('USE_NODE_CLUSTER', true), @@ -51,7 +52,6 @@ module.exports = { }, }, - storageName: process.env.STORAGE || 'redis', opentracingEngine: process.env.OPENTRACING_ENGINE || 'no-op', opentracingService: ConfigDiscovery.getPossibleString(['OPENTRACING_SERVICE', 'TSURU_APPNAME'], 'functions'), diff --git a/lib/support/opentelemetry.js b/lib/support/opentelemetry.js index bbfce45..d76884e 100644 --- a/lib/support/opentelemetry.js +++ b/lib/support/opentelemetry.js @@ -5,10 +5,11 @@ const { registerInstrumentations } = require('@opentelemetry/instrumentation'); const { CollectorTraceExporter } = require('@opentelemetry/exporter-collector-grpc'); const { NodeTracerProvider } = require('@opentelemetry/node'); const { IORedisInstrumentation } = require('@opentelemetry/instrumentation-ioredis') - +const config = require('./config') const opentelemetry = require('@opentelemetry/api'); -const OtelConfig = require('./config').trace.otel; +const OtelConfig = config.trace.otel; +const HOST = config.host const collectorOptions = { serviceName: OtelConfig.service, @@ -17,8 +18,14 @@ const collectorOptions = { } const provider = new NodeTracerProvider(); -const exporter = new CollectorTraceExporter(collectorOptions); +provider.resource = provider.resource.merge({ + attributes: { + "service.instance.id": HOST + } +}) + +const exporter = new CollectorTraceExporter(collectorOptions); provider.addSpanProcessor(new BatchSpanProcessor(exporter, { maxQueueSize: 1000, scheduledDelayMillis: 30000, From f9053e3cadaaa271b45901a4ad55924c60cce9b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 25 May 2021 18:12:13 -0300 Subject: [PATCH 100/126] 0.3.0-rc.2 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 28594b8..1cd08ec 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.3.0-rc.1", + "version": "0.3.0-rc.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index ed58eba..fb35094 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.3.0-rc.1", + "version": "0.3.0-rc.2", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From d27b08468d7d3eee72e185a64909eb011da263e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 1 Jun 2021 15:48:23 -0300 Subject: [PATCH 101/126] 0.3.0 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 1cd08ec..80e8e40 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.3.0-rc.2", + "version": "0.3.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index fb35094..a822566 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.3.0-rc.2", + "version": "0.3.0", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From afd46885980b4fe0894dfa345aaf66ea70d58a30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 16 Nov 2021 14:51:20 -0300 Subject: [PATCH 102/126] Transfer redis timeout to env variable --- lib/domain/storage/redis.js | 2 +- lib/support/config.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/domain/storage/redis.js b/lib/domain/storage/redis.js index ff93bca..668c9f6 100644 --- a/lib/domain/storage/redis.js +++ b/lib/domain/storage/redis.js @@ -91,7 +91,7 @@ class StorageRedis extends Storage { enableReadyCheck: true, dropBufferSupport: true, enableOfflineQueue: this.options.enableOfflineQueue, - connectTimeout: 1000, + connectTimeout: config.redisConnectionTimeout, keyPrefix: this.options.keyPrefix, }; diff --git a/lib/support/config.js b/lib/support/config.js index d7bb50f..466e5ac 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -21,6 +21,7 @@ module.exports = { redis: ConfigDiscovery.parseRedisOptions(), defaultGlobalModules: ConfigDiscovery.getList('DEFAULT_GLOBAL_MODULES', DEFAULT_GLOBAL_MODULES), bodyParserLimit: process.env.BODY_PARSER_LIMIT || '1mb', + redisConnectionTimeout: process.env.REDIS_CONNECTION_TIMEOUT || 2000, metric: { client: process.env.METRIC_CLIENT, udpHost: process.env.METRIC_UDP_HOST, From 2ad568a131dfc50842ebaa3c465ac12636744716 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 16 Nov 2021 14:52:12 -0300 Subject: [PATCH 103/126] 0.3.1 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 80e8e40..e8ce02d 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.3.0", + "version": "0.3.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a822566..8ce5f36 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.3.0", + "version": "0.3.1", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From a5f99c9d2e2dd32e7e0becede6e9094ba3d23d1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 16 Nov 2021 16:55:12 -0300 Subject: [PATCH 104/126] fix: Parsing RedisConnectionTimeout to int --- lib/support/config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/support/config.js b/lib/support/config.js index 466e5ac..ff0db30 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -21,7 +21,7 @@ module.exports = { redis: ConfigDiscovery.parseRedisOptions(), defaultGlobalModules: ConfigDiscovery.getList('DEFAULT_GLOBAL_MODULES', DEFAULT_GLOBAL_MODULES), bodyParserLimit: process.env.BODY_PARSER_LIMIT || '1mb', - redisConnectionTimeout: process.env.REDIS_CONNECTION_TIMEOUT || 2000, + redisConnectionTimeout: ConfigDiscovery.getInt('REDIS_CONNECTION_TIMEOUT', 2000), metric: { client: process.env.METRIC_CLIENT, udpHost: process.env.METRIC_UDP_HOST, From d54226f7367868795971423ffce48717b9645e1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 16 Nov 2021 16:55:22 -0300 Subject: [PATCH 105/126] 0.3.2 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index e8ce02d..1daff0f 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.3.1", + "version": "0.3.2", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 8ce5f36..2487ca5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.3.1", + "version": "0.3.2", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From 5fa2b04cdb80ca1e2764c3800550b9334272c888 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 20 Dec 2022 16:44:45 -0300 Subject: [PATCH 106/126] Adding request_id data in span attribute --- lib/support/opentelemetry.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/support/opentelemetry.js b/lib/support/opentelemetry.js index d76884e..55ccd03 100644 --- a/lib/support/opentelemetry.js +++ b/lib/support/opentelemetry.js @@ -51,7 +51,9 @@ provider.register(); const tracer = opentelemetry.trace.getTracer(OtelConfig.service); function StartSpanMiddleware(req, res, next) { - const span = tracer.startSpan(req.path); + const span = tracer.startSpan(req.path, { attributes: { + "http.request_id": req.headers["x-request-id"] + }}); req.otelSpan = span; next(); } From 2c18e92968edc273fc4b9ce891ac1a50f9d15500 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 20 Dec 2022 16:47:16 -0300 Subject: [PATCH 107/126] 0.3.3-0 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 1daff0f..791a228 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.3.2", + "version": "0.3.3-0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 2487ca5..5d64715 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.3.2", + "version": "0.3.3-0", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From 4301048c3ddb0da04bd85ca8f733c403a2f2ac19 Mon Sep 17 00:00:00 2001 From: Matheus Lemes Date: Wed, 11 Jan 2023 14:16:46 -0300 Subject: [PATCH 108/126] feat: added new function update and setup metrics --- lib/domain/Metric.js | 45 +++++++++++++++++++++++++++++ lib/http/routers/FunctionsRouter.js | 6 ++++ 2 files changed, 51 insertions(+) diff --git a/lib/domain/Metric.js b/lib/domain/Metric.js index f9aa667..407a213 100644 --- a/lib/domain/Metric.js +++ b/lib/domain/Metric.js @@ -39,6 +39,20 @@ const functionPipelineHistogram = new prometheusClient.Histogram({ buckets, }); +const functionSetupHistogram = new prometheusClient.Histogram({ + name: 'backstage_functions_function_setup_duration_seconds', + help: 'How much time spent to setup a function in seconds', + buckets, + labelNames: ['namespace', 'id'], +}); + +const functionUpdateHistogram = new prometheusClient.Histogram({ + name: 'backstage_functions_function_update_duration_seconds', + help: 'How much time spent to update a function in seconds', + buckets, + labelNames: ['status'], +}); + function normalizeStatusCode(status) { if (status < 200) { return '1xx'; @@ -75,6 +89,18 @@ const redisLeaksCounter = new prometheusClient.Counter({ help: 'How many redis leaks in backstage functions', }); +const functionSetupCounter = new prometheusClient.Counter({ + name: 'backstage_functions_function_setup_total', + help: 'How many functions were set up', + labelNames: ['namespace', 'id'], +}); + +const functionUpdateCounter = new prometheusClient.Counter({ + name: 'backstage_functions_function_update_total', + help: 'How many functions were updated with status code', + labelNames: ['status'], +}); + class Metric { constructor(metric) { this.metric = metric; @@ -105,6 +131,25 @@ class Metric { static observeRedisLeak() { redisLeaksCounter.inc(); } + + observeFunctionSetup({ namespace, id }) { + const spent = (Date.now() - this.start) / 1000; + + functionSetupHistogram.labels(namespace, id).observe(spent); + functionSetupCounter.labels(namespace, id).inc(); + + return spent; + } + + observeFunctionUpdate(status) { + const spent = (Date.now() - this.start) / 1000; + const normalizedStatusCode = normalizeStatusCode(status); + + functionUpdateHistogram.labels(normalizedStatusCode).observe(spent); + functionUpdateCounter.labels(normalizedStatusCode).inc(); + + return spent; + } } module.exports = Metric; diff --git a/lib/http/routers/FunctionsRouter.js b/lib/http/routers/FunctionsRouter.js index 818f553..b3680cb 100644 --- a/lib/http/routers/FunctionsRouter.js +++ b/lib/http/routers/FunctionsRouter.js @@ -53,11 +53,13 @@ router.all('/:namespace/:id*', (req, res, next) => { router.put('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), async (req, res, next) => { const validationResult = new Validator().validate(req.body, schemas['functions/item']); const memoryStorage = req.app.get('memoryStorage'); + const metric = new Metric('function-update'); if (!validationResult.valid) { const error = 'Invalid instance'; const details = validationResult.errors.map(e => e.toString()); + metric.observeFunctionUpdate(400); res.status(400).json({ error, details }); return; } @@ -77,6 +79,7 @@ router.put('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), async }); if (invalid) { req.log.error(`Failed to post code: ${invalid.error}`); + metric.observeFunctionUpdate(400); res.status(400).json(invalid); return; } @@ -93,9 +96,11 @@ router.put('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), async res.set({ ETag: data.hash }); const functionsRequest = new FunctionsRequest(req); + metric.observeFunctionUpdate(200); new SchemaResponse(functionsRequest, res, 'functions/item').json(data); } catch (err) { log.error(`[${namespace}:${id}] ${err}`); + metric.observeFunctionUpdate(500); res.status(500).json({ error: err.message }); } @@ -233,6 +238,7 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a } try { + metric.observeFunctionSetup({ namespace, id }); const options = { console: new SpanConsoleWrapper(logStorage.console, span), env: code.env, From f9e573a3e3216cae00e495e9a0eef3b24e661f2d Mon Sep 17 00:00:00 2001 From: Matheus Lemes Date: Wed, 11 Jan 2023 14:39:48 -0300 Subject: [PATCH 109/126] 0.3.3 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 791a228..e089224 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.3.3-0", + "version": "0.3.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 5d64715..a0b3cbc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.3.3-0", + "version": "0.3.3", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From f44e52f552be92c57b54bca7be6ba552a4657611 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Thu, 12 Jan 2023 15:39:30 -0300 Subject: [PATCH 110/126] 0.4.0 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index e089224..1f22b17 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.3.3", + "version": "0.4.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index a0b3cbc..081d0a9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.3.3", + "version": "0.4.0", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From 2d7dbbbf4fc57a05aeea6a1e888120732c9bbafe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 11 Apr 2023 15:39:29 -0300 Subject: [PATCH 111/126] bump functions-sandbox dependency version --- npm-shrinkwrap.json | 14 +++++++++----- package.json | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 1f22b17..fac21c4 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -5,9 +5,9 @@ "requires": true, "dependencies": { "@globocom/backstage-functions-sandbox": { - "version": "0.5.3", - "resolved": "https://artifactory.globoi.com/artifactory/api/npm/npm-repos/@globocom/backstage-functions-sandbox/-/backstage-functions-sandbox-0.5.3.tgz", - "integrity": "sha1-cn/CrIwUaxhIttW9/XcL0uvmQwo=", + "version": "0.5.4-next.0", + "resolved": "https://artifactory.globoi.com:443/artifactory/api/npm/npm-local/@globocom/backstage-functions-sandbox/-/@globocom/backstage-functions-sandbox-0.5.4-next.0.tgz", + "integrity": "sha512-uXCzisk62rMkE9bBU5pilzL+pDd24EyHQ+dZEOFwUpaIzeKnrDwas5t70gAezW8jaMWTW3s/bkADu/NG4hEHFw==", "requires": { "once": "^1.4.0", "stack-trace": "^0.0.9" @@ -472,6 +472,7 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2", "longest": "^1.0.1", @@ -3324,7 +3325,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true + "dev": true, + "optional": true }, "lowercase-keys": { "version": "1.0.0", @@ -3714,6 +3716,7 @@ "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", "dev": true, + "optional": true, "requires": { "kind-of": "^3.0.2", "longest": "^1.0.1", @@ -4632,7 +4635,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true + "dev": true, + "optional": true }, "loose-envify": { "version": "1.3.1", diff --git a/package.json b/package.json index 081d0a9..1ef0764 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "author": "Backstage Team ", "license": "MIT", "dependencies": { - "@globocom/backstage-functions-sandbox": "^0.5.3", + "@globocom/backstage-functions-sandbox": "^0.5.4-next.0", "@opentelemetry/api": "^0.18.1", "@opentelemetry/core": "^0.19.0", "@opentelemetry/exporter-collector-grpc": "^0.19.0", From a1de60d7217831ab997e5e78ff5015fdab333039 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcus=20Cart=C3=A1genes?= Date: Tue, 11 Apr 2023 15:40:39 -0300 Subject: [PATCH 112/126] 0.4.1 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index fac21c4..21b40fa 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.4.0", + "version": "0.4.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 1ef0764..2298e58 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.4.0", + "version": "0.4.1", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From b88d4e48fa224ae8ae844e3da835877f732309e9 Mon Sep 17 00:00:00 2001 From: fguisso Date: Fri, 14 Apr 2023 10:53:19 -0300 Subject: [PATCH 113/126] feat: add support for removing protected fields from response The SchemaResponse class now has a removeProtectedFields method that removes fields specified in the responseProtectedFields configuration option from the response data. The responseProtectedFields configuration option is a list of fields that should be removed from the response data. This allows sensitive information to be removed from the response before it is sent to the client. --- lib/http/SchemaResponse.js | 10 ++++++++++ lib/support/config.js | 1 + 2 files changed, 11 insertions(+) diff --git a/lib/http/SchemaResponse.js b/lib/http/SchemaResponse.js index c2abed1..e9fad83 100644 --- a/lib/http/SchemaResponse.js +++ b/lib/http/SchemaResponse.js @@ -1,11 +1,21 @@ +const config = require('../support/config'); + class SchemaResponse { constructor(functionsRequest, res, schemaName) { this.functionsRequest = functionsRequest; this.res = res; this.schemaName = schemaName; + this.protectedFields = config.responseProtectedFields; } + removeProtectedFields(data) { + for (const field of this.protectedFields) { + delete data[field]; + }; + }; + json(data) { + this.removeProtectedFields(data); const schemeAndAuthority = this.functionsRequest.schemeAndAuthority(); this.res.set('Content-Type', `application/json; charset=utf-8; profile=${schemeAndAuthority}/_schemas/${this.schemaName}`); this.res.end(JSON.stringify(data)); diff --git a/lib/support/config.js b/lib/support/config.js index ff0db30..ed56c79 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -22,6 +22,7 @@ module.exports = { defaultGlobalModules: ConfigDiscovery.getList('DEFAULT_GLOBAL_MODULES', DEFAULT_GLOBAL_MODULES), bodyParserLimit: process.env.BODY_PARSER_LIMIT || '1mb', redisConnectionTimeout: ConfigDiscovery.getInt('REDIS_CONNECTION_TIMEOUT', 2000), + responseProtectedFields: ConfigDiscovery.getList('RESPONSE_PROTECTED_FIELDS', ['env']), metric: { client: process.env.METRIC_CLIENT, udpHost: process.env.METRIC_UDP_HOST, From e878317a549bdbc1f0a8b630eafad5bf12d3a66d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Celso=20In=C3=A1cio?= Date: Thu, 4 May 2023 15:29:10 -0300 Subject: [PATCH 114/126] hotfix: change protected fields to allow scoped fields --- lib/http/SchemaResponse.js | 15 ++++++++------- lib/support/config.js | 2 +- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/lib/http/SchemaResponse.js b/lib/http/SchemaResponse.js index e9fad83..e46e183 100644 --- a/lib/http/SchemaResponse.js +++ b/lib/http/SchemaResponse.js @@ -5,17 +5,18 @@ class SchemaResponse { this.functionsRequest = functionsRequest; this.res = res; this.schemaName = schemaName; - this.protectedFields = config.responseProtectedFields; + this.allowedFields = config.responseAllowedFields; } - removeProtectedFields(data) { - for (const field of this.protectedFields) { - delete data[field]; - }; - }; + removeNotAllowedFields(data) { + const fieldsToRemove = Object.keys(data.env.filter(field => !this.allowedFields.includes(field))); + for (const field of fieldsToRemove) { + delete data.env[field]; + } + } json(data) { - this.removeProtectedFields(data); + this.removeNotAllowedFields(data); const schemeAndAuthority = this.functionsRequest.schemeAndAuthority(); this.res.set('Content-Type', `application/json; charset=utf-8; profile=${schemeAndAuthority}/_schemas/${this.schemaName}`); this.res.end(JSON.stringify(data)); diff --git a/lib/support/config.js b/lib/support/config.js index ed56c79..97c7afe 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -22,7 +22,7 @@ module.exports = { defaultGlobalModules: ConfigDiscovery.getList('DEFAULT_GLOBAL_MODULES', DEFAULT_GLOBAL_MODULES), bodyParserLimit: process.env.BODY_PARSER_LIMIT || '1mb', redisConnectionTimeout: ConfigDiscovery.getInt('REDIS_CONNECTION_TIMEOUT', 2000), - responseProtectedFields: ConfigDiscovery.getList('RESPONSE_PROTECTED_FIELDS', ['env']), + responseAllowedFields: ConfigDiscovery.getList('RESPONSE_ALLOWED_FIELDS', ['BACKSTAGE_CLIENT_ID']), metric: { client: process.env.METRIC_CLIENT, udpHost: process.env.METRIC_UDP_HOST, From 3dfda052870a6d3dcf9f2fba3367ed9eeb9cedba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Celso=20In=C3=A1cio?= Date: Wed, 31 May 2023 15:39:42 -0300 Subject: [PATCH 115/126] fix response to not expose secret variables (#51) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix response to not expose secret variables * bump 0.4.2 --------- Co-authored-by: Celso InĂ¡cio --- lib/http/SchemaResponse.js | 6 ++-- lib/support/config.js | 2 +- package.json | 2 +- .../unit/http/routers/FunctionsRouter.test.js | 34 +++++++++++++++++++ 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/lib/http/SchemaResponse.js b/lib/http/SchemaResponse.js index 32ab126..fcd5fbf 100644 --- a/lib/http/SchemaResponse.js +++ b/lib/http/SchemaResponse.js @@ -5,13 +5,13 @@ class SchemaResponse { this.functionsRequest = functionsRequest; this.res = res; this.schemaName = schemaName; - this.allowedFields = config.responseAllowedFields; + this.notAllowedFields = config.responseNotAllowedFields; } removeNotAllowedFields(data) { const { env } = data; - if(env && env.length){ - const fieldsToRemove = Object.keys(env.filter(field => !this.allowedFields.includes(field))); + if(env){ + const fieldsToRemove = Object.keys(env).filter(field => this.notAllowedFields.includes(field)); for (const field of fieldsToRemove) { delete data.env[field]; } diff --git a/lib/support/config.js b/lib/support/config.js index 97c7afe..60fbc94 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -22,7 +22,7 @@ module.exports = { defaultGlobalModules: ConfigDiscovery.getList('DEFAULT_GLOBAL_MODULES', DEFAULT_GLOBAL_MODULES), bodyParserLimit: process.env.BODY_PARSER_LIMIT || '1mb', redisConnectionTimeout: ConfigDiscovery.getInt('REDIS_CONNECTION_TIMEOUT', 2000), - responseAllowedFields: ConfigDiscovery.getList('RESPONSE_ALLOWED_FIELDS', ['BACKSTAGE_CLIENT_ID']), + responseNotAllowedFields: ConfigDiscovery.getList('RESPONSE_NOT_ALLOWED_FIELDS', ['CLIENT_SECRET']), metric: { client: process.env.METRIC_CLIENT, udpHost: process.env.METRIC_UDP_HOST, diff --git a/package.json b/package.json index 2cf28bb..b4ab2aa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.6.0-rc.4", + "version": "0.4.2", "description": "Remote serverless code executor", "main": "index.js", "scripts": { diff --git a/test/unit/http/routers/FunctionsRouter.test.js b/test/unit/http/routers/FunctionsRouter.test.js index 3affa87..a7b4335 100644 --- a/test/unit/http/routers/FunctionsRouter.test.js +++ b/test/unit/http/routers/FunctionsRouter.test.js @@ -363,6 +363,40 @@ describe('PUT /functions/:namespace/:id/env/:env', () => { }); }); + describe('when define secret env variable', () => { + it('should create an enviroment variable', (done) => { + request(routes) + .put('/functions/backstage/correct/env/CLIENT_SECRET') + .set('content-type', 'application/json') + .send('"FOOBAR"') + .expect(() => { + const memoryStorage = routes.get('memoryStorage'); + expect(memoryStorage.lastEnvSet).to.be.eql({ + namespace: 'backstage', + id: 'correct', + env: 'CLIENT_SECRET', + value: 'FOOBAR', + }); + }) + .expect(204, done); + }); + }); + + describe('when get called, not return secret variable', () => { + it('should create an enviroment variable', (done) => { + request(routes) + .get('/functions/backstage/correct') + .set('content-type', 'application/json') + .send() + .expect((res) => { + expect(res.body.env).to.be.eql({ + MY_VAR: 'MY VALUE', + }); + }) + .expect(200, done); + }); + }); + describe('when the target function it\'s not exist', () => { it('should fail the request with 404 error', (done) => { request(routes) From f76580b2a4acd323986a8e2413d6069eea5c864b Mon Sep 17 00:00:00 2001 From: Raphael Rossi Date: Tue, 17 Oct 2023 15:18:15 -0300 Subject: [PATCH 116/126] enable format json for log (#52) --- README.md | 8 ++++++++ lib/support/config.js | 1 + lib/support/log.js | 19 +++++++++++++------ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 417778e..6e18ce2 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,14 @@ make setup make run ``` +## Configuration + +To format your log in `json`, please run: + +```sh +export LOG_APP_FORMAT=json +``` + ## Running locally via Docker ### Requirements - Docker 1.12+ diff --git a/lib/support/config.js b/lib/support/config.js index 60fbc94..e63e5b7 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -37,6 +37,7 @@ module.exports = { maxFullMessage: ConfigDiscovery.getInt('LOG_MAX_FULL_MESSAGE', 3000), maxChunkSize: ConfigDiscovery.getInt('LOG_MAX_CHUNK_SIZE', 32766), morganFormat: process.env.LOG_MONGAN_FORMAT || 'tiny', + format: process.env.LOG_APP_FORMAT || 'console', }, http: { keepAlive: ConfigDiscovery.getBool('HTTP_KEEP_ALIVE', false), diff --git a/lib/support/log.js b/lib/support/log.js index 6565365..dd8b151 100644 --- a/lib/support/log.js +++ b/lib/support/log.js @@ -9,14 +9,21 @@ if (config.numCPUs === 1) { logLabel = undefined; } +const consoleConfig = { + colorize: true, + label: logLabel, + level: logLevel, + timestamp: false, +}; + +if (config.log.format.toLowerCase() === 'json') { + consoleConfig.json = true; + consoleConfig.stringify = obj => JSON.stringify(obj); +} + const logger = new Logger({ transports: [ - new Console({ - colorize: true, - label: logLabel, - level: logLevel, - timestamp: false, - }), + new Console(consoleConfig), ], }); From d9ed31c88bd375d9d724469803ed11639a75baa6 Mon Sep 17 00:00:00 2001 From: Matheus Lemes <42449420+FLEME5@users.noreply.github.com> Date: Thu, 19 Oct 2023 14:05:56 -0300 Subject: [PATCH 117/126] removed setup metric labels to fix metric cardinality problem (#53) Co-authored-by: Matheus Lemes --- lib/domain/Metric.js | 8 +++----- lib/http/routers/FunctionsRouter.js | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/lib/domain/Metric.js b/lib/domain/Metric.js index 407a213..4c3e9af 100644 --- a/lib/domain/Metric.js +++ b/lib/domain/Metric.js @@ -43,7 +43,6 @@ const functionSetupHistogram = new prometheusClient.Histogram({ name: 'backstage_functions_function_setup_duration_seconds', help: 'How much time spent to setup a function in seconds', buckets, - labelNames: ['namespace', 'id'], }); const functionUpdateHistogram = new prometheusClient.Histogram({ @@ -92,7 +91,6 @@ const redisLeaksCounter = new prometheusClient.Counter({ const functionSetupCounter = new prometheusClient.Counter({ name: 'backstage_functions_function_setup_total', help: 'How many functions were set up', - labelNames: ['namespace', 'id'], }); const functionUpdateCounter = new prometheusClient.Counter({ @@ -132,11 +130,11 @@ class Metric { redisLeaksCounter.inc(); } - observeFunctionSetup({ namespace, id }) { + observeFunctionSetup() { const spent = (Date.now() - this.start) / 1000; - functionSetupHistogram.labels(namespace, id).observe(spent); - functionSetupCounter.labels(namespace, id).inc(); + functionSetupHistogram.observe(spent); + functionSetupCounter.inc(); return spent; } diff --git a/lib/http/routers/FunctionsRouter.js b/lib/http/routers/FunctionsRouter.js index b3680cb..b15281e 100644 --- a/lib/http/routers/FunctionsRouter.js +++ b/lib/http/routers/FunctionsRouter.js @@ -238,7 +238,7 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a } try { - metric.observeFunctionSetup({ namespace, id }); + metric.observeFunctionSetup(); const options = { console: new SpanConsoleWrapper(logStorage.console, span), env: code.env, From c158cace7af2632ab4225586394c9f8005a17286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Celso=20In=C3=A1cio?= Date: Thu, 19 Oct 2023 14:10:19 -0300 Subject: [PATCH 118/126] 0.4.3 --- npm-shrinkwrap.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index dd30431..f5219af 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.6.0-rc.3", + "version": "0.4.3", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index b4ab2aa..84895cd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@globocom/backstage-functions", - "version": "0.4.2", + "version": "0.4.3", "description": "Remote serverless code executor", "main": "index.js", "scripts": { From b64837798be321185fadab6b240522108c0ffd81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Celso=20In=C3=A1cio?= Date: Thu, 23 Nov 2023 11:52:19 -0300 Subject: [PATCH 119/126] change: allow function to be defined with another provider --- lib/http/routers/FunctionsRouter.js | 30 +++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/lib/http/routers/FunctionsRouter.js b/lib/http/routers/FunctionsRouter.js index b15281e..0ce6f58 100644 --- a/lib/http/routers/FunctionsRouter.js +++ b/lib/http/routers/FunctionsRouter.js @@ -51,6 +51,9 @@ router.all('/:namespace/:id*', (req, res, next) => { }); router.put('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), async (req, res, next) => { + const functionProvider = req.headers['x-bs-function-provider'] + const isExternalFunctionProvider = !functionProvider || functionProvider != "sandbox" + const validationResult = new Validator().validate(req.body, schemas['functions/item']); const memoryStorage = req.app.get('memoryStorage'); const metric = new Metric('function-update'); @@ -74,18 +77,20 @@ router.put('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), async const filename = codeFileName(namespace, id); const sandbox = req.app.get('sandbox'); - const invalid = sandbox.testSyntaxError(filename, code, { - console: new StdoutLogStorage(namespace, id).console, - }); - if (invalid) { - req.log.error(`Failed to post code: ${invalid.error}`); - metric.observeFunctionUpdate(400); - res.status(400).json(invalid); - return; + if(!isExternalFunctionProvider){ + const invalid = sandbox.testSyntaxError(filename, code, { + console: new StdoutLogStorage(namespace, id).console, + }); + if (invalid) { + req.log.error(`Failed to post code: ${invalid.error}`); + metric.observeFunctionUpdate(400); + res.status(400).json(invalid); + return; + } } const hash = crypto.createHash('sha1').update(code).digest('hex'); - const data = { id, code, hash }; + const data = { id, code, hash, provider: functionProvider }; if (env) { data.env = env; @@ -162,6 +167,9 @@ router.get('/:namespace/:id', async (req, res, next) => { } = req.params; const memoryStorage = req.app.get('memoryStorage'); + const functionProvider = req.headers['x-bs-function-provider'] + const isExternalFunctionProvider = !functionProvider || functionProvider != "sandbox" + try { const code = await memoryStorage.getCode(namespace, id); if (!code) { @@ -171,7 +179,9 @@ router.get('/:namespace/:id', async (req, res, next) => { return; } - res.set({ ETag: code.hash }); + if(!isExternalFunctionProvider){ + res.set({ ETag: code.hash }); + } const functionsRequest = new FunctionsRequest(req); From ae0c94df9f8d13418b402cd1fbe78fad4cde96b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Santos?= Date: Thu, 23 Nov 2023 14:40:36 -0300 Subject: [PATCH 120/126] [WIP] - creating executor strategy --- lib/domain/BackstageFunctionExecutor.js | 35 +++++++++++++++++++++++++ lib/domain/FunctionExecutor.js | 18 +++++++++++++ lib/domain/GoogleFunctionExecutor.js | 12 +++++++++ lib/http/routers/FunctionsRouter.js | 20 -------------- 4 files changed, 65 insertions(+), 20 deletions(-) create mode 100644 lib/domain/BackstageFunctionExecutor.js create mode 100644 lib/domain/FunctionExecutor.js create mode 100644 lib/domain/GoogleFunctionExecutor.js diff --git a/lib/domain/BackstageFunctionExecutor.js b/lib/domain/BackstageFunctionExecutor.js new file mode 100644 index 0000000..9f1720a --- /dev/null +++ b/lib/domain/BackstageFunctionExecutor.js @@ -0,0 +1,35 @@ + + +class BackstageFunctionExecutor { + constructor(req) { + this.memoryStorage = req.app.get('memoryStorage'); + } + + async run() { + let code; + + try { + code = await this.memoryStorage.getCodeByCache(namespace, id, { + preCache: (preCode) => { + preCode.script = sandbox.compileCode(filename, preCode.code); + return preCode; + }, + }); + + if (!code) { + const error = new Error(`Code '${namespace}/${id}' is not found`); + error.statusCode = 404; + reportError(span, error); + throw error; + } + } catch (err) { + reportError(span, err); + res.status(err.statusCode || 500).json({ error: err.message }); + return; + } + + return await sandbox.runScript(code.script, req, options); + +} + +module.exports = FunctionExecutorFactory; diff --git a/lib/domain/FunctionExecutor.js b/lib/domain/FunctionExecutor.js new file mode 100644 index 0000000..06743ca --- /dev/null +++ b/lib/domain/FunctionExecutor.js @@ -0,0 +1,18 @@ +class FunctionExecutor { + constructor() { + } + + run() { + throw Error("Class method not implemented"); + } +} + + +class FunctionExecutorFactory { + + getFunctionExecutor() { + return new FunctionExecutor(); + } +} + +module.exports = FunctionExecutorFactory; diff --git a/lib/domain/GoogleFunctionExecutor.js b/lib/domain/GoogleFunctionExecutor.js new file mode 100644 index 0000000..8ab421f --- /dev/null +++ b/lib/domain/GoogleFunctionExecutor.js @@ -0,0 +1,12 @@ +class GoogleFunctionExecutor { + constructor() { + } + + async run() { + let code; + + return null; + } +} + +module.exports = GoogleFunctionExecutor; diff --git a/lib/http/routers/FunctionsRouter.js b/lib/http/routers/FunctionsRouter.js index 0ce6f58..eb0f166 100644 --- a/lib/http/routers/FunctionsRouter.js +++ b/lib/http/routers/FunctionsRouter.js @@ -225,27 +225,7 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a 'function.id': id, }, }); - let code; - try { - code = await memoryStorage.getCodeByCache(namespace, id, { - preCache: (preCode) => { - preCode.script = sandbox.compileCode(filename, preCode.code); - return preCode; - }, - }); - - if (!code) { - const error = new Error(`Code '${namespace}/${id}' is not found`); - error.statusCode = 404; - reportError(span, error); - throw error; - } - } catch (err) { - reportError(span, err); - res.status(err.statusCode || 500).json({ error: err.message }); - return; - } try { metric.observeFunctionSetup(); From 58f2a30a9c461b8c013afc323ab2aa98c67665aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A1bio=20Santos?= Date: Thu, 23 Nov 2023 16:31:55 -0300 Subject: [PATCH 121/126] [WIP] - changing functions router to choose executor strategy --- lib/domain/BackstageFunctionExecutor.js | 14 ++++----- lib/domain/FunctionExecutor.js | 42 ++++++++++++++++++++++--- lib/domain/storage/redis.js | 9 ++++++ lib/http/routers/FunctionsRouter.js | 15 +++++++-- 4 files changed, 64 insertions(+), 16 deletions(-) diff --git a/lib/domain/BackstageFunctionExecutor.js b/lib/domain/BackstageFunctionExecutor.js index 9f1720a..ed174b8 100644 --- a/lib/domain/BackstageFunctionExecutor.js +++ b/lib/domain/BackstageFunctionExecutor.js @@ -1,15 +1,13 @@ class BackstageFunctionExecutor { - constructor(req) { - this.memoryStorage = req.app.get('memoryStorage'); - } - async run() { + async run(req) { let code; - + const memoryStorage = req.app.get('memoryStorage'); + const sandbox = req.app.get('sandbox'); try { - code = await this.memoryStorage.getCodeByCache(namespace, id, { + code = await memoryStorage.getCodeByCache(namespace, id, { preCache: (preCode) => { preCode.script = sandbox.compileCode(filename, preCode.code); return preCode; @@ -29,7 +27,7 @@ class BackstageFunctionExecutor { } return await sandbox.runScript(code.script, req, options); - + } } -module.exports = FunctionExecutorFactory; +module.exports = BackstageFunctionExecutor; diff --git a/lib/domain/FunctionExecutor.js b/lib/domain/FunctionExecutor.js index 06743ca..f420743 100644 --- a/lib/domain/FunctionExecutor.js +++ b/lib/domain/FunctionExecutor.js @@ -1,5 +1,25 @@ +const BackstageFunctionExecutor = require('./BackstageFunctionExecutor'); +const GoogleFunctionExecutor = require('./GoogleFunctionExecutor'); + + +const FunctionExecutors = { + BackstageExecutor: 'backstage-executor', + GoogleExecutor: 'google-executor' +} + class FunctionExecutor { - constructor() { + + static toEnum(executorStr) { + let executorEnum; + switch(executorStr) { + case FunctionExecutors.GoogleExecutor.toString(): + executorEnum = FunctionExecutors.GoogleExecutor; + break; + default: + executorEnum = FunctionExecutors.BackstageExecutor; + break; + } + return executorEnum; } run() { @@ -7,12 +27,24 @@ class FunctionExecutor { } } - class FunctionExecutorFactory { - getFunctionExecutor() { - return new FunctionExecutor(); + getFunctionExecutor(executorStr) { + let executor; + const executorEnum = FunctionExecutor.toEnum(executorStr); + switch(executorEnum) { + case FunctionExecutors.GoogleExecutor: + executor = new GoogleFunctionExecutor() + default: + executor = new BackstageFunctionExecutor(); + break; + + } + return executor; } } -module.exports = FunctionExecutorFactory; +module.exports = { + FunctionExecutor: FunctionExecutor, + FunctionExecutorFactory: FunctionExecutorFactory +} diff --git a/lib/domain/storage/redis.js b/lib/domain/storage/redis.js index 668c9f6..111b684 100644 --- a/lib/domain/storage/redis.js +++ b/lib/domain/storage/redis.js @@ -14,6 +14,10 @@ const ERR_ENV_NOT_FOUND = new Error('Env variable not found'); ERR_FUNCTION_NOT_FOUND.statusCode = 404; ERR_ENV_NOT_FOUND.statusCode = 404; +function executorKey(namespace, codeId) { + return `executor:${namespace}/${codeId}`; +} + function redisKey(namespace, codeId) { return `code:${namespace}/${codeId}`; } @@ -267,6 +271,11 @@ class StorageRedis extends Storage { return this.client.del(key); } + async getExecutorByCache(namespace, id, { preCache }) { + const executor = executorKey(namespace, id); + return await this.client.get(executor); + } + async getCodeByCache(namespace, id, { preCache }) { const key = redisKey(namespace, id); const versionID = await this.client.hget(key, 'versionID'); diff --git a/lib/http/routers/FunctionsRouter.js b/lib/http/routers/FunctionsRouter.js index eb0f166..b3f2b3b 100644 --- a/lib/http/routers/FunctionsRouter.js +++ b/lib/http/routers/FunctionsRouter.js @@ -13,6 +13,8 @@ const FunctionsRequest = require('../FunctionsRequest'); const Metric = require('../../domain/Metric'); const SpanConsoleWrapper = require('../../domain/SpanConsoleWrapper'); const SchemaResponse = require('../SchemaResponse'); +const { FunctionExecutorFactory } = require('../../domain/FunctionExecutor'); + const router = new Router(); const { bodyParserLimit } = require('../../support/config'); @@ -212,9 +214,8 @@ router.delete('/:namespace/:id', async (req, res, next) => { router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), async (req, res, next) => { const { namespace, id } = req.params; - const memoryStorage = req.app.get('memoryStorage'); - const sandbox = req.app.get('sandbox'); const filename = codeFileName(namespace, id); + const memoryStorage = req.app.get('memoryStorage') const metric = new Metric('function-run'); const logStorage = new DefaultLogStorage(namespace, id, req); @@ -228,13 +229,21 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a try { + + const executorId = memoryStorage.getExecutorByCache(namespace, id); + + factory = new FunctionExecutorFactory(executorId); + + const executor = factory.getFunctionExecutor(executor); + + await executor.run(req); + metric.observeFunctionSetup(); const options = { console: new SpanConsoleWrapper(logStorage.console, span), env: code.env, span, }; - const result = await sandbox.runScript(code.script, req, options); res.set(result.headers); res.status(result.status); From 9e8d91cc00818286dae149e67dfaee9432d6acf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Celso=20In=C3=A1cio?= Date: Thu, 23 Nov 2023 16:46:27 -0300 Subject: [PATCH 122/126] add: google cloud function provider --- lib/domain/GoogleFunctionExecutor.js | 67 ++++++++++++++++++++++++++-- lib/support/config.js | 1 + 2 files changed, 65 insertions(+), 3 deletions(-) diff --git a/lib/domain/GoogleFunctionExecutor.js b/lib/domain/GoogleFunctionExecutor.js index 8ab421f..ef1324d 100644 --- a/lib/domain/GoogleFunctionExecutor.js +++ b/lib/domain/GoogleFunctionExecutor.js @@ -1,12 +1,73 @@ +const config = require("../support/config"); +const { fetch } = require('node-fetch'); +// const { request } = require('gaxios'); + +const log = require("../support/log"); + class GoogleFunctionExecutor { constructor() { } - async run() { - let code; + async authenticate(url){ + try{ + const sa_auth = JSON.parse(config.googleCloudCredentials) + const client = new GoogleAuth().fromJSON(sa_auth); + const token = await client.fetchIdToken(url) + return `Bearer ${token}` + }catch(err){ + throw err + } + } + + async run(zoneId, projectId, functionName, body) { + try{ + const url = `https://${zoneId}-${projectId}.cloudfunctions.net/${functionName}`; + + const token = await authenticate(url) + + const response = await fetch(url, { + method: "POST", + body: JSON.stringify(body), + headers: { + "Content-Type": "application/json", + "Authorization": token + } + }) + + const data = (contentType && contentType.includes('application/json')) ? await response.json() : await response.text() + + return { + status: response.status, + headers: response.headers, + body: data + } + } catch (ex) { + throw ex + } + } + + async getEnvironmentVariables(projectId, functionName){ + + } + + async putEnvironmentVariables(projectId, functionName, variables){ + const url = `https://cloudfunctions.googleapis.com/v1/projects/${projectId}/locations/-/functions/${functionName}` + + const token = await authenticate(url) - return null; + const response = await request({ + url, + method: "POST", + data: {}, + headers: { + "Content-Type": "application/json", + "Authorization": token + } + }) + + return response } + } module.exports = GoogleFunctionExecutor; diff --git a/lib/support/config.js b/lib/support/config.js index e63e5b7..4e26128 100644 --- a/lib/support/config.js +++ b/lib/support/config.js @@ -23,6 +23,7 @@ module.exports = { bodyParserLimit: process.env.BODY_PARSER_LIMIT || '1mb', redisConnectionTimeout: ConfigDiscovery.getInt('REDIS_CONNECTION_TIMEOUT', 2000), responseNotAllowedFields: ConfigDiscovery.getList('RESPONSE_NOT_ALLOWED_FIELDS', ['CLIENT_SECRET']), + googleCloudCredentials: process.env.GOOGLE_CREDENTIALS || null, metric: { client: process.env.METRIC_CLIENT, udpHost: process.env.METRIC_UDP_HOST, From e5d1b5a7f6623c8c1e6d850a7212c5109a500db0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Celso=20In=C3=A1cio?= Date: Thu, 23 Nov 2023 16:47:16 -0300 Subject: [PATCH 123/126] add: google auth library --- npm-shrinkwrap.json | 178 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 1 + 2 files changed, 179 insertions(+) diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index f5219af..934458e 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -452,6 +452,29 @@ } } }, + "agent-base": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", + "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "requires": { + "debug": "^4.3.4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "ajv": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", @@ -706,6 +729,11 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, "basic-auth": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.4.tgz", @@ -720,6 +748,11 @@ "tweetnacl": "^0.14.3" } }, + "bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==" + }, "binary-extensions": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", @@ -887,6 +920,11 @@ "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", "dev": true }, + "buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==" + }, "bufrw": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/bufrw/-/bufrw-1.3.0.tgz", @@ -1465,6 +1503,14 @@ "jsbn": "~0.1.0" } }, + "ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -2164,6 +2210,46 @@ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, + "gaxios": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.1.1.tgz", + "integrity": "sha512-bw8smrX+XlAoo9o1JAksBwX+hi/RG15J+NTSxmNPIclKC3ZVK6C2afwY8OSdRvOK0+ZLecUJYtj2MmjOt3Dm0w==", + "requires": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9" + }, + "dependencies": { + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" + }, + "node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "requires": { + "whatwg-url": "^5.0.0" + } + } + } + }, + "gcp-metadata": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", + "requires": { + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" + } + }, "gelf": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/gelf/-/gelf-2.0.1.tgz", @@ -2290,6 +2376,19 @@ "pinkie-promise": "^2.0.0" } }, + "google-auth-library": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.2.0.tgz", + "integrity": "sha512-1oV3p0JhNEhVbj26eF3FAJcv9MXXQt4S0wcvKZaDbl4oHq5V3UJoSbsGZGQNcjoCdhW4kDSwOs11wLlHog3fgQ==", + "requires": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^6.0.0", + "gcp-metadata": "^6.0.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0" + } + }, "got": { "version": "6.7.1", "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", @@ -2327,6 +2426,15 @@ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", "dev": true }, + "gtoken": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.0.1.tgz", + "integrity": "sha512-KcFVtoP1CVFtQu0aSk3AyAt2og66PFhZAlkUOuWKwzMLoulHXG5W5wE5xAnHb+yl3/wEFoqGW7/cDGMU8igDZQ==", + "requires": { + "gaxios": "^6.0.0", + "jws": "^4.0.0" + } + }, "handlebars": { "version": "4.0.11", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", @@ -2467,6 +2575,30 @@ "sshpk": "^1.7.0" } }, + "https-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", + "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "requires": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + } + } + }, "iconv-lite": { "version": "0.4.13", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", @@ -2979,6 +3111,14 @@ "integrity": "sha1-ZQmH2g3XT06/WhE3eiqi0nPpff0=", "optional": true }, + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } + }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", @@ -3041,6 +3181,25 @@ "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==", "dev": true }, + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "requires": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "requires": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -6691,6 +6850,11 @@ "punycode": "^1.4.1" } }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" + }, "tryit": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/tryit/-/tryit-1.0.3.tgz", @@ -6894,6 +7058,20 @@ "extsprintf": "1.0.2" } }, + "webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" + }, + "whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "requires": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "which": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", diff --git a/package.json b/package.json index 84895cd..d696abb 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "express": "^4.14.0", "express-opentracing": "^0.1.1", "gelf": "^2.0.1", + "google-auth-library": "^9.2.0", "ioredis": "^3.1.4", "jaeger-client": "^3.18.0", "jsonschema": "^1.1.0", From cc6ace2d38055d6de67671c6ba876f2a38b9842a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Celso=20In=C3=A1cio?= Date: Thu, 23 Nov 2023 18:37:19 -0300 Subject: [PATCH 124/126] add: cloud function execution --- lib/domain/BackstageFunctionExecutor.js | 24 ++++++++++--- lib/domain/FunctionExecutor.js | 8 ++--- lib/domain/GoogleFunctionExecutor.js | 21 ++++++++---- lib/domain/schemas.js | 8 +++++ lib/domain/storage.js | 1 + lib/domain/storage/InMemory.js | 16 +++++++++ lib/domain/storage/redis.js | 4 +-- lib/http/routers/FunctionsRouter.js | 45 ++++++++++++------------- 8 files changed, 86 insertions(+), 41 deletions(-) diff --git a/lib/domain/BackstageFunctionExecutor.js b/lib/domain/BackstageFunctionExecutor.js index ed174b8..56cde6d 100644 --- a/lib/domain/BackstageFunctionExecutor.js +++ b/lib/domain/BackstageFunctionExecutor.js @@ -1,11 +1,16 @@ +const { reportError } = require("../support/tracing"); +const SpanConsoleWrapper = require("./SpanConsoleWrapper"); class BackstageFunctionExecutor { async run(req) { let code; + const { namespace, id, filename, logStorage, span } = req.params const memoryStorage = req.app.get('memoryStorage'); const sandbox = req.app.get('sandbox'); + + try { code = await memoryStorage.getCodeByCache(namespace, id, { preCache: (preCode) => { @@ -13,19 +18,28 @@ class BackstageFunctionExecutor { return preCode; }, }); - + + + if (!code) { const error = new Error(`Code '${namespace}/${id}' is not found`); error.statusCode = 404; - reportError(span, error); + // reportError(span, error); throw error; } } catch (err) { - reportError(span, err); - res.status(err.statusCode || 500).json({ error: err.message }); - return; + // reportError(span, err); + err.statusCode = err.statusCode || 500 + err.error = err.message + throw err } + const options = { + console: new SpanConsoleWrapper(logStorage.console, span), + env: code.env, + span, + }; + return await sandbox.runScript(code.script, req, options); } } diff --git a/lib/domain/FunctionExecutor.js b/lib/domain/FunctionExecutor.js index f420743..a1ebfa0 100644 --- a/lib/domain/FunctionExecutor.js +++ b/lib/domain/FunctionExecutor.js @@ -34,11 +34,11 @@ class FunctionExecutorFactory { const executorEnum = FunctionExecutor.toEnum(executorStr); switch(executorEnum) { case FunctionExecutors.GoogleExecutor: - executor = new GoogleFunctionExecutor() + executor = new GoogleFunctionExecutor() + break; default: - executor = new BackstageFunctionExecutor(); - break; - + executor = new BackstageFunctionExecutor(); + break; } return executor; } diff --git a/lib/domain/GoogleFunctionExecutor.js b/lib/domain/GoogleFunctionExecutor.js index ef1324d..821ba2c 100644 --- a/lib/domain/GoogleFunctionExecutor.js +++ b/lib/domain/GoogleFunctionExecutor.js @@ -1,5 +1,6 @@ const config = require("../support/config"); -const { fetch } = require('node-fetch'); +const fetch = require('node-fetch'); +const { GoogleAuth } = require("google-auth-library") // const { request } = require('gaxios'); const log = require("../support/log"); @@ -10,7 +11,7 @@ class GoogleFunctionExecutor { async authenticate(url){ try{ - const sa_auth = JSON.parse(config.googleCloudCredentials) + const sa_auth = JSON.parse(Buffer.from(config.googleCloudCredentials, "base64").toString('ascii')) const client = new GoogleAuth().fromJSON(sa_auth); const token = await client.fetchIdToken(url) return `Bearer ${token}` @@ -19,11 +20,15 @@ class GoogleFunctionExecutor { } } - async run(zoneId, projectId, functionName, body) { - try{ - const url = `https://${zoneId}-${projectId}.cloudfunctions.net/${functionName}`; + async run(req) { + try { + const zoneId = "us-central1" + const projectId = "removed" + const { namespace, id } = req.params + const { body } = req + const url = `https://${zoneId}-${projectId}.cloudfunctions.net/${namespace}_${id}`; - const token = await authenticate(url) + const token = await this.authenticate(url) const response = await fetch(url, { method: "POST", @@ -34,11 +39,13 @@ class GoogleFunctionExecutor { } }) + const contentType = response.headers['content-type']; + const data = (contentType && contentType.includes('application/json')) ? await response.json() : await response.text() return { status: response.status, - headers: response.headers, + headers: Object.fromEntries(response.headers), body: data } } catch (ex) { diff --git a/lib/domain/schemas.js b/lib/domain/schemas.js index 220a797..3ba31be 100644 --- a/lib/domain/schemas.js +++ b/lib/domain/schemas.js @@ -140,6 +140,14 @@ const functionItem = { title: 'Namespace', readOnly: true, }, + provider: { + type: 'string', + title: 'Provider', + }, + projectId: { + type: 'string', + title: 'ProjectId', + }, id: { type: 'string', title: 'ID', diff --git a/lib/domain/storage.js b/lib/domain/storage.js index 71538f6..8503f43 100644 --- a/lib/domain/storage.js +++ b/lib/domain/storage.js @@ -38,6 +38,7 @@ class Storage { putCode() { throw ERR_UNIMPLEMENTED_METHOD; } getCode() { throw ERR_UNIMPLEMENTED_METHOD; } deleteCode() { throw ERR_UNIMPLEMENTED_METHOD; } + getExecutor() { throw ERR_UNIMPLEMENTED_METHOD; } getCodeByCache() { throw ERR_UNIMPLEMENTED_METHOD; } getCodesByCache() { throw ERR_UNIMPLEMENTED_METHOD; } putCodeEnviromentVariable() { throw ERR_UNIMPLEMENTED_METHOD; } diff --git a/lib/domain/storage/InMemory.js b/lib/domain/storage/InMemory.js index 574f079..cea6ed6 100644 --- a/lib/domain/storage/InMemory.js +++ b/lib/domain/storage/InMemory.js @@ -8,6 +8,9 @@ const ERR_ENV_NOT_FOUND = new Error('Env variable not found'); ERR_FUNCTION_NOT_FOUND.statusCode = 404; ERR_ENV_NOT_FOUND.statusCode = 404; +function executorKey(namespace, codeId) { + return `executor:${namespace}/${codeId}`; +} function storageKey(namespace, codeId) { return `code:${namespace}/${codeId}`; @@ -45,6 +48,10 @@ class StorageInMemory extends Storage { this.rangeNamespaces = []; } + async getExecutor(namespace, id) { + return await this.client.get(executor); + } + async putCode(namespace, id, code) { const key = storageKey(namespace, id); const storage = this.storage[key]; @@ -85,6 +92,8 @@ class StorageInMemory extends Storage { } } + + async getCode(namespace, id) { const key = storageKey(namespace, id); @@ -118,6 +127,13 @@ class StorageInMemory extends Storage { return result; } + async getExecutor(namespace, id) { + const executor = executorKey(namespace, id); + // return this.storage[executor]; + // return this.storage[executor]; + return "google-executor" + } + async deleteCode(namespace, id) { const key = storageKey(namespace, id); delete this.storage[key]; diff --git a/lib/domain/storage/redis.js b/lib/domain/storage/redis.js index 111b684..9a89a07 100644 --- a/lib/domain/storage/redis.js +++ b/lib/domain/storage/redis.js @@ -271,11 +271,11 @@ class StorageRedis extends Storage { return this.client.del(key); } - async getExecutorByCache(namespace, id, { preCache }) { + async getExecutor(namespace, id) { const executor = executorKey(namespace, id); return await this.client.get(executor); } - + async getCodeByCache(namespace, id, { preCache }) { const key = redisKey(namespace, id); const versionID = await this.client.hget(key, 'versionID'); diff --git a/lib/http/routers/FunctionsRouter.js b/lib/http/routers/FunctionsRouter.js index b3f2b3b..6585eda 100644 --- a/lib/http/routers/FunctionsRouter.js +++ b/lib/http/routers/FunctionsRouter.js @@ -11,7 +11,6 @@ const ErrorTracker = require('../../domain/ErrorTracker'); const { StdoutLogStorage, DefaultLogStorage } = require('../../domain/LogStorage'); const FunctionsRequest = require('../FunctionsRequest'); const Metric = require('../../domain/Metric'); -const SpanConsoleWrapper = require('../../domain/SpanConsoleWrapper'); const SchemaResponse = require('../SchemaResponse'); const { FunctionExecutorFactory } = require('../../domain/FunctionExecutor'); @@ -75,6 +74,7 @@ router.put('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), async const { code, env, + projectId } = req.body; const filename = codeFileName(namespace, id); const sandbox = req.app.get('sandbox'); @@ -92,7 +92,7 @@ router.put('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), async } const hash = crypto.createHash('sha1').update(code).digest('hex'); - const data = { id, code, hash, provider: functionProvider }; + const data = { id, code, hash, provider: functionProvider, projectId }; if (env) { data.env = env; @@ -215,9 +215,11 @@ router.delete('/:namespace/:id', async (req, res, next) => { router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), async (req, res, next) => { const { namespace, id } = req.params; const filename = codeFileName(namespace, id); + req.params.filename = filename const memoryStorage = req.app.get('memoryStorage') const metric = new Metric('function-run'); const logStorage = new DefaultLogStorage(namespace, id, req); + req.params.logStorage = logStorage const span = req.span.tracer().startSpan('run function', { childOf: req.span, @@ -226,24 +228,21 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a 'function.id': id, }, }); + req.params.span = span try { + const executorId = await memoryStorage.getExecutor(namespace, id); - const executorId = memoryStorage.getExecutorByCache(namespace, id); + factory = new FunctionExecutorFactory(); - factory = new FunctionExecutorFactory(executorId); + const executor = factory.getFunctionExecutor(executorId); - const executor = factory.getFunctionExecutor(executor); + const result = await executor.run(req); - await executor.run(req); + console.log(result) metric.observeFunctionSetup(); - const options = { - console: new SpanConsoleWrapper(logStorage.console, span), - env: code.env, - span, - }; res.set(result.headers); res.status(result.status); @@ -271,18 +270,18 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a requestTime: spent, }); - const { sentryDSN } = code; - - const extra = Object.assign({ body: req.body }, logResult || {}); - const errTracker = new ErrorTracker({ - sentryDSN, - filename, - extra, - tags: { codeHash: code.hash }, - code: code.code, - }); - errTracker.notify(err); - RecordOtelError(err) + // const { sentryDSN } = code; + + // const extra = Object.assign({ body: req.body }, logResult || {}); + // const errTracker = new ErrorTracker({ + // sentryDSN, + // filename, + // extra, + // // tags: { codeHash: code.hash }, + // // code: code.code, + // }); + // errTracker.notify(err); + // RecordOtelError(err) } }); From 9ebebd2ddbd04b44424a0f39e44283d96ca66705 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Celso=20In=C3=A1cio?= Date: Fri, 24 Nov 2023 10:49:12 -0300 Subject: [PATCH 125/126] change: update factory name to provider --- ...ecutor.js => BackstageFunctionProvider.js} | 15 ++++-- lib/domain/FunctionExecutor.js | 50 ------------------- lib/domain/FunctionProvider.js | 50 +++++++++++++++++++ ...nExecutor.js => GoogleFunctionProvider.js} | 9 ++-- lib/domain/storage.js | 2 +- lib/domain/storage/InMemory.js | 16 +++--- lib/domain/storage/redis.js | 8 +-- lib/http/routers/FunctionsRouter.js | 16 +++--- 8 files changed, 84 insertions(+), 82 deletions(-) rename lib/domain/{BackstageFunctionExecutor.js => BackstageFunctionProvider.js} (76%) delete mode 100644 lib/domain/FunctionExecutor.js create mode 100644 lib/domain/FunctionProvider.js rename lib/domain/{GoogleFunctionExecutor.js => GoogleFunctionProvider.js} (89%) diff --git a/lib/domain/BackstageFunctionExecutor.js b/lib/domain/BackstageFunctionProvider.js similarity index 76% rename from lib/domain/BackstageFunctionExecutor.js rename to lib/domain/BackstageFunctionProvider.js index 56cde6d..f7525da 100644 --- a/lib/domain/BackstageFunctionExecutor.js +++ b/lib/domain/BackstageFunctionProvider.js @@ -1,8 +1,7 @@ const { reportError } = require("../support/tracing"); const SpanConsoleWrapper = require("./SpanConsoleWrapper"); - -class BackstageFunctionExecutor { +class BackstageFunctionProvider { async run(req) { let code; @@ -10,7 +9,6 @@ class BackstageFunctionExecutor { const memoryStorage = req.app.get('memoryStorage'); const sandbox = req.app.get('sandbox'); - try { code = await memoryStorage.getCodeByCache(namespace, id, { preCache: (preCode) => { @@ -40,8 +38,15 @@ class BackstageFunctionExecutor { span, }; - return await sandbox.runScript(code.script, req, options); + const result = await sandbox.runScript(code.script, req, options) + return { + ...result, + headers: { + ...result.headers, + 'x-serverless-engine': 'bs-functions; javascript sandbox legacy;' + } + }; } } -module.exports = BackstageFunctionExecutor; +module.exports = BackstageFunctionProvider; diff --git a/lib/domain/FunctionExecutor.js b/lib/domain/FunctionExecutor.js deleted file mode 100644 index a1ebfa0..0000000 --- a/lib/domain/FunctionExecutor.js +++ /dev/null @@ -1,50 +0,0 @@ -const BackstageFunctionExecutor = require('./BackstageFunctionExecutor'); -const GoogleFunctionExecutor = require('./GoogleFunctionExecutor'); - - -const FunctionExecutors = { - BackstageExecutor: 'backstage-executor', - GoogleExecutor: 'google-executor' -} - -class FunctionExecutor { - - static toEnum(executorStr) { - let executorEnum; - switch(executorStr) { - case FunctionExecutors.GoogleExecutor.toString(): - executorEnum = FunctionExecutors.GoogleExecutor; - break; - default: - executorEnum = FunctionExecutors.BackstageExecutor; - break; - } - return executorEnum; - } - - run() { - throw Error("Class method not implemented"); - } -} - -class FunctionExecutorFactory { - - getFunctionExecutor(executorStr) { - let executor; - const executorEnum = FunctionExecutor.toEnum(executorStr); - switch(executorEnum) { - case FunctionExecutors.GoogleExecutor: - executor = new GoogleFunctionExecutor() - break; - default: - executor = new BackstageFunctionExecutor(); - break; - } - return executor; - } -} - -module.exports = { - FunctionExecutor: FunctionExecutor, - FunctionExecutorFactory: FunctionExecutorFactory -} diff --git a/lib/domain/FunctionProvider.js b/lib/domain/FunctionProvider.js new file mode 100644 index 0000000..a46381d --- /dev/null +++ b/lib/domain/FunctionProvider.js @@ -0,0 +1,50 @@ +const BackstageFunctionProvider = require('./BackstageFunctionProvider'); +const GoogleFunctionProvider = require('./GoogleFunctionProvider'); + + +const FunctionProviders = { + BackstageProvider: 'backstage-executor', + GoogleProvider: 'google-executor' +} + +class FunctionProvider { + + static toEnum(providerStr) { + let providerEnum; + switch(providerStr) { + case FunctionProviders.GoogleProvider.toString(): + providerEnum = FunctionProviders.GoogleProvider; + break; + default: + providerEnum = FunctionProviders.BackstageProvider; + break; + } + return providerEnum; + } + + run() { + throw Error("Class method not implemented"); + } +} + +class FunctionProviderFactory { + + getFunctionProvider(providerStr) { + let provider; + const providerEnum = FunctionProvider.toEnum(providerStr); + switch(providerEnum) { + case FunctionProviders.GoogleProvider: + provider = new GoogleFunctionProvider() + break; + default: + provider = new BackstageFunctionProvider(); + break; + } + return provider; + } +} + +module.exports = { + FunctionProvider: FunctionProvider, + FunctionProviderFactory: FunctionProviderFactory +} diff --git a/lib/domain/GoogleFunctionExecutor.js b/lib/domain/GoogleFunctionProvider.js similarity index 89% rename from lib/domain/GoogleFunctionExecutor.js rename to lib/domain/GoogleFunctionProvider.js index 821ba2c..832f8d3 100644 --- a/lib/domain/GoogleFunctionExecutor.js +++ b/lib/domain/GoogleFunctionProvider.js @@ -5,7 +5,7 @@ const { GoogleAuth } = require("google-auth-library") const log = require("../support/log"); -class GoogleFunctionExecutor { +class GoogleFunctionProvider { constructor() { } @@ -45,7 +45,10 @@ class GoogleFunctionExecutor { return { status: response.status, - headers: Object.fromEntries(response.headers), + headers: { + ...Object.fromEntries(response.headers), + 'x-serverless-engine': 'bs-functions; go v1.21.1;' + }, body: data } } catch (ex) { @@ -77,4 +80,4 @@ class GoogleFunctionExecutor { } -module.exports = GoogleFunctionExecutor; +module.exports = GoogleFunctionProvider; diff --git a/lib/domain/storage.js b/lib/domain/storage.js index 8503f43..a77c576 100644 --- a/lib/domain/storage.js +++ b/lib/domain/storage.js @@ -38,7 +38,7 @@ class Storage { putCode() { throw ERR_UNIMPLEMENTED_METHOD; } getCode() { throw ERR_UNIMPLEMENTED_METHOD; } deleteCode() { throw ERR_UNIMPLEMENTED_METHOD; } - getExecutor() { throw ERR_UNIMPLEMENTED_METHOD; } + getProvider() { throw ERR_UNIMPLEMENTED_METHOD; } getCodeByCache() { throw ERR_UNIMPLEMENTED_METHOD; } getCodesByCache() { throw ERR_UNIMPLEMENTED_METHOD; } putCodeEnviromentVariable() { throw ERR_UNIMPLEMENTED_METHOD; } diff --git a/lib/domain/storage/InMemory.js b/lib/domain/storage/InMemory.js index cea6ed6..6185409 100644 --- a/lib/domain/storage/InMemory.js +++ b/lib/domain/storage/InMemory.js @@ -48,10 +48,6 @@ class StorageInMemory extends Storage { this.rangeNamespaces = []; } - async getExecutor(namespace, id) { - return await this.client.get(executor); - } - async putCode(namespace, id, code) { const key = storageKey(namespace, id); const storage = this.storage[key]; @@ -63,6 +59,7 @@ class StorageInMemory extends Storage { versionID: uuidV4(), updated, code: (storage && storage.code) ? storage.code : null, + provider: code.provider || null }; const functionCode = (storage && storage.code) ? storage.code : code; @@ -106,7 +103,6 @@ class StorageInMemory extends Storage { if (namespaceSettings) { delete namespaceSettings.namespace; } - const result = { id, namespace, @@ -116,6 +112,8 @@ class StorageInMemory extends Storage { updated: data.updated, namespaceSettings, versionID: data.versionID || null, + provider: data.provider || null, + }; if (data.env) { @@ -127,11 +125,9 @@ class StorageInMemory extends Storage { return result; } - async getExecutor(namespace, id) { - const executor = executorKey(namespace, id); - // return this.storage[executor]; - // return this.storage[executor]; - return "google-executor" + async getProvider(namespace, id) { + const { provider } = await this.getCode(namespace, id) + return provider; } async deleteCode(namespace, id) { diff --git a/lib/domain/storage/redis.js b/lib/domain/storage/redis.js index 9a89a07..43d5f65 100644 --- a/lib/domain/storage/redis.js +++ b/lib/domain/storage/redis.js @@ -223,6 +223,8 @@ class StorageRedis extends Storage { data.hash = code.hash; } + data.provider = code.provider || null + if (code.env) { data.env = JSON.stringify(code.env); } @@ -271,9 +273,9 @@ class StorageRedis extends Storage { return this.client.del(key); } - async getExecutor(namespace, id) { - const executor = executorKey(namespace, id); - return await this.client.get(executor); + async getProvider(namespace, id) { + const { provider } = this.getCode(namespace, id) + return provider; } async getCodeByCache(namespace, id, { preCache }) { diff --git a/lib/http/routers/FunctionsRouter.js b/lib/http/routers/FunctionsRouter.js index 6585eda..27a38f7 100644 --- a/lib/http/routers/FunctionsRouter.js +++ b/lib/http/routers/FunctionsRouter.js @@ -12,7 +12,7 @@ const { StdoutLogStorage, DefaultLogStorage } = require('../../domain/LogStorage const FunctionsRequest = require('../FunctionsRequest'); const Metric = require('../../domain/Metric'); const SchemaResponse = require('../SchemaResponse'); -const { FunctionExecutorFactory } = require('../../domain/FunctionExecutor'); +const { FunctionProviderFactory } = require('../../domain/FunctionProvider'); const router = new Router(); @@ -73,8 +73,7 @@ router.put('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), async } = req.params; const { code, - env, - projectId + env } = req.body; const filename = codeFileName(namespace, id); const sandbox = req.app.get('sandbox'); @@ -92,8 +91,7 @@ router.put('/:namespace/:id', bodyParser.json({ limit: bodyParserLimit }), async } const hash = crypto.createHash('sha1').update(code).digest('hex'); - const data = { id, code, hash, provider: functionProvider, projectId }; - + const data = { id, code, hash, provider: functionProvider }; if (env) { data.env = env; } @@ -232,16 +230,14 @@ router.all('/:namespace/:id/run', bodyParser.json({ limit: bodyParserLimit }), a try { - const executorId = await memoryStorage.getExecutor(namespace, id); + const providerId = await memoryStorage.getProvider(namespace, id); - factory = new FunctionExecutorFactory(); + const factory = new FunctionProviderFactory(); - const executor = factory.getFunctionExecutor(executorId); + const executor = factory.getFunctionProvider(providerId); const result = await executor.run(req); - console.log(result) - metric.observeFunctionSetup(); res.set(result.headers); From 2577d35408645db57043eceab9eae63f4b411589 Mon Sep 17 00:00:00 2001 From: Matheus Lemes Date: Fri, 24 Nov 2023 15:46:57 -0300 Subject: [PATCH 126/126] added gcf upload function --- lib/domain/GoogleFunctionProvider.js | 46 +++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/lib/domain/GoogleFunctionProvider.js b/lib/domain/GoogleFunctionProvider.js index 832f8d3..f595e89 100644 --- a/lib/domain/GoogleFunctionProvider.js +++ b/lib/domain/GoogleFunctionProvider.js @@ -1,6 +1,7 @@ const config = require("../support/config"); const fetch = require('node-fetch'); -const { GoogleAuth } = require("google-auth-library") +const { GoogleAuth } = require("google-auth-library"); +const { FunctionServiceClient } = require('@google-cloud/functions').v2; // const { request } = require('gaxios'); const log = require("../support/log"); @@ -78,6 +79,49 @@ class GoogleFunctionProvider { return response } + async deployFunction(){ + const projectId = "removed" + const zoneId = "us-central1" + const functionName = "backstage-kernel_hello-world" + const entryPoint = 'helloHttp'; + const runtime = 'nodejs20'; + + const keyFilePath = './backday.json'; + + const auth = new GoogleAuth({ + keyFile: keyFilePath, + }); + const client = new FunctionServiceClient({ auth }); + + const functionObject = { + "name": `projects/${projectId}/locations/${zoneId}/functions/${functionName}`, + "buildConfig": { + "entryPoint": entryPoint, + "runtime": runtime, + "source": { + "storageSource": { + "bucket": 'gcf-v2-sources-391036631868-us-central1', + "object": 'backstage-kernel_hello-world/function-source.zip', + "generation": '1700773129721671' + }, + "source": 'storageSource' + } + }, + "serviceConfig": { + "environmentVariables": { + "test": "test", + }, + }, + } + const request = { + "function": functionObject, + }; + + const [operation] = await client.updateFunction(request); + const [response] = await operation.promise(); + console.log(response); + return + } } module.exports = GoogleFunctionProvider;