From f8ad4d1e996666ee7ff969b7deb16a3ea91fdcfc Mon Sep 17 00:00:00 2001 From: Keen Yee Liau Date: Mon, 17 Dec 2018 23:44:26 -0800 Subject: [PATCH] test(language-service): Improve integration test (#28168) The current integration test for language service involves piping the results of one process to another using Unix pipes. This makes the test hard to debug, and hard to configure. This commit refactors the integration test to use regular Jasmine scaffolding. More importantly, it tests the way the language service will actually be installed by end users. Users would not have to add `@angular/language-service` to the plugins section in tsconfig.json Instead, all they need to do is install the *extension* from the VS Code Marketplace and Angular Language Service will be loaded as a global plugin. PR Close #28168 --- .../language_service_plugin/.gitignore | 4 +- .../fixtures/getCompletions-expected-2.3.json | 260 ----- .../fixtures/getCompletions.json | 68 -- .../fixtures/smokeTest.json | 45 - .../language_service_plugin/generate.ts | 22 + .../compilerOptionsForInferredProjects.json} | 13 +- .../goldens/completionInfo.json | 266 +++++ .../goldens/configure.json | 7 + .../language_service_plugin/matcher.ts | 32 + .../language_service_plugin/package.json | 21 +- .../project/tsconfig.json | 5 +- .../language_service_plugin/scripts/env.sh | 2 - .../scripts/install.sh | 16 - .../language_service_plugin/scripts/test.sh | 30 - .../scripts/update_golden.sh | 8 - integration/language_service_plugin/test.ts | 104 ++ .../tools/load_test.ts | 35 - .../tools/tsconfig.json | 19 - .../tools/typescript_host.ts | 77 -- .../tools/typescript_validator.ts | 164 --- .../language_service_plugin/tsclient.ts | 70 ++ .../language_service_plugin/tsconfig.json | 67 +- .../typescripts/2.3/package.json | 15 - .../typescripts/2.3/yarn.lock | 7 - integration/language_service_plugin/yarn.lock | 969 +----------------- 25 files changed, 608 insertions(+), 1718 deletions(-) delete mode 100644 integration/language_service_plugin/fixtures/getCompletions-expected-2.3.json delete mode 100644 integration/language_service_plugin/fixtures/getCompletions.json delete mode 100644 integration/language_service_plugin/fixtures/smokeTest.json create mode 100644 integration/language_service_plugin/generate.ts rename integration/language_service_plugin/{fixtures/smokeTest-expected-2.3.json => goldens/compilerOptionsForInferredProjects.json} (56%) create mode 100644 integration/language_service_plugin/goldens/completionInfo.json create mode 100644 integration/language_service_plugin/goldens/configure.json create mode 100644 integration/language_service_plugin/matcher.ts delete mode 100755 integration/language_service_plugin/scripts/env.sh delete mode 100755 integration/language_service_plugin/scripts/install.sh delete mode 100755 integration/language_service_plugin/scripts/test.sh delete mode 100755 integration/language_service_plugin/scripts/update_golden.sh create mode 100644 integration/language_service_plugin/test.ts delete mode 100644 integration/language_service_plugin/tools/load_test.ts delete mode 100644 integration/language_service_plugin/tools/tsconfig.json delete mode 100644 integration/language_service_plugin/tools/typescript_host.ts delete mode 100644 integration/language_service_plugin/tools/typescript_validator.ts create mode 100644 integration/language_service_plugin/tsclient.ts delete mode 100644 integration/language_service_plugin/typescripts/2.3/package.json delete mode 100644 integration/language_service_plugin/typescripts/2.3/yarn.lock diff --git a/integration/language_service_plugin/.gitignore b/integration/language_service_plugin/.gitignore index 4c43fe68f6..7420cfbcc3 100644 --- a/integration/language_service_plugin/.gitignore +++ b/integration/language_service_plugin/.gitignore @@ -1 +1,3 @@ -*.js \ No newline at end of file +*.js +tsserver.log +ti-*.log diff --git a/integration/language_service_plugin/fixtures/getCompletions-expected-2.3.json b/integration/language_service_plugin/fixtures/getCompletions-expected-2.3.json deleted file mode 100644 index 3560e80927..0000000000 --- a/integration/language_service_plugin/fixtures/getCompletions-expected-2.3.json +++ /dev/null @@ -1,260 +0,0 @@ -[ - { - "type": "response", - "command": "configure", - "success": true - }, - { - "type": "response", - "command": "compilerOptionsForInferredProjects", - "success": true, - "body": true - }, - { - "type": "response", - "command": "completions", - "success": true, - "body": [ - { - "name": "anchor", - "kind": "method", - "kindModifiers": "", - "sortText": "anchor" - }, - { - "name": "big", - "kind": "method", - "kindModifiers": "", - "sortText": "big" - }, - { - "name": "blink", - "kind": "method", - "kindModifiers": "", - "sortText": "blink" - }, - { - "name": "bold", - "kind": "method", - "kindModifiers": "", - "sortText": "bold" - }, - { - "name": "charAt", - "kind": "method", - "kindModifiers": "", - "sortText": "charAt" - }, - { - "name": "charCodeAt", - "kind": "method", - "kindModifiers": "", - "sortText": "charCodeAt" - }, - { - "name": "codePointAt", - "kind": "method", - "kindModifiers": "", - "sortText": "codePointAt" - }, - { - "name": "concat", - "kind": "method", - "kindModifiers": "", - "sortText": "concat" - }, - { - "name": "endsWith", - "kind": "method", - "kindModifiers": "", - "sortText": "endsWith" - }, - { - "name": "fixed", - "kind": "method", - "kindModifiers": "", - "sortText": "fixed" - }, - { - "name": "fontcolor", - "kind": "method", - "kindModifiers": "", - "sortText": "fontcolor" - }, - { - "name": "fontsize", - "kind": "method", - "kindModifiers": "", - "sortText": "fontsize" - }, - { - "name": "includes", - "kind": "method", - "kindModifiers": "", - "sortText": "includes" - }, - { - "name": "indexOf", - "kind": "method", - "kindModifiers": "", - "sortText": "indexOf" - }, - { - "name": "italics", - "kind": "method", - "kindModifiers": "", - "sortText": "italics" - }, - { - "name": "lastIndexOf", - "kind": "method", - "kindModifiers": "", - "sortText": "lastIndexOf" - }, - { - "name": "length", - "kind": "property", - "kindModifiers": "", - "sortText": "length" - }, - { - "name": "link", - "kind": "method", - "kindModifiers": "", - "sortText": "link" - }, - { - "name": "localeCompare", - "kind": "method", - "kindModifiers": "", - "sortText": "localeCompare" - }, - { - "name": "match", - "kind": "method", - "kindModifiers": "", - "sortText": "match" - }, - { - "name": "normalize", - "kind": "method", - "kindModifiers": "", - "sortText": "normalize" - }, - { - "name": "repeat", - "kind": "method", - "kindModifiers": "", - "sortText": "repeat" - }, - { - "name": "replace", - "kind": "method", - "kindModifiers": "", - "sortText": "replace" - }, - { - "name": "search", - "kind": "method", - "kindModifiers": "", - "sortText": "search" - }, - { - "name": "slice", - "kind": "method", - "kindModifiers": "", - "sortText": "slice" - }, - { - "name": "small", - "kind": "method", - "kindModifiers": "", - "sortText": "small" - }, - { - "name": "split", - "kind": "method", - "kindModifiers": "", - "sortText": "split" - }, - { - "name": "startsWith", - "kind": "method", - "kindModifiers": "", - "sortText": "startsWith" - }, - { - "name": "strike", - "kind": "method", - "kindModifiers": "", - "sortText": "strike" - }, - { - "name": "sub", - "kind": "method", - "kindModifiers": "", - "sortText": "sub" - }, - { - "name": "substr", - "kind": "method", - "kindModifiers": "", - "sortText": "substr" - }, - { - "name": "substring", - "kind": "method", - "kindModifiers": "", - "sortText": "substring" - }, - { - "name": "sup", - "kind": "method", - "kindModifiers": "", - "sortText": "sup" - }, - { - "name": "toLocaleLowerCase", - "kind": "method", - "kindModifiers": "", - "sortText": "toLocaleLowerCase" - }, - { - "name": "toLocaleUpperCase", - "kind": "method", - "kindModifiers": "", - "sortText": "toLocaleUpperCase" - }, - { - "name": "toLowerCase", - "kind": "method", - "kindModifiers": "", - "sortText": "toLowerCase" - }, - { - "name": "toString", - "kind": "method", - "kindModifiers": "", - "sortText": "toString" - }, - { - "name": "toUpperCase", - "kind": "method", - "kindModifiers": "", - "sortText": "toUpperCase" - }, - { - "name": "trim", - "kind": "method", - "kindModifiers": "", - "sortText": "trim" - }, - { - "name": "valueOf", - "kind": "method", - "kindModifiers": "", - "sortText": "valueOf" - } - ] - } -] diff --git a/integration/language_service_plugin/fixtures/getCompletions.json b/integration/language_service_plugin/fixtures/getCompletions.json deleted file mode 100644 index 94be1ebe38..0000000000 --- a/integration/language_service_plugin/fixtures/getCompletions.json +++ /dev/null @@ -1,68 +0,0 @@ -[ - { - "seq": 0, - "type": "request", - "command": "configure", - "arguments": { - "hostInfo": "vscode" - } - }, - { - "seq": 1, - "type": "request", - "command": "compilerOptionsForInferredProjects", - "arguments": { - "options": { - "module": "CommonJS", - "target": "ES6", - "allowSyntheticDefaultImports": true, - "allowNonTsExtensions": true, - "allowJs": true, - "jsx": "Preserve" - } - } - }, - { - "seq": 4, - "type": "request", - "command": "open", - "arguments": { - "file": "$$PWD$$/project/app/app.component.ts", - "fileContent": "import { Component } from '@angular/core';\n\n@Component({\n selector: 'my-app',\n template: `

Hello {{name}}

`,\n})\nexport class AppComponent { name = 'Angular'; }\n" - } - }, - { - "seq": 7, - "type": "request", - "command": "geterr", - "arguments": { - "delay": 0, - "files": [ - "$$PWD$$/project/app/app.component.ts" - ] - } - }, - { - "seq": 12, - "type": "request", - "command": "change", - "arguments": { - "file": "$$PWD$$/project/app/app.component.ts", - "line": 5, - "offset": 30, - "endLine": 5, - "endOffset": 30, - "insertString": "." - } - }, - { - "seq": 13, - "type": "request", - "command": "completions", - "arguments": { - "file": "$$PWD$$/project/app/app.component.ts", - "line": 5, - "offset": 31 - } - } -] \ No newline at end of file diff --git a/integration/language_service_plugin/fixtures/smokeTest.json b/integration/language_service_plugin/fixtures/smokeTest.json deleted file mode 100644 index 7ddc202c9a..0000000000 --- a/integration/language_service_plugin/fixtures/smokeTest.json +++ /dev/null @@ -1,45 +0,0 @@ -[ - { - "seq": 0, - "type": "request", - "command": "configure", - "arguments": { - "hostInfo": "vscode" - } - }, - { - "seq": 1, - "type": "request", - "command": "compilerOptionsForInferredProjects", - "arguments": { - "options": { - "module": "CommonJS", - "target": "ES6", - "allowSyntheticDefaultImports": true, - "allowNonTsExtensions": true, - "allowJs": true, - "jsx": "Preserve" - } - } - }, - { - "seq": 2, - "type": "request", - "command": "open", - "arguments": { - "file": "$$PWD$$/app/app.module.ts", - "fileContent": "" - } - }, - { - "seq": 3, - "type": "request", - "command": "geterr", - "arguments": { - "delay": 0, - "files": [ - "$$PWD$$/app/app.module.ts" - ] - } - } -] \ No newline at end of file diff --git a/integration/language_service_plugin/generate.ts b/integration/language_service_plugin/generate.ts new file mode 100644 index 0000000000..3db7aa54aa --- /dev/null +++ b/integration/language_service_plugin/generate.ts @@ -0,0 +1,22 @@ +/** + * @fileOverview + * This file serves as the entry point for generating goldens file for the + * language service integration test. It expects each golden file that needs + * to be generated to be passed in as command line arguments. + * For example, to generate golden file for the 'configure' request, run + * `yarn golden configure.json`. + * To generate multiple golden files, run + * `yarn golden configure.json completionInfo.json`. + * + * This is different from just running `yarn jasmine test.js` because this + * allows passing in arbitrary arguments. + */ + +import Jasmine = require('jasmine'); + +function main() { + const jasmine = new Jasmine({}); + jasmine.execute(['test.js']); +} + +main() diff --git a/integration/language_service_plugin/fixtures/smokeTest-expected-2.3.json b/integration/language_service_plugin/goldens/compilerOptionsForInferredProjects.json similarity index 56% rename from integration/language_service_plugin/fixtures/smokeTest-expected-2.3.json rename to integration/language_service_plugin/goldens/compilerOptionsForInferredProjects.json index 55645cf60d..38eaa54b68 100644 --- a/integration/language_service_plugin/fixtures/smokeTest-expected-2.3.json +++ b/integration/language_service_plugin/goldens/compilerOptionsForInferredProjects.json @@ -1,13 +1,8 @@ -[ - { - "type": "response", - "command": "configure", - "success": true - }, - { +{ + "seq": 0, "type": "response", "command": "compilerOptionsForInferredProjects", + "request_seq": 1, "success": true, "body": true - } -] +} diff --git a/integration/language_service_plugin/goldens/completionInfo.json b/integration/language_service_plugin/goldens/completionInfo.json new file mode 100644 index 0000000000..3c503000c8 --- /dev/null +++ b/integration/language_service_plugin/goldens/completionInfo.json @@ -0,0 +1,266 @@ +{ + "seq": 0, + "type": "response", + "command": "completionInfo", + "request_seq": 5, + "success": true, + "body": { + "isGlobalCompletion": false, + "isMemberCompletion": false, + "isNewIdentifierLocation": false, + "entries": [ + { + "name": "anchor", + "kind": "method", + "kindModifiers": "", + "sortText": "anchor" + }, + { + "name": "big", + "kind": "method", + "kindModifiers": "", + "sortText": "big" + }, + { + "name": "blink", + "kind": "method", + "kindModifiers": "", + "sortText": "blink" + }, + { + "name": "bold", + "kind": "method", + "kindModifiers": "", + "sortText": "bold" + }, + { + "name": "charAt", + "kind": "method", + "kindModifiers": "", + "sortText": "charAt" + }, + { + "name": "charCodeAt", + "kind": "method", + "kindModifiers": "", + "sortText": "charCodeAt" + }, + { + "name": "codePointAt", + "kind": "method", + "kindModifiers": "", + "sortText": "codePointAt" + }, + { + "name": "concat", + "kind": "method", + "kindModifiers": "", + "sortText": "concat" + }, + { + "name": "endsWith", + "kind": "method", + "kindModifiers": "", + "sortText": "endsWith" + }, + { + "name": "fixed", + "kind": "method", + "kindModifiers": "", + "sortText": "fixed" + }, + { + "name": "fontcolor", + "kind": "method", + "kindModifiers": "", + "sortText": "fontcolor" + }, + { + "name": "fontsize", + "kind": "method", + "kindModifiers": "", + "sortText": "fontsize" + }, + { + "name": "includes", + "kind": "method", + "kindModifiers": "", + "sortText": "includes" + }, + { + "name": "indexOf", + "kind": "method", + "kindModifiers": "", + "sortText": "indexOf" + }, + { + "name": "italics", + "kind": "method", + "kindModifiers": "", + "sortText": "italics" + }, + { + "name": "lastIndexOf", + "kind": "method", + "kindModifiers": "", + "sortText": "lastIndexOf" + }, + { + "name": "length", + "kind": "property", + "kindModifiers": "", + "sortText": "length" + }, + { + "name": "link", + "kind": "method", + "kindModifiers": "", + "sortText": "link" + }, + { + "name": "localeCompare", + "kind": "method", + "kindModifiers": "", + "sortText": "localeCompare" + }, + { + "name": "match", + "kind": "method", + "kindModifiers": "", + "sortText": "match" + }, + { + "name": "normalize", + "kind": "method", + "kindModifiers": "", + "sortText": "normalize" + }, + { + "name": "repeat", + "kind": "method", + "kindModifiers": "", + "sortText": "repeat" + }, + { + "name": "replace", + "kind": "method", + "kindModifiers": "", + "sortText": "replace" + }, + { + "name": "search", + "kind": "method", + "kindModifiers": "", + "sortText": "search" + }, + { + "name": "slice", + "kind": "method", + "kindModifiers": "", + "sortText": "slice" + }, + { + "name": "small", + "kind": "method", + "kindModifiers": "", + "sortText": "small" + }, + { + "name": "split", + "kind": "method", + "kindModifiers": "", + "sortText": "split" + }, + { + "name": "startsWith", + "kind": "method", + "kindModifiers": "", + "sortText": "startsWith" + }, + { + "name": "strike", + "kind": "method", + "kindModifiers": "", + "sortText": "strike" + }, + { + "name": "sub", + "kind": "method", + "kindModifiers": "", + "sortText": "sub" + }, + { + "name": "substr", + "kind": "method", + "kindModifiers": "", + "sortText": "substr" + }, + { + "name": "substring", + "kind": "method", + "kindModifiers": "", + "sortText": "substring" + }, + { + "name": "sup", + "kind": "method", + "kindModifiers": "", + "sortText": "sup" + }, + { + "name": "toLocaleLowerCase", + "kind": "method", + "kindModifiers": "", + "sortText": "toLocaleLowerCase" + }, + { + "name": "toLocaleUpperCase", + "kind": "method", + "kindModifiers": "", + "sortText": "toLocaleUpperCase" + }, + { + "name": "toLowerCase", + "kind": "method", + "kindModifiers": "", + "sortText": "toLowerCase" + }, + { + "name": "toString", + "kind": "method", + "kindModifiers": "", + "sortText": "toString" + }, + { + "name": "toUpperCase", + "kind": "method", + "kindModifiers": "", + "sortText": "toUpperCase" + }, + { + "name": "trim", + "kind": "method", + "kindModifiers": "", + "sortText": "trim" + }, + { + "name": "trimLeft", + "kind": "method", + "kindModifiers": "", + "sortText": "trimLeft" + }, + { + "name": "trimRight", + "kind": "method", + "kindModifiers": "", + "sortText": "trimRight" + }, + { + "name": "valueOf", + "kind": "method", + "kindModifiers": "", + "sortText": "valueOf" + } + ] + } +} \ No newline at end of file diff --git a/integration/language_service_plugin/goldens/configure.json b/integration/language_service_plugin/goldens/configure.json new file mode 100644 index 0000000000..b4a7a6f32b --- /dev/null +++ b/integration/language_service_plugin/goldens/configure.json @@ -0,0 +1,7 @@ +{ + "seq": 0, + "type": "response", + "command": "configure", + "request_seq": 0, + "success": true +} diff --git a/integration/language_service_plugin/matcher.ts b/integration/language_service_plugin/matcher.ts new file mode 100644 index 0000000000..b46edbf3bc --- /dev/null +++ b/integration/language_service_plugin/matcher.ts @@ -0,0 +1,32 @@ +import { writeFileSync } from 'fs'; + +const goldens: string[] = process.argv.slice(2); + +export const goldenMatcher: jasmine.CustomMatcherFactories = { + toMatchGolden(util: jasmine.MatchersUtil): jasmine.CustomMatcher { + return { + compare(actual: {command: string}, golden: string): jasmine.CustomMatcherResult { + const expected = require(`./goldens/${golden}`); + const pass = util.equals(actual, expected); + if (!pass && goldens.indexOf(golden) >= 0) { + console.error(`Writing golden file ${golden}`); + writeFileSync(`./goldens/${golden}`, JSON.stringify(actual, null, 2)); + return { pass : true }; + } + return { + pass, + message: `Expected response for '${actual.command}' to match golden file ${golden}.\n` + + `To generate new golden file, run "yarn golden ${golden}".`, + }; + } + }; + }, +}; + +declare global { + namespace jasmine { + interface Matchers { + toMatchGolden(golden: string): void + } + } +} diff --git a/integration/language_service_plugin/package.json b/integration/language_service_plugin/package.json index c6c91f558f..c5036b18a1 100644 --- a/integration/language_service_plugin/package.json +++ b/integration/language_service_plugin/package.json @@ -4,23 +4,16 @@ "license": "MIT", "description": "Angular Language Service plugin integration test", "dependencies": { - "@angular/animations": "file:../../dist/packages-dist/animations", - "@angular/common": "file:../../dist/packages-dist/common", - "@angular/compiler": "file:../../dist/packages-dist/compiler", - "@angular/compiler-cli": "file:../../dist/packages-dist/compiler-cli", "@angular/core": "file:../../dist/packages-dist/core", "@angular/language-service": "file:../../dist/packages-dist/language-service", - "@angular/platform-browser": "file:../../dist/packages-dist/platform-browser", - "@angular/platform-server": "file:../../dist/packages-dist/platform-server", - "@types/minimist": "^1.2.0", - "@types/node": "^7.0.5", - "minimist": "^1.2.0", - "rxjs": "file:../../node_modules/rxjs", - "typescript": "file:../../node_modules/typescript", - "zone.js": "file:../../node_modules/zone.js" + "@types/node": "file:../../node_modules/@types/node", + "jasmine": "file:../../node_modules/jasmine", + "typescript": "file:../../node_modules/typescript" }, "scripts": { - "postinstall": "scripts/install.sh", - "test": "tsc -p tools && scripts/test.sh" + "build": "tsc -p tsconfig.json", + "cleanup": "rm -rf ti-*.log tsserver.log", + "golden": "node generate.js", + "test": "yarn cleanup && yarn build && jasmine test.js" } } diff --git a/integration/language_service_plugin/project/tsconfig.json b/integration/language_service_plugin/project/tsconfig.json index 6a81fdd7df..2c7260d1bc 100644 --- a/integration/language_service_plugin/project/tsconfig.json +++ b/integration/language_service_plugin/project/tsconfig.json @@ -8,9 +8,6 @@ "experimentalDecorators": true, "lib": [ "es2015", "dom" ], "noImplicitAny": true, - "suppressImplicitAnyIndexErrors": true, - "plugins": [ - { "name": "@angular/language-service" } - ] + "suppressImplicitAnyIndexErrors": true } } diff --git a/integration/language_service_plugin/scripts/env.sh b/integration/language_service_plugin/scripts/env.sh deleted file mode 100755 index 321f42a45c..0000000000 --- a/integration/language_service_plugin/scripts/env.sh +++ /dev/null @@ -1,2 +0,0 @@ -TYPESCRIPTS=2.3 -FIXTURES="smokeTest getCompletions" diff --git a/integration/language_service_plugin/scripts/install.sh b/integration/language_service_plugin/scripts/install.sh deleted file mode 100755 index d835479259..0000000000 --- a/integration/language_service_plugin/scripts/install.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash - -set -ex -o pipefail - -cd `dirname $0` -cd .. -source scripts/env.sh - -# Setup TypeScripts -for TYPESCRIPT in ${TYPESCRIPTS[@]} -do - ( - cd typescripts/$TYPESCRIPT - yarn - ) -done \ No newline at end of file diff --git a/integration/language_service_plugin/scripts/test.sh b/integration/language_service_plugin/scripts/test.sh deleted file mode 100755 index 0721da0c45..0000000000 --- a/integration/language_service_plugin/scripts/test.sh +++ /dev/null @@ -1,30 +0,0 @@ -#!/usr/bin/env bash - -set -ex -o pipefail - -cd `dirname $0` -cd .. -source scripts/env.sh - -HOST="node tools/typescript_host.js" -VALIDATE="node tools/typescript_validator.js" - -# Ensure the languages service can load correctly in node before typescript loads it. -# This verifies its dependencies and emits any exceptions, both of which are only -# emitted to the typescript logs (not the validated output). -node tools/load_test.js - -for TYPESCRIPT in ${TYPESCRIPTS[@]} -do - SERVER="node typescripts/$TYPESCRIPT/node_modules/typescript/lib/tsserver.js" - for FIXTURE_BASE in ${FIXTURES[@]} - do - FIXTURE=fixtures/$FIXTURE_BASE.json - EXPECTED=fixtures/$FIXTURE_BASE-expected-$TYPESCRIPT.json - if [[ ${UPDATE_GOLDEN} == true ]]; then - $HOST --file $FIXTURE --pwd $(pwd) | $SERVER | $VALIDATE --golden > $EXPECTED - else - $HOST --file $FIXTURE --pwd $(pwd) | $SERVER | $VALIDATE --expect $EXPECTED - fi - done -done \ No newline at end of file diff --git a/integration/language_service_plugin/scripts/update_golden.sh b/integration/language_service_plugin/scripts/update_golden.sh deleted file mode 100755 index 4fd0d2484d..0000000000 --- a/integration/language_service_plugin/scripts/update_golden.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -set -ex -o pipefail - -cd `dirname $0` -cd .. - -UPDATE_GOLDEN=true scripts/test.sh \ No newline at end of file diff --git a/integration/language_service_plugin/test.ts b/integration/language_service_plugin/test.ts new file mode 100644 index 0000000000..0147ed1ebb --- /dev/null +++ b/integration/language_service_plugin/test.ts @@ -0,0 +1,104 @@ +import { fork, ChildProcess } from 'child_process'; +import { join } from 'path'; +import { Client } from './tsclient'; +import { goldenMatcher } from './matcher'; + +describe('Angular Language Service', () => { + jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000; /* 10 seconds */ + const PWD = process.env.PWD!; + const SERVER_PATH = "./node_modules/typescript/lib/tsserver.js"; + let server: ChildProcess; + let client: Client; + + beforeEach(() => { + jasmine.addMatchers(goldenMatcher); + server = fork(SERVER_PATH, [ + '--globalPlugins', '@angular/language-service', + '--logVerbosity', 'verbose', + '--logFile', join(PWD, 'tsserver.log'), + ], { + stdio: ['pipe', 'pipe', 'inherit', 'ipc'], + }); + client = new Client(server); + client.listen(); + }); + + afterEach(async () => { + client.sendRequest('exit', {}); + + // Give server process some time to flush all messages + await new Promise((resolve) => setTimeout(resolve, 1000)); + }); + + it('should be launched as tsserver plugin', async () => { + let response = await client.sendRequest('configure', { + hostInfo: 'vscode', + }); + expect(response).toMatchGolden('configure.json'); + response = await client.sendRequest('compilerOptionsForInferredProjects', { + "options": { + module: "CommonJS", + target: "ES6", + allowSyntheticDefaultImports: true, + allowNonTsExtensions: true, + allowJs: true, + jsx: "Preserve" + } + }); + expect(response).toMatchGolden('compilerOptionsForInferredProjects.json'); + // Server does not send response to open request + // https://github.com/Microsoft/TypeScript/blob/master/lib/protocol.d.ts#L1055 + client.sendRequest('open', { + file: `${PWD}/project/app/app.module.ts`, + fileContent: "" + }); + // Server does not send response to geterr request + // https://github.com/Microsoft/TypeScript/blob/master/lib/protocol.d.ts#L1770 + client.sendRequest('geterr', { + delay: 0, + files: [`${PWD}/project/app/app.module.ts`] + }); + }); + + it('should perform completions', async () => { + await client.sendRequest('configure', { + hostInfo: 'vscode', + }); + await client.sendRequest('compilerOptionsForInferredProjects', { + "options": { + module: "CommonJS", + target: "ES6", + allowSyntheticDefaultImports: true, + allowNonTsExtensions: true, + allowJs: true, + jsx: "Preserve" + } + }); + + client.sendRequest('open', { + file: `${PWD}/project/app/app.component.ts`, + fileContent: "import { Component } from '@angular/core';\n\n@Component({\n selector: 'my-app',\n template: `

Hello {{name}}

`,\n})\nexport class AppComponent { name = 'Angular'; }\n" + }); + + client.sendRequest('geterr', { + delay: 0, + files: [`${PWD}/project/app/app.component.ts`] + }); + + client.sendRequest('change', { + file: `${PWD}/project/app/app.component.ts`, + line: 5, + offset: 30, + endLine: 5, + endOffset: 30, + insertString: '.', + }); + + const response = await client.sendRequest('completionInfo', { + file: `${PWD}/project/app/app.component.ts`, + line: 5, + offset: 31, + }); + expect(response).toMatchGolden('completionInfo.json'); + }); +}); diff --git a/integration/language_service_plugin/tools/load_test.ts b/integration/language_service_plugin/tools/load_test.ts deleted file mode 100644 index 22090f30f6..0000000000 --- a/integration/language_service_plugin/tools/load_test.ts +++ /dev/null @@ -1,35 +0,0 @@ -const ts = require('typescript'); -const Module = require('module'); - -const existingRequire = Module.prototype.require; - -const recordedRequires: string[] = []; - -function recordingRequire(path: string) { - recordedRequires.push(path); - return existingRequire.call(this, path); -} - -Module.prototype.require = recordingRequire; - -try { - const lsf = require('@angular/language-service'); - const ls = lsf({typescript: ts}); - - // Assert that the only module that should have been required are '@angular/language-service', 'fs', and 'path' - - const allowedLoads = new Set(["@angular/language-service", "fs", "path"]); - - const invalidModules = recordedRequires.filter(m => !allowedLoads.has(m)); - - if (invalidModules.length > 0) { - console.error(`FAILED: Loading the language service required: ${invalidModules.join(', ')}`); - process.exit(1); - } -} catch (e) { - console.error(`FAILED: Loading the language service caused the following exception: ${e.stack || e}`); - process.exit(1); -} - -console.log('SUCCESS: Loading passed') -process.exit(0); \ No newline at end of file diff --git a/integration/language_service_plugin/tools/tsconfig.json b/integration/language_service_plugin/tools/tsconfig.json deleted file mode 100644 index fd844f194c..0000000000 --- a/integration/language_service_plugin/tools/tsconfig.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilerOptions": { - "module": "commonjs", - "target": "es5", - "noImplicitAny": true, - "skipLibCheck": true, - "sourceMap": false, - "lib": ["es2015", "dom"], - "types": [ - "node", - "minimist" - ] - }, - "files": [ - "typescript_host.ts", - "typescript_validator.ts", - "load_test.ts" - ] -} \ No newline at end of file diff --git a/integration/language_service_plugin/tools/typescript_host.ts b/integration/language_service_plugin/tools/typescript_host.ts deleted file mode 100644 index 4dc2f415c8..0000000000 --- a/integration/language_service_plugin/tools/typescript_host.ts +++ /dev/null @@ -1,77 +0,0 @@ -import * as fs from 'fs'; -import * as minimist from 'minimist'; - -const RE_PWD = /\$\$PWD\$\$/g; - -let errorsDetected = false; - -function reportError(arg: string): boolean { - console.error(`Unknown argument: ${arg}`); - errorsDetected = true; - return false; -} - -function help() { - console.log('TypeScript Host') - console.log(`${process.argv[1]} --file [--pwd ]`); - console.log(` - Send JSON message using the JSON RPC protocol to stdout. - `) -} - -let args = minimist(process.argv.slice(2), { string: ['file', 'pwd'], unknown: reportError }); - -if (errorsDetected) { - help(); - process.exit(2); -} - -const file = args['file']; -if (!file) { - console.log('stdin form not supported yet.') - process.exit(1); -} - -// Sender -const pending: string[] = []; -let writing = false; - -function writeMessage(message: string) { - writing = true; - process.stdout.write(message + '\n', checkPending); -} - -function checkPending() { - writing = false; - if (pending.length) { - writeMessage(pending.shift()); - } -} - -function send(message: string) { - if (writing) { - pending.push(message); - } else { - writeMessage(message); - } -} - -try { - let content = fs.readFileSync(file, 'utf8'); - if (args['pwd']) { - content = content.replace(RE_PWD, args['pwd']); - } - - const json = JSON.parse(content); - - if (Array.isArray(json)) { - for (const message of json) { - send(JSON.stringify(message)); - } - } else { - throw Error('Expected an array for input messages.') - } -} catch(e) { - console.error(`Error: ${e.message}`); - process.exit(2); -} \ No newline at end of file diff --git a/integration/language_service_plugin/tools/typescript_validator.ts b/integration/language_service_plugin/tools/typescript_validator.ts deleted file mode 100644 index 0bad6a4d07..0000000000 --- a/integration/language_service_plugin/tools/typescript_validator.ts +++ /dev/null @@ -1,164 +0,0 @@ -import * as fs from 'fs'; -import * as minimist from 'minimist'; - -let errorsDetected = false; - -const start = Date.now(); - -function reportError(arg: string): boolean { - console.error(`Unknown argument: ${arg}`); - errorsDetected = true; - return false; -} - -function help() { - console.log('TypeScript Validator') - console.log(`${process.argv[1]} [--expect | --golden] [--pwd ]`); - console.log(` - Validate that the emitted output produces the expect JSON.`) -} - -let args = minimist(process.argv.slice(2), { string: ['expect', 'pwd'], boolean: ['golden'], unknown: reportError }); - -if (!args.golden && !args.expect) { - console.log('Expected -golden or -expect'); - errorsDetected = true; -} - -if (args.golden && args.expect) { - console.log('Expected -golded or -expect but not both'); - errorsDetected = true; -} - -if (errorsDetected) { - help(); - process.exit(2); -} - -var expected: any; -if (args.expect) { - expected = JSON.parse(fs.readFileSync(args.expect, 'utf8')); -} - -// Reader -let pending = Buffer.alloc(0); - -const prefix = 'Content-Length: '; - -function tryReadMessage(cb: (message: any) => void) { - const firstLine = pending.indexOf(10); - if (firstLine >= 1) { - const line = pending.toString('utf8', 0, firstLine); - if (!line.startsWith(prefix)) { - throw Error(`Unexpected input: ${line}`); - } - const length = +line.substring(prefix.length, firstLine - 1); - const dataStart = firstLine + 2; - const messageText = pending.toString('utf8', dataStart, dataStart + length); - const message = JSON.parse(messageText); - pending = pending.slice(dataStart + length + 1); - cb(message); - tryReadMessage(cb); - } -} - -function collect(cb: (error: any, messages: any[]) => void) { - const result: any[] = []; - - function report(error: any, messages: any[]) { - cb(error, messages); - cb = () => {}; - } - - process.stdin.on('error', report); - process.stdin.on('data', (data: Buffer) => { - try { - pending = Buffer.concat([pending, data], pending.length + data.length); - tryReadMessage((message: any) => { - result.push(message); - }); - } catch (e) { - report(e, []); - } - }); - - process.stdin.on('close', () => { - report(null, result); - }); -} - -function sanitize(messages: any[]): any[] { - return messages.filter((message: any) => { - return message && message.type == 'response'; - }).map((message: any) => { - // Only preserve a fixed set of fields. - const result: any = {}; - if (message.type != null) result.type = message.type; - if (message.command != null) result.command = message.command; - if (message.success != null) result.success = message.success; - if (message.body != null) result.body = message.body; - return result; - }); -} - - -function isPrimitive(value: any): boolean { - return Object(value) !== value; -} - -function expectPrimitive(received: any, expected: any) { - if (received !== expected) { - throw new Error(`Expected ${expected} but received ${received}`); - } -} - -function expectArray(received: any, expected: any[]) { - if (!Array.isArray(received)) { - throw new Error(`Expected an array, received ${JSON.stringify(received)}`); - } - if (received.length != expected.length) { - throw new Error(`Expected an array length ${expected.length}, received ${JSON.stringify(received)}`); - } - for (let i = 0; i < expected.length; i++) { - expect(received[i], expected[i]); - } -} - -function expectObject(received: any, expected: any) { - for (const name of Object.getOwnPropertyNames(expected)) { - if (!received.hasOwnProperty(name)) { - throw new Error(`Expected object an object containing a field ${name}, received ${JSON.stringify(expected)}`); - } - expect(received[name], expected[name]); - } -} - -function expect(received: any, expected: any) { - if (isPrimitive(expected)) { - expectPrimitive(received, expected); - } else if (Array.isArray(expected)) { - expectArray(received, expected); - } else { - expectObject(received, expected); - } -} - - -collect((err: any, messages: any[]) => { - if (err) { - console.error(err.message); - process.exit(1); - } - if (args.golden) { - console.log(JSON.stringify(sanitize(messages), null, ' ')); - } else { - try { - expect(sanitize(messages), expected); - console.log('PASSED:', Date.now() - start, 'ms'); - process.exit(0); - } catch(e) { - console.log('FAILED:', e.message); - process.exit(1); - } - } -}); diff --git a/integration/language_service_plugin/tsclient.ts b/integration/language_service_plugin/tsclient.ts new file mode 100644 index 0000000000..05dd3c0e0d --- /dev/null +++ b/integration/language_service_plugin/tsclient.ts @@ -0,0 +1,70 @@ +import { ChildProcess } from "child_process"; +import { EventEmitter } from "events"; + +/** + * Provides a client for tsserver. Tsserver does not use standard JSON-RPC + * protocol thus the need for this custom client. + */ +export class Client { + private data: Buffer|undefined; + private id = 0; + private responseEmitter = new EventEmitter(); + + constructor(private readonly server: ChildProcess) {} + + listen() { + this.server.stdout.on('data', (data: Buffer) => { + this.data = this.data ? Buffer.concat([this.data, data]) : data; + const CONTENT_LENGTH = 'Content-Length: ' + const index = this.data.indexOf(CONTENT_LENGTH); + if (index < 0) { + return; + } + let start = index + CONTENT_LENGTH.length; + let end = this.data.indexOf('\r\n', start); + if (end < start) { + return; + } + const contentLengthStr = this.data.slice(start, end).toString(); + const contentLength = Number(contentLengthStr); + if (isNaN(contentLength) || contentLength < 0) { + return; + } + start = end + 4; + end = start + contentLength; + if (end > this.data.length) { + return; + } + const content = this.data.slice(start, end).toString(); + this.data = this.data.slice(end); + try { + const payload = JSON.parse(content); + if (payload.type === "event") { + return; + } + this.responseEmitter.emit('response', payload); + } + catch (error) { + this.responseEmitter.emit('error', error); + } + }); + } + + async send(type: string, command: string, params: {}) { + const request = { + seq: this.id++, + type, + command, + arguments: params + }; + this.server.stdin.write(JSON.stringify(request) + '\r\n'); + return new Promise((resolve, reject) => { + this.responseEmitter.once('response', resolve); + this.responseEmitter.once('error', reject); + }); + } + + async sendRequest(command: string, params: {}) { + return this.send('request', command, params); + } +} diff --git a/integration/language_service_plugin/tsconfig.json b/integration/language_service_plugin/tsconfig.json index 2c7260d1bc..9730ac2fe3 100644 --- a/integration/language_service_plugin/tsconfig.json +++ b/integration/language_service_plugin/tsconfig.json @@ -1,13 +1,60 @@ { "compilerOptions": { - "target": "es5", - "module": "commonjs", - "moduleResolution": "node", - "sourceMap": true, - "emitDecoratorMetadata": true, - "experimentalDecorators": true, - "lib": [ "es2015", "dom" ], - "noImplicitAny": true, - "suppressImplicitAnyIndexErrors": true - } + /* Basic Options */ + "target": "es2015", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ + "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ + // "lib": [], /* Specify library files to be included in the compilation. */ + // "allowJs": true, /* Allow javascript files to be compiled. */ + // "checkJs": true, /* Report errors in .js files. */ + // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ + // "declaration": true, /* Generates corresponding '.d.ts' file. */ + // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ + // "sourceMap": true, /* Generates corresponding '.map' file. */ + // "outFile": "./", /* Concatenate and emit output to single file. */ + // "outDir": "./", /* Redirect output structure to the directory. */ + // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ + // "composite": true, /* Enable project compilation */ + // "removeComments": true, /* Do not emit comments to output. */ + // "noEmit": true, /* Do not emit outputs. */ + // "importHelpers": true, /* Import emit helpers from 'tslib'. */ + // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ + // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ + + /* Strict Type-Checking Options */ + "strict": true, /* Enable all strict type-checking options. */ + // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ + // "strictNullChecks": true, /* Enable strict null checks. */ + // "strictFunctionTypes": true, /* Enable strict checking of function types. */ + // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ + // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ + // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ + + /* Additional Checks */ + // "noUnusedLocals": true, /* Report errors on unused locals. */ + // "noUnusedParameters": true, /* Report errors on unused parameters. */ + // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ + // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ + + /* Module Resolution Options */ + // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ + // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ + // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ + // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ + // "typeRoots": [], /* List of folders to include type definitions from. */ + // "types": [], /* Type declaration files to be included in compilation. */ + // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ + "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ + // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ + + /* Source Map Options */ + // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ + // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ + // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ + // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ + + /* Experimental Options */ + // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ + // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ + }, + "include": ["*.ts"] } diff --git a/integration/language_service_plugin/typescripts/2.3/package.json b/integration/language_service_plugin/typescripts/2.3/package.json deleted file mode 100644 index a76f86606d..0000000000 --- a/integration/language_service_plugin/typescripts/2.3/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "2.3", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "keywords": [], - "author": "", - "license": "ISC", - "dependencies": { - "typescript": "2.3.0" - } -} diff --git a/integration/language_service_plugin/typescripts/2.3/yarn.lock b/integration/language_service_plugin/typescripts/2.3/yarn.lock deleted file mode 100644 index 978ea5c25e..0000000000 --- a/integration/language_service_plugin/typescripts/2.3/yarn.lock +++ /dev/null @@ -1,7 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -typescript@2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.3.0.tgz#2e63e09284392bc8158a2444c33e2093795c0418" diff --git a/integration/language_service_plugin/yarn.lock b/integration/language_service_plugin/yarn.lock index 2e3bc312da..73dcc87276 100644 --- a/integration/language_service_plugin/yarn.lock +++ b/integration/language_service_plugin/yarn.lock @@ -2,391 +2,44 @@ # yarn lockfile v1 -"@angular/animations@file:../../dist/packages-dist/animations": - version "6.0.0-beta.7-8203e0365a" - dependencies: - tslib "^1.9.0" - -"@angular/common@file:../../dist/packages-dist/common": - version "6.0.0-beta.7-8203e0365a" - dependencies: - tslib "^1.9.0" - -"@angular/compiler-cli@file:../../dist/packages-dist/compiler-cli": - version "6.0.0-beta.7-8203e0365a" - dependencies: - chokidar "^1.4.2" - minimist "^1.2.0" - reflect-metadata "^0.1.2" - tsickle "^0.27.2" - -"@angular/compiler@file:../../dist/packages-dist/compiler": - version "6.0.0-beta.7-8203e0365a" - dependencies: - tslib "^1.9.0" - "@angular/core@file:../../dist/packages-dist/core": - version "6.0.0-beta.7-8203e0365a" + version "7.2.0" dependencies: tslib "^1.9.0" "@angular/language-service@file:../../dist/packages-dist/language-service": - version "6.0.0-beta.7-8203e0365a" + version "7.2.0" -"@angular/platform-browser@file:../../dist/packages-dist/platform-browser": - version "6.0.0-beta.7-8203e0365a" - dependencies: - tslib "^1.9.0" - -"@angular/platform-server@file:../../dist/packages-dist/platform-server": - version "6.0.0-beta.7-8203e0365a" - dependencies: - domino "^2.0.1" - tslib "^1.9.0" - xhr2 "^0.1.4" - -"@types/minimist@^1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" - -"@types/node@^7.0.5": - version "7.0.52" - resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.52.tgz#8990d3350375542b0c21a83cd0331e6a8fc86716" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -anymatch@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.2.tgz#553dcb8f91e3c889845dfdba34c77721b90b9d7a" - dependencies: - micromatch "^2.1.5" - normalize-path "^2.0.0" - -aproba@^1.0.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" - -are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - dependencies: - arr-flatten "^1.0.1" - -arr-flatten@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - -aws4@^1.2.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" +"@types/node@file:../../node_modules/@types/node": + version "10.9.4" balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - -bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - dependencies: - tweetnacl "^0.14.3" - -binary-extensions@^1.0.0: - version "1.11.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" - -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" + integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= brace-expansion@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== dependencies: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - -chokidar@^1.4.2: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" - dependencies: - delayed-stream "~1.0.0" - concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - -core-util-is@1.0.2, core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - -debug@^2.2.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - -domino@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/domino/-/domino-2.0.1.tgz#9e1d63215d0fe8dcb8202bff07effa1a216db504" - -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - dependencies: - jsbn "~0.1.0" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - dependencies: - is-posix-bracket "^0.1.0" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - dependencies: - fill-range "^2.1.0" - -extend@~3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" - -extsprintf@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" - -extsprintf@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - -fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^1.1.3" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -for-in@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - dependencies: - for-in "^1.0.1" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" + integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@^1.0.0: - version "1.1.3" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.3.tgz#11f82318f5fe7bb2cd22965a108e9306208216d8" - dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.39" - -fstream-ignore@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - dependencies: - is-glob "^2.0.0" - -glob@^7.0.5: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" +glob@^7.0.6: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -395,610 +48,58 @@ glob@^7.0.5: once "^1.3.0" path-is-absolute "^1.0.0" -graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -hawk@3.1.3, hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - inflight@^1.0.4: version "1.0.6" resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= dependencies: once "^1.3.0" wrappy "1" -inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.3: +inherits@2: version "2.0.3" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= -ini@~1.3.0: - version "1.3.5" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" +jasmine-core@~3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.1.0.tgz#a4785e135d5df65024dfc9224953df585bd2766c" + integrity sha1-pHheE11d9lAk38kiSVPfWFvSdmw= -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" +"jasmine@file:../../node_modules/jasmine": + version "3.1.0" dependencies: - binary-extensions "^1.0.0" + glob "^7.0.6" + jasmine-core "~3.1.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - dependencies: - is-extglob "^1.0.0" - -is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - dependencies: - kind-of "^3.0.2" - -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - dependencies: - kind-of "^3.0.2" - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - -json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsprim@^1.2.2: - version "1.4.1" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" - dependencies: - assert-plus "1.0.0" - extsprintf "1.3.0" - json-schema "0.2.3" - verror "1.10.0" - -kind-of@^3.0.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - dependencies: - is-buffer "^1.1.5" - -micromatch@^2.1.5: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -mime-db@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" - -mime-types@^2.1.12, mime-types@~2.1.7: - version "2.1.17" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" - dependencies: - mime-db "~1.30.0" - -minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: +minimatch@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== dependencies: brace-expansion "^1.1.7" -minimist@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -"mkdirp@>=0.5 0", mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -ms@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" - -nan@^2.3.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" - -node-pre-gyp@^0.6.39: - version "0.6.39" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz#c00e96860b23c0e1420ac7befc5044e1d78d8649" - dependencies: - detect-libc "^1.0.2" - hawk "3.1.3" - mkdirp "^0.5.1" - nopt "^4.0.1" - npmlog "^4.0.2" - rc "^1.1.7" - request "2.81.0" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-path@^2.0.0, normalize-path@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - dependencies: - remove-trailing-separator "^1.0.1" - -npmlog@^4.0.2: - version "4.1.2" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -oauth-sign@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -once@^1.3.0, once@^1.3.3: +once@^1.3.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -osenv@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - -process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - -randomatic@^1.1.3: - version "1.1.7" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - -rc@^1.1.7: - version "1.2.3" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.3.tgz#51575a900f8dd68381c710b4712c2154c3e2035b" - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - safe-buffer "~5.1.1" - string_decoder "~1.0.3" - util-deprecate "~1.0.1" - -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" - -reflect-metadata@^0.1.2: - version "0.1.10" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.10.tgz#b4f83704416acad89988c9b15635d47e03b9344a" - -regex-cache@^0.4.2: - version "0.4.4" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" - dependencies: - is-equal-shallow "^0.1.3" - -remove-trailing-separator@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -request@2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - -rimraf@2, rimraf@^2.5.1, rimraf@^2.6.1: - version "2.6.2" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" - dependencies: - glob "^7.0.5" - -"rxjs@file:../../node_modules/rxjs": - version "6.0.0-alpha.4" - dependencies: - tslib "^1.9.0" - -safe-buffer@^5.0.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" - -semver@^5.3.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" - -set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - -signal-exit@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - -source-map-support@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.3.tgz#2b3d5fff298cfa4d1afd7d4352d569e9a0158e76" - dependencies: - source-map "^0.6.0" - -source-map@^0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" - -sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jsbn "~0.1.0" - tweetnacl "~0.14.0" - -string-width@^1.0.1, string-width@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string_decoder@~1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" - dependencies: - safe-buffer "~5.1.0" - -stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - -tar-pack@^3.4.0: - version "3.4.1" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" - dependencies: - debug "^2.2.0" - fstream "^1.0.10" - fstream-ignore "^1.0.5" - once "^1.3.3" - readable-stream "^2.1.4" - rimraf "^2.5.1" - tar "^2.2.1" - uid-number "^0.0.6" - -tar@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" - -tough-cookie@~2.3.0: - version "2.3.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" - dependencies: - punycode "^1.4.1" - -tsickle@^0.27.2: - version "0.27.2" - resolved "https://registry.yarnpkg.com/tsickle/-/tsickle-0.27.2.tgz#f33d46d046f73dd5c155a37922e422816e878736" - dependencies: - minimist "^1.2.0" - mkdirp "^0.5.1" - source-map "^0.6.0" - source-map-support "^0.5.0" + integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= tslib@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.0.tgz#e37a86fda8cbbaf23a057f473c9f4dc64e5fc2e8" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + version "1.9.3" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" + integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== "typescript@file:../../node_modules/typescript": - version "2.7.2" - -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -uuid@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" - -verror@1.10.0: - version "1.10.0" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" - dependencies: - assert-plus "^1.0.0" - core-util-is "1.0.2" - extsprintf "^1.2.0" - -wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" - dependencies: - string-width "^1.0.2" + version "3.2.2" wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -xhr2@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/xhr2/-/xhr2-0.1.4.tgz#7f87658847716db5026323812f818cadab387a5f" - -"zone.js@file:../../node_modules/zone.js": - version "0.8.20" + integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=