diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js index 30585e1f33..762cc46708 100644 --- a/build/gulpfile.vscode.js +++ b/build/gulpfile.vscode.js @@ -72,6 +72,7 @@ const vsce = require('vsce'); const sqlBuiltInExtensions = [ // Add SQL built-in extensions here. // the extension will be excluded from SQLOps package and will have separate vsix packages + 'agent' ]; const vscodeEntryPoints = _.flatten([ @@ -120,6 +121,7 @@ const vscodeResources = [ 'out-build/sql/parts/grid/views/**/*.html', 'out-build/sql/parts/tasks/**/*.html', 'out-build/sql/parts/taskHistory/viewlet/media/**', + 'out-build/sql/parts/jobManagement/common/media/*.svg', 'out-build/sql/media/objectTypes/*.svg', 'out-build/sql/media/icons/*.svg', '!**/test/**' diff --git a/build/npm/postinstall.js b/build/npm/postinstall.js index 8ed5666f5a..b307903c80 100644 --- a/build/npm/postinstall.js +++ b/build/npm/postinstall.js @@ -34,7 +34,8 @@ const extensions = [ 'git', 'merge-conflict', 'insights-default', - 'account-provider-azure' + 'account-provider-azure', + 'agent' ]; extensions.forEach(extension => yarnInstall(`extensions/${extension}`)); diff --git a/build/yarn.lock b/build/yarn.lock index 2604ce7966..cdd2483219 100644 --- a/build/yarn.lock +++ b/build/yarn.lock @@ -27,8 +27,8 @@ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-0.0.29.tgz#fbcfd330573b912ef59eeee14602bface630754b" "@types/node@*": - version "8.0.51" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.51.tgz#b31d716fb8d58eeb95c068a039b9b6292817d5fb" + version "9.4.7" + resolved "https://registry.yarnpkg.com/@types/node/-/node-9.4.7.tgz#57d81cd98719df2c9de118f2d5f3b1120dcd7275" "@types/node@8.0.33": version "8.0.33" @@ -44,13 +44,6 @@ agent-base@4, agent-base@^4.1.0: dependencies: es6-promisify "^5.0.0" -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - ajv@^5.1.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" @@ -170,19 +163,19 @@ aws4@^1.2.1, aws4@^1.6.0: resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" azure-storage@^2.1.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/azure-storage/-/azure-storage-2.6.0.tgz#84747ee54a4bd194bb960f89f3eff89d67acf1cf" + version "2.8.1" + resolved "https://registry.yarnpkg.com/azure-storage/-/azure-storage-2.8.1.tgz#ecb9d050ef1395e79ffbb652c02fe643687bec63" dependencies: browserify-mime "~1.2.9" extend "~1.2.1" json-edm-parser "0.1.2" md5.js "1.3.4" readable-stream "~2.0.0" - request "~2.81.0" + request "~2.83.0" underscore "~1.8.3" uuid "^3.0.0" - validator "~3.35.0" - xml2js "0.2.7" + validator "~9.4.1" + xml2js "0.2.8" xmlbuilder "0.4.3" balanced-match@^1.0.0: @@ -242,8 +235,8 @@ boom@5.x.x: hoek "4.x.x" brace-expansion@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -319,12 +312,12 @@ clone@^2.1.1: resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.1.tgz#d217d1e961118e3ac9a4b8bba3285553bf647cdb" cloneable-readable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.0.0.tgz#a6290d413f217a61232f95e458ff38418cfb0117" + version "1.1.2" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65" dependencies: inherits "^2.0.1" - process-nextick-args "^1.0.6" - through2 "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" co@^4.6.0: version "4.6.0" @@ -334,9 +327,9 @@ color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" +combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" dependencies: delayed-stream "~1.0.0" @@ -345,8 +338,8 @@ commander@2.11.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" commander@^2.9.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + version "2.15.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.0.tgz#ad2a23a1c3b036e392469b8012cec6b33b4c1322" commander@~2.8.1: version "2.8.1" @@ -384,9 +377,9 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.1.3": - version "0.1.3" - resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/5758b2a5804ea488d14326662f51d19cc970ccd0" +"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.1.5": + version "0.1.5" + resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/21b0bacfc759689a6c280408528c6029a21b1abf" dependencies: vscode-languageclient "3.5.0" @@ -394,12 +387,6 @@ dateformat@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" -debug@2: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - debug@3.1.0, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" @@ -488,8 +475,8 @@ duplexer@~0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" duplexify@^3.2.0: - version "3.5.3" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.3.tgz#8b5818800df92fd0125b27ab896491912858243e" + version "3.5.4" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.4.tgz#4bb46c1796eabebeec4ca9a2e66b808cb7a3d8b4" dependencies: end-of-stream "^1.0.0" inherits "^2.0.1" @@ -524,7 +511,7 @@ escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2: event-stream@^3.3.1, event-stream@~3.3.4: version "3.3.4" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + resolved "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" dependencies: duplexer "~0.1.1" from "~0" @@ -569,7 +556,7 @@ extend@~1.2.1: "extensions-modules@file:../extensions-modules": version "0.1.0" dependencies: - dataprotocol-client "github:Microsoft/sqlops-dataprotocolclient#0.1.3" + dataprotocol-client "github:Microsoft/sqlops-dataprotocolclient#0.1.5" decompress "^4.2.0" fs-extra-promise "^1.0.1" http-proxy-agent "^2.0.0" @@ -577,7 +564,7 @@ extend@~1.2.1: opener "^1.4.3" tmp "0.0.33" vscode-extension-telemetry "0.0.8" - vscode-languageclient "^3.5.0" + vscode-languageclient "3.5.0" extglob@^0.3.1: version "0.3.2" @@ -585,10 +572,14 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" -extsprintf@1.3.0, extsprintf@^1.2.0: +extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + fancy-log@^1.1.0: version "1.3.2" resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" @@ -598,8 +589,8 @@ fancy-log@^1.1.0: time-stamp "^1.0.0" fast-deep-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" fast-json-stable-stringify@^2.0.0: version "2.0.0" @@ -664,11 +655,11 @@ form-data@~2.1.1: mime-types "^2.1.12" form-data@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" dependencies: asynckit "^0.4.0" - combined-stream "^1.0.5" + combined-stream "1.0.6" mime-types "^2.1.12" from@~0: @@ -900,10 +891,6 @@ gulplog@^1.0.0: dependencies: glogg "^1.0.0" -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" @@ -917,13 +904,6 @@ har-validator@~2.0.6: is-my-json-valid "^2.12.4" pinkie-promise "^2.0.0" -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - har-validator@~5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" @@ -981,15 +961,15 @@ hoek@2.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" hoek@4.x.x: - version "4.2.0" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" + version "4.2.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" http-proxy-agent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.0.0.tgz#46482a2f0523a4d6082551709f469cb3e4a85ff4" + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" dependencies: agent-base "4" - debug "2" + debug "3.1.0" http-signature@~1.1.0: version "1.1.1" @@ -1008,15 +988,15 @@ http-signature@~1.2.0: sshpk "^1.7.0" https-proxy-agent@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.1.1.tgz#a7ce4382a1ba8266ee848578778122d491260fd9" + version "2.2.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.0.tgz#7fbba856be8cd677986f42ebd3664f6317257887" dependencies: agent-base "^4.1.0" debug "^3.1.0" ieee754@^1.1.4: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + version "1.1.10" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.10.tgz#719a6f7b026831e64bdb838b0de1bb0029bbf716" inflight@^1.0.4: version "1.0.6" @@ -1067,12 +1047,17 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" +is-my-ip-valid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" + is-my-json-valid@^2.12.4: - version "2.17.1" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz#3da98914a70a22f0a8563ef1511a246c6fc55471" + version "2.17.2" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c" dependencies: generate-function "^2.0.0" generate-object-property "^1.1.0" + is-my-ip-valid "^1.0.0" jsonpointer "^4.0.0" xtend "^4.0.0" @@ -1164,7 +1149,7 @@ json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" -json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: +json-stable-stringify@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" dependencies: @@ -1311,8 +1296,8 @@ lodash.templatesettings@^3.0.0: lodash.escape "^3.0.0" make-dir@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" + version "1.2.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.2.0.tgz#6d6a49eead4aae296c53bbf3a1a008bd6c89469b" dependencies: pify "^3.0.0" @@ -1351,19 +1336,19 @@ micromatch@^2.3.7: parse-glob "^3.0.4" regex-cache "^0.4.2" -mime-db@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7: - version "2.1.17" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" dependencies: - mime-db "~1.30.0" + mime-db "~1.33.0" mime@^1.3.4: - version "1.4.1" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" "minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.4: version "3.0.4" @@ -1498,10 +1483,6 @@ pend@~1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - performance-now@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" @@ -1542,7 +1523,11 @@ priorityqueuejs@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/priorityqueuejs/-/priorityqueuejs-1.0.0.tgz#2ee4f23c2560913e08c07ce5ccdd6de3df2c5af8" -process-nextick-args@^1.0.6, process-nextick-args@~1.0.6: +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" @@ -1554,10 +1539,6 @@ qs@~6.3.0: version "6.3.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" @@ -1594,14 +1575,14 @@ randomatic@^1.1.3: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.1.5: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d" dependencies: core-util-is "~1.0.0" inherits "~2.0.3" isarray "~1.0.0" - process-nextick-args "~1.0.6" + process-nextick-args "~2.0.0" safe-buffer "~5.1.1" string_decoder "~1.0.3" util-deprecate "~1.0.1" @@ -1653,8 +1634,8 @@ replace-ext@^1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" request@^2.83.0: - version "2.83.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + version "2.85.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" dependencies: aws-sign2 "~0.7.0" aws4 "^1.6.0" @@ -1704,32 +1685,32 @@ request@~2.79.0: tunnel-agent "~0.4.1" uuid "^3.0.0" -request@~2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" +request@~2.83.0: + version "2.83.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" + aws-sign2 "~0.7.0" + aws4 "^1.6.0" caseless "~0.12.0" combined-stream "~1.0.5" - extend "~3.0.0" + extend "~3.0.1" forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" tunnel-agent "^0.6.0" - uuid "^3.0.0" + uuid "^3.1.0" requires-port@~1.0.0: version "1.0.0" @@ -1745,9 +1726,9 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" -sax@0.5.2: - version "0.5.2" - resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.2.tgz#735ffaa39a1cff8ffb9598f0223abdb03a9fb2ea" +sax@0.5.x: + version "0.5.8" + resolved "https://registry.yarnpkg.com/sax/-/sax-0.5.8.tgz#d472db228eb331c2506b0e8c15524adb939d12c1" sax@>=0.6.0: version "1.2.4" @@ -1780,8 +1761,8 @@ sntp@2.x.x: hoek "4.x.x" source-map-support@^0.5.0: - version "0.5.2" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.2.tgz#1a6297fd5b2e762b39688c7fc91233b60984f0a5" + version "0.5.4" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.4.tgz#54456efa89caa9270af7cd624cc2f123e51fbae8" dependencies: source-map "^0.6.0" @@ -1800,8 +1781,8 @@ split@0.3: through "2" sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + version "1.14.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -1917,7 +1898,7 @@ through2@^0.6.0, through2@~0.6.5: readable-stream ">=1.0.33-1 <1.1.0-0" xtend ">=4.0.0 <4.1.0-0" -through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0, through2@~2.0.3: +through2@^2.0.0, through2@^2.0.3, through2@~2.0.0, through2@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" dependencies: @@ -1945,8 +1926,8 @@ to-absolute-glob@^0.1.1: extend-shallow "^2.0.1" tough-cookie@~2.3.0, tough-cookie@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" dependencies: punycode "^1.4.1" @@ -1997,11 +1978,7 @@ util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" -uuid@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" - -uuid@^3.1.0: +uuid@^3.0.0, uuid@^3.1.0: version "3.2.1" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" @@ -2009,9 +1986,9 @@ vali-date@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" -validator@~3.35.0: - version "3.35.0" - resolved "https://registry.yarnpkg.com/validator/-/validator-3.35.0.tgz#3f07249402c1fc8fc093c32c6e43d72a79cca1dc" +validator@~9.4.1: + version "9.4.1" + resolved "https://registry.yarnpkg.com/validator/-/validator-9.4.1.tgz#abf466d398b561cd243050112c6ff1de6cc12663" verror@1.10.0: version "1.10.0" @@ -2103,30 +2080,30 @@ vscode-extension-telemetry@0.0.8: applicationinsights "0.18.0" winreg "1.2.3" -vscode-jsonrpc@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.5.0.tgz#87239d9e166b2d7352245b8a813597804c1d63aa" +vscode-jsonrpc@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.6.0.tgz#848d56995d5168950d84feb5d9c237ae5c6a02d4" -vscode-languageclient@3.5.0, vscode-languageclient@^3.5.0: +vscode-languageclient@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-3.5.0.tgz#36d02cc186a8365a4467719a290fb200a9ae490a" dependencies: vscode-languageserver-protocol "^3.5.0" vscode-languageserver-protocol@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.5.0.tgz#067c5cbe27709795398d119692c97ebba1452209" + version "3.6.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.6.0.tgz#579642cdcccf74b0cd771c33daa3239acb40d040" dependencies: - vscode-jsonrpc "^3.5.0" - vscode-languageserver-types "^3.5.0" + vscode-jsonrpc "^3.6.0" + vscode-languageserver-types "^3.6.0" -vscode-languageserver-types@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.5.0.tgz#e48d79962f0b8e02de955e3f524908e2b19c0374" +vscode-languageserver-types@^3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.6.1.tgz#4bc06a48dff653495f12f94b8b1e228988a1748d" vscode@^1.0.1: - version "1.1.10" - resolved "https://registry.yarnpkg.com/vscode/-/vscode-1.1.10.tgz#d1cba378ab24f1d3ddf9cd470d242ee1472dd35b" + version "1.1.13" + resolved "https://registry.yarnpkg.com/vscode/-/vscode-1.1.13.tgz#dcea0c5f3ec1ff6eca333216b4b20dd994d18d9a" dependencies: glob "^7.1.2" gulp-chmod "^2.0.0" @@ -2151,11 +2128,11 @@ wrappy@1: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" -xml2js@0.2.7: - version "0.2.7" - resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.2.7.tgz#1838518bb01741cae0878bab4915e494c32306af" +xml2js@0.2.8: + version "0.2.8" + resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.2.8.tgz#9b81690931631ff09d1957549faf54f4f980b3c2" dependencies: - sax "0.5.2" + sax "0.5.x" xml2js@^0.4.17: version "0.4.19" @@ -2169,8 +2146,8 @@ xmlbuilder@0.4.3: resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-0.4.3.tgz#c4614ba74e0ad196e609c9272cd9e1ddb28a8a58" xmlbuilder@~9.0.1: - version "9.0.4" - resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.4.tgz#519cb4ca686d005a8420d3496f3f0caeecca580f" + version "9.0.7" + resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-9.0.7.tgz#132ee63d2ec5565c557e20f4c22df9aca686b10d" "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: version "4.0.1" diff --git a/extensions-modules/package.json b/extensions-modules/package.json index 30ed51b871..3d94912ff4 100644 --- a/extensions-modules/package.json +++ b/extensions-modules/package.json @@ -1,7 +1,7 @@ { "name": "extensions-modules", "version": "0.1.0", - "description": "Shared modules for Carbon extensions", + "description": "Shared modules for SQL Operations Studio extensions", "dependencies": { "dataprotocol-client": "github:Microsoft/sqlops-dataprotocolclient#0.1.5", "decompress": "^4.2.0", @@ -11,7 +11,7 @@ "opener": "^1.4.3", "tmp": "0.0.33", "vscode-extension-telemetry": "0.0.8", - "vscode-languageclient": "^3.5.0" + "vscode-languageclient": "3.5.0" }, "devDependencies": { "@types/node": "^6.0.61", diff --git a/extensions-modules/src/languageservice/serviceClient.ts b/extensions-modules/src/languageservice/serviceClient.ts index 3560f63cfd..7b4d834c1e 100644 --- a/extensions-modules/src/languageservice/serviceClient.ts +++ b/extensions-modules/src/languageservice/serviceClient.ts @@ -5,7 +5,7 @@ 'use strict'; import { ExtensionContext, workspace, window, OutputChannel, languages } from 'vscode'; -import { SqlOpsDataClient, ClientOptions } from 'dataprotocol-client'; +import * as SqlopsClient from 'dataprotocol-client'; import { CloseAction, ErrorAction, ServerOptions, NotificationHandler, NotificationType, RequestType, TransportKind } from 'vscode-languageclient'; import { VscodeWrapper } from '../controllers/vscodeWrapper'; @@ -132,14 +132,14 @@ export class SqlToolsServiceClient { } // VS Code Language Client - private _client: SqlOpsDataClient = undefined; + private _client: SqlopsClient.SqlOpsDataClient = undefined; // getter method for the Language Client - private get client(): SqlOpsDataClient { + private get client(): SqlopsClient.SqlOpsDataClient { return this._client; } - private set client(client: SqlOpsDataClient) { + private set client(client: SqlopsClient.SqlOpsDataClient) { this._client = client; } @@ -317,9 +317,9 @@ export class SqlToolsServiceClient { } } - public createClient(context: ExtensionContext, runtimeId: Runtime, languageClientHelper: LanguageServiceContracts.ILanguageClientHelper, executableFiles: string[]): Promise { - return new Promise((resolve, reject) => { - let client: SqlOpsDataClient; + public createClient(context: ExtensionContext, runtimeId: Runtime, languageClientHelper: LanguageServiceContracts.ILanguageClientHelper, executableFiles: string[]): Promise { + return new Promise((resolve, reject) => { + let client: SqlopsClient.SqlOpsDataClient; this._server.findServerPath(this.installDirectory, executableFiles).then(serverPath => { if (serverPath === undefined) { reject(new Error(SqlToolsServiceClient._constants.invalidServiceFilePath)); @@ -329,7 +329,7 @@ export class SqlToolsServiceClient { languageClientHelper.createServerOptions(serverPath, runtimeId) : this.createServerOptions(serverPath); // Options to control the language client - let clientOptions: ClientOptions = { + let clientOptions: SqlopsClient.ClientOptions = { documentSelector: [SqlToolsServiceClient._constants.languageId], providerId: '', synchronize: { @@ -357,7 +357,7 @@ export class SqlToolsServiceClient { this._serviceStatus.showServiceLoading(); // cache the client instance for later use - client = new SqlOpsDataClient(SqlToolsServiceClient._constants.serviceName, serverOptions, clientOptions); + client = new SqlopsClient.SqlOpsDataClient(SqlToolsServiceClient._constants.serviceName, serverOptions, clientOptions); if (context !== undefined) { // Create the language client and start the client. @@ -404,9 +404,9 @@ export class SqlToolsServiceClient { return serverOptions; } - private createLanguageClient(serverOptions: ServerOptions): SqlOpsDataClient { + private createLanguageClient(serverOptions: ServerOptions): SqlopsClient.SqlOpsDataClient { // Options to control the language client - let clientOptions: ClientOptions = { + let clientOptions: SqlopsClient.ClientOptions = { documentSelector: [SqlToolsServiceClient._constants.languageId], providerId: SqlToolsServiceClient._constants.providerId, synchronize: { @@ -427,12 +427,28 @@ export class SqlToolsServiceClient { name: '', show: () => { } - } + }, + features: [ + SqlopsClient.AdminServicesFeature, + SqlopsClient.BackupFeature, + SqlopsClient.CapabilitiesFeature, + SqlopsClient.ConnectionFeature, + SqlopsClient.FileBrowserFeature, + SqlopsClient.MetadataFeature, + SqlopsClient.ObjectExplorerFeature, + SqlopsClient.ProfilerFeature, + SqlopsClient.QueryFeature, + SqlopsClient.RestoreFeature, + SqlopsClient.ScriptingFeature, + SqlopsClient.TaskServicesFeature, + // heres the important bit + LanguageServiceContracts.AgentServicesFeature + ] }; this._serviceStatus.showServiceLoading(); // cache the client instance for later use - let client = new SqlOpsDataClient(SqlToolsServiceClient._constants.serviceName, serverOptions, clientOptions); + let client = new SqlopsClient.SqlOpsDataClient(SqlToolsServiceClient._constants.serviceName, serverOptions, clientOptions); client.onReady().then(() => { this.checkServiceCompatibility(); this._serviceStatus.showServiceLoaded(); @@ -478,7 +494,7 @@ export class SqlToolsServiceClient { * @param params The params to pass with the request * @returns A thenable object for when the request receives a response */ - public sendRequest(type: RequestType, params?: P, client: SqlOpsDataClient = undefined): Thenable { + public sendRequest(type: RequestType, params?: P, client: SqlopsClient.SqlOpsDataClient = undefined): Thenable { if (client === undefined) { client = this._client; } @@ -492,7 +508,7 @@ export class SqlToolsServiceClient { * @param type The notification type to register the handler for * @param handler The handler to register */ - public onNotification(type: NotificationType, handler: NotificationHandler

, client: SqlOpsDataClient = undefined): void { + public onNotification(type: NotificationType, handler: NotificationHandler

, client: SqlopsClient.SqlOpsDataClient = undefined): void { if (client === undefined) { client = this._client; } diff --git a/extensions-modules/src/models/contracts/languageService.ts b/extensions-modules/src/models/contracts/languageService.ts index 1113338349..1e8545711e 100644 --- a/extensions-modules/src/models/contracts/languageService.ts +++ b/extensions-modules/src/models/contracts/languageService.ts @@ -2,9 +2,13 @@ * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the Source EULA. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { NotificationType, ServerOptions } from 'vscode-languageclient'; +import { NotificationType, ServerOptions, RequestType, RPCMessageType, ClientCapabilities, ServerCapabilities } from 'vscode-languageclient'; import { ITelemetryEventProperties, ITelemetryEventMeasures } from '../telemetry'; import { Runtime } from '../platform'; +import { SqlOpsFeature, SqlOpsDataClient } from 'dataprotocol-client'; +import * as sqlops from 'sqlops'; +import * as UUID from 'vscode-languageclient/lib/utils/uuid'; +import { Disposable } from 'vscode'; // ------------------------------- < Telemetry Sent Event > ------------------------------------ @@ -56,4 +60,120 @@ export class StatusChangeParams { export interface ILanguageClientHelper { createServerOptions(servicePath: string, runtimeId?: Runtime): ServerOptions; -} \ No newline at end of file +} + +// Job Management types +export interface AgentJobsParams { + ownerUri: string; + jobId: string; +} + +export interface AgentJobsResult { + succeeded: boolean; + errorMessage: string; + jobs: sqlops.AgentJobInfo[]; +} + +export interface AgentJobHistoryParams { + ownerUri: string; + jobId: string; +} + +export interface AgentJobHistoryResult { + succeeded: boolean; + errorMessage: string; + jobs: sqlops.AgentJobHistoryInfo[]; +} + +export interface AgentJobActionParams { + ownerUri: string; + jobName: string; + action: string; +} + +export interface AgentJobActionResult { + succeeded: boolean; + errorMessage: string; +} + +export namespace AgentJobsRequest { + export const type = new RequestType('agent/jobs'); +} + +export namespace AgentJobHistoryRequest { + export const type = new RequestType('agent/jobhistory'); +} + + +export namespace AgentJobActionRequest { + export const type = new RequestType('agent/jobaction'); +} + +export class AgentServicesFeature extends SqlOpsFeature { + private static readonly messagesTypes: RPCMessageType[] = [ + AgentJobsRequest.type, + AgentJobHistoryRequest.type, + AgentJobActionRequest.type + ]; + + constructor(client: SqlOpsDataClient) { + super(client, AgentServicesFeature.messagesTypes); + } + + public fillClientCapabilities(capabilities: ClientCapabilities): void { + // this isn't explicitly necessary + // ensure(ensure(capabilities, 'connection')!, 'agentServices')!.dynamicRegistration = true; + } + + public initialize(capabilities: ServerCapabilities): void { + this.register(this.messages, { + id: UUID.generateUuid(), + registerOptions: undefined + }); + } + + protected registerProvider(options: undefined): Disposable { + const client = this._client; + + let getJobs = (ownerUri: string): Thenable => { + let params: AgentJobsParams = { ownerUri: ownerUri, jobId: null }; + return client.sendRequest(AgentJobsRequest.type, params).then( + r => r, + e => { + client.logFailedRequest(AgentJobsRequest.type, e); + return Promise.resolve(undefined); + } + ); + }; + + let getJobHistory = (connectionUri: string, jobID: string): Thenable => { + let params: AgentJobHistoryParams = { ownerUri: connectionUri, jobId: jobID }; + + return client.sendRequest(AgentJobHistoryRequest.type, params).then( + r => r, + e => { + client.logFailedRequest(AgentJobHistoryRequest.type, e); + return Promise.resolve(undefined); + } + ); + }; + + let jobAction = (connectionUri: string, jobName: string, action: string): Thenable => { + let params: AgentJobActionParams = { ownerUri: connectionUri, jobName: jobName, action: action }; + return client.sendRequest(AgentJobActionRequest.type, params).then( + r => r, + e => { + client.logFailedRequest(AgentJobActionRequest.type, e); + return Promise.resolve(undefined); + } + ); + }; + + return sqlops.dataprotocol.registerAgentServicesProvider({ + providerId: client.providerId, + getJobs, + getJobHistory, + jobAction + }); + } +} diff --git a/extensions-modules/yarn.lock b/extensions-modules/yarn.lock index 219d2994c5..42bbfd36af 100644 --- a/extensions-modules/yarn.lock +++ b/extensions-modules/yarn.lock @@ -912,8 +912,8 @@ https-proxy-agent@^2.1.0: debug "^3.1.0" ieee754@^1.1.4: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + version "1.1.10" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.10.tgz#719a6f7b026831e64bdb838b0de1bb0029bbf716" inflight@^1.0.4: version "1.0.6" @@ -1941,24 +1941,24 @@ vscode-extension-telemetry@0.0.8: applicationinsights "0.18.0" winreg "1.2.3" -vscode-jsonrpc@^3.5.0: +vscode-jsonrpc@3.5.0, vscode-jsonrpc@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.5.0.tgz#87239d9e166b2d7352245b8a813597804c1d63aa" -vscode-languageclient@3.5.0, vscode-languageclient@^3.5.0: +vscode-languageclient@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-3.5.0.tgz#36d02cc186a8365a4467719a290fb200a9ae490a" dependencies: vscode-languageserver-protocol "^3.5.0" -vscode-languageserver-protocol@^3.5.0: +vscode-languageserver-protocol@3.5.0, vscode-languageserver-protocol@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.5.0.tgz#067c5cbe27709795398d119692c97ebba1452209" dependencies: vscode-jsonrpc "^3.5.0" vscode-languageserver-types "^3.5.0" -vscode-languageserver-types@^3.5.0: +vscode-languageserver-types@3.5.0, vscode-languageserver-types@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.5.0.tgz#e48d79962f0b8e02de955e3f524908e2b19c0374" diff --git a/extensions/agent/.vscodeignore b/extensions/agent/.vscodeignore new file mode 100644 index 0000000000..a48535cae1 --- /dev/null +++ b/extensions/agent/.vscodeignore @@ -0,0 +1,2 @@ +client/src/** +client/tsconfig.json diff --git a/extensions/agent/README.md b/extensions/agent/README.md new file mode 100644 index 0000000000..8e87e4df1b --- /dev/null +++ b/extensions/agent/README.md @@ -0,0 +1,23 @@ +# Microsoft SQL Server Agent for SQL Operations Studio + +Welcome to Microsoft SQL Server Agent for SQL Operations Studio! An extension for managing and troubleshooting +SQL Server Agent jobs and configuration. The current is a very early release of this extension that provides +basic functionality for the following. + +* List SQL Server Agent Jobs configured on a SQL Server +* View Job History with job execution results +* Basic Job Control to start and stop jobs + +## Code of Conduct + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. + +## Privacy Statement + +The [Microsoft Enterprise and Developer Privacy Statement](https://privacy.microsoft.com/en-us/privacystatement) describes the privacy statement of this software. + +## License + +Copyright (c) Microsoft Corporation. All rights reserved. + +Licensed under the [Source EULA](https://raw.githubusercontent.com/Microsoft/sqlopsstudio/master/LICENSE.txt). diff --git a/extensions/agent/client/src/apiWrapper.ts b/extensions/agent/client/src/apiWrapper.ts new file mode 100644 index 0000000000..038d5e6f0f --- /dev/null +++ b/extensions/agent/client/src/apiWrapper.ts @@ -0,0 +1,63 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; +import * as vscode from 'vscode'; +import * as data from 'sqlops'; + +/** + * Wrapper class to act as a facade over VSCode and Data APIs and allow us to test / mock callbacks into + * this API from our code + * + * @export + * @class ApiWrapper + */ +export class ApiWrapper { + // Data APIs + + public registerWebviewProvider(widgetId: string, handler: (webview: data.DashboardWebview) => void): void { + return data.dashboard.registerWebviewProvider(widgetId, handler); + } + + + public registerControlHostProvider(widgetId: string, handler: (webview: data.DashboardWebview) => void): void { + return data.dashboard.registerWebviewProvider(widgetId, handler); + } + + /** + * Get the configuration for a extensionName + * @param extensionName The string name of the extension to get the configuration for + * @param resource The optional URI, as a URI object or a string, to use to get resource-scoped configurations + */ + public getConfiguration(extensionName: string, resource?: vscode.Uri | string): vscode.WorkspaceConfiguration { + if (typeof resource === 'string') { + try { + resource = this.parseUri(resource); + } catch (e) { + resource = undefined; + } + } + return vscode.workspace.getConfiguration(extensionName, resource as vscode.Uri); + } + + /** + * Parse uri + */ + public parseUri(uri: string): vscode.Uri { + return vscode.Uri.parse(uri); + } + + public showOpenDialog(options: vscode.OpenDialogOptions): Thenable { + return vscode.window.showOpenDialog(options); + } + + public showErrorMessage(message: string, ...items: string[]): Thenable { + return vscode.window.showErrorMessage(message, ...items); + } + + public get workspaceRootPath(): string { + return vscode.workspace.rootPath; + } +} diff --git a/extensions/agent/client/src/main.ts b/extensions/agent/client/src/main.ts new file mode 100644 index 0000000000..8160e56b2d --- /dev/null +++ b/extensions/agent/client/src/main.ts @@ -0,0 +1,23 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import vscode = require('vscode'); +import { MainController } from './mainController'; +import { ApiWrapper } from './apiWrapper'; +export let controller: MainController; + +export function activate(context: vscode.ExtensionContext) { + let apiWrapper = new ApiWrapper(); + controller = new MainController(context, apiWrapper); + controller.activate(); +} + +// this method is called when your extension is deactivated +export function deactivate(): void { + if (controller) { + controller.deactivate(); + } +} diff --git a/extensions/agent/client/src/mainController.ts b/extensions/agent/client/src/mainController.ts new file mode 100644 index 0000000000..8fe98f5a3f --- /dev/null +++ b/extensions/agent/client/src/mainController.ts @@ -0,0 +1,38 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +'use strict'; + +import * as vscode from 'vscode'; +import * as data from 'sqlops'; +import { ApiWrapper } from './apiWrapper'; + +/** + * The main controller class that initializes the extension + */ +export class MainController { + protected _apiWrapper: ApiWrapper; + protected _context: vscode.ExtensionContext; + + // PUBLIC METHODS ////////////////////////////////////////////////////// + public constructor(context: vscode.ExtensionContext, apiWrapper?: ApiWrapper) { + this._apiWrapper = apiWrapper || new ApiWrapper(); + this._context = context; + + console.log('Got: ' + apiWrapper); + } + + /** + * Deactivates the extension + */ + public deactivate(): void { + } + + public activate(): void { + + this._apiWrapper.registerWebviewProvider('data-management-agent', webview => { + webview.html = '

SQL Agent

'; + }); + } +} diff --git a/extensions/agent/client/src/typings/ref.d.ts b/extensions/agent/client/src/typings/ref.d.ts new file mode 100644 index 0000000000..642b4842ad --- /dev/null +++ b/extensions/agent/client/src/typings/ref.d.ts @@ -0,0 +1,8 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +/// +/// +/// \ No newline at end of file diff --git a/extensions/agent/client/tsconfig.json b/extensions/agent/client/tsconfig.json new file mode 100644 index 0000000000..e6baa6d40d --- /dev/null +++ b/extensions/agent/client/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compileOnSave": true, + "compilerOptions": { + "module": "commonjs", + "target": "es6", + "outDir": "./out", + "lib": [ + "es6", "es2015.promise" + ], + "sourceMap": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "declaration": true + }, + "exclude": [ + "node_modules" + ] +} diff --git a/extensions/agent/images/sqlserver.png b/extensions/agent/images/sqlserver.png new file mode 100644 index 0000000000..d884faa14a Binary files /dev/null and b/extensions/agent/images/sqlserver.png differ diff --git a/extensions/agent/package.json b/extensions/agent/package.json new file mode 100644 index 0000000000..b80da63381 --- /dev/null +++ b/extensions/agent/package.json @@ -0,0 +1,46 @@ +{ + "name": "agent", + "displayName": "SQL Server Agent", + "description": "Manage and troubleshoot SQL Agent jobs (early preview)", + "version": "0.27.0", + "publisher": "Microsoft", + "preview": true, + "license": "https://raw.githubusercontent.com/Microsoft/sqlopsstudio/master/LICENSE.txt", + "icon": "images/sqlserver.png", + "aiKey": "AIF-5574968e-856d-40d2-af67-c89a14e76412", + "engines": { + "vscode": "0.10.x" + }, + "activationEvents": [ + "*" + ], + "main": "./client/out/main", + "scripts": { + "compile": "gulp compile-extension:agent-client" + }, + "repository": { + "type": "git", + "url": "https://github.com/Microsoft/sqlopsstudio.git" + }, + "contributes": { + "outputChannels": [ + "sqlagent" + ], + "dashboard.tabs": [ + { + "id": "data-management-agent", + "description": "Manage and troubleshoot SQL Agent jobs", + "provider": "MSSQL", + "title": "SQL Agent", + "container": { + "controlhost-container": { + "type": "agent" + } + } + } + ] + }, + "devDependencies": { + "vscode": "1.0.1" + } +} diff --git a/extensions/agent/yarn.lock b/extensions/agent/yarn.lock new file mode 100644 index 0000000000..12255dbdf4 --- /dev/null +++ b/extensions/agent/yarn.lock @@ -0,0 +1,2085 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +ajv@^5.1.0: + version "5.5.2" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" + dependencies: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +amdefine@>=0.0.4: + version "1.0.1" + resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" + +ansi-gray@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ansi-gray/-/ansi-gray-0.1.1.tgz#2962cf54ec9792c48510a3deb524436861ef7251" + dependencies: + ansi-wrap "0.1.0" + +ansi-regex@^0.2.0, ansi-regex@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-styles@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-1.1.0.tgz#eaecbf66cd706882760b2f4691582b8f55d7a7de" + +ansi-styles@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" + +ansi-wrap@0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" + +arr-diff@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" + dependencies: + arr-flatten "^1.0.1" + +arr-flatten@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" + +array-differ@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" + +array-find-index@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1, array-uniq@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +array-unique@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +asn1@~0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" + +assert-plus@1.0.0, assert-plus@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" + +assert-plus@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + +aws-sign2@~0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" + +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.2.1, aws4@^1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +bcrypt-pbkdf@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" + dependencies: + tweetnacl "^0.14.3" + +beeper@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" + +block-stream@*: + version "0.0.9" + resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" + dependencies: + inherits "~2.0.0" + +boom@2.x.x: + version "2.10.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" + dependencies: + hoek "2.x.x" + +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^1.8.2: + version "1.8.5" + resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" + dependencies: + expand-range "^1.8.1" + preserve "^0.2.0" + repeat-element "^1.1.2" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + +builtin-modules@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" + +camelcase-keys@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" + dependencies: + camelcase "^2.0.0" + map-obj "^1.0.0" + +camelcase@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" + +caseless@~0.11.0: + version "0.11.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" + +caseless@~0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" + +chalk@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.5.1.tgz#663b3a648b68b55d04690d49167aa837858f2174" + dependencies: + ansi-styles "^1.1.0" + escape-string-regexp "^1.0.0" + has-ansi "^0.1.0" + strip-ansi "^0.3.0" + supports-color "^0.2.0" + +chalk@^1.0.0, chalk@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +clone-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" + +clone-stats@^0.0.1, clone-stats@~0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" + +clone-stats@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" + +clone@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" + +clone@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" + +cloneable-readable@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.0.0.tgz#a6290d413f217a61232f95e458ff38418cfb0117" + dependencies: + inherits "^2.0.1" + process-nextick-args "^1.0.6" + through2 "^2.0.1" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +color-support@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" + +combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" + dependencies: + delayed-stream "~1.0.0" + +commander@0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-0.6.1.tgz#fa68a14f6a945d54dbbe50d8cdb3320e9e3b1a06" + +commander@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" + +commander@^2.9.0: + version "2.14.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.14.1.tgz#2235123e37af8ca3c65df45b026dbd357b01b9aa" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +convert-source-map@^1.1.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + +core-util-is@1.0.2, core-util-is@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" + +cryptiles@2.x.x: + version "2.0.5" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" + dependencies: + boom "2.x.x" + +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + +currently-unhandled@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" + dependencies: + array-find-index "^1.0.1" + +dashdash@^1.12.0: + version "1.14.1" + resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" + dependencies: + assert-plus "^1.0.0" + +dateformat@^1.0.7-1.2.3: + version "1.0.12" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-1.0.12.tgz#9f124b67594c937ff706932e4a642cca8dbbfee9" + dependencies: + get-stdin "^4.0.1" + meow "^3.3.0" + +dateformat@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" + +debug@2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" + dependencies: + ms "0.7.1" + +decamelize@^1.1.2: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + +deep-assign@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-1.0.0.tgz#b092743be8427dc621ea0067cdec7e70dd19f37b" + dependencies: + is-obj "^1.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + +diff@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" + +duplexer2@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" + dependencies: + readable-stream "~1.1.9" + +duplexer@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" + +duplexify@^3.2.0: + version "3.5.3" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.3.tgz#8b5818800df92fd0125b27ab896491912858243e" + dependencies: + end-of-stream "^1.0.0" + inherits "^2.0.1" + readable-stream "^2.0.0" + stream-shift "^1.0.0" + +ecc-jsbn@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" + dependencies: + jsbn "~0.1.0" + +end-of-stream@^1.0.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + dependencies: + once "^1.4.0" + +error-ex@^1.2.0: + version "1.3.1" + resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" + dependencies: + is-arrayish "^0.2.1" + +escape-string-regexp@1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz#4dbc2fe674e71949caf3fb2695ce7f2dc1d9a8d1" + +escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + +event-stream@^3.3.1, event-stream@~3.3.4: + version "3.3.4" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.3" + stream-combiner "~0.0.4" + through "~2.3.1" + +event-stream@~3.1.5: + version "3.1.7" + resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.1.7.tgz#b4c540012d0fe1498420f3d8946008db6393c37a" + dependencies: + duplexer "~0.1.1" + from "~0" + map-stream "~0.1.0" + pause-stream "0.0.11" + split "0.2" + stream-combiner "~0.0.4" + through "~2.3.1" + +expand-brackets@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" + dependencies: + is-posix-bracket "^0.1.0" + +expand-range@^1.8.1: + version "1.8.2" + resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" + dependencies: + fill-range "^2.1.0" + +extend-shallow@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" + dependencies: + is-extendable "^0.1.0" + +extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" + +extglob@^0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" + dependencies: + is-extglob "^1.0.0" + +extsprintf@1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" + +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + +fancy-log@^1.1.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.2.tgz#f41125e3d84f2e7d89a43d06d958c8f78be16be1" + dependencies: + ansi-gray "^0.1.1" + color-support "^1.1.3" + time-stamp "^1.0.0" + +fast-deep-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + dependencies: + pend "~1.2.0" + +filename-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" + +fill-range@^2.1.0: + version "2.2.3" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" + dependencies: + is-number "^2.1.0" + isobject "^2.0.0" + randomatic "^1.1.3" + repeat-element "^1.1.2" + repeat-string "^1.5.2" + +find-up@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" + dependencies: + path-exists "^2.0.0" + pinkie-promise "^2.0.0" + +first-chunk-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" + +for-own@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" + dependencies: + for-in "^1.0.1" + +forever-agent@~0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" + +form-data@~2.1.1: + version "2.1.4" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + +form-data@~2.3.1: + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" + dependencies: + asynckit "^0.4.0" + combined-stream "1.0.6" + mime-types "^2.1.12" + +from@~0: + version "0.1.7" + resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +fstream@~0.1.28: + version "0.1.31" + resolved "https://registry.yarnpkg.com/fstream/-/fstream-0.1.31.tgz#7337f058fbbbbefa8c9f561a28cab0849202c988" + dependencies: + graceful-fs "~3.0.2" + inherits "~2.0.0" + mkdirp "0.5" + rimraf "2" + +generate-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" + +generate-object-property@^1.1.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" + dependencies: + is-property "^1.0.0" + +get-stdin@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" + +getpass@^0.1.1: + version "0.1.7" + resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" + dependencies: + assert-plus "^1.0.0" + +glob-base@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" + dependencies: + glob-parent "^2.0.0" + is-glob "^2.0.0" + +glob-parent@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" + dependencies: + is-glob "^2.0.0" + +glob-parent@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" + dependencies: + is-glob "^3.1.0" + path-dirname "^1.0.0" + +glob-stream@^5.3.2: + version "5.3.5" + resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" + dependencies: + extend "^3.0.0" + glob "^5.0.3" + glob-parent "^3.0.0" + micromatch "^2.3.7" + ordered-read-streams "^0.3.0" + through2 "^0.6.0" + to-absolute-glob "^0.1.1" + unique-stream "^2.0.2" + +glob@3.2.11: + version "3.2.11" + resolved "https://registry.yarnpkg.com/glob/-/glob-3.2.11.tgz#4a973f635b9190f715d10987d5c00fd2815ebe3d" + dependencies: + inherits "2" + minimatch "0.3" + +glob@^5.0.15, glob@^5.0.3: + version "5.0.15" + resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" + dependencies: + inflight "^1.0.4" + inherits "2" + minimatch "2 || 3" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.0.5: + version "7.1.2" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" + dependencies: + 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" + +glogg@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.1.tgz#dcf758e44789cc3f3d32c1f3562a3676e6a34810" + dependencies: + sparkles "^1.0.0" + +graceful-fs@^4.0.0, graceful-fs@^4.1.2: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +graceful-fs@~3.0.2: + version "3.0.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-3.0.11.tgz#7613c778a1afea62f25c630a086d7f3acbbdd818" + dependencies: + natives "^1.1.0" + +growl@1.9.2: + version "1.9.2" + resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" + +gulp-chmod@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/gulp-chmod/-/gulp-chmod-1.3.0.tgz#8bb6e8c11895dcbf9b42520c874347a5022bcb0d" + dependencies: + deep-assign "^1.0.0" + stat-mode "^0.2.0" + through2 "^2.0.0" + +gulp-filter@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/gulp-filter/-/gulp-filter-4.0.0.tgz#395f58a256c559cdb9e0d157f1caaf5248a38dcb" + dependencies: + gulp-util "^3.0.6" + multimatch "^2.0.0" + streamfilter "^1.0.5" + +gulp-gunzip@0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/gulp-gunzip/-/gulp-gunzip-0.0.3.tgz#7b6e07b0f58fd3d42515c48ead5a63df0572f62f" + dependencies: + through2 "~0.6.5" + vinyl "~0.4.6" + +gulp-remote-src@^0.4.0: + version "0.4.3" + resolved "https://registry.yarnpkg.com/gulp-remote-src/-/gulp-remote-src-0.4.3.tgz#5728cfd643433dd4845ddef0969f0f971a2ab4a1" + dependencies: + event-stream "~3.3.4" + node.extend "~1.1.2" + request "~2.79.0" + through2 "~2.0.3" + vinyl "~2.0.1" + +gulp-sourcemaps@1.6.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" + dependencies: + convert-source-map "^1.1.1" + graceful-fs "^4.1.2" + strip-bom "^2.0.0" + through2 "^2.0.0" + vinyl "^1.0.0" + +gulp-symdest@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/gulp-symdest/-/gulp-symdest-1.1.0.tgz#c165320732d192ce56fd94271ffa123234bf2ae0" + dependencies: + event-stream "^3.3.1" + mkdirp "^0.5.1" + queue "^3.1.0" + vinyl-fs "^2.4.3" + +gulp-untar@0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/gulp-untar/-/gulp-untar-0.0.4.tgz#635cc7d67d3d48aec0dbc69822623fc7c33f7d37" + dependencies: + event-stream "~3.1.5" + gulp-util "~2.2.14" + streamifier "~0.1.0" + tar "~0.1.19" + through2 "~0.4.1" + +gulp-util@^3.0.6: + version "3.0.8" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" + dependencies: + array-differ "^1.0.0" + array-uniq "^1.0.2" + beeper "^1.0.0" + chalk "^1.0.0" + dateformat "^2.0.0" + fancy-log "^1.1.0" + gulplog "^1.0.0" + has-gulplog "^0.1.0" + lodash._reescape "^3.0.0" + lodash._reevaluate "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.template "^3.0.0" + minimist "^1.1.0" + multipipe "^0.1.2" + object-assign "^3.0.0" + replace-ext "0.0.1" + through2 "^2.0.0" + vinyl "^0.5.0" + +gulp-util@~2.2.14: + version "2.2.20" + resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-2.2.20.tgz#d7146e5728910bd8f047a6b0b1e549bc22dbd64c" + dependencies: + chalk "^0.5.0" + dateformat "^1.0.7-1.2.3" + lodash._reinterpolate "^2.4.1" + lodash.template "^2.4.1" + minimist "^0.2.0" + multipipe "^0.1.0" + through2 "^0.5.0" + vinyl "^0.2.1" + +gulp-vinyl-zip@^1.1.2: + version "1.4.0" + resolved "https://registry.yarnpkg.com/gulp-vinyl-zip/-/gulp-vinyl-zip-1.4.0.tgz#56382f2ccb57231bb0478c78737ccd572973bee1" + dependencies: + event-stream "^3.3.1" + queue "^3.0.10" + through2 "^0.6.3" + vinyl "^0.4.6" + vinyl-fs "^2.0.0" + yauzl "^2.2.1" + yazl "^2.2.1" + +gulplog@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" + dependencies: + glogg "^1.0.0" + +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + +har-validator@~2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" + dependencies: + chalk "^1.1.1" + commander "^2.9.0" + is-my-json-valid "^2.12.4" + pinkie-promise "^2.0.0" + +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + +has-ansi@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-0.1.0.tgz#84f265aae8c0e6a88a12d7022894b7568894c62e" + dependencies: + ansi-regex "^0.2.0" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-gulplog@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" + dependencies: + sparkles "^1.0.0" + +hawk@~3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" + dependencies: + boom "2.x.x" + cryptiles "2.x.x" + hoek "2.x.x" + sntp "1.x.x" + +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + +hoek@2.x.x: + version "2.16.3" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" + +hoek@4.x.x: + version "4.2.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" + +hosted-git-info@^2.1.4: + version "2.5.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + +http-signature@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" + dependencies: + assert-plus "^0.2.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + +indent-string@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" + dependencies: + repeating "^2.0.0" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" + +is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" + +is-builtin-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" + dependencies: + builtin-modules "^1.0.0" + +is-dotfile@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" + +is-equal-shallow@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" + dependencies: + is-primitive "^2.0.0" + +is-extendable@^0.1.0, is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" + +is-extglob@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" + +is-extglob@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + +is-finite@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" + dependencies: + number-is-nan "^1.0.0" + +is-glob@^2.0.0, is-glob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" + dependencies: + is-extglob "^1.0.0" + +is-glob@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" + dependencies: + is-extglob "^2.1.0" + +is-my-ip-valid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" + +is-my-json-valid@^2.12.4: + version "2.17.2" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c" + dependencies: + generate-function "^2.0.0" + generate-object-property "^1.1.0" + is-my-ip-valid "^1.0.0" + jsonpointer "^4.0.0" + xtend "^4.0.0" + +is-number@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" + dependencies: + kind-of "^3.0.2" + +is-number@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" + dependencies: + kind-of "^3.0.2" + +is-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + +is-posix-bracket@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" + +is-primitive@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" + +is-property@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" + +is-stream@^1.0.1, is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + +is-typedarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + +is-utf8@^0.2.0: + version "0.2.1" + resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" + +is-valid-glob@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" + +is@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/is/-/is-3.2.1.tgz#d0ac2ad55eb7b0bec926a5266f6c662aaa83dca5" + +isarray@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" + +isarray@1.0.0, isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isobject@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" + dependencies: + isarray "1.0.0" + +isstream@~0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + +jade@0.26.3: + version "0.26.3" + resolved "https://registry.yarnpkg.com/jade/-/jade-0.26.3.tgz#8f10d7977d8d79f2f6ff862a81b0513ccb25686c" + dependencies: + commander "0.6.1" + mkdirp "0.3.0" + +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-schema@0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" + +json-stable-stringify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" + dependencies: + jsonify "~0.0.0" + +json-stringify-safe@~5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" + +jsonify@~0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" + +jsonpointer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" + +jsprim@^1.2.2: + version "1.4.1" + resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz#313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2" + dependencies: + assert-plus "1.0.0" + extsprintf "1.3.0" + json-schema "0.2.3" + verror "1.10.0" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" + dependencies: + is-buffer "^1.1.5" + +kind-of@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" + dependencies: + is-buffer "^1.1.5" + +lazystream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" + dependencies: + readable-stream "^2.0.5" + +load-json-file@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" + dependencies: + graceful-fs "^4.1.2" + parse-json "^2.2.0" + pify "^2.0.0" + pinkie-promise "^2.0.0" + strip-bom "^2.0.0" + +lodash._basecopy@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" + +lodash._basetostring@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" + +lodash._basevalues@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" + +lodash._escapehtmlchar@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._escapehtmlchar/-/lodash._escapehtmlchar-2.4.1.tgz#df67c3bb6b7e8e1e831ab48bfa0795b92afe899d" + dependencies: + lodash._htmlescapes "~2.4.1" + +lodash._escapestringchar@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._escapestringchar/-/lodash._escapestringchar-2.4.1.tgz#ecfe22618a2ade50bfeea43937e51df66f0edb72" + +lodash._getnative@^3.0.0: + version "3.9.1" + resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" + +lodash._htmlescapes@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._htmlescapes/-/lodash._htmlescapes-2.4.1.tgz#32d14bf0844b6de6f8b62a051b4f67c228b624cb" + +lodash._isiterateecall@^3.0.0: + version "3.0.9" + resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" + +lodash._isnative@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._isnative/-/lodash._isnative-2.4.1.tgz#3ea6404b784a7be836c7b57580e1cdf79b14832c" + +lodash._objecttypes@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._objecttypes/-/lodash._objecttypes-2.4.1.tgz#7c0b7f69d98a1f76529f890b0cdb1b4dfec11c11" + +lodash._reescape@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" + +lodash._reevaluate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" + +lodash._reinterpolate@^2.4.1, lodash._reinterpolate@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-2.4.1.tgz#4f1227aa5a8711fc632f5b07a1f4607aab8b3222" + +lodash._reinterpolate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" + +lodash._reunescapedhtml@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._reunescapedhtml/-/lodash._reunescapedhtml-2.4.1.tgz#747c4fc40103eb3bb8a0976e571f7a2659e93ba7" + dependencies: + lodash._htmlescapes "~2.4.1" + lodash.keys "~2.4.1" + +lodash._root@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" + +lodash._shimkeys@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash._shimkeys/-/lodash._shimkeys-2.4.1.tgz#6e9cc9666ff081f0b5a6c978b83e242e6949d203" + dependencies: + lodash._objecttypes "~2.4.1" + +lodash.defaults@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-2.4.1.tgz#a7e8885f05e68851144b6e12a8f3678026bc4c54" + dependencies: + lodash._objecttypes "~2.4.1" + lodash.keys "~2.4.1" + +lodash.escape@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" + dependencies: + lodash._root "^3.0.0" + +lodash.escape@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-2.4.1.tgz#2ce12c5e084db0a57dda5e5d1eeeb9f5d175a3b4" + dependencies: + lodash._escapehtmlchar "~2.4.1" + lodash._reunescapedhtml "~2.4.1" + lodash.keys "~2.4.1" + +lodash.isarguments@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" + +lodash.isarray@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" + +lodash.isequal@^4.0.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" + +lodash.isobject@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.isobject/-/lodash.isobject-2.4.1.tgz#5a2e47fe69953f1ee631a7eba1fe64d2d06558f5" + dependencies: + lodash._objecttypes "~2.4.1" + +lodash.keys@^3.0.0: + version "3.1.2" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" + dependencies: + lodash._getnative "^3.0.0" + lodash.isarguments "^3.0.0" + lodash.isarray "^3.0.0" + +lodash.keys@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-2.4.1.tgz#48dea46df8ff7632b10d706b8acb26591e2b3727" + dependencies: + lodash._isnative "~2.4.1" + lodash._shimkeys "~2.4.1" + lodash.isobject "~2.4.1" + +lodash.restparam@^3.0.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" + +lodash.template@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-2.4.1.tgz#9e611007edf629129a974ab3c48b817b3e1cf20d" + dependencies: + lodash._escapestringchar "~2.4.1" + lodash._reinterpolate "~2.4.1" + lodash.defaults "~2.4.1" + lodash.escape "~2.4.1" + lodash.keys "~2.4.1" + lodash.templatesettings "~2.4.1" + lodash.values "~2.4.1" + +lodash.template@^3.0.0: + version "3.6.2" + resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" + dependencies: + lodash._basecopy "^3.0.0" + lodash._basetostring "^3.0.0" + lodash._basevalues "^3.0.0" + lodash._isiterateecall "^3.0.0" + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + lodash.keys "^3.0.0" + lodash.restparam "^3.0.0" + lodash.templatesettings "^3.0.0" + +lodash.templatesettings@^3.0.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" + dependencies: + lodash._reinterpolate "^3.0.0" + lodash.escape "^3.0.0" + +lodash.templatesettings@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-2.4.1.tgz#ea76c75d11eb86d4dbe89a83893bb861929ac699" + dependencies: + lodash._reinterpolate "~2.4.1" + lodash.escape "~2.4.1" + +lodash.values@~2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-2.4.1.tgz#abf514436b3cb705001627978cbcf30b1280eea4" + dependencies: + lodash.keys "~2.4.1" + +loud-rejection@^1.0.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" + dependencies: + currently-unhandled "^0.4.1" + signal-exit "^3.0.0" + +lru-cache@2: + version "2.7.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" + +map-obj@^1.0.0, map-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" + +map-stream@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" + +meow@^3.3.0: + version "3.7.0" + resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" + dependencies: + camelcase-keys "^2.0.0" + decamelize "^1.1.2" + loud-rejection "^1.0.0" + map-obj "^1.0.1" + minimist "^1.1.3" + normalize-package-data "^2.3.4" + object-assign "^4.0.1" + read-pkg-up "^1.0.1" + redent "^1.0.0" + trim-newlines "^1.0.0" + +merge-stream@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" + dependencies: + readable-stream "^2.0.1" + +micromatch@^2.3.7: + version "2.3.11" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" + dependencies: + 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" + +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" + +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7: + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" + dependencies: + mime-db "~1.33.0" + +minimatch@0.3: + version "0.3.0" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" + dependencies: + lru-cache "2" + sigmund "~1.0.0" + +"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +minimist@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.2.0.tgz#4dffe525dae2b864c66c2e23c6271d7afdecefce" + +minimist@^1.1.0, minimist@^1.1.3: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + +mkdirp@0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" + +mkdirp@0.5, mkdirp@0.5.1, mkdirp@^0.5.0, mkdirp@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +mocha@^2.3.3: + version "2.5.3" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-2.5.3.tgz#161be5bdeb496771eb9b35745050b622b5aefc58" + dependencies: + commander "2.3.0" + debug "2.2.0" + diff "1.4.0" + escape-string-regexp "1.0.2" + glob "3.2.11" + growl "1.9.2" + jade "0.26.3" + mkdirp "0.5.1" + supports-color "1.2.0" + to-iso-string "0.0.2" + +ms@0.7.1: + version "0.7.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" + +multimatch@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" + dependencies: + array-differ "^1.0.0" + array-union "^1.0.1" + arrify "^1.0.0" + minimatch "^3.0.0" + +multipipe@^0.1.0, multipipe@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" + dependencies: + duplexer2 "0.0.2" + +natives@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.1.tgz#011acce1f7cbd87f7ba6b3093d6cd9392be1c574" + +node.extend@~1.1.2: + version "1.1.6" + resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.1.6.tgz#a7b882c82d6c93a4863a5504bd5de8ec86258b96" + dependencies: + is "^3.1.0" + +normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: + version "2.4.0" + resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.4.0.tgz#12f95a307d58352075a04907b84ac8be98ac012f" + dependencies: + hosted-git-info "^2.1.4" + is-builtin-module "^1.0.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-path@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" + dependencies: + remove-trailing-separator "^1.0.1" + +number-is-nan@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" + +oauth-sign@~0.8.1, oauth-sign@~0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" + +object-assign@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" + +object-assign@^4.0.0, object-assign@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +object-keys@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-0.4.0.tgz#28a6aae7428dd2c3a92f3d95f21335dd204e0336" + +object.omit@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" + dependencies: + for-own "^0.1.4" + is-extendable "^0.1.1" + +once@^1.3.0, once@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +ordered-read-streams@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" + dependencies: + is-stream "^1.0.1" + readable-stream "^2.0.1" + +parse-glob@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" + dependencies: + glob-base "^0.3.0" + is-dotfile "^1.0.0" + is-extglob "^1.0.0" + is-glob "^2.0.0" + +parse-json@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" + dependencies: + error-ex "^1.2.0" + +path-dirname@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" + +path-exists@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" + dependencies: + pinkie-promise "^2.0.0" + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" + +path-type@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" + dependencies: + graceful-fs "^4.1.2" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +pause-stream@0.0.11: + version "0.0.11" + resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" + dependencies: + through "~2.3" + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +preserve@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" + +process-nextick-args@^1.0.6: + version "1.0.7" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +punycode@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" + +qs@~6.3.0: + version "6.3.2" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" + +qs@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + +queue@^3.0.10, queue@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/queue/-/queue-3.1.0.tgz#6c49d01f009e2256788789f2bffac6b8b9990585" + dependencies: + inherits "~2.0.0" + +randomatic@^1.1.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.7.tgz#c7abe9cc8b87c0baa876b19fde83fd464797e38c" + dependencies: + is-number "^3.0.0" + kind-of "^4.0.0" + +read-pkg-up@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" + dependencies: + find-up "^1.0.0" + read-pkg "^1.0.0" + +read-pkg@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" + dependencies: + load-json-file "^1.0.0" + normalize-package-data "^2.3.2" + path-type "^1.0.0" + +"readable-stream@>=1.0.33-1 <1.1.0-0", readable-stream@~1.0.17: + version "1.0.34" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.1.5: + version "2.3.4" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.4.tgz#c946c3f47fa7d8eabc0b6150f4a12f69a4574071" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.0.3" + util-deprecate "~1.0.1" + +readable-stream@~1.1.9: + version "1.1.14" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.1" + isarray "0.0.1" + string_decoder "~0.10.x" + +redent@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" + dependencies: + indent-string "^2.1.0" + strip-indent "^1.0.1" + +regex-cache@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.4.tgz#75bdc58a2a1496cec48a12835bc54c8d562336dd" + dependencies: + is-equal-shallow "^0.1.3" + +remove-trailing-separator@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz#c24bce2a283adad5bc3f58e0d48249b92379d8ef" + +repeat-element@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" + +repeat-string@^1.5.2: + version "1.6.1" + resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" + +repeating@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" + dependencies: + is-finite "^1.0.0" + +replace-ext@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" + +replace-ext@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" + +request@^2.67.0: + version "2.83.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +request@~2.79.0: + version "2.79.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" + dependencies: + aws-sign2 "~0.6.0" + aws4 "^1.2.1" + caseless "~0.11.0" + combined-stream "~1.0.5" + extend "~3.0.0" + forever-agent "~0.6.1" + form-data "~2.1.1" + har-validator "~2.0.6" + hawk "~3.1.3" + http-signature "~1.1.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.7" + oauth-sign "~0.8.1" + qs "~6.3.0" + stringstream "~0.0.4" + tough-cookie "~2.3.0" + tunnel-agent "~0.4.1" + uuid "^3.0.0" + +rimraf@2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + dependencies: + glob "^7.0.5" + +safe-buffer@^5.0.1, safe-buffer@^5.1.1, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" + +"semver@2 || 3 || 4 || 5", semver@^5.1.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + +sigmund@~1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" + +signal-exit@^3.0.0: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +sntp@1.x.x: + version "1.0.9" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" + dependencies: + hoek "2.x.x" + +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + dependencies: + hoek "4.x.x" + +source-map-support@^0.3.2: + version "0.3.3" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.3.3.tgz#34900977d5ba3f07c7757ee72e73bb1a9b53754f" + dependencies: + source-map "0.1.32" + +source-map@0.1.32: + version "0.1.32" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.32.tgz#c8b6c167797ba4740a8ea33252162ff08591b266" + dependencies: + amdefine ">=0.0.4" + +sparkles@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" + +spdx-correct@~1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" + dependencies: + spdx-license-ids "^1.0.2" + +spdx-expression-parse@~1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" + +spdx-license-ids@^1.0.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" + +split@0.2: + version "0.2.10" + resolved "https://registry.yarnpkg.com/split/-/split-0.2.10.tgz#67097c601d697ce1368f418f06cd201cf0521a57" + dependencies: + through "2" + +split@0.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" + dependencies: + through "2" + +sshpk@^1.7.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + dependencies: + asn1 "~0.2.3" + assert-plus "^1.0.0" + dashdash "^1.12.0" + getpass "^0.1.1" + optionalDependencies: + bcrypt-pbkdf "^1.0.0" + ecc-jsbn "~0.1.1" + jsbn "~0.1.0" + tweetnacl "~0.14.0" + +stat-mode@^0.2.0: + version "0.2.2" + resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" + +stream-combiner@~0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" + dependencies: + duplexer "~0.1.1" + +stream-shift@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" + +streamfilter@^1.0.5: + version "1.0.7" + resolved "https://registry.yarnpkg.com/streamfilter/-/streamfilter-1.0.7.tgz#ae3e64522aa5a35c061fd17f67620c7653c643c9" + dependencies: + readable-stream "^2.0.2" + +streamifier@~0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/streamifier/-/streamifier-0.1.1.tgz#97e98d8fa4d105d62a2691d1dc07e820db8dfc4f" + +string_decoder@~0.10.x: + version "0.10.31" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" + +string_decoder@~1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.3.tgz#0fc67d7c141825de94282dd536bec6b9bce860ab" + dependencies: + safe-buffer "~5.1.0" + +stringstream@~0.0.4, stringstream@~0.0.5: + version "0.0.5" + resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" + +strip-ansi@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" + dependencies: + ansi-regex "^0.2.1" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-bom-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" + dependencies: + first-chunk-stream "^1.0.0" + strip-bom "^2.0.0" + +strip-bom@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" + dependencies: + is-utf8 "^0.2.0" + +strip-indent@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" + dependencies: + get-stdin "^4.0.1" + +supports-color@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-1.2.0.tgz#ff1ed1e61169d06b3cf2d588e188b18d8847e17e" + +supports-color@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +tar@~0.1.19: + version "0.1.20" + resolved "https://registry.yarnpkg.com/tar/-/tar-0.1.20.tgz#42940bae5b5f22c74483699126f9f3f27449cb13" + dependencies: + block-stream "*" + fstream "~0.1.28" + inherits "2" + +through2-filter@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" + dependencies: + through2 "~2.0.0" + xtend "~4.0.0" + +through2@^0.5.0: + version "0.5.1" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.5.1.tgz#dfdd012eb9c700e2323fd334f38ac622ab372da7" + dependencies: + readable-stream "~1.0.17" + xtend "~3.0.0" + +through2@^0.6.0, through2@^0.6.3, through2@~0.6.5: + version "0.6.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" + dependencies: + readable-stream ">=1.0.33-1 <1.1.0-0" + xtend ">=4.0.0 <4.1.0-0" + +through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0, through2@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" + dependencies: + readable-stream "^2.1.5" + xtend "~4.0.1" + +through2@~0.4.1: + version "0.4.2" + resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" + dependencies: + readable-stream "~1.0.17" + xtend "~2.1.1" + +through@2, through@~2.3, through@~2.3.1: + version "2.3.8" + resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +time-stamp@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" + +to-absolute-glob@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" + dependencies: + extend-shallow "^2.0.1" + +to-iso-string@0.0.2: + version "0.0.2" + resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" + +tough-cookie@~2.3.0, tough-cookie@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + dependencies: + punycode "^1.4.1" + +trim-newlines@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" + +tunnel-agent@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + dependencies: + safe-buffer "^5.0.1" + +tunnel-agent@~0.4.1: + version "0.4.3" + resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" + +tweetnacl@^0.14.3, tweetnacl@~0.14.0: + version "0.14.5" + resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" + +unique-stream@^2.0.2: + version "2.2.1" + resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" + dependencies: + json-stable-stringify "^1.0.0" + through2-filter "^2.0.0" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +uuid@^3.0.0, uuid@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" + +vali-date@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" + +validate-npm-package-license@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + dependencies: + spdx-correct "~1.0.0" + spdx-expression-parse "~1.0.0" + +verror@1.10.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400" + dependencies: + assert-plus "^1.0.0" + core-util-is "1.0.2" + extsprintf "^1.2.0" + +vinyl-fs@^2.0.0, vinyl-fs@^2.4.3: + version "2.4.4" + resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" + dependencies: + duplexify "^3.2.0" + glob-stream "^5.3.2" + graceful-fs "^4.0.0" + gulp-sourcemaps "1.6.0" + is-valid-glob "^0.3.0" + lazystream "^1.0.0" + lodash.isequal "^4.0.0" + merge-stream "^1.0.0" + mkdirp "^0.5.0" + object-assign "^4.0.0" + readable-stream "^2.0.4" + strip-bom "^2.0.0" + strip-bom-stream "^1.0.0" + through2 "^2.0.0" + through2-filter "^2.0.0" + vali-date "^1.0.0" + vinyl "^1.0.0" + +vinyl-source-stream@^1.1.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz#62b53a135610a896e98ca96bee3a87f008a8e780" + dependencies: + through2 "^2.0.3" + vinyl "^0.4.3" + +vinyl@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.2.3.tgz#bca938209582ec5a49ad538a00fa1f125e513252" + dependencies: + clone-stats "~0.0.1" + +vinyl@^0.4.3, vinyl@^0.4.6, vinyl@~0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" + dependencies: + clone "^0.2.0" + clone-stats "^0.0.1" + +vinyl@^0.5.0: + version "0.5.3" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" + dependencies: + clone "^1.0.0" + clone-stats "^0.0.1" + replace-ext "0.0.1" + +vinyl@~2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.0.2.tgz#0a3713d8d4e9221c58f10ca16c0116c9e25eda7c" + dependencies: + clone "^1.0.0" + clone-buffer "^1.0.0" + clone-stats "^1.0.0" + cloneable-readable "^1.0.0" + is-stream "^1.1.0" + remove-trailing-separator "^1.0.1" + replace-ext "^1.0.0" + +vscode@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/vscode/-/vscode-1.0.1.tgz#3d161200615fe2af1d92ddc650751159411a513b" + dependencies: + glob "^5.0.15" + gulp-chmod "^1.3.0" + gulp-filter "^4.0.0" + gulp-gunzip "0.0.3" + gulp-remote-src "^0.4.0" + gulp-symdest "^1.0.0" + gulp-untar "0.0.4" + gulp-vinyl-zip "^1.1.2" + mocha "^2.3.3" + request "^2.67.0" + semver "^5.1.0" + source-map-support "^0.3.2" + vinyl-source-stream "^1.1.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + +xtend@~2.1.1: + version "2.1.2" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-2.1.2.tgz#6efecc2a4dad8e6962c4901b337ce7ba87b5d28b" + dependencies: + object-keys "~0.4.0" + +xtend@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-3.0.0.tgz#5cce7407baf642cba7becda568111c493f59665a" + +yauzl@^2.2.1: + version "2.9.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.9.1.tgz#a81981ea70a57946133883f029c5821a89359a7f" + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.0.1" + +yazl@^2.2.1: + version "2.4.3" + resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.4.3.tgz#ec26e5cc87d5601b9df8432dbdd3cd2e5173a071" + dependencies: + buffer-crc32 "~0.2.3" diff --git a/extensions/mssql/package.json b/extensions/mssql/package.json index 5be2ae03c8..f7dfffb656 100644 --- a/extensions/mssql/package.json +++ b/extensions/mssql/package.json @@ -4,7 +4,8 @@ "publisher": "Microsoft", "aiKey": "AIF-5574968e-856d-40d2-af67-c89a14e76412", "engines": { - "vscode": "0.10.x" + "vscode": "0.10.x", + "sqlops": "feature/agent1" }, "activationEvents": [ "*" diff --git a/extensions/mssql/yarn.lock b/extensions/mssql/yarn.lock index 20c0ed230d..895ae94426 100644 --- a/extensions/mssql/yarn.lock +++ b/extensions/mssql/yarn.lock @@ -168,8 +168,8 @@ boom@5.x.x: hoek "4.x.x" brace-expansion@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" dependencies: balanced-match "^1.0.0" concat-map "0.0.1" @@ -258,12 +258,12 @@ clone@^1.0.0: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" cloneable-readable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.0.0.tgz#a6290d413f217a61232f95e458ff38418cfb0117" + version "1.1.2" + resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.1.2.tgz#d591dee4a8f8bc15da43ce97dceeba13d43e2a65" dependencies: inherits "^2.0.1" - process-nextick-args "^1.0.6" - through2 "^2.0.1" + process-nextick-args "^2.0.0" + readable-stream "^2.3.5" co@^4.6.0: version "4.6.0" @@ -273,9 +273,9 @@ color-support@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" +combined-stream@1.0.6, combined-stream@^1.0.5, combined-stream@~1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.6.tgz#723e7df6e801ac5613113a7e445a9b69cb632818" dependencies: delayed-stream "~1.0.0" @@ -288,8 +288,8 @@ commander@2.3.0: resolved "https://registry.yarnpkg.com/commander/-/commander-2.3.0.tgz#fd430e889832ec353b9acd1de217c11cb3eef873" commander@^2.9.0: - version "2.13.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" + version "2.15.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.0.tgz#ad2a23a1c3b036e392469b8012cec6b33b4c1322" commander@~2.8.1: version "2.8.1" @@ -333,9 +333,9 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.1.3": - version "0.1.3" - resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/5758b2a5804ea488d14326662f51d19cc970ccd0" +"dataprotocol-client@github:Microsoft/sqlops-dataprotocolclient#0.1.5": + version "0.1.5" + resolved "https://codeload.github.com/Microsoft/sqlops-dataprotocolclient/tar.gz/21b0bacfc759689a6c280408528c6029a21b1abf" dependencies: vscode-languageclient "3.5.0" @@ -350,19 +350,13 @@ dateformat@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.2.0.tgz#4065e2013cf9fb916ddfd82efb506ad4c6769062" -debug@2: - version "2.6.9" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" - dependencies: - ms "2.0.0" - debug@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" dependencies: ms "0.7.1" -debug@^3.1.0: +debug@3.1.0, debug@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" dependencies: @@ -445,8 +439,8 @@ duplexer@~0.1.1: resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" duplexify@^3.2.0: - version "3.5.3" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.3.tgz#8b5818800df92fd0125b27ab896491912858243e" + version "3.5.4" + resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.4.tgz#4bb46c1796eabebeec4ca9a2e66b808cb7a3d8b4" dependencies: end-of-stream "^1.0.0" inherits "^2.0.1" @@ -491,7 +485,7 @@ escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2: event-stream@^3.3.1, event-stream@~3.3.4: version "3.3.4" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" + resolved "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" dependencies: duplexer "~0.1.1" from "~0" @@ -503,7 +497,7 @@ event-stream@^3.3.1, event-stream@~3.3.4: event-stream@~3.1.5: version "3.1.7" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.1.7.tgz#b4c540012d0fe1498420f3d8946008db6393c37a" + resolved "http://registry.npmjs.org/event-stream/-/event-stream-3.1.7.tgz#b4c540012d0fe1498420f3d8946008db6393c37a" dependencies: duplexer "~0.1.1" from "~0" @@ -538,7 +532,7 @@ extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: "extensions-modules@file:../../extensions-modules": version "0.1.0" dependencies: - dataprotocol-client "github:Microsoft/sqlops-dataprotocolclient#0.1.3" + dataprotocol-client "github:Microsoft/sqlops-dataprotocolclient#0.1.5" decompress "^4.2.0" fs-extra-promise "^1.0.1" http-proxy-agent "^2.0.0" @@ -546,7 +540,7 @@ extend@^3.0.0, extend@~3.0.0, extend@~3.0.1: opener "^1.4.3" tmp "0.0.33" vscode-extension-telemetry "0.0.8" - vscode-languageclient "^3.5.0" + vscode-languageclient "3.5.0" extglob@^0.3.1: version "0.3.2" @@ -571,8 +565,8 @@ fancy-log@^1.1.0: time-stamp "^1.0.0" fast-deep-equal@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" fast-json-stable-stringify@^2.0.0: version "2.0.0" @@ -644,11 +638,11 @@ form-data@~2.1.1: mime-types "^2.1.12" form-data@~2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + version "2.3.2" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.2.tgz#4970498be604c20c005d4f5c23aecd21d6b49099" dependencies: asynckit "^0.4.0" - combined-stream "^1.0.5" + combined-stream "1.0.6" mime-types "^2.1.12" from@~0: @@ -971,19 +965,19 @@ hoek@2.x.x: resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" hoek@4.x.x: - version "4.2.0" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" + version "4.2.1" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.1.tgz#9634502aa12c445dd5a7c5734b572bb8738aacbb" hosted-git-info@^2.1.4: - version "2.5.0" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.5.0.tgz#6d60e34b3abbc8313062c3b798ef8d901a07af3c" + version "2.6.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.6.0.tgz#23235b29ab230c576aab0d4f13fc046b0b038222" http-proxy-agent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.0.0.tgz#46482a2f0523a4d6082551709f469cb3e4a85ff4" + version "2.1.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz#e4821beef5b2142a2026bd73926fe537631c5405" dependencies: agent-base "4" - debug "2" + debug "3.1.0" http-signature@~1.1.0: version "1.1.1" @@ -1002,15 +996,15 @@ http-signature@~1.2.0: sshpk "^1.7.0" https-proxy-agent@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.1.1.tgz#a7ce4382a1ba8266ee848578778122d491260fd9" + version "2.2.0" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.0.tgz#7fbba856be8cd677986f42ebd3664f6317257887" dependencies: agent-base "^4.1.0" debug "^3.1.0" ieee754@^1.1.4: - version "1.1.8" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4" + version "1.1.10" + resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.10.tgz#719a6f7b026831e64bdb838b0de1bb0029bbf716" indent-string@^2.1.0: version "2.1.0" @@ -1083,12 +1077,17 @@ is-glob@^3.1.0: dependencies: is-extglob "^2.1.0" +is-my-ip-valid@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz#7b351b8e8edd4d3995d4d066680e664d94696824" + is-my-json-valid@^2.12.4: - version "2.17.1" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.1.tgz#3da98914a70a22f0a8563ef1511a246c6fc55471" + version "2.17.2" + resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz#6b2103a288e94ef3de5cf15d29dd85fc4b78d65c" dependencies: generate-function "^2.0.0" generate-object-property "^1.1.0" + is-my-ip-valid "^1.0.0" jsonpointer "^4.0.0" xtend "^4.0.0" @@ -1486,15 +1485,15 @@ micromatch@^2.3.7: parse-glob "^3.0.4" regex-cache "^0.4.2" -mime-db@~1.30.0: - version "1.30.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" +mime-db@~1.33.0: + version "1.33.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.33.0.tgz#a3492050a5cb9b63450541e39d9788d2272783db" mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7: - version "2.1.17" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" + version "2.1.18" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.18.tgz#6f323f60a83d11146f831ff11fd66e2fe5503bb8" dependencies: - mime-db "~1.30.0" + mime-db "~1.33.0" minimatch@0.3: version "0.3.0" @@ -1570,8 +1569,8 @@ multipipe@^0.1.0, multipipe@^0.1.2: duplexer2 "0.0.2" natives@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.1.tgz#011acce1f7cbd87f7ba6b3093d6cd9392be1c574" + version "1.1.2" + resolved "https://registry.yarnpkg.com/natives/-/natives-1.1.2.tgz#4437ca1ed8a7f047531ccdfaf2792853df4efa1c" node.extend@~1.1.2: version "1.1.6" @@ -1715,9 +1714,9 @@ preserve@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" -process-nextick-args@^1.0.6, process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" +process-nextick-args@^2.0.0, process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" punycode@^1.4.1: version "1.4.1" @@ -1768,14 +1767,14 @@ read-pkg@^1.0.0: isarray "0.0.1" string_decoder "~0.10.x" -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.1.5: - version "2.3.3" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" +readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.1.5, readable-stream@^2.3.5: + version "2.3.5" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.5.tgz#b4f85003a938cbb6ecbce2a124fb1012bd1a838d" dependencies: core-util-is "~1.0.0" inherits "~2.0.3" isarray "~1.0.0" - process-nextick-args "~1.0.6" + process-nextick-args "~2.0.0" safe-buffer "~5.1.1" string_decoder "~1.0.3" util-deprecate "~1.0.1" @@ -1829,8 +1828,8 @@ replace-ext@^1.0.0: resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" request@^2.67.0: - version "2.83.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + version "2.85.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" dependencies: aws-sign2 "~0.7.0" aws4 "^1.6.0" @@ -1936,19 +1935,27 @@ sparkles@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" +spdx-correct@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" dependencies: - spdx-license-ids "^1.0.2" + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" +spdx-exceptions@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz#2c7ae61056c714a5b9b9b2b2af7d311ef5c78fe9" -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" +spdx-expression-parse@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz#99e119b7a5da00e05491c9fa338b7904823b41d0" + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz#7a7cd28470cc6d3a1cfe6d66886f6bc430d3ac87" split@0.2: version "0.2.10" @@ -1963,8 +1970,8 @@ split@0.3: through "2" sshpk@^1.7.0: - version "1.13.1" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.1.tgz#512df6da6287144316dc4c18fe1cf1d940739be3" + version "1.14.1" + resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.14.1.tgz#130f5975eddad963f1d56f92b9ac6c51fa9f83eb" dependencies: asn1 "~0.2.3" assert-plus "^1.0.0" @@ -2101,7 +2108,7 @@ through2@^0.6.0, through2@^0.6.3, through2@~0.6.5: readable-stream ">=1.0.33-1 <1.1.0-0" xtend ">=4.0.0 <4.1.0-0" -through2@^2.0.0, through2@^2.0.1, through2@^2.0.3, through2@~2.0.0, through2@~2.0.3: +through2@^2.0.0, through2@^2.0.3, through2@~2.0.0, through2@~2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" dependencies: @@ -2140,8 +2147,8 @@ to-iso-string@0.0.2: resolved "https://registry.yarnpkg.com/to-iso-string/-/to-iso-string-0.0.2.tgz#4dc19e664dfccbe25bd8db508b00c6da158255d1" tough-cookie@~2.3.0, tough-cookie@~2.3.3: - version "2.3.3" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" + version "2.3.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.4.tgz#ec60cee38ac675063ffc97a5c18970578ee83655" dependencies: punycode "^1.4.1" @@ -2190,11 +2197,11 @@ vali-date@^1.0.0: resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" + version "3.0.3" + resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz#81643bcbef1bdfecd4623793dc4648948ba98338" dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" verror@1.10.0: version "1.10.0" @@ -2281,26 +2288,26 @@ vscode-extension-telemetry@0.0.8: applicationinsights "0.18.0" winreg "1.2.3" -vscode-jsonrpc@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.5.0.tgz#87239d9e166b2d7352245b8a813597804c1d63aa" +vscode-jsonrpc@^3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.6.0.tgz#848d56995d5168950d84feb5d9c237ae5c6a02d4" -vscode-languageclient@3.5.0, vscode-languageclient@^3.5.0: +vscode-languageclient@3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-3.5.0.tgz#36d02cc186a8365a4467719a290fb200a9ae490a" dependencies: vscode-languageserver-protocol "^3.5.0" vscode-languageserver-protocol@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.5.0.tgz#067c5cbe27709795398d119692c97ebba1452209" + version "3.6.0" + resolved "https://registry.yarnpkg.com/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.6.0.tgz#579642cdcccf74b0cd771c33daa3239acb40d040" dependencies: - vscode-jsonrpc "^3.5.0" - vscode-languageserver-types "^3.5.0" + vscode-jsonrpc "^3.6.0" + vscode-languageserver-types "^3.6.0" -vscode-languageserver-types@^3.5.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.5.0.tgz#e48d79962f0b8e02de955e3f524908e2b19c0374" +vscode-languageserver-types@^3.6.0: + version "3.6.1" + resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.6.1.tgz#4bc06a48dff653495f12f94b8b1e228988a1748d" vscode@1.0.1: version "1.0.1" diff --git a/product.json b/product.json index 6159e04c3f..1c11d819e4 100644 --- a/product.json +++ b/product.json @@ -29,7 +29,9 @@ "documentationUrl": "https://go.microsoft.com/fwlink/?linkid=862277", "commit": "9ca6200018fc206d67a47229f991901a8a453781", "date": "2017-12-15T12:00:00.000Z", - "recommendedExtensions": [], + "recommendedExtensions": [ + "Microsoft.agent" + ], "extensionsGallery": { "serviceUrl": "https://raw.githubusercontent.com/Microsoft/sqlopsstudio/release/extensions/extensionsGallery.json" } diff --git a/src/sql/base/browser/ui/table/plugins/rowDetailView.ts b/src/sql/base/browser/ui/table/plugins/rowDetailView.ts new file mode 100644 index 0000000000..b1b3f69bc3 --- /dev/null +++ b/src/sql/base/browser/ui/table/plugins/rowDetailView.ts @@ -0,0 +1,393 @@ +// Adopted and converted to typescript from https://github.com/6pac/SlickGrid/blob/master/plugins/slick.rowdetailview.js +// heavily modified +import { mixin } from 'vs/base/common/objects'; + +export class RowDetailView { + + public onAsyncResponse = new Slick.Event(); + public onAsyncEndUpdate = new Slick.Event(); + public onAfterRowDetailToggle = new Slick.Event(); + public onBeforeRowDetailToggle = new Slick.Event(); + + private _grid: any; + private _expandedRows: any = []; + private _handler = new Slick.EventHandler(); + private _defaults: any = { + columnId: '_detail_selector', + cssClass: null, + toolTip: '', + width: 30 + }; + + private _dataView: any; + private _options: any; + + constructor(options) { + this._options = mixin(options, this._defaults, false); + } + + public init(grid: any) { + this._grid = grid; + this._dataView = this._grid.getData(); + + // Update the minRowBuffer so that the view doesn't disappear when it's at top of screen + the original default 3 + this._grid.getOptions().minRowBuffer = this._options.panelRows + 3; + + this._handler + .subscribe(this._grid.onClick, (e, args) => this.handleClick(e, args)) + .subscribe(this._grid.onSort, (e, args) => this.handleSort(e, args)) + .subscribe(this._grid.onScroll, (e, args) => this.handleScroll(e, args)); + + this._grid.getData().onRowCountChanged.subscribe(() => { this._grid.updateRowCount(); this._grid.render(); }); + this._grid.getData().onRowsChanged.subscribe((e, a) => { this._grid.invalidateRows(a.rows); this._grid.render(); }); + + // subscribe to the onAsyncResponse so that the plugin knows when the user server side calls finished + this.subscribeToOnAsyncResponse(); + } + + public destroy() { + this._handler.unsubscribeAll(); + this.onAsyncResponse.unsubscribe(undefined); + this.onAsyncEndUpdate.unsubscribe(undefined); + this.onAfterRowDetailToggle.unsubscribe(undefined); + this.onBeforeRowDetailToggle.unsubscribe(undefined); + } + + public getOptions(options: any) { + return this._options; + } + + public setOptions(options: any) { + this._options = $.extend(true, {}, this._options, options); + } + + public handleClick(e: any, args: any) { + // clicking on a row select checkbox + if (this._options.useRowClick || this._grid.getColumns()[args.cell].id === this._options.columnId && $(e.target).hasClass("detailView-toggle")) { + // if editing, try to commit + if (this._grid.getEditorLock().isActive() && !this._grid.getEditorLock().commitCurrentEdit()) { + e.preventDefault(); + e.stopImmediatePropagation(); + return; + } + + var item = this._dataView.getItem(args.row); + + // trigger an event before toggling + this.onBeforeRowDetailToggle.notify({ + grid: this._grid, + item: item + }, e, this); + + this.toggleRowSelection(item); + + // trigger an event after toggling + this.onAfterRowDetailToggle.notify({ + grid: this._grid, + item: item + }, e, this); + + e.stopPropagation(); + e.stopImmediatePropagation(); + } + } + + // Sort will just collapse all of the open items + public handleSort(e, args) { + this.collapseAll(); + } + + // If we scroll save detail views that go out of cache range + public handleScroll(e, args) { + + var range = this._grid.getRenderedRange(); + + var start = (range.top > 0 ? range.top : 0); + var end = (range.bottom > this._dataView.getLength() ? range.bottom : this._dataView.getLength()); + + // Get the item at the top of the view + var topMostItem = this._dataView.getItemByIdx(start); + + // Check it is a parent item + if (topMostItem._parent === undefined) + { + // This is a standard row as we have no parent. + var nextItem = this._dataView.getItemByIdx(start + 1); + if(nextItem !== undefined && nextItem._parent !== undefined) + { + // This is likely the expanded Detail Row View + // Check for safety + if(nextItem._parent === topMostItem) + { + this.saveDetailView(topMostItem); + } + } + } + + // Find the bottom most item that is likely to go off screen + var bottomMostItem = this._dataView.getItemByIdx(end - 1); + + // If we are a detailView and we are about to go out of cache view + if(bottomMostItem._parent !== undefined) + { + this.saveDetailView(bottomMostItem._parent); + } + } + + // Toggle between showing and hiding a row + public toggleRowSelection(row) { + this._grid.getData().beginUpdate(); + this.handleAccordionShowHide(row); + this._grid.getData().endUpdate(); + } + + // Collapse all of the open items + public collapseAll() { + for (var i = this._expandedRows.length - 1; i >= 0; i--) { + this.collapseItem(this._expandedRows[i]); + } + } + + // Saves the current state of the detail view + public saveDetailView(item) { + var view = $('#innerDetailView_' + item.id); + if (view) { + var html = $('#innerDetailView_' + item.id).html(); + if(html !== undefined) { + item._detailContent = html; + } + } + } + + // Colapse an Item so it is notlonger seen + public collapseItem(item) { + + // Save the details on the collapse assuming onetime loading + if (this._options.loadOnce) { + this.saveDetailView(item); + } + + item._collapsed = true; + for (let idx = 1; idx <= item._sizePadding; idx++) { + this._dataView.deleteItem(item.id + '.' + idx); + } + item._sizePadding = 0; + this._dataView.updateItem(item.id, item); + + // Remove the item from the expandedRows + this._expandedRows = this._expandedRows.filter((r) => { + return r.id !== item.id; + }); + } + + // Expand a row given the dataview item that is to be expanded + public expandItem(item) { + item._collapsed = false; + this._expandedRows.push(item); + + // In the case something went wrong loading it the first time such a scroll of screen before loaded + if (!item._detailContent) { + item._detailViewLoaded = false; + } + + // display pre-loading template + if (!item._detailViewLoaded || this._options.loadOnce !== true) { + item._detailContent = this._options.preTemplate(item); + } else { + this.onAsyncResponse.notify({ + itemDetail: item, + detailView: item._detailContent + }, undefined, this); + this.applyTemplateNewLineHeight(item); + this._dataView.updateItem(item.id, item); + + return; + } + + this.applyTemplateNewLineHeight(item); + this._dataView.updateItem(item.id, item); + + // async server call + this._options.process(item); + } + + /** + * subscribe to the onAsyncResponse so that the plugin knows when the user server side calls finished + * the response has to be as "args.itemDetail" with it's data back + */ + public subscribeToOnAsyncResponse() { + this.onAsyncResponse.subscribe((e, args) => { + if (!args || !args.itemDetail) { + throw 'Slick.RowDetailView plugin requires the onAsyncResponse() to supply "args.itemDetail" property.'; + } + + // If we just want to load in a view directly we can use detailView property to do so + if (args.detailView) { + args.itemDetail._detailContent = args.detailView; + } else { + args.itemDetail._detailContent = this._options.postTemplate(args.itemDetail); + } + + args.itemDetail._detailViewLoaded = true; + + var idxParent = this._dataView.getIdxById(args.itemDetail.id); + this._dataView.updateItem(args.itemDetail.id, args.itemDetail); + + // trigger an event once the post template is finished loading + this.onAsyncEndUpdate.notify({ + grid: this._grid, + itemDetail: args.itemDetail + }, e, this); + }); + } + + public handleAccordionShowHide(item) { + if (item) { + if (!item._collapsed) { + this.collapseItem(item); + } else { + this.expandItem(item); + } + } + } + + ////////////////////////////////////////////////////////////// + ////////////////////////////////////////////////////////////// + public getPaddingItem(parent, offset) { + var item: any = {}; + + for (let prop in this._grid.getData()) { + item[prop] = null; + } + item.id = parent.id + '.' + offset; + + //additional hidden padding metadata fields + item._collapsed = true; + item._isPadding = true; + item._parent = parent; + item._offset = offset; + + return item; + } + + ////////////////////////////////////////////////////////////// + //create the detail ctr node. this belongs to the dev & can be custom-styled as per + ////////////////////////////////////////////////////////////// + public applyTemplateNewLineHeight(item) { + // the height seems to be calculated by the template row count (how many line of items does the template have) + let rowCount = this._options.panelRows; + + //calculate padding requirements based on detail-content.. + //ie. worst-case: create an invisible dom node now &find it's height. + let lineHeight = 13; //we know cuz we wrote the custom css innit ;) + item._sizePadding = Math.ceil(((rowCount * 2) * lineHeight) / this._grid.getOptions().rowHeight); + item._height = (item._sizePadding * this._grid.getOptions().rowHeight); + + let idxParent = this._dataView.getIdxById(item.id); + for (var idx = 1; idx <= item._sizePadding; idx++) { + this._dataView.insertItem(idxParent + idx, this.getPaddingItem(item, idx)); + } + } + + + public getColumnDefinition() { + return { + id: this._options.columnId, + name: '', + toolTip: this._options.toolTip, + field: 'sel', + width: this._options.width, + resizable: false, + sortable: false, + cssClass: this._options.cssClass, + formatter: (row, cell, value, columnDef, dataContext) => this.detailSelectionFormatter(row, cell, value, columnDef, dataContext) + }; + } + + public detailSelectionFormatter(row, cell, value, columnDef, dataContext) { + + if (dataContext._collapsed === undefined) { + dataContext._collapsed = true, + dataContext._sizePadding = 0, //the required number of pading rows + dataContext._height = 0, //the actual height in pixels of the detail field + dataContext._isPadding = false, + dataContext._parent = undefined, + dataContext._offset = 0 + } + + if (dataContext._isPadding === true) { + //render nothing + } else if (dataContext._collapsed) { + return '
'; + } else { + var html = []; + var rowHeight = this._grid.getOptions().rowHeight; + var bottomMargin = 5; + + //V313HAX: + //putting in an extra closing div after the closing toggle div and ommiting a + //final closing div for the detail ctr div causes the slickgrid renderer to + //insert our detail div as a new column ;) ~since it wraps whatever we provide + //in a generic div column container. so our detail becomes a child directly of + //the row not the cell. nice =) ~no need to apply a css change to the parent + //slick-cell to escape the cell overflow clipping. + + //sneaky extra inserted here-----------------v + html.push("
"); + + html.push("
"); //shift detail below 1st row + html.push("
"); //sub ctr for custom styling + html.push("
" , dataContext._detailContent, "
"); + //&omit a final closing detail container
that would come next + + return html.join(''); + } + return null; + } + + public resizeDetailView(item) { + if (!item) return; + + // Grad each of the dom items + var mainContainer = document.getElementById('detailViewContainer_' + item.id); + var cellItem = document.getElementById('cellDetailView_' + item.id); + var inner = document.getElementById('innerDetailView_' + item.id); + + if (!mainContainer || !cellItem || !inner) return; + + for (var idx = 1; idx <= item._sizePadding; idx++) { + this._dataView.deleteItem(item.id + "." + idx); + } + + var rowHeight = this._grid.getOptions().rowHeight; // height of a row + var lineHeight = 13; //we know cuz we wrote the custom css innit ;) + + // Get the inner Item height as this will be the actual size + var itemHeight = inner.clientHeight; + + // Now work out how many rows + var rowCount = Math.ceil(itemHeight / rowHeight) + 1; + + item._sizePadding = Math.ceil(((rowCount * 2) * lineHeight) / rowHeight); + item._height = (item._sizePadding * rowHeight); + + // If the padding is now more than the original minRowBuff we need to increase it + if (this._grid.getOptions().minRowBuffer < item._sizePadding) + { + // Update the minRowBuffer so that the view doesn't disappear when it's at top of screen + the original default 3 + this._grid.getOptions().minRowBuffer =item._sizePadding + 3; + } + + mainContainer.setAttribute("style", "max-height: " + item._height + "px"); + if (cellItem) { + cellItem.setAttribute("style", "height: " + item._height + "px;top:" + rowHeight + "px"); + } + + let idxParent = this._dataView.getIdxById(item.id); + for (var idx = 1; idx <= item._sizePadding; idx++) { + this._dataView.insertItem(idxParent + idx, this.getPaddingItem(item, idx)); + } + } +} diff --git a/src/sql/parts/dashboard/common/dashboardHelper.ts b/src/sql/parts/dashboard/common/dashboardHelper.ts index 6c61bd1657..8eafd76f1f 100644 --- a/src/sql/parts/dashboard/common/dashboardHelper.ts +++ b/src/sql/parts/dashboard/common/dashboardHelper.ts @@ -16,6 +16,7 @@ import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboar import { WIDGETS_CONTAINER } from 'sql/parts/dashboard/containers/dashboardWidgetContainer.contribution'; import { GRID_CONTAINER } from 'sql/parts/dashboard/containers/dashboardGridContainer.contribution'; import { WEBVIEW_CONTAINER } from 'sql/parts/dashboard/containers/dashboardWebviewContainer.contribution'; +import { CONTROLHOST_CONTAINER } from 'sql/parts/dashboard/containers/dashboardControlHostContainer.contribution'; import { NAV_SECTION } from 'sql/parts/dashboard/containers/dashboardNavSection.contribution'; import { IDashboardContainerRegistry, Extensions as DashboardContainerExtensions, IDashboardContainer, registerContainerType } from 'sql/platform/dashboard/common/dashboardContainerRegistry'; import { IDashboardTab } from 'sql/platform/dashboard/common/dashboardRegistry'; @@ -26,6 +27,7 @@ const containerTypes = [ WIDGETS_CONTAINER, GRID_CONTAINER, WEBVIEW_CONTAINER, + CONTROLHOST_CONTAINER, NAV_SECTION ]; diff --git a/src/sql/parts/dashboard/common/dashboardPage.component.html b/src/sql/parts/dashboard/common/dashboardPage.component.html index 7ccbdc7244..718f73280c 100644 --- a/src/sql/parts/dashboard/common/dashboardPage.component.html +++ b/src/sql/parts/dashboard/common/dashboardPage.component.html @@ -13,6 +13,8 @@ + + diff --git a/src/sql/parts/dashboard/containers/dashboardControlHostContainer.component.ts b/src/sql/parts/dashboard/containers/dashboardControlHostContainer.component.ts new file mode 100644 index 0000000000..10a773287f --- /dev/null +++ b/src/sql/parts/dashboard/containers/dashboardControlHostContainer.component.ts @@ -0,0 +1,58 @@ +/*--------------------------------------------------------------------------------------------- +* Copyright (c) Microsoft Corporation. All rights reserved. +* Licensed under the Source EULA. See License.txt in the project root for license information. +*--------------------------------------------------------------------------------------------*/ +import 'vs/css!./dashboardControlHostContainer'; + +import { Component, forwardRef, Input, AfterContentInit, ViewChild } from '@angular/core'; +import Event, { Emitter } from 'vs/base/common/event'; +import { DashboardTab } from 'sql/parts/dashboard/common/interfaces'; +import { TabConfig } from 'sql/parts/dashboard/common/dashboardWidget'; +import { ControlHostContent } from 'sql/parts/dashboard/contents/controlHostContent.component'; + +@Component({ + selector: 'dashboard-controlhost-container', + providers: [{ provide: DashboardTab, useExisting: forwardRef(() => DashboardControlHostContainer) }], + template: ` + + + ` +}) +export class DashboardControlHostContainer extends DashboardTab implements AfterContentInit { + @Input() private tab: TabConfig; + + private _onResize = new Emitter(); + public readonly onResize: Event = this._onResize.event; + + @ViewChild(ControlHostContent) private _hostContent: ControlHostContent; + constructor() { + super(); + } + + ngAfterContentInit(): void { + this._register(this._hostContent.onResize(() => { + this._onResize.fire(); + })); + + let container = this.tab.container; + if (container['controlhost-container'] && container['controlhost-container'].type) { + this._hostContent.setControlType(container['controlhost-container'].type); + } + } + + public layout(): void { + this._hostContent.layout(); + } + + public get id(): string { + return this.tab.id; + } + + public get editable(): boolean { + return this.tab.editable; + } + + public refresh(): void { + // no op + } +} diff --git a/src/sql/parts/dashboard/containers/dashboardControlHostContainer.contribution.ts b/src/sql/parts/dashboard/containers/dashboardControlHostContainer.contribution.ts new file mode 100644 index 0000000000..90b2a24e3d --- /dev/null +++ b/src/sql/parts/dashboard/containers/dashboardControlHostContainer.contribution.ts @@ -0,0 +1,19 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ +import { IJSONSchema } from 'vs/base/common/jsonSchema'; +import * as nls from 'vs/nls'; + +import { registerContainerType, registerNavSectionContainerType } from 'sql/platform/dashboard/common/dashboardContainerRegistry'; + +export const CONTROLHOST_CONTAINER = 'controlhost-container'; + +let webviewSchema: IJSONSchema = { + type: 'null', + description: nls.localize('dashboard.container.controlhost', "The controlhost that will be displayed in this tab."), + default: null +}; + +registerContainerType(CONTROLHOST_CONTAINER, webviewSchema); +registerNavSectionContainerType(CONTROLHOST_CONTAINER, webviewSchema); \ No newline at end of file diff --git a/src/sql/parts/dashboard/containers/dashboardControlHostContainer.css b/src/sql/parts/dashboard/containers/dashboardControlHostContainer.css new file mode 100644 index 0000000000..e4bf0dbe29 --- /dev/null +++ b/src/sql/parts/dashboard/containers/dashboardControlHostContainer.css @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + + dashboard-controlhost-container { + height: 100%; + width : 100%; + display: block; +} diff --git a/src/sql/parts/dashboard/contents/controlHostContent.component.html b/src/sql/parts/dashboard/contents/controlHostContent.component.html new file mode 100644 index 0000000000..0b6f2d8184 --- /dev/null +++ b/src/sql/parts/dashboard/contents/controlHostContent.component.html @@ -0,0 +1,9 @@ + + + + diff --git a/src/sql/parts/dashboard/contents/controlHostContent.component.ts b/src/sql/parts/dashboard/contents/controlHostContent.component.ts new file mode 100644 index 0000000000..9ab2071624 --- /dev/null +++ b/src/sql/parts/dashboard/contents/controlHostContent.component.ts @@ -0,0 +1,76 @@ +/*--------------------------------------------------------------------------------------------- +* Copyright (c) Microsoft Corporation. All rights reserved. +* Licensed under the Source EULA. See License.txt in the project root for license information. +*--------------------------------------------------------------------------------------------*/ +import 'vs/css!./controlHostContent'; + +import { Component, forwardRef, Input, OnInit, Inject, ChangeDetectorRef, ElementRef } from '@angular/core'; + +import Event, { Emitter } from 'vs/base/common/event'; +import { Parts } from 'vs/workbench/services/part/common/partService'; +import { IDisposable } from 'vs/base/common/lifecycle'; + +import { DashboardTab } from 'sql/parts/dashboard/common/interfaces'; +import { TabConfig } from 'sql/parts/dashboard/common/dashboardWidget'; +import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service'; + +import * as sqlops from 'sqlops'; +import { memoize } from 'vs/base/common/decorators'; + +@Component({ + templateUrl: decodeURI(require.toUrl('sql/parts/dashboard/contents/controlHostContent.component.html')), + selector: 'controlhost-content' +}) +export class ControlHostContent implements OnInit { + @Input() private webviewId: string; + + private _onResize = new Emitter(); + public readonly onResize: Event = this._onResize.event; + private _onMessage = new Emitter(); + public readonly onMessage: Event = this._onMessage.event; + + private _onMessageDisposable: IDisposable; + private _type: string; + + constructor( + @Inject(forwardRef(() => DashboardServiceInterface)) private _dashboardService: DashboardServiceInterface, + @Inject(forwardRef(() => ChangeDetectorRef)) private _changeRef: ChangeDetectorRef, + @Inject(forwardRef(() => ElementRef)) private _el: ElementRef + ) { + } + + ngOnInit() { + } + + public layout(): void { + } + + public get id(): string { + return this.webviewId; + } + + @memoize + public get connection(): sqlops.connection.Connection { + let currentConnection = this._dashboardService.connectionManagementService.connectionInfo.connectionProfile; + let connection: sqlops.connection.Connection = { + providerName: currentConnection.providerName, + connectionId: currentConnection.id, + options: currentConnection.options + }; + return connection; + } + + @memoize + public get serverInfo(): sqlops.ServerInfo { + return this._dashboardService.connectionManagementService.connectionInfo.serverInfo; + } + + public setControlType(type: string): void { + this._type = type; + this._changeRef.detectChanges(); + } + + public get controlType(): string { + return this._type; + } +} diff --git a/src/sql/parts/dashboard/contents/controlHostContent.css b/src/sql/parts/dashboard/contents/controlHostContent.css new file mode 100644 index 0000000000..ea015ce963 --- /dev/null +++ b/src/sql/parts/dashboard/contents/controlHostContent.css @@ -0,0 +1,10 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + + controlhost-content { + height: 100%; + width : 100%; + display: block; +} diff --git a/src/sql/parts/dashboard/dashboard.module.ts b/src/sql/parts/dashboard/dashboard.module.ts index 4bcbbf66e3..a02e67064b 100644 --- a/src/sql/parts/dashboard/dashboard.module.ts +++ b/src/sql/parts/dashboard/dashboard.module.ts @@ -42,8 +42,16 @@ import { WebviewContent } from 'sql/parts/dashboard/contents/webviewContent.comp import { BreadcrumbComponent } from 'sql/base/browser/ui/breadcrumb/breadcrumb.component'; import { IBreadcrumbService } from 'sql/base/browser/ui/breadcrumb/interfaces'; import { DashboardHomeContainer } from 'sql/parts/dashboard/containers/dashboardHomeContainer.component'; +import { ControlHostContent } from 'sql/parts/dashboard/contents/controlHostContent.component'; +import { DashboardControlHostContainer } from 'sql/parts/dashboard/containers/dashboardControlHostContainer.component'; +import { JobsViewComponent } from 'sql/parts/jobManagement/views/jobsView.component'; +import { AgentViewComponent } from 'sql/parts/jobManagement/agent/agentView.component'; +import { JobHistoryComponent } from 'sql/parts/jobManagement/views/jobHistory.component'; -let baseComponents = [DashboardHomeContainer, DashboardComponent, DashboardWidgetWrapper, DashboardWebviewContainer, DashboardWidgetContainer, DashboardGridContainer, DashboardErrorContainer, DashboardNavSection, WidgetContent, WebviewContent, ComponentHostDirective, BreadcrumbComponent]; +let baseComponents = [DashboardHomeContainer, DashboardComponent, DashboardWidgetWrapper, DashboardWebviewContainer, + DashboardWidgetContainer, DashboardGridContainer, DashboardErrorContainer, DashboardNavSection, WebviewContent, WidgetContent, + ComponentHostDirective, BreadcrumbComponent, ControlHostContent, DashboardControlHostContainer, + JobsViewComponent, AgentViewComponent, JobHistoryComponent]; /* Panel */ import { PanelModule } from 'sql/base/browser/ui/panel/panel.module'; diff --git a/src/sql/parts/jobManagement/agent/agentView.component.html b/src/sql/parts/jobManagement/agent/agentView.component.html new file mode 100644 index 0000000000..b7412a85c2 --- /dev/null +++ b/src/sql/parts/jobManagement/agent/agentView.component.html @@ -0,0 +1,18 @@ + + + + +
+ +
+
+ +
+
+
diff --git a/src/sql/parts/jobManagement/agent/agentView.component.ts b/src/sql/parts/jobManagement/agent/agentView.component.ts new file mode 100644 index 0000000000..fb84841a4e --- /dev/null +++ b/src/sql/parts/jobManagement/agent/agentView.component.ts @@ -0,0 +1,100 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'vs/css!../common/media/jobs'; + +import { OnInit, Component, Inject, forwardRef, ElementRef, ChangeDetectorRef, OnDestroy, ViewChild, Injectable } from '@angular/core'; +import * as Utils from 'sql/parts/connection/common/utils'; +import { RefreshWidgetAction, EditDashboardAction } from 'sql/parts/dashboard/common/actions'; +import { IColorTheme } from 'vs/workbench/services/themes/common/workbenchThemeService'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import * as themeColors from 'vs/workbench/common/theme'; +import { DashboardPage } from 'sql/parts/dashboard/common/dashboardPage.component'; +import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; +import { IBootstrapService, BOOTSTRAP_SERVICE_ID } from 'sql/services/bootstrap/bootstrapService'; +import { IJobManagementService } from '../common/interfaces'; +import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service'; +import { AgentJobInfo, AgentJobHistoryInfo } from 'sqlops'; +import { PanelComponent, IPanelOptions, NavigationBarLayout } from 'sql/base/browser/ui/panel/panel.component'; +import * as nls from 'vs/nls'; + +export const DASHBOARD_SELECTOR: string = 'agentview-component'; + +@Component({ + selector: DASHBOARD_SELECTOR, + templateUrl: decodeURI(require.toUrl('./agentView.component.html')) +}) +@Injectable() +export class AgentViewComponent { + + @ViewChild(PanelComponent) private _panel: PanelComponent; + + // tslint:disable:no-unused-variable + private readonly jobsComponentTitle: string = nls.localize('jobview.Jobs', "Jobs"); + private readonly alertsComponentTitle: string = nls.localize('jobview.Alerts', "Alerts"); + private readonly schedulesComponentTitle: string = nls.localize('jobview.Schedules', "Schedules"); + private readonly operatorsComponentTitle: string = nls.localize('jobview.Operator', "Operators"); + private readonly jobHistoryComponentTitle: string = nls.localize('jobview.History', "History"); + private _showHistory: boolean = false; + private _jobId: string = null; + private _agentJobInfo: AgentJobInfo = null; + private _agentJobHistoryInfo: AgentJobHistoryInfo[] = null; + + public jobsIconClass: string = 'jobsview-icon'; + + // tslint:disable-next-line:no-unused-variable + private readonly panelOpt: IPanelOptions = { + showTabsWhenOne: true, + layout: NavigationBarLayout.vertical, + showIcon: true + }; + + constructor( + @Inject(forwardRef(() => ChangeDetectorRef)) private _cd: ChangeDetectorRef, + ){} + + /** + * Public Getters + */ + public get jobId(): string { + return this._jobId; + } + + public get showHistory(): boolean { + return this._showHistory; + } + + public get agentJobInfo(): AgentJobInfo { + return this._agentJobInfo; + } + + public get agentJobHistoryInfo(): AgentJobHistoryInfo[] { + return this._agentJobHistoryInfo; + } + + /** + * Public Setters + */ + + public set jobId(value: string) { + this._jobId = value; + this._cd.detectChanges(); + } + + public set showHistory(value: boolean) { + this._showHistory = value; + this._cd.detectChanges(); + } + + public set agentJobInfo(value: AgentJobInfo) { + this._agentJobInfo = value; + this._cd.detectChanges(); + } + + public set agentJobHistoryInfo(value: AgentJobHistoryInfo[]) { + this._agentJobHistoryInfo = value; + this._cd.detectChanges(); + } +} diff --git a/src/sql/parts/jobManagement/common/interfaces.ts b/src/sql/parts/jobManagement/common/interfaces.ts new file mode 100644 index 0000000000..36550513ea --- /dev/null +++ b/src/sql/parts/jobManagement/common/interfaces.ts @@ -0,0 +1,25 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { createDecorator } from 'vs/platform/instantiation/common/instantiation'; +import * as sqlops from 'sqlops'; + +export const SERVICE_ID = 'jobManagementService'; + +export const IJobManagementService = createDecorator(SERVICE_ID); + +export interface IJobManagementService { + _serviceBrand: any; + + registerProvider(providerId: string, provider: sqlops.AgentServicesProvider): void; + + getJobs(connectionUri: string): Thenable; + + getJobHistory(connectionUri: string, jobID: string): Thenable; + + jobAction(connectionUri: string, jobName: string, action: string): Thenable; +} diff --git a/src/sql/parts/jobManagement/common/jobManagementService.ts b/src/sql/parts/jobManagement/common/jobManagementService.ts new file mode 100644 index 0000000000..de6a04fbcd --- /dev/null +++ b/src/sql/parts/jobManagement/common/jobManagementService.ts @@ -0,0 +1,63 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; + +import { localize } from 'vs/nls'; +import { IJobManagementService } from 'sql/parts/jobManagement/common/interfaces'; +import { ICapabilitiesService } from 'sql/services/capabilities/capabilitiesService'; +import { IConnectionManagementService } from 'sql/parts/connection/common/connectionManagement'; +import { TPromise } from 'vs/base/common/winjs.base'; + +import * as sqlops from 'sqlops'; + +export class JobManagementService implements IJobManagementService { + _serviceBrand: any; + + private _providers: { [handle: string]: sqlops.AgentServicesProvider; } = Object.create(null); + + constructor( + @IConnectionManagementService private _connectionService: IConnectionManagementService, + @ICapabilitiesService private _capabilitiesService: ICapabilitiesService + ) { + } + + public getJobs(connectionUri: string): Thenable { + return this._runAction(connectionUri, (runner) => { + return runner.getJobs(connectionUri); + }); + } + + public getJobHistory(connectionUri: string, jobID: string): Thenable { + return this._runAction(connectionUri, (runner) => { + return runner.getJobHistory(connectionUri, jobID); + }); + } + + public jobAction(connectionUri: string, jobName: string, action: string): Thenable { + return this._runAction(connectionUri, (runner) => { + return runner.jobAction(connectionUri, jobName, action); + }); + } + + + private _runAction(uri: string, action: (handler: sqlops.AgentServicesProvider) => Thenable): Thenable { + let providerId: string = this._connectionService.getProviderIdFromUri(uri); + + if (!providerId) { + return TPromise.wrapError(new Error(localize('providerIdNotValidError', "Connection is required in order to interact with JobManagementService"))); + } + let handler = this._providers[providerId]; + if (handler) { + return action(handler); + } else { + return TPromise.wrapError(new Error(localize('noHandlerRegistered', "No Handler Registered"))); + } + } + + public registerProvider(providerId: string, provider: sqlops.AgentServicesProvider): void { + this._providers[providerId] = provider; + } +} diff --git a/src/sql/parts/jobManagement/common/media/back.svg b/src/sql/parts/jobManagement/common/media/back.svg new file mode 100644 index 0000000000..e7b06e9a10 --- /dev/null +++ b/src/sql/parts/jobManagement/common/media/back.svg @@ -0,0 +1 @@ +back_16x16 \ No newline at end of file diff --git a/src/sql/parts/jobManagement/common/media/back_inverse.svg b/src/sql/parts/jobManagement/common/media/back_inverse.svg new file mode 100644 index 0000000000..247a241958 --- /dev/null +++ b/src/sql/parts/jobManagement/common/media/back_inverse.svg @@ -0,0 +1 @@ +back_inverse_16x16 \ No newline at end of file diff --git a/src/sql/parts/jobManagement/common/media/detailview.css b/src/sql/parts/jobManagement/common/media/detailview.css new file mode 100644 index 0000000000..bc2c1d80ca --- /dev/null +++ b/src/sql/parts/jobManagement/common/media/detailview.css @@ -0,0 +1,39 @@ +.detailView-toggle +{ + display: inline-block; + cursor: pointer; +} +.detailView-toggle.expand +{ + height: 20px; + width: 20px; + background: url(../images/arrow-right.gif) no-repeat center center; +} + +.detailView-toggle.collapse +{ + height: 20px; + width: 20px; + background: url(../images/sort-desc.gif) no-repeat center center; +} +.dynamic-cell-detail +{ + z-index: 10000; + position: absolute; + background-color: #dae5e8; + margin: 0; + padding: 0; + width: 100%; + overflow: auto; +} + +.dynamic-cell-detail > :first-child +{ + vertical-align: middle; + line-height: 13px; +} + +.dynamic-cell-detail > .detail-container { + overflow: auto; + display: block !important; +} diff --git a/src/sql/parts/jobManagement/common/media/job.svg b/src/sql/parts/jobManagement/common/media/job.svg new file mode 100644 index 0000000000..1b3ebc35cc --- /dev/null +++ b/src/sql/parts/jobManagement/common/media/job.svg @@ -0,0 +1 @@ +job \ No newline at end of file diff --git a/src/sql/parts/jobManagement/common/media/job_inverse.svg b/src/sql/parts/jobManagement/common/media/job_inverse.svg new file mode 100644 index 0000000000..1967264f1b --- /dev/null +++ b/src/sql/parts/jobManagement/common/media/job_inverse.svg @@ -0,0 +1 @@ +job_inverse \ No newline at end of file diff --git a/src/sql/parts/jobManagement/common/media/jobs.css b/src/sql/parts/jobManagement/common/media/jobs.css new file mode 100644 index 0000000000..eed821245c --- /dev/null +++ b/src/sql/parts/jobManagement/common/media/jobs.css @@ -0,0 +1,134 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + + agentview-component { + height: 100%; + width : 100%; + display: block; +} + +jobsview-component { + height: 100%; + width : 100%; + display: block; +} + +jobhistory-component { + height: 100%; + width : 100%; + display: block; +} + +#jobsDiv .jobview-grid { + height: 100%; + width : 100%; + display: block; +} + +.vs-dark #jobsDiv .slick-header-column { + background: #333333 !important; +} + +#jobsDiv .slick-header-column { + background-color: transparent !important; + background: white !important; + border: 0px !important; + font-weight: bold; + font-size: larger; +} + +.vs-dark #jobsDiv .slick-cell { + background:#333333 !important; +} + +#jobsDiv .slick-cell { + background: white !important; + border-right: transparent !important; + border-left: transparent !important; + line-height: 33px !important; + vertical-align: middle; +} + +#jobsDiv .jobview-joblist { + height: 100%; + width: 100%; +} + +#jobsDiv .jobview-jobnametable { + border: 0px; + width: 100%; + height: 100%; +} + +#jobsDiv .jobview-jobnameindicatorsuccess { + width: 5px; + background: green; +} + +#jobsDiv .jobview-jobnametext { + width: 100%; +} + +#jobsDiv .jobview-splitter { + height: 1px; + width: 100%; + background-color: gray; +} + +#jobsDiv .jobview-jobitem { + display: flex; + flex-direction: row; + flex-wrap: nowrap; + flex-flow: row wrap; + white-space: nowrap; +} + +#jobsDiv .jobview-label { + padding-bottom: 10px; + padding-top: 10px; +} + +#jobsDiv .jobview-highlight-none { + width: 5px; + margin-right: 10px; +} + +#jobsDiv .detail-container { + max-height: 100px !important; + line-height: 20px; +} + +#jobsDiv .detail { + padding: 5px +} + +#jobsDiv .preload { + font-size: 18px; +} + +#jobsDiv .dynamic-cell-detail > :first-child { + vertical-align: middle; + line-height: 13px; + padding: 10px; + margin-left: 20px; +} + +.vs-dark #jobsDiv .dynamic-cell-detail { + background: black !important; +} + +#jobsDiv .dynamic-cell-detail { + background: #faf5f8 !important; +} + + +.jobsview-icon { + content: url('./job.svg'); + width: 25px; +} + +.vs-dark .jobsview-icon { + content: url('./job_inverse.svg'); +} diff --git a/src/sql/parts/jobManagement/common/media/start.svg b/src/sql/parts/jobManagement/common/media/start.svg new file mode 100644 index 0000000000..2ceb9e2292 --- /dev/null +++ b/src/sql/parts/jobManagement/common/media/start.svg @@ -0,0 +1 @@ +run \ No newline at end of file diff --git a/src/sql/parts/jobManagement/common/media/stop.svg b/src/sql/parts/jobManagement/common/media/stop.svg new file mode 100644 index 0000000000..b3ac86d210 --- /dev/null +++ b/src/sql/parts/jobManagement/common/media/stop.svg @@ -0,0 +1 @@ +stop \ No newline at end of file diff --git a/src/sql/parts/jobManagement/views/jobHistory.component.html b/src/sql/parts/jobManagement/views/jobHistory.component.html new file mode 100644 index 0000000000..642f84f64d --- /dev/null +++ b/src/sql/parts/jobManagement/views/jobHistory.component.html @@ -0,0 +1,155 @@ + + +

Jobs | {{agentJobInfo.name}}

+ + +
+
All Jobs +
+ + +
    +
  • +
    Run
    +
  • +
  • +
    Stop
    +
  • +
+ + +
+
+ + +
+ + + + + + + + + + + + + + + + + + + +
+ User: + + + + Enabled: + + {{agentJobInfo.enabled}} +
+ Alert: + + + + Notification: + + +
+ Schedule: + + + + Target Server: + + +
+
+
+
+ + +
+ +
+ + + + + +
+ Date + + Status +
+
+
+ +
+

+ {{agentJobInfo.lastRun}} +

+ + + + + + + + + + + + + + + + + + + + + + + + + +
+

Status:

+
+

+
+ Error Message: + + +
+ Duration: + + +
+ Log: + + +
+ SQL message ID: + + +
+ Retries Attempted: + + +
+
+
+ diff --git a/src/sql/parts/jobManagement/views/jobHistory.component.ts b/src/sql/parts/jobManagement/views/jobHistory.component.ts new file mode 100644 index 0000000000..e36d39973a --- /dev/null +++ b/src/sql/parts/jobManagement/views/jobHistory.component.ts @@ -0,0 +1,132 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'vs/css!./jobHistory'; + +import { OnInit, Component, Inject, forwardRef, ElementRef, ChangeDetectorRef, OnDestroy, ViewChild, Input } from '@angular/core'; +import { ICancelableEvent } from 'vs/base/parts/tree/browser/treeDefaults'; +import { IThemeService } from 'vs/platform/theme/common/themeService'; +import { attachListStyler } from 'vs/platform/theme/common/styler'; +import { getContentHeight } from 'vs/base/browser/dom'; +import { Tree } from 'vs/base/parts/tree/browser/treeImpl'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { Disposable, IDisposable } from 'vs/base/common/lifecycle'; +import { PanelComponent } from 'sql/base/browser/ui/panel/panel.component'; +import { IBootstrapService, BOOTSTRAP_SERVICE_ID } from 'sql/services/bootstrap/bootstrapService'; +import { IJobManagementService } from '../common/interfaces'; +import { ExplorerDataSource } from 'sql/parts/dashboard/widgets/explorer/explorerTree'; +import { TreeCreationUtils } from 'sql/parts/registeredServer/viewlet/treeCreationUtils'; +import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service'; +import { AgentViewComponent } from 'sql/parts/jobManagement/agent/agentView.component'; +import { JobHistoryController, JobHistoryDataSource, + JobHistoryRenderer, JobHistoryFilter, JobHistoryModel, JobHistoryRow } from 'sql/parts/jobManagement/views/jobHistoryTree'; +import { AgentJobHistoryInfo, AgentJobInfo } from 'sqlops'; +import { toDisposableSubscription } from '../../common/rxjsUtils'; + + +export const DASHBOARD_SELECTOR: string = 'jobhistory-component'; + +@Component({ + selector: DASHBOARD_SELECTOR, + templateUrl: decodeURI(require.toUrl('./jobHistory.component.html')) +}) +export class JobHistoryComponent extends Disposable implements OnInit, OnDestroy { + + private _jobManagementService: IJobManagementService; + private _tree: Tree; + private _treeController = new JobHistoryController(); + private _treeDataSource = new JobHistoryDataSource(); + private _treeRenderer = new JobHistoryRenderer(); + private _treeFilter = new JobHistoryFilter(); + + @ViewChild('table') private _tableContainer: ElementRef; + + @Input() public agentJobInfo: AgentJobInfo = undefined; + @Input() public jobId: string = undefined; + @Input() public agentJobHistoryInfo: AgentJobHistoryInfo = undefined; + private prevJobId: string = undefined; + private jobName: string = undefined; + + private isVisible: boolean = false; + + + constructor( + @Inject(BOOTSTRAP_SERVICE_ID) private bootstrapService: IBootstrapService, + @Inject(forwardRef(() => ElementRef)) el: ElementRef, + @Inject(forwardRef(() => ChangeDetectorRef)) private _cd: ChangeDetectorRef, + @Inject(forwardRef(() => DashboardServiceInterface)) private _dashboardService: DashboardServiceInterface, + @Inject(forwardRef(() => AgentViewComponent)) private _agentViewComponent: AgentViewComponent + ) { + super(); + this._jobManagementService = bootstrapService.jobManagementService; + } + + ngOnInit() { + let ownerUri: string = this._dashboardService.connectionManagementService.connectionInfo.ownerUri; + this.loadHistory(); + this._treeDataSource.data = []; + this._tree = new Tree(this._tableContainer.nativeElement, { + controller: this._treeController, + dataSource: this._treeDataSource, + filter: this._treeFilter, + renderer: this._treeRenderer + }); + this._register(attachListStyler(this._tree, this.bootstrapService.themeService)); + this._tree.layout(1024); + //this._tree.setInput(new JobHistoryModel()); + } + + ngOnDestroy() { + } + + ngAfterContentChecked() { + if (this.isVisible === false && this._tableContainer.nativeElement.offsetParent !== null) { + if (this.prevJobId !== undefined && this.prevJobId !== this.jobId) { + this.loadHistory(); + this.prevJobId = this.jobId; + } + } + } + + loadHistory() { + let ownerUri: string = this._dashboardService.connectionManagementService.connectionInfo.ownerUri; + this._jobManagementService.getJobHistory(ownerUri, this.jobId).then((result) => { + if (result.jobs) { + let jobHistory = result.jobs; + this._treeDataSource.data = jobHistory.map(job => this.convertToJobHistoryRow(job)); + this._tree.setInput(new JobHistoryModel()); + } + }); + } + + private toggleCollapse(): void { + let arrow: HTMLElement = $('.resultsViewCollapsible').get(0); + let checkbox: any = document.getElementById('accordion'); + if (arrow.className === 'resultsViewCollapsible' && checkbox.checked === false) { + arrow.className = 'resultsViewCollapsible collapsed'; + } else if (arrow.className === 'resultsViewCollapsible collapsed' && checkbox.checked === true) { + arrow.className = 'resultsViewCollapsible'; + } + } + + private jobAction(action: string): void { + let ownerUri: string = this._dashboardService.connectionManagementService.connectionInfo.ownerUri; + this._jobManagementService.jobAction(ownerUri, 'jobName', action); + } + + private goToJobs(): void { + this._agentViewComponent.showHistory = false; + } + + private convertToJobHistoryRow(historyInfo: AgentJobHistoryInfo): JobHistoryRow { + let jobHistoryRow = { + runDate: historyInfo.runDate, + runStatus: JobHistoryRow.convertToStatusString(historyInfo.runStatus), + jobID: historyInfo.jobID + }; + return jobHistoryRow; + } +} + diff --git a/src/sql/parts/jobManagement/views/jobHistory.css b/src/sql/parts/jobManagement/views/jobHistory.css new file mode 100644 index 0000000000..0fdc781484 --- /dev/null +++ b/src/sql/parts/jobManagement/views/jobHistory.css @@ -0,0 +1,221 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + + +.all-jobs { + display: inline; + font-size: 15px; + padding-bottom: 15px; +} + +.vs-dark ul.action-buttons { + border-top: 3px solid #444444; +} + +.action-buttons { + padding-top: 15px; + padding-left: 10px; + border-top: 3px solid #f4f4f4; + list-style-type: none; +} + +ul.action-buttons .icon-start, .icon-stop { + padding-left: 25px; +} + +ul.action-buttons li { + padding-right: 25px; + display: inline-block; + width: 50px; + cursor: pointer; +} + +.overview-container .overview-tab .resultsViewCollapsible { + padding: 15px; + display: inline; +} + +.job-heading { + text-align: left; + padding-left: 13px; +} + +.vs-dark .overview-container .overview-tab { + color: #fff; +} + +.overview-container > .overview-tab { + position: relative; + margin-bottom: 1px; + width: 100%; + color: #4a4a4a; + overflow: hidden; +} + +input#accordion { + position: absolute; + opacity: 0; + z-index: -1; +} + +.vs-dark .overview-container .overview-tab label { + background: #444444; +} + +.overview-container .overview-tab label { + position: relative; + display: block; + padding: 0 0 0 1em; + background: #f4f4f4; + font-weight: bold; + line-height: 3; + cursor: pointer; + width: 100%; +} + +.vs-dark .overview-tab .accordion-content { + background: #333333; +} + +.overview-tab .accordion-content { + max-height: 0; + overflow: hidden; + background: #eaeaea; + -webkit-transition: max-height .35s; + -o-transition: max-height .35s; + transition: max-height .35s; + width: 100%; +} + +.overview-tab .accordion-content p { + margin: 1em; +} + +/* :checked */ +input#accordion:checked ~ .accordion-content { + max-height: 10em; +} + +/* Icon */ +.overview-container .overview-tab label::after { + position: absolute; + right: 0; + top: 0; + display: block; + width: 3em; + height: 3em; + line-height: 3; + text-align: center; + -webkit-transition: all .3s; + -o-transition: all .3s; + transition: all .3s; +} + +.all-jobs > .back-button-icon { + content: url('../common/media/back.svg'); + width: 20px; + margin-right: 10px; + float: left; + cursor: pointer; + padding-left: 13px; +} + +.vs-dark.monaco-shell .all-jobs >.back-button-icon { + content: url('../common/media/back_inverse.svg'); +} + +.vs ul.action-buttons div.icon-start, +.vs-dark ul.action-buttons div.icon-start, +.hc-black ul.action-buttons div.icon-start { + display: inline-block; + height: 20px; + width: 20px; + background-image: url('../common/media/start.svg'); + background-repeat: no-repeat; +} + +.vs ul.action-buttons .icon-stop, +.vs-dark ul.action-buttons .icon-stop, +.hc-black ul.action-buttons .icon-stop { + display: inline-block; + background-image: url('../common/media/stop.svg'); + background-repeat: no-repeat; + height: 20px; + width: 20px; +} + +.accordion-content #col1, +.accordion-content #col2, +.accordion-content #col3, +.accordion-content #col4 { + padding: 10px; +} + +.accordion-content #col2 { + padding-right: 300px; +} + +table.step-list tr.step-row td { + padding-right: 100px; +} + +.history-details { + height: 100%; + display: flex; +} + +.vs-dark .history-details > .job-steps { + display: inline-block; + border-left: 3px solid #444444; + padding-left: 10px; + height: 100%; +} + +.history-details > .job-steps { + display: inline-block; + border-left: 3px solid #f4f4f4; + padding-left: 10px; + height: 100%; +} + +.vs-dark .step-table .monaco-tree .monaco-tree-rows.show-twisties > .monaco-tree-row.has-children > .content:before { + background-image: none; +} + +.step-table .monaco-tree .monaco-tree-rows.show-twisties > .monaco-tree-row.has-children > .content:before { + background: none; +} + +.step-table .monaco-tree.focused .monaco-tree-rows.show-twisties > .monaco-tree-row.has-children.selected:not(.loading) > .content:before { + background-image: none; +} + +.step-table .list-row .status-icon { + height: 10px; + width: 10px; + display: inline-block; +} + +.step-table .list-row .label { + padding-left: 10px; + display: inline-block; +} + +.passed { + background: green; +} + +.failed { + background: red; +} + +.unknown { + background: yellow; +} + +.date-column { + padding-left: 50px; + width: 140px; +} diff --git a/src/sql/parts/jobManagement/views/jobHistoryTree.ts b/src/sql/parts/jobManagement/views/jobHistoryTree.ts new file mode 100644 index 0000000000..75b8eba4be --- /dev/null +++ b/src/sql/parts/jobManagement/views/jobHistoryTree.ts @@ -0,0 +1,190 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import { Router } from '@angular/router'; + +import { IConnectionProfile } from 'sql/parts/connection/common/interfaces'; +import { MetadataType } from 'sql/parts/connection/common/connectionManagement'; +import { SingleConnectionManagementService } from 'sql/parts/dashboard/services/dashboardServiceInterface.service'; +import { + NewQueryAction, ScriptSelectAction, EditDataAction, ScriptCreateAction, ScriptExecuteAction, ScriptAlterAction, + BackupAction, ManageActionContext, BaseActionContext, ManageAction, RestoreAction +} from 'sql/workbench/common/actions'; +import { ICapabilitiesService } from 'sql/services/capabilities/capabilitiesService'; +import { ConnectionManagementInfo } from 'sql/parts/connection/common/connectionManagementInfo'; +import * as Constants from 'sql/parts/connection/common/constants'; +import * as tree from 'vs/base/parts/tree/browser/tree'; +import * as TreeDefaults from 'vs/base/parts/tree/browser/treeDefaults'; +import { Promise, TPromise } from 'vs/base/common/winjs.base'; +import { IMouseEvent } from 'vs/base/browser/mouseEvent'; +import { IContextMenuService } from 'vs/platform/contextview/browser/contextView'; +import { IAction } from 'vs/base/common/actions'; +import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; +import { generateUuid } from 'vs/base/common/uuid'; +import * as DOM from 'vs/base/browser/dom'; +import { OEAction } from 'sql/parts/registeredServer/viewlet/objectExplorerActions'; +import { Builder, $, withElementById } from 'vs/base/browser/builder'; + +export class JobHistoryRow { + runDate: string; + runStatus: string; + jobID: string; + + public static convertToStatusString(status: number): string { + switch(status) { + case(1): return 'Succeeded'; + case(0): return 'Failed'; + default: return 'Unknown'; + } + } +} + +// Empty class just for tree input +export class JobHistoryModel { + public static readonly id = generateUuid(); +} + +export class JobHistoryController extends TreeDefaults.DefaultController { + + protected onLeftClick(tree: tree.ITree, element: JobHistoryRow, event: IMouseEvent, origin: string = 'mouse'): boolean { + const payload = { origin: origin }; + const isDoubleClick = (origin === 'mouse' && event.detail === 2); + // Cancel Event + const isMouseDown = event && event.browserEvent && event.browserEvent.type === 'mousedown'; + + if (!isMouseDown) { + event.preventDefault(); // we cannot preventDefault onMouseDown because this would break DND otherwise + } + + event.stopPropagation(); + + tree.setFocus(element, payload); + + if (element && isDoubleClick) { + event.preventDefault(); // focus moves to editor, we need to prevent default + } else { + tree.setFocus(element, payload); + tree.setSelection([element], payload); + } + + return true; + } + + public onContextMenu(tree: tree.ITree, element: JobHistoryRow, event: tree.ContextMenuEvent): boolean { + return true; + } + +} + +export class JobHistoryDataSource implements tree.IDataSource { + private _data: JobHistoryRow[]; + + public getId(tree: tree.ITree, element: JobHistoryRow | JobHistoryModel): string { + if (element instanceof JobHistoryModel) { + return JobHistoryModel.id; + } else { + return (element as JobHistoryRow).jobID; + } + } + + public hasChildren(tree: tree.ITree, element: JobHistoryRow | JobHistoryModel): boolean { + if (element instanceof JobHistoryModel) { + return true; + } else { + return false; + } + } + + public getChildren(tree: tree.ITree, element: JobHistoryRow | JobHistoryModel): Promise { + if (element instanceof JobHistoryModel) { + return TPromise.as(this._data); + } else { + return TPromise.as(undefined); + } + } + + public getParent(tree: tree.ITree, element: JobHistoryRow | JobHistoryModel): Promise { + if (element instanceof JobHistoryModel) { + return TPromise.as(undefined); + } else { + return TPromise.as(new JobHistoryModel()); + } + } + + public set data(data: JobHistoryRow[]) { + this._data = data; + } +} + +export interface IListTemplate { + statusIcon: HTMLElement; + label: HTMLElement; +} + +export class JobHistoryRenderer implements tree.IRenderer { + private _statusIcon: HTMLElement; + + public getHeight(tree: tree.ITree, element: JobHistoryRow): number { + return 22; + } + + public getTemplateId(tree: tree.ITree, element: JobHistoryRow | JobHistoryModel): string { + if (element instanceof JobHistoryModel) { + return 'jobHistoryModel'; + } else { + return 'jobHistoryInfo'; + } + } + + public renderTemplate(tree: tree.ITree, templateId: string, container: HTMLElement): IListTemplate { + let row = DOM.$('.list-row'); + let label = DOM.$('.label'); + this._statusIcon = this.createStatusIcon(); + row.appendChild(this._statusIcon); + row.appendChild(label); + container.appendChild(row); + let statusIcon = this._statusIcon; + return { statusIcon, label }; + } + + public renderElement(tree: tree.ITree, element: JobHistoryRow, templateId: string, templateData: IListTemplate): void { + templateData.label.innerText = element.runDate + '\t\t\t' + element.runStatus; + let statusClass: string; + if (element.runStatus === 'Succeeded') { + statusClass = ' passed'; + } else if (element.runStatus === 'Failed') { + statusClass = ' failed'; + } else { + statusClass = ' unknown'; + } + this._statusIcon.className += statusClass; + } + + public disposeTemplate(tree: tree.ITree, templateId: string, templateData: IListTemplate): void { + // no op + } + + private createStatusIcon(): HTMLElement { + let statusIcon: HTMLElement = DOM.$('div'); + statusIcon.className += ' status-icon'; + return statusIcon; + } +} + +export class JobHistoryFilter implements tree.IFilter { + private _filterString: string; + + public isVisible(tree: tree.ITree, element: JobHistoryRow): boolean { + return this._isJobVisible(); + } + + private _isJobVisible(): boolean { + return true; + } + + public set filterString(val: string) { + this._filterString = val; + } +} diff --git a/src/sql/parts/jobManagement/views/jobsView.component.html b/src/sql/parts/jobManagement/views/jobsView.component.html new file mode 100644 index 0000000000..c3f793205c --- /dev/null +++ b/src/sql/parts/jobManagement/views/jobsView.component.html @@ -0,0 +1,9 @@ + +

Jobs

+ +
diff --git a/src/sql/parts/jobManagement/views/jobsView.component.ts b/src/sql/parts/jobManagement/views/jobsView.component.ts new file mode 100644 index 0000000000..9113c0264a --- /dev/null +++ b/src/sql/parts/jobManagement/views/jobsView.component.ts @@ -0,0 +1,255 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +import 'vs/css!sql/parts/grid/media/slickColorTheme'; +import 'vs/css!sql/parts/grid/media/flexbox'; +import 'vs/css!sql/parts/grid/media/styles'; +import 'vs/css!sql/parts/grid/media/slick.grid'; +import 'vs/css!sql/parts/grid/media/slickGrid'; +import 'vs/css!../common/media/jobs'; +import 'vs/css!../common/media/detailview'; + +import { OnInit, Component, Inject, forwardRef, ElementRef, ChangeDetectorRef, OnDestroy, ViewChild } from '@angular/core'; +import * as Utils from 'sql/parts/connection/common/utils'; +import { RefreshWidgetAction, EditDashboardAction } from 'sql/parts/dashboard/common/actions'; +import { IColorTheme } from 'vs/workbench/services/themes/common/workbenchThemeService'; +import { IDisposable } from 'vs/base/common/lifecycle'; +import * as themeColors from 'vs/workbench/common/theme'; +import { DashboardPage } from 'sql/parts/dashboard/common/dashboardPage.component'; +import { ActionBar } from 'vs/base/browser/ui/actionbar/actionbar'; +import { IBootstrapService, BOOTSTRAP_SERVICE_ID } from 'sql/services/bootstrap/bootstrapService'; +import { IJobManagementService } from '../common/interfaces'; +import { DashboardServiceInterface } from 'sql/parts/dashboard/services/dashboardServiceInterface.service'; +import * as sqlops from 'sqlops'; +import * as vscode from 'vscode'; +import * as nls from 'vs/nls'; +import { IGridDataSet } from 'sql/parts/grid/common/interfaces'; +import { FieldType, IObservableCollection, CollectionChange, SlickGrid } from 'angular2-slickgrid'; +import { Table } from 'sql/base/browser/ui/table/table'; +import { attachTableStyler } from 'sql/common/theme/styler'; +import { JobHistoryComponent } from './jobHistory.component'; +import { AgentViewComponent } from '../agent/agentView.component'; +import { RowDetailView } from 'sql/base/browser/ui/table/plugins/rowdetailview'; + +export const JOBSVIEW_SELECTOR: string = 'jobsview-component'; + +@Component({ + selector: JOBSVIEW_SELECTOR, + templateUrl: decodeURI(require.toUrl('./jobsView.component.html')) +}) +export class JobsViewComponent implements OnInit, OnDestroy { + + private _jobManagementService: IJobManagementService; + + private _disposables = new Array(); + + private columns: Array> = [ + { name: 'Name', field: 'name', formatter: this.renderName, width: 200, }, + { name: 'Last Run', field: 'lastRun' }, + { name: 'Next Run', field: 'nextRun' }, + { name: 'Enabled', field: 'enabled' }, + { name: 'Status', field: 'currentExecutionStatus' }, + { name: 'Category', field: 'category' }, + { name: 'Runnable', field: 'runnable' }, + { name: 'Schedule', field: 'hasSchedule' }, + { name: 'Category ID', field: 'categoryId' }, + { name: 'Last Run Outcome', field: 'lastRunOutcome' }, + ]; + + private rowDetail: any; + private dataView: any; + + @ViewChild('jobsgrid') _gridEl: ElementRef; + private isVisible: boolean = false; + private isInitialized: boolean = false; + + private _table: Table; + + public jobs: sqlops.AgentJobInfo[]; + + public jobHistories: { [jobId: string]: sqlops.AgentJobHistoryInfo[]; } = Object.create(null); + + constructor( + @Inject(BOOTSTRAP_SERVICE_ID) private bootstrapService: IBootstrapService, + @Inject(forwardRef(() => DashboardServiceInterface)) private _dashboardService: DashboardServiceInterface, + @Inject(forwardRef(() => ChangeDetectorRef)) private _cd: ChangeDetectorRef, + @Inject(forwardRef(() => ElementRef)) private _el: ElementRef, + @Inject(forwardRef(() => AgentViewComponent)) private _agentViewComponent: AgentViewComponent + ) { + this._jobManagementService = bootstrapService.jobManagementService; + } + + ngAfterContentChecked() { + if (this.isVisible === false && this._gridEl.nativeElement.offsetParent !== null) { + this.isVisible = true; + if (!this.isInitialized) { + this.onFirstVisible(); + this.isInitialized = true; + } + } else if (this.isVisible === true && this._gridEl.nativeElement.offsetParent === null) { + this.isVisible = false; + } + } + + loadJobHistories() { + if (this.jobs) { + this.jobs.forEach((job) => { + let ownerUri: string = this._dashboardService.connectionManagementService.connectionInfo.ownerUri; + this._jobManagementService.getJobHistory(ownerUri, job.jobId).then((result) => { + if (result.jobs) { + this.jobHistories[job.jobId] = result.jobs; + this.expandJobsWithFailures(); + } + }); + }); + } + } + + private expandJobsWithFailures(): void { + for (let i: number = 0; i < this.jobs.length; ++i) { + let job = this.jobs[i]; + let jobHistory = this.jobHistories[job.jobId]; + if (jobHistory && jobHistory.length > 0) { + let latestExecution = jobHistory[jobHistory.length - 1]; + if (latestExecution.runStatus !== 0) { + this.expandJobRowDetails(i); + } + } + } + } + + private expandJobRowDetails(rowIdx: number): void { + } + + onFirstVisible() { + let self = this; + let columns = this.columns.map((column) => { + column.rerenderOnResize = true; + return column; + }); + let options = >{ + syncColumnCellResize: true, + enableColumnReorder: false, + rowHeight: 45, + enableCellNavigation: true + }; + + this.dataView = new Slick.Data.DataView({ inlineFilters: false }); + let rowDetail = new RowDetailView({ + cssClass: 'detailView-toggle', + preTemplate: this.loadingTemplate, + process: (job) => { + (rowDetail).onAsyncResponse.notify({ + 'itemDetail': job + }, undefined, this); + }, + panelRows: 2 + }); + + this.rowDetail = rowDetail; + + columns.unshift(this.rowDetail.getColumnDefinition()); + this._table = new Table(this._gridEl.nativeElement, undefined, columns, options); + this._table.grid.setData(this.dataView, true); + this._table.grid.onClick.subscribe((e, args) => { + let job = self.getJob(args); + self._agentViewComponent.jobId = job.jobId; + self._agentViewComponent.agentJobInfo = job; + self.getJobHistoryInfo(ownerUri, job).then(result => { + if (result) { + this._agentViewComponent.agentJobHistoryInfo = result; + } + }); + self.isVisible = false; + self._agentViewComponent.showHistory = true; + }); + this._cd.detectChanges(); + + let ownerUri: string = this._dashboardService.connectionManagementService.connectionInfo.ownerUri; + this._jobManagementService.getJobs(ownerUri).then((result) => { + if (result && result.jobs) { + this.jobs = result.jobs; + this.onJobsAvailable(result.jobs); + } + }); + } + + getJobHistoryInfo(ownerUri: string, job: any): Thenable { + return new Promise((resolve, reject) => { + if (this.jobHistories[job.jobId]){ + Promise.resolve(this.jobHistories[job.jobId]); + } else { + this._jobManagementService.getJobHistory(ownerUri, job.jobId).then(result => { + if (result && result.jobs) { + Promise.resolve(result.jobs); + } else { + Promise.reject(undefined); + } + }); + } + }); + } + + onJobsAvailable(jobs: sqlops.AgentJobInfo[]) { + let jobViews = jobs.map((job) => { + return { + id: job.jobId, + jobId: job.jobId, + name: job.name, + lastRun: job.lastRun, + nextRun: job.nextRun, + enabled: job.enabled, + currentExecutionStatus: job.currentExecutionStatus, + category: job.category, + runnable: job.runnable, + hasSchedule: job.hasSchedule, + categoryId: job.categoryId, + lastRunOutcome: job.lastRunOutcome + }; + }); + + this._table.registerPlugin(this.rowDetail); + + this.rowDetail.onBeforeRowDetailToggle.subscribe(function(e, args) { + }); + this.rowDetail.onAfterRowDetailToggle.subscribe(function(e, args) { + }); + this.rowDetail.onAsyncEndUpdate.subscribe(function(e, args) { + }); + + this.dataView.beginUpdate(); + this.dataView.setItems(jobViews); + this.dataView.endUpdate(); + + this._table.resizeCanvas(); + this._table.autosizeColumns(); + + this.loadJobHistories(); + } + + ngOnInit() { + } + + ngOnDestroy() { + } + + loadingTemplate() { + return '
Loading...
'; + } + + renderName(row, cell, value, columnDef, dataContext) { + return '' + + '' + + '' + + '
' + dataContext.name + '
'; + } + + private getJob(args: Slick.OnClickEventArgs): sqlops.AgentJobInfo { + let cell = args.cell; + let jobName = args.grid.getCellNode(1, cell).innerText.trim(); + let job = this.jobs.filter(job => job.name === jobName)[0]; + return job; + } +} diff --git a/src/sql/services/bootstrap/bootstrapService.ts b/src/sql/services/bootstrap/bootstrapService.ts index bb2f82c6dd..66192583d8 100644 --- a/src/sql/services/bootstrap/bootstrapService.ts +++ b/src/sql/services/bootstrap/bootstrapService.ts @@ -41,6 +41,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { ConfigurationEditingService } from 'vs/workbench/services/configuration/node/configurationEditingService'; import { ICommandService } from 'vs/platform/commands/common/commands'; +import { IJobManagementService } from 'sql/parts/jobManagement/common/interfaces'; export const BOOTSTRAP_SERVICE_ID = 'bootstrapService'; export const IBootstrapService = createDecorator(BOOTSTRAP_SERVICE_ID); @@ -92,6 +93,7 @@ export interface IBootstrapService { configurationEditorService: ConfigurationEditingService; commandService: ICommandService; dashboardWebviewService: IDashboardWebviewService; + jobManagementService: IJobManagementService; /* * Bootstraps the Angular module described. Components that need singleton services should inject the diff --git a/src/sql/services/bootstrap/bootstrapServiceImpl.ts b/src/sql/services/bootstrap/bootstrapServiceImpl.ts index 5c44546889..238644d58a 100644 --- a/src/sql/services/bootstrap/bootstrapServiceImpl.ts +++ b/src/sql/services/bootstrap/bootstrapServiceImpl.ts @@ -45,6 +45,7 @@ import { ITelemetryService } from 'vs/platform/telemetry/common/telemetry'; import { IStorageService } from 'vs/platform/storage/common/storage'; import { ConfigurationEditingService } from 'vs/workbench/services/configuration/node/configurationEditingService'; import { ICommandService } from 'vs/platform/commands/common/commands'; +import { IJobManagementService } from 'sql/parts/jobManagement/common/interfaces'; export class BootstrapService implements IBootstrapService { @@ -100,7 +101,8 @@ export class BootstrapService implements IBootstrapService { @IClipboardService public clipboardService: IClipboardService, @ICapabilitiesService public capabilitiesService: ICapabilitiesService, @ICommandService public commandService: ICommandService, - @IDashboardWebviewService public dashboardWebviewService: IDashboardWebviewService + @IDashboardWebviewService public dashboardWebviewService: IDashboardWebviewService, + @IJobManagementService public jobManagementService: IJobManagementService ) { this.configurationEditorService = this.instantiationService.createInstance(ConfigurationEditingService); this._bootstrapParameterMap = new Map(); diff --git a/src/sql/workbench/api/node/extHostDataProtocol.ts b/src/sql/workbench/api/node/extHostDataProtocol.ts index c71f5e5ff6..22bbe076a2 100644 --- a/src/sql/workbench/api/node/extHostDataProtocol.ts +++ b/src/sql/workbench/api/node/extHostDataProtocol.ts @@ -53,7 +53,7 @@ export class ExtHostDataProtocol extends ExtHostDataProtocolShape { provider.handle = this._nextHandle(); this._adapter.set(provider.handle, provider); return this._createDisposable(provider.handle); - }; + } $registerConnectionProvider(provider: sqlops.ConnectionProvider): vscode.Disposable { let rt = this.registerProvider(provider); @@ -121,6 +121,12 @@ export class ExtHostDataProtocol extends ExtHostDataProtocolShape { return rt; } + $registerAgentServiceProvider(provider: sqlops.AgentServicesProvider): vscode.Disposable { + let rt = this.registerProvider(provider); + this._proxy.$registerAgentServicesProvider(provider.providerId, provider.handle); + return rt; + } + $registerCapabilitiesServiceProvider(provider: sqlops.CapabilitiesProvider): vscode.Disposable { let rt = this.registerProvider(provider); this._proxy.$registerCapabilitiesServiceProvider(provider.providerId, provider.handle); @@ -481,4 +487,30 @@ export class ExtHostDataProtocol extends ExtHostDataProtocolShape { public $onSessionEventsAvailable(handle: number, response: sqlops.ProfilerSessionEvents): void { this._proxy.$onSessionEventsAvailable(handle, response); } + + + /** + * Agent Job Provider methods + */ + + /** + * Get Agent Job list + */ + public $getJobs(handle: number, ownerUri: string): Thenable { + return this._resolveProvider(handle).getJobs(ownerUri); + } + + /** + * Get a Agent Job's history + */ + public $getJobHistory(handle: number, ownerUri: string, jobID: string): Thenable { + return this._resolveProvider(handle).getJobHistory(ownerUri, jobID); + } + + /** + * Run an action on a job + */ + public $jobAction(handle: number, ownerUri: string, jobName: string, action: string): Thenable { + return this._resolveProvider(handle).jobAction(ownerUri, jobName, action); + } } diff --git a/src/sql/workbench/api/node/mainThreadDataProtocol.ts b/src/sql/workbench/api/node/mainThreadDataProtocol.ts index 66c473a091..234a45dec7 100644 --- a/src/sql/workbench/api/node/mainThreadDataProtocol.ts +++ b/src/sql/workbench/api/node/mainThreadDataProtocol.ts @@ -18,6 +18,7 @@ import { IMetadataService } from 'sql/services/metadata/metadataService'; import { IObjectExplorerService } from 'sql/parts/registeredServer/common/objectExplorerService'; import { IScriptingService } from 'sql/services/scripting/scriptingService'; import { IAdminService } from 'sql/parts/admin/common/adminService'; +import { IJobManagementService } from 'sql/parts/jobManagement/common/interfaces'; import { IBackupService } from 'sql/parts/disasterRecovery/backup/common/backupService'; import { IRestoreService } from 'sql/parts/disasterRecovery/restore/common/restoreService'; import { ITaskService } from 'sql/parts/taskHistory/common/taskService'; @@ -50,6 +51,7 @@ export class MainThreadDataProtocol implements MainThreadDataProtocolShape { @IObjectExplorerService private _objectExplorerService: IObjectExplorerService, @IScriptingService private _scriptingService: IScriptingService, @IAdminService private _adminService: IAdminService, + @IJobManagementService private _jobManagementService: IJobManagementService, @IBackupService private _backupService: IBackupService, @IRestoreService private _restoreService: IRestoreService, @ITaskService private _taskService: ITaskService, @@ -329,6 +331,24 @@ export class MainThreadDataProtocol implements MainThreadDataProtocolShape { return undefined; } + public $registerAgentServicesProvider(providerId: string, handle: number): TPromise { + const self = this; + this._jobManagementService.registerProvider(providerId, { + providerId: providerId, + getJobs(connectionUri: string): Thenable { + return self._proxy.$getJobs(handle, connectionUri); + }, + getJobHistory(connectionUri: string, jobID: string): Thenable { + return self._proxy.$getJobHistory(handle, connectionUri, jobID); + }, + jobAction(connectionUri: string, jobName: string, action: string): Thenable { + return self._proxy.$jobAction(handle, connectionUri, jobName, action); + } + }); + + return undefined; + } + public $registerCapabilitiesServiceProvider(providerId: string, handle: number): TPromise { const self = this; this._capabilitiesService.registerProvider({ diff --git a/src/sql/workbench/api/node/sqlExtHost.api.impl.ts b/src/sql/workbench/api/node/sqlExtHost.api.impl.ts index 1886c1bb06..ceccbb2437 100644 --- a/src/sql/workbench/api/node/sqlExtHost.api.impl.ts +++ b/src/sql/workbench/api/node/sqlExtHost.api.impl.ts @@ -28,7 +28,6 @@ import { ExtHostConfiguration } from 'vs/workbench/api/node/extHostConfiguration import { ExtHostModalDialogs } from 'sql/workbench/api/node/extHostModalDialog'; import { ExtHostTasks } from 'sql/workbench/api/node/extHostTasks'; import { ILogService } from 'vs/platform/log/common/log'; -import { IExtensionApiFactory } from 'vs/workbench/api/node/extHost.api.impl'; import { ExtHostDashboardWebviews } from 'sql/workbench/api/node/extHostDashboardWebview'; import { ExtHostConnectionManagement } from 'sql/workbench/api/node/extHostConnectionManagement'; import { ExtHostDashboard } from 'sql/workbench/api/node/extHostDashboard'; @@ -256,7 +255,7 @@ export function createApiFactory( }; let registerAgentServicesProvider = (provider: sqlops.AgentServicesProvider): vscode.Disposable => { - return undefined; + return extHostDataProvider.$registerAgentServiceProvider(provider); }; // namespace: dataprotocol @@ -272,6 +271,7 @@ export function createApiFactory( registerTaskServicesProvider, registerQueryProvider, registerAdminServicesProvider, + registerAgentServicesProvider, registerCapabilitiesServiceProvider, registerAgentServicesProvider, onDidChangeLanguageFlavor(listener: (e: sqlops.DidChangeLanguageFlavorParams) => any, thisArgs?: any, disposables?: extHostTypes.Disposable[]) { diff --git a/src/sql/workbench/api/node/sqlExtHost.protocol.ts b/src/sql/workbench/api/node/sqlExtHost.protocol.ts index 2974c4280a..19fdaf9843 100644 --- a/src/sql/workbench/api/node/sqlExtHost.protocol.ts +++ b/src/sql/workbench/api/node/sqlExtHost.protocol.ts @@ -306,6 +306,22 @@ export abstract class ExtHostDataProtocolShape { * Stop a profiler session */ $stopSession(handle: number, sessionId: string): Thenable { throw ni(); } + + + /** + * Get Agent Job list + */ + $getJobs(handle: number, ownerUri: string): Thenable{ throw ni(); } + + /** + * Get a Agent Job's history + */ + $getJobHistory(handle: number, ownerUri: string, jobID: string): Thenable{ throw ni(); } + + /** + * Run an action on a Job + */ + $jobAction(handle: number, ownerUri: string, jobName: string, action: string): Thenable{ throw ni(); } } /** @@ -370,6 +386,7 @@ export interface MainThreadDataProtocolShape extends IDisposable { $registerFileBrowserProvider(providerId: string, handle: number): TPromise; $registerCapabilitiesServiceProvider(providerId: string, handle: number): TPromise; $registerAdminServicesProvider(providerId: string, handle: number): TPromise; + $registerAgentServicesProvider(providerId: string, handle: number): TPromise; $unregisterProvider(handle: number): TPromise; $onConnectionComplete(handle: number, connectionInfoSummary: sqlops.ConnectionInfoSummary): void; $onIntelliSenseCacheComplete(handle: number, connectionUri: string): void; diff --git a/src/sql/workbench/update/releaseNotes.ts b/src/sql/workbench/update/releaseNotes.ts index f67ed7a4b3..1e6367e6eb 100644 --- a/src/sql/workbench/update/releaseNotes.ts +++ b/src/sql/workbench/update/releaseNotes.ts @@ -68,7 +68,7 @@ export class ProductContribution implements IWorkbenchContribution { text => editorService.openEditor(instantiationService.createInstance(ReleaseNotesInput, pkg.version, text), { pinned: true }), () => { messageService.show(Severity.Info, { - message: nls.localize('read the release notes', "Welcome to {0} February Public Preview! Would you like to view the Getting Started Guide?", product.nameLong, pkg.version), + message: nls.localize('read the release notes', "Welcome to {0} March Public Preview! Would you like to view the Getting Started Guide?", product.nameLong, pkg.version), actions: [ instantiationService.createInstance(OpenGettingStartedInBrowserAction), CloseAction diff --git a/src/sqltest/parts/jobManagement/jobManagementService.test.ts b/src/sqltest/parts/jobManagement/jobManagementService.test.ts new file mode 100644 index 0000000000..6a0753a3c3 --- /dev/null +++ b/src/sqltest/parts/jobManagement/jobManagementService.test.ts @@ -0,0 +1,21 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Licensed under the Source EULA. See License.txt in the project root for license information. + *--------------------------------------------------------------------------------------------*/ + +'use strict'; +import * as sqlops from 'sqlops'; +import * as assert from 'assert'; +import * as TypeMoq from 'typemoq'; +import { JobManagementService } from 'sql/parts/jobManagement/common/jobManagementService'; + +// TESTS /////////////////////////////////////////////////////////////////// +suite('Job Management service tests', () => { + setup(() => { + }); + + test('Construction - Job Service Initialization', () => { + // ... Create instance of the service and reder account picker + let service = new JobManagementService(undefined, undefined); + }); +}); diff --git a/src/vs/workbench/electron-browser/bootstrap/index.js b/src/vs/workbench/electron-browser/bootstrap/index.js index 31968a0d17..1fd953580b 100644 --- a/src/vs/workbench/electron-browser/bootstrap/index.js +++ b/src/vs/workbench/electron-browser/bootstrap/index.js @@ -123,7 +123,8 @@ function registerListeners(enableDeveloperTools) { require('slickgrid/slick.core'); const Slick = window.Slick; require('slickgrid/slick.grid'); -require('slickgrid/slick.editors');; +require('slickgrid/slick.editors'); +require('slickgrid/slick.dataview'); require('reflect-metadata'); require('zone.js'); diff --git a/src/vs/workbench/electron-browser/workbench.ts b/src/vs/workbench/electron-browser/workbench.ts index 9adcbc5bb8..440ca23a8c 100644 --- a/src/vs/workbench/electron-browser/workbench.ts +++ b/src/vs/workbench/electron-browser/workbench.ts @@ -123,6 +123,8 @@ import { IQueryManagementService, QueryManagementService } from 'sql/parts/query import { IEditorDescriptorService, EditorDescriptorService } from 'sql/parts/query/editor/editorDescriptorService'; import { IScriptingService, ScriptingService } from 'sql/services/scripting/scriptingService'; import { IAdminService, AdminService } from 'sql/parts/admin/common/adminService'; +import { IJobManagementService } from 'sql/parts/jobManagement/common/interfaces'; +import { JobManagementService } from 'sql/parts/jobManagement/common/jobManagementService'; import { IBackupService, IBackupUiService } from 'sql/parts/disasterRecovery/backup/common/backupService'; import { BackupService, BackupUiService } from 'sql/parts/disasterRecovery/backup/common/backupServiceImp'; import { IRestoreDialogController, IRestoreService } from 'sql/parts/disasterRecovery/restore/common/restoreService'; @@ -700,6 +702,7 @@ export class Workbench implements IPartService { serviceCollection.set(IObjectExplorerService, this.instantiationService.createInstance(ObjectExplorerService)); serviceCollection.set(IScriptingService, this.instantiationService.createInstance(ScriptingService)); serviceCollection.set(IAdminService, this.instantiationService.createInstance(AdminService)); + serviceCollection.set(IJobManagementService, this.instantiationService.createInstance(JobManagementService)); serviceCollection.set(IBackupService, this.instantiationService.createInstance(BackupService)); serviceCollection.set(IBackupUiService, this.instantiationService.createInstance(BackupUiService)); serviceCollection.set(IRestoreService, this.instantiationService.createInstance(RestoreService)); diff --git a/src/vs/workbench/workbench.main.ts b/src/vs/workbench/workbench.main.ts index d2db1c8986..a805ccad47 100644 --- a/src/vs/workbench/workbench.main.ts +++ b/src/vs/workbench/workbench.main.ts @@ -163,6 +163,7 @@ import 'sql/parts/dashboard/widgets/webview/webviewWidget.contribution'; import 'sql/parts/dashboard/dashboardConfig.contribution'; /* Containers */ import 'sql/parts/dashboard/containers/dashboardWebviewContainer.contribution'; +import 'sql/parts/dashboard/containers/dashboardControlHostContainer.contribution'; import 'sql/parts/dashboard/containers/dashboardGridContainer.contribution'; import 'sql/parts/dashboard/containers/dashboardWidgetContainer.contribution'; import 'sql/parts/dashboard/containers/dashboardContainer.contribution';