├── .gitignore ├── .travis.yml ├── README.md ├── package.json ├── src ├── cli.ts └── index.ts ├── test ├── failing │ ├── expected.ts │ ├── tsconfig.json │ └── unexpected.ts ├── files │ ├── global.ts │ ├── test.ts │ └── tsconfig.json └── index.ts ├── tsconfig.json ├── tslint.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | lib -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: 4 | - "6" 5 | 6 | script: 7 | - npm run lint 8 | - npm run build 9 | - npm test 10 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Typings Tester [![npm version][npm-image]][npm-url] [![Build Status][travis-image]][travis-url] 2 | 3 | A library aimed to aid testing of TypeScript definitions. 4 | Checks TypeScript files for syntactic, expected and unexpected semantic (type) errors. 5 | 6 | **Note:** _There's an [official tool](https://github.com/Microsoft/dtslint#write-tests) that provides similar functionality and might be a better choice._ 7 | 8 | ## Installation 9 | 10 | $ npm install -D typings-tester 11 | 12 | Any version of TypeScript must be installed separately. 13 | 14 | ## CLI Usage 15 | 16 | $ typings-tester --config path/to/tsconfig.json **/*.ts 17 | 18 | $ typings-tester --dir path/to/directory 19 | 20 | ## API Usage 21 | 22 | ```ts 23 | import test from "tape"; 24 | import {check, checkDirectory} from "typings-tester"; 25 | 26 | 27 | test('typings', assert => { 28 | assert.doesNotThrow(() => check(['test.ts'], 'tsconfig.json')); 29 | 30 | assert.doesNotThrow(() => checkDirectory('src')); 31 | }); 32 | ``` 33 | 34 | ## Flags 35 | * `typings:expect-error`: expect next line or block to contain semantic error. `typings-tester` will fail if no error is produced. 36 | 37 | ```ts 38 | // typings:expect-error 39 | function shouldFail(a: number): string { 40 | return a; 41 | } 42 | ``` 43 | 44 | ## What's next 45 | 46 | * Testing against multiple versions of TypeScript 47 | * Inferred type assertions 48 | 49 | [npm-image]: https://badge.fury.io/js/typings-tester.svg 50 | [npm-url]: https://badge.fury.io/js/typings-tester 51 | [travis-image]: https://travis-ci.org/aikoven/typings-tester.svg?branch=master 52 | [travis-url]: https://travis-ci.org/aikoven/typings-tester 53 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "typings-tester", 3 | "version": "0.3.2", 4 | "description": "TypeScript definition testing library", 5 | "keywords": [ 6 | "typings", 7 | "typescript", 8 | "definition", 9 | "declaration", 10 | "test" 11 | ], 12 | "main": "./lib/index.js", 13 | "typings": "./lib/index.d.ts", 14 | "bin": { 15 | "typings-tester": "./lib/cli.js" 16 | }, 17 | "files": [ 18 | "lib", 19 | "src" 20 | ], 21 | "scripts": { 22 | "clean": "rimraf lib", 23 | "lint": "tslint -c tslint.json src/**/*.ts tests/**/*.ts", 24 | "test": "ts-node test/index.ts", 25 | "build": "tsc", 26 | "prepublish": "npm run clean && npm run build", 27 | "precommit": "lint-staged" 28 | }, 29 | "lint-staged": { 30 | "*.{ts,tsx}": [ 31 | "prettier --single-quote --trailing-comma all --no-bracket-spacing --write", 32 | "git add" 33 | ] 34 | }, 35 | "author": "Daniel Lytkin ", 36 | "repository": "aikoven/typings-tester", 37 | "license": "MIT", 38 | "peerDependencies": { 39 | "typescript": "~2 || ~3" 40 | }, 41 | "devDependencies": { 42 | "@types/node": "^8.0.58", 43 | "@types/tape": "^4.2.31", 44 | "husky": "^0.14.3", 45 | "lint-staged": "^6.0.0", 46 | "prettier": "^1.9.2", 47 | "rimraf": "^2.5.4", 48 | "tape": "^4.8.0", 49 | "ts-node": "^4.0.1", 50 | "tslint": "^5.8.0", 51 | "typescript": "~3.0.0" 52 | }, 53 | "dependencies": { 54 | "commander": "^2.12.2" 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /src/cli.ts: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | import commander = require('commander'); 3 | import {checkDirectory, check} from './index'; 4 | const packageJson = require('../package.json'); 5 | 6 | commander 7 | .version(packageJson.version) 8 | .usage('[options] ') 9 | .option('-d --dir [dir]', 'Path to directory to check') 10 | .option('-c --config [config]', 'Path to tsconfig.json') 11 | .option('--bail', 'Exit on first error') 12 | .parse(process.argv); 13 | 14 | if (commander['dir']) { 15 | try { 16 | checkDirectory(commander['dir'], !!commander['bail']); 17 | } catch (e) { 18 | abort(e.message); 19 | } 20 | } else { 21 | if (commander.args.length === 0) { 22 | abort('No files specified'); 23 | } else if (!commander['config']) { 24 | abort('No tsconfig.json path specified'); 25 | } else { 26 | try { 27 | check(commander.args, commander['config'], !!commander['bail']); 28 | } catch (e) { 29 | abort(e.message); 30 | } 31 | } 32 | } 33 | 34 | function abort(message: string) { 35 | console.error(message); 36 | process.exit(1); 37 | } 38 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | import * as ts from 'typescript'; 2 | import * as fs from 'fs'; 3 | import {dirname, normalize} from 'path'; 4 | 5 | function handleDiagnostics( 6 | type: string, 7 | diagnostics: Iterable, 8 | bail: boolean = false, 9 | ) { 10 | const ret = []; 11 | 12 | for (const diagnostic of diagnostics) { 13 | const parts = [`${type}:`]; 14 | 15 | if (diagnostic.file && diagnostic.start != null) { 16 | const {line, character} = diagnostic.file.getLineAndCharacterOfPosition( 17 | diagnostic.start, 18 | ); 19 | 20 | parts.push( 21 | `${diagnostic.file.fileName}`, 22 | `(${line + 1}, ${character + 1})`, 23 | ); 24 | } 25 | 26 | const message = ts.flattenDiagnosticMessageText( 27 | diagnostic.messageText, 28 | '\n', 29 | ); 30 | 31 | parts.push(message); 32 | 33 | const text = parts.join(' '); 34 | 35 | if (bail) throw new Error(text); 36 | 37 | ret.push(text); 38 | } 39 | 40 | return ret; 41 | } 42 | 43 | function findLastNodeComment(node: ts.Node): string { 44 | const text = node.getFullText(); 45 | const commentRanges = ts.getLeadingCommentRanges(node.getFullText(), 0); 46 | 47 | if (commentRanges == null || commentRanges.length === 0) { 48 | return ''; 49 | } 50 | 51 | const {pos, end} = commentRanges[commentRanges.length - 1]; 52 | 53 | return text.substring(pos, end); 54 | } 55 | 56 | function forEachExpectedFailureNodes( 57 | node: ts.Node, 58 | cb: (node: ts.Node) => void, 59 | ) { 60 | if ( 61 | node.kind !== ts.SyntaxKind.SourceFile && 62 | findLastNodeComment(node).match(/^\/[\/*] typings:expect-error/) 63 | ) { 64 | cb(node); 65 | } else { 66 | ts.forEachChild(node, child => { 67 | forEachExpectedFailureNodes(child, cb); 68 | }); 69 | } 70 | } 71 | 72 | export function check( 73 | files: string[], 74 | tsConfigPath: string, 75 | bail: boolean = false, 76 | ) { 77 | const {config, error} = ts.readConfigFile(tsConfigPath, ts.sys.readFile); 78 | 79 | if (error) { 80 | throw new Error(ts.flattenDiagnosticMessageText(error.messageText, '\n')); 81 | } 82 | 83 | const {options, errors} = ts.convertCompilerOptionsFromJson( 84 | config.compilerOptions, 85 | dirname(tsConfigPath), 86 | ); 87 | 88 | if (errors.length > 0) { 89 | throw new Error( 90 | ts.flattenDiagnosticMessageText(errors[0].messageText, '\n'), 91 | ); 92 | } 93 | 94 | const allErrors: string[] = []; 95 | 96 | for (const file of files) { 97 | if (!fs.existsSync(file)) { 98 | throw new Error(`File '${file}' not found.`); 99 | } 100 | 101 | const program = ts.createProgram([file], options); 102 | 103 | const global = handleDiagnostics( 104 | 'Global', 105 | program.getGlobalDiagnostics(), 106 | bail, 107 | ); 108 | const syntax = handleDiagnostics( 109 | 'Syntactic', 110 | program.getSyntacticDiagnostics(), 111 | bail, 112 | ); 113 | 114 | allErrors.push(...global, ...syntax); 115 | 116 | for (const sourceFile of program.getSourceFiles()) { 117 | let semantic = program.getSemanticDiagnostics(sourceFile); 118 | 119 | const rootFileNames = program.getRootFileNames().map(normalize); 120 | const fileName = normalize(sourceFile.fileName); 121 | if (rootFileNames.indexOf(fileName) !== -1) { 122 | forEachExpectedFailureNodes(sourceFile, node => { 123 | const failures: ts.Diagnostic[] = []; 124 | const leftSemantics: ts.Diagnostic[] = []; 125 | 126 | for (const diag of semantic) { 127 | if ( 128 | diag.start != null && 129 | diag.length != null && 130 | node.pos <= diag.start && 131 | diag.start + diag.length <= node.end 132 | ) { 133 | failures.push(diag); 134 | } else { 135 | leftSemantics.push(diag); 136 | } 137 | } 138 | 139 | if (failures.length === 0) { 140 | const {line, character} = sourceFile.getLineAndCharacterOfPosition( 141 | node.getStart(), 142 | ); 143 | const message = 144 | `Expected error: ${sourceFile.fileName} ` + 145 | `(${line + 1}, ${character + 1}):\n` + 146 | node.getText(); 147 | 148 | if (bail) throw new Error(message); 149 | 150 | allErrors.push(message); 151 | } 152 | 153 | semantic = leftSemantics; 154 | }); 155 | } 156 | 157 | allErrors.push(...handleDiagnostics('Semantic', semantic, bail)); 158 | } 159 | } 160 | 161 | if (allErrors.length > 0) throw new Error(allErrors.join('\n\n')); 162 | } 163 | 164 | export function checkDirectory(path: string, bail: boolean = false) { 165 | const files = ts.sys.readDirectory(path, ['.ts', '.tsx']); 166 | const tsConfigPath = ts.findConfigFile(path, ts.sys.fileExists); 167 | 168 | if (!tsConfigPath) { 169 | throw new Error(`Cannot find TypeScript config file in ${path}.`); 170 | } 171 | 172 | check(files, tsConfigPath, bail); 173 | } 174 | -------------------------------------------------------------------------------- /test/failing/expected.ts: -------------------------------------------------------------------------------- 1 | // typings:expect-error 2 | { 3 | const a = 1; 4 | } 5 | -------------------------------------------------------------------------------- /test/failing/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es5", 5 | "noImplicitAny": false, 6 | "sourceMap": false 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /test/failing/unexpected.ts: -------------------------------------------------------------------------------- 1 | { 2 | const a: string = 1; 3 | } 4 | -------------------------------------------------------------------------------- /test/files/global.ts: -------------------------------------------------------------------------------- 1 | /** 2 | * Set up a global constant to ensure it is not included into a compilation when 3 | * checking the whole directory, i.e. each file is compiled separately. 4 | * 5 | * This is useful to test module augmentations, where you can have multiple 6 | * augmentations in different files and don't want them to interfere. 7 | */ 8 | declare const someGlobal = 42; 9 | -------------------------------------------------------------------------------- /test/files/test.ts: -------------------------------------------------------------------------------- 1 | function f(a: number) { 2 | a = 1; 3 | } 4 | 5 | /* typings:expect-error */ 6 | { 7 | const a: number = ''; 8 | } 9 | 10 | // typings:expect-error 11 | function shouldFail(a: number) { 12 | a = ''; 13 | } 14 | 15 | { 16 | // typings:expect-error 17 | const a: string = 1; 18 | } 19 | 20 | { 21 | // Ensure that all test files are compiled one-by-one and the global constant 22 | // declared in global.ts is not in the scope. 23 | // See ./global.ts for rationale 24 | // typings:expect-error 25 | const a = someGlobal; 26 | } 27 | -------------------------------------------------------------------------------- /test/files/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es5", 5 | "noImplicitAny": false, 6 | "moduleResolution": "node", 7 | "sourceMap": false 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /test/index.ts: -------------------------------------------------------------------------------- 1 | import test = require('tape'); 2 | import {check, checkDirectory} from '../src/index'; 3 | import {join} from 'path'; 4 | 5 | test('check', assert => { 6 | assert.throws(() => { 7 | check( 8 | [join(__dirname, 'failing/expected.ts')], 9 | join(__dirname, 'notfound/tsconfig.json'), 10 | ); 11 | }, /path does not exist/); 12 | 13 | assert.throws(() => { 14 | check( 15 | [join(__dirname, 'failing/notfound.ts')], 16 | join(__dirname, 'failing/tsconfig.json'), 17 | ); 18 | }, /File.*not found/); 19 | 20 | assert.doesNotThrow(() => { 21 | check( 22 | [join(__dirname, 'files/test.ts')], 23 | join(__dirname, 'files/tsconfig.json'), 24 | ); 25 | }); 26 | 27 | assert.throws(() => { 28 | check( 29 | [join(__dirname, 'failing/expected.ts')], 30 | join(__dirname, 'failing/tsconfig.json'), 31 | ); 32 | }, /Expected error:.*\(2, 1\)/); 33 | 34 | assert.throws(() => { 35 | check( 36 | [join(__dirname, 'failing/unexpected.ts')], 37 | join(__dirname, 'failing/tsconfig.json'), 38 | ); 39 | }, /Semantic:.*\(2, 9\)/); 40 | 41 | assert.end(); 42 | }); 43 | 44 | test('checkDirectory', assert => { 45 | assert.doesNotThrow(() => { 46 | checkDirectory(join(__dirname, 'files')); 47 | }); 48 | 49 | assert.end(); 50 | }); 51 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es5", 5 | "lib": ["es2015"], 6 | "downlevelIteration": true, 7 | "declaration": true, 8 | "outDir": "lib", 9 | "strict": true, 10 | "noImplicitReturns": true, 11 | "noUnusedLocals": true 12 | }, 13 | "files": [ 14 | "src/index.ts", 15 | "src/cli.ts" 16 | ] 17 | } 18 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "class-name": true, 4 | "comment-format": [ 5 | true, 6 | "check-space" 7 | ], 8 | "indent": [ 9 | true, 10 | "spaces" 11 | ], 12 | "max-line-length": [ 13 | true, 14 | 80 15 | ], 16 | "no-duplicate-variable": true, 17 | "no-empty": false, 18 | "no-eval": true, 19 | "no-internal-module": true, 20 | "no-trailing-whitespace": false, 21 | "no-unused-expression": true, 22 | "no-var-keyword": true, 23 | "one-line": [ 24 | true, 25 | "check-catch", 26 | "check-else", 27 | "check-open-brace", 28 | "check-whitespace" 29 | ], 30 | "quotemark": false, 31 | "semicolon": true, 32 | "trailing-comma": [ 33 | true, { 34 | "multiline": "always" 35 | } 36 | ], 37 | "triple-equals": [ 38 | true, 39 | "allow-null-check" 40 | ], 41 | "typedef-whitespace": [ 42 | true, 43 | { 44 | "call-signature": "nospace", 45 | "index-signature": "nospace", 46 | "parameter": "nospace", 47 | "property-declaration": "nospace", 48 | "variable-declaration": "nospace" 49 | } 50 | ], 51 | "variable-name": [ 52 | true, 53 | "ban-keywords" 54 | ], 55 | "whitespace": [ 56 | true, 57 | "check-branch", 58 | "check-decl", 59 | "check-operator", 60 | "check-separator", 61 | "check-type" 62 | ] 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@types/arrify@^1.0.1": 6 | version "1.0.2" 7 | resolved "https://registry.yarnpkg.com/@types/arrify/-/arrify-1.0.2.tgz#4a6856b9bfd4713c781df95349c6b15db60d4de1" 8 | 9 | "@types/diff@^3.2.1": 10 | version "3.2.2" 11 | resolved "https://registry.yarnpkg.com/@types/diff/-/diff-3.2.2.tgz#4d6f45537322a7a420d353a0939513c7e96d14a6" 12 | 13 | "@types/minimist@^1.2.0": 14 | version "1.2.0" 15 | resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" 16 | 17 | "@types/mkdirp@^0.5.0": 18 | version "0.5.2" 19 | resolved "https://registry.yarnpkg.com/@types/mkdirp/-/mkdirp-0.5.2.tgz#503aacfe5cc2703d5484326b1b27efa67a339c1f" 20 | dependencies: 21 | "@types/node" "*" 22 | 23 | "@types/node@*", "@types/node@^8.0.27", "@types/node@^8.0.58": 24 | version "8.0.58" 25 | resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.58.tgz#5b3881c0be3a646874803fee3197ea7f1ed6df90" 26 | 27 | "@types/source-map-support@^0.4.0": 28 | version "0.4.0" 29 | resolved "https://registry.yarnpkg.com/@types/source-map-support/-/source-map-support-0.4.0.tgz#a62a1866614af68c888173c001481f242aaf148b" 30 | dependencies: 31 | "@types/node" "*" 32 | 33 | "@types/strip-bom@^3.0.0": 34 | version "3.0.0" 35 | resolved "https://registry.yarnpkg.com/@types/strip-bom/-/strip-bom-3.0.0.tgz#14a8ec3956c2e81edb7520790aecf21c290aebd2" 36 | 37 | "@types/strip-json-comments@0.0.30": 38 | version "0.0.30" 39 | resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1" 40 | 41 | "@types/tape@^4.2.31": 42 | version "4.2.31" 43 | resolved "https://registry.yarnpkg.com/@types/tape/-/tape-4.2.31.tgz#d2cd0f2e410d2c288a5eb54c01c04e6b8a301fd2" 44 | dependencies: 45 | "@types/node" "*" 46 | 47 | "@types/v8flags@types/npm-v8flags#de224ae1cd5fd7dbb4e7158a6cc7a29e5315930d": 48 | version "2.0.0" 49 | resolved "https://codeload.github.com/types/npm-v8flags/tar.gz/de224ae1cd5fd7dbb4e7158a6cc7a29e5315930d" 50 | 51 | "@types/yn@types/npm-yn#ca75f6c82940fae6a06fb41d2d37a6aa9b4ea8e9": 52 | version "2.0.0" 53 | resolved "https://codeload.github.com/types/npm-yn/tar.gz/ca75f6c82940fae6a06fb41d2d37a6aa9b4ea8e9" 54 | 55 | ansi-escapes@^1.0.0: 56 | version "1.4.0" 57 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" 58 | 59 | ansi-regex@^2.0.0: 60 | version "2.1.1" 61 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" 62 | 63 | ansi-regex@^3.0.0: 64 | version "3.0.0" 65 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 66 | 67 | ansi-styles@^2.2.1: 68 | version "2.2.1" 69 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 70 | 71 | ansi-styles@^3.1.0, ansi-styles@^3.2.0: 72 | version "3.2.0" 73 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" 74 | dependencies: 75 | color-convert "^1.9.0" 76 | 77 | any-observable@^0.2.0: 78 | version "0.2.0" 79 | resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.2.0.tgz#c67870058003579009083f54ac0abafb5c33d242" 80 | 81 | app-root-path@^2.0.0: 82 | version "2.0.1" 83 | resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-2.0.1.tgz#cd62dcf8e4fd5a417efc664d2e5b10653c651b46" 84 | 85 | argparse@^1.0.7: 86 | version "1.0.10" 87 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 88 | dependencies: 89 | sprintf-js "~1.0.2" 90 | 91 | arrify@^1.0.0: 92 | version "1.0.1" 93 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 94 | 95 | babel-code-frame@^6.22.0: 96 | version "6.26.0" 97 | resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" 98 | dependencies: 99 | chalk "^1.1.3" 100 | esutils "^2.0.2" 101 | js-tokens "^3.0.2" 102 | 103 | balanced-match@^1.0.0: 104 | version "1.0.0" 105 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 106 | 107 | brace-expansion@^1.1.7: 108 | version "1.1.8" 109 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" 110 | dependencies: 111 | balanced-match "^1.0.0" 112 | concat-map "0.0.1" 113 | 114 | builtin-modules@^1.1.1: 115 | version "1.1.1" 116 | resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" 117 | 118 | chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: 119 | version "1.1.3" 120 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" 121 | dependencies: 122 | ansi-styles "^2.2.1" 123 | escape-string-regexp "^1.0.2" 124 | has-ansi "^2.0.0" 125 | strip-ansi "^3.0.0" 126 | supports-color "^2.0.0" 127 | 128 | chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0: 129 | version "2.3.0" 130 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" 131 | dependencies: 132 | ansi-styles "^3.1.0" 133 | escape-string-regexp "^1.0.5" 134 | supports-color "^4.0.0" 135 | 136 | ci-info@^1.0.0: 137 | version "1.1.2" 138 | resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4" 139 | 140 | cli-cursor@^1.0.2: 141 | version "1.0.2" 142 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987" 143 | dependencies: 144 | restore-cursor "^1.0.1" 145 | 146 | cli-spinners@^0.1.2: 147 | version "0.1.2" 148 | resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-0.1.2.tgz#bb764d88e185fb9e1e6a2a1f19772318f605e31c" 149 | 150 | cli-truncate@^0.2.1: 151 | version "0.2.1" 152 | resolved "https://registry.yarnpkg.com/cli-truncate/-/cli-truncate-0.2.1.tgz#9f15cfbb0705005369216c626ac7d05ab90dd574" 153 | dependencies: 154 | slice-ansi "0.0.4" 155 | string-width "^1.0.1" 156 | 157 | code-point-at@^1.0.0: 158 | version "1.1.0" 159 | resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" 160 | 161 | color-convert@^1.9.0: 162 | version "1.9.1" 163 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" 164 | dependencies: 165 | color-name "^1.1.1" 166 | 167 | color-name@^1.1.1: 168 | version "1.1.3" 169 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 170 | 171 | commander@^2.11.0, commander@^2.12.2, commander@^2.9.0: 172 | version "2.12.2" 173 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" 174 | 175 | concat-map@0.0.1: 176 | version "0.0.1" 177 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 178 | 179 | cosmiconfig@^3.1.0: 180 | version "3.1.0" 181 | resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-3.1.0.tgz#640a94bf9847f321800403cd273af60665c73397" 182 | dependencies: 183 | is-directory "^0.3.1" 184 | js-yaml "^3.9.0" 185 | parse-json "^3.0.0" 186 | require-from-string "^2.0.1" 187 | 188 | cross-spawn@^5.0.1: 189 | version "5.1.0" 190 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" 191 | dependencies: 192 | lru-cache "^4.0.1" 193 | shebang-command "^1.2.0" 194 | which "^1.2.9" 195 | 196 | date-fns@^1.27.2: 197 | version "1.29.0" 198 | resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.29.0.tgz#12e609cdcb935127311d04d33334e2960a2a54e6" 199 | 200 | debug@^3.1.0: 201 | version "3.1.0" 202 | resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" 203 | dependencies: 204 | ms "2.0.0" 205 | 206 | dedent@^0.7.0: 207 | version "0.7.0" 208 | resolved "https://registry.yarnpkg.com/dedent/-/dedent-0.7.0.tgz#2495ddbaf6eb874abb0e1be9df22d2e5a544326c" 209 | 210 | deep-equal@~1.0.1: 211 | version "1.0.1" 212 | resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" 213 | 214 | define-properties@^1.1.2: 215 | version "1.1.2" 216 | resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" 217 | dependencies: 218 | foreach "^2.0.5" 219 | object-keys "^1.0.8" 220 | 221 | defined@~1.0.0: 222 | version "1.0.0" 223 | resolved "https://registry.yarnpkg.com/defined/-/defined-1.0.0.tgz#c98d9bcef75674188e110969151199e39b1fa693" 224 | 225 | diff@^3.1.0, diff@^3.2.0: 226 | version "3.5.0" 227 | resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" 228 | 229 | elegant-spinner@^1.0.1: 230 | version "1.0.1" 231 | resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" 232 | 233 | error-ex@^1.3.1: 234 | version "1.3.1" 235 | resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" 236 | dependencies: 237 | is-arrayish "^0.2.1" 238 | 239 | es-abstract@^1.5.0: 240 | version "1.10.0" 241 | resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" 242 | dependencies: 243 | es-to-primitive "^1.1.1" 244 | function-bind "^1.1.1" 245 | has "^1.0.1" 246 | is-callable "^1.1.3" 247 | is-regex "^1.0.4" 248 | 249 | es-to-primitive@^1.1.1: 250 | version "1.1.1" 251 | resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" 252 | dependencies: 253 | is-callable "^1.1.1" 254 | is-date-object "^1.0.1" 255 | is-symbol "^1.0.1" 256 | 257 | escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: 258 | version "1.0.5" 259 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 260 | 261 | esprima@^4.0.0: 262 | version "4.0.1" 263 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 264 | 265 | esutils@^2.0.2: 266 | version "2.0.2" 267 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 268 | 269 | execa@^0.8.0: 270 | version "0.8.0" 271 | resolved "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz#d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da" 272 | dependencies: 273 | cross-spawn "^5.0.1" 274 | get-stream "^3.0.0" 275 | is-stream "^1.1.0" 276 | npm-run-path "^2.0.0" 277 | p-finally "^1.0.0" 278 | signal-exit "^3.0.0" 279 | strip-eof "^1.0.0" 280 | 281 | exit-hook@^1.0.0: 282 | version "1.1.1" 283 | resolved "https://registry.yarnpkg.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" 284 | 285 | figures@^1.7.0: 286 | version "1.7.0" 287 | resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" 288 | dependencies: 289 | escape-string-regexp "^1.0.5" 290 | object-assign "^4.1.0" 291 | 292 | find-parent-dir@^0.3.0: 293 | version "0.3.0" 294 | resolved "https://registry.yarnpkg.com/find-parent-dir/-/find-parent-dir-0.3.0.tgz#33c44b429ab2b2f0646299c5f9f718f376ff8d54" 295 | 296 | for-each@~0.3.2: 297 | version "0.3.2" 298 | resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" 299 | dependencies: 300 | is-function "~1.0.0" 301 | 302 | foreach@^2.0.5: 303 | version "2.0.5" 304 | resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" 305 | 306 | fs.realpath@^1.0.0: 307 | version "1.0.0" 308 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 309 | 310 | function-bind@^1.0.2, function-bind@^1.1.1, function-bind@~1.1.0: 311 | version "1.1.1" 312 | resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" 313 | 314 | get-own-enumerable-property-symbols@^2.0.1: 315 | version "2.0.1" 316 | resolved "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz#5c4ad87f2834c4b9b4e84549dc1e0650fb38c24b" 317 | 318 | get-stream@^3.0.0: 319 | version "3.0.0" 320 | resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" 321 | 322 | glob@^7.0.5, glob@^7.1.1, glob@~7.1.2: 323 | version "7.1.2" 324 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" 325 | dependencies: 326 | fs.realpath "^1.0.0" 327 | inflight "^1.0.4" 328 | inherits "2" 329 | minimatch "^3.0.4" 330 | once "^1.3.0" 331 | path-is-absolute "^1.0.0" 332 | 333 | has-ansi@^2.0.0: 334 | version "2.0.0" 335 | resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" 336 | dependencies: 337 | ansi-regex "^2.0.0" 338 | 339 | has-flag@^2.0.0: 340 | version "2.0.0" 341 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" 342 | 343 | has@^1.0.1, has@~1.0.1: 344 | version "1.0.1" 345 | resolved "https://registry.yarnpkg.com/has/-/has-1.0.1.tgz#8461733f538b0837c9361e39a9ab9e9704dc2f28" 346 | dependencies: 347 | function-bind "^1.0.2" 348 | 349 | homedir-polyfill@^1.0.1: 350 | version "1.0.1" 351 | resolved "https://registry.yarnpkg.com/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz#4c2bbc8a758998feebf5ed68580f76d46768b4bc" 352 | dependencies: 353 | parse-passwd "^1.0.0" 354 | 355 | husky@^0.14.3: 356 | version "0.14.3" 357 | resolved "https://registry.yarnpkg.com/husky/-/husky-0.14.3.tgz#c69ed74e2d2779769a17ba8399b54ce0b63c12c3" 358 | dependencies: 359 | is-ci "^1.0.10" 360 | normalize-path "^1.0.0" 361 | strip-indent "^2.0.0" 362 | 363 | indent-string@^2.1.0: 364 | version "2.1.0" 365 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" 366 | dependencies: 367 | repeating "^2.0.0" 368 | 369 | indent-string@^3.0.0: 370 | version "3.2.0" 371 | resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-3.2.0.tgz#4a5fd6d27cc332f37e5419a504dbb837105c9289" 372 | 373 | inflight@^1.0.4: 374 | version "1.0.6" 375 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 376 | dependencies: 377 | once "^1.3.0" 378 | wrappy "1" 379 | 380 | inherits@2, inherits@~2.0.3: 381 | version "2.0.3" 382 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 383 | 384 | is-arrayish@^0.2.1: 385 | version "0.2.1" 386 | resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" 387 | 388 | is-callable@^1.1.1, is-callable@^1.1.3: 389 | version "1.1.3" 390 | resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" 391 | 392 | is-ci@^1.0.10: 393 | version "1.0.10" 394 | resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" 395 | dependencies: 396 | ci-info "^1.0.0" 397 | 398 | is-date-object@^1.0.1: 399 | version "1.0.1" 400 | resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" 401 | 402 | is-directory@^0.3.1: 403 | version "0.3.1" 404 | resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" 405 | 406 | is-extglob@^2.1.1: 407 | version "2.1.1" 408 | resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" 409 | 410 | is-finite@^1.0.0: 411 | version "1.0.2" 412 | resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" 413 | dependencies: 414 | number-is-nan "^1.0.0" 415 | 416 | is-fullwidth-code-point@^1.0.0: 417 | version "1.0.0" 418 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" 419 | dependencies: 420 | number-is-nan "^1.0.0" 421 | 422 | is-function@~1.0.0: 423 | version "1.0.1" 424 | resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.1.tgz#12cfb98b65b57dd3d193a3121f5f6e2f437602b5" 425 | 426 | is-glob@^4.0.0: 427 | version "4.0.0" 428 | resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.0.tgz#9521c76845cc2610a85203ddf080a958c2ffabc0" 429 | dependencies: 430 | is-extglob "^2.1.1" 431 | 432 | is-obj@^1.0.1: 433 | version "1.0.1" 434 | resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" 435 | 436 | is-observable@^0.2.0: 437 | version "0.2.0" 438 | resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-0.2.0.tgz#b361311d83c6e5d726cabf5e250b0237106f5ae2" 439 | dependencies: 440 | symbol-observable "^0.2.2" 441 | 442 | is-promise@^2.1.0: 443 | version "2.1.0" 444 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 445 | 446 | is-regex@^1.0.4: 447 | version "1.0.4" 448 | resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" 449 | dependencies: 450 | has "^1.0.1" 451 | 452 | is-regexp@^1.0.0: 453 | version "1.0.0" 454 | resolved "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz#fd2d883545c46bac5a633e7b9a09e87fa2cb5069" 455 | 456 | is-stream@^1.1.0: 457 | version "1.1.0" 458 | resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" 459 | 460 | is-symbol@^1.0.1: 461 | version "1.0.1" 462 | resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" 463 | 464 | isexe@^2.0.0: 465 | version "2.0.0" 466 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 467 | 468 | jest-get-type@^21.2.0: 469 | version "21.2.0" 470 | resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-21.2.0.tgz#f6376ab9db4b60d81e39f30749c6c466f40d4a23" 471 | 472 | jest-validate@^21.1.0: 473 | version "21.2.1" 474 | resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-21.2.1.tgz#cc0cbca653cd54937ba4f2a111796774530dd3c7" 475 | dependencies: 476 | chalk "^2.0.1" 477 | jest-get-type "^21.2.0" 478 | leven "^2.1.0" 479 | pretty-format "^21.2.1" 480 | 481 | js-tokens@^3.0.2: 482 | version "3.0.2" 483 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 484 | 485 | js-yaml@^3.9.0: 486 | version "3.13.1" 487 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.13.1.tgz#aff151b30bfdfa8e49e05da22e7415e9dfa37847" 488 | dependencies: 489 | argparse "^1.0.7" 490 | esprima "^4.0.0" 491 | 492 | leven@^2.1.0: 493 | version "2.1.0" 494 | resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" 495 | 496 | lint-staged@^6.0.0: 497 | version "6.0.0" 498 | resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-6.0.0.tgz#7ab7d345f2fe302ff196f1de6a005594ace03210" 499 | dependencies: 500 | app-root-path "^2.0.0" 501 | chalk "^2.1.0" 502 | commander "^2.11.0" 503 | cosmiconfig "^3.1.0" 504 | debug "^3.1.0" 505 | dedent "^0.7.0" 506 | execa "^0.8.0" 507 | find-parent-dir "^0.3.0" 508 | is-glob "^4.0.0" 509 | jest-validate "^21.1.0" 510 | listr "^0.13.0" 511 | lodash "^4.17.4" 512 | log-symbols "^2.0.0" 513 | minimatch "^3.0.0" 514 | npm-which "^3.0.1" 515 | p-map "^1.1.1" 516 | path-is-inside "^1.0.2" 517 | pify "^3.0.0" 518 | staged-git-files "0.0.4" 519 | stringify-object "^3.2.0" 520 | 521 | listr-silent-renderer@^1.1.1: 522 | version "1.1.1" 523 | resolved "https://registry.yarnpkg.com/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz#924b5a3757153770bf1a8e3fbf74b8bbf3f9242e" 524 | 525 | listr-update-renderer@^0.4.0: 526 | version "0.4.0" 527 | resolved "https://registry.yarnpkg.com/listr-update-renderer/-/listr-update-renderer-0.4.0.tgz#344d980da2ca2e8b145ba305908f32ae3f4cc8a7" 528 | dependencies: 529 | chalk "^1.1.3" 530 | cli-truncate "^0.2.1" 531 | elegant-spinner "^1.0.1" 532 | figures "^1.7.0" 533 | indent-string "^3.0.0" 534 | log-symbols "^1.0.2" 535 | log-update "^1.0.2" 536 | strip-ansi "^3.0.1" 537 | 538 | listr-verbose-renderer@^0.4.0: 539 | version "0.4.1" 540 | resolved "https://registry.yarnpkg.com/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz#8206f4cf6d52ddc5827e5fd14989e0e965933a35" 541 | dependencies: 542 | chalk "^1.1.3" 543 | cli-cursor "^1.0.2" 544 | date-fns "^1.27.2" 545 | figures "^1.7.0" 546 | 547 | listr@^0.13.0: 548 | version "0.13.0" 549 | resolved "https://registry.yarnpkg.com/listr/-/listr-0.13.0.tgz#20bb0ba30bae660ee84cc0503df4be3d5623887d" 550 | dependencies: 551 | chalk "^1.1.3" 552 | cli-truncate "^0.2.1" 553 | figures "^1.7.0" 554 | indent-string "^2.1.0" 555 | is-observable "^0.2.0" 556 | is-promise "^2.1.0" 557 | is-stream "^1.1.0" 558 | listr-silent-renderer "^1.1.1" 559 | listr-update-renderer "^0.4.0" 560 | listr-verbose-renderer "^0.4.0" 561 | log-symbols "^1.0.2" 562 | log-update "^1.0.2" 563 | ora "^0.2.3" 564 | p-map "^1.1.1" 565 | rxjs "^5.4.2" 566 | stream-to-observable "^0.2.0" 567 | strip-ansi "^3.0.1" 568 | 569 | lodash@^4.17.4: 570 | version "4.17.15" 571 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 572 | 573 | log-symbols@^1.0.2: 574 | version "1.0.2" 575 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-1.0.2.tgz#376ff7b58ea3086a0f09facc74617eca501e1a18" 576 | dependencies: 577 | chalk "^1.0.0" 578 | 579 | log-symbols@^2.0.0: 580 | version "2.1.0" 581 | resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.1.0.tgz#f35fa60e278832b538dc4dddcbb478a45d3e3be6" 582 | dependencies: 583 | chalk "^2.0.1" 584 | 585 | log-update@^1.0.2: 586 | version "1.0.2" 587 | resolved "https://registry.yarnpkg.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1" 588 | dependencies: 589 | ansi-escapes "^1.0.0" 590 | cli-cursor "^1.0.2" 591 | 592 | lru-cache@^4.0.1: 593 | version "4.1.1" 594 | resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.1.tgz#622e32e82488b49279114a4f9ecf45e7cd6bba55" 595 | dependencies: 596 | pseudomap "^1.0.2" 597 | yallist "^2.1.2" 598 | 599 | make-error@^1.1.1: 600 | version "1.3.0" 601 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.0.tgz#52ad3a339ccf10ce62b4040b708fe707244b8b96" 602 | 603 | minimatch@^3.0.0, minimatch@^3.0.4: 604 | version "3.0.4" 605 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 606 | dependencies: 607 | brace-expansion "^1.1.7" 608 | 609 | minimist@0.0.8: 610 | version "0.0.8" 611 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 612 | 613 | minimist@^1.2.0, minimist@~1.2.0: 614 | version "1.2.0" 615 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" 616 | 617 | mkdirp@^0.5.1: 618 | version "0.5.1" 619 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 620 | dependencies: 621 | minimist "0.0.8" 622 | 623 | ms@2.0.0: 624 | version "2.0.0" 625 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" 626 | 627 | normalize-path@^1.0.0: 628 | version "1.0.0" 629 | resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz#32d0e472f91ff345701c15a8311018d3b0a90379" 630 | 631 | npm-path@^2.0.2: 632 | version "2.0.3" 633 | resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.3.tgz#15cff4e1c89a38da77f56f6055b24f975dfb2bbe" 634 | dependencies: 635 | which "^1.2.10" 636 | 637 | npm-run-path@^2.0.0: 638 | version "2.0.2" 639 | resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" 640 | dependencies: 641 | path-key "^2.0.0" 642 | 643 | npm-which@^3.0.1: 644 | version "3.0.1" 645 | resolved "https://registry.yarnpkg.com/npm-which/-/npm-which-3.0.1.tgz#9225f26ec3a285c209cae67c3b11a6b4ab7140aa" 646 | dependencies: 647 | commander "^2.9.0" 648 | npm-path "^2.0.2" 649 | which "^1.2.10" 650 | 651 | number-is-nan@^1.0.0: 652 | version "1.0.1" 653 | resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" 654 | 655 | object-assign@^4.0.1, object-assign@^4.1.0: 656 | version "4.1.1" 657 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 658 | 659 | object-inspect@~1.3.0: 660 | version "1.3.0" 661 | resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.3.0.tgz#5b1eb8e6742e2ee83342a637034d844928ba2f6d" 662 | 663 | object-keys@^1.0.8: 664 | version "1.0.11" 665 | resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" 666 | 667 | once@^1.3.0: 668 | version "1.4.0" 669 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 670 | dependencies: 671 | wrappy "1" 672 | 673 | onetime@^1.0.0: 674 | version "1.1.0" 675 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789" 676 | 677 | ora@^0.2.3: 678 | version "0.2.3" 679 | resolved "https://registry.yarnpkg.com/ora/-/ora-0.2.3.tgz#37527d220adcd53c39b73571d754156d5db657a4" 680 | dependencies: 681 | chalk "^1.1.1" 682 | cli-cursor "^1.0.2" 683 | cli-spinners "^0.1.2" 684 | object-assign "^4.0.1" 685 | 686 | p-finally@^1.0.0: 687 | version "1.0.0" 688 | resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" 689 | 690 | p-map@^1.1.1: 691 | version "1.2.0" 692 | resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" 693 | 694 | parse-json@^3.0.0: 695 | version "3.0.0" 696 | resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-3.0.0.tgz#fa6f47b18e23826ead32f263e744d0e1e847fb13" 697 | dependencies: 698 | error-ex "^1.3.1" 699 | 700 | parse-passwd@^1.0.0: 701 | version "1.0.0" 702 | resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" 703 | 704 | path-is-absolute@^1.0.0: 705 | version "1.0.1" 706 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 707 | 708 | path-is-inside@^1.0.2: 709 | version "1.0.2" 710 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 711 | 712 | path-key@^2.0.0: 713 | version "2.0.1" 714 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 715 | 716 | path-parse@^1.0.5: 717 | version "1.0.5" 718 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" 719 | 720 | pify@^3.0.0: 721 | version "3.0.0" 722 | resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176" 723 | 724 | prettier@^1.9.2: 725 | version "1.9.2" 726 | resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.9.2.tgz#96bc2132f7a32338e6078aeb29727178c6335827" 727 | 728 | pretty-format@^21.2.1: 729 | version "21.2.1" 730 | resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-21.2.1.tgz#ae5407f3cf21066cd011aa1ba5fce7b6a2eddb36" 731 | dependencies: 732 | ansi-regex "^3.0.0" 733 | ansi-styles "^3.2.0" 734 | 735 | pseudomap@^1.0.2: 736 | version "1.0.2" 737 | resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" 738 | 739 | repeating@^2.0.0: 740 | version "2.0.1" 741 | resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" 742 | dependencies: 743 | is-finite "^1.0.0" 744 | 745 | require-from-string@^2.0.1: 746 | version "2.0.1" 747 | resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.1.tgz#c545233e9d7da6616e9d59adfb39fc9f588676ff" 748 | 749 | resolve@^1.3.2: 750 | version "1.5.0" 751 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" 752 | dependencies: 753 | path-parse "^1.0.5" 754 | 755 | resolve@~1.4.0: 756 | version "1.4.0" 757 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.4.0.tgz#a75be01c53da25d934a98ebd0e4c4a7312f92a86" 758 | dependencies: 759 | path-parse "^1.0.5" 760 | 761 | restore-cursor@^1.0.1: 762 | version "1.0.1" 763 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" 764 | dependencies: 765 | exit-hook "^1.0.0" 766 | onetime "^1.0.0" 767 | 768 | resumer@~0.0.0: 769 | version "0.0.0" 770 | resolved "https://registry.yarnpkg.com/resumer/-/resumer-0.0.0.tgz#f1e8f461e4064ba39e82af3cdc2a8c893d076759" 771 | dependencies: 772 | through "~2.3.4" 773 | 774 | rimraf@^2.5.4: 775 | version "2.6.2" 776 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 777 | dependencies: 778 | glob "^7.0.5" 779 | 780 | rxjs@^5.4.2: 781 | version "5.5.5" 782 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.5.tgz#e164f11d38eaf29f56f08c3447f74ff02dd84e97" 783 | dependencies: 784 | symbol-observable "1.0.1" 785 | 786 | semver@^5.3.0: 787 | version "5.4.1" 788 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" 789 | 790 | shebang-command@^1.2.0: 791 | version "1.2.0" 792 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 793 | dependencies: 794 | shebang-regex "^1.0.0" 795 | 796 | shebang-regex@^1.0.0: 797 | version "1.0.0" 798 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 799 | 800 | signal-exit@^3.0.0: 801 | version "3.0.2" 802 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 803 | 804 | slice-ansi@0.0.4: 805 | version "0.0.4" 806 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-0.0.4.tgz#edbf8903f66f7ce2f8eafd6ceed65e264c831b35" 807 | 808 | source-map-support@^0.5.0: 809 | version "0.5.0" 810 | resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.0.tgz#2018a7ad2bdf8faf2691e5fddab26bed5a2bacab" 811 | dependencies: 812 | source-map "^0.6.0" 813 | 814 | source-map@^0.6.0: 815 | version "0.6.1" 816 | resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 817 | 818 | sprintf-js@~1.0.2: 819 | version "1.0.3" 820 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 821 | 822 | staged-git-files@0.0.4: 823 | version "0.0.4" 824 | resolved "https://registry.yarnpkg.com/staged-git-files/-/staged-git-files-0.0.4.tgz#d797e1b551ca7a639dec0237dc6eb4bb9be17d35" 825 | 826 | stream-to-observable@^0.2.0: 827 | version "0.2.0" 828 | resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.2.0.tgz#59d6ea393d87c2c0ddac10aa0d561bc6ba6f0e10" 829 | dependencies: 830 | any-observable "^0.2.0" 831 | 832 | string-width@^1.0.1: 833 | version "1.0.2" 834 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" 835 | dependencies: 836 | code-point-at "^1.0.0" 837 | is-fullwidth-code-point "^1.0.0" 838 | strip-ansi "^3.0.0" 839 | 840 | string.prototype.trim@~1.1.2: 841 | version "1.1.2" 842 | resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.1.2.tgz#d04de2c89e137f4d7d206f086b5ed2fae6be8cea" 843 | dependencies: 844 | define-properties "^1.1.2" 845 | es-abstract "^1.5.0" 846 | function-bind "^1.0.2" 847 | 848 | stringify-object@^3.2.0: 849 | version "3.2.1" 850 | resolved "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.2.1.tgz#2720c2eff940854c819f6ee252aaeb581f30624d" 851 | dependencies: 852 | get-own-enumerable-property-symbols "^2.0.1" 853 | is-obj "^1.0.1" 854 | is-regexp "^1.0.0" 855 | 856 | strip-ansi@^3.0.0, strip-ansi@^3.0.1: 857 | version "3.0.1" 858 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" 859 | dependencies: 860 | ansi-regex "^2.0.0" 861 | 862 | strip-bom@^3.0.0: 863 | version "3.0.0" 864 | resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 865 | 866 | strip-eof@^1.0.0: 867 | version "1.0.0" 868 | resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" 869 | 870 | strip-indent@^2.0.0: 871 | version "2.0.0" 872 | resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz#5ef8db295d01e6ed6cbf7aab96998d7822527b68" 873 | 874 | strip-json-comments@^2.0.0: 875 | version "2.0.1" 876 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 877 | 878 | supports-color@^2.0.0: 879 | version "2.0.0" 880 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 881 | 882 | supports-color@^4.0.0: 883 | version "4.5.0" 884 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" 885 | dependencies: 886 | has-flag "^2.0.0" 887 | 888 | symbol-observable@1.0.1: 889 | version "1.0.1" 890 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" 891 | 892 | symbol-observable@^0.2.2: 893 | version "0.2.4" 894 | resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" 895 | 896 | tape@^4.8.0: 897 | version "4.8.0" 898 | resolved "https://registry.yarnpkg.com/tape/-/tape-4.8.0.tgz#f6a9fec41cc50a1de50fa33603ab580991f6068e" 899 | dependencies: 900 | deep-equal "~1.0.1" 901 | defined "~1.0.0" 902 | for-each "~0.3.2" 903 | function-bind "~1.1.0" 904 | glob "~7.1.2" 905 | has "~1.0.1" 906 | inherits "~2.0.3" 907 | minimist "~1.2.0" 908 | object-inspect "~1.3.0" 909 | resolve "~1.4.0" 910 | resumer "~0.0.0" 911 | string.prototype.trim "~1.1.2" 912 | through "~2.3.8" 913 | 914 | through@~2.3.4, through@~2.3.8: 915 | version "2.3.8" 916 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 917 | 918 | ts-node@^4.0.1: 919 | version "4.0.1" 920 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-4.0.1.tgz#4d368088b50c382d78285c029784ea0f32a4eb5c" 921 | dependencies: 922 | "@types/arrify" "^1.0.1" 923 | "@types/diff" "^3.2.1" 924 | "@types/minimist" "^1.2.0" 925 | "@types/mkdirp" "^0.5.0" 926 | "@types/node" "^8.0.27" 927 | "@types/source-map-support" "^0.4.0" 928 | "@types/v8flags" types/npm-v8flags#de224ae1cd5fd7dbb4e7158a6cc7a29e5315930d 929 | "@types/yn" types/npm-yn#ca75f6c82940fae6a06fb41d2d37a6aa9b4ea8e9 930 | arrify "^1.0.0" 931 | chalk "^2.3.0" 932 | diff "^3.1.0" 933 | make-error "^1.1.1" 934 | minimist "^1.2.0" 935 | mkdirp "^0.5.1" 936 | source-map-support "^0.5.0" 937 | tsconfig "^7.0.0" 938 | v8flags "^3.0.0" 939 | yn "^2.0.0" 940 | 941 | tsconfig@^7.0.0: 942 | version "7.0.0" 943 | resolved "https://registry.yarnpkg.com/tsconfig/-/tsconfig-7.0.0.tgz#84538875a4dc216e5c4a5432b3a4dec3d54e91b7" 944 | dependencies: 945 | "@types/strip-bom" "^3.0.0" 946 | "@types/strip-json-comments" "0.0.30" 947 | strip-bom "^3.0.0" 948 | strip-json-comments "^2.0.0" 949 | 950 | tslib@^1.7.1: 951 | version "1.8.1" 952 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.8.1.tgz#6946af2d1d651a7b1863b531d6e5afa41aa44eac" 953 | 954 | tslint@^5.8.0: 955 | version "5.8.0" 956 | resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.8.0.tgz#1f49ad5b2e77c76c3af4ddcae552ae4e3612eb13" 957 | dependencies: 958 | babel-code-frame "^6.22.0" 959 | builtin-modules "^1.1.1" 960 | chalk "^2.1.0" 961 | commander "^2.9.0" 962 | diff "^3.2.0" 963 | glob "^7.1.1" 964 | minimatch "^3.0.4" 965 | resolve "^1.3.2" 966 | semver "^5.3.0" 967 | tslib "^1.7.1" 968 | tsutils "^2.12.1" 969 | 970 | tsutils@^2.12.1: 971 | version "2.13.0" 972 | resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.13.0.tgz#0f52b6aabbc4216e72796b66db028c6cf173e144" 973 | dependencies: 974 | tslib "^1.7.1" 975 | 976 | typescript@~3.0.0: 977 | version "3.0.3" 978 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.0.3.tgz#4853b3e275ecdaa27f78fda46dc273a7eb7fc1c8" 979 | 980 | v8flags@^3.0.0: 981 | version "3.0.1" 982 | resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.0.1.tgz#dce8fc379c17d9f2c9e9ed78d89ce00052b1b76b" 983 | dependencies: 984 | homedir-polyfill "^1.0.1" 985 | 986 | which@^1.2.10, which@^1.2.9: 987 | version "1.3.0" 988 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" 989 | dependencies: 990 | isexe "^2.0.0" 991 | 992 | wrappy@1: 993 | version "1.0.2" 994 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 995 | 996 | yallist@^2.1.2: 997 | version "2.1.2" 998 | resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" 999 | 1000 | yn@^2.0.0: 1001 | version "2.0.0" 1002 | resolved "https://registry.yarnpkg.com/yn/-/yn-2.0.0.tgz#e5adabc8acf408f6385fc76495684c88e6af689a" 1003 | --------------------------------------------------------------------------------