diff --git a/.travis.yml b/.travis.yml index 1410903bb..54767c33c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,6 +4,7 @@ rvm: - 2.3 - 2.4 - 2.5 + - 2.6 before_install: - gem install ruby-debug-ide diff --git a/appveyor.yml b/appveyor.yml index d368425a0..206d17620 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -27,3 +27,5 @@ environment: - ruby_version: "24-x64" - ruby_version: "25" - ruby_version: "25-x64" + - ruby_version: "26" + - ruby_version: "26-x64" diff --git a/client/package-lock.json b/client/package-lock.json index 00e29e596..6b6182674 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -5,20 +5,22 @@ "requires": true, "dependencies": { "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ansi-cyan": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, "requires": { "ansi-wrap": "0.1.0" } @@ -27,6 +29,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, "requires": { "ansi-wrap": "0.1.0" } @@ -34,12 +37,23 @@ "ansi-wrap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } }, "arr-diff": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, "requires": { "arr-flatten": "^1.0.1", "array-slice": "^0.2.3" @@ -48,27 +62,32 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true }, "arr-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=" + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true }, "array-differ": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true }, "array-slice": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=" + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, "requires": { "array-uniq": "^1.0.1" } @@ -76,53 +95,59 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true }, "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "optional": true, + "dev": true, "requires": { "tweetnacl": "^0.14.3" } @@ -131,6 +156,7 @@ "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, "requires": { "inherits": "~2.0.0" } @@ -139,75 +165,76 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true }, "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true }, "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, "clone": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true }, "clone-buffer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true }, "clone-stats": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true }, "cloneable-readable": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "dev": true, "requires": { "inherits": "^2.0.1", "process-nextick-args": "^2.0.0", "readable-stream": "^2.3.5" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -215,27 +242,47 @@ "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true }, "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -244,6 +291,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -252,29 +300,48 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", + "dev": true, "requires": { "is-obj": "^1.0.0" } }, + "default-shell": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/default-shell/-/default-shell-1.0.1.tgz", + "integrity": "sha1-dSMEvdxhdPSespy5iP7qC4gTyLw=" + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true }, "diff": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==" + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true }, "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -283,12 +350,13 @@ } }, "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "end-of-stream": { @@ -302,12 +370,14 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "event-stream": { "version": "3.3.4", - "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, "requires": { "duplexer": "~0.1.1", "from": "~0", @@ -318,137 +388,116 @@ "through": "~2.3.1" } }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "requires": { - "fill-range": "^2.1.0" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" } }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "extend-shallow": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, "requires": { "kind-of": "^1.1.0" } }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, "requires": { "pend": "~1.2.0" } }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, "requires": { - "for-in": "^1.0.1" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "from": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -456,18 +505,34 @@ "rimraf": "2" } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -477,120 +542,51 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" } }, "glob-stream": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, "requires": { "extend": "^3.0.0", - "glob": "^5.0.3", - "glob-parent": "^3.0.0", - "micromatch": "^2.3.7", - "ordered-read-streams": "^0.3.0", - "through2": "^0.6.0", - "to-absolute-glob": "^0.1.1", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", "unique-stream": "^2.0.2" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } } }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true }, "gulp-chmod": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", + "dev": true, "requires": { "deep-assign": "^1.0.0", "stat-mode": "^0.2.0", @@ -601,6 +597,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", + "dev": true, "requires": { "multimatch": "^2.0.0", "plugin-error": "^0.1.2", @@ -611,6 +608,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz", "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=", + "dev": true, "requires": { "through2": "~0.6.5", "vinyl": "~0.4.6" @@ -619,12 +617,14 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -635,12 +635,14 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true }, "through2": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, "requires": { "readable-stream": ">=1.0.33-1 <1.1.0-0", "xtend": ">=4.0.0 <4.1.0-0" @@ -649,11 +651,12 @@ } }, "gulp-remote-src-vscode": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.0.tgz", - "integrity": "sha512-/9vtSk9eI9DEWCqzGieglPqmx0WUQ9pwPHyHFpKmfxqdgqGJC2l0vFMdYs54hLdDsMDEZFLDL2J4ikjc4hQ5HQ==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.1.tgz", + "integrity": "sha512-mw4OGjtC/jlCWJFhbcAlel4YPvccChlpsl3JceNiB/DLJi24/UPxXt53/N26lgI3dknEqd4ErfdHrO8sJ5bATQ==", + "dev": true, "requires": { - "event-stream": "^3.3.4", + "event-stream": "3.3.4", "node.extend": "^1.1.2", "request": "^2.79.0", "through2": "^2.0.3", @@ -661,19 +664,22 @@ }, "dependencies": { "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true }, "clone-stats": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true }, "vinyl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, "requires": { "clone": "^2.1.1", "clone-buffer": "^1.0.0", @@ -685,55 +691,11 @@ } } }, - "gulp-sourcemaps": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", - "requires": { - "convert-source-map": "^1.1.1", - "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulp-symdest": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz", - "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=", - "requires": { - "event-stream": "^3.3.1", - "mkdirp": "^0.5.1", - "queue": "^3.1.0", - "vinyl-fs": "^2.4.3" - } - }, "gulp-untar": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.7.tgz", "integrity": "sha512-0QfbCH2a1k2qkTLWPqTX+QO4qNsHn3kC546YhAP3/n0h+nvtyGITDuDrYBMDZeW4WnFijmkOvBWa5HshTic1tw==", + "dev": true, "requires": { "event-stream": "~3.3.4", "streamifier": "~0.1.1", @@ -745,17 +707,20 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true }, "replace-ext": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true }, "vinyl": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, "requires": { "clone": "^1.0.0", "clone-stats": "^0.0.1", @@ -765,41 +730,37 @@ } }, "gulp-vinyl-zip": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz", - "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.2.tgz", + "integrity": "sha512-wJn09jsb8PyvUeyFF7y7ImEJqJwYy40BqL9GKfJs6UGpaGW9A+N68Q+ajsIpb9AeR6lAdjMbIdDPclIGo1/b7Q==", + "dev": true, "requires": { - "event-stream": "^3.3.1", + "event-stream": "3.3.4", "queue": "^4.2.1", "through2": "^2.0.3", "vinyl": "^2.0.2", - "vinyl-fs": "^2.0.0", + "vinyl-fs": "^3.0.3", "yauzl": "^2.2.1", "yazl": "^2.2.1" }, "dependencies": { "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true }, "clone-stats": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" - }, - "queue": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-4.4.2.tgz", - "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==", - "requires": { - "inherits": "~2.0.0" - } + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true }, "vinyl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, "requires": { "clone": "^2.1.1", "clone-buffer": "^1.0.0", @@ -814,31 +775,51 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, "requires": { - "ajv": "^5.1.0", + "ajv": "^6.5.5", "har-schema": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -849,6 +830,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -857,81 +839,66 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "is": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", + "dev": true }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, "requires": { - "is-primitive": "^2.0.0" + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, "is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, "requires": { "is-extglob": "^2.1.0" } }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } }, "is-stream": { "version": "1.1.0", @@ -941,74 +908,88 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true }, "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true + "dev": true }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, - "json-stable-stringify": { + "json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "~0.0.0" - } + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -1019,107 +1000,53 @@ "kind-of": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true }, "lazystream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, "requires": { "readable-stream": "^2.0.5" } }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "requires": { + "flush-write-stream": "^1.0.2" + } }, "map-stream": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "requires": { - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true }, "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", + "dev": true }, "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "dev": true, "requires": { - "mime-db": "~1.33.0" + "mime-db": "~1.38.0" } }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1127,12 +1054,14 @@ "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true }, "mkdirp": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, "requires": { "minimist": "0.0.8" } @@ -1141,6 +1070,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, "requires": { "browser-stdout": "1.3.0", "commander": "2.11.0", @@ -1152,17 +1082,35 @@ "he": "1.1.1", "mkdirp": "0.5.1", "supports-color": "4.4.0" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "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" + } + } } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "multimatch": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, "requires": { "array-differ": "^1.0.0", "array-union": "^1.0.1", @@ -1170,39 +1118,69 @@ "minimatch": "^3.0.0" } }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, "node.extend": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", - "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.8.tgz", + "integrity": "sha512-L/dvEBwyg3UowwqOUTyDsGBU6kjBQOpOhshio9V3i3BMPv5YUb9+mWNN8MK0IbWqT0AqaTSONZf0aTuMMahWgA==", + "dev": true, "requires": { - "is": "^3.1.0" + "has": "^1.0.3", + "is": "^3.2.1" } }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, "requires": { "remove-trailing-separator": "^1.0.1" } }, + "now-and-later": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz", + "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + } + }, "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "object-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", + "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", + "dev": true }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, "once": { @@ -1214,54 +1192,41 @@ } }, "ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, "requires": { - "is-stream": "^1.0.1", "readable-stream": "^2.0.1" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "pause-stream": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, "requires": { "through": "~2.3" } @@ -1269,17 +1234,20 @@ "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true }, "plugin-error": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, "requires": { "ansi-cyan": "^0.1.1", "ansi-red": "^0.1.1", @@ -1288,65 +1256,82 @@ "extend-shallow": "^1.1.2" } }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" - }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true }, "querystringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", - "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", + "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", + "dev": true }, "queue": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", - "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/queue/-/queue-4.5.1.tgz", + "integrity": "sha512-AMD7w5hRXcFSb8s9u38acBZ+309u6GsiibP4/0YacJeaurRshogB7v/ZcVPxP5gD5+zIw6ixRHdutiYUJfwKHw==", + "dev": true, "requires": { "inherits": "~2.0.0" } }, - "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -1357,98 +1342,137 @@ "util-deprecate": "~1.0.1" } }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, "requires": { - "is-equal-shallow": "^0.1.3" + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" } }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true }, "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true }, "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, "requires": { "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", + "aws4": "^1.8.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "uuid": "^3.3.2" } }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" } }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true }, "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -1458,14 +1482,16 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, "requires": { "through": "2" } }, "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -1481,12 +1507,14 @@ "stat-mode": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=" + "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", + "dev": true }, "stream-combiner": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, "requires": { "duplexer": "~0.1.1" } @@ -1494,12 +1522,14 @@ "stream-shift": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true }, "streamfilter": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", + "dev": true, "requires": { "readable-stream": "^2.0.2" } @@ -1507,37 +1537,28 @@ "streamifier": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", - "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=" + "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=", + "dev": true }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-bom-stream": { + "strip-eof": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "requires": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" - } + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, "requires": { "has-flag": "^2.0.0" } @@ -1546,6 +1567,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, "requires": { "block-stream": "*", "fstream": "^1.0.2", @@ -1555,56 +1577,71 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, "requires": { - "readable-stream": "^2.1.5", + "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, "requires": { "through2": "~2.0.0", "xtend": "~4.0.0" } }, "to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, "requires": { - "extend-shallow": "^2.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" + } + }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "requires": { + "through2": "^2.0.3" } }, "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, "requires": { + "psl": "^1.1.24", "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } } }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -1613,21 +1650,38 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true + "dev": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true }, "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, "requires": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" + "punycode": "^2.1.0" } }, "url-parse": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.1.tgz", - "integrity": "sha512-x95Td74QcvICAA0+qERaVkRpTGKyBHHYdwL2LXZm5t/gBtCB9KQSO/0zQgSTYEV1p0WcvSg79TLNPSvd5IDJMQ==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", + "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", + "dev": true, "requires": { "querystringify": "^2.0.0", "requires-port": "^1.0.0" @@ -1636,22 +1690,26 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=" + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -1662,53 +1720,61 @@ "version": "0.4.6", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, "requires": { "clone": "^0.2.0", "clone-stats": "^0.0.1" } }, "vinyl-fs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, "requires": { - "duplexify": "^3.2.0", - "glob-stream": "^5.3.2", + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", "graceful-fs": "^4.0.0", - "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "^0.3.0", + "is-valid-glob": "^1.0.0", "lazystream": "^1.0.0", - "lodash.isequal": "^4.0.0", - "merge-stream": "^1.0.0", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.0", - "readable-stream": "^2.0.4", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", "through2": "^2.0.0", - "through2-filter": "^2.0.0", - "vali-date": "^1.0.0", - "vinyl": "^1.0.0" + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" }, "dependencies": { "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true }, "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" } } } @@ -1717,58 +1783,112 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", + "dev": true, "requires": { "through2": "^2.0.3", "vinyl": "^0.4.3" } }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, "vscode": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.18.tgz", - "integrity": "sha512-SyDw4qFwZ+WthZX7RWp71PNiWLF7VhpM65j2oryY/6jtSORd8qH6J8vclwWZJ6Jvu0EH7JamO2RWNfBfsMR9Zw==", + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.29.tgz", + "integrity": "sha512-E6hzqGtCD65BnBxdZzSIi8FPCM4seEEK/bbTeYdJntg+4D5R6GLbdYFySE9DNTtMJF4iB9UGoucKU/p8Guts1g==", + "dev": true, "requires": { "glob": "^7.1.2", "gulp-chmod": "^2.0.0", "gulp-filter": "^5.0.1", "gulp-gunzip": "1.0.0", - "gulp-remote-src-vscode": "^0.5.0", - "gulp-symdest": "^1.1.0", + "gulp-remote-src-vscode": "^0.5.1", "gulp-untar": "^0.0.7", - "gulp-vinyl-zip": "^2.1.0", + "gulp-vinyl-zip": "^2.1.2", "mocha": "^4.0.1", - "request": "^2.83.0", + "request": "^2.88.0", "semver": "^5.4.1", "source-map-support": "^0.5.0", - "url-parse": "^1.1.9", + "url-parse": "^1.4.3", + "vinyl-fs": "^3.0.3", "vinyl-source-stream": "^1.1.0" } }, "vscode-jsonrpc": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-3.6.2.tgz", - "integrity": "sha512-T24Jb5V48e4VgYliUXMnZ379ItbrXgOimweKaJshD84z+8q7ZOZjJan0MeDe+Ugb+uqERDVV8SBmemaGMSMugA==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", + "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" }, "vscode-languageclient": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-4.4.0.tgz", - "integrity": "sha512-sXBwIcwG4W5MjnDAfXf0hM5ErOcXxEBlix6QJb5ijf0gtecYygrMAqv8hag7sEg/jCCOKQdXJ4K1iZL3GZcJZg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-5.1.1.tgz", + "integrity": "sha512-jMxshi+BPRQFNG8GB00dJv7ldqMda0be26laYYll/udtJuHbog6RqK10GSxHWDN0PgY0b0m5fePyTk3bq8a0TA==", "requires": { - "vscode-languageserver-protocol": "^3.10.0" + "semver": "^5.5.0", + "vscode-languageserver-protocol": "3.13.0" } }, "vscode-languageserver-protocol": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.10.0.tgz", - "integrity": "sha512-PNNmKM0IcQPRiY1oUIxfwseBvxS5Sa5aZUpTcq/qsXWclnl8FFNs8oCCoAtyLhBXnuJvybWUNafiA78y0unJDA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.13.0.tgz", + "integrity": "sha512-2ZGKwI+P2ovQll2PGAp+2UfJH+FK9eait86VBUdkPd9HRlm8e58aYT9pV/NYanHOcp3pL6x2yTLVCFMcTer0mg==", "requires": { - "vscode-jsonrpc": "^3.6.2", - "vscode-languageserver-types": "^3.10.0" + "vscode-jsonrpc": "^4.0.0", + "vscode-languageserver-types": "3.13.0" } }, "vscode-languageserver-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.10.0.tgz", - "integrity": "sha512-vxmCsVZGwq8X40SuLP8Ix7V0rq5V/7iQUjRVe2Oxm+TbmjxtjK4dpHHXQCUawjA4fhPA9FwjSRbDhbvQmYCfMw==" + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.13.0.tgz", + "integrity": "sha512-BnJIxS+5+8UWiNKCP7W3g9FlE7fErFw0ofP5BXJe7c2tl0VeWh+nNHFbwAS2vmVC4a5kYxHBjRy0UeOtziemVA==" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } }, "wrappy": { "version": "1.0.2", @@ -1778,21 +1898,24 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, "requires": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "yazl": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz", - "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, "requires": { "buffer-crc32": "~0.2.3" } diff --git a/client/package.json b/client/package.json index 28d3623fc..9de0c5013 100644 --- a/client/package.json +++ b/client/package.json @@ -1,20 +1,24 @@ { - "name": "vscode-ruby-client", - "version": "1.0.0", - "description": "Language server client for vscode-ruby", - "repository": "https://github.com/rubyide/vscode-ruby", - "author": "Stafford Brunk ", - "license": "MIT", - "engines": { - "vscode": "^1.25.0" - }, - "private": false, - "main": "out/extension.js", - "dependencies": { - "vscode": "^1.1.18", - "vscode-languageclient": "^4.4.0" - }, - "scripts": { - "postinstall": "vscode-install" - } + "name": "vscode-ruby-client", + "version": "1.0.0", + "description": "Language server client for vscode-ruby", + "repository": "https://github.com/rubyide/vscode-ruby", + "author": "Stafford Brunk ", + "license": "MIT", + "engines": { + "vscode": "^1.25.0" + }, + "private": false, + "main": "out/extension.js", + "dependencies": { + "default-shell": "^1.0.1", + "execa": "^1.0.0", + "vscode-languageclient": "^5.1.1" + }, + "devDependencies": { + "vscode": "^1.1.29" + }, + "scripts": { + "postinstall": "vscode-install" + } } diff --git a/client/src/WorkspaceRubyEnvironment.ts b/client/src/WorkspaceRubyEnvironment.ts new file mode 100644 index 000000000..e43fa145a --- /dev/null +++ b/client/src/WorkspaceRubyEnvironment.ts @@ -0,0 +1,62 @@ +import { + ClientCapabilities, + LanguageClient, + RequestType, + StaticFeature, +} from 'vscode-languageclient'; +import { Uri, workspace, WorkspaceFolder } from 'vscode'; +import { loadEnv, RubyEnvironment } from './util/env'; + +interface WorkspaceRubyEnvironmentParams { + readonly folders: string[]; +} + +interface WorkspaceRubyEnvironmentResult { + [key: string]: RubyEnvironment; +} + +namespace WorkspaceRubyEnvironmentRequest { + export const type = new RequestType< + WorkspaceRubyEnvironmentParams, + WorkspaceRubyEnvironmentResult, + void, + true + >('workspace/rubyEnvironment'); +} + +type WorkspaceRubyEnvironmentCapability = { + workspace?: { + rubyEnvironment?: boolean; + }; +}; + +type ClientCapabilitiesWithRubyEnvironment = ClientCapabilities & + WorkspaceRubyEnvironmentCapability; + +export class WorkspaceRubyEnvironmentFeature implements StaticFeature { + constructor(private client: LanguageClient) {} + + public fillClientCapabilities(capabilities: ClientCapabilitiesWithRubyEnvironment): void { + capabilities.workspace = capabilities.workspace || {}; + capabilities.workspace!.rubyEnvironment = true; + } + + public initialize(): void { + this.client.onRequest( + WorkspaceRubyEnvironmentRequest.type, + async (params: WorkspaceRubyEnvironmentParams): Promise => { + const environments: WorkspaceRubyEnvironmentResult = {}; + + for (const uri of params.folders) { + const workspaceFolder: WorkspaceFolder = workspace.getWorkspaceFolder(Uri.parse(uri)); + + if (workspaceFolder && workspaceFolder.uri.fsPath) { + environments[uri] = await loadEnv(workspaceFolder.uri.fsPath); + } + } + + return environments; + } + ); + } +} diff --git a/client/src/extension.ts b/client/src/extension.ts index f3963a237..5396cc86d 100644 --- a/client/src/extension.ts +++ b/client/src/extension.ts @@ -1,15 +1,22 @@ /** * LSP client for vscode-ruby */ -import * as path from 'path'; +import path from 'path'; -import { ExtensionContext, workspace } from 'vscode'; +import { ExtensionContext, window, workspace, WorkspaceFolder } from 'vscode'; import { + ConfigurationParams, + CancellationToken, LanguageClient, LanguageClientOptions, ServerOptions, TransportKind, + WorkspaceMiddleware, } from 'vscode-languageclient'; +import { WorkspaceRubyEnvironmentFeature } from './WorkspaceRubyEnvironment'; + +const RUBOCOP_ABSOLUTE_PATH_KEYS = ['only', 'except', 'require']; +let client: LanguageClient; export function activate(context: ExtensionContext): void { const serverModule: string = context.asAbsolutePath(path.join('server', 'out', 'index.js')); @@ -31,21 +38,81 @@ export function activate(context: ExtensionContext): void { const clientOptions: LanguageClientOptions = { documentSelector: rubyDocumentSelector, synchronize: { - configurationSection: 'ruby', - // Notify the server about file changes to '.clientrc files contain in the workspace - fileEvents: workspace.createFileSystemWatcher('**/.clientrc'), + // Notify server of changes to .ruby-version or .rvmrc files + fileEvents: workspace.createFileSystemWatcher('**/{.ruby-version,.rvmrc}'), + }, + outputChannel: window.createOutputChannel('Ruby Language Server'), + middleware: { + workspace: { + configuration: ( + params: ConfigurationParams, + token: CancellationToken, + next: Function + ): any[] => { + if (!params.items) { + return []; + } + let result = next(params, token, next); + let settings = result[0]; + let scopeUri = ''; + + for (let item of params.items) { + if (!item.scopeUri) { + continue; + } else { + scopeUri = item.scopeUri; + } + } + let resource = client.protocol2CodeConverter.asUri(scopeUri); + let workspaceFolder = workspace.getWorkspaceFolder(resource); + if (workspaceFolder) { + // Convert any relative paths to absolute paths + if ( + settings.lint && + settings.lint.rubocop && + typeof settings.lint.rubocop === 'object' + ) { + const { + lint: { rubocop }, + } = settings; + for (const key of RUBOCOP_ABSOLUTE_PATH_KEYS) { + if (rubocop[key]) { + rubocop[key] = rubocop[key].map(f => convertAbsolute(f, workspaceFolder)); + } + } + } + + // Save the file's workspace folder + const protocolUri = client.code2ProtocolConverter.asUri(workspaceFolder.uri); + settings.workspaceFolderUri = protocolUri; + } + return result; + }, + } as WorkspaceMiddleware, }, }; // Create the language client and start the client. - const client: LanguageClient = new LanguageClient('ruby', 'Ruby', serverOptions, clientOptions); + client = new LanguageClient('ruby', 'Ruby', serverOptions, clientOptions); client.registerProposedFeatures(); + client.registerFeature(new WorkspaceRubyEnvironmentFeature(client)); // Push the disposable to the context's subscriptions so that the // client can be deactivated on extension deactivation context.subscriptions.push(client.start()); } -export function deactivate(): void { - return undefined; +export function deactivate(): Thenable { + return client ? client.stop() : undefined; +} + +function convertAbsolute(file: string, folder: WorkspaceFolder): string { + if (path.isAbsolute(file)) { + return file; + } + let folderPath = folder.uri.fsPath; + if (!folderPath) { + return file; + } + return path.join(folderPath, file); } diff --git a/client/src/util/env.ts b/client/src/util/env.ts new file mode 100644 index 000000000..7fcce05c3 --- /dev/null +++ b/client/src/util/env.ts @@ -0,0 +1,77 @@ +import execa from 'execa'; +import defaultShell from 'default-shell'; +import fs from 'fs'; +import path from 'path'; + +const SHIM_DIR = path.resolve(__dirname, 'shims'); +if (!fs.existsSync(SHIM_DIR)) { + fs.mkdirSync(SHIM_DIR); +} + +const RUBY_ENVIRONMENT_VARIABLES = [ + 'PATH', + 'RUBY_VERSION', + 'RUBY_ROOT', + 'GEM_HOME', + 'GEM_PATH', + 'GEM_ROOT', +]; + +function mkShim(shell: string, shimPath: string): boolean { + const template = `#!/usr/bin/env ${shell} -i\nexport`; + let result = false; + + try { + fs.writeFileSync(shimPath, template); + fs.chmodSync(shimPath, 0o744); + result = true; + } catch (e) { + console.log(e); + } + + return result; +} + +function getShim(shell): string { + const shellName = path.basename(shell); + const shimPath = path.join(SHIM_DIR, `env.${shell}`); + if (!fs.existsSync(shimPath)) { + mkShim(shellName, shimPath); + } + + return shimPath; +} + +export type RubyEnvironment = { + PATH: string; + RUBY_VERSION: string; + RUBY_ROOT: string; + GEM_HOME: string; + GEM_PATH: string; + GEM_ROOT: string; + RUBOCOP_OPTS?: string; +}; + +export interface IEnvironment { + [key: string]: string; +} + +export function loadEnv(cwd: string): RubyEnvironment { + const shellName: string = path.basename(defaultShell); + const env: IEnvironment = {}; + const shim: string = getShim(shellName); + const { stdout, stderr } = execa.sync(shim, [], { + cwd, + }); + + console.error(stderr); + + for (const envVar of stdout.split('\n')) { + const result: string[] = envVar.split('=', 2); + if (RUBY_ENVIRONMENT_VARIABLES.indexOf(result[0]) >= 0) { + env[result[0]] = result[1]; + } + } + + return env as RubyEnvironment; +} diff --git a/client/tsconfig.json b/client/tsconfig.json index 5a46f64e9..353ca1605 100644 --- a/client/tsconfig.json +++ b/client/tsconfig.json @@ -5,7 +5,6 @@ "target": "es6", "outDir": "out", "rootDir": "src", - "lib": [ "es6" ] }, "include": [ "src" @@ -13,4 +12,4 @@ "exclude": [ "node_modules" ] -} \ No newline at end of file +} diff --git a/package-lock.json b/package-lock.json index fa27a20af..06a5cb4dd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ruby", - "version": "0.21.1", + "version": "0.22.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -16,21 +16,28 @@ "integrity": "sha512-f9XXUWFqryzjkZA1EqFvJHSFyqyasV17fq8zCDIzbRV4ctL7RrJGKvG+lcex86Rjbzd1GrER9h9VmF5sSjV0BQ==", "dev": true }, + "@types/xmldom": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/@types/xmldom/-/xmldom-0.1.29.tgz", + "integrity": "sha1-xEKLDKhtO4gUdXJv2UmAs4onw4E=" + }, "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.1.tgz", + "integrity": "sha512-XDN92U311aINL77ieWHmqCcNlwjoP5cHXDxIxbf2MaPYuCXOHS7gHH8jktxeK5omgd52XbSTX6a4Piwd1pQmzA==", + "dev": true, "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", + "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, "ansi-cyan": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, "requires": { "ansi-wrap": "0.1.0" } @@ -48,6 +55,7 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, "requires": { "ansi-wrap": "0.1.0" } @@ -67,7 +75,17 @@ "ansi-wrap": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=" + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "append-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", + "integrity": "sha1-2CIM9GYIFSXv6lBhTz3mUU36WPE=", + "dev": true, + "requires": { + "buffer-equal": "^1.0.0" + } }, "argparse": { "version": "1.0.10", @@ -82,6 +100,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, "requires": { "arr-flatten": "^1.0.1", "array-slice": "^0.2.3" @@ -90,27 +109,32 @@ "arr-flatten": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true }, "arr-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", - "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=" + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true }, "array-differ": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=" + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true }, "array-slice": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", - "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=" + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, "requires": { "array-uniq": "^1.0.1" } @@ -118,27 +142,29 @@ "array-uniq": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true }, "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } }, "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true }, "async": { "version": "2.6.1", @@ -151,17 +177,20 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true }, "aws4": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", - "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true }, "babel-code-frame": { "version": "6.26.0", @@ -183,7 +212,7 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "optional": true, + "dev": true, "requires": { "tweetnacl": "^0.14.3" } @@ -192,6 +221,7 @@ "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, "requires": { "inherits": "~2.0.0" } @@ -205,30 +235,29 @@ "concat-map": "0.0.1" } }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" - } - }, "browser-stdout": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=" + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.0.tgz", + "integrity": "sha1-WWFrSYME1Var1GaWayLu2j7KX74=", + "dev": true }, "buffer-from": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.0.tgz", - "integrity": "sha512-c5mRlguI/Pe2dSZmpER62rSCu0ryKmWddzRYsuXc50U2/g8jMOulc31VZMa4mYx31U5xsmSOpDCgH88Vl9cDGQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "dev": true }, "builtin-modules": { "version": "1.1.1", @@ -239,7 +268,8 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true }, "chalk": { "version": "1.1.3", @@ -265,33 +295,32 @@ "clone": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", - "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=" + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true }, "clone-buffer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=" + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true }, "clone-stats": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", - "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=" + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true }, "cloneable-readable": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz", "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==", + "dev": true, "requires": { "inherits": "^2.0.1", "process-nextick-args": "^2.0.0", "readable-stream": "^2.3.5" } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, "coffee-script": { "version": "1.12.7", "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", @@ -320,9 +349,10 @@ "dev": true }, "combined-stream": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", - "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz", + "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==", + "dev": true, "requires": { "delayed-stream": "~1.0.0" } @@ -330,7 +360,8 @@ "commander": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==" + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true }, "concat-map": { "version": "0.0.1", @@ -338,14 +369,19 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=" + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true }, "cson-parser": { "version": "2.0.1", @@ -360,6 +396,7 @@ "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -368,6 +405,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, "requires": { "ms": "2.0.0" } @@ -376,29 +414,67 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", + "dev": true, "requires": { "is-obj": "^1.0.0" } }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true }, "diff": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==" + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "doctrine": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", + "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", + "dev": true, + "requires": { + "esutils": "^1.1.6", + "isarray": "0.0.1" + }, + "dependencies": { + "esutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", + "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", - "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true }, "duplexify": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", - "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, "requires": { "end-of-stream": "^1.0.0", "inherits": "^2.0.1", @@ -407,18 +483,20 @@ } }, "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "dev": true, "requires": { - "jsbn": "~0.1.0" + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" } }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, "requires": { "once": "^1.4.0" } @@ -426,7 +504,8 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true }, "esprima": { "version": "4.0.0", @@ -442,8 +521,9 @@ }, "event-stream": { "version": "3.3.4", - "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, "requires": { "duplexer": "~0.1.1", "from": "~0", @@ -454,54 +534,26 @@ "through": "~2.3.1" } }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "requires": { - "is-posix-bracket": "^0.1.0" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "requires": { - "fill-range": "^2.1.0" - } - }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true }, "extend-shallow": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, "requires": { "kind-of": "^1.1.0" } }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "requires": { - "is-extglob": "^1.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - } - } - }, "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true }, "fancy-log": { "version": "1.3.2", @@ -515,87 +567,80 @@ } }, "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", + "dev": true }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "dev": true, "requires": { "pend": "~1.2.0" } }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" - }, - "fill-range": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", - "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", - "requires": { - "is-number": "^2.1.0", - "isobject": "^2.0.0", - "randomatic": "^3.0.0", - "repeat-element": "^1.1.2", - "repeat-string": "^1.5.2" - } - }, - "first-chunk-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", - "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=" - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, "requires": { - "for-in": "^1.0.1" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true }, "form-data": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", - "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, "requires": { "asynckit": "^0.4.0", - "combined-stream": "1.0.6", + "combined-stream": "^1.0.6", "mime-types": "^2.1.12" } }, "from": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=" + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "fs-mkdirp-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", + "integrity": "sha1-C3gV/DIBxqaeFNuYzgmMFpNSWes=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "through2": "^2.0.3" + } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true }, "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, "requires": { "graceful-fs": "^4.1.2", "inherits": "~2.0.0", @@ -603,10 +648,17 @@ "rimraf": "2" } }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, "requires": { "assert-plus": "^1.0.0" } @@ -615,6 +667,7 @@ "version": "7.1.2", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -624,120 +677,51 @@ "path-is-absolute": "^1.0.0" } }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "requires": { - "glob-parent": "^2.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "requires": { - "is-glob": "^2.0.0" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, "requires": { "is-glob": "^3.1.0", "path-dirname": "^1.0.0" } }, "glob-stream": { - "version": "5.3.5", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", - "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", + "dev": true, "requires": { "extend": "^3.0.0", - "glob": "^5.0.3", - "glob-parent": "^3.0.0", - "micromatch": "^2.3.7", - "ordered-read-streams": "^0.3.0", - "through2": "^0.6.0", - "to-absolute-glob": "^0.1.1", + "glob": "^7.1.1", + "glob-parent": "^3.1.0", + "is-negated-glob": "^1.0.0", + "ordered-read-streams": "^1.0.0", + "pumpify": "^1.3.5", + "readable-stream": "^2.1.5", + "remove-trailing-separator": "^1.0.1", + "to-absolute-glob": "^2.0.0", "unique-stream": "^2.0.2" - }, - "dependencies": { - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "requires": { - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "2 || 3", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", - "requires": { - "readable-stream": ">=1.0.33-1 <1.1.0-0", - "xtend": ">=4.0.0 <4.1.0-0" - } - } } }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + "version": "4.1.15", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", + "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", + "dev": true }, "growl": { "version": "1.10.3", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==" + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true }, "gulp-chmod": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", + "dev": true, "requires": { "deep-assign": "^1.0.0", "stat-mode": "^0.2.0", @@ -748,6 +732,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", + "dev": true, "requires": { "multimatch": "^2.0.0", "plugin-error": "^0.1.2", @@ -758,6 +743,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz", "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=", + "dev": true, "requires": { "through2": "~0.6.5", "vinyl": "~0.4.6" @@ -766,12 +752,14 @@ "isarray": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.1", @@ -782,12 +770,14 @@ "string_decoder": { "version": "0.10.31", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true }, "through2": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, "requires": { "readable-stream": ">=1.0.33-1 <1.1.0-0", "xtend": ">=4.0.0 <4.1.0-0" @@ -796,11 +786,12 @@ } }, "gulp-remote-src-vscode": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.0.tgz", - "integrity": "sha512-/9vtSk9eI9DEWCqzGieglPqmx0WUQ9pwPHyHFpKmfxqdgqGJC2l0vFMdYs54hLdDsMDEZFLDL2J4ikjc4hQ5HQ==", + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.1.tgz", + "integrity": "sha512-mw4OGjtC/jlCWJFhbcAlel4YPvccChlpsl3JceNiB/DLJi24/UPxXt53/N26lgI3dknEqd4ErfdHrO8sJ5bATQ==", + "dev": true, "requires": { - "event-stream": "^3.3.4", + "event-stream": "3.3.4", "node.extend": "^1.1.2", "request": "^2.79.0", "through2": "^2.0.3", @@ -808,19 +799,22 @@ }, "dependencies": { "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true }, "clone-stats": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true }, "vinyl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, "requires": { "clone": "^2.1.1", "clone-buffer": "^1.0.0", @@ -832,55 +826,11 @@ } } }, - "gulp-sourcemaps": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", - "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", - "requires": { - "convert-source-map": "^1.1.1", - "graceful-fs": "^4.1.2", - "strip-bom": "^2.0.0", - "through2": "^2.0.0", - "vinyl": "^1.0.0" - }, - "dependencies": { - "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" - }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" - }, - "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", - "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" - } - } - } - }, - "gulp-symdest": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz", - "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=", - "requires": { - "event-stream": "^3.3.1", - "mkdirp": "^0.5.1", - "queue": "^3.1.0", - "vinyl-fs": "^2.4.3" - } - }, "gulp-untar": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.7.tgz", "integrity": "sha512-0QfbCH2a1k2qkTLWPqTX+QO4qNsHn3kC546YhAP3/n0h+nvtyGITDuDrYBMDZeW4WnFijmkOvBWa5HshTic1tw==", + "dev": true, "requires": { "event-stream": "~3.3.4", "streamifier": "~0.1.1", @@ -892,17 +842,20 @@ "clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true }, "replace-ext": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true }, "vinyl": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, "requires": { "clone": "^1.0.0", "clone-stats": "^0.0.1", @@ -912,41 +865,37 @@ } }, "gulp-vinyl-zip": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz", - "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.2.tgz", + "integrity": "sha512-wJn09jsb8PyvUeyFF7y7ImEJqJwYy40BqL9GKfJs6UGpaGW9A+N68Q+ajsIpb9AeR6lAdjMbIdDPclIGo1/b7Q==", + "dev": true, "requires": { - "event-stream": "^3.3.1", + "event-stream": "3.3.4", "queue": "^4.2.1", "through2": "^2.0.3", "vinyl": "^2.0.2", - "vinyl-fs": "^2.0.0", + "vinyl-fs": "^3.0.3", "yauzl": "^2.2.1", "yazl": "^2.2.1" }, "dependencies": { "clone": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", - "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true }, "clone-stats": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=" - }, - "queue": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/queue/-/queue-4.4.2.tgz", - "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==", - "requires": { - "inherits": "~2.0.0" - } + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true }, "vinyl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, "requires": { "clone": "^2.1.1", "clone-buffer": "^1.0.0", @@ -961,17 +910,28 @@ "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true }, "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "dev": true, "requires": { - "ajv": "^5.1.0", + "ajv": "^6.5.5", "har-schema": "^2.0.0" } }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, "has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -984,17 +944,26 @@ "has-flag": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "has-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", + "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", + "dev": true }, "he": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=" + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true }, "http-signature": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "jsprim": "^1.2.2", @@ -1005,6 +974,7 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -1013,119 +983,111 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true }, "is": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", - "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=" - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", + "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==", + "dev": true }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, "requires": { - "is-primitive": "^2.0.0" + "is-relative": "^1.0.0", + "is-windows": "^1.0.1" } }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true }, "is-glob": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, "requires": { "is-extglob": "^2.1.0" } }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } + "is-negated-glob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", + "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", + "dev": true }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=" - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "^1.0.0" + } }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "^0.1.2" + } }, "is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true }, "is-valid-glob": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", - "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", + "integrity": "sha1-Kb8+/3Ab4tTTFdusw5vDn+j2Aao=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "requires": { - "isarray": "1.0.0" - } + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true }, "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true }, "jade": { "version": "0.26.3", @@ -1171,40 +1133,37 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true + "dev": true }, "json-schema": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, - "json-stable-stringify": { + "json-stable-stringify-without-jsonify": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "~0.0.0" - } + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, "requires": { "assert-plus": "1.0.0", "extsprintf": "1.3.0", @@ -1215,112 +1174,57 @@ "kind-of": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", - "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=" + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true }, "lazystream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, "requires": { "readable-stream": "^2.0.5" } }, + "lead": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", + "integrity": "sha1-bxT5mje+Op3XhPVJVpDlkDRm7kI=", + "dev": true, + "requires": { + "flush-write-stream": "^1.0.2" + } + }, "lodash": { "version": "4.17.10", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==" }, - "lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=" - }, "lru-cache": { "version": "2.7.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", "dev": true }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=" - }, - "math-random": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", - "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=" - }, - "merge-stream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", - "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", - "requires": { - "readable-stream": "^2.0.1" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "requires": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" - }, - "dependencies": { - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "requires": { - "arr-flatten": "^1.0.1" - } - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, "mime-db": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", - "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", + "dev": true }, "mime-types": { - "version": "2.1.18", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", - "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", + "dev": true, "requires": { - "mime-db": "~1.33.0" + "mime-db": "~1.38.0" } }, "minimatch": { @@ -1432,12 +1336,14 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true }, "multimatch": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, "requires": { "array-differ": "^1.0.0", "array-union": "^1.0.1", @@ -1446,92 +1352,86 @@ } }, "node.extend": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", - "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.8.tgz", + "integrity": "sha512-L/dvEBwyg3UowwqOUTyDsGBU6kjBQOpOhshio9V3i3BMPv5YUb9+mWNN8MK0IbWqT0AqaTSONZf0aTuMMahWgA==", + "dev": true, "requires": { - "is": "^3.1.0" + "has": "^1.0.3", + "is": "^3.2.1" } }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, "requires": { "remove-trailing-separator": "^1.0.1" } }, + "now-and-later": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.0.tgz", + "integrity": "sha1-vGHLtFbXnLMiB85HygUTb/Ln1u4=", + "dev": true, + "requires": { + "once": "^1.3.2" + } + }, "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + "object-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", + "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", + "dev": true }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, "requires": { - "for-own": "^0.1.4", - "is-extendable": "^0.1.1" + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, "requires": { "wrappy": "1" } }, "ordered-read-streams": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", - "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", + "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", + "dev": true, "requires": { - "is-stream": "^1.0.1", "readable-stream": "^2.0.1" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "requires": { - "glob-base": "^0.3.0", - "is-dotfile": "^1.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.0" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "requires": { - "is-extglob": "^1.0.0" - } - } - } - }, "path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true }, "path-parse": { "version": "1.0.5", @@ -1543,6 +1443,7 @@ "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, "requires": { "through": "~2.3" } @@ -1550,17 +1451,20 @@ "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", - "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true }, "plugin-error": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, "requires": { "ansi-cyan": "^0.1.1", "ansi-red": "^0.1.1", @@ -1569,11 +1473,6 @@ "extend-shallow": "^1.1.2" } }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" - }, "prettier": { "version": "1.13.7", "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.13.7.tgz", @@ -1583,57 +1482,68 @@ "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==" + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "psl": { + "version": "1.1.31", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.31.tgz", + "integrity": "sha512-/6pt4+C+T+wZUieKR620OpzN/LlnNKuWjy1iFLQ/UG35JqHlR/89MP1d96dUfkf6Dne3TuLQzOYEYshJ+Hx8mw==", + "dev": true + }, + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + } }, "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true }, "querystringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz", - "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", + "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", + "dev": true }, "queue": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", - "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/queue/-/queue-4.5.1.tgz", + "integrity": "sha512-AMD7w5hRXcFSb8s9u38acBZ+309u6GsiibP4/0YacJeaurRshogB7v/ZcVPxP5gD5+zIw6ixRHdutiYUJfwKHw==", + "dev": true, "requires": { "inherits": "~2.0.0" } }, - "randomatic": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.0.0.tgz", - "integrity": "sha512-VdxFOIEY3mNO5PtSRkkle/hPJDHvQhK21oa73K4yAc9qmp6N429gAyF1gZMOTMeS0/AYzaV/2Trcef+NaIonSA==", - "requires": { - "is-number": "^4.0.0", - "kind-of": "^6.0.0", - "math-random": "^1.0.1" - }, - "dependencies": { - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==" - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==" - } - } - }, "readable-stream": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -1644,65 +1554,72 @@ "util-deprecate": "~1.0.1" } }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "remove-bom-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", + "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", + "dev": true, + "requires": { + "is-buffer": "^1.1.5", + "is-utf8": "^0.2.1" + } + }, + "remove-bom-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", + "integrity": "sha1-BfGlk/FuQuH7kOv1nejlaVJflSM=", + "dev": true, "requires": { - "is-equal-shallow": "^0.1.3" + "remove-bom-buffer": "^3.0.0", + "safe-buffer": "^5.1.0", + "through2": "^2.0.3" } }, "remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true }, "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", - "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=" + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true }, "request": { - "version": "2.87.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", - "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, "requires": { "aws-sign2": "~0.7.0", - "aws4": "^1.6.0", + "aws4": "^1.8.0", "caseless": "~0.12.0", - "combined-stream": "~1.0.5", - "extend": "~3.0.1", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", "forever-agent": "~0.6.1", - "form-data": "~2.3.1", - "har-validator": "~5.0.3", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.17", - "oauth-sign": "~0.8.2", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", "performance-now": "^2.1.0", - "qs": "~6.5.1", - "safe-buffer": "^5.1.1", - "tough-cookie": "~2.3.3", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", - "uuid": "^3.1.0" + "uuid": "^3.3.2" } }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true }, "resolve": { "version": "1.8.1", @@ -1713,12 +1630,38 @@ "path-parse": "^1.0.5" } }, + "resolve-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", + "integrity": "sha1-MrueOcBtZzONyTeMDW1gdFZq0TE=", + "dev": true, + "requires": { + "value-or-function": "^3.0.0" + } + }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, "requires": { - "glob": "^7.0.5" + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } } }, "ruby-method-locate": { @@ -1740,17 +1683,20 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true }, "semver": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", - "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true }, "sigmund": { "version": "1.0.1", @@ -1761,12 +1707,14 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true }, "source-map-support": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.6.tgz", - "integrity": "sha512-N4KXEz7jcKqPf2b2vZF11lQIz9W5ZMuUcIOGj243lduidkf2fjkVKJS9vNxVWn3u/uxX38AcE8U9nnH9FPcq+g==", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", + "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", + "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -1776,6 +1724,7 @@ "version": "0.3.3", "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, "requires": { "through": "2" } @@ -1787,9 +1736,10 @@ "dev": true }, "sshpk": { - "version": "1.14.2", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz", - "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "dev": true, "requires": { "asn1": "~0.2.3", "assert-plus": "^1.0.0", @@ -1805,12 +1755,14 @@ "stat-mode": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", - "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=" + "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", + "dev": true }, "stream-combiner": { "version": "0.0.4", "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, "requires": { "duplexer": "~0.1.1" } @@ -1818,12 +1770,14 @@ "stream-shift": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true }, "streamfilter": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", + "dev": true, "requires": { "readable-stream": "^2.0.2" } @@ -1831,12 +1785,14 @@ "streamifier": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", - "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=" + "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=", + "dev": true }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -1850,27 +1806,11 @@ "ansi-regex": "^2.0.0" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "requires": { - "is-utf8": "^0.2.0" - } - }, - "strip-bom-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", - "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", - "requires": { - "first-chunk-stream": "^1.0.0", - "strip-bom": "^2.0.0" - } - }, "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, "requires": { "has-flag": "^2.0.0" } @@ -1879,6 +1819,7 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, "requires": { "block-stream": "*", "fstream": "^1.0.2", @@ -1888,21 +1829,24 @@ "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true }, "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, "requires": { - "readable-stream": "^2.1.5", + "readable-stream": "~2.3.6", "xtend": "~4.0.1" } }, "through2-filter": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", - "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", + "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", + "dev": true, "requires": { "through2": "~2.0.0", "xtend": "~4.0.0" @@ -1915,21 +1859,13 @@ "dev": true }, "to-absolute-glob": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", - "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", + "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", + "dev": true, "requires": { - "extend-shallow": "^2.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "requires": { - "is-extendable": "^0.1.0" - } - } + "is-absolute": "^1.0.0", + "is-negated-glob": "^1.0.0" } }, "to-iso-string": { @@ -1938,12 +1874,31 @@ "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", "dev": true }, + "to-through": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", + "integrity": "sha1-/JKtq6ByZHvAtn1rA2ZKoZUJOvY=", + "dev": true, + "requires": { + "through2": "^2.0.3" + } + }, "tough-cookie": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", - "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, "requires": { + "psl": "^1.1.24", "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } } }, "tslib": { @@ -2021,15 +1976,49 @@ "integrity": "sha512-assE77K7K8Q9j8CVIHiU3d1uoKc8N5v7UPpkQ9IE8BEPWkvSYR37lDuYekDlAMFqR1IpD6CrS+uOJLl6pw7Wdw==", "dev": true }, - "tslint-microsoft-contrib": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.0.3.tgz", - "integrity": "sha512-5AnfTGlfpUzpRHLmoojPBKFTTmbjnwgdaTHMdllausa4GBPya5u36i9ddrTX4PhetGZvd4JUYIpAmgHqVnsctg==", + "tslint-config-standard": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/tslint-config-standard/-/tslint-config-standard-8.0.1.tgz", + "integrity": "sha512-OWG+NblgjQlVuUS/Dmq3ax2v5QDZwRx4L0kEuDi7qFY9UI6RJhhNfoCV1qI4el8Fw1c5a5BTrjQJP0/jhGXY/Q==", "dev": true, "requires": { - "tsutils": "^2.12.1" + "tslint-eslint-rules": "^5.3.1" + } + }, + "tslint-eslint-rules": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-5.4.0.tgz", + "integrity": "sha512-WlSXE+J2vY/VPgIcqQuijMQiel+UtmXS+4nvK4ZzlDiqBfXse8FAvkNnTcYhnQyOTW5KFM+uRRGXxYhFpuBc6w==", + "dev": true, + "requires": { + "doctrine": "0.7.2", + "tslib": "1.9.0", + "tsutils": "^3.0.0" + }, + "dependencies": { + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", + "dev": true + }, + "tsutils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.0.0.tgz", + "integrity": "sha512-LjHBWR0vWAUHWdIAoTjoqi56Kz+FDKBgVEuL+gVPG/Pv7QW5IdaDDeK9Txlr6U0Cmckp5EgCIq1T25qe3J6hyw==", + "dev": true, + "requires": { + "tslib": "^1.8.1" + } + } } }, + "tslint-no-circular-imports": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/tslint-no-circular-imports/-/tslint-no-circular-imports-0.6.1.tgz", + "integrity": "sha512-XuRgHZKFu6dv7fm/tuilmvynLHgtCTd63/p3744dYVEpnMExp2Jd9IwTiBOGmy5bUDlpTy117vtBcLd028RsBA==", + "dev": true + }, "tsutils": { "version": "2.27.1", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.27.1.tgz", @@ -2043,6 +2032,7 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, "requires": { "safe-buffer": "^5.0.1" } @@ -2051,7 +2041,7 @@ "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true + "dev": true }, "typescript": { "version": "2.9.2", @@ -2059,19 +2049,36 @@ "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==", "dev": true }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, "unique-stream": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", - "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", + "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", + "dev": true, + "requires": { + "json-stable-stringify-without-jsonify": "^1.0.1", + "through2-filter": "^3.0.0" + } + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "dev": true, "requires": { - "json-stable-stringify": "^1.0.0", - "through2-filter": "^2.0.0" + "punycode": "^2.1.0" } }, "url-parse": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.1.tgz", - "integrity": "sha512-x95Td74QcvICAA0+qERaVkRpTGKyBHHYdwL2LXZm5t/gBtCB9KQSO/0zQgSTYEV1p0WcvSg79TLNPSvd5IDJMQ==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.4.tgz", + "integrity": "sha512-/92DTTorg4JjktLNLe6GPS2/RvAd/RGr6LuktmWSMLEOa6rjnlrFXNgSbSmkNvCoL2T028A0a1JaJLzRMlFoHg==", + "dev": true, "requires": { "querystringify": "^2.0.0", "requires-port": "^1.0.0" @@ -2080,22 +2087,26 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true }, "uuid": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", - "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true }, - "vali-date": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", - "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=" + "value-or-function": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", + "integrity": "sha1-HCQ6ULWVwb5Up1S/7OhWO5/42BM=", + "dev": true }, "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -2106,53 +2117,61 @@ "version": "0.4.6", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, "requires": { "clone": "^0.2.0", "clone-stats": "^0.0.1" } }, "vinyl-fs": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", - "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", + "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", + "dev": true, "requires": { - "duplexify": "^3.2.0", - "glob-stream": "^5.3.2", + "fs-mkdirp-stream": "^1.0.0", + "glob-stream": "^6.1.0", "graceful-fs": "^4.0.0", - "gulp-sourcemaps": "1.6.0", - "is-valid-glob": "^0.3.0", + "is-valid-glob": "^1.0.0", "lazystream": "^1.0.0", - "lodash.isequal": "^4.0.0", - "merge-stream": "^1.0.0", - "mkdirp": "^0.5.0", - "object-assign": "^4.0.0", - "readable-stream": "^2.0.4", - "strip-bom": "^2.0.0", - "strip-bom-stream": "^1.0.0", + "lead": "^1.0.0", + "object.assign": "^4.0.4", + "pumpify": "^1.3.5", + "readable-stream": "^2.3.3", + "remove-bom-buffer": "^3.0.0", + "remove-bom-stream": "^1.2.0", + "resolve-options": "^1.1.0", "through2": "^2.0.0", - "through2-filter": "^2.0.0", - "vali-date": "^1.0.0", - "vinyl": "^1.0.0" + "to-through": "^2.0.0", + "value-or-function": "^3.0.0", + "vinyl": "^2.0.0", + "vinyl-sourcemap": "^1.1.0" }, "dependencies": { "clone": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true }, - "replace-ext": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", - "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=" + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true }, "vinyl": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", - "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, "requires": { - "clone": "^1.0.0", - "clone-stats": "^0.0.1", - "replace-ext": "0.0.1" + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" } } } @@ -2161,29 +2180,74 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", + "dev": true, "requires": { "through2": "^2.0.3", "vinyl": "^0.4.3" } }, + "vinyl-sourcemap": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", + "integrity": "sha1-kqgAWTo4cDqM2xHYswCtS+Y7PhY=", + "dev": true, + "requires": { + "append-buffer": "^1.0.2", + "convert-source-map": "^1.5.0", + "graceful-fs": "^4.1.6", + "normalize-path": "^2.1.1", + "now-and-later": "^2.0.0", + "remove-bom-buffer": "^3.0.0", + "vinyl": "^2.0.0" + }, + "dependencies": { + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "vinyl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz", + "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "clone-buffer": "^1.0.0", + "clone-stats": "^1.0.0", + "cloneable-readable": "^1.0.0", + "remove-trailing-separator": "^1.0.1", + "replace-ext": "^1.0.0" + } + } + } + }, "vscode": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.18.tgz", - "integrity": "sha512-SyDw4qFwZ+WthZX7RWp71PNiWLF7VhpM65j2oryY/6jtSORd8qH6J8vclwWZJ6Jvu0EH7JamO2RWNfBfsMR9Zw==", + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.29.tgz", + "integrity": "sha512-E6hzqGtCD65BnBxdZzSIi8FPCM4seEEK/bbTeYdJntg+4D5R6GLbdYFySE9DNTtMJF4iB9UGoucKU/p8Guts1g==", + "dev": true, "requires": { "glob": "^7.1.2", "gulp-chmod": "^2.0.0", "gulp-filter": "^5.0.1", "gulp-gunzip": "1.0.0", - "gulp-remote-src-vscode": "^0.5.0", - "gulp-symdest": "^1.1.0", + "gulp-remote-src-vscode": "^0.5.1", "gulp-untar": "^0.0.7", - "gulp-vinyl-zip": "^2.1.0", + "gulp-vinyl-zip": "^2.1.2", "mocha": "^4.0.1", - "request": "^2.83.0", + "request": "^2.88.0", "semver": "^5.4.1", "source-map-support": "^0.5.0", - "url-parse": "^1.1.9", + "url-parse": "^1.4.3", + "vinyl-fs": "^3.0.3", "vinyl-source-stream": "^1.1.0" }, "dependencies": { @@ -2191,6 +2255,7 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, "requires": { "browser-stdout": "1.3.0", "commander": "2.11.0", @@ -2239,7 +2304,8 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true }, "xmldom": { "version": "0.1.27", @@ -2249,21 +2315,24 @@ "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true }, "yauzl": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dev": true, "requires": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" } }, "yazl": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz", - "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.5.1.tgz", + "integrity": "sha512-phENi2PLiHnHb6QBVot+dJnaAZ0xosj7p3fWl+znIjBDlnMI2PsZCJZ306BPTFOaHf5qdDEI8x5qFrSOBN5vrw==", + "dev": true, "requires": { "buffer-crc32": "~0.2.3" } diff --git a/package.json b/package.json index be5d082c6..559b53b07 100644 --- a/package.json +++ b/package.json @@ -1,621 +1,693 @@ { - "name": "ruby", - "displayName": "Ruby", - "version": "0.21.1", - "publisher": "rebornix", - "description": "Provides Ruby language and debugging support for Visual Studio Code", - "author": { - "name": "Stafford Brunk" - }, - "contributors": [ - { - "name": "Peng Lyu", - "url": "https://github.com/rebornix" - }, - { - "name": "Bryan Hoekstra", - "url": "https://github.com/HookyQR" - }, - { - "name": "Drew Cain", - "url": "https://github.com/groksrc" - }, - { - "name": "Lex Li", - "url": "https://github.com/lextm" - }, - { - "name": "Stafford Brunk", - "url": "https://github.com/wingrunr21" - } - ], - "engines": { - "vscode": "^1.25.0" - }, - "license": "MIT", - "icon": "images/ruby.png", - "categories": [ - "Languages", - "Debuggers", - "Linters", - "Snippets", - "Formatters" - ], - "private": false, - "repository": { - "type": "git", - "url": "https://github.com/rubyide/vscode-ruby.git" - }, - "bugs": { - "url": "https://github.com/rubyide/vscode-ruby/issues" - }, - "dependencies": { - "async": "^2.3.0", - "lodash": "^4.17.3", - "minimatch": "^3.0.3", - "ruby-method-locate": "*", - "vscode": "^1.1.4", - "vscode-debugadapter": "^1.19.0", - "vscode-debugprotocol": "^1.19.0", - "xmldom": "^0.1.19" - }, - "devDependencies": { - "@types/mocha": "^2.2.33", - "@types/node": "^6.0.50", - "cson-parser": "^2.0.1", - "mocha": "^2.4.5", - "prettier": "^1.11.1", - "run-sequence": "*", - "tslint": "^5.9.1", - "tslint-config-prettier": "^1.10.0", - "tslint-microsoft-contrib": "^5.0.3", - "typescript": "^2.9.2", - "vscode-debugadapter-testsupport": "^1.19.0" - }, - "scripts": { - "vscode:prepublish": "npm run clean:server && npm run compile", - "clean:server": "cd server && npm run remove-binaries", - "compile:legacy": "rm -rf out && tsc -p ./src", - "compile:client": "rm -rf ./client/out && tsc -p ./client/tsconfig.json", - "compile:server": "rm -rf ./server/out && tsc -p ./server/tsconfig.json", - "watch": "tsc -w -p ./src", - "watch:client": "tsc -w -p ./client/tsconfig.json", - "watch:server": "tsc -w -p ./server/tsconfig.json", - "compile": "npm run compile:legacy && npm run compile:client && npm run compile:server", - "test": "node ./node_modules/mocha/bin/mocha --recursive ./out/*.test.js", - "test-debugger": "node ./node_modules/mocha/bin/mocha --timeout 15000 -u tdd ./out/debugger/tests/*.js", - "postinstall": "node ./node_modules/vscode/bin/install", - "update-all-grammars": "node scripts/update-all-grammars", - "update-grammar": "node scripts/update-grammar atom/language-ruby", - "lint": "tslint -c tslint.json 'src/**/*.ts'" - }, - "activationEvents": [ - "onLanguage:ruby", - "onLanguage:erb", - "onCommand:workbench.action.tasks.runTask" - ], - "main": "./out/ruby.js", - "contributes": { - "snippets": [ - { - "language": "ruby", - "path": "./snippets/ruby.json" - }, - { - "language": "erb", - "path": "./snippets/erb.json" - } - ], - "commands": [ - { - "command": "ruby.reloadProject", - "title": "Ruby: Reload Project" - } - ], - "configuration": { - "title": "Ruby configuration", - "properties": { - "ruby.locate": { - "type": "object", - "description": "Defines where the Ruby extension will look to find Modules, Classes and methods.", - "default": { - "exclude": "{**/@(test|spec|tmp|.*),**/@(test|spec|tmp|.*)/**,**/*_spec.rb}", - "include": "**/*.rb" - }, - "properties": { - "include": { - "type": "string", - "description": "glob pattern to select files to parse. Matches are performed against the path relative to the workspace root", - "default": "**/*.rb" - }, - "exclude": { - "type": "string", - "description": "glob pattern to select files to ignore, this is also run against paths for exclusion from walking. Matches are performed against the path relative to the workspace root", - "default": "{**/@(test|spec|tmp|.*),**/@(test|spec|tmp|.*)/**,**/*_spec.rb}" - } - } - }, - "ruby.interpreter.commandPath": { - "type": "string", - "default": "ruby", - "description": "Path to the Ruby interpreter. Set this to an absolute path to select from multiple installed Ruby versions.", - "isExecutable": true - }, - "ruby.useLanguageServer": { - "type": "boolean", - "default": false, - "description": "Use built-in language server" - }, - "ruby.codeCompletion": { - "type": [ - "boolean", - "string" - ], - "enum": [ - false, - "rcodetools" - ], - "default": false, - "description": "Method to use for code completion. Use `false` to disable or if another extension provides this feature." - }, - "ruby.intellisense": { - "type": [ - "boolean", - "string" - ], - "enum": [ - false, - "rubyLocate" - ], - "default": false, - "description": "Method to use for intellisense (go to definition, etc.). Use `false` to disable or if another extension provides this feature." - }, - "ruby.useBundler": { - "type": "boolean", - "default": false, - "description": "Whether ruby tools should be started using Bundler" - }, - "ruby.pathToBundler": { - "type": "string", - "default": "bundle", - "description": "Path to the bundler executable (used if useBundler is true)" - }, - "ruby.rctComplete.commandPath": { - "type": "string", - "default": "rct-complete", - "description": "Path to the rct-complete command. Set this to an absolute path to select from multiple installed Ruby versions.", - "isExecutable": true - }, - "ruby.lintDebounceTime": { - "type": "integer", - "default": 500, - "description": "Time (ms) to wait after keypress before running enabled linters. Ensures linters are only run when typing has finished and not for every keypress" - }, - "ruby.lint": { - "type": "object", - "description": "Set individual ruby linters to use", - "properties": { - "ruby": { - "type": [ - "boolean", - "object" - ], - "default": false, - "description": "Use ruby -wc to lint" - }, - "debride": { - "type": [ - "boolean", - "object" - ], - "default": false, - "properties": { - "rails": { - "type": "boolean", - "default": "true", - "description": "Add some rails call conversions" - } - }, - "description": "Use debride to lint" - }, - "fasterer": { - "type": "boolean", - "default": false, - "description": "Use fasterer to lint" - }, - "reek": { - "type": "boolean", - "default": false, - "description": "Use reek to lint" - }, - "rubocop": { - "type": [ - "boolean", - "object" - ], - "default": false, - "description": "Use RuboCop to lint", - "properties": { - "lint": { - "type": "boolean", - "default": false, - "description": "Enable Lint cops: Lint cops check for possible errors and very bad practices in your code. RuboCop implements in a portable way all built-in MRI lint checks (ruby -wc) and adds a lot of extra lint checks of its own." - }, - "only": { - "type": "array", - "description": "Run only the specified cop(s) and/or cops in the specified departments", - "items": { - "type": "string" - } - }, - "except": { - "type": "array", - "description": "Run all cops enabled by configuration except the specified cop(s) and/or departments", - "items": { - "type": "string" - } - }, - "require": { - "type": "array", - "description": "Require Ruby files", - "items": { - "type": "string" - } - }, - "rails": { - "type": "boolean", - "default": false, - "description": "Rails cops are specific to the Ruby on Rails framework" - } - } - }, - "ruby-lint": { - "type": [ - "boolean", - "object" - ], - "default": false, - "description": "Use ruby-lint to lint", - "properties": { - "levels": { - "type": "array", - "description": "Level of offenses to show", - "items": { - "type": "string", - "enum": [ - "error", - "warning", - "info" - ] - } - }, - "classes": { - "type": "array", - "description": "Classes of offenses to show", - "items": { - "type": "string", - "enum": [ - "argument_amount", - "loop_keywords", - "pedantics", - "shadowing_variables", - "undefined_methods", - "undefined_variables", - "unused_variables", - "useless_equality_checks" - ] - } - } - } - } - } - }, - "ruby.format": { - "type": [ - "boolean", - "string" - ], - "enum": [ - false, - "rubocop" - ], - "default": false, - "description": "Which system to use for formatting. Use `false` to disable or if another extension provides this feature." - } - } - }, - "languages": [ - { - "id": "ruby", - "aliases": [ - "Ruby", - "ruby" - ], - "firstLine": "^#!\\s*/.*(?:ruby|rbx|rake)\\b", - "extensions": [ - ".arb", - ".builder", - ".cgi", - ".fcgi", - ".gemspec", - ".god", - ".irbrc", - ".jbuilder", - ".mspec", - ".pluginspec", - ".podspec", - ".prawn", - ".pryrc", - ".rabl", - ".rake", - ".rb", - ".rbuild", - ".rbw", - ".rbx", - ".rjs", - ".ru", - ".ruby", - ".spec", - ".thor", - ".watchr" - ], - "filenames": [ - "appfile", - "appraisals", - "berksfile", - "brewfile", - "capfile", - "deliverfile", - "fastfile", - "guardfile", - "podfile", - "puppetfile", - "rakefile", - "snapfile", - "thorfile", - "vagrantfile", - "dangerfile" - ], - "configuration": "./language-configuration-ruby.json" - }, - { - "id": "erb", - "aliases": [ - "erb", - "Encapsulated Ruby" - ], - "extensions": [ - ".erb", - ".rhtml", - ".rhtm" - ], - "configuration": "./language-configuration-erb.json" - }, - { - "id": "gemfile", - "aliases": [ - "Gemfile", - "Bundler", - "bundler" - ], - "filenames": [ - "Gemfile" - ], - "configuration": "./language-configuration-ruby.json" - } - ], - "grammars": [ - { - "language": "ruby", - "scopeName": "source.ruby", - "path": "./syntaxes/ruby.cson.json" - }, - { - "language": "erb", - "scopeName": "text.html.erb", - "path": "./syntaxes/erb.cson.json", - "embeddedLanguages": { - "source.css": "css", - "source.js": "javascript", - "source.ruby": "ruby" - } - }, - { - "language": "gemfile", - "scopeName": "source.ruby.gemfile", - "path": "./syntaxes/gemfile.cson.json" - } - ], - "debuggers": [ - { - "type": "Ruby", - "label": "Ruby", - "enableBreakpointsFor": { - "languageIds": [ - "ruby", - "erb" - ] - }, - "program": "./out/debugger/main.js", - "runtime": "node", - "configurationSnippets": [ - { - "label": "Ruby: Debug Local File", - "body": { - "name": "Debug Local File", - "type": "Ruby", - "request": "launch", - "program": "^\"\\${workspaceRoot}/main.rb\"" - } - }, - { - "label": "Ruby: Listen for rdebug-ide", - "body": { - "name": "Listen for rdebug-ide", - "type": "Ruby", - "request": "attach", - "remoteHost": "127.0.0.1", - "remotePort": "1234", - "remoteWorkspaceRoot": "^\"\\${workspaceRoot}\"" - } - }, - { - "label": "Ruby: Rails server", - "body": { - "name": "Rails server", - "type": "Ruby", - "request": "launch", - "program": "^\"\\${workspaceRoot}/bin/rails\"", - "args": [ - "server" - ] - } - }, - { - "label": "Ruby: RSpec - all", - "body": { - "name": "RSpec - all", - "type": "Ruby", - "request": "launch", - "program": "^\"\\${workspaceRoot}/bin/rspec\"", - "args": [ - "-I", - "^\"\\${workspaceRoot}\"" - ] - } - }, - { - "label": "Ruby: RSpec - active spec file only", - "body": { - "name": "RSpec - active spec file only", - "type": "Ruby", - "request": "launch", - "program": "^\"\\${workspaceRoot}/bin/rspec\"", - "args": [ - "-I", - "^\"\\${workspaceRoot}\"", - "^\"\\${file}\"" - ] - } - }, - { - "label": "Ruby: Cucumber", - "body": { - "name": "Cucumber", - "type": "Ruby", - "request": "launch", - "program": "^\"\\${workspaceRoot}/bin/cucumber\"" - } - } - ], - "configurationAttributes": { - "launch": { - "required": [ - "program" - ], - "properties": { - "program": { - "type": "string", - "description": "Absolute path to the program.", - "default": "${workspaceRoot}/main.rb" - }, - "stopOnEntry": { - "type": "boolean", - "description": "Automatically stop after launch.", - "default": true - }, - "showDebuggerOutput": { - "type": "boolean", - "description": "Show output of the debugger in the console.", - "default": false - }, - "args": { - "type": "array", - "description": "Command line arguments passed to the program.", - "items": { - "type": "string" - }, - "default": [] - }, - "env": { - "type": "object", - "description": "Additional environment variables to pass to the debugging (and debugged) process.", - "default": {} - }, - "cwd": { - "type": "string", - "description": "Absolute path to the working directory of the program being debugged.", - "default": "${workspaceRoot}" - }, - "useBundler": { - "type": "boolean", - "description": "Use `bundle exec` to run rdebug-ide. Enable this option if you have used bundle install --path with rdebug-ide as a bundled gem.", - "default": false - }, - "pathToRuby": { - "type": "string", - "description": "Path to the Ruby executable if it is not 'ruby', used to run the program without the debugger (under CTRL+F5)", - "default": "ruby" - }, - "pathToBundler": { - "type": "string", - "description": "If you use the `useBunder` option, and `bundle` is not in your path, provide the absolute path to `bundle` (eg. \"/usr/bin/bundle\" )", - "default": "bundle" - }, - "pathToRDebugIDE": { - "type": "string", - "description": "If `rdebug-ide` is not in your path, provide the absolute path to `rdebug-ide` (eg. \"c:\\ruby\\rdebug-ide.bat\" )", - "default": "rdebug-ide" - }, - "debuggerPort": { - "type": "string", - "description": "If you want to run more than one debugger, you can specify the port here.", - "default": "1234" - }, - "includes": { - "type": "array", - "description": "Additional paths to be added to Ruby's include path", - "default": [] - } - } - }, - "attach": { - "required": [ - "cwd", - "remoteHost", - "remotePort", - "remoteWorkspaceRoot" - ], - "properties": { - "cwd": { - "type": "string", - "description": "Absolute path to the working directory of the program being debugged.", - "default": "${workspaceRoot}" - }, - "remoteHost": { - "type": "string", - "description": "Host address for remote debugging.", - "default": "127.0.0.1" - }, - "remotePort": { - "type": "string", - "description": "Port for remote debugging.", - "default": "1234" - }, - "remoteWorkspaceRoot": { - "type": "string", - "description": "Remote workspace root, this parameter is required for remote debugging.", - "default": "${workspaceRoot}" - }, - "showDebuggerOutput": { - "type": "boolean", - "description": "Show output of the debugger in the console.", - "default": false - } - } - } - } - } - ] - } + "name": "ruby", + "displayName": "Ruby", + "version": "0.22.0", + "publisher": "rebornix", + "description": "Provides Ruby language and debugging support for Visual Studio Code", + "author": { + "name": "Stafford Brunk" + }, + "contributors": [ + { + "name": "Peng Lyu", + "url": "https://github.com/rebornix" + }, + { + "name": "Bryan Hoekstra", + "url": "https://github.com/HookyQR" + }, + { + "name": "Drew Cain", + "url": "https://github.com/groksrc" + }, + { + "name": "Lex Li", + "url": "https://github.com/lextm" + }, + { + "name": "Stafford Brunk", + "url": "https://github.com/wingrunr21" + } + ], + "engines": { + "vscode": "^1.25.0" + }, + "license": "MIT", + "icon": "images/ruby.png", + "categories": [ + "Languages", + "Debuggers", + "Linters", + "Snippets", + "Formatters" + ], + "private": false, + "repository": { + "type": "git", + "url": "https://github.com/rubyide/vscode-ruby.git" + }, + "bugs": { + "url": "https://github.com/rubyide/vscode-ruby/issues" + }, + "dependencies": { + "@types/xmldom": "^0.1.29", + "async": "^2.3.0", + "lodash": "^4.17.3", + "minimatch": "^3.0.3", + "ruby-method-locate": "*", + "vscode-debugadapter": "^1.19.0", + "vscode-debugprotocol": "^1.19.0", + "xmldom": "^0.1.19" + }, + "devDependencies": { + "@types/mocha": "^2.2.33", + "@types/node": "^6.0.50", + "cson-parser": "^2.0.1", + "mocha": "^2.4.5", + "prettier": "^1.11.1", + "run-sequence": "*", + "tslint": "^5.9.1", + "tslint-config-prettier": "^1.10.0", + "tslint-config-standard": "^8.0.1", + "tslint-no-circular-imports": "^0.6.1", + "typescript": "^2.9.2", + "vscode": "^1.1.29", + "vscode-debugadapter-testsupport": "^1.19.0" + }, + "scripts": { + "vscode:prepublish": "npm run clean:server && npm run compile", + "clean:server": "cd server && npm run remove-binaries", + "compile:legacy": "rm -rf out && tsc -p ./src", + "compile:client": "rm -rf ./client/out && tsc -p ./client/tsconfig.json", + "compile:server": "rm -rf ./server/out && tsc -p ./server/tsconfig.json", + "watch": "tsc -w -p ./src", + "watch:client": "tsc -w -p ./client/tsconfig.json", + "watch:server": "tsc -w -p ./server/tsconfig.json", + "compile": "npm run compile:legacy && npm run compile:client && npm run compile:server", + "test": "node ./node_modules/mocha/bin/mocha --recursive ./out/*.test.js", + "test-debugger": "node ./node_modules/mocha/bin/mocha --timeout 15000 -u tdd ./out/debugger/tests/*.js", + "postinstall": "node ./node_modules/vscode/bin/install", + "update-all-grammars": "node scripts/update-all-grammars", + "update-grammar": "node scripts/update-grammar atom/language-ruby", + "lint": "tslint -c tslint.json 'src/**/*.ts'" + }, + "activationEvents": [ + "onLanguage:ruby", + "onLanguage:erb", + "onCommand:workbench.action.tasks.runTask" + ], + "main": "./out/ruby.js", + "contributes": { + "snippets": [ + { + "language": "ruby", + "path": "./snippets/ruby.json" + }, + { + "language": "erb", + "path": "./snippets/erb.json" + } + ], + "commands": [ + { + "command": "ruby.reloadProject", + "title": "Ruby: Reload Project" + } + ], + "configuration": { + "title": "Ruby configuration", + "properties": { + "ruby.locate": { + "type": "object", + "description": "Defines where the Ruby extension will look to find Modules, Classes and methods.", + "default": { + "exclude": "{**/@(test|spec|tmp|.*),**/@(test|spec|tmp|.*)/**,**/*_spec.rb}", + "include": "**/*.rb" + }, + "properties": { + "include": { + "type": "string", + "description": "glob pattern to select files to parse. Matches are performed against the path relative to the workspace root", + "default": "**/*.rb" + }, + "exclude": { + "type": "string", + "description": "glob pattern to select files to ignore, this is also run against paths for exclusion from walking. Matches are performed against the path relative to the workspace root", + "default": "{**/@(test|spec|tmp|.*),**/@(test|spec|tmp|.*)/**,**/*_spec.rb}" + } + } + }, + "ruby.interpreter.commandPath": { + "type": "string", + "default": "ruby", + "description": "Path to the Ruby interpreter. Set this to an absolute path to select from multiple installed Ruby versions.", + "isExecutable": true, + "scope": "resource" + }, + "ruby.useLanguageServer": { + "type": "boolean", + "default": false, + "description": "Use built-in language server" + }, + "ruby.codeCompletion": { + "type": [ + "boolean", + "string" + ], + "enum": [ + false, + "rcodetools" + ], + "default": false, + "description": "Method to use for code completion. Use `false` to disable or if another extension provides this feature." + }, + "ruby.intellisense": { + "type": [ + "boolean", + "string" + ], + "enum": [ + false, + "rubyLocate" + ], + "default": false, + "description": "Method to use for intellisense (go to definition, etc.). Use `false` to disable or if another extension provides this feature." + }, + "ruby.useBundler": { + "type": "boolean", + "default": false, + "description": "Whether ruby tools should be started using Bundler", + "scope": "resource" + }, + "ruby.pathToBundler": { + "type": "string", + "default": "bundle", + "description": "Path to the bundler executable (used if useBundler is true)", + "scope": "resource" + }, + "ruby.rctComplete.commandPath": { + "type": "string", + "default": "rct-complete", + "description": "Path to the rct-complete command. Set this to an absolute path to select from multiple installed Ruby versions.", + "isExecutable": true + }, + "ruby.lintDebounceTime": { + "type": "integer", + "default": 500, + "description": "Time (ms) to wait after keypress before running enabled linters. Ensures linters are only run when typing has finished and not for every keypress" + }, + "ruby.lint": { + "scope": "resource", + "type": "object", + "description": "Set individual ruby linters to use", + "properties": { + "ruby": { + "type": [ + "boolean", + "object" + ], + "default": false, + "description": "Use ruby -wc to lint" + }, + "debride": { + "type": [ + "boolean", + "object" + ], + "default": false, + "properties": { + "rails": { + "type": "boolean", + "default": "true", + "description": "Add some rails call conversions" + } + }, + "description": "Use debride to lint" + }, + "fasterer": { + "type": "boolean", + "default": false, + "description": "Use fasterer to lint" + }, + "reek": { + "type": [ + "boolean", + "object" + ], + "default": false, + "description": "Use reek to lint", + "properties": { + "command": { + "type": "string", + "description": "reek command. Setting this will cause reek to be executed exactly this way and other settings will be ignored!" + }, + "useBundler": { + "type": "boolean", + "default": false, + "description": "Prefix the `reek` command with `bundle exec`" + } + } + }, + "rubocop": { + "type": [ + "boolean", + "object" + ], + "default": false, + "description": "Use RuboCop to lint", + "properties": { + "command": { + "type": "string", + "description": "RuboCop command. Setting this will cause RuboCop to be executed this way and other settings will be ignored!" + }, + "useBundler": { + "type": "boolean", + "default": false, + "description": "Prefix the `rubocop` command with `bundle exec`" + }, + "lint": { + "type": "boolean", + "default": false, + "description": "Enable Lint cops: Lint cops check for possible errors and very bad practices in your code. RuboCop implements in a portable way all built-in MRI lint checks (ruby -wc) and adds a lot of extra lint checks of its own." + }, + "only": { + "type": "array", + "description": "Run only the specified cop(s) and/or cops in the specified departments", + "items": { + "type": "string" + } + }, + "except": { + "type": "array", + "description": "Run all cops enabled by configuration except the specified cop(s) and/or departments", + "items": { + "type": "string" + } + }, + "require": { + "type": "array", + "description": "Require Ruby files", + "items": { + "type": "string" + } + }, + "rails": { + "type": "boolean", + "default": false, + "description": "Rails cops are specific to the Ruby on Rails framework" + } + } + }, + "standard": { + "type": [ + "boolean", + "object" + ], + "default": false, + "description": "Use standard to lint", + "properties": { + "command": { + "type": "string", + "description": "Standard command. Setting this will cause standard to be executed this way and other settings will be ignored!" + }, + "useBundler": { + "type": "boolean", + "default": false, + "description": "Prefix the `standard` command with `bundle exec`" + }, + "only": { + "type": "array", + "description": "Run only the specified cop(s) and/or cops in the specified departments", + "items": { + "type": "string" + } + }, + "except": { + "type": "array", + "description": "Run all cops enabled by configuration except the specified cop(s) and/or departments", + "items": { + "type": "string" + } + }, + "require": { + "type": "array", + "description": "Require Ruby files", + "items": { + "type": "string" + } + } + } + }, + "ruby-lint": { + "type": [ + "boolean", + "object" + ], + "default": false, + "description": "Use ruby-lint to lint", + "properties": { + "levels": { + "type": "array", + "description": "Level of offenses to show", + "items": { + "type": "string", + "enum": [ + "error", + "warning", + "info" + ] + } + }, + "classes": { + "type": "array", + "description": "Classes of offenses to show", + "items": { + "type": "string", + "enum": [ + "argument_amount", + "loop_keywords", + "pedantics", + "shadowing_variables", + "undefined_methods", + "undefined_variables", + "unused_variables", + "useless_equality_checks" + ] + } + } + } + } + } + }, + "ruby.format": { + "type": [ + "boolean", + "string" + ], + "enum": [ + false, + "rubocop", + "standard", + "rufo" + ], + "default": false, + "description": "Which system to use for formatting. Use `false` to disable or if another extension provides this feature.", + "scope": "resource" + } + } + }, + "languages": [ + { + "id": "ruby", + "aliases": [ + "Ruby", + "ruby" + ], + "firstLine": "^#!\\s*/.*(?:ruby|rbx|rake)\\b", + "extensions": [ + ".arb", + ".builder", + ".cgi", + ".fcgi", + ".gemspec", + ".god", + ".irbrc", + ".jbuilder", + ".mspec", + ".pluginspec", + ".podspec", + ".prawn", + ".pryrc", + ".rabl", + ".rake", + ".rb", + ".rbuild", + ".rbw", + ".rbx", + ".rjs", + ".ru", + ".ruby", + ".spec", + ".thor", + ".watchr" + ], + "filenames": [ + "appfile", + "appraisals", + "berksfile", + "brewfile", + "capfile", + "deliverfile", + "fastfile", + "guardfile", + "podfile", + "puppetfile", + "rakefile", + "snapfile", + "thorfile", + "vagrantfile", + "dangerfile" + ], + "configuration": "./language-configuration-ruby.json" + }, + { + "id": "erb", + "aliases": [ + "erb", + "Encapsulated Ruby" + ], + "extensions": [ + ".erb", + ".rhtml", + ".rhtm" + ], + "configuration": "./language-configuration-erb.json" + }, + { + "id": "gemfile", + "aliases": [ + "Gemfile", + "Bundler", + "bundler" + ], + "filenames": [ + "Gemfile" + ], + "configuration": "./language-configuration-ruby.json" + } + ], + "grammars": [ + { + "language": "ruby", + "scopeName": "source.ruby", + "path": "./syntaxes/ruby.cson.json" + }, + { + "language": "erb", + "scopeName": "text.html.erb", + "path": "./syntaxes/erb.cson.json", + "embeddedLanguages": { + "source.css": "css", + "source.js": "javascript", + "source.ruby": "ruby" + } + }, + { + "language": "gemfile", + "scopeName": "source.ruby.gemfile", + "path": "./syntaxes/gemfile.cson.json" + } + ], + "debuggers": [ + { + "type": "Ruby", + "label": "Ruby", + "enableBreakpointsFor": { + "languageIds": [ + "ruby", + "erb" + ] + }, + "program": "./out/debugger/main.js", + "runtime": "node", + "configurationSnippets": [ + { + "label": "Ruby: Debug Local File", + "body": { + "name": "Debug Local File", + "type": "Ruby", + "request": "launch", + "program": "^\"\\${workspaceRoot}/main.rb\"" + } + }, + { + "label": "Ruby: Listen for rdebug-ide", + "body": { + "name": "Listen for rdebug-ide", + "type": "Ruby", + "request": "attach", + "remoteHost": "127.0.0.1", + "remotePort": "1234", + "remoteWorkspaceRoot": "^\"\\${workspaceRoot}\"" + } + }, + { + "label": "Ruby: Rails server", + "body": { + "name": "Rails server", + "type": "Ruby", + "request": "launch", + "program": "^\"\\${workspaceRoot}/bin/rails\"", + "args": [ + "server" + ] + } + }, + { + "label": "Ruby: RSpec - all", + "body": { + "name": "RSpec - all", + "type": "Ruby", + "request": "launch", + "program": "^\"\\${workspaceRoot}/bin/rspec\"", + "args": [ + "-I", + "^\"\\${workspaceRoot}\"" + ] + } + }, + { + "label": "Ruby: RSpec - active spec file only", + "body": { + "name": "RSpec - active spec file only", + "type": "Ruby", + "request": "launch", + "program": "^\"\\${workspaceRoot}/bin/rspec\"", + "args": [ + "-I", + "^\"\\${workspaceRoot}\"", + "^\"\\${file}\"" + ] + } + }, + { + "label": "Ruby: Cucumber", + "body": { + "name": "Cucumber", + "type": "Ruby", + "request": "launch", + "program": "^\"\\${workspaceRoot}/bin/cucumber\"" + } + } + ], + "configurationAttributes": { + "launch": { + "required": [ + "program" + ], + "properties": { + "program": { + "type": "string", + "description": "Absolute path to the program.", + "default": "${workspaceRoot}/main.rb" + }, + "stopOnEntry": { + "type": "boolean", + "description": "Automatically stop after launch.", + "default": true + }, + "showDebuggerOutput": { + "type": "boolean", + "description": "Show output of the debugger in the console.", + "default": false + }, + "args": { + "type": "array", + "description": "Command line arguments passed to the program.", + "items": { + "type": "string" + }, + "default": [] + }, + "env": { + "type": "object", + "description": "Additional environment variables to pass to the debugging (and debugged) process.", + "default": {} + }, + "cwd": { + "type": "string", + "description": "Absolute path to the working directory of the program being debugged.", + "default": "${workspaceRoot}" + }, + "useBundler": { + "type": "boolean", + "description": "Use `bundle exec` to run rdebug-ide. Enable this option if you have used bundle install --path with rdebug-ide as a bundled gem.", + "default": false + }, + "pathToRuby": { + "type": "string", + "description": "Path to the Ruby executable if it is not 'ruby', used to run the program without the debugger (under CTRL+F5)", + "default": "ruby" + }, + "pathToBundler": { + "type": "string", + "description": "If you use the `useBunder` option, and `bundle` is not in your path, provide the absolute path to `bundle` (eg. \"/usr/bin/bundle\" )", + "default": "bundle" + }, + "pathToRDebugIDE": { + "type": "string", + "description": "If `rdebug-ide` is not in your path, provide the absolute path to `rdebug-ide` (eg. \"c:\\ruby\\rdebug-ide.bat\" )", + "default": "rdebug-ide" + }, + "debuggerPort": { + "type": "string", + "description": "If you want to run more than one debugger, you can specify the port here.", + "default": "1234" + }, + "includes": { + "type": "array", + "description": "Additional paths to be added to Ruby's include path", + "default": [] + } + } + }, + "attach": { + "required": [ + "cwd", + "remoteHost", + "remotePort", + "remoteWorkspaceRoot" + ], + "properties": { + "cwd": { + "type": "string", + "description": "Absolute path to the working directory of the program being debugged.", + "default": "${workspaceRoot}" + }, + "remoteHost": { + "type": "string", + "description": "Host address for remote debugging.", + "default": "127.0.0.1" + }, + "remotePort": { + "type": "string", + "description": "Port for remote debugging.", + "default": "1234" + }, + "remoteWorkspaceRoot": { + "type": "string", + "description": "Remote workspace root, this parameter is required for remote debugging.", + "default": "${workspaceRoot}" + }, + "showDebuggerOutput": { + "type": "boolean", + "description": "Show output of the debugger in the console.", + "default": false + } + } + } + } + } + ] + } } diff --git a/server/package-lock.json b/server/package-lock.json index 22646ecb9..f2e81bbe3 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -4,6 +4,27 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/diff-match-patch": { + "version": "1.0.32", + "resolved": "https://registry.npmjs.org/@types/diff-match-patch/-/diff-match-patch-1.0.32.tgz", + "integrity": "sha512-bPYT5ECFiblzsVzyURaNhljBH2Gh1t9LowgUwciMrNAhFewLkHT2H0Mto07Y4/3KCOGZHRQll3CTtQZ0X11D/A==", + "dev": true + }, + "@types/execa": { + "version": "0.9.0", + "resolved": "http://registry.npmjs.org/@types/execa/-/execa-0.9.0.tgz", + "integrity": "sha512-mgfd93RhzjYBUHHV532turHC2j4l/qxsF/PbfDmprHDEUHmNZGlDn1CEsulGK3AfsPdhkWzZQT/S/k0UGhLGsA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/node": { + "version": "10.12.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.2.tgz", + "integrity": "sha512-53ElVDSnZeFUUFIYzI8WLQ25IhWzb6vbddNp8UHlXQyU0ET2RhV5zg0NfubzU7iNMh5bBXb0htCzfvrSVNgzaQ==", + "dev": true + }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -465,7 +486,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -505,6 +525,11 @@ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" }, + "diff-match-patch": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/diff-match-patch/-/diff-match-patch-1.0.4.tgz", + "integrity": "sha512-Uv3SW8bmH9nAtHKaKSanOQmj2DnlH65fUpcrMdfdaOxUG02QQ4YGZ8AE7kKOMisF7UqvOlGKVYWRvezdncW9lg==" + }, "duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", @@ -959,6 +984,11 @@ "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", "dev": true }, + "lodash.assign": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assign/-/lodash.assign-4.2.0.tgz", + "integrity": "sha1-DZnzzNem0mHRm9rrkkUAXShYCOc=" + }, "lodash.pad": { "version": "4.5.1", "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", @@ -1084,8 +1114,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" }, "nan": { "version": "2.12.1", @@ -1499,6 +1528,14 @@ "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", "dev": true }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "requires": { + "tslib": "^1.9.0" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -1573,6 +1610,16 @@ "source-map": "0.1.32" } }, + "spawn-rx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spawn-rx/-/spawn-rx-3.0.0.tgz", + "integrity": "sha512-dw4Ryg/KMNfkKa5ezAR5aZe9wNwPdKlnHEXtHOjVnyEDSPQyOpIPPRtcIiu7127SmtHhaCjw21yC43HliW0iIg==", + "requires": { + "debug": "^2.5.1", + "lodash.assign": "^4.2.0", + "rxjs": "^6.3.1" + } + }, "splitargs": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz", @@ -1787,6 +1834,11 @@ "prebuild-install": "^5.0.0" } }, + "tslib": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", + "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -1901,37 +1953,44 @@ } }, "vscode-jsonrpc": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-3.6.2.tgz", - "integrity": "sha512-T24Jb5V48e4VgYliUXMnZ379ItbrXgOimweKaJshD84z+8q7ZOZjJan0MeDe+Ugb+uqERDVV8SBmemaGMSMugA==" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", + "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" }, "vscode-languageserver": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-4.4.0.tgz", - "integrity": "sha512-NO4JQg286YLSdU11Fko6cke19kwSob3O0bhf6xDxIJuDhUbFy0VEPRB5ITc3riVmp13+Ki344xtqJYmqfcmCrg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.1.0.tgz", + "integrity": "sha512-CIsrgx2Y5VHS317g/HwkSTWYBIQmy0DwEyZPmB2pEpVOhYFwVsYpbiJwHIIyLQsQtmRaO4eA2xM8KPjNSdXpBw==", "requires": { - "vscode-languageserver-protocol": "^3.10.0", - "vscode-uri": "^1.0.3" + "vscode-languageserver-protocol": "3.13.0", + "vscode-uri": "^1.0.6" + }, + "dependencies": { + "vscode-uri": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.6.tgz", + "integrity": "sha512-sLI2L0uGov3wKVb9EB+vIQBl9tVP90nqRvxSoJ35vI3NjxE8jfsE5DSOhWgSunHSZmKS4OCi2jrtfxK7uyp2ww==" + } } }, "vscode-languageserver-protocol": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.10.0.tgz", - "integrity": "sha512-PNNmKM0IcQPRiY1oUIxfwseBvxS5Sa5aZUpTcq/qsXWclnl8FFNs8oCCoAtyLhBXnuJvybWUNafiA78y0unJDA==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.13.0.tgz", + "integrity": "sha512-2ZGKwI+P2ovQll2PGAp+2UfJH+FK9eait86VBUdkPd9HRlm8e58aYT9pV/NYanHOcp3pL6x2yTLVCFMcTer0mg==", "requires": { - "vscode-jsonrpc": "^3.6.2", - "vscode-languageserver-types": "^3.10.0" + "vscode-jsonrpc": "^4.0.0", + "vscode-languageserver-types": "3.13.0" } }, "vscode-languageserver-types": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.10.0.tgz", - "integrity": "sha512-vxmCsVZGwq8X40SuLP8Ix7V0rq5V/7iQUjRVe2Oxm+TbmjxtjK4dpHHXQCUawjA4fhPA9FwjSRbDhbvQmYCfMw==" + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.13.0.tgz", + "integrity": "sha512-BnJIxS+5+8UWiNKCP7W3g9FlE7fErFw0ofP5BXJe7c2tl0VeWh+nNHFbwAS2vmVC4a5kYxHBjRy0UeOtziemVA==" }, "vscode-uri": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.5.tgz", - "integrity": "sha1-O4majvccN/MFTXm9vdoxx7828g0=" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.6.tgz", + "integrity": "sha512-sLI2L0uGov3wKVb9EB+vIQBl9tVP90nqRvxSoJ35vI3NjxE8jfsE5DSOhWgSunHSZmKS4OCi2jrtfxK7uyp2ww==" }, "which": { "version": "1.3.0", diff --git a/server/package.json b/server/package.json index a8f3b1364..b0254c061 100644 --- a/server/package.json +++ b/server/package.json @@ -7,13 +7,18 @@ "license": "MIT", "private": false, "dependencies": { + "diff-match-patch": "^1.0.4", "prebuild-install": "^5.0.0", + "rxjs": "^6.4.0", + "spawn-rx": "^3.0.0", "tree-sitter": "^0.13.23", "tree-sitter-ruby": "^0.13.13", - "vscode-languageserver": "^4.4.0", - "vscode-uri": "^1.0.5" + "vscode-languageserver": "^5.1.0", + "vscode-uri": "^1.0.6" }, "devDependencies": { + "@types/diff-match-patch": "^1.0.32", + "@types/execa": "^0.9.0", "prebuild": "^7.6.0" }, "scripts": { diff --git a/server/src/Analyzer.ts b/server/src/Analyzer.ts new file mode 100644 index 000000000..5fc8e9538 --- /dev/null +++ b/server/src/Analyzer.ts @@ -0,0 +1,94 @@ +import { DocumentSymbol, FoldingRange } from 'vscode-languageserver'; +import { Observer } from 'rxjs'; +import { map } from 'rxjs/operators'; +import { Tree, SyntaxNode } from 'tree-sitter'; +import DocumentSymbolAnalyzer from './analyzers/DocumentSymbolAnalyzer'; +import { forestStream, ForestEventKind } from './Forest'; +import FoldingRangeAnalyzer from './analyzers/FoldingRangeAnalyzer'; + +type Analysis = { + uri: string; + foldingRanges?: FoldingRange[]; + documentSymbols?: DocumentSymbol[]; +}; + +class Analyzer { + private foldingRangeAnalyzer: FoldingRangeAnalyzer; + private documentSymbolAnalyzer: DocumentSymbolAnalyzer; + + constructor(public uri: string) { + this.foldingRangeAnalyzer = new FoldingRangeAnalyzer(); + this.documentSymbolAnalyzer = new DocumentSymbolAnalyzer(); + } + + get analysis() { + return { + uri: this.uri, + foldingRanges: this.foldingRangeAnalyzer.foldingRanges, + documentSymbols: this.documentSymbolAnalyzer.symbols, + }; + } + + public analyze(tree: Tree): Analysis { + const cursor = tree.walk(); + const walk = depth => { + this.analyzeNode(cursor.currentNode); + if (cursor.gotoFirstChild()) { + do { + walk(depth + 1); + } while (cursor.gotoNextSibling()); + cursor.gotoParent(); + } + }; + walk(0); + + return this.analysis; + } + + private analyzeNode(node: SyntaxNode): void { + this.foldingRangeAnalyzer.analyze(node); + this.documentSymbolAnalyzer.analyze(node); + } +} + +class Analyses implements Observer { + public closed: boolean; + private analyses: Map; + + constructor() { + this.closed = false; + this.analyses = new Map(); + } + + public next(analysis: Analysis): void { + this.analyses.set(analysis.uri, analysis); + } + + public error(err: any): void { + console.log(err); + } + + public complete(): void { + this.closed = true; + } + + public getAnalysis(uri: string): Analysis { + return this.analyses.get(uri); + } +} + +export const analyses = new Analyses(); +forestStream + .pipe( + map( + ({ kind, document, tree }): Analysis => { + if (kind === ForestEventKind.DELETE) { + return { uri: document.uri }; + } else { + const analyzer = new Analyzer(document.uri); + return analyzer.analyze(tree); + } + } + ) + ) + .subscribe(analyses); diff --git a/server/src/CapabilityCalculator.ts b/server/src/CapabilityCalculator.ts index 74aa032b8..83090f6d6 100644 --- a/server/src/CapabilityCalculator.ts +++ b/server/src/CapabilityCalculator.ts @@ -8,24 +8,45 @@ import { TextDocumentSyncKind, } from 'vscode-languageserver'; +type WorkspaceRubyEnvironmentCapability = { + workspace?: { + rubyEnvironment?: boolean; + }; +}; + +type ClientCapabilitiesWithRubyEnvironment = ClientCapabilities & + WorkspaceRubyEnvironmentCapability; + export class CapabilityCalculator { - private clientCapabilities: ClientCapabilities; + public clientCapabilities: ClientCapabilitiesWithRubyEnvironment; + public capabilities: ServerCapabilities; constructor(clientCapabilities: ClientCapabilities) { - this.clientCapabilities = clientCapabilities; + this.clientCapabilities = clientCapabilities as ClientCapabilitiesWithRubyEnvironment; + this.calculateCapabilities(); } - get capabilities(): ServerCapabilities { - this.clientCapabilities; - - return { + private calculateCapabilities() { + this.capabilities = { // Perform incremental syncs // Incremental sync is disabled for now due to not being able to get the - // old text in ASTProvider + // old text // textDocumentSync: TextDocumentSyncKind.Incremental, textDocumentSync: TextDocumentSyncKind.Full, + documentFormattingProvider: true, + documentRangeFormattingProvider: true, documentHighlightProvider: true, + documentSymbolProvider: true, foldingRangeProvider: true, }; + + if (this.clientCapabilities.workspace && this.clientCapabilities.workspace.workspaceFolders) { + this.capabilities.workspace = { + workspaceFolders: { + supported: true, + changeNotifications: true, + }, + }; + } } } diff --git a/server/src/DocumentManager.ts b/server/src/DocumentManager.ts new file mode 100644 index 000000000..10fe5de9c --- /dev/null +++ b/server/src/DocumentManager.ts @@ -0,0 +1,52 @@ +import { + TextDocument, + TextDocuments, + IConnection, + TextDocumentIdentifier, +} from 'vscode-languageserver'; +import { Subject } from 'rxjs'; + +export enum DocumentEventKind { + OPEN, + CHANGE_CONTENT, + CLOSE, +} + +export type DocumentEvent = { + kind: DocumentEventKind; + document: TextDocument; +}; + +export default class DocumentManager { + private documents: TextDocuments; + public subject: Subject; + + constructor() { + this.documents = new TextDocuments(); + this.subject = new Subject(); + + this.documents.onDidOpen(this.emitDocumentEvent(DocumentEventKind.OPEN)); + this.documents.onDidChangeContent(this.emitDocumentEvent(DocumentEventKind.CHANGE_CONTENT)); + this.documents.onDidClose(this.emitDocumentEvent(DocumentEventKind.CLOSE)); + } + + public get(id: TextDocumentIdentifier | string): TextDocument { + const docId = typeof id === 'string' ? id : id.uri; + return this.documents.get(docId); + } + + public listen(connection: IConnection): void { + this.documents.listen(connection); + } + + private emitDocumentEvent(kind: DocumentEventKind): ({ document: TextDocument }) => void { + return ({ document }): void => { + this.subject.next({ + kind, + document, + }); + }; + } +} + +export const documents = new DocumentManager(); diff --git a/server/src/Forest.ts b/server/src/Forest.ts index 9d9855583..b042cfe70 100644 --- a/server/src/Forest.ts +++ b/server/src/Forest.ts @@ -2,30 +2,98 @@ * Forest */ -import { Tree } from 'tree-sitter'; +import Parser, { Tree } from 'tree-sitter'; +import TreeSitterRuby from 'tree-sitter-ruby'; +import { TextDocument } from 'vscode-languageserver'; +import { of } from 'rxjs'; +import { switchMap } from 'rxjs/operators'; +import { documents, DocumentEvent, DocumentEventKind } from './DocumentManager'; export interface IForest { getTree(uri: string): Tree; - setTree(uri: string, tree: Tree): void; - removeTree(uri: string): boolean; + createTree(uri: string, content: string): Tree; + updateTree(uri: string, content: string): Tree; + deleteTree(uri: string): boolean; } -export class Forest implements IForest { +export enum ForestEventKind { + OPEN, + UPDATE, + DELETE, +} + +export type ForestEvent = { + kind: ForestEventKind; + document: TextDocument; + tree?: Tree; +}; + +class Forest implements IForest { + private parser: Parser; private trees: Map; constructor() { this.trees = new Map(); + this.parser = new Parser(); + this.parser.setLanguage(TreeSitterRuby); } public getTree(uri: string): Tree { return this.trees.get(uri); } - public setTree(uri: string, tree: Tree): void { + public createTree(uri: string, content: string): Tree { + const tree: Tree = this.parser.parse(content); this.trees.set(uri, tree); + + return tree; + } + + // For the time being this is a full reparse for every change + // Once we can support incremental sync we can use tree-sitter's + // edit functionality + public updateTree(uri: string, content: string): Tree { + let tree: Tree = this.getTree(uri); + if (tree) { + tree = this.parser.parse(content); + this.trees.set(uri, tree); + } else { + tree = this.createTree(uri, content); + } + + return tree; } - public removeTree(uri: string): boolean { + public deleteTree(uri: string): boolean { return this.trees.delete(uri); } } + +export const forest = new Forest(); +export const forestStream = documents.subject.pipe( + switchMap((event: DocumentEvent) => { + const { kind, document } = event; + const uri = document.uri; + const forestEvent: ForestEvent = { + document, + kind: undefined, + }; + + switch (kind) { + case DocumentEventKind.OPEN: + forestEvent.tree = forest.createTree(uri, document.getText()); + forestEvent.kind = ForestEventKind.OPEN; + break; + case DocumentEventKind.CHANGE_CONTENT: + forestEvent.tree = forest.updateTree(uri, document.getText()); + forestEvent.kind = ForestEventKind.UPDATE; + break; + case DocumentEventKind.CLOSE: + forest.deleteTree(uri); + forestEvent.kind = ForestEventKind.DELETE; + break; + } + + return of(forestEvent); + }) +); diff --git a/server/src/Formatter.ts b/server/src/Formatter.ts new file mode 100644 index 000000000..45077123e --- /dev/null +++ b/server/src/Formatter.ts @@ -0,0 +1,60 @@ +import { Range, TextDocument, TextDocumentIdentifier, TextEdit } from 'vscode-languageserver'; +import { + documentConfigurationCache, + RubyEnvironment, + workspaceRubyEnvironmentCache, + RubyConfiguration, +} from './SettingsCache'; +import { documents } from './DocumentManager'; +import URI from 'vscode-uri'; +import { from, Observable } from 'rxjs'; +import { switchMap } from 'rxjs/operators'; +import { IFormatter, FormatterConfig, NullFormatter, RuboCop, Standard, Rufo } from './formatters'; + +const FORMATTER_MAP = { + rubocop: RuboCop, + standard: Standard, + rufo: Rufo, +}; + +function getFormatter( + document: TextDocument, + env: RubyEnvironment, + config: RubyConfiguration, + range?: Range +): IFormatter { + if (typeof config.format === 'string') { + const formatterConfig: FormatterConfig = { + env, + executionRoot: URI.parse(config.workspaceFolderUri).fsPath, + config: { + command: config.format, + useBundler: config.useBundler, + }, + }; + + if (range) { + formatterConfig.range = range; + } + + return new FORMATTER_MAP[config.format](document, formatterConfig); + } else { + return new NullFormatter(); + } +} + +export default class Formatter { + static format(ident: TextDocumentIdentifier, range?: Range): Observable { + const document = documents.get(ident.uri); + + return from(documentConfigurationCache.get(ident.uri)).pipe( + switchMap(config => + from(workspaceRubyEnvironmentCache.get(config.workspaceFolderUri)).pipe( + switchMap(env => { + return getFormatter(document, env, config, range).format(); + }) + ) + ) + ); + } +} diff --git a/server/src/Linter.ts b/server/src/Linter.ts new file mode 100644 index 000000000..5e687e026 --- /dev/null +++ b/server/src/Linter.ts @@ -0,0 +1,79 @@ +import URI from 'vscode-uri'; +import { empty, iif, from, of, Observable } from 'rxjs'; +import { map, mergeMap, switchMap } from 'rxjs/operators'; +import { Diagnostic, TextDocument } from 'vscode-languageserver'; +import { + documentConfigurationCache, + RubyEnvironment, + workspaceRubyEnvironmentCache, + RubyConfiguration, + RubyCommandConfiguration, +} from './SettingsCache'; +import { ILinter, LinterConfig, RuboCop, Reek, Standard } from './linters'; +import { documents, DocumentEvent, DocumentEventKind } from './DocumentManager'; + +const LINTER_MAP = { + rubocop: RuboCop, + reek: Reek, + standard: Standard, +}; + +export type LintResult = { + document: TextDocument; + diagnostics: Diagnostic[]; + error?: string; +}; + +function getLinter( + name: string, + document: TextDocument, + env: RubyEnvironment, + config: RubyConfiguration +): ILinter { + const lintConfig: RubyCommandConfiguration = + typeof config.lint[name] === 'object' ? config.lint[name] : {}; + const linterConfig: LinterConfig = { + env, + executionRoot: URI.parse(config.workspaceFolderUri).fsPath, + config: lintConfig, + }; + return new LINTER_MAP[name](document, linterConfig); +} + +function lint(document: TextDocument): Observable { + return from(documentConfigurationCache.get(document)).pipe( + mergeMap( + config => workspaceRubyEnvironmentCache.get(config.workspaceFolderUri), + (config, env) => { + return { config, env }; + } + ), + switchMap(({ config, env }) => { + return from(Object.keys(config.lint)).pipe( + mergeMap(l => { + return config.lint[l] ? getLinter(l, document, env, config).lint() : empty(); + }) + ); + }), + map(diagnostics => { + return { + document, + diagnostics, + }; + }) + ); +} + +export const linter = documents.subject.pipe( + switchMap((event: DocumentEvent) => + iif( + () => + event.kind === DocumentEventKind.OPEN || event.kind === DocumentEventKind.CHANGE_CONTENT, + lint(event.document), + of({ + document: event.document, + diagnostics: [], + }) + ) + ) +); diff --git a/server/src/Server.ts b/server/src/Server.ts index d37d9ee04..9ce3a109f 100644 --- a/server/src/Server.ts +++ b/server/src/Server.ts @@ -1,26 +1,100 @@ -import { Connection, InitializeParams, InitializeResult } from 'vscode-languageserver'; +import { + ConfigurationItem, + Connection, + InitializeParams, + InitializeResult, + RequestType, +} from 'vscode-languageserver'; import { CapabilityCalculator } from './CapabilityCalculator'; -import { Forest } from './Forest'; -import { ASTProvider } from './providers/ASTProvider'; -import { DocumentHighlightProvider } from './providers/DocumentHighlightProvider'; -import { FoldingRangeProvider } from './providers/FoldingRangeProvider'; +import DocumentHighlightProvider from './providers/DocumentHighlightProvider'; +import FoldingRangeProvider from './providers/FoldingRangeProvider'; +import ConfigurationProvider from './providers/ConfigurationProvider'; +import WorkspaceProvider from './providers/WorkspaceProvider'; +import DocumentSymbolProvider from './providers/DocumentSymbolProvider'; + +import { documents } from './DocumentManager'; +import { LintResult, linter } from './Linter'; + +import { + documentConfigurationCache, + workspaceRubyEnvironmentCache, + RubyConfiguration, + RubyEnvironment, +} from './SettingsCache'; +import DocumentFormattingProvider from './providers/DocumentFormattingProvider'; export interface ILanguageServer { readonly capabilities: InitializeResult; + registerInitializeProviders(); + registerInitializedProviders(); +} + +interface WorkspaceRubyEnvironmentParams { + readonly folders: string[]; +} + +interface WorkspaceRubyEnvironmentResult { + readonly [key: string]: RubyEnvironment; +} + +namespace WorkspaceRubyEnvironmentRequest { + export const type = new RequestType< + WorkspaceRubyEnvironmentParams, + WorkspaceRubyEnvironmentResult, + void, + true + >('workspace/rubyEnvironment'); } export class Server implements ILanguageServer { public connection: Connection; private calculator: CapabilityCalculator; - private forest: Forest; constructor(connection: Connection, params: InitializeParams) { this.connection = connection; this.calculator = new CapabilityCalculator(params.capabilities); - this.forest = new Forest(); - this.registerProviders(); + documents.listen(connection); + + linter.subscribe({ + next: (result: LintResult) => { + connection.sendDiagnostics({ uri: result.document.uri, diagnostics: result.diagnostics }); + }, + }); + + documentConfigurationCache.fetcher = async ( + targets: string[] + ): Promise => { + const items: ConfigurationItem[] = targets.map(t => { + return { + scopeUri: t, + section: 'ruby', + }; + }); + return this.connection.workspace.getConfiguration(items); + }; + + if (this.calculator.clientCapabilities.workspace.rubyEnvironment) { + workspaceRubyEnvironmentCache.fetcher = async ( + folders: string[] + ): Promise => { + const result: WorkspaceRubyEnvironmentResult = await this.connection.sendRequest( + WorkspaceRubyEnvironmentRequest.type, + { + folders, + } + ); + + return Object.values(result); + }; + } else { + workspaceRubyEnvironmentCache.fetcher = async ( + folders: string[] + ): Promise => { + return folders.map(_f => process.env as RubyEnvironment); + }; + } } get capabilities(): InitializeResult { @@ -29,9 +103,27 @@ export class Server implements ILanguageServer { }; } - private registerProviders(): void { - new ASTProvider(this.connection, this.forest); - new DocumentHighlightProvider(this.connection, this.forest); - new FoldingRangeProvider(this.connection, this.forest); + // registers providers on the initialize step + public registerInitializeProviders(): void { + // Handles highlight requests + DocumentHighlightProvider.register(this.connection); + + // Handles folding requests + FoldingRangeProvider.register(this.connection); + + // Handles document symbol requests + DocumentSymbolProvider.register(this.connection); + + // Handles document formatting requests + DocumentFormattingProvider.register(this.connection); + } + + // registers providers on the initialized step + public registerInitializedProviders(): void { + // Handles configuration changes + ConfigurationProvider.register(this.connection); + + // Handle workspace changes + WorkspaceProvider.register(this.connection); } } diff --git a/server/src/SettingsCache.ts b/server/src/SettingsCache.ts new file mode 100644 index 000000000..fb584e990 --- /dev/null +++ b/server/src/SettingsCache.ts @@ -0,0 +1,106 @@ +import { TextDocument, WorkspaceFolder } from 'vscode-languageserver'; + +export type RubyEnvironment = { + PATH: string; + RUBY_VERSION: string; + RUBY_ROOT: string; + GEM_HOME: string; + GEM_PATH: string; + GEM_ROOT: string; + RUBOCOP_OPTS?: string; +}; + +export type RubyCommandConfiguration = { + command?: string; + useBundler?: boolean; +}; + +export type RuboCopLintConfiguration = RubyCommandConfiguration & { + lint?: boolean; + only?: string[]; + except?: string[]; + require?: string[]; + rails?: boolean; + forceExclusion?: boolean; +}; + +export interface RubyConfiguration { + useBundler: boolean; + workspaceFolderUri: string; + interpreter?: { + commandPath?: string; + }; + pathToBundler: string; + lint: { + fasterer?: boolean | RubyConfiguration; + reek?: boolean | RubyConfiguration; + rubocop?: boolean | RuboCopLintConfiguration; + }; + format: boolean | 'rubocop' | 'standard' | 'rufo'; +} + +class SettingsCache

{ + private cache: Map; + public fetcher: (target: string[]) => Promise; + + constructor() { + this.cache = new Map(); + } + + public set(target: P | string, env: T): void { + const key = typeof target === 'string' ? target : target.uri; + this.cache.set(key, env); + } + + public setAll(targets: { [key: string]: T }): void { + for (const target of Object.keys(targets)) { + this.set(target, targets[target]); + } + } + + public delete(target: P): boolean { + return this.cache.delete(target.uri); + } + + public deleteAll(targets: P[]): void { + for (const target of targets) { + this.delete(target); + } + } + + public async get(target: P | string): Promise { + const key = typeof target === 'string' ? target : target.uri; + let settings: T = this.cache.get(key); + if (!settings) { + const result = await this.fetcher([key]); + settings = result.length > 0 ? result[0] : undefined; + + if (settings) { + this.set(key, settings); + } + } + + return settings; + } + + public async getAll(targets: P[]): Promise<{ [key: string]: T }> { + const settings: { [key: string]: T } = {}; + + for (const target of targets) { + settings[target.uri] = await this.get(target); + } + + return settings; + } + + public flush(): void { + this.cache.clear(); + } + + public toString(): string { + return this.cache.toString(); + } +} + +export const documentConfigurationCache = new SettingsCache(); +export const workspaceRubyEnvironmentCache = new SettingsCache(); diff --git a/server/src/analyzers/BaseAnalyzer.ts b/server/src/analyzers/BaseAnalyzer.ts new file mode 100644 index 000000000..f586a4554 --- /dev/null +++ b/server/src/analyzers/BaseAnalyzer.ts @@ -0,0 +1,17 @@ +import { SyntaxNode } from 'tree-sitter'; + +export default abstract class BaseAnalyzer { + public diagnostics: T[]; + + constructor() { + this.diagnostics = [] as T[]; + } + + public analyze(node: SyntaxNode): void { + console.log(node); + } + + public flush(): void { + this.diagnostics = [] as T[]; + } +} diff --git a/server/src/analyzers/DocumentHighlightAnalyzer.ts b/server/src/analyzers/DocumentHighlightAnalyzer.ts new file mode 100644 index 000000000..b8ac336ff --- /dev/null +++ b/server/src/analyzers/DocumentHighlightAnalyzer.ts @@ -0,0 +1,75 @@ +import { DocumentHighlight, DocumentHighlightKind, Range } from 'vscode-languageserver'; +import { SyntaxNode, Tree } from 'tree-sitter'; +import Position from '../util/Position'; +import { forest } from '../Forest'; + +export default class DocumentHighlightAnalyzer { + private static readonly BEGIN_TYPES: Set = new Set([ + 'begin', + 'def', + 'if', + 'case', + 'unless', + 'do', + 'class', + 'module', + ]); + + public static async analyze(uri: string, position: Position): Promise { + const tree: Tree = forest.getTree(uri); + + return this.computeHighlights(tree, position); + } + + private static computeHighlights(tree: Tree, position: Position): DocumentHighlight[] { + const rootNode: SyntaxNode = tree.rootNode; + const node: SyntaxNode = rootNode.descendantForPosition(position.toTSPosition()); + let highlights: DocumentHighlight[] = []; + if (node.type === 'end') { + highlights = highlights.concat(this.computeEndHighlight(node)); + } + if (!node.isNamed && this.BEGIN_TYPES.has(node.type)) { + highlights = highlights.concat(this.computeBeginHighlight(node)); + } + return highlights; + } + + private static computeBeginHighlight(node: SyntaxNode): DocumentHighlight[] { + const endNode: SyntaxNode = node.parent.lastChild; + return [ + DocumentHighlight.create( + Range.create( + Position.fromTSPosition(node.startPosition).toVSPosition(), + Position.fromTSPosition(node.endPosition).toVSPosition() + ), + DocumentHighlightKind.Text + ), + DocumentHighlight.create( + Range.create( + Position.fromTSPosition(endNode.startPosition).toVSPosition(), + Position.fromTSPosition(endNode.endPosition).toVSPosition() + ), + DocumentHighlightKind.Text + ), + ]; + } + private static computeEndHighlight(node: SyntaxNode): DocumentHighlight[] { + const startNode: SyntaxNode = node.parent.firstChild; + return [ + DocumentHighlight.create( + Range.create( + Position.fromTSPosition(startNode.startPosition).toVSPosition(), + Position.fromTSPosition(startNode.endPosition).toVSPosition() + ), + DocumentHighlightKind.Text + ), + DocumentHighlight.create( + Range.create( + Position.fromTSPosition(node.startPosition).toVSPosition(), + Position.fromTSPosition(node.endPosition).toVSPosition() + ), + DocumentHighlightKind.Text + ), + ]; + } +} diff --git a/server/src/analyzers/DocumentSymbolAnalyzer.ts b/server/src/analyzers/DocumentSymbolAnalyzer.ts new file mode 100644 index 000000000..5d738f3fd --- /dev/null +++ b/server/src/analyzers/DocumentSymbolAnalyzer.ts @@ -0,0 +1,46 @@ +import { DocumentSymbol } from 'vscode-languageserver'; +import { SyntaxNode } from 'tree-sitter'; +import BaseAnalyzer from './BaseAnalyzer'; +import { Position, Stack } from '../util'; +import RubyDocumentSymbol, { isWrapper } from '../util/RubyDocumentSymbol'; + +export default class DocumentSymbolAnalyzer extends BaseAnalyzer { + private symbolStack: Stack; + private nodeStack: Stack; + + constructor() { + super(); + this.symbolStack = new Stack(); + this.nodeStack = new Stack(); + } + + get symbols() { + return this.diagnostics; + } + + public analyze(node: SyntaxNode): void { + const symbol = RubyDocumentSymbol.build(node); + + if (symbol) { + // empty nodeStack means we are at document root + if (this.nodeStack.empty()) { + this.diagnostics = this.diagnostics.concat(symbol); + } else { + const topSymbol = this.symbolStack.peek(); + topSymbol.children = topSymbol.children.concat(symbol); + } + } + + // Stack management + if (isWrapper(node) && symbol && !Array.isArray(symbol)) { + this.symbolStack.push(symbol); + this.nodeStack.push(node); + } else if ( + !this.nodeStack.empty() && + Position.tsPositionIsEqual(this.nodeStack.peek().endPosition, node.endPosition) + ) { + this.nodeStack.pop(); + this.symbolStack.pop(); + } + } +} diff --git a/server/src/analyzers/FoldingRangeAnalyzer.ts b/server/src/analyzers/FoldingRangeAnalyzer.ts new file mode 100644 index 000000000..82418074d --- /dev/null +++ b/server/src/analyzers/FoldingRangeAnalyzer.ts @@ -0,0 +1,171 @@ +import { FoldingRange, FoldingRangeKind } from 'vscode-languageserver'; +import { SyntaxNode } from 'tree-sitter'; +import BaseAnalyzer from './BaseAnalyzer'; + +interface IFoldHeuristic { + start?: { + row?: number; + column?: number; + }; + end?: { + row?: number; + column?: number; + }; +} + +class FoldHeuristic { + private heuristic: IFoldHeuristic; + private readonly defaultHeuristic = { + row: 0, + column: 0, + }; + + constructor(heuristic = {}) { + this.heuristic = heuristic; + } + + get start() { + return { + ...this.defaultHeuristic, + ...this.heuristic.start, + }; + } + + get end() { + return { + ...this.defaultHeuristic, + ...this.heuristic.end, + }; + } +} + +export default class FoldingRangeAnalyzer extends BaseAnalyzer { + private FOLD_NODES: Map = new Map([ + [ + 'array', + new FoldHeuristic({ + end: { + row: -1, + }, + }), + ], + ['block', new FoldHeuristic()], + [ + 'case', + new FoldHeuristic({ + end: { + row: -1, + }, + }), + ], + [ + 'class', + new FoldHeuristic({ + end: { + row: -1, + }, + }), + ], + ['comment', new FoldHeuristic()], + [ + 'begin', + new FoldHeuristic({ + end: { + row: -1, + }, + }), + ], + ['do_block', new FoldHeuristic()], + [ + 'hash', + new FoldHeuristic({ + end: { + row: -1, + }, + }), + ], + [ + 'heredoc_body', + new FoldHeuristic({ + start: { + row: -1, + }, + end: { + row: -1, + }, + }), + ], + ['then', new FoldHeuristic()], // body of an if and unless statement + ['else', new FoldHeuristic()], + [ + 'method', + new FoldHeuristic({ + end: { + row: -1, + }, + }), + ], + [ + 'module', + new FoldHeuristic({ + end: { + row: -1, + }, + }), + ], + [ + 'singleton_method', + new FoldHeuristic({ + end: { + row: -1, + }, + }), + ], + ]); + private lastNodeAnalyzed: SyntaxNode; + + get foldingRanges() { + return this.diagnostics; + } + + public analyze(node: SyntaxNode): void { + if (this.FOLD_NODES.has(node.type)) { + const heuristic: IFoldHeuristic = this.FOLD_NODES.get(node.type); + if (this.determineImplicitBlock(node, this.lastNodeAnalyzed) && this.diagnostics.length > 0) { + const foldingRange: FoldingRange = this.diagnostics[this.diagnostics.length - 1]; + foldingRange.endLine = node.endPosition.row; + foldingRange.endCharacter = node.endPosition.column; + } else { + this.diagnostics.push({ + startLine: node.startPosition.row + heuristic.start.row, + startCharacter: node.startPosition.column + heuristic.start.column, + endLine: node.endPosition.row + heuristic.end.row, + endCharacter: node.endPosition.column + heuristic.end.column, + kind: this.getFoldKind(node.type), + }); + } + this.lastNodeAnalyzed = node; + } + } + + private getFoldKind(nodeType: string): FoldingRangeKind { + switch (nodeType) { + case 'comment': + return FoldingRangeKind.Comment; + case 'require': + return FoldingRangeKind.Imports; + default: + return FoldingRangeKind.Region; + } + } + + private determineImplicitBlock(node: SyntaxNode, lastNode: SyntaxNode): boolean { + return ( + node.type === 'comment' && + node.text[0] === '#' && + lastNode && + lastNode.type === 'comment' && + lastNode.text[0] === '#' + ); + } +} diff --git a/server/src/formatters/BaseFormatter.ts b/server/src/formatters/BaseFormatter.ts new file mode 100644 index 000000000..236277476 --- /dev/null +++ b/server/src/formatters/BaseFormatter.ts @@ -0,0 +1,178 @@ +import { Position, Range, TextDocument, TextEdit } from 'vscode-languageserver'; +import { spawn } from 'spawn-rx'; +import { of, Observable, throwError } from 'rxjs'; +import { map, catchError } from 'rxjs/operators'; +import { + diff_match_patch as DiffMatchPatch, + Diff, + DIFF_DELETE, + DIFF_INSERT, + DIFF_EQUAL, +} from 'diff-match-patch'; +import { RubyEnvironment, RubyCommandConfiguration } from '../SettingsCache'; + +export interface IFormatter { + format(): Observable; +} + +export type FormatterConfig = { + env: RubyEnvironment; + executionRoot: string; + config: RubyCommandConfiguration; + range?: Range; +}; + +export default abstract class BaseFormatter implements IFormatter { + protected document: TextDocument; + private originalText: string; + protected config: FormatterConfig; + private differ: DiffMatchPatch; + + constructor(document: TextDocument, config: FormatterConfig) { + this.document = document; + this.originalText = document.getText(); + this.config = config; + this.differ = new DiffMatchPatch(); + + if (this.range) { + this.modifyRange(); + } + } + + get cmd(): string { + return 'echo'; + } + + get args(): string[] { + return [this.document.uri]; + } + + get useBundler(): boolean { + return this.config.config.useBundler; + } + + get range(): Range { + return this.config.range; + } + + public format(): Observable { + let { cmd, args } = this; + + if (this.useBundler) { + args.unshift('exec', cmd); + cmd = 'bundle'; + } + + const formatStr = `${cmd} ${args.join(' ')}`; + console.info(`Format: executing ${formatStr}...`); + return spawn(cmd, args, { + env: this.config.env, + cwd: this.config.executionRoot, + stdin: of(this.originalText), + }).pipe( + catchError(error => { + return throwError(this.processError(error, formatStr)); + }), + map((result: string) => { + return this.processResults(result); + }) + ); + } + + protected processResults(output: string): TextEdit[] { + const diffs: Diff[] = this.differ.diff_main(this.originalText, output); + const edits: TextEdit[] = []; + // VSCode wants TextEdits on the original document + // this means position only gets moved for DIFF_EQUAL and DIFF_DELETE + // as insert is new and doesn't have a position in the original + let position = 0; + for (let diff of diffs) { + const [num, str] = diff; + const startPos = this.document.positionAt(position); + + switch (num) { + case DIFF_DELETE: + edits.push({ + range: { + start: startPos, + end: this.document.positionAt(position + str.length), + }, + newText: '', + }); + position += str.length; + break; + case DIFF_INSERT: + edits.push({ + range: { start: startPos, end: startPos }, + newText: str, + }); + break; + case DIFF_EQUAL: + position += str.length; + break; + } + + // If we are have a range we are doing a selection format. Thus, + // only apply patches that start within the selected range + if (this.range && !this.checkPositionInRange(startPos)) { + edits.shift(); + } + } + + return edits; + } + + protected isWindows(): boolean { + return process.platform === 'win32'; + } + + protected processError(error: any, formatStr: string): Error { + let code = error.code || error.toString().match(/code: (\d+)/)[1] || null; + let message = `\n unable to execute ${formatStr}:\n ${error.toString()} - ${this.messageForCode( + code + )}`; + return new Error(message); + } + + private messageForCode(code: string) { + switch (code) { + case '127': + return 'missing gem executables'; + case 'ENOENT': + return 'command not found'; + default: + return 'unknown error'; + } + } + + // Modified from https://github.com/Microsoft/vscode/blob/master/src/vs/editor/common/core/range.ts#L90 + private checkPositionInRange(position: Position) { + const { start, end } = this.range; + + if (position.line < start.line || position.line > end.line) { + return false; + } + + if (position.line === start.line && position.character < start.character) { + return false; + } + + if (position.line === end.line && position.character > end.character) { + return false; + } + + return true; + } + + // If the selection range just has whitespace before it in the line, + // extend the range to account for that whitespace + private modifyRange() { + const { start } = this.range; + const offset = this.document.offsetAt(start); + const prefixLineText = this.originalText.substring(offset - start.character, offset); + + if (/^\s+$/.test(prefixLineText)) { + this.range.start.character = 0; + } + } +} diff --git a/server/src/formatters/NullFormatter.ts b/server/src/formatters/NullFormatter.ts new file mode 100644 index 000000000..261f028f6 --- /dev/null +++ b/server/src/formatters/NullFormatter.ts @@ -0,0 +1,9 @@ +import { IFormatter } from './BaseFormatter'; +import { Observable, of } from 'rxjs'; +import { TextEdit } from 'vscode-languageserver'; + +export default class NullFormatter implements IFormatter { + format(): Observable { + return of([]); + } +} diff --git a/server/src/formatters/RuboCop.ts b/server/src/formatters/RuboCop.ts new file mode 100644 index 000000000..cc532fec5 --- /dev/null +++ b/server/src/formatters/RuboCop.ts @@ -0,0 +1,25 @@ +import URI from 'vscode-uri'; +import { TextEdit } from 'vscode-languageserver'; +import BaseFormatter from './BaseFormatter'; + +export default class RuboCop extends BaseFormatter { + protected FORMATTED_OUTPUT_DELIMITER = '===================='; + + get cmd(): string { + const command = 'rubocop'; + return this.isWindows() ? command + '.bat' : command; + } + + get args(): string[] { + const documentPath = URI.parse(this.document.uri); + let args = ['-s', documentPath.fsPath, '-a']; + return args; + } + + protected processResults(output: string): TextEdit[] { + const endOfDiagnostics = + output.lastIndexOf(this.FORMATTED_OUTPUT_DELIMITER) + this.FORMATTED_OUTPUT_DELIMITER.length; + const cleanOutput = output.substring(endOfDiagnostics).trimLeft(); + return super.processResults(cleanOutput); + } +} diff --git a/server/src/formatters/Rufo.ts b/server/src/formatters/Rufo.ts new file mode 100644 index 000000000..9dcc77c9f --- /dev/null +++ b/server/src/formatters/Rufo.ts @@ -0,0 +1,14 @@ +import URI from 'vscode-uri'; +import BaseFormatter from './BaseFormatter'; + +export default class Rubocop extends BaseFormatter { + get cmd(): string { + const command = 'rufo'; + return this.isWindows() ? command + '.bat' : command; + } + + get args(): string[] { + const documentPath = URI.parse(this.document.uri); + return [`--filename=${documentPath.fsPath}`, '-x']; + } +} diff --git a/server/src/formatters/Standard.ts b/server/src/formatters/Standard.ts new file mode 100644 index 000000000..647aceb57 --- /dev/null +++ b/server/src/formatters/Standard.ts @@ -0,0 +1,15 @@ +import URI from 'vscode-uri'; +import RuboCop from './RuboCop'; + +export default class Standard extends RuboCop { + get cmd(): string { + const command = 'standardrb'; + return this.isWindows() ? command + '.bat' : command; + } + + get args(): string[] { + const documentPath = URI.parse(this.document.uri); + let args = ['-s', documentPath.fsPath, '--fix']; + return args; + } +} diff --git a/server/src/formatters/index.ts b/server/src/formatters/index.ts new file mode 100644 index 000000000..29026a723 --- /dev/null +++ b/server/src/formatters/index.ts @@ -0,0 +1,5 @@ +export { IFormatter, FormatterConfig } from './BaseFormatter'; +export { default as NullFormatter } from './NullFormatter'; +export { default as RuboCop } from './RuboCop'; +export { default as Rufo } from './Rufo'; +export { default as Standard } from './Standard'; diff --git a/server/src/index.ts b/server/src/index.ts index 146a4543b..d95f836d8 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -13,6 +13,7 @@ import { ILanguageServer } from './Server'; import { rebuildTreeSitter } from './util/rebuilder'; const connection: IConnection = createConnection(ProposedFeatures.all); +let server: ILanguageServer; connection.onInitialize(async (params: InitializeParams) => { connection.console.info('Initializing Ruby language server...'); @@ -30,10 +31,26 @@ connection.onInitialize(async (params: InitializeParams) => { connection.console.info('Rebuild succeeded!'); const { Server } = await import('./Server'); - const server: ILanguageServer = new Server(connection, params); + server = new Server(connection, params); + server.registerInitializeProviders(); return server.capabilities; }); +connection.onInitialized(() => { + server.registerInitializedProviders(); +}); + // Listen on the connection connection.listen(); + +// Don't die on unhandled Promise rejections +process.on('unhandledRejection', (reason, p) => { + connection.console.error(`Unhandled Rejection at: Promise ${p} reason:, ${reason}`); +}); + +// Don't die when attempting to pipe stdin to a bad spawn +// https://github.com/electron/electron/issues/13254 +process.on('SIGPIPE', () => { + // console.log('SIGPIPE!!'); +}); diff --git a/server/src/linters/BaseLinter.ts b/server/src/linters/BaseLinter.ts new file mode 100644 index 000000000..55bf9a536 --- /dev/null +++ b/server/src/linters/BaseLinter.ts @@ -0,0 +1,80 @@ +import { Diagnostic, TextDocument } from 'vscode-languageserver'; +import { spawn } from 'spawn-rx'; +import { of, Observable, empty } from 'rxjs'; +import { map, catchError } from 'rxjs/operators'; +import { RubyEnvironment, RubyCommandConfiguration } from '../SettingsCache'; + +export interface ILinter { + lint(): Observable; +} + +export type LinterConfig = { + env: RubyEnvironment; + executionRoot: string; + config: RubyCommandConfiguration; +}; + +export default abstract class BaseLinter implements ILinter { + protected document: TextDocument; + protected config: LinterConfig; + protected code = 'BaseLinter'; + + constructor(document: TextDocument, config: LinterConfig) { + this.document = document; + this.config = config; + } + + get cmd(): string { + return this.lintConfig.command; + } + + get args(): string[] { + return [this.document.uri]; + } + + get lintConfig(): RubyCommandConfiguration { + return this.config.config; + } + + public lint(): Observable { + let { cmd, args } = this; + + if (!this.lintConfig.command && this.lintConfig.useBundler) { + args.unshift('exec', cmd); + cmd = 'bundle'; + } + + console.info(`Lint: executing ${cmd} ${args.join(' ')}...`); + return spawn(cmd, args, { + env: this.config.env, + cwd: this.config.executionRoot, + stdin: of(this.document.getText()), + }).pipe( + catchError(error => { + this.processError(error); + return empty(); + }), + map(result => this.processResults(result)) + ); + } + + protected processResults(_output): Diagnostic[] { + return []; + } + + protected isWindows(): boolean { + return process.platform === 'win32'; + } + + protected processError(error: any) { + switch (error.code) { + case 'ENOENT': + console.log( + `Lint: unable to execute ${error.path} ${error.spawnargs.join( + ' ' + )} as the command could not be found` + ); + break; + } + } +} diff --git a/server/src/linters/Reek.ts b/server/src/linters/Reek.ts new file mode 100644 index 000000000..933978ee9 --- /dev/null +++ b/server/src/linters/Reek.ts @@ -0,0 +1,68 @@ +import BaseLinter from './BaseLinter'; +import { Diagnostic, DiagnosticSeverity } from 'vscode-languageserver'; + +type ReekOffense = { + context: string; + lines: number[]; + message: string; + smell_type: string; + source: string; + depth: number; + wiki_link: string; +}; + +export default class Reek extends BaseLinter { + protected code = 'Reek'; + + get cmd(): string { + if (this.lintConfig.command) { + return this.lintConfig.command; + } else { + const command = 'reek'; + return this.isWindows() ? command + '.bat' : command; + } + } + + get args(): string[] { + return ['-f', 'json']; + } + + protected processResults(data): Diagnostic[] { + let results = [] as Diagnostic[]; + try { + const offenses: ReekOffense[] = JSON.parse(data); + for (const offense of offenses) { + const diagnostics = this.reekOffenseToDiagnostic(offense); + results = results.concat(diagnostics); + } + } catch (e) { + console.error(`Lint: Received invalid JSON from reek:\n\n${data}`); + } + + return results; + } + + private reekOffenseToDiagnostic(offense: ReekOffense): Diagnostic[] { + const baseDiagnostic = { + severity: DiagnosticSeverity.Warning, + message: offense.message, + source: offense.smell_type, + code: this.code, + }; + return offense.lines.map(l => { + return { + ...baseDiagnostic, + range: { + start: { + line: l, + character: 1, + }, + end: { + line: l, + character: 1, + }, + }, + }; + }); + } +} diff --git a/server/src/linters/RuboCop.ts b/server/src/linters/RuboCop.ts new file mode 100644 index 000000000..2bc01c41b --- /dev/null +++ b/server/src/linters/RuboCop.ts @@ -0,0 +1,103 @@ +import URI from 'vscode-uri'; +import { Diagnostic, DiagnosticSeverity } from 'vscode-languageserver'; +import BaseLinter from './BaseLinter'; +import { RuboCopLintConfiguration } from '../SettingsCache'; + +type RuboCopOffense = { + severity: string; // FIXME make this a fixed option set + message: string; + cop_name: string; + corrected: boolean; + location: { + line: number; + column: number; + length: number; + }; +}; + +export interface IRuboCopResults { + summary: { + offense_count: number; + target_file_count: number; + inspected_file_count: number; + }; + files: [ + { + path: string; + offenses: RuboCopOffense[]; + } + ]; +} + +export default class RuboCop extends BaseLinter { + protected code = 'RuboCop'; + + private readonly DIAGNOSTIC_SEVERITIES = { + refactor: DiagnosticSeverity.Hint, + convention: DiagnosticSeverity.Information, + warning: DiagnosticSeverity.Warning, + error: DiagnosticSeverity.Error, + fatal: DiagnosticSeverity.Error, + }; + + get cmd(): string { + if (this.lintConfig.command) { + return this.lintConfig.command; + } else { + const command = 'rubocop'; + return this.isWindows() ? command + '.bat' : command; + } + } + + get args(): string[] { + const documentPath = URI.parse(this.document.uri); + let args = ['-s', documentPath.fsPath, '-f', 'json']; + if (this.lintConfig.rails) args.push('-R'); + if (this.lintConfig.forceExclusion) args.push('--force-exclusion'); + if (this.lintConfig.lint) args.push('-l'); + if (this.lintConfig.only) args = args.concat('--only', this.lintConfig.only.join(',')); + if (this.lintConfig.except) args = args.concat('--except', this.lintConfig.except.join(',')); + if (this.lintConfig.require) args = args.concat('-r', this.lintConfig.require.join(',')); + return args; + } + + get lintConfig(): RuboCopLintConfiguration { + return this.config.config; + } + + protected processResults(data): Diagnostic[] { + let results = [] as Diagnostic[]; + try { + const offenses: IRuboCopResults = JSON.parse(data); + + for (const file of offenses.files) { + const diagnostics = file.offenses.map(o => this.rubocopOffenseToDiagnostic(o)); + results = results.concat(diagnostics); + } + } catch (e) { + console.error(`Lint: Received invalid JSON from rubocop:\n\n${data}`); + } + + return results; + } + + protected rubocopOffenseToDiagnostic(offense: RuboCopOffense): Diagnostic { + const offenseCharacter = offense.location.column - 1; + return { + range: { + start: { + line: offense.location.line - 1, + character: offenseCharacter, + }, + end: { + line: offense.location.line - 1, + character: offenseCharacter + offense.location.length - 1, + }, + }, + severity: this.DIAGNOSTIC_SEVERITIES[offense.severity], + message: offense.message, + source: offense.cop_name, + code: this.code, + }; + } +} diff --git a/server/src/linters/Standard.ts b/server/src/linters/Standard.ts new file mode 100644 index 000000000..c310c5ea9 --- /dev/null +++ b/server/src/linters/Standard.ts @@ -0,0 +1,34 @@ +import { Diagnostic } from 'vscode-languageserver'; +import RuboCop, { IRuboCopResults } from './RuboCop'; + +export default class Standard extends RuboCop { + protected code = 'Standard'; + + get cmd(): string { + if (this.lintConfig.command) { + return this.lintConfig.command; + } else { + const command = 'standardrb'; + return this.isWindows() ? command + '.bat' : command; + } + } + + // This method is overridden to deal with the "notice" that is + // currently output + protected processResults(data): Diagnostic[] { + const lastCurly = data.lastIndexOf('}') + 1; + let results = [] as Diagnostic[]; + try { + const offenses: IRuboCopResults = JSON.parse(data.substring(0, lastCurly)); + + for (const file of offenses.files) { + const diagnostics = file.offenses.map(o => this.rubocopOffenseToDiagnostic(o)); + results = results.concat(diagnostics); + } + } catch (e) { + console.error(`Lint: Received invalid JSON from standardrb:\n\n${data}`); + } + + return results; + } +} diff --git a/server/src/linters/index.ts b/server/src/linters/index.ts new file mode 100644 index 000000000..8f4f3f48a --- /dev/null +++ b/server/src/linters/index.ts @@ -0,0 +1,4 @@ +export { ILinter, LinterConfig } from './BaseLinter'; +export { default as RuboCop } from './RuboCop'; +export { default as Reek } from './Reek'; +export { default as Standard } from './Standard'; diff --git a/server/src/providers/ASTProvider.ts b/server/src/providers/ASTProvider.ts deleted file mode 100644 index 9cc9910bd..000000000 --- a/server/src/providers/ASTProvider.ts +++ /dev/null @@ -1,93 +0,0 @@ -/** - * ASTProvider - */ - -import * as Parser from 'tree-sitter'; -// tslint:disable-next-line no-duplicate-imports -import { Point, SyntaxNode, Tree } from 'tree-sitter'; -import * as TreeSitterRuby from 'tree-sitter-ruby'; - -import { - DidChangeTextDocumentParams, - DidCloseTextDocumentParams, - DidOpenTextDocumentParams, - IConnection, - TextDocumentIdentifier, - TextDocumentItem, - VersionedTextDocumentIdentifier, -} from 'vscode-languageserver'; - -import { IForest } from '../Forest'; -import { Position } from '../Position'; - -export class ASTProvider { - private connection: IConnection; - private forest: IForest; - private parser: Parser; - - constructor(connection: IConnection, forest: IForest) { - this.connection = connection; - this.forest = forest; - this.parser = new Parser(); - this.parser.setLanguage(TreeSitterRuby); - - this.connection.onDidOpenTextDocument(this.handleOpenTextDocument); - this.connection.onDidChangeTextDocument(this.handleChangeTextDocument); - this.connection.onDidCloseTextDocument(this.handleCloseTextDocument); - } - - protected handleOpenTextDocument = async (params: DidOpenTextDocumentParams): Promise => { - const document: TextDocumentItem = params.textDocument; - const tree: Tree = this.parser.parse(document.text); - this.forest.setTree(document.uri, tree); - }; - - protected handleChangeTextDocument = async ( - params: DidChangeTextDocumentParams - ): Promise => { - const document: VersionedTextDocumentIdentifier = params.textDocument; - let tree: Tree = this.forest.getTree(document.uri); - if (tree !== undefined) { - for (const changeEvent of params.contentChanges) { - if (changeEvent.range && changeEvent.rangeLength) { - // range is range of the change. end is exclusive - // rangeLength is length of text removed - // text is new text - const { range, rangeLength, text } = changeEvent; - const startIndex: number = range.start.line * range.start.character; - const oldEndIndex: number = startIndex + rangeLength - 1; - tree.edit({ - startIndex, // index in old doc the change started - oldEndIndex, // end index for old version of text - newEndIndex: range.end.line * range.end.character - 1, // end index for new version of text - - startPosition: Position.FROM_VS_POSITION(range.start).toTSPosition(), // position in old doc change started - oldEndPosition: this.computeEndPosition(startIndex, oldEndIndex, tree), // position in old doc change ended. - newEndPosition: Position.FROM_VS_POSITION(range.end).toTSPosition(), // position in new doc change ended - }); - tree = this.parser.parse(text, tree); - } else { - tree = this.buildTree(changeEvent.text); - } - } - } - - this.forest.setTree(document.uri, tree); - }; - - protected handleCloseTextDocument = async (params: DidCloseTextDocumentParams): Promise => { - const document: TextDocumentIdentifier = params.textDocument; - this.forest.removeTree(document.uri); - }; - - private buildTree = (text: string): Tree => { - return this.parser.parse(text); - }; - - private computeEndPosition = (startIndex: number, endIndex: number, tree: Tree): Point => { - // TODO handle case where this method call fails for whatever reason - const node: SyntaxNode = tree.rootNode.descendantForIndex(startIndex, endIndex); - - return node.endPosition; - }; -} diff --git a/server/src/providers/ConfigurationProvider.ts b/server/src/providers/ConfigurationProvider.ts new file mode 100644 index 000000000..33fd02068 --- /dev/null +++ b/server/src/providers/ConfigurationProvider.ts @@ -0,0 +1,26 @@ +import { + IConnection, + DidChangeConfigurationParams, + DidChangeConfigurationNotification, +} from 'vscode-languageserver'; +import Provider from './Provider'; +import { documentConfigurationCache } from '../SettingsCache'; + +export default class ConfigurationProvider extends Provider { + static register(connection: IConnection) { + return new ConfigurationProvider(connection); + } + + constructor(connection: IConnection) { + super(connection); + + this.connection.client.register(DidChangeConfigurationNotification.type, undefined); + this.connection.onDidChangeConfiguration(this.handleDidChangeConfiguration); + } + + private handleDidChangeConfiguration = async ( + _params: DidChangeConfigurationParams // params is empty in the pull config model + ): Promise => { + documentConfigurationCache.flush(); + }; +} diff --git a/server/src/providers/DocumentFormattingProvider.ts b/server/src/providers/DocumentFormattingProvider.ts new file mode 100644 index 000000000..19285603a --- /dev/null +++ b/server/src/providers/DocumentFormattingProvider.ts @@ -0,0 +1,36 @@ +import { + IConnection, + DocumentFormattingParams, + DocumentRangeFormattingParams, + TextEdit, +} from 'vscode-languageserver'; +import Provider from './Provider'; +import Formatter from '../Formatter'; + +export default class DocumentFormattingProvider extends Provider { + static register(connection: IConnection) { + return new DocumentFormattingProvider(connection); + } + + constructor(connection: IConnection) { + super(connection); + this.connection.onDocumentFormatting(this.handleDocumentFormattingRequest); + this.connection.onDocumentRangeFormatting(this.handleDocumentRangeFormattingRequest); + } + + private handleDocumentFormattingRequest = async ( + params: DocumentFormattingParams + ): Promise => { + const { textDocument } = params; + + return Formatter.format(textDocument).toPromise(); + }; + + private handleDocumentRangeFormattingRequest = async ( + params: DocumentRangeFormattingParams + ): Promise => { + const { textDocument, range } = params; + + return Formatter.format(textDocument, range).toPromise(); + }; +} diff --git a/server/src/providers/DocumentHighlightProvider.ts b/server/src/providers/DocumentHighlightProvider.ts index 104b3ff2c..39d324248 100644 --- a/server/src/providers/DocumentHighlightProvider.ts +++ b/server/src/providers/DocumentHighlightProvider.ts @@ -4,104 +4,30 @@ * Super basic highlight provider */ -import { SyntaxNode, Tree } from 'tree-sitter'; -import { - DocumentHighlight, - DocumentHighlightKind, - IConnection, - Range, - TextDocumentPositionParams, -} from 'vscode-languageserver'; -import { IForest } from '../Forest'; -import { Position } from '../Position'; +import { DocumentHighlight, IConnection, TextDocumentPositionParams } from 'vscode-languageserver'; +import Position from '../util/Position'; +import Provider from './Provider'; +import DocumentHighlightAnalyzer from '../analyzers/DocumentHighlightAnalyzer'; // TODO support more highlight use cases than just balanced pairs -export class DocumentHighlightProvider { - private readonly BEGIN_TYPES: Set = new Set([ - 'begin', - 'def', - 'if', - 'case', - 'unless', - 'do', - 'class', - 'module', - ]); - - private connection: IConnection; - private forest: IForest; - - constructor(connection: IConnection, forest: IForest) { - this.connection = connection; - this.forest = forest; +export default class DocumentHighlightProvider extends Provider { + static register(connection: IConnection) { + return new DocumentHighlightProvider(connection); + } + constructor(connection: IConnection) { + super(connection); this.connection.onDocumentHighlight(this.handleDocumentHighlight); } protected handleDocumentHighlight = async ( - textDocumentPosition: TextDocumentPositionParams + params: TextDocumentPositionParams ): Promise => { - const tree: Tree = this.forest.getTree(textDocumentPosition.textDocument.uri); - const rootNode: SyntaxNode = tree.rootNode; - const position: Position = Position.FROM_VS_POSITION(textDocumentPosition.position); - const node: SyntaxNode = rootNode.descendantForPosition(position.toTSPosition()); - - return this.computeHighlights(node); + const position: Position = Position.fromVSPosition(params.position); + const { + textDocument: { uri }, + } = params; + return DocumentHighlightAnalyzer.analyze(uri, position); }; - - private computeHighlights(node: SyntaxNode): DocumentHighlight[] { - let highlights: DocumentHighlight[] = []; - - if (node.type === 'end') { - highlights = highlights.concat(this.computeEndHighlight(node)); - } - if (!node.isNamed && this.BEGIN_TYPES.has(node.type)) { - highlights = highlights.concat(this.computeBeginHighlight(node)); - } - - return highlights; - } - - private computeBeginHighlight(node: SyntaxNode): DocumentHighlight[] { - const endNode: SyntaxNode = node.parent.lastChild; - - return [ - DocumentHighlight.create( - Range.create( - Position.FROM_TS_POSITION(node.startPosition).toVSPosition(), - Position.FROM_TS_POSITION(node.endPosition).toVSPosition() - ), - DocumentHighlightKind.Text - ), - DocumentHighlight.create( - Range.create( - Position.FROM_TS_POSITION(endNode.startPosition).toVSPosition(), - Position.FROM_TS_POSITION(endNode.endPosition).toVSPosition() - ), - DocumentHighlightKind.Text - ), - ]; - } - - private computeEndHighlight(node: SyntaxNode): DocumentHighlight[] { - const startNode: SyntaxNode = node.parent.firstChild; - - return [ - DocumentHighlight.create( - Range.create( - Position.FROM_TS_POSITION(startNode.startPosition).toVSPosition(), - Position.FROM_TS_POSITION(startNode.endPosition).toVSPosition() - ), - DocumentHighlightKind.Text - ), - DocumentHighlight.create( - Range.create( - Position.FROM_TS_POSITION(node.startPosition).toVSPosition(), - Position.FROM_TS_POSITION(node.endPosition).toVSPosition() - ), - DocumentHighlightKind.Text - ), - ]; - } } diff --git a/server/src/providers/DocumentSymbolProvider.ts b/server/src/providers/DocumentSymbolProvider.ts new file mode 100644 index 000000000..fc589c546 --- /dev/null +++ b/server/src/providers/DocumentSymbolProvider.ts @@ -0,0 +1,24 @@ +import { DocumentSymbol, DocumentSymbolParams, IConnection } from 'vscode-languageserver'; +import Provider from './Provider'; +import { analyses } from '../Analyzer'; + +export default class DocumentSymbolProvider extends Provider { + static register(connection: IConnection) { + return new DocumentSymbolProvider(connection); + } + + constructor(connection: IConnection) { + super(connection); + this.connection.onDocumentSymbol(this.handleDocumentSymbol); + } + + private handleDocumentSymbol = async ( + params: DocumentSymbolParams + ): Promise => { + const { + textDocument: { uri }, + } = params; + const analysis = analyses.getAnalysis(uri); + return analysis.documentSymbols; + }; +} diff --git a/server/src/providers/FoldingRangeProvider.ts b/server/src/providers/FoldingRangeProvider.ts index 4b0533c89..207e2f45a 100644 --- a/server/src/providers/FoldingRangeProvider.ts +++ b/server/src/providers/FoldingRangeProvider.ts @@ -1,64 +1,32 @@ /* - * FoldingProvider - * - * Super basic highlight provider + * FoldingRangeProvider */ -import { SyntaxNode, Tree } from 'tree-sitter'; import { FoldingRange, - FoldingRangeKind, FoldingRangeRequest, - FoldingRangeRequestParam, + FoldingRangeParams, IConnection, } from 'vscode-languageserver'; -import { IForest } from '../Forest'; +import Provider from './Provider'; +import { analyses } from '../Analyzer'; -export class FoldingRangeProvider { - private connection: IConnection; - private forest: IForest; - private readonly FOLD_CONSTRUCTS: Set = new Set([ - 'begin', - 'def', - 'if', - 'case', - 'unless', - 'do', - 'class', - 'module', - ]); +export default class FoldingRangeProvider extends Provider { + static register(connection: IConnection) { + return new FoldingRangeProvider(connection); + } - constructor(connection: IConnection, forest: IForest) { - this.connection = connection; - this.forest = forest; + constructor(connection: IConnection) { + super(connection); this.connection.onRequest(FoldingRangeRequest.type, this.handleFoldingRange); } - protected handleFoldingRange = async ( - param: FoldingRangeRequestParam - ): Promise => { - const folds: FoldingRange[] = []; - - const tree: Tree = this.forest.getTree(param.textDocument.uri); - - const traverse: (node: SyntaxNode) => void = (node: SyntaxNode): void => { - if (!node.isNamed && this.FOLD_CONSTRUCTS.has(node.type)) { - const endNode: SyntaxNode = node.parent.lastChild; - folds.push({ - startLine: node.startPosition.row, - startCharacter: node.startPosition.column, - endLine: endNode.endPosition.row, - endCharacter: node.endPosition.column, - kind: FoldingRangeKind.Region, - }); - } - for (const childNode of node.children) { - traverse(childNode); - } - }; - traverse(tree.rootNode); - - return folds; + protected handleFoldingRange = async (params: FoldingRangeParams): Promise => { + const { + textDocument: { uri }, + } = params; + const analysis = analyses.getAnalysis(uri); + return analysis.foldingRanges; }; } diff --git a/server/src/providers/Provider.ts b/server/src/providers/Provider.ts new file mode 100644 index 000000000..e6706b1e9 --- /dev/null +++ b/server/src/providers/Provider.ts @@ -0,0 +1,9 @@ +import { IConnection } from 'vscode-languageserver'; + +export default abstract class Provider { + protected connection: IConnection; + + constructor(connection: IConnection) { + this.connection = connection; + } +} diff --git a/server/src/providers/WorkspaceProvider.ts b/server/src/providers/WorkspaceProvider.ts new file mode 100644 index 000000000..f4ae777c4 --- /dev/null +++ b/server/src/providers/WorkspaceProvider.ts @@ -0,0 +1,37 @@ +import Provider from './Provider'; +import { + DidChangeWatchedFilesParams, + IConnection, + WorkspaceFoldersChangeEvent, +} from 'vscode-languageserver'; + +import { workspaceRubyEnvironmentCache } from '../SettingsCache'; + +export default class WorkspaceProvider extends Provider { + static register(connection: IConnection) { + return new WorkspaceProvider(connection); + } + + constructor(connection: IConnection) { + super(connection); + + this.connection.workspace.onDidChangeWorkspaceFolders(this.handleWorkspaceFoldersChange); + this.connection.onDidChangeWatchedFiles(this.handleDidChangeWatchedFiles); + } + + private handleWorkspaceFoldersChange = async ( + event: WorkspaceFoldersChangeEvent + ): Promise => { + const loader = workspaceRubyEnvironmentCache.getAll(event.added); + const remover = workspaceRubyEnvironmentCache.deleteAll(event.removed); + await Promise.all([loader, remover]); + }; + + private handleDidChangeWatchedFiles = async ( + params: DidChangeWatchedFilesParams + ): Promise => { + console.log('Watched file change!'); + console.log(params); + // TODO load workspace environment again based on workspace where the file changed + }; +} diff --git a/server/src/Position.ts b/server/src/util/Position.ts similarity index 57% rename from server/src/Position.ts rename to server/src/util/Position.ts index bc019b1a8..c543330ba 100644 --- a/server/src/Position.ts +++ b/server/src/util/Position.ts @@ -7,23 +7,27 @@ import { Point as TSPosition } from 'tree-sitter'; import { Position as VSPosition } from 'vscode-languageserver'; -export class Position { - private row: number; - private col: number; +export default class Position { + public row: number; + public col: number; constructor(row: number, col: number) { this.row = row; this.col = col; } - public static FROM_VS_POSITION(position: VSPosition): Position { + public static fromVSPosition(position: VSPosition): Position { return new Position(position.line, position.character); } - public static FROM_TS_POSITION(position: TSPosition): Position { + public static fromTSPosition(position: TSPosition): Position { return new Position(position.row, position.column); } + public static tsPositionIsEqual(p1: TSPosition, p2: TSPosition): boolean { + return p1.row === p2.row && p1.column === p2.column; + } + public toVSPosition(): VSPosition { return VSPosition.create(this.row, this.col); } @@ -34,4 +38,8 @@ export class Position { column: this.col, }; } + + public isEqual(position: Position) { + return this.row === position.row && this.col === position.col; + } } diff --git a/server/src/util/RubyDocumentSymbol.ts b/server/src/util/RubyDocumentSymbol.ts new file mode 100644 index 000000000..950a14084 --- /dev/null +++ b/server/src/util/RubyDocumentSymbol.ts @@ -0,0 +1,84 @@ +import { DocumentSymbol, Range, SymbolKind } from 'vscode-languageserver'; +import { SyntaxNode } from 'tree-sitter'; +import Position from './Position'; + +const SYMBOLKINDS = { + method: SymbolKind.Method, + class: SymbolKind.Class, + module: SymbolKind.Module, + assignment: SymbolKind.Constant, + method_call: SymbolKind.Property, +}; + +const IDENTIFIER_NODES = { + module: 'constant', + class: 'constant', + method: 'identifier', + assignment: 'constant', + method_call: 'identifier', +}; + +export function isWrapper(node: SyntaxNode): boolean { + return IDENTIFIER_NODES.hasOwnProperty(node.type); +} + +export default class RubyDocumentSymbol { + static build(node: SyntaxNode): DocumentSymbol | DocumentSymbol[] | void { + const symbolKind = SYMBOLKINDS[node.type]; + if (!symbolKind) return; + + let symbol = new DocumentSymbol(); + symbol.range = Range.create( + Position.fromTSPosition(node.startPosition).toVSPosition(), + Position.fromTSPosition(node.endPosition).toVSPosition() + ); + symbol.kind = symbolKind; + + if (isWrapper(node)) { + if (!node.childCount) return; + const identifierNode = node.descendantsOfType(IDENTIFIER_NODES[node.type])[0]; + if (identifierNode) { + symbol.children = []; + symbol.name = identifierNode.text; + if (symbol.name === 'initialize') { + symbol.kind = SymbolKind.Constructor; + } + + // detect attr_ method calls + if (symbol.name.indexOf('attr_') === 0) { + const argumentList = node.descendantsOfType('argument_list')[0]; + const symbols = []; + for (const child of argumentList.children) { + if (!child.isNamed) continue; + const newSymbol = { + ...symbol, + }; + newSymbol.name = child.text[0] === ':' ? child.text.substring(1) : child.text; + newSymbol.selectionRange = Range.create( + Position.fromTSPosition(child.startPosition).toVSPosition(), + Position.fromTSPosition(child.endPosition).toVSPosition() + ); + + symbols.push(newSymbol); + } + + return symbols; + } else if (node.type !== 'method_call') { + symbol.selectionRange = Range.create( + Position.fromTSPosition(identifierNode.startPosition).toVSPosition(), + Position.fromTSPosition(identifierNode.endPosition).toVSPosition() + ); + } else { + return; + } + } else { + return; + } + } else { + symbol.selectionRange = symbol.range; + symbol.name = node.text; + } + + return symbol; + } +} diff --git a/server/src/util/Stack.ts b/server/src/util/Stack.ts new file mode 100644 index 000000000..fb1b58e7c --- /dev/null +++ b/server/src/util/Stack.ts @@ -0,0 +1,28 @@ +// Super simple stack +export default class Stack { + private stack: T[]; + + constructor() { + this.stack = []; + } + + get size() { + return this.stack.length; + } + + public push(value: T): void { + this.stack.push(value); + } + + public pop(): T { + return this.stack.pop(); + } + + public peek(): T { + return this.stack[this.size - 1]; + } + + public empty(): boolean { + return this.size === 0; + } +} diff --git a/server/src/util/index.ts b/server/src/util/index.ts new file mode 100644 index 000000000..8d1671b80 --- /dev/null +++ b/server/src/util/index.ts @@ -0,0 +1,3 @@ +export { default as Position } from './Position'; +export { default as RubyDocumentSymbol } from './RubyDocumentSymbol'; +export { default as Stack } from './Stack'; diff --git a/server/src/util/rebuilder.ts b/server/src/util/rebuilder.ts index a9d049ec5..d382e13fe 100644 --- a/server/src/util/rebuilder.ts +++ b/server/src/util/rebuilder.ts @@ -26,7 +26,6 @@ function downloadUrl(name: string, version: string): string { function fetchPrebuild(name: string): Promise { const pkgRoot: string = path.resolve(path.join(__dirname, '../../node_modules', name)); - //tslint:disable-next-line non-literal-require const pkg: { name: string; version: string } = require(`${pkgRoot}/package.json`); const url: string = downloadUrl(pkg.name, pkg.version); diff --git a/server/tsconfig.json b/server/tsconfig.json index 9b87a2901..a9afd9784 100644 --- a/server/tsconfig.json +++ b/server/tsconfig.json @@ -6,7 +6,6 @@ "moduleResolution": "node", "outDir": "out", "rootDir": "src", - "lib": [ "es6" ] }, "include": [ "src" @@ -14,4 +13,4 @@ "exclude": [ "node_modules" ] -} \ No newline at end of file +} diff --git a/src/providers/linters.ts b/src/providers/linters.ts index cec083d3d..8f2a9098c 100644 --- a/src/providers/linters.ts +++ b/src/providers/linters.ts @@ -1,6 +1,6 @@ import * as vscode from 'vscode'; import { ExtensionContext } from 'vscode'; -import * as debounce from 'lodash/debounce'; +import debounce from 'lodash/debounce'; import { LintCollection } from '../lint/lintCollection'; import { Config as LintConfig } from '../lint/lintConfig'; diff --git a/src/ruby.ts b/src/ruby.ts index bf45d9dea..b5bcbd5ef 100644 --- a/src/ruby.ts +++ b/src/ruby.ts @@ -23,6 +23,7 @@ let client; export function activate(context: ExtensionContext): void { // register language config languages.setLanguageConfiguration('ruby', languageConfiguration); + utils.getOutputChannel(); if (workspace.getConfiguration('ruby').useLanguageServer) { client = require('../client/out/extension'); @@ -30,6 +31,10 @@ export function activate(context: ExtensionContext): void { } else { // Register legacy providers registerHighlightProvider(context, DOCUMENT_SELECTOR); + + if (workspace.rootPath) { + registerLinters(context); + } } // Register providers @@ -38,7 +43,6 @@ export function activate(context: ExtensionContext): void { registerConfigurationProvider(); if (workspace.rootPath) { - registerLinters(context); registerIntellisenseProvider(context); registerTaskProvider(context); } diff --git a/src/typings/xmldom/xmldom.d.ts b/src/typings/xmldom/xmldom.d.ts deleted file mode 100644 index 3fbb2ec3e..000000000 --- a/src/typings/xmldom/xmldom.d.ts +++ /dev/null @@ -1,22 +0,0 @@ -declare module 'xmldom' { - export class DOMParser { - constructor(opts?: IDOMParserOpts); - parseFromString(xml: string, mimeType: string): XMLDocument; - } - export function DOMErrorHandler(error:string): void; - - export interface IDOMErrorLocator { - lineNumber: number; - columnNumber: number; - } - export interface IDOMError { - lineNumber: number; - columnNumber: number; - error: string; - type: string; - } - export interface IDOMParserOpts { - errorHandler?: Function; - locator?: IDOMErrorLocator; - } -} \ No newline at end of file diff --git a/tsconfig.base.json b/tsconfig.base.json index adf6abdfd..573152232 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -4,6 +4,8 @@ "noImplicitReturns": true, "noUnusedLocals": true, "noUnusedParameters": true, - "sourceMap": true + "sourceMap": true, + "esModuleInterop": true, + "lib": ["dom", "es2017"] } } diff --git a/tslint.json b/tslint.json index 8b80f194f..994e93316 100644 --- a/tslint.json +++ b/tslint.json @@ -1,6 +1,6 @@ { "defaultSeverity": "warning", - "extends": ["tslint-microsoft-contrib", "tslint-config-prettier"], + "extends": ["tslint-config-standard", "tslint-no-circular-imports", "tslint-config-prettier"], "jsRules": {}, "rules": { "missing-jsdoc": false,