From 7b1ce0eb69102b8b40c65de1ced37e06ef296dab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christoph=20B=C3=BChler?= Date: Fri, 26 Jan 2018 10:23:47 +0100 Subject: [PATCH] feat(import-management): Add imports and imports under cursor (#383) Re-Introduce the `add import` and `add import under cursor` feature. This feature was removed due to the fact, that it uses the declaration index. That index was broken and caused vscode to totally crash. I removed the "support" for javascript files, which mainly caused the crashes. This due to the fact, that compiled javascripts (like webpack results) were indexed and crashed the memory of the process. --- .appveyor.yml | 4 +- .travis.yml | 4 +- .vscode/launch.json | 4 +- config/tsconfig.base.json | 9 +- config/tsconfig.build.json | 9 +- config/tsconfig.test.json | 12 + jest.json | 19 - package.json | 64 +- .../quick-pick-items/ResolveQuickPickItem.ts | 21 - .../extensions/ImportResolveExtension.ts | 626 +++---- .../utilities/DeclarationIndexMapper.ts | 414 ++--- src/_old/old-config.json | 60 - src/code-outline/index.ts | 32 +- src/configuration/index-config.ts | 25 + src/configuration/index.ts | 14 +- src/declarations/declaration-manager.ts | 139 ++ src/declarations/workspace-declarations.ts | 215 +++ src/import-organizer/import-manager.ts | 99 +- .../import-quick-pick-item.ts | 21 + src/import-organizer/index.ts | 239 ++- src/ioc-symbols.ts | 1 + src/ioc.ts | 2 + src/utilities/logger.ts | 2 +- test/_workspace/main.ts | 9 - test/demo.spec.ts | 5 - test/etc/workspace_1/main.ts | 9 + test/etc/workspace_1/server/indices/foobar.ts | 1 + test/single-workspace/demo.spec.ts | 9 + test/single-workspace/index.ts | 40 + tsconfig.json | 19 +- yarn.lock | 1552 ++--------------- 31 files changed, 1473 insertions(+), 2206 deletions(-) create mode 100644 config/tsconfig.test.json delete mode 100644 jest.json delete mode 100644 src/_old/common/quick-pick-items/ResolveQuickPickItem.ts create mode 100644 src/configuration/index-config.ts create mode 100644 src/declarations/declaration-manager.ts create mode 100644 src/declarations/workspace-declarations.ts create mode 100644 src/import-organizer/import-quick-pick-item.ts delete mode 100644 test/_workspace/main.ts delete mode 100644 test/demo.spec.ts create mode 100644 test/etc/workspace_1/main.ts create mode 100644 test/etc/workspace_1/server/indices/foobar.ts create mode 100644 test/single-workspace/demo.spec.ts create mode 100644 test/single-workspace/index.ts diff --git a/.appveyor.yml b/.appveyor.yml index 20a9f3c..66439f9 100644 --- a/.appveyor.yml +++ b/.appveyor.yml @@ -4,8 +4,8 @@ skip_branch_with_pr: true environment: nodejs_version: "9" - CODE_TESTS_WORKSPACE: "$(APPVEYOR_BUILD_FOLDER)/test/_workspace" - CODE_TESTS_PATH: "$(APPVEYOR_BUILD_FOLDER)/out/test/single-workspace-tests" + CODE_TESTS_WORKSPACE: "$(APPVEYOR_BUILD_FOLDER)/test/etc/workspace_1" + CODE_TESTS_PATH: "$(APPVEYOR_BUILD_FOLDER)/out/test/single-workspace" install: - ps: Install-Product node $env:nodejs_version diff --git a/.travis.yml b/.travis.yml index dbd296d..10aca35 100644 --- a/.travis.yml +++ b/.travis.yml @@ -18,8 +18,8 @@ jobs: os: linux sudo: required env: - - CODE_TESTS_WORKSPACE=$TRAVIS_BUILD_DIR/test/_workspace - - CODE_TESTS_PATH=$TRAVIS_BUILD_DIR/out/test/single-workspace-tests + - CODE_TESTS_WORKSPACE=$TRAVIS_BUILD_DIR/test/etc/workspace_1 + - CODE_TESTS_PATH=$TRAVIS_BUILD_DIR/out/test/single-workspace addons: apt: sources: diff --git a/.vscode/launch.json b/.vscode/launch.json index 53db298..49eb6a0 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,7 +7,7 @@ "request": "launch", "runtimeExecutable": "${execPath}", "args": [ - "${workspaceRoot}/test/_workspace", + "${workspaceRoot}/test/etc/workspace_1", "--extensionDevelopmentPath=${workspaceRoot}" ], "env": { @@ -25,7 +25,7 @@ "request": "launch", "runtimeExecutable": "${execPath}", "args": [ - "${workspaceRoot}/test/multi-root.code-workspace", + "${workspaceRoot}/test/etc/multi-root.code-workspace", "--extensionDevelopmentPath=${workspaceRoot}" ], "env": { diff --git a/config/tsconfig.base.json b/config/tsconfig.base.json index 7814af4..d5461f4 100644 --- a/config/tsconfig.base.json +++ b/config/tsconfig.base.json @@ -6,10 +6,9 @@ "moduleResolution": "node", "lib": [ "es6", - "es2017", - "dom" + "es2017" ], - "rootDir": "../src", + "rootDir": "../", "emitDecoratorMetadata": true, "experimentalDecorators": true, "noUnusedLocals": true, @@ -22,8 +21,6 @@ "../src/**/*" ], "exclude": [ - "../src/_old", - "../node_modules", - "../out" + "../src/_old" ] } diff --git a/config/tsconfig.build.json b/config/tsconfig.build.json index c23d4db..ffcbb94 100644 --- a/config/tsconfig.build.json +++ b/config/tsconfig.build.json @@ -1,10 +1,3 @@ { - "extends": "./tsconfig.base.json", - "include": [ - "../src/**/*" - ], - "exclude": [ - "../src/_old", - "../test" - ] + "extends": "./tsconfig.base.json" } diff --git a/config/tsconfig.test.json b/config/tsconfig.test.json new file mode 100644 index 0000000..d5ec25e --- /dev/null +++ b/config/tsconfig.test.json @@ -0,0 +1,12 @@ +{ + "extends": "./tsconfig.base.json", + "include": [ + "../src/**/*", + "../test/**/*" + ], + "exclude": [ + "../src/_old", + "../test/_old", + "../test/etc" + ] +} diff --git a/jest.json b/jest.json deleted file mode 100644 index e9a4ef5..0000000 --- a/jest.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "collectCoverage": true, - "mapCoverage": true, - "transform": { - "^.+\\.tsx?$": "/node_modules/ts-jest/preprocessor.js" - }, - "testMatch": [ - "**/test/**/*.spec.ts" - ], - "testPathIgnorePatterns": [ - "/node_modules/" - ], - "moduleFileExtensions": [ - "ts", - "tsx", - "js", - "json" - ] -} diff --git a/package.json b/package.json index 8bf9fb7..30aeed1 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "Other", "Languages" ], - "main": "./out/extension", + "main": "./out/src/extension", "author": "Christoph Bühler ", "license": "MIT", "contributors": [], @@ -58,9 +58,7 @@ "build": "npm run clean && tsc -p ./config/tsconfig.build.json", "develop": "npm run clean && tsc -p .", "lint": "tslint -c ./tslint.json -p ./config/tsconfig.build.json", - "test": "npm run lint && npm run clean && jest -c ./jest.json", - "test:watch": "npm run clean && jest -c ./jest.json --watch --no-coverage", - "test:vscode": "echo 'beside unit test with jest, there could be integration test with node ./node_modules/vscode/bin/test'", + "test": "npm run lint && npm run clean && tsc -p ./config/tsconfig.test.json && node ./node_modules/vscode/bin/test", "semantic-release": "semantic-release" }, "release": { @@ -82,25 +80,25 @@ }, "devDependencies": { "@smartive/tslint-config": "^2.0.0", - "@types/jest": "^22.0.1", + "@types/chai": "^4.1.1", + "@types/mocha": "^2.2.46", "@types/node": "^9.3.0", "@types/reflect-metadata": "0.1.0", - "cross-env": "^5.1.3", + "@types/sinon": "^4.1.3", + "@types/sinon-chai": "^2.7.29", + "chai": "^4.1.2", "del-cli": "^1.1.0", - "filewalker": "^0.1.3", - "jest": "^22.1.2", "semantic-release": "^12.2.2", "semantic-release-vsce": "^1.0.2", - "ts-jest": "^22.0.1", + "sinon": "^4.2.0", + "sinon-chai": "^2.14.0", "tslint": "^5.9.1", "tsutils": "^2.19.1", "vscode": "^1.1.10" }, "dependencies": { "inversify": "^4.9.0", - "inversify-inject-decorators": "^3.1.0", "reflect-metadata": "^0.1.12", - "rxjs": "^5.5.6", "tslib": "^1.8.1", "typescript": "~2.6.2", "typescript-parser": "^2.2.2", @@ -114,6 +112,14 @@ ], "contributes": { "commands": [ + { + "command": "typescriptHero.index.addImport", + "title": "TS Hero: Add an import to current file" + }, + { + "command": "typescriptHero.index.addImportUnderCursor", + "title": "TS Hero: Adds the current symbol under the cursor as an import to current file" + }, { "command": "typescriptHero.imports.organize", "title": "TS Hero: Organize imports (sort and remove unused)" @@ -124,6 +130,16 @@ } ], "keybindings": [ + { + "command": "typescriptHero.index.addImport", + "key": "ctrl+shift+i", + "when": "editorTextFocus" + }, + { + "command": "typescriptHero.index.addImportUnderCursor", + "key": "ctrl+alt+i", + "when": "editorTextFocus" + }, { "command": "typescriptHero.imports.organize", "key": "ctrl+alt+o", @@ -305,6 +321,32 @@ ], "description": "Defines the groups of the imports ordering. Multiple groups possible, see readme for instructions.", "scope": "resource" + }, + "typescriptHero.index.workspaceIgnorePatterns": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true, + "default": [ + "**/build/**/*", + "**/out/**/*", + "**/dist/**/*" + ], + "description": "Defines partial pathes (globs) that are ignored during indexing of the **workspace**.", + "scope": "resource" + }, + "typescriptHero.index.moduleIgnorePatterns": { + "type": "array", + "items": { + "type": "string" + }, + "uniqueItems": true, + "default": [ + "**/node_modules/**/*" + ], + "description": "Defines partial pathes (globs) that are ignored during indexing of the **node_modules**. This patterns are attached to the node_module/ of each found module.", + "scope": "resource" } } } diff --git a/src/_old/common/quick-pick-items/ResolveQuickPickItem.ts b/src/_old/common/quick-pick-items/ResolveQuickPickItem.ts deleted file mode 100644 index 02a189b..0000000 --- a/src/_old/common/quick-pick-items/ResolveQuickPickItem.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { DeclarationInfo } from 'typescript-parser'; -import { QuickPickItem } from 'vscode'; - -/** - * Quickpick item that contains a symbol resolve information (Declarationinfo) - * Contains the name and the location where it is imported from. - * The whole DeclarationInfo is also exposed. - * - * @export - * @class ResolveQuickPickItem - * @implements {QuickPickItem} - */ -export class ResolveQuickPickItem implements QuickPickItem { - public label: string; - public description: string; - - constructor(public readonly declarationInfo: DeclarationInfo) { - this.description = this.declarationInfo.from; - this.label = this.declarationInfo.declaration.name; - } -} diff --git a/src/_old/extension/extensions/ImportResolveExtension.ts b/src/_old/extension/extensions/ImportResolveExtension.ts index ff9fa92..6e80328 100644 --- a/src/_old/extension/extensions/ImportResolveExtension.ts +++ b/src/_old/extension/extensions/ImportResolveExtension.ts @@ -3,7 +3,6 @@ import { DeclarationInfo, TypescriptParser } from 'typescript-parser'; import { commands, ExtensionContext, StatusBarAlignment, StatusBarItem, window, workspace } from 'vscode'; import { getDeclarationsFilteredByImports } from '../../common/helpers'; -import { ResolveQuickPickItem } from '../../common/quick-pick-items'; import { iocSymbols } from '../IoCSymbols'; import { ImportManager } from '../managers'; import { DeclarationIndexMapper } from '../utilities/DeclarationIndexMapper'; @@ -11,7 +10,6 @@ import { getScriptKind } from '../utilities/utilityFunctions'; import { Logger } from '../utilities/winstonLogger'; import { BaseExtension } from './BaseExtension'; -type DeclarationsForImportOptions = { cursorSymbol: string, documentSource: string, documentPath: string }; type MissingDeclarationsForFileOptions = { documentSource: string, documentPath: string }; const resolverOk = 'TSH Resolver $(check)'; @@ -28,423 +26,235 @@ const resolverErr = 'TSH Resolver $(flame)'; */ @injectable() export class ImportResolveExtension extends BaseExtension { - private statusBarItem: StatusBarItem = window.createStatusBarItem(StatusBarAlignment.Left, 4); - - constructor( - @inject(iocSymbols.extensionContext) context: ExtensionContext, - @inject(iocSymbols.logger) private logger: Logger, - @inject(iocSymbols.typescriptParser) private parser: TypescriptParser, - @inject(iocSymbols.declarationIndexMapper) private indices: DeclarationIndexMapper, - ) { - super(context); - } - - /** - * Initialized the extension. Registers the commands and other disposables to the context. - * - * @memberof ImportResolveExtension - */ - public initialize(): void { - this.context.subscriptions.push(this.statusBarItem); - - this.statusBarItem.text = resolverOk; - this.statusBarItem.tooltip = 'Click to manually reindex all files'; - this.statusBarItem.command = 'typescriptHero.resolve.rebuildCache'; - this.context.subscriptions.push(this.indices.onStartIndexing(() => { - this.statusBarItem.text = resolverSyncing; - })); - this.context.subscriptions.push(this.indices.onFinishIndexing(() => { - this.statusBarItem.text = resolverOk; - })); - this.context.subscriptions.push(this.indices.onIndexingError(() => { - this.statusBarItem.text = resolverErr; - })); - this.statusBarItem.show(); - - this.commandRegistrations(); - - this.logger.info('[%s] initialized', ImportResolveExtension.name); - } - - /** - * Disposes the extension. - * - * @memberof ImportResolveExtension - */ - public dispose(): void { - this.logger.info('[%s] disposed', ImportResolveExtension.name); + private statusBarItem: StatusBarItem = window.createStatusBarItem(StatusBarAlignment.Left, 4); + + constructor( + @inject(iocSymbols.extensionContext) context: ExtensionContext, + @inject(iocSymbols.logger) private logger: Logger, + @inject(iocSymbols.typescriptParser) private parser: TypescriptParser, + @inject(iocSymbols.declarationIndexMapper) private indices: DeclarationIndexMapper, + ) { + super(context); + } + + /** + * Initialized the extension. Registers the commands and other disposables to the context. + * + * @memberof ImportResolveExtension + */ + public initialize(): void { + this.context.subscriptions.push(this.statusBarItem); + + this.statusBarItem.text = resolverOk; + this.statusBarItem.tooltip = 'Click to manually reindex all files'; + this.statusBarItem.command = 'typescriptHero.resolve.rebuildCache'; + this.context.subscriptions.push(this.indices.onStartIndexing(() => { + this.statusBarItem.text = resolverSyncing; + })); + this.context.subscriptions.push(this.indices.onFinishIndexing(() => { + this.statusBarItem.text = resolverOk; + })); + this.context.subscriptions.push(this.indices.onIndexingError(() => { + this.statusBarItem.text = resolverErr; + })); + this.statusBarItem.show(); + + this.commandRegistrations(); + + this.logger.info('[%s] initialized', ImportResolveExtension.name); + } + + /** + * Disposes the extension. + * + * @memberof ImportResolveExtension + */ + public dispose(): void { + this.logger.info('[%s] disposed', ImportResolveExtension.name); + } + + /** + * Adds all missing imports to the actual document if possible. If multiple declarations are found, + * a quick pick list is shown to the user and he needs to decide, which import to use. + * + * @private + * @returns {Promise} + * + * @memberof ImportResolveExtension + */ + private async addMissingImports(): Promise { + if (!window.activeTextEditor) { + return; } - - /** - * Add an import from the whole list. Calls the vscode gui, where the user can - * select a symbol to import. - * - * @private - * @returns {Promise} - * - * @memberof ResolveExtension - */ - private async addImport(): Promise { - if (!window.activeTextEditor) { - return; - } - const index = this.indices.getIndexForFile(window.activeTextEditor.document.uri); - if (!index || !index.indexReady) { - this.showCacheWarning(); - return; - } - try { - const selectedItem = await window.showQuickPick( - index.declarationInfos.map(o => new ResolveQuickPickItem(o)), - { placeHolder: 'Add import to document:' }, - ); - if (selectedItem) { - this.logger.info( - '[%s] add import to document', - ImportResolveExtension.name, - { specifier: selectedItem.declarationInfo.declaration.name, library: selectedItem.declarationInfo.from }, - ); - this.addImportToDocument(selectedItem.declarationInfo); - } - } catch (e) { - this.logger.error( - '[%s] import could not be added to document, error: %s', - ImportResolveExtension.name, - e, - { file: window.activeTextEditor.document.fileName }, - ); - window.showErrorMessage('The import cannot be completed, there was an error during the process.'); - } - } - - /** - * Add an import from the whole list. Calls the vscode gui, where the user can - * select a symbol to import. - * - * @private - * @returns {Promise} - * - * @memberof ImportResolveExtension - */ - private async addImportUnderCursor(): Promise { - if (!window.activeTextEditor) { - return; - } - const index = this.indices.getIndexForFile(window.activeTextEditor.document.uri); - if (!index || !index.indexReady) { - this.showCacheWarning(); - return; - } - try { - const selectedSymbol = this.getSymbolUnderCursor(); - this.logger.debug('[%s] add import for symbol under cursor', ImportResolveExtension.name, { selectedSymbol }); - if (!!!selectedSymbol) { - return; - } - const resolveItems = await this.getDeclarationsForImport({ - cursorSymbol: selectedSymbol, - documentSource: window.activeTextEditor.document.getText(), - documentPath: window.activeTextEditor.document.fileName, - }); - - if (resolveItems.length < 1) { - this.logger.info( - '[%s] the symbol was not found or is already imported', - ImportResolveExtension.name, - { selectedSymbol }, - ); - window.showInformationMessage( - `The symbol '${selectedSymbol}' was not found in the index or is already imported.`, - ); - } else if (resolveItems.length === 1 && resolveItems[0].declaration.name === selectedSymbol) { - this.logger.info( - '[%s] add import to document', - ImportResolveExtension.name, - { - specifier: resolveItems[0].declaration.name, - library: resolveItems[0].from, - }, - ); - this.addImportToDocument(resolveItems[0]); - } else { - const selectedItem = await window.showQuickPick( - resolveItems.map(o => new ResolveQuickPickItem(o)), { placeHolder: 'Multiple declarations found:' }, - ); - if (selectedItem) { - this.logger.info( - '[%s] add import to document', - ImportResolveExtension.name, - { - specifier: selectedItem.declarationInfo.declaration.name, - library: selectedItem.declarationInfo.from, - }, - ); - this.addImportToDocument(selectedItem.declarationInfo); - } - } - } catch (e) { - this.logger.error( - '[%s] import could not be added to document, error: %s', - ImportResolveExtension.name, - e, - { file: window.activeTextEditor.document.fileName }, - ); - window.showErrorMessage('The import cannot be completed, there was an error during the process.'); - } + const index = this.indices.getIndexForFile(window.activeTextEditor.document.uri); + if (!index || !index.indexReady) { + this.showCacheWarning(); + return; } - - /** - * Adds all missing imports to the actual document if possible. If multiple declarations are found, - * a quick pick list is shown to the user and he needs to decide, which import to use. - * - * @private - * @returns {Promise} - * - * @memberof ImportResolveExtension - */ - private async addMissingImports(): Promise { - if (!window.activeTextEditor) { - return; - } - const index = this.indices.getIndexForFile(window.activeTextEditor.document.uri); - if (!index || !index.indexReady) { - this.showCacheWarning(); - return; - } - try { - this.logger.debug( - '[%s] add all missing imports to the document', - ImportResolveExtension.name, - { file: window.activeTextEditor.document.fileName }, - ); - const missing = await this.getMissingDeclarationsForFile({ - documentSource: window.activeTextEditor.document.getText(), - documentPath: window.activeTextEditor.document.fileName, - }); - - if (missing && missing.length) { - const ctrl = await ImportManager.create(window.activeTextEditor.document); - missing.filter(o => o instanceof DeclarationInfo).forEach(o => ctrl.addDeclarationImport(o)); - await ctrl.commit(); - } - } catch (e) { - this.logger.error( - '[%s] missing imports could not be added, error: %s', - ImportResolveExtension.name, - e, - { file: window.activeTextEditor.document.fileName }, - ); - window.showErrorMessage('The operation cannot be completed, there was an error during the process.'); - } + try { + this.logger.debug( + '[%s] add all missing imports to the document', + ImportResolveExtension.name, + { file: window.activeTextEditor.document.fileName }, + ); + const missing = await this.getMissingDeclarationsForFile({ + documentSource: window.activeTextEditor.document.getText(), + documentPath: window.activeTextEditor.document.fileName, + }); + + if (missing && missing.length) { + const ctrl = await ImportManager.create(window.activeTextEditor.document); + missing.filter(o => o instanceof DeclarationInfo).forEach(o => ctrl.addDeclarationImport(o)); + await ctrl.commit(); + } + } catch (e) { + this.logger.error( + '[%s] missing imports could not be added, error: %s', + ImportResolveExtension.name, + e, + { file: window.activeTextEditor.document.fileName }, + ); + window.showErrorMessage('The operation cannot be completed, there was an error during the process.'); } - - /** - * Organizes the imports of the actual document. Sorts and formats them correctly. - * - * @private - * @returns {Promise} - * - * @memberof ImportResolveExtension - */ - private async organizeImports(): Promise { - if (!window.activeTextEditor) { - return false; - } - try { - this.logger.debug( - '[%s] organize the imports in the document', - ImportResolveExtension.name, - { file: window.activeTextEditor.document.fileName }, - ); - const ctrl = await ImportManager.create(window.activeTextEditor.document); - return await ctrl.organizeImports().commit(); - } catch (e) { - this.logger.error( - '[%s] imports could not be organized, error: %s', - ImportResolveExtension.name, - e, - { file: window.activeTextEditor.document.fileName }, - ); - return false; - } + } + + /** + * Organizes the imports of the actual document. Sorts and formats them correctly. + * + * @private + * @returns {Promise} + * + * @memberof ImportResolveExtension + */ + private async organizeImports(): Promise { + if (!window.activeTextEditor) { + return false; } - - /** - * Effectifely adds an import quick pick item to a document - * - * @private - * @param {DeclarationInfo} declaration - * @returns {Promise} - * - * @memberof ImportResolveExtension - */ - private async addImportToDocument(declaration: DeclarationInfo): Promise { - if (!window.activeTextEditor) { - return false; - } - const ctrl = await ImportManager.create(window.activeTextEditor.document); - return await ctrl.addDeclarationImport(declaration).commit(); + try { + this.logger.debug( + '[%s] organize the imports in the document', + ImportResolveExtension.name, + { file: window.activeTextEditor.document.fileName }, + ); + const ctrl = await ImportManager.create(window.activeTextEditor.document); + return await ctrl.organizeImports().commit(); + } catch (e) { + this.logger.error( + '[%s] imports could not be organized, error: %s', + ImportResolveExtension.name, + e, + { file: window.activeTextEditor.document.fileName }, + ); + return false; } - - /** - * Returns the string under the cursor. - * - * @private - * @returns {string} - * - * @memberof ImportResolveExtension - */ - private getSymbolUnderCursor(): string { - const editor = window.activeTextEditor; - if (!editor) { - return ''; - } - const selection = editor.selection; - const word = editor.document.getWordRangeAtPosition(selection.active); - - return word && !word.isEmpty ? editor.document.getText(word) : ''; + } + + /** + * Effectifely adds an import quick pick item to a document + * + * @private + * @param {DeclarationInfo} declaration + * @returns {Promise} + * + * @memberof ImportResolveExtension + */ + private async addImportToDocument(declaration: DeclarationInfo): Promise { + if (!window.activeTextEditor) { + return false; } - - /** - * Shows a user warning if the resolve index is not ready yet. - * - * @private - * - * @memberof ImportResolveExtension - */ - private showCacheWarning(): void { - this.logger.warn( - '[%s] index was not ready or not index for this file found', - ImportResolveExtension.name, - ); - window.showWarningMessage('Please wait a few seconds longer until the symbol cache has been build.'); + const ctrl = await ImportManager.create(window.activeTextEditor.document); + return await ctrl.addDeclarationImport(declaration).commit(); + } + + + + /** + * Shows a user warning if the resolve index is not ready yet. + * + * @private + * + * @memberof ImportResolveExtension + */ + private showCacheWarning(): void { + this.logger.warn( + '[%s] index was not ready or not index for this file found', + ImportResolveExtension.name, + ); + window.showWarningMessage('Please wait a few seconds longer until the symbol cache has been build.'); + } + + /** + * Calculates the missing imports of a document. Parses the documents source and then + * tries to resolve all possible declaration infos for the usages (used identifiers). + * + * @private + * @param {MissingDeclarationsForFileOptions} {documentSource, documentPath} + * @returns {(Promise<(DeclarationInfo | ImportUserDecision)[]>)} + * + * @memberof ImportResolveExtension + */ + private async getMissingDeclarationsForFile( + { documentSource, documentPath }: MissingDeclarationsForFileOptions, + ): Promise<(DeclarationInfo)[]> { + if (!window.activeTextEditor) { + return []; } - /** - * Calculates the possible imports for a given document source with a filter for the given symbol. - * Returns a list of declaration infos that may be used for select picker or something. - * - * @private - * @param {DeclarationsForImportOptions} {cursorSymbol, documentSource, documentPath} - * @returns {(Promise)} - * - * @memberof ImportResolveExtension - */ - private async getDeclarationsForImport( - { cursorSymbol, documentSource, documentPath }: DeclarationsForImportOptions, - ): Promise { - if (!window.activeTextEditor) { - return []; - } - - const index = this.indices.getIndexForFile(window.activeTextEditor.document.uri); - const rootFolder = workspace.getWorkspaceFolder(window.activeTextEditor.document.uri); - - if (!index || !index.indexReady || !rootFolder) { - return []; - } - - this.logger.debug( - '[%s] calculate possible imports for document', - ImportResolveExtension.name, - { cursorSymbol, file: documentPath }, - ); + const index = this.indices.getIndexForFile(window.activeTextEditor.document.uri); + const rootFolder = workspace.getWorkspaceFolder(window.activeTextEditor.document.uri); - const parsedSource = await this.parser.parseSource(documentSource, getScriptKind(documentPath)); - const activeDocumentDeclarations = parsedSource.declarations.map(o => o.name); - const declarations = getDeclarationsFilteredByImports( - index.declarationInfos, - documentPath, - parsedSource.imports, - rootFolder.uri.fsPath, - ).filter(o => o.declaration.name.startsWith(cursorSymbol)); - - return [ - ...declarations.filter(o => o.from.startsWith('/')), - ...declarations.filter(o => !o.from.startsWith('/')), - ].filter(o => activeDocumentDeclarations.indexOf(o.declaration.name) === -1); + if (!index || !index.indexReady || !rootFolder) { + return []; } - /** - * Calculates the missing imports of a document. Parses the documents source and then - * tries to resolve all possible declaration infos for the usages (used identifiers). - * - * @private - * @param {MissingDeclarationsForFileOptions} {documentSource, documentPath} - * @returns {(Promise<(DeclarationInfo | ImportUserDecision)[]>)} - * - * @memberof ImportResolveExtension - */ - private async getMissingDeclarationsForFile( - { documentSource, documentPath }: MissingDeclarationsForFileOptions, - ): Promise<(DeclarationInfo)[]> { - if (!window.activeTextEditor) { - return []; - } - - const index = this.indices.getIndexForFile(window.activeTextEditor.document.uri); - const rootFolder = workspace.getWorkspaceFolder(window.activeTextEditor.document.uri); - - if (!index || !index.indexReady || !rootFolder) { - return []; - } - - this.logger.debug( - '[%s] calculate missing imports for document', - ImportResolveExtension.name, - { file: documentPath }, - ); - - const parsedDocument = await this.parser.parseSource(documentSource, getScriptKind(documentPath)); - const missingDeclarations: (DeclarationInfo)[] = []; - const declarations = getDeclarationsFilteredByImports( - index.declarationInfos, - documentPath, - parsedDocument.imports, - rootFolder.uri.fsPath, - ); - - for (const usage of parsedDocument.nonLocalUsages) { - const foundDeclarations = declarations.filter(o => o.declaration.name === usage); - if (foundDeclarations.length <= 0) { - continue; - } else if (foundDeclarations.length === 1) { - missingDeclarations.push(foundDeclarations[0]); - } else { - // TODO handle decisions. - // missingDeclarations.push(...foundDeclarations.map(o => new ImportUserDecision(o, usage))); - } - } - - return missingDeclarations; + this.logger.debug( + '[%s] calculate missing imports for document', + ImportResolveExtension.name, + { file: documentPath }, + ); + + const parsedDocument = await this.parser.parseSource(documentSource, getScriptKind(documentPath)); + const missingDeclarations: (DeclarationInfo)[] = []; + const declarations = getDeclarationsFilteredByImports( + index.declarationInfos, + documentPath, + parsedDocument.imports, + rootFolder.uri.fsPath, + ); + + for (const usage of parsedDocument.nonLocalUsages) { + const foundDeclarations = declarations.filter(o => o.declaration.name === usage); + if (foundDeclarations.length <= 0) { + continue; + } else if (foundDeclarations.length === 1) { + missingDeclarations.push(foundDeclarations[0]); + } else { + // TODO handle decisions. + // missingDeclarations.push(...foundDeclarations.map(o => new ImportUserDecision(o, usage))); + } } - /** - * Registers the commands for this extension. - * - * @private - * @memberof ImportResolveExtension - */ - private commandRegistrations(): void { - this.context.subscriptions.push( - commands.registerTextEditorCommand('typescriptHero.resolve.addImport', () => this.addImport()), - ); - this.context.subscriptions.push( - commands.registerTextEditorCommand( - 'typescriptHero.resolve.addImportUnderCursor', - () => this.addImportUnderCursor(), - ), - ); - this.context.subscriptions.push( - commands.registerTextEditorCommand( - 'typescriptHero.resolve.addMissingImports', () => this.addMissingImports(), - ), - ); - this.context.subscriptions.push( - commands.registerTextEditorCommand('typescriptHero.resolve.organizeImports', () => this.organizeImports()), - ); - this.context.subscriptions.push( - commands.registerCommand('typescriptHero.resolve.rebuildCache', () => this.indices.rebuildAll()), - ); - } + return missingDeclarations; + } + + /** + * Registers the commands for this extension. + * + * @private + * @memberof ImportResolveExtension + */ + private commandRegistrations(): void { + + this.context.subscriptions.push( + commands.registerTextEditorCommand( + 'typescriptHero.resolve.addMissingImports', () => this.addMissingImports(), + ), + ); + this.context.subscriptions.push( + commands.registerTextEditorCommand('typescriptHero.resolve.organizeImports', () => this.organizeImports()), + ); + this.context.subscriptions.push( + commands.registerCommand('typescriptHero.resolve.rebuildCache', () => this.indices.rebuildAll()), + ); + } } diff --git a/src/_old/extension/utilities/DeclarationIndexMapper.ts b/src/_old/extension/utilities/DeclarationIndexMapper.ts index 2edbfd7..0e08e9a 100644 --- a/src/_old/extension/utilities/DeclarationIndexMapper.ts +++ b/src/_old/extension/utilities/DeclarationIndexMapper.ts @@ -1,15 +1,15 @@ import { inject, injectable, postConstruct } from 'inversify'; import { DeclarationIndex, FileChanges, TypescriptParser } from 'typescript-parser'; import { - Event, - EventEmitter, - ExtensionContext, - FileSystemWatcher, - RelativePattern, - Uri, - workspace, - WorkspaceFolder, - WorkspaceFoldersChangeEvent, + Event, + EventEmitter, + ExtensionContext, + FileSystemWatcher, + RelativePattern, + Uri, + workspace, + WorkspaceFolder, + WorkspaceFoldersChangeEvent, } from 'vscode'; import { ConfigFactory } from '../../common/factories'; @@ -18,9 +18,9 @@ import { iocSymbols } from '../../extension/IoCSymbols'; import { Logger } from './winstonLogger'; interface WorkspaceIndex { - index: DeclarationIndex; - folder: WorkspaceFolder; - watcher: FileSystemWatcher; + index: DeclarationIndex; + folder: WorkspaceFolder; + watcher: FileSystemWatcher; } // TODO move did change configuration to all indices @@ -34,224 +34,224 @@ interface WorkspaceIndex { */ @injectable() export class DeclarationIndexMapper { - public readonly onStartIndexing: Event; - public readonly onFinishIndexing: Event; - public readonly onIndexingError: Event<{ index: WorkspaceIndex, error: Error }>; + public readonly onStartIndexing: Event; + public readonly onFinishIndexing: Event; + public readonly onIndexingError: Event<{ index: WorkspaceIndex, error: Error }>; - private _onStartIndexing: EventEmitter; - private _onFinishIndexing: EventEmitter; - private _onIndexingError: EventEmitter<{ index: WorkspaceIndex, error: Error }>; + private _onStartIndexing: EventEmitter; + private _onFinishIndexing: EventEmitter; + private _onIndexingError: EventEmitter<{ index: WorkspaceIndex, error: Error }>; - private indizes: { [uri: string]: WorkspaceIndex } = {}; + private indizes: { [uri: string]: WorkspaceIndex } = {}; - constructor( - @inject(iocSymbols.logger) private logger: Logger, - @inject(iocSymbols.extensionContext) private context: ExtensionContext, - @inject(iocSymbols.typescriptParser) private parser: TypescriptParser, - @inject(iocSymbols.configuration) private config: ConfigFactory, - ) { - this._onFinishIndexing = new EventEmitter(); - this._onStartIndexing = new EventEmitter(); - this._onIndexingError = new EventEmitter(); + constructor( + @inject(iocSymbols.logger) private logger: Logger, + @inject(iocSymbols.extensionContext) private context: ExtensionContext, + @inject(iocSymbols.typescriptParser) private parser: TypescriptParser, + @inject(iocSymbols.configuration) private config: ConfigFactory, + ) { + this._onFinishIndexing = new EventEmitter(); + this._onStartIndexing = new EventEmitter(); + this._onIndexingError = new EventEmitter(); - this.onFinishIndexing = this._onFinishIndexing.event; - this.onStartIndexing = this._onStartIndexing.event; - this.onIndexingError = this._onIndexingError.event; + this.onFinishIndexing = this._onFinishIndexing.event; + this.onStartIndexing = this._onStartIndexing.event; + this.onIndexingError = this._onIndexingError.event; - this.context.subscriptions.push(this._onFinishIndexing); - this.context.subscriptions.push(this._onIndexingError); - this.context.subscriptions.push(this._onStartIndexing); - } + this.context.subscriptions.push(this._onFinishIndexing); + this.context.subscriptions.push(this._onIndexingError); + this.context.subscriptions.push(this._onStartIndexing); + } - /** - * Init method that runs after the DI construction of the object. - * - * @memberof DeclarationIndexMapper - */ - @postConstruct() - public initialize(): void { - this.context.subscriptions.push(workspace.onDidChangeWorkspaceFolders(e => this.workspaceChanged(e))); - this.logger.info( - '[%s] initializing index mapper for %d workspaces', - DeclarationIndexMapper.name, - (workspace.workspaceFolders || []).length, - ); + /** + * Init method that runs after the DI construction of the object. + * + * @memberof DeclarationIndexMapper + */ + @postConstruct() + public initialize(): void { + this.context.subscriptions.push(workspace.onDidChangeWorkspaceFolders(e => this.workspaceChanged(e))); + this.logger.info( + '[%s] initializing index mapper for %d workspaces', + DeclarationIndexMapper.name, + (workspace.workspaceFolders || []).length, + ); - for (const folder of (workspace.workspaceFolders || []).filter(workspace => workspace.uri.scheme === 'file')) { - this.initializeIndex(folder); - } - this.logger.info('[%s] initialized', DeclarationIndexMapper.name); + for (const folder of (workspace.workspaceFolders || []).filter(workspace => workspace.uri.scheme === 'file')) { + this.initializeIndex(folder); } + this.logger.info('[%s] initialized', DeclarationIndexMapper.name); + } - /** - * Method to rebuild all indices in the system. - * - * @memberof DeclarationIndexMapper - */ - public rebuildAll(): void { - this.logger.info( - '[%s] rebuilding all indices', - DeclarationIndexMapper.name, - ); - for (const index of Object.values(this.indizes)) { - index.watcher.dispose(); - index.index.reset(); - } - this.indizes = {}; - for (const folder of (workspace.workspaceFolders || []).filter(workspace => workspace.uri.scheme === 'file')) { - this.initializeIndex(folder); - } + /** + * Method to rebuild all indices in the system. + * + * @memberof DeclarationIndexMapper + */ + public rebuildAll(): void { + this.logger.info( + '[%s] rebuilding all indices', + DeclarationIndexMapper.name, + ); + for (const index of Object.values(this.indizes)) { + index.watcher.dispose(); + index.index.reset(); } + this.indizes = {}; + for (const folder of (workspace.workspaceFolders || []).filter(workspace => workspace.uri.scheme === 'file')) { + this.initializeIndex(folder); + } + } - /** - * Returns the index (or undefined) for a given file URI. - * - * @param {Uri} fileUri - * @returns {(DeclarationIndex | undefined)} - * @memberof DeclarationIndexMapper - */ - public getIndexForFile(fileUri: Uri): DeclarationIndex | undefined { - const workspaceFolder = workspace.getWorkspaceFolder(fileUri); - if (!workspaceFolder || !this.indizes[workspaceFolder.uri.fsPath]) { - this.logger.debug( - '[%s] did not find index for file', - DeclarationIndexMapper.name, - { file: fileUri.fsPath }, - ); - return; - } - - return this.indizes[workspaceFolder.uri.fsPath].index; + /** + * Returns the index (or undefined) for a given file URI. + * + * @param {Uri} fileUri + * @returns {(DeclarationIndex | undefined)} + * @memberof DeclarationIndexMapper + */ + public getIndexForFile(fileUri: Uri): DeclarationIndex | undefined { + const workspaceFolder = workspace.getWorkspaceFolder(fileUri); + if (!workspaceFolder || !this.indizes[workspaceFolder.uri.fsPath]) { + this.logger.debug( + '[%s] did not find index for file', + DeclarationIndexMapper.name, + { file: fileUri.fsPath }, + ); + return; } - /** - * Eventhandler that is called when the workspaces changed (i.e. some where added or removed). - * - * @private - * @param {WorkspaceFoldersChangeEvent} event - * @memberof DeclarationIndexMapper - */ - private workspaceChanged(event: WorkspaceFoldersChangeEvent): void { - this.logger.info( - '[%s] workspaces changed, adjusting indices', - DeclarationIndexMapper.name, - ); - for (const add of event.added) { - this.logger.debug( - '[%s] add workspace for "%s"', - DeclarationIndexMapper.name, - add.uri.fsPath, - ); - if (this.indizes[add.uri.fsPath]) { - this.logger.warn( - '[%s] workspace index "%s" already exists, skipping', - DeclarationIndexMapper.name, - add.uri.fsPath, - ); - continue; - } - this.initializeIndex(add); - } + return this.indizes[workspaceFolder.uri.fsPath].index; + } - for (const remove of event.removed) { - this.logger.debug( - '[%s] remove workspace for "%s"', - DeclarationIndexMapper.name, - remove.uri.fsPath, - ); - this.indizes[remove.uri.fsPath].index.reset(); - this.indizes[remove.uri.fsPath].watcher.dispose(); - delete this.indizes[remove.uri.fsPath]; - } + /** + * Eventhandler that is called when the workspaces changed (i.e. some where added or removed). + * + * @private + * @param {WorkspaceFoldersChangeEvent} event + * @memberof DeclarationIndexMapper + */ + private workspaceChanged(event: WorkspaceFoldersChangeEvent): void { + this.logger.info( + '[%s] workspaces changed, adjusting indices', + DeclarationIndexMapper.name, + ); + for (const add of event.added) { + this.logger.debug( + '[%s] add workspace for "%s"', + DeclarationIndexMapper.name, + add.uri.fsPath, + ); + if (this.indizes[add.uri.fsPath]) { + this.logger.warn( + '[%s] workspace index "%s" already exists, skipping', + DeclarationIndexMapper.name, + add.uri.fsPath, + ); + continue; + } + this.initializeIndex(add); } - /** - * Helper method to initialize an index. - * - * @private - * @param {WorkspaceFolder} folder - * @returns {Promise} - * @memberof DeclarationIndexMapper - */ - private async initializeIndex(folder: WorkspaceFolder): Promise { - const profiler = this.logger.startTimer(); - this.logger.debug( - '[%s] initialize index for "%s"', - DeclarationIndexMapper.name, - folder.uri.fsPath, - ); - const index = new DeclarationIndex(this.parser, folder.uri.fsPath); - const config = this.config(folder.uri); - const files = await findFiles(config, folder); - const watcher = workspace.createFileSystemWatcher( - new RelativePattern( - folder, - `{${config.resolver.resolverModeFileGlobs.join(',')},**/package.json,**/typings.json}`, - ), - ); - const workspaceIndex = { - index, - folder, - watcher, - }; + for (const remove of event.removed) { + this.logger.debug( + '[%s] remove workspace for "%s"', + DeclarationIndexMapper.name, + remove.uri.fsPath, + ); + this.indizes[remove.uri.fsPath].index.reset(); + this.indizes[remove.uri.fsPath].watcher.dispose(); + delete this.indizes[remove.uri.fsPath]; + } + } - this._onStartIndexing.fire(workspaceIndex); + /** + * Helper method to initialize an index. + * + * @private + * @param {WorkspaceFolder} folder + * @returns {Promise} + * @memberof DeclarationIndexMapper + */ + private async initializeIndex(folder: WorkspaceFolder): Promise { + const profiler = this.logger.startTimer(); + this.logger.debug( + '[%s] initialize index for "%s"', + DeclarationIndexMapper.name, + folder.uri.fsPath, + ); + const index = new DeclarationIndex(this.parser, folder.uri.fsPath); + const config = this.config(folder.uri); + const files = await findFiles(config, folder); + const watcher = workspace.createFileSystemWatcher( + new RelativePattern( + folder, + `{${config.resolver.resolverModeFileGlobs.join(',')},**/package.json,**/typings.json}`, + ), + ); + const workspaceIndex = { + index, + folder, + watcher, + }; - let timeout: NodeJS.Timer | undefined; - let events: FileChanges | undefined; + this._onStartIndexing.fire(workspaceIndex); - const fileWatcherEvent = (event: string, uri: Uri) => { - if (timeout) { - clearTimeout(timeout); - } - if (!events) { - events = { - created: [], - updated: [], - deleted: [], - }; - } - events[event].push(uri.fsPath); + let timeout: NodeJS.Timer | undefined; + let events: FileChanges | undefined; - timeout = setTimeout( - async () => { - if (events) { - const profiler = this.logger.startTimer(); - this.logger.debug( - '[%s] rebuilding index for index "%s"', - DeclarationIndexMapper.name, - folder.uri.fsPath, - ); - await index.reindexForChanges(events); - profiler.done({ - message: `[${DeclarationIndexMapper.name}] rebuilt index for workspace "${folder.name}"`, - }); - events = undefined; - } - }, - 500, - ); + const fileWatcherEvent = (event: string, uri: Uri) => { + if (timeout) { + clearTimeout(timeout); + } + if (!events) { + events = { + created: [], + updated: [], + deleted: [], }; + } + events[event].push(uri.fsPath); - watcher.onDidCreate(uri => fileWatcherEvent('created', uri)); - watcher.onDidChange(uri => fileWatcherEvent('updated', uri)); - watcher.onDidDelete(uri => fileWatcherEvent('deleted', uri)); - - try { - await index.buildIndex(files); - this.indizes[folder.uri.fsPath] = workspaceIndex; - this._onFinishIndexing.fire(workspaceIndex); + timeout = setTimeout( + async () => { + if (events) { + const profiler = this.logger.startTimer(); + this.logger.debug( + '[%s] rebuilding index for index "%s"', + DeclarationIndexMapper.name, + folder.uri.fsPath, + ); + await index.reindexForChanges(events); profiler.done({ - message: `[${DeclarationIndexMapper.name}] built index for workspace "${folder.name}"`, + message: `[${DeclarationIndexMapper.name}] rebuilt index for workspace "${folder.name}"`, }); - } catch (error) { - this.logger.error( - '[%s] could not build index for workspace "%s", error: %s', - DeclarationIndexMapper.name, - folder.uri.fsPath, - error, - ); - this._onIndexingError.fire({ error, index: workspaceIndex }); - } + events = undefined; + } + }, + 500, + ); + }; + + watcher.onDidCreate(uri => fileWatcherEvent('created', uri)); + watcher.onDidChange(uri => fileWatcherEvent('updated', uri)); + watcher.onDidDelete(uri => fileWatcherEvent('deleted', uri)); + + try { + await index.buildIndex(files); + this.indizes[folder.uri.fsPath] = workspaceIndex; + this._onFinishIndexing.fire(workspaceIndex); + profiler.done({ + message: `[${DeclarationIndexMapper.name}] built index for workspace "${folder.name}"`, + }); + } catch (error) { + this.logger.error( + '[%s] could not build index for workspace "%s", error: %s', + DeclarationIndexMapper.name, + folder.uri.fsPath, + error, + ); + this._onIndexingError.fire({ error, index: workspaceIndex }); } + } } diff --git a/src/_old/old-config.json b/src/_old/old-config.json index fd95050..b5900e5 100644 --- a/src/_old/old-config.json +++ b/src/_old/old-config.json @@ -8,59 +8,9 @@ "default": "default", "description": "Defines the sortmode of the code completion in intellisense (bottom means sorted to bottom).", "scope": "resource" - }, - "typescriptHero.resolver.workspaceIgnorePatterns": { - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true, - "default": [ - "**/build/**/*", - "**/out/**/*", - "**/dist/**/*" - ], - "description": "Defines partial pathes (globs) that are ignored during indexing of the **workspace** (e.g. 'node_modules/**/*' would exclude all modules).", - "scope": "resource" - }, - "typescriptHero.resolver.moduleIgnorePatterns": { - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true, - "default": [ - "**/node_modules/**/*" - ], - "description": "Defines partial pathes (globs) that are ignored during indexing of the **node_modules**. This patterns are attached to the node_module/ of each found module.", - "scope": "resource" - }, - "typescriptHero.resolver.resolverMode": { - "enum": [ - "TypeScript", - "ES6", - "Both" - ], - "default": "Both", - "description": "Defines the mode of the symbol resolver. (Note that JavaScript mode only indexes workspace files)", - "scope": "resource" - }, - "typescriptHero.resolver.promptForSpecifiers": { - "type": "boolean", - "default": true, - "description": "Defines if typescript hero should ask the user for default specifiers or duplicate specifier aliases.", - "scope": "window" } }, "commands": [ - { - "command": "typescriptHero.resolve.addImport", - "title": "TS Hero: Add an import to current file" - }, - { - "command": "typescriptHero.resolve.addImportUnderCursor", - "title": "TS Hero: Adds the current symbol under the cursor as an import to current file" - }, { "command": "typescriptHero.resolve.addMissingImports", "title": "TS Hero: Adds all missing imports for the open document" @@ -87,16 +37,6 @@ } ], "keybindings": [ - { - "command": "typescriptHero.resolve.addImport", - "key": "ctrl+shift+i", - "when": "editorTextFocus" - }, - { - "command": "typescriptHero.resolve.addImportUnderCursor", - "key": "ctrl+alt+i", - "when": "editorTextFocus" - }, { "command": "typescriptHero.resolve.addMissingImports", "key": "ctrl+alt+shift+i", diff --git a/src/code-outline/index.ts b/src/code-outline/index.ts index 31981e4..6b9ea51 100644 --- a/src/code-outline/index.ts +++ b/src/code-outline/index.ts @@ -1,18 +1,17 @@ import { inject, injectable } from 'inversify'; -import { Subscription } from 'rxjs'; import { File, Node, TypescriptParser } from 'typescript-parser'; import { - commands, - Disposable, - Event, - EventEmitter, - ExtensionContext, - ProviderResult, - Selection, - TextEditorRevealType, - TreeDataProvider, - window, - workspace, + commands, + Disposable, + Event, + EventEmitter, + ExtensionContext, + ProviderResult, + Selection, + TextEditorRevealType, + TreeDataProvider, + window, + workspace, } from 'vscode'; import Activatable from '../activatable'; @@ -31,7 +30,6 @@ import ResourceStructureTreeItem from './resource-structure-tree-item'; export default class CodeOutline implements Activatable, TreeDataProvider { private _onDidChangeTreeData: EventEmitter; - private subscription: Subscription; private disposables: Disposable[] = []; private documentCache?: File; @@ -48,13 +46,13 @@ export default class CodeOutline implements Activatable, TreeDataProvider { + this.context.subscriptions.push(this.config.configurationChanged(() => { if (this.config.codeOutline.isEnabled() && !this.disposables) { this.start(); } else if (!this.config.codeOutline.isEnabled() && this.disposables) { this.stop(); } - }); + })); this.context.subscriptions.push(commands.registerCommand( 'typescriptHero.codeOutline.gotoNode', (node: Node | undefined) => this.jumpToNode(node), @@ -88,10 +86,6 @@ export default class CodeOutline implements Activatable, TreeDataProvider = new Subject(); + private readonly _configurationChanged: EventEmitter = new EventEmitter(); - public get configurationChanged(): Observable { - return this._configurationChanged; + public get configurationChanged(): Event { + return this._configurationChanged.event; } constructor( @inject(iocSymbols.extensionContext) context: ExtensionContext, ) { context.subscriptions.push( - workspace.onDidChangeConfiguration(() => this._configurationChanged.next()), + workspace.onDidChangeConfiguration(() => this._configurationChanged.fire()), ); + context.subscriptions.push(this._configurationChanged); } public parseableLanguages(): string[] { diff --git a/src/declarations/declaration-manager.ts b/src/declarations/declaration-manager.ts new file mode 100644 index 0000000..7e8f1a5 --- /dev/null +++ b/src/declarations/declaration-manager.ts @@ -0,0 +1,139 @@ +import { inject, injectable, postConstruct } from 'inversify'; +import { DeclarationIndex } from 'typescript-parser'; +import { + Disposable, + ExtensionContext, + StatusBarAlignment, + StatusBarItem, + Uri, + window, + workspace, + WorkspaceFolder, + WorkspaceFoldersChangeEvent, +} from 'vscode'; + +import iocSymbols from '../ioc-symbols'; +import { Logger } from '../utilities/logger'; +import WorkspaceDeclarations, { WorkspaceDeclarationsState } from './workspace-declarations'; + +enum ResolverState { + ok = 'TSH Resolver $(check)', + syncing = 'TSH Resolver $(sync)', + error = 'TSH Resolver $(flame)', +} + +@injectable() +export default class DeclarationManager implements Disposable { + private readonly workspaces: { [uri: string]: WorkspaceDeclarations } = {}; + private statusBarItem: StatusBarItem; + private activeWorkspaces: number = 0; + + constructor( + @inject(iocSymbols.extensionContext) private context: ExtensionContext, + @inject(iocSymbols.logger) private logger: Logger, + ) { } + + @postConstruct() + public setup(): void { + this.logger.debug('Setting up DeclarationManager.'); + this.statusBarItem = window.createStatusBarItem(StatusBarAlignment.Left, 4); + this.statusBarItem.text = ResolverState.ok; + this.statusBarItem.show(); + + this.context.subscriptions.push(this); + this.context.subscriptions.push(this.statusBarItem); + this.context.subscriptions.push(workspace.onDidChangeWorkspaceFolders(e => this.workspaceFoldersChanged(e))); + + for (const folder of (workspace.workspaceFolders || []).filter(workspace => workspace.uri.scheme === 'file')) { + this.createWorkspace(folder); + } + } + + /** + * Returns the index (or undefined) for a given file URI. + * + * @param {Uri} fileUri + * @returns {(DeclarationIndex | undefined)} + * @memberof DeclarationIndexMapper + */ + public getIndexForFile(fileUri: Uri): DeclarationIndex | undefined { + const workspaceFolder = workspace.getWorkspaceFolder(fileUri); + if (!workspaceFolder || !this.workspaces[workspaceFolder.uri.fsPath]) { + this.logger.debug('Did not find index for file', { file: fileUri.fsPath }); + return; + } + + return this.workspaces[workspaceFolder.uri.fsPath].index; + } + + public dispose(): void { + this.logger.debug('Disposing DeclarationManager.'); + for (const folder of Object.values(this.workspaces)) { + folder.dispose(); + } + } + + /** + * Eventhandler that is called when the workspaces changed (i.e. some where added or removed). + * + * @private + * @param {WorkspaceFoldersChangeEvent} event + * @memberof DeclarationIndexMapper + */ + private workspaceFoldersChanged(event: WorkspaceFoldersChangeEvent): void { + const added = event.added.filter(e => e.uri.scheme === 'file'); + const removed = event.removed.filter(e => e.uri.scheme === 'file'); + + this.logger.info( + 'Workspaces changed, adjusting indices', + { added: added.map(e => e.uri.fsPath), removed: removed.map(e => e.uri.fsPath) }, + ); + + for (const add of event.added) { + if (this.workspaces[add.uri.fsPath]) { + this.logger.warn( + 'Workspace index already exists, skipping', + { workspace: add.uri.fsPath }, + ); + continue; + } + this.createWorkspace(add); + } + + for (const remove of event.removed) { + this.workspaces[remove.uri.fsPath].dispose(); + delete this.workspaces[remove.uri.fsPath]; + } + } + + private workspaceStateChanged(state: WorkspaceDeclarationsState): void { + if (this.statusBarItem.text === ResolverState.error) { + return; + } + if (state === WorkspaceDeclarationsState.Error) { + this.logger.error('A workspace did encounter an error.'); + this.statusBarItem.text = ResolverState.error; + return; + } + if (state === WorkspaceDeclarationsState.Syncing) { + this.logger.debug('A workspace is syncing it\'s files.'); + this.activeWorkspaces++; + this.statusBarItem.text = ResolverState.syncing; + return; + } + if (state === WorkspaceDeclarationsState.Idle) { + this.logger.debug('A workspace is done syncing it\'s files.'); + this.activeWorkspaces--; + } + if (this.activeWorkspaces <= 0) { + this.logger.debug('All workspaces are done syncing.'); + this.statusBarItem.text = ResolverState.ok; + } + } + + private createWorkspace(folder: WorkspaceFolder): void { + this.workspaces[folder.uri.fsPath] = new WorkspaceDeclarations(folder); + this.workspaces[folder.uri.fsPath].workspaceStateChanged(state => this.workspaceStateChanged(state)); + this.workspaceStateChanged(WorkspaceDeclarationsState.Syncing); + } +} diff --git a/src/declarations/workspace-declarations.ts b/src/declarations/workspace-declarations.ts new file mode 100644 index 0000000..a5635f1 --- /dev/null +++ b/src/declarations/workspace-declarations.ts @@ -0,0 +1,215 @@ +import { exists } from 'fs-extra'; +import { join } from 'path'; +import { DeclarationIndex, FileChanges, TypescriptParser } from 'typescript-parser'; +import { Disposable, Event, EventEmitter, RelativePattern, Uri, workspace, WorkspaceFolder } from 'vscode'; + +import Configuration from '../configuration'; +import ioc from '../ioc'; +import iocSymbols from '../ioc-symbols'; +import { Logger } from '../utilities/logger'; + +export const enum WorkspaceDeclarationsState { + Idle, + Syncing, + Error, +} + +export default class WorkspaceDeclarations implements Disposable { + private readonly _workspaceStateChanged: EventEmitter = new EventEmitter(); + private readonly disposables: Disposable[] = []; + private watcherEvents: FileChanges | undefined; + private timeout: NodeJS.Timer | undefined; + private _index: DeclarationIndex; + + public get workspaceStateChanged(): Event { + return this._workspaceStateChanged.event; + } + + public get index(): DeclarationIndex { + return this._index; + } + + private get parser(): TypescriptParser { + return ioc.get(iocSymbols.parser); + } + + private get logger(): Logger { + return ioc.get(iocSymbols.logger); + } + + private get config(): Configuration { + return ioc.get(iocSymbols.configuration); + } + + constructor( + private readonly folder: WorkspaceFolder, + ) { + this.logger.debug('Creating workspace declarations index.', { workspace: this.folder.uri.fsPath }); + this.disposables.push(this._workspaceStateChanged); + this.initialize(); + } + + public dispose(): void { + this.logger.debug('Disposing workspace declarations index.', { workspace: this.folder.uri.fsPath }); + for (const disposable of this.disposables) { + disposable.dispose(); + } + this._index.reset(); + } + + private async initialize(): Promise { + const profiler = this.logger.startTimer(); + this._workspaceStateChanged.fire(WorkspaceDeclarationsState.Syncing); + + this._index = new DeclarationIndex(this.parser, this.folder.uri.fsPath); + const files = await this.findFiles(); + const watcher = workspace.createFileSystemWatcher( + new RelativePattern( + this.folder, + '{**/*.ts,**/*.tsx,**/package.json,**/typings.json}', + ), + ); + + watcher.onDidChange(uri => this.fileWatcherEvent('created', uri)); + watcher.onDidChange(uri => this.fileWatcherEvent('updated', uri)); + watcher.onDidDelete(uri => this.fileWatcherEvent('deleted', uri)); + + this.disposables.push(watcher); + + try { + await this._index.buildIndex(files); + this._workspaceStateChanged.fire(WorkspaceDeclarationsState.Idle); + + profiler.done({ + message: 'Built index for workspace', + workspace: this.folder.uri.fsPath, + }); + } catch (error) { + this._workspaceStateChanged.fire(WorkspaceDeclarationsState.Error); + this.logger.error( + 'Error during indexing of workspacefiles', + { error: error.toString(), workspace: this.folder.uri.fsPath }, + ); + } + } + + private fileWatcherEvent(event: string, uri: Uri): void { + if (this.timeout) { + clearTimeout(this.timeout); + } + if (!this.watcherEvents) { + this.watcherEvents = { + created: [], + updated: [], + deleted: [], + }; + } + this.watcherEvents[event].push(uri.fsPath); + + this.timeout = setTimeout( + async () => { + if (this.watcherEvents) { + const profiler = this.logger.startTimer(); + this.logger.debug( + 'Rebuilding index for workspace', + { workspace: this.folder.uri.fsPath }, + ); + this._workspaceStateChanged.fire(WorkspaceDeclarationsState.Syncing); + try { + await this._index.reindexForChanges(this.watcherEvents); + profiler.done({ + message: 'Rebuilt index for workspace', + workspace: this.folder.uri.fsPath, + }); + this._workspaceStateChanged.fire(WorkspaceDeclarationsState.Idle); + } catch (e) { + this._workspaceStateChanged.fire(WorkspaceDeclarationsState.Error); + this.logger.error('Error during reindex of workspacefiles', { workspace: this.folder.uri.fsPath }); + } finally { + this.watcherEvents = undefined; + } + } + }, + 500, + ); + } + + /** + * This function searches for files in a specific workspace folder. The files are relative to the given + * workspace folder. + * + * If a node_modules folder is present, but NO package.json, the node_modules are ignored completely. + * (For performance and memory reasons) + * + * @returns {Promise} + */ + private async findFiles(): Promise { + const workspaceExcludes = [ + ...this.config.index.workspaceIgnorePatterns(this.folder.uri), + 'node_modules/**/*', + 'typings/**/*', + ]; + const moduleExcludes = this.config.index.moduleIgnorePatterns(this.folder.uri); + this.logger.debug('Calculated excludes for workspace.', { + workspaceExcludes, + moduleExcludes, + workspace: this.folder.uri.fsPath, + }); + + const searches: PromiseLike[] = [ + workspace.findFiles( + new RelativePattern(this.folder, '{**/*.ts,**/*.tsx}'), + new RelativePattern(this.folder, `{${workspaceExcludes.join(',')}}`), + ), + ]; + + const rootPath = this.folder.uri.fsPath; + const hasPackageJson = await exists(join(rootPath, 'package.json')); + + if (rootPath && hasPackageJson) { + this.logger.debug('Found package.json, calculate searchable node modules.', { + workspace: this.folder.uri.fsPath, + packageJson: join(rootPath, 'package.json'), + }); + let globs: string[] = []; + let ignores: string[] = []; + + const packageJson = require(join(rootPath, 'package.json')); + for (const folder of ['dependencies', 'devDependencies']) { + if (packageJson[folder]) { + globs = globs.concat( + Object.keys(packageJson[folder]).map(o => `node_modules/${o}/**/*.d.ts`), + ); + ignores = ignores.concat( + Object.keys(packageJson[folder]).reduce( + (all, pkg) => { + return all.concat( + moduleExcludes.map(exclude => `node_modules/${pkg}/${exclude}`), + ); + }, + [] as string[], + ), + ); + } + } + + this.logger.debug('Calculated node module search.', { + globs, + ignores, + workspace: this.folder.uri.fsPath, + }); + + searches.push( + workspace.findFiles( + new RelativePattern(this.folder, `{${globs.join(',')}}`), + new RelativePattern(this.folder, `{${ignores.join(',')}}`), + ), + ); + } + + const uris = await Promise.all(searches); + return uris + .reduce((all, cur) => all.concat(cur), []) + .map(o => o.fsPath); + } +} diff --git a/src/import-organizer/import-manager.ts b/src/import-organizer/import-manager.ts index 8bcaa07..c82a529 100644 --- a/src/import-organizer/import-manager.ts +++ b/src/import-organizer/import-manager.ts @@ -1,26 +1,31 @@ import { - ExternalModuleImport, - File, - Import, - NamedImport, - NamespaceImport, - StringImport, - SymbolSpecifier, - TypescriptCodeGenerator, - TypescriptParser, + DeclarationInfo, + DefaultDeclaration, + ExternalModuleImport, + File, + Import, + ModuleDeclaration, + NamedImport, + NamespaceImport, + StringImport, + SymbolSpecifier, + TypescriptCodeGenerator, + TypescriptParser, } from 'typescript-parser'; import { Position, Range, TextDocument, TextEdit, window, workspace, WorkspaceEdit } from 'vscode'; -import Configuration from '../configuration/index'; +import Configuration from '../configuration'; import { TypescriptCodeGeneratorFactory } from '../ioc-symbols'; import { Logger } from '../utilities/logger'; import { - getImportInsertPosition, - getScriptKind, - importGroupSortForPrecedence, - importSort, - importSortByFirstSpecifier, - specifierSort, + getAbsolutLibraryName, + getImportInsertPosition, + getRelativeLibraryName, + getScriptKind, + importGroupSortForPrecedence, + importSort, + importSortByFirstSpecifier, + specifierSort, } from '../utilities/utility-functions'; import { ImportGroup } from './import-grouping'; @@ -95,7 +100,7 @@ export default class ImportManager { private readonly generatorFactory: TypescriptCodeGeneratorFactory, ) { this.logger.debug( - `[ImportManager] create import manager`, + `Create import manager`, { file: document.fileName }, ); this.reset(); @@ -124,7 +129,7 @@ export default class ImportManager { */ public organizeImports(): this { this.logger.debug( - '[ImportManager] organize the imports', + 'Organize the imports', { file: this.document.fileName }, ); this.organize = true; @@ -184,6 +189,62 @@ export default class ImportManager { return this; } + /** + * Adds an import for a declaration to the documents imports. + * This index is merged and commited during the commit() function. + * If it's a default import or there is a duplicate identifier, the controller will ask for the name on commit(). + * + * @param {DeclarationInfo} declarationInfo The import that should be added to the document + * @returns {ImportManager} + * + * @memberof ImportManager + */ + public addDeclarationImport(declarationInfo: DeclarationInfo): this { + this.logger.debug( + 'Add declaration as import', + { file: this.document.fileName, specifier: declarationInfo.declaration.name, library: declarationInfo.from }, + ); + // If there is something already imported, it must be a NamedImport + const alreadyImported: NamedImport = this.imports.find( + o => declarationInfo.from === getAbsolutLibraryName( + o.libraryName, + this.document.fileName, + this.rootPath, + ) && o instanceof NamedImport, + ) as NamedImport; + + if (alreadyImported) { + // If we found an import for this declaration, it's named import (with a possible default declaration) + if (declarationInfo.declaration instanceof DefaultDeclaration) { + delete alreadyImported.defaultAlias; + alreadyImported.defaultAlias = declarationInfo.declaration.name; + } else if (!alreadyImported.specifiers.some(o => o.specifier === declarationInfo.declaration.name)) { + alreadyImported.specifiers.push(new SymbolSpecifier(declarationInfo.declaration.name)); + } + } else { + let imp: Import = new NamedImport(getRelativeLibraryName( + declarationInfo.from, + this.document.fileName, + this.rootPath, + )); + + if (declarationInfo.declaration instanceof ModuleDeclaration) { + imp = new NamespaceImport( + declarationInfo.from, + declarationInfo.declaration.name, + ); + } else if (declarationInfo.declaration instanceof DefaultDeclaration) { + (imp as NamedImport).defaultAlias = declarationInfo.declaration.name; + } else { + (imp as NamedImport).specifiers.push(new SymbolSpecifier(declarationInfo.declaration.name)); + } + this.imports.push(imp); + this.addImportsToGroups([imp]); + } + + return this; + } + /** * Does commit the currently virtual document to the TextEditor. * Returns a promise that resolves to a boolean if all changes @@ -200,7 +261,7 @@ export default class ImportManager { workspaceEdit.set(this.document.uri, edits); this.logger.debug( - '[ImportManager] commit the file', + 'Commit the file', { file: this.document.fileName }, ); diff --git a/src/import-organizer/import-quick-pick-item.ts b/src/import-organizer/import-quick-pick-item.ts new file mode 100644 index 0000000..a61e644 --- /dev/null +++ b/src/import-organizer/import-quick-pick-item.ts @@ -0,0 +1,21 @@ +import { DeclarationInfo } from 'typescript-parser'; +import { QuickPickItem } from 'vscode'; + +/** + * Quickpick item that contains a symbol resolve information (Declarationinfo) + * Contains the name and the location where it is imported from. + * The whole DeclarationInfo is also exposed. + * + * @export + * @class ImportQuickPickItem + * @implements {QuickPickItem} + */ +export default class ImportQuickPickItem implements QuickPickItem { + public label: string; + public description: string; + + constructor(public readonly declarationInfo: DeclarationInfo) { + this.description = this.declarationInfo.from; + this.label = this.declarationInfo.declaration.name; + } +} diff --git a/src/import-organizer/index.ts b/src/import-organizer/index.ts index 3eb6c4f..6930804 100644 --- a/src/import-organizer/index.ts +++ b/src/import-organizer/index.ts @@ -1,10 +1,16 @@ import { inject, injectable } from 'inversify'; +import { DeclarationInfo, TypescriptParser } from 'typescript-parser'; import { commands, ExtensionContext, window, workspace } from 'vscode'; import Activatable from '../activatable'; import Configuration from '../configuration'; +import DeclarationManager from '../declarations/declaration-manager'; import iocSymbols, { ImportManagerProvider } from '../ioc-symbols'; import { Logger } from '../utilities/logger'; +import { getDeclarationsFilteredByImports, getScriptKind } from '../utilities/utility-functions'; +import ImportQuickPickItem from './import-quick-pick-item'; + +type DeclarationsForImportOptions = { cursorSymbol: string, documentSource: string, documentPath: string }; @injectable() export default class ImportOrganizer implements Activatable { @@ -13,6 +19,8 @@ export default class ImportOrganizer implements Activatable { @inject(iocSymbols.logger) private logger: Logger, @inject(iocSymbols.configuration) private config: Configuration, @inject(iocSymbols.importManager) private importManagerProvider: ImportManagerProvider, + @inject(iocSymbols.declarationManager) private declarationManager: DeclarationManager, + @inject(iocSymbols.parser) private parser: TypescriptParser, ) { } public setup(): void { @@ -20,24 +28,33 @@ export default class ImportOrganizer implements Activatable { this.context.subscriptions.push( commands.registerTextEditorCommand('typescriptHero.imports.organize', () => this.organizeImports()), ); + this.context.subscriptions.push( + commands.registerTextEditorCommand('typescriptHero.index.addImport', () => this.addImport()), + ); + this.context.subscriptions.push( + commands.registerTextEditorCommand( + 'typescriptHero.index.addImportUnderCursor', + () => this.addImportUnderCursor(), + ), + ); this.context.subscriptions.push( workspace.onWillSaveTextDocument((event) => { if (!this.config.imports.organizeOnSave(event.document.uri)) { this.logger.debug( - '[ImportOrganizer] organizeOnSave is deactivated through config', + 'OrganizeOnSave is deactivated through config', ); return; } if (this.config.parseableLanguages().indexOf(event.document.languageId) < 0) { this.logger.debug( - '[ImportOrganizer] organizeOnSave not possible for given language', + 'OrganizeOnSave not possible for given language', { language: event.document.languageId }, ); return; } this.logger.info( - '[ImportOrganizer] organizeOnSave for file', + 'OrganizeOnSave for file', { file: event.document.fileName }, ); event.waitUntil( @@ -59,23 +76,235 @@ export default class ImportOrganizer implements Activatable { this.logger.debug('Disposing ImportOrganizer.'); } + /** + * Organizes the imports of the actual document. Sorts and formats them correctly. + * + * @private + * @returns {Promise} + * + * @memberof ImportResolveExtension + */ private async organizeImports(): Promise { if (!window.activeTextEditor) { return; } try { this.logger.debug( - '[ImportOrganizer] organize the imports in the document', + 'Organize the imports in the document', { file: window.activeTextEditor.document.fileName }, ); const ctrl = await this.importManagerProvider(window.activeTextEditor.document); await ctrl.organizeImports().commit(); } catch (e) { this.logger.error( - '[ImportOrganizer] imports could not be organized, error: %s', + 'Imports could not be organized, error: %s', e, { file: window.activeTextEditor.document.fileName }, ); } } + + /** + * Add an import from the whole list. Calls the vscode gui, where the user can + * select a symbol to import. + * + * @private + * @returns {Promise} + * + * @memberof ResolveExtension + */ + private async addImport(): Promise { + if (!window.activeTextEditor) { + return; + } + const index = this.declarationManager.getIndexForFile(window.activeTextEditor.document.uri); + if (!index || !index.indexReady) { + this.showCacheWarning(); + return; + } + try { + const selectedItem = await window.showQuickPick( + index.declarationInfos.map(o => new ImportQuickPickItem(o)), + { placeHolder: 'Add import to document:' }, + ); + if (selectedItem) { + this.logger.info( + 'Add import to document', + { specifier: selectedItem.declarationInfo.declaration.name, library: selectedItem.declarationInfo.from }, + ); + this.addImportToDocument(selectedItem.declarationInfo); + } + } catch (e) { + this.logger.error( + 'Import could not be added to document', + { file: window.activeTextEditor.document.fileName, error: e.toString() }, + ); + window.showErrorMessage('The import cannot be completed, there was an error during the process.'); + } + } + + /** + * Add an import from the whole list. Calls the vscode gui, where the user can + * select a symbol to import. + * + * @private + * @returns {Promise} + * + * @memberof ImportResolveExtension + */ + private async addImportUnderCursor(): Promise { + if (!window.activeTextEditor) { + return; + } + const index = this.declarationManager.getIndexForFile(window.activeTextEditor.document.uri); + if (!index || !index.indexReady) { + this.showCacheWarning(); + return; + } + try { + const selectedSymbol = this.getSymbolUnderCursor(); + this.logger.debug('Add import for symbol under cursor', { selectedSymbol }); + if (!!!selectedSymbol) { + return; + } + const resolveItems = await this.getDeclarationsForImport({ + cursorSymbol: selectedSymbol, + documentSource: window.activeTextEditor.document.getText(), + documentPath: window.activeTextEditor.document.fileName, + }); + + if (resolveItems.length < 1) { + this.logger.info( + 'The symbol was not found or is already imported', + { selectedSymbol }, + ); + window.showInformationMessage( + `The symbol '${selectedSymbol}' was not found in the index or is already imported.`, + ); + } else if (resolveItems.length === 1 && resolveItems[0].declaration.name === selectedSymbol) { + this.logger.info( + 'Add import to document', + { + specifier: resolveItems[0].declaration.name, + library: resolveItems[0].from, + }, + ); + this.addImportToDocument(resolveItems[0]); + } else { + const selectedItem = await window.showQuickPick( + resolveItems.map(o => new ImportQuickPickItem(o)), { placeHolder: 'Multiple declarations found:' }, + ); + if (selectedItem) { + this.logger.info( + 'Add import to document', + { + specifier: selectedItem.declarationInfo.declaration.name, + library: selectedItem.declarationInfo.from, + }, + ); + this.addImportToDocument(selectedItem.declarationInfo); + } + } + } catch (e) { + this.logger.error( + 'Import could not be added to document.', + { file: window.activeTextEditor.document.fileName, error: e.toString() }, + ); + window.showErrorMessage('The import cannot be completed, there was an error during the process.'); + } + } + + /** + * Calculates the possible imports for a given document source with a filter for the given symbol. + * Returns a list of declaration infos that may be used for select picker or something. + * + * @private + * @param {DeclarationsForImportOptions} {cursorSymbol, documentSource, documentPath} + * @returns {(Promise)} + * + * @memberof ImportResolveExtension + */ + private async getDeclarationsForImport( + { cursorSymbol, documentSource, documentPath }: DeclarationsForImportOptions, + ): Promise { + if (!window.activeTextEditor) { + return []; + } + + const index = this.declarationManager.getIndexForFile(window.activeTextEditor.document.uri); + const rootFolder = workspace.getWorkspaceFolder(window.activeTextEditor.document.uri); + + if (!index || !index.indexReady || !rootFolder) { + return []; + } + + this.logger.debug( + 'Calculate possible imports for document', + { cursorSymbol, file: documentPath }, + ); + + const parsedSource = await this.parser.parseSource(documentSource, getScriptKind(documentPath)); + const activeDocumentDeclarations = parsedSource.declarations.map(o => o.name); + const declarations = getDeclarationsFilteredByImports( + index.declarationInfos, + documentPath, + parsedSource.imports, + rootFolder.uri.fsPath, + ).filter(o => o.declaration.name.startsWith(cursorSymbol)); + + return [ + ...declarations.filter(o => o.from.startsWith('/')), + ...declarations.filter(o => !o.from.startsWith('/')), + ].filter(o => activeDocumentDeclarations.indexOf(o.declaration.name) === -1); + } + + /** + * Returns the string under the cursor. + * + * @private + * @returns {string} + * + * @memberof ImportResolveExtension + */ + private getSymbolUnderCursor(): string { + const editor = window.activeTextEditor; + if (!editor) { + return ''; + } + const selection = editor.selection; + const word = editor.document.getWordRangeAtPosition(selection.active); + + return word && !word.isEmpty ? editor.document.getText(word) : ''; + } + + /** + * Effectifely adds an import quick pick item to a document + * + * @private + * @param {DeclarationInfo} declaration + * @returns {Promise} + * + * @memberof ImportResolveExtension + */ + private async addImportToDocument(declaration: DeclarationInfo): Promise { + if (!window.activeTextEditor) { + return false; + } + const ctrl = await this.importManagerProvider(window.activeTextEditor.document); + return ctrl.addDeclarationImport(declaration).commit(); + } + + /** + * Shows a user warning if the resolve index is not ready yet. + * + * @private + * + * @memberof ImportResolveExtension + */ + private showCacheWarning(): void { + this.logger.warn( + 'index was not ready or not index for this file found', + ); + window.showWarningMessage('Please wait a few seconds longer until the symbol cache has been build.'); + } } diff --git a/src/ioc-symbols.ts b/src/ioc-symbols.ts index a28c66f..f21b3ec 100644 --- a/src/ioc-symbols.ts +++ b/src/ioc-symbols.ts @@ -6,6 +6,7 @@ import ImportManager from './import-organizer/import-manager'; export default { activatables: Symbol('activatables'), configuration: Symbol('configuration'), + declarationManager: Symbol('declarationManager'), extensionContext: Symbol('extensionContext'), generatorFactory: Symbol('generatorFactory'), importManager: Symbol('importManager'), diff --git a/src/ioc.ts b/src/ioc.ts index dd5691a..2bb6d76 100644 --- a/src/ioc.ts +++ b/src/ioc.ts @@ -7,6 +7,7 @@ import { ExtensionContext, TextDocument, Uri } from 'vscode'; import Activatable from './activatable'; import CodeOutline from './code-outline'; import Configuration from './configuration'; +import DeclarationManager from './declarations/declaration-manager'; import ImportOrganizer from './import-organizer'; import ImportManager from './import-organizer/import-manager'; import iocSymbols, { ImportManagerProvider, TypescriptCodeGeneratorFactory } from './ioc-symbols'; @@ -47,6 +48,7 @@ ioc.bind(iocSymbols.importManager).toProvider(iocSymbols.declarationManager).to(DeclarationManager).inSingletonScope(); // Typescript ioc.bind(iocSymbols.parser).toConstantValue(new TypescriptParser()); diff --git a/src/utilities/logger.ts b/src/utilities/logger.ts index d05d8fc..795032e 100644 --- a/src/utilities/logger.ts +++ b/src/utilities/logger.ts @@ -60,7 +60,7 @@ export interface Logger { info: (message: string, ...data: any[]) => void; debug: (message: string, ...data: any[]) => void; profile: (name: string) => void; - startTimer(): { done: (info: { message: string }) => void; }; + startTimer(): { done: (info: { message: string, [key: string]: any }) => void; }; } const loggerTransports = [ diff --git a/test/_workspace/main.ts b/test/_workspace/main.ts deleted file mode 100644 index 19995c5..0000000 --- a/test/_workspace/main.ts +++ /dev/null @@ -1,9 +0,0 @@ -import ImportOrganizer from './import-organizer'; -import ImportManager from './import-organizer/ImportManager'; -import iocSymbols, { ImportManagerProvider } from './ioc-symbols/index'; -import TypescriptHero from './typescript-hero'; -import winstonLogger, { Logger } from './utilities/Logger'; - -function foo() { - console.log(winstonLogger, Logger, iocSymbols); -} diff --git a/test/demo.spec.ts b/test/demo.spec.ts deleted file mode 100644 index 5bc5c85..0000000 --- a/test/demo.spec.ts +++ /dev/null @@ -1,5 +0,0 @@ -describe('Demo test', () => { - it('should be tested', () => { - expect(true).toBe(true); - }); -}); diff --git a/test/etc/workspace_1/main.ts b/test/etc/workspace_1/main.ts new file mode 100644 index 0000000..b836f09 --- /dev/null +++ b/test/etc/workspace_1/main.ts @@ -0,0 +1,9 @@ +import iocSymbols from './ioc-symbols'; +import { Foo } from './server/indices/foobar'; +import winstonLogger, { Logger } from './utilities/Logger'; + +function foo() { + console.log(winstonLogger, Logger, iocSymbols); +} + +Foo diff --git a/test/etc/workspace_1/server/indices/foobar.ts b/test/etc/workspace_1/server/indices/foobar.ts new file mode 100644 index 0000000..eaaf9cd --- /dev/null +++ b/test/etc/workspace_1/server/indices/foobar.ts @@ -0,0 +1 @@ +export class Foo { } diff --git a/test/single-workspace/demo.spec.ts b/test/single-workspace/demo.spec.ts new file mode 100644 index 0000000..2d2c427 --- /dev/null +++ b/test/single-workspace/demo.spec.ts @@ -0,0 +1,9 @@ +import * as chai from 'chai'; + +const expect = chai.expect; + +describe('Demo test', () => { + it('should be tested', () => { + expect(true).to.equal(true); + }); +}); diff --git a/test/single-workspace/index.ts b/test/single-workspace/index.ts new file mode 100644 index 0000000..1b31247 --- /dev/null +++ b/test/single-workspace/index.ts @@ -0,0 +1,40 @@ +// tslint:disable +// +// PLEASE DO NOT MODIFY / DELETE UNLESS YOU KNOW WHAT YOU ARE DOING +// +// This file is providing the test runner to use when running extension tests. +// By default the test runner in use is Mocha based. +// +// You can provide your own test runner if you want to override it by exporting +// a function run(testRoot: string, clb: (error:Error) => void) that the extension +// host can call to run the tests. The test runner is expected to use console.log +// to report the results back to the caller. When the tests are finished, return +// a possible error to the callback or null if none. +import { ExtensionContext, Memento } from 'vscode'; + +import ioc from '../../src/ioc'; +import iocSymbols from '../../src/ioc-symbols'; + +class ContextMock implements ExtensionContext { + subscriptions: { dispose(): any }[] = []; + workspaceState: Memento; + globalState: Memento; + extensionPath: string = ''; + storagePath: string = ''; + asAbsolutePath(): string { + return ''; + } +} + +ioc.bind(iocSymbols.extensionContext).toConstantValue(new ContextMock()); + +const testRunner = require('vscode/lib/testrunner'); + +// You can directly control Mocha options by uncommenting the following lines +// See https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically#set-options for more info +testRunner.configure({ + ui: 'bdd', + useColors: true +}); + +module.exports = testRunner; diff --git a/tsconfig.json b/tsconfig.json index 51d382e..d7d2d63 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,16 @@ { - "extends": "./config/tsconfig.base.json", - "compilerOptions": { - "sourceMap": true, - "watch": true - } + "extends": "./config/tsconfig.base.json", + "compilerOptions": { + "sourceMap": true, + "watch": true + }, + "include": [ + "./src/**/*", + "./test/**/*" + ], + "exclude": [ + "./src/_old", + "./test/_old", + "./test/etc" + ] } diff --git a/yarn.lock b/yarn.lock index 617d773..1ff5c88 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,14 +2,6 @@ # yarn lockfile v1 -"@babel/code-frame@^7.0.0-beta.35": - version "7.0.0-beta.38" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.38.tgz#c0af5930617e55e050336838e3a3670983b0b2b2" - dependencies: - chalk "^2.0.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - "@semantic-release/commit-analyzer@^5.0.0": version "5.0.0" resolved "https://registry.yarnpkg.com/@semantic-release/commit-analyzer/-/commit-analyzer-5.0.0.tgz#767a2055b5cd0a67421b1d504f3ca7db97055c42" @@ -76,9 +68,13 @@ tslint-config-airbnb "~5.4.2" tslint-react "^3.2.0" -"@types/jest@^22.0.1": - version "22.0.1" - resolved "https://registry.yarnpkg.com/@types/jest/-/jest-22.0.1.tgz#6370a6d60cce3845e4cd5d00bf65f654264685bc" +"@types/chai@*", "@types/chai@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.1.1.tgz#15f1257fab17b7acb9c413f9f88d3d87f834d11e" + +"@types/mocha@^2.2.46": + version "2.2.46" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.46.tgz#b04713f7759d1cf752effdaae7b3969e285ebc16" "@types/node@*", "@types/node@^9.3.0": version "9.3.0" @@ -90,6 +86,17 @@ dependencies: reflect-metadata "*" +"@types/sinon-chai@^2.7.29": + version "2.7.29" + resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-2.7.29.tgz#4db01497e2dd1908b2bd30d1782f456353f5f723" + dependencies: + "@types/chai" "*" + "@types/sinon" "*" + +"@types/sinon@*", "@types/sinon@^4.1.3": + version "4.1.3" + resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-4.1.3.tgz#2ee25e0e302f31e78a945650a60029e08878eaf8" + JSONStream@^1.0.4: version "1.3.2" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.2.tgz#c102371b6ec3a7cf3b847ca00c20bb0fce4c6dea" @@ -97,20 +104,6 @@ JSONStream@^1.0.4: jsonparse "^1.2.0" through ">=2.2.7 <3" -abab@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/abab/-/abab-1.0.4.tgz#5faad9c2c07f60dd76770f71cf025b62a63cfd4e" - -abbrev@1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" - -acorn-globals@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/acorn-globals/-/acorn-globals-4.1.0.tgz#ab716025dbe17c54d3ef81d32ece2b2d99fe2538" - dependencies: - acorn "^5.0.0" - acorn-jsx@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" @@ -121,7 +114,7 @@ acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^5.0.0, acorn@^5.1.2, acorn@^5.2.1: +acorn@^5.2.1: version "5.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.3.0.tgz#7446d39459c54fb49a80e6ee6478149b940ec822" @@ -135,13 +128,6 @@ ajv-keywords@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" -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" - ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" @@ -203,7 +189,7 @@ ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" -ansi-styles@^3.1.0, ansi-styles@^3.2.0: +ansi-styles@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.0.tgz#c159b8d5be0f9e5a6f346dab94f16ce022161b88" dependencies: @@ -217,19 +203,6 @@ ansicolors@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" -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" - -append-transform@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" - dependencies: - default-require-extensions "^1.0.0" - aproba@^1.0.3: version "1.2.0" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a" @@ -276,14 +249,6 @@ array-differ@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" -array-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-equal/-/array-equal-1.0.0.tgz#8c2a5ef2472fd9ea742b04c77a75093ba2757c93" - -array-filter@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" - array-find-index@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" @@ -292,14 +257,6 @@ array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" -array-map@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" - -array-reduce@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" - array-slice@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-0.2.3.tgz#dd3cfb80ed7973a75117cdac69b0b99ec86186f5" @@ -334,24 +291,14 @@ assert-plus@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" +assertion-error@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" async@^1.0.0, async@^1.4.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@^2.1.4: - version "2.6.0" - resolved "https://registry.yarnpkg.com/async/-/async-2.6.0.tgz#61a29abb6fcc026fea77e56d1c6ec53a795951f4" - dependencies: - lodash "^4.14.0" - asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -368,7 +315,7 @@ aws4@^1.2.1, aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: +babel-code-frame@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" dependencies: @@ -376,158 +323,6 @@ babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: esutils "^2.0.2" js-tokens "^3.0.2" -babel-core@^6.0.0, babel-core@^6.24.1, babel-core@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.0.tgz#af32f78b31a6fcef119c87b0fd8d9753f03a0bb8" - dependencies: - babel-code-frame "^6.26.0" - babel-generator "^6.26.0" - babel-helpers "^6.24.1" - babel-messages "^6.23.0" - babel-register "^6.26.0" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - convert-source-map "^1.5.0" - debug "^2.6.8" - json5 "^0.5.1" - lodash "^4.17.4" - minimatch "^3.0.4" - path-is-absolute "^1.0.1" - private "^0.1.7" - slash "^1.0.0" - source-map "^0.5.6" - -babel-generator@^6.18.0, babel-generator@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.0.tgz#ac1ae20070b79f6e3ca1d3269613053774f20dc5" - dependencies: - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.17.4" - source-map "^0.5.6" - trim-right "^1.0.1" - -babel-helpers@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.24.1.tgz#3471de9caec388e5c850e597e58a26ddf37602b2" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.24.1" - -babel-jest@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.1.0.tgz#7fae6f655fffe77e818a8c2868c754a42463fdfd" - dependencies: - babel-plugin-istanbul "^4.1.5" - babel-preset-jest "^22.1.0" - -babel-messages@^6.23.0: - version "6.23.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e" - dependencies: - babel-runtime "^6.22.0" - -babel-plugin-istanbul@^4.1.4, babel-plugin-istanbul@^4.1.5: - version "4.1.5" - resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.5.tgz#6760cdd977f411d3e175bb064f2bc327d99b2b6e" - dependencies: - find-up "^2.1.0" - istanbul-lib-instrument "^1.7.5" - test-exclude "^4.1.1" - -babel-plugin-jest-hoist@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.1.0.tgz#c1281dd7887d77a1711dc760468c3b8285dde9ee" - -babel-plugin-syntax-object-rest-spread@^6.13.0: - version "6.13.0" - resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" - -babel-plugin-transform-es2015-modules-commonjs@^6.24.1: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz#0d8394029b7dc6abe1a97ef181e00758dd2e5d8a" - dependencies: - babel-plugin-transform-strict-mode "^6.24.1" - babel-runtime "^6.26.0" - babel-template "^6.26.0" - babel-types "^6.26.0" - -babel-plugin-transform-strict-mode@^6.24.1: - version "6.24.1" - resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" - dependencies: - babel-runtime "^6.22.0" - babel-types "^6.24.1" - -babel-preset-jest@^22.0.1, babel-preset-jest@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.1.0.tgz#ff4e704102f9642765e2254226050561d8942ec9" - dependencies: - babel-plugin-jest-hoist "^22.1.0" - babel-plugin-syntax-object-rest-spread "^6.13.0" - -babel-register@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" - dependencies: - babel-core "^6.26.0" - babel-runtime "^6.26.0" - core-js "^2.5.0" - home-or-tmp "^2.0.0" - lodash "^4.17.4" - mkdirp "^0.5.1" - source-map-support "^0.4.15" - -babel-runtime@^6.22.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - -babel-template@^6.16.0, babel-template@^6.24.1, babel-template@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" - dependencies: - babel-runtime "^6.26.0" - babel-traverse "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - lodash "^4.17.4" - -babel-traverse@^6.18.0, babel-traverse@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" - dependencies: - babel-code-frame "^6.26.0" - babel-messages "^6.23.0" - babel-runtime "^6.26.0" - babel-types "^6.26.0" - babylon "^6.18.0" - debug "^2.6.8" - globals "^9.18.0" - invariant "^2.2.2" - lodash "^4.17.4" - -babel-types@^6.18.0, babel-types@^6.24.1, babel-types@^6.26.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" - dependencies: - babel-runtime "^6.26.0" - esutils "^2.0.2" - lodash "^4.17.4" - to-fast-properties "^1.0.3" - -babylon@^6.18.0: - version "6.18.0" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" - balanced-match@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" @@ -542,10 +337,6 @@ beeper@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" -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" @@ -601,26 +392,10 @@ braces@^1.8.2: preserve "^0.2.0" repeat-element "^1.1.2" -browser-process-hrtime@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" - -browser-resolve@^1.11.2: - version "1.11.2" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" - dependencies: - resolve "1.1.7" - browser-stdout@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" -bser@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" - dependencies: - node-int64 "^0.4.0" - buffer-crc32@~0.2.3: version "0.2.13" resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" @@ -643,10 +418,6 @@ callsites@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" -callsites@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz#06eb84f00eea413da86affefacbffb36093b3c50" - camelcase-keys@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" @@ -662,7 +433,7 @@ camelcase@^2.0.0: version "2.1.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" -camelcase@^4.0.0, camelcase@^4.1.0: +camelcase@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" @@ -692,6 +463,17 @@ center-align@^0.1.1: align-text "^0.1.3" lazy-cache "^1.0.3" +chai@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chai/-/chai-4.1.2.tgz#0f64584ba642f0f2ace2806279f4f06ca23ad73c" + dependencies: + assertion-error "^1.0.1" + check-error "^1.0.1" + deep-eql "^3.0.0" + get-func-name "^2.0.0" + pathval "^1.0.0" + type-detect "^4.0.0" + chalk@^1.0.0, chalk@^1.1.1, chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -714,6 +496,10 @@ chardet@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" +check-error@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" + cheerio@^1.0.0-rc.1: version "1.0.0-rc.2" resolved "https://registry.yarnpkg.com/cheerio/-/cheerio-1.0.0-rc.2.tgz#4b9f53a81b27e4d5dac31c0ffd0cfa03cc6830db" @@ -725,25 +511,6 @@ cheerio@^1.0.0-rc.1: lodash "^4.15.0" parse5 "^3.0.1" -chokidar@^1.6.0: - 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" - -ci-info@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-1.1.2.tgz#03561259db48d0474c8bdc90f5b47b068b6bbfb4" - circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" @@ -776,14 +543,6 @@ cliui@^2.1.0: right-align "^0.1.1" wordwrap "0.0.2" -cliui@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc" - dependencies: - string-width "^2.1.1" - strip-ansi "^4.0.0" - wrap-ansi "^2.0.0" - clone-buffer@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" @@ -933,10 +692,6 @@ contains-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/contains-path/-/contains-path-0.1.0.tgz#fe8cf184ff6670b6baef01a9d4861a5cbec4120a" -content-type-parser@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/content-type-parser/-/content-type-parser-1.0.2.tgz#caabe80623e63638b2502fd4c7f12ff4ce2352e7" - conventional-changelog-angular@^1.4.0: version "1.6.0" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-1.6.0.tgz#0a26a071f2c9fcfcf2b86ba0cfbf6e6301b75bfa" @@ -978,14 +733,10 @@ conventional-commits-parser@^2.0.0: through2 "^2.0.0" trim-off-newlines "^1.0.0" -convert-source-map@^1.1.1, convert-source-map@^1.4.0, convert-source-map@^1.5.0: +convert-source-map@^1.1.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" -core-js@^2.4.0, core-js@^2.5.0: - version "2.5.3" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" - 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" @@ -1009,35 +760,12 @@ coveralls@^2.13.3: minimist "1.2.0" request "2.79.0" -cpx@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/cpx/-/cpx-1.5.0.tgz#185be018511d87270dedccc293171e37655ab88f" - dependencies: - babel-runtime "^6.9.2" - chokidar "^1.6.0" - duplexer "^0.1.1" - glob "^7.0.5" - glob2base "^0.0.12" - minimatch "^3.0.2" - mkdirp "^0.5.1" - resolve "^1.1.7" - safe-buffer "^5.0.1" - shell-quote "^1.6.1" - subarg "^1.0.0" - create-error-class@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" dependencies: capture-stack-trace "^1.0.0" -cross-env@^5.1.3: - version "5.1.3" - resolved "https://registry.yarnpkg.com/cross-env/-/cross-env-5.1.3.tgz#f8ae18faac87692b0a8b4d2f7000d4ec3a85dfd7" - dependencies: - cross-spawn "^5.1.0" - is-windows "^1.0.0" - cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" @@ -1075,16 +803,6 @@ css-what@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" -cssom@0.3.x, "cssom@>= 0.3.2 < 0.4.0": - version "0.3.2" - resolved "https://registry.yarnpkg.com/cssom/-/cssom-0.3.2.tgz#b8036170c79f07a90ff2f16e22284027a243848b" - -"cssstyle@>= 0.2.37 < 0.3.0": - version "0.2.37" - resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-0.2.37.tgz#541097234cb2513c83ceed3acddc27ff27987d54" - dependencies: - cssom "0.3.x" - currently-unhandled@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" @@ -1114,13 +832,13 @@ debug@3.1.0, debug@^3.1.0: dependencies: ms "2.0.0" -debug@^2.2.0, debug@^2.6.8, debug@^2.6.9: +debug@^2.6.8, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: ms "2.0.0" -decamelize@^1.0.0, decamelize@^1.1.1, decamelize@^1.1.2: +decamelize@^1.0.0, decamelize@^1.1.2: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -1134,6 +852,12 @@ deep-assign@^1.0.0: dependencies: is-obj "^1.0.0" +deep-eql@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-3.0.1.tgz#dfc9404400ad1c8fe023e7da1df1c147c4b444df" + dependencies: + type-detect "^4.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" @@ -1142,19 +866,6 @@ deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" -default-require-extensions@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8" - dependencies: - strip-bom "^2.0.0" - -define-properties@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.2.tgz#83a73f2fea569898fb737193c8f873caf6d45c94" - dependencies: - foreach "^2.0.5" - object-keys "^1.0.8" - del-cli@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/del-cli/-/del-cli-1.1.0.tgz#27557d69a0b7df99dcbaa1e34a09e6ac6591d2c4" @@ -1198,20 +909,6 @@ denodeify@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/denodeify/-/denodeify-1.2.1.tgz#3a36287f5034e699e7577901052c2e6c94251631" -detect-indent@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208" - dependencies: - repeating "^2.0.0" - -detect-libc@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" - -detect-newline@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" - diagnostics@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/diagnostics/-/diagnostics-1.1.0.tgz#e1090900b49523e8527be20f081275205f2ae36a" @@ -1224,7 +921,7 @@ diff@3.3.1: version "3.3.1" resolved "https://registry.yarnpkg.com/diff/-/diff-3.3.1.tgz#aa8567a6eed03c531fc89d3f711cd0e5259dec75" -diff@^3.2.0: +diff@^3.1.0, diff@^3.2.0: version "3.4.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.4.0.tgz#b1d85507daf3964828de54b37d0d73ba67dda56c" @@ -1270,10 +967,6 @@ domelementtype@~1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.1.3.tgz#bd28773e2642881aec51544924299c5cd822185b" -domexception@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.0.tgz#81fe5df81b3f057052cde3a9fa9bf536a85b9ab0" - domhandler@^2.3.0: version "2.4.1" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.1.tgz#892e47000a99be55bbf3774ffea0561d8879c259" @@ -1326,7 +1019,7 @@ duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" -duplexer@^0.1.1, duplexer@~0.1.1: +duplexer@~0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" @@ -1384,24 +1077,6 @@ error-ex@^1.2.0, error-ex@^1.3.1: dependencies: is-arrayish "^0.2.1" -es-abstract@^1.5.1: - version "1.10.0" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" - dependencies: - es-to-primitive "^1.1.1" - function-bind "^1.1.1" - has "^1.0.1" - is-callable "^1.1.3" - is-regex "^1.0.4" - -es-to-primitive@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" - dependencies: - is-callable "^1.1.1" - is-date-object "^1.0.1" - is-symbol "^1.0.1" - es6-promise@^4.0.3: version "4.2.2" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.2.tgz#f722d7769af88bd33bc13ec6605e1f92966b82d9" @@ -1416,17 +1091,6 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1 version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" -escodegen@^1.9.0: - version "1.9.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.9.0.tgz#9811a2f265dc1cd3894420ee3717064b632b8852" - dependencies: - esprima "^3.1.3" - estraverse "^4.2.0" - esutils "^2.0.2" - optionator "^0.8.1" - optionalDependencies: - source-map "~0.5.6" - eslint-config-standard@^10.2.1: version "10.2.1" resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz#c061e4d066f379dc17cd562c64e819b4dd454591" @@ -1541,10 +1205,6 @@ esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" -esprima@^3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" - esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" @@ -1566,7 +1226,7 @@ esrecurse@^4.1.0: estraverse "^4.1.0" object-assign "^4.0.1" -estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" @@ -1590,12 +1250,6 @@ event-stream@^3.3.1, event-stream@~3.3.4: stream-combiner "~0.0.4" through "~2.3.1" -exec-sh@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.2.1.tgz#163b98a6e89e6b65b47c2a28d215bc1f63989c38" - dependencies: - merge "^1.1.3" - execa@^0.7.0: version "0.7.0" resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" @@ -1620,10 +1274,6 @@ execa@^0.9.0: signal-exit "^3.0.0" strip-eof "^1.0.0" -exit@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" - expand-brackets@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" @@ -1636,17 +1286,6 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" -expect@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/expect/-/expect-22.1.0.tgz#f8f9b019ab275d859cbefed531fbaefe8972431d" - dependencies: - ansi-styles "^3.2.0" - jest-diff "^22.1.0" - jest-get-type "^22.1.0" - jest-matcher-utils "^22.1.0" - jest-message-util "^22.1.0" - jest-regex-util "^22.1.0" - extend-shallow@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-1.1.4.tgz#19d6bf94dfc09d76ba711f39b872d21ff4dd9071" @@ -1705,12 +1344,6 @@ fast-levenshtein@~2.0.4: version "2.0.6" resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" -fb-watchman@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" - dependencies: - bser "^2.0.0" - fd-slicer@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" @@ -1738,19 +1371,6 @@ filename-regex@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" -fileset@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0" - dependencies: - glob "^7.0.3" - minimatch "^3.0.3" - -filewalker@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/filewalker/-/filewalker-0.1.3.tgz#d63bf9d813ba35344b8182747824f6ff754bf4c5" - dependencies: - fqueue "0.0.x" - fill-range@^2.1.0: version "2.2.3" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" @@ -1761,10 +1381,6 @@ fill-range@^2.1.0: repeat-element "^1.1.2" repeat-string "^1.5.2" -find-index@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/find-index/-/find-index-0.1.1.tgz#675d358b2ca3892d795a1ab47232f8b6e2e0dde4" - find-up@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" @@ -1772,7 +1388,7 @@ find-up@^1.0.0: path-exists "^2.0.0" pinkie-promise "^2.0.0" -find-up@^2.0.0, find-up@^2.1.0: +find-up@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" dependencies: @@ -1801,10 +1417,6 @@ for-own@^0.1.4: dependencies: for-in "^1.0.1" -foreach@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/foreach/-/foreach-2.0.5.tgz#0bee005018aeb260d0a3af3ae658dd0136ec1b99" - forever-agent@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" @@ -1825,9 +1437,11 @@ form-data@~2.3.1: combined-stream "^1.0.5" mime-types "^2.1.12" -fqueue@0.0.x: - version "0.0.0" - resolved "https://registry.yarnpkg.com/fqueue/-/fqueue-0.0.0.tgz#533205a4f9ad21bbaa38fc61cef3a930c2f54836" +formatio@1.2.0, formatio@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" + dependencies: + samsam "1.x" from2@^2.1.1: version "2.3.0" @@ -1840,14 +1454,6 @@ from@~0: version "0.1.7" resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" -fs-extra@4.0.3: - version "4.0.3" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz#0d852122e5bc5beb453fb028e9c0c9bf36340c94" - dependencies: - graceful-fs "^4.1.2" - jsonfile "^4.0.0" - universalify "^0.1.0" - fs-extra@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" @@ -1860,22 +1466,7 @@ fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" -fsevents@^1.0.0, fsevents@^1.1.1: - 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: +fstream@^1.0.2: version "1.0.11" resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" dependencies: @@ -1884,7 +1475,7 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: mkdirp ">=0.5 0" rimraf "2" -function-bind@^1.0.2, function-bind@^1.1.1: +function-bind@^1.0.2: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -1915,9 +1506,9 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" -get-caller-file@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" +get-func-name@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" get-stdin@^4.0.1: version "4.0.1" @@ -2002,12 +1593,6 @@ glob-stream@^5.3.2: to-absolute-glob "^0.1.1" unique-stream "^2.0.2" -glob2base@^0.0.12: - version "0.0.12" - resolved "https://registry.yarnpkg.com/glob2base/-/glob2base-0.0.12.tgz#9d419b3e28f12e83a362164a277055922c9c0d56" - dependencies: - find-index "^0.1.1" - glob@7.1.2, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" @@ -2039,10 +1624,6 @@ globals@^11.0.1: version "11.1.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.1.0.tgz#632644457f5f0e3ae711807183700ebf2e4633e4" -globals@^9.18.0: - version "9.18.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" - globby@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" @@ -2105,10 +1686,6 @@ growl@1.10.3: version "1.10.3" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.3.tgz#1926ba90cf3edfe2adb4927f5880bc22c66c790f" -growly@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" - gulp-chmod@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/gulp-chmod/-/gulp-chmod-2.0.0.tgz#00c390b928a0799b251accf631aa09e01cc6299c" @@ -2212,7 +1789,7 @@ gulplog@^1.0.0: dependencies: glogg "^1.0.0" -handlebars@^4.0.2, handlebars@^4.0.3: +handlebars@^4.0.2: version "4.0.11" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.11.tgz#630a35dfe0294bc281edae6ffc5d329fc7982dcc" dependencies: @@ -2222,10 +1799,6 @@ handlebars@^4.0.2, handlebars@^4.0.3: optionalDependencies: uglify-js "^2.6" -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -2239,13 +1812,6 @@ har-validator@~2.0.6: is-my-json-valid "^2.12.4" pinkie-promise "^2.0.0" -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" - har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" @@ -2259,10 +1825,6 @@ has-ansi@^2.0.0: dependencies: ansi-regex "^2.0.0" -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - has-flag@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-2.0.0.tgz#e8207af1cc7b30d446cc70b734b5e8be18f88d51" @@ -2283,7 +1845,7 @@ has@^1.0.1: dependencies: function-bind "^1.0.2" -hawk@3.1.3, 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: @@ -2313,23 +1875,10 @@ hoek@4.x.x: version "4.2.0" resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" -home-or-tmp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.1" - hosted-git-info@^2.1.4, hosted-git-info@^2.4.2: version "2.5.0" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" -html-encoding-sniffer@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" - dependencies: - whatwg-encoding "^1.0.1" - htmlparser2@^3.9.1: version "3.9.2" resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.9.2.tgz#1bdf87acca0f3f9e53fa4fcceb0f4b4cbb00b338" @@ -2364,7 +1913,7 @@ https-proxy-agent@^2.1.0: agent-base "^4.1.0" debug "^3.1.0" -iconv-lite@0.4.19, iconv-lite@^0.4.17, iconv-lite@~0.4.13: +iconv-lite@^0.4.17, iconv-lite@~0.4.13: version "0.4.19" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.19.tgz#f7468f60135f5e5dad3399c0a81be9a1603a082b" @@ -2382,13 +1931,6 @@ import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" -import-local@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/import-local/-/import-local-1.0.0.tgz#5e4ffdc03f4fe6c009c6729beb29631c2f8227bc" - dependencies: - pkg-dir "^2.0.0" - resolve-cwd "^2.0.0" - imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -2440,34 +1982,14 @@ into-stream@^3.1.0: from2 "^2.1.1" p-is-promise "^1.1.0" -invariant@^2.2.2: - version "2.2.2" - resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" - dependencies: - loose-envify "^1.0.0" - -inversify-inject-decorators@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/inversify-inject-decorators/-/inversify-inject-decorators-3.1.0.tgz#d9941080bad77cec8a65ee29d905e4d5d73e1e95" - inversify@^4.9.0: version "4.9.0" resolved "https://registry.yarnpkg.com/inversify/-/inversify-4.9.0.tgz#caa01f5856cfa0499aaaed9b1a635ef0c4a9f4d3" -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" -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" - dependencies: - binary-extensions "^1.0.0" - is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" @@ -2478,20 +2000,6 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" -is-callable@^1.1.1, is-callable@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" - -is-ci@^1.0.10: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" - dependencies: - ci-info "^1.0.0" - -is-date-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" - is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" @@ -2534,10 +2042,6 @@ is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" -is-generator-fn@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a" - 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" @@ -2626,12 +2130,6 @@ is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" -is-regex@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" - dependencies: - has "^1.0.1" - is-resolvable@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.1.tgz#acca1cd36dbe44b974b924321555a70ba03b1cf4" @@ -2654,10 +2152,6 @@ is-subset@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" -is-symbol@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" - is-text-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e" @@ -2676,10 +2170,6 @@ is-valid-glob@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" -is-windows@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.1.tgz#310db70f742d259a16a369202b51af84233310d9" - is@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/is/-/is-3.2.1.tgz#d0ac2ad55eb7b0bec926a5266f6c662aaa83dca5" @@ -2706,324 +2196,11 @@ isstream@0.1.x, isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" -istanbul-api@^1.1.14: - version "1.2.1" - resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.2.1.tgz#0c60a0515eb11c7d65c6b50bba2c6e999acd8620" - dependencies: - async "^2.1.4" - fileset "^2.0.2" - istanbul-lib-coverage "^1.1.1" - istanbul-lib-hook "^1.1.0" - istanbul-lib-instrument "^1.9.1" - istanbul-lib-report "^1.1.2" - istanbul-lib-source-maps "^1.2.2" - istanbul-reports "^1.1.3" - js-yaml "^3.7.0" - mkdirp "^0.5.1" - once "^1.4.0" - -istanbul-lib-coverage@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da" - -istanbul-lib-hook@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.1.0.tgz#8538d970372cb3716d53e55523dd54b557a8d89b" - dependencies: - append-transform "^0.4.0" - -istanbul-lib-instrument@^1.7.5, istanbul-lib-instrument@^1.8.0, istanbul-lib-instrument@^1.9.1: - version "1.9.1" - resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.9.1.tgz#250b30b3531e5d3251299fdd64b0b2c9db6b558e" - dependencies: - babel-generator "^6.18.0" - babel-template "^6.16.0" - babel-traverse "^6.18.0" - babel-types "^6.18.0" - babylon "^6.18.0" - istanbul-lib-coverage "^1.1.1" - semver "^5.3.0" - -istanbul-lib-report@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.2.tgz#922be27c13b9511b979bd1587359f69798c1d425" - dependencies: - istanbul-lib-coverage "^1.1.1" - mkdirp "^0.5.1" - path-parse "^1.0.5" - supports-color "^3.1.2" - -istanbul-lib-source-maps@^1.2.1, istanbul-lib-source-maps@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.2.tgz#750578602435f28a0c04ee6d7d9e0f2960e62c1c" - dependencies: - debug "^3.1.0" - istanbul-lib-coverage "^1.1.1" - mkdirp "^0.5.1" - rimraf "^2.6.1" - source-map "^0.5.3" - -istanbul-reports@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.3.tgz#3b9e1e8defb6d18b1d425da8e8b32c5a163f2d10" - dependencies: - handlebars "^4.0.3" - java-properties@^0.2.9: version "0.2.9" resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-0.2.9.tgz#d3de73e73c304f844c9e2a2be0ff24f6f93fda44" -jest-changed-files@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.1.0.tgz#586a6164b87255dbd541a8bab880d98f14c99b7d" - dependencies: - throat "^4.0.0" - -jest-cli@^22.1.2: - version "22.1.2" - resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.1.2.tgz#89497932d7befb8a6952f2712473695c4bbef43f" - dependencies: - ansi-escapes "^3.0.0" - chalk "^2.0.1" - exit "^0.1.2" - glob "^7.1.2" - graceful-fs "^4.1.11" - import-local "^1.0.0" - is-ci "^1.0.10" - istanbul-api "^1.1.14" - istanbul-lib-coverage "^1.1.1" - istanbul-lib-instrument "^1.8.0" - istanbul-lib-source-maps "^1.2.1" - jest-changed-files "^22.1.0" - jest-config "^22.1.2" - jest-environment-jsdom "^22.1.2" - jest-get-type "^22.1.0" - jest-haste-map "^22.1.0" - jest-message-util "^22.1.0" - jest-regex-util "^22.1.0" - jest-resolve-dependencies "^22.1.0" - jest-runner "^22.1.2" - jest-runtime "^22.1.2" - jest-snapshot "^22.1.2" - jest-util "^22.1.2" - jest-worker "^22.1.0" - micromatch "^2.3.11" - node-notifier "^5.1.2" - realpath-native "^1.0.0" - rimraf "^2.5.4" - slash "^1.0.0" - string-length "^2.0.0" - strip-ansi "^4.0.0" - which "^1.2.12" - yargs "^10.0.3" - -jest-config@^22.0.1, jest-config@^22.1.2: - version "22.1.2" - resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.1.2.tgz#d3aee5c1df0997f0e2ae5c707eee04a7c87f1653" - dependencies: - chalk "^2.0.1" - glob "^7.1.1" - jest-environment-jsdom "^22.1.2" - jest-environment-node "^22.1.2" - jest-get-type "^22.1.0" - jest-jasmine2 "^22.1.2" - jest-regex-util "^22.1.0" - jest-resolve "^22.1.0" - jest-util "^22.1.2" - jest-validate "^22.1.2" - pretty-format "^22.1.0" - -jest-diff@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.1.0.tgz#0fad9d96c87b453896bf939df3dc8aac6919ac38" - dependencies: - chalk "^2.0.1" - diff "^3.2.0" - jest-get-type "^22.1.0" - pretty-format "^22.1.0" - -jest-docblock@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.1.0.tgz#3fe5986d5444cbcb149746eb4b07c57c5a464dfd" - dependencies: - detect-newline "^2.1.0" - -jest-environment-jsdom@^22.1.2: - version "22.1.2" - resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.1.2.tgz#4488c629631dd5de9059ec747fcd358735247f70" - dependencies: - jest-mock "^22.1.0" - jest-util "^22.1.2" - jsdom "^11.5.1" - -jest-environment-node@^22.1.2: - version "22.1.2" - resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.1.2.tgz#77dc32fbe08caa03ef2acb0948dce4b25a14633a" - dependencies: - jest-mock "^22.1.0" - jest-util "^22.1.2" - -jest-get-type@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.1.0.tgz#4e90af298ed6181edc85d2da500dbd2753e0d5a9" - -jest-haste-map@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.1.0.tgz#1174c6ff393f9818ebf1163710d8868b5370da2a" - dependencies: - fb-watchman "^2.0.0" - graceful-fs "^4.1.11" - jest-docblock "^22.1.0" - jest-worker "^22.1.0" - micromatch "^2.3.11" - sane "^2.0.0" - -jest-jasmine2@^22.1.2: - version "22.1.2" - resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.1.2.tgz#dee4ba04fb2cf462e4c7cfb499426e82e8fde5ac" - dependencies: - callsites "^2.0.0" - chalk "^2.0.1" - co "^4.6.0" - expect "^22.1.0" - graceful-fs "^4.1.11" - is-generator-fn "^1.0.0" - jest-diff "^22.1.0" - jest-matcher-utils "^22.1.0" - jest-message-util "^22.1.0" - jest-snapshot "^22.1.2" - source-map-support "^0.5.0" - -jest-leak-detector@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-22.1.0.tgz#08376644cee07103da069baac19adb0299b772c2" - dependencies: - pretty-format "^22.1.0" - -jest-matcher-utils@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.1.0.tgz#e164665b5d313636ac29f7f6fe9ef0a6ce04febc" - dependencies: - chalk "^2.0.1" - jest-get-type "^22.1.0" - pretty-format "^22.1.0" - -jest-message-util@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.1.0.tgz#51ba0794cb6e579bfc4e9adfac452f9f1a0293fc" - dependencies: - "@babel/code-frame" "^7.0.0-beta.35" - chalk "^2.0.1" - micromatch "^2.3.11" - slash "^1.0.0" - stack-utils "^1.0.1" - -jest-mock@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.1.0.tgz#87ec21c0599325671c9a23ad0e05c86fb5879b61" - -jest-regex-util@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.1.0.tgz#5daf2fe270074b6da63e5d85f1c9acc866768f53" - -jest-resolve-dependencies@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.1.0.tgz#340e4139fb13315cd43abc054e6c06136be51e31" - dependencies: - jest-regex-util "^22.1.0" - -jest-resolve@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.1.0.tgz#5f4307f48b93c1abdbeacc9ed80642ffcb246294" - dependencies: - browser-resolve "^1.11.2" - chalk "^2.0.1" - -jest-runner@^22.1.2: - version "22.1.2" - resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.1.2.tgz#e8565e4eb56c27219352b8486338ced9ceb462da" - dependencies: - exit "^0.1.2" - jest-config "^22.1.2" - jest-docblock "^22.1.0" - jest-haste-map "^22.1.0" - jest-jasmine2 "^22.1.2" - jest-leak-detector "^22.1.0" - jest-message-util "^22.1.0" - jest-runtime "^22.1.2" - jest-util "^22.1.2" - jest-worker "^22.1.0" - throat "^4.0.0" - -jest-runtime@^22.1.2: - version "22.1.2" - resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.1.2.tgz#42755d7cea2ffc7cdaa7f2dfa8736264a6057bf9" - dependencies: - babel-core "^6.0.0" - babel-jest "^22.1.0" - babel-plugin-istanbul "^4.1.5" - chalk "^2.0.1" - convert-source-map "^1.4.0" - exit "^0.1.2" - graceful-fs "^4.1.11" - jest-config "^22.1.2" - jest-haste-map "^22.1.0" - jest-regex-util "^22.1.0" - jest-resolve "^22.1.0" - jest-util "^22.1.2" - json-stable-stringify "^1.0.1" - micromatch "^2.3.11" - realpath-native "^1.0.0" - slash "^1.0.0" - strip-bom "3.0.0" - write-file-atomic "^2.1.0" - yargs "^10.0.3" - -jest-snapshot@^22.1.2: - version "22.1.2" - resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.1.2.tgz#b270cf6e3098f33aceeafda02b13eb0933dc6139" - dependencies: - chalk "^2.0.1" - jest-diff "^22.1.0" - jest-matcher-utils "^22.1.0" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - pretty-format "^22.1.0" - -jest-util@^22.1.2: - version "22.1.2" - resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.1.2.tgz#4bf098f651e8611d744cefa23fa026c97a6a3d5d" - dependencies: - callsites "^2.0.0" - chalk "^2.0.1" - graceful-fs "^4.1.11" - is-ci "^1.0.10" - jest-message-util "^22.1.0" - jest-validate "^22.1.2" - mkdirp "^0.5.1" - -jest-validate@^22.1.2: - version "22.1.2" - resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.1.2.tgz#c3b06bcba7bd9a850919fe336b5f2a8c3a239404" - dependencies: - chalk "^2.0.1" - jest-get-type "^22.1.0" - leven "^2.1.0" - pretty-format "^22.1.0" - -jest-worker@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.1.0.tgz#0987832fe58fbdc205357f4c19b992446368cafb" - dependencies: - merge-stream "^1.0.1" - -jest@^22.1.2: - version "22.1.2" - resolved "https://registry.yarnpkg.com/jest/-/jest-22.1.2.tgz#54dce0f4946a089a00d5fdac8291d5926e24f6ab" - dependencies: - jest-cli "^22.1.2" - -js-tokens@^3.0.0, js-tokens@^3.0.2: +js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" @@ -3045,39 +2222,6 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jsdom@^11.5.1: - version "11.5.1" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.5.1.tgz#5df753b8d0bca20142ce21f4f6c039f99a992929" - dependencies: - abab "^1.0.3" - acorn "^5.1.2" - acorn-globals "^4.0.0" - array-equal "^1.0.0" - browser-process-hrtime "^0.1.2" - content-type-parser "^1.0.1" - cssom ">= 0.3.2 < 0.4.0" - cssstyle ">= 0.2.37 < 0.3.0" - domexception "^1.0.0" - escodegen "^1.9.0" - html-encoding-sniffer "^1.0.1" - left-pad "^1.2.0" - nwmatcher "^1.4.3" - parse5 "^3.0.2" - pn "^1.0.0" - request "^2.83.0" - request-promise-native "^1.0.3" - sax "^1.2.1" - symbol-tree "^3.2.1" - tough-cookie "^2.3.3" - webidl-conversions "^4.0.2" - whatwg-encoding "^1.0.1" - whatwg-url "^6.3.0" - xml-name-validator "^2.0.1" - -jsesc@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b" - json-parse-better-errors@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz#50183cd1b2d25275de069e9e71b467ac9eab973a" @@ -3094,7 +2238,7 @@ json-stable-stringify-without-jsonify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" -json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: +json-stable-stringify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" dependencies: @@ -3104,10 +2248,6 @@ json-stringify-safe@^5.0.1, 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" -json5@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" - jsonfile@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" @@ -3135,6 +2275,10 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +just-extend@^1.1.26: + version "1.1.27" + resolved "https://registry.yarnpkg.com/just-extend/-/just-extend-1.1.27.tgz#ec6e79410ff914e472652abfa0e603c03d60e905" + kind-of@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-1.1.0.tgz#140a3d2d41a36d2efcfa9377b62c24f8495a5c44" @@ -3173,24 +2317,10 @@ lazystream@^1.0.0: dependencies: readable-stream "^2.0.5" -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" - lcov-parse@0.0.10: version "0.0.10" resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" -left-pad@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.2.0.tgz#d30a73c6b8201d8f7d8e7956ba9616087a68e0ee" - -leven@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" - levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -3289,6 +2419,10 @@ lodash.escape@^3.0.0: dependencies: lodash._root "^3.0.0" +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" @@ -3313,10 +2447,6 @@ lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" -lodash.sortby@^4.7.0: - version "4.7.0" - resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" - lodash.template@^3.0.0: version "3.6.2" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" @@ -3342,7 +2472,7 @@ lodash.toarray@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561" -lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.15.0, lodash@^4.17.4, lodash@^4.2.1, lodash@^4.3.0: +lodash@^4.0.0, lodash@^4.15.0, lodash@^4.17.4, lodash@^4.2.1, lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -3357,16 +2487,18 @@ logform@^1.2.1: colors "^1.1.2" fecha "^2.3.2" +lolex@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6" + +lolex@^2.2.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-2.3.1.tgz#3d2319894471ea0950ef64692ead2a5318cff362" + longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" -loose-envify@^1.0.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" - dependencies: - js-tokens "^3.0.0" - loud-rejection@^1.0.0: version "1.6.0" resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" @@ -3391,12 +2523,6 @@ make-dir@^1.0.0: dependencies: pify "^3.0.0" -makeerror@1.0.x: - version "1.0.11" - resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.11.tgz#e01a5c9109f2af79660e4e8b9587790184f5a96c" - dependencies: - tmpl "1.0.x" - map-obj@^1.0.0, map-obj@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" @@ -3433,12 +2559,6 @@ mdurl@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" -mem@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" - dependencies: - mimic-fn "^1.0.0" - meow@^3.3.0, meow@^3.6.0: version "3.7.0" resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" @@ -3454,17 +2574,13 @@ meow@^3.3.0, meow@^3.6.0: redent "^1.0.0" trim-newlines "^1.0.0" -merge-stream@^1.0.0, merge-stream@^1.0.1: +merge-stream@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" dependencies: readable-stream "^2.0.1" -merge@^1.1.3: - version "1.2.0" - resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" - -micromatch@^2.1.5, micromatch@^2.3.11, micromatch@^2.3.7: +micromatch@^2.3.7: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" dependencies: @@ -3514,7 +2630,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, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0: +minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" @@ -3570,10 +2686,6 @@ mute-stream@0.0.7, mute-stream@~0.0.4: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" -nan@^2.3.0: - version "2.8.0" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -3582,6 +2694,16 @@ nerf-dart@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/nerf-dart/-/nerf-dart-1.0.0.tgz#e6dab7febf5ad816ea81cf5c629c5a0ebde72c1a" +nise@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/nise/-/nise-1.2.0.tgz#079d6cadbbcb12ba30e38f1c999f36ad4d6baa53" + dependencies: + formatio "^1.2.0" + just-extend "^1.1.26" + lolex "^1.6.0" + path-to-regexp "^1.7.0" + text-encoding "^0.6.4" + node-emoji@^1.4.1: version "1.8.1" resolved "https://registry.yarnpkg.com/node-emoji/-/node-emoji-1.8.1.tgz#6eec6bfb07421e2148c75c6bba72421f8530a826" @@ -3595,48 +2717,12 @@ node-fetch@^1.7.3: encoding "^0.1.11" is-stream "^1.0.1" -node-int64@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" - -node-notifier@^5.1.2: - version "5.2.1" - resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.2.1.tgz#fa313dd08f5517db0e2502e5758d664ac69f9dea" - dependencies: - growly "^1.3.0" - semver "^5.4.1" - shellwords "^0.1.1" - which "^1.3.0" - -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" - node.extend@~1.1.2: version "1.1.6" resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.1.6.tgz#a7b882c82d6c93a4863a5504bd5de8ec86258b96" dependencies: is "^3.1.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-package-data@^2.3.2, normalize-package-data@^2.3.4, "normalize-package-data@~1.0.1 || ^2.0.0": version "2.4.0" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" @@ -3646,7 +2732,7 @@ normalize-package-data@^2.3.2, normalize-package-data@^2.3.4, "normalize-package semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.0.1: +normalize-path@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: @@ -3699,7 +2785,7 @@ npm-run-path@^2.0.0: dependencies: path-key "^2.0.0" -"npmlog@2 || ^3.1.0 || ^4.0.0", npmlog@^4.0.2: +"npmlog@2 || ^3.1.0 || ^4.0.0": version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: @@ -3718,10 +2804,6 @@ 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" -nwmatcher@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.3.tgz#64348e3b3d80f035b40ac11563d278f8b72db89c" - oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" @@ -3734,17 +2816,6 @@ object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.1" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" -object-keys@^1.0.8: - version "1.0.11" - resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d" - -object.getownpropertydescriptors@^2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz#8758c846f5b407adab0f236e0986f14b051caa16" - dependencies: - define-properties "^1.1.2" - es-abstract "^1.5.1" - object.omit@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" @@ -3775,7 +2846,7 @@ optimist@^0.6.1: minimist "~0.0.1" wordwrap "~0.0.2" -optionator@^0.8.1, optionator@^0.8.2: +optionator@^0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" dependencies: @@ -3797,15 +2868,7 @@ os-homedir@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" -os-locale@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" - dependencies: - execa "^0.7.0" - lcid "^1.0.0" - mem "^1.1.0" - -os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: +os-tmpdir@^1.0.0, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" @@ -3902,7 +2965,7 @@ parse-url@^1.3.0: is-ssh "^1.3.0" protocols "^1.4.0" -parse5@^3.0.1, parse5@^3.0.2: +parse5@^3.0.1: version "3.0.3" resolved "https://registry.yarnpkg.com/parse5/-/parse5-3.0.3.tgz#042f792ffdd36851551cf4e9e066b3874ab45b5c" dependencies: @@ -3922,7 +2985,7 @@ path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" -path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: +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" @@ -3938,6 +3001,12 @@ path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" +path-to-regexp@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" + dependencies: + isarray "0.0.1" + path-type@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" @@ -3958,6 +3027,10 @@ path-type@^3.0.0: dependencies: pify "^3.0.0" +pathval@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" + pause-stream@0.0.11: version "0.0.11" resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" @@ -3968,10 +3041,6 @@ pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -4000,12 +3069,6 @@ pkg-dir@^1.0.0: dependencies: find-up "^1.0.0" -pkg-dir@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-2.0.0.tgz#f6d5d1109e19d63edf428e0bd57e12777615334b" - dependencies: - find-up "^2.1.0" - plugin-error@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/plugin-error/-/plugin-error-0.1.2.tgz#3b9bb3335ccf00f425e07437e19276967da47ace" @@ -4020,10 +3083,6 @@ pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" -pn@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" - prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -4040,17 +3099,6 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -pretty-format@^22.1.0: - version "22.1.0" - resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.1.0.tgz#2277605b40ed4529ae4db51ff62f4be817647914" - dependencies: - ansi-regex "^3.0.0" - ansi-styles "^3.2.0" - -private@^0.1.7: - version "0.1.8" - resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" - process-nextick-args@^1.0.6, 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" @@ -4079,10 +3127,6 @@ punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -punycode@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" - q@^1.0.1, q@^1.4.1: version "1.5.1" resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7" @@ -4091,10 +3135,6 @@ qs@~6.3.0: version "6.3.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" @@ -4130,7 +3170,7 @@ randomatic@^1.1.3: is-number "^3.0.0" kind-of "^4.0.0" -rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: +rc@^1.0.1, rc@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.4.tgz#a0f606caae2a3b862bbd0ef85482c0125b315fa3" dependencies: @@ -4199,7 +3239,7 @@ read@^1.0.7: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2: +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.5, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -4220,21 +3260,6 @@ readable-stream@~1.1.9: isarray "0.0.1" string_decoder "~0.10.x" -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" - -realpath-native@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/realpath-native/-/realpath-native-1.0.0.tgz#7885721a83b43bd5327609f0ddecb2482305fdf0" - dependencies: - util.promisify "^1.0.0" - redent@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" @@ -4252,10 +3277,6 @@ reflect-metadata@*, reflect-metadata@^0.1.12: version "0.1.12" resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.12.tgz#311bf0c6b63cd782f228a81abe146a2bfa9c56f2" -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - regex-cache@^0.4.2: version "0.4.4" resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" @@ -4301,20 +3322,6 @@ replace-ext@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" -request-promise-core@1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.1.tgz#3eee00b2c5aa83239cfb04c5700da36f81cd08b6" - dependencies: - lodash "^4.13.1" - -request-promise-native@^1.0.3: - version "1.0.5" - resolved "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.5.tgz#5281770f68e0c9719e5163fd3fab482215f4fda5" - dependencies: - request-promise-core "1.1.1" - stealthy-require "^1.1.0" - tough-cookie ">=2.3.3" - request@2.79.0, request@~2.79.0: version "2.79.0" resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" @@ -4340,33 +3347,6 @@ request@2.79.0, request@~2.79.0: tunnel-agent "~0.4.1" uuid "^3.0.0" -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" - request@^2.74.0, request@^2.83.0: version "2.83.0" resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" @@ -4394,18 +3374,10 @@ request@^2.74.0, request@^2.83.0: tunnel-agent "^0.6.0" uuid "^3.1.0" -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - require-from-string@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.1.tgz#c545233e9d7da6616e9d59adfb39fc9f588676ff" -require-main-filename@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" - require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -4417,12 +3389,6 @@ requires-port@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" -resolve-cwd@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz#00a9f7387556e27038eae232caa372a6a59b665a" - dependencies: - resolve-from "^3.0.0" - resolve-from@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" @@ -4435,11 +3401,7 @@ resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - -resolve@^1.1.7, resolve@^1.3.2, resolve@^1.3.3, resolve@^1.5.0: +resolve@^1.3.2, resolve@^1.3.3, resolve@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" dependencies: @@ -4462,7 +3424,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1: +rimraf@2, rimraf@^2.2.8: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -4484,33 +3446,13 @@ rx-lite@*, rx-lite@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" -rxjs@^5.5.6: - version "5.5.6" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.5.6.tgz#e31fb96d6fd2ff1fd84bcea8ae9c02d007179c02" - dependencies: - symbol-observable "1.0.1" - safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.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" -sane@^2.0.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/sane/-/sane-2.2.0.tgz#d6d2e2fcab00e3d283c93b912b7c3a20846f1d56" - dependencies: - anymatch "^1.3.0" - exec-sh "^0.2.0" - fb-watchman "^2.0.0" - minimatch "^3.0.2" - minimist "^1.1.1" - walker "~1.0.5" - watch "~0.18.0" - optionalDependencies: - fsevents "^1.1.1" - -sax@^1.2.1: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" +samsam@1.x: + version "1.3.0" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.3.0.tgz#8d1d9350e25622da30de3e44ba692b5221ab7c50" semantic-release-vsce@^1.0.2: version "1.0.2" @@ -4570,14 +3512,10 @@ semver@5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" -set-blocking@^2.0.0, set-blocking@~2.0.0: +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" - shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -4588,23 +3526,26 @@ shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" -shell-quote@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" - dependencies: - array-filter "~0.0.0" - array-map "~0.0.0" - array-reduce "~0.0.0" - jsonify "~0.0.0" - -shellwords@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/shellwords/-/shellwords-0.1.1.tgz#d6b9181c1a48d397324c84871efbcfc73fc0654b" - signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" +sinon-chai@^2.14.0: + version "2.14.0" + resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-2.14.0.tgz#da7dd4cc83cd6a260b67cca0f7a9fdae26a1205d" + +sinon@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-4.2.0.tgz#3b7c0d2289a80d2d84c4685f2ec130b7ab9af621" + dependencies: + diff "^3.1.0" + formatio "1.2.0" + lodash.get "^4.4.2" + lolex "^2.2.0" + nise "^1.2.0" + supports-color "^5.1.0" + type-detect "^4.0.5" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -4637,12 +3578,6 @@ sort-keys@^2.0.0: dependencies: is-plain-obj "^1.0.0" -source-map-support@^0.4.15: - version "0.4.18" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" - dependencies: - source-map "^0.5.6" - source-map-support@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.1.tgz#72291517d1fd0cb9542cee6c27520884b5da1a07" @@ -4655,14 +3590,14 @@ source-map@^0.4.4: dependencies: amdefine ">=0.0.4" -source-map@^0.5.3, source-map@^0.5.6, source-map@~0.5.1, source-map@~0.5.6: - version "0.5.7" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" - source-map@^0.6.0: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" +source-map@~0.5.1: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + sparkles@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" @@ -4737,18 +3672,10 @@ stack-trace@0.0.x: version "0.0.10" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" -stack-utils@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.1.tgz#d4f33ab54e8e38778b0ca5cfd3b3afb12db68620" - stat-mode@^0.2.0: version "0.2.2" resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" -stealthy-require@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz#35b09875b4ff49f26a777e509b3090a3226bf24b" - stream-combiner2@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe" @@ -4780,13 +3707,6 @@ strict-uri-encode@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz#279b225df1d582b1f54e65addd4352e18faa0713" -string-length@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-length/-/string-length-2.0.0.tgz#d40dbb686a3ace960c1cffca562bf2c45f8363ed" - dependencies: - astral-regex "^1.0.0" - strip-ansi "^4.0.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" @@ -4835,16 +3755,16 @@ strip-bom-stream@^1.0.0: first-chunk-stream "^1.0.0" strip-bom "^2.0.0" -strip-bom@3.0.0, strip-bom@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" - strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" dependencies: is-utf8 "^0.2.0" +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + strip-eof@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" @@ -4859,12 +3779,6 @@ 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" -subarg@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/subarg/-/subarg-1.0.0.tgz#f62cf17581e996b48fc965699f54c06ae268b8d2" - dependencies: - minimist "^1.1.0" - supports-color@4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.4.0.tgz#883f7ddabc165142b2a61427f3352ded195d1a3e" @@ -4875,25 +3789,17 @@ supports-color@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" -supports-color@^3.1.2: - version "3.2.3" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" - dependencies: - has-flag "^1.0.0" - supports-color@^4.0.0: version "4.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" dependencies: has-flag "^2.0.0" -symbol-observable@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.1.tgz#8340fc4702c3122df5d22288f88283f513d3fdd4" - -symbol-tree@^3.2.1: - version "3.2.2" - resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.2.tgz#ae27db38f660a7ae2e1c3b7d1bc290819b8519e6" +supports-color@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.1.0.tgz#058a021d1b619f7ddf3980d712ea3590ce7de3d5" + dependencies: + has-flag "^2.0.0" table@^4.0.1: version "4.0.2" @@ -4906,19 +3812,6 @@ table@^4.0.1: slice-ansi "1.0.0" string-width "^2.1.1" -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" @@ -4933,15 +3826,9 @@ term-size@^1.2.0: dependencies: execa "^0.7.0" -test-exclude@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26" - dependencies: - arrify "^1.0.1" - micromatch "^2.3.11" - object-assign "^4.1.0" - read-pkg-up "^1.0.1" - require-main-filename "^1.0.1" +text-encoding@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" text-extensions@^1.0.0: version "1.7.0" @@ -4955,10 +3842,6 @@ text-table@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" -throat@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a" - through2-filter@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" @@ -5004,32 +3887,18 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmpl@1.0.x: - version "1.0.4" - resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" - to-absolute-glob@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" dependencies: extend-shallow "^2.0.1" -to-fast-properties@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" - -tough-cookie@>=2.3.3, tough-cookie@^2.3.3, tough-cookie@~2.3.0, tough-cookie@~2.3.3: +tough-cookie@~2.3.0, tough-cookie@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" dependencies: punycode "^1.4.1" -tr46@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/tr46/-/tr46-1.0.1.tgz#a8b13fd6bfd2489519674ccde55ba3693b706d09" - dependencies: - punycode "^2.1.0" - traverse@~0.6.6: version "0.6.6" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" @@ -5042,29 +3911,10 @@ trim-off-newlines@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz#9f9ba9d9efa8764c387698bcbfeb2c848f11adb3" -trim-right@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" - triple-beam@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.1.0.tgz#2ac387c8c4bd04bd26c61df891a6079f8592fe10" -ts-jest@^22.0.1: - version "22.0.1" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-22.0.1.tgz#48942936a466c2e76e259b02e2f1356f1839afc3" - dependencies: - babel-core "^6.24.1" - babel-plugin-istanbul "^4.1.4" - babel-plugin-transform-es2015-modules-commonjs "^6.24.1" - babel-preset-jest "^22.0.1" - cpx "^1.5.0" - fs-extra "4.0.3" - jest-config "^22.0.1" - pkg-dir "^2.0.0" - source-map-support "^0.5.0" - yargs "^10.0.3" - tslib@^1.0.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.8.1.tgz#6946af2d1d651a7b1863b531d6e5afa41aa44eac" @@ -5155,6 +4005,10 @@ type-check@~0.3.2: dependencies: prelude-ls "~1.1.2" +type-detect@^4.0.0, type-detect@^4.0.5: + version "4.0.7" + resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.7.tgz#862bd2cf6058ad92799ff5a5b8cf7b6cec726198" + typed-rest-client@^0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/typed-rest-client/-/typed-rest-client-0.9.0.tgz#f768cc0dc3f4e950f06e04825c36b3e7834aa1f2" @@ -5196,10 +4050,6 @@ uglify-to-browserify@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz#6e0924d6bda6b5afe349e39a6d632850a0f882b7" -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - underscore@1.8.3, underscore@^1.8.3: version "1.8.3" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022" @@ -5268,13 +4118,6 @@ util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -util.promisify@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz#440f7165a459c9a16dc145eb8e72f35687097030" - dependencies: - define-properties "^1.1.2" - object.getownpropertydescriptors "^2.0.3" - uuid@^3.0.0, uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" @@ -5429,42 +4272,7 @@ vso-node-api@^6.1.2-preview: typed-rest-client "^0.9.0" underscore "^1.8.3" -walker@~1.0.5: - version "1.0.7" - resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" - dependencies: - makeerror "1.0.x" - -watch@~0.18.0: - version "0.18.0" - resolved "https://registry.yarnpkg.com/watch/-/watch-0.18.0.tgz#28095476c6df7c90c963138990c0a5423eb4b986" - dependencies: - exec-sh "^0.2.0" - minimist "^1.2.0" - -webidl-conversions@^4.0.1, webidl-conversions@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-4.0.2.tgz#a855980b1f0b6b359ba1d5d9fb39ae941faa63ad" - -whatwg-encoding@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-1.0.3.tgz#57c235bc8657e914d24e1a397d3c82daee0a6ba3" - dependencies: - iconv-lite "0.4.19" - -whatwg-url@^6.3.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.0.tgz#08fdf2b9e872783a7a1f6216260a1d66cc722e08" - dependencies: - lodash.sortby "^4.7.0" - tr46 "^1.0.0" - webidl-conversions "^4.0.1" - -which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - -which@^1.2.12, which@^1.2.9, which@^1.3.0: +which@^1.2.9: version "1.3.0" resolved "https://registry.yarnpkg.com/which/-/which-1.3.0.tgz#ff04bdfc010ee547d780bec38e1ac1c2777d253a" dependencies: @@ -5515,18 +4323,11 @@ wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -write-file-atomic@^2.0.0, write-file-atomic@^2.1.0: +write-file-atomic@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab" dependencies: @@ -5544,45 +4345,14 @@ xdg-basedir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" -xml-name-validator@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-2.0.1.tgz#4d8b8f1eccd3419aa362061becef515e1e559635" - "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" -y18n@^3.2.1: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" -yargs-parser@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" - dependencies: - camelcase "^4.1.0" - -yargs@^10.0.3: - version "10.1.1" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.1.tgz#5fe1ea306985a099b33492001fa19a1e61efe285" - dependencies: - cliui "^4.0.0" - decamelize "^1.1.1" - find-up "^2.1.0" - get-caller-file "^1.0.1" - os-locale "^2.0.0" - require-directory "^2.1.1" - require-main-filename "^1.0.1" - set-blocking "^2.0.0" - string-width "^2.0.0" - which-module "^2.0.0" - y18n "^3.2.1" - yargs-parser "^8.1.0" - yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1"