From fb68586524dacf86549329c6e73e7643c68a7b5e Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Sun, 7 Oct 2018 07:28:23 -0600 Subject: [PATCH 01/87] Switch from tslint-microsoft-contrib to tslint-config-standard --- package-lock.json | 68 +++++++++++++++++++++++++++++++++++++++++++---- package.json | 3 ++- tslint.json | 2 +- 3 files changed, 66 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index 395f59e4f..40a888892 100644 --- a/package-lock.json +++ b/package-lock.json @@ -390,6 +390,30 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==" }, + "doctrine": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", + "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", + "dev": true, + "requires": { + "esutils": "^1.1.6", + "isarray": "0.0.1" + }, + "dependencies": { + "esutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", + "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", @@ -2021,15 +2045,49 @@ "integrity": "sha512-assE77K7K8Q9j8CVIHiU3d1uoKc8N5v7UPpkQ9IE8BEPWkvSYR37lDuYekDlAMFqR1IpD6CrS+uOJLl6pw7Wdw==", "dev": true }, - "tslint-microsoft-contrib": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.0.3.tgz", - "integrity": "sha512-5AnfTGlfpUzpRHLmoojPBKFTTmbjnwgdaTHMdllausa4GBPya5u36i9ddrTX4PhetGZvd4JUYIpAmgHqVnsctg==", + "tslint-config-standard": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/tslint-config-standard/-/tslint-config-standard-8.0.1.tgz", + "integrity": "sha512-OWG+NblgjQlVuUS/Dmq3ax2v5QDZwRx4L0kEuDi7qFY9UI6RJhhNfoCV1qI4el8Fw1c5a5BTrjQJP0/jhGXY/Q==", "dev": true, "requires": { - "tsutils": "^2.12.1" + "tslint-eslint-rules": "^5.3.1" } }, + "tslint-eslint-rules": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", + "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", + "dev": true, + "requires": { + "doctrine": "0.7.2", + "tslib": "1.9.0", + "tsutils": "^3.0.0" + }, + "dependencies": { + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", + "dev": true + }, + "tsutils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.0.0.tgz", + "integrity": "sha512-LjHBWR0vWAUHWdIAoTjoqi56Kz+FDKBgVEuL+gVPG/Pv7QW5IdaDDeK9Txlr6U0Cmckp5EgCIq1T25qe3J6hyw==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } + } + }, + "tslint-no-circular-imports": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/tslint-no-circular-imports/-/tslint-no-circular-imports-0.6.1.tgz", + "integrity": "sha512-XuRgHZKFu6dv7fm/tuilmvynLHgtCTd63/p3744dYVEpnMExp2Jd9IwTiBOGmy5bUDlpTy117vtBcLd028RsBA==", + "dev": true + }, "tsutils": { "version": "2.27.1", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.1.tgz", diff --git a/package.json b/package.json index bb51bc4cf..dd1bc4535 100644 --- a/package.json +++ b/package.json @@ -68,7 +68,8 @@ "run-sequence": "*", "tslint": "^5.9.1", "tslint-config-prettier": "^1.10.0", - "tslint-microsoft-contrib": "^5.0.3", + "tslint-config-standard": "^8.0.1", + "tslint-no-circular-imports": "^0.6.1", "typescript": "^2.9.2", "vscode-debugadapter-testsupport": "^1.19.0" }, diff --git a/tslint.json b/tslint.json index 8b80f194f..994e93316 100644 --- a/tslint.json +++ b/tslint.json @@ -1,6 +1,6 @@ { "defaultSeverity": "warning", - "extends": ["tslint-microsoft-contrib", "tslint-config-prettier"], + "extends": ["tslint-config-standard", "tslint-no-circular-imports", "tslint-config-prettier"], "jsRules": {}, "rules": { "missing-jsdoc": false, From 4a457165f4aaecad9b20719eb9db8c72a6336fe7 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Sun, 7 Oct 2018 08:18:21 -0600 Subject: [PATCH 02/87] Add a Provider abstract class --- server/src/providers/Provider.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 server/src/providers/Provider.ts diff --git a/server/src/providers/Provider.ts b/server/src/providers/Provider.ts new file mode 100644 index 000000000..013f176b0 --- /dev/null +++ b/server/src/providers/Provider.ts @@ -0,0 +1,16 @@ +import { IConnection } from 'vscode-languageserver'; +import { IForest } from '../Forest'; + +export default abstract class Provider { + protected connection: IConnection; + protected forest: IForest; + + static register(connection: IConnection, forest: IForest) { + throw new Error('Register is not implemented!'); + } + + constructor(connection: IConnection, forest: IForest) { + this.connection = connection; + this.forest = forest; + } +} From f0b9e09b76e59c2f30c4e1aa7725478e2544402e Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Sun, 7 Oct 2018 08:19:12 -0600 Subject: [PATCH 03/87] Convert providers to inherit from Provider and use static register function --- server/src/Server.ts | 12 ++++++------ server/src/providers/ASTProvider.ts | 12 +++++++----- server/src/providers/DocumentHighlightProvider.ts | 11 ++++++----- server/src/providers/FoldingRangeProvider.ts | 12 +++++++----- 4 files changed, 26 insertions(+), 21 deletions(-) diff --git a/server/src/Server.ts b/server/src/Server.ts index d37d9ee04..1d6653c28 100644 --- a/server/src/Server.ts +++ b/server/src/Server.ts @@ -2,9 +2,9 @@ import { Connection, InitializeParams, InitializeResult } from 'vscode-languages import { CapabilityCalculator } from './CapabilityCalculator'; import { Forest } from './Forest'; -import { ASTProvider } from './providers/ASTProvider'; -import { DocumentHighlightProvider } from './providers/DocumentHighlightProvider'; -import { FoldingRangeProvider } from './providers/FoldingRangeProvider'; +import ASTProvider from './providers/ASTProvider'; +import DocumentHighlightProvider from './providers/DocumentHighlightProvider'; +import FoldingRangeProvider from './providers/FoldingRangeProvider'; export interface ILanguageServer { readonly capabilities: InitializeResult; @@ -30,8 +30,8 @@ export class Server implements ILanguageServer { } private registerProviders(): void { - new ASTProvider(this.connection, this.forest); - new DocumentHighlightProvider(this.connection, this.forest); - new FoldingRangeProvider(this.connection, this.forest); + ASTProvider.register(this.connection, this.forest); + DocumentHighlightProvider.register(this.connection, this.forest); + FoldingRangeProvider.register(this.connection, this.forest); } } diff --git a/server/src/providers/ASTProvider.ts b/server/src/providers/ASTProvider.ts index 9cc9910bd..1cbab62c2 100644 --- a/server/src/providers/ASTProvider.ts +++ b/server/src/providers/ASTProvider.ts @@ -19,15 +19,17 @@ import { import { IForest } from '../Forest'; import { Position } from '../Position'; +import Provider from './Provider'; -export class ASTProvider { - private connection: IConnection; - private forest: IForest; +export default class ASTProvider extends Provider { private parser: Parser; + static register(connection: IConnection, forest: IForest) { + return new ASTProvider(connection, forest); + } + constructor(connection: IConnection, forest: IForest) { - this.connection = connection; - this.forest = forest; + super(connection, forest); this.parser = new Parser(); this.parser.setLanguage(TreeSitterRuby); diff --git a/server/src/providers/DocumentHighlightProvider.ts b/server/src/providers/DocumentHighlightProvider.ts index 104b3ff2c..2ddad0136 100644 --- a/server/src/providers/DocumentHighlightProvider.ts +++ b/server/src/providers/DocumentHighlightProvider.ts @@ -14,10 +14,11 @@ import { } from 'vscode-languageserver'; import { IForest } from '../Forest'; import { Position } from '../Position'; +import Provider from './Provider'; // TODO support more highlight use cases than just balanced pairs -export class DocumentHighlightProvider { +export default class DocumentHighlightProvider extends Provider { private readonly BEGIN_TYPES: Set = new Set([ 'begin', 'def', @@ -29,12 +30,12 @@ export class DocumentHighlightProvider { 'module', ]); - private connection: IConnection; - private forest: IForest; + static register(connection: IConnection, forest: IForest) { + return new DocumentHighlightProvider(connection, forest); + } constructor(connection: IConnection, forest: IForest) { - this.connection = connection; - this.forest = forest; + super(connection, forest); this.connection.onDocumentHighlight(this.handleDocumentHighlight); } diff --git a/server/src/providers/FoldingRangeProvider.ts b/server/src/providers/FoldingRangeProvider.ts index 4b0533c89..efb31da1c 100644 --- a/server/src/providers/FoldingRangeProvider.ts +++ b/server/src/providers/FoldingRangeProvider.ts @@ -13,10 +13,9 @@ import { IConnection, } from 'vscode-languageserver'; import { IForest } from '../Forest'; +import Provider from './Provider'; -export class FoldingRangeProvider { - private connection: IConnection; - private forest: IForest; +export default class FoldingRangeProvider extends Provider { private readonly FOLD_CONSTRUCTS: Set = new Set([ 'begin', 'def', @@ -28,9 +27,12 @@ export class FoldingRangeProvider { 'module', ]); + static register(connection: IConnection, forest: IForest) { + return new FoldingRangeProvider(connection, forest); + } + constructor(connection: IConnection, forest: IForest) { - this.connection = connection; - this.forest = forest; + super(connection, forest); this.connection.onRequest(FoldingRangeRequest.type, this.handleFoldingRange); } From ad7d9f655a68f32e545b6a90876b17832575a273 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Sun, 7 Oct 2018 08:28:02 -0600 Subject: [PATCH 04/87] Set esModuleInterop to true See https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-7.html#support-for-import-d-from-cjs-form-commonjs-modules-with---esmoduleinterop --- tsconfig.base.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tsconfig.base.json b/tsconfig.base.json index adf6abdfd..8e867e568 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -4,6 +4,7 @@ "noImplicitReturns": true, "noUnusedLocals": true, "noUnusedParameters": true, - "sourceMap": true + "sourceMap": true, + "esModuleInterop": true } } From 5239578b84e776744d8bb226bb3ea4ec2f5bf1b4 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Sun, 7 Oct 2018 08:29:46 -0600 Subject: [PATCH 05/87] Watch .ruby-version and .rvmrc files in language server client --- client/src/extension.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/extension.ts b/client/src/extension.ts index f3963a237..6ba0ea691 100644 --- a/client/src/extension.ts +++ b/client/src/extension.ts @@ -32,8 +32,8 @@ export function activate(context: ExtensionContext): void { documentSelector: rubyDocumentSelector, synchronize: { configurationSection: 'ruby', - // Notify the server about file changes to '.clientrc files contain in the workspace - fileEvents: workspace.createFileSystemWatcher('**/.clientrc'), + // Notify server of changes to .ruby-version or .rvmrc files + fileEvents: workspace.createFileSystemWatcher('**/{.ruby-version,.rvmrc}'), }, }; From 450e6e3859915bd0848dbc32ded3446d17c97cae Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Sun, 7 Oct 2018 09:23:32 -0600 Subject: [PATCH 06/87] Add execa and default-shell to server --- server/package-lock.json | 100 +++++++++++++++++++++++++++++++++++++-- server/package.json | 2 + 2 files changed, 99 insertions(+), 3 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index 38f025c4a..902760e91 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -423,6 +423,18 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, "cryptiles": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", @@ -489,6 +501,11 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, + "default-shell": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/default-shell/-/default-shell-1.0.1.tgz", + "integrity": "sha1-dSMEvdxhdPSespy5iP7qC4gTyLw=" + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -564,6 +581,20 @@ "es5-ext": "~0.10.14" } }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, "execspawn": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/execspawn/-/execspawn-1.0.1.tgz", @@ -657,6 +688,25 @@ "wide-align": "^1.1.0" } }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -866,6 +916,11 @@ "integrity": "sha1-TBEDO11dlNbqs3dd7cm+fQCDJfE=", "dev": true }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -880,8 +935,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isstream": { "version": "0.1.2", @@ -1098,6 +1152,11 @@ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, "node-abi": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.4.3.tgz", @@ -1206,6 +1265,14 @@ "which": "^1.2.10" } }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, "npm-which": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", @@ -1311,6 +1378,11 @@ "os-tmpdir": "^1.0.0" } }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, "path-array": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz", @@ -1326,6 +1398,11 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -1520,6 +1597,19 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -1627,6 +1717,11 @@ "ansi-regex": "^2.0.0" } }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -1966,7 +2061,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, "requires": { "isexe": "^2.0.0" } diff --git a/server/package.json b/server/package.json index 20ec498cb..7203aee9b 100644 --- a/server/package.json +++ b/server/package.json @@ -7,6 +7,8 @@ "license": "MIT", "private": false, "dependencies": { + "default-shell": "^1.0.1", + "execa": "^1.0.0", "prebuild-install": "^5.0.0", "tree-sitter": "^0.13.4", "tree-sitter-ruby": "^0.13.5", From 231fb4daade844bd56be477ec92485f9650ccca5 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Tue, 9 Oct 2018 16:16:32 -0600 Subject: [PATCH 07/87] Update vscode-languageclient to ^5.1.0 --- client/package-lock.json | 31 ++++++++++++++++--------------- client/package.json | 2 +- 2 files changed, 17 insertions(+), 16 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 00e29e596..b289d113e 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1744,31 +1744,32 @@ } }, "vscode-jsonrpc": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-3.6.2.tgz", - "integrity": "sha512-T24Jb5V48e4VgYliUXMnZ379ItbrXgOimweKaJshD84z+8q7ZOZjJan0MeDe+Ugb+uqERDVV8SBmemaGMSMugA==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", + "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" }, "vscode-languageclient": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-4.4.0.tgz", - "integrity": "sha512-sXBwIcwG4W5MjnDAfXf0hM5ErOcXxEBlix6QJb5ijf0gtecYygrMAqv8hag7sEg/jCCOKQdXJ4K1iZL3GZcJZg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-5.1.0.tgz", + "integrity": "sha512-Z95Kps8UqD4o17HE3uCkZuvenOsxHVH46dKmaGVpGixEFZigPaVuVxLM/JWeIY9aRenoC0ZD9CK1O7L4jpffKg==", "requires": { - "vscode-languageserver-protocol": "^3.10.0" + "semver": "^5.5.0", + "vscode-languageserver-protocol": "3.13.0" } }, "vscode-languageserver-protocol": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.10.0.tgz", - "integrity": "sha512-PNNmKM0IcQPRiY1oUIxfwseBvxS5Sa5aZUpTcq/qsXWclnl8FFNs8oCCoAtyLhBXnuJvybWUNafiA78y0unJDA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.13.0.tgz", + "integrity": "sha512-2ZGKwI+P2ovQll2PGAp+2UfJH+FK9eait86VBUdkPd9HRlm8e58aYT9pV/NYanHOcp3pL6x2yTLVCFMcTer0mg==", "requires": { - "vscode-jsonrpc": "^3.6.2", - "vscode-languageserver-types": "^3.10.0" + "vscode-jsonrpc": "^4.0.0", + "vscode-languageserver-types": "3.13.0" } }, "vscode-languageserver-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.10.0.tgz", - "integrity": "sha512-vxmCsVZGwq8X40SuLP8Ix7V0rq5V/7iQUjRVe2Oxm+TbmjxtjK4dpHHXQCUawjA4fhPA9FwjSRbDhbvQmYCfMw==" + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.13.0.tgz", + "integrity": "sha512-BnJIxS+5+8UWiNKCP7W3g9FlE7fErFw0ofP5BXJe7c2tl0VeWh+nNHFbwAS2vmVC4a5kYxHBjRy0UeOtziemVA==" }, "wrappy": { "version": "1.0.2", diff --git a/client/package.json b/client/package.json index 28d3623fc..153ff36ba 100644 --- a/client/package.json +++ b/client/package.json @@ -12,7 +12,7 @@ "main": "out/extension.js", "dependencies": { "vscode": "^1.1.18", - "vscode-languageclient": "^4.4.0" + "vscode-languageclient": "^5.1.0" }, "scripts": { "postinstall": "vscode-install" From 672587df3441ac99e5ab0ed5b06ff9bf2144473d Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Tue, 9 Oct 2018 16:17:01 -0600 Subject: [PATCH 08/87] Call client.stop on plugin deactivation --- client/src/extension.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/client/src/extension.ts b/client/src/extension.ts index 6ba0ea691..3a3f14550 100644 --- a/client/src/extension.ts +++ b/client/src/extension.ts @@ -3,7 +3,7 @@ */ import * as path from 'path'; -import { ExtensionContext, workspace } from 'vscode'; +import { ExtensionContext, window, workspace } from 'vscode'; import { LanguageClient, LanguageClientOptions, @@ -11,6 +11,8 @@ import { TransportKind, } from 'vscode-languageclient'; +let client: LanguageClient; + export function activate(context: ExtensionContext): void { const serverModule: string = context.asAbsolutePath(path.join('server', 'out', 'index.js')); const debugOptions: { execArgv: string[] } = { execArgv: ['--nolazy', '--inspect=6009'] }; @@ -35,10 +37,11 @@ export function activate(context: ExtensionContext): void { // Notify server of changes to .ruby-version or .rvmrc files fileEvents: workspace.createFileSystemWatcher('**/{.ruby-version,.rvmrc}'), }, + outputChannel: window.createOutputChannel('Ruby'), }; // Create the language client and start the client. - const client: LanguageClient = new LanguageClient('ruby', 'Ruby', serverOptions, clientOptions); + client = new LanguageClient('ruby', 'Ruby', serverOptions, clientOptions); client.registerProposedFeatures(); // Push the disposable to the context's subscriptions so that the @@ -46,6 +49,6 @@ export function activate(context: ExtensionContext): void { context.subscriptions.push(client.start()); } -export function deactivate(): void { - return undefined; +export function deactivate(): Thenable { + return client ? client.stop() : undefined; } From 105acef757784725a9ce54c4eb0427d0d8b535ff Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Tue, 9 Oct 2018 16:17:33 -0600 Subject: [PATCH 09/87] Dependency updates in the server --- server/package-lock.json | 92 +++++++++++++++------------------------- server/package.json | 8 ++-- 2 files changed, 39 insertions(+), 61 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index 902760e91..40ffe12ba 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1142,9 +1142,9 @@ "dev": true }, "nan": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.10.0.tgz", - "integrity": "sha512-bAdJv7fBLhWC+/Bls0Oza+mvTaNQtP+1RyhhhvD95pgUJz6XM5IzgmxOkItJ9tkoCiplvAnXI1tNmmUD/eScyA==" + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", + "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==" }, "next-tick": { "version": "1.0.0", @@ -1865,50 +1865,21 @@ "dev": true }, "tree-sitter": { - "version": "0.13.4", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.13.4.tgz", - "integrity": "sha512-n5VnUEX8WJMDwC749S2DSSrzafTrvM0Q7JqC8OgfVMvvxTsFu7I84oUhGZNmOSlwDYUqdoByyOMFVcvDHb/QRA==", + "version": "0.13.15", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.13.15.tgz", + "integrity": "sha512-FuvU+csO7t/rQqLdL3+w4Jg+4Zl22Y4uCi4L9X/qJG57Zn71ZzP3oHtDSRgpiIms6g3Y7cEJvF7K/rCw11q92Q==", "requires": { "nan": "^2.10.0", "prebuild-install": "^5.0.0" } }, "tree-sitter-ruby": { - "version": "0.13.5", - "resolved": "https://registry.npmjs.org/tree-sitter-ruby/-/tree-sitter-ruby-0.13.5.tgz", - "integrity": "sha512-Trg4EOKkL1yx0y74f/b5YVvqUYO1cBNUpGsfltDqizPdO3yfLTykBZZgd31N1l9HEiaZs1iNp6vsvdpnLQ1d3w==", + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/tree-sitter-ruby/-/tree-sitter-ruby-0.13.10.tgz", + "integrity": "sha512-IbDvrFc4MazC4IvlwCYRfGqy0YL9aSz0M3BmVe+PSOS+SZUvAiphunHiHw81sU+KxXNWelyCvNch3mC80MSqbg==", "requires": { "nan": "^2.10.0", "prebuild-install": "^5.0.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - }, - "prebuild-install": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.0.0.tgz", - "integrity": "sha512-AvcPLFqNz/hDd6o7qLj8i9xB479P9jSjA/p6m4927CRfY3tsmPfyFmD7RKXtdp6I2d1BAIVBgJoj5mxRJDZL4w==", - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^1.0.2", - "github-from-package": "0.0.0", - "minimist": "^1.2.0", - "mkdirp": "^0.5.1", - "node-abi": "^2.2.0", - "noop-logger": "^0.1.1", - "npmlog": "^4.0.1", - "os-homedir": "^1.0.1", - "pump": "^2.0.1", - "rc": "^1.2.7", - "simple-get": "^2.7.0", - "tar-fs": "^1.13.0", - "tunnel-agent": "^0.6.0", - "which-pm-runs": "^1.0.0" - } - } } }, "tunnel-agent": { @@ -2025,37 +1996,44 @@ } }, "vscode-jsonrpc": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-3.6.2.tgz", - "integrity": "sha512-T24Jb5V48e4VgYliUXMnZ379ItbrXgOimweKaJshD84z+8q7ZOZjJan0MeDe+Ugb+uqERDVV8SBmemaGMSMugA==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", + "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" }, "vscode-languageserver": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-4.4.0.tgz", - "integrity": "sha512-NO4JQg286YLSdU11Fko6cke19kwSob3O0bhf6xDxIJuDhUbFy0VEPRB5ITc3riVmp13+Ki344xtqJYmqfcmCrg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.1.0.tgz", + "integrity": "sha512-CIsrgx2Y5VHS317g/HwkSTWYBIQmy0DwEyZPmB2pEpVOhYFwVsYpbiJwHIIyLQsQtmRaO4eA2xM8KPjNSdXpBw==", "requires": { - "vscode-languageserver-protocol": "^3.10.0", - "vscode-uri": "^1.0.3" + "vscode-languageserver-protocol": "3.13.0", + "vscode-uri": "^1.0.6" + }, + "dependencies": { + "vscode-uri": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.6.tgz", + "integrity": "sha512-sLI2L0uGov3wKVb9EB+vIQBl9tVP90nqRvxSoJ35vI3NjxE8jfsE5DSOhWgSunHSZmKS4OCi2jrtfxK7uyp2ww==" + } } }, "vscode-languageserver-protocol": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.10.0.tgz", - "integrity": "sha512-PNNmKM0IcQPRiY1oUIxfwseBvxS5Sa5aZUpTcq/qsXWclnl8FFNs8oCCoAtyLhBXnuJvybWUNafiA78y0unJDA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.13.0.tgz", + "integrity": "sha512-2ZGKwI+P2ovQll2PGAp+2UfJH+FK9eait86VBUdkPd9HRlm8e58aYT9pV/NYanHOcp3pL6x2yTLVCFMcTer0mg==", "requires": { - "vscode-jsonrpc": "^3.6.2", - "vscode-languageserver-types": "^3.10.0" + "vscode-jsonrpc": "^4.0.0", + "vscode-languageserver-types": "3.13.0" } }, "vscode-languageserver-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.10.0.tgz", - "integrity": "sha512-vxmCsVZGwq8X40SuLP8Ix7V0rq5V/7iQUjRVe2Oxm+TbmjxtjK4dpHHXQCUawjA4fhPA9FwjSRbDhbvQmYCfMw==" + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.13.0.tgz", + "integrity": "sha512-BnJIxS+5+8UWiNKCP7W3g9FlE7fErFw0ofP5BXJe7c2tl0VeWh+nNHFbwAS2vmVC4a5kYxHBjRy0UeOtziemVA==" }, "vscode-uri": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.5.tgz", - "integrity": "sha1-O4majvccN/MFTXm9vdoxx7828g0=" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.6.tgz", + "integrity": "sha512-sLI2L0uGov3wKVb9EB+vIQBl9tVP90nqRvxSoJ35vI3NjxE8jfsE5DSOhWgSunHSZmKS4OCi2jrtfxK7uyp2ww==" }, "which": { "version": "1.3.0", diff --git a/server/package.json b/server/package.json index 7203aee9b..83eebf9a7 100644 --- a/server/package.json +++ b/server/package.json @@ -10,10 +10,10 @@ "default-shell": "^1.0.1", "execa": "^1.0.0", "prebuild-install": "^5.0.0", - "tree-sitter": "^0.13.4", - "tree-sitter-ruby": "^0.13.5", - "vscode-languageserver": "^4.4.0", - "vscode-uri": "^1.0.5" + "tree-sitter": "^0.13.15", + "tree-sitter-ruby": "^0.13.10", + "vscode-languageserver": "^5.1.0", + "vscode-uri": "^1.0.6" }, "devDependencies": { "prebuild": "^7.6.0" From 2bed5a8d453aecbb22781b3a18c9dfda5a29459d Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Tue, 9 Oct 2018 16:18:57 -0600 Subject: [PATCH 10/87] Import debounce directly since esModuleInterop is now enabled --- src/providers/linters.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/providers/linters.ts b/src/providers/linters.ts index cec083d3d..8f2a9098c 100644 --- a/src/providers/linters.ts +++ b/src/providers/linters.ts @@ -1,6 +1,6 @@ import * as vscode from 'vscode'; import { ExtensionContext } from 'vscode'; -import * as debounce from 'lodash/debounce'; +import debounce from 'lodash/debounce'; import { LintCollection } from '../lint/lintCollection'; import { Config as LintConfig } from '../lint/lintConfig'; From c3f4b3aada98024297c826cffeb57881786739d3 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Tue, 9 Oct 2018 16:26:49 -0600 Subject: [PATCH 11/87] Add support for loading workspace Ruby environments per workspace root --- server/src/Server.ts | 14 +++++++- server/src/ServerConfiguration.ts | 55 ++++++++++++++++++++++++++++++ server/src/util/env.ts | 56 +++++++++++++++++++++++++++++++ 3 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 server/src/ServerConfiguration.ts create mode 100644 server/src/util/env.ts diff --git a/server/src/Server.ts b/server/src/Server.ts index 1d6653c28..fc2f47a9a 100644 --- a/server/src/Server.ts +++ b/server/src/Server.ts @@ -1,5 +1,11 @@ -import { Connection, InitializeParams, InitializeResult } from 'vscode-languageserver'; +import { + Connection, + InitializeParams, + InitializeResult, + WorkspaceFolder, +} from 'vscode-languageserver'; +import { config } from './ServerConfiguration'; import { CapabilityCalculator } from './CapabilityCalculator'; import { Forest } from './Forest'; import ASTProvider from './providers/ASTProvider'; @@ -21,6 +27,7 @@ export class Server implements ILanguageServer { this.forest = new Forest(); this.registerProviders(); + this.loadWorkspaceEnvironments(params.workspaceFolders); } get capabilities(): InitializeResult { @@ -34,4 +41,9 @@ export class Server implements ILanguageServer { DocumentHighlightProvider.register(this.connection, this.forest); FoldingRangeProvider.register(this.connection, this.forest); } + + private async loadWorkspaceEnvironments(folders: WorkspaceFolder[]): Promise { + const loaders = folders.map(folder => config.loadWorkspaceEnvironment(folder)); + await Promise.all(loaders); + } } diff --git a/server/src/ServerConfiguration.ts b/server/src/ServerConfiguration.ts new file mode 100644 index 000000000..3a4a1ec4b --- /dev/null +++ b/server/src/ServerConfiguration.ts @@ -0,0 +1,55 @@ +import url from 'url'; +import { WorkspaceFolder } from 'vscode-languageserver'; +import { loadEnv, IEnvironment } from './util/env'; + +export type RubyEnvironment = { + PATH: string; + RUBY_VERSION: string; + RUBY_ROOT: string; + GEM_HOME: string; + GEM_PATH: string; + GEM_ROOT: string; +}; + +class ServerConfiguration { + private environments: Map; + + constructor() { + this.environments = new Map(); + } + + public async loadWorkspaceEnvironment(workspaceFolder: WorkspaceFolder): Promise { + const { uri } = workspaceFolder; + const parsed = url.parse(workspaceFolder.uri); + if (parsed.protocol === 'file:') { + console.log(`Loading environment for local workspace ${uri}`); + const environment: IEnvironment = await loadEnv(parsed.path); + this.environments[uri] = this.reduceEnvironment(environment); + } else { + console.log(`Skipping environment load for non-local workspace ${uri}`); + } + } + + public async removeWorkspaceEnvironment(folder: WorkspaceFolder): Promise { + this.environments.delete(folder.uri) && + console.log(`Removed workspace environment ${folder.uri}`); + } + + public environmentFor(folder: WorkspaceFolder): RubyEnvironment { + return this.environments.get(folder.uri); + } + + private reduceEnvironment(environment: IEnvironment): RubyEnvironment { + const { PATH, RUBY_VERSION, RUBY_ROOT, GEM_HOME, GEM_PATH, GEM_ROOT } = environment; + return { + PATH, + RUBY_VERSION, + RUBY_ROOT, + GEM_HOME, + GEM_PATH, + GEM_ROOT, + }; + } +} + +export const config = new ServerConfiguration(); diff --git a/server/src/util/env.ts b/server/src/util/env.ts new file mode 100644 index 000000000..39488014f --- /dev/null +++ b/server/src/util/env.ts @@ -0,0 +1,56 @@ +import execa from 'execa'; +import defaultShell from 'default-shell'; +import fs from 'fs'; +import path from 'path'; + +const SHIM_DIR = path.resolve(__dirname, 'shims'); +if (!fs.existsSync(SHIM_DIR)) { + fs.mkdirSync(SHIM_DIR); +} + +function mkShim(shell: string, shimPath: string): boolean { + const template = `#!/usr/bin/env ${shell} -i\nexport`; + let result = false; + + try { + fs.writeFileSync(shimPath, template); + fs.chmodSync(shimPath, 0o744); + result = true; + } catch (e) { + console.log(e); + } + + return result; +} + +function getShim(shell): string { + const shellName = path.basename(shell); + const shimPath = path.join(SHIM_DIR, `env.${shell}`); + if (!fs.existsSync(shimPath)) { + mkShim(shellName, shimPath); + } + + return shimPath; +} + +export interface IEnvironment { + [key: string]: string; +} + +export async function loadEnv(cwd: string): Promise { + const shellName: string = path.basename(defaultShell); + const env: IEnvironment = {}; + const shim: string = getShim(shellName); + const { stdout, stderr } = await execa(shim, [], { + cwd, + }); + + console.error(stderr); + + for (const envVar of stdout.split('\n')) { + const result: string[] = envVar.split('=', 2); + env[result[0]] = result[1]; + } + + return env; +} From 85be9a45db053d78e5557f67ec40b5e9c92b9816 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Tue, 9 Oct 2018 16:27:32 -0600 Subject: [PATCH 12/87] Add DiagnosticsProvider stub --- server/src/providers/DiagnosticsProvider.ts | 22 +++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 server/src/providers/DiagnosticsProvider.ts diff --git a/server/src/providers/DiagnosticsProvider.ts b/server/src/providers/DiagnosticsProvider.ts new file mode 100644 index 000000000..6ec2c33fa --- /dev/null +++ b/server/src/providers/DiagnosticsProvider.ts @@ -0,0 +1,22 @@ +import { + IConnection, + DidOpenTextDocumentParams, + DidChangeTextDocumentParams, +} from 'vscode-languageserver'; +import { IForest } from '../Forest'; + +import Provider from './Provider'; + +export default class DiagnosticsProvider extends Provider { + static register(connection: IConnection, forest: IForest) { + return new DiagnosticsProvider(connection, forest); + } + + constructor(connection: IConnection, forest: IForest) { + super(connection, forest); + } + + public computeDiagnostics = async ( + _params: DidOpenTextDocumentParams | DidChangeTextDocumentParams + ) => {}; +} From b8effa6b9dde425c9dfbd47965a6e33b19ed4fe4 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Tue, 9 Oct 2018 16:40:51 -0600 Subject: [PATCH 13/87] Removed unnecessary tslint:disable --- server/src/util/rebuilder.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/util/rebuilder.ts b/server/src/util/rebuilder.ts index a9d049ec5..d382e13fe 100644 --- a/server/src/util/rebuilder.ts +++ b/server/src/util/rebuilder.ts @@ -26,7 +26,6 @@ function downloadUrl(name: string, version: string): string { function fetchPrebuild(name: string): Promise { const pkgRoot: string = path.resolve(path.join(__dirname, '../../node_modules', name)); - //tslint:disable-next-line non-literal-require const pkg: { name: string; version: string } = require(`${pkgRoot}/package.json`); const url: string = downloadUrl(pkg.name, pkg.version); From 821640f16b34147d6e04b649a88ed78ec83dd212 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Tue, 9 Oct 2018 16:42:47 -0600 Subject: [PATCH 14/87] Add a TextDocumentProvider to handle and delegate text document events --- server/src/Server.ts | 5 ++- server/src/providers/ASTProvider.ts | 19 +++----- server/src/providers/TextDocumentProvider.ts | 46 ++++++++++++++++++++ 3 files changed, 55 insertions(+), 15 deletions(-) create mode 100644 server/src/providers/TextDocumentProvider.ts diff --git a/server/src/Server.ts b/server/src/Server.ts index fc2f47a9a..8eafd720d 100644 --- a/server/src/Server.ts +++ b/server/src/Server.ts @@ -8,9 +8,9 @@ import { import { config } from './ServerConfiguration'; import { CapabilityCalculator } from './CapabilityCalculator'; import { Forest } from './Forest'; -import ASTProvider from './providers/ASTProvider'; import DocumentHighlightProvider from './providers/DocumentHighlightProvider'; import FoldingRangeProvider from './providers/FoldingRangeProvider'; +import TextDocumentProvider from './providers/TextDocumentProvider'; export interface ILanguageServer { readonly capabilities: InitializeResult; @@ -37,9 +37,10 @@ export class Server implements ILanguageServer { } private registerProviders(): void { - ASTProvider.register(this.connection, this.forest); DocumentHighlightProvider.register(this.connection, this.forest); FoldingRangeProvider.register(this.connection, this.forest); + // Handles text document changes and will delegate to other providers that need these events + TextDocumentProvider.register(this.connection, this.forest); } private async loadWorkspaceEnvironments(folders: WorkspaceFolder[]): Promise { diff --git a/server/src/providers/ASTProvider.ts b/server/src/providers/ASTProvider.ts index 1cbab62c2..4d363fa08 100644 --- a/server/src/providers/ASTProvider.ts +++ b/server/src/providers/ASTProvider.ts @@ -2,10 +2,8 @@ * ASTProvider */ -import * as Parser from 'tree-sitter'; -// tslint:disable-next-line no-duplicate-imports -import { Point, SyntaxNode, Tree } from 'tree-sitter'; -import * as TreeSitterRuby from 'tree-sitter-ruby'; +import Parser, { Point, SyntaxNode, Tree } from 'tree-sitter'; +import TreeSitterRuby from 'tree-sitter-ruby'; import { DidChangeTextDocumentParams, @@ -30,23 +28,18 @@ export default class ASTProvider extends Provider { constructor(connection: IConnection, forest: IForest) { super(connection, forest); + this.parser = new Parser(); this.parser.setLanguage(TreeSitterRuby); - - this.connection.onDidOpenTextDocument(this.handleOpenTextDocument); - this.connection.onDidChangeTextDocument(this.handleChangeTextDocument); - this.connection.onDidCloseTextDocument(this.handleCloseTextDocument); } - protected handleOpenTextDocument = async (params: DidOpenTextDocumentParams): Promise => { + public handleOpenTextDocument = async (params: DidOpenTextDocumentParams): Promise => { const document: TextDocumentItem = params.textDocument; const tree: Tree = this.parser.parse(document.text); this.forest.setTree(document.uri, tree); }; - protected handleChangeTextDocument = async ( - params: DidChangeTextDocumentParams - ): Promise => { + public handleChangeTextDocument = async (params: DidChangeTextDocumentParams): Promise => { const document: VersionedTextDocumentIdentifier = params.textDocument; let tree: Tree = this.forest.getTree(document.uri); if (tree !== undefined) { @@ -77,7 +70,7 @@ export default class ASTProvider extends Provider { this.forest.setTree(document.uri, tree); }; - protected handleCloseTextDocument = async (params: DidCloseTextDocumentParams): Promise => { + public handleCloseTextDocument = async (params: DidCloseTextDocumentParams): Promise => { const document: TextDocumentIdentifier = params.textDocument; this.forest.removeTree(document.uri); }; diff --git a/server/src/providers/TextDocumentProvider.ts b/server/src/providers/TextDocumentProvider.ts new file mode 100644 index 000000000..578ccca49 --- /dev/null +++ b/server/src/providers/TextDocumentProvider.ts @@ -0,0 +1,46 @@ +import Provider from './Provider'; +import ASTProvider from './ASTProvider'; +import DiagnosticsProvider from './DiagnosticsProvider'; +import { + IConnection, + DidChangeTextDocumentParams, + DidCloseTextDocumentParams, + DidOpenTextDocumentParams, +} from 'vscode-languageserver'; +import { IForest } from '../Forest'; + +export default class TextDocumentProvider extends Provider { + private astProvider: ASTProvider; + private diagnosticsProvider: DiagnosticsProvider; + + static register(connection: IConnection, forest: IForest) { + return new TextDocumentProvider(connection, forest); + } + + constructor(connection: IConnection, forest: IForest) { + super(connection, forest); + + this.astProvider = new ASTProvider(connection, forest); + this.diagnosticsProvider = new DiagnosticsProvider(connection, forest); + + this.connection.onDidOpenTextDocument(this.handleDidOpenTextDocument); + this.connection.onDidChangeTextDocument(this.handleDidChangeTextDocument); + this.connection.onDidCloseTextDocument(this.handleCloseTextDocument); + } + + private handleDidOpenTextDocument = async (params: DidOpenTextDocumentParams): Promise => { + this.astProvider.handleOpenTextDocument(params); + this.diagnosticsProvider.computeDiagnostics(params); + }; + + private handleDidChangeTextDocument = async ( + params: DidChangeTextDocumentParams + ): Promise => { + this.astProvider.handleChangeTextDocument(params); + this.diagnosticsProvider.computeDiagnostics(params); + }; + + private handleCloseTextDocument = async (params: DidCloseTextDocumentParams): Promise => { + this.astProvider.handleCloseTextDocument(params); + }; +} From cd29ac14576df29c32ba8f2e93acaf50e9d29162 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Tue, 9 Oct 2018 16:44:44 -0600 Subject: [PATCH 15/87] Add concept of initialize and initialized provider registration This is needed to support workspace change messages --- server/src/Server.ts | 11 ++++++++--- server/src/index.ts | 8 +++++++- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/server/src/Server.ts b/server/src/Server.ts index 8eafd720d..2e6ed949d 100644 --- a/server/src/Server.ts +++ b/server/src/Server.ts @@ -14,6 +14,8 @@ import TextDocumentProvider from './providers/TextDocumentProvider'; export interface ILanguageServer { readonly capabilities: InitializeResult; + registerInitializeProviders(); + registerInitializedProviders(); } export class Server implements ILanguageServer { @@ -25,8 +27,6 @@ export class Server implements ILanguageServer { this.connection = connection; this.calculator = new CapabilityCalculator(params.capabilities); this.forest = new Forest(); - - this.registerProviders(); this.loadWorkspaceEnvironments(params.workspaceFolders); } @@ -36,13 +36,18 @@ export class Server implements ILanguageServer { }; } - private registerProviders(): void { + // registers providers on the initialize step + public registerInitializeProviders(): void { DocumentHighlightProvider.register(this.connection, this.forest); FoldingRangeProvider.register(this.connection, this.forest); // Handles text document changes and will delegate to other providers that need these events TextDocumentProvider.register(this.connection, this.forest); } + // registers providers on the initialized step + public registerInitializedProviders(): void { + } + private async loadWorkspaceEnvironments(folders: WorkspaceFolder[]): Promise { const loaders = folders.map(folder => config.loadWorkspaceEnvironment(folder)); await Promise.all(loaders); diff --git a/server/src/index.ts b/server/src/index.ts index 146a4543b..9b557b36a 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -13,6 +13,7 @@ import { ILanguageServer } from './Server'; import { rebuildTreeSitter } from './util/rebuilder'; const connection: IConnection = createConnection(ProposedFeatures.all); +let server: ILanguageServer; connection.onInitialize(async (params: InitializeParams) => { connection.console.info('Initializing Ruby language server...'); @@ -30,10 +31,15 @@ connection.onInitialize(async (params: InitializeParams) => { connection.console.info('Rebuild succeeded!'); const { Server } = await import('./Server'); - const server: ILanguageServer = new Server(connection, params); + server = new Server(connection, params); + server.registerInitializeProviders(); return server.capabilities; }); +connection.onInitialized(() => { + server.registerInitializedProviders(); +}); + // Listen on the connection connection.listen(); From d76e840cd02f7305b9942590e3e9e680571a916f Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Tue, 9 Oct 2018 16:45:25 -0600 Subject: [PATCH 16/87] Add multi root workspace and configuration support --- server/src/CapabilityCalculator.ts | 17 ++++++++++--- server/src/Server.ts | 11 ++++++++ server/src/providers/ConfigurationProvider.ts | 19 ++++++++++++++ server/src/providers/WorkspaceProvider.ts | 25 +++++++++++++++++++ 4 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 server/src/providers/ConfigurationProvider.ts create mode 100644 server/src/providers/WorkspaceProvider.ts diff --git a/server/src/CapabilityCalculator.ts b/server/src/CapabilityCalculator.ts index 74aa032b8..5fa5ec96f 100644 --- a/server/src/CapabilityCalculator.ts +++ b/server/src/CapabilityCalculator.ts @@ -10,15 +10,15 @@ import { export class CapabilityCalculator { private clientCapabilities: ClientCapabilities; + public capabilities: ServerCapabilities; constructor(clientCapabilities: ClientCapabilities) { this.clientCapabilities = clientCapabilities; + this.calculateCapabilities(); } - get capabilities(): ServerCapabilities { - this.clientCapabilities; - - return { + private calculateCapabilities() { + this.capabilities = { // Perform incremental syncs // Incremental sync is disabled for now due to not being able to get the // old text in ASTProvider @@ -27,5 +27,14 @@ export class CapabilityCalculator { documentHighlightProvider: true, foldingRangeProvider: true, }; + + if (this.clientCapabilities.workspace && this.clientCapabilities.workspace.workspaceFolders) { + this.capabilities.workspace = { + workspaceFolders: { + supported: true, + changeNotifications: true, + }, + }; + } } } diff --git a/server/src/Server.ts b/server/src/Server.ts index 2e6ed949d..fa9c03723 100644 --- a/server/src/Server.ts +++ b/server/src/Server.ts @@ -10,7 +10,9 @@ import { CapabilityCalculator } from './CapabilityCalculator'; import { Forest } from './Forest'; import DocumentHighlightProvider from './providers/DocumentHighlightProvider'; import FoldingRangeProvider from './providers/FoldingRangeProvider'; +import ConfigurationProvider from './providers/ConfigurationProvider'; import TextDocumentProvider from './providers/TextDocumentProvider'; +import WorkspaceProvider from './providers/WorkspaceProvider'; export interface ILanguageServer { readonly capabilities: InitializeResult; @@ -38,14 +40,23 @@ export class Server implements ILanguageServer { // registers providers on the initialize step public registerInitializeProviders(): void { + // Handles highlight requests DocumentHighlightProvider.register(this.connection, this.forest); + + // Handles folding requests FoldingRangeProvider.register(this.connection, this.forest); + // Handles text document changes and will delegate to other providers that need these events TextDocumentProvider.register(this.connection, this.forest); } // registers providers on the initialized step public registerInitializedProviders(): void { + // Handles configuration changes + ConfigurationProvider.register(this.connection, this.forest); + + // Handle workspace changes + WorkspaceProvider.register(this.connection, this.forest); } private async loadWorkspaceEnvironments(folders: WorkspaceFolder[]): Promise { diff --git a/server/src/providers/ConfigurationProvider.ts b/server/src/providers/ConfigurationProvider.ts new file mode 100644 index 000000000..1e92e2968 --- /dev/null +++ b/server/src/providers/ConfigurationProvider.ts @@ -0,0 +1,19 @@ +import { IConnection, DidChangeConfigurationParams } from 'vscode-languageserver'; +import { IForest } from '../Forest'; +import Provider from './Provider'; + +export default class ConfigurationProvider extends Provider { + static register(connection: IConnection, forest: IForest) { + return new ConfigurationProvider(connection, forest); + } + + constructor(connection: IConnection, forest: IForest) { + super(connection, forest); + + this.connection.onDidChangeConfiguration(this.handleConfigurationChange); + } + + private handleConfigurationChange(event: DidChangeConfigurationParams) { + console.log(event.settings); + } +} diff --git a/server/src/providers/WorkspaceProvider.ts b/server/src/providers/WorkspaceProvider.ts new file mode 100644 index 000000000..98c116550 --- /dev/null +++ b/server/src/providers/WorkspaceProvider.ts @@ -0,0 +1,25 @@ +import Provider from './Provider'; +import { IConnection, WorkspaceFoldersChangeEvent } from 'vscode-languageserver'; +import { IForest } from '../Forest'; + +import { config } from '../ServerConfiguration'; + +export default class WorkspaceProvider extends Provider { + static register(connection: IConnection, forest: IForest) { + return new WorkspaceProvider(connection, forest); + } + + constructor(connection: IConnection, forest: IForest) { + super(connection, forest); + + this.connection.workspace.onDidChangeWorkspaceFolders(this.handleWorkspaceFoldersChange); + } + + private handleWorkspaceFoldersChange = async ( + event: WorkspaceFoldersChangeEvent + ): Promise => { + const loaders = event.added.map(folder => config.loadWorkspaceEnvironment(folder)); + const removers = event.removed.map(folder => config.removeWorkspaceEnvironment(folder)); + await Promise.all(loaders.concat(removers)); + }; +} From 34df452058436e90ea510a5eba4570801ed7ce0c Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Tue, 9 Oct 2018 16:45:54 -0600 Subject: [PATCH 17/87] Remove static register function from Provider It isn't really serving a purpose --- server/src/providers/Provider.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/server/src/providers/Provider.ts b/server/src/providers/Provider.ts index 013f176b0..8cb112ba1 100644 --- a/server/src/providers/Provider.ts +++ b/server/src/providers/Provider.ts @@ -5,10 +5,6 @@ export default abstract class Provider { protected connection: IConnection; protected forest: IForest; - static register(connection: IConnection, forest: IForest) { - throw new Error('Register is not implemented!'); - } - constructor(connection: IConnection, forest: IForest) { this.connection = connection; this.forest = forest; From 3452e45a153072bf3ae4f94b340f49751a4102b4 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Tue, 23 Oct 2018 17:10:56 -0600 Subject: [PATCH 18/87] Bump tree-sitter-ruby to 0.13.11 --- server/package-lock.json | 6 +++--- server/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index 40ffe12ba..623352b86 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1874,9 +1874,9 @@ } }, "tree-sitter-ruby": { - "version": "0.13.10", - "resolved": "https://registry.npmjs.org/tree-sitter-ruby/-/tree-sitter-ruby-0.13.10.tgz", - "integrity": "sha512-IbDvrFc4MazC4IvlwCYRfGqy0YL9aSz0M3BmVe+PSOS+SZUvAiphunHiHw81sU+KxXNWelyCvNch3mC80MSqbg==", + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/tree-sitter-ruby/-/tree-sitter-ruby-0.13.11.tgz", + "integrity": "sha512-EBmBBZ20yaoRqDRgQof9Yir29/3lv5cY/y8UDUC1GzRf5pYd4CsYU0WAjIJ7dyAv+3n7p3y/LOuXkyJLiIN1wA==", "requires": { "nan": "^2.10.0", "prebuild-install": "^5.0.0" diff --git a/server/package.json b/server/package.json index 83eebf9a7..694202331 100644 --- a/server/package.json +++ b/server/package.json @@ -11,7 +11,7 @@ "execa": "^1.0.0", "prebuild-install": "^5.0.0", "tree-sitter": "^0.13.15", - "tree-sitter-ruby": "^0.13.10", + "tree-sitter-ruby": "^0.13.11", "vscode-languageserver": "^5.1.0", "vscode-uri": "^1.0.6" }, From 5c76b61eb66a929cfaf40dba129661f89fda8d28 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Tue, 23 Oct 2018 17:11:32 -0600 Subject: [PATCH 19/87] Remove execa and default-shell from server --- server/package-lock.json | 100 ++------------------------------------- server/package.json | 2 - 2 files changed, 3 insertions(+), 99 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index 623352b86..0d5e9ae98 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -423,18 +423,6 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, "cryptiles": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", @@ -501,11 +489,6 @@ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" }, - "default-shell": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/default-shell/-/default-shell-1.0.1.tgz", - "integrity": "sha1-dSMEvdxhdPSespy5iP7qC4gTyLw=" - }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -581,20 +564,6 @@ "es5-ext": "~0.10.14" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, "execspawn": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/execspawn/-/execspawn-1.0.1.tgz", @@ -688,25 +657,6 @@ "wide-align": "^1.1.0" } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - }, - "dependencies": { - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -916,11 +866,6 @@ "integrity": "sha1-TBEDO11dlNbqs3dd7cm+fQCDJfE=", "dev": true }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -935,7 +880,8 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "isstream": { "version": "0.1.2", @@ -1152,11 +1098,6 @@ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, "node-abi": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.4.3.tgz", @@ -1265,14 +1206,6 @@ "which": "^1.2.10" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, "npm-which": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", @@ -1378,11 +1311,6 @@ "os-tmpdir": "^1.0.0" } }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, "path-array": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz", @@ -1398,11 +1326,6 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -1597,19 +1520,6 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -1717,11 +1627,6 @@ "ansi-regex": "^2.0.0" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -2039,6 +1944,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, "requires": { "isexe": "^2.0.0" } diff --git a/server/package.json b/server/package.json index 694202331..23a3ef018 100644 --- a/server/package.json +++ b/server/package.json @@ -7,8 +7,6 @@ "license": "MIT", "private": false, "dependencies": { - "default-shell": "^1.0.1", - "execa": "^1.0.0", "prebuild-install": "^5.0.0", "tree-sitter": "^0.13.15", "tree-sitter-ruby": "^0.13.11", From 1978aae90dbca169a1824eff33a4ef426eb54f8d Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Sat, 27 Oct 2018 11:16:42 -0600 Subject: [PATCH 20/87] Move xmldom typings to @types package --- package-lock.json | 5 +++++ package.json | 1 + src/typings/xmldom/xmldom.d.ts | 22 ---------------------- 3 files changed, 6 insertions(+), 22 deletions(-) delete mode 100644 src/typings/xmldom/xmldom.d.ts diff --git a/package-lock.json b/package-lock.json index 40a888892..1650845cb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,11 @@ "integrity": "sha512-f9XXUWFqryzjkZA1EqFvJHSFyqyasV17fq8zCDIzbRV4ctL7RrJGKvG+lcex86Rjbzd1GrER9h9VmF5sSjV0BQ==", "dev": true }, + "@types/xmldom": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/@types/xmldom/-/xmldom-0.1.29.tgz", + "integrity": "sha1-xEKLDKhtO4gUdXJv2UmAs4onw4E=" + }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", diff --git a/package.json b/package.json index dd1bc4535..0b87ff7ba 100644 --- a/package.json +++ b/package.json @@ -50,6 +50,7 @@ "url": "https://github.com/rubyide/vscode-ruby/issues" }, "dependencies": { + "@types/xmldom": "^0.1.29", "async": "^2.3.0", "lodash": "^4.17.3", "minimatch": "^3.0.3", diff --git a/src/typings/xmldom/xmldom.d.ts b/src/typings/xmldom/xmldom.d.ts deleted file mode 100644 index 3fbb2ec3e..000000000 --- a/src/typings/xmldom/xmldom.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -declare module 'xmldom' { - export class DOMParser { - constructor(opts?: IDOMParserOpts); - parseFromString(xml: string, mimeType: string): XMLDocument; - } - export function DOMErrorHandler(error:string): void; - - export interface IDOMErrorLocator { - lineNumber: number; - columnNumber: number; - } - export interface IDOMError { - lineNumber: number; - columnNumber: number; - error: string; - type: string; - } - export interface IDOMParserOpts { - errorHandler?: Function; - locator?: IDOMErrorLocator; - } -} \ No newline at end of file From e526789b248c60ff4e95ab6af2d31304e1166e2d Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Sat, 27 Oct 2018 11:17:26 -0600 Subject: [PATCH 21/87] Update tsconfig lib to es2017 --- client/tsconfig.json | 3 +-- server/tsconfig.json | 3 +-- tsconfig.base.json | 3 ++- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/client/tsconfig.json b/client/tsconfig.json index 5a46f64e9..353ca1605 100644 --- a/client/tsconfig.json +++ b/client/tsconfig.json @@ -5,7 +5,6 @@ "target": "es6", "outDir": "out", "rootDir": "src", - "lib": [ "es6" ] }, "include": [ "src" @@ -13,4 +12,4 @@ "exclude": [ "node_modules" ] -} \ No newline at end of file +} diff --git a/server/tsconfig.json b/server/tsconfig.json index 9b87a2901..a9afd9784 100644 --- a/server/tsconfig.json +++ b/server/tsconfig.json @@ -6,7 +6,6 @@ "moduleResolution": "node", "outDir": "out", "rootDir": "src", - "lib": [ "es6" ] }, "include": [ "src" @@ -14,4 +13,4 @@ "exclude": [ "node_modules" ] -} \ No newline at end of file +} diff --git a/tsconfig.base.json b/tsconfig.base.json index 8e867e568..573152232 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -5,6 +5,7 @@ "noUnusedLocals": true, "noUnusedParameters": true, "sourceMap": true, - "esModuleInterop": true + "esModuleInterop": true, + "lib": ["dom", "es2017"] } } From 9e7c61b5779ed9985955d62a838af34a17b08487 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Wed, 31 Oct 2018 08:12:21 -0600 Subject: [PATCH 22/87] Add generic SettingCache for caching configuration and environments --- server/src/SettingsCache.ts | 78 +++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 server/src/SettingsCache.ts diff --git a/server/src/SettingsCache.ts b/server/src/SettingsCache.ts new file mode 100644 index 000000000..aa11bddd5 --- /dev/null +++ b/server/src/SettingsCache.ts @@ -0,0 +1,78 @@ +import { TextDocument, WorkspaceFolder } from 'vscode-languageserver'; + +export type RubyEnvironment = { + PATH: string; + RUBY_VERSION: string; + RUBY_ROOT: string; + GEM_HOME: string; + GEM_PATH: string; + GEM_ROOT: string; +}; + +export interface RubyConfiguration {} + +class SettingsCache

{ + private cache: Map; + public fetcher: (target: string[]) => Promise; + + constructor() { + this.cache = new Map(); + } + + public set(target: P | string, env: T): void { + const key = typeof target === 'string' ? target : target.uri; + this.cache.set(key, env); + } + + public setAll(targets: { [key: string]: T }): void { + for (const target of Object.keys(targets)) { + this.set(target, targets[target]); + } + } + + public delete(target: P): boolean { + return this.cache.delete(target.uri); + } + + public deleteAll(targets: P[]): void { + for (const target of targets) { + this.delete(target); + } + } + + public async get(target: P | string): Promise { + const key = typeof target === 'string' ? target : target.uri; + let settings: T = this.cache.get(key); + if (!settings) { + const result = await this.fetcher([key]); + settings = result.length > 0 ? result[0] : undefined; + + if (settings) { + this.set(key, settings); + } + } + + return settings; + } + + public async getAll(targets: P[]): Promise<{ [key: string]: T }> { + const settings: { [key: string]: T } = {}; + + for (const target of targets) { + settings[target.uri] = await this.get(target); + } + + return settings; + } + + public flush(): void { + this.cache.clear(); + } + + public toString(): string { + return this.cache.toString(); + } +} + +export const documentConfigurationCache = new SettingsCache(); +export const workspaceRubyEnvironmentCache = new SettingsCache(); From 2106807998d9f610ee09cfa953b2195c67e132aa Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Wed, 31 Oct 2018 08:12:47 -0600 Subject: [PATCH 23/87] Remove ServerConfiguration as the SettingsCache replaced it --- server/src/ServerConfiguration.ts | 55 ------------------------------- 1 file changed, 55 deletions(-) delete mode 100644 server/src/ServerConfiguration.ts diff --git a/server/src/ServerConfiguration.ts b/server/src/ServerConfiguration.ts deleted file mode 100644 index 3a4a1ec4b..000000000 --- a/server/src/ServerConfiguration.ts +++ /dev/null @@ -1,55 +0,0 @@ -import url from 'url'; -import { WorkspaceFolder } from 'vscode-languageserver'; -import { loadEnv, IEnvironment } from './util/env'; - -export type RubyEnvironment = { - PATH: string; - RUBY_VERSION: string; - RUBY_ROOT: string; - GEM_HOME: string; - GEM_PATH: string; - GEM_ROOT: string; -}; - -class ServerConfiguration { - private environments: Map; - - constructor() { - this.environments = new Map(); - } - - public async loadWorkspaceEnvironment(workspaceFolder: WorkspaceFolder): Promise { - const { uri } = workspaceFolder; - const parsed = url.parse(workspaceFolder.uri); - if (parsed.protocol === 'file:') { - console.log(`Loading environment for local workspace ${uri}`); - const environment: IEnvironment = await loadEnv(parsed.path); - this.environments[uri] = this.reduceEnvironment(environment); - } else { - console.log(`Skipping environment load for non-local workspace ${uri}`); - } - } - - public async removeWorkspaceEnvironment(folder: WorkspaceFolder): Promise { - this.environments.delete(folder.uri) && - console.log(`Removed workspace environment ${folder.uri}`); - } - - public environmentFor(folder: WorkspaceFolder): RubyEnvironment { - return this.environments.get(folder.uri); - } - - private reduceEnvironment(environment: IEnvironment): RubyEnvironment { - const { PATH, RUBY_VERSION, RUBY_ROOT, GEM_HOME, GEM_PATH, GEM_ROOT } = environment; - return { - PATH, - RUBY_VERSION, - RUBY_ROOT, - GEM_HOME, - GEM_PATH, - GEM_ROOT, - }; - } -} - -export const config = new ServerConfiguration(); From 84f64b2fa9bdbbb5f7b0525abaa38c52dbeeaaba Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Wed, 31 Oct 2018 08:13:46 -0600 Subject: [PATCH 24/87] Add client support for WorkspaceRubyEnvironment requests --- client/src/WorkspaceRubyEnvironment.ts | 62 +++++++++++++++++++++ client/src/extension.ts | 2 + client/src/util/env.ts | 76 ++++++++++++++++++++++++++ 3 files changed, 140 insertions(+) create mode 100644 client/src/WorkspaceRubyEnvironment.ts create mode 100644 client/src/util/env.ts diff --git a/client/src/WorkspaceRubyEnvironment.ts b/client/src/WorkspaceRubyEnvironment.ts new file mode 100644 index 000000000..e43fa145a --- /dev/null +++ b/client/src/WorkspaceRubyEnvironment.ts @@ -0,0 +1,62 @@ +import { + ClientCapabilities, + LanguageClient, + RequestType, + StaticFeature, +} from 'vscode-languageclient'; +import { Uri, workspace, WorkspaceFolder } from 'vscode'; +import { loadEnv, RubyEnvironment } from './util/env'; + +interface WorkspaceRubyEnvironmentParams { + readonly folders: string[]; +} + +interface WorkspaceRubyEnvironmentResult { + [key: string]: RubyEnvironment; +} + +namespace WorkspaceRubyEnvironmentRequest { + export const type = new RequestType< + WorkspaceRubyEnvironmentParams, + WorkspaceRubyEnvironmentResult, + void, + true + >('workspace/rubyEnvironment'); +} + +type WorkspaceRubyEnvironmentCapability = { + workspace?: { + rubyEnvironment?: boolean; + }; +}; + +type ClientCapabilitiesWithRubyEnvironment = ClientCapabilities & + WorkspaceRubyEnvironmentCapability; + +export class WorkspaceRubyEnvironmentFeature implements StaticFeature { + constructor(private client: LanguageClient) {} + + public fillClientCapabilities(capabilities: ClientCapabilitiesWithRubyEnvironment): void { + capabilities.workspace = capabilities.workspace || {}; + capabilities.workspace!.rubyEnvironment = true; + } + + public initialize(): void { + this.client.onRequest( + WorkspaceRubyEnvironmentRequest.type, + async (params: WorkspaceRubyEnvironmentParams): Promise => { + const environments: WorkspaceRubyEnvironmentResult = {}; + + for (const uri of params.folders) { + const workspaceFolder: WorkspaceFolder = workspace.getWorkspaceFolder(Uri.parse(uri)); + + if (workspaceFolder && workspaceFolder.uri.fsPath) { + environments[uri] = await loadEnv(workspaceFolder.uri.fsPath); + } + } + + return environments; + } + ); + } +} diff --git a/client/src/extension.ts b/client/src/extension.ts index 3a3f14550..7dc8ca815 100644 --- a/client/src/extension.ts +++ b/client/src/extension.ts @@ -10,6 +10,7 @@ import { ServerOptions, TransportKind, } from 'vscode-languageclient'; +import { WorkspaceRubyEnvironmentFeature } from './WorkspaceRubyEnvironment'; let client: LanguageClient; @@ -43,6 +44,7 @@ export function activate(context: ExtensionContext): void { // Create the language client and start the client. client = new LanguageClient('ruby', 'Ruby', serverOptions, clientOptions); client.registerProposedFeatures(); + client.registerFeature(new WorkspaceRubyEnvironmentFeature(client)); // Push the disposable to the context's subscriptions so that the // client can be deactivated on extension deactivation diff --git a/client/src/util/env.ts b/client/src/util/env.ts new file mode 100644 index 000000000..814e27707 --- /dev/null +++ b/client/src/util/env.ts @@ -0,0 +1,76 @@ +import execa from 'execa'; +import defaultShell from 'default-shell'; +import fs from 'fs'; +import path from 'path'; + +const SHIM_DIR = path.resolve(__dirname, 'shims'); +if (!fs.existsSync(SHIM_DIR)) { + fs.mkdirSync(SHIM_DIR); +} + +const RUBY_ENVIRONMENT_VARIABLES = [ + 'PATH', + 'RUBY_VERSION', + 'RUBY_ROOT', + 'GEM_HOME', + 'GEM_PATH', + 'GEM_ROOT', +]; + +function mkShim(shell: string, shimPath: string): boolean { + const template = `#!/usr/bin/env ${shell} -i\nexport`; + let result = false; + + try { + fs.writeFileSync(shimPath, template); + fs.chmodSync(shimPath, 0o744); + result = true; + } catch (e) { + console.log(e); + } + + return result; +} + +function getShim(shell): string { + const shellName = path.basename(shell); + const shimPath = path.join(SHIM_DIR, `env.${shell}`); + if (!fs.existsSync(shimPath)) { + mkShim(shellName, shimPath); + } + + return shimPath; +} + +export type RubyEnvironment = { + PATH: string; + RUBY_VERSION: string; + RUBY_ROOT: string; + GEM_HOME: string; + GEM_PATH: string; + GEM_ROOT: string; +}; + +export interface IEnvironment { + [key: string]: string; +} + +export function loadEnv(cwd: string): RubyEnvironment { + const shellName: string = path.basename(defaultShell); + const env: IEnvironment = {}; + const shim: string = getShim(shellName); + const { stdout, stderr } = execa.sync(shim, [], { + cwd, + }); + + console.error(stderr); + + for (const envVar of stdout.split('\n')) { + const result: string[] = envVar.split('=', 2); + if (RUBY_ENVIRONMENT_VARIABLES.indexOf(result[0]) >= 0) { + env[result[0]] = result[1]; + } + } + + return env as RubyEnvironment; +} From ed3944880b6365f5158383c7675af81ec6814bf2 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Wed, 31 Oct 2018 08:15:22 -0600 Subject: [PATCH 25/87] Remove deprecated configurationSection from synchronize options See https://github.com/Microsoft/vscode-languageserver-node/blob/9c26d2b58a441698a8e7790ce46c667dc4e2e199/client/src/client.ts#L292-L301 --- client/src/extension.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/client/src/extension.ts b/client/src/extension.ts index 7dc8ca815..8344b5573 100644 --- a/client/src/extension.ts +++ b/client/src/extension.ts @@ -34,7 +34,6 @@ export function activate(context: ExtensionContext): void { const clientOptions: LanguageClientOptions = { documentSelector: rubyDocumentSelector, synchronize: { - configurationSection: 'ruby', // Notify server of changes to .ruby-version or .rvmrc files fileEvents: workspace.createFileSystemWatcher('**/{.ruby-version,.rvmrc}'), }, From 84b15a3cf657f52efd1692899b8aeb5f5e9aeb69 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Wed, 31 Oct 2018 08:15:36 -0600 Subject: [PATCH 26/87] Client dependency updates --- client/package-lock.json | 384 ++++++++++++++++++++++++++------------- client/package.json | 6 +- 2 files changed, 265 insertions(+), 125 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index b289d113e..259d71dc1 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -89,9 +89,12 @@ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } }, "assert-plus": { "version": "1.0.0", @@ -109,9 +112,9 @@ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" }, "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, "balanced-match": { "version": "1.0.0", @@ -122,7 +125,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "optional": true, "requires": { "tweetnacl": "^0.14.3" } @@ -165,9 +167,9 @@ "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" }, "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" }, "caseless": { "version": "0.12.0", @@ -205,9 +207,9 @@ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "requires": { "delayed-stream": "~1.0.0" } @@ -223,15 +225,30 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + "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==", + "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", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -256,6 +273,11 @@ "is-obj": "^1.0.0" } }, + "default-shell": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/default-shell/-/default-shell-1.0.1.tgz", + "integrity": "sha1-dSMEvdxhdPSespy5iP7qC4gTyLw=" + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -272,9 +294,9 @@ "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" }, "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", + "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -283,12 +305,12 @@ } }, "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "requires": { - "jsbn": "~0.1.0" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "end-of-stream": { @@ -305,17 +327,32 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "event-stream": { - "version": "3.3.4", - "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.6.tgz", + "integrity": "sha512-dGXNg4F/FgVzlApjzItL+7naHutA3fDqbV/zAZqDDlXTjiMnQmZKu+prImWKszeBM5UQeGvAl3u1wBiKeDh61g==", "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" + "duplexer": "^0.1.1", + "flatmap-stream": "^0.1.0", + "from": "^0.1.7", + "map-stream": "0.0.7", + "pause-stream": "^0.0.11", + "split": "^1.0.1", + "stream-combiner": "^0.2.2", + "through": "^2.3.8" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "expand-brackets": { @@ -335,9 +372,9 @@ } }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "extend-shallow": { "version": "1.1.4", @@ -407,6 +444,11 @@ "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=" }, + "flatmap-stream": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/flatmap-stream/-/flatmap-stream-0.1.1.tgz", + "integrity": "sha512-lAq4tLbm3sidmdCN8G3ExaxH7cUCtP5mgDvrYowsx84dcYkJJ4I28N7gkxA6+YlSXzaGLJYIDEi9WGfXzMiXdw==" + }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -426,12 +468,12 @@ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, @@ -456,6 +498,14 @@ "rimraf": "2" } }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -465,9 +515,9 @@ } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -661,9 +711,9 @@ }, "dependencies": { "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" }, "clone-stats": { "version": "1.0.0", @@ -779,9 +829,9 @@ }, "dependencies": { "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" }, "clone-stats": { "version": "1.0.0", @@ -789,9 +839,9 @@ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" }, "queue": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-4.4.2.tgz", - "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/queue/-/queue-4.5.0.tgz", + "integrity": "sha512-DwxpAnqJuoQa+wyDgQuwkSshkhlqIlWEvwvdAY27fDPunZ2cVJzXU4JyjY+5l7zs7oGLaYAQm4MbLOVFAHFBzA==", "requires": { "inherits": "~2.0.0" } @@ -817,11 +867,11 @@ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", "requires": { - "ajv": "^5.1.0", + "ajv": "^5.3.0", "har-schema": "^2.0.0" } }, @@ -958,6 +1008,11 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", @@ -974,8 +1029,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" }, "json-schema": { "version": "0.2.3", @@ -1035,9 +1089,9 @@ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" }, "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", + "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=" }, "math-random": { "version": "1.0.1", @@ -1104,16 +1158,16 @@ } }, "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + "version": "1.37.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==" }, "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "version": "2.1.21", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", + "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", "requires": { - "mime-db": "~1.33.0" + "mime-db": "~1.37.0" } }, "minimatch": { @@ -1152,6 +1206,21 @@ "he": "1.1.1", "mkdirp": "0.5.1", "supports-color": "4.4.0" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "ms": { @@ -1170,6 +1239,11 @@ "minimatch": "^3.0.0" } }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, "node.extend": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", @@ -1186,10 +1260,18 @@ "remove-trailing-separator": "^1.0.1" } }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "4.1.1", @@ -1222,6 +1304,11 @@ "readable-stream": "^2.0.1" } }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, "parse-glob": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", @@ -1258,6 +1345,11 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, "pause-stream": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", @@ -1298,6 +1390,20 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", @@ -1309,9 +1415,9 @@ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "querystringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", - "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", + "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==" }, "queue": { "version": "3.1.0", @@ -1322,9 +1428,9 @@ } }, "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", + "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", "requires": { "is-number": "^4.0.0", "kind-of": "^6.0.0", @@ -1371,9 +1477,9 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" }, "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" }, "repeat-string": { "version": "1.6.1", @@ -1386,30 +1492,30 @@ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" }, "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "requires": { "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", + "aws4": "^1.8.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "uuid": "^3.3.2" } }, "requires-port": { @@ -1440,32 +1546,50 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", "requires": { "through": "2" } }, "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "version": "1.15.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz", + "integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==", "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -1484,11 +1608,12 @@ "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=" }, "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "version": "0.2.2", + "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", "requires": { - "duplexer": "~0.1.1" + "duplexer": "~0.1.1", + "through": "~2.3.4" } }, "stream-shift": { @@ -1534,6 +1659,11 @@ "strip-bom": "^2.0.0" } }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", @@ -1594,10 +1724,11 @@ } }, "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "requires": { + "psl": "^1.1.24", "punycode": "^1.4.1" } }, @@ -1612,8 +1743,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" }, "unique-stream": { "version": "2.2.1", @@ -1625,9 +1755,9 @@ } }, "url-parse": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.1.tgz", - "integrity": "sha512-x95Td74QcvICAA0+qERaVkRpTGKyBHHYdwL2LXZm5t/gBtCB9KQSO/0zQgSTYEV1p0WcvSg79TLNPSvd5IDJMQ==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", + "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", "requires": { "querystringify": "^2.0.0", "requires-port": "^1.0.0" @@ -1723,9 +1853,9 @@ } }, "vscode": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.18.tgz", - "integrity": "sha512-SyDw4qFwZ+WthZX7RWp71PNiWLF7VhpM65j2oryY/6jtSORd8qH6J8vclwWZJ6Jvu0EH7JamO2RWNfBfsMR9Zw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.21.tgz", + "integrity": "sha512-tJl9eL15ZMm6vzCYYeQ26sSYRuXGMGPsaeIAmG2rOOYRn01jdaDg6I4b9G5Ed6FISdmn6egpKThk4o4om8Ax/A==", "requires": { "glob": "^7.1.2", "gulp-chmod": "^2.0.0", @@ -1739,7 +1869,7 @@ "request": "^2.83.0", "semver": "^5.4.1", "source-map-support": "^0.5.0", - "url-parse": "^1.1.9", + "url-parse": "^1.4.3", "vinyl-source-stream": "^1.1.0" } }, @@ -1749,9 +1879,9 @@ "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" }, "vscode-languageclient": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-5.1.0.tgz", - "integrity": "sha512-Z95Kps8UqD4o17HE3uCkZuvenOsxHVH46dKmaGVpGixEFZigPaVuVxLM/JWeIY9aRenoC0ZD9CK1O7L4jpffKg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-5.1.1.tgz", + "integrity": "sha512-jMxshi+BPRQFNG8GB00dJv7ldqMda0be26laYYll/udtJuHbog6RqK10GSxHWDN0PgY0b0m5fePyTk3bq8a0TA==", "requires": { "semver": "^5.5.0", "vscode-languageserver-protocol": "3.13.0" @@ -1771,6 +1901,14 @@ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.13.0.tgz", "integrity": "sha512-BnJIxS+5+8UWiNKCP7W3g9FlE7fErFw0ofP5BXJe7c2tl0VeWh+nNHFbwAS2vmVC4a5kYxHBjRy0UeOtziemVA==" }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/client/package.json b/client/package.json index 153ff36ba..9f16d15c2 100644 --- a/client/package.json +++ b/client/package.json @@ -11,8 +11,10 @@ "private": false, "main": "out/extension.js", "dependencies": { - "vscode": "^1.1.18", - "vscode-languageclient": "^5.1.0" + "default-shell": "^1.0.1", + "execa": "^1.0.0", + "vscode": "^1.1.21", + "vscode-languageclient": "^5.1.1" }, "scripts": { "postinstall": "vscode-install" From 7d4cba7e78e85a635af4ea352dcce80d9902a6e6 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Wed, 31 Oct 2018 14:15:06 -0600 Subject: [PATCH 27/87] Add execa back to the server --- server/package-lock.json | 95 ++++++++++++++++++++++++++++++++++++++-- server/package.json | 1 + 2 files changed, 93 insertions(+), 3 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index 0d5e9ae98..ee6f9d303 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -423,6 +423,18 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, "cryptiles": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", @@ -564,6 +576,20 @@ "es5-ext": "~0.10.14" } }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + }, "execspawn": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/execspawn/-/execspawn-1.0.1.tgz", @@ -657,6 +683,25 @@ "wide-align": "^1.1.0" } }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + }, + "dependencies": { + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -866,6 +911,11 @@ "integrity": "sha1-TBEDO11dlNbqs3dd7cm+fQCDJfE=", "dev": true }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -880,8 +930,7 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isstream": { "version": "0.1.2", @@ -1098,6 +1147,11 @@ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, "node-abi": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.4.3.tgz", @@ -1206,6 +1260,14 @@ "which": "^1.2.10" } }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, "npm-which": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", @@ -1311,6 +1373,11 @@ "os-tmpdir": "^1.0.0" } }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, "path-array": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz", @@ -1326,6 +1393,11 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -1520,6 +1592,19 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -1627,6 +1712,11 @@ "ansi-regex": "^2.0.0" } }, + "strip-eof": { + "version": "1.0.0", + "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -1944,7 +2034,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, "requires": { "isexe": "^2.0.0" } diff --git a/server/package.json b/server/package.json index 23a3ef018..792347f0f 100644 --- a/server/package.json +++ b/server/package.json @@ -7,6 +7,7 @@ "license": "MIT", "private": false, "dependencies": { + "execa": "^1.0.0", "prebuild-install": "^5.0.0", "tree-sitter": "^0.13.15", "tree-sitter-ruby": "^0.13.11", From 7aedf6a28c62a2cec3c0d39ff7d8fc9af50d0c82 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Sat, 3 Nov 2018 10:37:22 -0600 Subject: [PATCH 28/87] Add RUBOCOP_OPTS to RubyEnvironment --- client/src/util/env.ts | 1 + server/src/SettingsCache.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/client/src/util/env.ts b/client/src/util/env.ts index 814e27707..7fcce05c3 100644 --- a/client/src/util/env.ts +++ b/client/src/util/env.ts @@ -49,6 +49,7 @@ export type RubyEnvironment = { GEM_HOME: string; GEM_PATH: string; GEM_ROOT: string; + RUBOCOP_OPTS?: string; }; export interface IEnvironment { diff --git a/server/src/SettingsCache.ts b/server/src/SettingsCache.ts index aa11bddd5..a78b9ca74 100644 --- a/server/src/SettingsCache.ts +++ b/server/src/SettingsCache.ts @@ -7,6 +7,7 @@ export type RubyEnvironment = { GEM_HOME: string; GEM_PATH: string; GEM_ROOT: string; + RUBOCOP_OPTS?: string; }; export interface RubyConfiguration {} From 62f9f46e43d24171f6cfda7140a4993c29c09293 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 11:27:30 -0800 Subject: [PATCH 29/87] Bump minimum tree-sitter to v0.13.22 This is the first version with currentNode support in TreeCursor --- server/package-lock.json | 6 +++--- server/package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index ee6f9d303..75115e423 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1860,9 +1860,9 @@ "dev": true }, "tree-sitter": { - "version": "0.13.15", - "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.13.15.tgz", - "integrity": "sha512-FuvU+csO7t/rQqLdL3+w4Jg+4Zl22Y4uCi4L9X/qJG57Zn71ZzP3oHtDSRgpiIms6g3Y7cEJvF7K/rCw11q92Q==", + "version": "0.13.22", + "resolved": "https://registry.npmjs.org/tree-sitter/-/tree-sitter-0.13.22.tgz", + "integrity": "sha512-BgbhV/h6KnihtbFQSA88AP/rSUlt1/D0d9ZOO5aPZSueyU7rJSqLF/gVV+QHAiLL8iue85OzOB2G2slhVFfR6Q==", "requires": { "nan": "^2.10.0", "prebuild-install": "^5.0.0" diff --git a/server/package.json b/server/package.json index 792347f0f..37cac7a5f 100644 --- a/server/package.json +++ b/server/package.json @@ -9,7 +9,7 @@ "dependencies": { "execa": "^1.0.0", "prebuild-install": "^5.0.0", - "tree-sitter": "^0.13.15", + "tree-sitter": "^0.13.22", "tree-sitter-ruby": "^0.13.11", "vscode-languageserver": "^5.1.0", "vscode-uri": "^1.0.6" From 6ef0a3f2aef3a4575a71cb185a57f75811221509 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 13:51:07 -0800 Subject: [PATCH 30/87] Add a super simple stack --- server/src/util/Stack.ts | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 server/src/util/Stack.ts diff --git a/server/src/util/Stack.ts b/server/src/util/Stack.ts new file mode 100644 index 000000000..fb1b58e7c --- /dev/null +++ b/server/src/util/Stack.ts @@ -0,0 +1,28 @@ +// Super simple stack +export default class Stack { + private stack: T[]; + + constructor() { + this.stack = []; + } + + get size() { + return this.stack.length; + } + + public push(value: T): void { + this.stack.push(value); + } + + public pop(): T { + return this.stack.pop(); + } + + public peek(): T { + return this.stack[this.size - 1]; + } + + public empty(): boolean { + return this.size === 0; + } +} From 70ab280fd463f19e02d9c64a1e6ecded4d689c46 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 13:52:20 -0800 Subject: [PATCH 31/87] Implement RubyDocumentSymbol factory This factory takes a tree-sitter SyntaxNode and returns DocumentSymbol(s) based on that SyntaxNode --- server/src/util/RubyDocumentSymbol.ts | 84 +++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 server/src/util/RubyDocumentSymbol.ts diff --git a/server/src/util/RubyDocumentSymbol.ts b/server/src/util/RubyDocumentSymbol.ts new file mode 100644 index 000000000..950a14084 --- /dev/null +++ b/server/src/util/RubyDocumentSymbol.ts @@ -0,0 +1,84 @@ +import { DocumentSymbol, Range, SymbolKind } from 'vscode-languageserver'; +import { SyntaxNode } from 'tree-sitter'; +import Position from './Position'; + +const SYMBOLKINDS = { + method: SymbolKind.Method, + class: SymbolKind.Class, + module: SymbolKind.Module, + assignment: SymbolKind.Constant, + method_call: SymbolKind.Property, +}; + +const IDENTIFIER_NODES = { + module: 'constant', + class: 'constant', + method: 'identifier', + assignment: 'constant', + method_call: 'identifier', +}; + +export function isWrapper(node: SyntaxNode): boolean { + return IDENTIFIER_NODES.hasOwnProperty(node.type); +} + +export default class RubyDocumentSymbol { + static build(node: SyntaxNode): DocumentSymbol | DocumentSymbol[] | void { + const symbolKind = SYMBOLKINDS[node.type]; + if (!symbolKind) return; + + let symbol = new DocumentSymbol(); + symbol.range = Range.create( + Position.fromTSPosition(node.startPosition).toVSPosition(), + Position.fromTSPosition(node.endPosition).toVSPosition() + ); + symbol.kind = symbolKind; + + if (isWrapper(node)) { + if (!node.childCount) return; + const identifierNode = node.descendantsOfType(IDENTIFIER_NODES[node.type])[0]; + if (identifierNode) { + symbol.children = []; + symbol.name = identifierNode.text; + if (symbol.name === 'initialize') { + symbol.kind = SymbolKind.Constructor; + } + + // detect attr_ method calls + if (symbol.name.indexOf('attr_') === 0) { + const argumentList = node.descendantsOfType('argument_list')[0]; + const symbols = []; + for (const child of argumentList.children) { + if (!child.isNamed) continue; + const newSymbol = { + ...symbol, + }; + newSymbol.name = child.text[0] === ':' ? child.text.substring(1) : child.text; + newSymbol.selectionRange = Range.create( + Position.fromTSPosition(child.startPosition).toVSPosition(), + Position.fromTSPosition(child.endPosition).toVSPosition() + ); + + symbols.push(newSymbol); + } + + return symbols; + } else if (node.type !== 'method_call') { + symbol.selectionRange = Range.create( + Position.fromTSPosition(identifierNode.startPosition).toVSPosition(), + Position.fromTSPosition(identifierNode.endPosition).toVSPosition() + ); + } else { + return; + } + } else { + return; + } + } else { + symbol.selectionRange = symbol.range; + symbol.name = node.text; + } + + return symbol; + } +} From ac71450594a457315ac4be938a795d43851d30ed Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 13:53:12 -0800 Subject: [PATCH 32/87] Move Position to util directory. Add some equality methods. --- server/src/{ => util}/Position.ts | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) rename server/src/{ => util}/Position.ts (57%) diff --git a/server/src/Position.ts b/server/src/util/Position.ts similarity index 57% rename from server/src/Position.ts rename to server/src/util/Position.ts index bc019b1a8..c543330ba 100644 --- a/server/src/Position.ts +++ b/server/src/util/Position.ts @@ -7,23 +7,27 @@ import { Point as TSPosition } from 'tree-sitter'; import { Position as VSPosition } from 'vscode-languageserver'; -export class Position { - private row: number; - private col: number; +export default class Position { + public row: number; + public col: number; constructor(row: number, col: number) { this.row = row; this.col = col; } - public static FROM_VS_POSITION(position: VSPosition): Position { + public static fromVSPosition(position: VSPosition): Position { return new Position(position.line, position.character); } - public static FROM_TS_POSITION(position: TSPosition): Position { + public static fromTSPosition(position: TSPosition): Position { return new Position(position.row, position.column); } + public static tsPositionIsEqual(p1: TSPosition, p2: TSPosition): boolean { + return p1.row === p2.row && p1.column === p2.column; + } + public toVSPosition(): VSPosition { return VSPosition.create(this.row, this.col); } @@ -34,4 +38,8 @@ export class Position { column: this.col, }; } + + public isEqual(position: Position) { + return this.row === position.row && this.col === position.col; + } } From f123c3e2f8bd3cafac97bc8a16a4a06ea90dae68 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 13:59:57 -0800 Subject: [PATCH 33/87] Implement new linter support --- server/src/SettingsCache.ts | 27 ++++++++- server/src/linters/BaseLinter.ts | 73 ++++++++++++++++++++++ server/src/linters/Reek.ts | 65 ++++++++++++++++++++ server/src/linters/RuboCop.ts | 100 +++++++++++++++++++++++++++++++ server/src/linters/index.ts | 3 + 5 files changed, 267 insertions(+), 1 deletion(-) create mode 100644 server/src/linters/BaseLinter.ts create mode 100644 server/src/linters/Reek.ts create mode 100644 server/src/linters/RuboCop.ts create mode 100644 server/src/linters/index.ts diff --git a/server/src/SettingsCache.ts b/server/src/SettingsCache.ts index a78b9ca74..94d716363 100644 --- a/server/src/SettingsCache.ts +++ b/server/src/SettingsCache.ts @@ -10,7 +10,32 @@ export type RubyEnvironment = { RUBOCOP_OPTS?: string; }; -export interface RubyConfiguration {} +export type RubyLintConfiguration = { + command?: string; + useBundler?: boolean; +}; + +export type RuboCopLintConfiguration = RubyLintConfiguration & { + lint?: boolean; + only?: string[]; + except?: string[]; + require?: string[]; + rails?: boolean; + forceExclusion?: boolean; +}; + +export interface RubyConfiguration { + workspaceFolderUri: string; + interpreter?: { + commandPath?: string; + }; + pathToBundler: string; + lint: { + fasterer?: boolean | RubyConfiguration; + reek?: boolean | RubyConfiguration; + rubocop?: boolean | RuboCopLintConfiguration; + }; +} class SettingsCache

{ private cache: Map; diff --git a/server/src/linters/BaseLinter.ts b/server/src/linters/BaseLinter.ts new file mode 100644 index 000000000..0a69bef22 --- /dev/null +++ b/server/src/linters/BaseLinter.ts @@ -0,0 +1,73 @@ +import { Diagnostic, TextDocument } from 'vscode-languageserver'; +import execa from 'execa'; +import { from, Observable, empty } from 'rxjs'; +import { map, catchError } from 'rxjs/operators'; +import { RubyEnvironment, RubyLintConfiguration } from '../SettingsCache'; + +export interface ILinter { + lint(): Observable; +} + +export type LinterConfig = { + env: RubyEnvironment; + executionRoot: string; + config: RubyLintConfiguration; +}; + +export default abstract class BaseLinter implements ILinter { + protected document: TextDocument; + protected config: LinterConfig; + + constructor(document: TextDocument, config: LinterConfig) { + this.document = document; + this.config = config; + } + + get cmd(): string { + return this.lintConfig.command; + } + + get args(): string[] { + return [this.document.uri]; + } + + get lintConfig(): RubyLintConfiguration { + return this.config.config; + } + + public lint(): Observable { + let { cmd, args } = this; + + if (!this.lintConfig.command && this.lintConfig.useBundler) { + args.unshift('exec', cmd); + cmd = 'bundle'; + } + + console.info(`Lint: executing ${cmd} ${args.join(' ')}...`); + + return from( + execa(cmd, args, { + env: this.config.env, + cwd: this.config.executionRoot, + input: this.document.getText(), + reject: false, // important since linters return non-zero error codes + }) + ).pipe( + map(result => { + return this.processResults(result.stdout); + }), + catchError(error => { + console.log(error); + return empty(); + }) + ); + } + + protected processResults(_output): Diagnostic[] { + return []; + } + + protected isWindows(): boolean { + return process.platform === 'win32'; + } +} diff --git a/server/src/linters/Reek.ts b/server/src/linters/Reek.ts new file mode 100644 index 000000000..91e6657a8 --- /dev/null +++ b/server/src/linters/Reek.ts @@ -0,0 +1,65 @@ +import BaseLinter from './BaseLinter'; +import { Diagnostic, DiagnosticSeverity } from 'vscode-languageserver'; + +type ReekOffense = { + context: string; + lines: number[]; + message: string; + smell_type: string; + source: string; + depth: number; + wiki_link: string; +}; + +export default class Reek extends BaseLinter { + get cmd(): string { + if (this.lintConfig.command) { + return this.lintConfig.command; + } else { + const command = 'reek'; + return this.isWindows() ? command + '.bat' : command; + } + } + + get args(): string[] { + return ['-f', 'json']; + } + + protected processResults(data): Diagnostic[] { + let results = [] as Diagnostic[]; + try { + const offenses: ReekOffense[] = JSON.parse(data); + for (const offense of offenses) { + const diagnostics = this.reekOffenseToDiagnostic(offense); + results = results.concat(diagnostics); + } + } catch (e) { + console.error(e); + } + + return results; + } + + private reekOffenseToDiagnostic(offense: ReekOffense): Diagnostic[] { + const baseDiagnostic = { + severity: DiagnosticSeverity.Warning, + message: offense.message, + source: offense.smell_type, + }; + return offense.lines.map(l => { + return { + ...baseDiagnostic, + range: { + start: { + line: l, + character: 1, + }, + end: { + line: l, + character: 1, + }, + }, + }; + }); + } +} diff --git a/server/src/linters/RuboCop.ts b/server/src/linters/RuboCop.ts new file mode 100644 index 000000000..6072958be --- /dev/null +++ b/server/src/linters/RuboCop.ts @@ -0,0 +1,100 @@ +import URI from 'vscode-uri'; +import { Diagnostic, DiagnosticSeverity } from 'vscode-languageserver'; +import BaseLinter from './BaseLinter'; +import { RuboCopLintConfiguration } from '../SettingsCache'; + +type RuboCopOffense = { + severity: string; // FIXME make this a fixed option set + message: string; + cop_name: string; + corrected: boolean; + location: { + line: number; + column: number; + length: number; + }; +}; + +interface IRuboCopResults { + summary: { + offense_count: number; + target_file_count: number; + inspected_file_count: number; + }; + files: [ + { + path: string; + offenses: RuboCopOffense[]; + } + ]; +} + +export default class RuboCop extends BaseLinter { + private readonly DIAGNOSTIC_SEVERITIES = { + refactor: DiagnosticSeverity.Hint, + convention: DiagnosticSeverity.Information, + warning: DiagnosticSeverity.Warning, + error: DiagnosticSeverity.Error, + fatal: DiagnosticSeverity.Error, + }; + + get cmd(): string { + if (this.lintConfig.command) { + return this.lintConfig.command; + } else { + const command = 'rubocop'; + return this.isWindows() ? command + '.bat' : command; + } + } + + get args(): string[] { + const documentPath = URI.parse(this.document.uri); + let args = ['-s', documentPath.fsPath, '-f', 'json']; + if (this.lintConfig.rails) args.push('-R'); + if (this.lintConfig.forceExclusion) args.push('--force-exclusion'); + if (this.lintConfig.lint) args.push('-l'); + if (this.lintConfig.only) args = args.concat('--only', this.lintConfig.only.join(',')); + if (this.lintConfig.except) args = args.concat('--except', this.lintConfig.except.join(',')); + if (this.lintConfig.require) args = args.concat('-r', this.lintConfig.require.join(',')); + return args; + } + + get lintConfig(): RuboCopLintConfiguration { + return this.config.config; + } + + protected processResults(data): Diagnostic[] { + let results = [] as Diagnostic[]; + try { + const offenses: IRuboCopResults = JSON.parse(data); + + for (const file of offenses.files) { + const diagnostics = file.offenses.map(o => this.rubocopOffenseToDiagnostic(o)); + results = results.concat(diagnostics); + } + } catch (e) { + console.error(e); + } + + return results; + } + + private rubocopOffenseToDiagnostic(offense: RuboCopOffense): Diagnostic { + const offenseCharacter = offense.location.column - 1; + return { + range: { + start: { + line: offense.location.line - 1, + character: offenseCharacter, + }, + end: { + line: offense.location.line - 1, + character: offenseCharacter + offense.location.length - 1, + }, + }, + severity: this.DIAGNOSTIC_SEVERITIES[offense.severity], + message: offense.message, + source: offense.cop_name, + }; + } +} diff --git a/server/src/linters/index.ts b/server/src/linters/index.ts new file mode 100644 index 000000000..4ea19d562 --- /dev/null +++ b/server/src/linters/index.ts @@ -0,0 +1,3 @@ +export { ILinter, LinterConfig } from './BaseLinter'; +export { default as RuboCop } from './RuboCop'; +export { default as Reek } from './Reek'; From ba7d710978c5a86be96ee2f2e4a08236bd135205 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:01:10 -0800 Subject: [PATCH 34/87] Add rxjs --- server/package-lock.json | 13 +++++++++++++ server/package.json | 1 + 2 files changed, 14 insertions(+) diff --git a/server/package-lock.json b/server/package-lock.json index 75115e423..1f195e117 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1571,6 +1571,14 @@ "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", "dev": true }, + "rxjs": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", + "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "requires": { + "tslib": "^1.9.0" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -1877,6 +1885,11 @@ "prebuild-install": "^5.0.0" } }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", diff --git a/server/package.json b/server/package.json index 37cac7a5f..6353e6a96 100644 --- a/server/package.json +++ b/server/package.json @@ -9,6 +9,7 @@ "dependencies": { "execa": "^1.0.0", "prebuild-install": "^5.0.0", + "rxjs": "^6.3.3", "tree-sitter": "^0.13.22", "tree-sitter-ruby": "^0.13.11", "vscode-languageserver": "^5.1.0", From bea49d5c7b9d5ea5eb64bda432eaf7ba9adb8821 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:01:27 -0800 Subject: [PATCH 35/87] Add @types/execa --- server/package-lock.json | 15 +++++++++++++++ server/package.json | 1 + 2 files changed, 16 insertions(+) diff --git a/server/package-lock.json b/server/package-lock.json index 1f195e117..98589d6eb 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -4,6 +4,21 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/execa": { + "version": "0.9.0", + "resolved": "http://registry.npmjs.org/@types/execa/-/execa-0.9.0.tgz", + "integrity": "sha512-mgfd93RhzjYBUHHV532turHC2j4l/qxsF/PbfDmprHDEUHmNZGlDn1CEsulGK3AfsPdhkWzZQT/S/k0UGhLGsA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "10.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.2.tgz", + "integrity": "sha512-53ElVDSnZeFUUFIYzI8WLQ25IhWzb6vbddNp8UHlXQyU0ET2RhV5zg0NfubzU7iNMh5bBXb0htCzfvrSVNgzaQ==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", diff --git a/server/package.json b/server/package.json index 6353e6a96..5387a60f5 100644 --- a/server/package.json +++ b/server/package.json @@ -16,6 +16,7 @@ "vscode-uri": "^1.0.6" }, "devDependencies": { + "@types/execa": "^0.9.0", "prebuild": "^7.6.0" }, "scripts": { From 2aa8e9eecbe33041f28483475e1beabf78f8c066 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:03:05 -0800 Subject: [PATCH 36/87] Add DocumentManager which emits an rxjs event stream on doc changes --- server/src/DocumentManager.ts | 42 +++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 server/src/DocumentManager.ts diff --git a/server/src/DocumentManager.ts b/server/src/DocumentManager.ts new file mode 100644 index 000000000..583b19a0c --- /dev/null +++ b/server/src/DocumentManager.ts @@ -0,0 +1,42 @@ +import { TextDocument, TextDocuments, IConnection } from 'vscode-languageserver'; +import { Subject } from 'rxjs'; + +export enum DocumentEventKind { + OPEN, + CHANGE_CONTENT, + CLOSE, +} + +export type DocumentEvent = { + kind: DocumentEventKind; + document: TextDocument; +}; + +export default class DocumentManager { + private documents: TextDocuments; + public subject: Subject; + + constructor() { + this.documents = new TextDocuments(); + this.subject = new Subject(); + + this.documents.onDidOpen(this.emitDocumentEvent(DocumentEventKind.OPEN)); + this.documents.onDidChangeContent(this.emitDocumentEvent(DocumentEventKind.CHANGE_CONTENT)); + this.documents.onDidClose(this.emitDocumentEvent(DocumentEventKind.CLOSE)); + } + + public listen(connection: IConnection): void { + this.documents.listen(connection); + } + + private emitDocumentEvent(kind: DocumentEventKind): ({ document: TextDocument }) => void { + return ({ document }): void => { + this.subject.next({ + kind, + document, + }); + }; + } +} + +export const documents = new DocumentManager(); From a732805f053a948a893612eb328a35a109b1bb72 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:10:31 -0800 Subject: [PATCH 37/87] Replace server env detection with workspace/rubyEnvironment requests --- server/src/CapabilityCalculator.ts | 13 +++++-- server/src/Server.ts | 54 +++++++++++++++++++++++----- server/src/util/env.ts | 56 ------------------------------ 3 files changed, 56 insertions(+), 67 deletions(-) delete mode 100644 server/src/util/env.ts diff --git a/server/src/CapabilityCalculator.ts b/server/src/CapabilityCalculator.ts index 5fa5ec96f..11c2ed897 100644 --- a/server/src/CapabilityCalculator.ts +++ b/server/src/CapabilityCalculator.ts @@ -8,12 +8,21 @@ import { TextDocumentSyncKind, } from 'vscode-languageserver'; +type WorkspaceRubyEnvironmentCapability = { + workspace?: { + rubyEnvironment?: boolean; + }; +}; + +type ClientCapabilitiesWithRubyEnvironment = ClientCapabilities & + WorkspaceRubyEnvironmentCapability; + export class CapabilityCalculator { - private clientCapabilities: ClientCapabilities; + public clientCapabilities: ClientCapabilitiesWithRubyEnvironment; public capabilities: ServerCapabilities; constructor(clientCapabilities: ClientCapabilities) { - this.clientCapabilities = clientCapabilities; + this.clientCapabilities = clientCapabilities as ClientCapabilitiesWithRubyEnvironment; this.calculateCapabilities(); } diff --git a/server/src/Server.ts b/server/src/Server.ts index fa9c03723..c85ad639f 100644 --- a/server/src/Server.ts +++ b/server/src/Server.ts @@ -2,10 +2,9 @@ import { Connection, InitializeParams, InitializeResult, - WorkspaceFolder, + RequestType, } from 'vscode-languageserver'; -import { config } from './ServerConfiguration'; import { CapabilityCalculator } from './CapabilityCalculator'; import { Forest } from './Forest'; import DocumentHighlightProvider from './providers/DocumentHighlightProvider'; @@ -14,12 +13,35 @@ import ConfigurationProvider from './providers/ConfigurationProvider'; import TextDocumentProvider from './providers/TextDocumentProvider'; import WorkspaceProvider from './providers/WorkspaceProvider'; +import { + documentConfigurationCache, + workspaceRubyEnvironmentCache, + RubyConfiguration, + RubyEnvironment, +} from './SettingsCache'; export interface ILanguageServer { readonly capabilities: InitializeResult; registerInitializeProviders(); registerInitializedProviders(); } +interface WorkspaceRubyEnvironmentParams { + readonly folders: string[]; +} + +interface WorkspaceRubyEnvironmentResult { + readonly [key: string]: RubyEnvironment; +} + +namespace WorkspaceRubyEnvironmentRequest { + export const type = new RequestType< + WorkspaceRubyEnvironmentParams, + WorkspaceRubyEnvironmentResult, + void, + true + >('workspace/rubyEnvironment'); +} + export class Server implements ILanguageServer { public connection: Connection; private calculator: CapabilityCalculator; @@ -28,8 +50,27 @@ export class Server implements ILanguageServer { constructor(connection: Connection, params: InitializeParams) { this.connection = connection; this.calculator = new CapabilityCalculator(params.capabilities); - this.forest = new Forest(); - this.loadWorkspaceEnvironments(params.workspaceFolders); + + if (this.calculator.clientCapabilities.workspace.rubyEnvironment) { + workspaceRubyEnvironmentCache.fetcher = async ( + folders: string[] + ): Promise => { + const result: WorkspaceRubyEnvironmentResult = await this.connection.sendRequest( + WorkspaceRubyEnvironmentRequest.type, + { + folders, + } + ); + + return Object.values(result); + }; + } else { + workspaceRubyEnvironmentCache.fetcher = async ( + folders: string[] + ): Promise => { + return folders.map(_f => process.env as RubyEnvironment); + }; + } } get capabilities(): InitializeResult { @@ -58,9 +99,4 @@ export class Server implements ILanguageServer { // Handle workspace changes WorkspaceProvider.register(this.connection, this.forest); } - - private async loadWorkspaceEnvironments(folders: WorkspaceFolder[]): Promise { - const loaders = folders.map(folder => config.loadWorkspaceEnvironment(folder)); - await Promise.all(loaders); - } } diff --git a/server/src/util/env.ts b/server/src/util/env.ts deleted file mode 100644 index 39488014f..000000000 --- a/server/src/util/env.ts +++ /dev/null @@ -1,56 +0,0 @@ -import execa from 'execa'; -import defaultShell from 'default-shell'; -import fs from 'fs'; -import path from 'path'; - -const SHIM_DIR = path.resolve(__dirname, 'shims'); -if (!fs.existsSync(SHIM_DIR)) { - fs.mkdirSync(SHIM_DIR); -} - -function mkShim(shell: string, shimPath: string): boolean { - const template = `#!/usr/bin/env ${shell} -i\nexport`; - let result = false; - - try { - fs.writeFileSync(shimPath, template); - fs.chmodSync(shimPath, 0o744); - result = true; - } catch (e) { - console.log(e); - } - - return result; -} - -function getShim(shell): string { - const shellName = path.basename(shell); - const shimPath = path.join(SHIM_DIR, `env.${shell}`); - if (!fs.existsSync(shimPath)) { - mkShim(shellName, shimPath); - } - - return shimPath; -} - -export interface IEnvironment { - [key: string]: string; -} - -export async function loadEnv(cwd: string): Promise { - const shellName: string = path.basename(defaultShell); - const env: IEnvironment = {}; - const shim: string = getShim(shellName); - const { stdout, stderr } = await execa(shim, [], { - cwd, - }); - - console.error(stderr); - - for (const envVar of stdout.split('\n')) { - const result: string[] = envVar.split('=', 2); - env[result[0]] = result[1]; - } - - return env; -} From 95e290e1a2ef5ee142f5688212a9486fe13ef5ae Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:11:38 -0800 Subject: [PATCH 38/87] Wire up the new DocumentManager --- server/src/Server.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/server/src/Server.ts b/server/src/Server.ts index c85ad639f..2ee12d283 100644 --- a/server/src/Server.ts +++ b/server/src/Server.ts @@ -13,6 +13,7 @@ import ConfigurationProvider from './providers/ConfigurationProvider'; import TextDocumentProvider from './providers/TextDocumentProvider'; import WorkspaceProvider from './providers/WorkspaceProvider'; +import { documents } from './DocumentManager'; import { documentConfigurationCache, workspaceRubyEnvironmentCache, @@ -51,6 +52,8 @@ export class Server implements ILanguageServer { this.connection = connection; this.calculator = new CapabilityCalculator(params.capabilities); + documents.listen(connection); + if (this.calculator.clientCapabilities.workspace.rubyEnvironment) { workspaceRubyEnvironmentCache.fetcher = async ( folders: string[] From 31b76227f8d598c485a25930d218692c8958a18b Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:12:02 -0800 Subject: [PATCH 39/87] Wire forest to listen to the document manager --- server/src/Forest.ts | 80 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 74 insertions(+), 6 deletions(-) diff --git a/server/src/Forest.ts b/server/src/Forest.ts index 9d9855583..b042cfe70 100644 --- a/server/src/Forest.ts +++ b/server/src/Forest.ts @@ -2,30 +2,98 @@ * Forest */ -import { Tree } from 'tree-sitter'; +import Parser, { Tree } from 'tree-sitter'; +import TreeSitterRuby from 'tree-sitter-ruby'; +import { TextDocument } from 'vscode-languageserver'; +import { of } from 'rxjs'; +import { switchMap } from 'rxjs/operators'; +import { documents, DocumentEvent, DocumentEventKind } from './DocumentManager'; export interface IForest { getTree(uri: string): Tree; - setTree(uri: string, tree: Tree): void; - removeTree(uri: string): boolean; + createTree(uri: string, content: string): Tree; + updateTree(uri: string, content: string): Tree; + deleteTree(uri: string): boolean; } -export class Forest implements IForest { +export enum ForestEventKind { + OPEN, + UPDATE, + DELETE, +} + +export type ForestEvent = { + kind: ForestEventKind; + document: TextDocument; + tree?: Tree; +}; + +class Forest implements IForest { + private parser: Parser; private trees: Map; constructor() { this.trees = new Map(); + this.parser = new Parser(); + this.parser.setLanguage(TreeSitterRuby); } public getTree(uri: string): Tree { return this.trees.get(uri); } - public setTree(uri: string, tree: Tree): void { + public createTree(uri: string, content: string): Tree { + const tree: Tree = this.parser.parse(content); this.trees.set(uri, tree); + + return tree; + } + + // For the time being this is a full reparse for every change + // Once we can support incremental sync we can use tree-sitter's + // edit functionality + public updateTree(uri: string, content: string): Tree { + let tree: Tree = this.getTree(uri); + if (tree) { + tree = this.parser.parse(content); + this.trees.set(uri, tree); + } else { + tree = this.createTree(uri, content); + } + + return tree; } - public removeTree(uri: string): boolean { + public deleteTree(uri: string): boolean { return this.trees.delete(uri); } } + +export const forest = new Forest(); +export const forestStream = documents.subject.pipe( + switchMap((event: DocumentEvent) => { + const { kind, document } = event; + const uri = document.uri; + const forestEvent: ForestEvent = { + document, + kind: undefined, + }; + + switch (kind) { + case DocumentEventKind.OPEN: + forestEvent.tree = forest.createTree(uri, document.getText()); + forestEvent.kind = ForestEventKind.OPEN; + break; + case DocumentEventKind.CHANGE_CONTENT: + forestEvent.tree = forest.updateTree(uri, document.getText()); + forestEvent.kind = ForestEventKind.UPDATE; + break; + case DocumentEventKind.CLOSE: + forest.deleteTree(uri); + forestEvent.kind = ForestEventKind.DELETE; + break; + } + + return of(forestEvent); + }) +); From 3564b9e01761a7478c9ee995dc24c766516fb662 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:43:28 -0800 Subject: [PATCH 40/87] Implement the DocumentSymbolProvider --- .../src/providers/DocumentSymbolProvider.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 server/src/providers/DocumentSymbolProvider.ts diff --git a/server/src/providers/DocumentSymbolProvider.ts b/server/src/providers/DocumentSymbolProvider.ts new file mode 100644 index 000000000..aa77b99c9 --- /dev/null +++ b/server/src/providers/DocumentSymbolProvider.ts @@ -0,0 +1,25 @@ +import { DocumentSymbol, DocumentSymbolParams, IConnection } from 'vscode-languageserver'; +import Provider from './Provider'; +import { analyses } from '../Analyzer'; + +export default class DocumentSymbolProvider extends Provider { + static register(connection: IConnection) { + return new DocumentSymbolProvider(connection); + } + + constructor(connection: IConnection) { + super(connection); + this.connection.onDocumentSymbol(this.handleDocumentSymbol); + } + + private handleDocumentSymbol = async ( + params: DocumentSymbolParams + ): Promise => { + const { + textDocument: { uri }, + } = params; + const analysis = analyses.getAnalysis(uri); + console.log(JSON.stringify(analysis.documentSymbols)); + return analysis.documentSymbols; + }; +} From 351b4d6b092450eb7b89b197b388d1c9104d9435 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:12:48 -0800 Subject: [PATCH 41/87] Don't pass forest into every provider --- server/src/Server.ts | 22 ++++++++-------------- server/src/providers/Provider.ts | 5 +---- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/server/src/Server.ts b/server/src/Server.ts index 2ee12d283..a773c6eb6 100644 --- a/server/src/Server.ts +++ b/server/src/Server.ts @@ -1,17 +1,12 @@ -import { - Connection, - InitializeParams, - InitializeResult, - RequestType, -} from 'vscode-languageserver'; +import { Connection, InitializeParams, InitializeResult, RequestType } from 'vscode-languageserver'; import { CapabilityCalculator } from './CapabilityCalculator'; -import { Forest } from './Forest'; import DocumentHighlightProvider from './providers/DocumentHighlightProvider'; import FoldingRangeProvider from './providers/FoldingRangeProvider'; import ConfigurationProvider from './providers/ConfigurationProvider'; import TextDocumentProvider from './providers/TextDocumentProvider'; import WorkspaceProvider from './providers/WorkspaceProvider'; +import DocumentSymbolProvider from './providers/DocumentSymbolProvider'; import { documents } from './DocumentManager'; import { @@ -46,7 +41,6 @@ namespace WorkspaceRubyEnvironmentRequest { export class Server implements ILanguageServer { public connection: Connection; private calculator: CapabilityCalculator; - private forest: Forest; constructor(connection: Connection, params: InitializeParams) { this.connection = connection; @@ -85,21 +79,21 @@ export class Server implements ILanguageServer { // registers providers on the initialize step public registerInitializeProviders(): void { // Handles highlight requests - DocumentHighlightProvider.register(this.connection, this.forest); + DocumentHighlightProvider.register(this.connection); // Handles folding requests - FoldingRangeProvider.register(this.connection, this.forest); + FoldingRangeProvider.register(this.connection); - // Handles text document changes and will delegate to other providers that need these events - TextDocumentProvider.register(this.connection, this.forest); + // Handles document symbol requests + DocumentSymbolProvider.register(this.connection); } // registers providers on the initialized step public registerInitializedProviders(): void { // Handles configuration changes - ConfigurationProvider.register(this.connection, this.forest); + ConfigurationProvider.register(this.connection); // Handle workspace changes - WorkspaceProvider.register(this.connection, this.forest); + WorkspaceProvider.register(this.connection); } } diff --git a/server/src/providers/Provider.ts b/server/src/providers/Provider.ts index 8cb112ba1..e6706b1e9 100644 --- a/server/src/providers/Provider.ts +++ b/server/src/providers/Provider.ts @@ -1,12 +1,9 @@ import { IConnection } from 'vscode-languageserver'; -import { IForest } from '../Forest'; export default abstract class Provider { protected connection: IConnection; - protected forest: IForest; - constructor(connection: IConnection, forest: IForest) { + constructor(connection: IConnection) { this.connection = connection; - this.forest = forest; } } From 544be459c8f248354dfca600fb2f2201ffafc9d8 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:14:44 -0800 Subject: [PATCH 42/87] Add base linter which emits diagnostics on document events --- server/src/Linter.ts | 74 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 server/src/Linter.ts diff --git a/server/src/Linter.ts b/server/src/Linter.ts new file mode 100644 index 000000000..d9a8ee607 --- /dev/null +++ b/server/src/Linter.ts @@ -0,0 +1,74 @@ +import URI from 'vscode-uri'; +import { empty, iif, from, Observable } from 'rxjs'; +import { map, mergeMap, switchMap } from 'rxjs/operators'; +import { Diagnostic, TextDocument } from 'vscode-languageserver'; +import { + documentConfigurationCache, + RubyEnvironment, + workspaceRubyEnvironmentCache, + RubyConfiguration, + RubyLintConfiguration, +} from './SettingsCache'; +import { ILinter, LinterConfig, RuboCop, Reek } from './linters'; +import { documents, DocumentEvent, DocumentEventKind } from './DocumentManager'; + +const LINTER_MAP = { + rubocop: RuboCop, + reek: Reek, +}; + +export type LintResult = { + document: TextDocument; + diagnostics: Diagnostic[]; + error?: string; +}; + +function getLinter( + name: string, + document: TextDocument, + env: RubyEnvironment, + config: RubyConfiguration +): ILinter { + const lintConfig: RubyLintConfiguration = + typeof config.lint[name] === 'object' ? config.lint[name] : {}; + const linterConfig: LinterConfig = { + env, + executionRoot: URI.parse(config.workspaceFolderUri).fsPath, + config: lintConfig, + }; + return new LINTER_MAP[name](document, linterConfig); +} + +function lint(document: TextDocument): Observable { + return from(documentConfigurationCache.get(document)).pipe( + mergeMap( + config => workspaceRubyEnvironmentCache.get(config.workspaceFolderUri), + (config, env) => { + return { config, env }; + } + ), + switchMap(({ config, env }) => { + return from(Object.keys(config.lint)).pipe( + mergeMap(l => { + return iif(() => config.lint[l], getLinter(l, document, env, config).lint(), empty()); + }) + ); + }), + map(diagnostics => { + return { + document, + diagnostics, + }; + }) + ); +} + +export const linter = documents.subject.pipe( + switchMap((event: DocumentEvent) => + iif( + () => + event.kind === DocumentEventKind.OPEN || event.kind === DocumentEventKind.CHANGE_CONTENT, + lint(event.document) + ) + ) +); From e7fd58617224811fad1eb7122f27a197aeca10e7 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:19:54 -0800 Subject: [PATCH 43/87] Hook up the Linter events to send diagnostics --- server/src/Server.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/server/src/Server.ts b/server/src/Server.ts index a773c6eb6..89c24e1f4 100644 --- a/server/src/Server.ts +++ b/server/src/Server.ts @@ -9,6 +9,8 @@ import WorkspaceProvider from './providers/WorkspaceProvider'; import DocumentSymbolProvider from './providers/DocumentSymbolProvider'; import { documents } from './DocumentManager'; +import { LintResult, linter } from './Linter'; + import { documentConfigurationCache, workspaceRubyEnvironmentCache, @@ -48,6 +50,12 @@ export class Server implements ILanguageServer { documents.listen(connection); + linter.subscribe({ + next: (result: LintResult) => { + connection.sendDiagnostics({ uri: result.document.uri, diagnostics: result.diagnostics }); + }, + }); + if (this.calculator.clientCapabilities.workspace.rubyEnvironment) { workspaceRubyEnvironmentCache.fetcher = async ( folders: string[] From 58d7eafa1436665edd7021fff77bae283e2accab Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:23:37 -0800 Subject: [PATCH 44/87] Remove TextDocumentProvider as the DocumentManager does this now --- server/src/Server.ts | 2 +- server/src/providers/TextDocumentProvider.ts | 46 -------------------- 2 files changed, 1 insertion(+), 47 deletions(-) delete mode 100644 server/src/providers/TextDocumentProvider.ts diff --git a/server/src/Server.ts b/server/src/Server.ts index 89c24e1f4..7052d3bc0 100644 --- a/server/src/Server.ts +++ b/server/src/Server.ts @@ -4,7 +4,6 @@ import { CapabilityCalculator } from './CapabilityCalculator'; import DocumentHighlightProvider from './providers/DocumentHighlightProvider'; import FoldingRangeProvider from './providers/FoldingRangeProvider'; import ConfigurationProvider from './providers/ConfigurationProvider'; -import TextDocumentProvider from './providers/TextDocumentProvider'; import WorkspaceProvider from './providers/WorkspaceProvider'; import DocumentSymbolProvider from './providers/DocumentSymbolProvider'; @@ -17,6 +16,7 @@ import { RubyConfiguration, RubyEnvironment, } from './SettingsCache'; + export interface ILanguageServer { readonly capabilities: InitializeResult; registerInitializeProviders(); diff --git a/server/src/providers/TextDocumentProvider.ts b/server/src/providers/TextDocumentProvider.ts deleted file mode 100644 index 578ccca49..000000000 --- a/server/src/providers/TextDocumentProvider.ts +++ /dev/null @@ -1,46 +0,0 @@ -import Provider from './Provider'; -import ASTProvider from './ASTProvider'; -import DiagnosticsProvider from './DiagnosticsProvider'; -import { - IConnection, - DidChangeTextDocumentParams, - DidCloseTextDocumentParams, - DidOpenTextDocumentParams, -} from 'vscode-languageserver'; -import { IForest } from '../Forest'; - -export default class TextDocumentProvider extends Provider { - private astProvider: ASTProvider; - private diagnosticsProvider: DiagnosticsProvider; - - static register(connection: IConnection, forest: IForest) { - return new TextDocumentProvider(connection, forest); - } - - constructor(connection: IConnection, forest: IForest) { - super(connection, forest); - - this.astProvider = new ASTProvider(connection, forest); - this.diagnosticsProvider = new DiagnosticsProvider(connection, forest); - - this.connection.onDidOpenTextDocument(this.handleDidOpenTextDocument); - this.connection.onDidChangeTextDocument(this.handleDidChangeTextDocument); - this.connection.onDidCloseTextDocument(this.handleCloseTextDocument); - } - - private handleDidOpenTextDocument = async (params: DidOpenTextDocumentParams): Promise => { - this.astProvider.handleOpenTextDocument(params); - this.diagnosticsProvider.computeDiagnostics(params); - }; - - private handleDidChangeTextDocument = async ( - params: DidChangeTextDocumentParams - ): Promise => { - this.astProvider.handleChangeTextDocument(params); - this.diagnosticsProvider.computeDiagnostics(params); - }; - - private handleCloseTextDocument = async (params: DidCloseTextDocumentParams): Promise => { - this.astProvider.handleCloseTextDocument(params); - }; -} From 68b2b6b366f3d8a9226a3f3e0de07780a3473cf8 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:24:36 -0800 Subject: [PATCH 45/87] Set up config fetcher for the documentConfigurationCache --- server/src/Server.ts | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/server/src/Server.ts b/server/src/Server.ts index 7052d3bc0..891ba55dc 100644 --- a/server/src/Server.ts +++ b/server/src/Server.ts @@ -1,4 +1,10 @@ -import { Connection, InitializeParams, InitializeResult, RequestType } from 'vscode-languageserver'; +import { + ConfigurationItem, + Connection, + InitializeParams, + InitializeResult, + RequestType, +} from 'vscode-languageserver'; import { CapabilityCalculator } from './CapabilityCalculator'; import DocumentHighlightProvider from './providers/DocumentHighlightProvider'; @@ -56,6 +62,18 @@ export class Server implements ILanguageServer { }, }); + documentConfigurationCache.fetcher = async ( + targets: string[] + ): Promise => { + const items: ConfigurationItem[] = targets.map(t => { + return { + scopeUri: t, + section: 'ruby', + }; + }); + return this.connection.workspace.getConfiguration(items); + }; + if (this.calculator.clientCapabilities.workspace.rubyEnvironment) { workspaceRubyEnvironmentCache.fetcher = async ( folders: string[] From b82d390ef16aba3748e63f7db554cf89af18e822 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:26:12 -0800 Subject: [PATCH 46/87] Change WorkspaceProvider to load the ruby environment on changes Add a handler for watched file changes --- server/src/providers/WorkspaceProvider.ts | 32 ++++++++++++++++------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/server/src/providers/WorkspaceProvider.ts b/server/src/providers/WorkspaceProvider.ts index 98c116550..f4ae777c4 100644 --- a/server/src/providers/WorkspaceProvider.ts +++ b/server/src/providers/WorkspaceProvider.ts @@ -1,25 +1,37 @@ import Provider from './Provider'; -import { IConnection, WorkspaceFoldersChangeEvent } from 'vscode-languageserver'; -import { IForest } from '../Forest'; +import { + DidChangeWatchedFilesParams, + IConnection, + WorkspaceFoldersChangeEvent, +} from 'vscode-languageserver'; -import { config } from '../ServerConfiguration'; +import { workspaceRubyEnvironmentCache } from '../SettingsCache'; export default class WorkspaceProvider extends Provider { - static register(connection: IConnection, forest: IForest) { - return new WorkspaceProvider(connection, forest); + static register(connection: IConnection) { + return new WorkspaceProvider(connection); } - constructor(connection: IConnection, forest: IForest) { - super(connection, forest); + constructor(connection: IConnection) { + super(connection); this.connection.workspace.onDidChangeWorkspaceFolders(this.handleWorkspaceFoldersChange); + this.connection.onDidChangeWatchedFiles(this.handleDidChangeWatchedFiles); } private handleWorkspaceFoldersChange = async ( event: WorkspaceFoldersChangeEvent ): Promise => { - const loaders = event.added.map(folder => config.loadWorkspaceEnvironment(folder)); - const removers = event.removed.map(folder => config.removeWorkspaceEnvironment(folder)); - await Promise.all(loaders.concat(removers)); + const loader = workspaceRubyEnvironmentCache.getAll(event.added); + const remover = workspaceRubyEnvironmentCache.deleteAll(event.removed); + await Promise.all([loader, remover]); + }; + + private handleDidChangeWatchedFiles = async ( + params: DidChangeWatchedFilesParams + ): Promise => { + console.log('Watched file change!'); + console.log(params); + // TODO load workspace environment again based on workspace where the file changed }; } From fc5dd83383c9f34306b5d35a54e832fb9f508cd8 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:26:50 -0800 Subject: [PATCH 47/87] Remove DiagnosticsProvider as the Analyzer will do this stuff --- server/src/providers/DiagnosticsProvider.ts | 22 --------------------- 1 file changed, 22 deletions(-) delete mode 100644 server/src/providers/DiagnosticsProvider.ts diff --git a/server/src/providers/DiagnosticsProvider.ts b/server/src/providers/DiagnosticsProvider.ts deleted file mode 100644 index 6ec2c33fa..000000000 --- a/server/src/providers/DiagnosticsProvider.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { - IConnection, - DidOpenTextDocumentParams, - DidChangeTextDocumentParams, -} from 'vscode-languageserver'; -import { IForest } from '../Forest'; - -import Provider from './Provider'; - -export default class DiagnosticsProvider extends Provider { - static register(connection: IConnection, forest: IForest) { - return new DiagnosticsProvider(connection, forest); - } - - constructor(connection: IConnection, forest: IForest) { - super(connection, forest); - } - - public computeDiagnostics = async ( - _params: DidOpenTextDocumentParams | DidChangeTextDocumentParams - ) => {}; -} From 9b695fac46a16c43eb2fe1419bd53c63ee64de55 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:27:10 -0800 Subject: [PATCH 48/87] Remove ASTProvider as DocumentManager streams to the Forest now --- server/src/CapabilityCalculator.ts | 2 +- server/src/providers/ASTProvider.ts | 88 ----------------------------- 2 files changed, 1 insertion(+), 89 deletions(-) delete mode 100644 server/src/providers/ASTProvider.ts diff --git a/server/src/CapabilityCalculator.ts b/server/src/CapabilityCalculator.ts index 11c2ed897..626ccaa8c 100644 --- a/server/src/CapabilityCalculator.ts +++ b/server/src/CapabilityCalculator.ts @@ -30,7 +30,7 @@ export class CapabilityCalculator { this.capabilities = { // Perform incremental syncs // Incremental sync is disabled for now due to not being able to get the - // old text in ASTProvider + // old text // textDocumentSync: TextDocumentSyncKind.Incremental, textDocumentSync: TextDocumentSyncKind.Full, documentHighlightProvider: true, diff --git a/server/src/providers/ASTProvider.ts b/server/src/providers/ASTProvider.ts deleted file mode 100644 index 4d363fa08..000000000 --- a/server/src/providers/ASTProvider.ts +++ /dev/null @@ -1,88 +0,0 @@ -/** - * ASTProvider - */ - -import Parser, { Point, SyntaxNode, Tree } from 'tree-sitter'; -import TreeSitterRuby from 'tree-sitter-ruby'; - -import { - DidChangeTextDocumentParams, - DidCloseTextDocumentParams, - DidOpenTextDocumentParams, - IConnection, - TextDocumentIdentifier, - TextDocumentItem, - VersionedTextDocumentIdentifier, -} from 'vscode-languageserver'; - -import { IForest } from '../Forest'; -import { Position } from '../Position'; -import Provider from './Provider'; - -export default class ASTProvider extends Provider { - private parser: Parser; - - static register(connection: IConnection, forest: IForest) { - return new ASTProvider(connection, forest); - } - - constructor(connection: IConnection, forest: IForest) { - super(connection, forest); - - this.parser = new Parser(); - this.parser.setLanguage(TreeSitterRuby); - } - - public handleOpenTextDocument = async (params: DidOpenTextDocumentParams): Promise => { - const document: TextDocumentItem = params.textDocument; - const tree: Tree = this.parser.parse(document.text); - this.forest.setTree(document.uri, tree); - }; - - public handleChangeTextDocument = async (params: DidChangeTextDocumentParams): Promise => { - const document: VersionedTextDocumentIdentifier = params.textDocument; - let tree: Tree = this.forest.getTree(document.uri); - if (tree !== undefined) { - for (const changeEvent of params.contentChanges) { - if (changeEvent.range && changeEvent.rangeLength) { - // range is range of the change. end is exclusive - // rangeLength is length of text removed - // text is new text - const { range, rangeLength, text } = changeEvent; - const startIndex: number = range.start.line * range.start.character; - const oldEndIndex: number = startIndex + rangeLength - 1; - tree.edit({ - startIndex, // index in old doc the change started - oldEndIndex, // end index for old version of text - newEndIndex: range.end.line * range.end.character - 1, // end index for new version of text - - startPosition: Position.FROM_VS_POSITION(range.start).toTSPosition(), // position in old doc change started - oldEndPosition: this.computeEndPosition(startIndex, oldEndIndex, tree), // position in old doc change ended. - newEndPosition: Position.FROM_VS_POSITION(range.end).toTSPosition(), // position in new doc change ended - }); - tree = this.parser.parse(text, tree); - } else { - tree = this.buildTree(changeEvent.text); - } - } - } - - this.forest.setTree(document.uri, tree); - }; - - public handleCloseTextDocument = async (params: DidCloseTextDocumentParams): Promise => { - const document: TextDocumentIdentifier = params.textDocument; - this.forest.removeTree(document.uri); - }; - - private buildTree = (text: string): Tree => { - return this.parser.parse(text); - }; - - private computeEndPosition = (startIndex: number, endIndex: number, tree: Tree): Point => { - // TODO handle case where this method call fails for whatever reason - const node: SyntaxNode = tree.rootNode.descendantForIndex(startIndex, endIndex); - - return node.endPosition; - }; -} From c55aaca5409b56c910dbc36a02341644636d475a Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:38:42 -0800 Subject: [PATCH 49/87] Add BaseAnalyzer abstract class --- server/src/analyzers/BaseAnalyzer.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 server/src/analyzers/BaseAnalyzer.ts diff --git a/server/src/analyzers/BaseAnalyzer.ts b/server/src/analyzers/BaseAnalyzer.ts new file mode 100644 index 000000000..f586a4554 --- /dev/null +++ b/server/src/analyzers/BaseAnalyzer.ts @@ -0,0 +1,17 @@ +import { SyntaxNode } from 'tree-sitter'; + +export default abstract class BaseAnalyzer { + public diagnostics: T[]; + + constructor() { + this.diagnostics = [] as T[]; + } + + public analyze(node: SyntaxNode): void { + console.log(node); + } + + public flush(): void { + this.diagnostics = [] as T[]; + } +} From 54363d527cb38e845be9e5e7f7f2af4415de6cbe Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:38:59 -0800 Subject: [PATCH 50/87] Add FoldingRangeAnalyzer --- server/src/analyzers/FoldingRangeAnalyzer.ts | 171 +++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 server/src/analyzers/FoldingRangeAnalyzer.ts diff --git a/server/src/analyzers/FoldingRangeAnalyzer.ts b/server/src/analyzers/FoldingRangeAnalyzer.ts new file mode 100644 index 000000000..82418074d --- /dev/null +++ b/server/src/analyzers/FoldingRangeAnalyzer.ts @@ -0,0 +1,171 @@ +import { FoldingRange, FoldingRangeKind } from 'vscode-languageserver'; +import { SyntaxNode } from 'tree-sitter'; +import BaseAnalyzer from './BaseAnalyzer'; + +interface IFoldHeuristic { + start?: { + row?: number; + column?: number; + }; + end?: { + row?: number; + column?: number; + }; +} + +class FoldHeuristic { + private heuristic: IFoldHeuristic; + private readonly defaultHeuristic = { + row: 0, + column: 0, + }; + + constructor(heuristic = {}) { + this.heuristic = heuristic; + } + + get start() { + return { + ...this.defaultHeuristic, + ...this.heuristic.start, + }; + } + + get end() { + return { + ...this.defaultHeuristic, + ...this.heuristic.end, + }; + } +} + +export default class FoldingRangeAnalyzer extends BaseAnalyzer { + private FOLD_NODES: Map = new Map([ + [ + 'array', + new FoldHeuristic({ + end: { + row: -1, + }, + }), + ], + ['block', new FoldHeuristic()], + [ + 'case', + new FoldHeuristic({ + end: { + row: -1, + }, + }), + ], + [ + 'class', + new FoldHeuristic({ + end: { + row: -1, + }, + }), + ], + ['comment', new FoldHeuristic()], + [ + 'begin', + new FoldHeuristic({ + end: { + row: -1, + }, + }), + ], + ['do_block', new FoldHeuristic()], + [ + 'hash', + new FoldHeuristic({ + end: { + row: -1, + }, + }), + ], + [ + 'heredoc_body', + new FoldHeuristic({ + start: { + row: -1, + }, + end: { + row: -1, + }, + }), + ], + ['then', new FoldHeuristic()], // body of an if and unless statement + ['else', new FoldHeuristic()], + [ + 'method', + new FoldHeuristic({ + end: { + row: -1, + }, + }), + ], + [ + 'module', + new FoldHeuristic({ + end: { + row: -1, + }, + }), + ], + [ + 'singleton_method', + new FoldHeuristic({ + end: { + row: -1, + }, + }), + ], + ]); + private lastNodeAnalyzed: SyntaxNode; + + get foldingRanges() { + return this.diagnostics; + } + + public analyze(node: SyntaxNode): void { + if (this.FOLD_NODES.has(node.type)) { + const heuristic: IFoldHeuristic = this.FOLD_NODES.get(node.type); + if (this.determineImplicitBlock(node, this.lastNodeAnalyzed) && this.diagnostics.length > 0) { + const foldingRange: FoldingRange = this.diagnostics[this.diagnostics.length - 1]; + foldingRange.endLine = node.endPosition.row; + foldingRange.endCharacter = node.endPosition.column; + } else { + this.diagnostics.push({ + startLine: node.startPosition.row + heuristic.start.row, + startCharacter: node.startPosition.column + heuristic.start.column, + endLine: node.endPosition.row + heuristic.end.row, + endCharacter: node.endPosition.column + heuristic.end.column, + kind: this.getFoldKind(node.type), + }); + } + this.lastNodeAnalyzed = node; + } + } + + private getFoldKind(nodeType: string): FoldingRangeKind { + switch (nodeType) { + case 'comment': + return FoldingRangeKind.Comment; + case 'require': + return FoldingRangeKind.Imports; + default: + return FoldingRangeKind.Region; + } + } + + private determineImplicitBlock(node: SyntaxNode, lastNode: SyntaxNode): boolean { + return ( + node.type === 'comment' && + node.text[0] === '#' && + lastNode && + lastNode.type === 'comment' && + lastNode.text[0] === '#' + ); + } +} From c692f7f61bd6d7a89c4d438b446ff7d8ee1b004e Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:39:59 -0800 Subject: [PATCH 51/87] Add DocumentHighlightAnalyzer This is based on the old algorithm and computes the highlights on the fly --- .../analyzers/DocumentHighlightAnalyzer.ts | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 server/src/analyzers/DocumentHighlightAnalyzer.ts diff --git a/server/src/analyzers/DocumentHighlightAnalyzer.ts b/server/src/analyzers/DocumentHighlightAnalyzer.ts new file mode 100644 index 000000000..b8ac336ff --- /dev/null +++ b/server/src/analyzers/DocumentHighlightAnalyzer.ts @@ -0,0 +1,75 @@ +import { DocumentHighlight, DocumentHighlightKind, Range } from 'vscode-languageserver'; +import { SyntaxNode, Tree } from 'tree-sitter'; +import Position from '../util/Position'; +import { forest } from '../Forest'; + +export default class DocumentHighlightAnalyzer { + private static readonly BEGIN_TYPES: Set = new Set([ + 'begin', + 'def', + 'if', + 'case', + 'unless', + 'do', + 'class', + 'module', + ]); + + public static async analyze(uri: string, position: Position): Promise { + const tree: Tree = forest.getTree(uri); + + return this.computeHighlights(tree, position); + } + + private static computeHighlights(tree: Tree, position: Position): DocumentHighlight[] { + const rootNode: SyntaxNode = tree.rootNode; + const node: SyntaxNode = rootNode.descendantForPosition(position.toTSPosition()); + let highlights: DocumentHighlight[] = []; + if (node.type === 'end') { + highlights = highlights.concat(this.computeEndHighlight(node)); + } + if (!node.isNamed && this.BEGIN_TYPES.has(node.type)) { + highlights = highlights.concat(this.computeBeginHighlight(node)); + } + return highlights; + } + + private static computeBeginHighlight(node: SyntaxNode): DocumentHighlight[] { + const endNode: SyntaxNode = node.parent.lastChild; + return [ + DocumentHighlight.create( + Range.create( + Position.fromTSPosition(node.startPosition).toVSPosition(), + Position.fromTSPosition(node.endPosition).toVSPosition() + ), + DocumentHighlightKind.Text + ), + DocumentHighlight.create( + Range.create( + Position.fromTSPosition(endNode.startPosition).toVSPosition(), + Position.fromTSPosition(endNode.endPosition).toVSPosition() + ), + DocumentHighlightKind.Text + ), + ]; + } + private static computeEndHighlight(node: SyntaxNode): DocumentHighlight[] { + const startNode: SyntaxNode = node.parent.firstChild; + return [ + DocumentHighlight.create( + Range.create( + Position.fromTSPosition(startNode.startPosition).toVSPosition(), + Position.fromTSPosition(startNode.endPosition).toVSPosition() + ), + DocumentHighlightKind.Text + ), + DocumentHighlight.create( + Range.create( + Position.fromTSPosition(node.startPosition).toVSPosition(), + Position.fromTSPosition(node.endPosition).toVSPosition() + ), + DocumentHighlightKind.Text + ), + ]; + } +} From b41400ccee504f8327f81881e053c9555b15ee8c Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:41:02 -0800 Subject: [PATCH 52/87] Add DocumentSymbolAnalyzer --- .../src/analyzers/DocumentSymbolAnalyzer.ts | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 server/src/analyzers/DocumentSymbolAnalyzer.ts diff --git a/server/src/analyzers/DocumentSymbolAnalyzer.ts b/server/src/analyzers/DocumentSymbolAnalyzer.ts new file mode 100644 index 000000000..5d738f3fd --- /dev/null +++ b/server/src/analyzers/DocumentSymbolAnalyzer.ts @@ -0,0 +1,46 @@ +import { DocumentSymbol } from 'vscode-languageserver'; +import { SyntaxNode } from 'tree-sitter'; +import BaseAnalyzer from './BaseAnalyzer'; +import { Position, Stack } from '../util'; +import RubyDocumentSymbol, { isWrapper } from '../util/RubyDocumentSymbol'; + +export default class DocumentSymbolAnalyzer extends BaseAnalyzer { + private symbolStack: Stack; + private nodeStack: Stack; + + constructor() { + super(); + this.symbolStack = new Stack(); + this.nodeStack = new Stack(); + } + + get symbols() { + return this.diagnostics; + } + + public analyze(node: SyntaxNode): void { + const symbol = RubyDocumentSymbol.build(node); + + if (symbol) { + // empty nodeStack means we are at document root + if (this.nodeStack.empty()) { + this.diagnostics = this.diagnostics.concat(symbol); + } else { + const topSymbol = this.symbolStack.peek(); + topSymbol.children = topSymbol.children.concat(symbol); + } + } + + // Stack management + if (isWrapper(node) && symbol && !Array.isArray(symbol)) { + this.symbolStack.push(symbol); + this.nodeStack.push(node); + } else if ( + !this.nodeStack.empty() && + Position.tsPositionIsEqual(this.nodeStack.peek().endPosition, node.endPosition) + ) { + this.nodeStack.pop(); + this.symbolStack.pop(); + } + } +} From 0a0e79bd34c0676cfbcaf911a7f54fe529ff284a Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:41:26 -0800 Subject: [PATCH 53/87] Add Analyzer that will take the Forest stream and run analyzers over it --- server/src/Analyzer.ts | 88 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 server/src/Analyzer.ts diff --git a/server/src/Analyzer.ts b/server/src/Analyzer.ts new file mode 100644 index 000000000..abcd3dc04 --- /dev/null +++ b/server/src/Analyzer.ts @@ -0,0 +1,88 @@ +import { DocumentSymbol, FoldingRange } from 'vscode-languageserver'; +import { Observer } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { Tree, SyntaxNode } from 'tree-sitter'; +import DocumentSymbolAnalyzer from './analyzers/DocumentSymbolAnalyzer'; +import { forestStream } from './Forest'; +import FoldingRangeAnalyzer from './analyzers/FoldingRangeAnalyzer'; + +type Analysis = { + uri: string; + foldingRanges: FoldingRange[]; + documentSymbols: DocumentSymbol[]; +}; + +class Analyzer { + private foldingRangeAnalyzer: FoldingRangeAnalyzer; + private documentSymbolAnalyzer: DocumentSymbolAnalyzer; + + constructor(public uri: string) { + this.foldingRangeAnalyzer = new FoldingRangeAnalyzer(); + this.documentSymbolAnalyzer = new DocumentSymbolAnalyzer(); + } + + get analysis() { + return { + uri: this.uri, + foldingRanges: this.foldingRangeAnalyzer.foldingRanges, + documentSymbols: this.documentSymbolAnalyzer.symbols, + }; + } + + public analyze(tree: Tree): Analysis { + const cursor = tree.walk(); + const walk = depth => { + this.analyzeNode(cursor.currentNode); + if (cursor.gotoFirstChild()) { + do { + walk(depth + 1); + } while (cursor.gotoNextSibling()); + cursor.gotoParent(); + } + }; + walk(0); + + return this.analysis; + } + + private analyzeNode(node: SyntaxNode): void { + this.foldingRangeAnalyzer.analyze(node); + this.documentSymbolAnalyzer.analyze(node); + } +} + +class Analyses implements Observer { + public closed: boolean; + private analyses: Map; + + constructor() { + this.closed = false; + this.analyses = new Map(); + } + + public next(analysis: Analysis): void { + this.analyses.set(analysis.uri, analysis); + } + + public error(err: any): void { + console.log(err); + } + + public complete(): void { + this.closed = true; + } + + public getAnalysis(uri: string): Analysis { + return this.analyses.get(uri); + } +} + +export const analyses = new Analyses(); +forestStream + .pipe( + map(({ document, tree }) => { + const analyzer = new Analyzer(document.uri); + return analyzer.analyze(tree); + }) + ) + .subscribe(analyses); From 43d151f232a30ee2b24cf9daad37dbd4fe65f452 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:41:47 -0800 Subject: [PATCH 54/87] Declare document symbol support --- server/src/CapabilityCalculator.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/server/src/CapabilityCalculator.ts b/server/src/CapabilityCalculator.ts index 626ccaa8c..8ebe8d1c7 100644 --- a/server/src/CapabilityCalculator.ts +++ b/server/src/CapabilityCalculator.ts @@ -34,6 +34,7 @@ export class CapabilityCalculator { // textDocumentSync: TextDocumentSyncKind.Incremental, textDocumentSync: TextDocumentSyncKind.Full, documentHighlightProvider: true, + documentSymbolProvider: true, foldingRangeProvider: true, }; From 8681ff9349ed8fd2e935515195dd9f3a7adbce64 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:43:00 -0800 Subject: [PATCH 55/87] Have FoldingRangeProvider use the last analysis --- server/src/providers/FoldingRangeProvider.ts | 60 +++++--------------- 1 file changed, 13 insertions(+), 47 deletions(-) diff --git a/server/src/providers/FoldingRangeProvider.ts b/server/src/providers/FoldingRangeProvider.ts index efb31da1c..207e2f45a 100644 --- a/server/src/providers/FoldingRangeProvider.ts +++ b/server/src/providers/FoldingRangeProvider.ts @@ -1,66 +1,32 @@ /* - * FoldingProvider - * - * Super basic highlight provider + * FoldingRangeProvider */ -import { SyntaxNode, Tree } from 'tree-sitter'; import { FoldingRange, - FoldingRangeKind, FoldingRangeRequest, - FoldingRangeRequestParam, + FoldingRangeParams, IConnection, } from 'vscode-languageserver'; -import { IForest } from '../Forest'; import Provider from './Provider'; +import { analyses } from '../Analyzer'; export default class FoldingRangeProvider extends Provider { - private readonly FOLD_CONSTRUCTS: Set = new Set([ - 'begin', - 'def', - 'if', - 'case', - 'unless', - 'do', - 'class', - 'module', - ]); - - static register(connection: IConnection, forest: IForest) { - return new FoldingRangeProvider(connection, forest); + static register(connection: IConnection) { + return new FoldingRangeProvider(connection); } - constructor(connection: IConnection, forest: IForest) { - super(connection, forest); + constructor(connection: IConnection) { + super(connection); this.connection.onRequest(FoldingRangeRequest.type, this.handleFoldingRange); } - protected handleFoldingRange = async ( - param: FoldingRangeRequestParam - ): Promise => { - const folds: FoldingRange[] = []; - - const tree: Tree = this.forest.getTree(param.textDocument.uri); - - const traverse: (node: SyntaxNode) => void = (node: SyntaxNode): void => { - if (!node.isNamed && this.FOLD_CONSTRUCTS.has(node.type)) { - const endNode: SyntaxNode = node.parent.lastChild; - folds.push({ - startLine: node.startPosition.row, - startCharacter: node.startPosition.column, - endLine: endNode.endPosition.row, - endCharacter: node.endPosition.column, - kind: FoldingRangeKind.Region, - }); - } - for (const childNode of node.children) { - traverse(childNode); - } - }; - traverse(tree.rootNode); - - return folds; + protected handleFoldingRange = async (params: FoldingRangeParams): Promise => { + const { + textDocument: { uri }, + } = params; + const analysis = analyses.getAnalysis(uri); + return analysis.foldingRanges; }; } From 39847b47ec34740f2faa4a1e6cb3657474918de2 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:43:16 -0800 Subject: [PATCH 56/87] Have the DocumentHighlightProvider use DocumentHighlightAnalyzer --- .../providers/DocumentHighlightProvider.ts | 101 +++--------------- 1 file changed, 13 insertions(+), 88 deletions(-) diff --git a/server/src/providers/DocumentHighlightProvider.ts b/server/src/providers/DocumentHighlightProvider.ts index 2ddad0136..39d324248 100644 --- a/server/src/providers/DocumentHighlightProvider.ts +++ b/server/src/providers/DocumentHighlightProvider.ts @@ -4,105 +4,30 @@ * Super basic highlight provider */ -import { SyntaxNode, Tree } from 'tree-sitter'; -import { - DocumentHighlight, - DocumentHighlightKind, - IConnection, - Range, - TextDocumentPositionParams, -} from 'vscode-languageserver'; -import { IForest } from '../Forest'; -import { Position } from '../Position'; +import { DocumentHighlight, IConnection, TextDocumentPositionParams } from 'vscode-languageserver'; +import Position from '../util/Position'; import Provider from './Provider'; +import DocumentHighlightAnalyzer from '../analyzers/DocumentHighlightAnalyzer'; // TODO support more highlight use cases than just balanced pairs export default class DocumentHighlightProvider extends Provider { - private readonly BEGIN_TYPES: Set = new Set([ - 'begin', - 'def', - 'if', - 'case', - 'unless', - 'do', - 'class', - 'module', - ]); - - static register(connection: IConnection, forest: IForest) { - return new DocumentHighlightProvider(connection, forest); + static register(connection: IConnection) { + return new DocumentHighlightProvider(connection); } - constructor(connection: IConnection, forest: IForest) { - super(connection, forest); - + constructor(connection: IConnection) { + super(connection); this.connection.onDocumentHighlight(this.handleDocumentHighlight); } protected handleDocumentHighlight = async ( - textDocumentPosition: TextDocumentPositionParams + params: TextDocumentPositionParams ): Promise => { - const tree: Tree = this.forest.getTree(textDocumentPosition.textDocument.uri); - const rootNode: SyntaxNode = tree.rootNode; - const position: Position = Position.FROM_VS_POSITION(textDocumentPosition.position); - const node: SyntaxNode = rootNode.descendantForPosition(position.toTSPosition()); - - return this.computeHighlights(node); + const position: Position = Position.fromVSPosition(params.position); + const { + textDocument: { uri }, + } = params; + return DocumentHighlightAnalyzer.analyze(uri, position); }; - - private computeHighlights(node: SyntaxNode): DocumentHighlight[] { - let highlights: DocumentHighlight[] = []; - - if (node.type === 'end') { - highlights = highlights.concat(this.computeEndHighlight(node)); - } - if (!node.isNamed && this.BEGIN_TYPES.has(node.type)) { - highlights = highlights.concat(this.computeBeginHighlight(node)); - } - - return highlights; - } - - private computeBeginHighlight(node: SyntaxNode): DocumentHighlight[] { - const endNode: SyntaxNode = node.parent.lastChild; - - return [ - DocumentHighlight.create( - Range.create( - Position.FROM_TS_POSITION(node.startPosition).toVSPosition(), - Position.FROM_TS_POSITION(node.endPosition).toVSPosition() - ), - DocumentHighlightKind.Text - ), - DocumentHighlight.create( - Range.create( - Position.FROM_TS_POSITION(endNode.startPosition).toVSPosition(), - Position.FROM_TS_POSITION(endNode.endPosition).toVSPosition() - ), - DocumentHighlightKind.Text - ), - ]; - } - - private computeEndHighlight(node: SyntaxNode): DocumentHighlight[] { - const startNode: SyntaxNode = node.parent.firstChild; - - return [ - DocumentHighlight.create( - Range.create( - Position.FROM_TS_POSITION(startNode.startPosition).toVSPosition(), - Position.FROM_TS_POSITION(startNode.endPosition).toVSPosition() - ), - DocumentHighlightKind.Text - ), - DocumentHighlight.create( - Range.create( - Position.FROM_TS_POSITION(node.startPosition).toVSPosition(), - Position.FROM_TS_POSITION(node.endPosition).toVSPosition() - ), - DocumentHighlightKind.Text - ), - ]; - } } From 8e25ab16ef9064c0666515a9f50fe9e0fdd805cf Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:45:00 -0800 Subject: [PATCH 57/87] Add util/index.ts for convenience --- server/src/util/index.ts | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 server/src/util/index.ts diff --git a/server/src/util/index.ts b/server/src/util/index.ts new file mode 100644 index 000000000..8d1671b80 --- /dev/null +++ b/server/src/util/index.ts @@ -0,0 +1,3 @@ +export { default as Position } from './Position'; +export { default as RubyDocumentSymbol } from './RubyDocumentSymbol'; +export { default as Stack } from './Stack'; From edb5ec37b15d3dce1866bd80c4e680a7c20701d7 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:45:56 -0800 Subject: [PATCH 58/87] Update ConfigurationProvider to flush the documentConfigurationCache The language server protocol uses a pull model for configs so all we can do is flush on change --- server/src/providers/ConfigurationProvider.ts | 27 ++++++++++++------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/server/src/providers/ConfigurationProvider.ts b/server/src/providers/ConfigurationProvider.ts index 1e92e2968..33fd02068 100644 --- a/server/src/providers/ConfigurationProvider.ts +++ b/server/src/providers/ConfigurationProvider.ts @@ -1,19 +1,26 @@ -import { IConnection, DidChangeConfigurationParams } from 'vscode-languageserver'; -import { IForest } from '../Forest'; +import { + IConnection, + DidChangeConfigurationParams, + DidChangeConfigurationNotification, +} from 'vscode-languageserver'; import Provider from './Provider'; +import { documentConfigurationCache } from '../SettingsCache'; export default class ConfigurationProvider extends Provider { - static register(connection: IConnection, forest: IForest) { - return new ConfigurationProvider(connection, forest); + static register(connection: IConnection) { + return new ConfigurationProvider(connection); } - constructor(connection: IConnection, forest: IForest) { - super(connection, forest); + constructor(connection: IConnection) { + super(connection); - this.connection.onDidChangeConfiguration(this.handleConfigurationChange); + this.connection.client.register(DidChangeConfigurationNotification.type, undefined); + this.connection.onDidChangeConfiguration(this.handleDidChangeConfiguration); } - private handleConfigurationChange(event: DidChangeConfigurationParams) { - console.log(event.settings); - } + private handleDidChangeConfiguration = async ( + _params: DidChangeConfigurationParams // params is empty in the pull config model + ): Promise => { + documentConfigurationCache.flush(); + }; } From 541e97813700dee627d549c6fea4a1c507783a0c Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 14:46:47 -0800 Subject: [PATCH 59/87] Handle unhandled promise rejects to keep the server from dying --- server/src/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/server/src/index.ts b/server/src/index.ts index 9b557b36a..4bb3d7bbb 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -43,3 +43,8 @@ connection.onInitialized(() => { // Listen on the connection connection.listen(); + +// Don't die on unhandled Promise rejections +process.on('unhandledRejection', (reason, p) => { + connection.console.error(`Unhandled Rejection at: Promise ${p} reason:, ${reason}`); +}); From 7c2d886b269f52806b4a49748caaba129eccb8ca Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 15:13:28 -0800 Subject: [PATCH 60/87] Remove diagnostics when a document is closed --- server/src/Linter.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/server/src/Linter.ts b/server/src/Linter.ts index d9a8ee607..c29a511c1 100644 --- a/server/src/Linter.ts +++ b/server/src/Linter.ts @@ -1,5 +1,5 @@ import URI from 'vscode-uri'; -import { empty, iif, from, Observable } from 'rxjs'; +import { empty, iif, from, of, Observable } from 'rxjs'; import { map, mergeMap, switchMap } from 'rxjs/operators'; import { Diagnostic, TextDocument } from 'vscode-languageserver'; import { @@ -68,7 +68,11 @@ export const linter = documents.subject.pipe( iif( () => event.kind === DocumentEventKind.OPEN || event.kind === DocumentEventKind.CHANGE_CONTENT, - lint(event.document) + lint(event.document), + of({ + document: event.document, + diagnostics: [], + }) ) ) ); From e1a584e1c08efa836aad872bbfd7df33f059a01c Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 15:15:33 -0800 Subject: [PATCH 61/87] Handle tree deletion events in Analyzer --- server/src/Analyzer.ts | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/server/src/Analyzer.ts b/server/src/Analyzer.ts index abcd3dc04..5fc8e9538 100644 --- a/server/src/Analyzer.ts +++ b/server/src/Analyzer.ts @@ -3,13 +3,13 @@ import { Observer } from 'rxjs'; import { map } from 'rxjs/operators'; import { Tree, SyntaxNode } from 'tree-sitter'; import DocumentSymbolAnalyzer from './analyzers/DocumentSymbolAnalyzer'; -import { forestStream } from './Forest'; +import { forestStream, ForestEventKind } from './Forest'; import FoldingRangeAnalyzer from './analyzers/FoldingRangeAnalyzer'; type Analysis = { uri: string; - foldingRanges: FoldingRange[]; - documentSymbols: DocumentSymbol[]; + foldingRanges?: FoldingRange[]; + documentSymbols?: DocumentSymbol[]; }; class Analyzer { @@ -80,9 +80,15 @@ class Analyses implements Observer { export const analyses = new Analyses(); forestStream .pipe( - map(({ document, tree }) => { - const analyzer = new Analyzer(document.uri); - return analyzer.analyze(tree); - }) + map( + ({ kind, document, tree }): Analysis => { + if (kind === ForestEventKind.DELETE) { + return { uri: document.uri }; + } else { + const analyzer = new Analyzer(document.uri); + return analyzer.analyze(tree); + } + } + ) ) .subscribe(analyses); From b2ef9b22bb880342e7688303b698a7410ee98763 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Thu, 15 Nov 2018 15:16:01 -0800 Subject: [PATCH 62/87] Remove document symbol console.log statement --- server/src/providers/DocumentSymbolProvider.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/server/src/providers/DocumentSymbolProvider.ts b/server/src/providers/DocumentSymbolProvider.ts index aa77b99c9..fc589c546 100644 --- a/server/src/providers/DocumentSymbolProvider.ts +++ b/server/src/providers/DocumentSymbolProvider.ts @@ -19,7 +19,6 @@ export default class DocumentSymbolProvider extends Provider { textDocument: { uri }, } = params; const analysis = analyses.getAnalysis(uri); - console.log(JSON.stringify(analysis.documentSymbols)); return analysis.documentSymbols; }; } From acca33fb3d95a00e69dbb837c0a276df0c423d25 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Wed, 13 Feb 2019 05:24:36 -0700 Subject: [PATCH 63/87] Don't bring down the whole process on an unhandled SIGPIPE --- server/src/index.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/server/src/index.ts b/server/src/index.ts index 4bb3d7bbb..d95f836d8 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -48,3 +48,9 @@ connection.listen(); process.on('unhandledRejection', (reason, p) => { connection.console.error(`Unhandled Rejection at: Promise ${p} reason:, ${reason}`); }); + +// Don't die when attempting to pipe stdin to a bad spawn +// https://github.com/electron/electron/issues/13254 +process.on('SIGPIPE', () => { + // console.log('SIGPIPE!!'); +}); From e5ce6c2cb28054f16a5a8506ccf326e09fba8f71 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Wed, 13 Feb 2019 05:31:41 -0700 Subject: [PATCH 64/87] Add support for Standard --- server/src/linters/RuboCop.ts | 4 ++-- server/src/linters/Standard.ts | 32 ++++++++++++++++++++++++++++++++ server/src/linters/index.ts | 1 + 3 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 server/src/linters/Standard.ts diff --git a/server/src/linters/RuboCop.ts b/server/src/linters/RuboCop.ts index 6072958be..b29bedc94 100644 --- a/server/src/linters/RuboCop.ts +++ b/server/src/linters/RuboCop.ts @@ -15,7 +15,7 @@ type RuboCopOffense = { }; }; -interface IRuboCopResults { +export interface IRuboCopResults { summary: { offense_count: number; target_file_count: number; @@ -79,7 +79,7 @@ export default class RuboCop extends BaseLinter { return results; } - private rubocopOffenseToDiagnostic(offense: RuboCopOffense): Diagnostic { + protected rubocopOffenseToDiagnostic(offense: RuboCopOffense): Diagnostic { const offenseCharacter = offense.location.column - 1; return { range: { diff --git a/server/src/linters/Standard.ts b/server/src/linters/Standard.ts new file mode 100644 index 000000000..29f7a5e38 --- /dev/null +++ b/server/src/linters/Standard.ts @@ -0,0 +1,32 @@ +import { Diagnostic } from 'vscode-languageserver'; +import RuboCop, { IRuboCopResults } from './RuboCop'; + +export default class Standard extends RuboCop { + get cmd(): string { + if (this.lintConfig.command) { + return this.lintConfig.command; + } else { + const command = 'standard'; + return this.isWindows() ? command + '.bat' : command; + } + } + + // This method is overridden to deal with the "notice" that is + // currently output + protected processResults(data): Diagnostic[] { + const lastCurly = data.lastIndexOf('}') + 1; + let results = [] as Diagnostic[]; + try { + const offenses: IRuboCopResults = JSON.parse(data.substring(0, lastCurly)); + + for (const file of offenses.files) { + const diagnostics = file.offenses.map(o => this.rubocopOffenseToDiagnostic(o)); + results = results.concat(diagnostics); + } + } catch (e) { + console.error(e); + } + + return results; + } +} diff --git a/server/src/linters/index.ts b/server/src/linters/index.ts index 4ea19d562..8f4f3f48a 100644 --- a/server/src/linters/index.ts +++ b/server/src/linters/index.ts @@ -1,3 +1,4 @@ export { ILinter, LinterConfig } from './BaseLinter'; export { default as RuboCop } from './RuboCop'; export { default as Reek } from './Reek'; +export { default as Standard } from './Standard'; From cc3f3df06601962fa7b680684be97d7d3f2cec43 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Wed, 13 Feb 2019 05:32:36 -0700 Subject: [PATCH 65/87] Switch to spawn-rx from execa --- server/package-lock.json | 126 ++++++------------------------- server/package.json | 4 +- server/src/linters/BaseLinter.ts | 38 ++++++---- 3 files changed, 49 insertions(+), 119 deletions(-) diff --git a/server/package-lock.json b/server/package-lock.json index 98589d6eb..c57a1c683 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -438,18 +438,6 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, "cryptiles": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", @@ -492,7 +480,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -591,20 +578,6 @@ "es5-ext": "~0.10.14" } }, - "execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "requires": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - } - }, "execspawn": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/execspawn/-/execspawn-1.0.1.tgz", @@ -698,25 +671,6 @@ "wide-align": "^1.1.0" } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - }, - "dependencies": { - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -926,11 +880,6 @@ "integrity": "sha1-TBEDO11dlNbqs3dd7cm+fQCDJfE=", "dev": true }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -945,7 +894,8 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true }, "isstream": { "version": "0.1.2", @@ -1023,6 +973,11 @@ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, "lodash.pad": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", @@ -1148,13 +1103,12 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "nan": { - "version": "2.11.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz", - "integrity": "sha512-iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==" + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.12.1.tgz", + "integrity": "sha512-JY7V6lRkStKcKTvHO5NVSQRv+RV+FIL5pvDoLiAtSL9pKlC5x9PKQcZDsq7m4FO4d57mkhC6Z+QhAh3Jdk5JFw==" }, "next-tick": { "version": "1.0.0", @@ -1162,11 +1116,6 @@ "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=", "dev": true }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" - }, "node-abi": { "version": "2.4.3", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.4.3.tgz", @@ -1275,14 +1224,6 @@ "which": "^1.2.10" } }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "requires": { - "path-key": "^2.0.0" - } - }, "npm-which": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", @@ -1388,11 +1329,6 @@ "os-tmpdir": "^1.0.0" } }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" - }, "path-array": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-array/-/path-array-1.0.1.tgz", @@ -1408,11 +1344,6 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" - }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -1587,9 +1518,9 @@ "dev": true }, "rxjs": { - "version": "6.3.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz", - "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", "requires": { "tslib": "^1.9.0" } @@ -1615,19 +1546,6 @@ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", "dev": true }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" - }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", @@ -1681,6 +1599,16 @@ "source-map": "0.1.32" } }, + "spawn-rx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-3.0.0.tgz", + "integrity": "sha512-dw4Ryg/KMNfkKa5ezAR5aZe9wNwPdKlnHEXtHOjVnyEDSPQyOpIPPRtcIiu7127SmtHhaCjw21yC43HliW0iIg==", + "requires": { + "debug": "^2.5.1", + "lodash.assign": "^4.2.0", + "rxjs": "^6.3.1" + } + }, "splitargs": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz", @@ -1735,11 +1663,6 @@ "ansi-regex": "^2.0.0" } }, - "strip-eof": { - "version": "1.0.0", - "resolved": "http://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" - }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -2062,6 +1985,7 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, "requires": { "isexe": "^2.0.0" } diff --git a/server/package.json b/server/package.json index 5387a60f5..7e1e028e5 100644 --- a/server/package.json +++ b/server/package.json @@ -7,11 +7,11 @@ "license": "MIT", "private": false, "dependencies": { - "execa": "^1.0.0", "prebuild-install": "^5.0.0", - "rxjs": "^6.3.3", "tree-sitter": "^0.13.22", "tree-sitter-ruby": "^0.13.11", + "rxjs": "^6.4.0", + "spawn-rx": "^3.0.0", "vscode-languageserver": "^5.1.0", "vscode-uri": "^1.0.6" }, diff --git a/server/src/linters/BaseLinter.ts b/server/src/linters/BaseLinter.ts index 0a69bef22..84e5c971b 100644 --- a/server/src/linters/BaseLinter.ts +++ b/server/src/linters/BaseLinter.ts @@ -1,6 +1,6 @@ import { Diagnostic, TextDocument } from 'vscode-languageserver'; -import execa from 'execa'; -import { from, Observable, empty } from 'rxjs'; +import { spawn } from 'spawn-rx'; +import { of, Observable, empty } from 'rxjs'; import { map, catchError } from 'rxjs/operators'; import { RubyEnvironment, RubyLintConfiguration } from '../SettingsCache'; @@ -44,22 +44,16 @@ export default abstract class BaseLinter implements ILinter { } console.info(`Lint: executing ${cmd} ${args.join(' ')}...`); - - return from( - execa(cmd, args, { - env: this.config.env, - cwd: this.config.executionRoot, - input: this.document.getText(), - reject: false, // important since linters return non-zero error codes - }) - ).pipe( - map(result => { - return this.processResults(result.stdout); - }), + return spawn(cmd, args, { + env: this.config.env, + cwd: this.config.executionRoot, + stdin: of(this.document.getText()), + }).pipe( catchError(error => { - console.log(error); + this.processError(error); return empty(); - }) + }), + map(result => this.processResults(result)) ); } @@ -70,4 +64,16 @@ export default abstract class BaseLinter implements ILinter { protected isWindows(): boolean { return process.platform === 'win32'; } + + protected processError(error: any) { + switch (error.code) { + case 'ENOENT': + console.log( + `Lint: unable to execute ${error.path} ${error.spawnargs.join( + ' ' + )} as the command could not be found` + ); + break; + } + } } From 8f82a8fea9a026924b1cb04241c9b1a1ce7c529c Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Sat, 16 Feb 2019 07:34:21 -0700 Subject: [PATCH 66/87] Change log output channel name to "Ruby Language Server" --- client/src/extension.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/src/extension.ts b/client/src/extension.ts index 8344b5573..67d6a3a9d 100644 --- a/client/src/extension.ts +++ b/client/src/extension.ts @@ -37,7 +37,7 @@ export function activate(context: ExtensionContext): void { // Notify server of changes to .ruby-version or .rvmrc files fileEvents: workspace.createFileSystemWatcher('**/{.ruby-version,.rvmrc}'), }, - outputChannel: window.createOutputChannel('Ruby'), + outputChannel: window.createOutputChannel('Ruby Language Server'), }; // Create the language client and start the client. From e377ecbfeb525bf68a923cf327deb0ecca84b006 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Sat, 16 Feb 2019 07:35:25 -0700 Subject: [PATCH 67/87] Add client configuration middleware that resolves config paths --- client/src/extension.ts | 67 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 65 insertions(+), 2 deletions(-) diff --git a/client/src/extension.ts b/client/src/extension.ts index 67d6a3a9d..5396cc86d 100644 --- a/client/src/extension.ts +++ b/client/src/extension.ts @@ -1,17 +1,21 @@ /** * LSP client for vscode-ruby */ -import * as path from 'path'; +import path from 'path'; -import { ExtensionContext, window, workspace } from 'vscode'; +import { ExtensionContext, window, workspace, WorkspaceFolder } from 'vscode'; import { + ConfigurationParams, + CancellationToken, LanguageClient, LanguageClientOptions, ServerOptions, TransportKind, + WorkspaceMiddleware, } from 'vscode-languageclient'; import { WorkspaceRubyEnvironmentFeature } from './WorkspaceRubyEnvironment'; +const RUBOCOP_ABSOLUTE_PATH_KEYS = ['only', 'except', 'require']; let client: LanguageClient; export function activate(context: ExtensionContext): void { @@ -38,6 +42,54 @@ export function activate(context: ExtensionContext): void { fileEvents: workspace.createFileSystemWatcher('**/{.ruby-version,.rvmrc}'), }, outputChannel: window.createOutputChannel('Ruby Language Server'), + middleware: { + workspace: { + configuration: ( + params: ConfigurationParams, + token: CancellationToken, + next: Function + ): any[] => { + if (!params.items) { + return []; + } + let result = next(params, token, next); + let settings = result[0]; + let scopeUri = ''; + + for (let item of params.items) { + if (!item.scopeUri) { + continue; + } else { + scopeUri = item.scopeUri; + } + } + let resource = client.protocol2CodeConverter.asUri(scopeUri); + let workspaceFolder = workspace.getWorkspaceFolder(resource); + if (workspaceFolder) { + // Convert any relative paths to absolute paths + if ( + settings.lint && + settings.lint.rubocop && + typeof settings.lint.rubocop === 'object' + ) { + const { + lint: { rubocop }, + } = settings; + for (const key of RUBOCOP_ABSOLUTE_PATH_KEYS) { + if (rubocop[key]) { + rubocop[key] = rubocop[key].map(f => convertAbsolute(f, workspaceFolder)); + } + } + } + + // Save the file's workspace folder + const protocolUri = client.code2ProtocolConverter.asUri(workspaceFolder.uri); + settings.workspaceFolderUri = protocolUri; + } + return result; + }, + } as WorkspaceMiddleware, + }, }; // Create the language client and start the client. @@ -53,3 +105,14 @@ export function activate(context: ExtensionContext): void { export function deactivate(): Thenable { return client ? client.stop() : undefined; } + +function convertAbsolute(file: string, folder: WorkspaceFolder): string { + if (path.isAbsolute(file)) { + return file; + } + let folderPath = folder.uri.fsPath; + if (!folderPath) { + return file; + } + return path.join(folderPath, file); +} From cc10dc65cbb05b0f93d44f7d14682a01aa373c2a Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Sat, 16 Feb 2019 07:40:11 -0700 Subject: [PATCH 68/87] Use a ternary vs iif in lint function --- server/src/Linter.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/Linter.ts b/server/src/Linter.ts index c29a511c1..3a7a7f627 100644 --- a/server/src/Linter.ts +++ b/server/src/Linter.ts @@ -50,7 +50,7 @@ function lint(document: TextDocument): Observable { switchMap(({ config, env }) => { return from(Object.keys(config.lint)).pipe( mergeMap(l => { - return iif(() => config.lint[l], getLinter(l, document, env, config).lint(), empty()); + return config.lint[l] ? getLinter(l, document, env, config).lint() : empty(); }) ); }), From 7a0b1d2f2c6daec0ef0da4acbc542cdbeb12d6e7 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Sat, 16 Feb 2019 07:40:24 -0700 Subject: [PATCH 69/87] Add Standard support to linter --- server/src/Linter.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/src/Linter.ts b/server/src/Linter.ts index 3a7a7f627..c5fd18c10 100644 --- a/server/src/Linter.ts +++ b/server/src/Linter.ts @@ -9,12 +9,13 @@ import { RubyConfiguration, RubyLintConfiguration, } from './SettingsCache'; -import { ILinter, LinterConfig, RuboCop, Reek } from './linters'; +import { ILinter, LinterConfig, RuboCop, Reek, Standard } from './linters'; import { documents, DocumentEvent, DocumentEventKind } from './DocumentManager'; const LINTER_MAP = { rubocop: RuboCop, reek: Reek, + standard: Standard, }; export type LintResult = { From b8e36f9bcbe81e48a241d7bfa8b821af88db0a41 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Sat, 16 Feb 2019 07:41:13 -0700 Subject: [PATCH 70/87] Register output channel earlier in the extension so we don't miss logs --- src/ruby.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ruby.ts b/src/ruby.ts index 407f271d1..9e9112725 100644 --- a/src/ruby.ts +++ b/src/ruby.ts @@ -22,6 +22,7 @@ let client; export function activate(context: ExtensionContext): void { // register language config languages.setLanguageConfiguration('ruby', languageConfiguration); + utils.getOutputChannel(); if (workspace.getConfiguration('ruby').useLanguageServer) { client = require('../client/out/extension'); From a3e71f86565a46e855c2f024980ba079b756e54c Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Sat, 16 Feb 2019 07:42:08 -0700 Subject: [PATCH 71/87] Move legacy linter registration outside the language server setup --- src/ruby.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/ruby.ts b/src/ruby.ts index 9e9112725..3be9646fd 100644 --- a/src/ruby.ts +++ b/src/ruby.ts @@ -30,6 +30,10 @@ export function activate(context: ExtensionContext): void { } else { // Register legacy providers registerHighlightProvider(context, DOCUMENT_SELECTOR); + + if (workspace.rootPath) { + registerLinters(context); + } } // Register providers @@ -37,7 +41,6 @@ export function activate(context: ExtensionContext): void { registerFormatter(context, DOCUMENT_SELECTOR); if (workspace.rootPath) { - registerLinters(context); registerIntellisenseProvider(context); registerTaskProvider(context); } From f8b12ca5eb60df8a80e9678a023c3b498dbf5528 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Sun, 17 Feb 2019 09:23:06 -0700 Subject: [PATCH 72/87] Add diff-match-patch to server deps --- server/package-lock.json | 11 +++++++++++ server/package.json | 2 ++ 2 files changed, 13 insertions(+) diff --git a/server/package-lock.json b/server/package-lock.json index c57a1c683..e0849c94b 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -4,6 +4,12 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/diff-match-patch": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/@types/diff-match-patch/-/diff-match-patch-1.0.32.tgz", + "integrity": "sha512-bPYT5ECFiblzsVzyURaNhljBH2Gh1t9LowgUwciMrNAhFewLkHT2H0Mto07Y4/3KCOGZHRQll3CTtQZ0X11D/A==", + "dev": true + }, "@types/execa": { "version": "0.9.0", "resolved": "http://registry.npmjs.org/@types/execa/-/execa-0.9.0.tgz", @@ -519,6 +525,11 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, + "diff-match-patch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.4.tgz", + "integrity": "sha512-Uv3SW8bmH9nAtHKaKSanOQmj2DnlH65fUpcrMdfdaOxUG02QQ4YGZ8AE7kKOMisF7UqvOlGKVYWRvezdncW9lg==" + }, "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", diff --git a/server/package.json b/server/package.json index 7e1e028e5..0c1164700 100644 --- a/server/package.json +++ b/server/package.json @@ -7,6 +7,7 @@ "license": "MIT", "private": false, "dependencies": { + "diff-match-patch": "^1.0.4", "prebuild-install": "^5.0.0", "tree-sitter": "^0.13.22", "tree-sitter-ruby": "^0.13.11", @@ -16,6 +17,7 @@ "vscode-uri": "^1.0.6" }, "devDependencies": { + "@types/diff-match-patch": "^1.0.32", "@types/execa": "^0.9.0", "prebuild": "^7.6.0" }, From da5abf1829dd19272208fea2066354c70c297711 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Mon, 18 Feb 2019 06:19:38 -0700 Subject: [PATCH 73/87] Update standard linter to use the standardrb command --- server/src/linters/Standard.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/linters/Standard.ts b/server/src/linters/Standard.ts index 29f7a5e38..9c9c366ba 100644 --- a/server/src/linters/Standard.ts +++ b/server/src/linters/Standard.ts @@ -6,7 +6,7 @@ export default class Standard extends RuboCop { if (this.lintConfig.command) { return this.lintConfig.command; } else { - const command = 'standard'; + const command = 'standardrb'; return this.isWindows() ? command + '.bat' : command; } } From edbb610df5e29c7325c59a0a62ee351d72587d46 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Mon, 18 Feb 2019 06:20:10 -0700 Subject: [PATCH 74/87] Set a Diagnostic code on linter results --- server/src/linters/BaseLinter.ts | 1 + server/src/linters/Reek.ts | 3 +++ server/src/linters/RuboCop.ts | 3 +++ server/src/linters/Standard.ts | 2 ++ 4 files changed, 9 insertions(+) diff --git a/server/src/linters/BaseLinter.ts b/server/src/linters/BaseLinter.ts index 84e5c971b..3ced4858e 100644 --- a/server/src/linters/BaseLinter.ts +++ b/server/src/linters/BaseLinter.ts @@ -17,6 +17,7 @@ export type LinterConfig = { export default abstract class BaseLinter implements ILinter { protected document: TextDocument; protected config: LinterConfig; + protected code = 'BaseLinter'; constructor(document: TextDocument, config: LinterConfig) { this.document = document; diff --git a/server/src/linters/Reek.ts b/server/src/linters/Reek.ts index 91e6657a8..d12bfb56f 100644 --- a/server/src/linters/Reek.ts +++ b/server/src/linters/Reek.ts @@ -12,6 +12,8 @@ type ReekOffense = { }; export default class Reek extends BaseLinter { + protected code = 'Reek'; + get cmd(): string { if (this.lintConfig.command) { return this.lintConfig.command; @@ -45,6 +47,7 @@ export default class Reek extends BaseLinter { severity: DiagnosticSeverity.Warning, message: offense.message, source: offense.smell_type, + code: this.code, }; return offense.lines.map(l => { return { diff --git a/server/src/linters/RuboCop.ts b/server/src/linters/RuboCop.ts index b29bedc94..11b9bd6cf 100644 --- a/server/src/linters/RuboCop.ts +++ b/server/src/linters/RuboCop.ts @@ -30,6 +30,8 @@ export interface IRuboCopResults { } export default class RuboCop extends BaseLinter { + protected code = 'RuboCop'; + private readonly DIAGNOSTIC_SEVERITIES = { refactor: DiagnosticSeverity.Hint, convention: DiagnosticSeverity.Information, @@ -95,6 +97,7 @@ export default class RuboCop extends BaseLinter { severity: this.DIAGNOSTIC_SEVERITIES[offense.severity], message: offense.message, source: offense.cop_name, + code: this.code, }; } } diff --git a/server/src/linters/Standard.ts b/server/src/linters/Standard.ts index 9c9c366ba..335dfebf9 100644 --- a/server/src/linters/Standard.ts +++ b/server/src/linters/Standard.ts @@ -2,6 +2,8 @@ import { Diagnostic } from 'vscode-languageserver'; import RuboCop, { IRuboCopResults } from './RuboCop'; export default class Standard extends RuboCop { + protected code = 'Standard'; + get cmd(): string { if (this.lintConfig.command) { return this.lintConfig.command; From 6859c927ea508a89871747c798ee19efe5f858b4 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Mon, 18 Feb 2019 06:21:22 -0700 Subject: [PATCH 75/87] Rename RubyLintConfiguration to RubyCommandConfiguration --- server/src/Linter.ts | 4 ++-- server/src/SettingsCache.ts | 4 ++-- server/src/linters/BaseLinter.ts | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/server/src/Linter.ts b/server/src/Linter.ts index c5fd18c10..5e687e026 100644 --- a/server/src/Linter.ts +++ b/server/src/Linter.ts @@ -7,7 +7,7 @@ import { RubyEnvironment, workspaceRubyEnvironmentCache, RubyConfiguration, - RubyLintConfiguration, + RubyCommandConfiguration, } from './SettingsCache'; import { ILinter, LinterConfig, RuboCop, Reek, Standard } from './linters'; import { documents, DocumentEvent, DocumentEventKind } from './DocumentManager'; @@ -30,7 +30,7 @@ function getLinter( env: RubyEnvironment, config: RubyConfiguration ): ILinter { - const lintConfig: RubyLintConfiguration = + const lintConfig: RubyCommandConfiguration = typeof config.lint[name] === 'object' ? config.lint[name] : {}; const linterConfig: LinterConfig = { env, diff --git a/server/src/SettingsCache.ts b/server/src/SettingsCache.ts index 94d716363..e3e3dd999 100644 --- a/server/src/SettingsCache.ts +++ b/server/src/SettingsCache.ts @@ -10,12 +10,12 @@ export type RubyEnvironment = { RUBOCOP_OPTS?: string; }; -export type RubyLintConfiguration = { +export type RubyCommandConfiguration = { command?: string; useBundler?: boolean; }; -export type RuboCopLintConfiguration = RubyLintConfiguration & { +export type RuboCopLintConfiguration = RubyCommandConfiguration & { lint?: boolean; only?: string[]; except?: string[]; diff --git a/server/src/linters/BaseLinter.ts b/server/src/linters/BaseLinter.ts index 3ced4858e..55bf9a536 100644 --- a/server/src/linters/BaseLinter.ts +++ b/server/src/linters/BaseLinter.ts @@ -2,7 +2,7 @@ import { Diagnostic, TextDocument } from 'vscode-languageserver'; import { spawn } from 'spawn-rx'; import { of, Observable, empty } from 'rxjs'; import { map, catchError } from 'rxjs/operators'; -import { RubyEnvironment, RubyLintConfiguration } from '../SettingsCache'; +import { RubyEnvironment, RubyCommandConfiguration } from '../SettingsCache'; export interface ILinter { lint(): Observable; @@ -11,7 +11,7 @@ export interface ILinter { export type LinterConfig = { env: RubyEnvironment; executionRoot: string; - config: RubyLintConfiguration; + config: RubyCommandConfiguration; }; export default abstract class BaseLinter implements ILinter { @@ -32,7 +32,7 @@ export default abstract class BaseLinter implements ILinter { return [this.document.uri]; } - get lintConfig(): RubyLintConfiguration { + get lintConfig(): RubyCommandConfiguration { return this.config.config; } From b5a843f2902b8c4fd12139a9d7c9992e341ad33a Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Mon, 18 Feb 2019 06:21:48 -0700 Subject: [PATCH 76/87] Print better errors when invalid linter results are received --- server/src/linters/Reek.ts | 2 +- server/src/linters/RuboCop.ts | 2 +- server/src/linters/Standard.ts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/src/linters/Reek.ts b/server/src/linters/Reek.ts index d12bfb56f..933978ee9 100644 --- a/server/src/linters/Reek.ts +++ b/server/src/linters/Reek.ts @@ -36,7 +36,7 @@ export default class Reek extends BaseLinter { results = results.concat(diagnostics); } } catch (e) { - console.error(e); + console.error(`Lint: Received invalid JSON from reek:\n\n${data}`); } return results; diff --git a/server/src/linters/RuboCop.ts b/server/src/linters/RuboCop.ts index 11b9bd6cf..2bc01c41b 100644 --- a/server/src/linters/RuboCop.ts +++ b/server/src/linters/RuboCop.ts @@ -75,7 +75,7 @@ export default class RuboCop extends BaseLinter { results = results.concat(diagnostics); } } catch (e) { - console.error(e); + console.error(`Lint: Received invalid JSON from rubocop:\n\n${data}`); } return results; diff --git a/server/src/linters/Standard.ts b/server/src/linters/Standard.ts index 335dfebf9..c310c5ea9 100644 --- a/server/src/linters/Standard.ts +++ b/server/src/linters/Standard.ts @@ -26,7 +26,7 @@ export default class Standard extends RuboCop { results = results.concat(diagnostics); } } catch (e) { - console.error(e); + console.error(`Lint: Received invalid JSON from standardrb:\n\n${data}`); } return results; From fc7ce591ad991952b44486563d7ee2b75aa9451a Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Mon, 18 Feb 2019 06:23:07 -0700 Subject: [PATCH 77/87] Add document formatting support --- server/src/CapabilityCalculator.ts | 1 + server/src/DocumentManager.ts | 12 +- server/src/Formatter.ts | 57 +++++++ server/src/Server.ts | 4 + server/src/SettingsCache.ts | 2 + server/src/formatters/BaseFormatter.ts | 140 ++++++++++++++++++ server/src/formatters/NullFormatter.ts | 9 ++ server/src/formatters/RuboCop.ts | 25 ++++ server/src/formatters/Rufo.ts | 14 ++ server/src/formatters/Standard.ts | 15 ++ server/src/formatters/index.ts | 5 + .../providers/DocumentFormattingProvider.ts | 22 +++ 12 files changed, 305 insertions(+), 1 deletion(-) create mode 100644 server/src/Formatter.ts create mode 100644 server/src/formatters/BaseFormatter.ts create mode 100644 server/src/formatters/NullFormatter.ts create mode 100644 server/src/formatters/RuboCop.ts create mode 100644 server/src/formatters/Rufo.ts create mode 100644 server/src/formatters/Standard.ts create mode 100644 server/src/formatters/index.ts create mode 100644 server/src/providers/DocumentFormattingProvider.ts diff --git a/server/src/CapabilityCalculator.ts b/server/src/CapabilityCalculator.ts index 8ebe8d1c7..6ae8134d0 100644 --- a/server/src/CapabilityCalculator.ts +++ b/server/src/CapabilityCalculator.ts @@ -33,6 +33,7 @@ export class CapabilityCalculator { // old text // textDocumentSync: TextDocumentSyncKind.Incremental, textDocumentSync: TextDocumentSyncKind.Full, + documentFormattingProvider: true, documentHighlightProvider: true, documentSymbolProvider: true, foldingRangeProvider: true, diff --git a/server/src/DocumentManager.ts b/server/src/DocumentManager.ts index 583b19a0c..10fe5de9c 100644 --- a/server/src/DocumentManager.ts +++ b/server/src/DocumentManager.ts @@ -1,4 +1,9 @@ -import { TextDocument, TextDocuments, IConnection } from 'vscode-languageserver'; +import { + TextDocument, + TextDocuments, + IConnection, + TextDocumentIdentifier, +} from 'vscode-languageserver'; import { Subject } from 'rxjs'; export enum DocumentEventKind { @@ -25,6 +30,11 @@ export default class DocumentManager { this.documents.onDidClose(this.emitDocumentEvent(DocumentEventKind.CLOSE)); } + public get(id: TextDocumentIdentifier | string): TextDocument { + const docId = typeof id === 'string' ? id : id.uri; + return this.documents.get(docId); + } + public listen(connection: IConnection): void { this.documents.listen(connection); } diff --git a/server/src/Formatter.ts b/server/src/Formatter.ts new file mode 100644 index 000000000..3a823cce1 --- /dev/null +++ b/server/src/Formatter.ts @@ -0,0 +1,57 @@ +import { TextDocument, TextDocumentIdentifier, TextEdit } from 'vscode-languageserver'; +import { + documentConfigurationCache, + RubyEnvironment, + workspaceRubyEnvironmentCache, + RubyConfiguration, +} from './SettingsCache'; +import { documents } from './DocumentManager'; +import URI from 'vscode-uri'; +import { from, Observable } from 'rxjs'; +import { mergeMap, switchMap } from 'rxjs/operators'; +import { IFormatter, FormatterConfig, NullFormatter, RuboCop, Standard, Rufo } from './formatters'; + +const FORMATTER_MAP = { + rubocop: RuboCop, + standard: Standard, + rufo: Rufo, +}; + +function getFormatter( + document: TextDocument, + env: RubyEnvironment, + config: RubyConfiguration +): IFormatter { + if (typeof config.format === 'string') { + const formatterConfig: FormatterConfig = { + env, + executionRoot: URI.parse(config.workspaceFolderUri).fsPath, + config: { + command: config.format, + useBundler: config.useBundler, + }, + }; + + return new FORMATTER_MAP[config.format](document, formatterConfig); + } else { + return new NullFormatter(); + } +} + +export default class Formatter { + static format(ident: TextDocumentIdentifier): Observable { + const document = documents.get(ident.uri); + + return from(documentConfigurationCache.get(ident.uri)).pipe( + mergeMap( + config => workspaceRubyEnvironmentCache.get(config.workspaceFolderUri), + (config, env) => { + return { config, env }; + } + ), + switchMap(({ config, env }) => { + return getFormatter(document, env, config).format(); + }) + ); + } +} diff --git a/server/src/Server.ts b/server/src/Server.ts index 891ba55dc..9ce3a109f 100644 --- a/server/src/Server.ts +++ b/server/src/Server.ts @@ -22,6 +22,7 @@ import { RubyConfiguration, RubyEnvironment, } from './SettingsCache'; +import DocumentFormattingProvider from './providers/DocumentFormattingProvider'; export interface ILanguageServer { readonly capabilities: InitializeResult; @@ -112,6 +113,9 @@ export class Server implements ILanguageServer { // Handles document symbol requests DocumentSymbolProvider.register(this.connection); + + // Handles document formatting requests + DocumentFormattingProvider.register(this.connection); } // registers providers on the initialized step diff --git a/server/src/SettingsCache.ts b/server/src/SettingsCache.ts index e3e3dd999..fb584e990 100644 --- a/server/src/SettingsCache.ts +++ b/server/src/SettingsCache.ts @@ -25,6 +25,7 @@ export type RuboCopLintConfiguration = RubyCommandConfiguration & { }; export interface RubyConfiguration { + useBundler: boolean; workspaceFolderUri: string; interpreter?: { commandPath?: string; @@ -35,6 +36,7 @@ export interface RubyConfiguration { reek?: boolean | RubyConfiguration; rubocop?: boolean | RuboCopLintConfiguration; }; + format: boolean | 'rubocop' | 'standard' | 'rufo'; } class SettingsCache

{ diff --git a/server/src/formatters/BaseFormatter.ts b/server/src/formatters/BaseFormatter.ts new file mode 100644 index 000000000..62c60efe0 --- /dev/null +++ b/server/src/formatters/BaseFormatter.ts @@ -0,0 +1,140 @@ +import { TextDocument, TextEdit } from 'vscode-languageserver'; +import { spawn } from 'spawn-rx'; +import { of, Observable, empty } from 'rxjs'; +import { map, catchError } from 'rxjs/operators'; +import { + diff_match_patch as DiffMatchPatch, + Diff, + DIFF_DELETE, + DIFF_INSERT, + DIFF_EQUAL, +} from 'diff-match-patch'; +import { RubyEnvironment, RubyCommandConfiguration } from '../SettingsCache'; + +export interface IFormatter { + format(): Observable; +} + +export type FormatterConfig = { + env: RubyEnvironment; + executionRoot: string; + config: RubyCommandConfiguration; +}; + +export default abstract class BaseFormatter implements IFormatter { + protected document: TextDocument; + protected config: FormatterConfig; + private differ: DiffMatchPatch; + + constructor(document: TextDocument, config: FormatterConfig) { + this.document = document; + this.config = config; + this.differ = new DiffMatchPatch(); + } + + get cmd(): string { + return 'echo'; + } + + get args(): string[] { + return [this.document.uri]; + } + + get useBundler(): boolean { + return this.config.config.useBundler; + } + + public format(): Observable { + let { cmd, args } = this; + + if (this.useBundler) { + args.unshift('exec', cmd); + cmd = 'bundle'; + } + + console.info(`Format: executing ${cmd} ${args.join(' ')}...`); + return spawn(cmd, args, { + env: this.config.env, + cwd: this.config.executionRoot, + stdin: of(this.document.getText()), + split: true, + }).pipe( + catchError(error => { + this.processError(error); + return empty(); + }), + map((result: any) => { + const { source, text } = result; + if (source === 'stdout') { + return this.processResults(text); + } else { + this.processError({ + code: source, + spawnargs: args, + message: text, + }); + return []; + } + }) + ); + } + + protected processResults(output: string): TextEdit[] { + const originalText = this.document.getText(); + const diffs: Diff[] = this.differ.diff_main(originalText, output); + const edits: TextEdit[] = []; + // VSCode wants TextEdits on the original document + // this means position only gets moved for DIFF_EQUAL and DIFF_DELETE + // as insert is new and doesn't have a position in the original + let position = 0; + for (let diff of diffs) { + const [num, str] = diff; + const startPos = this.document.positionAt(position); + switch (num) { + case DIFF_DELETE: + edits.push({ + range: { + start: startPos, + end: this.document.positionAt(position + str.length), + }, + newText: '', + }); + position += str.length; + break; + case DIFF_INSERT: + edits.push({ + range: { start: startPos, end: startPos }, + newText: str, + }); + break; + case DIFF_EQUAL: + position += str.length; + break; + } + } + + return edits; + } + + protected isWindows(): boolean { + return process.platform === 'win32'; + } + + protected processError(error: any) { + switch (error.code) { + case 'ENOENT': + console.error( + `Format: unable to execute ${error.path} ${error.spawnargs.join( + ' ' + )} as the command could not be found` + ); + break; + case 'stderr': + console.error( + `Format: unable to execute ${error.path} ${error.spawnargs.join(' ')}. Got error:\n\n${ + error.message + }` + ); + } + } +} diff --git a/server/src/formatters/NullFormatter.ts b/server/src/formatters/NullFormatter.ts new file mode 100644 index 000000000..261f028f6 --- /dev/null +++ b/server/src/formatters/NullFormatter.ts @@ -0,0 +1,9 @@ +import { IFormatter } from './BaseFormatter'; +import { Observable, of } from 'rxjs'; +import { TextEdit } from 'vscode-languageserver'; + +export default class NullFormatter implements IFormatter { + format(): Observable { + return of([]); + } +} diff --git a/server/src/formatters/RuboCop.ts b/server/src/formatters/RuboCop.ts new file mode 100644 index 000000000..cc532fec5 --- /dev/null +++ b/server/src/formatters/RuboCop.ts @@ -0,0 +1,25 @@ +import URI from 'vscode-uri'; +import { TextEdit } from 'vscode-languageserver'; +import BaseFormatter from './BaseFormatter'; + +export default class RuboCop extends BaseFormatter { + protected FORMATTED_OUTPUT_DELIMITER = '===================='; + + get cmd(): string { + const command = 'rubocop'; + return this.isWindows() ? command + '.bat' : command; + } + + get args(): string[] { + const documentPath = URI.parse(this.document.uri); + let args = ['-s', documentPath.fsPath, '-a']; + return args; + } + + protected processResults(output: string): TextEdit[] { + const endOfDiagnostics = + output.lastIndexOf(this.FORMATTED_OUTPUT_DELIMITER) + this.FORMATTED_OUTPUT_DELIMITER.length; + const cleanOutput = output.substring(endOfDiagnostics).trimLeft(); + return super.processResults(cleanOutput); + } +} diff --git a/server/src/formatters/Rufo.ts b/server/src/formatters/Rufo.ts new file mode 100644 index 000000000..4ba1aafe3 --- /dev/null +++ b/server/src/formatters/Rufo.ts @@ -0,0 +1,14 @@ +import URI from 'vscode-uri'; +import BaseFormatter from './BaseFormatter'; + +export default class Rubocop extends BaseFormatter { + get cmd(): string { + const command = 'rufo'; + return this.isWindows() ? command + '.bat' : command; + } + + get args(): string[] { + const documentPath = URI.parse(this.document.uri); + return [`--filename=${documentPath.fsPath}`]; + } +} diff --git a/server/src/formatters/Standard.ts b/server/src/formatters/Standard.ts new file mode 100644 index 000000000..647aceb57 --- /dev/null +++ b/server/src/formatters/Standard.ts @@ -0,0 +1,15 @@ +import URI from 'vscode-uri'; +import RuboCop from './RuboCop'; + +export default class Standard extends RuboCop { + get cmd(): string { + const command = 'standardrb'; + return this.isWindows() ? command + '.bat' : command; + } + + get args(): string[] { + const documentPath = URI.parse(this.document.uri); + let args = ['-s', documentPath.fsPath, '--fix']; + return args; + } +} diff --git a/server/src/formatters/index.ts b/server/src/formatters/index.ts new file mode 100644 index 000000000..29026a723 --- /dev/null +++ b/server/src/formatters/index.ts @@ -0,0 +1,5 @@ +export { IFormatter, FormatterConfig } from './BaseFormatter'; +export { default as NullFormatter } from './NullFormatter'; +export { default as RuboCop } from './RuboCop'; +export { default as Rufo } from './Rufo'; +export { default as Standard } from './Standard'; diff --git a/server/src/providers/DocumentFormattingProvider.ts b/server/src/providers/DocumentFormattingProvider.ts new file mode 100644 index 000000000..e336c26e8 --- /dev/null +++ b/server/src/providers/DocumentFormattingProvider.ts @@ -0,0 +1,22 @@ +import { IConnection, DocumentFormattingParams, TextEdit } from 'vscode-languageserver'; +import Provider from './Provider'; +import Formatter from '../Formatter'; + +export default class DocumentFormattingProvider extends Provider { + static register(connection: IConnection) { + return new DocumentFormattingProvider(connection); + } + + constructor(connection: IConnection) { + super(connection); + this.connection.onDocumentFormatting(this.handleDocumentFormattingRequest); + } + + private handleDocumentFormattingRequest = async ( + params: DocumentFormattingParams + ): Promise => { + const { textDocument } = params; + + return Formatter.format(textDocument).toPromise(); + }; +} From 17ee3cc5a6e0164e347d9563dd7814984ab5db8c Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Mon, 18 Feb 2019 08:14:30 -0700 Subject: [PATCH 78/87] Add support for Range formatting --- server/src/CapabilityCalculator.ts | 1 + server/src/Formatter.ts | 13 +++-- server/src/formatters/BaseFormatter.ts | 56 +++++++++++++++++-- .../providers/DocumentFormattingProvider.ts | 16 +++++- 4 files changed, 77 insertions(+), 9 deletions(-) diff --git a/server/src/CapabilityCalculator.ts b/server/src/CapabilityCalculator.ts index 6ae8134d0..83090f6d6 100644 --- a/server/src/CapabilityCalculator.ts +++ b/server/src/CapabilityCalculator.ts @@ -34,6 +34,7 @@ export class CapabilityCalculator { // textDocumentSync: TextDocumentSyncKind.Incremental, textDocumentSync: TextDocumentSyncKind.Full, documentFormattingProvider: true, + documentRangeFormattingProvider: true, documentHighlightProvider: true, documentSymbolProvider: true, foldingRangeProvider: true, diff --git a/server/src/Formatter.ts b/server/src/Formatter.ts index 3a823cce1..c5352e150 100644 --- a/server/src/Formatter.ts +++ b/server/src/Formatter.ts @@ -1,4 +1,4 @@ -import { TextDocument, TextDocumentIdentifier, TextEdit } from 'vscode-languageserver'; +import { Range, TextDocument, TextDocumentIdentifier, TextEdit } from 'vscode-languageserver'; import { documentConfigurationCache, RubyEnvironment, @@ -20,7 +20,8 @@ const FORMATTER_MAP = { function getFormatter( document: TextDocument, env: RubyEnvironment, - config: RubyConfiguration + config: RubyConfiguration, + range?: Range ): IFormatter { if (typeof config.format === 'string') { const formatterConfig: FormatterConfig = { @@ -32,6 +33,10 @@ function getFormatter( }, }; + if (range) { + formatterConfig.range = range; + } + return new FORMATTER_MAP[config.format](document, formatterConfig); } else { return new NullFormatter(); @@ -39,7 +44,7 @@ function getFormatter( } export default class Formatter { - static format(ident: TextDocumentIdentifier): Observable { + static format(ident: TextDocumentIdentifier, range?: Range): Observable { const document = documents.get(ident.uri); return from(documentConfigurationCache.get(ident.uri)).pipe( @@ -50,7 +55,7 @@ export default class Formatter { } ), switchMap(({ config, env }) => { - return getFormatter(document, env, config).format(); + return getFormatter(document, env, config, range).format(); }) ); } diff --git a/server/src/formatters/BaseFormatter.ts b/server/src/formatters/BaseFormatter.ts index 62c60efe0..bf5cb072a 100644 --- a/server/src/formatters/BaseFormatter.ts +++ b/server/src/formatters/BaseFormatter.ts @@ -1,4 +1,4 @@ -import { TextDocument, TextEdit } from 'vscode-languageserver'; +import { Position, Range, TextDocument, TextEdit } from 'vscode-languageserver'; import { spawn } from 'spawn-rx'; import { of, Observable, empty } from 'rxjs'; import { map, catchError } from 'rxjs/operators'; @@ -19,17 +19,24 @@ export type FormatterConfig = { env: RubyEnvironment; executionRoot: string; config: RubyCommandConfiguration; + range?: Range; }; export default abstract class BaseFormatter implements IFormatter { protected document: TextDocument; + private originalText: string; protected config: FormatterConfig; private differ: DiffMatchPatch; constructor(document: TextDocument, config: FormatterConfig) { this.document = document; + this.originalText = document.getText(); this.config = config; this.differ = new DiffMatchPatch(); + + if (this.range) { + this.modifyRange(); + } } get cmd(): string { @@ -44,6 +51,10 @@ export default abstract class BaseFormatter implements IFormatter { return this.config.config.useBundler; } + get range(): Range { + return this.config.range; + } + public format(): Observable { let { cmd, args } = this; @@ -56,7 +67,7 @@ export default abstract class BaseFormatter implements IFormatter { return spawn(cmd, args, { env: this.config.env, cwd: this.config.executionRoot, - stdin: of(this.document.getText()), + stdin: of(this.originalText), split: true, }).pipe( catchError(error => { @@ -80,8 +91,7 @@ export default abstract class BaseFormatter implements IFormatter { } protected processResults(output: string): TextEdit[] { - const originalText = this.document.getText(); - const diffs: Diff[] = this.differ.diff_main(originalText, output); + const diffs: Diff[] = this.differ.diff_main(this.originalText, output); const edits: TextEdit[] = []; // VSCode wants TextEdits on the original document // this means position only gets moved for DIFF_EQUAL and DIFF_DELETE @@ -90,6 +100,7 @@ export default abstract class BaseFormatter implements IFormatter { for (let diff of diffs) { const [num, str] = diff; const startPos = this.document.positionAt(position); + switch (num) { case DIFF_DELETE: edits.push({ @@ -111,6 +122,12 @@ export default abstract class BaseFormatter implements IFormatter { position += str.length; break; } + + // If we are have a range we are doing a selection format. Thus, + // only apply patches that start within the selected range + if (this.range && !this.checkPositionInRange(startPos)) { + edits.shift(); + } } return edits; @@ -137,4 +154,35 @@ export default abstract class BaseFormatter implements IFormatter { ); } } + + // Modified from https://github.com/Microsoft/vscode/blob/master/src/vs/editor/common/core/range.ts#L90 + private checkPositionInRange(position: Position) { + const { start, end } = this.range; + + if (position.line < start.line || position.line > end.line) { + return false; + } + + if (position.line === start.line && position.character < start.character) { + return false; + } + + if (position.line === end.line && position.character > end.character) { + return false; + } + + return true; + } + + // If the selection range just has whitespace before it in the line, + // extend the range to account for that whitespace + private modifyRange() { + const { start } = this.range; + const offset = this.document.offsetAt(start); + const prefixLineText = this.originalText.substring(offset - start.character, offset); + + if (/^\s+$/.test(prefixLineText)) { + this.range.start.character = 0; + } + } } diff --git a/server/src/providers/DocumentFormattingProvider.ts b/server/src/providers/DocumentFormattingProvider.ts index e336c26e8..19285603a 100644 --- a/server/src/providers/DocumentFormattingProvider.ts +++ b/server/src/providers/DocumentFormattingProvider.ts @@ -1,4 +1,9 @@ -import { IConnection, DocumentFormattingParams, TextEdit } from 'vscode-languageserver'; +import { + IConnection, + DocumentFormattingParams, + DocumentRangeFormattingParams, + TextEdit, +} from 'vscode-languageserver'; import Provider from './Provider'; import Formatter from '../Formatter'; @@ -10,6 +15,7 @@ export default class DocumentFormattingProvider extends Provider { constructor(connection: IConnection) { super(connection); this.connection.onDocumentFormatting(this.handleDocumentFormattingRequest); + this.connection.onDocumentRangeFormatting(this.handleDocumentRangeFormattingRequest); } private handleDocumentFormattingRequest = async ( @@ -19,4 +25,12 @@ export default class DocumentFormattingProvider extends Provider { return Formatter.format(textDocument).toPromise(); }; + + private handleDocumentRangeFormattingRequest = async ( + params: DocumentRangeFormattingParams + ): Promise => { + const { textDocument, range } = params; + + return Formatter.format(textDocument, range).toPromise(); + }; } From f89f1dc01e5c3159e00bffe421e2e6c39e8cd49c Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Mon, 18 Feb 2019 10:15:36 -0700 Subject: [PATCH 79/87] Remove resultSelector in Formatter --- server/src/Formatter.ts | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/server/src/Formatter.ts b/server/src/Formatter.ts index c5352e150..45077123e 100644 --- a/server/src/Formatter.ts +++ b/server/src/Formatter.ts @@ -8,7 +8,7 @@ import { import { documents } from './DocumentManager'; import URI from 'vscode-uri'; import { from, Observable } from 'rxjs'; -import { mergeMap, switchMap } from 'rxjs/operators'; +import { switchMap } from 'rxjs/operators'; import { IFormatter, FormatterConfig, NullFormatter, RuboCop, Standard, Rufo } from './formatters'; const FORMATTER_MAP = { @@ -48,15 +48,13 @@ export default class Formatter { const document = documents.get(ident.uri); return from(documentConfigurationCache.get(ident.uri)).pipe( - mergeMap( - config => workspaceRubyEnvironmentCache.get(config.workspaceFolderUri), - (config, env) => { - return { config, env }; - } - ), - switchMap(({ config, env }) => { - return getFormatter(document, env, config, range).format(); - }) + switchMap(config => + from(workspaceRubyEnvironmentCache.get(config.workspaceFolderUri)).pipe( + switchMap(env => { + return getFormatter(document, env, config, range).format(); + }) + ) + ) ); } } From 37e0e76725fa7c5c68ed6291bf28837a1c2abd9a Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Mon, 18 Feb 2019 10:15:54 -0700 Subject: [PATCH 80/87] Pass -x to rufo --- server/src/formatters/Rufo.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/formatters/Rufo.ts b/server/src/formatters/Rufo.ts index 4ba1aafe3..9dcc77c9f 100644 --- a/server/src/formatters/Rufo.ts +++ b/server/src/formatters/Rufo.ts @@ -9,6 +9,6 @@ export default class Rubocop extends BaseFormatter { get args(): string[] { const documentPath = URI.parse(this.document.uri); - return [`--filename=${documentPath.fsPath}`]; + return [`--filename=${documentPath.fsPath}`, '-x']; } } From 7f48a6f2a23b0b6cd6d580b073391fc2ceafc812 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Mon, 18 Feb 2019 15:16:13 -0700 Subject: [PATCH 81/87] Rework BaseFormatter error handling a bit --- server/src/formatters/BaseFormatter.ts | 52 +++++++++++--------------- 1 file changed, 21 insertions(+), 31 deletions(-) diff --git a/server/src/formatters/BaseFormatter.ts b/server/src/formatters/BaseFormatter.ts index bf5cb072a..236277476 100644 --- a/server/src/formatters/BaseFormatter.ts +++ b/server/src/formatters/BaseFormatter.ts @@ -1,6 +1,6 @@ import { Position, Range, TextDocument, TextEdit } from 'vscode-languageserver'; import { spawn } from 'spawn-rx'; -import { of, Observable, empty } from 'rxjs'; +import { of, Observable, throwError } from 'rxjs'; import { map, catchError } from 'rxjs/operators'; import { diff_match_patch as DiffMatchPatch, @@ -63,29 +63,18 @@ export default abstract class BaseFormatter implements IFormatter { cmd = 'bundle'; } - console.info(`Format: executing ${cmd} ${args.join(' ')}...`); + const formatStr = `${cmd} ${args.join(' ')}`; + console.info(`Format: executing ${formatStr}...`); return spawn(cmd, args, { env: this.config.env, cwd: this.config.executionRoot, stdin: of(this.originalText), - split: true, }).pipe( catchError(error => { - this.processError(error); - return empty(); + return throwError(this.processError(error, formatStr)); }), - map((result: any) => { - const { source, text } = result; - if (source === 'stdout') { - return this.processResults(text); - } else { - this.processError({ - code: source, - spawnargs: args, - message: text, - }); - return []; - } + map((result: string) => { + return this.processResults(result); }) ); } @@ -137,21 +126,22 @@ export default abstract class BaseFormatter implements IFormatter { return process.platform === 'win32'; } - protected processError(error: any) { - switch (error.code) { + protected processError(error: any, formatStr: string): Error { + let code = error.code || error.toString().match(/code: (\d+)/)[1] || null; + let message = `\n unable to execute ${formatStr}:\n ${error.toString()} - ${this.messageForCode( + code + )}`; + return new Error(message); + } + + private messageForCode(code: string) { + switch (code) { + case '127': + return 'missing gem executables'; case 'ENOENT': - console.error( - `Format: unable to execute ${error.path} ${error.spawnargs.join( - ' ' - )} as the command could not be found` - ); - break; - case 'stderr': - console.error( - `Format: unable to execute ${error.path} ${error.spawnargs.join(' ')}. Got error:\n\n${ - error.message - }` - ); + return 'command not found'; + default: + return 'unknown error'; } } From f20f26245ab4af40ced4dab7dc877e60b708be3b Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Mon, 18 Feb 2019 15:24:06 -0700 Subject: [PATCH 82/87] Update package*.json after merge --- server/package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/package.json b/server/package.json index 3cd9eb6d7..b0254c061 100644 --- a/server/package.json +++ b/server/package.json @@ -9,10 +9,10 @@ "dependencies": { "diff-match-patch": "^1.0.4", "prebuild-install": "^5.0.0", - "tree-sitter": "^0.13.23", - "tree-sitter-ruby": "^0.13.13", "rxjs": "^6.4.0", "spawn-rx": "^3.0.0", + "tree-sitter": "^0.13.23", + "tree-sitter-ruby": "^0.13.13", "vscode-languageserver": "^5.1.0", "vscode-uri": "^1.0.6" }, From 5b09b0df98358f7da8feb947b51e80c8465ce47f Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Mon, 18 Feb 2019 15:24:20 -0700 Subject: [PATCH 83/87] Add standard config. Add resource scoping to config objects --- package.json | 84 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 77 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 7bf193b8e..f48b33eb3 100644 --- a/package.json +++ b/package.json @@ -141,7 +141,8 @@ "type": "string", "default": "ruby", "description": "Path to the Ruby interpreter. Set this to an absolute path to select from multiple installed Ruby versions.", - "isExecutable": true + "isExecutable": true, + "scope": "resource" }, "ruby.useLanguageServer": { "type": "boolean", @@ -175,12 +176,14 @@ "ruby.useBundler": { "type": "boolean", "default": false, - "description": "Whether ruby tools should be started using Bundler" + "description": "Whether ruby tools should be started using Bundler", + "scope": "resource" }, "ruby.pathToBundler": { "type": "string", "default": "bundle", - "description": "Path to the bundler executable (used if useBundler is true)" + "description": "Path to the bundler executable (used if useBundler is true)", + "scope": "resource" }, "ruby.rctComplete.commandPath": { "type": "string", @@ -194,6 +197,7 @@ "description": "Time (ms) to wait after keypress before running enabled linters. Ensures linters are only run when typing has finished and not for every keypress" }, "ruby.lint": { + "scope": "resource", "type": "object", "description": "Set individual ruby linters to use", "properties": { @@ -226,9 +230,23 @@ "description": "Use fasterer to lint" }, "reek": { - "type": "boolean", + "type": [ + "boolean", + "object" + ], "default": false, - "description": "Use reek to lint" + "description": "Use reek to lint", + "properties": { + "command": { + "type": "string", + "description": "reek command. Setting this will cause reek to be executed exactly this way and other settings will be ignored!" + }, + "useBundler": { + "type": "boolean", + "default": false, + "description": "Prefix the `reek` command with `bundle exec`" + } + } }, "rubocop": { "type": [ @@ -238,6 +256,15 @@ "default": false, "description": "Use RuboCop to lint", "properties": { + "command": { + "type": "string", + "description": "RuboCop command. Setting this will cause RuboCop to be executed this way and other settings will be ignored!" + }, + "useBundler": { + "type": "boolean", + "default": false, + "description": "Prefix the `rubocop` command with `bundle exec`" + }, "lint": { "type": "boolean", "default": false, @@ -271,6 +298,46 @@ } } }, + "standard": { + "type": [ + "boolean", + "object" + ], + "default": false, + "description": "Use standard to lint", + "properties": { + "command": { + "type": "string", + "description": "Standard command. Setting this will cause standard to be executed this way and other settings will be ignored!" + }, + "useBundler": { + "type": "boolean", + "default": false, + "description": "Prefix the `standard` command with `bundle exec`" + }, + "only": { + "type": "array", + "description": "Run only the specified cop(s) and/or cops in the specified departments", + "items": { + "type": "string" + } + }, + "except": { + "type": "array", + "description": "Run all cops enabled by configuration except the specified cop(s) and/or departments", + "items": { + "type": "string" + } + }, + "require": { + "type": "array", + "description": "Require Ruby files", + "items": { + "type": "string" + } + } + } + }, "ruby-lint": { "type": [ "boolean", @@ -319,10 +386,13 @@ ], "enum": [ false, - "rubocop" + "rubocop", + "standard", + "rufo" ], "default": false, - "description": "Which system to use for formatting. Use `false` to disable or if another extension provides this feature." + "description": "Which system to use for formatting. Use `false` to disable or if another extension provides this feature.", + "scope": "resource" } } }, From 740a1e2c5c1610823cb5e4867eaebb8ec8307bd3 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Mon, 18 Feb 2019 15:31:44 -0700 Subject: [PATCH 84/87] Move vscode to devDependencies --- client/package-lock.json | 472 +++++++++---- client/package.json | 42 +- package-lock.json | 464 +++++++++---- package.json | 1382 +++++++++++++++++++------------------- 4 files changed, 1413 insertions(+), 947 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 259d71dc1..37127aa20 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -8,6 +8,7 @@ "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, "requires": { "co": "^4.6.0", "fast-deep-equal": "^1.0.0", @@ -19,6 +20,7 @@ "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" } @@ -27,6 +29,7 @@ "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" } @@ -34,12 +37,14 @@ "ansi-wrap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true }, "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" @@ -48,27 +53,32 @@ "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==" + "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=" + "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=" + "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=" + "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" } @@ -76,22 +86,26 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true }, "asn1": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, "requires": { "safer-buffer": "~2.1.0" } @@ -99,32 +113,38 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true }, "aws4": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", - "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, "requires": { "tweetnacl": "^0.14.3" } @@ -133,6 +153,7 @@ "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" } @@ -141,6 +162,7 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -150,6 +172,7 @@ "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, "requires": { "expand-range": "^1.8.1", "preserve": "^0.2.0", @@ -159,42 +182,50 @@ "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true }, "buffer-from": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, "clone": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" + "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=" + "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=" + "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", @@ -204,12 +235,14 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "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==", + "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -217,17 +250,20 @@ "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "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" } @@ -235,7 +271,8 @@ "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "cross-spawn": { "version": "6.0.5", @@ -253,6 +290,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -261,6 +299,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -269,6 +308,7 @@ "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" } @@ -281,22 +321,26 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true }, "diff": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==" + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + "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", @@ -308,6 +352,7 @@ "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, "requires": { "jsbn": "~0.1.0", "safer-buffer": "^2.1.0" @@ -324,12 +369,14 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "event-stream": { "version": "3.3.6", "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.6.tgz", "integrity": "sha512-dGXNg4F/FgVzlApjzItL+7naHutA3fDqbV/zAZqDDlXTjiMnQmZKu+prImWKszeBM5UQeGvAl3u1wBiKeDh61g==", + "dev": true, "requires": { "duplexer": "^0.1.1", "flatmap-stream": "^0.1.0", @@ -359,6 +406,7 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, "requires": { "is-posix-bracket": "^0.1.0" } @@ -367,6 +415,7 @@ "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, "requires": { "fill-range": "^2.1.0" } @@ -374,12 +423,14 @@ "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + "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" } @@ -388,6 +439,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, "requires": { "is-extglob": "^1.0.0" }, @@ -395,29 +447,34 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true } } }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true }, "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, "requires": { "pend": "~1.2.0" } @@ -425,12 +482,14 @@ "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true }, "fill-range": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, "requires": { "is-number": "^2.1.0", "isobject": "^2.0.0", @@ -442,22 +501,26 @@ "first-chunk-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=" + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true }, "flatmap-stream": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/flatmap-stream/-/flatmap-stream-0.1.1.tgz", - "integrity": "sha512-lAq4tLbm3sidmdCN8G3ExaxH7cUCtP5mgDvrYowsx84dcYkJJ4I28N7gkxA6+YlSXzaGLJYIDEi9WGfXzMiXdw==" + "integrity": "sha512-lAq4tLbm3sidmdCN8G3ExaxH7cUCtP5mgDvrYowsx84dcYkJJ4I28N7gkxA6+YlSXzaGLJYIDEi9WGfXzMiXdw==", + "dev": true }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true }, "for-own": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, "requires": { "for-in": "^1.0.1" } @@ -465,12 +528,14 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true }, "form-data": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.6", @@ -480,17 +545,20 @@ "from": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "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", @@ -510,6 +578,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -518,6 +587,7 @@ "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -531,6 +601,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, "requires": { "glob-parent": "^2.0.0", "is-glob": "^2.0.0" @@ -540,6 +611,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, "requires": { "is-glob": "^2.0.0" } @@ -547,12 +619,14 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -563,6 +637,7 @@ "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" @@ -572,6 +647,7 @@ "version": "5.3.5", "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, "requires": { "extend": "^3.0.0", "glob": "^5.0.3", @@ -587,6 +663,7 @@ "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, "requires": { "inflight": "^1.0.4", "inherits": "2", @@ -598,12 +675,14 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "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", @@ -614,12 +693,14 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "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" @@ -630,17 +711,20 @@ "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "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", @@ -651,6 +735,7 @@ "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", @@ -661,6 +746,7 @@ "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" @@ -669,12 +755,14 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "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", @@ -685,12 +773,14 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "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" @@ -702,6 +792,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.0.tgz", "integrity": "sha512-/9vtSk9eI9DEWCqzGieglPqmx0WUQ9pwPHyHFpKmfxqdgqGJC2l0vFMdYs54hLdDsMDEZFLDL2J4ikjc4hQ5HQ==", + "dev": true, "requires": { "event-stream": "^3.3.4", "node.extend": "^1.1.2", @@ -713,17 +804,20 @@ "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + "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=" + "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", @@ -739,6 +833,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "dev": true, "requires": { "convert-source-map": "^1.1.1", "graceful-fs": "^4.1.2", @@ -750,17 +845,20 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + "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=" + "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", @@ -773,6 +871,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz", "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=", + "dev": true, "requires": { "event-stream": "^3.3.1", "mkdirp": "^0.5.1", @@ -784,6 +883,7 @@ "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", @@ -795,17 +895,20 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + "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=" + "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", @@ -818,6 +921,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz", "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=", + "dev": true, "requires": { "event-stream": "^3.3.1", "queue": "^4.2.1", @@ -831,17 +935,20 @@ "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=" + "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=" + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true }, "queue": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/queue/-/queue-4.5.0.tgz", "integrity": "sha512-DwxpAnqJuoQa+wyDgQuwkSshkhlqIlWEvwvdAY27fDPunZ2cVJzXU4JyjY+5l7zs7oGLaYAQm4MbLOVFAHFBzA==", + "dev": true, "requires": { "inherits": "~2.0.0" } @@ -850,6 +957,7 @@ "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", @@ -864,12 +972,14 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true }, "har-validator": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "dev": true, "requires": { "ajv": "^5.3.0", "har-schema": "^2.0.0" @@ -878,17 +988,20 @@ "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -899,6 +1012,7 @@ "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" @@ -907,27 +1021,32 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "is": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=" + "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", + "dev": true }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true }, "is-equal-shallow": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, "requires": { "is-primitive": "^2.0.0" } @@ -935,17 +1054,20 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "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=" + "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=", + "dev": true, "requires": { "is-extglob": "^2.1.0" } @@ -954,6 +1076,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -962,6 +1085,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -971,17 +1095,20 @@ "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true }, "is-primitive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true }, "is-stream": { "version": "1.1.0", @@ -991,22 +1118,26 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true }, "is-valid-glob": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=" + "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", + "dev": true }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isexe": { "version": "2.0.0", @@ -1017,6 +1148,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, "requires": { "isarray": "1.0.0" } @@ -1024,27 +1156,32 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true }, "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true }, "json-stable-stringify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, "requires": { "jsonify": "~0.0.0" } @@ -1052,17 +1189,20 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -1073,12 +1213,14 @@ "kind-of": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" + "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" } @@ -1086,22 +1228,26 @@ "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true }, "map-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=" + "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", + "dev": true }, "math-random": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true }, "merge-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, "requires": { "readable-stream": "^2.0.1" } @@ -1110,6 +1256,7 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, "requires": { "arr-diff": "^2.0.0", "array-unique": "^0.2.1", @@ -1130,6 +1277,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, "requires": { "arr-flatten": "^1.0.1" } @@ -1137,12 +1285,14 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -1151,6 +1301,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -1160,12 +1311,14 @@ "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==" + "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "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==", + "dev": true, "requires": { "mime-db": "~1.37.0" } @@ -1174,6 +1327,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1181,12 +1335,14 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" } @@ -1195,6 +1351,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, "requires": { "browser-stdout": "1.3.0", "commander": "2.11.0", @@ -1212,6 +1369,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -1226,12 +1384,14 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "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", @@ -1248,6 +1408,7 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", + "dev": true, "requires": { "is": "^3.1.0" } @@ -1256,6 +1417,7 @@ "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" } @@ -1271,17 +1433,20 @@ "oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, "requires": { "for-own": "^0.1.4", "is-extendable": "^0.1.1" @@ -1299,6 +1464,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, "requires": { "is-stream": "^1.0.1", "readable-stream": "^2.0.1" @@ -1313,6 +1479,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, "requires": { "glob-base": "^0.3.0", "is-dotfile": "^1.0.0", @@ -1323,12 +1490,14 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -1338,12 +1507,14 @@ "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + "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", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-key": { "version": "2.0.1", @@ -1354,6 +1525,7 @@ "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" } @@ -1361,17 +1533,20 @@ "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "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", @@ -1383,17 +1558,20 @@ "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true }, "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==" + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true }, "psl": { "version": "1.1.29", "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==" + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "dev": true }, "pump": { "version": "3.0.0", @@ -1407,22 +1585,26 @@ "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true }, "querystringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", - "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==" + "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", + "dev": true }, "queue": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", + "dev": true, "requires": { "inherits": "~2.0.0" } @@ -1431,6 +1613,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "dev": true, "requires": { "is-number": "^4.0.0", "kind-of": "^6.0.0", @@ -1440,12 +1623,14 @@ "is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -1453,6 +1638,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -1467,6 +1653,7 @@ "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, "requires": { "is-equal-shallow": "^0.1.3" } @@ -1474,27 +1661,32 @@ "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=" + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true }, "repeat-element": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==" + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true }, "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true }, "request": { "version": "2.88.0", "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -1521,12 +1713,14 @@ "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true }, "rimraf": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, "requires": { "glob": "^7.0.5" } @@ -1534,12 +1728,14 @@ "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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "semver": { "version": "5.5.0", @@ -1567,12 +1763,14 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true }, "source-map-support": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -1582,6 +1780,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, "requires": { "through": "2" } @@ -1590,6 +1789,7 @@ "version": "1.15.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz", "integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==", + "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -1605,12 +1805,14 @@ "stat-mode": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=" + "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", + "dev": true }, "stream-combiner": { "version": "0.2.2", "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "dev": true, "requires": { "duplexer": "~0.1.1", "through": "~2.3.4" @@ -1619,12 +1821,14 @@ "stream-shift": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + "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" } @@ -1632,12 +1836,14 @@ "streamifier": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", - "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=" + "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" } @@ -1646,6 +1852,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, "requires": { "is-utf8": "^0.2.0" } @@ -1654,6 +1861,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "dev": true, "requires": { "first-chunk-stream": "^1.0.0", "strip-bom": "^2.0.0" @@ -1668,6 +1876,7 @@ "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" } @@ -1676,6 +1885,7 @@ "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", @@ -1685,12 +1895,14 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, "through2": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, "requires": { "readable-stream": "^2.1.5", "xtend": "~4.0.1" @@ -1700,6 +1912,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "dev": true, "requires": { "through2": "~2.0.0", "xtend": "~4.0.0" @@ -1709,6 +1922,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "dev": true, "requires": { "extend-shallow": "^2.0.1" }, @@ -1717,6 +1931,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -1727,6 +1942,7 @@ "version": "2.4.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" @@ -1736,6 +1952,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -1743,12 +1960,14 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true }, "unique-stream": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, "requires": { "json-stable-stringify": "^1.0.0", "through2-filter": "^2.0.0" @@ -1758,6 +1977,7 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", + "dev": true, "requires": { "querystringify": "^2.0.0", "requires-port": "^1.0.0" @@ -1766,22 +1986,26 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true }, "vali-date": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=" + "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", + "dev": true }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -1792,6 +2016,7 @@ "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" @@ -1801,6 +2026,7 @@ "version": "2.4.4", "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, "requires": { "duplexify": "^3.2.0", "glob-stream": "^5.3.2", @@ -1824,17 +2050,20 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + "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=" + "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", @@ -1847,6 +2076,7 @@ "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" @@ -1856,6 +2086,7 @@ "version": "1.1.21", "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.21.tgz", "integrity": "sha512-tJl9eL15ZMm6vzCYYeQ26sSYRuXGMGPsaeIAmG2rOOYRn01jdaDg6I4b9G5Ed6FISdmn6egpKThk4o4om8Ax/A==", + "dev": true, "requires": { "glob": "^7.1.2", "gulp-chmod": "^2.0.0", @@ -1917,12 +2148,14 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, "requires": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -1932,6 +2165,7 @@ "version": "2.4.3", "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz", "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=", + "dev": true, "requires": { "buffer-crc32": "~0.2.3" } diff --git a/client/package.json b/client/package.json index 9f16d15c2..f71c600ab 100644 --- a/client/package.json +++ b/client/package.json @@ -1,22 +1,24 @@ { - "name": "vscode-ruby-client", - "version": "1.0.0", - "description": "Language server client for vscode-ruby", - "repository": "https://github.com/rubyide/vscode-ruby", - "author": "Stafford Brunk ", - "license": "MIT", - "engines": { - "vscode": "^1.25.0" - }, - "private": false, - "main": "out/extension.js", - "dependencies": { - "default-shell": "^1.0.1", - "execa": "^1.0.0", - "vscode": "^1.1.21", - "vscode-languageclient": "^5.1.1" - }, - "scripts": { - "postinstall": "vscode-install" - } + "name": "vscode-ruby-client", + "version": "1.0.0", + "description": "Language server client for vscode-ruby", + "repository": "https://github.com/rubyide/vscode-ruby", + "author": "Stafford Brunk ", + "license": "MIT", + "engines": { + "vscode": "^1.25.0" + }, + "private": false, + "main": "out/extension.js", + "dependencies": { + "default-shell": "^1.0.1", + "execa": "^1.0.0", + "vscode-languageclient": "^5.1.1" + }, + "devDependencies": { + "vscode": "^1.1.21" + }, + "scripts": { + "postinstall": "vscode-install" + } } diff --git a/package-lock.json b/package-lock.json index 4595b5339..5d8f84053 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, "requires": { "co": "^4.6.0", "fast-deep-equal": "^1.0.0", @@ -36,6 +37,7 @@ "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" } @@ -53,6 +55,7 @@ "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" } @@ -72,7 +75,8 @@ "ansi-wrap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true }, "argparse": { "version": "1.0.10", @@ -87,6 +91,7 @@ "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" @@ -95,27 +100,32 @@ "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==" + "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=" + "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=" + "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=" + "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" } @@ -123,27 +133,32 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true }, "array-unique": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true }, "asn1": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true }, "async": { "version": "2.6.1", @@ -156,17 +171,20 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true }, "aws4": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" + "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "dev": true }, "babel-code-frame": { "version": "6.26.0", @@ -188,6 +206,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "dev": true, "optional": true, "requires": { "tweetnacl": "^0.14.3" @@ -197,6 +216,7 @@ "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" } @@ -214,6 +234,7 @@ "version": "1.8.5", "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, "requires": { "expand-range": "^1.8.1", "preserve": "^0.2.0", @@ -223,17 +244,20 @@ "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true }, "buffer-from": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" + "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "dev": true }, "builtin-modules": { "version": "1.1.1", @@ -244,7 +268,8 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, "chalk": { "version": "1.1.3", @@ -270,22 +295,26 @@ "clone": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" + "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=" + "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=" + "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", @@ -295,7 +324,8 @@ "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true }, "coffee-script": { "version": "1.12.7", @@ -328,6 +358,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -335,7 +366,8 @@ "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true }, "concat-map": { "version": "0.0.1", @@ -345,12 +377,14 @@ "convert-source-map": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "cson-parser": { "version": "2.0.1", @@ -365,6 +399,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -373,6 +408,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -381,6 +417,7 @@ "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" } @@ -388,12 +425,14 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true }, "diff": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==" + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true }, "doctrine": { "version": "0.7.2", @@ -422,12 +461,14 @@ "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true }, "duplexify": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "dev": true, "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -439,6 +480,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, "optional": true, "requires": { "jsbn": "~0.1.0" @@ -448,6 +490,7 @@ "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" } @@ -455,7 +498,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "esprima": { "version": "4.0.0", @@ -473,6 +517,7 @@ "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", @@ -487,6 +532,7 @@ "version": "0.1.5", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, "requires": { "is-posix-bracket": "^0.1.0" } @@ -495,6 +541,7 @@ "version": "1.8.2", "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, "requires": { "fill-range": "^2.1.0" } @@ -502,12 +549,14 @@ "extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "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" } @@ -516,6 +565,7 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, "requires": { "is-extglob": "^1.0.0" }, @@ -523,14 +573,16 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true } } }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true }, "fancy-log": { "version": "1.3.2", @@ -546,17 +598,20 @@ "fast-deep-equal": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "dev": true }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, "requires": { "pend": "~1.2.0" } @@ -564,12 +619,14 @@ "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true }, "fill-range": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, "requires": { "is-number": "^2.1.0", "isobject": "^2.0.0", @@ -581,17 +638,20 @@ "first-chunk-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=" + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true }, "for-own": { "version": "0.1.5", "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, "requires": { "for-in": "^1.0.1" } @@ -599,12 +659,14 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true }, "form-data": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "1.0.6", @@ -614,17 +676,20 @@ "from": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "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", @@ -636,6 +701,7 @@ "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -644,6 +710,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -657,6 +724,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, "requires": { "glob-parent": "^2.0.0", "is-glob": "^2.0.0" @@ -666,6 +734,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, "requires": { "is-glob": "^2.0.0" } @@ -673,12 +742,14 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -689,6 +760,7 @@ "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" @@ -698,6 +770,7 @@ "version": "5.3.5", "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, "requires": { "extend": "^3.0.0", "glob": "^5.0.3", @@ -713,6 +786,7 @@ "version": "5.0.15", "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, "requires": { "inflight": "^1.0.4", "inherits": "2", @@ -724,12 +798,14 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "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", @@ -740,12 +816,14 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "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" @@ -756,17 +834,20 @@ "graceful-fs": { "version": "4.1.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "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", @@ -777,6 +858,7 @@ "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", @@ -787,6 +869,7 @@ "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" @@ -795,12 +878,14 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "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", @@ -811,12 +896,14 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "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" @@ -828,6 +915,7 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.0.tgz", "integrity": "sha512-/9vtSk9eI9DEWCqzGieglPqmx0WUQ9pwPHyHFpKmfxqdgqGJC2l0vFMdYs54hLdDsMDEZFLDL2J4ikjc4hQ5HQ==", + "dev": true, "requires": { "event-stream": "^3.3.4", "node.extend": "^1.1.2", @@ -839,17 +927,20 @@ "clone": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "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=" + "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", @@ -865,6 +956,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "dev": true, "requires": { "convert-source-map": "^1.1.1", "graceful-fs": "^4.1.2", @@ -876,17 +968,20 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + "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=" + "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", @@ -899,6 +994,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz", "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=", + "dev": true, "requires": { "event-stream": "^3.3.1", "mkdirp": "^0.5.1", @@ -910,6 +1006,7 @@ "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", @@ -921,17 +1018,20 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + "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=" + "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", @@ -944,6 +1044,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz", "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=", + "dev": true, "requires": { "event-stream": "^3.3.1", "queue": "^4.2.1", @@ -957,17 +1058,20 @@ "clone": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "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=" + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true }, "queue": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/queue/-/queue-4.4.2.tgz", "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==", + "dev": true, "requires": { "inherits": "~2.0.0" } @@ -976,6 +1080,7 @@ "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", @@ -990,12 +1095,14 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true }, "har-validator": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, "requires": { "ajv": "^5.1.0", "har-schema": "^2.0.0" @@ -1013,17 +1120,20 @@ "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -1034,6 +1144,7 @@ "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" @@ -1042,27 +1153,32 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "is": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=" + "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", + "dev": true }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, "is-dotfile": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true }, "is-equal-shallow": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, "requires": { "is-primitive": "^2.0.0" } @@ -1070,17 +1186,20 @@ "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "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=" + "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=", + "dev": true, "requires": { "is-extglob": "^2.1.0" } @@ -1089,6 +1208,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, "requires": { "kind-of": "^3.0.2" }, @@ -1097,6 +1217,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -1106,47 +1227,56 @@ "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true }, "is-posix-bracket": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true }, "is-primitive": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true }, "is-valid-glob": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=" + "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", + "dev": true }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isobject": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, "requires": { "isarray": "1.0.0" } @@ -1154,7 +1284,8 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true }, "jade": { "version": "0.26.3", @@ -1200,22 +1331,26 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, "optional": true }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true }, "json-schema-traverse": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true }, "json-stable-stringify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, "requires": { "jsonify": "~0.0.0" } @@ -1223,17 +1358,20 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -1244,12 +1382,14 @@ "kind-of": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" + "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" } @@ -1262,7 +1402,8 @@ "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true }, "lru-cache": { "version": "2.7.3", @@ -1273,17 +1414,20 @@ "map-stream": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true }, "math-random": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true }, "merge-stream": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, "requires": { "readable-stream": "^2.0.1" } @@ -1292,6 +1436,7 @@ "version": "2.3.11", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, "requires": { "arr-diff": "^2.0.0", "array-unique": "^0.2.1", @@ -1312,6 +1457,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, "requires": { "arr-flatten": "^1.0.1" } @@ -1319,12 +1465,14 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -1333,6 +1481,7 @@ "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, "requires": { "is-buffer": "^1.1.5" } @@ -1342,12 +1491,14 @@ "mime-db": { "version": "1.33.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true }, "mime-types": { "version": "2.1.18", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, "requires": { "mime-db": "~1.33.0" } @@ -1461,12 +1612,14 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "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", @@ -1478,6 +1631,7 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", + "dev": true, "requires": { "is": "^3.1.0" } @@ -1486,6 +1640,7 @@ "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" } @@ -1493,17 +1648,20 @@ "oauth-sign": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true }, "object.omit": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, "requires": { "for-own": "^0.1.4", "is-extendable": "^0.1.1" @@ -1513,6 +1671,7 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } @@ -1521,6 +1680,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, "requires": { "is-stream": "^1.0.1", "readable-stream": "^2.0.1" @@ -1530,6 +1690,7 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, "requires": { "glob-base": "^0.3.0", "is-dotfile": "^1.0.0", @@ -1540,12 +1701,14 @@ "is-extglob": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true }, "is-glob": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, "requires": { "is-extglob": "^1.0.0" } @@ -1555,12 +1718,14 @@ "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + "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", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-parse": { "version": "1.0.5", @@ -1572,6 +1737,7 @@ "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" } @@ -1579,17 +1745,20 @@ "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "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", @@ -1601,7 +1770,8 @@ "preserve": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true }, "prettier": { "version": "1.13.7", @@ -1612,27 +1782,32 @@ "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==" + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true }, "punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true }, "querystringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", - "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==" + "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", + "dev": true }, "queue": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", + "dev": true, "requires": { "inherits": "~2.0.0" } @@ -1641,6 +1816,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", + "dev": true, "requires": { "is-number": "^4.0.0", "kind-of": "^6.0.0", @@ -1650,12 +1826,14 @@ "is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true }, "kind-of": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true } } }, @@ -1663,6 +1841,7 @@ "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -1677,6 +1856,7 @@ "version": "0.4.4", "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, "requires": { "is-equal-shallow": "^0.1.3" } @@ -1684,27 +1864,32 @@ "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=" + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true }, "repeat-element": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true }, "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true }, "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true }, "request": { "version": "2.87.0", "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "dev": true, "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.6.0", @@ -1731,7 +1916,8 @@ "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true }, "resolve": { "version": "1.8.1", @@ -1746,6 +1932,7 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, "requires": { "glob": "^7.0.5" } @@ -1769,17 +1956,20 @@ "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==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true }, "sigmund": { "version": "1.0.1", @@ -1790,12 +1980,14 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true }, "source-map-support": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -1805,6 +1997,7 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, "requires": { "through": "2" } @@ -1819,6 +2012,7 @@ "version": "1.14.2", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -1834,12 +2028,14 @@ "stat-mode": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=" + "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", + "dev": true }, "stream-combiner": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, "requires": { "duplexer": "~0.1.1" } @@ -1847,12 +2043,14 @@ "stream-shift": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + "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" } @@ -1860,12 +2058,14 @@ "streamifier": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", - "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=" + "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" } @@ -1883,6 +2083,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, "requires": { "is-utf8": "^0.2.0" } @@ -1891,6 +2092,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "dev": true, "requires": { "first-chunk-stream": "^1.0.0", "strip-bom": "^2.0.0" @@ -1900,6 +2102,7 @@ "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" } @@ -1908,6 +2111,7 @@ "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", @@ -1917,12 +2121,14 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, "through2": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, "requires": { "readable-stream": "^2.1.5", "xtend": "~4.0.1" @@ -1932,6 +2138,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "dev": true, "requires": { "through2": "~2.0.0", "xtend": "~4.0.0" @@ -1947,6 +2154,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "dev": true, "requires": { "extend-shallow": "^2.0.1" }, @@ -1955,6 +2163,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, "requires": { "is-extendable": "^0.1.0" } @@ -1971,6 +2180,7 @@ "version": "2.3.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "dev": true, "requires": { "punycode": "^1.4.1" } @@ -2106,6 +2316,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -2114,6 +2325,7 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, "optional": true }, "typescript": { @@ -2126,6 +2338,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, "requires": { "json-stable-stringify": "^1.0.0", "through2-filter": "^2.0.0" @@ -2135,6 +2348,7 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.1.tgz", "integrity": "sha512-x95Td74QcvICAA0+qERaVkRpTGKyBHHYdwL2LXZm5t/gBtCB9KQSO/0zQgSTYEV1p0WcvSg79TLNPSvd5IDJMQ==", + "dev": true, "requires": { "querystringify": "^2.0.0", "requires-port": "^1.0.0" @@ -2143,22 +2357,26 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true }, "vali-date": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=" + "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", + "dev": true }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -2169,6 +2387,7 @@ "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" @@ -2178,6 +2397,7 @@ "version": "2.4.4", "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, "requires": { "duplexify": "^3.2.0", "glob-stream": "^5.3.2", @@ -2201,17 +2421,20 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + "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=" + "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", @@ -2224,6 +2447,7 @@ "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" @@ -2233,6 +2457,7 @@ "version": "1.1.18", "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.18.tgz", "integrity": "sha512-SyDw4qFwZ+WthZX7RWp71PNiWLF7VhpM65j2oryY/6jtSORd8qH6J8vclwWZJ6Jvu0EH7JamO2RWNfBfsMR9Zw==", + "dev": true, "requires": { "glob": "^7.1.2", "gulp-chmod": "^2.0.0", @@ -2254,6 +2479,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, "requires": { "browser-stdout": "1.3.0", "commander": "2.11.0", @@ -2302,7 +2528,8 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "xmldom": { "version": "0.1.27", @@ -2312,12 +2539,14 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, "requires": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -2327,6 +2556,7 @@ "version": "2.4.3", "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz", "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=", + "dev": true, "requires": { "buffer-crc32": "~0.2.3" } diff --git a/package.json b/package.json index f48b33eb3..2285b9d0d 100644 --- a/package.json +++ b/package.json @@ -1,693 +1,693 @@ { - "name": "ruby", - "displayName": "Ruby", - "version": "0.21.1", - "publisher": "rebornix", - "description": "Provides Ruby language and debugging support for Visual Studio Code", - "author": { - "name": "Stafford Brunk" - }, - "contributors": [ - { - "name": "Peng Lyu", - "url": "https://github.com/rebornix" - }, - { - "name": "Bryan Hoekstra", - "url": "https://github.com/HookyQR" - }, - { - "name": "Drew Cain", - "url": "https://github.com/groksrc" - }, - { - "name": "Lex Li", - "url": "https://github.com/lextm" - }, - { - "name": "Stafford Brunk", - "url": "https://github.com/wingrunr21" - } - ], - "engines": { - "vscode": "^1.25.0" - }, - "license": "MIT", - "icon": "images/ruby.png", - "categories": [ - "Languages", - "Debuggers", - "Linters", - "Snippets", - "Formatters" - ], - "private": false, - "repository": { - "type": "git", - "url": "https://github.com/rubyide/vscode-ruby.git" - }, - "bugs": { - "url": "https://github.com/rubyide/vscode-ruby/issues" - }, - "dependencies": { - "@types/xmldom": "^0.1.29", - "async": "^2.3.0", - "lodash": "^4.17.3", - "minimatch": "^3.0.3", - "ruby-method-locate": "*", - "vscode": "^1.1.4", - "vscode-debugadapter": "^1.19.0", - "vscode-debugprotocol": "^1.19.0", - "xmldom": "^0.1.19" - }, - "devDependencies": { - "@types/mocha": "^2.2.33", - "@types/node": "^6.0.50", - "cson-parser": "^2.0.1", - "mocha": "^2.4.5", - "prettier": "^1.11.1", - "run-sequence": "*", - "tslint": "^5.9.1", - "tslint-config-prettier": "^1.10.0", - "tslint-config-standard": "^8.0.1", - "tslint-no-circular-imports": "^0.6.1", - "typescript": "^2.9.2", - "vscode-debugadapter-testsupport": "^1.19.0" - }, - "scripts": { - "vscode:prepublish": "npm run clean:server && npm run compile", - "clean:server": "cd server && npm run remove-binaries", - "compile:legacy": "rm -rf out && tsc -p ./src", - "compile:client": "rm -rf ./client/out && tsc -p ./client/tsconfig.json", - "compile:server": "rm -rf ./server/out && tsc -p ./server/tsconfig.json", - "watch": "tsc -w -p ./src", - "watch:client": "tsc -w -p ./client/tsconfig.json", - "watch:server": "tsc -w -p ./server/tsconfig.json", - "compile": "npm run compile:legacy && npm run compile:client && npm run compile:server", - "test": "node ./node_modules/mocha/bin/mocha --recursive ./out/*.test.js", - "test-debugger": "node ./node_modules/mocha/bin/mocha --timeout 15000 -u tdd ./out/debugger/tests/*.js", - "postinstall": "node ./node_modules/vscode/bin/install", - "update-all-grammars": "node scripts/update-all-grammars", - "update-grammar": "node scripts/update-grammar atom/language-ruby", - "lint": "tslint -c tslint.json 'src/**/*.ts'" - }, - "activationEvents": [ - "onLanguage:ruby", - "onLanguage:erb", - "onCommand:workbench.action.tasks.runTask" - ], - "main": "./out/ruby.js", - "contributes": { - "snippets": [ - { - "language": "ruby", - "path": "./snippets/ruby.json" - }, - { - "language": "erb", - "path": "./snippets/erb.json" - } - ], - "commands": [ - { - "command": "ruby.reloadProject", - "title": "Ruby: Reload Project" - } - ], - "configuration": { - "title": "Ruby configuration", - "properties": { - "ruby.locate": { - "type": "object", - "description": "Defines where the Ruby extension will look to find Modules, Classes and methods.", - "default": { - "exclude": "{**/@(test|spec|tmp|.*),**/@(test|spec|tmp|.*)/**,**/*_spec.rb}", - "include": "**/*.rb" - }, - "properties": { - "include": { - "type": "string", - "description": "glob pattern to select files to parse. Matches are performed against the path relative to the workspace root", - "default": "**/*.rb" - }, - "exclude": { - "type": "string", - "description": "glob pattern to select files to ignore, this is also run against paths for exclusion from walking. Matches are performed against the path relative to the workspace root", - "default": "{**/@(test|spec|tmp|.*),**/@(test|spec|tmp|.*)/**,**/*_spec.rb}" - } - } - }, - "ruby.interpreter.commandPath": { - "type": "string", - "default": "ruby", - "description": "Path to the Ruby interpreter. Set this to an absolute path to select from multiple installed Ruby versions.", - "isExecutable": true, - "scope": "resource" - }, - "ruby.useLanguageServer": { - "type": "boolean", - "default": false, - "description": "Use built-in language server" - }, - "ruby.codeCompletion": { - "type": [ - "boolean", - "string" - ], - "enum": [ - false, - "rcodetools" - ], - "default": false, - "description": "Method to use for code completion. Use `false` to disable or if another extension provides this feature." - }, - "ruby.intellisense": { - "type": [ - "boolean", - "string" - ], - "enum": [ - false, - "rubyLocate" - ], - "default": false, - "description": "Method to use for intellisense (go to definition, etc.). Use `false` to disable or if another extension provides this feature." - }, - "ruby.useBundler": { - "type": "boolean", - "default": false, - "description": "Whether ruby tools should be started using Bundler", - "scope": "resource" - }, - "ruby.pathToBundler": { - "type": "string", - "default": "bundle", - "description": "Path to the bundler executable (used if useBundler is true)", - "scope": "resource" - }, - "ruby.rctComplete.commandPath": { - "type": "string", - "default": "rct-complete", - "description": "Path to the rct-complete command. Set this to an absolute path to select from multiple installed Ruby versions.", - "isExecutable": true - }, - "ruby.lintDebounceTime": { - "type": "integer", - "default": 500, - "description": "Time (ms) to wait after keypress before running enabled linters. Ensures linters are only run when typing has finished and not for every keypress" - }, - "ruby.lint": { - "scope": "resource", - "type": "object", - "description": "Set individual ruby linters to use", - "properties": { - "ruby": { - "type": [ - "boolean", - "object" - ], - "default": false, - "description": "Use ruby -wc to lint" - }, - "debride": { - "type": [ - "boolean", - "object" - ], - "default": false, - "properties": { - "rails": { - "type": "boolean", - "default": "true", - "description": "Add some rails call conversions" - } - }, - "description": "Use debride to lint" - }, - "fasterer": { - "type": "boolean", - "default": false, - "description": "Use fasterer to lint" - }, - "reek": { - "type": [ - "boolean", - "object" - ], - "default": false, - "description": "Use reek to lint", - "properties": { - "command": { - "type": "string", - "description": "reek command. Setting this will cause reek to be executed exactly this way and other settings will be ignored!" - }, - "useBundler": { - "type": "boolean", - "default": false, - "description": "Prefix the `reek` command with `bundle exec`" - } - } - }, - "rubocop": { - "type": [ - "boolean", - "object" - ], - "default": false, - "description": "Use RuboCop to lint", - "properties": { - "command": { - "type": "string", - "description": "RuboCop command. Setting this will cause RuboCop to be executed this way and other settings will be ignored!" - }, - "useBundler": { - "type": "boolean", - "default": false, - "description": "Prefix the `rubocop` command with `bundle exec`" - }, - "lint": { - "type": "boolean", - "default": false, - "description": "Enable Lint cops: Lint cops check for possible errors and very bad practices in your code. RuboCop implements in a portable way all built-in MRI lint checks (ruby -wc) and adds a lot of extra lint checks of its own." - }, - "only": { - "type": "array", - "description": "Run only the specified cop(s) and/or cops in the specified departments", - "items": { - "type": "string" - } - }, - "except": { - "type": "array", - "description": "Run all cops enabled by configuration except the specified cop(s) and/or departments", - "items": { - "type": "string" - } - }, - "require": { - "type": "array", - "description": "Require Ruby files", - "items": { - "type": "string" - } - }, - "rails": { - "type": "boolean", - "default": false, - "description": "Rails cops are specific to the Ruby on Rails framework" - } - } - }, - "standard": { - "type": [ - "boolean", - "object" - ], - "default": false, - "description": "Use standard to lint", - "properties": { - "command": { - "type": "string", - "description": "Standard command. Setting this will cause standard to be executed this way and other settings will be ignored!" - }, - "useBundler": { - "type": "boolean", - "default": false, - "description": "Prefix the `standard` command with `bundle exec`" - }, - "only": { - "type": "array", - "description": "Run only the specified cop(s) and/or cops in the specified departments", - "items": { - "type": "string" - } - }, - "except": { - "type": "array", - "description": "Run all cops enabled by configuration except the specified cop(s) and/or departments", - "items": { - "type": "string" - } - }, - "require": { - "type": "array", - "description": "Require Ruby files", - "items": { - "type": "string" - } - } - } - }, - "ruby-lint": { - "type": [ - "boolean", - "object" - ], - "default": false, - "description": "Use ruby-lint to lint", - "properties": { - "levels": { - "type": "array", - "description": "Level of offenses to show", - "items": { - "type": "string", - "enum": [ - "error", - "warning", - "info" - ] - } - }, - "classes": { - "type": "array", - "description": "Classes of offenses to show", - "items": { - "type": "string", - "enum": [ - "argument_amount", - "loop_keywords", - "pedantics", - "shadowing_variables", - "undefined_methods", - "undefined_variables", - "unused_variables", - "useless_equality_checks" - ] - } - } - } - } - } - }, - "ruby.format": { - "type": [ - "boolean", - "string" - ], - "enum": [ - false, - "rubocop", - "standard", - "rufo" - ], - "default": false, - "description": "Which system to use for formatting. Use `false` to disable or if another extension provides this feature.", - "scope": "resource" - } - } - }, - "languages": [ - { - "id": "ruby", - "aliases": [ - "Ruby", - "ruby" - ], - "firstLine": "^#!\\s*/.*(?:ruby|rbx|rake)\\b", - "extensions": [ - ".arb", - ".builder", - ".cgi", - ".fcgi", - ".gemspec", - ".god", - ".irbrc", - ".jbuilder", - ".mspec", - ".pluginspec", - ".podspec", - ".prawn", - ".pryrc", - ".rabl", - ".rake", - ".rb", - ".rbuild", - ".rbw", - ".rbx", - ".rjs", - ".ru", - ".ruby", - ".spec", - ".thor", - ".watchr" - ], - "filenames": [ - "appfile", - "appraisals", - "berksfile", - "brewfile", - "capfile", - "deliverfile", - "fastfile", - "guardfile", - "podfile", - "puppetfile", - "rakefile", - "snapfile", - "thorfile", - "vagrantfile", - "dangerfile" - ], - "configuration": "./language-configuration-ruby.json" - }, - { - "id": "erb", - "aliases": [ - "erb", - "Encapsulated Ruby" - ], - "extensions": [ - ".erb", - ".rhtml", - ".rhtm" - ], - "configuration": "./language-configuration-erb.json" - }, - { - "id": "gemfile", - "aliases": [ - "Gemfile", - "Bundler", - "bundler" - ], - "filenames": [ - "Gemfile" - ], - "configuration": "./language-configuration-ruby.json" - } - ], - "grammars": [ - { - "language": "ruby", - "scopeName": "source.ruby", - "path": "./syntaxes/ruby.cson.json" - }, - { - "language": "erb", - "scopeName": "text.html.erb", - "path": "./syntaxes/erb.cson.json", - "embeddedLanguages": { - "source.css": "css", - "source.js": "javascript", - "source.ruby": "ruby" - } - }, - { - "language": "gemfile", - "scopeName": "source.ruby.gemfile", - "path": "./syntaxes/gemfile.cson.json" - } - ], - "debuggers": [ - { - "type": "Ruby", - "label": "Ruby", - "enableBreakpointsFor": { - "languageIds": [ - "ruby", - "erb" - ] - }, - "program": "./out/debugger/main.js", - "runtime": "node", - "configurationSnippets": [ - { - "label": "Ruby: Debug Local File", - "body": { - "name": "Debug Local File", - "type": "Ruby", - "request": "launch", - "program": "^\"\\${workspaceRoot}/main.rb\"" - } - }, - { - "label": "Ruby: Listen for rdebug-ide", - "body": { - "name": "Listen for rdebug-ide", - "type": "Ruby", - "request": "attach", - "remoteHost": "127.0.0.1", - "remotePort": "1234", - "remoteWorkspaceRoot": "^\"\\${workspaceRoot}\"" - } - }, - { - "label": "Ruby: Rails server", - "body": { - "name": "Rails server", - "type": "Ruby", - "request": "launch", - "program": "^\"\\${workspaceRoot}/bin/rails\"", - "args": [ - "server" - ] - } - }, - { - "label": "Ruby: RSpec - all", - "body": { - "name": "RSpec - all", - "type": "Ruby", - "request": "launch", - "program": "^\"\\${workspaceRoot}/bin/rspec\"", - "args": [ - "-I", - "^\"\\${workspaceRoot}\"" - ] - } - }, - { - "label": "Ruby: RSpec - active spec file only", - "body": { - "name": "RSpec - active spec file only", - "type": "Ruby", - "request": "launch", - "program": "^\"\\${workspaceRoot}/bin/rspec\"", - "args": [ - "-I", - "^\"\\${workspaceRoot}\"", - "^\"\\${file}\"" - ] - } - }, - { - "label": "Ruby: Cucumber", - "body": { - "name": "Cucumber", - "type": "Ruby", - "request": "launch", - "program": "^\"\\${workspaceRoot}/bin/cucumber\"" - } - } - ], - "configurationAttributes": { - "launch": { - "required": [ - "program" - ], - "properties": { - "program": { - "type": "string", - "description": "Absolute path to the program.", - "default": "${workspaceRoot}/main.rb" - }, - "stopOnEntry": { - "type": "boolean", - "description": "Automatically stop after launch.", - "default": true - }, - "showDebuggerOutput": { - "type": "boolean", - "description": "Show output of the debugger in the console.", - "default": false - }, - "args": { - "type": "array", - "description": "Command line arguments passed to the program.", - "items": { - "type": "string" - }, - "default": [] - }, - "env": { - "type": "object", - "description": "Additional environment variables to pass to the debugging (and debugged) process.", - "default": {} - }, - "cwd": { - "type": "string", - "description": "Absolute path to the working directory of the program being debugged.", - "default": "${workspaceRoot}" - }, - "useBundler": { - "type": "boolean", - "description": "Use `bundle exec` to run rdebug-ide. Enable this option if you have used bundle install --path with rdebug-ide as a bundled gem.", - "default": false - }, - "pathToRuby": { - "type": "string", - "description": "Path to the Ruby executable if it is not 'ruby', used to run the program without the debugger (under CTRL+F5)", - "default": "ruby" - }, - "pathToBundler": { - "type": "string", - "description": "If you use the `useBunder` option, and `bundle` is not in your path, provide the absolute path to `bundle` (eg. \"/usr/bin/bundle\" )", - "default": "bundle" - }, - "pathToRDebugIDE": { - "type": "string", - "description": "If `rdebug-ide` is not in your path, provide the absolute path to `rdebug-ide` (eg. \"c:\\ruby\\rdebug-ide.bat\" )", - "default": "rdebug-ide" - }, - "debuggerPort": { - "type": "string", - "description": "If you want to run more than one debugger, you can specify the port here.", - "default": "1234" - }, - "includes": { - "type": "array", - "description": "Additional paths to be added to Ruby's include path", - "default": [] - } - } - }, - "attach": { - "required": [ - "cwd", - "remoteHost", - "remotePort", - "remoteWorkspaceRoot" - ], - "properties": { - "cwd": { - "type": "string", - "description": "Absolute path to the working directory of the program being debugged.", - "default": "${workspaceRoot}" - }, - "remoteHost": { - "type": "string", - "description": "Host address for remote debugging.", - "default": "127.0.0.1" - }, - "remotePort": { - "type": "string", - "description": "Port for remote debugging.", - "default": "1234" - }, - "remoteWorkspaceRoot": { - "type": "string", - "description": "Remote workspace root, this parameter is required for remote debugging.", - "default": "${workspaceRoot}" - }, - "showDebuggerOutput": { - "type": "boolean", - "description": "Show output of the debugger in the console.", - "default": false - } - } - } - } - } - ] - } + "name": "ruby", + "displayName": "Ruby", + "version": "0.22.0", + "publisher": "rebornix", + "description": "Provides Ruby language and debugging support for Visual Studio Code", + "author": { + "name": "Stafford Brunk" + }, + "contributors": [ + { + "name": "Peng Lyu", + "url": "https://github.com/rebornix" + }, + { + "name": "Bryan Hoekstra", + "url": "https://github.com/HookyQR" + }, + { + "name": "Drew Cain", + "url": "https://github.com/groksrc" + }, + { + "name": "Lex Li", + "url": "https://github.com/lextm" + }, + { + "name": "Stafford Brunk", + "url": "https://github.com/wingrunr21" + } + ], + "engines": { + "vscode": "^1.25.0" + }, + "license": "MIT", + "icon": "images/ruby.png", + "categories": [ + "Languages", + "Debuggers", + "Linters", + "Snippets", + "Formatters" + ], + "private": false, + "repository": { + "type": "git", + "url": "https://github.com/rubyide/vscode-ruby.git" + }, + "bugs": { + "url": "https://github.com/rubyide/vscode-ruby/issues" + }, + "dependencies": { + "@types/xmldom": "^0.1.29", + "async": "^2.3.0", + "lodash": "^4.17.3", + "minimatch": "^3.0.3", + "ruby-method-locate": "*", + "vscode-debugadapter": "^1.19.0", + "vscode-debugprotocol": "^1.19.0", + "xmldom": "^0.1.19" + }, + "devDependencies": { + "@types/mocha": "^2.2.33", + "@types/node": "^6.0.50", + "cson-parser": "^2.0.1", + "mocha": "^2.4.5", + "prettier": "^1.11.1", + "run-sequence": "*", + "tslint": "^5.9.1", + "tslint-config-prettier": "^1.10.0", + "tslint-config-standard": "^8.0.1", + "tslint-no-circular-imports": "^0.6.1", + "typescript": "^2.9.2", + "vscode": "^1.1.4", + "vscode-debugadapter-testsupport": "^1.19.0" + }, + "scripts": { + "vscode:prepublish": "npm run clean:server && npm run compile", + "clean:server": "cd server && npm run remove-binaries", + "compile:legacy": "rm -rf out && tsc -p ./src", + "compile:client": "rm -rf ./client/out && tsc -p ./client/tsconfig.json", + "compile:server": "rm -rf ./server/out && tsc -p ./server/tsconfig.json", + "watch": "tsc -w -p ./src", + "watch:client": "tsc -w -p ./client/tsconfig.json", + "watch:server": "tsc -w -p ./server/tsconfig.json", + "compile": "npm run compile:legacy && npm run compile:client && npm run compile:server", + "test": "node ./node_modules/mocha/bin/mocha --recursive ./out/*.test.js", + "test-debugger": "node ./node_modules/mocha/bin/mocha --timeout 15000 -u tdd ./out/debugger/tests/*.js", + "postinstall": "node ./node_modules/vscode/bin/install", + "update-all-grammars": "node scripts/update-all-grammars", + "update-grammar": "node scripts/update-grammar atom/language-ruby", + "lint": "tslint -c tslint.json 'src/**/*.ts'" + }, + "activationEvents": [ + "onLanguage:ruby", + "onLanguage:erb", + "onCommand:workbench.action.tasks.runTask" + ], + "main": "./out/ruby.js", + "contributes": { + "snippets": [ + { + "language": "ruby", + "path": "./snippets/ruby.json" + }, + { + "language": "erb", + "path": "./snippets/erb.json" + } + ], + "commands": [ + { + "command": "ruby.reloadProject", + "title": "Ruby: Reload Project" + } + ], + "configuration": { + "title": "Ruby configuration", + "properties": { + "ruby.locate": { + "type": "object", + "description": "Defines where the Ruby extension will look to find Modules, Classes and methods.", + "default": { + "exclude": "{**/@(test|spec|tmp|.*),**/@(test|spec|tmp|.*)/**,**/*_spec.rb}", + "include": "**/*.rb" + }, + "properties": { + "include": { + "type": "string", + "description": "glob pattern to select files to parse. Matches are performed against the path relative to the workspace root", + "default": "**/*.rb" + }, + "exclude": { + "type": "string", + "description": "glob pattern to select files to ignore, this is also run against paths for exclusion from walking. Matches are performed against the path relative to the workspace root", + "default": "{**/@(test|spec|tmp|.*),**/@(test|spec|tmp|.*)/**,**/*_spec.rb}" + } + } + }, + "ruby.interpreter.commandPath": { + "type": "string", + "default": "ruby", + "description": "Path to the Ruby interpreter. Set this to an absolute path to select from multiple installed Ruby versions.", + "isExecutable": true, + "scope": "resource" + }, + "ruby.useLanguageServer": { + "type": "boolean", + "default": false, + "description": "Use built-in language server" + }, + "ruby.codeCompletion": { + "type": [ + "boolean", + "string" + ], + "enum": [ + false, + "rcodetools" + ], + "default": false, + "description": "Method to use for code completion. Use `false` to disable or if another extension provides this feature." + }, + "ruby.intellisense": { + "type": [ + "boolean", + "string" + ], + "enum": [ + false, + "rubyLocate" + ], + "default": false, + "description": "Method to use for intellisense (go to definition, etc.). Use `false` to disable or if another extension provides this feature." + }, + "ruby.useBundler": { + "type": "boolean", + "default": false, + "description": "Whether ruby tools should be started using Bundler", + "scope": "resource" + }, + "ruby.pathToBundler": { + "type": "string", + "default": "bundle", + "description": "Path to the bundler executable (used if useBundler is true)", + "scope": "resource" + }, + "ruby.rctComplete.commandPath": { + "type": "string", + "default": "rct-complete", + "description": "Path to the rct-complete command. Set this to an absolute path to select from multiple installed Ruby versions.", + "isExecutable": true + }, + "ruby.lintDebounceTime": { + "type": "integer", + "default": 500, + "description": "Time (ms) to wait after keypress before running enabled linters. Ensures linters are only run when typing has finished and not for every keypress" + }, + "ruby.lint": { + "scope": "resource", + "type": "object", + "description": "Set individual ruby linters to use", + "properties": { + "ruby": { + "type": [ + "boolean", + "object" + ], + "default": false, + "description": "Use ruby -wc to lint" + }, + "debride": { + "type": [ + "boolean", + "object" + ], + "default": false, + "properties": { + "rails": { + "type": "boolean", + "default": "true", + "description": "Add some rails call conversions" + } + }, + "description": "Use debride to lint" + }, + "fasterer": { + "type": "boolean", + "default": false, + "description": "Use fasterer to lint" + }, + "reek": { + "type": [ + "boolean", + "object" + ], + "default": false, + "description": "Use reek to lint", + "properties": { + "command": { + "type": "string", + "description": "reek command. Setting this will cause reek to be executed exactly this way and other settings will be ignored!" + }, + "useBundler": { + "type": "boolean", + "default": false, + "description": "Prefix the `reek` command with `bundle exec`" + } + } + }, + "rubocop": { + "type": [ + "boolean", + "object" + ], + "default": false, + "description": "Use RuboCop to lint", + "properties": { + "command": { + "type": "string", + "description": "RuboCop command. Setting this will cause RuboCop to be executed this way and other settings will be ignored!" + }, + "useBundler": { + "type": "boolean", + "default": false, + "description": "Prefix the `rubocop` command with `bundle exec`" + }, + "lint": { + "type": "boolean", + "default": false, + "description": "Enable Lint cops: Lint cops check for possible errors and very bad practices in your code. RuboCop implements in a portable way all built-in MRI lint checks (ruby -wc) and adds a lot of extra lint checks of its own." + }, + "only": { + "type": "array", + "description": "Run only the specified cop(s) and/or cops in the specified departments", + "items": { + "type": "string" + } + }, + "except": { + "type": "array", + "description": "Run all cops enabled by configuration except the specified cop(s) and/or departments", + "items": { + "type": "string" + } + }, + "require": { + "type": "array", + "description": "Require Ruby files", + "items": { + "type": "string" + } + }, + "rails": { + "type": "boolean", + "default": false, + "description": "Rails cops are specific to the Ruby on Rails framework" + } + } + }, + "standard": { + "type": [ + "boolean", + "object" + ], + "default": false, + "description": "Use standard to lint", + "properties": { + "command": { + "type": "string", + "description": "Standard command. Setting this will cause standard to be executed this way and other settings will be ignored!" + }, + "useBundler": { + "type": "boolean", + "default": false, + "description": "Prefix the `standard` command with `bundle exec`" + }, + "only": { + "type": "array", + "description": "Run only the specified cop(s) and/or cops in the specified departments", + "items": { + "type": "string" + } + }, + "except": { + "type": "array", + "description": "Run all cops enabled by configuration except the specified cop(s) and/or departments", + "items": { + "type": "string" + } + }, + "require": { + "type": "array", + "description": "Require Ruby files", + "items": { + "type": "string" + } + } + } + }, + "ruby-lint": { + "type": [ + "boolean", + "object" + ], + "default": false, + "description": "Use ruby-lint to lint", + "properties": { + "levels": { + "type": "array", + "description": "Level of offenses to show", + "items": { + "type": "string", + "enum": [ + "error", + "warning", + "info" + ] + } + }, + "classes": { + "type": "array", + "description": "Classes of offenses to show", + "items": { + "type": "string", + "enum": [ + "argument_amount", + "loop_keywords", + "pedantics", + "shadowing_variables", + "undefined_methods", + "undefined_variables", + "unused_variables", + "useless_equality_checks" + ] + } + } + } + } + } + }, + "ruby.format": { + "type": [ + "boolean", + "string" + ], + "enum": [ + false, + "rubocop", + "standard", + "rufo" + ], + "default": false, + "description": "Which system to use for formatting. Use `false` to disable or if another extension provides this feature.", + "scope": "resource" + } + } + }, + "languages": [ + { + "id": "ruby", + "aliases": [ + "Ruby", + "ruby" + ], + "firstLine": "^#!\\s*/.*(?:ruby|rbx|rake)\\b", + "extensions": [ + ".arb", + ".builder", + ".cgi", + ".fcgi", + ".gemspec", + ".god", + ".irbrc", + ".jbuilder", + ".mspec", + ".pluginspec", + ".podspec", + ".prawn", + ".pryrc", + ".rabl", + ".rake", + ".rb", + ".rbuild", + ".rbw", + ".rbx", + ".rjs", + ".ru", + ".ruby", + ".spec", + ".thor", + ".watchr" + ], + "filenames": [ + "appfile", + "appraisals", + "berksfile", + "brewfile", + "capfile", + "deliverfile", + "fastfile", + "guardfile", + "podfile", + "puppetfile", + "rakefile", + "snapfile", + "thorfile", + "vagrantfile", + "dangerfile" + ], + "configuration": "./language-configuration-ruby.json" + }, + { + "id": "erb", + "aliases": [ + "erb", + "Encapsulated Ruby" + ], + "extensions": [ + ".erb", + ".rhtml", + ".rhtm" + ], + "configuration": "./language-configuration-erb.json" + }, + { + "id": "gemfile", + "aliases": [ + "Gemfile", + "Bundler", + "bundler" + ], + "filenames": [ + "Gemfile" + ], + "configuration": "./language-configuration-ruby.json" + } + ], + "grammars": [ + { + "language": "ruby", + "scopeName": "source.ruby", + "path": "./syntaxes/ruby.cson.json" + }, + { + "language": "erb", + "scopeName": "text.html.erb", + "path": "./syntaxes/erb.cson.json", + "embeddedLanguages": { + "source.css": "css", + "source.js": "javascript", + "source.ruby": "ruby" + } + }, + { + "language": "gemfile", + "scopeName": "source.ruby.gemfile", + "path": "./syntaxes/gemfile.cson.json" + } + ], + "debuggers": [ + { + "type": "Ruby", + "label": "Ruby", + "enableBreakpointsFor": { + "languageIds": [ + "ruby", + "erb" + ] + }, + "program": "./out/debugger/main.js", + "runtime": "node", + "configurationSnippets": [ + { + "label": "Ruby: Debug Local File", + "body": { + "name": "Debug Local File", + "type": "Ruby", + "request": "launch", + "program": "^\"\\${workspaceRoot}/main.rb\"" + } + }, + { + "label": "Ruby: Listen for rdebug-ide", + "body": { + "name": "Listen for rdebug-ide", + "type": "Ruby", + "request": "attach", + "remoteHost": "127.0.0.1", + "remotePort": "1234", + "remoteWorkspaceRoot": "^\"\\${workspaceRoot}\"" + } + }, + { + "label": "Ruby: Rails server", + "body": { + "name": "Rails server", + "type": "Ruby", + "request": "launch", + "program": "^\"\\${workspaceRoot}/bin/rails\"", + "args": [ + "server" + ] + } + }, + { + "label": "Ruby: RSpec - all", + "body": { + "name": "RSpec - all", + "type": "Ruby", + "request": "launch", + "program": "^\"\\${workspaceRoot}/bin/rspec\"", + "args": [ + "-I", + "^\"\\${workspaceRoot}\"" + ] + } + }, + { + "label": "Ruby: RSpec - active spec file only", + "body": { + "name": "RSpec - active spec file only", + "type": "Ruby", + "request": "launch", + "program": "^\"\\${workspaceRoot}/bin/rspec\"", + "args": [ + "-I", + "^\"\\${workspaceRoot}\"", + "^\"\\${file}\"" + ] + } + }, + { + "label": "Ruby: Cucumber", + "body": { + "name": "Cucumber", + "type": "Ruby", + "request": "launch", + "program": "^\"\\${workspaceRoot}/bin/cucumber\"" + } + } + ], + "configurationAttributes": { + "launch": { + "required": [ + "program" + ], + "properties": { + "program": { + "type": "string", + "description": "Absolute path to the program.", + "default": "${workspaceRoot}/main.rb" + }, + "stopOnEntry": { + "type": "boolean", + "description": "Automatically stop after launch.", + "default": true + }, + "showDebuggerOutput": { + "type": "boolean", + "description": "Show output of the debugger in the console.", + "default": false + }, + "args": { + "type": "array", + "description": "Command line arguments passed to the program.", + "items": { + "type": "string" + }, + "default": [] + }, + "env": { + "type": "object", + "description": "Additional environment variables to pass to the debugging (and debugged) process.", + "default": {} + }, + "cwd": { + "type": "string", + "description": "Absolute path to the working directory of the program being debugged.", + "default": "${workspaceRoot}" + }, + "useBundler": { + "type": "boolean", + "description": "Use `bundle exec` to run rdebug-ide. Enable this option if you have used bundle install --path with rdebug-ide as a bundled gem.", + "default": false + }, + "pathToRuby": { + "type": "string", + "description": "Path to the Ruby executable if it is not 'ruby', used to run the program without the debugger (under CTRL+F5)", + "default": "ruby" + }, + "pathToBundler": { + "type": "string", + "description": "If you use the `useBunder` option, and `bundle` is not in your path, provide the absolute path to `bundle` (eg. \"/usr/bin/bundle\" )", + "default": "bundle" + }, + "pathToRDebugIDE": { + "type": "string", + "description": "If `rdebug-ide` is not in your path, provide the absolute path to `rdebug-ide` (eg. \"c:\\ruby\\rdebug-ide.bat\" )", + "default": "rdebug-ide" + }, + "debuggerPort": { + "type": "string", + "description": "If you want to run more than one debugger, you can specify the port here.", + "default": "1234" + }, + "includes": { + "type": "array", + "description": "Additional paths to be added to Ruby's include path", + "default": [] + } + } + }, + "attach": { + "required": [ + "cwd", + "remoteHost", + "remotePort", + "remoteWorkspaceRoot" + ], + "properties": { + "cwd": { + "type": "string", + "description": "Absolute path to the working directory of the program being debugged.", + "default": "${workspaceRoot}" + }, + "remoteHost": { + "type": "string", + "description": "Host address for remote debugging.", + "default": "127.0.0.1" + }, + "remotePort": { + "type": "string", + "description": "Port for remote debugging.", + "default": "1234" + }, + "remoteWorkspaceRoot": { + "type": "string", + "description": "Remote workspace root, this parameter is required for remote debugging.", + "default": "${workspaceRoot}" + }, + "showDebuggerOutput": { + "type": "boolean", + "description": "Show output of the debugger in the console.", + "default": false + } + } + } + } + } + ] + } } From 1d5637b01d40585bafad37ef1ae9a0de66bf1bba Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Mon, 18 Feb 2019 15:55:12 -0700 Subject: [PATCH 85/87] Upgrade vscode to ^1.1.29 --- client/package-lock.json | 1098 +++++++++++++--------------------- client/package.json | 2 +- package-lock.json | 1208 ++++++++++++++++---------------------- package.json | 2 +- 4 files changed, 918 insertions(+), 1392 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index 37127aa20..6b6182674 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -5,15 +5,15 @@ "requires": true, "dependencies": { "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ansi-cyan": { @@ -40,6 +40,15 @@ "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=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } + }, "arr-diff": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", @@ -89,12 +98,6 @@ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -168,17 +171,6 @@ "concat-map": "0.0.1" } }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", @@ -191,6 +183,12 @@ "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", @@ -232,12 +230,6 @@ "readable-stream": "^2.3.5" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, "combined-stream": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", @@ -318,6 +310,15 @@ "resolved": "https://registry.npmjs.org/default-shell/-/default-shell-1.0.1.tgz", "integrity": "sha1-dSMEvdxhdPSespy5iP7qC4gTyLw=" }, + "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", @@ -337,9 +338,9 @@ "dev": true }, "duplexify": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", - "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { "end-of-stream": "^1.0.0", @@ -373,19 +374,18 @@ "dev": true }, "event-stream": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.6.tgz", - "integrity": "sha512-dGXNg4F/FgVzlApjzItL+7naHutA3fDqbV/zAZqDDlXTjiMnQmZKu+prImWKszeBM5UQeGvAl3u1wBiKeDh61g==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { - "duplexer": "^0.1.1", - "flatmap-stream": "^0.1.0", - "from": "^0.1.7", - "map-stream": "0.0.7", - "pause-stream": "^0.0.11", - "split": "^1.0.1", - "stream-combiner": "^0.2.2", - "through": "^2.3.8" + "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" } }, "execa": { @@ -402,24 +402,6 @@ "strip-eof": "^1.0.0" } }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - } - }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -435,23 +417,6 @@ "kind-of": "^1.1.0" } }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -459,9 +424,9 @@ "dev": true }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, "fast-json-stable-stringify": { @@ -479,50 +444,14 @@ "pend": "~1.2.0" } }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, - "flatmap-stream": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/flatmap-stream/-/flatmap-stream-0.1.1.tgz", - "integrity": "sha512-lAq4tLbm3sidmdCN8G3ExaxH7cUCtP5mgDvrYowsx84dcYkJJ4I28N7gkxA6+YlSXzaGLJYIDEi9WGfXzMiXdw==", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { - "for-in": "^1.0.1" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, "forever-agent": { @@ -548,6 +477,16 @@ "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", @@ -566,6 +505,12 @@ "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 + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -597,42 +542,6 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -644,74 +553,27 @@ } }, "glob-stream": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "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": "^5.0.3", - "glob-parent": "^3.0.0", - "micromatch": "^2.3.7", - "ordered-read-streams": "^0.3.0", - "through2": "^0.6.0", - "to-absolute-glob": "^0.1.1", + "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" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "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" - } - } } }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "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": { @@ -789,12 +651,12 @@ } }, "gulp-remote-src-vscode": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.0.tgz", - "integrity": "sha512-/9vtSk9eI9DEWCqzGieglPqmx0WUQ9pwPHyHFpKmfxqdgqGJC2l0vFMdYs54hLdDsMDEZFLDL2J4ikjc4hQ5HQ==", + "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", + "event-stream": "3.3.4", "node.extend": "^1.1.2", "request": "^2.79.0", "through2": "^2.0.3", @@ -829,56 +691,6 @@ } } }, - "gulp-sourcemaps": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", - "dev": true, - "requires": { - "convert-source-map": "^1.1.1", - "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.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-symdest": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz", - "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=", - "dev": true, - "requires": { - "event-stream": "^3.3.1", - "mkdirp": "^0.5.1", - "queue": "^3.1.0", - "vinyl-fs": "^2.4.3" - } - }, "gulp-untar": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.7.tgz", @@ -918,16 +730,16 @@ } }, "gulp-vinyl-zip": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz", - "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=", + "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.1", + "event-stream": "3.3.4", "queue": "^4.2.1", "through2": "^2.0.3", "vinyl": "^2.0.2", - "vinyl-fs": "^2.0.0", + "vinyl-fs": "^3.0.3", "yauzl": "^2.2.1", "yazl": "^2.2.1" }, @@ -944,15 +756,6 @@ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", "dev": true }, - "queue": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/queue/-/queue-4.5.0.tgz", - "integrity": "sha512-DwxpAnqJuoQa+wyDgQuwkSshkhlqIlWEvwvdAY27fDPunZ2cVJzXU4JyjY+5l7zs7oGLaYAQm4MbLOVFAHFBzA==", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, "vinyl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", @@ -976,21 +779,36 @@ "dev": true }, "har-validator": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", - "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "^5.3.0", + "ajv": "^6.5.5", "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-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=", + "dev": true + }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -1025,36 +843,25 @@ "dev": true }, "is": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", - "dev": true - }, - "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-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", "dev": true }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "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-primitive": "^2.0.0" + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "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": { @@ -1072,25 +879,11 @@ "is-extglob": "^2.1.0" } }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "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", @@ -1098,17 +891,14 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "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-stream": { "version": "1.1.0", @@ -1121,6 +911,15 @@ "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==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -1128,9 +927,15 @@ "dev": true }, "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", + "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==", "dev": true }, "isarray": { @@ -1144,15 +949,6 @@ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -1172,19 +968,16 @@ "dev": true }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json-stable-stringify": { + "json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } + "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", @@ -1192,12 +985,6 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -1225,102 +1012,34 @@ "readable-stream": "^2.0.5" } }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, - "map-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.0.7.tgz", - "integrity": "sha1-ih8HiW2CsQkmvTdEokIACfiJdKg=", - "dev": true - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", "dev": true, "requires": { - "readable-stream": "^2.0.1" + "flush-write-stream": "^1.0.2" } }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "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.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", "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.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", "dev": true, "requires": { - "mime-db": "~1.37.0" + "mime-db": "~1.38.0" } }, "minimatch": { @@ -1405,12 +1124,13 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "node.extend": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", - "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", + "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": { - "is": "^3.1.0" + "has": "^1.0.3", + "is": "^3.2.1" } }, "normalize-path": { @@ -1422,6 +1142,15 @@ "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" + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -1436,20 +1165,22 @@ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "object-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", + "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", "dev": true }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "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": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, "once": { @@ -1461,12 +1192,11 @@ } }, "ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "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": { - "is-stream": "^1.0.1", "readable-stream": "^2.0.1" } }, @@ -1475,35 +1205,6 @@ "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -1555,12 +1256,6 @@ "extend-shallow": "^1.1.2" } }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", @@ -1568,9 +1263,9 @@ "dev": true }, "psl": { - "version": "1.1.29", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", - "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "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==", "dev": true }, "pump": { @@ -1582,10 +1277,33 @@ "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" + }, + "dependencies": { + "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" + } + } + } + }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "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 }, "qs": { @@ -1601,39 +1319,14 @@ "dev": true }, "queue": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", - "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", + "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" } }, - "randomatic": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", - "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", @@ -1649,13 +1342,25 @@ "util-deprecate": "~1.0.1" } }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "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": { - "is-equal-shallow": "^0.1.3" + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" } }, "remove-trailing-separator": { @@ -1664,18 +1369,6 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", @@ -1716,13 +1409,22 @@ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", "dev": true }, + "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.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "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.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { @@ -1767,9 +1469,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.9", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", - "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -1777,18 +1479,18 @@ } }, "split": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", - "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "dev": true, "requires": { "through": "2" } }, "sshpk": { - "version": "1.15.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz", - "integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==", + "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", @@ -1809,13 +1511,12 @@ "dev": true }, "stream-combiner": { - "version": "0.2.2", - "resolved": "http://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { - "duplexer": "~0.1.1", - "through": "~2.3.4" + "duplexer": "~0.1.1" } }, "stream-shift": { @@ -1848,25 +1549,6 @@ "safe-buffer": "~5.1.0" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" - } - }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", @@ -1899,19 +1581,19 @@ "dev": true }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "^2.1.5", + "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "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", @@ -1919,23 +1601,22 @@ } }, "to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "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": { - "extend-shallow": "^2.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "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": { @@ -1946,6 +1627,14 @@ "requires": { "psl": "^1.1.24", "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } } }, "tunnel-agent": { @@ -1963,20 +1652,35 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "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=", + "dev": true + }, "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "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": "^1.0.0", - "through2-filter": "^2.0.0" + "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", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, + "requires": { + "punycode": "^2.1.0" } }, "url-parse": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz", - "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", + "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", "dev": true, "requires": { "querystringify": "^2.0.0", @@ -1995,10 +1699,10 @@ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", + "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=", "dev": true }, "verror": { @@ -2023,51 +1727,54 @@ } }, "vinyl-fs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "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": { - "duplexify": "^3.2.0", - "glob-stream": "^5.3.2", + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", "graceful-fs": "^4.0.0", - "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "^0.3.0", + "is-valid-glob": "^1.0.0", "lazystream": "^1.0.0", - "lodash.isequal": "^4.0.0", - "merge-stream": "^1.0.0", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.0", - "readable-stream": "^2.0.4", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^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", - "through2-filter": "^2.0.0", - "vali-date": "^1.0.0", - "vinyl": "^1.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": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "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": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "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": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" + "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" } } } @@ -2082,25 +1789,68 @@ "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" + } + } + } + }, "vscode": { - "version": "1.1.21", - "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.21.tgz", - "integrity": "sha512-tJl9eL15ZMm6vzCYYeQ26sSYRuXGMGPsaeIAmG2rOOYRn01jdaDg6I4b9G5Ed6FISdmn6egpKThk4o4om8Ax/A==", + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.29.tgz", + "integrity": "sha512-E6hzqGtCD65BnBxdZzSIi8FPCM4seEEK/bbTeYdJntg+4D5R6GLbdYFySE9DNTtMJF4iB9UGoucKU/p8Guts1g==", "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.0", - "gulp-symdest": "^1.1.0", + "gulp-remote-src-vscode": "^0.5.1", "gulp-untar": "^0.0.7", - "gulp-vinyl-zip": "^2.1.0", + "gulp-vinyl-zip": "^2.1.2", "mocha": "^4.0.1", - "request": "^2.83.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" } }, @@ -2162,9 +1912,9 @@ } }, "yazl": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz", - "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", "dev": true, "requires": { "buffer-crc32": "~0.2.3" diff --git a/client/package.json b/client/package.json index f71c600ab..9de0c5013 100644 --- a/client/package.json +++ b/client/package.json @@ -16,7 +16,7 @@ "vscode-languageclient": "^5.1.1" }, "devDependencies": { - "vscode": "^1.1.21" + "vscode": "^1.1.29" }, "scripts": { "postinstall": "vscode-install" diff --git a/package-lock.json b/package-lock.json index 5d8f84053..5804ea88e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,15 +22,15 @@ "integrity": "sha1-xEKLDKhtO4gUdXJv2UmAs4onw4E=" }, "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ansi-cyan": { @@ -78,6 +78,15 @@ "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=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } + }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", @@ -136,12 +145,6 @@ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -149,10 +152,13 @@ "dev": true }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } }, "assert-plus": { "version": "1.0.0", @@ -181,9 +187,9 @@ "dev": true }, "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", "dev": true }, "babel-code-frame": { @@ -207,7 +213,6 @@ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "dev": true, - "optional": true, "requires": { "tweetnacl": "^0.14.3" } @@ -230,17 +235,6 @@ "concat-map": "0.0.1" } }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", @@ -253,10 +247,16 @@ "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.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", "dev": true }, "builtin-modules": { @@ -321,12 +321,6 @@ "readable-stream": "^2.3.5" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, "coffee-script": { "version": "1.12.7", "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", @@ -355,9 +349,9 @@ "dev": true }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", "dev": true, "requires": { "delayed-stream": "~1.0.0" @@ -375,10 +369,13 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true + "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", @@ -422,6 +419,15 @@ "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", @@ -465,9 +471,9 @@ "dev": true }, "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { "end-of-stream": "^1.0.0", @@ -477,13 +483,13 @@ } }, "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", "dev": true, - "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "end-of-stream": { @@ -515,7 +521,7 @@ }, "event-stream": { "version": "3.3.4", - "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { @@ -528,28 +534,10 @@ "through": "~2.3.1" } }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "^2.1.0" - } - }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "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": { @@ -561,23 +549,6 @@ "kind-of": "^1.1.0" } }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", @@ -596,9 +567,9 @@ } }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "dev": true }, "fast-json-stable-stringify": { @@ -616,44 +587,14 @@ "pend": "~1.2.0" } }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "dev": true, - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", - "dev": true - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { - "for-in": "^1.0.1" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, "forever-agent": { @@ -663,13 +604,13 @@ "dev": true }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, @@ -679,6 +620,16 @@ "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", @@ -697,6 +648,12 @@ "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", @@ -720,42 +677,6 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -767,74 +688,27 @@ } }, "glob-stream": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "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": "^5.0.3", - "glob-parent": "^3.0.0", - "micromatch": "^2.3.7", - "ordered-read-streams": "^0.3.0", - "through2": "^0.6.0", - "to-absolute-glob": "^0.1.1", + "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" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "dev": true, - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "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" - } - } } }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "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": { @@ -912,12 +786,12 @@ } }, "gulp-remote-src-vscode": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.0.tgz", - "integrity": "sha512-/9vtSk9eI9DEWCqzGieglPqmx0WUQ9pwPHyHFpKmfxqdgqGJC2l0vFMdYs54hLdDsMDEZFLDL2J4ikjc4hQ5HQ==", + "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", + "event-stream": "3.3.4", "node.extend": "^1.1.2", "request": "^2.79.0", "through2": "^2.0.3", @@ -925,9 +799,9 @@ }, "dependencies": { "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, "clone-stats": { @@ -952,56 +826,6 @@ } } }, - "gulp-sourcemaps": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", - "dev": true, - "requires": { - "convert-source-map": "^1.1.1", - "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.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-symdest": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz", - "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=", - "dev": true, - "requires": { - "event-stream": "^3.3.1", - "mkdirp": "^0.5.1", - "queue": "^3.1.0", - "vinyl-fs": "^2.4.3" - } - }, "gulp-untar": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.7.tgz", @@ -1041,24 +865,24 @@ } }, "gulp-vinyl-zip": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz", - "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=", + "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.1", + "event-stream": "3.3.4", "queue": "^4.2.1", "through2": "^2.0.3", "vinyl": "^2.0.2", - "vinyl-fs": "^2.0.0", + "vinyl-fs": "^3.0.3", "yauzl": "^2.2.1", "yazl": "^2.2.1" }, "dependencies": { "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, "clone-stats": { @@ -1067,15 +891,6 @@ "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", "dev": true }, - "queue": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-4.4.2.tgz", - "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==", - "dev": true, - "requires": { - "inherits": "~2.0.0" - } - }, "vinyl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", @@ -1099,15 +914,24 @@ "dev": true }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", "dev": true, "requires": { - "ajv": "^5.1.0", + "ajv": "^6.5.5", "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", @@ -1123,6 +947,12 @@ "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=", + "dev": true + }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", @@ -1157,36 +987,25 @@ "dev": true }, "is": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", "dev": true }, - "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-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "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-primitive": "^2.0.0" + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "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": { @@ -1204,25 +1023,11 @@ "is-extglob": "^2.1.0" } }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "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", @@ -1230,23 +1035,14 @@ "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", "dev": true }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "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", @@ -1254,6 +1050,15 @@ "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==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } + }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", @@ -1261,9 +1066,15 @@ "dev": true }, "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", + "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==", "dev": true }, "isarray": { @@ -1272,15 +1083,6 @@ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", @@ -1331,8 +1133,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "dev": true, - "optional": true + "dev": true }, "json-schema": { "version": "0.2.3", @@ -1341,19 +1142,16 @@ "dev": true }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, - "json-stable-stringify": { + "json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } + "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", @@ -1361,12 +1159,6 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -1394,17 +1186,20 @@ "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" + } + }, "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", - "dev": true - }, "lru-cache": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", @@ -1417,90 +1212,19 @@ "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", "dev": true }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", - "dev": true - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "dev": true, - "requires": { - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", "dev": true }, "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", "dev": true, "requires": { - "mime-db": "~1.33.0" + "mime-db": "~1.38.0" } }, "minimatch": { @@ -1628,12 +1352,13 @@ } }, "node.extend": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", - "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", + "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": { - "is": "^3.1.0" + "has": "^1.0.3", + "is": "^3.2.1" } }, "normalize-path": { @@ -1645,26 +1370,37 @@ "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" + } + }, "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", "dev": true }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "object-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", + "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", "dev": true }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "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": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, "once": { @@ -1677,44 +1413,14 @@ } }, "ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "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": { - "is-stream": "^1.0.1", "readable-stream": "^2.0.1" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", @@ -1767,12 +1473,6 @@ "extend-shallow": "^1.1.2" } }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, "prettier": { "version": "1.13.7", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.13.7.tgz", @@ -1785,10 +1485,37 @@ "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==", + "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": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "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 }, "qs": { @@ -1798,45 +1525,20 @@ "dev": true }, "querystringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", - "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", + "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", "dev": true }, "queue": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", - "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", + "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" } }, - "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", - "dev": true, - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } - } - }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", @@ -1852,13 +1554,25 @@ "util-deprecate": "~1.0.1" } }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "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-equal-shallow": "^0.1.3" + "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" } }, "remove-trailing-separator": { @@ -1867,18 +1581,6 @@ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", "dev": true }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", @@ -1886,31 +1588,31 @@ "dev": true }, "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", "dev": true, "requires": { "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", + "aws4": "^1.8.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "uuid": "^3.3.2" } }, "requires-port": { @@ -1928,13 +1630,38 @@ "path-parse": "^1.0.5" } }, + "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.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "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.0.5" + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "ruby-method-locate": { @@ -1984,9 +1711,9 @@ "dev": true }, "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", "dev": true, "requires": { "buffer-from": "^1.0.0", @@ -2009,9 +1736,9 @@ "dev": true }, "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "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", @@ -2079,25 +1806,6 @@ "ansi-regex": "^2.0.0" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "dev": true, - "requires": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" - } - }, "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", @@ -2125,19 +1833,19 @@ "dev": true }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", "dev": true, "requires": { - "readable-stream": "^2.1.5", + "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "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", @@ -2151,23 +1859,13 @@ "dev": true }, "to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "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": { - "extend-shallow": "^2.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" } }, "to-iso-string": { @@ -2176,13 +1874,31 @@ "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", "dev": true }, + "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.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", "dev": true, "requires": { + "psl": "^1.1.24", "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } } }, "tslib": { @@ -2325,8 +2041,7 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "dev": true, - "optional": true + "dev": true }, "typescript": { "version": "2.9.2", @@ -2334,20 +2049,35 @@ "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", "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=", + "dev": true + }, "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "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", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" + "punycode": "^2.1.0" } }, "url-parse": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.1.tgz", - "integrity": "sha512-x95Td74QcvICAA0+qERaVkRpTGKyBHHYdwL2LXZm5t/gBtCB9KQSO/0zQgSTYEV1p0WcvSg79TLNPSvd5IDJMQ==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", + "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", "dev": true, "requires": { "querystringify": "^2.0.0", @@ -2366,10 +2096,10 @@ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", "dev": true }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", + "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=", "dev": true }, "verror": { @@ -2394,51 +2124,54 @@ } }, "vinyl-fs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "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": { - "duplexify": "^3.2.0", - "glob-stream": "^5.3.2", + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", "graceful-fs": "^4.0.0", - "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "^0.3.0", + "is-valid-glob": "^1.0.0", "lazystream": "^1.0.0", - "lodash.isequal": "^4.0.0", - "merge-stream": "^1.0.0", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.0", - "readable-stream": "^2.0.4", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^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", - "through2-filter": "^2.0.0", - "vali-date": "^1.0.0", - "vinyl": "^1.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": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", "dev": true }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "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": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "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": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" + "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" } } } @@ -2453,25 +2186,68 @@ "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" + } + } + } + }, "vscode": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.18.tgz", - "integrity": "sha512-SyDw4qFwZ+WthZX7RWp71PNiWLF7VhpM65j2oryY/6jtSORd8qH6J8vclwWZJ6Jvu0EH7JamO2RWNfBfsMR9Zw==", + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.29.tgz", + "integrity": "sha512-E6hzqGtCD65BnBxdZzSIi8FPCM4seEEK/bbTeYdJntg+4D5R6GLbdYFySE9DNTtMJF4iB9UGoucKU/p8Guts1g==", "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.0", - "gulp-symdest": "^1.1.0", + "gulp-remote-src-vscode": "^0.5.1", "gulp-untar": "^0.0.7", - "gulp-vinyl-zip": "^2.1.0", + "gulp-vinyl-zip": "^2.1.2", "mocha": "^4.0.1", - "request": "^2.83.0", + "request": "^2.88.0", "semver": "^5.4.1", "source-map-support": "^0.5.0", - "url-parse": "^1.1.9", + "url-parse": "^1.4.3", + "vinyl-fs": "^3.0.3", "vinyl-source-stream": "^1.1.0" }, "dependencies": { @@ -2553,9 +2329,9 @@ } }, "yazl": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz", - "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", "dev": true, "requires": { "buffer-crc32": "~0.2.3" diff --git a/package.json b/package.json index 2285b9d0d..559b53b07 100644 --- a/package.json +++ b/package.json @@ -71,7 +71,7 @@ "tslint-config-standard": "^8.0.1", "tslint-no-circular-imports": "^0.6.1", "typescript": "^2.9.2", - "vscode": "^1.1.4", + "vscode": "^1.1.29", "vscode-debugadapter-testsupport": "^1.19.0" }, "scripts": { From e38cc8be5055a0ba942bbb4985f5ad26be08439f Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Mon, 18 Feb 2019 15:55:25 -0700 Subject: [PATCH 86/87] Bump package-lock.json to v0.22.0 --- package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 5804ea88e..06a5cb4dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ruby", - "version": "0.21.1", + "version": "0.22.0", "lockfileVersion": 1, "requires": true, "dependencies": { From 9e1f537d465c599b1016711b4449b549ea681c44 Mon Sep 17 00:00:00 2001 From: Stafford Brunk Date: Mon, 18 Feb 2019 15:58:02 -0700 Subject: [PATCH 87/87] Add ruby 2.6 to build matrix --- .travis.yml | 1 + appveyor.yml | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.travis.yml b/.travis.yml index 1410903bb..54767c33c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ rvm: - 2.3 - 2.4 - 2.5 + - 2.6 before_install: - gem install ruby-debug-ide diff --git a/appveyor.yml b/appveyor.yml index d368425a0..206d17620 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -27,3 +27,5 @@ environment: - ruby_version: "24-x64" - ruby_version: "25" - ruby_version: "25-x64" + - ruby_version: "26" + - ruby_version: "26-x64"