diff --git a/Extension/CHANGELOG.md b/Extension/CHANGELOG.md index 813316225..802b9ebb4 100644 --- a/Extension/CHANGELOG.md +++ b/Extension/CHANGELOG.md @@ -1,5 +1,19 @@ # C/C++ for Visual Studio Code Change Log +## Version 0.17.6: June 28, 2018 +* Fix the database icon getting stuck with recursive includes. [#2104](https://github.com/Microsoft/vscode-cpptools/issues/2104) +* Fix the red flame appearing late with recursive includes. [#2105](https://github.com/Microsoft/vscode-cpptools/issues/2105) +* Fix source files being parsed in system directories. [#2156](https://github.com/Microsoft/vscode-cpptools/issues/2156) +* Fix a crash when saving with recursive includes. [#2173](https://github.com/Microsoft/vscode-cpptools/issues/2173) +* Fix a crash when the `includePath` or `browse.path` is `"**"`. [#2174](https://github.com/Microsoft/vscode-cpptools/issues/2174) +* Fix IntelliSense for WSL without g++ installed. [#2178](https://github.com/Microsoft/vscode-cpptools/issues/2178) +* Fix random IntelliSense (completion) failures due to edits being delayed. [#2184](https://github.com/Microsoft/vscode-cpptools/issues/2184) +* Fix a performance bug with recursive includes. +* Fixed a CPU usage problem on Mac related to system frameworks parsing. +* Keep the IntelliSense process around for 10 seconds after a file is closed in case it's needed again. +* Added an API so build system extensions can provide IntelliSense configurations for source files. More details at [npmjs.com](https://www.npmjs.com/package/vscode-cpptools). +* Fix automatic argument quoting when debugging with gdb/lldb to include when the argument has a '(' or ')' in it. Also escape existing '"' symbols. + ## Version 0.17.5: June 21, 2018 * Detect `compile_commands.json` and show prompt to use it. [#1297](https://github.com/Microsoft/vscode-cpptools/issues/1297) * Change inactive regions from gray to translucent. [#1907](https://github.com/Microsoft/vscode-cpptools/issues/1907) diff --git a/Extension/c_cpp_properties.schema.json b/Extension/c_cpp_properties.schema.json index 07c00780b..89a50065a 100644 --- a/Extension/c_cpp_properties.schema.json +++ b/Extension/c_cpp_properties.schema.json @@ -81,6 +81,10 @@ "type": "string" } }, + "configurationProvider": { + "description": "The id of a VS Code extension that can provide IntelliSense configuration information for source files.", + "type": "string" + }, "browse": { "type": "object", "properties": { diff --git a/Extension/package-lock.json b/Extension/package-lock.json index 1a5e0945b..49154d81e 100644 --- a/Extension/package-lock.json +++ b/Extension/package-lock.json @@ -1,6 +1,6 @@ { "name": "cpptools", - "version": "0.17.5", + "version": "0.17.6-master", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -10,7 +10,7 @@ "integrity": "sha512-tE1SYtNG3I3atRVPELSGN2FJJJtPg3O/G0tycYSyzeDqdAbdLPRH089LhpWYA5M/iHeWHkVZq/b0OVKngcK0Eg==", "dev": true, "requires": { - "@types/node": "*" + "@types/node": "8.5.4" } }, "@types/node": { @@ -24,7 +24,7 @@ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.1.2.tgz", "integrity": "sha512-VE6QoEdaugY86BohRtfGmTDabxdU5sCKOkbcPA6PXKJsRzEi/7A3RCTxJal1ft/4qSfPht5/iQLhMh/wzSkkNw==", "requires": { - "es6-promisify": "^5.0.0" + "es6-promisify": "5.0.0" } }, "ajv": { @@ -33,10 +33,10 @@ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "co": "4.6.0", + "fast-deep-equal": "1.1.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" } }, "ansi-cyan": { @@ -106,8 +106,8 @@ "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", "dev": true, "requires": { - "arr-flatten": "^1.0.1", - "array-slice": "^0.2.3" + "arr-flatten": "1.1.0", + "array-slice": "0.2.3" } }, "arr-flatten": { @@ -146,7 +146,7 @@ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "array-uniq": "^1.0.1" + "array-uniq": "1.0.3" } }, "array-uniq": { @@ -215,9 +215,9 @@ "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", "dev": true, "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" }, "dependencies": { "chalk": { @@ -226,11 +226,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "supports-color": { @@ -252,13 +252,13 @@ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", "dev": true, "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" }, "dependencies": { "define-property": { @@ -267,7 +267,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -276,7 +276,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -285,7 +285,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -294,9 +294,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "isobject": { @@ -320,7 +320,7 @@ "dev": true, "optional": true, "requires": { - "tweetnacl": "^0.14.3" + "tweetnacl": "0.14.5" } }, "beeper": { @@ -335,7 +335,7 @@ "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", "dev": true, "requires": { - "inherits": "~2.0.0" + "inherits": "2.0.3" } }, "brace-expansion": { @@ -343,7 +343,7 @@ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", "requires": { - "balanced-match": "^1.0.0", + "balanced-match": "1.0.0", "concat-map": "0.0.1" } }, @@ -353,9 +353,9 @@ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", "dev": true, "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" } }, "browser-stdout": { @@ -387,15 +387,15 @@ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" }, "dependencies": { "isobject": { @@ -418,9 +418,9 @@ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", "dev": true, "requires": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.4.0" }, "dependencies": { "ansi-styles": { @@ -429,7 +429,7 @@ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", "dev": true, "requires": { - "color-convert": "^1.9.0" + "color-convert": "1.9.1" } } } @@ -440,10 +440,10 @@ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" }, "dependencies": { "arr-union": { @@ -458,7 +458,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "isobject": { @@ -493,9 +493,9 @@ "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", "dev": true, "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" + "inherits": "2.0.3", + "process-nextick-args": "2.0.0", + "readable-stream": "2.3.6" }, "dependencies": { "process-nextick-args": { @@ -510,13 +510,13 @@ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" } }, "string_decoder": { @@ -525,7 +525,7 @@ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.1" } } } @@ -542,8 +542,8 @@ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", "dev": true, "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" + "map-visit": "1.0.0", + "object-visit": "1.0.1" } }, "color-convert": { @@ -552,7 +552,7 @@ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", "dev": true, "requires": { - "color-name": "^1.1.1" + "color-name": "1.1.3" } }, "color-name": { @@ -573,7 +573,7 @@ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", "dev": true, "requires": { - "delayed-stream": "~1.0.0" + "delayed-stream": "1.0.0" } }, "commander": { @@ -617,9 +617,9 @@ "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" }, "dependencies": { "lru-cache": { @@ -628,8 +628,8 @@ "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", "dev": true, "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "pseudomap": "1.0.2", + "yallist": "2.1.2" } } } @@ -646,7 +646,7 @@ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "dateformat": { @@ -676,7 +676,7 @@ "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", "dev": true, "requires": { - "is-obj": "^1.0.0" + "is-obj": "1.0.1" } }, "defaults": { @@ -685,7 +685,7 @@ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", "dev": true, "requires": { - "clone": "^1.0.2" + "clone": "1.0.4" }, "dependencies": { "clone": { @@ -702,8 +702,8 @@ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", "dev": true, "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" + "is-descriptor": "1.0.2", + "isobject": "3.0.1" }, "dependencies": { "is-accessor-descriptor": { @@ -712,7 +712,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -721,7 +721,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -730,9 +730,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "isobject": { @@ -772,7 +772,7 @@ "resolved": "https://registry.npmjs.org/diagnostic-channel/-/diagnostic-channel-0.2.0.tgz", "integrity": "sha1-zJmvlhLCP7H/8TYSxy8sv6qNWhc=", "requires": { - "semver": "^5.3.0" + "semver": "5.4.1" } }, "diagnostic-channel-publishers": { @@ -798,7 +798,7 @@ "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", "dev": true, "requires": { - "readable-stream": "~1.1.9" + "readable-stream": "1.1.14" }, "dependencies": { "isarray": { @@ -813,10 +813,10 @@ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "string_decoder": { @@ -833,10 +833,10 @@ "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", "dev": true, "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "stream-shift": "1.0.0" } }, "ecc-jsbn": { @@ -846,7 +846,7 @@ "dev": true, "optional": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "0.1.1" } }, "end-of-stream": { @@ -855,7 +855,7 @@ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { - "once": "^1.4.0" + "once": "1.4.0" } }, "es6-promise": { @@ -868,7 +868,7 @@ "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", "requires": { - "es6-promise": "^4.0.3" + "es6-promise": "4.2.2" } }, "escape-string-regexp": { @@ -889,13 +889,13 @@ "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", "dev": true, "requires": { - "duplexer": "~0.1.1", - "from": "~0", - "map-stream": "~0.1.0", + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.1.0", "pause-stream": "0.0.11", - "split": "0.3", - "stream-combiner": "~0.0.4", - "through": "~2.3.1" + "split": "0.3.3", + "stream-combiner": "0.0.4", + "through": "2.3.8" } }, "execa": { @@ -904,13 +904,13 @@ "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", "dev": true, "requires": { - "cross-spawn": "^5.0.1", - "get-stream": "^3.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" + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" } }, "expand-brackets": { @@ -919,7 +919,7 @@ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", "dev": true, "requires": { - "is-posix-bracket": "^0.1.0" + "is-posix-bracket": "0.1.1" } }, "expand-range": { @@ -928,7 +928,7 @@ "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", "dev": true, "requires": { - "fill-range": "^2.1.0" + "fill-range": "2.2.4" } }, "expand-tilde": { @@ -937,7 +937,7 @@ "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "homedir-polyfill": "^1.0.1" + "homedir-polyfill": "1.0.1" } }, "extend": { @@ -952,7 +952,7 @@ "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", "dev": true, "requires": { - "kind-of": "^1.1.0" + "kind-of": "1.1.0" } }, "extglob": { @@ -961,7 +961,7 @@ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" }, "dependencies": { "is-extglob": { @@ -984,9 +984,9 @@ "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", "dev": true, "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "time-stamp": "^1.0.0" + "ansi-gray": "0.1.1", + "color-support": "1.1.3", + "time-stamp": "1.1.0" } }, "fast-deep-equal": { @@ -1006,7 +1006,7 @@ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", "requires": { - "pend": "~1.2.0" + "pend": "1.2.0" } }, "filename-regex": { @@ -1021,11 +1021,11 @@ "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" + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "3.0.0", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" } }, "find-index": { @@ -1040,10 +1040,10 @@ "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", "dev": true, "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" + "detect-file": "1.0.0", + "is-glob": "3.1.0", + "micromatch": "3.1.10", + "resolve-dir": "1.0.1" }, "dependencies": { "arr-diff": { @@ -1064,16 +1064,16 @@ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", "dev": true, "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" }, "dependencies": { "extend-shallow": { @@ -1082,7 +1082,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -1093,13 +1093,13 @@ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", "dev": true, "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -1108,7 +1108,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -1117,7 +1117,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "is-accessor-descriptor": { @@ -1126,7 +1126,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -1135,7 +1135,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -1146,7 +1146,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -1155,7 +1155,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -1166,9 +1166,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" } }, "kind-of": { @@ -1185,8 +1185,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -1195,7 +1195,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -1206,14 +1206,14 @@ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", "dev": true, "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "define-property": { @@ -1222,7 +1222,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "extend-shallow": { @@ -1231,7 +1231,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -1242,10 +1242,10 @@ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" }, "dependencies": { "extend-shallow": { @@ -1254,7 +1254,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -1265,7 +1265,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -1274,7 +1274,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -1283,9 +1283,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "is-number": { @@ -1294,7 +1294,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -1303,7 +1303,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -1326,19 +1326,19 @@ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.9", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" } } } @@ -1349,11 +1349,11 @@ "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" + "expand-tilde": "2.0.2", + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0", + "object.pick": "1.3.0", + "parse-filepath": "1.0.2" } }, "first-chunk-stream": { @@ -1380,7 +1380,7 @@ "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", "dev": true, "requires": { - "for-in": "^1.0.1" + "for-in": "1.0.2" } }, "forever-agent": { @@ -1395,9 +1395,9 @@ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", "dev": true, "requires": { - "asynckit": "^0.4.0", + "asynckit": "0.4.0", "combined-stream": "1.0.6", - "mime-types": "^2.1.12" + "mime-types": "2.1.18" } }, "fragment-cache": { @@ -1406,7 +1406,7 @@ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", "dev": true, "requires": { - "map-cache": "^0.2.2" + "map-cache": "0.2.2" } }, "from": { @@ -1427,10 +1427,10 @@ "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", "dev": true, "requires": { - "graceful-fs": "^4.1.2", - "inherits": "~2.0.0", - "mkdirp": ">=0.5 0", - "rimraf": "2" + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" } }, "gaze": { @@ -1439,7 +1439,7 @@ "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", "dev": true, "requires": { - "globule": "~0.1.0" + "globule": "0.1.0" } }, "get-stream": { @@ -1460,7 +1460,7 @@ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "dev": true, "requires": { - "assert-plus": "^1.0.0" + "assert-plus": "1.0.0" } }, "glob": { @@ -1469,12 +1469,12 @@ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", "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" + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "glob-base": { @@ -1483,8 +1483,8 @@ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", "dev": true, "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" + "glob-parent": "2.0.0", + "is-glob": "2.0.1" }, "dependencies": { "glob-parent": { @@ -1493,7 +1493,7 @@ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", "dev": true, "requires": { - "is-glob": "^2.0.0" + "is-glob": "2.0.1" } }, "is-extglob": { @@ -1508,7 +1508,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } } } @@ -1519,8 +1519,8 @@ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" + "is-glob": "3.1.0", + "path-dirname": "1.0.2" } }, "glob-stream": { @@ -1529,14 +1529,14 @@ "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", "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", - "unique-stream": "^2.0.2" + "extend": "3.0.1", + "glob": "5.0.15", + "glob-parent": "3.1.0", + "micromatch": "2.3.11", + "ordered-read-streams": "0.3.0", + "through2": "0.6.5", + "to-absolute-glob": "0.1.1", + "unique-stream": "2.2.1" }, "dependencies": { "glob": { @@ -1545,11 +1545,11 @@ "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" + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" } }, "isarray": { @@ -1564,10 +1564,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "string_decoder": { @@ -1582,8 +1582,8 @@ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "readable-stream": "1.0.34", + "xtend": "4.0.1" } } } @@ -1594,7 +1594,7 @@ "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", "dev": true, "requires": { - "gaze": "^0.5.1" + "gaze": "0.5.2" } }, "glob2base": { @@ -1603,7 +1603,7 @@ "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", "dev": true, "requires": { - "find-index": "^0.1.1" + "find-index": "0.1.1" } }, "global-modules": { @@ -1612,9 +1612,9 @@ "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", "dev": true, "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" + "global-prefix": "1.0.2", + "is-windows": "1.0.2", + "resolve-dir": "1.0.1" } }, "global-prefix": { @@ -1623,11 +1623,11 @@ "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", "dev": true, "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" + "expand-tilde": "2.0.2", + "homedir-polyfill": "1.0.1", + "ini": "1.3.5", + "is-windows": "1.0.2", + "which": "1.3.0" } }, "globule": { @@ -1636,9 +1636,9 @@ "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", "dev": true, "requires": { - "glob": "~3.1.21", - "lodash": "~1.0.1", - "minimatch": "~0.2.11" + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" }, "dependencies": { "glob": { @@ -1647,9 +1647,9 @@ "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", "dev": true, "requires": { - "graceful-fs": "~1.2.0", - "inherits": "1", - "minimatch": "~0.2.11" + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" } }, "graceful-fs": { @@ -1670,8 +1670,8 @@ "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", "dev": true, "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" + "lru-cache": "2.7.3", + "sigmund": "1.0.1" } } } @@ -1682,7 +1682,7 @@ "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", "dev": true, "requires": { - "sparkles": "^1.0.0" + "sparkles": "1.0.0" } }, "graceful-fs": { @@ -1703,19 +1703,19 @@ "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", "dev": true, "requires": { - "archy": "^1.0.0", - "chalk": "^1.0.0", - "deprecated": "^0.0.1", - "gulp-util": "^3.0.0", - "interpret": "^1.0.0", - "liftoff": "^2.1.0", - "minimist": "^1.1.0", - "orchestrator": "^0.3.0", - "pretty-hrtime": "^1.0.0", - "semver": "^4.1.0", - "tildify": "^1.0.0", - "v8flags": "^2.0.2", - "vinyl-fs": "^0.3.0" + "archy": "1.0.0", + "chalk": "1.1.3", + "deprecated": "0.0.1", + "gulp-util": "3.0.8", + "interpret": "1.1.0", + "liftoff": "2.5.0", + "minimist": "1.2.0", + "orchestrator": "0.3.8", + "pretty-hrtime": "1.0.3", + "semver": "4.3.6", + "tildify": "1.2.0", + "v8flags": "2.1.1", + "vinyl-fs": "0.3.14" }, "dependencies": { "chalk": { @@ -1724,11 +1724,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "glob": { @@ -1737,10 +1737,10 @@ "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", "dev": true, "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^2.0.1", - "once": "^1.3.0" + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "2.0.10", + "once": "1.4.0" } }, "glob-stream": { @@ -1749,12 +1749,12 @@ "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", "dev": true, "requires": { - "glob": "^4.3.1", - "glob2base": "^0.0.12", - "minimatch": "^2.0.1", - "ordered-read-streams": "^0.1.0", - "through2": "^0.6.1", - "unique-stream": "^1.0.0" + "glob": "4.5.3", + "glob2base": "0.0.12", + "minimatch": "2.0.10", + "ordered-read-streams": "0.1.0", + "through2": "0.6.5", + "unique-stream": "1.0.0" } }, "graceful-fs": { @@ -1763,7 +1763,7 @@ "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", "dev": true, "requires": { - "natives": "^1.1.0" + "natives": "1.1.4" } }, "isarray": { @@ -1778,7 +1778,7 @@ "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", "dev": true, "requires": { - "brace-expansion": "^1.0.0" + "brace-expansion": "1.1.8" } }, "minimist": { @@ -1799,10 +1799,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "semver": { @@ -1823,8 +1823,8 @@ "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", "dev": true, "requires": { - "first-chunk-stream": "^1.0.0", - "is-utf8": "^0.2.0" + "first-chunk-stream": "1.0.0", + "is-utf8": "0.2.1" } }, "supports-color": { @@ -1839,8 +1839,8 @@ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "readable-stream": "1.0.34", + "xtend": "4.0.1" } }, "unique-stream": { @@ -1855,14 +1855,14 @@ "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", "dev": true, "requires": { - "defaults": "^1.0.0", - "glob-stream": "^3.1.5", - "glob-watcher": "^0.0.6", - "graceful-fs": "^3.0.0", - "mkdirp": "^0.5.0", - "strip-bom": "^1.0.0", - "through2": "^0.6.1", - "vinyl": "^0.4.0" + "defaults": "1.0.3", + "glob-stream": "3.1.18", + "glob-watcher": "0.0.6", + "graceful-fs": "3.0.11", + "mkdirp": "0.5.1", + "strip-bom": "1.0.0", + "through2": "0.6.5", + "vinyl": "0.4.6" } } } @@ -1873,9 +1873,9 @@ "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", "dev": true, "requires": { - "deep-assign": "^1.0.0", - "stat-mode": "^0.2.0", - "through2": "^2.0.0" + "deep-assign": "1.0.0", + "stat-mode": "0.2.2", + "through2": "2.0.3" } }, "gulp-env": { @@ -1884,8 +1884,8 @@ "integrity": "sha1-g3BkaUmjJJPcBtrZSgZDKW+q2+g=", "dev": true, "requires": { - "ini": "^1.3.4", - "through2": "^2.0.0" + "ini": "1.3.5", + "through2": "2.0.3" } }, "gulp-filter": { @@ -1894,9 +1894,9 @@ "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", "dev": true, "requires": { - "multimatch": "^2.0.0", - "plugin-error": "^0.1.2", - "streamfilter": "^1.0.5" + "multimatch": "2.1.0", + "plugin-error": "0.1.2", + "streamfilter": "1.0.7" } }, "gulp-gunzip": { @@ -1905,8 +1905,8 @@ "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=", "dev": true, "requires": { - "through2": "~0.6.5", - "vinyl": "~0.4.6" + "through2": "0.6.5", + "vinyl": "0.4.6" }, "dependencies": { "isarray": { @@ -1921,10 +1921,10 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", + "core-util-is": "1.0.2", + "inherits": "2.0.3", "isarray": "0.0.1", - "string_decoder": "~0.10.x" + "string_decoder": "0.10.31" } }, "string_decoder": { @@ -1939,8 +1939,8 @@ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" + "readable-stream": "1.0.34", + "xtend": "4.0.1" } } } @@ -1951,12 +1951,12 @@ "integrity": "sha512-NIjXZLqqcw9DXIEBcfm0sP1AUDlUJJeaK9EGCH2s6lSwo5NK/cEat0Vm7XelOkxZnWl0O5Za+aM6E4jyxWxTlw==", "dev": true, "requires": { - "dargs": "^5.1.0", - "execa": "^0.8.0", - "mocha": "^4.1.0", - "npm-run-path": "^2.0.2", - "plugin-error": "^0.1.2", - "through2": "^2.0.3" + "dargs": "5.1.0", + "execa": "0.8.0", + "mocha": "4.1.0", + "npm-run-path": "2.0.2", + "plugin-error": "0.1.2", + "through2": "2.0.3" } }, "gulp-remote-src-vscode": { @@ -1965,11 +1965,11 @@ "integrity": "sha512-/9vtSk9eI9DEWCqzGieglPqmx0WUQ9pwPHyHFpKmfxqdgqGJC2l0vFMdYs54hLdDsMDEZFLDL2J4ikjc4hQ5HQ==", "dev": true, "requires": { - "event-stream": "^3.3.4", - "node.extend": "^1.1.2", - "request": "^2.79.0", - "through2": "^2.0.3", - "vinyl": "^2.0.1" + "event-stream": "3.3.4", + "node.extend": "1.1.6", + "request": "2.87.0", + "through2": "2.0.3", + "vinyl": "2.1.0" }, "dependencies": { "clone": { @@ -1990,12 +1990,12 @@ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", "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" + "clone": "2.1.1", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.1.2", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" } } } @@ -2006,11 +2006,11 @@ "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" + "convert-source-map": "1.5.1", + "graceful-fs": "4.1.11", + "strip-bom": "2.0.0", + "through2": "2.0.3", + "vinyl": "1.2.0" }, "dependencies": { "clone": { @@ -2031,8 +2031,8 @@ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", + "clone": "1.0.4", + "clone-stats": "0.0.1", "replace-ext": "0.0.1" } } @@ -2044,10 +2044,10 @@ "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" + "event-stream": "3.3.4", + "mkdirp": "0.5.1", + "queue": "3.1.0", + "vinyl-fs": "2.4.4" } }, "gulp-tslint": { @@ -2056,9 +2056,9 @@ "integrity": "sha512-0RNGqbp2TKPdbG+sWU3mNMXEMuF/noY1KS4+jd5lOStkvuFINkFL29dHX3IT1u+vVFD4Glwf+lkcdR2QMVNMzA==", "dev": true, "requires": { - "gulp-util": "~3.0.8", - "map-stream": "~0.0.7", - "through": "~2.3.8" + "gulp-util": "3.0.8", + "map-stream": "0.0.7", + "through": "2.3.8" }, "dependencies": { "map-stream": { @@ -2075,11 +2075,11 @@ "integrity": "sha512-0QfbCH2a1k2qkTLWPqTX+QO4qNsHn3kC546YhAP3/n0h+nvtyGITDuDrYBMDZeW4WnFijmkOvBWa5HshTic1tw==", "dev": true, "requires": { - "event-stream": "~3.3.4", - "streamifier": "~0.1.1", - "tar": "^2.2.1", - "through2": "~2.0.3", - "vinyl": "^1.2.0" + "event-stream": "3.3.4", + "streamifier": "0.1.1", + "tar": "2.2.1", + "through2": "2.0.3", + "vinyl": "1.2.0" }, "dependencies": { "clone": { @@ -2100,8 +2100,8 @@ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", + "clone": "1.0.4", + "clone-stats": "0.0.1", "replace-ext": "0.0.1" } } @@ -2113,24 +2113,24 @@ "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", "dev": true, "requires": { - "array-differ": "^1.0.0", - "array-uniq": "^1.0.2", - "beeper": "^1.0.0", - "chalk": "^1.0.0", - "dateformat": "^2.0.0", - "fancy-log": "^1.1.0", - "gulplog": "^1.0.0", - "has-gulplog": "^0.1.0", - "lodash._reescape": "^3.0.0", - "lodash._reevaluate": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.template": "^3.0.0", - "minimist": "^1.1.0", - "multipipe": "^0.1.2", - "object-assign": "^3.0.0", + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.2.0", + "fancy-log": "1.3.2", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", "replace-ext": "0.0.1", - "through2": "^2.0.0", - "vinyl": "^0.5.0" + "through2": "2.0.3", + "vinyl": "0.5.3" }, "dependencies": { "chalk": { @@ -2139,11 +2139,11 @@ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" } }, "clone": { @@ -2182,8 +2182,8 @@ "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", "dev": true, "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", + "clone": "1.0.3", + "clone-stats": "0.0.1", "replace-ext": "0.0.1" } } @@ -2195,13 +2195,13 @@ "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=", "dev": true, "requires": { - "event-stream": "^3.3.1", - "queue": "^4.2.1", - "through2": "^2.0.3", - "vinyl": "^2.0.2", - "vinyl-fs": "^2.0.0", - "yauzl": "^2.2.1", - "yazl": "^2.2.1" + "event-stream": "3.3.4", + "queue": "4.4.2", + "through2": "2.0.3", + "vinyl": "2.1.0", + "vinyl-fs": "2.4.4", + "yauzl": "2.8.0", + "yazl": "2.4.3" }, "dependencies": { "clone": { @@ -2222,7 +2222,7 @@ "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==", "dev": true, "requires": { - "inherits": "~2.0.0" + "inherits": "2.0.3" } }, "vinyl": { @@ -2231,12 +2231,12 @@ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", "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" + "clone": "2.1.1", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.1.2", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" } } } @@ -2247,7 +2247,7 @@ "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", "dev": true, "requires": { - "glogg": "^1.0.0" + "glogg": "1.0.0" } }, "har-schema": { @@ -2262,8 +2262,8 @@ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", "dev": true, "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" + "ajv": "5.5.2", + "har-schema": "2.0.0" } }, "has-ansi": { @@ -2272,7 +2272,7 @@ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "has-flag": { @@ -2287,7 +2287,7 @@ "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", "dev": true, "requires": { - "sparkles": "^1.0.0" + "sparkles": "1.0.0" } }, "has-value": { @@ -2296,9 +2296,9 @@ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", "dev": true, "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" }, "dependencies": { "isobject": { @@ -2315,8 +2315,8 @@ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", "dev": true, "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" + "is-number": "3.0.0", + "kind-of": "4.0.0" }, "dependencies": { "is-number": { @@ -2325,7 +2325,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -2334,7 +2334,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2345,7 +2345,7 @@ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2362,7 +2362,7 @@ "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", "dev": true, "requires": { - "parse-passwd": "^1.0.0" + "parse-passwd": "1.0.0" } }, "http-proxy-agent": { @@ -2370,7 +2370,7 @@ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", "requires": { - "agent-base": "4", + "agent-base": "4.1.2", "debug": "3.1.0" }, "dependencies": { @@ -2390,9 +2390,9 @@ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", "dev": true, "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.14.2" } }, "https-proxy-agent": { @@ -2400,8 +2400,8 @@ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", "requires": { - "agent-base": "^4.1.0", - "debug": "^3.1.0" + "agent-base": "4.1.2", + "debug": "3.1.0" }, "dependencies": { "debug": { @@ -2420,8 +2420,8 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "^1.3.0", - "wrappy": "1" + "once": "1.4.0", + "wrappy": "1.0.2" } }, "inherits": { @@ -2454,8 +2454,8 @@ "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", "dev": true, "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" + "is-relative": "1.0.0", + "is-windows": "1.0.2" } }, "is-accessor-descriptor": { @@ -2464,7 +2464,7 @@ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -2473,7 +2473,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2490,7 +2490,7 @@ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -2499,7 +2499,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2510,9 +2510,9 @@ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", "dev": true, "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" }, "dependencies": { "kind-of": { @@ -2535,7 +2535,7 @@ "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", "dev": true, "requires": { - "is-primitive": "^2.0.0" + "is-primitive": "2.0.0" } }, "is-extendable": { @@ -2556,7 +2556,7 @@ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "^2.1.0" + "is-extglob": "2.1.1" } }, "is-number": { @@ -2565,7 +2565,7 @@ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -2574,7 +2574,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -2591,7 +2591,7 @@ "integrity": "sha512-OTiixgpZAT1M4NHgS5IguFp/Vz2VI3U7Goh4/HA1adtwyLtSBrxYlcSYkhpAE07s4fKEcjrFxyvtQBND4vFQyQ==", "dev": true, "requires": { - "is-number": "^4.0.0" + "is-number": "4.0.0" }, "dependencies": { "is-number": { @@ -2608,7 +2608,7 @@ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", "dev": true, "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" }, "dependencies": { "isobject": { @@ -2637,7 +2637,7 @@ "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", "dev": true, "requires": { - "is-unc-path": "^1.0.0" + "is-unc-path": "1.0.0" } }, "is-stream": { @@ -2658,7 +2658,7 @@ "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", "dev": true, "requires": { - "unc-path-regex": "^0.1.2" + "unc-path-regex": "0.1.2" } }, "is-utf8": { @@ -2737,7 +2737,7 @@ "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", "dev": true, "requires": { - "jsonify": "~0.0.0" + "jsonify": "0.0.0" } }, "json-stringify-safe": { @@ -2781,7 +2781,7 @@ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", "dev": true, "requires": { - "readable-stream": "^2.0.5" + "readable-stream": "2.3.3" } }, "liftoff": { @@ -2790,14 +2790,14 @@ "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", "dev": true, "requires": { - "extend": "^3.0.0", - "findup-sync": "^2.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" + "extend": "3.0.1", + "findup-sync": "2.0.0", + "fined": "1.1.0", + "flagged-respawn": "1.0.0", + "is-plain-object": "2.0.4", + "object.map": "1.0.1", + "rechoir": "0.6.2", + "resolve": "1.5.0" } }, "lodash": { @@ -2866,7 +2866,7 @@ "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", "dev": true, "requires": { - "lodash._root": "^3.0.0" + "lodash._root": "3.0.1" } }, "lodash.isarguments": { @@ -2893,9 +2893,9 @@ "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", "dev": true, "requires": { - "lodash._getnative": "^3.0.0", - "lodash.isarguments": "^3.0.0", - "lodash.isarray": "^3.0.0" + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" } }, "lodash.restparam": { @@ -2910,15 +2910,15 @@ "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", "dev": true, "requires": { - "lodash._basecopy": "^3.0.0", - "lodash._basetostring": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash._isiterateecall": "^3.0.0", - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0", - "lodash.keys": "^3.0.0", - "lodash.restparam": "^3.0.0", - "lodash.templatesettings": "^3.0.0" + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" } }, "lodash.templatesettings": { @@ -2927,8 +2927,8 @@ "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", "dev": true, "requires": { - "lodash._reinterpolate": "^3.0.0", - "lodash.escape": "^3.0.0" + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" } }, "lru-cache": { @@ -2943,7 +2943,7 @@ "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", "dev": true, "requires": { - "kind-of": "^6.0.2" + "kind-of": "6.0.2" }, "dependencies": { "kind-of": { @@ -2972,7 +2972,7 @@ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", "dev": true, "requires": { - "object-visit": "^1.0.0" + "object-visit": "1.0.1" } }, "math-random": { @@ -2987,7 +2987,7 @@ "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", "dev": true, "requires": { - "readable-stream": "^2.0.1" + "readable-stream": "2.3.3" } }, "micromatch": { @@ -2996,19 +2996,19 @@ "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" + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" }, "dependencies": { "arr-diff": { @@ -3017,7 +3017,7 @@ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", "dev": true, "requires": { - "arr-flatten": "^1.0.1" + "arr-flatten": "1.1.0" } }, "is-extglob": { @@ -3032,7 +3032,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } }, "kind-of": { @@ -3041,7 +3041,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -3058,7 +3058,7 @@ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", "dev": true, "requires": { - "mime-db": "~1.33.0" + "mime-db": "1.33.0" } }, "minimatch": { @@ -3066,7 +3066,7 @@ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { - "brace-expansion": "^1.1.7" + "brace-expansion": "1.1.8" } }, "minimist": { @@ -3080,8 +3080,8 @@ "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", "dev": true, "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" + "for-in": "1.0.2", + "is-extendable": "1.0.1" }, "dependencies": { "is-extendable": { @@ -3090,7 +3090,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -3143,10 +3143,10 @@ "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", "dev": true, "requires": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" + "array-differ": "1.0.0", + "array-union": "1.0.2", + "arrify": "1.0.1", + "minimatch": "3.0.4" } }, "multipipe": { @@ -3164,18 +3164,18 @@ "integrity": "sha512-n8R9bS8yQ6eSXaV6jHUpKzD8gLsin02w1HSFiegwrs9E098Ylhw5jdyKPaYqvHknHaSCKTPp7C8dGCQ0q9koXA==", "dev": true, "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-odd": "^2.0.0", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-odd": "2.0.0", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" }, "dependencies": { "arr-diff": { @@ -3196,8 +3196,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" } }, "is-extendable": { @@ -3206,7 +3206,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } }, "kind-of": { @@ -3229,7 +3229,7 @@ "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", "dev": true, "requires": { - "is": "^3.1.0" + "is": "3.2.1" } }, "normalize-path": { @@ -3238,7 +3238,7 @@ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", "dev": true, "requires": { - "remove-trailing-separator": "^1.0.1" + "remove-trailing-separator": "1.1.0" } }, "npm-run-path": { @@ -3247,7 +3247,7 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "^2.0.0" + "path-key": "2.0.1" } }, "oauth-sign": { @@ -3268,9 +3268,9 @@ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", "dev": true, "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" }, "dependencies": { "define-property": { @@ -3279,7 +3279,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "kind-of": { @@ -3288,7 +3288,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -3299,7 +3299,7 @@ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "isobject": "^3.0.0" + "isobject": "3.0.1" }, "dependencies": { "isobject": { @@ -3316,10 +3316,10 @@ "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", "dev": true, "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" + "array-each": "1.0.1", + "array-slice": "1.1.0", + "for-own": "1.0.0", + "isobject": "3.0.1" }, "dependencies": { "array-slice": { @@ -3334,7 +3334,7 @@ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { - "for-in": "^1.0.1" + "for-in": "1.0.2" } }, "isobject": { @@ -3351,8 +3351,8 @@ "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", "dev": true, "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" + "for-own": "1.0.0", + "make-iterator": "1.0.1" }, "dependencies": { "for-own": { @@ -3361,7 +3361,7 @@ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", "dev": true, "requires": { - "for-in": "^1.0.1" + "for-in": "1.0.2" } } } @@ -3372,8 +3372,8 @@ "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", "dev": true, "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "for-own": "0.1.5", + "is-extendable": "0.1.1" } }, "object.pick": { @@ -3382,7 +3382,7 @@ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", "dev": true, "requires": { - "isobject": "^3.0.1" + "isobject": "3.0.1" }, "dependencies": { "isobject": { @@ -3399,7 +3399,7 @@ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } }, "orchestrator": { @@ -3408,9 +3408,9 @@ "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", "dev": true, "requires": { - "end-of-stream": "~0.1.5", - "sequencify": "~0.0.7", - "stream-consume": "~0.1.0" + "end-of-stream": "0.1.5", + "sequencify": "0.0.7", + "stream-consume": "0.1.1" }, "dependencies": { "end-of-stream": { @@ -3419,7 +3419,7 @@ "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", "dev": true, "requires": { - "once": "~1.3.0" + "once": "1.3.3" } }, "once": { @@ -3428,7 +3428,7 @@ "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", "dev": true, "requires": { - "wrappy": "1" + "wrappy": "1.0.2" } } } @@ -3439,8 +3439,8 @@ "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", "dev": true, "requires": { - "is-stream": "^1.0.1", - "readable-stream": "^2.0.1" + "is-stream": "1.1.0", + "readable-stream": "2.3.3" } }, "os-homedir": { @@ -3466,9 +3466,9 @@ "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", "dev": true, "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" + "is-absolute": "1.0.0", + "map-cache": "0.2.2", + "path-root": "0.1.1" } }, "parse-glob": { @@ -3477,10 +3477,10 @@ "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" + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" }, "dependencies": { "is-extglob": { @@ -3495,7 +3495,7 @@ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", "dev": true, "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "1.0.0" } } } @@ -3542,7 +3542,7 @@ "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", "dev": true, "requires": { - "path-root-regex": "^0.1.0" + "path-root-regex": "0.1.2" } }, "path-root-regex": { @@ -3557,7 +3557,7 @@ "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", "dev": true, "requires": { - "through": "~2.3" + "through": "2.3.8" } }, "pend": { @@ -3577,11 +3577,11 @@ "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", "dev": true, "requires": { - "ansi-cyan": "^0.1.1", - "ansi-red": "^0.1.1", - "arr-diff": "^1.0.1", - "arr-union": "^2.0.1", - "extend-shallow": "^1.1.2" + "ansi-cyan": "0.1.1", + "ansi-red": "0.1.1", + "arr-diff": "1.1.0", + "arr-union": "2.1.0", + "extend-shallow": "1.1.4" } }, "posix-character-classes": { @@ -3638,7 +3638,7 @@ "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", "dev": true, "requires": { - "inherits": "~2.0.0" + "inherits": "2.0.3" } }, "randomatic": { @@ -3647,9 +3647,9 @@ "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" + "is-number": "4.0.0", + "kind-of": "6.0.2", + "math-random": "1.0.1" }, "dependencies": { "is-number": { @@ -3672,13 +3672,13 @@ "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", "dev": true, "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~1.0.6", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.0.3", - "util-deprecate": "~1.0.1" + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" } }, "rechoir": { @@ -3687,7 +3687,7 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "^1.1.6" + "resolve": "1.5.0" } }, "regex-cache": { @@ -3696,7 +3696,7 @@ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", "dev": true, "requires": { - "is-equal-shallow": "^0.1.3" + "is-equal-shallow": "0.1.3" } }, "regex-not": { @@ -3705,8 +3705,8 @@ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" }, "dependencies": { "extend-shallow": { @@ -3715,8 +3715,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" } }, "is-extendable": { @@ -3725,7 +3725,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -3760,26 +3760,26 @@ "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", "dev": true, "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", - "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", - "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", - "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", - "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "aws-sign2": "0.7.0", + "aws4": "1.7.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.1", + "tough-cookie": "2.3.4", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" } }, "requires-port": { @@ -3794,7 +3794,7 @@ "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", "dev": true, "requires": { - "path-parse": "^1.0.5" + "path-parse": "1.0.5" } }, "resolve-dir": { @@ -3803,8 +3803,8 @@ "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", "dev": true, "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" + "expand-tilde": "2.0.2", + "global-modules": "1.0.0" } }, "resolve-url": { @@ -3825,7 +3825,7 @@ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "7.1.2" } }, "safe-buffer": { @@ -3840,7 +3840,7 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "~0.1.10" + "ret": "0.1.15" } }, "safer-buffer": { @@ -3866,10 +3866,10 @@ "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" }, "dependencies": { "extend-shallow": { @@ -3878,7 +3878,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -3889,7 +3889,7 @@ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "1.0.0" } }, "shebang-regex": { @@ -3916,14 +3916,14 @@ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.0" }, "dependencies": { "define-property": { @@ -3932,7 +3932,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } }, "extend-shallow": { @@ -3941,7 +3941,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "source-map": { @@ -3958,9 +3958,9 @@ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" }, "dependencies": { "define-property": { @@ -3969,7 +3969,7 @@ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", "dev": true, "requires": { - "is-descriptor": "^1.0.0" + "is-descriptor": "1.0.2" } }, "is-accessor-descriptor": { @@ -3978,7 +3978,7 @@ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-data-descriptor": { @@ -3987,7 +3987,7 @@ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", "dev": true, "requires": { - "kind-of": "^6.0.0" + "kind-of": "6.0.2" } }, "is-descriptor": { @@ -3996,9 +3996,9 @@ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", "dev": true, "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" } }, "isobject": { @@ -4021,7 +4021,7 @@ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "kind-of": "^3.2.0" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -4030,7 +4030,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -4047,11 +4047,11 @@ "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", "dev": true, "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" + "atob": "2.1.1", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" } }, "source-map-support": { @@ -4060,8 +4060,8 @@ "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", "dev": true, "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" + "buffer-from": "1.1.0", + "source-map": "0.6.1" } }, "source-map-url": { @@ -4082,7 +4082,7 @@ "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", "dev": true, "requires": { - "through": "2" + "through": "2.3.8" } }, "split-string": { @@ -4091,7 +4091,7 @@ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "extend-shallow": "^3.0.0" + "extend-shallow": "3.0.2" }, "dependencies": { "extend-shallow": { @@ -4100,8 +4100,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" } }, "is-extendable": { @@ -4110,7 +4110,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -4121,15 +4121,15 @@ "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", "dev": true, "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "safer-buffer": "2.1.2", + "tweetnacl": "0.14.5" } }, "stat-mode": { @@ -4144,8 +4144,8 @@ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", "dev": true, "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" + "define-property": "0.2.5", + "object-copy": "0.1.0" }, "dependencies": { "define-property": { @@ -4154,7 +4154,7 @@ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", "dev": true, "requires": { - "is-descriptor": "^0.1.0" + "is-descriptor": "0.1.6" } } } @@ -4165,7 +4165,7 @@ "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", "dev": true, "requires": { - "duplexer": "~0.1.1" + "duplexer": "0.1.1" } }, "stream-consume": { @@ -4186,7 +4186,7 @@ "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", "dev": true, "requires": { - "readable-stream": "^2.0.2" + "readable-stream": "2.3.3" } }, "streamifier": { @@ -4201,7 +4201,7 @@ "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", "dev": true, "requires": { - "safe-buffer": "~5.1.0" + "safe-buffer": "5.1.1" } }, "strip-ansi": { @@ -4210,7 +4210,7 @@ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { - "ansi-regex": "^2.0.0" + "ansi-regex": "2.1.1" } }, "strip-bom": { @@ -4219,7 +4219,7 @@ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", "dev": true, "requires": { - "is-utf8": "^0.2.0" + "is-utf8": "0.2.1" } }, "strip-bom-stream": { @@ -4228,8 +4228,8 @@ "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", "dev": true, "requires": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" + "first-chunk-stream": "1.0.0", + "strip-bom": "2.0.0" } }, "strip-eof": { @@ -4244,7 +4244,7 @@ "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", "dev": true, "requires": { - "has-flag": "^2.0.0" + "has-flag": "2.0.0" } }, "tar": { @@ -4253,9 +4253,9 @@ "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", "dev": true, "requires": { - "block-stream": "*", - "fstream": "^1.0.2", - "inherits": "2" + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" } }, "through": { @@ -4270,8 +4270,8 @@ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", "dev": true, "requires": { - "readable-stream": "^2.1.5", - "xtend": "~4.0.1" + "readable-stream": "2.3.3", + "xtend": "4.0.1" } }, "through2-filter": { @@ -4280,8 +4280,8 @@ "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", "dev": true, "requires": { - "through2": "~2.0.0", - "xtend": "~4.0.0" + "through2": "2.0.3", + "xtend": "4.0.1" } }, "tildify": { @@ -4290,7 +4290,7 @@ "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", "dev": true, "requires": { - "os-homedir": "^1.0.0" + "os-homedir": "1.0.2" } }, "time-stamp": { @@ -4304,7 +4304,7 @@ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "requires": { - "os-tmpdir": "~1.0.2" + "os-tmpdir": "1.0.2" } }, "to-absolute-glob": { @@ -4313,7 +4313,7 @@ "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", "dev": true, "requires": { - "extend-shallow": "^2.0.1" + "extend-shallow": "2.0.1" }, "dependencies": { "extend-shallow": { @@ -4322,7 +4322,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } } } @@ -4333,7 +4333,7 @@ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" }, "dependencies": { "kind-of": { @@ -4342,7 +4342,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -4353,10 +4353,10 @@ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" }, "dependencies": { "extend-shallow": { @@ -4365,8 +4365,8 @@ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" } }, "is-extendable": { @@ -4375,7 +4375,7 @@ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", "dev": true, "requires": { - "is-plain-object": "^2.0.4" + "is-plain-object": "2.0.4" } } } @@ -4386,8 +4386,8 @@ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" + "is-number": "3.0.0", + "repeat-string": "1.6.1" }, "dependencies": { "is-number": { @@ -4396,7 +4396,7 @@ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "kind-of": "^3.0.2" + "kind-of": "3.2.2" } }, "kind-of": { @@ -4405,7 +4405,7 @@ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", "dev": true, "requires": { - "is-buffer": "^1.1.5" + "is-buffer": "1.1.6" } } } @@ -4416,7 +4416,7 @@ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", "dev": true, "requires": { - "punycode": "^1.4.1" + "punycode": "1.4.1" } }, "tslib": { @@ -4431,17 +4431,17 @@ "integrity": "sha1-H0mtWy53x2w69N3K5VKuTjYS6xM=", "dev": true, "requires": { - "babel-code-frame": "^6.22.0", - "builtin-modules": "^1.1.1", - "chalk": "^2.1.0", - "commander": "^2.9.0", - "diff": "^3.2.0", - "glob": "^7.1.1", - "minimatch": "^3.0.4", - "resolve": "^1.3.2", - "semver": "^5.3.0", - "tslib": "^1.7.1", - "tsutils": "^2.12.1" + "babel-code-frame": "6.26.0", + "builtin-modules": "1.1.1", + "chalk": "2.3.0", + "commander": "2.11.0", + "diff": "3.3.1", + "glob": "7.1.2", + "minimatch": "3.0.4", + "resolve": "1.5.0", + "semver": "5.4.1", + "tslib": "1.8.1", + "tsutils": "2.15.0" } }, "tslint-microsoft-contrib": { @@ -4450,7 +4450,7 @@ "integrity": "sha1-Mo7pwo0HzfeTKTIEyW4v+rkiGZQ=", "dev": true, "requires": { - "tsutils": "^1.4.0" + "tsutils": "1.9.1" }, "dependencies": { "tsutils": { @@ -4467,7 +4467,7 @@ "integrity": "sha512-jKqhimj5gKl96ngeKxSVG1nOE7wmKRiHXD3kKpi+GG+5CmXJevD0ogsThZ8uSQCBIELFLVqXpZ43PpLniWu7jw==", "dev": true, "requires": { - "tsutils": "^2.3.0" + "tsutils": "2.15.0" } }, "tsutils": { @@ -4476,7 +4476,7 @@ "integrity": "sha512-kKb1mSqRMwF0GHKya5/hZsI2m7Flg4ONZDeYu4e6Gx+kYAu86zsLNCHcUmNWhCRaUcKshNI272hOzuaCQDzJ2g==", "dev": true, "requires": { - "tslib": "^1.8.1" + "tslib": "1.8.1" } }, "tunnel-agent": { @@ -4485,7 +4485,7 @@ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", "dev": true, "requires": { - "safe-buffer": "^5.0.1" + "safe-buffer": "5.1.1" } }, "tweetnacl": { @@ -4513,10 +4513,10 @@ "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", "dev": true, "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" }, "dependencies": { "arr-union": { @@ -4531,7 +4531,7 @@ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", "dev": true, "requires": { - "is-extendable": "^0.1.0" + "is-extendable": "0.1.1" } }, "set-value": { @@ -4540,10 +4540,10 @@ "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", "dev": true, "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" } } } @@ -4554,8 +4554,8 @@ "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", "dev": true, "requires": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" + "json-stable-stringify": "1.0.1", + "through2-filter": "2.0.0" } }, "unset-value": { @@ -4564,8 +4564,8 @@ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" + "has-value": "0.3.1", + "isobject": "3.0.1" }, "dependencies": { "has-value": { @@ -4574,9 +4574,9 @@ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", "dev": true, "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" }, "dependencies": { "isobject": { @@ -4616,8 +4616,8 @@ "integrity": "sha512-x95Td74QcvICAA0+qERaVkRpTGKyBHHYdwL2LXZm5t/gBtCB9KQSO/0zQgSTYEV1p0WcvSg79TLNPSvd5IDJMQ==", "dev": true, "requires": { - "querystringify": "^2.0.0", - "requires-port": "^1.0.0" + "querystringify": "2.0.0", + "requires-port": "1.0.0" } }, "use": { @@ -4626,7 +4626,7 @@ "integrity": "sha512-6UJEQM/L+mzC3ZJNM56Q4DFGLX/evKGRg15UJHGB9X5j5Z3AFbgZvjUh2yq/UJUY4U5dh7Fal++XbNg1uzpRAw==", "dev": true, "requires": { - "kind-of": "^6.0.2" + "kind-of": "6.0.2" }, "dependencies": { "kind-of": { @@ -4661,7 +4661,7 @@ "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", "dev": true, "requires": { - "user-home": "^1.1.1" + "user-home": "1.1.1" } }, "vali-date": { @@ -4676,9 +4676,9 @@ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", "dev": true, "requires": { - "assert-plus": "^1.0.0", + "assert-plus": "1.0.0", "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "extsprintf": "1.3.0" } }, "vinyl": { @@ -4687,8 +4687,8 @@ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", "dev": true, "requires": { - "clone": "^0.2.0", - "clone-stats": "^0.0.1" + "clone": "0.2.0", + "clone-stats": "0.0.1" } }, "vinyl-fs": { @@ -4697,23 +4697,23 @@ "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", "dev": true, "requires": { - "duplexify": "^3.2.0", - "glob-stream": "^5.3.2", - "graceful-fs": "^4.0.0", + "duplexify": "3.6.0", + "glob-stream": "5.3.5", + "graceful-fs": "4.1.11", "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "^0.3.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", - "through2": "^2.0.0", - "through2-filter": "^2.0.0", - "vali-date": "^1.0.0", - "vinyl": "^1.0.0" + "is-valid-glob": "0.3.0", + "lazystream": "1.0.0", + "lodash.isequal": "4.5.0", + "merge-stream": "1.0.1", + "mkdirp": "0.5.1", + "object-assign": "4.1.1", + "readable-stream": "2.3.3", + "strip-bom": "2.0.0", + "strip-bom-stream": "1.0.0", + "through2": "2.0.3", + "through2-filter": "2.0.0", + "vali-date": "1.0.0", + "vinyl": "1.2.0" }, "dependencies": { "clone": { @@ -4734,8 +4734,8 @@ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", "dev": true, "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", + "clone": "1.0.4", + "clone-stats": "0.0.1", "replace-ext": "0.0.1" } } @@ -4747,8 +4747,8 @@ "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", "dev": true, "requires": { - "through2": "^2.0.3", - "vinyl": "^0.4.3" + "through2": "2.0.3", + "vinyl": "0.4.6" } }, "vrsource-tslint-rules": { @@ -4757,7 +4757,7 @@ "integrity": "sha512-wr69FB/S6P8GT+rO/OocCr3biFaX4lT/JH1IZGqd7Jy4A3WaPUs0Jn4ELmTEpbFtYMWTawFACMQh1AyT7YewRQ==", "dev": true, "requires": { - "tslint": "~5.8.0" + "tslint": "5.8.0" } }, "vscode": { @@ -4766,28 +4766,34 @@ "integrity": "sha512-SyDw4qFwZ+WthZX7RWp71PNiWLF7VhpM65j2oryY/6jtSORd8qH6J8vclwWZJ6Jvu0EH7JamO2RWNfBfsMR9Zw==", "dev": true, "requires": { - "glob": "^7.1.2", - "gulp-chmod": "^2.0.0", - "gulp-filter": "^5.0.1", + "glob": "7.1.2", + "gulp-chmod": "2.0.0", + "gulp-filter": "5.1.0", "gulp-gunzip": "1.0.0", - "gulp-remote-src-vscode": "^0.5.0", - "gulp-symdest": "^1.1.0", - "gulp-untar": "^0.0.7", - "gulp-vinyl-zip": "^2.1.0", - "mocha": "^4.0.1", - "request": "^2.83.0", - "semver": "^5.4.1", - "source-map-support": "^0.5.0", - "url-parse": "^1.1.9", - "vinyl-source-stream": "^1.1.0" + "gulp-remote-src-vscode": "0.5.0", + "gulp-symdest": "1.1.0", + "gulp-untar": "0.0.7", + "gulp-vinyl-zip": "2.1.0", + "mocha": "4.1.0", + "request": "2.87.0", + "semver": "5.4.1", + "source-map-support": "0.5.6", + "url-parse": "1.4.1", + "vinyl-source-stream": "1.1.2" } }, + "vscode-cpptools": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/vscode-cpptools/-/vscode-cpptools-1.2.2.tgz", + "integrity": "sha512-1B1tGqFeQ0dBu57FaehMzc5E+hwl6k6HSMJ+ICkGbdrcmnSIS3kv2j2Qyn20ZP5Tnj5AqnzKWRNboqKC8xTdUg==", + "dev": true + }, "vscode-debugadapter": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/vscode-debugadapter/-/vscode-debugadapter-1.24.0.tgz", "integrity": "sha1-KAY7AcyorB5fehPRGOMgem6If/0=", "requires": { - "vscode-debugprotocol": "^1.24.0" + "vscode-debugprotocol": "1.24.0" } }, "vscode-debugprotocol": { @@ -4836,7 +4842,7 @@ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", "dev": true, "requires": { - "isexe": "^2.0.0" + "isexe": "2.0.0" } }, "wrappy": { @@ -4862,8 +4868,8 @@ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.8.0.tgz", "integrity": "sha1-eUUK/yKyqcWkHvVOAtuQfM+/nuI=", "requires": { - "buffer-crc32": "~0.2.3", - "fd-slicer": "~1.0.1" + "buffer-crc32": "0.2.13", + "fd-slicer": "1.0.1" } }, "yazl": { @@ -4872,7 +4878,7 @@ "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=", "dev": true, "requires": { - "buffer-crc32": "~0.2.3" + "buffer-crc32": "0.2.13" } }, "zone.js": { diff --git a/Extension/package.json b/Extension/package.json index 46ad56565..7ad992941 100644 --- a/Extension/package.json +++ b/Extension/package.json @@ -2,7 +2,7 @@ "name": "cpptools", "displayName": "C/C++", "description": "C/C++ IntelliSense, debugging, and code browsing.", - "version": "0.17.5", + "version": "0.17.6-master", "publisher": "ms-vscode", "preview": true, "icon": "LanguageCCPP_color_128x.png", @@ -359,6 +359,15 @@ "description": "The value to use in a configuration if \"cppStandard\" is either not specified or set to \"${default}\".", "scope": "resource" }, + "C_Cpp.default.configurationProvider": { + "type": [ + "string", + "null" + ], + "default": null, + "description": "The value to use in a configuration if \"configurationProvider\" is either not specified or set to \"${default}\".", + "scope": "resource" + }, "C_Cpp.default.browse.path": { "type": [ "array", @@ -1323,7 +1332,8 @@ "tslint-no-unused-expression-chai": "0.0.3", "typescript": "^2.5.3", "vrsource-tslint-rules": "^5.8.2", - "vscode": "^1.1.18" + "vscode": "^1.1.18", + "vscode-cpptools": "^1.2.2" }, "dependencies": { "http-proxy-agent": "~2.1.0", @@ -1341,7 +1351,7 @@ "runtimeDependencies": [ { "description": "C/C++ language components (Linux / x86_64)", - "url": "https://go.microsoft.com/fwlink/?linkid=875587", + "url": "https://go.microsoft.com/fwlink/?linkid=2003936", "platforms": [ "linux" ], @@ -1355,7 +1365,7 @@ }, { "description": "C/C++ language components (Linux / x86)", - "url": "https://go.microsoft.com/fwlink/?linkid=875588", + "url": "https://go.microsoft.com/fwlink/?linkid=2003833", "platforms": [ "linux" ], @@ -1371,7 +1381,7 @@ }, { "description": "C/C++ language components (OS X)", - "url": "https://go.microsoft.com/fwlink/?linkid=875589", + "url": "https://go.microsoft.com/fwlink/?linkid=2003834", "platforms": [ "darwin" ], @@ -1382,7 +1392,7 @@ }, { "description": "C/C++ language components (Windows)", - "url": "https://go.microsoft.com/fwlink/?linkid=875590", + "url": "https://go.microsoft.com/fwlink/?linkid=2003835", "platforms": [ "win32" ], diff --git a/Extension/src/LanguageServer/client.ts b/Extension/src/LanguageServer/client.ts index 4c64d4fdc..79dd6f9ae 100644 --- a/Extension/src/LanguageServer/client.ts +++ b/Extension/src/LanguageServer/client.ts @@ -10,11 +10,13 @@ import { LanguageClient, LanguageClientOptions, ServerOptions, NotificationType, TextDocumentIdentifier, RequestType, ErrorAction, CloseAction, DidOpenTextDocumentParams } from 'vscode-languageclient'; +import { SourceFileConfigurationItem } from 'vscode-cpptools'; +import { Status } from 'vscode-cpptools/out/testApi'; import * as util from '../common'; import * as configs from './configurations'; import { CppSettings, OtherSettings } from './settings'; import * as telemetry from '../telemetry'; -import { PersistentState } from './persistentState'; +import { PersistentState, PersistentFolderState } from './persistentState'; import { UI, getUI } from './ui'; import { ClientCollection } from './clientCollection'; import { createProtocolFilter } from './protocolFilter'; @@ -22,9 +24,10 @@ import { DataBinding } from './dataBinding'; import minimatch = require("minimatch"); import * as logger from '../logger'; import { updateLanguageConfigurations } from './extension'; -import { CustomConfigurationProvider, SourceFileConfigurationItem } from '../api'; import { CancellationTokenSource } from 'vscode'; import { SettingsTracker, getTracker } from './settingsTracker'; +import { getTestHook, TestHook } from '../testHook'; +import { getCustomConfigProviders, CustomConfigurationProviderCollection, CustomConfigurationProvider1 } from '../LanguageServer/customProviders'; let ui: UI; @@ -150,10 +153,14 @@ export interface Client { TrackedDocuments: Set; onDidChangeSettings(): void; onDidChangeVisibleTextEditors(editors: vscode.TextEditor[]): void; - onDidChangeCustomConfigurations(provider: CustomConfigurationProvider): void; + onRegisterCustomConfigurationProvider(provider: CustomConfigurationProvider1): Thenable; + updateCustomConfigurations(requestingProvider?: CustomConfigurationProvider1): Thenable; + provideCustomConfiguration(document: vscode.TextDocument): Promise; + getCustomConfigurationProviderId(): Thenable; + getCurrentConfigName(): Thenable; takeOwnership(document: vscode.TextDocument): void; - runBlockingTask(task: Thenable): Thenable; - runBlockingThenableWithTimeout(thenable: () => Thenable, ms: number, tokenSource?: CancellationTokenSource): Thenable; + queueTask(task: () => Thenable): Thenable; + queueTaskWithTimeout(thenable: () => Thenable, ms: number, tokenSource?: CancellationTokenSource): Thenable; requestWhenReady(request: () => Thenable): Thenable; notifyWhenReady(notify: () => void): void; requestGoToDeclaration(): Thenable; @@ -162,7 +169,7 @@ export interface Client { activeDocumentChanged(document: vscode.TextDocument): void; activate(): void; selectionChanged(selection: vscode.Position): void; - sendCustomConfigurations(configs: SourceFileConfigurationItem[]): void; + sendCustomConfigurations(configs: any): void; resetDatabase(): void; deactivate(): void; pauseParsing(): void; @@ -196,6 +203,7 @@ class DefaultClient implements Client { private isSupported: boolean = true; private inactiveRegionsDecorations = new Map(); private settingsTracker: SettingsTracker; + private configurationProvider: string; // The "model" that is displayed via the UI (status bar). private model: ClientModel = { @@ -253,34 +261,36 @@ class DefaultClient implements Client { ui.bind(this); // requests/notifications are deferred until this.languageClient is set. - this.runBlockingTask(languageClient.onReady().then(() => { - this.configuration = new configs.CppProperties(this.RootUri); - this.configuration.ConfigurationsChanged((e) => this.onConfigurationsChanged(e)); - this.configuration.SelectionChanged((e) => this.onSelectedConfigurationChanged(e)); - this.configuration.CompileCommandsChanged((e) => this.onCompileCommandsChanged(e)); - this.disposables.push(this.configuration); - - // The configurations will not be sent to the language server until the default include paths and frameworks have been set. - // The event handlers must be set before this happens. - languageClient.sendRequest(QueryCompilerDefaultsRequest, {}).then((compilerDefaults: configs.CompilerDefaults) => { - this.configuration.CompilerDefaults = compilerDefaults; - }); - - this.languageClient = languageClient; - this.settingsTracker = getTracker(this.RootUri); - telemetry.logLanguageServerEvent("NonDefaultInitialCppSettings", this.settingsTracker.getUserModifiedSettings()); - failureMessageShown = false; - - // Listen for messages from the language server. - this.registerNotifications(); - this.registerFileWatcher(); - }, (err) => { - this.isSupported = false; // Running on an OS we don't support yet. - if (!failureMessageShown) { - failureMessageShown = true; - vscode.window.showErrorMessage("Unable to start the C/C++ language server. IntelliSense features will be disabled. Error: " + String(err)); - } - })); + this.queueTask(() => languageClient.onReady().then( + () => { + this.configuration = new configs.CppProperties(this.RootUri); + this.configuration.ConfigurationsChanged((e) => this.onConfigurationsChanged(e)); + this.configuration.SelectionChanged((e) => this.onSelectedConfigurationChanged(e)); + this.configuration.CompileCommandsChanged((e) => this.onCompileCommandsChanged(e)); + this.disposables.push(this.configuration); + + // The configurations will not be sent to the language server until the default include paths and frameworks have been set. + // The event handlers must be set before this happens. + languageClient.sendRequest(QueryCompilerDefaultsRequest, {}).then((compilerDefaults: configs.CompilerDefaults) => { + this.configuration.CompilerDefaults = compilerDefaults; + }); + + this.languageClient = languageClient; + this.settingsTracker = getTracker(this.RootUri); + telemetry.logLanguageServerEvent("NonDefaultInitialCppSettings", this.settingsTracker.getUserModifiedSettings()); + failureMessageShown = false; + + // Listen for messages from the language server. + this.registerNotifications(); + this.registerFileWatcher(); + }, + (err) => { + this.isSupported = false; // Running on an OS we don't support yet. + if (!failureMessageShown) { + failureMessageShown = true; + vscode.window.showErrorMessage("Unable to start the C/C++ language server. IntelliSense features will be disabled. Error: " + String(err)); + } + })); } catch (err) { this.isSupported = false; // Running on an OS we don't support yet. if (!failureMessageShown) { @@ -405,21 +415,113 @@ class DefaultClient implements Client { } } - public onDidChangeCustomConfigurations(provider: CustomConfigurationProvider): void { - let documentUris: vscode.Uri[] = []; - this.trackedDocuments.forEach(document => documentUris.push(document.uri)); + public onRegisterCustomConfigurationProvider(provider: CustomConfigurationProvider1): Thenable { + return this.notifyWhenReady(() => { + if (!this.RootPath) { + return; // There is no c_cpp_properties.json to edit because there is no folder open. + } + let selectedProvider: string = this.configuration.CurrentConfigurationProvider; + if (!selectedProvider) { + let ask: PersistentFolderState = new PersistentFolderState("Client.registerProvider", true, this.RootPath); + if (ask.Value) { + let folderStr: string = (vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 1) ? "the '" + this.Name + "'" : "this"; + const message: string = `${provider.name} would like to configure IntelliSense for ${folderStr} folder.`; + const allow: string = "Allow"; + const notNow: string = "Not Now"; + const dontAskAgain: string = "Don't Ask Again"; + vscode.window.showInformationMessage(message, allow, notNow, dontAskAgain).then(result => { + switch (result) { + case allow: { + this.configuration.addCustomConfigurationProvider(provider.extensionId).then(() => { + telemetry.logLanguageServerEvent("customConfigurationProvider", { "providerId": provider.extensionId }); + }); + break; + } + case dontAskAgain: { + ask.Value = false; + break; + } + default: { + break; + } + } + }); + } + } else if (selectedProvider === provider.extensionId) { + telemetry.logLanguageServerEvent("customConfigurationProvider", { "providerId": provider.extensionId }); + } else if (selectedProvider === provider.name) { + this.configuration.addCustomConfigurationProvider(provider.extensionId); // update the configurationProvider in c_cpp_properties.json + } + }); + } + + public updateCustomConfigurations(requestingProvider?: CustomConfigurationProvider1): Thenable { + return this.notifyWhenReady(() => { + if (!this.configurationProvider) { + return; + } + let currentProvider: CustomConfigurationProvider1 = getCustomConfigProviders().get(this.configurationProvider); + if (!currentProvider || (requestingProvider && requestingProvider.extensionId !== currentProvider.extensionId) || this.trackedDocuments.size === 0) { + return; + } + + let tokenSource: CancellationTokenSource = new CancellationTokenSource(); + let documentUris: vscode.Uri[] = []; + this.trackedDocuments.forEach(document => documentUris.push(document.uri)); + + let task: () => Thenable = () => { + return currentProvider.provideConfigurations(documentUris, tokenSource.token); + }; + this.queueTaskWithTimeout(task, 1000, tokenSource).then(configs => this.sendCustomConfigurations(configs)); + }); + } + public async provideCustomConfiguration(document: vscode.TextDocument): Promise { let tokenSource: CancellationTokenSource = new CancellationTokenSource(); + let providers: CustomConfigurationProviderCollection = getCustomConfigProviders(); - if (documentUris.length === 0) { - return; + if (providers.size === 0) { + return Promise.resolve(); + } + let providerId: string|undefined = await this.getCustomConfigurationProviderId(); + if (!providerId) { + return Promise.resolve(); } - this.runBlockingThenableWithTimeout(() => { - return provider.provideConfigurations(documentUris, tokenSource.token); - }, 1000, tokenSource).then((configs: SourceFileConfigurationItem[]) => { - this.sendCustomConfigurations(configs); - }); + let providerName: string = providerId; + let configName: string = await this.getCurrentConfigName(); + let provideConfigurationAsync: () => Thenable = async () => { + // The config requests that we use a provider, try to get IntelliSense configuration info from that provider. + try { + let provider: CustomConfigurationProvider1|null = providers.get(providerId); + if (provider) { + providerName = provider.name; + if (await provider.canProvideConfiguration(document.uri, tokenSource.token)) { + return provider.provideConfigurations([document.uri], tokenSource.token); + } + } + } catch { + } + return Promise.reject(""); + }; + + return this.queueTaskWithTimeout(provideConfigurationAsync, 1000, tokenSource).then( + (configs: SourceFileConfigurationItem[]) => { + if (configs && configs.length > 0) { + this.sendCustomConfigurations(configs); + } + }, + () => { + vscode.window.showInformationMessage(`'${providerName}' is unable to provide IntelliSense configuration information for '${document.uri.fsPath}'. Settings from the '${configName}' configuration will be used instead.`); + }); + } + + public getCustomConfigurationProviderId(): Thenable { + return this.queueTask(() => Promise.resolve(this.configuration.CurrentConfiguration.configurationProvider)); + } + + public getCurrentConfigName(): Thenable { + return this.queueTask(() => Promise.resolve(this.configuration.CurrentConfiguration.name)); } /** @@ -443,75 +545,68 @@ class DefaultClient implements Client { /************************************************************************************* * wait until the all pendingTasks are complete (e.g. language client is ready for use) - * before attempting to send messages + * before attempting to send messages or operate on the client. *************************************************************************************/ - public runBlockingTask(task: Thenable): Thenable { - if (this.pendingTask) { - return this.requestWhenReady(() => { return task; }); - } else { - this.pendingTask = task; - return task.then((result) => { - this.pendingTask = undefined; + + public queueTask(task: () => Thenable): Thenable { + if (this.isSupported) { + this.pendingRequests++; + let nextTask: () => Thenable = () => { + let result: Thenable = task(); + this.pendingRequests--; + if (this.pendingRequests === 0) { + this.pendingTask = null; + } return result; - }, (error) => { - this.pendingTask = undefined; - throw error; - }); + }; + + if (this.pendingTask) { + // We don't want the queue to stall because of a rejected promise. + return this.pendingTask.then(nextTask, nextTask); + } else { + this.pendingTask = nextTask(); + return this.pendingTask; + } + } else { + return Promise.reject("Unsupported client"); } } - public runBlockingThenableWithTimeout(thenable: () => Thenable, ms: number, tokenSource?: CancellationTokenSource): Thenable { + public queueTaskWithTimeout(task: () => Thenable, ms: number, cancelToken?: CancellationTokenSource): Thenable { let timer: NodeJS.Timer; // Create a promise that rejects in milliseconds - let timeout: Promise = new Promise((resolve, reject) => { + let timeout: () => Promise = () => new Promise((resolve, reject) => { timer = setTimeout(() => { clearTimeout(timer); - if (tokenSource) { - tokenSource.cancel(); + if (cancelToken) { + cancelToken.cancel(); } reject("Timed out in " + ms + "ms."); }, ms); }); // Returns a race between our timeout and the passed in promise - return this.runBlockingTask(Promise.race([thenable(), timeout]).then((result: any) => { - clearTimeout(timer); - return result; - }, (error: any) => { - throw error; - })); + return this.queueTask(() => { + return Promise.race([task(), timeout()]).then( + (result: any) => { + clearTimeout(timer); + return result; + }, + (error: any) => { + throw error; + }); + }); } public requestWhenReady(request: () => Thenable): Thenable { - if (this.pendingTask === undefined) { - return request(); - } else if (this.isSupported && this.pendingTask) { - this.pendingRequests++; - return this.pendingTask.then(() => { - this.pendingRequests--; - if (this.pendingRequests === 0) { - this.pendingTask = undefined; - } - return request(); - }); - } else { - return Promise.reject("Unsupported client"); - } + return this.queueTask(request); } - public notifyWhenReady(notify: () => void): void { - if (this.pendingTask === undefined) { + public notifyWhenReady(notify: () => void): Thenable { + return this.queueTask(() => new Promise(resolve => { notify(); - } else if (this.isSupported && this.pendingTask) { - this.pendingRequests++; - this.pendingTask.then(() => { - this.pendingRequests--; - if (this.pendingRequests === 0) { - this.pendingTask = undefined; - } - notify(); - }); - } + resolve(); + })); } /** @@ -667,14 +762,19 @@ class DefaultClient implements Client { private updateStatus(notificationBody: ReportStatusNotificationBody): void { let message: string = notificationBody.status; util.setProgress(util.getProgressExecutableSuccess()); + let testHook: TestHook = getTestHook(); if (message.endsWith("Indexing...")) { this.model.isTagParsing.Value = true; + testHook.updateStatus(Status.TagParsingBegun); } else if (message.endsWith("Updating IntelliSense...")) { this.model.isUpdatingIntelliSense.Value = true; + testHook.updateStatus(Status.IntelliSenseCompiling); } else if (message.endsWith("IntelliSense Ready")) { this.model.isUpdatingIntelliSense.Value = false; + testHook.updateStatus(Status.IntelliSenseReady); } else if (message.endsWith("Ready")) { // Tag Parser Ready this.model.isTagParsing.Value = false; + testHook.updateStatus(Status.TagParsingDone); util.setProgress(util.getProgressParseRootSuccess()); } else if (message.endsWith("No Squiggles")) { util.setIntelliSenseProgress(util.getProgressIntelliSenseNoSquiggles()); @@ -752,7 +852,7 @@ class DefaultClient implements Client { } private promptCompileCommands(params: CompileCommandsPaths) : void { - if (this.configuration.Configurations[this.configuration.CurrentConfiguration].compileCommands !== undefined) { + if (this.configuration.CurrentConfiguration.compileCommands !== undefined) { return; } @@ -762,7 +862,7 @@ class DefaultClient implements Client { } let compileCommandStr: string = params.paths.length > 1 ? "a compile_commands.json file" : params.paths[0]; - let folderStr: string = (vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 1) ? "the " + this.Name : "this"; + let folderStr: string = (vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 1) ? "the '" + this.Name + "'" : "this"; const message: string = `Would you like to use ${compileCommandStr} to auto-configure IntelliSense for ${folderStr} folder?`; const yes: string = "Yes"; @@ -866,11 +966,17 @@ class DefaultClient implements Client { private onConfigurationsChanged(configurations: configs.Configuration[]): void { let params: FolderSettingsParams = { configurations: configurations, - currentConfiguration: this.configuration.CurrentConfiguration + currentConfiguration: this.configuration.CurrentConfigurationIndex }; this.notifyWhenReady(() => { this.languageClient.sendNotification(ChangeFolderSettingsNotification, params); this.model.activeConfigName.Value = configurations[params.currentConfiguration].name; + }).then(() => { + let newProvider: string = this.configuration.CurrentConfigurationProvider; + if (this.configurationProvider !== newProvider) { + this.configurationProvider = newProvider; + this.updateCustomConfigurations(); + } }); } @@ -891,9 +997,27 @@ class DefaultClient implements Client { this.notifyWhenReady(() => this.languageClient.sendNotification(ChangeCompileCommandsNotification, params)); } - public sendCustomConfigurations(configs: SourceFileConfigurationItem[]): void { + public sendCustomConfigurations(configs: any): void { + // configs is marked as 'any' because it is untrusted data coming from a 3rd-party. We need to sanitize it before sending it to the language server. + if (!configs || !(configs instanceof Array)) { + return; + } + let sanitized: SourceFileConfigurationItem[] = configs; + sanitized = sanitized.filter(item => { + if (item && item.uri && item.configuration && + item.configuration.includePath && item.configuration.defines && item.configuration.intelliSenseMode && item.configuration.standard) { + return true; + } + console.warn("discarding invalid SourceFileConfigurationItem: " + item); + return false; + }); + + if (sanitized.length === 0) { + return; + } + let params: CustomConfigurationParams = { - configurationItems: configs + configurationItems: sanitized }; this.notifyWhenReady(() => this.languageClient.sendNotification(CustomConfigurationNotification, params)); } @@ -988,13 +1112,17 @@ class NullClient implements Client { TrackedDocuments = new Set(); onDidChangeSettings(): void {} onDidChangeVisibleTextEditors(editors: vscode.TextEditor[]): void {} - onDidChangeCustomConfigurations(provider: CustomConfigurationProvider): void {} + onRegisterCustomConfigurationProvider(provider: CustomConfigurationProvider1): Thenable { return Promise.resolve(); } + updateCustomConfigurations(requestingProvider?: CustomConfigurationProvider1): Thenable { return Promise.resolve(); } + provideCustomConfiguration(document: vscode.TextDocument): Promise { return Promise.resolve(); } + getCustomConfigurationProviderId(): Thenable { return Promise.resolve(undefined); } + getCurrentConfigName(): Thenable { return Promise.resolve(""); } takeOwnership(document: vscode.TextDocument): void {} - runBlockingTask(task: Thenable): Thenable { return; } - runBlockingThenableWithTimeout(thenable: () => Thenable, ms: number, tokenSource?: CancellationTokenSource): Thenable { return; } + queueTask(task: () => Thenable): Thenable { return task(); } + queueTaskWithTimeout(task: () => Thenable, ms: number, tokenSource?: CancellationTokenSource): Thenable { return task(); } requestWhenReady(request: () => Thenable): Thenable { return; } notifyWhenReady(notify: () => void): void {} - sendCustomConfigurations(configs: SourceFileConfigurationItem[]): void {} + sendCustomConfigurations(configs: any): void {} requestGoToDeclaration(): Thenable { return Promise.resolve(); } requestSwitchHeaderSource(rootPath: string, fileName: string): Thenable { return Promise.resolve(""); } requestNavigationList(document: vscode.TextDocument): Thenable { return Promise.resolve(""); } diff --git a/Extension/src/LanguageServer/configurations.ts b/Extension/src/LanguageServer/configurations.ts index 7f06cfb2c..0cd2416c3 100644 --- a/Extension/src/LanguageServer/configurations.ts +++ b/Extension/src/LanguageServer/configurations.ts @@ -12,6 +12,7 @@ import * as telemetry from '../telemetry'; import { PersistentFolderState } from './persistentState'; import { CppSettings } from './settings'; import { ABTestSettings, getABTestSettings } from '../abTesting'; +import { getCustomConfigProviders } from './customProviders'; const configVersion: number = 4; // No properties are set in the config since we want to apply vscode settings first (if applicable). @@ -34,7 +35,7 @@ function getDefaultCppProperties(): ConfigurationJson { }; } -interface ConfigurationJson { +export interface ConfigurationJson { configurations: Configuration[]; env?: {[key: string]: string | string[]}; version: number; @@ -51,6 +52,7 @@ export interface Configuration { intelliSenseMode?: string; compileCommands?: string; forcedInclude?: string[]; + configurationProvider?: string; browse?: Browse; } @@ -109,7 +111,7 @@ export class CppProperties { this.parsePropertiesFile(); } if (!this.configurationJson) { - this.resetToDefaultSettings(this.CurrentConfiguration === -1); + this.resetToDefaultSettings(this.CurrentConfigurationIndex === -1); } this.configFileWatcher = vscode.workspace.createFileSystemWatcher(path.join(this.configFolder, this.configurationGlobPattern)); @@ -138,7 +140,15 @@ export class CppProperties { public get SelectionChanged(): vscode.Event { return this.selectionChanged.event; } public get CompileCommandsChanged(): vscode.Event { return this.compileCommandsChanged.event; } public get Configurations(): Configuration[] { return this.configurationJson.configurations; } - public get CurrentConfiguration(): number { return this.currentConfigurationIndex.Value; } + public get CurrentConfigurationIndex(): number { return this.currentConfigurationIndex.Value; } + public get CurrentConfiguration(): Configuration { return this.Configurations[this.CurrentConfigurationIndex]; } + + public get CurrentConfigurationProvider(): string|null { + if (this.CurrentConfiguration.configurationProvider) { + return this.CurrentConfiguration.configurationProvider; + } + return new CppSettings(this.rootUri).defaultConfigurationProvider; + } public get ConfigurationNames(): string[] { let result: string[] = []; @@ -168,7 +178,7 @@ export class CppProperties { } private onSelectionChanged(): void { - this.selectionChanged.fire(this.CurrentConfiguration); + this.selectionChanged.fire(this.CurrentConfigurationIndex); } private onCompileCommandsChanged(path: string): void { @@ -188,8 +198,8 @@ export class CppProperties { private resetToDefaultSettings(resetIndex: boolean): void { this.configurationJson = getDefaultCppProperties(); - if (resetIndex || this.CurrentConfiguration < 0 || - this.CurrentConfiguration >= this.configurationJson.configurations.length) { + if (resetIndex || this.CurrentConfigurationIndex < 0 || + this.CurrentConfigurationIndex >= this.configurationJson.configurations.length) { this.currentConfigurationIndex.Value = this.getConfigIndexForPlatform(this.configurationJson); } this.configurationIncomplete = true; @@ -197,7 +207,7 @@ export class CppProperties { private applyDefaultIncludePathsAndFrameworks(): void { if (this.configurationIncomplete && this.defaultIncludes && this.defaultFrameworks && this.vcpkgPathReady) { - let configuration: Configuration = this.configurationJson.configurations[this.CurrentConfiguration]; + let configuration: Configuration = this.CurrentConfiguration; let settings: CppSettings = new CppSettings(this.rootUri); // Anything that has a vscode setting for it will be resolved in updateServerOnFolderSettingsChange. @@ -301,23 +311,43 @@ export class CppProperties { this.handleConfigurationEditCommand((document: vscode.TextDocument) => { telemetry.logLanguageServerEvent("addToIncludePath"); this.parsePropertiesFile(); // Clear out any modifications we may have made internally. - let config: Configuration = this.configurationJson.configurations[this.CurrentConfiguration]; + let config: Configuration = this.CurrentConfiguration; if (config.includePath === undefined) { config.includePath = ["${default}"]; } config.includePath.splice(config.includePath.length, 0, path); fs.writeFileSync(this.propertiesFile.fsPath, JSON.stringify(this.configurationJson, null, 4)); - this.updateServerOnFolderSettingsChange(); + this.handleConfigurationChange(); + }); + } + + public addCustomConfigurationProvider(providerId: string): Thenable { + return new Promise((resolve) => { + if (this.propertiesFile) { + this.handleConfigurationEditCommand((document: vscode.TextDocument) => { + this.parsePropertiesFile(); // Clear out any modifications we may have made internally. + let config: Configuration = this.CurrentConfiguration; + config.configurationProvider = providerId; + fs.writeFileSync(this.propertiesFile.fsPath, JSON.stringify(this.configurationJson, null, 4)); + this.handleConfigurationChange(); + resolve(); + }); + } else { + let settings: CppSettings = new CppSettings(this.rootUri); + settings.update("default.configurationProvider", providerId); + this.CurrentConfiguration.configurationProvider = providerId; + resolve(); + } }); } public setCompileCommands(path: string): void { this.handleConfigurationEditCommand((document: vscode.TextDocument) => { this.parsePropertiesFile(); // Clear out any modifications we may have made internally. - let config: Configuration = this.configurationJson.configurations[this.CurrentConfiguration]; + let config: Configuration = this.CurrentConfiguration; config.compileCommands = path; fs.writeFileSync(this.propertiesFile.fsPath, JSON.stringify(this.configurationJson, null, 4)); - this.updateServerOnFolderSettingsChange(); + this.handleConfigurationChange(); }); } @@ -400,6 +430,7 @@ export class CppProperties { configuration.cStandard = this.updateConfiguration(configuration.cStandard, settings.defaultCStandard); configuration.cppStandard = this.updateConfiguration(configuration.cppStandard, settings.defaultCppStandard); configuration.intelliSenseMode = this.updateConfiguration(configuration.intelliSenseMode, settings.defaultIntelliSenseMode); + configuration.configurationProvider = this.updateConfiguration(configuration.configurationProvider, settings.defaultConfigurationProvider); if (!configuration.browse) { configuration.browse = {}; @@ -500,8 +531,8 @@ export class CppProperties { // parsePropertiesFile can fail, but it won't overwrite an existing configurationJson in the event of failure. // this.configurationJson should only be undefined here if we have never successfully parsed the propertiesFile. if (this.configurationJson !== undefined) { - if (this.CurrentConfiguration < 0 || - this.CurrentConfiguration >= this.configurationJson.configurations.length) { + if (this.CurrentConfigurationIndex < 0 || + this.CurrentConfigurationIndex >= this.configurationJson.configurations.length) { // If the index is out of bounds (during initialization or due to removal of configs), fix it. this.currentConfigurationIndex.Value = this.getConfigIndexForPlatform(this.configurationJson); } @@ -529,19 +560,28 @@ export class CppProperties { throw { message: "Invalid configuration file. There must be at least one configuration present in the array." }; } if (!this.configurationIncomplete && this.configurationJson && this.configurationJson.configurations && - this.CurrentConfiguration >= 0 && this.CurrentConfiguration < this.configurationJson.configurations.length) { + this.CurrentConfigurationIndex >= 0 && this.CurrentConfigurationIndex < this.configurationJson.configurations.length) { for (let i: number = 0; i < newJson.configurations.length; i++) { - if (newJson.configurations[i].name === this.configurationJson.configurations[this.CurrentConfiguration].name) { + if (newJson.configurations[i].name === this.configurationJson.configurations[this.CurrentConfigurationIndex].name) { this.currentConfigurationIndex.Value = i; break; } } } this.configurationJson = newJson; - if (this.CurrentConfiguration < 0 || this.CurrentConfiguration >= newJson.configurations.length) { + if (this.CurrentConfigurationIndex < 0 || this.CurrentConfigurationIndex >= newJson.configurations.length) { this.currentConfigurationIndex.Value = this.getConfigIndexForPlatform(newJson); } + let dirty: boolean = false; + for (let i: number = 0; i < this.configurationJson.configurations.length; i++) { + let newId: string = getCustomConfigProviders().checkId(this.configurationJson.configurations[i].configurationProvider); + if (newId !== this.configurationJson.configurations[i].configurationProvider) { + dirty = true; + this.configurationJson.configurations[i].configurationProvider = newId; + } + } + // Remove disallowed variable overrides if (this.configurationJson.env) { delete this.configurationJson.env['workspaceRoot']; @@ -553,7 +593,6 @@ export class CppProperties { // the system includes were available. this.configurationIncomplete = false; - let dirty: boolean = false; if (this.configurationJson.version !== configVersion) { dirty = true; if (this.configurationJson.version === undefined) { diff --git a/Extension/src/LanguageServer/customProviders.ts b/Extension/src/LanguageServer/customProviders.ts new file mode 100644 index 000000000..a731bca4b --- /dev/null +++ b/Extension/src/LanguageServer/customProviders.ts @@ -0,0 +1,185 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ +'use strict'; + +import { CustomConfigurationProvider, Version, SourceFileConfigurationItem } from 'vscode-cpptools'; +import * as vscode from 'vscode'; + +/** + * An interface that is guaranteed to be backward compatible with version 0 + */ +export interface CustomConfigurationProvider1 extends CustomConfigurationProvider { + isValid: boolean; + version: Version; +} + +/** + * Wraps the incoming CustomConfigurationProvider so that we can treat all of them as if they were the same version (e.g. latest) + */ +class CustomProviderWrapper implements CustomConfigurationProvider1 { + private provider: CustomConfigurationProvider; + private _version: Version; + + constructor(provider: CustomConfigurationProvider, version: Version) { + this.provider = provider; + if (provider.extensionId && version === Version.v0) { + version = Version.v1; // provider implemented the new API but is interfacing with the extension using the old API version. + } + this._version = version; + } + + public get isValid(): boolean { + let valid: boolean = true; + if (!this.provider.name || !this.provider.canProvideConfiguration || !this.provider.provideConfigurations) { + valid = false; + } + if (this._version !== Version.v0) { + if (!this.provider.extensionId || !this.provider.dispose) { + valid = false; + } + } + return valid; + } + + public get version(): Version { + return this._version; + } + + public get name(): string { + return this.provider.name; + } + + public get extensionId(): string { + return this._version === Version.v0 ? this.provider.name : this.provider.extensionId; + } + + public canProvideConfiguration(uri: vscode.Uri, token?: vscode.CancellationToken): Thenable { + return this.provider.canProvideConfiguration(uri, token); + } + + public provideConfigurations(uris: vscode.Uri[], token?: vscode.CancellationToken): Thenable { + return this.provider.provideConfigurations(uris, token); + } + + public dispose(): void { + if (this._version !== Version.v0) { + this.provider.dispose(); + } + } +} + +export class CustomConfigurationProviderCollection { + private providers: Map = new Map(); + + private logProblems(provider: CustomConfigurationProvider, version: Version): void { + let missing: string[] = []; + if (!provider.name) { + missing.push("'name'"); + } + if (version !== Version.v0 && !provider.extensionId) { + missing.push("'extensionId'"); + } + if (!provider.canProvideConfiguration) { + missing.push("'canProvideConfiguration'"); + } + if (!provider.provideConfigurations) { + missing.push("'canProvideConfiguration'"); + } + if (version !== Version.v0 && !provider.dispose) { + missing.push("'dispose'"); + } + console.error(`CustomConfigurationProvider was not registered. The following properties are missing from the implementation: ${missing.join(", ")}.`); + } + + private getId(provider: string|CustomConfigurationProvider): string { + if (typeof provider === "string") { + return provider; + } else if (provider.extensionId) { + return provider.extensionId; + } else if (provider.name) { + return provider.name; + } else { + console.error(`invalid provider: ${provider}`); + return ""; + } + } + + public get size(): number { + return this.providers.size; + } + + public add(provider: CustomConfigurationProvider, version: Version): boolean { + let wrapper: CustomProviderWrapper = new CustomProviderWrapper(provider, version); + if (!wrapper.isValid) { + this.logProblems(provider, version); + return false; + } + + let exists: boolean = this.providers.has(wrapper.extensionId); + if (exists) { + let existing: CustomProviderWrapper = this.providers.get(wrapper.extensionId); + exists = (existing.version === Version.v0 && wrapper.version === Version.v0); + } + + if (!exists) { + this.providers.set(wrapper.extensionId, wrapper); + } else { + console.error(`CustomConfigurationProvider '${wrapper.extensionId}' has already been registered.`); + } + return !exists; + } + + public get(provider: string|CustomConfigurationProvider): CustomConfigurationProvider1|null { + let id: string = this.getId(provider); + + if (this.providers.has(id)) { + return this.providers.get(id); + } + return null; + } + + public forEach(func: (provider: CustomConfigurationProvider1) => void): void { + this.providers.forEach(provider => func(provider)); + } + + public remove(provider: CustomConfigurationProvider): void { + let id: string = this.getId(provider); + if (this.providers.has(id)) { + this.providers.delete(id); + } else { + console.warn(`${id} is not registered`); + } + } + + public checkId(providerId?: string): string { + if (!providerId) { + return providerId; + } + let found: CustomConfigurationProvider1[] = []; + let noUpdate: boolean = false; + this.forEach(provider => { + if (provider.extensionId === providerId) { + noUpdate = true; + } else if (provider.name === providerId && provider.version !== Version.v0) { + found.push(provider); + } + }); + if (noUpdate) { + return providerId; + } + if (found.length === 1) { + return found[0].extensionId; + } else if (found.length > 1) { + console.warn("duplicate provider name found. Not upgrading."); + } + return providerId; + } +} + +let providerCollection: CustomConfigurationProviderCollection = new CustomConfigurationProviderCollection(); + +export function getCustomConfigProviders(): CustomConfigurationProviderCollection { + return providerCollection; +} \ No newline at end of file diff --git a/Extension/src/LanguageServer/extension.ts b/Extension/src/LanguageServer/extension.ts index d034209dd..87d4156c2 100644 --- a/Extension/src/LanguageServer/extension.ts +++ b/Extension/src/LanguageServer/extension.ts @@ -6,7 +6,7 @@ import * as path from 'path'; import * as vscode from 'vscode'; -import { CancellationTokenSource } from "vscode-jsonrpc"; +import * as os from 'os'; import * as fs from 'fs'; import * as util from '../common'; import * as telemetry from '../telemetry'; @@ -16,8 +16,7 @@ import { ClientCollection } from './clientCollection'; import { CppSettings } from './settings'; import { PersistentWorkspaceState } from './persistentState'; import { getLanguageConfig } from './languageConfig'; -import { CustomConfigurationProvider, SourceFileConfigurationItem } from '../api'; -import * as os from 'os'; +import { getCustomConfigProviders } from './customProviders'; let prevCrashFile: string; let clients: ClientCollection; @@ -29,7 +28,6 @@ let intervalTimer: NodeJS.Timer; let realActivationOccurred: boolean = false; let tempCommands: vscode.Disposable[] = []; let activatedPreviously: PersistentWorkspaceState; -let customConfigurationProviders: CustomConfigurationProvider[] = []; /** * activate: set up the extension for language services @@ -77,40 +75,6 @@ export function activate(activationEventOccurred: boolean): void { } } -export function registerCustomConfigurationProvider(provider: CustomConfigurationProvider): void { - customConfigurationProviders.push(provider); - - // Request for configurations from the provider only if realActivationOccurred. - // Otherwise, the request will be sent when realActivation is called. - if (realActivationOccurred) { - onDidChangeCustomConfiguration(provider); - } -} - -export async function provideCustomConfiguration(document: vscode.TextDocument, client: Client): Promise { - let tokenSource: CancellationTokenSource = new CancellationTokenSource(); - if (customConfigurationProviders.length === 0) { - return Promise.resolve(); - } - return client.runBlockingThenableWithTimeout(async () => { - // Loop through registered providers until one is able to service the current document - for (let i: number = 0; i < customConfigurationProviders.length; i++) { - if (await customConfigurationProviders[i].canProvideConfiguration(document.uri)) { - return customConfigurationProviders[i].provideConfigurations([document.uri]); - } - } - return Promise.reject("No providers found for " + document.uri); - }, 1000, tokenSource).then((configs: SourceFileConfigurationItem[]) => { - if (configs && configs.length > 0) { - client.sendCustomConfigurations(configs); - } - }); -} - -export function onDidChangeCustomConfiguration(customConfigurationProvider: CustomConfigurationProvider): void { - clients.forEach((client: Client) => client.onDidChangeCustomConfigurations(customConfigurationProvider)); -} - function onDidOpenTextDocument(document: vscode.TextDocument): void { if (document.languageId === "c" || document.languageId === "cpp") { onActivationEvent(); @@ -147,7 +111,9 @@ function realActivation(): void { // There may have already been registered CustomConfigurationProviders. // Request for configurations from those providers. - customConfigurationProviders.forEach(provider => onDidChangeCustomConfiguration(provider)); + clients.forEach(client => { + getCustomConfigProviders().forEach(provider => client.onRegisterCustomConfigurationProvider(provider)); + }); disposables.push(vscode.workspace.onDidChangeConfiguration(onDidChangeSettings)); disposables.push(vscode.workspace.onDidSaveTextDocument(onDidSaveTextDocument)); @@ -548,3 +514,17 @@ export function deactivate(): Thenable { export function isFolderOpen(): boolean { return vscode.workspace.workspaceFolders !== undefined && vscode.workspace.workspaceFolders.length > 0; } + +export function getClients(): ClientCollection { + if (!realActivationOccurred) { + realActivation(); + } + return clients; +} + +export function getActiveClient(): Client { + if (!realActivationOccurred) { + realActivation(); + } + return clients.ActiveClient; +} \ No newline at end of file diff --git a/Extension/src/LanguageServer/protocolFilter.ts b/Extension/src/LanguageServer/protocolFilter.ts index d39816608..70581380b 100644 --- a/Extension/src/LanguageServer/protocolFilter.ts +++ b/Extension/src/LanguageServer/protocolFilter.ts @@ -7,7 +7,6 @@ import { Middleware } from 'vscode-languageclient'; import { ClientCollection } from './clientCollection'; import { Client } from './client'; -import { provideCustomConfiguration } from './extension'; export function createProtocolFilter(me: Client, clients: ClientCollection): Middleware { // Disabling lint for invoke handlers @@ -24,7 +23,7 @@ export function createProtocolFilter(me: Client, clients: ClientCollection): Mid didOpen: (document, sendMessage) => { if (clients.checkOwnership(me, document)) { me.TrackedDocuments.add(document); - provideCustomConfiguration(document, me).then(() => { + me.provideCustomConfiguration(document).then(() => { sendMessage(document); }, () => { sendMessage(document); diff --git a/Extension/src/LanguageServer/settings.ts b/Extension/src/LanguageServer/settings.ts index 766142db6..824c2e93a 100644 --- a/Extension/src/LanguageServer/settings.ts +++ b/Extension/src/LanguageServer/settings.ts @@ -58,6 +58,7 @@ export class CppSettings extends Settings { public get defaultCompilerPath(): string { return super.Section.get("default.compilerPath"); } public get defaultCStandard(): string { return super.Section.get("default.cStandard"); } public get defaultCppStandard(): string { return super.Section.get("default.cppStandard"); } + public get defaultConfigurationProvider(): string { return super.Section.get("default.configurationProvider"); } public get defaultBrowsePath(): string[] { return super.Section.get("default.browse.path"); } public get defaultDatabaseFilename(): string { return super.Section.get("default.browse.databaseFilename"); } public get defaultLimitSymbolsToIncludedHeaders(): boolean { return super.Section.get("default.browse.limitSymbolsToIncludedHeaders"); } diff --git a/Extension/src/api.ts b/Extension/src/api.ts deleted file mode 100644 index 26e9bba9f..000000000 --- a/Extension/src/api.ts +++ /dev/null @@ -1,112 +0,0 @@ -/* -------------------------------------------------------------------------------------------- - * Copyright (c) Microsoft Corporation. All Rights Reserved. - * See 'LICENSE' in the project root for license information. - * ------------------------------------------------------------------------------------------ */ -'use strict'; - -import * as vscode from 'vscode'; -import { CancellationToken } from 'vscode-jsonrpc'; - -/** - * An interface to allow Custom Configuration Provider extensions to communicate with this extension. - */ -export interface CppToolsApi { - /** - * Register the Custom Configuration Provider. - * This must be called as soon as the provider extension is ready. This is necessary for cpptools - * to request configurations from the provider. - * @param provider An instance of the [CustomConfigurationProvider](#CustomConfigurationProvider) - * instance representing the provider extension. - */ - registerCustomConfigurationProvider(provider: CustomConfigurationProvider): void; - - /** - * Notifies cpptools that the current configuration has changed. Upon receiving this notification, - * cpptools will request the new configurations. - * @param provider An instance of the [CustomConfigurationProvider](#CustomConfigurationProvider) - * instance representing the provider extension. - */ - didChangeCustomConfiguration(provider: CustomConfigurationProvider): void; -} - -/** - * An interface to allow this extension to communicate with Custom Configuration Provider extensions. - */ -export interface CustomConfigurationProvider { - /** - * The name of the Custom Configuration Provider extension. - */ - name: string; - - /** - * A request to determine whether this provider can provide IntelliSense configurations for the given document. - * @param uri The URI of the document. - * @param token (optional) The cancellation token. - * @returns 'true' if this provider can provide IntelliSense configurations for the given document. - */ - canProvideConfiguration(uri: vscode.Uri, token?: CancellationToken): Thenable; - - /** - * A request to get Intellisense configurations for the given files. - * @param uris A list of one of more URIs for the files to provide configurations for. - * @param token (optional) The cancellation token. - * @returns A list of [SourceFileConfigurationItem](#SourceFileConfigurationItem) for the documents that this provider - * is able to provide IntelliSense configurations for. - * Note: If this provider cannot provide configurations for a file in `uris`, then the file will not be included - * in the return value. An empty list will be returned if the provider cannot provide configurations for any of the files. - */ - provideConfigurations(uris: vscode.Uri[], token?: CancellationToken): Thenable; -} - -/** - * The model representing the custom IntelliSense configurations for a source file. - */ -export interface SourceFileConfiguration { - /** - * This must also include the system include path (compiler defaults) unless - * [compilerPath](#SourceFileConfiguration.compilerPath) is specified. - */ - includePath: string[]; - - /** - * This must also include the compiler default defines (__cplusplus, etc) unless - * [compilerPath](#SourceFileConfiguration.compilerPath) is specified. - */ - defines: string[]; - - /** - * Currently, "msvc-x64" or "clang-x64". - */ - intelliSenseMode: string; - - /** - * The C or C++ standard. See `package.json` for valid values. - */ - standard: string; - - /** - * Any files that need to be included before the source file is parsed. - */ - forcedInclude?: string[]; - - /** - * The full path to the compiler. If specified, the extension will query it for default includes and defines and - * add them to [includePath](#SourceFileConfiguration.includePath) and [defines](#SourceFileConfiguration.defines). - */ - compilerPath?: string; -} - -/** - * A model representing a source file and its corresponding configuration. - */ -export interface SourceFileConfigurationItem { - /** - * The URI of the source file. - */ - uri: string; - - /** - * The IntelliSense configuration for [uri](#SourceFileConfigurationItem.uri) - */ - configuration: SourceFileConfiguration; -} diff --git a/Extension/src/common.ts b/Extension/src/common.ts index 02cd16393..4d24ec83e 100644 --- a/Extension/src/common.ts +++ b/Extension/src/common.ts @@ -333,10 +333,9 @@ export function readFileText(filePath: string, encoding: string = "utf8"): Promi fs.readFile(filePath, encoding, (err, data) => { if (err) { reject(err); - return; + } else { + resolve(data); } - - resolve(data); }); }); } @@ -347,11 +346,26 @@ export function writeFileText(filePath: string, content: string, encoding: strin fs.writeFile(filePath, content, { encoding }, (err) => { if (err) { reject(err); - return; + } else { + resolve(); } + }); + }); +} +export function deleteFile(filePath: string): Promise { + return new Promise((resolve, reject) => { + if (fs.existsSync(filePath)) { + fs.unlink(filePath, (err) => { + if (err) { + reject(err); + } else { + resolve(); + } + }); + } else { resolve(); - }); + } }); } diff --git a/Extension/src/cppTools.ts b/Extension/src/cppTools.ts index 7ba3787ca..eed2e5ba0 100644 --- a/Extension/src/cppTools.ts +++ b/Extension/src/cppTools.ts @@ -4,15 +4,49 @@ * ------------------------------------------------------------------------------------------ */ 'use strict'; -import { CppToolsApi, CustomConfigurationProvider } from './api'; +import { CustomConfigurationProvider, Version } from 'vscode-cpptools'; +import { CppToolsTestApi, CppToolsTestHook } from 'vscode-cpptools/out/testApi'; +import { CustomConfigurationProvider1, getCustomConfigProviders, CustomConfigurationProviderCollection } from './LanguageServer/customProviders'; import * as LanguageServer from './LanguageServer/extension'; +import * as test from './testHook'; + +export class CppTools implements CppToolsTestApi { + private version: Version; + private providers: CustomConfigurationProvider1[] = []; + + constructor(version: Version) { + this.version = version; + } -export class CppTools implements CppToolsApi { registerCustomConfigurationProvider(provider: CustomConfigurationProvider): void { - LanguageServer.registerCustomConfigurationProvider(provider); + let providers: CustomConfigurationProviderCollection = getCustomConfigProviders(); + if (providers.add(provider, this.version)) { + let added: CustomConfigurationProvider1 = providers.get(provider); + this.providers.push(added); + LanguageServer.getClients().forEach(client => client.onRegisterCustomConfigurationProvider(added)); + } } didChangeCustomConfiguration(provider: CustomConfigurationProvider): void { - LanguageServer.onDidChangeCustomConfiguration(provider); + let providers: CustomConfigurationProviderCollection = getCustomConfigProviders(); + let p: CustomConfigurationProvider1 = providers.get(provider); + + if (p) { + LanguageServer.getClients().forEach(client => client.updateCustomConfigurations(p)); + } else { + console.assert(false, "provider should be registered before sending config change messages"); + } + } + + dispose(): void { + this.providers.forEach(provider => { + getCustomConfigProviders().remove(provider); + provider.dispose(); + }); + this.providers = []; + } + + getTestHook(): CppToolsTestHook { + return test.getTestHook(); } -} \ No newline at end of file +} diff --git a/Extension/src/cppTools1.ts b/Extension/src/cppTools1.ts new file mode 100644 index 000000000..5dc8b664f --- /dev/null +++ b/Extension/src/cppTools1.ts @@ -0,0 +1,56 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ +'use strict'; + +import { CustomConfigurationProvider, Version, CppToolsApi } from 'vscode-cpptools'; +import { CppToolsTestApi, CppToolsTestHook, CppToolsTestExtension } from 'vscode-cpptools/out/testApi'; +import { CppTools } from './cppTools'; + +/** + * This class implements both interfaces since the extension returned CppToolsApi for v0, + * but returns CppToolsTestExtension for v1 and later. + */ +export class CppTools1 implements CppToolsTestApi, CppToolsTestExtension { + private backupApi: CppTools; + + private get BackupApi(): CppToolsTestApi { + if (!this.backupApi) { + this.backupApi = new CppTools(Version.v0); + } + return this.backupApi; + } + + getApi(version: Version): CppToolsApi { + switch (version) { + case Version.v0: + return this.BackupApi; + + case Version.v1: + return new CppTools(version); + + default: + throw new RangeError(`Invalid version: ${version}`); + } + } + + getTestApi(version: Version): CppToolsTestApi { + return this.getApi(version); + } + + registerCustomConfigurationProvider(provider: CustomConfigurationProvider): void { + this.BackupApi.registerCustomConfigurationProvider(provider); + } + + didChangeCustomConfiguration(provider: CustomConfigurationProvider): void { + this.BackupApi.didChangeCustomConfiguration(provider); + } + + dispose(): void { + } + + getTestHook(): CppToolsTestHook { + return this.BackupApi.getTestHook(); + } +} diff --git a/Extension/src/installationInformation.ts b/Extension/src/installationInformation.ts index b8c56a02b..e6d038632 100644 --- a/Extension/src/installationInformation.ts +++ b/Extension/src/installationInformation.ts @@ -3,7 +3,7 @@ * See 'LICENSE' in the project root for license information. * ------------------------------------------------------------------------------------------ */ -export class InstallationInformation { +export class InstallationInformation { stage: string; hasError: boolean; telemetryProperties: { [key: string]: string }; @@ -14,19 +14,15 @@ export class InstallationInformation { } } -let installBlob: InstallationInformation ; +let installBlob: InstallationInformation; -export function initializeInstallationInformation(): void { - installBlob = new InstallationInformation (); -} - -export function getInstallationInformationInstance(): InstallationInformation { +export function getInstallationInformation(): InstallationInformation { + if (!installBlob) { + installBlob = new InstallationInformation(); + } return installBlob; } export function setInstallationStage(stage: string): void { - if (!installBlob) { - initializeInstallationInformation(); - } - installBlob.stage = stage; + getInstallationInformation().stage = stage; } \ No newline at end of file diff --git a/Extension/src/main.ts b/Extension/src/main.ts index 57c6f80af..53ebefe77 100644 --- a/Extension/src/main.ts +++ b/Extension/src/main.ts @@ -13,24 +13,23 @@ import * as Telemetry from './telemetry'; import * as util from './common'; import * as vscode from 'vscode'; +import { CppToolsApi, CppToolsExtension } from 'vscode-cpptools'; import { getTemporaryCommandRegistrarInstance, initializeTemporaryCommandRegistrar } from './commands'; import { PlatformInformation } from './platform'; import { PackageManager, PackageManagerError, PackageManagerWebResponseError, IPackage } from './packageManager'; import { PersistentState } from './LanguageServer/persistentState'; -import { initializeInstallationInformation, getInstallationInformationInstance, InstallationInformation, setInstallationStage } from './installationInformation'; +import { getInstallationInformation, InstallationInformation, setInstallationStage } from './installationInformation'; import { Logger, getOutputChannelLogger, showOutputChannel } from './logger'; -import { CppTools } from './cppTools'; -import { CppToolsApi } from './api'; +import { CppTools1 } from './cppTools1'; const releaseNotesVersion: number = 3; -const cppTools: CppTools = new CppTools(); +const cppTools: CppTools1 = new CppTools1(); -export async function activate(context: vscode.ExtensionContext): Promise { +export async function activate(context: vscode.ExtensionContext): Promise { initializeTemporaryCommandRegistrar(); util.setExtensionContext(context); Telemetry.activate(); util.setProgress(0); - initializeInstallationInformation(); // Initialize the DebuggerExtension and register the related commands and providers. DebuggerExtension.initialize(); @@ -57,6 +56,9 @@ async function processRuntimeDependencies(): Promise { } catch (error) { getOutputChannelLogger().showErrorMessage('The installation of the C/C++ extension failed. Please see the output window for more information.'); showOutputChannel(); + + // Send the failure telemetry since postInstall will not be called. + sendTelemetry(await PlatformInformation.GetPlatformInformation()); } // The extension have been installed and activated before. } else { @@ -68,6 +70,9 @@ async function processRuntimeDependencies(): Promise { await onlineInstallation(); } catch (error) { handleError(error); + + // Send the failure telemetry since postInstall will not be called. + sendTelemetry(await PlatformInformation.GetPlatformInformation()); } } } @@ -173,7 +178,7 @@ function touchInstallLockFile(): Promise { } function handleError(error: any): void { - let installationInformation: InstallationInformation = getInstallationInformationInstance(); + let installationInformation: InstallationInformation = getInstallationInformation(); installationInformation.hasError = true; installationInformation.telemetryProperties['stage'] = installationInformation.stage; let errorMessage: string; @@ -228,7 +233,7 @@ function handleError(error: any): void { } function sendTelemetry(info: PlatformInformation): boolean { - let installBlob: InstallationInformation = getInstallationInformationInstance(); + let installBlob: InstallationInformation = getInstallationInformation(); const success: boolean = !installBlob.hasError; installBlob.telemetryProperties['success'] = success.toString(); @@ -279,9 +284,10 @@ async function finalizeExtensionActivation(): Promise { // Update default for C_Cpp.intelliSenseEngine based on A/B testing settings. // (this may result in rewriting the package.json file) - let abTestSettings: cpptoolsJsonUtils.ABTestSettings = cpptoolsJsonUtils.getABTestSettings(); - let packageJson: any = util.getRawPackageJson(); - if (util.packageJson.extensionLocation && !util.packageJson.extensionLocation.path.includes(".vscode-insiders")) { + let packageJsonPath: string = util.getExtensionFilePath("package.json"); + if (!packageJsonPath.includes(".vscode-insiders")) { + let abTestSettings: cpptoolsJsonUtils.ABTestSettings = cpptoolsJsonUtils.getABTestSettings(); + let packageJson: any = util.getRawPackageJson(); let prevIntelliSenseEngineDefault: any = packageJson.contributes.configuration.properties["C_Cpp.intelliSenseEngine"].default; if (abTestSettings.UseDefaultIntelliSenseEngine) { packageJson.contributes.configuration.properties["C_Cpp.intelliSenseEngine"].default = "Default"; diff --git a/Extension/src/packageManager.ts b/Extension/src/packageManager.ts index d4cde1117..5f636d61f 100644 --- a/Extension/src/packageManager.ts +++ b/Extension/src/packageManager.ts @@ -183,11 +183,10 @@ export class PackageManager { } catch (error) { retryCount += 1; lastError = error; - if (retryCount >= MAX_RETRIES) { + if (retryCount > MAX_RETRIES) { this.AppendChannel(` Failed to download ` + pkg.url); throw error; } else { - // This will skip the success = true. this.AppendChannel(` Failed. Retrying...`); continue; } diff --git a/Extension/src/testHook.ts b/Extension/src/testHook.ts new file mode 100644 index 000000000..f2505da4e --- /dev/null +++ b/Extension/src/testHook.ts @@ -0,0 +1,38 @@ +/* -------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All Rights Reserved. + * See 'LICENSE' in the project root for license information. + * ------------------------------------------------------------------------------------------ */ +'use strict'; + +import { CppToolsTestHook, Status } from 'vscode-cpptools/out/testApi'; +import * as vscode from 'vscode'; + +export class TestHook implements CppToolsTestHook { + private statusChangedEvent: vscode.EventEmitter = new vscode.EventEmitter(); + + public get StatusChanged(): vscode.Event { + return this.statusChangedEvent.event; + } + + public get valid(): boolean { + return !!this.statusChangedEvent; + } + + public updateStatus(status: Status): void { + this.statusChangedEvent.fire(status); + } + + public dispose(): void { + this.statusChangedEvent.dispose(); + this.statusChangedEvent = null; + } +} + +let testHook: TestHook; + +export function getTestHook(): TestHook { + if (!testHook || !testHook.valid) { + testHook = new TestHook(); + } + return testHook; +} \ No newline at end of file diff --git a/Extension/test/integrationTests/languageServer.integration.test.ts b/Extension/test/integrationTests/languageServer.integration.test.ts index 29af501c0..dff333537 100644 --- a/Extension/test/integrationTests/languageServer.integration.test.ts +++ b/Extension/test/integrationTests/languageServer.integration.test.ts @@ -6,11 +6,15 @@ import * as vscode from 'vscode'; import * as assert from 'assert'; import { getLanguageConfigFromPatterns } from '../../src/LanguageServer/languageConfig'; +import * as util from '../../src/common'; +import * as api from 'vscode-cpptools'; +import * as apit from 'vscode-cpptools/out/testApi'; import * as config from '../../src/LanguageServer/configurations'; import { CppSettings } from '../../src/LanguageServer/settings'; +import { getActiveClient } from '../../src/LanguageServer/extension'; -suite("multiline comment setting tests", function() { - suiteSetup(async function() { +suite("multiline comment setting tests", function(): void { + suiteSetup(async function(): Promise { let extension: vscode.Extension = vscode.extensions.getExtension("ms-vscode.cpptools"); if (!extension.isActive) { await extension.activate(); @@ -78,6 +82,168 @@ suite("multiline comment setting tests", function() { }); +function cppPropertiesPath(): string { + return vscode.workspace.workspaceFolders[0].uri.fsPath + "/.vscode/c_cpp_properties.json"; +} + +async function changeCppProperties(cppProperties: config.ConfigurationJson, disposables: vscode.Disposable[]): Promise { + let promise: Promise = new Promise((resolve, reject) => { + disposables.push(getActiveClient().ActiveConfigChanged(name => { + if (name === cppProperties.configurations[0].name) { + resolve(); + } + })); + + // Can't trust the file watcher, so we need to allocate additional time for the backup watcher to fire. + setTimeout(() => { reject(new Error("timeout")); }, 4000); + }); + await util.writeFileText(cppPropertiesPath(), JSON.stringify(cppProperties)); + let contents: string = await util.readFileText(cppPropertiesPath()); + console.log(" wrote c_cpp_properties.json: " + contents); + return promise; +} + +suite("extensibility tests v1", function(): void { + let cpptools: apit.CppToolsTestApi; + let lastResult: api.SourceFileConfigurationItem[]; + let defaultConfig: api.SourceFileConfiguration = { + includePath: [ "${workspaceFolder}" ], + defines: [ "${workspaceFolder}" ], + intelliSenseMode: "msvc-x64", + standard: "c++17" + }; + let provider: api.CustomConfigurationProvider = { + name: "cpptoolsTest-v1", + extensionId: "ms-vscode.cpptools-test", + canProvideConfiguration(document: vscode.Uri): Thenable { + return Promise.resolve(true); + }, + provideConfigurations(uris: vscode.Uri[]): Thenable { + let result: api.SourceFileConfigurationItem[] = []; + uris.forEach(uri => { + result.push({ + uri: uri.toString(), + configuration: defaultConfig + }); + }); + lastResult = result; + return Promise.resolve(result); + }, + dispose(): void { + console.log(" disposed"); + } + }; + let disposables: vscode.Disposable[] = []; + + suiteSetup(async function(): Promise { + cpptools = await apit.getCppToolsTestApi(api.Version.v1); + cpptools.registerCustomConfigurationProvider(provider); + disposables.push(cpptools); + + await changeCppProperties({ + configurations: [ {name: "test1", configurationProvider: provider.extensionId} ], + version: 4 + }, + disposables); + }); + + suiteTeardown(function(): void { + disposables.forEach(d => d.dispose()); + }); + + test("Check provider", async () => { + // Open a c++ file to start the language server. + let path: string = vscode.workspace.workspaceFolders[0].uri.fsPath + "/main.cpp"; + let uri: vscode.Uri = vscode.Uri.file(path); + + let testHook: apit.CppToolsTestHook = cpptools.getTestHook(); + let testResult: any = new Promise((resolve, reject) => { + disposables.push(testHook.StatusChanged(status => { + if (status === apit.Status.IntelliSenseReady) { + let expected: api.SourceFileConfigurationItem[] = [ {uri: uri.toString(), configuration: defaultConfig} ]; + assert.deepEqual(lastResult, expected); + resolve(); + } + })); + setTimeout(() => { reject(new Error("timeout")); }, 2500); + }); + disposables.push(testHook); + + await vscode.workspace.openTextDocument(path); + await testResult; + }); +}); + +suite("extensibility tests v0", function(): void { + let cpptools: apit.CppToolsTestApi; + let lastResult: api.SourceFileConfigurationItem[]; + let defaultConfig: api.SourceFileConfiguration = { + includePath: [ "${workspaceFolder}" ], + defines: [ "${workspaceFolder}" ], + intelliSenseMode: "msvc-x64", + standard: "c++17" + }; + + // Has to be 'any' instead of api.CustomConfigurationProvider because dispose is missing on the old interface version + let provider: any = { + name: "cpptoolsTest-v0", + canProvideConfiguration(document: vscode.Uri): Thenable { + return Promise.resolve(true); + }, + provideConfigurations(uris: vscode.Uri[]): Thenable { + let result: api.SourceFileConfigurationItem[] = []; + uris.forEach(uri => { + result.push({ + uri: uri.toString(), + configuration: defaultConfig + }); + }); + lastResult = result; + return Promise.resolve(result); + } + }; + let disposables: vscode.Disposable[] = []; + + suiteSetup(async function(): Promise { + cpptools = await apit.getCppToolsTestApi(api.Version.v0); + cpptools.registerCustomConfigurationProvider(provider); + disposables.push(cpptools); // This is a no-op for v0, but do it anyway to make sure nothing breaks. + + await changeCppProperties({ + configurations: [ { name: "test2", configurationProvider: provider.name } ], + version: 4 + }, + disposables); + }); + + suiteTeardown(async function(): Promise { + disposables.forEach(d => d.dispose()); + await util.deleteFile(cppPropertiesPath()); + }); + + test("Check provider", async () => { + // Open a C++ file to start the language server. + let path: string = vscode.workspace.workspaceFolders[0].uri.fsPath + "/main2.cpp"; + let uri: vscode.Uri = vscode.Uri.file(path); + + let testHook: apit.CppToolsTestHook = cpptools.getTestHook(); + let testResult: any = new Promise((resolve, reject) => { + disposables.push(testHook.StatusChanged(status => { + if (status === apit.Status.IntelliSenseReady) { + let expected: api.SourceFileConfigurationItem[] = [ {uri: uri.toString(), configuration: defaultConfig} ]; + assert.deepEqual(lastResult, expected); + resolve(); + } + })); + setTimeout(() => { reject(new Error("timeout")); }, 2500); + }); + disposables.push(testHook); + + await vscode.workspace.openTextDocument(path); + await testResult; + }); +}); + /* suite("configuration tests", function() { suiteSetup(async function() { @@ -93,8 +259,6 @@ suite("configuration tests", function() { // Delete c_cpp_properties.json }); - - test("Check default configuration", () => { let rootUri: vscode.Uri; if (vscode.workspace.workspaceFolders && vscode.workspace.workspaceFolders.length > 0) { diff --git a/Extension/test/integrationTests/testAssets/SimpleCppProject/main2.cpp b/Extension/test/integrationTests/testAssets/SimpleCppProject/main2.cpp new file mode 100644 index 000000000..8900abcd8 --- /dev/null +++ b/Extension/test/integrationTests/testAssets/SimpleCppProject/main2.cpp @@ -0,0 +1,3 @@ +int main(int argc, char* arv[]) { + return 0; +} \ No newline at end of file