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"