├── .editorconfig ├── .gitignore ├── README.md ├── package.json ├── src ├── example.ts ├── helpers │ ├── example.ts │ ├── express.ts │ └── other.ts └── index.ts ├── tsconfig.json ├── tslint.json └── yarn.lock /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | indent_style = space 3 | indent_size = 4 4 | insert_final_newline = true 5 | trim_trailing_whitespace = true 6 | 7 | [package.json] 8 | indent_size = 2 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules/ 2 | /target/ 3 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # express-fp 2 | 3 | Type safe request handlers for [Express]. TypeScript compatible. 4 | 5 | - Validate Express requests (body and query objects) using [io-ts]. 6 | - Construct Express responses without mutation using [express-result-types]. 7 | 8 | ## Example 9 | 10 | Below is small example that demonstrates request body and query validation using [io-ts] and fully typed response construction using [express-result-types]. 11 | 12 | [See the full example](./src/example.ts). 13 | 14 | ``` ts 15 | const Body = t.interface({ 16 | name: t.string, 17 | }); 18 | 19 | const Query = t.interface({ 20 | age: NumberFromString, 21 | }); 22 | 23 | const requestHandler = wrap(req => { 24 | const jsonBody = req.body.asJson(); 25 | 26 | const maybeQuery = Query.decode({ 27 | age: req.query.get('age').toNullable(), 28 | }).mapLeft(formatValidationErrors('query')); 29 | 30 | const maybeBody = jsonBody.chain(jsValue => 31 | jsValue.validate(Body).mapLeft(formatValidationErrors('body')), 32 | ); 33 | 34 | return maybeQuery 35 | .chain(query => maybeBody.map(body => ({ query, body }))) 36 | .map(({ query, body }) => 37 | Ok.apply( 38 | new JsValue({ 39 | // We defined the shape of the request body and the request query parameter 40 | // 'age' for validation purposes, but it also gives us static types! For 41 | // example, here the type checker knows the types: 42 | // - `body.name` is type `string` 43 | // - `age` is type `number` 44 | name: body.name, 45 | age: query.age, 46 | }), 47 | jsValueWriteable, 48 | ), 49 | ) 50 | .getOrElseL(error => BadRequest.apply(new JsValue(error), jsValueWriteable)); 51 | }); 52 | 53 | app.post('/', requestHandler); 54 | 55 | // ❯ curl --request POST --silent --header 'Content-Type: application/json' \ 56 | // --data '{ "name": "bob" }' "localhost:8080/" | jq '.' 57 | // "Validation errors for query: Expecting NumberFromString at age but instead got: null." 58 | 59 | // ❯ curl --request POST --silent --header 'Content-Type: application/json' \ 60 | // --data '{ "name": "bob" }' "localhost:8080/?age=foo" | jq '.' 61 | // "Validation errors for query: Expecting NumberFromString at age but instead got: \"foo\"." 62 | 63 | // ❯ curl --request POST --silent --header 'Content-Type: invalid' \ 64 | // --data '{ "name": "bob" }' "localhost:8080/?age=5" | jq '.' 65 | // "Expecting request header 'Content-Type' to equal 'application/json', but instead got 'invalid'." 66 | 67 | // ❯ curl --request POST --silent --header 'Content-Type: application/json' \ 68 | // --data 'invalid' "localhost:8080/?age=5" | jq '.' 69 | // "JSON parsing error: Unexpected token i in JSON at position 0" 70 | 71 | // ❯ curl --request POST --silent --header 'Content-Type: application/json' \ 72 | // --data '{ "name": 1 }' "localhost:8080/?age=5" | jq '.' 73 | // "Validation errors for body: Expecting string at name but instead got: 1." 74 | 75 | // ❯ curl --request POST --silent --header 'Content-Type: application/json' \ 76 | // --data '{ "name": "bob" }' "localhost:8080/?age=5" | jq '.' 77 | // { 78 | // "name": "bob", 79 | // "age": 5 80 | // } 81 | ``` 82 | 83 | ## Installation 84 | 85 | ``` 86 | yarn add express-fp 87 | ``` 88 | 89 | ## Development 90 | 91 | ``` 92 | yarn 93 | npm run compile 94 | npm run lint 95 | ``` 96 | 97 | [io-ts]: https://github.com/gcanti/io-ts 98 | [fp-ts]: https://github.com/gcanti/fp-ts 99 | [express-result-types]: https://github.com/OliverJAsh/express-result-types 100 | [Express]: https://expressjs.com/ 101 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "express-fp", 3 | "main": "./target/index.js", 4 | "typings": "./target/index.d.ts", 5 | "version": "0.0.15", 6 | "scripts": { 7 | "lint": "tslint --project tsconfig.json", 8 | "compile": "tsc", 9 | "start": "npm run compile && npm run lint && node ./target/example.js", 10 | "cleanTarget": "rm -rf ./target/*", 11 | "prepublishOnly": "npm run cleanTarget && npm run compile && npm run lint", 12 | "format": "prettier --write --tab-width 4 --print-width 100 --single-quote --trailing-comma all 'src/**/*.ts'" 13 | }, 14 | "files": [ 15 | "target" 16 | ], 17 | "dependencies": { 18 | "body-parser": "^1.17.2", 19 | "content-type": "^1.0.4", 20 | "express": "^4.15.3", 21 | "express-result-types": "^0.0.4", 22 | "express-session": "^1.15.4", 23 | "fp-ts": "^1.7.1", 24 | "io-ts": "^1.3.0", 25 | "io-ts-reporters": "^0.0.21" 26 | }, 27 | "devDependencies": { 28 | "@types/body-parser": "^1.16.4", 29 | "@types/content-type": "^1.1.2", 30 | "@types/express": "^4.0.36", 31 | "@types/express-session": "^1.15.1", 32 | "@types/node": "^8.0.17", 33 | "prettier": "^1.10.2", 34 | "tslint": "^5.8.0", 35 | "tslint-language-service": "^0.9.6", 36 | "typescript": "^2.7.2" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/example.ts: -------------------------------------------------------------------------------- 1 | import * as bodyParser from 'body-parser'; 2 | import * as express from 'express'; 3 | import { 4 | BadRequest, 5 | JsValue, 6 | jsValueWriteable, 7 | Ok, 8 | Result, 9 | } from 'express-result-types/target/result'; 10 | import * as session from 'express-session'; 11 | import * as http from 'http'; 12 | import * as t from 'io-ts'; 13 | 14 | import { NumberFromString } from './helpers/example'; 15 | import { formatValidationErrors } from './helpers/other'; 16 | import { wrap } from './index'; 17 | 18 | const app = express(); 19 | app.use(session({ secret: 'foo' })); 20 | // Don't parse body using middleware. Body parsing is instead handled in the request handler. 21 | app.use(bodyParser.text({ type: 'application/json' })); 22 | 23 | const Body = t.interface({ 24 | name: t.string, 25 | }); 26 | 27 | const Query = t.interface({ 28 | age: NumberFromString, 29 | }); 30 | 31 | const requestHandler = wrap(req => { 32 | const jsonBody = req.body.asJson(); 33 | 34 | const maybeQuery = Query.decode({ 35 | age: req.query.get('age').toNullable(), 36 | }).mapLeft(formatValidationErrors('query')); 37 | 38 | const maybeBody = jsonBody.chain(jsValue => 39 | jsValue.validate(Body).mapLeft(formatValidationErrors('body')), 40 | ); 41 | 42 | return maybeQuery 43 | .chain(query => maybeBody.map(body => ({ query, body }))) 44 | .map(({ query, body }) => 45 | Ok.apply( 46 | new JsValue({ 47 | // We defined the shape of the request body and the request query parameter 48 | // 'age' for validation purposes, but it also gives us static types! For 49 | // example, here the type checker knows the types: 50 | // - `body.name` is type `string` 51 | // - `age` is type `number` 52 | name: body.name, 53 | age: query.age, 54 | }), 55 | jsValueWriteable, 56 | ), 57 | ) 58 | .getOrElseL(error => BadRequest.apply(new JsValue(error), jsValueWriteable)); 59 | }); 60 | 61 | const sessionRequestHandler = wrap(req => { 62 | const maybeUserId = req.session.get('userId'); 63 | 64 | return maybeUserId.foldL( 65 | () => Ok.apply(new JsValue({}), jsValueWriteable).withSession(new Map([['userId', 'foo']])), 66 | userId => Ok.apply(new JsValue({ userId }), jsValueWriteable), 67 | ); 68 | }); 69 | 70 | app.post('/', requestHandler); 71 | app.get('/session', sessionRequestHandler); 72 | 73 | const onListen = (server: http.Server) => { 74 | const { port } = server.address(); 75 | 76 | console.log(`Server running on port ${port}`); 77 | }; 78 | 79 | const httpServer = http.createServer(app); 80 | httpServer.listen(8080, () => { 81 | onListen(httpServer); 82 | }); 83 | 84 | // ❯ curl --request POST --silent --header 'Content-Type: application/json' \ 85 | // --data '{ "name": "bob" }' "localhost:8080/" | jq '.' 86 | // "Validation errors for query: Expecting NumberFromString at age but instead got: null." 87 | 88 | // ❯ curl --request POST --silent --header 'Content-Type: application/json' \ 89 | // --data '{ "name": "bob" }' "localhost:8080/?age=foo" | jq '.' 90 | // "Validation errors for query: Expecting NumberFromString at age but instead got: \"foo\"." 91 | 92 | // ❯ curl --request POST --silent --header 'Content-Type: invalid' \ 93 | // --data '{ "name": "bob" }' "localhost:8080/?age=5" | jq '.' 94 | // "Expecting request header 'Content-Type' to equal 'application/json', but instead got 'invalid'." 95 | 96 | // ❯ curl --request POST --silent --header 'Content-Type: application/json' \ 97 | // --data 'invalid' "localhost:8080/?age=5" | jq '.' 98 | // "JSON parsing error: Unexpected token i in JSON at position 0" 99 | 100 | // ❯ curl --request POST --silent --header 'Content-Type: application/json' \ 101 | // --data '{ "name": 1 }' "localhost:8080/?age=5" | jq '.' 102 | // "Validation errors for body: Expecting string at name but instead got: 1." 103 | 104 | // ❯ curl --request POST --silent --header 'Content-Type: application/json' \ 105 | // --data '{ "name": "bob" }' "localhost:8080/?age=5" | jq '.' 106 | // { 107 | // "name": "bob", 108 | // "age": 5 109 | // } 110 | -------------------------------------------------------------------------------- /src/helpers/example.ts: -------------------------------------------------------------------------------- 1 | import * as t from 'io-ts'; 2 | 3 | export const NumberFromString = new t.Type( 4 | 'NumberFromString', 5 | t.number.is, 6 | (m, c) => 7 | t.string.validate(m, c).chain(s => { 8 | const n = parseFloat(s); 9 | return isNaN(n) ? t.failure(s, c) : t.success(n); 10 | }), 11 | String, 12 | ); 13 | -------------------------------------------------------------------------------- /src/helpers/express.ts: -------------------------------------------------------------------------------- 1 | import * as express from 'express'; 2 | 3 | // TODO: Share 4 | // Wrap to catch promise rejections and pass to error handling middleware 5 | export type AsyncRequestHandler = (req: express.Request, res: express.Response) => Promise; 6 | export type wrapAsyncRequestHandler = (( 7 | asyncRequestHandler: AsyncRequestHandler, 8 | ) => express.RequestHandler); 9 | export const wrapAsyncRequestHandler: wrapAsyncRequestHandler = promiseFn => (req, res, next) => 10 | promiseFn(req, res).catch(next); 11 | -------------------------------------------------------------------------------- /src/helpers/other.ts: -------------------------------------------------------------------------------- 1 | import * as array from 'fp-ts/lib/Array'; 2 | import * as option from 'fp-ts/lib/Option'; 3 | import * as t from 'io-ts'; 4 | import { formatValidationError } from 'io-ts-reporters/target/src'; 5 | 6 | import Option = option.Option; 7 | 8 | const formatValidationErrorAll = (validationErrors: t.ValidationError[]) => 9 | array.catOptions(validationErrors.map(formatValidationError)); 10 | 11 | export const formatValidationErrors = (context: string) => ( 12 | validationErrors: t.ValidationError[], 13 | ) => `Validation errors for ${context}: ${formatValidationErrorAll(validationErrors).join(', ')}`; 14 | 15 | export class SafeMutableMap { 16 | map: Map; 17 | constructor(entries?: [K, V][]) { 18 | this.map = new Map(entries); 19 | } 20 | 21 | get(key: K): Option { 22 | return option.fromNullable(this.map.get(key)); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import * as contentType from 'content-type' 2 | import * as express from 'express'; 3 | import { Result } from 'express-result-types/target/result'; 4 | import { applyResultToExpress, ExpressRequestSession } from 'express-result-types/target/wrap'; 5 | import * as either from 'fp-ts/lib/Either'; 6 | import * as t from 'io-ts'; 7 | 8 | import { wrapAsyncRequestHandler } from './helpers/express'; 9 | 10 | import Either = either.Either; 11 | import { SafeMutableMap } from './helpers/other'; 12 | 13 | export class JsValue { 14 | constructor(private value: {}) {} 15 | 16 | // https://www.playframework.com/documentation/2.6.x/ScalaJson#Using-validation 17 | validate(type: t.Type): Either { 18 | return type.decode(this.value); 19 | } 20 | } 21 | 22 | enum Header { 23 | ContentType = 'Content-Type', 24 | } 25 | 26 | enum ContentType { 27 | ApplicationJson = 'application/json', 28 | } 29 | 30 | // https://www.playframework.com/documentation/2.6.x/ScalaBodyParsers#The-default-body-parser 31 | // https://playframework.com/documentation/2.6.x/api/scala/index.html#play.api.mvc.AnyContent 32 | export class AnyContent { 33 | constructor(private req: express.Request) {} 34 | 35 | asText(): string { 36 | // TODO: How to enforce string? Don't use body parser middleware? 37 | return this.req.body; 38 | } 39 | 40 | asJson(): Either { 41 | return either.tryCatch(() => contentType.parse(this.req)) 42 | .mapLeft(error => `Cannot parse ${Header.ContentType} header: ${error.message}`) 43 | .chain(parsed => 44 | parsed.type !== ContentType.ApplicationJson 45 | ? either.left( 46 | `Expecting request header '${Header.ContentType}' to have MIME type '${ContentType.ApplicationJson}' but got '${parsed.type}'.`, 47 | ) 48 | : either.right(contentType) 49 | ) 50 | .chain(() => 51 | either.tryCatch((): {} => 52 | JSON.parse( 53 | // TODO: How to enforce string? Don't use body parser middleware? 54 | this.req.body, 55 | ) 56 | ) 57 | .map(json => new JsValue(json)) 58 | .mapLeft(error => `JSON parsing error: ${error.message}`) 59 | ) 60 | } 61 | } 62 | 63 | export class SafeRequest { 64 | constructor(private req: express.Request) {} 65 | 66 | ip = this.req.ip; 67 | 68 | body = new AnyContent(this.req); 69 | 70 | // https://playframework.com/documentation/2.6.x/api/scala/index.html#play.api.mvc.Request@queryString:Map[String,Seq[String]] 71 | // http://expressjs.com/en/api.html#req.query 72 | query = (() => { 73 | // We presume Express is using the default query string parser, Node's native `querystring`. 74 | const query: { [key: string]: string | string[] } = this.req.query; 75 | 76 | return new SafeMutableMap(Object.entries(query)); 77 | })(); 78 | 79 | session = (() => { 80 | const maybeSessionData: ExpressRequestSession['data'] | undefined = 81 | this.req.session !== undefined 82 | ? // We presume the session was defined using `Result.withSession`. 83 | this.req.session.data as ExpressRequestSession['data'] 84 | : undefined; 85 | 86 | return new SafeMutableMap( 87 | Object.entries(maybeSessionData !== undefined ? maybeSessionData : {}), 88 | ); 89 | })(); 90 | } 91 | export type SafeRequestHandler = (req: SafeRequest) => Result; 92 | export type wrap = (safeRequestHandler: SafeRequestHandler) => express.RequestHandler; 93 | export const wrap: wrap = safeRequestHandler => (req, res) => { 94 | const safeRequest = new SafeRequest(req); 95 | const result = safeRequestHandler(safeRequest); 96 | applyResultToExpress({ req, res, result }); 97 | }; 98 | 99 | export type SafeRequestHandlerAsync = (req: SafeRequest) => Promise; 100 | export type wrapAsync = (safeRequestHandler: SafeRequestHandlerAsync) => express.RequestHandler; 101 | export const wrapAsync: wrapAsync = safeRequestHandler => 102 | wrapAsyncRequestHandler((req, res) => { 103 | const safeRequest = new SafeRequest(req); 104 | const resultPromise = safeRequestHandler(safeRequest); 105 | return resultPromise.then(result => { 106 | applyResultToExpress({ req, res, result }); 107 | }); 108 | }); 109 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "noImplicitAny": true, 6 | "strict": true, 7 | "noImplicitReturns": true, 8 | "noImplicitThis": true, 9 | // "noUnusedLocals": true, 10 | // "noUnusedParameters": true, 11 | "sourceMap": true, 12 | 13 | "outDir": "./target/", 14 | "plugins": [ 15 | { "name": "tslint-language-service" } 16 | ], 17 | "lib": [ 18 | "es2015", 19 | "es2017.object" 20 | ], 21 | "declaration": true 22 | }, 23 | "files": [ 24 | "./src/index.ts", 25 | "./src/example.ts" 26 | ] 27 | } 28 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "linterOptions": { 3 | "exclude": ["**/node_modules/**/*"] 4 | }, 5 | "rules": { 6 | "no-any": true, 7 | 8 | // Conflicts with `no-unused-variable` rule 9 | // https://github.com/palantir/tslint/issues/2728#issuecomment-317262259 10 | // "no-unsafe-any": true, 11 | 12 | // - Not currently supported by tslint-language-service 13 | // https://github.com/palantir/tslint/issues/2649 14 | // - This rule causes false positive errors when used with no-inferred-empty-object-type, 15 | // no-unsafe-any 16 | // https://github.com/palantir/tslint/issues/2728#issuecomment-317262259 17 | "no-unused-variable": [true, "check-parameters"], 18 | 19 | "strict-boolean-expressions": true, 20 | "ordered-imports": [true, { 21 | "grouped-imports": true 22 | }], 23 | "no-inferrable-types": [true, "ignore-properties"], 24 | "no-switch-case-fall-through": true, 25 | "arrow-return-shorthand": [true, "multiline"], 26 | "no-use-before-declare": true, 27 | "no-inferred-empty-object-type": true, 28 | "unified-signatures": true, 29 | "no-conditional-assignment": true, 30 | "no-floating-promises": true, 31 | "no-object-literal-type-assertion": true, 32 | "no-shadowed-variable": true, 33 | "no-unbound-method": [true, "ignore-static"], 34 | "no-unused-expression": true, 35 | "no-var-keyword": true, 36 | "no-void-expression": true, 37 | "prefer-object-spread": true, 38 | "radix": true, 39 | "restrict-plus-operands": true, 40 | "triple-equals": true, 41 | "typeof-compare": true, 42 | "use-default-type-parameter": true, 43 | "use-isnan": true, 44 | "deprecation": true, 45 | "max-file-line-count": [true, 400], 46 | // Rationale: https://github.com/palantir/tslint/issues/1182#issue-151780453 47 | "no-default-export": true, 48 | "prefer-const": true, 49 | "class-name": true, 50 | "match-default-export-name": true, 51 | "no-boolean-literal-compare": true, 52 | "no-consecutive-blank-lines": true, 53 | "no-irregular-whitespace": true, 54 | "no-unnecessary-callback-wrapper": true, 55 | "object-literal-shorthand": true, 56 | "prefer-switch": true, 57 | "prefer-template": true, 58 | "quotemark": [true, "single", "avoid-escape"], 59 | "variable-name": [ 60 | true, 61 | "ban-keywords", 62 | "check-format", 63 | // e.g. for whitelisting unused function parameters 64 | "allow-leading-underscore", 65 | // e.g. for io-ts types 66 | "allow-pascal-case" 67 | ], 68 | "no-import-side-effect": true, 69 | "no-duplicate-imports": true, 70 | "no-implicit-dependencies": [true, "dev"] 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/body-parser@*", "@types/body-parser@^1.16.4": 6 | version "1.17.0" 7 | resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.17.0.tgz#9f5c9d9bd04bb54be32d5eb9fc0d8c974e6cf58c" 8 | integrity sha512-a2+YeUjPkztKJu5aIF2yArYFQQp8d51wZ7DavSHjFuY1mqVgidGyzEQ41JIVNy82fXj8yPgy2vJmfIywgESW6w== 9 | dependencies: 10 | "@types/connect" "*" 11 | "@types/node" "*" 12 | 13 | "@types/connect@*": 14 | version "3.4.32" 15 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.32.tgz#aa0e9616b9435ccad02bc52b5b454ffc2c70ba28" 16 | integrity sha512-4r8qa0quOvh7lGD0pre62CAb1oni1OO6ecJLGCezTmhQ8Fz50Arx9RUszryR8KlgK6avuSXvviL6yWyViQABOg== 17 | dependencies: 18 | "@types/node" "*" 19 | 20 | "@types/content-type@^1.1.2": 21 | version "1.1.2" 22 | resolved "https://registry.yarnpkg.com/@types/content-type/-/content-type-1.1.2.tgz#bff0a1b7aa5bd48516c8ed7a6efefb1e85813245" 23 | integrity sha512-w2d7fBCYbCBUBTGtkC4JfX1FicTtgEmq7wTTjc7rC5RA/JdB1Bi7o88nKzUqAnIIBXJVmq0n4tTmF3PJN8QqCg== 24 | 25 | "@types/events@*": 26 | version "1.2.0" 27 | resolved "https://registry.yarnpkg.com/@types/events/-/events-1.2.0.tgz#81a6731ce4df43619e5c8c945383b3e62a89ea86" 28 | integrity sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA== 29 | 30 | "@types/express-serve-static-core@*": 31 | version "4.16.0" 32 | resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.0.tgz#fdfe777594ddc1fe8eb8eccce52e261b496e43e7" 33 | integrity sha512-lTeoCu5NxJU4OD9moCgm0ESZzweAx0YqsAcab6OB0EB3+As1OaHtKnaGJvcngQxYsi9UNv0abn4/DRavrRxt4w== 34 | dependencies: 35 | "@types/events" "*" 36 | "@types/node" "*" 37 | "@types/range-parser" "*" 38 | 39 | "@types/express-session@^1.15.1": 40 | version "1.15.11" 41 | resolved "https://registry.yarnpkg.com/@types/express-session/-/express-session-1.15.11.tgz#49bca7a8fb5c00402907e8ec0d3546ee28de2c41" 42 | integrity sha512-BRgOXYBhmt71CuOR/PQvKBRgcS567xJmE7dT3r/FvTmWc1ZsR5joVH32dgH+z6F4FugniF04tMyXc4UF9M8Hfg== 43 | dependencies: 44 | "@types/events" "*" 45 | "@types/express" "*" 46 | "@types/node" "*" 47 | 48 | "@types/express@*", "@types/express@^4.0.36": 49 | version "4.16.0" 50 | resolved "https://registry.yarnpkg.com/@types/express/-/express-4.16.0.tgz#6d8bc42ccaa6f35cf29a2b7c3333cb47b5a32a19" 51 | integrity sha512-TtPEYumsmSTtTetAPXlJVf3kEqb6wZK0bZojpJQrnD/djV4q1oB6QQ8aKvKqwNPACoe02GNiy5zDzcYivR5Z2w== 52 | dependencies: 53 | "@types/body-parser" "*" 54 | "@types/express-serve-static-core" "*" 55 | "@types/serve-static" "*" 56 | 57 | "@types/mime@*": 58 | version "2.0.0" 59 | resolved "https://registry.yarnpkg.com/@types/mime/-/mime-2.0.0.tgz#5a7306e367c539b9f6543499de8dd519fac37a8b" 60 | integrity sha512-A2TAGbTFdBw9azHbpVd+/FkdW2T6msN1uct1O9bH3vTerEHKZhTXJUQXy+hNq1B0RagfU8U+KBdqiZpxjhOUQA== 61 | 62 | "@types/node@*": 63 | version "10.12.0" 64 | resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.0.tgz#ea6dcbddbc5b584c83f06c60e82736d8fbb0c235" 65 | integrity sha512-3TUHC3jsBAB7qVRGxT6lWyYo2v96BMmD2PTcl47H25Lu7UXtFH/2qqmKiVrnel6Ne//0TFYf6uvNX+HW2FRkLQ== 66 | 67 | "@types/node@^8.0.17": 68 | version "8.10.36" 69 | resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.36.tgz#eac05d576fbcd0b4ea3c912dc58c20475c08d9e4" 70 | integrity sha512-SL6KhfM7PTqiFmbCW3eVNwVBZ+88Mrzbuvn9olPsfv43mbiWaFY+nRcz/TGGku0/lc2FepdMbImdMY1JrQ+zbw== 71 | 72 | "@types/range-parser@*": 73 | version "1.2.2" 74 | resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.2.tgz#fa8e1ad1d474688a757140c91de6dace6f4abc8d" 75 | integrity sha512-HtKGu+qG1NPvYe1z7ezLsyIaXYyi8SoAVqWDZgDQ8dLrsZvSzUNCwZyfX33uhWxL/SU0ZDQZ3nwZ0nimt507Kw== 76 | 77 | "@types/serve-static@*": 78 | version "1.13.2" 79 | resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" 80 | integrity sha512-/BZ4QRLpH/bNYgZgwhKEh+5AsboDBcUdlBYgzoLX0fpj3Y2gp6EApyOlM3bK53wQS/OE1SrdSYBAbux2D1528Q== 81 | dependencies: 82 | "@types/express-serve-static-core" "*" 83 | "@types/mime" "*" 84 | 85 | accepts@~1.3.3, accepts@~1.3.5: 86 | version "1.3.5" 87 | resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" 88 | integrity sha1-63d99gEXI6OxTopywIBcjoZ0a9I= 89 | dependencies: 90 | mime-types "~2.1.18" 91 | negotiator "0.6.1" 92 | 93 | ansi-regex@^2.0.0: 94 | version "2.1.1" 95 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 96 | integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8= 97 | 98 | ansi-styles@^2.2.1: 99 | version "2.2.1" 100 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 101 | integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4= 102 | 103 | ansi-styles@^3.2.1: 104 | version "3.2.1" 105 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 106 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 107 | dependencies: 108 | color-convert "^1.9.0" 109 | 110 | argparse@^1.0.7: 111 | version "1.0.10" 112 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 113 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 114 | dependencies: 115 | sprintf-js "~1.0.2" 116 | 117 | array-flatten@1.1.1: 118 | version "1.1.1" 119 | resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" 120 | integrity sha1-ml9pkFGx5wczKPKgCJaLZOopVdI= 121 | 122 | babel-code-frame@^6.22.0: 123 | version "6.26.0" 124 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 125 | integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= 126 | dependencies: 127 | chalk "^1.1.3" 128 | esutils "^2.0.2" 129 | js-tokens "^3.0.2" 130 | 131 | balanced-match@^1.0.0: 132 | version "1.0.0" 133 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 134 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 135 | 136 | body-parser@1.18.3, body-parser@^1.17.2: 137 | version "1.18.3" 138 | resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.18.3.tgz#5b292198ffdd553b3a0f20ded0592b956955c8b4" 139 | integrity sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ= 140 | dependencies: 141 | bytes "3.0.0" 142 | content-type "~1.0.4" 143 | debug "2.6.9" 144 | depd "~1.1.2" 145 | http-errors "~1.6.3" 146 | iconv-lite "0.4.23" 147 | on-finished "~2.3.0" 148 | qs "6.5.2" 149 | raw-body "2.3.3" 150 | type-is "~1.6.16" 151 | 152 | brace-expansion@^1.1.7: 153 | version "1.1.11" 154 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 155 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 156 | dependencies: 157 | balanced-match "^1.0.0" 158 | concat-map "0.0.1" 159 | 160 | builtin-modules@^1.1.1: 161 | version "1.1.1" 162 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 163 | integrity sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8= 164 | 165 | bytes@3.0.0: 166 | version "3.0.0" 167 | resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" 168 | integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= 169 | 170 | caller-id@^0.1.0: 171 | version "0.1.0" 172 | resolved "https://registry.yarnpkg.com/caller-id/-/caller-id-0.1.0.tgz#59bdac0893d12c3871408279231f97458364f07b" 173 | integrity sha1-Wb2sCJPRLDhxQIJ5Ix+XRYNk8Hs= 174 | dependencies: 175 | stack-trace "~0.0.7" 176 | 177 | chalk@^1.1.3: 178 | version "1.1.3" 179 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 180 | integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg= 181 | dependencies: 182 | ansi-styles "^2.2.1" 183 | escape-string-regexp "^1.0.2" 184 | has-ansi "^2.0.0" 185 | strip-ansi "^3.0.0" 186 | supports-color "^2.0.0" 187 | 188 | chalk@^2.3.0: 189 | version "2.4.1" 190 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" 191 | integrity sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ== 192 | dependencies: 193 | ansi-styles "^3.2.1" 194 | escape-string-regexp "^1.0.5" 195 | supports-color "^5.3.0" 196 | 197 | color-convert@^1.9.0: 198 | version "1.9.3" 199 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 200 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 201 | dependencies: 202 | color-name "1.1.3" 203 | 204 | color-name@1.1.3: 205 | version "1.1.3" 206 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 207 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 208 | 209 | commander@^2.12.1: 210 | version "2.19.0" 211 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" 212 | integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== 213 | 214 | concat-map@0.0.1: 215 | version "0.0.1" 216 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 217 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 218 | 219 | content-disposition@0.5.2: 220 | version "0.5.2" 221 | resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.2.tgz#0cf68bb9ddf5f2be7961c3a85178cb85dba78cb4" 222 | integrity sha1-DPaLud318r55YcOoUXjLhdunjLQ= 223 | 224 | content-type@^1.0.4, content-type@~1.0.2, content-type@~1.0.4: 225 | version "1.0.4" 226 | resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz#e138cc75e040c727b1966fe5e5f8c9aee256fe3b" 227 | integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA== 228 | 229 | cookie-signature@1.0.6: 230 | version "1.0.6" 231 | resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" 232 | integrity sha1-4wOogrNCzD7oylE6eZmXNNqzriw= 233 | 234 | cookie@0.3.1: 235 | version "0.3.1" 236 | resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb" 237 | integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s= 238 | 239 | crc@3.4.4: 240 | version "3.4.4" 241 | resolved "https://registry.yarnpkg.com/crc/-/crc-3.4.4.tgz#9da1e980e3bd44fc5c93bf5ab3da3378d85e466b" 242 | integrity sha1-naHpgOO9RPxck79as9ozeNheRms= 243 | 244 | debug@2.6.7: 245 | version "2.6.7" 246 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e" 247 | integrity sha1-krrR9tBbu2u6Isyoi80OyJTChh4= 248 | dependencies: 249 | ms "2.0.0" 250 | 251 | debug@2.6.9: 252 | version "2.6.9" 253 | resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" 254 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 255 | dependencies: 256 | ms "2.0.0" 257 | 258 | depd@~1.1.0, depd@~1.1.1, depd@~1.1.2: 259 | version "1.1.2" 260 | resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" 261 | integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= 262 | 263 | destroy@~1.0.4: 264 | version "1.0.4" 265 | resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" 266 | integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= 267 | 268 | diff@^3.2.0: 269 | version "3.5.0" 270 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 271 | integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA== 272 | 273 | ee-first@1.1.1: 274 | version "1.1.1" 275 | resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" 276 | integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= 277 | 278 | encodeurl@~1.0.1, encodeurl@~1.0.2: 279 | version "1.0.2" 280 | resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" 281 | integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k= 282 | 283 | escape-html@~1.0.3: 284 | version "1.0.3" 285 | resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" 286 | integrity sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg= 287 | 288 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 289 | version "1.0.5" 290 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 291 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 292 | 293 | esprima@^4.0.0: 294 | version "4.0.1" 295 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 296 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 297 | 298 | esutils@^2.0.2: 299 | version "2.0.2" 300 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 301 | integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= 302 | 303 | etag@~1.8.0, etag@~1.8.1: 304 | version "1.8.1" 305 | resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 306 | integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 307 | 308 | express-result-types@^0.0.4: 309 | version "0.0.4" 310 | resolved "https://registry.yarnpkg.com/express-result-types/-/express-result-types-0.0.4.tgz#ed174a4e70f5bdac1d7b6da3662cf6cbc79b29d3" 311 | integrity sha512-wD13qdF4vNWXuCEHBZATjOrj6zQzY4otl7rzq9RttNKifX/suEKc47yR3L1tdFOcREcFyfSY7aWC0JzPcohWxw== 312 | dependencies: 313 | express "4.15.3" 314 | express-session "1.15.3" 315 | http-status-codes "1.1.6" 316 | 317 | express-session@1.15.3: 318 | version "1.15.3" 319 | resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.15.3.tgz#db545f0435a7b1b228ae02da8197f65141735c67" 320 | integrity sha1-21RfBDWnsbIorgLagZf2UUFzXGc= 321 | dependencies: 322 | cookie "0.3.1" 323 | cookie-signature "1.0.6" 324 | crc "3.4.4" 325 | debug "2.6.7" 326 | depd "~1.1.0" 327 | on-headers "~1.0.1" 328 | parseurl "~1.3.1" 329 | uid-safe "~2.1.4" 330 | utils-merge "1.0.0" 331 | 332 | express-session@^1.15.4: 333 | version "1.15.6" 334 | resolved "https://registry.yarnpkg.com/express-session/-/express-session-1.15.6.tgz#47b4160c88f42ab70fe8a508e31cbff76757ab0a" 335 | integrity sha512-r0nrHTCYtAMrFwZ0kBzZEXa1vtPVrw0dKvGSrKP4dahwBQ1BJpF2/y1Pp4sCD/0kvxV4zZeclyvfmw0B4RMJQA== 336 | dependencies: 337 | cookie "0.3.1" 338 | cookie-signature "1.0.6" 339 | crc "3.4.4" 340 | debug "2.6.9" 341 | depd "~1.1.1" 342 | on-headers "~1.0.1" 343 | parseurl "~1.3.2" 344 | uid-safe "~2.1.5" 345 | utils-merge "1.0.1" 346 | 347 | express@4.15.3: 348 | version "4.15.3" 349 | resolved "https://registry.yarnpkg.com/express/-/express-4.15.3.tgz#bab65d0f03aa80c358408972fc700f916944b662" 350 | integrity sha1-urZdDwOqgMNYQIly/HAPkWlEtmI= 351 | dependencies: 352 | accepts "~1.3.3" 353 | array-flatten "1.1.1" 354 | content-disposition "0.5.2" 355 | content-type "~1.0.2" 356 | cookie "0.3.1" 357 | cookie-signature "1.0.6" 358 | debug "2.6.7" 359 | depd "~1.1.0" 360 | encodeurl "~1.0.1" 361 | escape-html "~1.0.3" 362 | etag "~1.8.0" 363 | finalhandler "~1.0.3" 364 | fresh "0.5.0" 365 | merge-descriptors "1.0.1" 366 | methods "~1.1.2" 367 | on-finished "~2.3.0" 368 | parseurl "~1.3.1" 369 | path-to-regexp "0.1.7" 370 | proxy-addr "~1.1.4" 371 | qs "6.4.0" 372 | range-parser "~1.2.0" 373 | send "0.15.3" 374 | serve-static "1.12.3" 375 | setprototypeof "1.0.3" 376 | statuses "~1.3.1" 377 | type-is "~1.6.15" 378 | utils-merge "1.0.0" 379 | vary "~1.1.1" 380 | 381 | express@^4.15.3: 382 | version "4.16.4" 383 | resolved "https://registry.yarnpkg.com/express/-/express-4.16.4.tgz#fddef61926109e24c515ea97fd2f1bdbf62df12e" 384 | integrity sha512-j12Uuyb4FMrd/qQAm6uCHAkPtO8FDTRJZBDd5D2KOL2eLaz1yUNdUB/NOIyq0iU4q4cFarsUCrnFDPBcnksuOg== 385 | dependencies: 386 | accepts "~1.3.5" 387 | array-flatten "1.1.1" 388 | body-parser "1.18.3" 389 | content-disposition "0.5.2" 390 | content-type "~1.0.4" 391 | cookie "0.3.1" 392 | cookie-signature "1.0.6" 393 | debug "2.6.9" 394 | depd "~1.1.2" 395 | encodeurl "~1.0.2" 396 | escape-html "~1.0.3" 397 | etag "~1.8.1" 398 | finalhandler "1.1.1" 399 | fresh "0.5.2" 400 | merge-descriptors "1.0.1" 401 | methods "~1.1.2" 402 | on-finished "~2.3.0" 403 | parseurl "~1.3.2" 404 | path-to-regexp "0.1.7" 405 | proxy-addr "~2.0.4" 406 | qs "6.5.2" 407 | range-parser "~1.2.0" 408 | safe-buffer "5.1.2" 409 | send "0.16.2" 410 | serve-static "1.13.2" 411 | setprototypeof "1.1.0" 412 | statuses "~1.4.0" 413 | type-is "~1.6.16" 414 | utils-merge "1.0.1" 415 | vary "~1.1.2" 416 | 417 | finalhandler@1.1.1: 418 | version "1.1.1" 419 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.1.tgz#eebf4ed840079c83f4249038c9d703008301b105" 420 | integrity sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg== 421 | dependencies: 422 | debug "2.6.9" 423 | encodeurl "~1.0.2" 424 | escape-html "~1.0.3" 425 | on-finished "~2.3.0" 426 | parseurl "~1.3.2" 427 | statuses "~1.4.0" 428 | unpipe "~1.0.0" 429 | 430 | finalhandler@~1.0.3: 431 | version "1.0.6" 432 | resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.6.tgz#007aea33d1a4d3e42017f624848ad58d212f814f" 433 | integrity sha1-AHrqM9Gk0+QgF/YkhIrVjSEvgU8= 434 | dependencies: 435 | debug "2.6.9" 436 | encodeurl "~1.0.1" 437 | escape-html "~1.0.3" 438 | on-finished "~2.3.0" 439 | parseurl "~1.3.2" 440 | statuses "~1.3.1" 441 | unpipe "~1.0.0" 442 | 443 | forwarded@~0.1.0, forwarded@~0.1.2: 444 | version "0.1.2" 445 | resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz#98c23dab1175657b8c0573e8ceccd91b0ff18c84" 446 | integrity sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ= 447 | 448 | fp-ts@^1.0.0, fp-ts@^1.0.1, fp-ts@^1.7.1: 449 | version "1.10.0" 450 | resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-1.10.0.tgz#f249f07a167f4c13a96baf01794f7e0753de4225" 451 | integrity sha512-ZOdfxiFgjipHEQKMam06/+BVneM/UKQDhoXAH2I6VvwqY4p0awswQcDgopvfE/jPeR7Aigv1aIv8U5awSXSw8A== 452 | 453 | fresh@0.5.0: 454 | version "0.5.0" 455 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e" 456 | integrity sha1-9HTKXmqSRtb9jglTz6m5yAWvp44= 457 | 458 | fresh@0.5.2: 459 | version "0.5.2" 460 | resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" 461 | integrity sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac= 462 | 463 | fs.realpath@^1.0.0: 464 | version "1.0.0" 465 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 466 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 467 | 468 | glob@^7.1.1: 469 | version "7.1.3" 470 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 471 | integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== 472 | dependencies: 473 | fs.realpath "^1.0.0" 474 | inflight "^1.0.4" 475 | inherits "2" 476 | minimatch "^3.0.4" 477 | once "^1.3.0" 478 | path-is-absolute "^1.0.0" 479 | 480 | has-ansi@^2.0.0: 481 | version "2.0.0" 482 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 483 | integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE= 484 | dependencies: 485 | ansi-regex "^2.0.0" 486 | 487 | has-flag@^3.0.0: 488 | version "3.0.0" 489 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 490 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 491 | 492 | http-errors@1.6.3, http-errors@~1.6.1, http-errors@~1.6.2, http-errors@~1.6.3: 493 | version "1.6.3" 494 | resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz#8b55680bb4be283a0b5bf4ea2e38580be1d9320d" 495 | integrity sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0= 496 | dependencies: 497 | depd "~1.1.2" 498 | inherits "2.0.3" 499 | setprototypeof "1.1.0" 500 | statuses ">= 1.4.0 < 2" 501 | 502 | http-status-codes@1.1.6: 503 | version "1.1.6" 504 | resolved "https://registry.yarnpkg.com/http-status-codes/-/http-status-codes-1.1.6.tgz#7a75d2b94d35a93183f39a0c8a6eb8963c20e50d" 505 | integrity sha1-enXSuU01qTGD85oMim64ljwg5Q0= 506 | 507 | iconv-lite@0.4.23: 508 | version "0.4.23" 509 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.23.tgz#297871f63be507adcfbfca715d0cd0eed84e9a63" 510 | integrity sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA== 511 | dependencies: 512 | safer-buffer ">= 2.1.2 < 3" 513 | 514 | inflight@^1.0.4: 515 | version "1.0.6" 516 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 517 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 518 | dependencies: 519 | once "^1.3.0" 520 | wrappy "1" 521 | 522 | inherits@2, inherits@2.0.3: 523 | version "2.0.3" 524 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 525 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 526 | 527 | io-ts-reporters@^0.0.21: 528 | version "0.0.21" 529 | resolved "https://registry.yarnpkg.com/io-ts-reporters/-/io-ts-reporters-0.0.21.tgz#b0be3eec37a3d7da77aeafa257c68bd2afbbc4af" 530 | integrity sha512-HRAYn4IVkRbnL9Uy9WDB/1+0lorRZvE239LMdc0ditN8OhsPg+0vKnqchkGhZ/vyTzLC5CZLO4AZ4xreirkIkA== 531 | dependencies: 532 | fp-ts "^1.0.1" 533 | io-ts "^1.0.2" 534 | 535 | io-ts@^1.0.2, io-ts@^1.3.0: 536 | version "1.3.3" 537 | resolved "https://registry.yarnpkg.com/io-ts/-/io-ts-1.3.3.tgz#98e8b6a0b56b4242d218de75fd46bbb7cc16da13" 538 | integrity sha512-FzOTIRJ5vB1DOxFRsOikU4xbFBvD8IukdoJNovO0YOrvFIT5sUyPxBp17wBp5/rfbRg/amhKs9q04xN8glcpKA== 539 | dependencies: 540 | fp-ts "^1.0.0" 541 | 542 | ipaddr.js@1.4.0: 543 | version "1.4.0" 544 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.4.0.tgz#296aca878a821816e5b85d0a285a99bcff4582f0" 545 | integrity sha1-KWrKh4qCGBbluF0KKFqZvP9FgvA= 546 | 547 | ipaddr.js@1.8.0: 548 | version "1.8.0" 549 | resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.8.0.tgz#eaa33d6ddd7ace8f7f6fe0c9ca0440e706738b1e" 550 | integrity sha1-6qM9bd16zo9/b+DJygRA5wZzix4= 551 | 552 | js-tokens@^3.0.2: 553 | version "3.0.2" 554 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 555 | integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= 556 | 557 | js-yaml@^3.7.0: 558 | version "3.12.0" 559 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" 560 | integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== 561 | dependencies: 562 | argparse "^1.0.7" 563 | esprima "^4.0.0" 564 | 565 | media-typer@0.3.0: 566 | version "0.3.0" 567 | resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" 568 | integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= 569 | 570 | merge-descriptors@1.0.1: 571 | version "1.0.1" 572 | resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz#b00aaa556dd8b44568150ec9d1b953f3f90cbb61" 573 | integrity sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E= 574 | 575 | methods@~1.1.2: 576 | version "1.1.2" 577 | resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" 578 | integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= 579 | 580 | mime-db@~1.37.0: 581 | version "1.37.0" 582 | resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.37.0.tgz#0b6a0ce6fdbe9576e25f1f2d2fde8830dc0ad0d8" 583 | integrity sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg== 584 | 585 | mime-types@~2.1.18: 586 | version "2.1.21" 587 | resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.21.tgz#28995aa1ecb770742fe6ae7e58f9181c744b3f96" 588 | integrity sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg== 589 | dependencies: 590 | mime-db "~1.37.0" 591 | 592 | mime@1.3.4: 593 | version "1.3.4" 594 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53" 595 | integrity sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM= 596 | 597 | mime@1.4.1: 598 | version "1.4.1" 599 | resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" 600 | integrity sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ== 601 | 602 | minimatch@^3.0.4: 603 | version "3.0.4" 604 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 605 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 606 | dependencies: 607 | brace-expansion "^1.1.7" 608 | 609 | mock-require@^2.0.2: 610 | version "2.0.2" 611 | resolved "https://registry.yarnpkg.com/mock-require/-/mock-require-2.0.2.tgz#1eaa71aad23013773d127dc7e91a3fbb4837d60d" 612 | integrity sha1-HqpxqtIwE3c9En3H6Ro/u0g31g0= 613 | dependencies: 614 | caller-id "^0.1.0" 615 | 616 | ms@2.0.0: 617 | version "2.0.0" 618 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 619 | integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g= 620 | 621 | negotiator@0.6.1: 622 | version "0.6.1" 623 | resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.1.tgz#2b327184e8992101177b28563fb5e7102acd0ca9" 624 | integrity sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk= 625 | 626 | on-finished@~2.3.0: 627 | version "2.3.0" 628 | resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" 629 | integrity sha1-IPEzZIGwg811M3mSoWlxqi2QaUc= 630 | dependencies: 631 | ee-first "1.1.1" 632 | 633 | on-headers@~1.0.1: 634 | version "1.0.1" 635 | resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" 636 | integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= 637 | 638 | once@^1.3.0: 639 | version "1.4.0" 640 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 641 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 642 | dependencies: 643 | wrappy "1" 644 | 645 | parseurl@~1.3.1, parseurl@~1.3.2: 646 | version "1.3.2" 647 | resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.2.tgz#fc289d4ed8993119460c156253262cdc8de65bf3" 648 | integrity sha1-/CidTtiZMRlGDBViUyYs3I3mW/M= 649 | 650 | path-is-absolute@^1.0.0: 651 | version "1.0.1" 652 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 653 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 654 | 655 | path-parse@^1.0.5: 656 | version "1.0.6" 657 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 658 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 659 | 660 | path-to-regexp@0.1.7: 661 | version "0.1.7" 662 | resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" 663 | integrity sha1-32BBeABfUi8V60SQ5yR6G/qmf4w= 664 | 665 | prettier@^1.10.2: 666 | version "1.14.3" 667 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.14.3.tgz#90238dd4c0684b7edce5f83b0fb7328e48bd0895" 668 | integrity sha512-qZDVnCrnpsRJJq5nSsiHCE3BYMED2OtsI+cmzIzF1QIfqm5ALf8tEJcO27zV1gKNKRPdhjO0dNWnrzssDQ1tFg== 669 | 670 | proxy-addr@~1.1.4: 671 | version "1.1.5" 672 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-1.1.5.tgz#71c0ee3b102de3f202f3b64f608d173fcba1a918" 673 | integrity sha1-ccDuOxAt4/IC87ZPYI0XP8uhqRg= 674 | dependencies: 675 | forwarded "~0.1.0" 676 | ipaddr.js "1.4.0" 677 | 678 | proxy-addr@~2.0.4: 679 | version "2.0.4" 680 | resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.4.tgz#ecfc733bf22ff8c6f407fa275327b9ab67e48b93" 681 | integrity sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA== 682 | dependencies: 683 | forwarded "~0.1.2" 684 | ipaddr.js "1.8.0" 685 | 686 | qs@6.4.0: 687 | version "6.4.0" 688 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" 689 | integrity sha1-E+JtKK1rD/qpExLNO/cI7TUecjM= 690 | 691 | qs@6.5.2: 692 | version "6.5.2" 693 | resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" 694 | integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== 695 | 696 | random-bytes@~1.0.0: 697 | version "1.0.0" 698 | resolved "https://registry.yarnpkg.com/random-bytes/-/random-bytes-1.0.0.tgz#4f68a1dc0ae58bd3fb95848c30324db75d64360b" 699 | integrity sha1-T2ih3Arli9P7lYSMMDJNt11kNgs= 700 | 701 | range-parser@~1.2.0: 702 | version "1.2.0" 703 | resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" 704 | integrity sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4= 705 | 706 | raw-body@2.3.3: 707 | version "2.3.3" 708 | resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.3.3.tgz#1b324ece6b5706e153855bc1148c65bb7f6ea0c3" 709 | integrity sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw== 710 | dependencies: 711 | bytes "3.0.0" 712 | http-errors "1.6.3" 713 | iconv-lite "0.4.23" 714 | unpipe "1.0.0" 715 | 716 | resolve@^1.3.2: 717 | version "1.8.1" 718 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" 719 | integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== 720 | dependencies: 721 | path-parse "^1.0.5" 722 | 723 | safe-buffer@5.1.2: 724 | version "5.1.2" 725 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" 726 | integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== 727 | 728 | "safer-buffer@>= 2.1.2 < 3": 729 | version "2.1.2" 730 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 731 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 732 | 733 | semver@^5.3.0: 734 | version "5.6.0" 735 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 736 | integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== 737 | 738 | send@0.15.3: 739 | version "0.15.3" 740 | resolved "https://registry.yarnpkg.com/send/-/send-0.15.3.tgz#5013f9f99023df50d1bd9892c19e3defd1d53309" 741 | integrity sha1-UBP5+ZAj31DRvZiSwZ4979HVMwk= 742 | dependencies: 743 | debug "2.6.7" 744 | depd "~1.1.0" 745 | destroy "~1.0.4" 746 | encodeurl "~1.0.1" 747 | escape-html "~1.0.3" 748 | etag "~1.8.0" 749 | fresh "0.5.0" 750 | http-errors "~1.6.1" 751 | mime "1.3.4" 752 | ms "2.0.0" 753 | on-finished "~2.3.0" 754 | range-parser "~1.2.0" 755 | statuses "~1.3.1" 756 | 757 | send@0.16.2: 758 | version "0.16.2" 759 | resolved "https://registry.yarnpkg.com/send/-/send-0.16.2.tgz#6ecca1e0f8c156d141597559848df64730a6bbc1" 760 | integrity sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw== 761 | dependencies: 762 | debug "2.6.9" 763 | depd "~1.1.2" 764 | destroy "~1.0.4" 765 | encodeurl "~1.0.2" 766 | escape-html "~1.0.3" 767 | etag "~1.8.1" 768 | fresh "0.5.2" 769 | http-errors "~1.6.2" 770 | mime "1.4.1" 771 | ms "2.0.0" 772 | on-finished "~2.3.0" 773 | range-parser "~1.2.0" 774 | statuses "~1.4.0" 775 | 776 | serve-static@1.12.3: 777 | version "1.12.3" 778 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.3.tgz#9f4ba19e2f3030c547f8af99107838ec38d5b1e2" 779 | integrity sha1-n0uhni8wMMVH+K+ZEHg47DjVseI= 780 | dependencies: 781 | encodeurl "~1.0.1" 782 | escape-html "~1.0.3" 783 | parseurl "~1.3.1" 784 | send "0.15.3" 785 | 786 | serve-static@1.13.2: 787 | version "1.13.2" 788 | resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.13.2.tgz#095e8472fd5b46237db50ce486a43f4b86c6cec1" 789 | integrity sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw== 790 | dependencies: 791 | encodeurl "~1.0.2" 792 | escape-html "~1.0.3" 793 | parseurl "~1.3.2" 794 | send "0.16.2" 795 | 796 | setprototypeof@1.0.3: 797 | version "1.0.3" 798 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.0.3.tgz#66567e37043eeb4f04d91bd658c0cbefb55b8e04" 799 | integrity sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ= 800 | 801 | setprototypeof@1.1.0: 802 | version "1.1.0" 803 | resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 804 | integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== 805 | 806 | sprintf-js@~1.0.2: 807 | version "1.0.3" 808 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 809 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 810 | 811 | stack-trace@~0.0.7: 812 | version "0.0.10" 813 | resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" 814 | integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= 815 | 816 | "statuses@>= 1.4.0 < 2": 817 | version "1.5.0" 818 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" 819 | integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= 820 | 821 | statuses@~1.3.1: 822 | version "1.3.1" 823 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" 824 | integrity sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4= 825 | 826 | statuses@~1.4.0: 827 | version "1.4.0" 828 | resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" 829 | integrity sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew== 830 | 831 | strip-ansi@^3.0.0: 832 | version "3.0.1" 833 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 834 | integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8= 835 | dependencies: 836 | ansi-regex "^2.0.0" 837 | 838 | supports-color@^2.0.0: 839 | version "2.0.0" 840 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 841 | integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= 842 | 843 | supports-color@^5.3.0: 844 | version "5.5.0" 845 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 846 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 847 | dependencies: 848 | has-flag "^3.0.0" 849 | 850 | tslib@^1.8.0, tslib@^1.8.1: 851 | version "1.9.3" 852 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 853 | integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== 854 | 855 | tslint-language-service@^0.9.6: 856 | version "0.9.9" 857 | resolved "https://registry.yarnpkg.com/tslint-language-service/-/tslint-language-service-0.9.9.tgz#f546dc38483979e6fb3cfa59584ad8525b3ad4da" 858 | integrity sha1-9UbcOEg5eeb7PPpZWErYUls61No= 859 | dependencies: 860 | mock-require "^2.0.2" 861 | 862 | tslint@^5.8.0: 863 | version "5.11.0" 864 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.11.0.tgz#98f30c02eae3cde7006201e4c33cb08b48581eed" 865 | integrity sha1-mPMMAurjzecAYgHkwzywi0hYHu0= 866 | dependencies: 867 | babel-code-frame "^6.22.0" 868 | builtin-modules "^1.1.1" 869 | chalk "^2.3.0" 870 | commander "^2.12.1" 871 | diff "^3.2.0" 872 | glob "^7.1.1" 873 | js-yaml "^3.7.0" 874 | minimatch "^3.0.4" 875 | resolve "^1.3.2" 876 | semver "^5.3.0" 877 | tslib "^1.8.0" 878 | tsutils "^2.27.2" 879 | 880 | tsutils@^2.27.2: 881 | version "2.29.0" 882 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99" 883 | integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA== 884 | dependencies: 885 | tslib "^1.8.1" 886 | 887 | type-is@~1.6.15, type-is@~1.6.16: 888 | version "1.6.16" 889 | resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" 890 | integrity sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q== 891 | dependencies: 892 | media-typer "0.3.0" 893 | mime-types "~2.1.18" 894 | 895 | typescript@^2.7.2: 896 | version "2.9.2" 897 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c" 898 | integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w== 899 | 900 | uid-safe@~2.1.4, uid-safe@~2.1.5: 901 | version "2.1.5" 902 | resolved "https://registry.yarnpkg.com/uid-safe/-/uid-safe-2.1.5.tgz#2b3d5c7240e8fc2e58f8aa269e5ee49c0857bd3a" 903 | integrity sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA== 904 | dependencies: 905 | random-bytes "~1.0.0" 906 | 907 | unpipe@1.0.0, unpipe@~1.0.0: 908 | version "1.0.0" 909 | resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" 910 | integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= 911 | 912 | utils-merge@1.0.0: 913 | version "1.0.0" 914 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" 915 | integrity sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg= 916 | 917 | utils-merge@1.0.1: 918 | version "1.0.1" 919 | resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" 920 | integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= 921 | 922 | vary@~1.1.1, vary@~1.1.2: 923 | version "1.1.2" 924 | resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" 925 | integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= 926 | 927 | wrappy@1: 928 | version "1.0.2" 929 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 930 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 931 | --------------------------------------------------------------------------------