diff --git a/package-lock.json b/package-lock.json index bc0a3876..d7156d74 100644 --- a/package-lock.json +++ b/package-lock.json @@ -34,9 +34,9 @@ } }, "@types/lodash": { - "version": "4.14.120", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.120.tgz", - "integrity": "sha512-jQ21kQ120mo+IrDs1nFNVm/AsdFxIx2+vZ347DbogHJPd/JzKNMOqU6HCYin1W6v8l5R9XSO2/e9cxmn7HAnVw==", + "version": "4.14.121", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.121.tgz", + "integrity": "sha512-ORj7IBWj13iYufXt/VXrCNMbUuCTJfhzme5kx9U/UtcIPdJYuvPDUAlHlbNhz/8lKCLy9XGIZnGrqXOtQbPGoQ==", "dev": true }, "@types/md5": { @@ -55,9 +55,9 @@ "dev": true }, "@types/node": { - "version": "8.10.39", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.39.tgz", - "integrity": "sha512-rE7fktr02J8ybFf6eysife+WF+L4sAHWzw09DgdCebEu+qDwMvv4zl6Bc+825ttGZP73kCKxa3dhJOoGJ8+5mA==", + "version": "8.10.40", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.40.tgz", + "integrity": "sha512-RRSjdwz63kS4u7edIwJUn8NqKLLQ6LyqF/X4+4jp38MBT3Vwetewi2N4dgJEshLbDwNgOJXNYoOwzVZUSSLhkQ==", "dev": true }, "@types/xml2js": { @@ -71,175 +71,179 @@ } }, "@webassemblyjs/ast": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.11.tgz", - "integrity": "sha512-ZEzy4vjvTzScC+SH8RBssQUawpaInUdMTYwYYLh54/s8TuT0gBLuyUnppKsVyZEi876VmmStKsUs28UxPgdvrA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.3.tgz", + "integrity": "sha512-xy3m06+Iu4D32+6soz6zLnwznigXJRuFNTovBX2M4GqVqLb0dnyWLbPnpcXvUSdEN+9DVyDeaq2jyH1eIL2LZQ==", "dev": true, "requires": { - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11" + "@webassemblyjs/helper-module-context": "1.8.3", + "@webassemblyjs/helper-wasm-bytecode": "1.8.3", + "@webassemblyjs/wast-parser": "1.8.3" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz", - "integrity": "sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.3.tgz", + "integrity": "sha512-vq1TISG4sts4f0lDwMUM0f3kpe0on+G3YyV5P0IySHFeaLKRYZ++n2fCFfG4TcCMYkqFeTUYFxm75L3ddlk2xA==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz", - "integrity": "sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.3.tgz", + "integrity": "sha512-BmWEynI4FnZbjk8CaYZXwcv9a6gIiu+rllRRouQUo73hglanXD3AGFJE7Q4JZCoVE0p5/jeX6kf5eKa3D4JxwQ==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz", - "integrity": "sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.3.tgz", + "integrity": "sha512-iVIMhWnNHoFB94+/2l7LpswfCsXeMRnWfExKtqsZ/E2NxZyUx9nTeKK/MEMKTQNEpyfznIUX06OchBHQ+VKi/Q==", "dev": true }, "@webassemblyjs/helper-code-frame": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz", - "integrity": "sha512-T8ESC9KMXFTXA5urJcyor5cn6qWeZ4/zLPyWeEXZ03hj/x9weSokGNkVCdnhSabKGYWxElSdgJ+sFa9G/RdHNw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.3.tgz", + "integrity": "sha512-K1UxoJML7GKr1QXR+BG7eXqQkvu+eEeTjlSl5wUFQ6W6vaOc5OwSxTcb3oE9x/3+w4NHhrIKD4JXXCZmLdL2cg==", "dev": true, "requires": { - "@webassemblyjs/wast-printer": "1.7.11" + "@webassemblyjs/wast-printer": "1.8.3" } }, "@webassemblyjs/helper-fsm": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz", - "integrity": "sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.3.tgz", + "integrity": "sha512-387zipfrGyO77/qm7/SDUiZBjQ5KGk4qkrVIyuoubmRNIiqn3g+6ijY8BhnlGqsCCQX5bYKOnttJobT5xoyviA==", "dev": true }, "@webassemblyjs/helper-module-context": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz", - "integrity": "sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==", - "dev": true + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.3.tgz", + "integrity": "sha512-lPLFdQfaRssfnGEJit5Sk785kbBPPPK4ZS6rR5W/8hlUO/5v3F+rN8XuUcMj/Ny9iZiyKhhuinWGTUuYL4VKeQ==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.3", + "mamacro": "^0.0.3" + } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz", - "integrity": "sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.3.tgz", + "integrity": "sha512-R1nJW7bjyJLjsJQR5t3K/9LJ0QWuZezl8fGa49DZq4IVaejgvkbNlKEQxLYTC579zgT4IIIVHb5JA59uBPHXyw==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz", - "integrity": "sha512-8ZRY5iZbZdtNFE5UFunB8mmBEAbSI3guwbrsCl4fWdfRiAcvqQpeqd5KHhSWLL5wuxo53zcaGZDBU64qgn4I4Q==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.3.tgz", + "integrity": "sha512-P6F7D61SJY73Yz+fs49Q3+OzlYAZP86OfSpaSY448KzUy65NdfzDmo2NPVte+Rw4562MxEAacvq/mnDuvRWOcg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11" + "@webassemblyjs/ast": "1.8.3", + "@webassemblyjs/helper-buffer": "1.8.3", + "@webassemblyjs/helper-wasm-bytecode": "1.8.3", + "@webassemblyjs/wasm-gen": "1.8.3" } }, "@webassemblyjs/ieee754": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz", - "integrity": "sha512-Mmqx/cS68K1tSrvRLtaV/Lp3NZWzXtOHUW2IvDvl2sihAwJh4ACE0eL6A8FvMyDG9abes3saB6dMimLOs+HMoQ==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.3.tgz", + "integrity": "sha512-UD4HuLU99hjIvWz1pD68b52qsepWQlYCxDYVFJQfHh3BHyeAyAlBJ+QzLR1nnS5J6hAzjki3I3AoJeobNNSZlg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.11.tgz", - "integrity": "sha512-vuGmgZjjp3zjcerQg+JA+tGOncOnJLWVkt8Aze5eWQLwTQGNgVLcyOTqgSCxWTR4J42ijHbBxnuRaL1Rv7XMdw==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.3.tgz", + "integrity": "sha512-XXd3s1BmkC1gpGABuCRLqCGOD6D2L+Ma2BpwpjrQEHeQATKWAQtxAyU9Z14/z8Ryx6IG+L4/NDkIGHrccEhRUg==", "dev": true, "requires": { - "@xtuc/long": "4.2.1" + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.11.tgz", - "integrity": "sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.3.tgz", + "integrity": "sha512-Wv/WH9Zo5h5ZMyfCNpUrjFsLZ3X1amdfEuwdb7MLdG3cPAjRS6yc6ElULlpjLiiBTuzvmLhr3ENsuGyJ3wyCgg==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz", - "integrity": "sha512-FUd97guNGsCZQgeTPKdgxJhBXkUbMTY6hFPf2Y4OedXd48H97J+sOY2Ltaq6WGVpIH8o/TGOVNiVz/SbpEMJGg==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.3.tgz", + "integrity": "sha512-nB19eUx3Yhi1Vvv3yev5r+bqQixZprMtaoCs1brg9Efyl8Hto3tGaUoZ0Yb4Umn/gQCyoEGFfUxPLp1/8+Jvnw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/helper-wasm-section": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-opt": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", - "@webassemblyjs/wast-printer": "1.7.11" + "@webassemblyjs/ast": "1.8.3", + "@webassemblyjs/helper-buffer": "1.8.3", + "@webassemblyjs/helper-wasm-bytecode": "1.8.3", + "@webassemblyjs/helper-wasm-section": "1.8.3", + "@webassemblyjs/wasm-gen": "1.8.3", + "@webassemblyjs/wasm-opt": "1.8.3", + "@webassemblyjs/wasm-parser": "1.8.3", + "@webassemblyjs/wast-printer": "1.8.3" } }, "@webassemblyjs/wasm-gen": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz", - "integrity": "sha512-U/KDYp7fgAZX5KPfq4NOupK/BmhDc5Kjy2GIqstMhvvdJRcER/kUsMThpWeRP8BMn4LXaKhSTggIJPOeYHwISA==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.3.tgz", + "integrity": "sha512-sDNmu2nLBJZ/huSzlJvd9IK8B1EjCsOl7VeMV9VJPmxKYgTJ47lbkSP+KAXMgZWGcArxmcrznqm7FrAPQ7vVGg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" + "@webassemblyjs/ast": "1.8.3", + "@webassemblyjs/helper-wasm-bytecode": "1.8.3", + "@webassemblyjs/ieee754": "1.8.3", + "@webassemblyjs/leb128": "1.8.3", + "@webassemblyjs/utf8": "1.8.3" } }, "@webassemblyjs/wasm-opt": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz", - "integrity": "sha512-XynkOwQyiRidh0GLua7SkeHvAPXQV/RxsUeERILmAInZegApOUAIJfRuPYe2F7RcjOC9tW3Cb9juPvAC/sCqvg==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.3.tgz", + "integrity": "sha512-j8lmQVFR+FR4/645VNgV4R/Jz8i50eaPAj93GZyd3EIJondVshE/D9pivpSDIXyaZt+IkCodlzOoZUE4LnQbeA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-buffer": "1.7.11", - "@webassemblyjs/wasm-gen": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11" + "@webassemblyjs/ast": "1.8.3", + "@webassemblyjs/helper-buffer": "1.8.3", + "@webassemblyjs/wasm-gen": "1.8.3", + "@webassemblyjs/wasm-parser": "1.8.3" } }, "@webassemblyjs/wasm-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz", - "integrity": "sha512-6lmXRTrrZjYD8Ng8xRyvyXQJYUQKYSXhJqXOBLw24rdiXsHAOlvw5PhesjdcaMadU/pyPQOJ5dHreMjBxwnQKg==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.3.tgz", + "integrity": "sha512-NBI3SNNtRoy4T/KBsRZCAWUzE9lI94RH2nneLwa1KKIrt/2zzcTavWg6oY05ArCbb/PZDk3OUi63CD1RYtN65w==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-wasm-bytecode": "1.7.11", - "@webassemblyjs/ieee754": "1.7.11", - "@webassemblyjs/leb128": "1.7.11", - "@webassemblyjs/utf8": "1.7.11" + "@webassemblyjs/ast": "1.8.3", + "@webassemblyjs/helper-api-error": "1.8.3", + "@webassemblyjs/helper-wasm-bytecode": "1.8.3", + "@webassemblyjs/ieee754": "1.8.3", + "@webassemblyjs/leb128": "1.8.3", + "@webassemblyjs/utf8": "1.8.3" } }, "@webassemblyjs/wast-parser": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz", - "integrity": "sha512-lEyVCg2np15tS+dm7+JJTNhNWq9yTZvi3qEhAIIOaofcYlUp0UR5/tVqOwa/gXYr3gjwSZqw+/lS9dscyLelbQ==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.3.tgz", + "integrity": "sha512-gZPst4CNcmGtKC1eYQmgCx6gwQvxk4h/nPjfPBbRoD+Raw3Hs+BS3yhrfgyRKtlYP+BJ8LcY9iFODEQofl2qbg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/floating-point-hex-parser": "1.7.11", - "@webassemblyjs/helper-api-error": "1.7.11", - "@webassemblyjs/helper-code-frame": "1.7.11", - "@webassemblyjs/helper-fsm": "1.7.11", - "@xtuc/long": "4.2.1" + "@webassemblyjs/ast": "1.8.3", + "@webassemblyjs/floating-point-hex-parser": "1.8.3", + "@webassemblyjs/helper-api-error": "1.8.3", + "@webassemblyjs/helper-code-frame": "1.8.3", + "@webassemblyjs/helper-fsm": "1.8.3", + "@xtuc/long": "4.2.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.7.11", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz", - "integrity": "sha512-m5vkAsuJ32QpkdkDOUPGSltrg8Cuk3KBx4YrmAGQwCZPRdUHXxG4phIOuuycLemHFr74sWL9Wthqss4fzdzSwg==", + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.3.tgz", + "integrity": "sha512-DTA6kpXuHK4PHu16yAD9QVuT1WZQRT7079oIFFmFSjqjLWGXS909I/7kiLTn931mcj7wGsaUNungjwNQ2lGQ3Q==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/wast-parser": "1.7.11", - "@xtuc/long": "4.2.1" + "@webassemblyjs/ast": "1.8.3", + "@webassemblyjs/wast-parser": "1.8.3", + "@xtuc/long": "4.2.2" } }, "@xtuc/ieee754": { @@ -249,15 +253,15 @@ "dev": true }, "@xtuc/long": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz", - "integrity": "sha512-FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "dev": true }, "acorn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.5.tgz", - "integrity": "sha512-i33Zgp3XWtmZBMNvCr4azvOFeWVw1Rk6p3hfi3LUDvIFraOMywb1kAtrbi+med14m4Xfpqm3zRZMT+c0FNE7kg==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.1.1.tgz", + "integrity": "sha512-jPTiwtOxaHNaAPg/dmrJ/beuzLRnXtB0kQPQ8JpotKJgTB6rX6c8mlf315941pyjBSaPg8NHXS9fhP4u17DpGA==", "dev": true }, "acorn-dynamic-import": { @@ -267,9 +271,9 @@ "dev": true }, "ajv": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.7.0.tgz", - "integrity": "sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==", + "version": "6.9.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.9.2.tgz", + "integrity": "sha512-4UFy0/LgDo7Oa/+wOAlj44tp9K78u38E5/359eSrqEp1Z5PdVfimCcs7SluXMP755RUQu6d2b4AvF0R1C9RZjg==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", @@ -285,9 +289,9 @@ "dev": true }, "ajv-keywords": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz", - "integrity": "sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.0.tgz", + "integrity": "sha512-aUjdRFISbuFOl0EIZc+9e4FfZp0bDZgAdOOf30bJmw8VM9v84SHyVyxDfbWxpGYbdZD/9XoKxfHVNmxPkhwyGw==", "dev": true }, "ansi-cyan": { @@ -637,9 +641,9 @@ "dev": true }, "binary-extensions": { - "version": "1.12.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz", - "integrity": "sha512-DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.0.tgz", + "integrity": "sha512-EgmjVLMn22z7eGGv3kcnHwSnJXmFHjISTY9E/S5lIcTD3Oxw05QTcBLNkJFzcb3cNueUdF/IN4U+d78V0zO8Hw==", "dev": true }, "block-stream": { @@ -900,9 +904,9 @@ "dev": true }, "chalk": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", - "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", @@ -936,24 +940,23 @@ "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" }, "chokidar": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz", - "integrity": "sha512-z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.2.tgz", + "integrity": "sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==", "dev": true, "requires": { "anymatch": "^2.0.0", - "async-each": "^1.0.0", - "braces": "^2.3.0", - "fsevents": "^1.2.2", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", "glob-parent": "^3.1.0", - "inherits": "^2.0.1", + "inherits": "^2.0.3", "is-binary-path": "^1.0.0", "is-glob": "^4.0.0", - "lodash.debounce": "^4.0.8", - "normalize-path": "^2.1.1", + "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", - "readdirp": "^2.0.0", - "upath": "^1.0.5" + "readdirp": "^2.2.1", + "upath": "^1.1.0" }, "dependencies": { "is-glob": { @@ -964,6 +967,12 @@ "requires": { "is-extglob": "^2.1.1" } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true } } }, @@ -1259,14 +1268,6 @@ "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - } } }, "crypt": { @@ -1464,9 +1465,9 @@ "dev": true }, "duplexify": { - "version": "3.6.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz", - "integrity": "sha512-vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==", + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", "dev": true, "requires": { "end-of-stream": "^1.0.0", @@ -1870,13 +1871,13 @@ } }, "flush-write-stream": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", - "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", "dev": true, "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.4" + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" } }, "for-in": { @@ -2608,12 +2609,6 @@ "resolve-dir": "^1.0.0" } }, - "global-modules-path": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.1.tgz", - "integrity": "sha512-y+shkf4InI7mPRHSo2b/k6ix6+NLDtyccYv86whhxrSGX9wjPX1VMITmrDbE1eh7zkzhiWtW2sHklJYoQ62Cxg==", - "dev": true - }, "global-prefix": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", @@ -2966,9 +2961,9 @@ } }, "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { "parse-passwd": "^1.0.0" @@ -3287,9 +3282,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", - "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", + "version": "3.12.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.2.tgz", + "integrity": "sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -3391,12 +3386,6 @@ "flush-write-stream": "^1.0.2" } }, - "lightercollective": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lightercollective/-/lightercollective-0.1.0.tgz", - "integrity": "sha512-J9tg5uraYoQKaWbmrzDDexbG6hHnMcWS1qLYgJSWE+mpA3U5OCSeMUhb+K55otgZJ34oFdR0ECvdIb3xuO5JOQ==", - "dev": true - }, "loader-runner": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", @@ -3429,12 +3418,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==" }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", - "dev": true - }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -3453,6 +3436,12 @@ "pify": "^3.0.0" } }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", @@ -3503,14 +3492,14 @@ } }, "mem": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz", - "integrity": "sha512-WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.1.0.tgz", + "integrity": "sha512-I5u6Q1x7wxO0kdOpYBB28xueHADYps5uty/zg936CiG8NTe5sJL8EjrCuLneuDW3PlMdZBGDIn8BirEVdovZvg==", "dev": true, "requires": { "map-age-cleaner": "^0.1.1", "mimic-fn": "^1.0.0", - "p-is-promise": "^1.1.0" + "p-is-promise": "^2.0.0" } }, "memory-fs": { @@ -3588,18 +3577,18 @@ } }, "mime-db": { - "version": "1.37.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz", - "integrity": "sha512-R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==", + "version": "1.38.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.38.0.tgz", + "integrity": "sha512-bqVioMFFzc2awcdJZIzR3HjZFX20QhilVS7hytkKrv7xFAn8bM1gzc/FOX2awLISvWe0PV8ptFKcon+wZ5qYkg==", "dev": true }, "mime-types": { - "version": "2.1.21", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz", - "integrity": "sha512-3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==", + "version": "2.1.22", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.22.tgz", + "integrity": "sha512-aGl6TZGnhm/li6F7yx82bJiBZwgiEa4Hf6CNr8YO+r5UHr53tSTYZb102zyU50DOWWKeOv0uQLRL0/9EiKWCog==", "dev": true, "requires": { - "mime-db": "~1.37.0" + "mime-db": "~1.38.0" } }, "mimic-fn": { @@ -3972,9 +3961,9 @@ } }, "object-keys": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz", - "integrity": "sha512-FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.0.tgz", + "integrity": "sha512-6OO5X1+2tYkNyNEx6TsCxEqFfRWaqx6EtMiSbGrw8Ob8v9Ne+Hl8rBAgLBZn5wjEz3s/s6U1WXFUFOcxxAwUpg==", "dev": true }, "object-visit": { @@ -4067,15 +4056,15 @@ "dev": true }, "p-is-promise": { - "version": "1.1.0", - "resolved": "http://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", - "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.0.0.tgz", + "integrity": "sha512-pzQPhYMCAgLAKPWD2jC3Se9fEfrD9npNos0y150EeqZll7akhEgGhTW/slB6lHku8AvYGiJ+YJ5hfHKePPgFWg==", "dev": true }, "p-limit": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz", - "integrity": "sha512-fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.1.0.tgz", + "integrity": "sha512-NhURkNcrVB+8hNfLuysU8enY5xn2KXphsHBaC2YmRNTZRc7RWusw6apSpdEj3jo4CMb6W9nrF6tTnsJsJeyu6g==", "dev": true, "requires": { "p-try": "^2.0.0" @@ -4114,9 +4103,9 @@ } }, "parse-asn1": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.3.tgz", - "integrity": "sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.4.tgz", + "integrity": "sha512-Qs5duJcuvNExRfFZ99HDD3z4mAi3r9Wl/FOjEOijlxwCZs7E7mW2vjTpgQ4J8LpTF8x5v+1Vn5UQFejmWT11aw==", "dev": true, "requires": { "asn1.js": "^4.0.0", @@ -4345,9 +4334,9 @@ } }, "randombytes": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz", - "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { "safe-buffer": "^5.1.0" @@ -4613,12 +4602,13 @@ "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=" }, "schema-utils": { - "version": "0.4.7", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", - "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", "ajv-keywords": "^3.1.0" } }, @@ -4904,9 +4894,9 @@ "dev": true }, "sshpk": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.0.tgz", - "integrity": "sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -5092,14 +5082,14 @@ } }, "terser": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-3.14.1.tgz", - "integrity": "sha512-NSo3E99QDbYSMeJaEk9YW2lTg3qS9V0aKGlb+PlOrei1X02r1wSBHCNX/O+yeTRFSWPKPIGj6MqvvdqV4rnVGw==", + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-3.16.1.tgz", + "integrity": "sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow==", "dev": true, "requires": { "commander": "~2.17.1", "source-map": "~0.6.1", - "source-map-support": "~0.5.6" + "source-map-support": "~0.5.9" }, "dependencies": { "commander": { @@ -5111,9 +5101,9 @@ } }, "terser-webpack-plugin": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.1.tgz", - "integrity": "sha512-GGSt+gbT0oKcMDmPx4SRSfJPE1XaN3kQRWG4ghxKQw9cn5G9x6aCKSsgYdvyM0na9NJ4Drv0RG6jbBByZ5CMjw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.2.3.tgz", + "integrity": "sha512-GOK7q85oAb/5kE12fMuLdn2btOS9OBZn4VsecpHDywoUC/jLhSAKOiYo0ezx7ss2EXPMzyEWFoE0s1WLE+4+oA==", "dev": true, "requires": { "cacache": "^11.0.2", @@ -5121,22 +5111,9 @@ "schema-utils": "^1.0.0", "serialize-javascript": "^1.4.0", "source-map": "^0.6.1", - "terser": "^3.8.1", + "terser": "^3.16.1", "webpack-sources": "^1.1.0", "worker-farm": "^1.5.2" - }, - "dependencies": { - "schema-utils": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", - "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", - "dev": true, - "requires": { - "ajv": "^6.1.0", - "ajv-errors": "^1.0.0", - "ajv-keywords": "^3.1.0" - } - } } }, "through": { @@ -5653,9 +5630,9 @@ "dev": true }, "tslint": { - "version": "5.12.1", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.1.tgz", - "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==", + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.13.0.tgz", + "integrity": "sha512-ECOOQRxXCYnUUePG5h/+Z1Zouobk3KFpIHA9aKBB/nnMxs97S1JJPDGt5J4cGm1y9U9VmVlfboOxA8n1kSNzGw==", "dev": true, "requires": { "babel-code-frame": "^6.22.0", @@ -5666,6 +5643,7 @@ "glob": "^7.1.1", "js-yaml": "^3.7.0", "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", "resolve": "^1.3.2", "semver": "^5.3.0", "tslib": "^1.8.0", @@ -6079,9 +6057,9 @@ } }, "vscode": { - "version": "1.1.27", - "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.27.tgz", - "integrity": "sha512-czmqqiuvQLqkZLt1zJgQWgFHlGBkvQzR4xsXfA/U1hZaaWlIB8+kg4gMbl7IW0TRvkGG/WEuAEKgrrVI237ymA==", + "version": "1.1.30", + "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.30.tgz", + "integrity": "sha512-YDj5w0TGOcS8XLIdekT4q6LlLV6hv1ZvuT2aGT3KJll4gMz6dUPDgo2VVAf0i0E8igbbZthwvmaUGRwW9yPIaw==", "dev": true, "requires": { "glob": "^7.1.2", @@ -6130,15 +6108,15 @@ } }, "webpack": { - "version": "4.29.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.29.0.tgz", - "integrity": "sha512-pxdGG0keDBtamE1mNvT5zyBdx+7wkh6mh7uzMOo/uRQ/fhsdj5FXkh/j5mapzs060forql1oXqXN9HJGju+y7w==", + "version": "4.29.5", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.29.5.tgz", + "integrity": "sha512-DuWlYUT982c7XVHodrLO9quFbNpVq5FNxLrMUfYUTlgKW0+yPimynYf1kttSQpEneAL1FH3P3OLNgkyImx8qIQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.7.11", - "@webassemblyjs/helper-module-context": "1.7.11", - "@webassemblyjs/wasm-edit": "1.7.11", - "@webassemblyjs/wasm-parser": "1.7.11", + "@webassemblyjs/ast": "1.8.3", + "@webassemblyjs/helper-module-context": "1.8.3", + "@webassemblyjs/wasm-edit": "1.8.3", + "@webassemblyjs/wasm-parser": "1.8.3", "acorn": "^6.0.5", "acorn-dynamic-import": "^4.0.0", "ajv": "^6.1.0", @@ -6154,7 +6132,7 @@ "mkdirp": "~0.5.0", "neo-async": "^2.5.0", "node-libs-browser": "^2.0.0", - "schema-utils": "^0.4.4", + "schema-utils": "^1.0.0", "tapable": "^1.1.0", "terser-webpack-plugin": "^1.1.0", "watchpack": "^1.5.0", @@ -6162,9 +6140,9 @@ } }, "webpack-cli": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.2.1.tgz", - "integrity": "sha512-jeJveHwz/vwpJ3B8bxEL5a/rVKIpRNJDsKggfKnxuYeohNDW4Y/wB9N/XHJA093qZyS0r6mYL+/crLsIol4WKA==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.2.3.tgz", + "integrity": "sha512-Ik3SjV6uJtWIAN5jp5ZuBMWEAaP5E4V78XJ2nI+paFPh8v4HPSwo/myN0r29Xc/6ZKnd2IdrAlpSgNOu2CDQ6Q==", "dev": true, "requires": { "chalk": "^2.4.1", @@ -6172,10 +6150,8 @@ "enhanced-resolve": "^4.1.0", "findup-sync": "^2.0.0", "global-modules": "^1.0.0", - "global-modules-path": "^2.3.0", "import-local": "^2.0.0", "interpret": "^1.1.0", - "lightercollective": "^0.1.0", "loader-utils": "^1.1.0", "supports-color": "^5.5.0", "v8-compile-cache": "^2.0.2", diff --git a/package.json b/package.json index 62ba97e1..2e2f1f28 100644 --- a/package.json +++ b/package.json @@ -238,6 +238,10 @@ { "command": "maven.project.openPom", "when": "never" + }, + { + "command": "maven.plugin.execute", + "when": "never" } ], "explorer/context": [ @@ -460,18 +464,18 @@ }, "devDependencies": { "@types/fs-extra": "^4.0.8", - "@types/lodash": "^4.14.120", + "@types/lodash": "^4.14.121", "@types/md5": "^2.1.33", "@types/minimatch": "^3.0.3", - "@types/node": "^8.10.39", + "@types/node": "^8.10.40", "@types/xml2js": "^0.4.3", "ts-loader": "^4.4.2", - "tslint": "^5.12.1", + "tslint": "^5.13.0", "tslint-microsoft-contrib": "^5.0.1", "typescript": "^2.9.2", - "vscode": "^1.1.27", - "webpack": "^4.29.0", - "webpack-cli": "^3.2.1" + "vscode": "^1.1.30", + "webpack": "^4.29.5", + "webpack-cli": "^3.2.3" }, "dependencies": { "fast-glob": "^2.2.4", diff --git a/src/Settings.ts b/src/Settings.ts index 6fc3d402..f0ca9d70 100644 --- a/src/Settings.ts +++ b/src/Settings.ts @@ -61,4 +61,29 @@ export namespace Settings { function _getMavenSection(section: string, resource?: Uri): T { return workspace.getConfiguration("maven", resource).get(section); } + + export function getEnvironment(): {} { + const customEnv: any = _getJavaHomeEnvIfAvailable(); + type EnvironmentSetting = { + environmentVariable: string; + value: string; + }; + const environmentSettings: EnvironmentSetting[] = Terminal.customEnv(); + environmentSettings.forEach((s: EnvironmentSetting) => { + customEnv[s.environmentVariable] = s.value; + }); + return customEnv; + } + + function _getJavaHomeEnvIfAvailable(): {} { + // Look for the java.home setting from the redhat.java extension. We can reuse it + // if it exists to avoid making the user configure it in two places. + const javaHome: string = External.javaHome(); + const useJavaHome: boolean = Terminal.useJavaHome(); + if (useJavaHome && javaHome) { + return { JAVA_HOME: javaHome }; + } else { + return {}; + } + } } diff --git a/src/archetype/ArchetypeModule.ts b/src/archetype/ArchetypeModule.ts index b91b75af..b5d61944 100644 --- a/src/archetype/ArchetypeModule.ts +++ b/src/archetype/ArchetypeModule.ts @@ -8,6 +8,7 @@ import { Uri, window, workspace } from "vscode"; import { instrumentOperationStep, sendInfo } from "vscode-extension-telemetry-wrapper"; import { OperationCanceledError } from "../Errors"; import { getPathToExtensionRoot } from "../utils/contextUtils"; +import { executeInTerminal } from "../utils/mavenUtils"; import { openDialogForFolder } from "../utils/uiUtils"; import { Utils } from "../utils/Utils"; import { Archetype } from "./Archetype"; @@ -40,13 +41,13 @@ export namespace ArchetypeModule { return cwd; } - async function executeInTerminal(archetypeGroupId: string, archetypeArtifactId: string, cwd: string): Promise { + async function executeInTerminalHandler(archetypeGroupId: string, archetypeArtifactId: string, cwd: string): Promise { const cmd: string = [ "archetype:generate", `-DarchetypeArtifactId="${archetypeArtifactId}"`, `-DarchetypeGroupId="${archetypeGroupId}"` ].join(" "); - await Utils.executeInTerminal(cmd, null, { cwd }); + await executeInTerminal(cmd, null, { cwd }); } export async function generateFromArchetype(entry: Uri | undefined, operationId: string | undefined): Promise { @@ -64,7 +65,7 @@ export namespace ArchetypeModule { const cwd: string = await instrumentOperationStep(operationId, "chooseTargetFolder", chooseTargetFolder)(targetFolderHint); // execute in terminal. - await instrumentOperationStep(operationId, "executeInTerminal", executeInTerminal)(groupId, artifactId, cwd); + await instrumentOperationStep(operationId, "executeInTerminal", executeInTerminalHandler)(groupId, artifactId, cwd); } export async function updateArchetypeCatalog(): Promise { diff --git a/src/completion/completionProvider.ts b/src/completion/completionProvider.ts index a913ca8a..7acbb233 100644 --- a/src/completion/completionProvider.ts +++ b/src/completion/completionProvider.ts @@ -41,8 +41,8 @@ class CompletionProvider implements vscode.CompletionItemProvider { case XmlTagName.GroupId: { const siblingNodes: ElementNode[] = _.get(currentNode, "parent.children", []); const artifactIdNode: ElementNode = siblingNodes.find(elem => elem.tag === XmlTagName.ArtifactId); - const groupIdHint: string = currentNode.text || ""; - const artifactIdHint: string = artifactIdNode && artifactIdNode.text || ""; + const groupIdHint: string = currentNode.text ? currentNode.text : ""; + const artifactIdHint: string = artifactIdNode && artifactIdNode.text ? artifactIdNode.text : ""; const centralItems: vscode.CompletionItem[] = await centralProvider.getGroupIdCandidates(groupIdHint, artifactIdHint); const localItems: vscode.CompletionItem[] = await localProvider.getGroupIdCandidates(groupIdHint, artifactIdHint); @@ -54,8 +54,8 @@ class CompletionProvider implements vscode.CompletionItemProvider { case XmlTagName.ArtifactId: { const siblingNodes: ElementNode[] = _.get(currentNode, "parent.children", []); const groupIdNode: ElementNode = siblingNodes.find(elem => elem.tag === XmlTagName.GroupId); - const groupIdHint: string = groupIdNode && groupIdNode.text || ""; - const artifactIdHint: string = currentNode.text || ""; + const groupIdHint: string = groupIdNode && groupIdNode.text ? groupIdNode.text : ""; + const artifactIdHint: string = currentNode.text ? currentNode.text : ""; const centralItems: vscode.CompletionItem[] = await centralProvider.getArtifactIdCandidates(groupIdHint, artifactIdHint); if (groupIdNode) { @@ -76,8 +76,8 @@ class CompletionProvider implements vscode.CompletionItemProvider { const siblingNodes: ElementNode[] = _.get(currentNode, "parent.children", []); const groupIdNode: ElementNode = siblingNodes.find(elem => elem.tag === XmlTagName.GroupId); const artifactIdNode: ElementNode = siblingNodes.find(elem => elem.tag === XmlTagName.ArtifactId); - const groupIdHint: string = groupIdNode && groupIdNode.text || ""; - const artifactIdHint: string = artifactIdNode && artifactIdNode.text || ""; + const groupIdHint: string = groupIdNode && groupIdNode.text ? groupIdNode.text : ""; + const artifactIdHint: string = artifactIdNode && artifactIdNode.text ? artifactIdNode.text : ""; const centralItems: vscode.CompletionItem[] = await centralProvider.getVersionCandidates(groupIdHint, artifactIdHint); const localItems: vscode.CompletionItem[] = await localProvider.getVersionCandidates(groupIdHint, artifactIdHint); diff --git a/src/explorer/mavenExplorerProvider.ts b/src/explorer/mavenExplorerProvider.ts index 37e71416..1f118893 100644 --- a/src/explorer/mavenExplorerProvider.ts +++ b/src/explorer/mavenExplorerProvider.ts @@ -65,7 +65,7 @@ class MavenExplorerProvider implements TreeDataProvider { } public refresh(item?: ITreeItem): void { - return this._onDidChangeTreeData.fire(item); + this._onDidChangeTreeData.fire(item); } } diff --git a/src/explorer/model/EffectivePom.ts b/src/explorer/model/EffectivePom.ts new file mode 100644 index 00000000..ca8d8c7a --- /dev/null +++ b/src/explorer/model/EffectivePom.ts @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import { rawEffectivePom } from "../../utils/mavenUtils"; +import { Utils } from "../../utils/Utils"; + +export class EffectivePom { + + public pomPath: string; + public raw: string; + public data: any; + private _updating: boolean; + + constructor(pomPath: string) { + this.pomPath = pomPath; + this._updating = false; + } + + /** + * Generate effective pom and parse the data + */ + public async update(silent?: boolean): Promise { + if (this._updating) { + return; + } + + this._updating = true; + try { + this.raw = silent ? await rawEffectivePom(this.pomPath) : await Utils.getEffectivePom(this.pomPath); + this.data = await Utils.parseXmlContent(this.raw); + } catch (error) { + console.error(error); + } + this._updating = false; + + } +} diff --git a/src/explorer/model/MavenProject.ts b/src/explorer/model/MavenProject.ts index 0e2060af..05d8c071 100644 --- a/src/explorer/model/MavenProject.ts +++ b/src/explorer/model/MavenProject.ts @@ -5,9 +5,11 @@ import * as _ from "lodash"; import * as path from "path"; import * as vscode from "vscode"; import { Settings } from "../../Settings"; +import { taskExecutor } from "../../taskExecutor"; import { getPathToExtensionRoot } from "../../utils/contextUtils"; import { Utils } from "../../utils/Utils"; import { mavenExplorerProvider } from "../mavenExplorerProvider"; +import { EffectivePom } from "./EffectivePom"; import { ITreeItem } from "./ITreeItem"; import { MavenPlugin } from "./MavenPlugin"; import { PluginsMenu } from "./PluginsMenu"; @@ -16,13 +18,14 @@ const CONTEXT_VALUE: string = "MavenProject"; export class MavenProject implements ITreeItem { public parent?: MavenProject; - private _rawEffectivePom: string; - private _effectivePom: any; + private _effectivePom: EffectivePom; private _pom: any; private _pomPath: string; constructor(pomPath: string) { this._pomPath = pomPath; + this._effectivePom = new EffectivePom(pomPath); + taskExecutor.execute(async () => await this._effectivePom.update(true)); } public get name(): string { @@ -37,25 +40,21 @@ export class MavenProject implements ITreeItem { return _.get(this._pom, "project.modules[0].module") || []; } - public get rawEffectivePom(): string { - return this._rawEffectivePom; - } - - public get effectivePom(): string { + public get effectivePom(): EffectivePom { return this._effectivePom; } public get plugins(): MavenPlugin[] { let plugins: any[]; - if (_.get(this._effectivePom, "projects.project")) { + if (_.has(this._effectivePom.data, "projects.project")) { // multi-module project - const project: any = (this._effectivePom.projects.project).find((elem: any) => this.name === _.get(elem, "artifactId[0]")); + const project: any = (this._effectivePom.data.projects.project).find((elem: any) => this.name === _.get(elem, "artifactId[0]")); if (project) { plugins = _.get(project, "build[0].plugins[0].plugin"); } } else { // single-project - plugins = _.get(this._effectivePom, "project.build[0].plugins[0].plugin"); + plugins = _.get(this._effectivePom.data, "project.build[0].plugins[0].plugin"); } return this._convertXmlPlugin(plugins); } @@ -92,30 +91,28 @@ export class MavenProject implements ITreeItem { public getChildren(): vscode.ProviderResult { const ret: ITreeItem[] = []; ret.push(new PluginsMenu(this)); - if (this.moduleNames.length > 0 && Settings.viewType() === "hierarchical" ) { + if (this.moduleNames.length > 0 && Settings.viewType() === "hierarchical") { ret.push(...this.modules.map(m => mavenExplorerProvider.getMavenProject(m))); } return ret; } - public async calculateEffectivePom(force?: boolean): Promise { - if (!force && this._rawEffectivePom) { - return; + public async calculateEffectivePom(force?: boolean): Promise { + if (!force && this._effectivePom.raw) { + return this._effectivePom.raw; } - this._rawEffectivePom = await Utils.getEffectivePom(this); - await this._parseEffectivePom(); - mavenExplorerProvider.refresh(this); - } - - public async refreshPom(): Promise { - await this.parsePom(); + await this._effectivePom.update(); mavenExplorerProvider.refresh(this); + return this._effectivePom.raw; } public async refresh(): Promise { - await this.refreshPom(); - this._rawEffectivePom = undefined; + await this._refreshPom(); + this._effectivePom.update() + .then(() => { + mavenExplorerProvider.refresh(this); + }).catch(console.error); // no await to unblock the thread. } public async parsePom(): Promise { @@ -126,12 +123,9 @@ export class MavenProject implements ITreeItem { } } - private async _parseEffectivePom(): Promise { - try { - this._effectivePom = await Utils.parseXmlContent(this._rawEffectivePom); - } catch (error) { - this._effectivePom = undefined; - } + private async _refreshPom(): Promise { + await this.parsePom(); + mavenExplorerProvider.refresh(this); } private _convertXmlPlugin(plugins: any[]): MavenPlugin[] { diff --git a/src/explorer/model/WorkspaceFolder.ts b/src/explorer/model/WorkspaceFolder.ts index 0e76fc83..e5442ba2 100644 --- a/src/explorer/model/WorkspaceFolder.ts +++ b/src/explorer/model/WorkspaceFolder.ts @@ -35,7 +35,7 @@ export class WorkspaceFolder implements ITreeItem { allProjects.push(currentProject); } - await Promise.all(newProjects.map(elem => elem.parsePom())); + await Promise.all(newProjects.map(async elem => elem.parsePom())); mavenExplorerProvider.updateProjects(...newProjects); newProjects.forEach(p => { p.modules.forEach(m => { diff --git a/src/extension.ts b/src/extension.ts index 7c609af1..bd36f3eb 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -21,6 +21,7 @@ import { mavenTerminal } from "./mavenTerminal"; import { Settings } from "./Settings"; import { taskExecutor } from "./taskExecutor"; import { getAiKey, getExtensionId, getExtensionVersion, loadPackageInfo } from "./utils/contextUtils"; +import { executeInTerminal } from "./utils/mavenUtils"; import { openFileIfExists, showTroubleshootingDialog } from "./utils/uiUtils"; import { Utils } from "./utils/Utils"; @@ -28,7 +29,7 @@ export async function activate(context: vscode.ExtensionContext): Promise await loadPackageInfo(context); // Usage data statistics. if (getAiKey()) { - await initialize(getExtensionId(), getExtensionVersion(), getAiKey()); + initialize(getExtensionId(), getExtensionVersion(), getAiKey()); } await instrumentOperation("activation", doActivate)(context); } @@ -45,7 +46,7 @@ function registerCommand(context: vscode.ExtensionContext, commandName: string, if (error instanceof OperationCanceledError) { // swallow } else { - showTroubleshootingDialog(`Command "${commandName}" fails. ${error.message}`); + await showTroubleshootingDialog(`Command "${commandName}" fails. ${error.message}`); } throw error; } @@ -61,13 +62,13 @@ async function doActivate(_operationId: string, context: vscode.ExtensionContext // pom.xml listener to refresh tree view const watcher: vscode.FileSystemWatcher = vscode.workspace.createFileSystemWatcher("**/pom.xml"); watcher.onDidCreate((e: Uri) => mavenExplorerProvider.addProject(e.fsPath), null, context.subscriptions); - watcher.onDidChange((e: Uri) => mavenExplorerProvider.getMavenProject(e.fsPath).refresh(), null, context.subscriptions); + watcher.onDidChange(async (e: Uri) => mavenExplorerProvider.getMavenProject(e.fsPath).refresh(), null, context.subscriptions); watcher.onDidDelete((e: Uri) => mavenExplorerProvider.removeProject(e.fsPath), null, context.subscriptions); context.subscriptions.push(watcher); context.subscriptions.push(mavenOutputChannel, mavenTerminal, taskExecutor); // register commands. ["clean", "validate", "compile", "test", "package", "verify", "install", "site", "deploy"].forEach((goal: string) => { - registerCommand(context, `maven.goal.${goal}`, async (node: MavenProject) => Utils.executeInTerminal(goal, node.pomPath)); + registerCommand(context, `maven.goal.${goal}`, async (node: MavenProject) => executeInTerminal(goal, node.pomPath)); }); registerCommand(context, "maven.explorer.refresh", async (item?: ITreeItem): Promise => { if (item && item.refresh) { @@ -116,7 +117,7 @@ async function doActivate(_operationId: string, context: vscode.ExtensionContext if (node && node.name && node.plugin && node.plugin.project && node.plugin.project.pomPath) { - Utils.executeInTerminal(node.name, node.plugin.project.pomPath); + await executeInTerminal(node.name, node.plugin.project.pomPath); } }); registerCommand(context, "maven.view.flat", () => Settings.changeToFlatView()); diff --git a/src/handlers/addDependencyHandler.ts b/src/handlers/addDependencyHandler.ts index 064be4e3..fcd9e27e 100644 --- a/src/handlers/addDependencyHandler.ts +++ b/src/handlers/addDependencyHandler.ts @@ -39,9 +39,9 @@ async function addDependency(gid: string, aid: string, version: string): Promise const proejctNode: ElementNode = projectNodes[0]; const dependenciesNode: ElementNode = proejctNode.children && proejctNode.children.find(node => node.tag === XmlTagName.Dependencies); if (dependenciesNode !== undefined) { - insertDependency(dependenciesNode, gid, aid, version); + await insertDependency(dependenciesNode, gid, aid, version); } else { - insertDependency(proejctNode, gid, aid, version); + await insertDependency(proejctNode, gid, aid, version); } } diff --git a/src/hover/hoverProvider.ts b/src/hover/hoverProvider.ts index 59bb9a0a..2a2103d0 100644 --- a/src/hover/hoverProvider.ts +++ b/src/hover/hoverProvider.ts @@ -25,7 +25,7 @@ class HoverProvider implements vscode.HoverProvider { const groupIdHint: string = groupIdNode && groupIdNode.text; const artifactIdHint: string = artifactIdNode && artifactIdNode.text; if (groupIdHint && artifactIdHint) { - const effectiveVersion: string = await getEffectiveVersion(document.uri, groupIdHint, artifactIdHint); + const effectiveVersion: string = getEffectiveVersion(document.uri, groupIdHint, artifactIdHint); if (effectiveVersion) { return new vscode.Hover([ `gourpId = ${groupIdHint}`, @@ -47,7 +47,7 @@ function getEffectiveVersion(uri: vscode.Uri, gid: string, aid: string): string return undefined; } - const deps: {}[] = _.get(mavenProject.effectivePom, "project.dependencies[0].dependency", []); + const deps: {}[] = _.get(mavenProject.effectivePom.data, "project.dependencies[0].dependency", []); const targetDep: {} = deps.find(elem => _.get(elem, "groupId[0]") === gid && _.get(elem, "artifactId[0]") === aid); return targetDep && _.get(targetDep, "version[0]"); diff --git a/src/mavenTerminal.ts b/src/mavenTerminal.ts index 31918e3c..05eb331b 100644 --- a/src/mavenTerminal.ts +++ b/src/mavenTerminal.ts @@ -5,7 +5,6 @@ import * as vscode from "vscode"; import { mavenOutputChannel } from "./mavenOutputChannel"; import { Settings } from "./Settings"; import { executeCommand } from "./utils/cpUtils"; -import { Utils } from "./utils/Utils"; interface ITerminalOptions { addNewLine?: boolean; @@ -20,7 +19,7 @@ class MavenTerminal implements vscode.Disposable { const defaultOptions: ITerminalOptions = { addNewLine: true, name: "Maven" }; const { addNewLine, name, cwd } = Object.assign(defaultOptions, options); if (this.terminals[name] === undefined) { - const env: {[envKey: string]: string} = Utils.getEnvironment(); + const env: {[envKey: string]: string} = Settings.getEnvironment(); this.terminals[name] = vscode.window.createTerminal({ name, env }); } this.terminals[name].show(); diff --git a/src/taskExecutor.ts b/src/taskExecutor.ts index 3b6ebd31..a8f25822 100644 --- a/src/taskExecutor.ts +++ b/src/taskExecutor.ts @@ -19,7 +19,7 @@ class TaskExecutor implements Disposable { public execute(task: any): void { this._tasks.push(task); - this._pickAndRun(); + this._pickAndRun().catch(console.error); } public dispose(): void { @@ -42,7 +42,7 @@ class TaskExecutor implements Disposable { // ignore. } this._isExecuting = false; - this._pickAndRun(); + this._pickAndRun().catch(console.error); } } diff --git a/src/utils/Utils.ts b/src/utils/Utils.ts index 38719afd..ae65dd89 100644 --- a/src/utils/Utils.ts +++ b/src/utils/Utils.ts @@ -1,33 +1,20 @@ // Copyright (c) Microsoft Corporation. All rights reserved. // Licensed under the MIT license. -import * as child_process from "child_process"; import * as fse from "fs-extra"; import * as http from "http"; import * as https from "https"; import * as md5 from "md5"; -import * as path from "path"; import * as url from "url"; import { commands, Progress, ProgressLocation, RelativePattern, TextDocument, Uri, ViewColumn, window, workspace, WorkspaceFolder } from "vscode"; import { createUuid, setUserError } from "vscode-extension-telemetry-wrapper"; import * as xml2js from "xml2js"; import { mavenExplorerProvider } from "../explorer/mavenExplorerProvider"; import { MavenProject } from "../explorer/model/MavenProject"; -import { mavenOutputChannel } from "../mavenOutputChannel"; -import { mavenTerminal } from "../mavenTerminal"; import { Settings } from "../Settings"; -import { getExtensionName, getExtensionVersion, getPathToTempFolder } from "./contextUtils"; - -interface ICommandHistory { - pomPath: string; - timestamps: { [command: string]: number }; -} - -interface ICommandHistoryEntry { - command: string; - pomPath: string; - timestamp: number; -} +import { getExtensionVersion, getPathToWorkspaceStorage } from "./contextUtils"; +import { getLRUCommands, ICommandHistoryEntry } from "./historyUtils"; +import { executeInTerminal, pluginDescription, rawEffectivePom } from "./mavenUtils"; export namespace Utils { @@ -56,18 +43,7 @@ export namespace Utils { } function getTempOutputPath(key: string): string { - return getPathToTempFolder(getExtensionName(), md5(key), createUuid()); - } - - function getCommandHistoryCachePath(pomXmlFilePath: string): string { - return getPathToTempFolder(getExtensionName(), md5(pomXmlFilePath), "commandHistory.json"); - } - - export async function readFileIfExists(filepath: string): Promise { - if (await fse.pathExists(filepath)) { - return (await fse.readFile(filepath)).toString(); - } - return null; + return getPathToWorkspaceStorage(md5(key), createUuid()); } export async function downloadFile(targetUrl: string, readContent?: boolean, customHeaders?: {}): Promise { @@ -84,8 +60,10 @@ export namespace Utils { } else if (urlObj.protocol === "http:") { client = http; } else { - return reject(new Error("Unsupported protocol.")); + reject(new Error("Unsupported protocol.")); + return; } + // tslint:disable-next-line: no-unsafe-any client.get(options, (res: http.IncomingMessage) => { let rawData: string; let ws: fse.WriteStream; @@ -115,142 +93,6 @@ export namespace Utils { }); } - async function getMaven(workspaceFolder?: WorkspaceFolder): Promise { - if (!workspaceFolder) { - return Settings.Executable.path(null) || "mvn"; - } - const executablePathInConf: string = Settings.Executable.path(workspaceFolder.uri); - const preferMavenWrapper: boolean = Settings.Executable.preferMavenWrapper(workspaceFolder.uri); - if (!executablePathInConf) { - const mvnwPathWithoutExt: string = path.join(workspaceFolder.uri.fsPath, "mvnw"); - if (preferMavenWrapper && await fse.pathExists(mvnwPathWithoutExt)) { - return mvnwPathWithoutExt; - } else { - return "mvn"; - } - } else { - return path.resolve(workspaceFolder.uri.fsPath, executablePathInConf); - } - } - - function wrappedWithQuotes(mvn: string): string { - if (mvn === "mvn") { - return mvn; - } else { - return `"${mvn}"`; - } - } - - export async function executeInTerminal(command: string, pomfile?: string, options?: {}): Promise { - const workspaceFolder: WorkspaceFolder = pomfile && workspace.getWorkspaceFolder(Uri.file(pomfile)); - const mvnString: string = wrappedWithQuotes(await mavenTerminal.formattedPathForTerminal(await getMaven(workspaceFolder))); - const fullCommand: string = [ - mvnString, - command.trim(), - pomfile && `-f "${await mavenTerminal.formattedPathForTerminal(pomfile)}"`, - Settings.Executable.options(pomfile && Uri.file(pomfile)) - ].filter(Boolean).join(" "); - const name: string = workspaceFolder ? `Maven-${workspaceFolder.name}` : "Maven"; - await mavenTerminal.runInTerminal(fullCommand, Object.assign({ name }, options)); - if (pomfile) { - updateLRUCommands(command, pomfile); - } - } - - export async function executeInBackground(command: string, pomfile?: string, workspaceFolder?: WorkspaceFolder): Promise { - if (!workspaceFolder) { - workspaceFolder = pomfile && workspace.getWorkspaceFolder(Uri.file(pomfile)); - } - const mvnExecutable: string = await getMaven(workspaceFolder); - const mvnString: string = wrappedWithQuotes(mvnExecutable); - // Todo with following line: - // 1. pomfile and workspacefolder = undefined, error - // 2. non-readable - const commandCwd: string = path.resolve(workspaceFolder.uri.fsPath, mvnExecutable, ".."); - - const fullCommand: string = [ - mvnString, - command.trim(), - pomfile && `-f "${pomfile}"`, - Settings.Executable.options(pomfile && Uri.file(pomfile)) - ].filter(Boolean).join(" "); - - const customEnv: {} = getEnvironment(); - const execOptions: child_process.ExecOptions = { - cwd: commandCwd, - env: Object.assign({}, process.env, customEnv) - }; - return new Promise<{}>((resolve: (value: any) => void, reject: (e: Error) => void): void => { - mavenOutputChannel.appendLine(fullCommand, "Background Command"); - child_process.exec(fullCommand, execOptions, (error: Error, stdout: string, _stderr: string): void => { - if (error) { - mavenOutputChannel.appendLine(error); - reject(error); - } else { - resolve(stdout); - } - }); - }); - } - - export function getEnvironment(): {} { - const customEnv: any = getJavaHomeEnvIfAvailable(); - type EnvironmentSetting = { - environmentVariable: string; - value: string; - }; - const environmentSettings: EnvironmentSetting[] = Settings.Terminal.customEnv(); - environmentSettings.forEach((s: EnvironmentSetting) => { - customEnv[s.environmentVariable] = s.value; - }); - return customEnv; - } - - function getJavaHomeEnvIfAvailable(): {} { - // Look for the java.home setting from the redhat.java extension. We can reuse it - // if it exists to avoid making the user configure it in two places. - const javaHome: string = Settings.External.javaHome(); - const useJavaHome: boolean = Settings.Terminal.useJavaHome(); - if (useJavaHome && javaHome) { - return { JAVA_HOME: javaHome }; - } else { - return {}; - } - } - - export async function getLRUCommands(pomPath: string): Promise { - const filepath: string = getCommandHistoryCachePath(pomPath); - if (await fse.pathExists(filepath)) { - const content: string = (await fse.readFile(filepath)).toString(); - let historyObject: ICommandHistory; - try { - historyObject = JSON.parse(content); - } catch (error) { - historyObject = { pomPath, timestamps: {} }; - } - const timestamps: { [command: string]: number } = historyObject.timestamps; - const commandList: string[] = Object.keys(timestamps).sort((a, b) => timestamps[b] - timestamps[a]); - return commandList.map(command => Object.assign({ command, pomPath, timestamp: timestamps[command] })); - } - return []; - } - - async function updateLRUCommands(command: string, pomPath: string): Promise { - const historyFilePath: string = getCommandHistoryCachePath(pomPath); - await fse.ensureFile(historyFilePath); - const content: string = (await fse.readFile(historyFilePath)).toString(); - let historyObject: ICommandHistory; - try { - historyObject = JSON.parse(content); - historyObject.pomPath = pomPath; - } catch (error) { - historyObject = { pomPath, timestamps: {} }; - } finally { - historyObject.timestamps[command] = Date.now(); - } - await fse.writeFile(historyFilePath, JSON.stringify(historyObject)); - } - export async function getAllPomPaths(workspaceFolder: WorkspaceFolder): Promise { const exclusions: string[] = Settings.excludedFolders(workspaceFolder.uri); const pomFileUris: Uri[] = await workspace.findFiles(new RelativePattern(workspaceFolder, "**/pom.xml"), `{${exclusions.join(",")}}`); @@ -261,10 +103,9 @@ export namespace Utils { let pomxml: string; const project: MavenProject = mavenExplorerProvider.getMavenProject(pomPath); if (project) { - await project.calculateEffectivePom(); - pomxml = project.rawEffectivePom; + pomxml = await project.calculateEffectivePom(); } else { - pomxml = await Utils.getEffectivePom(pomPath); + pomxml = await getEffectivePom(pomPath); } if (pomxml) { @@ -286,37 +127,32 @@ export namespace Utils { } else { return undefined; } - return await window.withProgress({ location: ProgressLocation.Window }, (p: Progress<{ message?: string }>) => new Promise( + return await window.withProgress({ location: ProgressLocation.Window }, async (p: Progress<{ message?: string }>) => new Promise( async (resolve, reject): Promise => { p.report({ message: `Generating Effective POM: ${name}` }); try { - const outputPath: string = getTempOutputPath(pomPath); - await Utils.executeInBackground(`help:effective-pom -Doutput="${outputPath}"`, pomPath); - const pomxml: string = await Utils.readFileIfExists(outputPath); - await fse.remove(outputPath); - return resolve(pomxml); + resolve(rawEffectivePom(pomPath)); + return; } catch (error) { - setUserError(error); - return reject(error); + setUserError(error); + reject(error); + return; } } )); } export async function getPluginDescription(pluginId: string, pomPath: string): Promise { - return await window.withProgress({ location: ProgressLocation.Window }, (p: Progress<{ message?: string }>) => new Promise( + return await window.withProgress({ location: ProgressLocation.Window }, async (p: Progress<{ message?: string }>) => new Promise( async (resolve, reject): Promise => { p.report({ message: `Retrieving Plugin Info: ${pluginId}` }); - const outputPath: string = getTempOutputPath(pluginId); try { - // For MacOSX, add "-Dapple.awt.UIElement=true" to prevent showing icons in dock - await Utils.executeInBackground(`help:describe -Dapple.awt.UIElement=true -Dplugin=${pluginId} -Doutput="${outputPath}"`, pomPath); - const content: string = await Utils.readFileIfExists(outputPath); - await fse.remove(outputPath); - return resolve(content); + resolve(pluginDescription(pluginId, pomPath)); + return; } catch (error) { - setUserError(error); - return reject(error); + setUserError(error); + reject(error); + return; } } )); @@ -329,14 +165,14 @@ export namespace Utils { const inputGoals: string = await window.showInputBox({ placeHolder: "e.g. clean package -DskipTests", ignoreFocusOut: true }); const trimmedGoals: string = inputGoals && inputGoals.trim(); if (trimmedGoals) { - Utils.executeInTerminal(trimmedGoals, pomPath); + await executeInTerminal(trimmedGoals, pomPath); } } export async function executeHistoricalGoals(projectPomPaths: string[]): Promise { - const candidates: ICommandHistoryEntry[] = Array.prototype.concat.apply( + const candidates: ICommandHistoryEntry[] = Array.prototype.concat.apply( [], - await Promise.all(projectPomPaths.map(projectPomPath => Utils.getLRUCommands(projectPomPath))) + await Promise.all(projectPomPaths.map(getLRUCommands)) ); candidates.sort((a, b) => b.timestamp - a.timestamp); const selected: { command: string; pomPath: string; timestamp: number } = await window.showQuickPick( @@ -349,7 +185,7 @@ export namespace Utils { { placeHolder: "Select from history ...", ignoreFocusOut: true } ).then(item => item && item.value); if (selected) { - Utils.executeInTerminal(selected.command, selected.pomPath); + await executeInTerminal(selected.command, selected.pomPath); } } diff --git a/src/utils/contextUtils.ts b/src/utils/contextUtils.ts index 9e4b1e3b..45ae595f 100644 --- a/src/utils/contextUtils.ts +++ b/src/utils/contextUtils.ts @@ -4,14 +4,17 @@ import * as fse from "fs-extra"; import * as os from "os"; import * as path from "path"; -import { ExtensionContext, extensions } from "vscode"; +import { ExtensionContext, extensions } from "vscode"; +let EXTENSION_CONTEXT: ExtensionContext; let EXTENSION_PUBLISHER: string; let EXTENSION_NAME: string; let EXTENSION_VERSION: string; let EXTENSION_AI_KEY: string; export async function loadPackageInfo(context: ExtensionContext): Promise { + EXTENSION_CONTEXT = context; + const { publisher, name, version, aiKey } = await fse.readJSON(context.asAbsolutePath("./package.json")); EXTENSION_AI_KEY = aiKey; EXTENSION_PUBLISHER = publisher; @@ -46,3 +49,8 @@ export function getPathToTempFolder(...args: string[]): string { export function getPathToExtensionRoot(...args: string[]): string { return path.join(extensions.getExtension(getExtensionId()).extensionPath, ...args); } + +export function getPathToWorkspaceStorage(...args: string[]): string { + fse.ensureDirSync(EXTENSION_CONTEXT.storagePath); + return path.join(EXTENSION_CONTEXT.storagePath, ...args); +} diff --git a/src/utils/cpUtils.ts b/src/utils/cpUtils.ts index 5851df2a..65ddd98c 100644 --- a/src/utils/cpUtils.ts +++ b/src/utils/cpUtils.ts @@ -3,9 +3,11 @@ import * as cp from "child_process"; import * as vscode from "vscode"; +import { mavenOutputChannel } from "../mavenOutputChannel"; export async function executeCommand(command: string, args: string[], options: cp.SpawnOptions = { shell: true }): Promise { return new Promise((resolve: (res: string) => void, reject: (e: Error) => void): void => { + mavenOutputChannel.appendLine(`${command}, [${args.join(",")}]`); let result: string = ""; const childProc: cp.ChildProcess = cp.spawn(command, args, options); childProc.stdout.on("data", (data: string | Buffer) => { @@ -26,6 +28,7 @@ export async function executeCommand(command: string, args: string[], options: c export async function executeCommandWithProgress(message: string, command: string, args: string[], options: cp.SpawnOptions = { shell: true }): Promise { let result: string = ""; await vscode.window.withProgress({ location: vscode.ProgressLocation.Window }, async (p: vscode.Progress<{}>) => { + mavenOutputChannel.appendLine(`${command}, [${args.join(",")}]`); return new Promise(async (resolve: () => void, reject: (e: Error) => void): Promise => { p.report({ message }); try { diff --git a/src/utils/historyUtils.ts b/src/utils/historyUtils.ts new file mode 100644 index 00000000..e1de1c09 --- /dev/null +++ b/src/utils/historyUtils.ts @@ -0,0 +1,54 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as fse from "fs-extra"; +import * as md5 from "md5"; +import { getExtensionName, getPathToTempFolder } from "./contextUtils"; + +export interface ICommandHistory { + pomPath: string; + timestamps: { [command: string]: number }; +} + +export interface ICommandHistoryEntry { + command: string; + pomPath: string; + timestamp: number; +} + +export async function updateLRUCommands(command: string, pomPath: string): Promise { + const historyFilePath: string = getCommandHistoryCachePath(pomPath); + await fse.ensureFile(historyFilePath); + const content: string = (await fse.readFile(historyFilePath)).toString(); + let historyObject: ICommandHistory; + try { + historyObject = JSON.parse(content); + historyObject.pomPath = pomPath; + } catch (error) { + historyObject = { pomPath, timestamps: {} }; + } finally { + historyObject.timestamps[command] = Date.now(); + } + await fse.writeFile(historyFilePath, JSON.stringify(historyObject)); +} + +export async function getLRUCommands(pomPath: string): Promise { + const filepath: string = getCommandHistoryCachePath(pomPath); + if (await fse.pathExists(filepath)) { + const content: string = (await fse.readFile(filepath)).toString(); + let historyObject: ICommandHistory; + try { + historyObject = JSON.parse(content); + } catch (error) { + historyObject = { pomPath, timestamps: {} }; + } + const timestamps: { [command: string]: number } = historyObject.timestamps; + const commandList: string[] = Object.keys(timestamps).sort((a, b) => timestamps[b] - timestamps[a]); + return commandList.map(command => Object.assign({ command, pomPath, timestamp: timestamps[command] })); + } + return []; +} + +function getCommandHistoryCachePath(pomXmlFilePath: string): string { + return getPathToTempFolder(getExtensionName(), md5(pomXmlFilePath), "commandHistory.json"); +} diff --git a/src/utils/lexerUtils.ts b/src/utils/lexerUtils.ts index 0c192261..50b7ef50 100644 --- a/src/utils/lexerUtils.ts +++ b/src/utils/lexerUtils.ts @@ -12,6 +12,49 @@ export enum XmlTagName { Project = "project" } +// Definition from xml-zero-lexer +enum NodeTypes { + XML_DECLARATION = 0, // unofficial + // Most XML parsers ignore this but because I'm parsing it I may as well include it. + // At least it lets you know if there were multiple declarations. + // + // Also inserting it here makes Object.keys(NodeTypes) array indexes line up with values! + // E.g. Object.keys(NodeTypes)[0] === NodeTypes.XML_DECLARATION + // (Strictly speaking map keys are unordered but in practice they are, and we don't rely on it) + ELEMENT_NODE = 1, + ATTRIBUTE_NODE = 2, + TEXT_NODE = 3, // Note that these can include entities which should be resolved before display + CDATA_SECTION_NODE = 4, + ENTITY_REFERENCE_NODE = 5, // Not used + // + // After a lot of thought I've decided that entities shouldn't be resolved in the Lexer, + // + // Instead entities are just ignored and are stored as-is as part of the node because = + // (1) We only support entities that resolve to characters, we don't support crufty + // complicated entities that insert elements, so there's no actual structural need to + // do it. + // (2) It simplifies the code and data structures, and it shrinks data structure memory usage. + // E.g. Text doesn't need to switch between TEXT_NODE and ENTITY_REFERENCE_NODE. + // (3) They can be resolved later using a utility function. E.g. have a .textContent() on + // nodes that resolves it. This approach would probably result in less memory use. + // (4) It's slightly against style of zero-copy because we'd need to make new strings + // to resolve the entities. Not a difficult job but again it's unnecessary memory use. + // + // So I've decided that's not the job of this lexer. + // + ENTITY_NODE = 6, // Only supported as outside of + // E.g. ]> will just be a string inside DOCTYPE and not an ENTITY_NODE. + PROCESSING_INSTRUCTION_NODE = 7, + COMMENT_NODE = 8, + DOCUMENT_NODE = 9, // Not used. Root elements are just elements. + DOCUMENT_TYPE_NODE = 10, + DOCUMENT_FRAGMENT_NODE = 11, // Don't support this either + NOTATION_NODE = 12, + CLOSE_ELEMENT = 13, // unofficial + JSX_ATTRIBUTE = 14, // unofficial + JSX = 15 // unofficial +} + export class ElementNode { public parent: ElementNode; public tag: string; @@ -127,7 +170,7 @@ function getElementHierarchy(text: string, tokens: number[][], tagOrOffset: numb if (targetTag !== undefined && currentNode && targetTag === currentNode.tag && tagNodes.indexOf(currentNode) < 0) { tagNodes.push(currentNode); } - if (cursorOffset !== undefined && !cursorNode && currentNode && currentNode.contentStart <= cursorOffset && currentNode.contentEnd && cursorOffset <= currentNode.contentEnd) { + if (cursorOffset !== undefined && !cursorNode && currentNode && currentNode.contentStart <= cursorOffset && currentNode.contentEnd !== undefined && cursorOffset <= currentNode.contentEnd) { cursorNode = currentNode; } i += 1; @@ -139,46 +182,3 @@ function getElementHierarchy(text: string, tokens: number[][], tagOrOffset: numb } return undefined; } - -// Definition from xml-zero-lexer -enum NodeTypes { - XML_DECLARATION = 0, // unofficial - // Most XML parsers ignore this but because I'm parsing it I may as well include it. - // At least it lets you know if there were multiple declarations. - // - // Also inserting it here makes Object.keys(NodeTypes) array indexes line up with values! - // E.g. Object.keys(NodeTypes)[0] === NodeTypes.XML_DECLARATION - // (Strictly speaking map keys are unordered but in practice they are, and we don't rely on it) - ELEMENT_NODE = 1, - ATTRIBUTE_NODE = 2, - TEXT_NODE = 3, // Note that these can include entities which should be resolved before display - CDATA_SECTION_NODE = 4, - ENTITY_REFERENCE_NODE = 5, // Not used - // - // After a lot of thought I've decided that entities shouldn't be resolved in the Lexer, - // - // Instead entities are just ignored and are stored as-is as part of the node because = - // (1) We only support entities that resolve to characters, we don't support crufty - // complicated entities that insert elements, so there's no actual structural need to - // do it. - // (2) It simplifies the code and data structures, and it shrinks data structure memory usage. - // E.g. Text doesn't need to switch between TEXT_NODE and ENTITY_REFERENCE_NODE. - // (3) They can be resolved later using a utility function. E.g. have a .textContent() on - // nodes that resolves it. This approach would probably result in less memory use. - // (4) It's slightly against style of zero-copy because we'd need to make new strings - // to resolve the entities. Not a difficult job but again it's unnecessary memory use. - // - // So I've decided that's not the job of this lexer. - // - ENTITY_NODE = 6, // Only supported as outside of - // E.g. ]> will just be a string inside DOCTYPE and not an ENTITY_NODE. - PROCESSING_INSTRUCTION_NODE = 7, - COMMENT_NODE = 8, - DOCUMENT_NODE = 9, // Not used. Root elements are just elements. - DOCUMENT_TYPE_NODE = 10, - DOCUMENT_FRAGMENT_NODE = 11, // Don't support this either - NOTATION_NODE = 12, - CLOSE_ELEMENT = 13, // unofficial - JSX_ATTRIBUTE = 14, // unofficial - JSX = 15 // unofficial -} diff --git a/src/utils/mavenUtils.ts b/src/utils/mavenUtils.ts new file mode 100644 index 00000000..470aa502 --- /dev/null +++ b/src/utils/mavenUtils.ts @@ -0,0 +1,115 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. + +import * as child_process from "child_process"; +import * as fse from "fs-extra"; +import * as md5 from "md5"; +import * as path from "path"; +import * as vscode from "vscode"; +import { mavenOutputChannel } from "../mavenOutputChannel"; +import { mavenTerminal } from "../mavenTerminal"; +import { Settings } from "../Settings"; +import { getPathToWorkspaceStorage } from "./contextUtils"; +import { updateLRUCommands } from "./historyUtils"; + +export async function rawEffectivePom(pomPath: string): Promise { + const outputPath: string = getPathToWorkspaceStorage(md5(pomPath)); + await executeInBackground(`help:effective-pom -Doutput="${outputPath}"`, pomPath); + const pomxml: string = await readFileIfExists(outputPath); + await fse.remove(outputPath); + return pomxml; +} + +export async function pluginDescription(pluginId: string, pomPath: string): Promise { + const outputPath: string = getPathToWorkspaceStorage(md5(pluginId)); + // For MacOSX, add "-Dapple.awt.UIElement=true" to prevent showing icons in dock + await executeInBackground(`help:describe -Dapple.awt.UIElement=true -Dplugin=${pluginId} -Doutput="${outputPath}"`, pomPath); + const content: string = await readFileIfExists(outputPath); + await fse.remove(outputPath); + return content; +} + +export async function executeInBackground(command: string, pomfile?: string, workspaceFolder?: vscode.WorkspaceFolder): Promise { + if (!workspaceFolder) { + workspaceFolder = pomfile && vscode.workspace.getWorkspaceFolder(vscode.Uri.file(pomfile)); + } + const mvnExecutable: string = await getMaven(workspaceFolder); + const mvnString: string = wrappedWithQuotes(mvnExecutable); + // Todo with following line: + // 1. pomfile and workspacefolder = undefined, error + // 2. non-readable + const commandCwd: string = path.resolve(workspaceFolder.uri.fsPath, mvnExecutable, ".."); + + const fullCommand: string = [ + mvnString, + command.trim(), + pomfile && `-f "${pomfile}"`, + Settings.Executable.options(pomfile && vscode.Uri.file(pomfile)) + ].filter(Boolean).join(" "); + + const customEnv: {} = Settings.getEnvironment(); + const execOptions: child_process.ExecOptions = { + cwd: commandCwd, + env: Object.assign({}, process.env, customEnv) + }; + return new Promise<{}>((resolve: (value: any) => void, reject: (e: Error) => void): void => { + mavenOutputChannel.appendLine(fullCommand); + child_process.exec(fullCommand, execOptions, (error: Error, stdout: string, _stderr: string): void => { + if (error) { + mavenOutputChannel.appendLine(error); + reject(error); + } else { + resolve(stdout); + } + }); + }); +} + +export async function executeInTerminal(command: string, pomfile?: string, options?: {}): Promise { + const workspaceFolder: vscode.WorkspaceFolder = pomfile && vscode.workspace.getWorkspaceFolder(vscode.Uri.file(pomfile)); + const mvnString: string = wrappedWithQuotes(await mavenTerminal.formattedPathForTerminal(await getMaven(workspaceFolder))); + const fullCommand: string = [ + mvnString, + command.trim(), + pomfile && `-f "${await mavenTerminal.formattedPathForTerminal(pomfile)}"`, + Settings.Executable.options(pomfile && vscode.Uri.file(pomfile)) + ].filter(Boolean).join(" "); + const name: string = workspaceFolder ? `Maven-${workspaceFolder.name}` : "Maven"; + await mavenTerminal.runInTerminal(fullCommand, Object.assign({ name }, options)); + if (pomfile) { + await updateLRUCommands(command, pomfile); + } +} + +async function getMaven(workspaceFolder?: vscode.WorkspaceFolder): Promise { + if (!workspaceFolder) { + return Settings.Executable.path(null) || "mvn"; + } + const executablePathInConf: string = Settings.Executable.path(workspaceFolder.uri); + const preferMavenWrapper: boolean = Settings.Executable.preferMavenWrapper(workspaceFolder.uri); + if (!executablePathInConf) { + const mvnwPathWithoutExt: string = path.join(workspaceFolder.uri.fsPath, "mvnw"); + if (preferMavenWrapper && await fse.pathExists(mvnwPathWithoutExt)) { + return mvnwPathWithoutExt; + } else { + return "mvn"; + } + } else { + return path.resolve(workspaceFolder.uri.fsPath, executablePathInConf); + } +} + +function wrappedWithQuotes(mvn: string): string { + if (mvn === "mvn") { + return mvn; + } else { + return `"${mvn}"`; + } +} + +async function readFileIfExists(filepath: string): Promise { + if (await fse.pathExists(filepath)) { + return (await fse.readFile(filepath)).toString(); + } + return null; +} diff --git a/src/utils/requestUtils.ts b/src/utils/requestUtils.ts index 4786b5f7..023b444c 100644 --- a/src/utils/requestUtils.ts +++ b/src/utils/requestUtils.ts @@ -76,7 +76,7 @@ export async function getLatestVersion(gid: string, aid: string): Promise { +async function httpsGet(urlString: string): Promise { return new Promise((resolve, reject) => { let result: string = ""; https.get(url.parse(urlString), (res: http.IncomingMessage) => { diff --git a/src/utils/uiUtils.ts b/src/utils/uiUtils.ts index aca86c35..8413fc40 100644 --- a/src/utils/uiUtils.ts +++ b/src/utils/uiUtils.ts @@ -15,7 +15,7 @@ export async function openDialogForFolder(customOptions: OpenDialogOptions): Pro canSelectMany: false }; const result: Uri[] = await window.showOpenDialog(Object.assign(options, customOptions)); - if (result && result.length) { + if (result && result.length > 0) { return Promise.resolve(result[0]); } else { return Promise.resolve(null); @@ -29,7 +29,7 @@ export async function openDialogForFile(customOptions?: OpenDialogOptions): Prom canSelectMany: false }; const result: Uri[] = await window.showOpenDialog(Object.assign(options, customOptions)); - if (result && result.length) { + if (result && result.length > 0) { return Promise.resolve(result[0]); } else { return Promise.resolve(null); diff --git a/src/xml-zero-lexer.d.ts b/src/xml-zero-lexer.d.ts index e608dd28..0f379af5 100644 --- a/src/xml-zero-lexer.d.ts +++ b/src/xml-zero-lexer.d.ts @@ -1 +1 @@ -declare module 'xml-zero-lexer' +declare module "xml-zero-lexer" diff --git a/tslint.json b/tslint.json index d7baca64..317888de 100644 --- a/tslint.json +++ b/tslint.json @@ -77,7 +77,7 @@ "no-unnecessary-callback-wrapper": true, "no-unnecessary-initializer": true, "no-unnecessary-override": true, - "no-unsafe-any": true, + "no-unsafe-any": false, "no-unsafe-finally": true, "no-unused-expression": true, "no-use-before-declare": true,