From cbfb4f99e282d9d8ca0926f4daae2e34bd988a35 Mon Sep 17 00:00:00 2001 From: Yan Pashkovsky Date: Wed, 23 Jan 2019 15:29:13 +0300 Subject: [PATCH 01/22] dataflow --- package.json | 32 ++++++++++- src/dataFlowHierarchy.ts | 117 +++++++++++++++++++++++++++++++++++++++ src/serverContext.ts | 9 ++- 3 files changed, 155 insertions(+), 3 deletions(-) create mode 100644 src/dataFlowHierarchy.ts diff --git a/package.json b/package.json index f122968..4f28c32 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,11 @@ "id": "ccls.callHierarchy", "name": "Call Hierarchy", "when": "extension.ccls.callHierarchyVisible" + }, + { + "id": "ccls.dataFlowInto", + "name": "Data Flow Hierarchy", + "when": "extension.ccls.dataFlowHierarchyVisible" } ] }, @@ -49,14 +54,19 @@ "group": "navigation@1.32" }, { - "command": "ccls.vars", + "command": "ccls.dataFlowInto", "when": "resourceLangId == cpp", "group": "navigation@1.33" }, { - "command": "ccls.base", + "command": "ccls.vars", "when": "resourceLangId == cpp", "group": "navigation@1.34" + }, + { + "command": "ccls.base", + "when": "resourceLangId == cpp", + "group": "navigation@1.35" } ], "view/title": [ @@ -69,6 +79,11 @@ "command": "ccls.closeCallHierarchy", "when": "view == ccls.callHierarchy", "group": "navigation" + }, + { + "command": "ccls.closeDataFlowHierarchy", + "when": "view == ccls.dataFlowInto", + "group": "navigation" } ], "view/item/context": [ @@ -86,6 +101,10 @@ "command": "ccls.closeCallHierarchy", "when": "false" }, + { + "command": "ccls.closeDataFlowHierarchy", + "when": "false" + }, { "command": "ccls.gotoForTreeView", "when": "false" @@ -131,6 +150,15 @@ "category": "ccls", "command": "ccls.vars" }, + { + "title": "Show Data Flow Into", + "category": "ccls", + "command": "ccls.dataFlowInto" + }, + { + "title": "Close", + "command": "ccls.closeDataFlowHierarchy" + }, { "title": "Show Cross References", "category": "ccls", diff --git a/src/dataFlowHierarchy.ts b/src/dataFlowHierarchy.ts new file mode 100644 index 0000000..4a13a4f --- /dev/null +++ b/src/dataFlowHierarchy.ts @@ -0,0 +1,117 @@ +import { + commands, + Disposable, + Event, + EventEmitter, + Position, + Range, + TextEditor, + TreeDataProvider, + TreeItem, + TreeItemCollapsibleState, + Uri, + workspace +} from "vscode"; +import { LanguageClient } from "vscode-languageclient/lib/main"; +import * as ls from "vscode-languageserver-types"; +import { Icon } from "./types"; +import { disposeAll, resourcePath, setContext } from "./utils"; + +export interface DataFlowHierarchyNode { + // These properties come directly from the language server. + id: number; + location: ls.Location; + children: DataFlowHierarchyNode[]; +} + +export class DataFlowHierarchyProvider implements TreeDataProvider, Disposable { + private readonly onDidChangeEmitter: EventEmitter = new EventEmitter(); + // tslint:disable-next-line:member-ordering + public readonly onDidChangeTreeData: Event = this.onDidChangeEmitter.event; + private root?: DataFlowHierarchyNode; + private icon: Icon; + private _dispose: Disposable[] = []; + + constructor( + readonly languageClient: LanguageClient, + ) { + this.icon = { + dark: resourcePath("base-dark.svg"), + light: resourcePath("base-light.svg") + }; + this._dispose.push(commands.registerCommand( + 'ccls.closeDataFlowHierarchy', this.closeHierarchy, this) + ); + this._dispose.push(commands.registerTextEditorCommand( + 'ccls.dataFlowInto', this.showHierarchy, this) + ); + } + + public dispose() { + return disposeAll(this._dispose); + } + + public async getTreeItem(element: DataFlowHierarchyNode): Promise { + let collapseState = TreeItemCollapsibleState.None; + if (element.children.length > 0) + collapseState = TreeItemCollapsibleState.Expanded; + + const parentFile = await workspace.openTextDocument(Uri.parse(element.location.uri)); + let label = parentFile.getText( + new Range( + new Position(element.location.range.start.line, element.location.range.start.character), + new Position(element.location.range.end.line, element.location.range.end.character) + ) + ); + + if (element.location) { + const path = Uri.parse(element.location.uri).path; + const name = path.substr(path.lastIndexOf("/") + 1); + label += ` (${name}:${element.location.range.start.line + 1})`; + } + + const ti = new TreeItem(label, collapseState); + ti.iconPath = this.icon; + ti.command = { + arguments: [element, element.children.length > 0], + command: 'ccls.hackGotoForTreeView', + title: 'Goto' + }; + ti.contextValue = 'cclsGoto'; + + return ti; + } + + public getChildren( + element?: DataFlowHierarchyNode + ): DataFlowHierarchyNode[] | Thenable { + if (!this.root) + return []; + if (!element) + return [this.root]; + return element.children; + } + + private closeHierarchy() { + setContext('extension.ccls.dataFlowHierarchyVisible', false); + this.root = undefined; + this.onDidChangeEmitter.fire(); + } + + private async showHierarchy(editor: TextEditor) { + setContext('extension.ccls.dataFlowHierarchyVisible', true); + const position = editor.selection.active; + const uri = editor.document.uri; + const callNode = await this.languageClient.sendRequest( + '$ccls/dataFlowInto', + { + position, + textDocument: { + uri: uri.toString(true), + }, + } + ); + this.root = callNode; + this.onDidChangeEmitter.fire(); + } +} diff --git a/src/serverContext.ts b/src/serverContext.ts index 901e117..bce7c6e 100644 --- a/src/serverContext.ts +++ b/src/serverContext.ts @@ -28,6 +28,7 @@ import { Converter } from "vscode-languageclient/lib/protocolConverter"; import * as ls from "vscode-languageserver-types"; import { CallHierarchyNode, CallHierarchyProvider } from "./callHierarchy"; import { CclsErrorHandler } from "./cclsErrorHandler"; +import { DataFlowHierarchyNode, DataFlowHierarchyProvider } from "./dataFlowHierarchy"; import { cclsChan } from './globalContext'; import { InactiveRegionsProvider } from "./inactiveRegions"; import { InheritanceHierarchyNode, InheritanceHierarchyProvider } from "./inheritanceHierarchy"; @@ -271,6 +272,12 @@ export class ServerContext implements Disposable { "ccls.callHierarchy", callHierarchyProvider )); + const dfProvier = new DataFlowHierarchyProvider(this.client); + this._dispose.push(dfProvier); + this._dispose.push(window.registerTreeDataProvider( + 'ccls.dataFlowInto', dfProvier + )); + // Common between tree views. this._dispose.push(commands.registerCommand( "ccls.gotoForTreeView", this.gotoForTreeView, this @@ -613,7 +620,7 @@ export class ServerContext implements Disposable { } private async hackGotoForTreeView( - node: InheritanceHierarchyNode|CallHierarchyNode, + node: InheritanceHierarchyNode|CallHierarchyNode|DataFlowHierarchyNode, hasChildren: boolean ) { if (!node.location) From 6add9c65e1702c7551c7d18eae7b4bb9b9912b4e Mon Sep 17 00:00:00 2001 From: Yan Pashkovsky Date: Wed, 23 Jan 2019 16:24:18 +0300 Subject: [PATCH 02/22] show explorer --- src/dataFlowHierarchy.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/dataFlowHierarchy.ts b/src/dataFlowHierarchy.ts index 4a13a4f..fb16c3a 100644 --- a/src/dataFlowHierarchy.ts +++ b/src/dataFlowHierarchy.ts @@ -113,5 +113,6 @@ export class DataFlowHierarchyProvider implements TreeDataProvider Date: Sun, 3 Feb 2019 10:09:02 +0800 Subject: [PATCH 03/22] 0.1.22 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0592ea4..5e75be0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ccls", - "version": "0.1.19", + "version": "0.1.22", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 80f4c4d..8c4814a 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "description": "C/C++/ObjC language server supporting cross references, hierarchies, completion and semantic highlighting", "author": "ccls-project", "license": "MIT", - "version": "0.1.20", + "version": "0.1.22", "publisher": "ccls-project", "scripts": { "vscode:prepublish": "npm run lint && npm run compile", From 4184e4c8c61755c51b355a20c697a4ceb2483e85 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Fri, 22 Feb 2019 20:47:26 +0800 Subject: [PATCH 04/22] Rename cacheDirectory to cache.directory --- package.json | 7 ++++++- src/serverContext.ts | 8 ++++---- src/types.ts | 4 +++- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 8c4814a..8df8fe9 100644 --- a/package.json +++ b/package.json @@ -292,11 +292,16 @@ "default": [], "description": "Array containing extra arguments to pass to the ccls binary" }, - "ccls.cacheDirectory": { + "ccls.cache.directory": { "type": "string", "default": ".ccls-cache", "description": "Absolute or relative (from the project root) path to the directory that the cached index will be stored in. Try to have this directory on an SSD. If empty, cached indexes will not be saved on disk.\n\n${workspaceFolder} will be replaced by the folder where .vscode/settings.json resides.\n\nCache directories are project-wide, so this should be configured in the workspace settings so multiple indexes do not clash.\n\nExample value: \"/work/ccls-cache/chrome/\"" }, + "ccls.cache.hierarchicalPath": { + "type": "boolean", + "default": false, + "description": "If false, store cache files as $directory/@a@b/c.cc.blob\n\nIf true, $directory/a/b/c.cc.blob." + }, "ccls.highlighting.enabled.types": { "type": "boolean", "default": false, diff --git a/src/serverContext.ts b/src/serverContext.ts index 56ba35d..36a62a9 100644 --- a/src/serverContext.ts +++ b/src/serverContext.ts @@ -76,8 +76,6 @@ function flatObject(obj: any, pref = ""): Map { } function getClientConfig(wsRoot: string): ClientConfig { - const kCacheDirPrefName = 'cacheDirectory'; - function hasAnySemanticHighlight() { const hlconfig = workspace.getConfiguration('ccls.highlighting.enabled'); for (const name of Object.keys(semanticTypes)) { @@ -109,7 +107,7 @@ function getClientConfig(wsRoot: string): ClientConfig { const configMapping: Array<[string, string]> = [ ['launchCommand', 'launch.command'], ['launchArgs', 'launch.args'], - ['cacheDirectory', kCacheDirPrefName], + ['cache.directory', 'cache.directory'], ['compilationDatabaseCommand', 'misc.compilationDatabaseCommand'], ['compilationDatabaseDirectory', 'misc.compilationDatabaseDirectory'], ['clang.excludeArgs', 'clang.excludeArgs'], @@ -148,7 +146,9 @@ function getClientConfig(wsRoot: string): ClientConfig { ]; const castBooleanToInteger: string[] = []; const clientConfig: ClientConfig = { - cacheDirectory: '.ccls-cache', + cache: { + directory: '.ccls-cache', + }, highlight: { enabled: hasAnySemanticHighlight(), lsRanges: true, diff --git a/src/types.ts b/src/types.ts index e04656b..33e9d8d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -7,7 +7,9 @@ export interface Icon { } export interface ClientConfig { - cacheDirectory: string; + cache: { + directory: string, + }; highlight: { enabled: boolean; lsRanges: boolean; From 7492826f8055151603a4fa55fb82b67b122c31e4 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Fri, 22 Feb 2019 20:48:13 +0800 Subject: [PATCH 05/22] 0.1.23 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 5e75be0..8a06f50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ccls", - "version": "0.1.22", + "version": "0.1.23", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 8df8fe9..5d32a85 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "description": "C/C++/ObjC language server supporting cross references, hierarchies, completion and semantic highlighting", "author": "ccls-project", "license": "MIT", - "version": "0.1.22", + "version": "0.1.23", "publisher": "ccls-project", "scripts": { "vscode:prepublish": "npm run lint && npm run compile", From 875c0c1794054fe4414c009d577537ce47302369 Mon Sep 17 00:00:00 2001 From: Riatre Foo Date: Sun, 3 Mar 2019 00:36:45 +0800 Subject: [PATCH 06/22] Add option ccls.codeLens.enabled This allows to disable CodeLens extension-wise. Some users may want to see CodeLens provided by other extensions, thus they do not want to disable CodeLens globally. --- package.json | 5 +++++ src/serverContext.ts | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 5d32a85..0f2c538 100644 --- a/package.json +++ b/package.json @@ -1018,6 +1018,11 @@ "default": null, "description": "The maximum number of global search (ie, Ctrl+P + #foo) search results to report. For small search strings on large projects there can be a massive number of results (ie, over 1,000,000) so this limit is important to avoid extremely long delays. null means use the default value provided by the ccls language server." }, + "ccls.codeLens.enabled": { + "type": "boolean", + "default": true, + "description": "Specifies whether the references CodeLens should be shown." + }, "ccls.statusUpdateInterval": { "type": "integer", "default": 2000, diff --git a/src/serverContext.ts b/src/serverContext.ts index 36a62a9..ecb5bb5 100644 --- a/src/serverContext.ts +++ b/src/serverContext.ts @@ -345,10 +345,10 @@ export class ServerContext implements Disposable { token: CancellationToken, next: ProvideCodeLensesSignature ): Promise { - const enableCodeLens = workspace.getConfiguration(undefined, null).get('editor.codeLens'); + const config = workspace.getConfiguration('ccls'); + const enableCodeLens = config.get('codeLens.enabled'); if (!enableCodeLens) return []; - const config = workspace.getConfiguration('ccls'); const enableInlineCodeLens = config.get('codeLens.renderInline', false); if (!enableInlineCodeLens) { const uri = document.uri; From c190607df998caac7f9417332939c6fe9c774c31 Mon Sep 17 00:00:00 2001 From: Riatre Foo Date: Sun, 3 Mar 2019 00:38:08 +0800 Subject: [PATCH 07/22] Add option ccls.trace.websocketEndpointUrl to log LSP traffic to WebSocket endpoint (#51) This can be used with lsp-inspector-webview (https://marketplace.visualstudio.com/items?itemName=octref.lsp-inspector-webview) for easier debugging. --- package-lock.json | 29 +++++++++++++++++++++++++++++ package.json | 9 ++++++++- src/serverContext.ts | 25 +++++++++++++++++++++++++ src/types.ts | 1 + 4 files changed, 63 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 8a06f50..f7e9758 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,12 +4,28 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/events": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", + "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==", + "dev": true + }, "@types/node": { "version": "9.6.41", "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.41.tgz", "integrity": "sha512-sPZWEbFMz6qAy9SLY7jh5cgepmsiwqUUHjvEm8lpU6kug2hmmcyuTnwhoGw/GWpI5Npue4EqvsiQQI0eWjW/ZA==", "dev": true }, + "@types/ws": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.1.tgz", + "integrity": "sha512-EzH8k1gyZ4xih/MaZTXwT2xOkPiIMSrhQ9b8wrlX88L0T02eYsddatQlwVFlEPyEqV0ChpdpNnE51QPH6NVT4Q==", + "dev": true, + "requires": { + "@types/events": "*", + "@types/node": "*" + } + }, "ajv": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", @@ -146,6 +162,11 @@ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", "dev": true }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -2335,6 +2356,14 @@ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, + "ws": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", + "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "requires": { + "async-limiter": "~1.0.0" + } + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", diff --git a/package.json b/package.json index 0f2c538..bdb7fbe 100644 --- a/package.json +++ b/package.json @@ -15,13 +15,15 @@ }, "devDependencies": { "@types/node": "^9.6.41", + "@types/ws": "^6.0.1", "typescript": "^2.9.2", "tslint": "^5.11.0", "vsce": "^1.54.0", "vscode": "^1.1.26" }, "dependencies": { - "vscode-languageclient": "^5.2.1" + "vscode-languageclient": "^5.2.1", + "ws": "^6.1.4" }, "repository": { "type": "git", @@ -1027,6 +1029,11 @@ "type": "integer", "default": 2000, "description": "Interval between updating ccls status in milliseconds. Set to 0 to disable." + }, + "ccls.trace.websocketEndpointUrl": { + "type": "string", + "default": "", + "description": "When set, logs all LSP messages to specified WebSocket endpoint." } } } diff --git a/src/serverContext.ts b/src/serverContext.ts index ecb5bb5..96c1f08 100644 --- a/src/serverContext.ts +++ b/src/serverContext.ts @@ -26,6 +26,7 @@ import { } from "vscode-languageclient"; import { Converter } from "vscode-languageclient/lib/protocolConverter"; import * as ls from "vscode-languageserver-types"; +import * as WebSocket from 'ws'; import { CclsErrorHandler } from "./cclsErrorHandler"; import { cclsChan, logChan } from './globalContext'; import { CallHierarchyProvider } from "./hierarchies/callHierarchy"; @@ -143,6 +144,7 @@ function getClientConfig(wsRoot: string): ClientConfig { ['workspaceSymbol.maxNum', 'workspaceSymbol.maxNum'], ['workspaceSymbol.caseSensitivity', 'workspaceSymbol.caseSensitivity'], ['statusUpdateInterval', 'statusUpdateInterval'], + ['traceEndpoint', 'trace.websocketEndpointUrl'], ]; const castBooleanToInteger: string[] = []; const clientConfig: ClientConfig = { @@ -156,6 +158,7 @@ function getClientConfig(wsRoot: string): ClientConfig { launchArgs: [] as string[], launchCommand: '', statusUpdateInterval: 0, + traceEndpoint: '', workspaceSymbol: { sort: false, }, @@ -478,6 +481,28 @@ export class ServerContext implements Disposable { revealOutputChannelOn: RevealOutputChannelOn.Never, }; + if (this.cliConfig.traceEndpoint) { + const socket = new WebSocket(this.cliConfig.traceEndpoint); + let log = ''; + clientOptions.outputChannel = { + name: 'websocket', + append(value: string) { + log += value; + }, + appendLine(value: string) { + log += value; + if (socket && socket.readyState === WebSocket.OPEN) { + socket.send(log); + } + log = ''; + }, + clear() {/**/}, + show() {/**/}, + hide() {/**/}, + dispose() { socket.close(); } + }; + } + // Create the language client and start the client. return new LanguageClient('ccls', 'ccls', serverOptions, clientOptions); } diff --git a/src/types.ts b/src/types.ts index 33e9d8d..65c6557 100644 --- a/src/types.ts +++ b/src/types.ts @@ -20,6 +20,7 @@ export interface ClientConfig { sort: boolean, }; statusUpdateInterval: number; + traceEndpoint: string; [key: string]: any; } From 923965020174b0c91a3e53711523dd76442016ee Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Sat, 2 Mar 2019 18:09:41 -0800 Subject: [PATCH 08/22] Add .github/ISSUE_TEMPLATE --- .github/ISSUE_TEMPLATE | 35 +++++++++++++++++++++++++++++++++++ README.md | 2 +- 2 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 .github/ISSUE_TEMPLATE diff --git a/.github/ISSUE_TEMPLATE b/.github/ISSUE_TEMPLATE new file mode 100644 index 0000000..82bc73f --- /dev/null +++ b/.github/ISSUE_TEMPLATE @@ -0,0 +1,35 @@ +Here are some things you should try before filing a bug report: + ++ This is for client side issues. For server side issues, report at [ccls](https://github.com/MaskRay/ccls) or [vscode-ccls](https://github.com/MaskRay/vscode-ccls). ++ Check https://github.com/MaskRay/ccls/wiki/Visual-Studio-Code ++ Check https://github.com/MaskRay/ccls/wiki/Debugging ++ Check [the FAQ](https://github.com/MaskRay/ccls/wiki/FAQ) to see if your issue is mentioned. + +If none of those help, remove this section and fill out the four sections in the template below. + +--- + +### Observed behavior + +Describe what happened. Any aids you can include (that you think could be relevant) are a tremendous help. + +* `compile_commands.json` or `.ccls` ([wiki/Project-Setup](https://github.com/MaskRay/ccls/wiki/Project-Setup)) +* Reduce to A minimal set of `.c` `.cc` `.h` `.hh` files that can still demonstrate the issue. +* Consider a screencast gif. + +### Expected behavior + +Describe what you expected to happen. + +### Steps to reproduce + +1. Select these example steps, +2. Delete them, +3. And replace them with precise steps to reproduce your issue. + +### System information + +* ccls version (`git describe --tags`): +* OS: +* Editor: +* vscode-ccls version (`git describe --tags`): diff --git a/README.md b/README.md index e37dafb..03f9614 100644 --- a/README.md +++ b/README.md @@ -6,5 +6,5 @@ This is the Visual Studio Code extension for [ccls](https://github.com/MaskRay/c See: -* [Getting started](https://github.com/MaskRay/ccls/wiki/Getting-started) +* [Home](https://github.com/MaskRay/ccls/wiki/Home) * [Visual Studio Code](https://github.com/MaskRay/ccls/wiki/Visual-Studio-Code) From 04c9bb889dcbfd948f0379dfdbb1f83bffc491fa Mon Sep 17 00:00:00 2001 From: Riatre Foo Date: Sun, 3 Mar 2019 20:34:09 +0800 Subject: [PATCH 09/22] Cleanup config mapping logic in getClientConfig Populate ClientConfig with all keys from VS Code WorkspaceConfiguration (except those in blacklist) instead of a preset list. With this change, it is possible to send initializationOptions to ccls even if there is no corresponding configuration declaration in package.json. So new initializationOption exposed in ccls no longer necessarily reuqires an update of vscode-ccls. Declarations in package.json are still useful as they still provide documentations and default values. Also no longer add workspaceSymbol.sort = false by default as this works poorly when there are too many symbols. --- src/serverContext.ts | 139 +++++++++++++++++++++---------------------- src/types.ts | 8 +-- 2 files changed, 70 insertions(+), 77 deletions(-) diff --git a/src/serverContext.ts b/src/serverContext.ts index 96c1f08..39db30e 100644 --- a/src/serverContext.ts +++ b/src/serverContext.ts @@ -16,6 +16,7 @@ import { Uri, window, workspace, + WorkspaceConfiguration, } from "vscode"; import { LanguageClient, @@ -104,84 +105,80 @@ function getClientConfig(wsRoot: string): ClientConfig { return value; } - // Read prefs; this map goes from `ccls/js name` => `vscode prefs name`. - const configMapping: Array<[string, string]> = [ - ['launchCommand', 'launch.command'], - ['launchArgs', 'launch.args'], - ['cache.directory', 'cache.directory'], - ['compilationDatabaseCommand', 'misc.compilationDatabaseCommand'], - ['compilationDatabaseDirectory', 'misc.compilationDatabaseDirectory'], - ['clang.excludeArgs', 'clang.excludeArgs'], - ['clang.extraArgs', 'clang.extraArgs'], - ['clang.pathMappings', 'clang.pathMappings'], - ['clang.resourceDir', 'clang.resourceDir'], - ['codeLens.localVariables', 'codeLens.localVariables'], - ['completion.caseSensitivity', 'completion.caseSensitivity'], - ['completion.detailedLabel', 'completion.detailedLabel'], - ['completion.duplicateOptional', 'completion.duplicateOptional'], - ['completion.filterAndSort', 'completion.filterAndSort'], - ['completion.include.maxPathSize', 'completion.include.maxPathSize'], - ['completion.include.suffixWhitelist', 'completion.include.suffixWhitelist'], - ['completion.include.whitelist', 'completion.include.whitelist'], - ['completion.include.blacklist', 'completion.include.blacklist'], - ['client.snippetSupport', 'completion.enableSnippetInsertion'], - ['diagnostics.blacklist', 'diagnostics.blacklist'], - ['diagnostics.whitelist', 'diagnostics.whitelist'], - ['diagnostics.onChange', 'diagnostics.onChange'], - ['diagnostics.onOpen', 'diagnostics.onOpen'], - ['diagnostics.onSave', 'diagnostics.onSave'], - ['diagnostics.spellChecking', 'diagnostics.spellChecking'], - ['highlight.blacklist', 'highlight.blacklist'], - ['highlight.whitelist', 'highlight.whitelist'], - ['largeFileSize', 'highlight.largeFileSize'], - ['index.whitelist', 'index.whitelist'], - ['index.blacklist', 'index.blacklist'], - ['index.initialWhitelist', 'index.initialWhitelist'], - ['index.initialBlacklist', 'index.initialBlacklist'], - ['index.multiVersion', 'index.multiVersion'], - ['index.onChange', 'index.onChange'], - ['index.threads', 'index.threads'], - ['workspaceSymbol.maxNum', 'workspaceSymbol.maxNum'], - ['workspaceSymbol.caseSensitivity', 'workspaceSymbol.caseSensitivity'], - ['statusUpdateInterval', 'statusUpdateInterval'], - ['traceEndpoint', 'trace.websocketEndpointUrl'], - ]; - const castBooleanToInteger: string[] = []; - const clientConfig: ClientConfig = { - cache: { - directory: '.ccls-cache', - }, - highlight: { - enabled: hasAnySemanticHighlight(), - lsRanges: true, - }, - launchArgs: [] as string[], - launchCommand: '', - statusUpdateInterval: 0, - traceEndpoint: '', - workspaceSymbol: { - sort: false, - }, - }; - const config = workspace.getConfiguration('ccls'); - for (const prop of configMapping) { - let value = config.get(prop[1]); + function setConfig(config: ClientConfig, dottedName: string, value: any) { if (value != null) { - const subprops = prop[0].split('.'); - let subconfig = clientConfig; + const subprops = dottedName.split('.'); + let subconfig = config; for (const subprop of subprops.slice(0, subprops.length - 1)) { if (!subconfig.hasOwnProperty(subprop)) { subconfig[subprop] = {}; } subconfig = subconfig[subprop]; } - if (castBooleanToInteger.includes(prop[1])) { - value = +value; - } subconfig[subprops[subprops.length - 1]] = resolveVariables(value); } } + function setClientConfigFromWorkspaceConfig( + cliConfig: ClientConfig, + workspaceConfig: WorkspaceConfiguration, + mapping: Map, + blacklist: Set + ) { + function recurse(config: WorkspaceConfiguration, parentPath = '') { + for (const key of Object.keys(config)) { + const value = config[key]; + const currentPath = (parentPath ? parentPath + '.' : '') + key; + if (blacklist.has(currentPath) || typeof value === 'function') { + continue; + } + if (typeof value === 'object' && value !== null && !(value instanceof Array)) { + recurse(value, currentPath); + } else { + setConfig(cliConfig, mapping.get(currentPath) || currentPath, value); + } + } + } + recurse(workspaceConfig); + } + + // Read prefs; this map goes from `vscode prefs name` => `ccls/js name`. + // For flags which have different name between vscode-ccls prefs and + // ClientConfig / ccls initializationOption + const configMapping = new Map([ + ['launch.command', 'launchCommand'], + ['launch.args', 'launchArgs'], + ['misc.compilationDatabaseCommand', 'compilationDatabaseCommand'], + ['misc.compilationDatabaseDirectory', 'compilationDatabaseDirectory'], + ['completion.enableSnippetInsertion', 'client.snippetSupport'], + ]); + // For flags which should not be populated in ClientConfig (used only by other parts of vscode-ccls) + // It seems like ccls happily ignores extra keys in initializationOption so this is not required. + const configBlacklist = new Set([ + 'codeLens.enabled', + 'codeLens.renderInline', + 'highlighting', + 'misc.showInactiveRegions', + 'theme', + 'trace', + 'treeViews', + ]); + const clientConfig: ClientConfig = { + highlight: { + blacklist: hasAnySemanticHighlight() ? [] : ['.*'], + lsRanges: true, + }, + launchArgs: [] as string[], + launchCommand: '', + statusUpdateInterval: 0, + traceEndpoint: '', + }; + setClientConfigFromWorkspaceConfig( + clientConfig, + workspace.getConfiguration('ccls'), + configMapping, + configBlacklist + ); return clientConfig; } @@ -462,6 +459,7 @@ export class ServerContext implements Disposable { return child; }; + const config = workspace.getConfiguration('ccls'); // Options to control the language client const clientOptions: LanguageClientOptions = { diagnosticCollectionName: 'ccls', @@ -470,7 +468,7 @@ export class ServerContext implements Disposable { // configurationSection: 'ccls', // fileEvents: workspace.createFileSystemWatcher('**/.cc') // }, - errorHandler: new CclsErrorHandler(workspace.getConfiguration('ccls')), + errorHandler: new CclsErrorHandler(config), initializationFailedHandler: (e) => { console.log(e); return false; @@ -481,8 +479,9 @@ export class ServerContext implements Disposable { revealOutputChannelOn: RevealOutputChannelOn.Never, }; - if (this.cliConfig.traceEndpoint) { - const socket = new WebSocket(this.cliConfig.traceEndpoint); + const traceEndpoint = config.get('trace.websocketEndpointUrl'); + if (traceEndpoint) { + const socket = new WebSocket(traceEndpoint); let log = ''; clientOptions.outputChannel = { name: 'websocket', diff --git a/src/types.ts b/src/types.ts index 65c6557..c94c611 100644 --- a/src/types.ts +++ b/src/types.ts @@ -7,18 +7,12 @@ export interface Icon { } export interface ClientConfig { - cache: { - directory: string, - }; highlight: { - enabled: boolean; + blacklist: string[]; lsRanges: boolean; }; launchArgs: string[]; launchCommand: string; - workspaceSymbol: { - sort: boolean, - }; statusUpdateInterval: number; traceEndpoint: string; [key: string]: any; From 9c9f95c1c897f92de83b1ff4507df48e597d13cf Mon Sep 17 00:00:00 2001 From: Riatre Foo Date: Sun, 3 Mar 2019 21:06:19 +0800 Subject: [PATCH 10/22] Add documentation of index.maxInitializerLines; set default value to 15 --- package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/package.json b/package.json index bdb7fbe..879b150 100644 --- a/package.json +++ b/package.json @@ -967,6 +967,11 @@ "default": 2, "description": "Whether to reparse a file if write times of its dependencies have changed. The file will always be reparsed if its own write time changes.\n\n0: no, 1: only during initial load of project, 2: yes" }, + "ccls.index.maxInitializerLines": { + "type": "integer", + "default": 15, + "description": "Number of lines of the initializer / macro definition showed in hover." + }, "ccls.codeLens.renderInline": { "type": "boolean", "default": false, From 75970ad2d6acb0a9634d78e83c7927f8a73711ea Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Mon, 8 Apr 2019 16:20:01 +0200 Subject: [PATCH 11/22] Use the default argument of child_process.spawn const defaults = { cwd: undefined, env: process.env }; --- src/serverContext.ts | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/src/serverContext.ts b/src/serverContext.ts index 39db30e..6446349 100644 --- a/src/serverContext.ts +++ b/src/serverContext.ts @@ -435,26 +435,8 @@ export class ServerContext implements Disposable { private initClient(): LanguageClient { const args = this.cliConfig.launchArgs; - const env: any = {}; - const kToForward = [ - 'ProgramData', - 'PATH', - 'CPATH', - 'LIBRARY_PATH', - ]; - for (const e of kToForward) - env[e] = process.env[e]; - const serverOptions: ServerOptions = async (): Promise => { - const opts: cp.SpawnOptions = { - cwd: this.cwd, - env - }; - const child = cp.spawn( - this.cliConfig.launchCommand, - args, - opts - ); + const child = cp.spawn(this.cliConfig.launchCommand, args); this.clientPid = child.pid; return child; }; From 1206c92b0fa804bc578d2650d1881ff2d2071ac9 Mon Sep 17 00:00:00 2001 From: theorlang Date: Wed, 28 Aug 2019 20:45:21 +0200 Subject: [PATCH 12/22] fixed/improved member hierarchy info now it shows names of fields as well as their types + byte offset of particular field in the tooltip --- src/hierarchies/memberHierarchy.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/hierarchies/memberHierarchy.ts b/src/hierarchies/memberHierarchy.ts index bc207d1..77e0fb5 100644 --- a/src/hierarchies/memberHierarchy.ts +++ b/src/hierarchies/memberHierarchy.ts @@ -9,6 +9,7 @@ enum MemberKind { } interface MemberHierarchyNode extends IHierarchyNode { + fieldName: string; children: MemberHierarchyNode[]; } @@ -22,7 +23,20 @@ export class MemberHierarchyProvider extends Hierarchy { } public onTreeItem(ti: TreeItem, element: MemberHierarchyNode) { - // + const parts: string[] = element.fieldName.trim().split(' '); + const off: number = parseInt(parts[0], 10); + let fieldName: string = ''; + if (isNaN(off) || (parts.length < 3)) { + fieldName = parts[1]; + } else { + fieldName = parts[2]; + ti.tooltip = `Offset: ${off} bytes`; + } + + if (fieldName !== undefined) { + ti.label = fieldName; + ti.description = `(${element.name}) ` + ti.description; + } } protected async onGetChildren(element: MemberHierarchyNode): Promise { From 414ba764cf18fcfd871502e97301c8ea405d32df Mon Sep 17 00:00:00 2001 From: Deok Koo Kim Date: Fri, 28 Jun 2019 00:11:35 +0900 Subject: [PATCH 13/22] Add option ccls.callHierarchy.qualified to show detailed names in the call hierarchy Defaults to true. --- package.json | 5 ++++ src/hierarchies/callHierarchy.ts | 48 +++++++++++++++----------------- src/serverContext.ts | 9 ++++-- 3 files changed, 35 insertions(+), 27 deletions(-) diff --git a/package.json b/package.json index 879b150..3ca0a74 100644 --- a/package.json +++ b/package.json @@ -829,6 +829,11 @@ "default": "", "description": "Default value to use for clang -resource-dir argument. This will be automatically supplied by ccls if not provided." }, + "ccls.callHierarchy.qualified": { + "type": "boolean", + "default": true, + "description": "If true, use qualified names in the call hiearchy" + }, "ccls.misc.compilationDatabaseCommand": { "type": "string", "default": "", diff --git a/src/hierarchies/callHierarchy.ts b/src/hierarchies/callHierarchy.ts index f94aec1..221348c 100644 --- a/src/hierarchies/callHierarchy.ts +++ b/src/hierarchies/callHierarchy.ts @@ -21,10 +21,9 @@ export class CallHierarchyProvider extends Hierarchy { private baseIcon: Icon; private derivedIcon: Icon; private useCallee = false; + private qualified = false; - constructor( - languageClient: LanguageClient - ) { + constructor(languageClient: LanguageClient, qualified: boolean) { super(languageClient, 'ccls.callHierarchy', 'ccls.closeCallHierarchy'); this.baseIcon = { dark: resourcePath("base-dark.svg"), @@ -34,6 +33,7 @@ export class CallHierarchyProvider extends Hierarchy { dark: resourcePath("derived-dark.svg"), light: resourcePath("derived-light.svg") }; + this.qualified = qualified; this._dispose.push(commands.registerCommand("ccls.call.useCallers", () => this.updateCallee(false))); this._dispose.push(commands.registerCommand("ccls.call.useCallees", () => this.updateCallee(true))); } @@ -46,33 +46,31 @@ export class CallHierarchyProvider extends Hierarchy { } protected async onGetChildren(element: CallHierarchyNode): Promise { - const result = await this.languageClient.sendRequest('$ccls/call', { - callType: CallType.All, - callee: this.useCallee, - hierarchy: true, - id: element.id, - levels: 1, - qualified: false, - }); + const result = + await this.languageClient.sendRequest('$ccls/call', { + callType: CallType.All, + callee: this.useCallee, + hierarchy: true, + id: element.id, + levels: 1, + qualified: this.qualified, + }); element.children = result.children; return result.children; } protected async onReveal(uri: Uri, position: Position): Promise { - return this.languageClient.sendRequest( - '$ccls/call', - { - callType: CallType.All, - callee: this.useCallee, - hierarchy: true, - levels: 2, - position, - qualified: false, - textDocument: { - uri: uri.toString(true), - }, - } - ); + return this.languageClient.sendRequest('$ccls/call', { + callType: CallType.All, + callee: this.useCallee, + hierarchy: true, + levels: 2, + position, + qualified: this.qualified, + textDocument: { + uri: uri.toString(true), + }, + }); } private updateCallee(val: boolean) { diff --git a/src/serverContext.ts b/src/serverContext.ts index 6446349..d967656 100644 --- a/src/serverContext.ts +++ b/src/serverContext.ts @@ -151,6 +151,7 @@ function getClientConfig(wsRoot: string): ClientConfig { ['misc.compilationDatabaseCommand', 'compilationDatabaseCommand'], ['misc.compilationDatabaseDirectory', 'compilationDatabaseDirectory'], ['completion.enableSnippetInsertion', 'client.snippetSupport'], + ['callHierarchy.qualified', 'callHiearchyQualified'], ]); // For flags which should not be populated in ClientConfig (used only by other parts of vscode-ccls) // It seems like ccls happily ignores extra keys in initializationOption so this is not required. @@ -164,6 +165,7 @@ function getClientConfig(wsRoot: string): ClientConfig { 'treeViews', ]); const clientConfig: ClientConfig = { + callHiearchyQualified: false, highlight: { blacklist: hasAnySemanticHighlight() ? [] : ['.*'], lsRanges: true, @@ -251,7 +253,9 @@ export class ServerContext implements Disposable { "ccls.inheritanceHierarchy", inheritanceHierarchyProvider )); - const callHierarchyProvider = new CallHierarchyProvider(this.client); + const callHiearchyQualified = this.cliConfig.callHiearchyQualified; + const callHierarchyProvider = + new CallHierarchyProvider(this.client, callHiearchyQualified); this._dispose.push(callHierarchyProvider); this._dispose.push(window.registerTreeDataProvider( 'ccls.callHierarchy', callHierarchyProvider @@ -315,7 +319,8 @@ export class ServerContext implements Disposable { } private reloadIndex() { - this.client.sendNotification("$ccls/reload"); + this.client.sendNotification( + '$ccls/reload', {blacklist: [], dependencies: true, whilelist: []}); } private async onDidChangeConfiguration() { From f073de4ee0058e1d1ee047bd89198feece427659 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Sun, 13 Oct 2019 20:21:23 -0700 Subject: [PATCH 14/22] npm update --- package-lock.json | 1631 ++++++++------------------------------------- package.json | 14 +- 2 files changed, 285 insertions(+), 1360 deletions(-) diff --git a/package-lock.json b/package-lock.json index f7e9758..6598fbe 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,32 +4,54 @@ "lockfileVersion": 1, "requires": true, "dependencies": { - "@types/events": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz", - "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==", - "dev": true + "@babel/code-frame": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", + "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", + "dev": true, + "requires": { + "@babel/highlight": "^7.0.0" + } + }, + "@babel/highlight": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", + "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", + "dev": true, + "requires": { + "chalk": "^2.0.0", + "esutils": "^2.0.2", + "js-tokens": "^4.0.0" + } }, "@types/node": { - "version": "9.6.41", - "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.41.tgz", - "integrity": "sha512-sPZWEbFMz6qAy9SLY7jh5cgepmsiwqUUHjvEm8lpU6kug2hmmcyuTnwhoGw/GWpI5Npue4EqvsiQQI0eWjW/ZA==", + "version": "9.6.52", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.6.52.tgz", + "integrity": "sha512-d6UdHtc8HKe3NTruj9mHk2B8EiHZyuG/00aYbUedHvy9sBhtLAX1gaxSNgvcheOvIZavvmpJYlwfHjjxlU/Few==", "dev": true }, "@types/ws": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.1.tgz", - "integrity": "sha512-EzH8k1gyZ4xih/MaZTXwT2xOkPiIMSrhQ9b8wrlX88L0T02eYsddatQlwVFlEPyEqV0ChpdpNnE51QPH6NVT4Q==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-6.0.3.tgz", + "integrity": "sha512-yBTM0P05Tx9iXGq00BbJPo37ox68R5vaGTXivs6RGh/BQ6QP5zqZDGWdAO6JbRE/iR1l80xeGAwCQS2nMV9S/w==", "dev": true, "requires": { - "@types/events": "*", "@types/node": "*" } }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + }, "ajv": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", - "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -38,49 +60,13 @@ "uri-js": "^4.2.2" } }, - "ansi-cyan": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", - "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-red": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", - "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", - "dev": true - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { - "buffer-equal": "^1.0.0" + "color-convert": "^1.9.0" } }, "argparse": { @@ -92,61 +78,6 @@ "sprintf-js": "~1.0.2" } }, - "arr-diff": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", - "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", - "dev": true - }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true - }, - "array-slice": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", - "dev": true - }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "^1.0.1" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", @@ -163,9 +94,9 @@ "dev": true }, "async-limiter": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", - "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" }, "asynckit": { "version": "0.4.0", @@ -185,36 +116,16 @@ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "azure-devops-node-api": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/azure-devops-node-api/-/azure-devops-node-api-7.2.0.tgz", + "integrity": "sha512-pMfGJ6gAQ7LRKTHgiRF+8iaUUeGAI0c8puLaqHLc7B8AR7W6GJLozK9RFeUHFjEGybC9/EB3r67WPd7e46zQ8w==", "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } + "os": "0.1.1", + "tunnel": "0.0.4", + "typed-rest-client": "1.2.0", + "underscore": "1.8.3" } }, "balanced-match": { @@ -232,15 +143,6 @@ "tweetnacl": "^0.14.3" } }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -258,9 +160,9 @@ } }, "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, "buffer-crc32": { @@ -269,12 +171,6 @@ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", "dev": true }, - "buffer-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", - "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", - "dev": true - }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", @@ -302,77 +198,22 @@ "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } } }, "cheerio": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "version": "1.0.0-rc.3", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", + "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==", "dev": true, "requires": { "css-select": "~1.2.0", - "dom-serializer": "~0.1.0", + "dom-serializer": "~0.1.1", "entities": "~1.1.1", "htmlparser2": "^3.9.1", "lodash": "^4.15.0", "parse5": "^3.0.1" } }, - "clone": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", - "dev": true - }, - "clone-stats": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", - "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", @@ -389,18 +230,18 @@ "dev": true }, "combined-stream": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", - "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "concat-map": { @@ -409,15 +250,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "convert-source-map": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", - "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } - }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -437,9 +269,9 @@ } }, "css-what": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz", - "integrity": "sha512-wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz", + "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==", "dev": true }, "dashdash": { @@ -460,24 +292,6 @@ "ms": "2.0.0" } }, - "deep-assign": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", - "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", - "dev": true, - "requires": { - "is-obj": "^1.0.0" - } - }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -490,28 +304,26 @@ "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=", "dev": true }, + "didyoumean": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.1.tgz", + "integrity": "sha1-6S7f2tplN9SE1zwBcv0eugxJdv8=", + "dev": true + }, "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz", + "integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==", "dev": true }, "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz", + "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==", "dev": true, "requires": { - "domelementtype": "~1.1.1", - "entities": "~1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - } + "domelementtype": "^1.3.0", + "entities": "^1.1.1" } }, "domelementtype": { @@ -539,24 +351,6 @@ "domelementtype": "1" } }, - "duplexer": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", - "dev": true - }, - "duplexify": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", - "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -567,21 +361,27 @@ "safer-buffer": "^2.1.0" } }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, "entities": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", "dev": true }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", + "dev": true + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "dev": true, + "requires": { + "es6-promise": "^4.0.3" + } + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -595,41 +395,17 @@ "dev": true }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, - "event-stream": { - "version": "3.3.4", - "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true, - "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", - "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" - } - }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, - "extend-shallow": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", - "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", - "dev": true, - "requires": { - "kind-of": "^1.1.0" - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -657,16 +433,6 @@ "pend": "~1.2.0" } }, - "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" - } - }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -684,46 +450,12 @@ "mime-types": "^2.1.12" } }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -734,9 +466,9 @@ } }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -747,236 +479,12 @@ "path-is-absolute": "^1.0.0" } }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - } - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, - "gulp-chmod": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", - "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", - "dev": true, - "requires": { - "deep-assign": "^1.0.0", - "stat-mode": "^0.2.0", - "through2": "^2.0.0" - } - }, - "gulp-filter": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", - "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", - "dev": true, - "requires": { - "multimatch": "^2.0.0", - "plugin-error": "^0.1.2", - "streamfilter": "^1.0.5" - } - }, - "gulp-gunzip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz", - "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=", - "dev": true, - "requires": { - "through2": "~0.6.5", - "vinyl": "~0.4.6" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "dev": true, - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } - } - }, - "gulp-remote-src-vscode": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.1.tgz", - "integrity": "sha512-mw4OGjtC/jlCWJFhbcAlel4YPvccChlpsl3JceNiB/DLJi24/UPxXt53/N26lgI3dknEqd4ErfdHrO8sJ5bATQ==", - "dev": true, - "requires": { - "event-stream": "3.3.4", - "node.extend": "^1.1.2", - "request": "^2.79.0", - "through2": "^2.0.3", - "vinyl": "^2.0.1" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - } - } - }, - "gulp-untar": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.7.tgz", - "integrity": "sha512-0QfbCH2a1k2qkTLWPqTX+QO4qNsHn3kC546YhAP3/n0h+nvtyGITDuDrYBMDZeW4WnFijmkOvBWa5HshTic1tw==", - "dev": true, - "requires": { - "event-stream": "~3.3.4", - "streamifier": "~0.1.1", - "tar": "^2.2.1", - "through2": "~2.0.3", - "vinyl": "^1.2.0" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", - "dev": true - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", - "dev": true - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "dev": true, - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulp-vinyl-zip": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.2.tgz", - "integrity": "sha512-wJn09jsb8PyvUeyFF7y7ImEJqJwYy40BqL9GKfJs6UGpaGW9A+N68Q+ajsIpb9AeR6lAdjMbIdDPclIGo1/b7Q==", - "dev": true, - "requires": { - "event-stream": "3.3.4", - "queue": "^4.2.1", - "through2": "^2.0.3", - "vinyl": "^2.0.2", - "vinyl-fs": "^3.0.3", - "yauzl": "^2.2.1", - "yazl": "^2.2.1" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - } - } - }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -993,34 +501,10 @@ "har-schema": "^2.0.0" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "has-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", - "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "he": { @@ -1030,30 +514,27 @@ "dev": true }, "htmlparser2": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.0.tgz", - "integrity": "sha512-J1nEUGv+MkXS0weHNWVKJJ+UrLfePxRWpN3C9bEi9fLxL2+ggW94DQvgYVXsaT30PGwYRIZKNZXuyMhp3Di4bQ==", + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", "dev": true, "requires": { - "domelementtype": "^1.3.0", + "domelementtype": "^1.3.1", "domhandler": "^2.3.0", "domutils": "^1.5.1", "entities": "^1.1.1", "inherits": "^2.0.1", - "readable-stream": "^3.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.1.1.tgz", - "integrity": "sha512-DkN66hPyqDhnIQ6Jcsvx9bFjhw214O4poMBcIMgPVpQvNy9a0e0Uhg5SqySyDKAmUlwt8LonTBz1ezOnM8pUdA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } + "readable-stream": "^3.1.1" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" } }, "http-signature": { @@ -1067,117 +548,36 @@ "sshpk": "^1.7.0" } }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "is": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", - "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "https-proxy-agent": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", + "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "agent-base": "^4.3.0", + "debug": "^3.1.0" } }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", - "dev": true - }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", - "dev": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "unc-path-regex": "^0.1.2" + "once": "^1.3.0", + "wrappy": "1" } }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "isarray": { + "is-typedarray": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", "dev": true }, "isstream": { @@ -1187,15 +587,15 @@ "dev": true }, "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", - "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -1220,12 +620,6 @@ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -1244,49 +638,19 @@ "verror": "1.10.0" } }, - "kind-of": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, "linkify-it": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.1.0.tgz", - "integrity": "sha512-4REs8/062kV2DSHxNfq5183zrqXMl7WP0WzABH9IeJI+NLm429FgE1PDecltYfnOoFDFlZGh2T8PfZn0r+GTRg==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", + "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", "dev": true, "requires": { "uc.micro": "^1.0.1" } }, "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "map-stream": { - "version": "0.1.0", - "resolved": "http://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "markdown-it": { @@ -1315,18 +679,18 @@ "dev": true }, "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", "dev": true }, "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", "dev": true, "requires": { - "mime-db": "~1.37.0" + "mime-db": "1.40.0" } }, "minimatch": { @@ -1354,23 +718,36 @@ } }, "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", "dev": true, "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", + "browser-stdout": "1.3.1", + "commander": "2.15.1", "debug": "3.1.0", - "diff": "3.3.1", + "diff": "3.5.0", "escape-string-regexp": "1.0.5", "glob": "7.1.2", - "growl": "1.10.3", + "growl": "1.10.5", "he": "1.1.1", + "minimatch": "3.0.4", "mkdirp": "0.5.1", - "supports-color": "4.4.0" + "supports-color": "5.4.0" }, "dependencies": { + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, "glob": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", @@ -1384,6 +761,15 @@ "once": "^1.3.0", "path-is-absolute": "^1.0.0" } + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -1393,52 +779,12 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "multimatch": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", - "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", - "dev": true, - "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" - } - }, "mute-stream": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "node.extend": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.8.tgz", - "integrity": "sha512-L/dvEBwyg3UowwqOUTyDsGBU6kjBQOpOhshio9V3i3BMPv5YUb9+mWNN8MK0IbWqT0AqaTSONZf0aTuMMahWgA==", - "dev": true, - "requires": { - "has": "^1.0.3", - "is": "^3.2.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "now-and-later": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz", - "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, "nth-check": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", @@ -1454,24 +800,6 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, - "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", - "dev": true - }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1481,14 +809,11 @@ "wrappy": "1" } }, - "ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } + "os": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/os/-/os-0.1.1.tgz", + "integrity": "sha1-IIhF6J4ZOtTZcUdLk5R3NqVtE/M=", + "dev": true }, "os-homedir": { "version": "1.0.2", @@ -1530,12 +855,6 @@ "@types/node": "*" } }, - "path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", - "dev": true - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -1548,15 +867,6 @@ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "~2.3" - } - }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -1569,64 +879,18 @@ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", "dev": true }, - "plugin-error": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", - "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", - "dev": true, - "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" - } - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, "psl": { - "version": "1.1.31", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", - "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==", "dev": true }, - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "q": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", - "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", - "dev": true - }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", @@ -1634,20 +898,11 @@ "dev": true }, "querystringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", - "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", "dev": true }, - "queue": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/queue/-/queue-4.5.1.tgz", - "integrity": "sha512-AMD7w5hRXcFSb8s9u38acBZ+309u6GsiibP4/0YacJeaurRshogB7v/ZcVPxP5gD5+zIw6ixRHdutiYUJfwKHw==", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, "read": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", @@ -1658,53 +913,16 @@ } }, "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", + "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - } - }, - "remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", - "dev": true, - "requires": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" } }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "replace-ext": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", - "dev": true - }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", @@ -1740,36 +958,18 @@ "dev": true }, "resolve": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz", - "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { "path-parse": "^1.0.6" } }, - "resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", - "dev": true, - "requires": { - "value-or-function": "^3.0.0" - } - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", "dev": true }, "safer-buffer": { @@ -1790,24 +990,15 @@ "dev": true }, "source-map-support": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", - "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "split": { - "version": "0.3.3", - "resolved": "http://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", - "dev": true, - "requires": { - "through": "2" - } - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -1815,9 +1006,9 @@ "dev": true }, "sshpk": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.0.tgz", - "integrity": "sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -1831,104 +1022,22 @@ "tweetnacl": "~0.14.0" } }, - "stat-mode": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", - "dev": true - }, - "stream-combiner": { - "version": "0.0.4", - "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", - "dev": true, - "requires": { - "duplexer": "~0.1.1" - } - }, - "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "streamfilter": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", - "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "streamifier": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", - "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=", - "dev": true - }, "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "safe-buffer": "~5.2.0" } }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "dev": true, - "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" + "has-flag": "^3.0.0" } }, "tmp": { @@ -1940,25 +1049,6 @@ "os-tmpdir": "~1.0.1" } }, - "to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - } - }, - "to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", - "dev": true, - "requires": { - "through2": "^2.0.3" - } - }, "tough-cookie": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", @@ -1978,37 +1068,30 @@ } }, "tslib": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", - "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": true }, "tslint": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.1.tgz", - "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==", + "version": "5.20.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.0.tgz", + "integrity": "sha512-2vqIvkMHbnx8acMogAERQ/IuINOq6DFqgF8/VDvhEkBqQh/x6SP0Y+OHnKth9/ZcHQSroOZwUQSN18v8KKF0/g==", "dev": true, "requires": { - "babel-code-frame": "^6.22.0", + "@babel/code-frame": "^7.0.0", "builtin-modules": "^1.1.1", "chalk": "^2.3.0", "commander": "^2.12.1", - "diff": "^3.2.0", + "diff": "^4.0.1", "glob": "^7.1.1", - "js-yaml": "^3.7.0", + "js-yaml": "^3.13.1", "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.8.0", - "tsutils": "^2.27.2" - }, - "dependencies": { - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - } + "tsutils": "^2.29.0" } }, "tsutils": { @@ -2042,21 +1125,13 @@ "dev": true }, "typed-rest-client": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-0.9.0.tgz", - "integrity": "sha1-92jMDcP06VDwbgSCXDaz54NKofI=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.2.0.tgz", + "integrity": "sha512-FrUshzZ1yxH8YwGR29PWWnfksLEILbWJydU7zfIRkyH7kAEzB62uMAl2WY6EyolWpLpVHeJGgQm45/MaruaHpw==", "dev": true, "requires": { "tunnel": "0.0.4", "underscore": "1.8.3" - }, - "dependencies": { - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true - } } }, "typescript": { @@ -2066,33 +1141,17 @@ "dev": true }, "uc.micro": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz", - "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", "dev": true }, "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", "dev": true }, - "unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "requires": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -2109,12 +1168,12 @@ "dev": true }, "url-parse": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", - "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", "dev": true, "requires": { - "querystringify": "^2.0.0", + "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, @@ -2125,15 +1184,9 @@ "dev": true }, "uuid": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", - "dev": true - }, - "value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==", "dev": true }, "verror": { @@ -2147,131 +1200,18 @@ "extsprintf": "^1.2.0" } }, - "vinyl": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", - "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", - "dev": true, - "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" - } - }, - "vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "requires": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - } - } - }, - "vinyl-source-stream": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", - "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", - "dev": true, - "requires": { - "through2": "^2.0.3", - "vinyl": "^0.4.3" - } - }, - "vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", - "dev": true, - "requires": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - }, - "dependencies": { - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", - "dev": true - }, - "vinyl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", - "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", - "dev": true, - "requires": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - } - } - } - }, "vsce": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.54.0.tgz", - "integrity": "sha512-E0Cnz50JK/TzUzTxDQ9oj3/Ichot1qmyin/8yHrH2BrQiXWUTX/FbuzMKFf1gTkNr6VvI3HbEf4VxSP/IASFIg==", + "version": "1.67.1", + "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.67.1.tgz", + "integrity": "sha512-Y/0fnfaLs2cCfytTGmy4Cp1bf9BaxHO7020YePdUwxjAlPlZ9+lm74M9yEFEWXTIug0L0sMax1WMz0TnozIqxg==", "dev": true, "requires": { + "azure-devops-node-api": "^7.2.0", + "chalk": "^2.4.2", "cheerio": "^1.0.0-rc.1", "commander": "^2.8.1", "denodeify": "^1.2.1", + "didyoumean": "^1.2.1", "glob": "^7.0.6", "lodash": "^4.17.10", "markdown-it": "^8.3.1", @@ -2282,32 +1222,25 @@ "read": "^1.0.7", "semver": "^5.1.0", "tmp": "0.0.29", + "typed-rest-client": "1.2.0", "url-join": "^1.1.0", - "vso-node-api": "6.1.2-preview", "yauzl": "^2.3.1", "yazl": "^2.2.2" } }, "vscode": { - "version": "1.1.26", - "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.26.tgz", - "integrity": "sha512-z1Nf5J38gjUFbuDCbJHPN6OJ//5EG+e/yHlh6ERxj/U9B2Qc3aiHaFr38/fee/GGnxvRw/XegLMOG+UJwKi/Qg==", + "version": "1.1.36", + "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.36.tgz", + "integrity": "sha512-cGFh9jmGLcTapCpPCKvn8aG/j9zVQ+0x5hzYJq5h5YyUXVGa1iamOaB2M2PZXoumQPES4qeAP1FwkI0b6tL4bQ==", "dev": true, "requires": { "glob": "^7.1.2", - "gulp-chmod": "^2.0.0", - "gulp-filter": "^5.0.1", - "gulp-gunzip": "1.0.0", - "gulp-remote-src-vscode": "^0.5.1", - "gulp-untar": "^0.0.7", - "gulp-vinyl-zip": "^2.1.2", - "mocha": "^4.0.1", + "mocha": "^5.2.0", "request": "^2.88.0", "semver": "^5.4.1", "source-map-support": "^0.5.0", - "url-parse": "^1.4.3", - "vinyl-fs": "^3.0.3", - "vinyl-source-stream": "^1.1.0" + "url-parse": "^1.4.4", + "vscode-test": "^0.4.1" } }, "vscode-jsonrpc": { @@ -2338,16 +1271,14 @@ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" }, - "vso-node-api": { - "version": "6.1.2-preview", - "resolved": "https://registry.npmjs.org/vso-node-api/-/vso-node-api-6.1.2-preview.tgz", - "integrity": "sha1-qrNUbfJFHs2JTgcbuZtd8Zxfp48=", + "vscode-test": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.4.3.tgz", + "integrity": "sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w==", "dev": true, "requires": { - "q": "^1.0.1", - "tunnel": "0.0.4", - "typed-rest-client": "^0.9.0", - "underscore": "^1.8.3" + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.1" } }, "wrappy": { @@ -2357,19 +1288,13 @@ "dev": true }, "ws": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.4.tgz", - "integrity": "sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "requires": { "async-limiter": "~1.0.0" } }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", diff --git a/package.json b/package.json index 3ca0a74..9b61ebd 100644 --- a/package.json +++ b/package.json @@ -14,16 +14,16 @@ "lint": "npx tslint -p ./" }, "devDependencies": { - "@types/node": "^9.6.41", - "@types/ws": "^6.0.1", + "@types/node": "^9.6.52", + "@types/ws": "^6.0.3", + "tslint": "^5.20.0", "typescript": "^2.9.2", - "tslint": "^5.11.0", - "vsce": "^1.54.0", - "vscode": "^1.1.26" + "vsce": "^1.67.1", + "vscode": "^1.1.36" }, "dependencies": { "vscode-languageclient": "^5.2.1", - "ws": "^6.1.4" + "ws": "^6.2.1" }, "repository": { "type": "git", @@ -31,7 +31,7 @@ }, "preview": true, "engines": { - "vscode": "^1.30.0" + "vscode": "^1.36.0" }, "categories": [ "Programming Languages" From fb54bc609aebc1240793b13a6e647539bd4e836a Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Sun, 13 Oct 2019 21:41:36 -0700 Subject: [PATCH 15/22] Redesign semantic highlight configurations (#75) Adopt the emacs-ccls approach. ccls.highlight.{function,type,type}.face define faces of basic symbol kinds from which other symbol kinds ({member,staticMember}{Function,Variable}, etc) can inherit. For example, if ccls.highlight.function.face: ["enabled"] is specified, memberFunction will also be enabled because of the default configurations: // Inherit from both ccls.highlight.{function,member}.face ccls.highlight.memberFunction.face: ["function", "member"] ccls.highlight.member.face: ["fontStyle: italic"] For a symbol kind, its face property takes effect if "enabled" is specified. --- package.json | 522 +++++++++---------------------------------- src/semantic.ts | 177 ++++++++------- src/serverContext.ts | 13 +- 3 files changed, 213 insertions(+), 499 deletions(-) diff --git a/package.json b/package.json index 9b61ebd..0b2d775 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ccls", - "description": "C/C++/ObjC language server supporting cross references, hierarchies, completion and semantic highlighting", + "description": "C/C++/ObjC language server supporting cross references, hierarchies, completion and semantic highlight", "author": "ccls-project", "license": "MIT", "version": "0.1.23", @@ -304,226 +304,110 @@ "default": false, "description": "If false, store cache files as $directory/@a@b/c.cc.blob\n\nIf true, $directory/a/b/c.cc.blob." }, - "ccls.highlighting.enabled.types": { - "type": "boolean", - "default": false, - "description": "If semantic highlighting for classes, structs, and unions is enabled/disabled." - }, - "ccls.highlighting.enabled.freeStandingFunctions": { - "type": "boolean", - "default": false, - "description": "If semantic highlighting for member functions is enabled/disabled." - }, - "ccls.highlighting.enabled.memberFunctions": { - "type": "boolean", - "default": false, - "description": "If semantic highlighting for member functions is enabled/disabled." - }, - "ccls.highlighting.enabled.freeStandingVariables": { - "type": "boolean", - "default": false, - "description": "If semantic highlighting for member free-standing variables is enabled/disabled." - }, - "ccls.highlighting.enabled.memberVariables": { - "type": "boolean", - "default": false, - "description": "If semantic highlighting for member variables is enabled/disabled." - }, - "ccls.highlighting.enabled.namespaces": { - "type": "boolean", - "default": false, - "description": "If semantic highlighting for namespaces is enabled/disabled." - }, - "ccls.highlighting.enabled.macros": { - "type": "boolean", - "default": false, - "description": "If semantic highlighting for macros is enabled/disabled." - }, - "ccls.highlighting.enabled.enums": { - "type": "boolean", - "default": false, - "description": "If semantic highlighting for enumerations is enabled/disabled." + "ccls.highlight.function.face": { + "type": "array", + "default": [] }, - "ccls.highlighting.enabled.typeAliases": { - "type": "boolean", - "default": false, - "description": "If semantic highlighting for type aliases is enabled/disabled." + "ccls.highlight.global.face": { + "type": "array", + "default": [ + "fontWeight: bolder" + ] }, - "ccls.highlighting.enabled.enumConstants": { - "type": "boolean", - "default": false, - "description": "If semantic highlighting for enumerators is enabled/disabled." + "ccls.highlight.member.face": { + "type": "array", + "default": [ + "fontStyle: italic" + ] }, - "ccls.highlighting.enabled.staticMemberFunctions": { - "type": "boolean", - "default": false, - "description": "If semantic highlighting for static member functions is enabled/disabled." + "ccls.highlight.static.face": { + "type": "array", + "default": [ + "fontWeight: bold" + ] }, - "ccls.highlighting.enabled.parameters": { - "type": "boolean", - "default": false, - "description": "If semantic highlighting for parameters is enabled/disabled." + "ccls.highlight.type.face": { + "type": "array", + "default": [] }, - "ccls.highlighting.enabled.templateParameters": { - "type": "boolean", - "default": false, - "description": "If semantic highlighting for template parameters is enabled/disabled." + "ccls.highlight.variable.face": { + "type": "array", + "default": [] }, - "ccls.highlighting.enabled.staticMemberVariables": { - "type": "boolean", - "default": false, - "description": "If semantic highlighting for static member variables is enabled/disabled." + "ccls.highlight.enum.face": { + "type": "array", + "default": [ + "variable", + "member" + ] }, - "ccls.highlighting.enabled.globalVariables": { - "type": "boolean", - "default": false, - "description": "If semantic highlighting for global variables is enabled/disabled." + "ccls.highlight.globalVariable.face": { + "type": "array", + "default": [ + "variable", + "global" + ] }, - "ccls.highlighting.colors.types": { + "ccls.highlight.macro.face": { "type": "array", "default": [ - "#e1afc3", - "#d533bb", - "#9b677f", - "#e350b6", - "#a04360", - "#dd82bc", - "#de3864", - "#ad3f87", - "#dd7a90", - "#e0438a" - ], - "description": "Colors to use for semantic highlighting. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlighting will cycle through them for successive symbols." + "variable" + ] }, - "ccls.highlighting.colors.freeStandingFunctions": { + "ccls.highlight.memberFunction.face": { "type": "array", "default": [ - "#e5b124", - "#927754", - "#eb992c", - "#e2bf8f", - "#d67c17", - "#88651e", - "#e4b953", - "#a36526", - "#b28927", - "#d69855" - ], - "description": "Colors to use for semantic highlighting. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlighting will cycle through them for successive symbols." + "function", + "member" + ] }, - "ccls.highlighting.colors.memberFunctions": { + "ccls.highlight.memberVariable.face": { "type": "array", "default": [ - "#e5b124", - "#927754", - "#eb992c", - "#e2bf8f", - "#d67c17", - "#88651e", - "#e4b953", - "#a36526", - "#b28927", - "#d69855" - ], - "description": "Colors to use for semantic highlighting. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlighting will cycle through them for successive symbols." + "variable", + "member" + ] }, - "ccls.highlighting.colors.freeStandingVariables": { + "ccls.highlight.namespace.face": { "type": "array", "default": [ - "#587d87", - "#26cdca", - "#397797", - "#57c2cc", - "#306b72", - "#6cbcdf", - "#368896", - "#3ea0d2", - "#48a5af", - "#7ca6b7" - ], - "description": "Colors to use for semantic highlighting. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlighting will cycle through them for successive symbols." + "type" + ] }, - "ccls.highlighting.colors.memberVariables": { + "ccls.highlight.parameter.face": { "type": "array", "default": [ - "#587d87", - "#26cdca", - "#397797", - "#57c2cc", - "#306b72", - "#6cbcdf", - "#368896", - "#3ea0d2", - "#48a5af", - "#7ca6b7" - ], - "description": "Colors to use for semantic highlighting. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlighting will cycle through them for successive symbols." + "variable" + ] }, - "ccls.highlighting.colors.namespaces": { + "ccls.highlight.staticMemberFunction.face": { "type": "array", "default": [ - "#429921", - "#58c1a4", - "#5ec648", - "#36815b", - "#83c65d", - "#417b2f", - "#43cc71", - "#7eb769", - "#58bf89", - "#3e9f4a" - ], - "description": "Colors to use for semantic highlighting. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlighting will cycle through them for successive symbols." + "function", + "static" + ] }, - "ccls.highlighting.colors.macros": { + "ccls.highlight.staticMemberVariable.face": { "type": "array", "default": [ - "#e79528", - "#c5373d", - "#e8a272", - "#d84f2b", - "#a67245", - "#e27a33", - "#9b4a31", - "#b66a1e", - "#e27a71", - "#cf6d49" - ], - "description": "Colors to use for semantic highlighting. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlighting will cycle through them for successive symbols." + "variable", + "static" + ] }, - "ccls.highlighting.colors.enums": { + "ccls.highlight.staticVariable.face": { "type": "array", "default": [ - "#e1afc3", - "#d533bb", - "#9b677f", - "#e350b6", - "#a04360", - "#dd82bc", - "#de3864", - "#ad3f87", - "#dd7a90", - "#e0438a" - ], - "description": "Colors to use for semantic highlighting. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlighting will cycle through them for successive symbols." + "variable", + "static" + ] }, - "ccls.highlighting.colors.typeAliases": { + "ccls.highlight.typeAlias.face": { "type": "array", "default": [ - "#e1afc3", - "#d533bb", - "#9b677f", - "#e350b6", - "#a04360", - "#dd82bc", - "#de3864", - "#ad3f87", - "#dd7a90", - "#e0438a" - ], - "description": "Colors to use for semantic highlighting. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlighting will cycle through them for successive symbols." + "type" + ] }, - "ccls.highlighting.colors.staticMemberFunctions": { + "ccls.highlight.function.colors": { "type": "array", "default": [ "#e5b124", @@ -537,41 +421,9 @@ "#b28927", "#d69855" ], - "description": "Colors to use for semantic highlighting. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlighting will cycle through them for successive symbols." + "description": "Colors to use for semantic highlight. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlight will cycle through them for successive symbols." }, - "ccls.highlighting.colors.enumConstants": { - "type": "array", - "default": [ - "#587d87", - "#26cdca", - "#397797", - "#57c2cc", - "#306b72", - "#6cbcdf", - "#368896", - "#3ea0d2", - "#48a5af", - "#7ca6b7" - ], - "description": "Colors to use for semantic highlighting. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlighting will cycle through them for successive symbols." - }, - "ccls.highlighting.colors.parameters": { - "type": "array", - "default": [ - "#587d87", - "#26cdca", - "#397797", - "#57c2cc", - "#306b72", - "#6cbcdf", - "#368896", - "#3ea0d2", - "#48a5af", - "#7ca6b7" - ], - "description": "Colors to use for semantic highlighting. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlighting will cycle through them for successive symbols." - }, - "ccls.highlighting.colors.templateParameters": { + "ccls.highlight.type.colors": { "type": "array", "default": [ "#e1afc3", @@ -585,9 +437,9 @@ "#dd7a90", "#e0438a" ], - "description": "Colors to use for semantic highlighting. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlighting will cycle through them for successive symbols." + "description": "Colors to use for semantic highlight. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlight will cycle through them for successive symbols." }, - "ccls.highlighting.colors.staticMemberVariables": { + "ccls.highlight.variable.colors": { "type": "array", "default": [ "#587d87", @@ -601,203 +453,39 @@ "#48a5af", "#7ca6b7" ], - "description": "Colors to use for semantic highlighting. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlighting will cycle through them for successive symbols." + "description": "Colors to use for semantic highlight. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlight will cycle through them for successive symbols." }, - "ccls.highlighting.colors.globalVariables": { + "ccls.highlight.namespace.colors": { "type": "array", "default": [ - "#587d87", - "#26cdca", - "#397797", - "#57c2cc", - "#306b72", - "#6cbcdf", - "#368896", - "#3ea0d2", - "#48a5af", - "#7ca6b7" + "#429921", + "#58c1a4", + "#5ec648", + "#36815b", + "#83c65d", + "#417b2f", + "#43cc71", + "#7eb769", + "#58bf89", + "#3e9f4a" ], - "description": "Colors to use for semantic highlighting. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlighting will cycle through them for successive symbols." - }, - "ccls.highlighting.underline.types": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.underline.freeStandingFunctions": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.underline.memberFunctions": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.underline.freeStandingVariables": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.underline.memberVariables": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.underline.namespaces": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.underline.macros": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.underline.enums": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.underline.typeAliases": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.underline.enumConstants": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.underline.staticMemberFunctions": { - "type": "boolean", - "default": true - }, - "ccls.highlighting.underline.parameters": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.underline.templateParameters": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.underline.staticMemberVariables": { - "type": "boolean", - "default": true + "description": "Colors to use for semantic highlight. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlight will cycle through them for successive symbols." }, - "ccls.highlighting.underline.globalVariables": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.italic.types": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.italic.freeStandingFunctions": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.italic.memberFunctions": { - "type": "boolean", - "default": true - }, - "ccls.highlighting.italic.freeStandingVariables": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.italic.memberVariables": { - "type": "boolean", - "default": true - }, - "ccls.highlighting.italic.namespaces": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.italic.macros": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.italic.enums": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.italic.typeAliases": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.italic.enumConstants": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.italic.staticMemberFunctions": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.italic.parameters": { - "type": "boolean", - "default": true - }, - "ccls.highlighting.italic.templateParameters": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.italic.staticMemberVariables": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.italic.globalVariables": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.bold.types": { - "type": "boolean", - "default": true - }, - "ccls.highlighting.bold.freeStandingFunctions": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.bold.memberFunctions": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.bold.freeStandingVariables": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.bold.memberVariables": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.bold.namespaces": { - "type": "boolean", - "default": true - }, - "ccls.highlighting.bold.macros": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.bold.enums": { - "type": "boolean", - "default": true - }, - "ccls.highlighting.bold.typeAliases": { - "type": "boolean", - "default": true - }, - "ccls.highlighting.bold.enumConstants": { - "type": "boolean", - "default": true - }, - "ccls.highlighting.bold.staticMemberFunctions": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.bold.parameters": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.bold.templateParameters": { - "type": "boolean", - "default": true - }, - "ccls.highlighting.bold.staticMemberVariables": { - "type": "boolean", - "default": false - }, - "ccls.highlighting.bold.globalVariables": { - "type": "boolean", - "default": false + "ccls.highlight.macro.colors": { + "type": "array", + "default": [ + "#e79528", + "#c5373d", + "#e8a272", + "#d84f2b", + "#a67245", + "#e27a33", + "#9b4a31", + "#b66a1e", + "#e27a71", + "#cf6d49" + ], + "description": "Colors to use for semantic highlight. A good generator is http://tools.medialab.sciences-po.fr/iwanthue/. If multiple colors are specified, semantic highlight will cycle through them for successive symbols." }, "ccls.clang.extraArgs": { "type": "array", @@ -924,7 +612,7 @@ "null" ], "default": null, - "description": "Files that match these patterns won't have semantic highlighting." + "description": "Files that match these patterns won't have semantic highlight." }, "ccls.highlight.whitelist": { "type": [ @@ -932,7 +620,7 @@ "null" ], "default": null, - "description": "Files that match these patterns will have semantic highlighting." + "description": "Files that match these patterns will have semantic highlight." }, "ccls.highlight.largeFileSize": { "type": [ @@ -940,7 +628,7 @@ "null" ], "default": null, - "description": "Disable semantic highlighting for files larger than the size." + "description": "Disable semantic highlight for files larger than the size." }, "ccls.index.initialBlacklist": { "type": "array", diff --git a/src/semantic.ts b/src/semantic.ts index 432c19c..ed01fe0 100644 --- a/src/semantic.ts +++ b/src/semantic.ts @@ -20,7 +20,6 @@ enum CclsSymbolKind { } enum StorageClass { - Invalid, None, Extern, Static, @@ -31,8 +30,8 @@ enum StorageClass { interface SemanticSymbol { readonly id: number; - readonly parentKind: SymbolKind; - readonly kind: SymbolKind; + readonly parentKind: SymbolKind|CclsSymbolKind; + readonly kind: SymbolKind|CclsSymbolKind; readonly isTypeMember: boolean; readonly storage: StorageClass; readonly lsRanges: Range[]; @@ -43,50 +42,23 @@ export interface PublishSemanticHighlightArgs { readonly symbols: SemanticSymbol[]; } -function makeSemanticDecorationType( - color: string|undefined, underline: boolean, italic: boolean, - bold: boolean): TextEditorDecorationType { - const opts: DecorationRenderOptions = {}; - opts.rangeBehavior = DecorationRangeBehavior.ClosedClosed; - opts.color = color; - if (underline === true) - opts.textDecoration = 'underline'; - if (italic === true) - opts.fontStyle = 'italic'; - if (bold === true) - opts.fontWeight = 'bold'; - return window.createTextEditorDecorationType( - opts as DecorationRenderOptions); -} - -export const semanticTypes: {[name: string]: Array} = { - enumConstants: [SymbolKind.EnumMember], - enums: [SymbolKind.Enum], - freeStandingFunctions: [SymbolKind.Function], - freeStandingVariables: [], - globalVariables: [], - macros: [CclsSymbolKind.Macro], - memberFunctions: [SymbolKind.Method, SymbolKind.Constructor], - memberVariables: [SymbolKind.Field], - namespaces: [SymbolKind.Namespace], - parameters: [CclsSymbolKind.Parameter], - staticMemberFunctions: [CclsSymbolKind.StaticMethod], - staticMemberVariables: [], - templateParameters: [SymbolKind.TypeParameter], - typeAliases: [CclsSymbolKind.TypeAlias], - types: [SymbolKind.Class, SymbolKind.Struct], -}; - -function makeDecorations(type: string) { - const config = workspace.getConfiguration('ccls'); - let colors = config.get(`highlighting.colors.${type}`, [undefined]); - if (colors.length === 0) - colors = [undefined]; - const u = config.get(`highlighting.underline.${type}`, false); - const i = config.get(`highlighting.italic.${type}`, false); - const b = config.get(`highlighting.bold.${type}`, false); - return colors.map((c) => makeSemanticDecorationType(c, u, i, b)); -} +export const semanticKinds: string[] = [ + 'function', + 'variable', + 'type', + + 'enum', + 'globalVariable', + 'macro', + 'memberFunction', + 'memberVariable', + 'namespace', + 'parameter', + 'staticMemberFunction', + 'staticMemberVariable', + 'staticVariable', + 'typeAlias', +]; // TODO: enable bold/italic decorators, might need change in vscode export class SemanticContext implements Disposable { @@ -96,11 +68,6 @@ export class SemanticContext implements Disposable { private _dispose: Disposable[] = []; public constructor() { - for (const type of Object.keys(semanticTypes)) { - this.semanticDecorations.set(type, makeDecorations(type)); - this.semanticEnabled.set(type, false); - } - this.updateConfigValues(); window.onDidChangeActiveTextEditor( @@ -119,8 +86,6 @@ export class SemanticContext implements Disposable { } public publishSemanticHighlight(args: PublishSemanticHighlightArgs) { - this.updateConfigValues(); - const normUri = normalizeUri(args.uri); for (const visibleEditor of window.visibleTextEditors) { @@ -150,10 +115,50 @@ export class SemanticContext implements Disposable { } private updateConfigValues() { - // Fetch new config instance, since vscode will cache the previous one. const config = workspace.getConfiguration('ccls'); - for (const [name, _value] of this.semanticEnabled) { - this.semanticEnabled.set(name, config.get(`highlighting.enabled.${name}`, false)); + + for (const kind of semanticKinds) { + const props: string[][] = []; + const face = config.get(`highlight.${kind}.face`, []); + let colors = config.get>(`highlight.${kind}.colors`, []); + let enabled = false; + + const stack: [string[], number][] = [[face, 0]]; + const visited = new Set([kind]); + while (stack.length > 0) { + const top = stack[stack.length - 1]; + if (top[1] >= top[0].length) { + stack.pop(); + continue; + } + const f = top[0][top[1]++]; + if (f === 'enabled') + enabled = true; + else if (f.indexOf(':') >= 0) + props.push(f.split(':')); + else { + if (visited.has(f)) + continue; + visited.add(f); + if (colors.length === 0) + colors = config.get>(`highlight.${f}.colors`, []); + const face1 = config.get(`highlight.${f}.face`); + if (face1 instanceof Array) + stack.push([face1 as string[], 0]); + } + } + this.semanticEnabled.set(kind, enabled); + + if (colors.length === 0) + colors = [undefined]; + this.semanticDecorations.set(kind, colors.map((color) => { + const opt: DecorationRenderOptions = {}; + opt.rangeBehavior = DecorationRangeBehavior.ClosedClosed; + opt.color = color; + for (const prop of props) + (opt as any)[prop[0]] = prop[1].trim(); + return window.createTextEditorDecorationType(opt as DecorationRenderOptions); + })); } } @@ -167,25 +172,45 @@ export class SemanticContext implements Disposable { return decorations[symbol.id % decorations.length]; }; - if (symbol.kind === SymbolKind.Variable) { - if (symbol.parentKind === SymbolKind.Function || - symbol.parentKind === SymbolKind.Method || - symbol.parentKind === SymbolKind.Constructor) { - return get('freeStandingVariables'); - } - return get('globalVariables'); - } else if (symbol.kind === SymbolKind.Field) { - if (symbol.storage === StorageClass.Static) { - return get('staticMemberVariables'); - } - return get('memberVariables'); - } else { - for (const name of Object.keys(semanticTypes)) { - const kinds = semanticTypes[name]; - if (kinds.some((e) => e === symbol.kind)) { - return get(name); - } - } + switch (symbol.kind) { + // Functions + case SymbolKind.Method: + case SymbolKind.Constructor: + return get('memberFunction'); + case SymbolKind.Function: + return get('function'); + case CclsSymbolKind.StaticMethod: + return get('staticMemberFunction'); + + // Types + case SymbolKind.Namespace: + return get('namespace'); + case SymbolKind.Class: + case SymbolKind.Struct: + case SymbolKind.Enum: + case SymbolKind.TypeParameter: + return get('type'); + case CclsSymbolKind.TypeAlias: + return get('typeAlias'); + + // Variables + case SymbolKind.Field: + if (symbol.storage === StorageClass.Static) + return get('staticMemberVariable'); + return get('memberVariable'); + case SymbolKind.Variable: + if (symbol.storage === StorageClass.Static) + return get('staticVariable'); + if (symbol.parentKind === SymbolKind.File || + symbol.parentKind === SymbolKind.Namespace) + return get('globalVariable'); + return get('variable'); + case SymbolKind.EnumMember: + return get('enum'); + case CclsSymbolKind.Parameter: + return get('parameter'); + case CclsSymbolKind.Macro: + return get('macro'); } } diff --git a/src/serverContext.ts b/src/serverContext.ts index d967656..46f139e 100644 --- a/src/serverContext.ts +++ b/src/serverContext.ts @@ -35,7 +35,7 @@ import { DataFlowHierarchyProvider } from "./hierarchies/dataFlowHierarchy"; import { InheritanceHierarchyProvider } from "./hierarchies/inheritanceHierarchy"; import { MemberHierarchyProvider } from "./hierarchies/memberHierarchy"; import { InactiveRegionsProvider } from "./inactiveRegions"; -import { PublishSemanticHighlightArgs, SemanticContext, semanticTypes } from "./semantic"; +import { PublishSemanticHighlightArgs, SemanticContext, semanticKinds } from "./semantic"; import { StatusBarIconProvider } from "./statusBarIcon"; import { ClientConfig, IHierarchyNode } from './types'; import { disposeAll, normalizeUri, unwrap, wait } from "./utils"; @@ -79,9 +79,10 @@ function flatObject(obj: any, pref = ""): Map { function getClientConfig(wsRoot: string): ClientConfig { function hasAnySemanticHighlight() { - const hlconfig = workspace.getConfiguration('ccls.highlighting.enabled'); - for (const name of Object.keys(semanticTypes)) { - if (hlconfig.get(name, false)) + const config = workspace.getConfiguration('ccls'); + for (const kind of semanticKinds) { + const face = config.get(`highlight.${kind}.face`, []); + if (face.length > 0) return true; } return false; @@ -158,7 +159,7 @@ function getClientConfig(wsRoot: string): ClientConfig { const configBlacklist = new Set([ 'codeLens.enabled', 'codeLens.renderInline', - 'highlighting', + 'highlight', 'misc.showInactiveRegions', 'theme', 'trace', @@ -281,7 +282,7 @@ export class ServerContext implements Disposable { "ccls.hackGotoForTreeView", this.hackGotoForTreeView, this )); - // Semantic highlighting + // Semantic highlight const semantic = new SemanticContext(); this._dispose.push(semantic); this.client.onNotification('$ccls/publishSemanticHighlight', From d7a0fa54c971d059f21ac2c0d56894af3043f3e0 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Mon, 14 Oct 2019 22:14:59 -0700 Subject: [PATCH 16/22] Bump to 0.1.28 and refactor packaging --- .vscodeignore | 7 ++++--- README-dev.md | 34 ---------------------------------- README.md | 9 ++++----- build.py | 11 ----------- package-lock.json | 2 +- package.json | 9 +++++---- publish.py | 17 ----------------- 7 files changed, 14 insertions(+), 75 deletions(-) delete mode 100644 README-dev.md delete mode 100755 build.py delete mode 100755 publish.py diff --git a/.vscodeignore b/.vscodeignore index 9c93657..c8074bb 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -1,6 +1,7 @@ .vscode/** src/** +**/.* **/*.map -.gitignore -build.cmd -tsconfig.json \ No newline at end of file +**/*.ts +tsconfig.json +tslint.json diff --git a/README-dev.md b/README-dev.md deleted file mode 100644 index 1c83bb0..0000000 --- a/README-dev.md +++ /dev/null @@ -1,34 +0,0 @@ -# ccls - -This is the Visual Studio Code extension for ccls, which originates from cquery. - -The main ccls language server which powers this extension is found at -. - -# Building - -## Dependencies - -Make sure you have `npm` installed. - -## Build - -```bash -npm install -python build.py -``` - -Now, you can use vscode to install `out/ccls.vsix`. - -# Deploying - -To deploy a new release to the marketplace, simply run `publish.py` with a -clean working directory. By default a patch release is performed. - -```bash -python publish.py [patch|minor|major] -``` - -# LICENSE - -MIT diff --git a/README.md b/README.md index 03f9614..0c7b6ca 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,9 @@ # vscode-ccls -This is the Visual Studio Code extension for [ccls](https://github.com/MaskRay/ccls). - -![](https://ptpb.pw/ScXs.jpg) +This is the Visual Studio Code extension for [ccls](https://github.com/MaskRay/ccls), +a C/C++/ObjC language server supporting cross references, hierarchies, completion and semantic highlighting. See: -* [Home](https://github.com/MaskRay/ccls/wiki/Home) -* [Visual Studio Code](https://github.com/MaskRay/ccls/wiki/Visual-Studio-Code) +* [ccls/wiki/Home](https://github.com/MaskRay/ccls/wiki/Home) +* [ccls/wiki/Visual Studio Code](https://github.com/MaskRay/ccls/wiki/Visual-Studio-Code) diff --git a/build.py b/build.py deleted file mode 100755 index 29c9136..0000000 --- a/build.py +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env python - -import subprocess -import sys -from os.path import join - -if __name__ == "__main__": - OUT = 'out/ccls.vsix' - VSCE = 'vsce.cmd' if sys.platform == 'win32' else 'vsce' - VSCE = join('node_modules', '.bin', VSCE) - sys.exit(subprocess.call([VSCE, 'package', '-o', OUT])) diff --git a/package-lock.json b/package-lock.json index 6598fbe..f173c00 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ccls", - "version": "0.1.23", + "version": "0.1.27", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 0b2d775..446a069 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "description": "C/C++/ObjC language server supporting cross references, hierarchies, completion and semantic highlight", "author": "ccls-project", "license": "MIT", - "version": "0.1.23", + "version": "0.1.28", "publisher": "ccls-project", "scripts": { "vscode:prepublish": "npm run lint && npm run compile", @@ -27,14 +27,15 @@ }, "repository": { "type": "git", - "url": "https://github.com/MaskRay/vscode-ccls.git" + "url": "https://github.com/MaskRay/vscode-ccls" }, - "preview": true, "engines": { "vscode": "^1.36.0" }, "categories": [ - "Programming Languages" + "Programming Languages", + "Linters", + "Snippets" ], "activationEvents": [ "onLanguage:c", diff --git a/publish.py b/publish.py deleted file mode 100755 index 0f17b8d..0000000 --- a/publish.py +++ /dev/null @@ -1,17 +0,0 @@ -#!/usr/bin/env python - -import subprocess -import sys - -if __name__ == "__main__": - # patch|minor|major - CMD = 'patch' - if len(sys.argv) > 1 and sys.argv[1]: - CMD = sys.argv[1] - - # patch | minor | major - if subprocess.call(['npm', 'version', CMD]) != 0: - sys.exit(1) - sys.exit(subprocess.call(['git', 'push', 'origin', 'master', '--follow-tags'])) - - From eb2b291f6b1cff52b1491c3c14a21e30d10b8af6 Mon Sep 17 00:00:00 2001 From: Benjamin Navarro Date: Tue, 15 Oct 2019 15:48:29 +0200 Subject: [PATCH 17/22] trigger workspace/didChangeConfiguration on compilation database modification --- package-lock.json | 2 +- package.json | 5 +++++ src/serverContext.ts | 8 ++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index f173c00..43ca77a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ccls", - "version": "0.1.27", + "version": "0.1.28", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 446a069..6d3ba14 100644 --- a/package.json +++ b/package.json @@ -666,6 +666,11 @@ "default": 15, "description": "Number of lines of the initializer / macro definition showed in hover." }, + "ccls.index.reloadDatabaseOnChange": { + "type": "boolean", + "default": true, + "description": "Reload the compilation database when it is modified." + }, "ccls.codeLens.renderInline": { "type": "boolean", "default": false, diff --git a/src/serverContext.ts b/src/serverContext.ts index 46f139e..8ea1a62 100644 --- a/src/serverContext.ts +++ b/src/serverContext.ts @@ -299,6 +299,14 @@ export class ServerContext implements Disposable { } this._dispose.push(commands.registerCommand("ccls.reload", this.reloadIndex, this)); + + if (config.get("index.reloadDatabaseOnChange", true)) { + const db_watcher = workspace.createFileSystemWatcher(this.cwd + "/compile_commands.json", false, false, false); + this._dispose.push(db_watcher); + db_watcher.onDidChange((e: Uri) => { + this.client.sendNotification("workspace/didChangeConfiguration"); + }); + } } public async stop() { From b8b9400330aecfb79ca8556a151eff2fc1f36382 Mon Sep 17 00:00:00 2001 From: Benjamin Navarro Date: Wed, 16 Oct 2019 08:14:21 +0200 Subject: [PATCH 18/22] coding sytle --- src/serverContext.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/serverContext.ts b/src/serverContext.ts index 8ea1a62..ab63dec 100644 --- a/src/serverContext.ts +++ b/src/serverContext.ts @@ -300,7 +300,7 @@ export class ServerContext implements Disposable { this._dispose.push(commands.registerCommand("ccls.reload", this.reloadIndex, this)); - if (config.get("index.reloadDatabaseOnChange", true)) { + if (config.get('index.reloadDatabaseOnChange', true)) { const db_watcher = workspace.createFileSystemWatcher(this.cwd + "/compile_commands.json", false, false, false); this._dispose.push(db_watcher); db_watcher.onDidChange((e: Uri) => { From 1126269df6e56f221951022bc470c2a138e014ef Mon Sep 17 00:00:00 2001 From: Benjamin Navarro Date: Mon, 28 Oct 2019 19:27:02 +0100 Subject: [PATCH 19/22] Use compilationDatabaseDirectory if specified --- src/serverContext.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/serverContext.ts b/src/serverContext.ts index ab63dec..dadf98b 100644 --- a/src/serverContext.ts +++ b/src/serverContext.ts @@ -301,7 +301,11 @@ export class ServerContext implements Disposable { this._dispose.push(commands.registerCommand("ccls.reload", this.reloadIndex, this)); if (config.get('index.reloadDatabaseOnChange', true)) { - const db_watcher = workspace.createFileSystemWatcher(this.cwd + "/compile_commands.json", false, false, false); + let db_dir = config.get('misc.compilationDatabaseDirectory'); + if (!db_dir || db_dir === '') { + db_dir = this.cwd; + } + const db_watcher = workspace.createFileSystemWatcher(db_dir + "/compile_commands.json", false, false, false); this._dispose.push(db_watcher); db_watcher.onDidChange((e: Uri) => { this.client.sendNotification("workspace/didChangeConfiguration"); From e00cdc3a074b9115bbf107ce9f201e22fde2d92a Mon Sep 17 00:00:00 2001 From: Benjamin Navarro Date: Tue, 29 Oct 2019 12:08:52 +0100 Subject: [PATCH 20/22] coding style --- src/serverContext.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/serverContext.ts b/src/serverContext.ts index dadf98b..dcc5ce1 100644 --- a/src/serverContext.ts +++ b/src/serverContext.ts @@ -302,10 +302,9 @@ export class ServerContext implements Disposable { if (config.get('index.reloadDatabaseOnChange', true)) { let db_dir = config.get('misc.compilationDatabaseDirectory'); - if (!db_dir || db_dir === '') { + if (!db_dir || db_dir === '') db_dir = this.cwd; - } - const db_watcher = workspace.createFileSystemWatcher(db_dir + "/compile_commands.json", false, false, false); + const db_watcher = workspace.createFileSystemWatcher(db_dir + '/compile_commands.json', false, false, false); this._dispose.push(db_watcher); db_watcher.onDidChange((e: Uri) => { this.client.sendNotification("workspace/didChangeConfiguration"); From 8b9c58c9460dc503b54e45f26715a1668d232fb5 Mon Sep 17 00:00:00 2001 From: Benjamin Navarro Date: Sat, 9 May 2020 16:53:31 +0200 Subject: [PATCH 21/22] feat: resolve possible symlinks before db modification watching Watching a symlink instead of the target file won't actually trigger a db reloading if the symlinked file changes --- package-lock.json | 11 ++++++++--- package.json | 8 +++++++- src/serverContext.ts | 9 +++++++-- 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 43ca77a..9716281 100644 --- a/package-lock.json +++ b/package-lock.json @@ -450,6 +450,11 @@ "mime-types": "^2.1.12" } }, + "fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha1-invTcYa23d84E/I4WLV+yq9eQdQ=" + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -549,9 +554,9 @@ } }, "https-proxy-agent": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.2.tgz", - "integrity": "sha512-c8Ndjc9Bkpfx/vCJueCPy0jlP4ccCCSNDp8xwCZzPjKJUm+B+u9WX2x98Qx4n1PiMNTWo3D7KK5ifNV/yJyRzg==", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", "dev": true, "requires": { "agent-base": "^4.3.0", diff --git a/package.json b/package.json index 6d3ba14..12630e4 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,8 @@ }, "dependencies": { "vscode-languageclient": "^5.2.1", - "ws": "^6.2.1" + "ws": "^6.2.1", + "fs": "^0.0.1-security" }, "repository": { "type": "git", @@ -741,5 +742,10 @@ } } } + }, + "__metadata": { + "id": "8e21d425-1e30-4072-8436-786a9017e5c7", + "publisherDisplayName": "ccls-project", + "publisherId": "c8f976c9-da3f-47d4-a344-bc810b73caed" } } diff --git a/src/serverContext.ts b/src/serverContext.ts index dcc5ce1..a9aba32 100644 --- a/src/serverContext.ts +++ b/src/serverContext.ts @@ -1,4 +1,5 @@ import * as cp from "child_process"; +import * as fs from 'fs'; import { CancellationToken, CodeLens, @@ -304,7 +305,11 @@ export class ServerContext implements Disposable { let db_dir = config.get('misc.compilationDatabaseDirectory'); if (!db_dir || db_dir === '') db_dir = this.cwd; - const db_watcher = workspace.createFileSystemWatcher(db_dir + '/compile_commands.json', false, false, false); + const db_path = db_dir + '/compile_commands.json'; + // resolve db_path in case it is a symlink, otherwise the file system watcher + // won't catch modifications of the linked file + const db_real_path = fs.realpathSync(db_path); + const db_watcher = workspace.createFileSystemWatcher(db_real_path, false, false, false); this._dispose.push(db_watcher); db_watcher.onDidChange((e: Uri) => { this.client.sendNotification("workspace/didChangeConfiguration"); @@ -465,7 +470,7 @@ export class ServerContext implements Disposable { documentSelector: ['c', 'cpp', 'objective-c', 'objective-cpp'], // synchronize: { // configurationSection: 'ccls', - // fileEvents: workspace.createFileSystemWatcher('**/.cc') + // fileEvents: workspace.createfsWatcher('**/.cc') // }, errorHandler: new CclsErrorHandler(config), initializationFailedHandler: (e) => { From 2490a948a5c812f21dcd66e70aa0c1cfb6dd5dd3 Mon Sep 17 00:00:00 2001 From: Benjamin Navarro Date: Sat, 9 May 2020 17:10:01 +0200 Subject: [PATCH 22/22] feat: integrate dataflow PR from official project --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 12630e4..94e6c21 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "description": "C/C++/ObjC language server supporting cross references, hierarchies, completion and semantic highlight", "author": "ccls-project", "license": "MIT", - "version": "0.1.28", + "version": "0.1.29", "publisher": "ccls-project", "scripts": { "vscode:prepublish": "npm run lint && npm run compile",