aboutsummaryrefslogtreecommitdiff
path: root/editors/code
diff options
context:
space:
mode:
authorZac Pullar-Strecker <[email protected]>2020-07-31 03:12:44 +0100
committerZac Pullar-Strecker <[email protected]>2020-07-31 03:12:44 +0100
commitf05d7b41a719d848844b054a16477b29d0f063c6 (patch)
tree0a8a0946e8aef2ce64d4c13d0035ba41cce2daf3 /editors/code
parent73ff610e41959e3e7c78a2b4b25b086883132956 (diff)
parent6b7cb8b5ab539fc4333ce34bc29bf77c976f232a (diff)
Merge remote-tracking branch 'upstream/master' into 503-hover-doc-links
Hasn't fixed tests yet.
Diffstat (limited to 'editors/code')
-rw-r--r--editors/code/package-lock.json972
-rw-r--r--editors/code/package.json111
-rw-r--r--editors/code/rollup.config.js3
-rw-r--r--editors/code/rust.tmGrammar.json4
-rw-r--r--editors/code/src/client.ts8
-rw-r--r--editors/code/src/commands.ts51
-rw-r--r--editors/code/src/config.ts14
-rw-r--r--editors/code/src/ctx.ts43
-rw-r--r--editors/code/src/debug.ts16
-rw-r--r--editors/code/src/lsp_ext.ts10
-rw-r--r--editors/code/src/main.ts54
-rw-r--r--editors/code/src/net.ts21
-rw-r--r--editors/code/src/persistent_state.ts2
-rw-r--r--editors/code/src/run.ts31
-rw-r--r--editors/code/src/snippets.ts4
-rw-r--r--editors/code/src/util.ts45
-rw-r--r--editors/code/tests/unit/index.ts4
-rw-r--r--editors/code/tests/unit/runnable_env.test.ts118
-rw-r--r--editors/code/tsconfig.json2
19 files changed, 829 insertions, 684 deletions
diff --git a/editors/code/package-lock.json b/editors/code/package-lock.json
index 3b4a31682..b0f24b10a 100644
--- a/editors/code/package-lock.json
+++ b/editors/code/package-lock.json
@@ -5,35 +5,35 @@
5 "requires": true, 5 "requires": true,
6 "dependencies": { 6 "dependencies": {
7 "@babel/code-frame": { 7 "@babel/code-frame": {
8 "version": "7.8.3", 8 "version": "7.10.3",
9 "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", 9 "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.3.tgz",
10 "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", 10 "integrity": "sha512-fDx9eNW0qz0WkUeqL6tXEXzVlPh6Y5aCDEZesl0xBGA8ndRukX91Uk44ZqnkECp01NAZUdCAl+aiQNGi0k88Eg==",
11 "dev": true, 11 "dev": true,
12 "requires": { 12 "requires": {
13 "@babel/highlight": "^7.8.3" 13 "@babel/highlight": "^7.10.3"
14 } 14 }
15 }, 15 },
16 "@babel/helper-validator-identifier": { 16 "@babel/helper-validator-identifier": {
17 "version": "7.9.5", 17 "version": "7.10.3",
18 "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", 18 "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.3.tgz",
19 "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", 19 "integrity": "sha512-bU8JvtlYpJSBPuj1VUmKpFGaDZuLxASky3LhaKj3bmpSTY6VWooSM8msk+Z0CZoErFye2tlABF6yDkT3FOPAXw==",
20 "dev": true 20 "dev": true
21 }, 21 },
22 "@babel/highlight": { 22 "@babel/highlight": {
23 "version": "7.9.0", 23 "version": "7.10.3",
24 "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", 24 "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.3.tgz",
25 "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", 25 "integrity": "sha512-Ih9B/u7AtgEnySE2L2F0Xm0GaM729XqqLfHkalTsbjXGyqmf/6M0Cu0WpvqueUlW+xk88BHw9Nkpj49naU+vWw==",
26 "dev": true, 26 "dev": true,
27 "requires": { 27 "requires": {
28 "@babel/helper-validator-identifier": "^7.9.0", 28 "@babel/helper-validator-identifier": "^7.10.3",
29 "chalk": "^2.0.0", 29 "chalk": "^2.0.0",
30 "js-tokens": "^4.0.0" 30 "js-tokens": "^4.0.0"
31 } 31 }
32 }, 32 },
33 "@rollup/plugin-commonjs": { 33 "@rollup/plugin-commonjs": {
34 "version": "12.0.0", 34 "version": "13.0.0",
35 "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-12.0.0.tgz", 35 "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-13.0.0.tgz",
36 "integrity": "sha512-8+mDQt1QUmN+4Y9D3yCG8AJNewuTSLYPJVzKKUZ+lGeQrI+bV12Tc5HCyt2WdlnG6ihIL/DPbKRJlB40DX40mw==", 36 "integrity": "sha512-Anxc3qgkAi7peAyesTqGYidG5GRim9jtg8xhmykNaZkImtvjA7Wsqep08D2mYsqw1IF7rA3lYfciLgzUSgRoqw==",
37 "dev": true, 37 "dev": true,
38 "requires": { 38 "requires": {
39 "@rollup/pluginutils": "^3.0.8", 39 "@rollup/pluginutils": "^3.0.8",
@@ -46,9 +46,9 @@
46 } 46 }
47 }, 47 },
48 "@rollup/plugin-node-resolve": { 48 "@rollup/plugin-node-resolve": {
49 "version": "8.0.0", 49 "version": "8.1.0",
50 "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.0.0.tgz", 50 "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-8.1.0.tgz",
51 "integrity": "sha512-5poJCChrkVggXXND/sQ7yNqwjUNT4fP31gpRWCnSNnlXuUXTCMHT33xZrTGxgjm5Rl18MHj7iEzlCT8rYWwQSA==", 51 "integrity": "sha512-ovq7ZM3JJYUUmEjjO+H8tnUdmQmdQudJB7xruX8LFZ1W2q8jXdPUS6SsIYip8ByOApu4RR7729Am9WhCeCMiHA==",
52 "dev": true, 52 "dev": true,
53 "requires": { 53 "requires": {
54 "@rollup/pluginutils": "^3.0.8", 54 "@rollup/pluginutils": "^3.0.8",
@@ -89,19 +89,12 @@
89 "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", 89 "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
90 "dev": true 90 "dev": true
91 }, 91 },
92 "@types/events": {
93 "version": "3.0.0",
94 "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz",
95 "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==",
96 "dev": true
97 },
98 "@types/glob": { 92 "@types/glob": {
99 "version": "7.1.1", 93 "version": "7.1.2",
100 "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", 94 "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.2.tgz",
101 "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", 95 "integrity": "sha512-VgNIkxK+j7Nz5P7jvUZlRvhuPSmsEfS03b0alKcq5V/STUKAa3Plemsn5mrQUO7am6OErJ4rhGEGJbACclrtRA==",
102 "dev": true, 96 "dev": true,
103 "requires": { 97 "requires": {
104 "@types/events": "*",
105 "@types/minimatch": "*", 98 "@types/minimatch": "*",
106 "@types/node": "*" 99 "@types/node": "*"
107 } 100 }
@@ -125,9 +118,9 @@
125 "dev": true 118 "dev": true
126 }, 119 },
127 "@types/node": { 120 "@types/node": {
128 "version": "14.0.5", 121 "version": "12.7.12",
129 "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.5.tgz", 122 "resolved": "https://registry.npmjs.org/@types/node/-/node-12.7.12.tgz",
130 "integrity": "sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA==", 123 "integrity": "sha512-KPYGmfD0/b1eXurQ59fXD1GBzhSQfz6/lKBxkaHX9dKTzjXbK68Zt7yGUxUsCS1jeTy/8aL+d9JEr+S54mpkWQ==",
131 "dev": true 124 "dev": true
132 }, 125 },
133 "@types/node-fetch": { 126 "@types/node-fetch": {
@@ -156,18 +149,46 @@
156 "dev": true 149 "dev": true
157 }, 150 },
158 "@typescript-eslint/eslint-plugin": { 151 "@typescript-eslint/eslint-plugin": {
159 "version": "3.0.0", 152 "version": "3.4.0",
160 "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.0.0.tgz", 153 "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-3.4.0.tgz",
161 "integrity": "sha512-lcZ0M6jD4cqGccYOERKdMtg+VWpoq3NSnWVxpc/AwAy0zhkUYVioOUZmfNqiNH8/eBNGhCn6HXd6mKIGRgNc1Q==", 154 "integrity": "sha512-wfkpiqaEVhZIuQRmudDszc01jC/YR7gMSxa6ulhggAe/Hs0KVIuo9wzvFiDbG3JD5pRFQoqnf4m7REDsUvBnMQ==",
162 "dev": true, 155 "dev": true,
163 "requires": { 156 "requires": {
164 "@typescript-eslint/experimental-utils": "3.0.0", 157 "@typescript-eslint/experimental-utils": "3.4.0",
158 "debug": "^4.1.1",
165 "functional-red-black-tree": "^1.0.1", 159 "functional-red-black-tree": "^1.0.1",
166 "regexpp": "^3.0.0", 160 "regexpp": "^3.0.0",
167 "semver": "^7.3.2", 161 "semver": "^7.3.2",
168 "tsutils": "^3.17.1" 162 "tsutils": "^3.17.1"
169 }, 163 },
170 "dependencies": { 164 "dependencies": {
165 "@typescript-eslint/experimental-utils": {
166 "version": "3.4.0",
167 "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.4.0.tgz",
168 "integrity": "sha512-rHPOjL43lOH1Opte4+dhC0a/+ks+8gOBwxXnyrZ/K4OTAChpSjP76fbI8Cglj7V5GouwVAGaK+xVwzqTyE/TPw==",
169 "dev": true,
170 "requires": {
171 "@types/json-schema": "^7.0.3",
172 "@typescript-eslint/typescript-estree": "3.4.0",
173 "eslint-scope": "^5.0.0",
174 "eslint-utils": "^2.0.0"
175 }
176 },
177 "@typescript-eslint/typescript-estree": {
178 "version": "3.4.0",
179 "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.4.0.tgz",
180 "integrity": "sha512-zKwLiybtt4uJb4mkG5q2t6+W7BuYx2IISiDNV+IY68VfoGwErDx/RfVI7SWL4gnZ2t1A1ytQQwZ+YOJbHHJ2rw==",
181 "dev": true,
182 "requires": {
183 "debug": "^4.1.1",
184 "eslint-visitor-keys": "^1.1.0",
185 "glob": "^7.1.6",
186 "is-glob": "^4.0.1",
187 "lodash": "^4.17.15",
188 "semver": "^7.3.2",
189 "tsutils": "^3.17.1"
190 }
191 },
171 "semver": { 192 "semver": {
172 "version": "7.3.2", 193 "version": "7.3.2",
173 "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz", 194 "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
@@ -177,33 +198,33 @@
177 } 198 }
178 }, 199 },
179 "@typescript-eslint/experimental-utils": { 200 "@typescript-eslint/experimental-utils": {
180 "version": "3.0.0", 201 "version": "3.4.0",
181 "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.0.0.tgz", 202 "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-3.4.0.tgz",
182 "integrity": "sha512-BN0vmr9N79M9s2ctITtChRuP1+Dls0x/wlg0RXW1yQ7WJKPurg6X3Xirv61J2sjPif4F8SLsFMs5Nzte0WYoTQ==", 203 "integrity": "sha512-rHPOjL43lOH1Opte4+dhC0a/+ks+8gOBwxXnyrZ/K4OTAChpSjP76fbI8Cglj7V5GouwVAGaK+xVwzqTyE/TPw==",
183 "dev": true, 204 "dev": true,
184 "requires": { 205 "requires": {
185 "@types/json-schema": "^7.0.3", 206 "@types/json-schema": "^7.0.3",
186 "@typescript-eslint/typescript-estree": "3.0.0", 207 "@typescript-eslint/typescript-estree": "3.4.0",
187 "eslint-scope": "^5.0.0", 208 "eslint-scope": "^5.0.0",
188 "eslint-utils": "^2.0.0" 209 "eslint-utils": "^2.0.0"
189 } 210 }
190 }, 211 },
191 "@typescript-eslint/parser": { 212 "@typescript-eslint/parser": {
192 "version": "3.0.0", 213 "version": "3.4.0",
193 "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.0.0.tgz", 214 "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-3.4.0.tgz",
194 "integrity": "sha512-8RRCA9KLxoFNO0mQlrLZA0reGPd/MsobxZS/yPFj+0/XgMdS8+mO8mF3BDj2ZYQj03rkayhSJtF1HAohQ3iylw==", 215 "integrity": "sha512-ZUGI/de44L5x87uX5zM14UYcbn79HSXUR+kzcqU42gH0AgpdB/TjuJy3m4ezI7Q/jk3wTQd755mxSDLhQP79KA==",
195 "dev": true, 216 "dev": true,
196 "requires": { 217 "requires": {
197 "@types/eslint-visitor-keys": "^1.0.0", 218 "@types/eslint-visitor-keys": "^1.0.0",
198 "@typescript-eslint/experimental-utils": "3.0.0", 219 "@typescript-eslint/experimental-utils": "3.4.0",
199 "@typescript-eslint/typescript-estree": "3.0.0", 220 "@typescript-eslint/typescript-estree": "3.4.0",
200 "eslint-visitor-keys": "^1.1.0" 221 "eslint-visitor-keys": "^1.1.0"
201 } 222 }
202 }, 223 },
203 "@typescript-eslint/typescript-estree": { 224 "@typescript-eslint/typescript-estree": {
204 "version": "3.0.0", 225 "version": "3.4.0",
205 "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.0.0.tgz", 226 "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-3.4.0.tgz",
206 "integrity": "sha512-nevQvHyNghsfLrrByzVIH4ZG3NROgJ8LZlfh3ddwPPH4CH7W4GAiSx5qu+xHuX5pWsq6q/eqMc1io840ZhAnUg==", 227 "integrity": "sha512-zKwLiybtt4uJb4mkG5q2t6+W7BuYx2IISiDNV+IY68VfoGwErDx/RfVI7SWL4gnZ2t1A1ytQQwZ+YOJbHHJ2rw==",
207 "dev": true, 228 "dev": true,
208 "requires": { 229 "requires": {
209 "debug": "^4.1.1", 230 "debug": "^4.1.1",
@@ -224,9 +245,9 @@
224 } 245 }
225 }, 246 },
226 "acorn": { 247 "acorn": {
227 "version": "7.2.0", 248 "version": "7.3.1",
228 "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.2.0.tgz", 249 "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.3.1.tgz",
229 "integrity": "sha512-apwXVmYVpQ34m/i71vrApRrRKCWQnZZF1+npOD0WV5xZFfwWOmKGQ2RWlfdy9vWITsenisM8M0Qeq8agcFHNiQ==", 250 "integrity": "sha512-tLc0wSnatxAQHVHUapaHdz72pi9KUyHjq5KyHjGg9Y8Ifdc79pTh2XvI6I1/chZbnM7QtNKzh66ooDogPZSleA==",
230 "dev": true 251 "dev": true
231 }, 252 },
232 "acorn-jsx": { 253 "acorn-jsx": {
@@ -262,23 +283,6 @@
262 "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", 283 "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
263 "dev": true 284 "dev": true
264 }, 285 },
265 "ansi-escapes": {
266 "version": "4.3.1",
267 "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz",
268 "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==",
269 "dev": true,
270 "requires": {
271 "type-fest": "^0.11.0"
272 },
273 "dependencies": {
274 "type-fest": {
275 "version": "0.11.0",
276 "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz",
277 "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==",
278 "dev": true
279 }
280 }
281 },
282 "ansi-regex": { 286 "ansi-regex": {
283 "version": "5.0.0", 287 "version": "5.0.0",
284 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", 288 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
@@ -313,6 +317,18 @@
313 "sprintf-js": "~1.0.2" 317 "sprintf-js": "~1.0.2"
314 } 318 }
315 }, 319 },
320 "array.prototype.map": {
321 "version": "1.0.2",
322 "resolved": "https://registry.npmjs.org/array.prototype.map/-/array.prototype.map-1.0.2.tgz",
323 "integrity": "sha512-Az3OYxgsa1g7xDYp86l0nnN4bcmuEITGe1rbdEBVkrqkzMgDcbdQ2R7r41pNzti+4NMces3H8gMmuioZUilLgw==",
324 "dev": true,
325 "requires": {
326 "define-properties": "^1.1.3",
327 "es-abstract": "^1.17.0-next.1",
328 "es-array-method-boxes-properly": "^1.0.0",
329 "is-string": "^1.0.4"
330 }
331 },
316 "astral-regex": { 332 "astral-regex": {
317 "version": "1.0.0", 333 "version": "1.0.0",
318 "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", 334 "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
@@ -344,9 +360,9 @@
344 "dev": true 360 "dev": true
345 }, 361 },
346 "binary-extensions": { 362 "binary-extensions": {
347 "version": "2.0.0", 363 "version": "2.1.0",
348 "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.0.0.tgz", 364 "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
349 "integrity": "sha512-Phlt0plgpIIBOGTT/ehfFnbNlfsDEiqmzE2KRXoX1bLIlir4X/MR+zSyBEkL05ffWgnRSf/DXv+WrUAVr93/ow==", 365 "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
350 "dev": true 366 "dev": true
351 }, 367 },
352 "boolbase": { 368 "boolbase": {
@@ -415,12 +431,6 @@
415 "supports-color": "^5.3.0" 431 "supports-color": "^5.3.0"
416 } 432 }
417 }, 433 },
418 "chardet": {
419 "version": "0.7.0",
420 "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
421 "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
422 "dev": true
423 },
424 "cheerio": { 434 "cheerio": {
425 "version": "1.0.0-rc.3", 435 "version": "1.0.0-rc.3",
426 "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz", 436 "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz",
@@ -436,36 +446,21 @@
436 } 446 }
437 }, 447 },
438 "chokidar": { 448 "chokidar": {
439 "version": "3.3.0", 449 "version": "3.3.1",
440 "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.0.tgz", 450 "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.3.1.tgz",
441 "integrity": "sha512-dGmKLDdT3Gdl7fBUe8XK+gAtGmzy5Fn0XkkWQuYxGIgWVPPse2CxFA5mtrlD0TOHaHjEUqkWNyP1XdHoJES/4A==", 451 "integrity": "sha512-4QYCEWOcK3OJrxwvyyAOxFuhpvOVCYkr33LPfFNBjAD/w3sEzWsp2BUOkI4l9bHvWioAd0rc6NlHUOEaWkTeqg==",
442 "dev": true, 452 "dev": true,
443 "requires": { 453 "requires": {
444 "anymatch": "~3.1.1", 454 "anymatch": "~3.1.1",
445 "braces": "~3.0.2", 455 "braces": "~3.0.2",
446 "fsevents": "~2.1.1", 456 "fsevents": "~2.1.2",
447 "glob-parent": "~5.1.0", 457 "glob-parent": "~5.1.0",
448 "is-binary-path": "~2.1.0", 458 "is-binary-path": "~2.1.0",
449 "is-glob": "~4.0.1", 459 "is-glob": "~4.0.1",
450 "normalize-path": "~3.0.0", 460 "normalize-path": "~3.0.0",
451 "readdirp": "~3.2.0" 461 "readdirp": "~3.3.0"
452 } 462 }
453 }, 463 },
454 "cli-cursor": {
455 "version": "3.1.0",
456 "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
457 "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
458 "dev": true,
459 "requires": {
460 "restore-cursor": "^3.1.0"
461 }
462 },
463 "cli-width": {
464 "version": "2.2.1",
465 "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz",
466 "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==",
467 "dev": true
468 },
469 "cliui": { 464 "cliui": {
470 "version": "5.0.0", 465 "version": "5.0.0",
471 "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 466 "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
@@ -483,29 +478,6 @@
483 "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 478 "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
484 "dev": true 479 "dev": true
485 }, 480 },
486 "emoji-regex": {
487 "version": "7.0.3",
488 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
489 "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
490 "dev": true
491 },
492 "is-fullwidth-code-point": {
493 "version": "2.0.0",
494 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
495 "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
496 "dev": true
497 },
498 "string-width": {
499 "version": "3.1.0",
500 "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
501 "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
502 "dev": true,
503 "requires": {
504 "emoji-regex": "^7.0.1",
505 "is-fullwidth-code-point": "^2.0.0",
506 "strip-ansi": "^5.1.0"
507 }
508 },
509 "strip-ansi": { 481 "strip-ansi": {
510 "version": "5.2.0", 482 "version": "5.2.0",
511 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 483 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
@@ -566,9 +538,9 @@
566 "dev": true 538 "dev": true
567 }, 539 },
568 "cross-spawn": { 540 "cross-spawn": {
569 "version": "7.0.2", 541 "version": "7.0.3",
570 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", 542 "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
571 "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", 543 "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
572 "dev": true, 544 "dev": true,
573 "requires": { 545 "requires": {
574 "path-key": "^3.1.0", 546 "path-key": "^3.1.0",
@@ -649,9 +621,9 @@
649 "dev": true 621 "dev": true
650 }, 622 },
651 "diff": { 623 "diff": {
652 "version": "3.5.0", 624 "version": "4.0.2",
653 "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 625 "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
654 "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 626 "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
655 "dev": true 627 "dev": true
656 }, 628 },
657 "doctrine": { 629 "doctrine": {
@@ -719,11 +691,20 @@
719 } 691 }
720 }, 692 },
721 "emoji-regex": { 693 "emoji-regex": {
722 "version": "8.0.0", 694 "version": "7.0.3",
723 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 695 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
724 "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", 696 "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
725 "dev": true 697 "dev": true
726 }, 698 },
699 "enquirer": {
700 "version": "2.3.5",
701 "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.5.tgz",
702 "integrity": "sha512-BNT1C08P9XD0vNg3J475yIUG+mVdp9T6towYFHUv897X0KoHBjB1shyrNmhmtHWKP17iSWgo7Gqh7BBuzLZMSA==",
703 "dev": true,
704 "requires": {
705 "ansi-colors": "^3.2.1"
706 }
707 },
727 "entities": { 708 "entities": {
728 "version": "1.1.2", 709 "version": "1.1.2",
729 "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", 710 "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
@@ -731,22 +712,43 @@
731 "dev": true 712 "dev": true
732 }, 713 },
733 "es-abstract": { 714 "es-abstract": {
734 "version": "1.17.5", 715 "version": "1.17.6",
735 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", 716 "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.6.tgz",
736 "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", 717 "integrity": "sha512-Fr89bON3WFyUi5EvAeI48QTWX0AyekGgLA8H+c+7fbfCkJwRWRMLd8CQedNEyJuoYYhmtEqY92pgte1FAhBlhw==",
737 "dev": true, 718 "dev": true,
738 "requires": { 719 "requires": {
739 "es-to-primitive": "^1.2.1", 720 "es-to-primitive": "^1.2.1",
740 "function-bind": "^1.1.1", 721 "function-bind": "^1.1.1",
741 "has": "^1.0.3", 722 "has": "^1.0.3",
742 "has-symbols": "^1.0.1", 723 "has-symbols": "^1.0.1",
743 "is-callable": "^1.1.5", 724 "is-callable": "^1.2.0",
744 "is-regex": "^1.0.5", 725 "is-regex": "^1.1.0",
745 "object-inspect": "^1.7.0", 726 "object-inspect": "^1.7.0",
746 "object-keys": "^1.1.1", 727 "object-keys": "^1.1.1",
747 "object.assign": "^4.1.0", 728 "object.assign": "^4.1.0",
748 "string.prototype.trimleft": "^2.1.1", 729 "string.prototype.trimend": "^1.0.1",
749 "string.prototype.trimright": "^2.1.1" 730 "string.prototype.trimstart": "^1.0.1"
731 }
732 },
733 "es-array-method-boxes-properly": {
734 "version": "1.0.0",
735 "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz",
736 "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
737 "dev": true
738 },
739 "es-get-iterator": {
740 "version": "1.1.0",
741 "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.0.tgz",
742 "integrity": "sha512-UfrmHuWQlNMTs35e1ypnvikg6jCz3SK8v8ImvmDsh36fCVUR1MqoFDiyn0/k52C8NqO3YsO8Oe0azeesNuqSsQ==",
743 "dev": true,
744 "requires": {
745 "es-abstract": "^1.17.4",
746 "has-symbols": "^1.0.1",
747 "is-arguments": "^1.0.4",
748 "is-map": "^2.0.1",
749 "is-set": "^2.0.1",
750 "is-string": "^1.0.5",
751 "isarray": "^2.0.5"
750 } 752 }
751 }, 753 },
752 "es-to-primitive": { 754 "es-to-primitive": {
@@ -782,9 +784,9 @@
782 "dev": true 784 "dev": true
783 }, 785 },
784 "eslint": { 786 "eslint": {
785 "version": "7.1.0", 787 "version": "7.3.1",
786 "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.1.0.tgz", 788 "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.3.1.tgz",
787 "integrity": "sha512-DfS3b8iHMK5z/YLSme8K5cge168I8j8o1uiVmFCgnnjxZQbCGyraF8bMl7Ju4yfBmCuxD7shOF7eqGkcuIHfsA==", 789 "integrity": "sha512-cQC/xj9bhWUcyi/RuMbRtC3I0eW8MH0jhRELSvpKYkWep3C6YZ2OkvcvJVUeO6gcunABmzptbXBuDoXsjHmfTA==",
788 "dev": true, 790 "dev": true,
789 "requires": { 791 "requires": {
790 "@babel/code-frame": "^7.0.0", 792 "@babel/code-frame": "^7.0.0",
@@ -793,10 +795,11 @@
793 "cross-spawn": "^7.0.2", 795 "cross-spawn": "^7.0.2",
794 "debug": "^4.0.1", 796 "debug": "^4.0.1",
795 "doctrine": "^3.0.0", 797 "doctrine": "^3.0.0",
796 "eslint-scope": "^5.0.0", 798 "enquirer": "^2.3.5",
799 "eslint-scope": "^5.1.0",
797 "eslint-utils": "^2.0.0", 800 "eslint-utils": "^2.0.0",
798 "eslint-visitor-keys": "^1.1.0", 801 "eslint-visitor-keys": "^1.2.0",
799 "espree": "^7.0.0", 802 "espree": "^7.1.0",
800 "esquery": "^1.2.0", 803 "esquery": "^1.2.0",
801 "esutils": "^2.0.2", 804 "esutils": "^2.0.2",
802 "file-entry-cache": "^5.0.1", 805 "file-entry-cache": "^5.0.1",
@@ -806,7 +809,6 @@
806 "ignore": "^4.0.6", 809 "ignore": "^4.0.6",
807 "import-fresh": "^3.0.0", 810 "import-fresh": "^3.0.0",
808 "imurmurhash": "^0.1.4", 811 "imurmurhash": "^0.1.4",
809 "inquirer": "^7.0.0",
810 "is-glob": "^4.0.0", 812 "is-glob": "^4.0.0",
811 "js-yaml": "^3.13.1", 813 "js-yaml": "^3.13.1",
812 "json-stable-stringify-without-jsonify": "^1.0.1", 814 "json-stable-stringify-without-jsonify": "^1.0.1",
@@ -836,9 +838,9 @@
836 } 838 }
837 }, 839 },
838 "chalk": { 840 "chalk": {
839 "version": "4.0.0", 841 "version": "4.1.0",
840 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", 842 "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
841 "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", 843 "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
842 "dev": true, 844 "dev": true,
843 "requires": { 845 "requires": {
844 "ansi-styles": "^4.1.0", 846 "ansi-styles": "^4.1.0",
@@ -860,6 +862,22 @@
860 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", 862 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
861 "dev": true 863 "dev": true
862 }, 864 },
865 "eslint-scope": {
866 "version": "5.1.0",
867 "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.0.tgz",
868 "integrity": "sha512-iiGRvtxWqgtx5m8EyQUJihBloE4EnYeGE/bz1wSPwJE6tZuJUtHlhqDM4Xj2ukE8Dyy1+HCZ4hE0fzIVMzb58w==",
869 "dev": true,
870 "requires": {
871 "esrecurse": "^4.1.0",
872 "estraverse": "^4.1.1"
873 }
874 },
875 "eslint-visitor-keys": {
876 "version": "1.3.0",
877 "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
878 "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
879 "dev": true
880 },
863 "has-flag": { 881 "has-flag": {
864 "version": "4.0.0", 882 "version": "4.0.0",
865 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", 883 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
@@ -909,14 +927,22 @@
909 "dev": true 927 "dev": true
910 }, 928 },
911 "espree": { 929 "espree": {
912 "version": "7.0.0", 930 "version": "7.1.0",
913 "resolved": "https://registry.npmjs.org/espree/-/espree-7.0.0.tgz", 931 "resolved": "https://registry.npmjs.org/espree/-/espree-7.1.0.tgz",
914 "integrity": "sha512-/r2XEx5Mw4pgKdyb7GNLQNsu++asx/dltf/CI8RFi9oGHxmQFgvLbc5Op4U6i8Oaj+kdslhJtVlEZeAqH5qOTw==", 932 "integrity": "sha512-dcorZSyfmm4WTuTnE5Y7MEN1DyoPYy1ZR783QW1FJoenn7RailyWFsq/UL6ZAAA7uXurN9FIpYyUs3OfiIW+Qw==",
915 "dev": true, 933 "dev": true,
916 "requires": { 934 "requires": {
917 "acorn": "^7.1.1", 935 "acorn": "^7.2.0",
918 "acorn-jsx": "^5.2.0", 936 "acorn-jsx": "^5.2.0",
919 "eslint-visitor-keys": "^1.1.0" 937 "eslint-visitor-keys": "^1.2.0"
938 },
939 "dependencies": {
940 "eslint-visitor-keys": {
941 "version": "1.3.0",
942 "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
943 "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
944 "dev": true
945 }
920 } 946 }
921 }, 947 },
922 "esprima": { 948 "esprima": {
@@ -969,21 +995,10 @@
969 "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", 995 "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
970 "dev": true 996 "dev": true
971 }, 997 },
972 "external-editor": {
973 "version": "3.1.0",
974 "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
975 "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
976 "dev": true,
977 "requires": {
978 "chardet": "^0.7.0",
979 "iconv-lite": "^0.4.24",
980 "tmp": "^0.0.33"
981 }
982 },
983 "fast-deep-equal": { 998 "fast-deep-equal": {
984 "version": "3.1.1", 999 "version": "3.1.3",
985 "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", 1000 "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
986 "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==", 1001 "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
987 "dev": true 1002 "dev": true
988 }, 1003 },
989 "fast-json-stable-stringify": { 1004 "fast-json-stable-stringify": {
@@ -1007,15 +1022,6 @@
1007 "pend": "~1.2.0" 1022 "pend": "~1.2.0"
1008 } 1023 }
1009 }, 1024 },
1010 "figures": {
1011 "version": "3.2.0",
1012 "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
1013 "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
1014 "dev": true,
1015 "requires": {
1016 "escape-string-regexp": "^1.0.5"
1017 }
1018 },
1019 "file-entry-cache": { 1025 "file-entry-cache": {
1020 "version": "5.0.1", 1026 "version": "5.0.1",
1021 "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", 1027 "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
@@ -1035,12 +1041,13 @@
1035 } 1041 }
1036 }, 1042 },
1037 "find-up": { 1043 "find-up": {
1038 "version": "3.0.0", 1044 "version": "4.1.0",
1039 "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 1045 "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
1040 "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 1046 "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
1041 "dev": true, 1047 "dev": true,
1042 "requires": { 1048 "requires": {
1043 "locate-path": "^3.0.0" 1049 "locate-path": "^5.0.0",
1050 "path-exists": "^4.0.0"
1044 } 1051 }
1045 }, 1052 },
1046 "flat": { 1053 "flat": {
@@ -1238,15 +1245,6 @@
1238 } 1245 }
1239 } 1246 }
1240 }, 1247 },
1241 "iconv-lite": {
1242 "version": "0.4.24",
1243 "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
1244 "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
1245 "dev": true,
1246 "requires": {
1247 "safer-buffer": ">= 2.1.2 < 3"
1248 }
1249 },
1250 "ignore": { 1248 "ignore": {
1251 "version": "4.0.6", 1249 "version": "4.0.6",
1252 "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", 1250 "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
@@ -1285,78 +1283,11 @@
1285 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 1283 "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
1286 "dev": true 1284 "dev": true
1287 }, 1285 },
1288 "inquirer": { 1286 "is-arguments": {
1289 "version": "7.1.0", 1287 "version": "1.0.4",
1290 "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", 1288 "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
1291 "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", 1289 "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
1292 "dev": true, 1290 "dev": true
1293 "requires": {
1294 "ansi-escapes": "^4.2.1",
1295 "chalk": "^3.0.0",
1296 "cli-cursor": "^3.1.0",
1297 "cli-width": "^2.0.0",
1298 "external-editor": "^3.0.3",
1299 "figures": "^3.0.0",
1300 "lodash": "^4.17.15",
1301 "mute-stream": "0.0.8",
1302 "run-async": "^2.4.0",
1303 "rxjs": "^6.5.3",
1304 "string-width": "^4.1.0",
1305 "strip-ansi": "^6.0.0",
1306 "through": "^2.3.6"
1307 },
1308 "dependencies": {
1309 "ansi-styles": {
1310 "version": "4.2.1",
1311 "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz",
1312 "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==",
1313 "dev": true,
1314 "requires": {
1315 "@types/color-name": "^1.1.1",
1316 "color-convert": "^2.0.1"
1317 }
1318 },
1319 "chalk": {
1320 "version": "3.0.0",
1321 "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
1322 "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
1323 "dev": true,
1324 "requires": {
1325 "ansi-styles": "^4.1.0",
1326 "supports-color": "^7.1.0"
1327 }
1328 },
1329 "color-convert": {
1330 "version": "2.0.1",
1331 "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
1332 "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
1333 "dev": true,
1334 "requires": {
1335 "color-name": "~1.1.4"
1336 }
1337 },
1338 "color-name": {
1339 "version": "1.1.4",
1340 "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
1341 "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
1342 "dev": true
1343 },
1344 "has-flag": {
1345 "version": "4.0.0",
1346 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1347 "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1348 "dev": true
1349 },
1350 "supports-color": {
1351 "version": "7.1.0",
1352 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
1353 "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
1354 "dev": true,
1355 "requires": {
1356 "has-flag": "^4.0.0"
1357 }
1358 }
1359 }
1360 }, 1291 },
1361 "is-binary-path": { 1292 "is-binary-path": {
1362 "version": "2.1.0", 1293 "version": "2.1.0",
@@ -1374,9 +1305,9 @@
1374 "dev": true 1305 "dev": true
1375 }, 1306 },
1376 "is-callable": { 1307 "is-callable": {
1377 "version": "1.1.5", 1308 "version": "1.2.0",
1378 "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", 1309 "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.0.tgz",
1379 "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", 1310 "integrity": "sha512-pyVD9AaGLxtg6srb2Ng6ynWJqkHU9bEM087AKck0w8QwDarTfNcpIYoU8x8Hv2Icm8u6kFJM18Dag8lyqGkviw==",
1380 "dev": true 1311 "dev": true
1381 }, 1312 },
1382 "is-date-object": { 1313 "is-date-object": {
@@ -1392,9 +1323,9 @@
1392 "dev": true 1323 "dev": true
1393 }, 1324 },
1394 "is-fullwidth-code-point": { 1325 "is-fullwidth-code-point": {
1395 "version": "3.0.0", 1326 "version": "2.0.0",
1396 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1327 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
1397 "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1328 "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
1398 "dev": true 1329 "dev": true
1399 }, 1330 },
1400 "is-glob": { 1331 "is-glob": {
@@ -1406,6 +1337,12 @@
1406 "is-extglob": "^2.1.1" 1337 "is-extglob": "^2.1.1"
1407 } 1338 }
1408 }, 1339 },
1340 "is-map": {
1341 "version": "2.0.1",
1342 "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz",
1343 "integrity": "sha512-T/S49scO8plUiAOA2DBTBG3JHpn1yiw0kRp6dgiZ0v2/6twi5eiB0rHtHFH9ZIrvlWc6+4O+m4zg5+Z833aXgw==",
1344 "dev": true
1345 },
1409 "is-module": { 1346 "is-module": {
1410 "version": "1.0.0", 1347 "version": "1.0.0",
1411 "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", 1348 "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
@@ -1419,23 +1356,35 @@
1419 "dev": true 1356 "dev": true
1420 }, 1357 },
1421 "is-reference": { 1358 "is-reference": {
1422 "version": "1.1.4", 1359 "version": "1.2.1",
1423 "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.1.4.tgz", 1360 "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
1424 "integrity": "sha512-uJA/CDPO3Tao3GTrxYn6AwkM4nUPJiGGYu5+cB8qbC7WGFlrKZbiRo7SFKxUAEpFUfiHofWCXBUNhvYJMh+6zw==", 1361 "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
1425 "dev": true, 1362 "dev": true,
1426 "requires": { 1363 "requires": {
1427 "@types/estree": "0.0.39" 1364 "@types/estree": "*"
1428 } 1365 }
1429 }, 1366 },
1430 "is-regex": { 1367 "is-regex": {
1431 "version": "1.0.5", 1368 "version": "1.1.0",
1432 "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 1369 "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.0.tgz",
1433 "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 1370 "integrity": "sha512-iI97M8KTWID2la5uYXlkbSDQIg4F6o1sYboZKKTDpnDQMLtUL86zxhgDet3Q2SriaYsyGqZ6Mn2SjbRKeLHdqw==",
1434 "dev": true, 1371 "dev": true,
1435 "requires": { 1372 "requires": {
1436 "has": "^1.0.3" 1373 "has-symbols": "^1.0.1"
1437 } 1374 }
1438 }, 1375 },
1376 "is-set": {
1377 "version": "2.0.1",
1378 "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.1.tgz",
1379 "integrity": "sha512-eJEzOtVyenDs1TMzSQ3kU3K+E0GUS9sno+F0OBT97xsgcJsF9nXMBtkT9/kut5JEpM7oL7X/0qxR17K3mcwIAA==",
1380 "dev": true
1381 },
1382 "is-string": {
1383 "version": "1.0.5",
1384 "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
1385 "integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
1386 "dev": true
1387 },
1439 "is-symbol": { 1388 "is-symbol": {
1440 "version": "1.0.3", 1389 "version": "1.0.3",
1441 "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 1390 "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
@@ -1445,12 +1394,34 @@
1445 "has-symbols": "^1.0.1" 1394 "has-symbols": "^1.0.1"
1446 } 1395 }
1447 }, 1396 },
1397 "isarray": {
1398 "version": "2.0.5",
1399 "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
1400 "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
1401 "dev": true
1402 },
1448 "isexe": { 1403 "isexe": {
1449 "version": "2.0.0", 1404 "version": "2.0.0",
1450 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 1405 "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
1451 "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 1406 "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
1452 "dev": true 1407 "dev": true
1453 }, 1408 },
1409 "iterate-iterator": {
1410 "version": "1.0.1",
1411 "resolved": "https://registry.npmjs.org/iterate-iterator/-/iterate-iterator-1.0.1.tgz",
1412 "integrity": "sha512-3Q6tudGN05kbkDQDI4CqjaBf4qf85w6W6GnuZDtUVYwKgtC1q8yxYX7CZed7N+tLzQqS6roujWvszf13T+n9aw==",
1413 "dev": true
1414 },
1415 "iterate-value": {
1416 "version": "1.0.2",
1417 "resolved": "https://registry.npmjs.org/iterate-value/-/iterate-value-1.0.2.tgz",
1418 "integrity": "sha512-A6fMAio4D2ot2r/TYzr4yUWrmwNdsN5xL7+HUiyACE4DXm+q8HtPcnFTp+NnW3k4N05tZ7FVYFFb2CR13NxyHQ==",
1419 "dev": true,
1420 "requires": {
1421 "es-get-iterator": "^1.0.2",
1422 "iterate-iterator": "^1.0.1"
1423 }
1424 },
1454 "js-tokens": { 1425 "js-tokens": {
1455 "version": "4.0.0", 1426 "version": "4.0.0",
1456 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 1427 "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
@@ -1505,19 +1476,18 @@
1505 } 1476 }
1506 }, 1477 },
1507 "locate-path": { 1478 "locate-path": {
1508 "version": "3.0.0", 1479 "version": "5.0.0",
1509 "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 1480 "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
1510 "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 1481 "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
1511 "dev": true, 1482 "dev": true,
1512 "requires": { 1483 "requires": {
1513 "p-locate": "^3.0.0", 1484 "p-locate": "^4.1.0"
1514 "path-exists": "^3.0.0"
1515 } 1485 }
1516 }, 1486 },
1517 "lodash": { 1487 "lodash": {
1518 "version": "4.17.15", 1488 "version": "4.17.19",
1519 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 1489 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
1520 "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 1490 "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==",
1521 "dev": true 1491 "dev": true
1522 }, 1492 },
1523 "log-symbols": { 1493 "log-symbols": {
@@ -1596,12 +1566,6 @@
1596 "mime-db": "1.44.0" 1566 "mime-db": "1.44.0"
1597 } 1567 }
1598 }, 1568 },
1599 "mimic-fn": {
1600 "version": "2.1.0",
1601 "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
1602 "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
1603 "dev": true
1604 },
1605 "minimatch": { 1569 "minimatch": {
1606 "version": "3.0.4", 1570 "version": "3.0.4",
1607 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1571 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
@@ -1627,37 +1591,44 @@
1627 } 1591 }
1628 }, 1592 },
1629 "mocha": { 1593 "mocha": {
1630 "version": "7.2.0", 1594 "version": "8.0.1",
1631 "resolved": "https://registry.npmjs.org/mocha/-/mocha-7.2.0.tgz", 1595 "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.0.1.tgz",
1632 "integrity": "sha512-O9CIypScywTVpNaRrCAgoUnJgozpIofjKUYmJhiCIJMiuYnLI6otcb1/kpW9/n/tJODHGZ7i8aLQoDVsMtOKQQ==", 1596 "integrity": "sha512-vefaXfdYI8+Yo8nPZQQi0QO2o+5q9UIMX1jZ1XMmK3+4+CQjc7+B0hPdUeglXiTlr8IHMVRo63IhO9Mzt6fxOg==",
1633 "dev": true, 1597 "dev": true,
1634 "requires": { 1598 "requires": {
1635 "ansi-colors": "3.2.3", 1599 "ansi-colors": "4.1.1",
1636 "browser-stdout": "1.3.1", 1600 "browser-stdout": "1.3.1",
1637 "chokidar": "3.3.0", 1601 "chokidar": "3.3.1",
1638 "debug": "3.2.6", 1602 "debug": "3.2.6",
1639 "diff": "3.5.0", 1603 "diff": "4.0.2",
1640 "escape-string-regexp": "1.0.5", 1604 "escape-string-regexp": "1.0.5",
1641 "find-up": "3.0.0", 1605 "find-up": "4.1.0",
1642 "glob": "7.1.3", 1606 "glob": "7.1.6",
1643 "growl": "1.10.5", 1607 "growl": "1.10.5",
1644 "he": "1.2.0", 1608 "he": "1.2.0",
1645 "js-yaml": "3.13.1", 1609 "js-yaml": "3.13.1",
1646 "log-symbols": "3.0.0", 1610 "log-symbols": "3.0.0",
1647 "minimatch": "3.0.4", 1611 "minimatch": "3.0.4",
1648 "mkdirp": "0.5.5", 1612 "ms": "2.1.2",
1649 "ms": "2.1.1",
1650 "node-environment-flags": "1.0.6",
1651 "object.assign": "4.1.0", 1613 "object.assign": "4.1.0",
1652 "strip-json-comments": "2.0.1", 1614 "promise.allsettled": "1.0.2",
1653 "supports-color": "6.0.0", 1615 "serialize-javascript": "3.0.0",
1654 "which": "1.3.1", 1616 "strip-json-comments": "3.0.1",
1617 "supports-color": "7.1.0",
1618 "which": "2.0.2",
1655 "wide-align": "1.1.3", 1619 "wide-align": "1.1.3",
1620 "workerpool": "6.0.0",
1656 "yargs": "13.3.2", 1621 "yargs": "13.3.2",
1657 "yargs-parser": "13.1.2", 1622 "yargs-parser": "13.1.2",
1658 "yargs-unparser": "1.6.0" 1623 "yargs-unparser": "1.6.0"
1659 }, 1624 },
1660 "dependencies": { 1625 "dependencies": {
1626 "ansi-colors": {
1627 "version": "4.1.1",
1628 "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
1629 "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
1630 "dev": true
1631 },
1661 "debug": { 1632 "debug": {
1662 "version": "3.2.6", 1633 "version": "3.2.6",
1663 "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 1634 "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
@@ -1667,19 +1638,11 @@
1667 "ms": "^2.1.1" 1638 "ms": "^2.1.1"
1668 } 1639 }
1669 }, 1640 },
1670 "glob": { 1641 "has-flag": {
1671 "version": "7.1.3", 1642 "version": "4.0.0",
1672 "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 1643 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
1673 "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 1644 "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
1674 "dev": true, 1645 "dev": true
1675 "requires": {
1676 "fs.realpath": "^1.0.0",
1677 "inflight": "^1.0.4",
1678 "inherits": "2",
1679 "minimatch": "^3.0.4",
1680 "once": "^1.3.0",
1681 "path-is-absolute": "^1.0.0"
1682 }
1683 }, 1646 },
1684 "js-yaml": { 1647 "js-yaml": {
1685 "version": "3.13.1", 1648 "version": "3.13.1",
@@ -1691,34 +1654,19 @@
1691 "esprima": "^4.0.0" 1654 "esprima": "^4.0.0"
1692 } 1655 }
1693 }, 1656 },
1694 "ms": {
1695 "version": "2.1.1",
1696 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1697 "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
1698 "dev": true
1699 },
1700 "strip-json-comments": { 1657 "strip-json-comments": {
1701 "version": "2.0.1", 1658 "version": "3.0.1",
1702 "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1659 "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz",
1703 "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 1660 "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==",
1704 "dev": true 1661 "dev": true
1705 }, 1662 },
1706 "supports-color": { 1663 "supports-color": {
1707 "version": "6.0.0", 1664 "version": "7.1.0",
1708 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", 1665 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz",
1709 "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", 1666 "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==",
1710 "dev": true,
1711 "requires": {
1712 "has-flag": "^3.0.0"
1713 }
1714 },
1715 "which": {
1716 "version": "1.3.1",
1717 "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
1718 "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
1719 "dev": true, 1667 "dev": true,
1720 "requires": { 1668 "requires": {
1721 "isexe": "^2.0.0" 1669 "has-flag": "^4.0.0"
1722 } 1670 }
1723 } 1671 }
1724 } 1672 }
@@ -1741,24 +1689,6 @@
1741 "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", 1689 "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
1742 "dev": true 1690 "dev": true
1743 }, 1691 },
1744 "node-environment-flags": {
1745 "version": "1.0.6",
1746 "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.6.tgz",
1747 "integrity": "sha512-5Evy2epuL+6TM0lCQGpFIj6KwiEsGh1SrHUhTbNX+sLbBtjidPZFAnVK9y5yU1+h//RitLbRHTIMyxQPtxMdHw==",
1748 "dev": true,
1749 "requires": {
1750 "object.getownpropertydescriptors": "^2.0.3",
1751 "semver": "^5.7.0"
1752 },
1753 "dependencies": {
1754 "semver": {
1755 "version": "5.7.1",
1756 "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
1757 "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
1758 "dev": true
1759 }
1760 }
1761 },
1762 "node-fetch": { 1692 "node-fetch": {
1763 "version": "2.6.0", 1693 "version": "2.6.0",
1764 "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", 1694 "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
@@ -1780,9 +1710,9 @@
1780 } 1710 }
1781 }, 1711 },
1782 "object-inspect": { 1712 "object-inspect": {
1783 "version": "1.7.0", 1713 "version": "1.8.0",
1784 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 1714 "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
1785 "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", 1715 "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
1786 "dev": true 1716 "dev": true
1787 }, 1717 },
1788 "object-keys": { 1718 "object-keys": {
@@ -1803,16 +1733,6 @@
1803 "object-keys": "^1.0.11" 1733 "object-keys": "^1.0.11"
1804 } 1734 }
1805 }, 1735 },
1806 "object.getownpropertydescriptors": {
1807 "version": "2.1.0",
1808 "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
1809 "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
1810 "dev": true,
1811 "requires": {
1812 "define-properties": "^1.1.3",
1813 "es-abstract": "^1.17.0-next.1"
1814 }
1815 },
1816 "once": { 1736 "once": {
1817 "version": "1.4.0", 1737 "version": "1.4.0",
1818 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1738 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
@@ -1822,15 +1742,6 @@
1822 "wrappy": "1" 1742 "wrappy": "1"
1823 } 1743 }
1824 }, 1744 },
1825 "onetime": {
1826 "version": "5.1.0",
1827 "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz",
1828 "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==",
1829 "dev": true,
1830 "requires": {
1831 "mimic-fn": "^2.1.0"
1832 }
1833 },
1834 "optionator": { 1745 "optionator": {
1835 "version": "0.9.1", 1746 "version": "0.9.1",
1836 "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", 1747 "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
@@ -1883,12 +1794,12 @@
1883 } 1794 }
1884 }, 1795 },
1885 "p-locate": { 1796 "p-locate": {
1886 "version": "3.0.0", 1797 "version": "4.1.0",
1887 "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 1798 "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
1888 "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 1799 "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
1889 "dev": true, 1800 "dev": true,
1890 "requires": { 1801 "requires": {
1891 "p-limit": "^2.0.0" 1802 "p-limit": "^2.2.0"
1892 } 1803 }
1893 }, 1804 },
1894 "p-try": { 1805 "p-try": {
@@ -1933,9 +1844,9 @@
1933 } 1844 }
1934 }, 1845 },
1935 "path-exists": { 1846 "path-exists": {
1936 "version": "3.0.0", 1847 "version": "4.0.0",
1937 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1848 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
1938 "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 1849 "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
1939 "dev": true 1850 "dev": true
1940 }, 1851 },
1941 "path-is-absolute": { 1852 "path-is-absolute": {
@@ -1980,6 +1891,19 @@
1980 "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1891 "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
1981 "dev": true 1892 "dev": true
1982 }, 1893 },
1894 "promise.allsettled": {
1895 "version": "1.0.2",
1896 "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz",
1897 "integrity": "sha512-UpcYW5S1RaNKT6pd+s9jp9K9rlQge1UXKskec0j6Mmuq7UJCvlS2J2/s/yuPN8ehftf9HXMxWlKiPbGGUzpoRg==",
1898 "dev": true,
1899 "requires": {
1900 "array.prototype.map": "^1.0.1",
1901 "define-properties": "^1.1.3",
1902 "es-abstract": "^1.17.0-next.1",
1903 "function-bind": "^1.1.1",
1904 "iterate-value": "^1.0.0"
1905 }
1906 },
1983 "pseudomap": { 1907 "pseudomap": {
1984 "version": "1.0.2", 1908 "version": "1.0.2",
1985 "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1909 "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
@@ -2013,12 +1937,12 @@
2013 } 1937 }
2014 }, 1938 },
2015 "readdirp": { 1939 "readdirp": {
2016 "version": "3.2.0", 1940 "version": "3.3.0",
2017 "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.2.0.tgz", 1941 "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.3.0.tgz",
2018 "integrity": "sha512-crk4Qu3pmXwgxdSgGhgA/eXiJAPQiX4GMOZZMXnqKxHX7TaoL+3gQVo/WeuAiogr07DpnfjIMpXXa+PAIvwPGQ==", 1942 "integrity": "sha512-zz0pAkSPOXXm1viEwygWIPSPkcBYjW1xU5j/JBh5t9bGCJwa6f9+BJa6VaB2g+b55yVrmXzqkyLf4xaWYM0IkQ==",
2019 "dev": true, 1943 "dev": true,
2020 "requires": { 1944 "requires": {
2021 "picomatch": "^2.0.4" 1945 "picomatch": "^2.0.7"
2022 } 1946 }
2023 }, 1947 },
2024 "regexpp": { 1948 "regexpp": {
@@ -2054,16 +1978,6 @@
2054 "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", 1978 "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
2055 "dev": true 1979 "dev": true
2056 }, 1980 },
2057 "restore-cursor": {
2058 "version": "3.1.0",
2059 "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
2060 "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
2061 "dev": true,
2062 "requires": {
2063 "onetime": "^5.1.0",
2064 "signal-exit": "^3.0.2"
2065 }
2066 },
2067 "rimraf": { 1981 "rimraf": {
2068 "version": "2.6.3", 1982 "version": "2.6.3",
2069 "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1983 "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
@@ -2074,54 +1988,31 @@
2074 } 1988 }
2075 }, 1989 },
2076 "rollup": { 1990 "rollup": {
2077 "version": "2.10.9", 1991 "version": "2.18.1",
2078 "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.10.9.tgz", 1992 "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.18.1.tgz",
2079 "integrity": "sha512-dY/EbjiWC17ZCUSyk14hkxATAMAShkMsD43XmZGWjLrgFj15M3Dw2kEkA9ns64BiLFm9PKN6vTQw8neHwK74eg==", 1993 "integrity": "sha512-w4X77ADA+WTGlapC8Z6yggdJtODw3SBl6R2LSkA7ZW5MtdkgcB7sfaSD1UWyx8diXbMcGIb0eI9gCx/dyqOgNQ==",
2080 "dev": true, 1994 "dev": true,
2081 "requires": { 1995 "requires": {
2082 "fsevents": "~2.1.2" 1996 "fsevents": "~2.1.2"
2083 } 1997 }
2084 }, 1998 },
2085 "run-async": {
2086 "version": "2.4.1",
2087 "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
2088 "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
2089 "dev": true
2090 },
2091 "rxjs": {
2092 "version": "6.5.5",
2093 "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz",
2094 "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==",
2095 "dev": true,
2096 "requires": {
2097 "tslib": "^1.9.0"
2098 },
2099 "dependencies": {
2100 "tslib": {
2101 "version": "1.13.0",
2102 "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz",
2103 "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==",
2104 "dev": true
2105 }
2106 }
2107 },
2108 "safe-buffer": { 1999 "safe-buffer": {
2109 "version": "5.2.0", 2000 "version": "5.2.0",
2110 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", 2001 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
2111 "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==", 2002 "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==",
2112 "dev": true 2003 "dev": true
2113 }, 2004 },
2114 "safer-buffer": {
2115 "version": "2.1.2",
2116 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
2117 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
2118 "dev": true
2119 },
2120 "semver": { 2005 "semver": {
2121 "version": "6.3.0", 2006 "version": "6.3.0",
2122 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 2007 "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
2123 "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 2008 "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw=="
2124 }, 2009 },
2010 "serialize-javascript": {
2011 "version": "3.0.0",
2012 "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.0.0.tgz",
2013 "integrity": "sha512-skZcHYw2vEX4bw90nAr2iTTsz6x2SrHEnfxgKYmZlvJYBEZrvbKtobJWlQ20zczKb3bsHHXXTYt48zBA7ni9cw==",
2014 "dev": true
2015 },
2125 "set-blocking": { 2016 "set-blocking": {
2126 "version": "2.0.0", 2017 "version": "2.0.0",
2127 "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 2018 "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
@@ -2149,12 +2040,6 @@
2149 "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", 2040 "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
2150 "dev": true 2041 "dev": true
2151 }, 2042 },
2152 "signal-exit": {
2153 "version": "3.0.3",
2154 "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
2155 "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
2156 "dev": true
2157 },
2158 "slice-ansi": { 2043 "slice-ansi": {
2159 "version": "2.1.0", 2044 "version": "2.1.0",
2160 "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", 2045 "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
@@ -2164,14 +2049,6 @@
2164 "ansi-styles": "^3.2.0", 2049 "ansi-styles": "^3.2.0",
2165 "astral-regex": "^1.0.0", 2050 "astral-regex": "^1.0.0",
2166 "is-fullwidth-code-point": "^2.0.0" 2051 "is-fullwidth-code-point": "^2.0.0"
2167 },
2168 "dependencies": {
2169 "is-fullwidth-code-point": {
2170 "version": "2.0.0",
2171 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2172 "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
2173 "dev": true
2174 }
2175 } 2052 }
2176 }, 2053 },
2177 "sourcemap-codec": { 2054 "sourcemap-codec": {
@@ -2187,14 +2064,31 @@
2187 "dev": true 2064 "dev": true
2188 }, 2065 },
2189 "string-width": { 2066 "string-width": {
2190 "version": "4.2.0", 2067 "version": "3.1.0",
2191 "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", 2068 "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
2192 "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", 2069 "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
2193 "dev": true, 2070 "dev": true,
2194 "requires": { 2071 "requires": {
2195 "emoji-regex": "^8.0.0", 2072 "emoji-regex": "^7.0.1",
2196 "is-fullwidth-code-point": "^3.0.0", 2073 "is-fullwidth-code-point": "^2.0.0",
2197 "strip-ansi": "^6.0.0" 2074 "strip-ansi": "^5.1.0"
2075 },
2076 "dependencies": {
2077 "ansi-regex": {
2078 "version": "4.1.0",
2079 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
2080 "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
2081 "dev": true
2082 },
2083 "strip-ansi": {
2084 "version": "5.2.0",
2085 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
2086 "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
2087 "dev": true,
2088 "requires": {
2089 "ansi-regex": "^4.1.0"
2090 }
2091 }
2198 } 2092 }
2199 }, 2093 },
2200 "string.prototype.trimend": { 2094 "string.prototype.trimend": {
@@ -2207,28 +2101,6 @@
2207 "es-abstract": "^1.17.5" 2101 "es-abstract": "^1.17.5"
2208 } 2102 }
2209 }, 2103 },
2210 "string.prototype.trimleft": {
2211 "version": "2.1.2",
2212 "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz",
2213 "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==",
2214 "dev": true,
2215 "requires": {
2216 "define-properties": "^1.1.3",
2217 "es-abstract": "^1.17.5",
2218 "string.prototype.trimstart": "^1.0.0"
2219 }
2220 },
2221 "string.prototype.trimright": {
2222 "version": "2.1.2",
2223 "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz",
2224 "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==",
2225 "dev": true,
2226 "requires": {
2227 "define-properties": "^1.1.3",
2228 "es-abstract": "^1.17.5",
2229 "string.prototype.trimend": "^1.0.0"
2230 }
2231 },
2232 "string.prototype.trimstart": { 2104 "string.prototype.trimstart": {
2233 "version": "1.0.1", 2105 "version": "1.0.1",
2234 "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz", 2106 "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
@@ -2282,46 +2154,6 @@
2282 "lodash": "^4.17.14", 2154 "lodash": "^4.17.14",
2283 "slice-ansi": "^2.1.0", 2155 "slice-ansi": "^2.1.0",
2284 "string-width": "^3.0.0" 2156 "string-width": "^3.0.0"
2285 },
2286 "dependencies": {
2287 "ansi-regex": {
2288 "version": "4.1.0",
2289 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
2290 "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
2291 "dev": true
2292 },
2293 "emoji-regex": {
2294 "version": "7.0.3",
2295 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
2296 "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
2297 "dev": true
2298 },
2299 "is-fullwidth-code-point": {
2300 "version": "2.0.0",
2301 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2302 "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
2303 "dev": true
2304 },
2305 "string-width": {
2306 "version": "3.1.0",
2307 "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
2308 "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
2309 "dev": true,
2310 "requires": {
2311 "emoji-regex": "^7.0.1",
2312 "is-fullwidth-code-point": "^2.0.0",
2313 "strip-ansi": "^5.1.0"
2314 }
2315 },
2316 "strip-ansi": {
2317 "version": "5.2.0",
2318 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
2319 "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
2320 "dev": true,
2321 "requires": {
2322 "ansi-regex": "^4.1.0"
2323 }
2324 }
2325 } 2157 }
2326 }, 2158 },
2327 "text-table": { 2159 "text-table": {
@@ -2330,21 +2162,6 @@
2330 "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", 2162 "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
2331 "dev": true 2163 "dev": true
2332 }, 2164 },
2333 "through": {
2334 "version": "2.3.8",
2335 "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
2336 "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
2337 "dev": true
2338 },
2339 "tmp": {
2340 "version": "0.0.33",
2341 "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
2342 "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
2343 "dev": true,
2344 "requires": {
2345 "os-tmpdir": "~1.0.2"
2346 }
2347 },
2348 "to-regex-range": { 2165 "to-regex-range": {
2349 "version": "5.0.1", 2166 "version": "5.0.1",
2350 "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", 2167 "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
@@ -2409,9 +2226,9 @@
2409 } 2226 }
2410 }, 2227 },
2411 "typescript": { 2228 "typescript": {
2412 "version": "3.9.3", 2229 "version": "3.9.5",
2413 "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.3.tgz", 2230 "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.5.tgz",
2414 "integrity": "sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==", 2231 "integrity": "sha512-hSAifV3k+i6lEoCJ2k6R2Z/rp/H3+8sdmcn5NrS3/3kE7+RyZXm9aqvxWqjEXHAd8b0pShatpcdMTvEdvAJltQ==",
2415 "dev": true 2232 "dev": true
2416 }, 2233 },
2417 "typescript-formatter": { 2234 "typescript-formatter": {
@@ -2458,9 +2275,9 @@
2458 "dev": true 2275 "dev": true
2459 }, 2276 },
2460 "v8-compile-cache": { 2277 "v8-compile-cache": {
2461 "version": "2.1.0", 2278 "version": "2.1.1",
2462 "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", 2279 "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
2463 "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", 2280 "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==",
2464 "dev": true 2281 "dev": true
2465 }, 2282 },
2466 "vsce": { 2283 "vsce": {
@@ -2537,9 +2354,9 @@
2537 "integrity": "sha512-tZFUSbyjUcrh+qQf13ALX4QDdOfDX0cVaBFgy7ktJ0VwS7AW/yRKgGPSxVqqP9OCMNPdqP57O5q47w2pEwfaUg==" 2354 "integrity": "sha512-tZFUSbyjUcrh+qQf13ALX4QDdOfDX0cVaBFgy7ktJ0VwS7AW/yRKgGPSxVqqP9OCMNPdqP57O5q47w2pEwfaUg=="
2538 }, 2355 },
2539 "vscode-test": { 2356 "vscode-test": {
2540 "version": "1.3.0", 2357 "version": "1.4.0",
2541 "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.3.0.tgz", 2358 "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-1.4.0.tgz",
2542 "integrity": "sha512-LddukcBiSU2FVTDr3c1D8lwkiOvwlJdDL2hqVbn6gIz+rpTqUCkMZSKYm94Y1v0WXlHSDQBsXyY+tchWQgGVsw==", 2359 "integrity": "sha512-Jt7HNGvSE0+++Tvtq5wc4hiXLIr2OjDShz/gbAfM/mahQpy4rKBnmOK33D+MR67ATWviQhl+vpmU3p/qwSH/Pg==",
2543 "dev": true, 2360 "dev": true,
2544 "requires": { 2361 "requires": {
2545 "http-proxy-agent": "^2.1.0", 2362 "http-proxy-agent": "^2.1.0",
@@ -2577,12 +2394,6 @@
2577 "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 2394 "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
2578 "dev": true 2395 "dev": true
2579 }, 2396 },
2580 "is-fullwidth-code-point": {
2581 "version": "2.0.0",
2582 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2583 "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
2584 "dev": true
2585 },
2586 "string-width": { 2397 "string-width": {
2587 "version": "2.1.1", 2398 "version": "2.1.1",
2588 "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 2399 "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
@@ -2610,6 +2421,12 @@
2610 "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", 2421 "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
2611 "dev": true 2422 "dev": true
2612 }, 2423 },
2424 "workerpool": {
2425 "version": "6.0.0",
2426 "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.0.tgz",
2427 "integrity": "sha512-fU2OcNA/GVAJLLyKUoHkAgIhKb0JoCpSjLC/G2vYKxUjVmQwGbRVeoPJ1a8U4pnVofz4AQV5Y/NEw8oKqxEBtA==",
2428 "dev": true
2429 },
2613 "wrap-ansi": { 2430 "wrap-ansi": {
2614 "version": "5.1.0", 2431 "version": "5.1.0",
2615 "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 2432 "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
@@ -2627,29 +2444,6 @@
2627 "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 2444 "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
2628 "dev": true 2445 "dev": true
2629 }, 2446 },
2630 "emoji-regex": {
2631 "version": "7.0.3",
2632 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
2633 "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
2634 "dev": true
2635 },
2636 "is-fullwidth-code-point": {
2637 "version": "2.0.0",
2638 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2639 "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
2640 "dev": true
2641 },
2642 "string-width": {
2643 "version": "3.1.0",
2644 "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
2645 "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
2646 "dev": true,
2647 "requires": {
2648 "emoji-regex": "^7.0.1",
2649 "is-fullwidth-code-point": "^2.0.0",
2650 "strip-ansi": "^5.1.0"
2651 }
2652 },
2653 "strip-ansi": { 2447 "strip-ansi": {
2654 "version": "5.2.0", 2448 "version": "5.2.0",
2655 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 2449 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
@@ -2706,43 +2500,39 @@
2706 "yargs-parser": "^13.1.2" 2500 "yargs-parser": "^13.1.2"
2707 }, 2501 },
2708 "dependencies": { 2502 "dependencies": {
2709 "ansi-regex": { 2503 "find-up": {
2710 "version": "4.1.0", 2504 "version": "3.0.0",
2711 "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 2505 "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
2712 "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 2506 "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
2713 "dev": true 2507 "dev": true,
2714 }, 2508 "requires": {
2715 "emoji-regex": { 2509 "locate-path": "^3.0.0"
2716 "version": "7.0.3", 2510 }
2717 "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
2718 "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
2719 "dev": true
2720 },
2721 "is-fullwidth-code-point": {
2722 "version": "2.0.0",
2723 "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
2724 "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
2725 "dev": true
2726 }, 2511 },
2727 "string-width": { 2512 "locate-path": {
2728 "version": "3.1.0", 2513 "version": "3.0.0",
2729 "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 2514 "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
2730 "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 2515 "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
2731 "dev": true, 2516 "dev": true,
2732 "requires": { 2517 "requires": {
2733 "emoji-regex": "^7.0.1", 2518 "p-locate": "^3.0.0",
2734 "is-fullwidth-code-point": "^2.0.0", 2519 "path-exists": "^3.0.0"
2735 "strip-ansi": "^5.1.0"
2736 } 2520 }
2737 }, 2521 },
2738 "strip-ansi": { 2522 "p-locate": {
2739 "version": "5.2.0", 2523 "version": "3.0.0",
2740 "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 2524 "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
2741 "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 2525 "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
2742 "dev": true, 2526 "dev": true,
2743 "requires": { 2527 "requires": {
2744 "ansi-regex": "^4.1.0" 2528 "p-limit": "^2.0.0"
2745 } 2529 }
2530 },
2531 "path-exists": {
2532 "version": "3.0.0",
2533 "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
2534 "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
2535 "dev": true
2746 } 2536 }
2747 } 2537 }
2748 }, 2538 },
diff --git a/editors/code/package.json b/editors/code/package.json
index f542a490a..1adf055d0 100644
--- a/editors/code/package.json
+++ b/editors/code/package.json
@@ -39,29 +39,30 @@
39 "vscode-languageclient": "7.0.0-next.1" 39 "vscode-languageclient": "7.0.0-next.1"
40 }, 40 },
41 "devDependencies": { 41 "devDependencies": {
42 "@rollup/plugin-commonjs": "^12.0.0", 42 "@rollup/plugin-commonjs": "^13.0.0",
43 "@rollup/plugin-node-resolve": "^8.0.0", 43 "@rollup/plugin-node-resolve": "^8.1.0",
44 "@types/glob": "^7.1.1", 44 "@types/glob": "^7.1.2",
45 "@types/mocha": "^7.0.2", 45 "@types/mocha": "^7.0.2",
46 "@types/node": "^14.0.5", 46 "@types/node": "~12.7.0",
47 "@types/node-fetch": "^2.5.7", 47 "@types/node-fetch": "^2.5.7",
48 "@types/vscode": "^1.44.1", 48 "@types/vscode": "^1.44.1",
49 "@typescript-eslint/eslint-plugin": "^3.0.0", 49 "@typescript-eslint/eslint-plugin": "^3.4.0",
50 "@typescript-eslint/parser": "^3.0.0", 50 "@typescript-eslint/parser": "^3.4.0",
51 "eslint": "^7.0.0", 51 "eslint": "^7.3.1",
52 "glob": "^7.1.6", 52 "glob": "^7.1.6",
53 "mocha": "^7.1.2", 53 "mocha": "^8.0.1",
54 "rollup": "^2.10.7", 54 "rollup": "^2.18.1",
55 "tslib": "^2.0.0", 55 "tslib": "^2.0.0",
56 "typescript": "^3.9.3", 56 "typescript": "^3.9.5",
57 "typescript-formatter": "^7.2.2", 57 "typescript-formatter": "^7.2.2",
58 "vsce": "^1.75.0", 58 "vsce": "^1.75.0",
59 "vscode-test": "^1.3.0" 59 "vscode-test": "^1.4.0"
60 }, 60 },
61 "activationEvents": [ 61 "activationEvents": [
62 "onLanguage:rust", 62 "onLanguage:rust",
63 "onCommand:rust-analyzer.analyzerStatus", 63 "onCommand:rust-analyzer.analyzerStatus",
64 "onCommand:rust-analyzer.collectGarbage", 64 "onCommand:rust-analyzer.memoryUsage",
65 "onCommand:rust-analyzer.reloadWorkspace",
65 "workspaceContains:**/Cargo.toml" 66 "workspaceContains:**/Cargo.toml"
66 ], 67 ],
67 "main": "./out/src/main", 68 "main": "./out/src/main",
@@ -143,8 +144,13 @@
143 "category": "Rust Analyzer" 144 "category": "Rust Analyzer"
144 }, 145 },
145 { 146 {
146 "command": "rust-analyzer.collectGarbage", 147 "command": "rust-analyzer.memoryUsage",
147 "title": "Run garbage collection", 148 "title": "Memory Usage (Clears Database)",
149 "category": "Rust Analyzer"
150 },
151 {
152 "command": "rust-analyzer.reloadWorkspace",
153 "title": "Reload workspace",
148 "category": "Rust Analyzer" 154 "category": "Rust Analyzer"
149 }, 155 },
150 { 156 {
@@ -194,11 +200,6 @@
194 "type": "object", 200 "type": "object",
195 "title": "Rust Analyzer", 201 "title": "Rust Analyzer",
196 "properties": { 202 "properties": {
197 "rust-analyzer.diagnostics.enable": {
198 "type": "boolean",
199 "default": true,
200 "markdownDescription": "Whether to show native rust-analyzer diagnostics."
201 },
202 "rust-analyzer.lruCapacity": { 203 "rust-analyzer.lruCapacity": {
203 "type": [ 204 "type": [
204 "null", 205 "null",
@@ -231,6 +232,11 @@
231 "default": true, 232 "default": true,
232 "markdownDescription": "Whether to show `can't find Cargo.toml` error message" 233 "markdownDescription": "Whether to show `can't find Cargo.toml` error message"
233 }, 234 },
235 "rust-analyzer.cargo.autoreload": {
236 "type": "boolean",
237 "default": true,
238 "markdownDescription": "Automatically refresh project info via `cargo metadata` on Cargo.toml changes"
239 },
234 "rust-analyzer.cargo.noDefaultFeatures": { 240 "rust-analyzer.cargo.noDefaultFeatures": {
235 "type": "boolean", 241 "type": "boolean",
236 "default": false, 242 "default": false,
@@ -317,6 +323,14 @@
317 "default": true, 323 "default": true,
318 "markdownDescription": "Check all targets and tests (will be passed as `--all-targets`)" 324 "markdownDescription": "Check all targets and tests (will be passed as `--all-targets`)"
319 }, 325 },
326 "rust-analyzer.checkOnSave.noDefaultFeatures": {
327 "type": [
328 "null",
329 "boolean"
330 ],
331 "default": null,
332 "markdownDescription": "Do not activate the `default` feature"
333 },
320 "rust-analyzer.checkOnSave.allFeatures": { 334 "rust-analyzer.checkOnSave.allFeatures": {
321 "type": [ 335 "type": [
322 "null", 336 "null",
@@ -344,6 +358,35 @@
344 "default": null, 358 "default": null,
345 "description": "Custom cargo runner extension ID." 359 "description": "Custom cargo runner extension ID."
346 }, 360 },
361 "rust-analyzer.runnableEnv": {
362 "anyOf": [
363 {
364 "type": "null"
365 },
366 {
367 "type": "array",
368 "items": {
369 "type": "object",
370 "properties": {
371 "mask": {
372 "type": "string",
373 "description": "Runnable name mask"
374 },
375 "env": {
376 "type": "object",
377 "description": "Variables in form of { \"key\": \"value\"}"
378 }
379 }
380 }
381 },
382 {
383 "type": "object",
384 "description": "Variables in form of { \"key\": \"value\"}"
385 }
386 ],
387 "default": null,
388 "description": "Environment variables passed to the runnable launched using `Test ` or `Debug` lens or `rust-analyzer.run` command."
389 },
347 "rust-analyzer.inlayHints.enable": { 390 "rust-analyzer.inlayHints.enable": {
348 "type": "boolean", 391 "type": "boolean",
349 "default": true, 392 "default": true,
@@ -539,6 +582,16 @@
539 "type": "boolean", 582 "type": "boolean",
540 "default": true 583 "default": true
541 }, 584 },
585 "rust-analyzer.diagnostics.enable": {
586 "type": "boolean",
587 "default": true,
588 "markdownDescription": "Whether to show native rust-analyzer diagnostics."
589 },
590 "rust-analyzer.diagnostics.enableExperimental": {
591 "type": "boolean",
592 "default": true,
593 "markdownDescription": "Whether to show experimental rust-analyzer diagnostics that might have more false positives than usual."
594 },
542 "rust-analyzer.diagnostics.warningsAsInfo": { 595 "rust-analyzer.diagnostics.warningsAsInfo": {
543 "type": "array", 596 "type": "array",
544 "uniqueItems": true, 597 "uniqueItems": true,
@@ -554,7 +607,7 @@
554 "items": { 607 "items": {
555 "type": "string" 608 "type": "string"
556 }, 609 },
557 "description": "List of warnings warnings that should be displayed with hint severity.\nThe warnings will be indicated by faded text or three dots in code and will not show up in te problems panel.", 610 "description": "List of warnings warnings that should be displayed with hint severity.\nThe warnings will be indicated by faded text or three dots in code and will not show up in the problems panel.",
558 "default": [] 611 "default": []
559 } 612 }
560 } 613 }
@@ -615,24 +668,30 @@
615 "problemMatchers": [ 668 "problemMatchers": [
616 { 669 {
617 "name": "rustc", 670 "name": "rustc",
671 "owner": "rustc",
672 "source": "rustc",
618 "fileLocation": [ 673 "fileLocation": [
619 "relative", 674 "autoDetect",
620 "${workspaceRoot}" 675 "${workspaceRoot}"
621 ], 676 ],
622 "pattern": "$rustc" 677 "pattern": "$rustc"
623 }, 678 },
624 { 679 {
625 "name": "rustc-json", 680 "name": "rustc-json",
681 "owner": "rustc",
682 "source": "rustc",
626 "fileLocation": [ 683 "fileLocation": [
627 "relative", 684 "autoDetect",
628 "${workspaceRoot}" 685 "${workspaceRoot}"
629 ], 686 ],
630 "pattern": "$rustc-json" 687 "pattern": "$rustc-json"
631 }, 688 },
632 { 689 {
633 "name": "rustc-watch", 690 "name": "rustc-watch",
691 "owner": "rustc",
692 "source": "rustc",
634 "fileLocation": [ 693 "fileLocation": [
635 "relative", 694 "autoDetect",
636 "${workspaceRoot}" 695 "${workspaceRoot}"
637 ], 696 ],
638 "background": { 697 "background": {
@@ -815,7 +874,11 @@
815 "when": "inRustProject" 874 "when": "inRustProject"
816 }, 875 },
817 { 876 {
818 "command": "rust-analyzer.collectGarbage", 877 "command": "rust-analyzer.memoryUsage",
878 "when": "inRustProject"
879 },
880 {
881 "command": "rust-analyzer.reloadWorkspace",
819 "when": "inRustProject" 882 "when": "inRustProject"
820 }, 883 },
821 { 884 {
diff --git a/editors/code/rollup.config.js b/editors/code/rollup.config.js
index 4b4c47f4a..27abf75ac 100644
--- a/editors/code/rollup.config.js
+++ b/editors/code/rollup.config.js
@@ -16,7 +16,6 @@ export default {
16 external: [...nodeBuiltins, 'vscode'], 16 external: [...nodeBuiltins, 'vscode'],
17 output: { 17 output: {
18 file: './out/src/main.js', 18 file: './out/src/main.js',
19 format: 'cjs', 19 format: 'cjs'
20 exports: 'named'
21 } 20 }
22}; 21};
diff --git a/editors/code/rust.tmGrammar.json b/editors/code/rust.tmGrammar.json
index ab87cd39f..0be2583db 100644
--- a/editors/code/rust.tmGrammar.json
+++ b/editors/code/rust.tmGrammar.json
@@ -268,7 +268,7 @@
268 "match": "\\b(log|error|warn|info|debug|trace|log_enabled)!" 268 "match": "\\b(log|error|warn|info|debug|trace|log_enabled)!"
269 }, 269 },
270 { 270 {
271 "comment": "Invokation of a macro", 271 "comment": "Invocation of a macro",
272 "match": "\\b([a-zA-Z_][a-zA-Z0-9_]*\\!)\\s*[({\\[]", 272 "match": "\\b([a-zA-Z_][a-zA-Z0-9_]*\\!)\\s*[({\\[]",
273 "captures": { 273 "captures": {
274 "1": { 274 "1": {
@@ -683,4 +683,4 @@
683 ] 683 ]
684 } 684 }
685 } 685 }
686} \ No newline at end of file 686}
diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts
index 65ad573d8..18948cb3c 100644
--- a/editors/code/src/client.ts
+++ b/editors/code/src/client.ts
@@ -41,6 +41,7 @@ export function createClient(serverPath: string, cwd: string): lc.LanguageClient
41 const clientOptions: lc.LanguageClientOptions = { 41 const clientOptions: lc.LanguageClientOptions = {
42 documentSelector: [{ scheme: 'file', language: 'rust' }], 42 documentSelector: [{ scheme: 'file', language: 'rust' }],
43 initializationOptions: vscode.workspace.getConfiguration("rust-analyzer"), 43 initializationOptions: vscode.workspace.getConfiguration("rust-analyzer"),
44 diagnosticCollectionName: "rustc",
44 traceOutputChannel, 45 traceOutputChannel,
45 middleware: { 46 middleware: {
46 // Workaround for https://github.com/microsoft/vscode-languageserver-node/issues/576 47 // Workaround for https://github.com/microsoft/vscode-languageserver-node/issues/576
@@ -66,7 +67,7 @@ export function createClient(serverPath: string, cwd: string): lc.LanguageClient
66 return Promise.resolve(null); 67 return Promise.resolve(null);
67 }); 68 });
68 }, 69 },
69 // Using custom handling of CodeActions where each code action is resloved lazily 70 // Using custom handling of CodeActions where each code action is resolved lazily
70 // That's why we are not waiting for any command or edits 71 // That's why we are not waiting for any command or edits
71 async provideCodeActions(document: vscode.TextDocument, range: vscode.Range, context: vscode.CodeActionContext, token: vscode.CancellationToken, _next: lc.ProvideCodeActionsSignature) { 72 async provideCodeActions(document: vscode.TextDocument, range: vscode.Range, context: vscode.CodeActionContext, token: vscode.CancellationToken, _next: lc.ProvideCodeActionsSignature) {
72 const params: lc.CodeActionParams = { 73 const params: lc.CodeActionParams = {
@@ -87,7 +88,8 @@ export function createClient(serverPath: string, cwd: string): lc.LanguageClient
87 continue; 88 continue;
88 } 89 }
89 assert(isCodeActionWithoutEditsAndCommands(item), "We don't expect edits or commands here"); 90 assert(isCodeActionWithoutEditsAndCommands(item), "We don't expect edits or commands here");
90 const action = new vscode.CodeAction(item.title); 91 const kind = client.protocol2CodeConverter.asCodeActionKind((item as any).kind);
92 const action = new vscode.CodeAction(item.title, kind);
91 const group = (item as any).group; 93 const group = (item as any).group;
92 const id = (item as any).id; 94 const id = (item as any).id;
93 const resolveParams: ra.ResolveCodeActionParams = { 95 const resolveParams: ra.ResolveCodeActionParams = {
@@ -116,6 +118,7 @@ export function createClient(serverPath: string, cwd: string): lc.LanguageClient
116 result[index] = items[0]; 118 result[index] = items[0];
117 } else { 119 } else {
118 const action = new vscode.CodeAction(group); 120 const action = new vscode.CodeAction(group);
121 action.kind = items[0].kind;
119 action.command = { 122 action.command = {
120 command: "rust-analyzer.applyActionGroup", 123 command: "rust-analyzer.applyActionGroup",
121 title: "", 124 title: "",
@@ -161,6 +164,7 @@ class ExperimentalFeatures implements lc.StaticFeature {
161 caps.codeActionGroup = true; 164 caps.codeActionGroup = true;
162 caps.resolveCodeAction = true; 165 caps.resolveCodeAction = true;
163 caps.hoverActions = true; 166 caps.hoverActions = true;
167 caps.statusNotification = true;
164 capabilities.experimental = caps; 168 capabilities.experimental = caps;
165 } 169 }
166 initialize(_capabilities: lc.ServerCapabilities<any>, _documentSelector: lc.DocumentSelector | undefined): void { 170 initialize(_capabilities: lc.ServerCapabilities<any>, _documentSelector: lc.DocumentSelector | undefined): void {
diff --git a/editors/code/src/commands.ts b/editors/code/src/commands.ts
index 0e78f5101..d0faf4745 100644
--- a/editors/code/src/commands.ts
+++ b/editors/code/src/commands.ts
@@ -55,6 +55,38 @@ export function analyzerStatus(ctx: Ctx): Cmd {
55 }; 55 };
56} 56}
57 57
58export function memoryUsage(ctx: Ctx): Cmd {
59 const tdcp = new class implements vscode.TextDocumentContentProvider {
60 readonly uri = vscode.Uri.parse('rust-analyzer-memory://memory');
61 readonly eventEmitter = new vscode.EventEmitter<vscode.Uri>();
62
63 provideTextDocumentContent(_uri: vscode.Uri): vscode.ProviderResult<string> {
64 if (!vscode.window.activeTextEditor) return '';
65
66 return ctx.client.sendRequest(ra.memoryUsage, null).then((mem) => {
67 return 'Per-query memory usage:\n' + mem + '\n(note: database has been cleared)';
68 });
69 }
70
71 get onDidChange(): vscode.Event<vscode.Uri> {
72 return this.eventEmitter.event;
73 }
74 }();
75
76 ctx.pushCleanup(
77 vscode.workspace.registerTextDocumentContentProvider(
78 'rust-analyzer-memory',
79 tdcp,
80 ),
81 );
82
83 return async () => {
84 tdcp.eventEmitter.fire(tdcp.uri);
85 const document = await vscode.workspace.openTextDocument(tdcp.uri);
86 return vscode.window.showTextDocument(document, vscode.ViewColumn.Two, true);
87 };
88}
89
58export function matchingBrace(ctx: Ctx): Cmd { 90export function matchingBrace(ctx: Ctx): Cmd {
59 return async () => { 91 return async () => {
60 const editor = ctx.activeRustEditor; 92 const editor = ctx.activeRustEditor;
@@ -153,15 +185,22 @@ export function parentModule(ctx: Ctx): Cmd {
153 185
154export function ssr(ctx: Ctx): Cmd { 186export function ssr(ctx: Ctx): Cmd {
155 return async () => { 187 return async () => {
188 const editor = vscode.window.activeTextEditor;
156 const client = ctx.client; 189 const client = ctx.client;
157 if (!client) return; 190 if (!editor || !client) return;
191
192 const position = editor.selection.active;
193 const selections = editor.selections;
194 const textDocument = { uri: editor.document.uri.toString() };
158 195
159 const options: vscode.InputBoxOptions = { 196 const options: vscode.InputBoxOptions = {
160 value: "() ==>> ()", 197 value: "() ==>> ()",
161 prompt: "Enter request, for example 'Foo($a) ==> Foo::new($a)' ", 198 prompt: "Enter request, for example 'Foo($a) ==> Foo::new($a)' ",
162 validateInput: async (x: string) => { 199 validateInput: async (x: string) => {
163 try { 200 try {
164 await client.sendRequest(ra.ssr, { query: x, parseOnly: true }); 201 await client.sendRequest(ra.ssr, {
202 query: x, parseOnly: true, textDocument, position, selections,
203 });
165 } catch (e) { 204 } catch (e) {
166 return e.toString(); 205 return e.toString();
167 } 206 }
@@ -176,7 +215,9 @@ export function ssr(ctx: Ctx): Cmd {
176 title: "Structured search replace in progress...", 215 title: "Structured search replace in progress...",
177 cancellable: false, 216 cancellable: false,
178 }, async (_progress, _token) => { 217 }, async (_progress, _token) => {
179 const edit = await client.sendRequest(ra.ssr, { query: request, parseOnly: false }); 218 const edit = await client.sendRequest(ra.ssr, {
219 query: request, parseOnly: false, textDocument, position, selections,
220 });
180 221
181 await vscode.workspace.applyEdit(client.protocol2CodeConverter.asWorkspaceEdit(edit)); 222 await vscode.workspace.applyEdit(client.protocol2CodeConverter.asWorkspaceEdit(edit));
182 }); 223 });
@@ -330,8 +371,8 @@ export function expandMacro(ctx: Ctx): Cmd {
330 }; 371 };
331} 372}
332 373
333export function collectGarbage(ctx: Ctx): Cmd { 374export function reloadWorkspace(ctx: Ctx): Cmd {
334 return async () => ctx.client.sendRequest(ra.collectGarbage, null); 375 return async () => ctx.client.sendRequest(ra.reloadWorkspace, null);
335} 376}
336 377
337export function showReferences(ctx: Ctx): Cmd { 378export function showReferences(ctx: Ctx): Cmd {
diff --git a/editors/code/src/config.ts b/editors/code/src/config.ts
index fc95a7de6..033b04b60 100644
--- a/editors/code/src/config.ts
+++ b/editors/code/src/config.ts
@@ -5,6 +5,8 @@ export type UpdatesChannel = "stable" | "nightly";
5 5
6export const NIGHTLY_TAG = "nightly"; 6export const NIGHTLY_TAG = "nightly";
7 7
8export type RunnableEnvCfg = undefined | Record<string, string> | { mask?: string; env: Record<string, string> }[];
9
8export class Config { 10export class Config {
9 readonly extensionId = "matklad.rust-analyzer"; 11 readonly extensionId = "matklad.rust-analyzer";
10 12
@@ -37,10 +39,10 @@ export class Config {
37 39
38 private refreshLogging() { 40 private refreshLogging() {
39 log.setEnabled(this.traceExtension); 41 log.setEnabled(this.traceExtension);
40 log.debug( 42 log.info("Extension version:", this.package.version);
41 "Extension version:", this.package.version, 43
42 "using configuration:", this.cfg 44 const cfg = Object.entries(this.cfg).filter(([_, val]) => !(val instanceof Function));
43 ); 45 log.info("Using configuration", Object.fromEntries(cfg));
44 } 46 }
45 47
46 private async onDidChangeConfiguration(event: vscode.ConfigurationChangeEvent) { 48 private async onDidChangeConfiguration(event: vscode.ConfigurationChangeEvent) {
@@ -114,6 +116,10 @@ export class Config {
114 return this.get<string | undefined>("cargoRunner"); 116 return this.get<string | undefined>("cargoRunner");
115 } 117 }
116 118
119 get runnableEnv() {
120 return this.get<RunnableEnvCfg>("runnableEnv");
121 }
122
117 get debug() { 123 get debug() {
118 // "/rustc/<id>" used by suggestions only. 124 // "/rustc/<id>" used by suggestions only.
119 const { ["/rustc/<id>"]: _, ...sourceFileMap } = this.get<Record<string, string>>("debug.sourceFileMap"); 125 const { ["/rustc/<id>"]: _, ...sourceFileMap } = this.get<Record<string, string>>("debug.sourceFileMap");
diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts
index 41df11991..6e767babf 100644
--- a/editors/code/src/ctx.ts
+++ b/editors/code/src/ctx.ts
@@ -1,9 +1,11 @@
1import * as vscode from 'vscode'; 1import * as vscode from 'vscode';
2import * as lc from 'vscode-languageclient'; 2import * as lc from 'vscode-languageclient';
3import * as ra from './lsp_ext';
3 4
4import { Config } from './config'; 5import { Config } from './config';
5import { createClient } from './client'; 6import { createClient } from './client';
6import { isRustEditor, RustEditor } from './util'; 7import { isRustEditor, RustEditor } from './util';
8import { Status } from './lsp_ext';
7 9
8export class Ctx { 10export class Ctx {
9 private constructor( 11 private constructor(
@@ -11,6 +13,7 @@ export class Ctx {
11 private readonly extCtx: vscode.ExtensionContext, 13 private readonly extCtx: vscode.ExtensionContext,
12 readonly client: lc.LanguageClient, 14 readonly client: lc.LanguageClient,
13 readonly serverPath: string, 15 readonly serverPath: string,
16 readonly statusBar: vscode.StatusBarItem,
14 ) { 17 ) {
15 18
16 } 19 }
@@ -22,9 +25,18 @@ export class Ctx {
22 cwd: string, 25 cwd: string,
23 ): Promise<Ctx> { 26 ): Promise<Ctx> {
24 const client = createClient(serverPath, cwd); 27 const client = createClient(serverPath, cwd);
25 const res = new Ctx(config, extCtx, client, serverPath); 28
29 const statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left);
30 extCtx.subscriptions.push(statusBar);
31 statusBar.text = "rust-analyzer";
32 statusBar.tooltip = "ready";
33 statusBar.show();
34
35 const res = new Ctx(config, extCtx, client, serverPath, statusBar);
36
26 res.pushCleanup(client.start()); 37 res.pushCleanup(client.start());
27 await client.onReady(); 38 await client.onReady();
39 client.onNotification(ra.status, (status) => res.setStatus(status));
28 return res; 40 return res;
29 } 41 }
30 42
@@ -54,6 +66,35 @@ export class Ctx {
54 return this.extCtx.subscriptions; 66 return this.extCtx.subscriptions;
55 } 67 }
56 68
69 setStatus(status: Status) {
70 switch (status) {
71 case "loading":
72 this.statusBar.text = "$(sync~spin) rust-analyzer";
73 this.statusBar.tooltip = "Loading the project";
74 this.statusBar.command = undefined;
75 this.statusBar.color = undefined;
76 break;
77 case "ready":
78 this.statusBar.text = "rust-analyzer";
79 this.statusBar.tooltip = "Ready";
80 this.statusBar.command = undefined;
81 this.statusBar.color = undefined;
82 break;
83 case "invalid":
84 this.statusBar.text = "$(error) rust-analyzer";
85 this.statusBar.tooltip = "Failed to load the project";
86 this.statusBar.command = undefined;
87 this.statusBar.color = new vscode.ThemeColor("notificationsErrorIcon.foreground");
88 break;
89 case "needsReload":
90 this.statusBar.text = "$(warning) rust-analyzer";
91 this.statusBar.tooltip = "Click to reload";
92 this.statusBar.command = "rust-analyzer.reloadWorkspace";
93 this.statusBar.color = new vscode.ThemeColor("notificationsWarningIcon.foreground");
94 break;
95 }
96 }
97
57 pushCleanup(d: Disposable) { 98 pushCleanup(d: Disposable) {
58 this.extCtx.subscriptions.push(d); 99 this.extCtx.subscriptions.push(d);
59 } 100 }
diff --git a/editors/code/src/debug.ts b/editors/code/src/debug.ts
index 61c12dbe0..bd92c5b6d 100644
--- a/editors/code/src/debug.ts
+++ b/editors/code/src/debug.ts
@@ -5,9 +5,10 @@ import * as ra from './lsp_ext';
5 5
6import { Cargo } from './toolchain'; 6import { Cargo } from './toolchain';
7import { Ctx } from "./ctx"; 7import { Ctx } from "./ctx";
8import { prepareEnv } from "./run";
8 9
9const debugOutput = vscode.window.createOutputChannel("Debug"); 10const debugOutput = vscode.window.createOutputChannel("Debug");
10type DebugConfigProvider = (config: ra.Runnable, executable: string, sourceFileMap?: Record<string, string>) => vscode.DebugConfiguration; 11type DebugConfigProvider = (config: ra.Runnable, executable: string, env: Record<string, string>, sourceFileMap?: Record<string, string>) => vscode.DebugConfiguration;
11 12
12export async function makeDebugConfig(ctx: Ctx, runnable: ra.Runnable): Promise<void> { 13export async function makeDebugConfig(ctx: Ctx, runnable: ra.Runnable): Promise<void> {
13 const scope = ctx.activeRustEditor?.document.uri; 14 const scope = ctx.activeRustEditor?.document.uri;
@@ -92,7 +93,8 @@ async function getDebugConfiguration(ctx: Ctx, runnable: ra.Runnable): Promise<v
92 } 93 }
93 94
94 const executable = await getDebugExecutable(runnable); 95 const executable = await getDebugExecutable(runnable);
95 const debugConfig = knownEngines[debugEngine.id](runnable, simplifyPath(executable), debugOptions.sourceFileMap); 96 const env = prepareEnv(runnable, ctx.config.runnableEnv);
97 const debugConfig = knownEngines[debugEngine.id](runnable, simplifyPath(executable), env, debugOptions.sourceFileMap);
96 if (debugConfig.type in debugOptions.engineSettings) { 98 if (debugConfig.type in debugOptions.engineSettings) {
97 const settingsMap = (debugOptions.engineSettings as any)[debugConfig.type]; 99 const settingsMap = (debugOptions.engineSettings as any)[debugConfig.type];
98 for (var key in settingsMap) { 100 for (var key in settingsMap) {
@@ -121,7 +123,7 @@ async function getDebugExecutable(runnable: ra.Runnable): Promise<string> {
121 return executable; 123 return executable;
122} 124}
123 125
124function getLldbDebugConfig(runnable: ra.Runnable, executable: string, sourceFileMap?: Record<string, string>): vscode.DebugConfiguration { 126function getLldbDebugConfig(runnable: ra.Runnable, executable: string, env: Record<string, string>, sourceFileMap?: Record<string, string>): vscode.DebugConfiguration {
125 return { 127 return {
126 type: "lldb", 128 type: "lldb",
127 request: "launch", 129 request: "launch",
@@ -130,11 +132,12 @@ function getLldbDebugConfig(runnable: ra.Runnable, executable: string, sourceFil
130 args: runnable.args.executableArgs, 132 args: runnable.args.executableArgs,
131 cwd: runnable.args.workspaceRoot, 133 cwd: runnable.args.workspaceRoot,
132 sourceMap: sourceFileMap, 134 sourceMap: sourceFileMap,
133 sourceLanguages: ["rust"] 135 sourceLanguages: ["rust"],
136 env
134 }; 137 };
135} 138}
136 139
137function getCppvsDebugConfig(runnable: ra.Runnable, executable: string, sourceFileMap?: Record<string, string>): vscode.DebugConfiguration { 140function getCppvsDebugConfig(runnable: ra.Runnable, executable: string, env: Record<string, string>, sourceFileMap?: Record<string, string>): vscode.DebugConfiguration {
138 return { 141 return {
139 type: (os.platform() === "win32") ? "cppvsdbg" : "cppdbg", 142 type: (os.platform() === "win32") ? "cppvsdbg" : "cppdbg",
140 request: "launch", 143 request: "launch",
@@ -142,6 +145,7 @@ function getCppvsDebugConfig(runnable: ra.Runnable, executable: string, sourceFi
142 program: executable, 145 program: executable,
143 args: runnable.args.executableArgs, 146 args: runnable.args.executableArgs,
144 cwd: runnable.args.workspaceRoot, 147 cwd: runnable.args.workspaceRoot,
145 sourceFileMap: sourceFileMap, 148 sourceFileMap,
149 env,
146 }; 150 };
147} 151}
diff --git a/editors/code/src/lsp_ext.ts b/editors/code/src/lsp_ext.ts
index e16ea799c..494d51c83 100644
--- a/editors/code/src/lsp_ext.ts
+++ b/editors/code/src/lsp_ext.ts
@@ -5,8 +5,12 @@
5import * as lc from "vscode-languageclient"; 5import * as lc from "vscode-languageclient";
6 6
7export const analyzerStatus = new lc.RequestType<null, string, void>("rust-analyzer/analyzerStatus"); 7export const analyzerStatus = new lc.RequestType<null, string, void>("rust-analyzer/analyzerStatus");
8export const memoryUsage = new lc.RequestType<null, string, void>("rust-analyzer/memoryUsage");
8 9
9export const collectGarbage = new lc.RequestType<null, null, void>("rust-analyzer/collectGarbage"); 10export type Status = "loading" | "ready" | "invalid" | "needsReload";
11export const status = new lc.NotificationType<Status>("rust-analyzer/status");
12
13export const reloadWorkspace = new lc.RequestType<null, null, void>("rust-analyzer/reloadWorkspace");
10 14
11export interface SyntaxTreeParams { 15export interface SyntaxTreeParams {
12 textDocument: lc.TextDocumentIdentifier; 16 textDocument: lc.TextDocumentIdentifier;
@@ -60,6 +64,7 @@ export interface Runnable {
60 workspaceRoot?: string; 64 workspaceRoot?: string;
61 cargoArgs: string[]; 65 cargoArgs: string[];
62 executableArgs: string[]; 66 executableArgs: string[];
67 expectTest?: boolean;
63 }; 68 };
64} 69}
65export const runnables = new lc.RequestType<RunnablesParams, Runnable[], void>("experimental/runnables"); 70export const runnables = new lc.RequestType<RunnablesParams, Runnable[], void>("experimental/runnables");
@@ -88,6 +93,9 @@ export const inlayHints = new lc.RequestType<InlayHintsParams, InlayHint[], void
88export interface SsrParams { 93export interface SsrParams {
89 query: string; 94 query: string;
90 parseOnly: boolean; 95 parseOnly: boolean;
96 textDocument: lc.TextDocumentIdentifier;
97 position: lc.Position;
98 selections: lc.Range[];
91} 99}
92export const ssr = new lc.RequestType<SsrParams, lc.WorkspaceEdit, void>('experimental/ssr'); 100export const ssr = new lc.RequestType<SsrParams, lc.WorkspaceEdit, void>('experimental/ssr');
93 101
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts
index 5ceab8b44..bd99d696a 100644
--- a/editors/code/src/main.ts
+++ b/editors/code/src/main.ts
@@ -19,6 +19,16 @@ let ctx: Ctx | undefined;
19const RUST_PROJECT_CONTEXT_NAME = "inRustProject"; 19const RUST_PROJECT_CONTEXT_NAME = "inRustProject";
20 20
21export async function activate(context: vscode.ExtensionContext) { 21export async function activate(context: vscode.ExtensionContext) {
22 // For some reason vscode not always shows pop-up error notifications
23 // when an extension fails to activate, so we do it explicitly by ourselves.
24 // FIXME: remove this bit of code once vscode fixes this issue: https://github.com/microsoft/vscode/issues/101242
25 await tryActivate(context).catch(err => {
26 void vscode.window.showErrorMessage(`Cannot activate rust-analyzer: ${err.message}`);
27 throw err;
28 });
29}
30
31async function tryActivate(context: vscode.ExtensionContext) {
22 // Register a "dumb" onEnter command for the case where server fails to 32 // Register a "dumb" onEnter command for the case where server fails to
23 // start. 33 // start.
24 // 34 //
@@ -44,13 +54,13 @@ export async function activate(context: vscode.ExtensionContext) {
44 const serverPath = await bootstrap(config, state).catch(err => { 54 const serverPath = await bootstrap(config, state).catch(err => {
45 let message = "bootstrap error. "; 55 let message = "bootstrap error. ";
46 56
47 if (err.code === "EBUSY" || err.code === "ETXTBSY") { 57 if (err.code === "EBUSY" || err.code === "ETXTBSY" || err.code === "EPERM") {
48 message += "Other vscode windows might be using rust-analyzer, "; 58 message += "Other vscode windows might be using rust-analyzer, ";
49 message += "you should close them and reload this window to retry. "; 59 message += "you should close them and reload this window to retry. ";
50 } 60 }
51 61
52 message += 'Open "Help > Toggle Developer Tools > Console" to see the logs '; 62 message += 'See the logs in "OUTPUT > Rust Analyzer Client" (should open automatically). ';
53 message += '(enable verbose logs with "rust-analyzer.trace.extension")'; 63 message += 'To enable verbose logs use { "rust-analyzer.trace.extension": true }';
54 64
55 log.error("Bootstrap error", err); 65 log.error("Bootstrap error", err);
56 throw new Error(message); 66 throw new Error(message);
@@ -58,9 +68,7 @@ export async function activate(context: vscode.ExtensionContext) {
58 68
59 const workspaceFolder = vscode.workspace.workspaceFolders?.[0]; 69 const workspaceFolder = vscode.workspace.workspaceFolders?.[0];
60 if (workspaceFolder === undefined) { 70 if (workspaceFolder === undefined) {
61 const err = "Cannot activate rust-analyzer when no folder is opened"; 71 throw new Error("no folder is opened");
62 void vscode.window.showErrorMessage(err);
63 throw new Error(err);
64 } 72 }
65 73
66 // Note: we try to start the server before we activate type hints so that it 74 // Note: we try to start the server before we activate type hints so that it
@@ -88,7 +96,8 @@ export async function activate(context: vscode.ExtensionContext) {
88 }); 96 });
89 97
90 ctx.registerCommand('analyzerStatus', commands.analyzerStatus); 98 ctx.registerCommand('analyzerStatus', commands.analyzerStatus);
91 ctx.registerCommand('collectGarbage', commands.collectGarbage); 99 ctx.registerCommand('memoryUsage', commands.memoryUsage);
100 ctx.registerCommand('reloadWorkspace', commands.reloadWorkspace);
92 ctx.registerCommand('matchingBrace', commands.matchingBrace); 101 ctx.registerCommand('matchingBrace', commands.matchingBrace);
93 ctx.registerCommand('joinLines', commands.joinLines); 102 ctx.registerCommand('joinLines', commands.joinLines);
94 ctx.registerCommand('parentModule', commands.parentModule); 103 ctx.registerCommand('parentModule', commands.parentModule);
@@ -152,13 +161,17 @@ async function bootstrapExtension(config: Config, state: PersistentState): Promi
152 return; 161 return;
153 }; 162 };
154 163
155 const lastCheck = state.lastCheck;
156 const now = Date.now(); 164 const now = Date.now();
165 if (config.package.releaseTag === NIGHTLY_TAG) {
166 // Check if we should poll github api for the new nightly version
167 // if we haven't done it during the past hour
168 const lastCheck = state.lastCheck;
157 169
158 const anHour = 60 * 60 * 1000; 170 const anHour = 60 * 60 * 1000;
159 const shouldDownloadNightly = state.releaseId === undefined || (now - (lastCheck ?? 0)) > anHour; 171 const shouldCheckForNewNightly = state.releaseId === undefined || (now - (lastCheck ?? 0)) > anHour;
160 172
161 if (!shouldDownloadNightly) return; 173 if (!shouldCheckForNewNightly) return;
174 }
162 175
163 const release = await fetchRelease("nightly").catch((e) => { 176 const release = await fetchRelease("nightly").catch((e) => {
164 log.error(e); 177 log.error(e);
@@ -202,7 +215,7 @@ async function bootstrapServer(config: Config, state: PersistentState): Promise<
202 ); 215 );
203 } 216 }
204 217
205 log.debug("Using server binary at", path); 218 log.info("Using server binary at", path);
206 219
207 if (!isValidExecutable(path)) { 220 if (!isValidExecutable(path)) {
208 throw new Error(`Failed to execute ${path} --version`); 221 throw new Error(`Failed to execute ${path} --version`);
@@ -261,13 +274,13 @@ async function getServer(config: Config, state: PersistentState): Promise<string
261 }; 274 };
262 if (config.package.releaseTag === null) return "rust-analyzer"; 275 if (config.package.releaseTag === null) return "rust-analyzer";
263 276
264 let binaryName: string | undefined = undefined; 277 let platform: string | undefined;
265 if (process.arch === "x64" || process.arch === "ia32") { 278 if (process.arch === "x64" || process.arch === "ia32") {
266 if (process.platform === "linux") binaryName = "rust-analyzer-linux"; 279 if (process.platform === "linux") platform = "linux";
267 if (process.platform === "darwin") binaryName = "rust-analyzer-mac"; 280 if (process.platform === "darwin") platform = "mac";
268 if (process.platform === "win32") binaryName = "rust-analyzer-windows.exe"; 281 if (process.platform === "win32") platform = "windows";
269 } 282 }
270 if (binaryName === undefined) { 283 if (platform === undefined) {
271 vscode.window.showErrorMessage( 284 vscode.window.showErrorMessage(
272 "Unfortunately we don't ship binaries for your platform yet. " + 285 "Unfortunately we don't ship binaries for your platform yet. " +
273 "You need to manually clone rust-analyzer repository and " + 286 "You need to manually clone rust-analyzer repository and " +
@@ -278,8 +291,8 @@ async function getServer(config: Config, state: PersistentState): Promise<string
278 ); 291 );
279 return undefined; 292 return undefined;
280 } 293 }
281 294 const ext = platform === "windows" ? ".exe" : "";
282 const dest = path.join(config.globalStoragePath, binaryName); 295 const dest = path.join(config.globalStoragePath, `rust-analyzer-${platform}${ext}`);
283 const exists = await fs.stat(dest).then(() => true, () => false); 296 const exists = await fs.stat(dest).then(() => true, () => false);
284 if (!exists) { 297 if (!exists) {
285 await state.updateServerVersion(undefined); 298 await state.updateServerVersion(undefined);
@@ -296,7 +309,7 @@ async function getServer(config: Config, state: PersistentState): Promise<string
296 } 309 }
297 310
298 const release = await fetchRelease(config.package.releaseTag); 311 const release = await fetchRelease(config.package.releaseTag);
299 const artifact = release.assets.find(artifact => artifact.name === binaryName); 312 const artifact = release.assets.find(artifact => artifact.name === `rust-analyzer-${platform}.gz`);
300 assert(!!artifact, `Bad release: ${JSON.stringify(release)}`); 313 assert(!!artifact, `Bad release: ${JSON.stringify(release)}`);
301 314
302 // Unlinking the exe file before moving new one on its place should prevent ETXTBSY error. 315 // Unlinking the exe file before moving new one on its place should prevent ETXTBSY error.
@@ -308,6 +321,7 @@ async function getServer(config: Config, state: PersistentState): Promise<string
308 url: artifact.browser_download_url, 321 url: artifact.browser_download_url,
309 dest, 322 dest,
310 progressTitle: "Downloading rust-analyzer server", 323 progressTitle: "Downloading rust-analyzer server",
324 gunzip: true,
311 mode: 0o755 325 mode: 0o755
312 }); 326 });
313 327
diff --git a/editors/code/src/net.ts b/editors/code/src/net.ts
index 866092882..681eaa9c9 100644
--- a/editors/code/src/net.ts
+++ b/editors/code/src/net.ts
@@ -1,8 +1,12 @@
1import fetch from "node-fetch"; 1// Replace with `import fetch from "node-fetch"` once this is fixed in rollup:
2// https://github.com/rollup/plugins/issues/491
3const fetch = require("node-fetch") as typeof import("node-fetch")["default"];
4
2import * as vscode from "vscode"; 5import * as vscode from "vscode";
3import * as stream from "stream"; 6import * as stream from "stream";
4import * as crypto from "crypto"; 7import * as crypto from "crypto";
5import * as fs from "fs"; 8import * as fs from "fs";
9import * as zlib from "zlib";
6import * as util from "util"; 10import * as util from "util";
7import * as path from "path"; 11import * as path from "path";
8import { log, assert } from "./util"; 12import { log, assert } from "./util";
@@ -65,6 +69,7 @@ interface DownloadOpts {
65 url: string; 69 url: string;
66 dest: string; 70 dest: string;
67 mode?: number; 71 mode?: number;
72 gunzip?: boolean;
68} 73}
69 74
70export async function download(opts: DownloadOpts) { 75export async function download(opts: DownloadOpts) {
@@ -82,7 +87,7 @@ export async function download(opts: DownloadOpts) {
82 }, 87 },
83 async (progress, _cancellationToken) => { 88 async (progress, _cancellationToken) => {
84 let lastPercentage = 0; 89 let lastPercentage = 0;
85 await downloadFile(opts.url, tempFile, opts.mode, (readBytes, totalBytes) => { 90 await downloadFile(opts.url, tempFile, opts.mode, !!opts.gunzip, (readBytes, totalBytes) => {
86 const newPercentage = (readBytes / totalBytes) * 100; 91 const newPercentage = (readBytes / totalBytes) * 100;
87 progress.report({ 92 progress.report({
88 message: newPercentage.toFixed(0) + "%", 93 message: newPercentage.toFixed(0) + "%",
@@ -97,16 +102,11 @@ export async function download(opts: DownloadOpts) {
97 await fs.promises.rename(tempFile, opts.dest); 102 await fs.promises.rename(tempFile, opts.dest);
98} 103}
99 104
100/**
101 * Downloads file from `url` and stores it at `destFilePath` with `mode` (unix permissions).
102 * `onProgress` callback is called on recieveing each chunk of bytes
103 * to track the progress of downloading, it gets the already read and total
104 * amount of bytes to read as its parameters.
105 */
106async function downloadFile( 105async function downloadFile(
107 url: string, 106 url: string,
108 destFilePath: fs.PathLike, 107 destFilePath: fs.PathLike,
109 mode: number | undefined, 108 mode: number | undefined,
109 gunzip: boolean,
110 onProgress: (readBytes: number, totalBytes: number) => void 110 onProgress: (readBytes: number, totalBytes: number) => void
111): Promise<void> { 111): Promise<void> {
112 const res = await fetch(url); 112 const res = await fetch(url);
@@ -130,7 +130,10 @@ async function downloadFile(
130 }); 130 });
131 131
132 const destFileStream = fs.createWriteStream(destFilePath, { mode }); 132 const destFileStream = fs.createWriteStream(destFilePath, { mode });
133 await pipeline(res.body, destFileStream); 133 const srcStream = gunzip ? res.body.pipe(zlib.createGunzip()) : res.body;
134
135 await pipeline(srcStream, destFileStream);
136
134 await new Promise<void>(resolve => { 137 await new Promise<void>(resolve => {
135 destFileStream.on("close", resolve); 138 destFileStream.on("close", resolve);
136 destFileStream.destroy(); 139 destFileStream.destroy();
diff --git a/editors/code/src/persistent_state.ts b/editors/code/src/persistent_state.ts
index 138d11b89..5705eed81 100644
--- a/editors/code/src/persistent_state.ts
+++ b/editors/code/src/persistent_state.ts
@@ -4,7 +4,7 @@ import { log } from './util';
4export class PersistentState { 4export class PersistentState {
5 constructor(private readonly globalState: vscode.Memento) { 5 constructor(private readonly globalState: vscode.Memento) {
6 const { lastCheck, releaseId, serverVersion } = this; 6 const { lastCheck, releaseId, serverVersion } = this;
7 log.debug("PersistentState: ", { lastCheck, releaseId, serverVersion }); 7 log.info("PersistentState:", { lastCheck, releaseId, serverVersion });
8 } 8 }
9 9
10 /** 10 /**
diff --git a/editors/code/src/run.ts b/editors/code/src/run.ts
index 766b05112..de68f27ae 100644
--- a/editors/code/src/run.ts
+++ b/editors/code/src/run.ts
@@ -5,7 +5,7 @@ import * as tasks from './tasks';
5 5
6import { Ctx } from './ctx'; 6import { Ctx } from './ctx';
7import { makeDebugConfig } from './debug'; 7import { makeDebugConfig } from './debug';
8import { Config } from './config'; 8import { Config, RunnableEnvCfg } from './config';
9 9
10const quickPickButtons = [{ iconPath: new vscode.ThemeIcon("save"), tooltip: "Save as a launch.json configurtation." }]; 10const quickPickButtons = [{ iconPath: new vscode.ThemeIcon("save"), tooltip: "Save as a launch.json configurtation." }];
11 11
@@ -96,6 +96,30 @@ export class RunnableQuickPick implements vscode.QuickPickItem {
96 } 96 }
97} 97}
98 98
99export function prepareEnv(runnable: ra.Runnable, runnableEnvCfg: RunnableEnvCfg): Record<string, string> {
100 const env: Record<string, string> = { "RUST_BACKTRACE": "short" };
101
102 if (runnable.args.expectTest) {
103 env["UPDATE_EXPECT"] = "1";
104 }
105
106 Object.assign(env, process.env as { [key: string]: string });
107
108 if (runnableEnvCfg) {
109 if (Array.isArray(runnableEnvCfg)) {
110 for (const it of runnableEnvCfg) {
111 if (!it.mask || new RegExp(it.mask).test(runnable.label)) {
112 Object.assign(env, it.env);
113 }
114 }
115 } else {
116 Object.assign(env, runnableEnvCfg);
117 }
118 }
119
120 return env;
121}
122
99export async function createTask(runnable: ra.Runnable, config: Config): Promise<vscode.Task> { 123export async function createTask(runnable: ra.Runnable, config: Config): Promise<vscode.Task> {
100 if (runnable.kind !== "cargo") { 124 if (runnable.kind !== "cargo") {
101 // rust-analyzer supports only one kind, "cargo" 125 // rust-analyzer supports only one kind, "cargo"
@@ -108,12 +132,13 @@ export async function createTask(runnable: ra.Runnable, config: Config): Promise
108 if (runnable.args.executableArgs.length > 0) { 132 if (runnable.args.executableArgs.length > 0) {
109 args.push('--', ...runnable.args.executableArgs); 133 args.push('--', ...runnable.args.executableArgs);
110 } 134 }
135
111 const definition: tasks.CargoTaskDefinition = { 136 const definition: tasks.CargoTaskDefinition = {
112 type: tasks.TASK_TYPE, 137 type: tasks.TASK_TYPE,
113 command: args[0], // run, test, etc... 138 command: args[0], // run, test, etc...
114 args: args.slice(1), 139 args: args.slice(1),
115 cwd: runnable.args.workspaceRoot, 140 cwd: runnable.args.workspaceRoot || ".",
116 env: Object.assign({}, process.env as { [key: string]: string }, { "RUST_BACKTRACE": "short" }), 141 env: prepareEnv(runnable, config.runnableEnv),
117 }; 142 };
118 143
119 const target = vscode.workspace.workspaceFolders![0]; // safe, see main activate() 144 const target = vscode.workspace.workspaceFolders![0]; // safe, see main activate()
diff --git a/editors/code/src/snippets.ts b/editors/code/src/snippets.ts
index bcb3f2cc7..258b49982 100644
--- a/editors/code/src/snippets.ts
+++ b/editors/code/src/snippets.ts
@@ -6,6 +6,10 @@ export async function applySnippetWorkspaceEdit(edit: vscode.WorkspaceEdit) {
6 assert(edit.entries().length === 1, `bad ws edit: ${JSON.stringify(edit)}`); 6 assert(edit.entries().length === 1, `bad ws edit: ${JSON.stringify(edit)}`);
7 const [uri, edits] = edit.entries()[0]; 7 const [uri, edits] = edit.entries()[0];
8 8
9 if (vscode.window.activeTextEditor?.document.uri !== uri) {
10 // `vscode.window.visibleTextEditors` only contains editors whose contents are being displayed
11 await vscode.window.showTextDocument(uri, {});
12 }
9 const editor = vscode.window.visibleTextEditors.find((it) => it.document.uri.toString() === uri.toString()); 13 const editor = vscode.window.visibleTextEditors.find((it) => it.document.uri.toString() === uri.toString());
10 if (!editor) return; 14 if (!editor) return;
11 await applySnippetTextEdits(editor, edits); 15 await applySnippetTextEdits(editor, edits);
diff --git a/editors/code/src/util.ts b/editors/code/src/util.ts
index fec4c3295..970fedb37 100644
--- a/editors/code/src/util.ts
+++ b/editors/code/src/util.ts
@@ -2,6 +2,7 @@ import * as lc from "vscode-languageclient";
2import * as vscode from "vscode"; 2import * as vscode from "vscode";
3import { strict as nativeAssert } from "assert"; 3import { strict as nativeAssert } from "assert";
4import { spawnSync } from "child_process"; 4import { spawnSync } from "child_process";
5import { inspect } from "util";
5 6
6export function assert(condition: boolean, explanation: string): asserts condition { 7export function assert(condition: boolean, explanation: string): asserts condition {
7 try { 8 try {
@@ -14,21 +15,46 @@ export function assert(condition: boolean, explanation: string): asserts conditi
14 15
15export const log = new class { 16export const log = new class {
16 private enabled = true; 17 private enabled = true;
18 private readonly output = vscode.window.createOutputChannel("Rust Analyzer Client");
17 19
18 setEnabled(yes: boolean): void { 20 setEnabled(yes: boolean): void {
19 log.enabled = yes; 21 log.enabled = yes;
20 } 22 }
21 23
22 debug(message?: any, ...optionalParams: any[]): void { 24 // Hint: the type [T, ...T[]] means a non-empty array
25 debug(...msg: [unknown, ...unknown[]]): void {
23 if (!log.enabled) return; 26 if (!log.enabled) return;
24 // eslint-disable-next-line no-console 27 log.write("DEBUG", ...msg);
25 console.log(message, ...optionalParams); 28 log.output.toString();
26 } 29 }
27 30
28 error(message?: any, ...optionalParams: any[]): void { 31 info(...msg: [unknown, ...unknown[]]): void {
32 log.write("INFO", ...msg);
33 }
34
35 warn(...msg: [unknown, ...unknown[]]): void {
36 debugger;
37 log.write("WARN", ...msg);
38 }
39
40 error(...msg: [unknown, ...unknown[]]): void {
29 debugger; 41 debugger;
30 // eslint-disable-next-line no-console 42 log.write("ERROR", ...msg);
31 console.error(message, ...optionalParams); 43 log.output.show(true);
44 }
45
46 private write(label: string, ...messageParts: unknown[]): void {
47 const message = messageParts.map(log.stringify).join(" ");
48 const dateTime = new Date().toLocaleString();
49 log.output.appendLine(`${label} [${dateTime}]: ${message}`);
50 }
51
52 private stringify(val: unknown): string {
53 if (typeof val === "string") return val;
54 return inspect(val, {
55 colors: false,
56 depth: 6, // heuristic
57 });
32 } 58 }
33}; 59};
34 60
@@ -46,7 +72,7 @@ export async function sendRequestWithRetry<TParam, TRet>(
46 ); 72 );
47 } catch (error) { 73 } catch (error) {
48 if (delay === null) { 74 if (delay === null) {
49 log.error("LSP request timed out", { method: reqType.method, param, error }); 75 log.warn("LSP request timed out", { method: reqType.method, param, error });
50 throw error; 76 throw error;
51 } 77 }
52 78
@@ -55,7 +81,7 @@ export async function sendRequestWithRetry<TParam, TRet>(
55 } 81 }
56 82
57 if (error.code !== lc.ErrorCodes.ContentModified) { 83 if (error.code !== lc.ErrorCodes.ContentModified) {
58 log.error("LSP request failed", { method: reqType.method, param, error }); 84 log.warn("LSP request failed", { method: reqType.method, param, error });
59 throw error; 85 throw error;
60 } 86 }
61 87
@@ -89,7 +115,8 @@ export function isValidExecutable(path: string): boolean {
89 115
90 const res = spawnSync(path, ["--version"], { encoding: 'utf8' }); 116 const res = spawnSync(path, ["--version"], { encoding: 'utf8' });
91 117
92 log.debug(res, "--version output:", res.output); 118 const printOutput = res.error && (res.error as any).code !== 'ENOENT' ? log.warn : log.debug;
119 printOutput(path, "--version:", res);
93 120
94 return res.status === 0; 121 return res.status === 0;
95} 122}
diff --git a/editors/code/tests/unit/index.ts b/editors/code/tests/unit/index.ts
index 5165720b4..b7d8d2144 100644
--- a/editors/code/tests/unit/index.ts
+++ b/editors/code/tests/unit/index.ts
@@ -1,6 +1,6 @@
1import * as path from 'path'; 1import * as path from 'path';
2import Mocha from 'mocha'; 2import * as Mocha from 'mocha';
3import glob from 'glob'; 3import * as glob from 'glob';
4 4
5export function run(): Promise<void> { 5export function run(): Promise<void> {
6 // Create the mocha test 6 // Create the mocha test
diff --git a/editors/code/tests/unit/runnable_env.test.ts b/editors/code/tests/unit/runnable_env.test.ts
new file mode 100644
index 000000000..f2f53e91a
--- /dev/null
+++ b/editors/code/tests/unit/runnable_env.test.ts
@@ -0,0 +1,118 @@
1import * as assert from 'assert';
2import { prepareEnv } from '../../src/run';
3import { RunnableEnvCfg } from '../../src/config';
4import * as ra from '../../src/lsp_ext';
5
6function makeRunnable(label: string): ra.Runnable {
7 return {
8 label,
9 kind: "cargo",
10 args: {
11 cargoArgs: [],
12 executableArgs: []
13 }
14 };
15}
16
17function fakePrepareEnv(runnableName: string, config: RunnableEnvCfg): Record<string, string> {
18 const runnable = makeRunnable(runnableName);
19 return prepareEnv(runnable, config);
20}
21
22suite('Runnable env', () => {
23 test('Global config works', () => {
24 const binEnv = fakePrepareEnv("run project_name", { "GLOBAL": "g" });
25 assert.equal(binEnv["GLOBAL"], "g");
26
27 const testEnv = fakePrepareEnv("test some::mod::test_name", { "GLOBAL": "g" });
28 assert.equal(testEnv["GLOBAL"], "g");
29 });
30
31 test('null mask works', () => {
32 const config = [
33 {
34 env: { DATA: "data" }
35 }
36 ];
37 const binEnv = fakePrepareEnv("run project_name", config);
38 assert.equal(binEnv["DATA"], "data");
39
40 const testEnv = fakePrepareEnv("test some::mod::test_name", config);
41 assert.equal(testEnv["DATA"], "data");
42 });
43
44 test('order works', () => {
45 const config = [
46 {
47 env: { DATA: "data" }
48 },
49 {
50 env: { DATA: "newdata" }
51 }
52 ];
53 const binEnv = fakePrepareEnv("run project_name", config);
54 assert.equal(binEnv["DATA"], "newdata");
55
56 const testEnv = fakePrepareEnv("test some::mod::test_name", config);
57 assert.equal(testEnv["DATA"], "newdata");
58 });
59
60 test('mask works', () => {
61 const config = [
62 {
63 env: { DATA: "data" }
64 },
65 {
66 mask: "^run",
67 env: { DATA: "rundata" }
68 },
69 {
70 mask: "special_test$",
71 env: { DATA: "special_test" }
72 }
73 ];
74 const binEnv = fakePrepareEnv("run project_name", config);
75 assert.equal(binEnv["DATA"], "rundata");
76
77 const testEnv = fakePrepareEnv("test some::mod::test_name", config);
78 assert.equal(testEnv["DATA"], "data");
79
80 const specialTestEnv = fakePrepareEnv("test some::mod::special_test", config);
81 assert.equal(specialTestEnv["DATA"], "special_test");
82 });
83
84 test('exact test name works', () => {
85 const config = [
86 {
87 env: { DATA: "data" }
88 },
89 {
90 mask: "some::mod::test_name",
91 env: { DATA: "test special" }
92 }
93 ];
94 const testEnv = fakePrepareEnv("test some::mod::test_name", config);
95 assert.equal(testEnv["DATA"], "test special");
96
97 const specialTestEnv = fakePrepareEnv("test some::mod::another_test", config);
98 assert.equal(specialTestEnv["DATA"], "data");
99 });
100
101 test('test mod name works', () => {
102 const config = [
103 {
104 env: { DATA: "data" }
105 },
106 {
107 mask: "some::mod",
108 env: { DATA: "mod special" }
109 }
110 ];
111 const testEnv = fakePrepareEnv("test some::mod::test_name", config);
112 assert.equal(testEnv["DATA"], "mod special");
113
114 const specialTestEnv = fakePrepareEnv("test some::mod::another_test", config);
115 assert.equal(specialTestEnv["DATA"], "mod special");
116 });
117
118});
diff --git a/editors/code/tsconfig.json b/editors/code/tsconfig.json
index 32d1a865f..c9f348241 100644
--- a/editors/code/tsconfig.json
+++ b/editors/code/tsconfig.json
@@ -6,8 +6,6 @@
6 "lib": [ 6 "lib": [
7 "es2019" 7 "es2019"
8 ], 8 ],
9 "esModuleInterop": true,
10 "allowSyntheticDefaultImports": true,
11 "sourceMap": true, 9 "sourceMap": true,
12 "rootDir": ".", 10 "rootDir": ".",
13 "strict": true, 11 "strict": true,