diff --git a/.gitignore b/.gitignore
index 95a435c..e9d41ea 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,4 +15,6 @@ coverage/
.grunt
# Editor settings
-.vscode
\ No newline at end of file
+.vscode
+
+.DS_STORE
diff --git a/build/lib/index.js b/build/lib/index.js
index 256767f..c599950 100644
--- a/build/lib/index.js
+++ b/build/lib/index.js
@@ -1,17 +1,25 @@
"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
const State = require("./state");
const staticExpiryHelpers_1 = require("./util/staticExpiryHelpers");
const routeCreationHelpers_1 = require("./util/routeCreationHelpers");
const express = require("express");
const bodyParser = require("body-parser");
const path = require("path");
-const twilio_1 = require("twilio");
-require("./twilioAugments");
+const twilio = require("twilio");
+const VoiceResponse = twilio.twiml.VoiceResponse;
+const twilioWebhook = twilio.webhook;
function default_1(states, config) {
const app = express();
+ if (config.trustProxy) {
+ app.set('trust proxy', 1);
+ }
+ if (config.session) {
+ app.use(config.session);
+ }
app.use(bodyParser.urlencoded({ extended: false }));
const { validate = true } = config.twilio;
- app.use(twilio_1.webhook(config.twilio.authToken, { validate: validate }));
+ app.use(twilioWebhook(config.twilio.authToken, { validate: validate }));
let urlFingerprinter;
if (config.staticFiles) {
const staticFilesMountPath = config.staticFiles.mountPath || "";
@@ -37,7 +45,11 @@ function default_1(states, config) {
const holdMusicEndpoint = config.staticFiles.holdMusic.endpoint || "/hold-music";
const holdMusicEndpointMounted = path.normalize(staticFilesMountPath + '/' + holdMusicEndpoint);
const holdMusicTwimlFor = config.staticFiles.holdMusic.twimlFor ||
- ((urlFor) => (new twilio_1.TwimlResponse()).play({ loop: 1000 }, urlFor(path.normalize(staticFilesMountPath + '/' + holdMusicFileUri), { absolute: true })));
+ ((urlFor) => {
+ const response = new VoiceResponse();
+ response.play({ loop: 1000 }, urlFor(path.normalize(staticFilesMountPath + '/' + holdMusicFileUri), { absolute: true }));
+ return response.toString();
+ });
if (!holdMusicFileUri) {
throw new Error("You must provide a relative uri to your hold music file.");
}
@@ -80,10 +92,10 @@ function default_1(states, config) {
}
if (State.isNormalState(thisState)) {
app.post(thisState.processTransitionUri, function (req, res, next) {
- const nextStatePromise = Promise.resolve(thisState.transitionOut(req.body));
+ const nextStatePromise = Promise.resolve(thisState.transitionOut(req, req.body));
nextStatePromise
.then(nextState => {
- return routeCreationHelpers_1.renderState(nextState, req, urlFingerprinter, undefined);
+ return routeCreationHelpers_1.renderState(nextState, req, urlFingerprinter, req.body);
})
.then(twiml => { res.send(twiml); })
.catch(next);
@@ -92,5 +104,4 @@ function default_1(states, config) {
});
return app;
}
-Object.defineProperty(exports, "__esModule", { value: true });
exports.default = default_1;
diff --git a/build/lib/logger.js b/build/lib/logger.js
index ce20cd4..fdf2544 100644
--- a/build/lib/logger.js
+++ b/build/lib/logger.js
@@ -1,4 +1,5 @@
"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
const debug = require("debug");
const objectValuesEntries_1 = require("./util/objectValuesEntries");
const loggers = {
@@ -9,5 +10,4 @@ const loggers = {
objectValuesEntries_1.entries(loggers).forEach(([name, logger]) => {
logger.log = console[name].bind(console);
});
-Object.defineProperty(exports, "__esModule", { value: true });
exports.default = loggers;
diff --git a/build/lib/state.js b/build/lib/state.js
index d2b3cbe..48ba819 100644
--- a/build/lib/state.js
+++ b/build/lib/state.js
@@ -1,5 +1,5 @@
"use strict";
-require("./twilioAugments");
+Object.defineProperty(exports, "__esModule", { value: true });
function isRoutableState(it) {
return it && it.uri !== undefined;
}
diff --git a/build/lib/twilioAugments.js b/build/lib/twilioAugments.js
deleted file mode 100644
index c8cdfcc..0000000
--- a/build/lib/twilioAugments.js
+++ /dev/null
@@ -1,5 +0,0 @@
-"use strict";
-const twilio = require("twilio");
-twilio.isCallDataTwiml = function (it) {
- return it && it.CallSid !== undefined;
-};
diff --git a/build/lib/util/objectValuesEntries.js b/build/lib/util/objectValuesEntries.js
index 38230b7..c666174 100644
--- a/build/lib/util/objectValuesEntries.js
+++ b/build/lib/util/objectValuesEntries.js
@@ -1,4 +1,5 @@
"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
const reduce = Function.bind.call(Function.call, Array.prototype.reduce);
const isEnumerable = Function.bind.call(Function.call, Object.prototype.propertyIsEnumerable);
const concat = Function.bind.call(Function.call, Array.prototype.concat);
diff --git a/build/lib/util/routeCreationHelpers.js b/build/lib/util/routeCreationHelpers.js
index d7af629..65b50cb 100644
--- a/build/lib/util/routeCreationHelpers.js
+++ b/build/lib/util/routeCreationHelpers.js
@@ -1,14 +1,14 @@
"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
const logger_1 = require("../logger");
const state_1 = require("../state");
const staticExpiryHelpers_1 = require("./staticExpiryHelpers");
-require("../twilioAugments");
const url = require("url");
const state_2 = require("../state");
-function resolveBranches(state, inputData) {
+function resolveBranches(state, req, inputData) {
if (state_2.isBranchingState(state) && !state_2.isRenderableState(state)) {
- return Promise.resolve(state.transitionOut(inputData)).then(nextState => {
- return resolveBranches(nextState);
+ return Promise.resolve(state.transitionOut(req, inputData)).then(nextState => {
+ return resolveBranches(nextState, req);
});
}
return Promise.resolve(state);
@@ -16,17 +16,17 @@ function resolveBranches(state, inputData) {
exports.resolveBranches = resolveBranches;
function renderState(state, req, furl, inputData) {
const urlForBound = makeUrlFor(req.protocol, req.get('Host'), furl);
- const renderableStatePromise = resolveBranches(state, inputData);
+ const renderableStatePromise = resolveBranches(state, req, inputData);
const inputToRenderWith = state_2.isRenderableState(state) ? inputData : undefined;
const couldNotFindRenderableStateError = Symbol();
return renderableStatePromise.then(stateToRender => {
const stateName = state_1.stateToString(stateToRender);
if (state_2.isAsynchronousState(stateToRender)) {
logger_1.default.info("Began asynchronous processing for " + stateName);
- stateToRender.backgroundTrigger(urlForBound, inputToRenderWith);
+ stateToRender.backgroundTrigger(urlForBound, req, inputToRenderWith);
}
logger_1.default.info("Produced twiml for " + stateName);
- return stateToRender.twimlFor(urlForBound, inputToRenderWith);
+ return stateToRender.twimlFor(urlForBound, req, inputToRenderWith);
}, (e) => {
throw { type: couldNotFindRenderableStateError, origError: e };
}).catch((e) => {
@@ -42,7 +42,7 @@ function renderState(state, req, furl, inputData) {
}
exports.renderState = renderState;
function makeUrlFor(protocol, host, furl) {
- return (path, { query, absolute = false, fingerprint } = {}) => {
+ return (path, { query = {}, absolute = false, fingerprint } = {}) => {
if (fingerprint && query) {
throw new Error("Can't combine fingerprinting with query parameters.");
}
diff --git a/build/lib/util/staticExpiryHelpers.js b/build/lib/util/staticExpiryHelpers.js
index 24ad064..913a806 100644
--- a/build/lib/util/staticExpiryHelpers.js
+++ b/build/lib/util/staticExpiryHelpers.js
@@ -1,4 +1,5 @@
"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
const url = require("url");
const path = require("path");
const express = require("express");
diff --git a/build/test/fixtures/states.js b/build/test/fixtures/states.js
index ab5d573..0e5a1f8 100644
--- a/build/test/fixtures/states.js
+++ b/build/test/fixtures/states.js
@@ -1,6 +1,8 @@
"use strict";
-const twilio_1 = require("twilio");
-const emptyTwimlFn = () => new twilio_1.TwimlResponse();
+Object.defineProperty(exports, "__esModule", { value: true });
+const twilio = require("twilio");
+const VoiceResponse = twilio.twiml.VoiceResponse;
+const emptyTwimlFn = () => (new VoiceResponse()).toString();
exports.d = {
name: "d",
twimlFor: emptyTwimlFn
diff --git a/build/test/integration/errorHandlingSpec.js b/build/test/integration/errorHandlingSpec.js
index aab1b5b..f662a79 100644
--- a/build/test/integration/errorHandlingSpec.js
+++ b/build/test/integration/errorHandlingSpec.js
@@ -1,4 +1,5 @@
"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
const request = require("supertest");
const _1 = require("../../lib/");
describe("error handling (at component integration points)", () => {
diff --git a/build/test/integration/holdMusicEndpointSpec.js b/build/test/integration/holdMusicEndpointSpec.js
index 23e39c7..659b671 100644
--- a/build/test/integration/holdMusicEndpointSpec.js
+++ b/build/test/integration/holdMusicEndpointSpec.js
@@ -1,4 +1,5 @@
"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
const path = require("path");
const request = require("supertest");
const _1 = require("../../lib/");
diff --git a/build/test/integration/requestValidationSpec.js b/build/test/integration/requestValidationSpec.js
index c82c2db..3e1f168 100644
--- a/build/test/integration/requestValidationSpec.js
+++ b/build/test/integration/requestValidationSpec.js
@@ -1,5 +1,7 @@
"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
const crypto = require("crypto");
+const R = require("ramda");
const request = require("supertest");
const _1 = require("../../lib/");
const states = [{
@@ -25,7 +27,7 @@ describe("request signing", () => {
const agent = request.agent(app);
it("should allow signed requests", () => {
const test = agent.post("/");
- const testSig = makeDummySignature(fakeToken, test.url, fakeBody);
+ const testSig = makeSignature(fakeToken, test.url, fakeBody);
return test
.type('form')
.send(fakeBody)
@@ -37,13 +39,20 @@ describe("request signing", () => {
.post("/")
.expect(403);
});
+ it('should reject requests with an invalid signature', () => {
+ const test = agent.post("/");
+ const invalidSig = makeInvalidSignature(fakeToken, test.url, fakeBody);
+ return test
+ .set('X-Twilio-Signature', invalidSig)
+ .expect(403);
+ });
});
describe("validate: false", () => {
const app = _1.default(states, { twilio: { authToken: fakeToken, validate: false } });
const agent = request.agent(app);
it("should allow all requests", () => {
const test = agent.post("/");
- const testSig = makeDummySignature(fakeToken, test.url, fakeBody);
+ const testSig = makeSignature(fakeToken, test.url, fakeBody);
const unsignedRequestAllowed = agent
.post("/")
.expect(200);
@@ -56,10 +65,11 @@ describe("request signing", () => {
});
});
});
-function makeDummySignature(authToken, url, body) {
+function makeSignature(authToken, url, body) {
const finalUrl = Object.keys(body).sort().reduce((prev, key) => {
return prev + key + body[key];
}, url);
return crypto.createHmac('sha1', authToken)
.update(new Buffer(finalUrl, 'utf-8')).digest('base64');
}
+const makeInvalidSignature = R.pipe(makeSignature, R.split(''), R.map((c) => String.fromCharCode(c.charCodeAt(0) + 1)), R.join(''));
diff --git a/build/test/integration/stateRoutingSpec.js b/build/test/integration/stateRoutingSpec.js
index 0727bce..eb6bca9 100644
--- a/build/test/integration/stateRoutingSpec.js
+++ b/build/test/integration/stateRoutingSpec.js
@@ -1,9 +1,9 @@
"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
const sinon = require("sinon");
const sinonChai = require("sinon-chai");
const chai_1 = require("chai");
const request = require("supertest");
-require("../../lib/twilioAugments");
const _1 = require("../../lib/");
const objectValuesEntries_1 = require("../../lib/util/objectValuesEntries");
chai_1.use(sinonChai);
@@ -11,7 +11,7 @@ const states = {
routableBranching: {
name: "CALL_RECEIVED_BRANCH",
uri: "/routable-branching",
- transitionOut: ((input) => {
+ transitionOut: ((req, input) => {
return input && input.CallerZip === "00000" ?
states.nonRoutableBranching :
states.routableEnd;
@@ -21,10 +21,10 @@ const states = {
name: "CALL_RECEIVED_RENDER",
uri: "/routable-normal",
processTransitionUri: "/process-renderable-entry",
- twimlFor(urlFor, input) {
+ twimlFor(urlFor, req, input) {
return "input to routableNormal was: " + JSON.stringify(input);
},
- transitionOut(input) {
+ transitionOut(req, input) {
return Promise.resolve(states.nonRoutableNormal);
}
},
@@ -32,37 +32,37 @@ const states = {
name: "CALL_RECEIVED_END",
uri: "/routable-end",
isEndState: true,
- twimlFor(urlFor, input) {
+ twimlFor(urlFor, req, input) {
return "Sorry, no one home. Bye.";
}
},
routableAsync: {
name: "CALL_RECEIVED_ASYNC",
uri: "/routable-async",
- twimlFor(urlFor, input) {
+ twimlFor(urlFor, req, input) {
return "We're doing something...";
},
backgroundTrigger() { return "do some effect..."; }
},
nonRoutableBranching: {
name: "INNER_BRANCH",
- transitionOut: ((input) => {
+ transitionOut: ((req, input) => {
return states.nonRoutableNormal;
})
},
nonRoutableBranching2: {
name: "INNER_BRANCH_2",
- transitionOut: ((input) => {
+ transitionOut: ((req, input) => {
return Promise.resolve(states.routableAsync);
})
},
nonRoutableNormal: {
name: "INNER_RENDER",
processTransitionUri: "/process-inner-renderable",
- twimlFor(urlFor, input) {
+ twimlFor(urlFor, req, input) {
return "input to nonRoutableNormal was: " + JSON.stringify(input);
},
- transitionOut(input) {
+ transitionOut(req, input) {
return Promise.resolve(states.nonRoutableBranching2);
}
}
@@ -99,9 +99,9 @@ describe("state routing & rendering", () => {
.send({ CallerZip: "00000" })
.then(() => {
chai_1.expect(states.routableBranching.transitionOut)
- .calledWithExactly({ CallerZip: "00000" });
+ .calledWithExactly(sinon.match.any, { CallerZip: "00000" });
chai_1.expect(states.nonRoutableBranching.transitionOut)
- .calledWithExactly(undefined);
+ .calledWithExactly(sinon.match.any, undefined);
});
});
it("should not pass input to the ultimate twimlFor", () => {
@@ -111,7 +111,7 @@ describe("state routing & rendering", () => {
.send({ CallerZip: "00000" })
.then(() => {
chai_1.expect(states.nonRoutableNormal.twimlFor)
- .calledWithExactly(sinon.match.func, undefined);
+ .calledWithExactly(sinon.match.func, sinon.match.any, undefined);
});
});
it("should not matter if the first renderable state is also routable or an end state", () => {
@@ -122,9 +122,9 @@ describe("state routing & rendering", () => {
.expect("Sorry, no one home. Bye.")
.then(() => {
chai_1.expect(states.routableBranching.transitionOut)
- .calledWithExactly({ CallerZip: "" });
+ .calledWithExactly(sinon.match.any, { CallerZip: "" });
chai_1.expect(states.routableEnd.twimlFor)
- .calledWithExactly(sinon.match.func, undefined);
+ .calledWithExactly(sinon.match.func, sinon.match.any, undefined);
});
});
});
@@ -167,7 +167,7 @@ describe("state routing & rendering", () => {
chai_1.expect(states.routableAsync.backgroundTrigger)
.calledBefore(states.routableAsync.twimlFor);
chai_1.expect(states.routableAsync.backgroundTrigger)
- .calledWithExactly(sinon.match.func, { "Test": "true" });
+ .calledWithExactly(sinon.match.func, sinon.match.any, { "Test": "true" });
});
});
});
@@ -194,17 +194,7 @@ describe("state routing & rendering", () => {
.send(dummyData)
.then(() => {
chai_1.expect(states.routableNormal.transitionOut)
- .calledWithExactly(dummyData);
- });
- });
- it("should find the next renderable state, branching without passing along input", () => {
- return requestApp
- .post(states.nonRoutableNormal.processTransitionUri)
- .type("form")
- .send(dummyData)
- .then(() => {
- chai_1.expect(states.nonRoutableBranching2.transitionOut)
- .calledWithExactly(undefined);
+ .calledWithExactly(sinon.match.any, dummyData);
});
});
it("should not call transitionOut if the next state's already renderable", () => {
@@ -216,24 +206,6 @@ describe("state routing & rendering", () => {
chai_1.expect(states.nonRoutableNormal.transitionOut).to.not.have.been.called;
});
});
- it("should render the next state, with no input provided, calling bgTrigger if relevant", () => {
- return Promise.all([
- requestApp
- .post(states.routableNormal.processTransitionUri)
- .type("form")
- .send(dummyData)
- .expect("input to nonRoutableNormal was: undefined"),
- requestApp
- .post(states.nonRoutableNormal.processTransitionUri)
- .type("form")
- .send(dummyData)
- .expect("We're doing something...")
- .then(() => {
- chai_1.expect(states.routableAsync.twimlFor)
- .calledWithExactly(sinon.match.func, undefined);
- })
- ]);
- });
});
});
function spyOn(toSpyOn) {
@@ -246,9 +218,9 @@ function spyOn(toSpyOn) {
});
});
}
-function unSpyOn(toSpyOn) {
+function unSpyOn(toUnSpyOn) {
const methods = ["transitionOut", "backgroundTrigger", "twimlFor"];
- toSpyOn.forEach(it => {
+ toUnSpyOn.forEach(it => {
methods.forEach(method => {
if (it[method]) {
it[method].restore();
diff --git a/build/test/integration/staticFilesSpec.js b/build/test/integration/staticFilesSpec.js
index fda98d4..03cf917 100644
--- a/build/test/integration/staticFilesSpec.js
+++ b/build/test/integration/staticFilesSpec.js
@@ -1,4 +1,5 @@
"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
const express = require("express");
const fs = require("fs");
const path = require("path");
diff --git a/build/test/integration/understandsTwimlResponseSpec.js b/build/test/integration/understandsTwimlResponseSpec.js
index ce1dd61..7306061 100644
--- a/build/test/integration/understandsTwimlResponseSpec.js
+++ b/build/test/integration/understandsTwimlResponseSpec.js
@@ -1,12 +1,14 @@
"use strict";
-const twilio = require("twilio");
+Object.defineProperty(exports, "__esModule", { value: true });
const request = require("supertest");
+const twilio = require("twilio");
+const VoiceResponse = twilio.twiml.VoiceResponse;
const _1 = require("../../lib/");
const states = [{
uri: "/returns-twiml-response",
name: "DUMMY",
isEndState: true,
- twimlFor() { return new twilio.TwimlResponse(); }
+ twimlFor() { return (new VoiceResponse()).toString(); }
}, {
uri: "/returns-twiml-string",
name: "DUMMY",
diff --git a/build/test/unit/indexSpec.js b/build/test/unit/indexSpec.js
index 58f0970..e7cba9c 100644
--- a/build/test/unit/indexSpec.js
+++ b/build/test/unit/indexSpec.js
@@ -1,4 +1,5 @@
"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
const chai = require("chai");
const express = require("express");
const index_1 = require("../../lib/index");
@@ -6,13 +7,13 @@ const states = require("../fixtures/states");
const { expect } = chai;
describe("main express app creation function", () => {
it("should return an express app", () => {
- const result = index_1.default([], { twilio: { authToken: "" } });
+ const result = index_1.default([], { twilio: { authToken: '' } });
expect(isExpressApp(result)).to.be.true;
});
it("should error at creation time when given a state with an invalid shape", () => {
const statesWithInvalidState = states.normalStates.concat(states.invalidStates[0]);
const makeApp = () => {
- return index_1.default(statesWithInvalidState, { twilio: { authToken: "" } });
+ return index_1.default(statesWithInvalidState, { twilio: { authToken: '' } });
};
expect(makeApp).to.throw(/Invalid state/);
});
diff --git a/build/test/unit/stateSpec.js b/build/test/unit/stateSpec.js
index e5db10c..ec0fe50 100644
--- a/build/test/unit/stateSpec.js
+++ b/build/test/unit/stateSpec.js
@@ -1,4 +1,5 @@
"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
const chai = require("chai");
const sut = require("../../lib/state");
const states = require("../fixtures/states");
diff --git a/build/test/unit/util/routeCreationHelpersSpec.js b/build/test/unit/util/routeCreationHelpersSpec.js
index f190629..5fff08b 100644
--- a/build/test/unit/util/routeCreationHelpersSpec.js
+++ b/build/test/unit/util/routeCreationHelpersSpec.js
@@ -1,4 +1,5 @@
"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
const sinon = require("sinon");
const sinonChai = require("sinon-chai");
const chai_1 = require("chai");
@@ -10,7 +11,7 @@ describe("route creation utilities", () => {
describe("resolveBranches", () => {
describe("handling renderable input states", () => {
it("should return a promise for the input state", () => {
- const results = states.renderableStates.map(state => [state, sut.resolveBranches(state, {})]);
+ const results = states.renderableStates.map(state => [state, sut.resolveBranches(state, {}, {})]);
const assertions = results.map(([state, resultPromise]) => {
return resultPromise.then((resolvedState) => {
chai_1.expect(state).to.equal(resolvedState);
@@ -41,18 +42,18 @@ describe("route creation utilities", () => {
[g, h, i].forEach(it => { it.transitionOut.restore(); });
});
it("should pass any input data to the first non-renderable state, but not subsequent ones", () => {
- return sut.resolveBranches(i, {}).then(state => {
- chai_1.expect(i.transitionOut).calledWithExactly({});
- chai_1.expect(h.transitionOut).calledWithExactly(undefined);
+ return sut.resolveBranches(i, {}, {}).then(state => {
+ chai_1.expect(i.transitionOut).calledWithExactly(sinon.match.any, {});
+ chai_1.expect(h.transitionOut).calledWithExactly(sinon.match.any, undefined);
});
});
it("should finally return a promise for the first renderable state", () => {
- return sut.resolveBranches(i, {}).then(state => {
+ return sut.resolveBranches(i, {}, {}).then(state => {
chai_1.expect(state.name).to.equal("g");
});
});
it("should not call transition out on the renderable state, once found", () => {
- return sut.resolveBranches(i, {}).then(state => {
+ return sut.resolveBranches(i, {}, {}).then(state => {
chai_1.expect(g.transitionOut).to.not.have.been.called;
});
});
diff --git a/build/test/util/index.js b/build/test/util/index.js
index 9cf412d..125eef8 100644
--- a/build/test/util/index.js
+++ b/build/test/util/index.js
@@ -1,4 +1,5 @@
"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
function filesConfig(obj) {
return {
twilio: { authToken: "", validate: false },
diff --git a/lib/index.d.ts b/lib/index.d.ts
index 464c90a..7ec6135 100644
--- a/lib/index.d.ts
+++ b/lib/index.d.ts
@@ -1,10 +1,11 @@
///
-///
-import { Express, Handler } from "express";
-import { TwimlResponse } from "twilio";
-
+import { Express, Handler, RequestHandler, Request as ExpressRequest } from "express";
export default function (states: UsableState[], config: config): Express;
+export interface Request extends ExpressRequest {
+ session?: any;
+}
+
export type config = {
twilio: {
authToken: string;
@@ -18,9 +19,11 @@ export type config = {
holdMusic?: {
fileRelativeUri: string;
endpoint?: string;
- twimlFor?: (urlFor: urlFor) => TwimlResponse | string;
+ twimlFor?: (urlFor: urlFor) => string;
};
};
+ session?: RequestHandler;
+ trustProxy?: boolean;
};
export type fingerprintUrl = (path: string) => string;
@@ -43,11 +46,11 @@ export interface RoutableState extends AbstractState {
}
export interface BranchingState extends AbstractState {
- transitionOut(inputData?: CallDataTwiml): Promise | UsableState;
+ transitionOut(req: Request, inputData?: any): Promise | UsableState;
}
export interface RenderableState extends AbstractState {
- twimlFor(urlFor: urlFor, inputData?: CallDataTwiml): TwimlResponse | string;
+ twimlFor(urlFor: urlFor, req: Request, inputData?: any): string;
}
export interface EndState extends RenderableState {
@@ -55,73 +58,9 @@ export interface EndState extends RenderableState {
}
export interface AsynchronousState extends RenderableState {
- backgroundTrigger(urlFor: urlFor, inputData?: CallDataTwiml): void;
+ backgroundTrigger(urlFor: urlFor, req: Request, inputData?: any): void;
}
export interface NormalState extends BranchingState, RenderableState {
processTransitionUri: string;
}
-
-type CallDirection = "inbound" | "outbound-api" | "outbound-dial" | "trunking-terminating" | "trunking-originating";
-type CallStatus = "queued" | "ringing" | "in-progress" | "busy" | "failed" | "canceled" | "no-answer" | "completed";
-
-export interface CallDataTwiml {
- CallSid: string;
- Direction: CallDirection;
- CallStatus: CallStatus;
- AccountSid: string;
- ForwardedFrom?: string;
- CallerName?: string;
- To: string;
- ToCountry?: string;
- ToState?: string;
- ToCity?: string;
- ToZip?: string;
- From: string;
- FromCountry?: string;
- FromState?: string;
- FromCity?: string;
- FromZip?: string;
- Called: string;
- CalledCountry: string;
- CalledState: string;
- CalledCity: string;
- CalledZip: string;
- Caller: string;
- CallerCountry: string;
- CallerState: string;
- CallerCity: string;
- CallerZip: string;
- ApiVersion: '2010-04-01';
-}
-
-export interface GatherDataTwiml extends CallDataTwiml {
- msg: "Gather End";
- Digits: string;
-}
-
-export interface CallDataAPI {
- dateCreated: string | null;
- dateUpdated: string | null;
- startTime: string | null;
- endTime: string | null;
- duration: string | null;
- parentCallSid: string | null;
- toFormatted: string;
- fromFormatted: string;
- price: string | null;
- priceUnit: string;
- phoneNumberSid: string;
- answeredBy: string | null;
- forwardedFrom: string | null;
- groupSid: string | null;
- callerName: string | null;
- uri: string;
- sid: string;
- direction: CallDirection;
- status: CallStatus;
- accountSid: string;
- to: string;
- from: string;
- apiVersion: string;
-}
diff --git a/lib/index.ts b/lib/index.ts
index 58a41f1..e1eb58d 100644
--- a/lib/index.ts
+++ b/lib/index.ts
@@ -2,19 +2,23 @@ import * as State from "./state";
import { makeServingMiddlewareAndFurl, getFingerprintForFile } from "./util/staticExpiryHelpers";
import { renderState, makeUrlFor, fingerprintUrl } from "./util/routeCreationHelpers";
-import { Express, Handler } from "express";
+import { Express, Handler, RequestHandler } from "express";
import express = require("express");
import bodyParser = require("body-parser");
import path = require("path");
-import { webhook as twilioWebhook, TwimlResponse } from "twilio";
-import "./twilioAugments";
+import twilio = require('twilio')
+const VoiceResponse = twilio.twiml.VoiceResponse;
+const twilioWebhook = twilio.webhook
export default function(states: State.UsableState[], config: config): Express {
// Set up express
const app = express();
+ if (config.trustProxy) { app.set('trust proxy', 1) }
+ if (config.session) { app.use(config.session) }
+
// Parse twilio POST payloads, which come as urlencoded strings...
// TODO: handle pre-parsed bodies
app.use(bodyParser.urlencoded({ extended: false }));
@@ -75,10 +79,11 @@ export default function(states: State.UsableState[], config: config): Express {
const holdMusicEndpointMounted = path.normalize(staticFilesMountPath + '/' + holdMusicEndpoint);
const holdMusicTwimlFor = config.staticFiles.holdMusic.twimlFor ||
- ((urlFor: State.urlFor) =>
- (new TwimlResponse()).play({ loop: 1000 }, urlFor(
- path.normalize(staticFilesMountPath + '/' + holdMusicFileUri), { absolute: true }
- )));
+ ((urlFor: State.urlFor) => {
+ const response = new VoiceResponse()
+ response.play({ loop: 1000 }, urlFor(path.normalize(staticFilesMountPath + '/' + holdMusicFileUri), { absolute: true }))
+ return response.toString()
+ })
if(!holdMusicFileUri) {
throw new Error("You must provide a relative uri to your hold music file.");
@@ -163,13 +168,15 @@ export default function(states: State.UsableState[], config: config): Express {
if (State.isNormalState(thisState)) {
app.post(thisState.processTransitionUri, function (req, res, next) {
// Use the input to transition to the next state.
- const nextStatePromise = Promise.resolve(thisState.transitionOut(req.body));
+ const nextStatePromise = Promise.resolve(thisState.transitionOut(req, req.body));
// Then, do what we do for renderable states, except don't pass
// req.body anywhere, as we've already used that input to transition out.
nextStatePromise
.then(nextState => {
- return renderState(nextState, req, urlFingerprinter, undefined);
+ // NOTE: (EL) current hotline code relies on req.body being passed through,
+ // so i'm going to do that for now
+ return renderState(nextState, req, urlFingerprinter, req.body);
})
.then(twiml => { res.send(twiml); })
.catch(next);
@@ -201,7 +208,8 @@ type StaticFilesConfig =
readonly holdMusic?: {
readonly fileRelativeUri: string;
readonly endpoint?: string;
- readonly twimlFor?: (urlFor: State.urlFor) => TwimlResponse | string;
+ // TODO: look
+ readonly twimlFor?: (urlFor: State.urlFor) => string;
}
};
@@ -211,4 +219,6 @@ export type config = {
readonly validate?: boolean;
};
readonly staticFiles?: StaticFilesConfig;
+ session?: RequestHandler;
+ readonly trustProxy?: boolean;
}
diff --git a/lib/state.ts b/lib/state.ts
index c2482e4..1d960b9 100644
--- a/lib/state.ts
+++ b/lib/state.ts
@@ -1,5 +1,4 @@
-import { TwimlResponse, CallDataTwiml } from "twilio";
-import "./twilioAugments";
+import { Request } from "express";
import { urlFor } from "./util/routeCreationHelpers";
// A RoutableState that's not also either a BranchingState, or a RenderableState
@@ -24,11 +23,11 @@ export interface BranchingState extends AbstractState {
// Take an immutable session data and some input; return a promise for the
// modified session data (if being at this state told us something about the
// call we want to store) and the next state to go to.
- transitionOut(inputData?: CallDataTwiml): Promise|UsableState;
+ transitionOut(req: Request, inputData?: any): Promise|UsableState;
}
export interface RenderableState extends AbstractState {
- twimlFor(urlFor: urlFor, inputData?: CallDataTwiml): TwimlResponse | string;
+ twimlFor(urlFor: urlFor, req: Request, inputData?: any): string;
}
export interface EndState extends RenderableState {
@@ -36,7 +35,7 @@ export interface EndState extends RenderableState {
}
export interface AsynchronousState extends RenderableState {
- backgroundTrigger(urlFor: urlFor, inputData?: CallDataTwiml): void;
+ backgroundTrigger(urlFor: urlFor, req: Request, inputData?: any): void;
}
export interface NormalState extends BranchingState, RenderableState {
diff --git a/lib/twilioAugments.ts b/lib/twilioAugments.ts
deleted file mode 100644
index 1d77355..0000000
--- a/lib/twilioAugments.ts
+++ /dev/null
@@ -1,123 +0,0 @@
-import twilio = require("twilio");
-
-declare module "twilio" {
- type CallDirection =
- "inbound" | "outbound-api" | "outbound-dial" | "trunking-terminating" | "trunking-originating";
-
- type CallStatus =
- "queued" | "ringing" | "in-progress" | "busy" | "failed" | "canceled" | "no-answer" | "completed";
-
- // Documented at https://www.twilio.com/docs/api/twiml/twilio_request#synchronous
- export interface CallDataTwiml {
- CallSid: string;
- Direction: CallDirection;
- CallStatus: CallStatus;
- AccountSid: string;
- ForwardedFrom?: string;
- CallerName?: string;
-
- // "To" is the phone number, SIP address or Client identifier
- // that received this call.
- To: string;
- ToCountry?: string;
- ToState?: string;
- ToCity?: string;
- ToZip?: string;
-
- // The opposite of To.
- From: string;
- FromCountry?: string;
- FromState?: string;
- FromCity?: string;
- FromZip?: string;
-
- // Called and Caller appear to be aliases for To and From respectively.
- Called: string;
- CalledCountry: string;
- CalledState: string;
- CalledCity: string;
- CalledZip: string;
- Caller: string;
- CallerCountry: string;
- CallerState: string;
- CallerCity: string;
- CallerZip: string;
-
- ApiVersion: '2010-04-01';
- }
-
- /**
- * Tests wheter a value matches the CallDataTwiml type. Normally, we should know
- * whether twilio's going to give us that type back, so this is just defensive.
- *
- * @param {any} it A value (usually a parsed request body) to test
- * @return {boolean} Whether the object matches CallDataTwiml
- */
- export function isCallDataTwiml(it: any): it is CallDataTwiml;
-
- export interface GatherDataTwiml extends CallDataTwiml {
- msg: "Gather End";
- Digits: string;
- }
-
- export interface CallDataAPI {
- // This has some of the same fields that come in a twiml response
- // (but not all), and the capitalization of the shared fields is different.
- // It also has some extra fields.
-
- // Properties *NOT* on CallDataTwiml
- dateCreated: string | null;
- dateUpdated: string | null;
-
- startTime: string | null;
- endTime: string | null;
- duration: string | null;
-
- parentCallSid: string | null;
-
- toFormatted: string;
- fromFormatted: string;
-
- price: string | null;
- priceUnit: string;
-
- phoneNumberSid: string;
- answeredBy: string | null;
- forwardedFrom: string | null;
- groupSid: string | null;
- callerName: string | null;
-
- uri: string;
-
- // Other Properties
- sid: string;
- direction: CallDirection;
- status: CallStatus;
- accountSid: string;
-
- to: string;
-
- from: string;
-
- apiVersion: string;
- }
-
- export interface ConferenceDataAPI {
- sid: string;
- friendlyName: string;
- accountSid: string;
- dateCreated: string;
- apiVersion: string;
- dateUpdated: string;
- region: string;
- uri: string;
- subresourceUris: {
- participants: string;
- };
- }
-}
-
-// See comment attached to type definition above.
-twilio.isCallDataTwiml = function(it: any): it is twilio.CallDataTwiml {
- return it && it.CallSid !== undefined;
-}
diff --git a/lib/util/routeCreationHelpers.ts b/lib/util/routeCreationHelpers.ts
index 52eae86..605240d 100644
--- a/lib/util/routeCreationHelpers.ts
+++ b/lib/util/routeCreationHelpers.ts
@@ -1,9 +1,7 @@
import logger from "../logger";
import * as express from "express";
-import { CallDataTwiml } from "twilio";
import { stateToString } from "../state";
import { UrlToFingerprintNotUnderMountPathError } from "./staticExpiryHelpers";
-import "../twilioAugments";
import url = require("url");
import {
@@ -22,19 +20,17 @@ import {
*
* @param {UsableState} state The initial state, which may or may
* not be renderable.
- * @param {CallDataTwiml} inputData Any user input taht should be passed to
+ * @param {express.Request} req The express request
+ * @param {any} inputData Any user input taht should be passed to
* the initial state, and the initial state only, if it's not renderable.
* @return {Promise} The final renderable state.
*/
-export function resolveBranches(state: UsableState,
- inputData?: CallDataTwiml): Promise {
-
+export function resolveBranches(state: UsableState, req: express.Request, inputData?: any): Promise {
if (isBranchingState(state) && !isRenderableState(state)) {
- return Promise.resolve(state.transitionOut(inputData)).then(nextState => {
- return resolveBranches(nextState);
+ return Promise.resolve(state.transitionOut(req, inputData)).then(nextState => {
+ return resolveBranches(nextState, req);
});
}
-
return Promise.resolve(state);
}
@@ -56,22 +52,22 @@ export function resolveBranches(state: UsableState,
* @param {express.Request} req The express request
* @param {fingerprintUrl|undefined} furl A function to generate fingerprinted
* uris for static files.
- * @param {CallDataTwiml|undefined} inputData Data we should pass to the first
+ * @param {any|undefined} inputData Data we should pass to the first
* state that we encounter on our way to rendering the final state. Note: if
* the state passed in as `state` wasn't requested directly (see above comment),
* then the user input will have already been used to transition out, and
* inputData should be undefined.
- * @return {TwimlResponse|string} The rendered next state.
+ * @return {string} The rendered next state.
*/
export function renderState(state: UsableState, req: express.Request,
- furl: fingerprintUrl | undefined, inputData: CallDataTwiml | undefined) {
+ furl: fingerprintUrl | undefined, inputData: any | undefined) {
// A utility function to help our states generate urls.
const urlForBound = makeUrlFor(req.protocol, req.get('Host'), furl);
// If this state is non-renderable, follow the branches until we get
// to a renderable state.
- const renderableStatePromise = resolveBranches(state, inputData);
+ const renderableStatePromise = resolveBranches(state, req, inputData);
// Below, if our stateToRender was arrived at through a branch, then the
@@ -91,11 +87,11 @@ export function renderState(state: UsableState, req: express.Request,
const stateName = stateToString(stateToRender);
if (isAsynchronousState(stateToRender)) {
logger.info("Began asynchronous processing for " + stateName);
- stateToRender.backgroundTrigger(urlForBound, inputToRenderWith);
+ stateToRender.backgroundTrigger(urlForBound, req, inputToRenderWith);
}
logger.info("Produced twiml for " + stateName);
- return stateToRender.twimlFor(urlForBound, inputToRenderWith);
+ return stateToRender.twimlFor(urlForBound, req, inputToRenderWith);
}, (e: Error) => {
// Here, we got an error while finding the next state to render (because
// renderableStatePromise rejected) and we want to re-throw it, because we
@@ -136,7 +132,7 @@ export type UrlForOptions = { query?: any, fingerprint?: boolean, absolute?: boo
* @return {urlFor} A final function, with options, for fingerpinting a root-relative url.
*/
export function makeUrlFor(protocol: string, host: string, furl?: fingerprintUrl): urlFor {
- return (path: string, { query, absolute = false, fingerprint }: UrlForOptions = {}) => {
+ return (path: string, { query = {}, absolute = false, fingerprint }: UrlForOptions = {}) => {
// Static files are the only ones that can be fingerprinted, and they
// shouldn't have query parameters. Enforcing this simplies the logic below.
if(fingerprint && query) {
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..801b594
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,4386 @@
+{
+ "name": "twilio-interactive-flow",
+ "version": "0.8.1",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@types/body-parser": {
+ "version": "1.16.3",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.16.3.tgz",
+ "integrity": "sha1-vCuaGB8vqFyA8eys2KBc8UFLhaM=",
+ "requires": {
+ "@types/express": "*",
+ "@types/node": "*"
+ }
+ },
+ "@types/chai": {
+ "version": "3.4.35",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-3.4.35.tgz",
+ "integrity": "sha1-6NZfg0ktKUT4FvxiB0GCHCioyQA=",
+ "dev": true
+ },
+ "@types/chai-as-promised": {
+ "version": "0.0.30",
+ "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-0.0.30.tgz",
+ "integrity": "sha1-I0EyHMeWxsNUSpSaBj52CaIi8wM=",
+ "dev": true,
+ "requires": {
+ "@types/chai": "*"
+ }
+ },
+ "@types/connect": {
+ "version": "3.4.32",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.32.tgz",
+ "integrity": "sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg==",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/debug": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-0.0.29.tgz",
+ "integrity": "sha1-oeUUrfvZLwOiJLpU1pMRHb8fN1Q="
+ },
+ "@types/express": {
+ "version": "4.0.35",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.0.35.tgz",
+ "integrity": "sha1-YmfHtgpR+sRzRns8SgLNHkQYBf4=",
+ "requires": {
+ "@types/express-serve-static-core": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "@types/express-serve-static-core": {
+ "version": "4.0.44",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.0.44.tgz",
+ "integrity": "sha1-ocO9XYDpPHL7qRoD9UEsR/IdSuc=",
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/mime": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-0.0.29.tgz",
+ "integrity": "sha1-+8/TMFc7kS71nu7hRgK/rOYwdUs="
+ },
+ "@types/mocha": {
+ "version": "2.2.40",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.40.tgz",
+ "integrity": "sha1-mBHdgA7OVEzYS1uFmRe/WEoVDEw=",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "6.0.59",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.59.tgz",
+ "integrity": "sha1-t/2PMUTER8gpqOq4gFw6Uj6eW0Q="
+ },
+ "@types/ramda": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/@types/ramda/-/ramda-0.0.5.tgz",
+ "integrity": "sha1-izgeM2PenbPLidO2LyO3PPtWvAs="
+ },
+ "@types/serve-static": {
+ "version": "1.7.31",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.7.31.tgz",
+ "integrity": "sha1-FUVt6NmNa0z/Mb5savdJKuY/Uho=",
+ "requires": {
+ "@types/express-serve-static-core": "*",
+ "@types/mime": "*"
+ }
+ },
+ "@types/sinon": {
+ "version": "1.16.36",
+ "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-1.16.36.tgz",
+ "integrity": "sha1-dLtu15KFl8Gz+xsAkAXpTcbq41c=",
+ "dev": true
+ },
+ "@types/sinon-chai": {
+ "version": "2.7.27",
+ "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-2.7.27.tgz",
+ "integrity": "sha1-63cpBY3fJTppeeVZuytJEISWmqE=",
+ "dev": true,
+ "requires": {
+ "@types/chai": "*",
+ "@types/sinon": "*"
+ }
+ },
+ "@types/superagent": {
+ "version": "2.0.36",
+ "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-2.0.36.tgz",
+ "integrity": "sha1-6O7BB3HZ28D37Ee4+Zk0duSlAcE=",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "@types/supertest": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-2.0.0.tgz",
+ "integrity": "sha1-Rofer/SVC2PkYRU21v1EZl7hG7c=",
+ "dev": true,
+ "requires": {
+ "@types/superagent": "*"
+ }
+ },
+ "accepts": {
+ "version": "1.3.7",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
+ "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
+ "requires": {
+ "mime-types": "~2.1.24",
+ "negotiator": "0.6.2"
+ },
+ "dependencies": {
+ "mime-db": {
+ "version": "1.40.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
+ "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
+ },
+ "mime-types": {
+ "version": "2.1.24",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
+ "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
+ "requires": {
+ "mime-db": "1.40.0"
+ }
+ }
+ }
+ },
+ "ajv": {
+ "version": "6.10.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.1.tgz",
+ "integrity": "sha512-w1YQaVGNC6t2UCPjEawK/vo/dG8OOrVtUmhBT1uJJYxbl5kU2Tj3v6LGqBcsysN1yhuCStJCCA3GqdvKY8sqXQ==",
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-align": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-1.1.0.tgz",
+ "integrity": "sha1-LwwWWIKXOa3V67FeawxuNCPwFro=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ }
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "argparse": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
+ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
+ "dev": true,
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "dev": true
+ },
+ "asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
+ },
+ "asn1": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
+ "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y="
+ },
+ "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
+ },
+ "assertion-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz",
+ "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=",
+ "dev": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
+ },
+ "aws-sign2": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz",
+ "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz",
+ "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz",
+ "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=",
+ "dev": true,
+ "requires": {
+ "chalk": "^1.1.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.0"
+ }
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz",
+ "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=",
+ "optional": true,
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "body-parser": {
+ "version": "1.19.0",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
+ "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
+ "requires": {
+ "bytes": "3.1.0",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "on-finished": "~2.3.0",
+ "qs": "6.7.0",
+ "raw-body": "2.4.0",
+ "type-is": "~1.6.17"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
+ }
+ }
+ },
+ "boom": {
+ "version": "2.10.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
+ "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.x.x"
+ }
+ },
+ "boxen": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.0.0.tgz",
+ "integrity": "sha1-smlLrx9gX3CP8Bd8Ehk7IvKaqqs=",
+ "dev": true,
+ "requires": {
+ "ansi-align": "^1.1.0",
+ "camelcase": "^4.0.0",
+ "chalk": "^1.1.1",
+ "cli-boxes": "^1.0.0",
+ "string-width": "^2.0.0",
+ "term-size": "^0.1.0",
+ "widest-line": "^1.0.0"
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ },
+ "dependencies": {
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ }
+ }
+ },
+ "browser-stdout": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
+ "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": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk="
+ },
+ "bytes": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
+ "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
+ },
+ "camelcase": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
+ "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
+ "dev": true
+ },
+ "capture-stack-trace": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz",
+ "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+ "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+ "dev": true
+ },
+ "chai": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-3.5.0.tgz",
+ "integrity": "sha1-TQJjewZ/6Vi9v906QOxW/vc3Mkc=",
+ "dev": true,
+ "requires": {
+ "assertion-error": "^1.0.1",
+ "deep-eql": "^0.1.3",
+ "type-detect": "^1.0.0"
+ }
+ },
+ "chai-as-promised": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-6.0.0.tgz",
+ "integrity": "sha1-GgKkM6byTa+sY7nJb6FoTbGqjaY=",
+ "dev": true,
+ "requires": {
+ "check-error": "^1.0.2"
+ }
+ },
+ "chainsaw": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.0.9.tgz",
+ "integrity": "sha1-EaBRAtHEx4W20EFdM21aOhYSkT4=",
+ "requires": {
+ "traverse": ">=0.3.0 <0.4"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "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"
+ }
+ },
+ "check-error": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz",
+ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=",
+ "dev": true
+ },
+ "cli-boxes": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz",
+ "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=",
+ "dev": 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
+ },
+ "colors": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz",
+ "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=",
+ "dev": 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,
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+ "dev": true,
+ "requires": {
+ "graceful-readlink": ">= 1.0.0"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "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
+ },
+ "configstore": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.0.0.tgz",
+ "integrity": "sha1-4bhmnBgDzMULVF6S+ObnmqgOAZY=",
+ "dev": true,
+ "requires": {
+ "dot-prop": "^4.1.0",
+ "graceful-fs": "^4.1.2",
+ "mkdirp": "^0.5.0",
+ "unique-string": "^1.0.0",
+ "write-file-atomic": "^1.1.2",
+ "xdg-basedir": "^3.0.0"
+ }
+ },
+ "content-disposition": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz",
+ "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==",
+ "requires": {
+ "safe-buffer": "5.1.2"
+ },
+ "dependencies": {
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ }
+ }
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
+ },
+ "cookie": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz",
+ "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg=="
+ },
+ "cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
+ },
+ "cookiejar": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.0.tgz",
+ "integrity": "sha1-hlSWiVObbQ4mm2Y3owS+UIGU2Jg=",
+ "dev": 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
+ },
+ "coveralls": {
+ "version": "2.13.0",
+ "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.0.tgz",
+ "integrity": "sha1-35M4dujG9HjvsE9NOrcNyWt+Wo4=",
+ "dev": true,
+ "requires": {
+ "js-yaml": "3.6.1",
+ "lcov-parse": "0.0.10",
+ "log-driver": "1.2.5",
+ "minimist": "1.2.0",
+ "request": "2.79.0"
+ },
+ "dependencies": {
+ "form-data": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.2.tgz",
+ "integrity": "sha1-icNTQAi5fq2ky7FX1Y9vXfAl6uQ=",
+ "dev": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.5",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "qs": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
+ "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
+ "dev": true
+ },
+ "request": {
+ "version": "2.79.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
+ "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
+ "dev": true,
+ "requires": {
+ "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"
+ }
+ },
+ "uuid": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz",
+ "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=",
+ "dev": true
+ }
+ }
+ },
+ "create-error-class": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz",
+ "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=",
+ "dev": true,
+ "requires": {
+ "capture-stack-trace": "^1.0.0"
+ }
+ },
+ "cross-spawn-async": {
+ "version": "2.2.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz",
+ "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^4.0.0",
+ "which": "^1.2.8"
+ }
+ },
+ "cryptiles": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz",
+ "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=",
+ "dev": true,
+ "requires": {
+ "boom": "2.x.x"
+ }
+ },
+ "crypto-random-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz",
+ "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=",
+ "dev": true
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "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="
+ }
+ }
+ },
+ "deep-eql": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-0.1.3.tgz",
+ "integrity": "sha1-71WKyrjeJSBs1xOQbXTlaTDrafI=",
+ "dev": true,
+ "requires": {
+ "type-detect": "0.1.1"
+ },
+ "dependencies": {
+ "type-detect": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-0.1.1.tgz",
+ "integrity": "sha1-C6XsKohWQORw6k6FBZcZANrFiCI=",
+ "dev": true
+ }
+ }
+ },
+ "deep-extend": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.1.tgz",
+ "integrity": "sha1-7+QRPQgIX05vlod1mBD4B0aeIlM=",
+ "dev": true
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
+ },
+ "deprecate": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/deprecate/-/deprecate-1.0.0.tgz",
+ "integrity": "sha1-ZhSQ7SQokWpsiIPYg05WRvTkpKg="
+ },
+ "destroy": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
+ },
+ "diff": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz",
+ "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=",
+ "dev": true
+ },
+ "dot-prop": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz",
+ "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=",
+ "dev": true,
+ "requires": {
+ "is-obj": "^1.0.0"
+ }
+ },
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+ "dev": true
+ },
+ "ecc-jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
+ "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
+ "optional": true,
+ "requires": {
+ "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",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
+ },
+ "encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
+ },
+ "escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "esprima": {
+ "version": "2.7.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz",
+ "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
+ },
+ "execa": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-0.4.0.tgz",
+ "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=",
+ "dev": true,
+ "requires": {
+ "cross-spawn-async": "^2.1.1",
+ "is-stream": "^1.1.0",
+ "npm-run-path": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "path-key": "^1.0.0",
+ "strip-eof": "^1.0.0"
+ }
+ },
+ "express": {
+ "version": "4.17.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz",
+ "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==",
+ "requires": {
+ "accepts": "~1.3.7",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.19.0",
+ "content-disposition": "0.5.3",
+ "content-type": "~1.0.4",
+ "cookie": "0.4.0",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.1.2",
+ "fresh": "0.5.2",
+ "merge-descriptors": "1.0.1",
+ "methods": "~1.1.2",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.7",
+ "proxy-addr": "~2.0.5",
+ "qs": "6.7.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.1.2",
+ "send": "0.17.1",
+ "serve-static": "1.14.1",
+ "setprototypeof": "1.1.1",
+ "statuses": "~1.5.0",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "qs": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz",
+ "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ=="
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ }
+ }
+ },
+ "extend": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz",
+ "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=",
+ "dev": true
+ },
+ "extsprintf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz",
+ "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA="
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
+ },
+ "finalhandler": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz",
+ "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==",
+ "requires": {
+ "debug": "2.6.9",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.3.0",
+ "parseurl": "~1.3.3",
+ "statuses": "~1.5.0",
+ "unpipe": "~1.0.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "findit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/findit/-/findit-0.1.2.tgz",
+ "integrity": "sha1-rH/mAM1qMqNWcoNrdM9vHd4uEfg=",
+ "requires": {
+ "seq": ">=0.1.7"
+ }
+ },
+ "findup-sync": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz",
+ "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=",
+ "dev": true,
+ "requires": {
+ "glob": "~5.0.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ }
+ }
+ },
+ "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.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ },
+ "dependencies": {
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ }
+ }
+ },
+ "formatio": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.1.1.tgz",
+ "integrity": "sha1-XtPM1jZVEJc4NGXZlhmRAOhhYek=",
+ "dev": true,
+ "requires": {
+ "samsam": "~1.1"
+ }
+ },
+ "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.2",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
+ "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
+ },
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "generate-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
+ "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
+ "dev": true
+ },
+ "generate-object-property": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz",
+ "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=",
+ "dev": true,
+ "requires": {
+ "is-property": "^1.0.0"
+ }
+ },
+ "get-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz",
+ "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=",
+ "dev": true
+ },
+ "getpass": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.6.tgz",
+ "integrity": "sha1-KD/9n8ElaECHUxHBtg6MQBhxEOY=",
+ "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="
+ }
+ }
+ },
+ "glob": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.5.tgz",
+ "integrity": "sha1-tCAqaQmbu00pKnwblbZoK2fr3JU=",
+ "dev": true,
+ "requires": {
+ "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"
+ }
+ },
+ "got": {
+ "version": "6.7.1",
+ "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz",
+ "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=",
+ "dev": true,
+ "requires": {
+ "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": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
+ "dev": true
+ },
+ "growl": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz",
+ "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=",
+ "dev": true
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
+ },
+ "har-validator": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz",
+ "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=",
+ "dev": true,
+ "requires": {
+ "chalk": "^1.1.1",
+ "commander": "^2.9.0",
+ "is-my-json-valid": "^2.12.4",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "hashish": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/hashish/-/hashish-0.0.4.tgz",
+ "integrity": "sha1-bWC8b/r3Ebav1g5CbQd5iAFOZVQ=",
+ "requires": {
+ "traverse": ">=0.2.4"
+ }
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+ "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+ "dev": 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
+ },
+ "http-errors": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz",
+ "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==",
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.1",
+ "statuses": ">= 1.5.0 < 2",
+ "toidentifier": "1.0.0"
+ }
+ },
+ "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,
+ "requires": {
+ "assert-plus": "^0.2.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": 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="
+ },
+ "ini": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz",
+ "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=",
+ "dev": true
+ },
+ "ipaddr.js": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
+ "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
+ },
+ "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,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "is-my-json-valid": {
+ "version": "2.16.0",
+ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz",
+ "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=",
+ "dev": true,
+ "requires": {
+ "generate-function": "^2.0.0",
+ "generate-object-property": "^1.1.0",
+ "jsonpointer": "^4.0.0",
+ "xtend": "^4.0.0"
+ }
+ },
+ "is-npm": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz",
+ "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=",
+ "dev": true
+ },
+ "is-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
+ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
+ "dev": true
+ },
+ "is-property": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
+ "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=",
+ "dev": true
+ },
+ "is-redirect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz",
+ "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=",
+ "dev": true
+ },
+ "is-retry-allowed": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz",
+ "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
+ "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
+ "dev": true
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
+ },
+ "jodid25519": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz",
+ "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=",
+ "optional": true,
+ "requires": {
+ "jsbn": "~0.1.0"
+ }
+ },
+ "js-tokens": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz",
+ "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=",
+ "dev": true
+ },
+ "js-yaml": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz",
+ "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^2.6.0"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "optional": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
+ "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="
+ },
+ "json3": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz",
+ "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=",
+ "dev": true
+ },
+ "jsonpointer": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz",
+ "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=",
+ "dev": true
+ },
+ "jsonwebtoken": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+ "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+ "requires": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^5.6.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
+ "semver": {
+ "version": "5.7.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
+ "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA=="
+ }
+ }
+ },
+ "jsprim": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz",
+ "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=",
+ "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="
+ }
+ }
+ },
+ "jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "requires": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "requires": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "latest-version": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz",
+ "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=",
+ "dev": true,
+ "requires": {
+ "package-json": "^4.0.0"
+ }
+ },
+ "lazy-req": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-2.0.0.tgz",
+ "integrity": "sha1-yUUKNj7N2i5vDHATKtTzf48G8rQ=",
+ "dev": true
+ },
+ "lcov-parse": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz",
+ "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=",
+ "dev": true
+ },
+ "lodash": {
+ "version": "4.17.14",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.14.tgz",
+ "integrity": "sha512-mmKYbW3GLuJeX+iGP+Y7Gp1AiGHGbXHCOh/jZmrawMmsE7MS4znI3RL2FsjbqOyMayHInjOeykW7PEajUk1/xw=="
+ },
+ "lodash._baseassign": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz",
+ "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=",
+ "dev": true,
+ "requires": {
+ "lodash._basecopy": "^3.0.0",
+ "lodash.keys": "^3.0.0"
+ }
+ },
+ "lodash._basecopy": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz",
+ "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=",
+ "dev": true
+ },
+ "lodash._basecreate": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz",
+ "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=",
+ "dev": true
+ },
+ "lodash._getnative": {
+ "version": "3.9.1",
+ "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz",
+ "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=",
+ "dev": true
+ },
+ "lodash._isiterateecall": {
+ "version": "3.0.9",
+ "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz",
+ "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=",
+ "dev": true
+ },
+ "lodash.create": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz",
+ "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=",
+ "dev": true,
+ "requires": {
+ "lodash._baseassign": "^3.0.0",
+ "lodash._basecreate": "^3.0.0",
+ "lodash._isiterateecall": "^3.0.0"
+ }
+ },
+ "lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8="
+ },
+ "lodash.isarguments": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz",
+ "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=",
+ "dev": true
+ },
+ "lodash.isarray": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz",
+ "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=",
+ "dev": true
+ },
+ "lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY="
+ },
+ "lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M="
+ },
+ "lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w="
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs="
+ },
+ "lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE="
+ },
+ "lodash.keys": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz",
+ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=",
+ "dev": true,
+ "requires": {
+ "lodash._getnative": "^3.0.0",
+ "lodash.isarguments": "^3.0.0",
+ "lodash.isarray": "^3.0.0"
+ }
+ },
+ "lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
+ },
+ "log-driver": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz",
+ "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=",
+ "dev": true
+ },
+ "lolex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.3.2.tgz",
+ "integrity": "sha1-fD2mL/yzDw9agKJWbKJORdigHzE=",
+ "dev": true
+ },
+ "lowercase-keys": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz",
+ "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=",
+ "dev": true
+ },
+ "lru-cache": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz",
+ "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=",
+ "dev": true,
+ "requires": {
+ "pseudomap": "^1.0.1",
+ "yallist": "^2.0.0"
+ }
+ },
+ "make-error": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.2.3.tgz",
+ "integrity": "sha1-bEQC33MuCXesb691SlB0s9Kx0Z0=",
+ "dev": true
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
+ },
+ "merge-descriptors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+ "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
+ },
+ "mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
+ },
+ "mime-db": {
+ "version": "1.27.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz",
+ "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE="
+ },
+ "mime-types": {
+ "version": "2.1.15",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz",
+ "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=",
+ "requires": {
+ "mime-db": "~1.27.0"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.0.0"
+ }
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ }
+ }
+ },
+ "mocha": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.2.0.tgz",
+ "integrity": "sha1-fcT0XlCIB1FxpoiWgU5q6et6heM=",
+ "dev": true,
+ "requires": {
+ "browser-stdout": "1.3.0",
+ "commander": "2.9.0",
+ "debug": "2.2.0",
+ "diff": "1.4.0",
+ "escape-string-regexp": "1.0.5",
+ "glob": "7.0.5",
+ "growl": "1.9.2",
+ "json3": "3.3.2",
+ "lodash.create": "3.1.1",
+ "mkdirp": "0.5.1",
+ "supports-color": "3.1.2"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz",
+ "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.1"
+ }
+ },
+ "ms": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz",
+ "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz",
+ "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=",
+ "dev": true,
+ "requires": {
+ "has-flag": "^1.0.0"
+ }
+ }
+ }
+ },
+ "moment": {
+ "version": "2.24.0",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
+ "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
+ },
+ "negotiator": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz",
+ "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw=="
+ },
+ "npm-run-path": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz",
+ "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=",
+ "dev": true,
+ "requires": {
+ "path-key": "^1.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
+ },
+ "nyc": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/nyc/-/nyc-10.2.0.tgz",
+ "integrity": "sha1-+s2QJAYAyapN2B6pnC+2qFxT3gw=",
+ "dev": true,
+ "requires": {
+ "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": "^1.1.2",
+ "foreground-child": "^1.5.3",
+ "glob": "^7.0.6",
+ "istanbul-lib-coverage": "^1.0.2",
+ "istanbul-lib-hook": "^1.0.5",
+ "istanbul-lib-instrument": "^1.7.0",
+ "istanbul-lib-report": "^1.0.0",
+ "istanbul-lib-source-maps": "^1.1.1",
+ "istanbul-reports": "^1.0.2",
+ "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.2.4",
+ "test-exclude": "^4.0.0",
+ "yargs": "^7.0.2",
+ "yargs-parser": "^4.0.2"
+ },
+ "dependencies": {
+ "align-text": {
+ "version": "0.1.4",
+ "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",
+ "repeat-string": "^1.5.2"
+ }
+ },
+ "amdefine": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
+ "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=",
+ "dev": true
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "append-transform": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz",
+ "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=",
+ "dev": true,
+ "requires": {
+ "default-require-extensions": "^1.0.0"
+ }
+ },
+ "archy": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
+ "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
+ "dev": true
+ },
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "^1.0.1"
+ }
+ },
+ "arr-flatten": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz",
+ "integrity": "sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs=",
+ "dev": true
+ },
+ "array-unique": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
+ "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
+ "dev": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+ "dev": true
+ },
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ },
+ "babel-code-frame": {
+ "version": "6.22.0",
+ "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz",
+ "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=",
+ "dev": true,
+ "requires": {
+ "chalk": "^1.1.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^3.0.0"
+ }
+ },
+ "babel-generator": {
+ "version": "6.24.0",
+ "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.24.0.tgz",
+ "integrity": "sha1-66JwqMxM5uCaYb5DRl18YsH4fFY=",
+ "dev": true,
+ "requires": {
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.23.0",
+ "detect-indent": "^4.0.0",
+ "jsesc": "^1.3.0",
+ "lodash": "^4.2.0",
+ "source-map": "^0.5.0",
+ "trim-right": "^1.0.1"
+ }
+ },
+ "babel-messages": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz",
+ "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0"
+ }
+ },
+ "babel-runtime": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.23.0.tgz",
+ "integrity": "sha1-CpSJ8UTecO+zzkMArM2zKeL8VDs=",
+ "dev": true,
+ "requires": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.10.0"
+ }
+ },
+ "babel-template": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.23.0.tgz",
+ "integrity": "sha1-BNTycK27OqcEqBQ64m+qUpI45jg=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "babel-traverse": "^6.23.0",
+ "babel-types": "^6.23.0",
+ "babylon": "^6.11.0",
+ "lodash": "^4.2.0"
+ }
+ },
+ "babel-traverse": {
+ "version": "6.23.1",
+ "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.23.1.tgz",
+ "integrity": "sha1-08tZAQ7NBql9gTEAZflmtpnhT0g=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "^6.22.0",
+ "babel-messages": "^6.23.0",
+ "babel-runtime": "^6.22.0",
+ "babel-types": "^6.23.0",
+ "babylon": "^6.15.0",
+ "debug": "^2.2.0",
+ "globals": "^9.0.0",
+ "invariant": "^2.2.0",
+ "lodash": "^4.2.0"
+ }
+ },
+ "babel-types": {
+ "version": "6.23.0",
+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.23.0.tgz",
+ "integrity": "sha1-uxcXnXU4utOM0MnhFdNA935+ms8=",
+ "dev": true,
+ "requires": {
+ "babel-runtime": "^6.22.0",
+ "esutils": "^2.0.2",
+ "lodash": "^4.2.0",
+ "to-fast-properties": "^1.0.1"
+ }
+ },
+ "babylon": {
+ "version": "6.16.1",
+ "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.16.1.tgz",
+ "integrity": "sha1-MMWiL0gZeKnn+M399JaxHZS0BNM=",
+ "dev": 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
+ },
+ "brace-expansion": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.6.tgz",
+ "integrity": "sha1-cZfX6qm4fmSDkOph/GbIRCdCDfk=",
+ "dev": true,
+ "requires": {
+ "balanced-match": "^0.4.1",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "^1.8.1",
+ "preserve": "^0.2.0",
+ "repeat-element": "^1.1.2"
+ }
+ },
+ "builtin-modules": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz",
+ "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=",
+ "dev": true
+ },
+ "caching-transform": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz",
+ "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=",
+ "dev": true,
+ "requires": {
+ "md5-hex": "^1.2.0",
+ "mkdirp": "^0.5.1",
+ "write-file-atomic": "^1.1.4"
+ }
+ },
+ "camelcase": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
+ "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=",
+ "dev": true,
+ "optional": true
+ },
+ "center-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
+ "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "align-text": "^0.1.3",
+ "lazy-cache": "^1.0.3"
+ }
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "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": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
+ "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "center-align": "^0.1.1",
+ "right-align": "^0.1.1",
+ "wordwrap": "0.0.2"
+ },
+ "dependencies": {
+ "wordwrap": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
+ "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=",
+ "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
+ },
+ "commondir": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+ "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
+ "dev": true
+ },
+ "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
+ },
+ "convert-source-map": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.4.0.tgz",
+ "integrity": "sha1-49rRlb9hv+E6ejxz6YduwUoCaPM=",
+ "dev": true
+ },
+ "core-js": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.4.1.tgz",
+ "integrity": "sha1-TekR5mew6ukSTjQlS1OupvxhjT4=",
+ "dev": true
+ },
+ "cross-spawn": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz",
+ "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=",
+ "dev": true,
+ "requires": {
+ "lru-cache": "^4.0.1",
+ "which": "^1.2.9"
+ }
+ },
+ "debug": {
+ "version": "2.6.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.3.tgz",
+ "integrity": "sha1-D364wwll7AjHKsz6ATDIt5mEFB0=",
+ "dev": true,
+ "requires": {
+ "ms": "0.7.2"
+ }
+ },
+ "debug-log": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz",
+ "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=",
+ "dev": true
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "default-require-extensions": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz",
+ "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=",
+ "dev": true,
+ "requires": {
+ "strip-bom": "^2.0.0"
+ }
+ },
+ "detect-indent": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz",
+ "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=",
+ "dev": true,
+ "requires": {
+ "repeating": "^2.0.0"
+ }
+ },
+ "error-ex": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz",
+ "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=",
+ "dev": true,
+ "requires": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "^0.1.0"
+ }
+ },
+ "expand-range": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
+ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
+ "dev": true,
+ "requires": {
+ "fill-range": "^2.1.0"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^1.0.0"
+ }
+ },
+ "filename-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz",
+ "integrity": "sha1-mW4+gEebmLmJfxWopYs9CE6SZ3U=",
+ "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"
+ }
+ },
+ "find-cache-dir": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz",
+ "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=",
+ "dev": true,
+ "requires": {
+ "commondir": "^1.0.1",
+ "mkdirp": "^0.5.1",
+ "pkg-dir": "^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"
+ }
+ },
+ "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"
+ }
+ },
+ "foreground-child": {
+ "version": "1.5.6",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz",
+ "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^4",
+ "signal-exit": "^3.0.0"
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
+ },
+ "get-caller-file": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz",
+ "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
+ "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
+ "dev": true,
+ "requires": {
+ "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-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "dev": true,
+ "requires": {
+ "glob-parent": "^2.0.0",
+ "is-glob": "^2.0.0"
+ }
+ },
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "dev": true,
+ "requires": {
+ "is-glob": "^2.0.0"
+ }
+ },
+ "globals": {
+ "version": "9.17.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-9.17.0.tgz",
+ "integrity": "sha1-DAymltm5u2lNLlRwvTd3fKrVAoY=",
+ "dev": true
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "handlebars": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.6.tgz",
+ "integrity": "sha1-LORISFBTf5yXqAJtU5m5NcTtTtc=",
+ "dev": true,
+ "requires": {
+ "async": "^1.4.0",
+ "optimist": "^0.6.1",
+ "source-map": "^0.4.4",
+ "uglify-js": "^2.6"
+ },
+ "dependencies": {
+ "source-map": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz",
+ "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=",
+ "dev": true,
+ "requires": {
+ "amdefine": ">=0.0.4"
+ }
+ }
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "has-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
+ "dev": true
+ },
+ "hosted-git-info": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.1.tgz",
+ "integrity": "sha1-SwRF5BwASovRM3dzpP95DKQDGMg=",
+ "dev": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
+ "dev": true
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": 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
+ },
+ "invariant": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz",
+ "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=",
+ "dev": true,
+ "requires": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "invert-kv": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz",
+ "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=",
+ "dev": true
+ },
+ "is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
+ "dev": true
+ },
+ "is-buffer": {
+ "version": "1.1.5",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz",
+ "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=",
+ "dev": true
+ },
+ "is-builtin-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz",
+ "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=",
+ "dev": true,
+ "requires": {
+ "builtin-modules": "^1.0.0"
+ }
+ },
+ "is-dotfile": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz",
+ "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=",
+ "dev": true
+ },
+ "is-equal-shallow": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
+ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
+ "dev": true,
+ "requires": {
+ "is-primitive": "^2.0.0"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
+ "dev": true
+ },
+ "is-extglob": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
+ "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
+ "dev": true
+ },
+ "is-finite": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz",
+ "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=",
+ "dev": true,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "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,
+ "requires": {
+ "number-is-nan": "^1.0.0"
+ }
+ },
+ "is-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^1.0.0"
+ }
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "dev": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "is-posix-bracket": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
+ "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
+ "dev": true
+ },
+ "is-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
+ "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
+ "dev": true
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "dev": true
+ },
+ "isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
+ "dev": true
+ },
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "dev": true,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ },
+ "istanbul-lib-coverage": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.0.2.tgz",
+ "integrity": "sha1-h6DAFbaRBlHLOxhIFN+zOTN+JeE=",
+ "dev": true
+ },
+ "istanbul-lib-hook": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.5.tgz",
+ "integrity": "sha1-bKPRbWDF9Agto598XNOOqKdyuI4=",
+ "dev": true,
+ "requires": {
+ "append-transform": "^0.4.0"
+ }
+ },
+ "istanbul-lib-instrument": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.0.tgz",
+ "integrity": "sha1-uODcJXCbtE4XM2q0e3u1yXwj9lk=",
+ "dev": true,
+ "requires": {
+ "babel-generator": "^6.18.0",
+ "babel-template": "^6.16.0",
+ "babel-traverse": "^6.18.0",
+ "babel-types": "^6.18.0",
+ "babylon": "^6.13.0",
+ "istanbul-lib-coverage": "^1.0.2",
+ "semver": "^5.3.0"
+ }
+ },
+ "istanbul-lib-report": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.0.0.tgz",
+ "integrity": "sha1-2D2sfyZWa1IVhVaTZ/6EzPx6rss=",
+ "dev": true,
+ "requires": {
+ "istanbul-lib-coverage": "^1.0.2",
+ "mkdirp": "^0.5.1",
+ "path-parse": "^1.0.5",
+ "supports-color": "^3.1.2"
+ },
+ "dependencies": {
+ "supports-color": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
+ "dev": true,
+ "requires": {
+ "has-flag": "^1.0.0"
+ }
+ }
+ }
+ },
+ "istanbul-lib-source-maps": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.1.1.tgz",
+ "integrity": "sha1-+MjC6PIWDR2RUm2X5b1jsgea9xw=",
+ "dev": true,
+ "requires": {
+ "istanbul-lib-coverage": "^1.0.2",
+ "mkdirp": "^0.5.1",
+ "rimraf": "^2.4.4",
+ "source-map": "^0.5.3"
+ }
+ },
+ "istanbul-reports": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.0.2.tgz",
+ "integrity": "sha1-ToNmq+b6dGzBzWYz8QjeEsxqxvo=",
+ "dev": true,
+ "requires": {
+ "handlebars": "^4.0.3"
+ }
+ },
+ "js-tokens": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz",
+ "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=",
+ "dev": true
+ },
+ "jsesc": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz",
+ "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=",
+ "dev": true
+ },
+ "kind-of": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.1.0.tgz",
+ "integrity": "sha1-R11pil5J/15T0U4+cyQp3Iv0z0c=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "^1.0.2"
+ }
+ },
+ "lazy-cache": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=",
+ "dev": true,
+ "optional": true
+ },
+ "lcid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz",
+ "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=",
+ "dev": true,
+ "requires": {
+ "invert-kv": "^1.0.0"
+ }
+ },
+ "load-json-file": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+ "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "parse-json": "^2.2.0",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "strip-bom": "^2.0.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.4",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz",
+ "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=",
+ "dev": true
+ },
+ "longest": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
+ "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=",
+ "dev": true,
+ "optional": true
+ },
+ "loose-envify": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz",
+ "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=",
+ "dev": true,
+ "requires": {
+ "js-tokens": "^3.0.0"
+ }
+ },
+ "lru-cache": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz",
+ "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=",
+ "dev": true,
+ "requires": {
+ "pseudomap": "^1.0.1",
+ "yallist": "^2.0.0"
+ }
+ },
+ "md5-hex": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz",
+ "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=",
+ "dev": true,
+ "requires": {
+ "md5-o-matic": "^0.1.1"
+ }
+ },
+ "md5-o-matic": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz",
+ "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=",
+ "dev": true
+ },
+ "merge-source-map": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.3.tgz",
+ "integrity": "sha1-2hQV8nIqURnbB7FMT5c0EIY6Kr8=",
+ "dev": true,
+ "requires": {
+ "source-map": "^0.5.3"
+ }
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "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"
+ }
+ },
+ "minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=",
+ "dev": true,
+ "requires": {
+ "brace-expansion": "^1.0.0"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "ms": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz",
+ "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=",
+ "dev": true
+ },
+ "normalize-package-data": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.6.tgz",
+ "integrity": "sha1-SY+kIMlkAfeHQCuiHmAN75+YH/8=",
+ "dev": true,
+ "requires": {
+ "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": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz",
+ "integrity": "sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o=",
+ "dev": true
+ },
+ "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
+ },
+ "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
+ },
+ "object.omit": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
+ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
+ "dev": true,
+ "requires": {
+ "for-own": "^0.1.4",
+ "is-extendable": "^0.1.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "optimist": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "dev": true,
+ "requires": {
+ "minimist": "~0.0.1",
+ "wordwrap": "~0.0.2"
+ }
+ },
+ "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
+ },
+ "os-locale": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+ "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
+ "dev": true,
+ "requires": {
+ "lcid": "^1.0.0"
+ }
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "dev": true,
+ "requires": {
+ "glob-base": "^0.3.0",
+ "is-dotfile": "^1.0.0",
+ "is-extglob": "^1.0.0",
+ "is-glob": "^2.0.0"
+ }
+ },
+ "parse-json": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
+ "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+ "dev": true,
+ "requires": {
+ "error-ex": "^1.2.0"
+ }
+ },
+ "path-exists": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
+ "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+ "dev": true,
+ "requires": {
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "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
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "path-type": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
+ "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
+ "dev": true
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "requires": {
+ "pinkie": "^2.0.0"
+ }
+ },
+ "pkg-dir": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz",
+ "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=",
+ "dev": true,
+ "requires": {
+ "find-up": "^1.0.0"
+ }
+ },
+ "preserve": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
+ "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
+ "dev": true
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "randomatic": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz",
+ "integrity": "sha1-EQ3Kv/OX6dz/fAeJzMCkmt8exbs=",
+ "dev": true,
+ "requires": {
+ "is-number": "^2.0.2",
+ "kind-of": "^3.0.2"
+ }
+ },
+ "read-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
+ "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+ "dev": true,
+ "requires": {
+ "load-json-file": "^1.0.0",
+ "normalize-package-data": "^2.3.2",
+ "path-type": "^1.0.0"
+ }
+ },
+ "read-pkg-up": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
+ "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+ "dev": true,
+ "requires": {
+ "find-up": "^1.0.0",
+ "read-pkg": "^1.0.0"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.10.3",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.3.tgz",
+ "integrity": "sha1-jENnqQS1HqYqkIrDEL+Z/5CoKj4=",
+ "dev": true
+ },
+ "regex-cache": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz",
+ "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=",
+ "dev": true,
+ "requires": {
+ "is-equal-shallow": "^0.1.3",
+ "is-primitive": "^2.0.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
+ "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
+ "dev": true
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
+ "dev": true
+ },
+ "repeating": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
+ "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+ "dev": true,
+ "requires": {
+ "is-finite": "^1.0.0"
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
+ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
+ "dev": true
+ },
+ "resolve-from": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
+ "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=",
+ "dev": true
+ },
+ "right-align": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
+ "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "align-text": "^0.1.1"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz",
+ "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=",
+ "dev": true,
+ "requires": {
+ "glob": "^7.0.5"
+ }
+ },
+ "semver": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+ "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+ "dev": 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
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
+ "dev": true
+ },
+ "slide": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
+ "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=",
+ "dev": true
+ },
+ "source-map": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
+ "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=",
+ "dev": true
+ },
+ "spawn-wrap": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.2.4.tgz",
+ "integrity": "sha1-kg6yEadpwJPuv71bDnpdLmirLkA=",
+ "dev": true,
+ "requires": {
+ "foreground-child": "^1.3.3",
+ "mkdirp": "^0.5.0",
+ "os-homedir": "^1.0.1",
+ "rimraf": "^2.3.3",
+ "signal-exit": "^2.0.0",
+ "which": "^1.2.4"
+ },
+ "dependencies": {
+ "signal-exit": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-2.1.2.tgz",
+ "integrity": "sha1-N1h5sfkuvDszRIDQONxUam1VhWQ=",
+ "dev": true
+ }
+ }
+ },
+ "spdx-correct": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz",
+ "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=",
+ "dev": true,
+ "requires": {
+ "spdx-license-ids": "^1.0.2"
+ }
+ },
+ "spdx-expression-parse": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz",
+ "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=",
+ "dev": true
+ },
+ "spdx-license-ids": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz",
+ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=",
+ "dev": 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,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ },
+ "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,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "^0.2.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "test-exclude": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.0.3.tgz",
+ "integrity": "sha1-hqE84+/8xg5skEA88xonpgrGxOc=",
+ "dev": true,
+ "requires": {
+ "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": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.2.tgz",
+ "integrity": "sha1-8/XAw7pymafvmUJ+RGMyV63kMyA=",
+ "dev": true
+ },
+ "trim-right": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
+ "dev": true
+ },
+ "uglify-js": {
+ "version": "2.8.16",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.16.tgz",
+ "integrity": "sha1-0oYZC27vxv1l6w7KxlUeCw6IOaQ=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "source-map": "~0.5.1",
+ "uglify-to-browserify": "~1.0.0",
+ "yargs": "~3.10.0"
+ },
+ "dependencies": {
+ "yargs": {
+ "version": "3.10.0",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
+ "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "camelcase": "^1.0.2",
+ "cliui": "^2.1.0",
+ "decamelize": "^1.0.0",
+ "window-size": "0.1.0"
+ }
+ }
+ }
+ },
+ "uglify-to-browserify": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
+ "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
+ "dev": true,
+ "optional": true
+ },
+ "validate-npm-package-license": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz",
+ "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=",
+ "dev": true,
+ "requires": {
+ "spdx-correct": "~1.0.0",
+ "spdx-expression-parse": "~1.0.0"
+ }
+ },
+ "which": {
+ "version": "1.2.14",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz",
+ "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz",
+ "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=",
+ "dev": true
+ },
+ "window-size": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
+ "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=",
+ "dev": true,
+ "optional": true
+ },
+ "wordwrap": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
+ "dev": true
+ },
+ "wrap-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
+ "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1"
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "write-file-atomic": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.1.tgz",
+ "integrity": "sha1-fUW6MjFjKN0ex9kPYOvA2EW7dZo=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "imurmurhash": "^0.1.4",
+ "slide": "^1.1.5"
+ }
+ },
+ "y18n": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz",
+ "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ },
+ "yargs": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.0.2.tgz",
+ "integrity": "sha1-EVuX3xMhgj6Lhkjolox4JSEiH2c=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^3.0.0",
+ "cliui": "^3.2.0",
+ "decamelize": "^1.1.1",
+ "get-caller-file": "^1.0.1",
+ "os-locale": "^1.4.0",
+ "read-pkg-up": "^1.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^1.0.1",
+ "set-blocking": "^2.0.0",
+ "string-width": "^1.0.2",
+ "which-module": "^1.0.0",
+ "y18n": "^3.2.1",
+ "yargs-parser": "^5.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+ "dev": true
+ },
+ "cliui": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz",
+ "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1",
+ "strip-ansi": "^3.0.1",
+ "wrap-ansi": "^2.0.0"
+ }
+ },
+ "yargs-parser": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz",
+ "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^3.0.0"
+ }
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz",
+ "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=",
+ "dev": true,
+ "requires": {
+ "camelcase": "^3.0.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz",
+ "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=",
+ "dev": 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
+ },
+ "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
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "optimist": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "dev": true,
+ "requires": {
+ "minimist": "~0.0.1",
+ "wordwrap": "~0.0.2"
+ },
+ "dependencies": {
+ "minimist": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+ "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
+ "dev": true
+ }
+ }
+ },
+ "package-json": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.0.tgz",
+ "integrity": "sha1-88nchzj1tZME1U0s+z+R0I/deZg=",
+ "dev": true,
+ "requires": {
+ "got": "^6.7.1",
+ "registry-auth-token": "^3.0.1",
+ "registry-url": "^3.0.3",
+ "semver": "^5.1.0"
+ }
+ },
+ "parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ=="
+ },
+ "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
+ },
+ "path-key": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz",
+ "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=",
+ "dev": true
+ },
+ "path-parse": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz",
+ "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=",
+ "dev": true
+ },
+ "path-to-regexp": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+ "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "requires": {
+ "pinkie": "^2.0.0"
+ }
+ },
+ "pop-iterate": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/pop-iterate/-/pop-iterate-1.0.1.tgz",
+ "integrity": "sha1-zqz9q0q/NT16DyqqLB/Hs/lBO6M="
+ },
+ "prepend-http": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
+ "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
+ "dev": 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
+ },
+ "proxy-addr": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
+ "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
+ "requires": {
+ "forwarded": "~0.1.2",
+ "ipaddr.js": "1.9.0"
+ }
+ },
+ "pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
+ "dev": true
+ },
+ "psl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz",
+ "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA=="
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
+ },
+ "q": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/q/-/q-2.0.3.tgz",
+ "integrity": "sha1-dbjbAlWhpa+C9Yw/Oqoe/sfQ0TQ=",
+ "requires": {
+ "asap": "^2.0.0",
+ "pop-iterate": "^1.0.1",
+ "weak-map": "^1.0.5"
+ }
+ },
+ "qs": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz",
+ "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=",
+ "dev": true
+ },
+ "ramda": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.23.0.tgz",
+ "integrity": "sha1-zNE//3NJepOXTj6GMnv9h71ujis="
+ },
+ "range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="
+ },
+ "raw-body": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz",
+ "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==",
+ "requires": {
+ "bytes": "3.1.0",
+ "http-errors": "1.7.2",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ }
+ },
+ "rc": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.0.tgz",
+ "integrity": "sha1-x96XO3tGKXwEE2ay/T0jY7FpfGY=",
+ "dev": true,
+ "requires": {
+ "deep-extend": "~0.4.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ }
+ },
+ "readable-stream": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz",
+ "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.1",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~1.0.6",
+ "string_decoder": "~0.10.x",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "registry-auth-token": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.1.0.tgz",
+ "integrity": "sha1-mXwIJW4MeZmDe5DpRNs52KeQJ2s=",
+ "dev": true,
+ "requires": {
+ "rc": "^1.1.6"
+ }
+ },
+ "registry-url": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz",
+ "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=",
+ "dev": true,
+ "requires": {
+ "rc": "^1.0.1"
+ }
+ },
+ "request": {
+ "version": "2.88.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+ "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "requires": {
+ "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.0",
+ "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.4.3",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "dependencies": {
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
+ },
+ "aws4": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ=="
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
+ "har-validator": {
+ "version": "5.1.3",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
+ "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
+ "requires": {
+ "ajv": "^6.5.5",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "mime-db": {
+ "version": "1.40.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
+ "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
+ },
+ "mime-types": {
+ "version": "2.1.24",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
+ "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
+ "requires": {
+ "mime-db": "1.40.0"
+ }
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
+ },
+ "safe-buffer": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
+ "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
+ },
+ "tough-cookie": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "requires": {
+ "psl": "^1.1.24",
+ "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=",
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ }
+ }
+ },
+ "resolve": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.2.tgz",
+ "integrity": "sha1-HwRCyeDLuBNuh7kwX5MvRsfygjU=",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.5"
+ }
+ },
+ "rimraf": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz",
+ "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=",
+ "dev": true,
+ "requires": {
+ "glob": "^7.0.5"
+ }
+ },
+ "rootpath": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/rootpath/-/rootpath-0.1.2.tgz",
+ "integrity": "sha1-Wzeah9ypBum5HWkKWZQ5vvJn6ms="
+ },
+ "safe-buffer": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz",
+ "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c="
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "samsam": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.1.2.tgz",
+ "integrity": "sha1-vsEf3IOp/aBjQBIQ5AF2wwJNFWc=",
+ "dev": true
+ },
+ "scmp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/scmp/-/scmp-2.0.0.tgz",
+ "integrity": "sha1-JHEQ7yLM+JexOj8KvdtSeCOTzWo="
+ },
+ "semver": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz",
+ "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=",
+ "dev": true
+ },
+ "semver-diff": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz",
+ "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=",
+ "dev": true,
+ "requires": {
+ "semver": "^5.0.3"
+ }
+ },
+ "send": {
+ "version": "0.17.1",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
+ "requires": {
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "destroy": "~1.0.4",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "~1.7.2",
+ "mime": "1.6.0",
+ "ms": "2.1.1",
+ "on-finished": "~2.3.0",
+ "range-parser": "~1.2.1",
+ "statuses": "~1.5.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ }
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
+ }
+ }
+ },
+ "seq": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/seq/-/seq-0.3.5.tgz",
+ "integrity": "sha1-rgKvOkJHk9jMvyEtaRdODFTf/jg=",
+ "requires": {
+ "chainsaw": ">=0.0.7 <0.1",
+ "hashish": ">=0.0.2 <0.1"
+ }
+ },
+ "serve-static": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
+ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
+ "requires": {
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.17.1"
+ }
+ },
+ "setprototypeof": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw=="
+ },
+ "sinon": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-1.17.7.tgz",
+ "integrity": "sha1-RUKk9JugxFwF6y6d2dID4rjv4L8=",
+ "dev": true,
+ "requires": {
+ "formatio": "1.1.1",
+ "lolex": "1.3.2",
+ "samsam": "1.1.2",
+ "util": ">=0.10.3 <1"
+ }
+ },
+ "sinon-chai": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.9.0.tgz",
+ "integrity": "sha1-NNggBCvJZhoUUnEw1AHrRixJu4Q=",
+ "dev": true
+ },
+ "slide": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz",
+ "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=",
+ "dev": true
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.x.x"
+ }
+ },
+ "source-map": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz",
+ "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=",
+ "dev": true
+ },
+ "source-map-support": {
+ "version": "0.4.14",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.14.tgz",
+ "integrity": "sha1-nURjdyWYuGJxtPUj9sH04Cp9au8=",
+ "dev": true,
+ "requires": {
+ "source-map": "^0.5.6"
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.11.0.tgz",
+ "integrity": "sha1-LY1eu0pvqyj/ujf6YqkPSj6lnXc=",
+ "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="
+ }
+ }
+ },
+ "static-expiry": {
+ "version": "github:paulwalker/connect-static-expiry#2bac82d592779251e1a3dd5c71b0efdf20e3c582",
+ "from": "github:paulwalker/connect-static-expiry#2bac82d592779251e1a3dd5c71b0efdf20e3c582",
+ "requires": {
+ "@types/connect": "^3.4.30",
+ "@types/node": "^6.0.51",
+ "findit": "0.1.2",
+ "fresh": "^0.5.2"
+ },
+ "dependencies": {
+ "fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
+ }
+ }
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
+ },
+ "stream-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/stream-equal/-/stream-equal-1.0.0.tgz",
+ "integrity": "sha1-PoRdfAnxkbS836L0eCw4Oh/0/i0=",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "string-width": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz",
+ "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=",
+ "dev": true,
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^3.0.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
+ "dev": true
+ }
+ }
+ },
+ "string_decoder": {
+ "version": "0.10.31",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
+ "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
+ "dev": 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,
+ "requires": {
+ "ansi-regex": "^2.0.0"
+ }
+ },
+ "strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
+ "dev": true
+ },
+ "strip-eof": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
+ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
+ "dev": true
+ },
+ "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
+ },
+ "superagent": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-2.3.0.tgz",
+ "integrity": "sha1-cDUpoHFOV+EjlZ3e+84ZOy5Q0RU=",
+ "dev": true,
+ "requires": {
+ "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"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "form-data": {
+ "version": "1.0.0-rc4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc4.tgz",
+ "integrity": "sha1-BaxrwiIntD5EYfSIFhVUaZ1Pi14=",
+ "dev": true,
+ "requires": {
+ "async": "^1.5.2",
+ "combined-stream": "^1.0.5",
+ "mime-types": "^2.1.10"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ }
+ }
+ },
+ "supertest": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/supertest/-/supertest-2.0.1.tgz",
+ "integrity": "sha1-oFgIHXiPFRXUcA11Aogea3WeRM0=",
+ "dev": true,
+ "requires": {
+ "methods": "1.x",
+ "superagent": "^2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": true
+ },
+ "term-size": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-0.1.1.tgz",
+ "integrity": "sha1-hzYLljlsq1dgljcUzaDQy+7K2co=",
+ "dev": true,
+ "requires": {
+ "execa": "^0.4.0"
+ }
+ },
+ "timed-out": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz",
+ "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=",
+ "dev": true
+ },
+ "toidentifier": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
+ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
+ },
+ "tough-cookie": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz",
+ "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=",
+ "dev": true,
+ "requires": {
+ "punycode": "^1.4.1"
+ }
+ },
+ "traverse": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz",
+ "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk="
+ },
+ "ts-node": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-2.1.2.tgz",
+ "integrity": "sha1-RQh7ReezcbPa8E7MRw7CmoNmVeo=",
+ "dev": true,
+ "requires": {
+ "arrify": "^1.0.0",
+ "chalk": "^1.1.1",
+ "diff": "^3.1.0",
+ "make-error": "^1.1.1",
+ "minimist": "^1.2.0",
+ "mkdirp": "^0.5.1",
+ "pinkie": "^2.0.4",
+ "source-map-support": "^0.4.0",
+ "tsconfig": "^6.0.0",
+ "v8flags": "^2.0.11",
+ "xtend": "^4.0.0",
+ "yn": "^1.2.0"
+ },
+ "dependencies": {
+ "diff": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
+ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=",
+ "dev": true
+ }
+ }
+ },
+ "tsconfig": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz",
+ "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=",
+ "dev": true,
+ "requires": {
+ "strip-bom": "^3.0.0",
+ "strip-json-comments": "^2.0.0"
+ }
+ },
+ "tslint": {
+ "version": "4.5.1",
+ "resolved": "https://registry.npmjs.org/tslint/-/tslint-4.5.1.tgz",
+ "integrity": "sha1-BTVocb7yOkNJBnNABvwYgza6gks=",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "^6.20.0",
+ "colors": "^1.1.2",
+ "diff": "^3.0.1",
+ "findup-sync": "~0.3.0",
+ "glob": "^7.1.1",
+ "optimist": "~0.6.0",
+ "resolve": "^1.1.7",
+ "tsutils": "^1.1.0",
+ "update-notifier": "^2.0.0"
+ },
+ "dependencies": {
+ "diff": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz",
+ "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=",
+ "dev": true
+ },
+ "glob": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz",
+ "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=",
+ "dev": true,
+ "requires": {
+ "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"
+ }
+ }
+ }
+ },
+ "tsutils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-1.4.0.tgz",
+ "integrity": "sha1-hPioPfmWfTW/H/OqSMczlZPWThk=",
+ "dev": true
+ },
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+ "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
+ "dev": true
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "optional": true
+ },
+ "twilio": {
+ "version": "3.33.1",
+ "resolved": "https://registry.npmjs.org/twilio/-/twilio-3.33.1.tgz",
+ "integrity": "sha512-GGyNkn+0u8pQPNew8NZBacJ9gUHC/XWVmrA6+dxnK17QCmq1pjEj4RBq3BB/IOowoyd8yHwClasjwh9FISqziA==",
+ "requires": {
+ "@types/express": "^4.16.1",
+ "deprecate": "1.0.0",
+ "jsonwebtoken": "^8.5.1",
+ "lodash": "^4.17.11",
+ "moment": "^2.24.0",
+ "q": "2.0.x",
+ "request": "^2.88.0",
+ "rootpath": "0.1.2",
+ "scmp": "2.0.0",
+ "xmlbuilder": "9.0.1"
+ },
+ "dependencies": {
+ "@types/express": {
+ "version": "4.17.0",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.0.tgz",
+ "integrity": "sha512-CjaMu57cjgjuZbh9DpkloeGxV45CnMGlVd+XpG7Gm9QgVrd7KFq+X4HY0vM+2v0bczS48Wg7bvnMY5TN+Xmcfw==",
+ "requires": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "*",
+ "@types/serve-static": "*"
+ }
+ }
+ }
+ },
+ "type-detect": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-1.0.0.tgz",
+ "integrity": "sha1-diIXzAbbJY7EiQihKY6LlRIejqI=",
+ "dev": true
+ },
+ "type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "dependencies": {
+ "mime-db": {
+ "version": "1.40.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
+ "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
+ },
+ "mime-types": {
+ "version": "2.1.24",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
+ "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
+ "requires": {
+ "mime-db": "1.40.0"
+ }
+ }
+ }
+ },
+ "typescript": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.2.2.tgz",
+ "integrity": "sha1-YGAiUIR5tV/6NotY/uljoD39eww=",
+ "dev": true
+ },
+ "unique-string": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz",
+ "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=",
+ "dev": true,
+ "requires": {
+ "crypto-random-string": "^1.0.0"
+ }
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
+ },
+ "unzip-response": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz",
+ "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=",
+ "dev": true
+ },
+ "update-notifier": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.1.0.tgz",
+ "integrity": "sha1-7AweU1NrdmR6JLd8uDlm2TFRI9k=",
+ "dev": true,
+ "requires": {
+ "boxen": "^1.0.0",
+ "chalk": "^1.0.0",
+ "configstore": "^3.0.0",
+ "is-npm": "^1.0.0",
+ "latest-version": "^3.0.0",
+ "lazy-req": "^2.0.0",
+ "semver-diff": "^2.0.0",
+ "xdg-basedir": "^3.0.0"
+ }
+ },
+ "uri-js": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "requires": {
+ "punycode": "^2.1.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+ }
+ }
+ },
+ "url-parse-lax": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz",
+ "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=",
+ "dev": true,
+ "requires": {
+ "prepend-http": "^1.0.1"
+ }
+ },
+ "user-home": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz",
+ "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=",
+ "dev": true
+ },
+ "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"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
+ "dev": 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
+ },
+ "utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
+ },
+ "uuid": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
+ },
+ "v8flags": {
+ "version": "2.0.12",
+ "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.0.12.tgz",
+ "integrity": "sha1-cyNdn3F2+OiDP7KGeVRF95ONhOU=",
+ "dev": true,
+ "requires": {
+ "user-home": "^1.1.1"
+ }
+ },
+ "vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
+ },
+ "verror": {
+ "version": "1.3.6",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz",
+ "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=",
+ "requires": {
+ "extsprintf": "1.0.2"
+ }
+ },
+ "weak-map": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/weak-map/-/weak-map-1.0.5.tgz",
+ "integrity": "sha1-eWkVhNmGB/UHC9O3CkDmuyLkAes="
+ },
+ "which": {
+ "version": "1.2.14",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz",
+ "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "widest-line": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz",
+ "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=",
+ "dev": true,
+ "requires": {
+ "string-width": "^1.0.1"
+ },
+ "dependencies": {
+ "string-width": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+ "dev": true,
+ "requires": {
+ "code-point-at": "^1.0.0",
+ "is-fullwidth-code-point": "^1.0.0",
+ "strip-ansi": "^3.0.0"
+ }
+ }
+ }
+ },
+ "wordwrap": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
+ "dev": true
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "write-file-atomic": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.1.tgz",
+ "integrity": "sha1-fUW6MjFjKN0ex9kPYOvA2EW7dZo=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "imurmurhash": "^0.1.4",
+ "slide": "^1.1.5"
+ }
+ },
+ "xdg-basedir": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz",
+ "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=",
+ "dev": true
+ },
+ "xmlbuilder": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.1.tgz",
+ "integrity": "sha1-kc1wiXdVNj66V8Et3uq0o0GmH2U="
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
+ "dev": true
+ },
+ "yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
+ "dev": true
+ },
+ "yn": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/yn/-/yn-1.2.0.tgz",
+ "integrity": "sha1-0jekxTPyebK4nTrKwttLjHleSmM=",
+ "dev": true
+ }
+ }
+}
diff --git a/package.json b/package.json
index b5848cb..e17e6b6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "twilio-interactive-flow",
- "version": "0.8.1",
+ "version": "0.8.2",
"description": "Easily build phone/sms trees with twilio and express.",
"license": "MIT",
"repository": {
@@ -64,13 +64,12 @@
"@types/debug": "0.0.29",
"@types/express": "^4.0.34",
"@types/ramda": "0.0.5",
- "@types/twilio": "0.0.8",
- "body-parser": "^1.15.2",
+ "body-parser": "^1.19.0",
"debug": "^2.2.0",
- "express": "^4.14.0",
+ "express": "^4.17.1",
"ramda": "^0.23.0",
- "static-expiry": "paulwalker/connect-static-expiry#f18d288a6a5ccaff07c9805c498a9a79e6473f99",
- "twilio": "ethanresnick/twilio-node#patch-1"
+ "static-expiry": "paulwalker/connect-static-expiry#2bac82d592779251e1a3dd5c71b0efdf20e3c582",
+ "twilio": "^3.33.1"
},
"devDependencies": {
"@types/chai": "3.4.35",
diff --git a/test/fixtures/states.ts b/test/fixtures/states.ts
index a02cf6f..bd77830 100644
--- a/test/fixtures/states.ts
+++ b/test/fixtures/states.ts
@@ -1,7 +1,8 @@
import * as State from "../../lib/state";
-import { TwimlResponse } from "twilio";
+import twilio = require('twilio')
+const VoiceResponse = twilio.twiml.VoiceResponse;
-const emptyTwimlFn = () => new TwimlResponse();
+const emptyTwimlFn = () => (new VoiceResponse()).toString();
export const d = {
name: "d",
diff --git a/test/integration/errorHandlingSpec.ts b/test/integration/errorHandlingSpec.ts
index 084a8b1..0df9129 100644
--- a/test/integration/errorHandlingSpec.ts
+++ b/test/integration/errorHandlingSpec.ts
@@ -26,7 +26,7 @@ describe("error handling (at component integration points)", () => {
}
];
- const app = lib(statesWithInvalidTransition, {twilio: { authToken: "", validate: false}});
+ const app = lib(statesWithInvalidTransition, { twilio: { authToken: "", validate: false }});
app.use(function(err, req, res, next) {
res.status(500).send('error handler reached');
});
diff --git a/test/integration/requestValidationSpec.ts b/test/integration/requestValidationSpec.ts
index 7d505e2..179c0f0 100644
--- a/test/integration/requestValidationSpec.ts
+++ b/test/integration/requestValidationSpec.ts
@@ -102,4 +102,4 @@ const makeInvalidSignature = R.pipe(
R.split(''),
R.map((c: string) => String.fromCharCode(c.charCodeAt(0) + 1)),
R.join('')
-);
\ No newline at end of file
+);
diff --git a/test/integration/stateRoutingSpec.ts b/test/integration/stateRoutingSpec.ts
index 3bc7a13..65aa84b 100644
--- a/test/integration/stateRoutingSpec.ts
+++ b/test/integration/stateRoutingSpec.ts
@@ -2,10 +2,9 @@ import sinon = require("sinon");
import sinonChai = require("sinon-chai");
import { expect, use as chaiUse } from "chai";
import request = require("supertest");
-import twilio = require("twilio");
-import "../../lib/twilioAugments";
import lib from "../../lib/";
import { values as objectValues } from "../../lib/util/objectValuesEntries";
+import * as express from "express"
import {
RoutableState, BranchingState, NormalState, AsynchronousState,
@@ -19,7 +18,7 @@ const states: any = {
routableBranching: {
name: "CALL_RECEIVED_BRANCH",
uri: "/routable-branching",
- transitionOut: (((input?: twilio.CallDataTwiml) => {
+ transitionOut: (((req: express.Request, input?: any) => {
return input && input.CallerZip === "00000" ?
states.nonRoutableBranching :
states.routableEnd;
@@ -30,10 +29,10 @@ const states: any = {
name: "CALL_RECEIVED_RENDER",
uri: "/routable-normal",
processTransitionUri: "/process-renderable-entry",
- twimlFor(urlFor: urlFor, input?: twilio.CallDataTwiml) {
+ twimlFor(urlFor: urlFor, req: express.Request, input?: any) {
return "input to routableNormal was: " + JSON.stringify(input);
},
- transitionOut(input?: twilio.CallDataTwiml) {
+ transitionOut(req: express.Request, input?: any) {
return Promise.resolve(states.nonRoutableNormal);
}
},
@@ -42,7 +41,7 @@ const states: any = {
name: "CALL_RECEIVED_END",
uri: "/routable-end",
isEndState: true,
- twimlFor(urlFor: urlFor, input?: twilio.CallDataTwiml) {
+ twimlFor(urlFor: urlFor, req: express.Request, input?: any) {
return "Sorry, no one home. Bye.";
}
},
@@ -50,7 +49,7 @@ const states: any = {
routableAsync: {
name: "CALL_RECEIVED_ASYNC",
uri: "/routable-async",
- twimlFor(urlFor: urlFor, input?: twilio.CallDataTwiml) {
+ twimlFor(urlFor: urlFor, req: express.Request, input?: any) {
return "We're doing something...";
},
backgroundTrigger() { return "do some effect..."; }
@@ -58,14 +57,14 @@ const states: any = {
nonRoutableBranching: {
name: "INNER_BRANCH",
- transitionOut: (((input?: twilio.CallDataTwiml) => {
+ transitionOut: (((req: express.Request, input?: any) => {
return states.nonRoutableNormal;
}))
},
nonRoutableBranching2: {
name: "INNER_BRANCH_2",
- transitionOut: (((input?: twilio.CallDataTwiml) => {
+ transitionOut: (((req: express.Request, input?: any) => {
return Promise.resolve(states.routableAsync);
}))
},
@@ -73,10 +72,10 @@ const states: any = {
nonRoutableNormal: {
name: "INNER_RENDER",
processTransitionUri: "/process-inner-renderable",
- twimlFor(urlFor: urlFor, input?: twilio.CallDataTwiml) {
+ twimlFor(urlFor: urlFor, req: express.Request, input?: any) {
return "input to nonRoutableNormal was: " + JSON.stringify(input);
},
- transitionOut(input?: twilio.CallDataTwiml) {
+ transitionOut(req: express.Request, input?: any) {
return Promise.resolve(states.nonRoutableBranching2);
}
}
@@ -114,15 +113,14 @@ describe("state routing & rendering", () => {
it("should pass input to the first transitionOut, but not subsequent ones", () => {
return requestApp
- .post("/routable-branching")
+ .post("/routable-branching") // can i get the request object anywhere?
.type("form")
.send({CallerZip: "00000"})
.then(() => {
expect(states.routableBranching.transitionOut)
- .calledWithExactly({CallerZip: "00000"});
-
+ .calledWithExactly(sinon.match.any, { CallerZip: "00000" });
expect(states.nonRoutableBranching.transitionOut)
- .calledWithExactly(undefined);
+ .calledWithExactly(sinon.match.any, undefined);
});
});
@@ -133,7 +131,7 @@ describe("state routing & rendering", () => {
.send({CallerZip: "00000"})
.then(() => {
expect(states.nonRoutableNormal.twimlFor)
- .calledWithExactly(sinon.match.func, undefined);
+ .calledWithExactly(sinon.match.func, sinon.match.any, undefined);
});
});
@@ -145,10 +143,10 @@ describe("state routing & rendering", () => {
.expect("Sorry, no one home. Bye.")
.then(() => {
expect(states.routableBranching.transitionOut)
- .calledWithExactly({CallerZip: ""});
+ .calledWithExactly(sinon.match.any, {CallerZip: ""});
expect(states.routableEnd.twimlFor)
- .calledWithExactly(sinon.match.func, undefined);
+ .calledWithExactly(sinon.match.func, sinon.match.any, undefined);
});
});
});
@@ -202,7 +200,7 @@ describe("state routing & rendering", () => {
// Below, we quote "true" in recognition of the fact that
// all data is converted to strings as part of POSTing it.
expect(states.routableAsync.backgroundTrigger)
- .calledWithExactly(sinon.match.func, {"Test": "true"});
+ .calledWithExactly(sinon.match.func, sinon.match.any, {"Test": "true"});
});
});
});
@@ -235,20 +233,22 @@ describe("state routing & rendering", () => {
.send(dummyData)
.then(() => {
expect(states.routableNormal.transitionOut)
- .calledWithExactly(dummyData);
+ .calledWithExactly(sinon.match.any, dummyData);
});
});
- it("should find the next renderable state, branching without passing along input", () => {
- return requestApp
- .post(states.nonRoutableNormal.processTransitionUri)
- .type("form")
- .send(dummyData)
- .then(() => {
- expect(states.nonRoutableBranching2.transitionOut)
- .calledWithExactly(undefined);
- });
- });
+ // NOTE: (EL) current hotline code relies on req.body being passed through,
+ // so i'm going to do that for now
+ // it("should find the next renderable state, branching without passing along input", () => {
+ // return requestApp
+ // .post(states.nonRoutableNormal.processTransitionUri)
+ // .type("form")
+ // .send(dummyData)
+ // .then(() => {
+ // expect(states.nonRoutableBranching2.transitionOut)
+ // .calledWithExactly(undefined, {});
+ // });
+ // });
it("should not call transitionOut if the next state's already renderable", () => {
return requestApp
@@ -260,25 +260,27 @@ describe("state routing & rendering", () => {
});
});
- it("should render the next state, with no input provided, calling bgTrigger if relevant", () => {
- return Promise.all([
- requestApp
- .post(states.routableNormal.processTransitionUri)
- .type("form")
- .send(dummyData)
- .expect("input to nonRoutableNormal was: undefined"),
-
- requestApp
- .post(states.nonRoutableNormal.processTransitionUri)
- .type("form")
- .send(dummyData)
- .expect("We're doing something...")
- .then(() => {
- expect(states.routableAsync.twimlFor)
- .calledWithExactly(sinon.match.func, undefined);
- })
- ]);
- });
+ // NOTE: (EL) current hotline code relies on req.body being passed through,
+ // so i'm going to do that for now
+ // it("should render the next state, with no input provided, calling bgTrigger if relevant", () => {
+ // return Promise.all([
+ // requestApp
+ // .post(states.routableNormal.processTransitionUri)
+ // .type("form")
+ // .send(dummyData)
+ // .expect("input to nonRoutableNormal was: undefined"),
+ //
+ // requestApp
+ // .post(states.nonRoutableNormal.processTransitionUri)
+ // .type("form")
+ // .send(dummyData)
+ // .expect("We're doing something...")
+ // .then(() => {
+ // expect(states.routableAsync.twimlFor)
+ // .calledWithExactly(sinon.match.func, undefined, {});
+ // })
+ // ]);
+ // });
});
});
diff --git a/test/integration/understandsTwimlResponseSpec.ts b/test/integration/understandsTwimlResponseSpec.ts
index 069e0f6..d4b45b6 100644
--- a/test/integration/understandsTwimlResponseSpec.ts
+++ b/test/integration/understandsTwimlResponseSpec.ts
@@ -1,5 +1,6 @@
-import twilio = require("twilio");
import request = require("supertest");
+import twilio = require('twilio')
+const VoiceResponse = twilio.twiml.VoiceResponse;
import lib from "../../lib/";
import { UsableState } from "../../lib/state";
@@ -7,7 +8,7 @@ const states: UsableState[] = [{
uri: "/returns-twiml-response",
name: "DUMMY",
isEndState: true,
- twimlFor() { return new twilio.TwimlResponse(); }
+ twimlFor() { return (new VoiceResponse()).toString(); }
}, {
uri: "/returns-twiml-string",
name: "DUMMY",
diff --git a/test/unit/indexSpec.ts b/test/unit/indexSpec.ts
index b546e6a..a14db2f 100644
--- a/test/unit/indexSpec.ts
+++ b/test/unit/indexSpec.ts
@@ -7,14 +7,14 @@ const { expect } = chai;
describe("main express app creation function", () => {
it("should return an express app", () => {
- const result = sut([], { twilio: {authToken: ""} });
+ const result = sut([], { twilio: {authToken: ''} });
expect(isExpressApp(result)).to.be.true;
});
it("should error at creation time when given a state with an invalid shape", () => {
const statesWithInvalidState = states.normalStates.concat(states.invalidStates[0]);
const makeApp = () => {
- return sut(statesWithInvalidState, {twilio: {authToken: ""}});
+ return sut(statesWithInvalidState, { twilio: {authToken: ''}});
};
expect(makeApp).to.throw(/Invalid state/);
diff --git a/test/unit/util/routeCreationHelpersSpec.ts b/test/unit/util/routeCreationHelpersSpec.ts
index c8cf96b..aef2130 100644
--- a/test/unit/util/routeCreationHelpersSpec.ts
+++ b/test/unit/util/routeCreationHelpersSpec.ts
@@ -1,7 +1,7 @@
import sinon = require("sinon");
import sinonChai = require("sinon-chai");
import { expect, use as chaiUse } from "chai";
-import { CallDataTwiml } from "twilio";
+import * as express from "express";
import "../../../lib/twilioAugments";
import * as sut from "../../../lib/util/routeCreationHelpers";
import * as State from "../../../lib/state";
@@ -16,7 +16,7 @@ describe("route creation utilities", () => {
describe("handling renderable input states", () => {
it("should return a promise for the input state", () => {
const results: any[] = states.renderableStates.map(state =>
- [state, sut.resolveBranches(state, {})]
+ [state, sut.resolveBranches(state, {}, {})]
);
const assertions = results.map(([state, resultPromise]) => {
@@ -56,20 +56,20 @@ describe("route creation utilities", () => {
})
it("should pass any input data to the first non-renderable state, but not subsequent ones", () => {
- return sut.resolveBranches(i, {}).then(state => {
- expect(i.transitionOut).calledWithExactly({});
- expect(h.transitionOut).calledWithExactly(undefined);
+ return sut.resolveBranches(i, {}, {}).then(state => {
+ expect(i.transitionOut).calledWithExactly(sinon.match.any, {});
+ expect(h.transitionOut).calledWithExactly(sinon.match.any, undefined);
});
});
it("should finally return a promise for the first renderable state", () => {
- return sut.resolveBranches(i, {}).then(state => {
+ return sut.resolveBranches(i, {}, {}).then(state => {
expect(state.name).to.equal("g");
});
});
it("should not call transition out on the renderable state, once found", () => {
- return sut.resolveBranches(i, {}).then(state => {
+ return sut.resolveBranches(i, {}, {}).then(state => {
expect(g.transitionOut).to.not.have.been.called;
});
});
diff --git a/typings/index.d.ts b/typings/index.d.ts
index 7a1295f..669530a 100644
--- a/typings/index.d.ts
+++ b/typings/index.d.ts
@@ -1 +1,2 @@
// Add module typings here that aren't on @types.
+declare module "twilio"