aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.toml4
-rw-r--r--codeless/.gitignore6
-rw-r--r--codeless/.npmrc4
-rw-r--r--codeless/.vscode/launch.json19
-rw-r--r--codeless/.vscode/settings.json10
-rw-r--r--codeless/.vscode/tasks.json31
-rw-r--r--codeless/package-lock.json2381
-rw-r--r--codeless/package.json41
-rw-r--r--codeless/server/.gitignore1
-rw-r--r--codeless/server/Cargo.toml16
-rw-r--r--codeless/server/src/caps.rs23
-rw-r--r--codeless/server/src/dispatch.rs124
-rw-r--r--codeless/server/src/io.rs201
-rw-r--r--codeless/server/src/main.rs84
-rw-r--r--codeless/server/src/req.rs16
-rw-r--r--codeless/server/target/.rustc_info.json1
-rw-r--r--codeless/server/target/debug/.cargo-lock0
-rw-r--r--codeless/server/target/debug/libm.d1
-rw-r--r--codeless/server/target/debug/libm.rmeta0
-rw-r--r--codeless/src/extension.ts88
-rw-r--r--codeless/tsconfig.json12
-rw-r--r--libanalysis/Cargo.toml9
-rw-r--r--libanalysis/src/lib.rs107
-rw-r--r--libeditor/src/lib.rs165
-rw-r--r--src/ast/generated.rs6
-rw-r--r--src/ast/generated.rs.tera2
26 files changed, 3258 insertions, 94 deletions
diff --git a/Cargo.toml b/Cargo.toml
index f03ce76c9..77f9c4a8d 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -5,7 +5,7 @@ authors = ["Aleksey Kladov <[email protected]>"]
5license = "MIT OR Apache-2.0" 5license = "MIT OR Apache-2.0"
6 6
7[workspace] 7[workspace]
8members = [ "tools", "cli", "libeditor" ] 8members = [ "tools", "cli", "libeditor", "libanalysis" ]
9 9
10[dependencies] 10[dependencies]
11unicode-xid = "0.1.0" 11unicode-xid = "0.1.0"
@@ -18,4 +18,4 @@ parking_lot = "0.6.0"
18testutils = { path = "./tests/testutils" } 18testutils = { path = "./tests/testutils" }
19 19
20[profile.release] 20[profile.release]
21debug = true \ No newline at end of file 21debug = true
diff --git a/codeless/.gitignore b/codeless/.gitignore
new file mode 100644
index 000000000..c3f44bc49
--- /dev/null
+++ b/codeless/.gitignore
@@ -0,0 +1,6 @@
1target
2index.node
3artifacts.json
4*.vsix
5out/*
6node_modules/*
diff --git a/codeless/.npmrc b/codeless/.npmrc
new file mode 100644
index 000000000..ac8f24bde
--- /dev/null
+++ b/codeless/.npmrc
@@ -0,0 +1,4 @@
1runtime = electron
2target = 1.7.9
3target_arch = x64
4disturl = https://atom.io/download/atom-shell
diff --git a/codeless/.vscode/launch.json b/codeless/.vscode/launch.json
new file mode 100644
index 000000000..64f2c3693
--- /dev/null
+++ b/codeless/.vscode/launch.json
@@ -0,0 +1,19 @@
1{
2 // Use IntelliSense to learn about possible attributes.
3 // Hover to view descriptions of existing attributes.
4 // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
5 "version": "0.2.0",
6 "configurations": [
7 {
8 "name": "Launch Extension",
9 "type": "extensionHost",
10 "request": "launch",
11 "runtimeExecutable": "${execPath}",
12 "args": ["--extensionDevelopmentPath=${workspaceRoot}"],
13 "stopOnEntry": false,
14 "sourceMaps": true,
15 "outFiles": [ "${workspaceRoot}/out/src/**/*.js" ],
16 "preLaunchTask": "npm"
17 },
18 ]
19}
diff --git a/codeless/.vscode/settings.json b/codeless/.vscode/settings.json
new file mode 100644
index 000000000..580db9c6a
--- /dev/null
+++ b/codeless/.vscode/settings.json
@@ -0,0 +1,10 @@
1// Place your settings in this file to overwrite default and user settings.
2{
3 "files.exclude": {
4 "out": true,
5 "node_modules": true
6 },
7 "search.exclude": {
8 "out": true // set this to false to include "out" folder in search results
9 }
10} \ No newline at end of file
diff --git a/codeless/.vscode/tasks.json b/codeless/.vscode/tasks.json
new file mode 100644
index 000000000..8e5a8b9ef
--- /dev/null
+++ b/codeless/.vscode/tasks.json
@@ -0,0 +1,31 @@
1
2// Available variables which can be used inside of strings.
3// ${workspaceRoot}: the root folder of the team
4// ${file}: the current opened file
5// ${fileBasename}: the current opened file's basename
6// ${fileDirname}: the current opened file's dirname
7// ${fileExtname}: the current opened file's extension
8// ${cwd}: the current working directory of the spawned process
9
10// A task runner that calls a custom npm script that compiles the extension.
11{
12 "version": "0.2.0",
13
14 // we want to run npm
15 "command": "npm",
16
17 // the command is a shell script
18 "isShellCommand": true,
19
20 // show the output window only if unrecognized errors occur.
21 "showOutput": "silent",
22
23 // we run the custom script "compile" as defined in package.json
24 "args": ["run", "compile", "--loglevel", "silent"],
25
26 // The tsc compiler is started in watching mode
27 "isBackground": true,
28
29 // use the standard tsc in watch mode problem matcher to find compile problems in the output.
30 "problemMatcher": "$tsc-watch"
31}
diff --git a/codeless/package-lock.json b/codeless/package-lock.json
new file mode 100644
index 000000000..4f0d14bdf
--- /dev/null
+++ b/codeless/package-lock.json
@@ -0,0 +1,2381 @@
1{
2 "name": "libsyntax-rust",
3 "version": "0.0.1",
4 "lockfileVersion": 1,
5 "requires": true,
6 "dependencies": {
7 "@types/node": {
8 "version": "7.0.69",
9 "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.69.tgz",
10 "integrity": "sha512-S5NC8HV6HnRipg8nC0j30TPl7ktXjRTKqgyINLNe8K/64UJUI8Lq0sRopXC0hProsV2F5ibj8IqPkl1xpGggrw==",
11 "dev": true
12 },
13 "ajv": {
14 "version": "5.5.2",
15 "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
16 "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
17 "dev": true,
18 "requires": {
19 "co": "4.6.0",
20 "fast-deep-equal": "1.1.0",
21 "fast-json-stable-stringify": "2.0.0",
22 "json-schema-traverse": "0.3.1"
23 }
24 },
25 "ansi-cyan": {
26 "version": "0.1.1",
27 "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
28 "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
29 "dev": true,
30 "requires": {
31 "ansi-wrap": "0.1.0"
32 }
33 },
34 "ansi-red": {
35 "version": "0.1.1",
36 "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
37 "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
38 "dev": true,
39 "requires": {
40 "ansi-wrap": "0.1.0"
41 }
42 },
43 "ansi-wrap": {
44 "version": "0.1.0",
45 "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
46 "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
47 "dev": true
48 },
49 "argparse": {
50 "version": "1.0.10",
51 "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
52 "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
53 "dev": true,
54 "requires": {
55 "sprintf-js": "1.0.3"
56 }
57 },
58 "arr-diff": {
59 "version": "1.1.0",
60 "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
61 "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
62 "dev": true,
63 "requires": {
64 "arr-flatten": "1.1.0",
65 "array-slice": "0.2.3"
66 }
67 },
68 "arr-flatten": {
69 "version": "1.1.0",
70 "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
71 "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
72 "dev": true
73 },
74 "arr-union": {
75 "version": "2.1.0",
76 "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
77 "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
78 "dev": true
79 },
80 "array-differ": {
81 "version": "1.0.0",
82 "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz",
83 "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=",
84 "dev": true
85 },
86 "array-slice": {
87 "version": "0.2.3",
88 "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
89 "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
90 "dev": true
91 },
92 "array-union": {
93 "version": "1.0.2",
94 "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
95 "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
96 "dev": true,
97 "requires": {
98 "array-uniq": "1.0.3"
99 }
100 },
101 "array-uniq": {
102 "version": "1.0.3",
103 "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
104 "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
105 "dev": true
106 },
107 "array-unique": {
108 "version": "0.2.1",
109 "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz",
110 "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=",
111 "dev": true
112 },
113 "arrify": {
114 "version": "1.0.1",
115 "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
116 "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
117 "dev": true
118 },
119 "asn1": {
120 "version": "0.2.4",
121 "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
122 "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
123 "dev": true,
124 "requires": {
125 "safer-buffer": "2.1.2"
126 }
127 },
128 "assert-plus": {
129 "version": "1.0.0",
130 "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
131 "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
132 "dev": true
133 },
134 "asynckit": {
135 "version": "0.4.0",
136 "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
137 "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
138 "dev": true
139 },
140 "aws-sign2": {
141 "version": "0.7.0",
142 "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
143 "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
144 "dev": true
145 },
146 "aws4": {
147 "version": "1.8.0",
148 "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
149 "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
150 "dev": true
151 },
152 "balanced-match": {
153 "version": "1.0.0",
154 "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
155 "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
156 "dev": true
157 },
158 "bcrypt-pbkdf": {
159 "version": "1.0.2",
160 "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
161 "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
162 "dev": true,
163 "optional": true,
164 "requires": {
165 "tweetnacl": "0.14.5"
166 }
167 },
168 "block-stream": {
169 "version": "0.0.9",
170 "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz",
171 "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=",
172 "dev": true,
173 "requires": {
174 "inherits": "2.0.3"
175 }
176 },
177 "boolbase": {
178 "version": "1.0.0",
179 "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
180 "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
181 "dev": true
182 },
183 "brace-expansion": {
184 "version": "1.1.11",
185 "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
186 "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
187 "dev": true,
188 "requires": {
189 "balanced-match": "1.0.0",
190 "concat-map": "0.0.1"
191 }
192 },
193 "braces": {
194 "version": "1.8.5",
195 "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
196 "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
197 "dev": true,
198 "requires": {
199 "expand-range": "1.8.2",
200 "preserve": "0.2.0",
201 "repeat-element": "1.1.2"
202 }
203 },
204 "browser-stdout": {
205 "version": "1.3.0",
206 "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz",
207 "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=",
208 "dev": true
209 },
210 "buffer-crc32": {
211 "version": "0.2.13",
212 "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
213 "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=",
214 "dev": true
215 },
216 "buffer-from": {
217 "version": "1.1.1",
218 "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
219 "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
220 "dev": true
221 },
222 "caseless": {
223 "version": "0.12.0",
224 "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
225 "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
226 "dev": true
227 },
228 "cheerio": {
229 "version": "1.0.0-rc.2",
230 "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz",
231 "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=",
232 "dev": true,
233 "requires": {
234 "css-select": "1.2.0",
235 "dom-serializer": "0.1.0",
236 "entities": "1.1.1",
237 "htmlparser2": "3.9.2",
238 "lodash": "4.17.10",
239 "parse5": "3.0.3"
240 }
241 },
242 "clone": {
243 "version": "0.2.0",
244 "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
245 "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
246 "dev": true
247 },
248 "clone-buffer": {
249 "version": "1.0.0",
250 "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz",
251 "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=",
252 "dev": true
253 },
254 "clone-stats": {
255 "version": "0.0.1",
256 "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz",
257 "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=",
258 "dev": true
259 },
260 "cloneable-readable": {
261 "version": "1.1.2",
262 "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
263 "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
264 "dev": true,
265 "requires": {
266 "inherits": "2.0.3",
267 "process-nextick-args": "2.0.0",
268 "readable-stream": "2.3.6"
269 }
270 },
271 "co": {
272 "version": "4.6.0",
273 "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
274 "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
275 "dev": true
276 },
277 "combined-stream": {
278 "version": "1.0.6",
279 "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
280 "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
281 "dev": true,
282 "requires": {
283 "delayed-stream": "1.0.0"
284 }
285 },
286 "commander": {
287 "version": "2.17.1",
288 "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz",
289 "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==",
290 "dev": true
291 },
292 "concat-map": {
293 "version": "0.0.1",
294 "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
295 "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
296 "dev": true
297 },
298 "convert-source-map": {
299 "version": "1.5.1",
300 "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
301 "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
302 "dev": true
303 },
304 "core-util-is": {
305 "version": "1.0.2",
306 "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
307 "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
308 "dev": true
309 },
310 "css-select": {
311 "version": "1.2.0",
312 "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
313 "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
314 "dev": true,
315 "requires": {
316 "boolbase": "1.0.0",
317 "css-what": "2.1.0",
318 "domutils": "1.5.1",
319 "nth-check": "1.0.1"
320 }
321 },
322 "css-what": {
323 "version": "2.1.0",
324 "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz",
325 "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=",
326 "dev": true
327 },
328 "dashdash": {
329 "version": "1.14.1",
330 "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
331 "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
332 "dev": true,
333 "requires": {
334 "assert-plus": "1.0.0"
335 }
336 },
337 "debug": {
338 "version": "3.1.0",
339 "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
340 "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
341 "dev": true,
342 "requires": {
343 "ms": "2.0.0"
344 }
345 },
346 "deep-assign": {
347 "version": "1.0.0",
348 "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz",
349 "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=",
350 "dev": true,
351 "requires": {
352 "is-obj": "1.0.1"
353 }
354 },
355 "delayed-stream": {
356 "version": "1.0.0",
357 "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
358 "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
359 "dev": true
360 },
361 "denodeify": {
362 "version": "1.2.1",
363 "resolved": "https://registry.npmjs.org/denodeify/-/denodeify-1.2.1.tgz",
364 "integrity": "sha1-OjYof1A05pnnV3kBBSwubJQlFjE=",
365 "dev": true
366 },
367 "diff": {
368 "version": "3.3.1",
369 "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz",
370 "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==",
371 "dev": true
372 },
373 "dom-serializer": {
374 "version": "0.1.0",
375 "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
376 "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
377 "dev": true,
378 "requires": {
379 "domelementtype": "1.1.3",
380 "entities": "1.1.1"
381 },
382 "dependencies": {
383 "domelementtype": {
384 "version": "1.1.3",
385 "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
386 "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=",
387 "dev": true
388 }
389 }
390 },
391 "domelementtype": {
392 "version": "1.3.0",
393 "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
394 "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=",
395 "dev": true
396 },
397 "domhandler": {
398 "version": "2.4.2",
399 "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
400 "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
401 "dev": true,
402 "requires": {
403 "domelementtype": "1.3.0"
404 }
405 },
406 "domutils": {
407 "version": "1.5.1",
408 "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
409 "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
410 "dev": true,
411 "requires": {
412 "dom-serializer": "0.1.0",
413 "domelementtype": "1.3.0"
414 }
415 },
416 "duplexer": {
417 "version": "0.1.1",
418 "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz",
419 "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=",
420 "dev": true
421 },
422 "duplexify": {
423 "version": "3.6.0",
424 "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz",
425 "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==",
426 "dev": true,
427 "requires": {
428 "end-of-stream": "1.4.1",
429 "inherits": "2.0.3",
430 "readable-stream": "2.3.6",
431 "stream-shift": "1.0.0"
432 }
433 },
434 "ecc-jsbn": {
435 "version": "0.1.2",
436 "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
437 "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
438 "dev": true,
439 "optional": true,
440 "requires": {
441 "jsbn": "0.1.1",
442 "safer-buffer": "2.1.2"
443 }
444 },
445 "end-of-stream": {
446 "version": "1.4.1",
447 "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
448 "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
449 "dev": true,
450 "requires": {
451 "once": "1.4.0"
452 }
453 },
454 "entities": {
455 "version": "1.1.1",
456 "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
457 "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=",
458 "dev": true
459 },
460 "escape-string-regexp": {
461 "version": "1.0.5",
462 "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
463 "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
464 "dev": true
465 },
466 "event-stream": {
467 "version": "3.3.4",
468 "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
469 "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
470 "dev": true,
471 "requires": {
472 "duplexer": "0.1.1",
473 "from": "0.1.7",
474 "map-stream": "0.1.0",
475 "pause-stream": "0.0.11",
476 "split": "0.3.3",
477 "stream-combiner": "0.0.4",
478 "through": "2.3.8"
479 }
480 },
481 "expand-brackets": {
482 "version": "0.1.5",
483 "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
484 "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
485 "dev": true,
486 "requires": {
487 "is-posix-bracket": "0.1.1"
488 }
489 },
490 "expand-range": {
491 "version": "1.8.2",
492 "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz",
493 "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=",
494 "dev": true,
495 "requires": {
496 "fill-range": "2.2.4"
497 }
498 },
499 "extend": {
500 "version": "3.0.2",
501 "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
502 "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
503 "dev": true
504 },
505 "extend-shallow": {
506 "version": "1.1.4",
507 "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
508 "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
509 "dev": true,
510 "requires": {
511 "kind-of": "1.1.0"
512 }
513 },
514 "extglob": {
515 "version": "0.3.2",
516 "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
517 "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
518 "dev": true,
519 "requires": {
520 "is-extglob": "1.0.0"
521 },
522 "dependencies": {
523 "is-extglob": {
524 "version": "1.0.0",
525 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
526 "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
527 "dev": true
528 }
529 }
530 },
531 "extsprintf": {
532 "version": "1.3.0",
533 "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
534 "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
535 "dev": true
536 },
537 "fast-deep-equal": {
538 "version": "1.1.0",
539 "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
540 "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
541 "dev": true
542 },
543 "fast-json-stable-stringify": {
544 "version": "2.0.0",
545 "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
546 "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
547 "dev": true
548 },
549 "fd-slicer": {
550 "version": "1.1.0",
551 "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
552 "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
553 "dev": true,
554 "requires": {
555 "pend": "1.2.0"
556 }
557 },
558 "filename-regex": {
559 "version": "2.0.1",
560 "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz",
561 "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=",
562 "dev": true
563 },
564 "fill-range": {
565 "version": "2.2.4",
566 "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz",
567 "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==",
568 "dev": true,
569 "requires": {
570 "is-number": "2.1.0",
571 "isobject": "2.1.0",
572 "randomatic": "3.1.0",
573 "repeat-element": "1.1.2",
574 "repeat-string": "1.6.1"
575 }
576 },
577 "first-chunk-stream": {
578 "version": "1.0.0",
579 "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz",
580 "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=",
581 "dev": true
582 },
583 "for-in": {
584 "version": "1.0.2",
585 "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
586 "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
587 "dev": true
588 },
589 "for-own": {
590 "version": "0.1.5",
591 "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
592 "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=",
593 "dev": true,
594 "requires": {
595 "for-in": "1.0.2"
596 }
597 },
598 "forever-agent": {
599 "version": "0.6.1",
600 "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
601 "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
602 "dev": true
603 },
604 "form-data": {
605 "version": "2.3.2",
606 "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
607 "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
608 "dev": true,
609 "requires": {
610 "asynckit": "0.4.0",
611 "combined-stream": "1.0.6",
612 "mime-types": "2.1.19"
613 }
614 },
615 "from": {
616 "version": "0.1.7",
617 "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz",
618 "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=",
619 "dev": true
620 },
621 "fs.realpath": {
622 "version": "1.0.0",
623 "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
624 "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
625 "dev": true
626 },
627 "fstream": {
628 "version": "1.0.11",
629 "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz",
630 "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=",
631 "dev": true,
632 "requires": {
633 "graceful-fs": "4.1.11",
634 "inherits": "2.0.3",
635 "mkdirp": "0.5.1",
636 "rimraf": "2.6.2"
637 }
638 },
639 "getpass": {
640 "version": "0.1.7",
641 "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
642 "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
643 "dev": true,
644 "requires": {
645 "assert-plus": "1.0.0"
646 }
647 },
648 "glob": {
649 "version": "7.1.2",
650 "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
651 "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
652 "dev": true,
653 "requires": {
654 "fs.realpath": "1.0.0",
655 "inflight": "1.0.6",
656 "inherits": "2.0.3",
657 "minimatch": "3.0.4",
658 "once": "1.4.0",
659 "path-is-absolute": "1.0.1"
660 }
661 },
662 "glob-base": {
663 "version": "0.3.0",
664 "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
665 "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
666 "dev": true,
667 "requires": {
668 "glob-parent": "2.0.0",
669 "is-glob": "2.0.1"
670 },
671 "dependencies": {
672 "glob-parent": {
673 "version": "2.0.0",
674 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
675 "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
676 "dev": true,
677 "requires": {
678 "is-glob": "2.0.1"
679 }
680 },
681 "is-extglob": {
682 "version": "1.0.0",
683 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
684 "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
685 "dev": true
686 },
687 "is-glob": {
688 "version": "2.0.1",
689 "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
690 "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
691 "dev": true,
692 "requires": {
693 "is-extglob": "1.0.0"
694 }
695 }
696 }
697 },
698 "glob-parent": {
699 "version": "3.1.0",
700 "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
701 "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
702 "dev": true,
703 "requires": {
704 "is-glob": "3.1.0",
705 "path-dirname": "1.0.2"
706 }
707 },
708 "glob-stream": {
709 "version": "5.3.5",
710 "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz",
711 "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=",
712 "dev": true,
713 "requires": {
714 "extend": "3.0.2",
715 "glob": "5.0.15",
716 "glob-parent": "3.1.0",
717 "micromatch": "2.3.11",
718 "ordered-read-streams": "0.3.0",
719 "through2": "0.6.5",
720 "to-absolute-glob": "0.1.1",
721 "unique-stream": "2.2.1"
722 },
723 "dependencies": {
724 "glob": {
725 "version": "5.0.15",
726 "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
727 "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
728 "dev": true,
729 "requires": {
730 "inflight": "1.0.6",
731 "inherits": "2.0.3",
732 "minimatch": "3.0.4",
733 "once": "1.4.0",
734 "path-is-absolute": "1.0.1"
735 }
736 },
737 "isarray": {
738 "version": "0.0.1",
739 "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
740 "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
741 "dev": true
742 },
743 "readable-stream": {
744 "version": "1.0.34",
745 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
746 "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
747 "dev": true,
748 "requires": {
749 "core-util-is": "1.0.2",
750 "inherits": "2.0.3",
751 "isarray": "0.0.1",
752 "string_decoder": "0.10.31"
753 }
754 },
755 "string_decoder": {
756 "version": "0.10.31",
757 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
758 "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
759 "dev": true
760 },
761 "through2": {
762 "version": "0.6.5",
763 "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
764 "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
765 "dev": true,
766 "requires": {
767 "readable-stream": "1.0.34",
768 "xtend": "4.0.1"
769 }
770 }
771 }
772 },
773 "graceful-fs": {
774 "version": "4.1.11",
775 "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
776 "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
777 "dev": true
778 },
779 "growl": {
780 "version": "1.10.3",
781 "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
782 "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==",
783 "dev": true
784 },
785 "gulp-chmod": {
786 "version": "2.0.0",
787 "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz",
788 "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=",
789 "dev": true,
790 "requires": {
791 "deep-assign": "1.0.0",
792 "stat-mode": "0.2.2",
793 "through2": "2.0.3"
794 }
795 },
796 "gulp-filter": {
797 "version": "5.1.0",
798 "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz",
799 "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=",
800 "dev": true,
801 "requires": {
802 "multimatch": "2.1.0",
803 "plugin-error": "0.1.2",
804 "streamfilter": "1.0.7"
805 }
806 },
807 "gulp-gunzip": {
808 "version": "1.0.0",
809 "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz",
810 "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=",
811 "dev": true,
812 "requires": {
813 "through2": "0.6.5",
814 "vinyl": "0.4.6"
815 },
816 "dependencies": {
817 "isarray": {
818 "version": "0.0.1",
819 "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
820 "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
821 "dev": true
822 },
823 "readable-stream": {
824 "version": "1.0.34",
825 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz",
826 "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=",
827 "dev": true,
828 "requires": {
829 "core-util-is": "1.0.2",
830 "inherits": "2.0.3",
831 "isarray": "0.0.1",
832 "string_decoder": "0.10.31"
833 }
834 },
835 "string_decoder": {
836 "version": "0.10.31",
837 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
838 "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
839 "dev": true
840 },
841 "through2": {
842 "version": "0.6.5",
843 "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz",
844 "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=",
845 "dev": true,
846 "requires": {
847 "readable-stream": "1.0.34",
848 "xtend": "4.0.1"
849 }
850 }
851 }
852 },
853 "gulp-remote-src-vscode": {
854 "version": "0.5.0",
855 "resolved": "https://registry.npmjs.org/gulp-remote-src-vscode/-/gulp-remote-src-vscode-0.5.0.tgz",
856 "integrity": "sha512-/9vtSk9eI9DEWCqzGieglPqmx0WUQ9pwPHyHFpKmfxqdgqGJC2l0vFMdYs54hLdDsMDEZFLDL2J4ikjc4hQ5HQ==",
857 "dev": true,
858 "requires": {
859 "event-stream": "3.3.4",
860 "node.extend": "1.1.6",
861 "request": "2.87.0",
862 "through2": "2.0.3",
863 "vinyl": "2.2.0"
864 },
865 "dependencies": {
866 "clone": {
867 "version": "2.1.2",
868 "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
869 "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
870 "dev": true
871 },
872 "clone-stats": {
873 "version": "1.0.0",
874 "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
875 "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
876 "dev": true
877 },
878 "vinyl": {
879 "version": "2.2.0",
880 "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
881 "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
882 "dev": true,
883 "requires": {
884 "clone": "2.1.2",
885 "clone-buffer": "1.0.0",
886 "clone-stats": "1.0.0",
887 "cloneable-readable": "1.1.2",
888 "remove-trailing-separator": "1.1.0",
889 "replace-ext": "1.0.0"
890 }
891 }
892 }
893 },
894 "gulp-sourcemaps": {
895 "version": "1.6.0",
896 "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz",
897 "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=",
898 "dev": true,
899 "requires": {
900 "convert-source-map": "1.5.1",
901 "graceful-fs": "4.1.11",
902 "strip-bom": "2.0.0",
903 "through2": "2.0.3",
904 "vinyl": "1.2.0"
905 },
906 "dependencies": {
907 "clone": {
908 "version": "1.0.4",
909 "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
910 "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
911 "dev": true
912 },
913 "replace-ext": {
914 "version": "0.0.1",
915 "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
916 "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
917 "dev": true
918 },
919 "vinyl": {
920 "version": "1.2.0",
921 "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
922 "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
923 "dev": true,
924 "requires": {
925 "clone": "1.0.4",
926 "clone-stats": "0.0.1",
927 "replace-ext": "0.0.1"
928 }
929 }
930 }
931 },
932 "gulp-symdest": {
933 "version": "1.1.0",
934 "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz",
935 "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=",
936 "dev": true,
937 "requires": {
938 "event-stream": "3.3.4",
939 "mkdirp": "0.5.1",
940 "queue": "3.1.0",
941 "vinyl-fs": "2.4.4"
942 }
943 },
944 "gulp-untar": {
945 "version": "0.0.7",
946 "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.7.tgz",
947 "integrity": "sha512-0QfbCH2a1k2qkTLWPqTX+QO4qNsHn3kC546YhAP3/n0h+nvtyGITDuDrYBMDZeW4WnFijmkOvBWa5HshTic1tw==",
948 "dev": true,
949 "requires": {
950 "event-stream": "3.3.4",
951 "streamifier": "0.1.1",
952 "tar": "2.2.1",
953 "through2": "2.0.3",
954 "vinyl": "1.2.0"
955 },
956 "dependencies": {
957 "clone": {
958 "version": "1.0.4",
959 "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
960 "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
961 "dev": true
962 },
963 "replace-ext": {
964 "version": "0.0.1",
965 "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
966 "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
967 "dev": true
968 },
969 "vinyl": {
970 "version": "1.2.0",
971 "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
972 "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
973 "dev": true,
974 "requires": {
975 "clone": "1.0.4",
976 "clone-stats": "0.0.1",
977 "replace-ext": "0.0.1"
978 }
979 }
980 }
981 },
982 "gulp-vinyl-zip": {
983 "version": "2.1.0",
984 "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz",
985 "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=",
986 "dev": true,
987 "requires": {
988 "event-stream": "3.3.4",
989 "queue": "4.4.2",
990 "through2": "2.0.3",
991 "vinyl": "2.2.0",
992 "vinyl-fs": "2.4.4",
993 "yauzl": "2.10.0",
994 "yazl": "2.4.3"
995 },
996 "dependencies": {
997 "clone": {
998 "version": "2.1.2",
999 "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
1000 "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
1001 "dev": true
1002 },
1003 "clone-stats": {
1004 "version": "1.0.0",
1005 "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz",
1006 "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=",
1007 "dev": true
1008 },
1009 "queue": {
1010 "version": "4.4.2",
1011 "resolved": "https://registry.npmjs.org/queue/-/queue-4.4.2.tgz",
1012 "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==",
1013 "dev": true,
1014 "requires": {
1015 "inherits": "2.0.3"
1016 }
1017 },
1018 "vinyl": {
1019 "version": "2.2.0",
1020 "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.0.tgz",
1021 "integrity": "sha512-MBH+yP0kC/GQ5GwBqrTPTzEfiiLjta7hTtvQtbxBgTeSXsmKQRQecjibMbxIXzVT3Y9KJK+drOz1/k+vsu8Nkg==",
1022 "dev": true,
1023 "requires": {
1024 "clone": "2.1.2",
1025 "clone-buffer": "1.0.0",
1026 "clone-stats": "1.0.0",
1027 "cloneable-readable": "1.1.2",
1028 "remove-trailing-separator": "1.1.0",
1029 "replace-ext": "1.0.0"
1030 }
1031 }
1032 }
1033 },
1034 "har-schema": {
1035 "version": "2.0.0",
1036 "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
1037 "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
1038 "dev": true
1039 },
1040 "har-validator": {
1041 "version": "5.0.3",
1042 "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
1043 "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
1044 "dev": true,
1045 "requires": {
1046 "ajv": "5.5.2",
1047 "har-schema": "2.0.0"
1048 }
1049 },
1050 "has-flag": {
1051 "version": "2.0.0",
1052 "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
1053 "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
1054 "dev": true
1055 },
1056 "he": {
1057 "version": "1.1.1",
1058 "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
1059 "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
1060 "dev": true
1061 },
1062 "htmlparser2": {
1063 "version": "3.9.2",
1064 "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz",
1065 "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=",
1066 "dev": true,
1067 "requires": {
1068 "domelementtype": "1.3.0",
1069 "domhandler": "2.4.2",
1070 "domutils": "1.5.1",
1071 "entities": "1.1.1",
1072 "inherits": "2.0.3",
1073 "readable-stream": "2.3.6"
1074 }
1075 },
1076 "http-signature": {
1077 "version": "1.2.0",
1078 "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
1079 "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
1080 "dev": true,
1081 "requires": {
1082 "assert-plus": "1.0.0",
1083 "jsprim": "1.4.1",
1084 "sshpk": "1.14.2"
1085 }
1086 },
1087 "inflight": {
1088 "version": "1.0.6",
1089 "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
1090 "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
1091 "dev": true,
1092 "requires": {
1093 "once": "1.4.0",
1094 "wrappy": "1.0.2"
1095 }
1096 },
1097 "inherits": {
1098 "version": "2.0.3",
1099 "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
1100 "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
1101 "dev": true
1102 },
1103 "is": {
1104 "version": "3.2.1",
1105 "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz",
1106 "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=",
1107 "dev": true
1108 },
1109 "is-buffer": {
1110 "version": "1.1.6",
1111 "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
1112 "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
1113 "dev": true
1114 },
1115 "is-dotfile": {
1116 "version": "1.0.3",
1117 "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz",
1118 "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=",
1119 "dev": true
1120 },
1121 "is-equal-shallow": {
1122 "version": "0.1.3",
1123 "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz",
1124 "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=",
1125 "dev": true,
1126 "requires": {
1127 "is-primitive": "2.0.0"
1128 }
1129 },
1130 "is-extendable": {
1131 "version": "0.1.1",
1132 "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
1133 "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
1134 "dev": true
1135 },
1136 "is-extglob": {
1137 "version": "2.1.1",
1138 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
1139 "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
1140 "dev": true
1141 },
1142 "is-glob": {
1143 "version": "3.1.0",
1144 "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
1145 "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
1146 "dev": true,
1147 "requires": {
1148 "is-extglob": "2.1.1"
1149 }
1150 },
1151 "is-number": {
1152 "version": "2.1.0",
1153 "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
1154 "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
1155 "dev": true,
1156 "requires": {
1157 "kind-of": "3.2.2"
1158 },
1159 "dependencies": {
1160 "kind-of": {
1161 "version": "3.2.2",
1162 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
1163 "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
1164 "dev": true,
1165 "requires": {
1166 "is-buffer": "1.1.6"
1167 }
1168 }
1169 }
1170 },
1171 "is-obj": {
1172 "version": "1.0.1",
1173 "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz",
1174 "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=",
1175 "dev": true
1176 },
1177 "is-posix-bracket": {
1178 "version": "0.1.1",
1179 "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz",
1180 "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=",
1181 "dev": true
1182 },
1183 "is-primitive": {
1184 "version": "2.0.0",
1185 "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz",
1186 "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=",
1187 "dev": true
1188 },
1189 "is-stream": {
1190 "version": "1.1.0",
1191 "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
1192 "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
1193 "dev": true
1194 },
1195 "is-typedarray": {
1196 "version": "1.0.0",
1197 "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
1198 "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
1199 "dev": true
1200 },
1201 "is-utf8": {
1202 "version": "0.2.1",
1203 "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
1204 "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
1205 "dev": true
1206 },
1207 "is-valid-glob": {
1208 "version": "0.3.0",
1209 "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz",
1210 "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=",
1211 "dev": true
1212 },
1213 "isarray": {
1214 "version": "1.0.0",
1215 "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
1216 "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
1217 "dev": true
1218 },
1219 "isobject": {
1220 "version": "2.1.0",
1221 "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
1222 "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
1223 "dev": true,
1224 "requires": {
1225 "isarray": "1.0.0"
1226 }
1227 },
1228 "isstream": {
1229 "version": "0.1.2",
1230 "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
1231 "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
1232 "dev": true
1233 },
1234 "jsbn": {
1235 "version": "0.1.1",
1236 "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
1237 "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
1238 "dev": true,
1239 "optional": true
1240 },
1241 "json-schema": {
1242 "version": "0.2.3",
1243 "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
1244 "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
1245 "dev": true
1246 },
1247 "json-schema-traverse": {
1248 "version": "0.3.1",
1249 "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
1250 "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
1251 "dev": true
1252 },
1253 "json-stable-stringify": {
1254 "version": "1.0.1",
1255 "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
1256 "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
1257 "dev": true,
1258 "requires": {
1259 "jsonify": "0.0.0"
1260 }
1261 },
1262 "json-stringify-safe": {
1263 "version": "5.0.1",
1264 "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
1265 "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
1266 "dev": true
1267 },
1268 "jsonify": {
1269 "version": "0.0.0",
1270 "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
1271 "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
1272 "dev": true
1273 },
1274 "jsprim": {
1275 "version": "1.4.1",
1276 "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
1277 "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
1278 "dev": true,
1279 "requires": {
1280 "assert-plus": "1.0.0",
1281 "extsprintf": "1.3.0",
1282 "json-schema": "0.2.3",
1283 "verror": "1.10.0"
1284 }
1285 },
1286 "kind-of": {
1287 "version": "1.1.0",
1288 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
1289 "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
1290 "dev": true
1291 },
1292 "lazystream": {
1293 "version": "1.0.0",
1294 "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
1295 "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
1296 "dev": true,
1297 "requires": {
1298 "readable-stream": "2.3.6"
1299 }
1300 },
1301 "linkify-it": {
1302 "version": "2.0.3",
1303 "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.0.3.tgz",
1304 "integrity": "sha1-2UpGSPmxwXnWT6lykSaL22zpQ08=",
1305 "dev": true,
1306 "requires": {
1307 "uc.micro": "1.0.5"
1308 }
1309 },
1310 "lodash": {
1311 "version": "4.17.10",
1312 "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
1313 "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==",
1314 "dev": true
1315 },
1316 "lodash.isequal": {
1317 "version": "4.5.0",
1318 "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
1319 "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=",
1320 "dev": true
1321 },
1322 "map-stream": {
1323 "version": "0.1.0",
1324 "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
1325 "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
1326 "dev": true
1327 },
1328 "markdown-it": {
1329 "version": "8.4.2",
1330 "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz",
1331 "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==",
1332 "dev": true,
1333 "requires": {
1334 "argparse": "1.0.10",
1335 "entities": "1.1.1",
1336 "linkify-it": "2.0.3",
1337 "mdurl": "1.0.1",
1338 "uc.micro": "1.0.5"
1339 }
1340 },
1341 "math-random": {
1342 "version": "1.0.1",
1343 "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz",
1344 "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=",
1345 "dev": true
1346 },
1347 "mdurl": {
1348 "version": "1.0.1",
1349 "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
1350 "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=",
1351 "dev": true
1352 },
1353 "merge-stream": {
1354 "version": "1.0.1",
1355 "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz",
1356 "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=",
1357 "dev": true,
1358 "requires": {
1359 "readable-stream": "2.3.6"
1360 }
1361 },
1362 "micromatch": {
1363 "version": "2.3.11",
1364 "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
1365 "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
1366 "dev": true,
1367 "requires": {
1368 "arr-diff": "2.0.0",
1369 "array-unique": "0.2.1",
1370 "braces": "1.8.5",
1371 "expand-brackets": "0.1.5",
1372 "extglob": "0.3.2",
1373 "filename-regex": "2.0.1",
1374 "is-extglob": "1.0.0",
1375 "is-glob": "2.0.1",
1376 "kind-of": "3.2.2",
1377 "normalize-path": "2.1.1",
1378 "object.omit": "2.0.1",
1379 "parse-glob": "3.0.4",
1380 "regex-cache": "0.4.4"
1381 },
1382 "dependencies": {
1383 "arr-diff": {
1384 "version": "2.0.0",
1385 "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
1386 "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
1387 "dev": true,
1388 "requires": {
1389 "arr-flatten": "1.1.0"
1390 }
1391 },
1392 "is-extglob": {
1393 "version": "1.0.0",
1394 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
1395 "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
1396 "dev": true
1397 },
1398 "is-glob": {
1399 "version": "2.0.1",
1400 "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
1401 "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
1402 "dev": true,
1403 "requires": {
1404 "is-extglob": "1.0.0"
1405 }
1406 },
1407 "kind-of": {
1408 "version": "3.2.2",
1409 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
1410 "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
1411 "dev": true,
1412 "requires": {
1413 "is-buffer": "1.1.6"
1414 }
1415 }
1416 }
1417 },
1418 "mime": {
1419 "version": "1.6.0",
1420 "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
1421 "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
1422 "dev": true
1423 },
1424 "mime-db": {
1425 "version": "1.35.0",
1426 "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz",
1427 "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==",
1428 "dev": true
1429 },
1430 "mime-types": {
1431 "version": "2.1.19",
1432 "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz",
1433 "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==",
1434 "dev": true,
1435 "requires": {
1436 "mime-db": "1.35.0"
1437 }
1438 },
1439 "minimatch": {
1440 "version": "3.0.4",
1441 "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1442 "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1443 "dev": true,
1444 "requires": {
1445 "brace-expansion": "1.1.11"
1446 }
1447 },
1448 "minimist": {
1449 "version": "0.0.8",
1450 "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1451 "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
1452 "dev": true
1453 },
1454 "mkdirp": {
1455 "version": "0.5.1",
1456 "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1457 "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1458 "dev": true,
1459 "requires": {
1460 "minimist": "0.0.8"
1461 }
1462 },
1463 "mocha": {
1464 "version": "4.1.0",
1465 "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz",
1466 "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==",
1467 "dev": true,
1468 "requires": {
1469 "browser-stdout": "1.3.0",
1470 "commander": "2.11.0",
1471 "debug": "3.1.0",
1472 "diff": "3.3.1",
1473 "escape-string-regexp": "1.0.5",
1474 "glob": "7.1.2",
1475 "growl": "1.10.3",
1476 "he": "1.1.1",
1477 "mkdirp": "0.5.1",
1478 "supports-color": "4.4.0"
1479 },
1480 "dependencies": {
1481 "commander": {
1482 "version": "2.11.0",
1483 "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
1484 "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
1485 "dev": true
1486 }
1487 }
1488 },
1489 "ms": {
1490 "version": "2.0.0",
1491 "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
1492 "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
1493 "dev": true
1494 },
1495 "multimatch": {
1496 "version": "2.1.0",
1497 "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz",
1498 "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=",
1499 "dev": true,
1500 "requires": {
1501 "array-differ": "1.0.0",
1502 "array-union": "1.0.2",
1503 "arrify": "1.0.1",
1504 "minimatch": "3.0.4"
1505 }
1506 },
1507 "mute-stream": {
1508 "version": "0.0.7",
1509 "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
1510 "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=",
1511 "dev": true
1512 },
1513 "node.extend": {
1514 "version": "1.1.6",
1515 "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz",
1516 "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=",
1517 "dev": true,
1518 "requires": {
1519 "is": "3.2.1"
1520 }
1521 },
1522 "normalize-path": {
1523 "version": "2.1.1",
1524 "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
1525 "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
1526 "dev": true,
1527 "requires": {
1528 "remove-trailing-separator": "1.1.0"
1529 }
1530 },
1531 "nth-check": {
1532 "version": "1.0.1",
1533 "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz",
1534 "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=",
1535 "dev": true,
1536 "requires": {
1537 "boolbase": "1.0.0"
1538 }
1539 },
1540 "oauth-sign": {
1541 "version": "0.8.2",
1542 "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
1543 "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
1544 "dev": true
1545 },
1546 "object-assign": {
1547 "version": "4.1.1",
1548 "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
1549 "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
1550 "dev": true
1551 },
1552 "object.omit": {
1553 "version": "2.0.1",
1554 "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz",
1555 "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=",
1556 "dev": true,
1557 "requires": {
1558 "for-own": "0.1.5",
1559 "is-extendable": "0.1.1"
1560 }
1561 },
1562 "once": {
1563 "version": "1.4.0",
1564 "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1565 "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1566 "dev": true,
1567 "requires": {
1568 "wrappy": "1.0.2"
1569 }
1570 },
1571 "ordered-read-streams": {
1572 "version": "0.3.0",
1573 "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz",
1574 "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=",
1575 "dev": true,
1576 "requires": {
1577 "is-stream": "1.1.0",
1578 "readable-stream": "2.3.6"
1579 }
1580 },
1581 "os-homedir": {
1582 "version": "1.0.2",
1583 "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
1584 "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
1585 "dev": true
1586 },
1587 "os-tmpdir": {
1588 "version": "1.0.2",
1589 "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
1590 "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
1591 "dev": true
1592 },
1593 "osenv": {
1594 "version": "0.1.5",
1595 "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
1596 "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
1597 "dev": true,
1598 "requires": {
1599 "os-homedir": "1.0.2",
1600 "os-tmpdir": "1.0.2"
1601 }
1602 },
1603 "parse-glob": {
1604 "version": "3.0.4",
1605 "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
1606 "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
1607 "dev": true,
1608 "requires": {
1609 "glob-base": "0.3.0",
1610 "is-dotfile": "1.0.3",
1611 "is-extglob": "1.0.0",
1612 "is-glob": "2.0.1"
1613 },
1614 "dependencies": {
1615 "is-extglob": {
1616 "version": "1.0.0",
1617 "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz",
1618 "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=",
1619 "dev": true
1620 },
1621 "is-glob": {
1622 "version": "2.0.1",
1623 "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
1624 "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
1625 "dev": true,
1626 "requires": {
1627 "is-extglob": "1.0.0"
1628 }
1629 }
1630 }
1631 },
1632 "parse-semver": {
1633 "version": "1.1.1",
1634 "resolved": "https://registry.npmjs.org/parse-semver/-/parse-semver-1.1.1.tgz",
1635 "integrity": "sha1-mkr9bfBj3Egm+T+6SpnPIj9mbLg=",
1636 "dev": true,
1637 "requires": {
1638 "semver": "5.5.0"
1639 }
1640 },
1641 "parse5": {
1642 "version": "3.0.3",
1643 "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz",
1644 "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==",
1645 "dev": true,
1646 "requires": {
1647 "@types/node": "7.0.69"
1648 }
1649 },
1650 "path-dirname": {
1651 "version": "1.0.2",
1652 "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
1653 "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
1654 "dev": true
1655 },
1656 "path-is-absolute": {
1657 "version": "1.0.1",
1658 "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1659 "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1660 "dev": true
1661 },
1662 "pause-stream": {
1663 "version": "0.0.11",
1664 "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
1665 "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
1666 "dev": true,
1667 "requires": {
1668 "through": "2.3.8"
1669 }
1670 },
1671 "pend": {
1672 "version": "1.2.0",
1673 "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
1674 "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
1675 "dev": true
1676 },
1677 "performance-now": {
1678 "version": "2.1.0",
1679 "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
1680 "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
1681 "dev": true
1682 },
1683 "plugin-error": {
1684 "version": "0.1.2",
1685 "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
1686 "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
1687 "dev": true,
1688 "requires": {
1689 "ansi-cyan": "0.1.1",
1690 "ansi-red": "0.1.1",
1691 "arr-diff": "1.1.0",
1692 "arr-union": "2.1.0",
1693 "extend-shallow": "1.1.4"
1694 }
1695 },
1696 "preserve": {
1697 "version": "0.2.0",
1698 "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz",
1699 "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=",
1700 "dev": true
1701 },
1702 "process-nextick-args": {
1703 "version": "2.0.0",
1704 "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
1705 "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
1706 "dev": true
1707 },
1708 "punycode": {
1709 "version": "1.4.1",
1710 "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
1711 "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
1712 "dev": true
1713 },
1714 "q": {
1715 "version": "1.5.1",
1716 "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
1717 "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
1718 "dev": true
1719 },
1720 "qs": {
1721 "version": "6.5.2",
1722 "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
1723 "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
1724 "dev": true
1725 },
1726 "querystringify": {
1727 "version": "2.0.0",
1728 "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz",
1729 "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==",
1730 "dev": true
1731 },
1732 "queue": {
1733 "version": "3.1.0",
1734 "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz",
1735 "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=",
1736 "dev": true,
1737 "requires": {
1738 "inherits": "2.0.3"
1739 }
1740 },
1741 "randomatic": {
1742 "version": "3.1.0",
1743 "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz",
1744 "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==",
1745 "dev": true,
1746 "requires": {
1747 "is-number": "4.0.0",
1748 "kind-of": "6.0.2",
1749 "math-random": "1.0.1"
1750 },
1751 "dependencies": {
1752 "is-number": {
1753 "version": "4.0.0",
1754 "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
1755 "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==",
1756 "dev": true
1757 },
1758 "kind-of": {
1759 "version": "6.0.2",
1760 "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
1761 "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==",
1762 "dev": true
1763 }
1764 }
1765 },
1766 "read": {
1767 "version": "1.0.7",
1768 "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz",
1769 "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=",
1770 "dev": true,
1771 "requires": {
1772 "mute-stream": "0.0.7"
1773 }
1774 },
1775 "readable-stream": {
1776 "version": "2.3.6",
1777 "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
1778 "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
1779 "dev": true,
1780 "requires": {
1781 "core-util-is": "1.0.2",
1782 "inherits": "2.0.3",
1783 "isarray": "1.0.0",
1784 "process-nextick-args": "2.0.0",
1785 "safe-buffer": "5.1.2",
1786 "string_decoder": "1.1.1",
1787 "util-deprecate": "1.0.2"
1788 }
1789 },
1790 "regex-cache": {
1791 "version": "0.4.4",
1792 "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
1793 "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
1794 "dev": true,
1795 "requires": {
1796 "is-equal-shallow": "0.1.3"
1797 }
1798 },
1799 "remove-trailing-separator": {
1800 "version": "1.1.0",
1801 "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
1802 "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
1803 "dev": true
1804 },
1805 "repeat-element": {
1806 "version": "1.1.2",
1807 "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz",
1808 "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=",
1809 "dev": true
1810 },
1811 "repeat-string": {
1812 "version": "1.6.1",
1813 "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
1814 "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
1815 "dev": true
1816 },
1817 "replace-ext": {
1818 "version": "1.0.0",
1819 "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
1820 "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
1821 "dev": true
1822 },
1823 "request": {
1824 "version": "2.87.0",
1825 "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz",
1826 "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==",
1827 "dev": true,
1828 "requires": {
1829 "aws-sign2": "0.7.0",
1830 "aws4": "1.8.0",
1831 "caseless": "0.12.0",
1832 "combined-stream": "1.0.6",
1833 "extend": "3.0.2",
1834 "forever-agent": "0.6.1",
1835 "form-data": "2.3.2",
1836 "har-validator": "5.0.3",
1837 "http-signature": "1.2.0",
1838 "is-typedarray": "1.0.0",
1839 "isstream": "0.1.2",
1840 "json-stringify-safe": "5.0.1",
1841 "mime-types": "2.1.19",
1842 "oauth-sign": "0.8.2",
1843 "performance-now": "2.1.0",
1844 "qs": "6.5.2",
1845 "safe-buffer": "5.1.2",
1846 "tough-cookie": "2.3.4",
1847 "tunnel-agent": "0.6.0",
1848 "uuid": "3.3.2"
1849 }
1850 },
1851 "requires-port": {
1852 "version": "1.0.0",
1853 "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
1854 "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
1855 "dev": true
1856 },
1857 "rimraf": {
1858 "version": "2.6.2",
1859 "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
1860 "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
1861 "dev": true,
1862 "requires": {
1863 "glob": "7.1.2"
1864 }
1865 },
1866 "safe-buffer": {
1867 "version": "5.1.2",
1868 "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1869 "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1870 "dev": true
1871 },
1872 "safer-buffer": {
1873 "version": "2.1.2",
1874 "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
1875 "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
1876 "dev": true
1877 },
1878 "semver": {
1879 "version": "5.5.0",
1880 "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
1881 "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
1882 "dev": true
1883 },
1884 "source-map": {
1885 "version": "0.6.1",
1886 "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1887 "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1888 "dev": true
1889 },
1890 "source-map-support": {
1891 "version": "0.5.8",
1892 "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.8.tgz",
1893 "integrity": "sha512-WqAEWPdb78u25RfKzOF0swBpY0dKrNdjc4GvLwm7ScX/o9bj8Eh/YL8mcMhBHYDGl87UkkSXDOFnW4G7GhWhGg==",
1894 "dev": true,
1895 "requires": {
1896 "buffer-from": "1.1.1",
1897 "source-map": "0.6.1"
1898 }
1899 },
1900 "split": {
1901 "version": "0.3.3",
1902 "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
1903 "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
1904 "dev": true,
1905 "requires": {
1906 "through": "2.3.8"
1907 }
1908 },
1909 "sprintf-js": {
1910 "version": "1.0.3",
1911 "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1912 "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
1913 "dev": true
1914 },
1915 "sshpk": {
1916 "version": "1.14.2",
1917 "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
1918 "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
1919 "dev": true,
1920 "requires": {
1921 "asn1": "0.2.4",
1922 "assert-plus": "1.0.0",
1923 "bcrypt-pbkdf": "1.0.2",
1924 "dashdash": "1.14.1",
1925 "ecc-jsbn": "0.1.2",
1926 "getpass": "0.1.7",
1927 "jsbn": "0.1.1",
1928 "safer-buffer": "2.1.2",
1929 "tweetnacl": "0.14.5"
1930 }
1931 },
1932 "stat-mode": {
1933 "version": "0.2.2",
1934 "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz",
1935 "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=",
1936 "dev": true
1937 },
1938 "stream-combiner": {
1939 "version": "0.0.4",
1940 "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz",
1941 "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=",
1942 "dev": true,
1943 "requires": {
1944 "duplexer": "0.1.1"
1945 }
1946 },
1947 "stream-shift": {
1948 "version": "1.0.0",
1949 "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz",
1950 "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=",
1951 "dev": true
1952 },
1953 "streamfilter": {
1954 "version": "1.0.7",
1955 "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz",
1956 "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==",
1957 "dev": true,
1958 "requires": {
1959 "readable-stream": "2.3.6"
1960 }
1961 },
1962 "streamifier": {
1963 "version": "0.1.1",
1964 "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz",
1965 "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=",
1966 "dev": true
1967 },
1968 "string_decoder": {
1969 "version": "1.1.1",
1970 "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
1971 "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
1972 "dev": true,
1973 "requires": {
1974 "safe-buffer": "5.1.2"
1975 }
1976 },
1977 "strip-bom": {
1978 "version": "2.0.0",
1979 "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
1980 "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
1981 "dev": true,
1982 "requires": {
1983 "is-utf8": "0.2.1"
1984 }
1985 },
1986 "strip-bom-stream": {
1987 "version": "1.0.0",
1988 "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz",
1989 "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=",
1990 "dev": true,
1991 "requires": {
1992 "first-chunk-stream": "1.0.0",
1993 "strip-bom": "2.0.0"
1994 }
1995 },
1996 "supports-color": {
1997 "version": "4.4.0",
1998 "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
1999 "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
2000 "dev": true,
2001 "requires": {
2002 "has-flag": "2.0.0"
2003 }
2004 },
2005 "tar": {
2006 "version": "2.2.1",
2007 "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz",
2008 "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=",
2009 "dev": true,
2010 "requires": {
2011 "block-stream": "0.0.9",
2012 "fstream": "1.0.11",
2013 "inherits": "2.0.3"
2014 }
2015 },
2016 "through": {
2017 "version": "2.3.8",
2018 "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
2019 "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=",
2020 "dev": true
2021 },
2022 "through2": {
2023 "version": "2.0.3",
2024 "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
2025 "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
2026 "dev": true,
2027 "requires": {
2028 "readable-stream": "2.3.6",
2029 "xtend": "4.0.1"
2030 }
2031 },
2032 "through2-filter": {
2033 "version": "2.0.0",
2034 "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
2035 "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
2036 "dev": true,
2037 "requires": {
2038 "through2": "2.0.3",
2039 "xtend": "4.0.1"
2040 }
2041 },
2042 "tmp": {
2043 "version": "0.0.29",
2044 "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.29.tgz",
2045 "integrity": "sha1-8lEl/w3Z2jzLDC3Tce4SiLuRKMA=",
2046 "dev": true,
2047 "requires": {
2048 "os-tmpdir": "1.0.2"
2049 }
2050 },
2051 "to-absolute-glob": {
2052 "version": "0.1.1",
2053 "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz",
2054 "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=",
2055 "dev": true,
2056 "requires": {
2057 "extend-shallow": "2.0.1"
2058 },
2059 "dependencies": {
2060 "extend-shallow": {
2061 "version": "2.0.1",
2062 "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
2063 "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
2064 "dev": true,
2065 "requires": {
2066 "is-extendable": "0.1.1"
2067 }
2068 }
2069 }
2070 },
2071 "tough-cookie": {
2072 "version": "2.3.4",
2073 "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
2074 "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
2075 "dev": true,
2076 "requires": {
2077 "punycode": "1.4.1"
2078 }
2079 },
2080 "tunnel": {
2081 "version": "0.0.4",
2082 "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.4.tgz",
2083 "integrity": "sha1-LTeFoVjBdMmhbcLARuxfxfF0IhM=",
2084 "dev": true
2085 },
2086 "tunnel-agent": {
2087 "version": "0.6.0",
2088 "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
2089 "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
2090 "dev": true,
2091 "requires": {
2092 "safe-buffer": "5.1.2"
2093 }
2094 },
2095 "tweetnacl": {
2096 "version": "0.14.5",
2097 "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
2098 "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
2099 "dev": true,
2100 "optional": true
2101 },
2102 "typed-rest-client": {
2103 "version": "0.9.0",
2104 "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-0.9.0.tgz",
2105 "integrity": "sha1-92jMDcP06VDwbgSCXDaz54NKofI=",
2106 "dev": true,
2107 "requires": {
2108 "tunnel": "0.0.4",
2109 "underscore": "1.8.3"
2110 },
2111 "dependencies": {
2112 "underscore": {
2113 "version": "1.8.3",
2114 "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
2115 "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
2116 "dev": true
2117 }
2118 }
2119 },
2120 "typescript": {
2121 "version": "2.9.2",
2122 "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.9.2.tgz",
2123 "integrity": "sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==",
2124 "dev": true
2125 },
2126 "uc.micro": {
2127 "version": "1.0.5",
2128 "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.5.tgz",
2129 "integrity": "sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==",
2130 "dev": true
2131 },
2132 "underscore": {
2133 "version": "1.9.1",
2134 "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz",
2135 "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==",
2136 "dev": true
2137 },
2138 "unique-stream": {
2139 "version": "2.2.1",
2140 "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
2141 "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
2142 "dev": true,
2143 "requires": {
2144 "json-stable-stringify": "1.0.1",
2145 "through2-filter": "2.0.0"
2146 }
2147 },
2148 "url-join": {
2149 "version": "1.1.0",
2150 "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz",
2151 "integrity": "sha1-dBxsL0WWxIMNZxhGCSDQySIC3Hg=",
2152 "dev": true
2153 },
2154 "url-parse": {
2155 "version": "1.4.3",
2156 "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.3.tgz",
2157 "integrity": "sha512-rh+KuAW36YKo0vClhQzLLveoj8FwPJNu65xLb7Mrt+eZht0IPT0IXgSv8gcMegZ6NvjJUALf6Mf25POlMwD1Fw==",
2158 "dev": true,
2159 "requires": {
2160 "querystringify": "2.0.0",
2161 "requires-port": "1.0.0"
2162 }
2163 },
2164 "util-deprecate": {
2165 "version": "1.0.2",
2166 "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
2167 "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
2168 "dev": true
2169 },
2170 "uuid": {
2171 "version": "3.3.2",
2172 "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
2173 "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
2174 "dev": true
2175 },
2176 "vali-date": {
2177 "version": "1.0.0",
2178 "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz",
2179 "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=",
2180 "dev": true
2181 },
2182 "verror": {
2183 "version": "1.10.0",
2184 "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
2185 "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
2186 "dev": true,
2187 "requires": {
2188 "assert-plus": "1.0.0",
2189 "core-util-is": "1.0.2",
2190 "extsprintf": "1.3.0"
2191 }
2192 },
2193 "vinyl": {
2194 "version": "0.4.6",
2195 "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
2196 "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
2197 "dev": true,
2198 "requires": {
2199 "clone": "0.2.0",
2200 "clone-stats": "0.0.1"
2201 }
2202 },
2203 "vinyl-fs": {
2204 "version": "2.4.4",
2205 "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz",
2206 "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=",
2207 "dev": true,
2208 "requires": {
2209 "duplexify": "3.6.0",
2210 "glob-stream": "5.3.5",
2211 "graceful-fs": "4.1.11",
2212 "gulp-sourcemaps": "1.6.0",
2213 "is-valid-glob": "0.3.0",
2214 "lazystream": "1.0.0",
2215 "lodash.isequal": "4.5.0",
2216 "merge-stream": "1.0.1",
2217 "mkdirp": "0.5.1",
2218 "object-assign": "4.1.1",
2219 "readable-stream": "2.3.6",
2220 "strip-bom": "2.0.0",
2221 "strip-bom-stream": "1.0.0",
2222 "through2": "2.0.3",
2223 "through2-filter": "2.0.0",
2224 "vali-date": "1.0.0",
2225 "vinyl": "1.2.0"
2226 },
2227 "dependencies": {
2228 "clone": {
2229 "version": "1.0.4",
2230 "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
2231 "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
2232 "dev": true
2233 },
2234 "replace-ext": {
2235 "version": "0.0.1",
2236 "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
2237 "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
2238 "dev": true
2239 },
2240 "vinyl": {
2241 "version": "1.2.0",
2242 "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
2243 "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
2244 "dev": true,
2245 "requires": {
2246 "clone": "1.0.4",
2247 "clone-stats": "0.0.1",
2248 "replace-ext": "0.0.1"
2249 }
2250 }
2251 }
2252 },
2253 "vinyl-source-stream": {
2254 "version": "1.1.2",
2255 "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz",
2256 "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=",
2257 "dev": true,
2258 "requires": {
2259 "through2": "2.0.3",
2260 "vinyl": "0.4.6"
2261 }
2262 },
2263 "vsce": {
2264 "version": "1.46.0",
2265 "resolved": "https://registry.npmjs.org/vsce/-/vsce-1.46.0.tgz",
2266 "integrity": "sha512-cNQru5mXBPUtMDgwRNoespaR0gjdL09hV1KWktT5wkmTZfv0dSaAqqGAfr+2UI0aJTGttCcO3xKFQqtIcJpczA==",
2267 "dev": true,
2268 "requires": {
2269 "cheerio": "1.0.0-rc.2",
2270 "commander": "2.17.1",
2271 "denodeify": "1.2.1",
2272 "glob": "7.1.2",
2273 "lodash": "4.17.10",
2274 "markdown-it": "8.4.2",
2275 "mime": "1.6.0",
2276 "minimatch": "3.0.4",
2277 "osenv": "0.1.5",
2278 "parse-semver": "1.1.1",
2279 "read": "1.0.7",
2280 "semver": "5.5.0",
2281 "tmp": "0.0.29",
2282 "url-join": "1.1.0",
2283 "vso-node-api": "6.1.2-preview",
2284 "yauzl": "2.10.0",
2285 "yazl": "2.4.3"
2286 }
2287 },
2288 "vscode": {
2289 "version": "1.1.18",
2290 "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.18.tgz",
2291 "integrity": "sha512-SyDw4qFwZ+WthZX7RWp71PNiWLF7VhpM65j2oryY/6jtSORd8qH6J8vclwWZJ6Jvu0EH7JamO2RWNfBfsMR9Zw==",
2292 "dev": true,
2293 "requires": {
2294 "glob": "7.1.2",
2295 "gulp-chmod": "2.0.0",
2296 "gulp-filter": "5.1.0",
2297 "gulp-gunzip": "1.0.0",
2298 "gulp-remote-src-vscode": "0.5.0",
2299 "gulp-symdest": "1.1.0",
2300 "gulp-untar": "0.0.7",
2301 "gulp-vinyl-zip": "2.1.0",
2302 "mocha": "4.1.0",
2303 "request": "2.87.0",
2304 "semver": "5.5.0",
2305 "source-map-support": "0.5.8",
2306 "url-parse": "1.4.3",
2307 "vinyl-source-stream": "1.1.2"
2308 }
2309 },
2310 "vscode-jsonrpc": {
2311 "version": "3.6.2",
2312 "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-3.6.2.tgz",
2313 "integrity": "sha512-T24Jb5V48e4VgYliUXMnZ379ItbrXgOimweKaJshD84z+8q7ZOZjJan0MeDe+Ugb+uqERDVV8SBmemaGMSMugA=="
2314 },
2315 "vscode-languageclient": {
2316 "version": "4.4.0",
2317 "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-4.4.0.tgz",
2318 "integrity": "sha512-sXBwIcwG4W5MjnDAfXf0hM5ErOcXxEBlix6QJb5ijf0gtecYygrMAqv8hag7sEg/jCCOKQdXJ4K1iZL3GZcJZg==",
2319 "requires": {
2320 "vscode-languageserver-protocol": "3.10.0"
2321 }
2322 },
2323 "vscode-languageserver-protocol": {
2324 "version": "3.10.0",
2325 "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.10.0.tgz",
2326 "integrity": "sha512-PNNmKM0IcQPRiY1oUIxfwseBvxS5Sa5aZUpTcq/qsXWclnl8FFNs8oCCoAtyLhBXnuJvybWUNafiA78y0unJDA==",
2327 "requires": {
2328 "vscode-jsonrpc": "3.6.2",
2329 "vscode-languageserver-types": "3.10.0"
2330 }
2331 },
2332 "vscode-languageserver-types": {
2333 "version": "3.10.0",
2334 "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.10.0.tgz",
2335 "integrity": "sha512-vxmCsVZGwq8X40SuLP8Ix7V0rq5V/7iQUjRVe2Oxm+TbmjxtjK4dpHHXQCUawjA4fhPA9FwjSRbDhbvQmYCfMw=="
2336 },
2337 "vso-node-api": {
2338 "version": "6.1.2-preview",
2339 "resolved": "https://registry.npmjs.org/vso-node-api/-/vso-node-api-6.1.2-preview.tgz",
2340 "integrity": "sha1-qrNUbfJFHs2JTgcbuZtd8Zxfp48=",
2341 "dev": true,
2342 "requires": {
2343 "q": "1.5.1",
2344 "tunnel": "0.0.4",
2345 "typed-rest-client": "0.9.0",
2346 "underscore": "1.9.1"
2347 }
2348 },
2349 "wrappy": {
2350 "version": "1.0.2",
2351 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
2352 "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
2353 "dev": true
2354 },
2355 "xtend": {
2356 "version": "4.0.1",
2357 "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
2358 "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=",
2359 "dev": true
2360 },
2361 "yauzl": {
2362 "version": "2.10.0",
2363 "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
2364 "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
2365 "dev": true,
2366 "requires": {
2367 "buffer-crc32": "0.2.13",
2368 "fd-slicer": "1.1.0"
2369 }
2370 },
2371 "yazl": {
2372 "version": "2.4.3",
2373 "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz",
2374 "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=",
2375 "dev": true,
2376 "requires": {
2377 "buffer-crc32": "0.2.13"
2378 }
2379 }
2380 }
2381}
diff --git a/codeless/package.json b/codeless/package.json
new file mode 100644
index 000000000..7a00f33ef
--- /dev/null
+++ b/codeless/package.json
@@ -0,0 +1,41 @@
1{
2 "name": "libsyntax-rust",
3 "displayName": "libsyntax-rust",
4 "description": "An experimental Rust plugin for VS Code based on libsyntax2",
5 "license": "MIT",
6 "repository": "http://github.com/matklad/libsyntax2/",
7 "version": "0.0.1",
8 "publisher": "matklad",
9 "engines": {
10 "vscode": "^1.25.0"
11 },
12 "scripts": {
13 "compile": "tsc -p ./",
14 "postinstall": "node ./node_modules/vscode/bin/install"
15 },
16 "dependencies": {
17 "vscode-languageclient": "^4.3.0"
18 },
19 "devDependencies": {
20 "@types/node": "^7.0.56",
21 "typescript": "^2.9.1",
22 "vsce": "^1.42.0",
23 "vscode": "^1.1.18"
24 },
25 "main": "./out/src/extension",
26 "activationEvents": [
27 "onLanguage:rust"
28 ],
29 "contributes": {
30 "commands": [
31 {
32 "command": "libsyntax-rust.syntaxTree",
33 "title": "Show Rust syntax tree"
34 },
35 {
36 "command": "libsyntax-rust.extendSelection",
37 "title": "Rust Extend Selection"
38 }
39 ]
40 }
41}
diff --git a/codeless/server/.gitignore b/codeless/server/.gitignore
new file mode 100644
index 000000000..5a50b7f98
--- /dev/null
+++ b/codeless/server/.gitignore
@@ -0,0 +1 @@
/target/*
diff --git a/codeless/server/Cargo.toml b/codeless/server/Cargo.toml
new file mode 100644
index 000000000..4c3dd345c
--- /dev/null
+++ b/codeless/server/Cargo.toml
@@ -0,0 +1,16 @@
1[package]
2name = "m"
3version = "0.1.0"
4authors = ["Aleksey Kladov <[email protected]>"]
5[workspace]
6
7[dependencies]
8failure = "0.1.2"
9languageserver-types = "0.48.0"
10serde_json = "1.0.24"
11serde = "1.0.71"
12serde_derive = "1.0.71"
13drop_bomb = "0.1.0"
14crossbeam-channel = "0.2.4"
15libeditor = { path = "../../libeditor" }
16libanalysis = { path = "../../libanalysis" }
diff --git a/codeless/server/src/caps.rs b/codeless/server/src/caps.rs
new file mode 100644
index 000000000..b2fad6732
--- /dev/null
+++ b/codeless/server/src/caps.rs
@@ -0,0 +1,23 @@
1use languageserver_types::ServerCapabilities;
2
3pub const SERVER_CAPABILITIES: ServerCapabilities = ServerCapabilities {
4 text_document_sync: None,
5 hover_provider: None,
6 completion_provider: None,
7 signature_help_provider: None,
8 definition_provider: None,
9 type_definition_provider: None,
10 implementation_provider: None,
11 references_provider: None,
12 document_highlight_provider: None,
13 document_symbol_provider: None,
14 workspace_symbol_provider: None,
15 code_action_provider: None,
16 code_lens_provider: None,
17 document_formatting_provider: None,
18 document_range_formatting_provider: None,
19 document_on_type_formatting_provider: None,
20 rename_provider: None,
21 color_provider: None,
22 execute_command_provider: None,
23};
diff --git a/codeless/server/src/dispatch.rs b/codeless/server/src/dispatch.rs
new file mode 100644
index 000000000..a9476acde
--- /dev/null
+++ b/codeless/server/src/dispatch.rs
@@ -0,0 +1,124 @@
1use std::marker::PhantomData;
2
3use serde::{
4 ser::Serialize,
5 de::DeserializeOwned,
6};
7use serde_json;
8use drop_bomb::DropBomb;
9
10use ::{
11 Result,
12 req::Request,
13 io::{Io, RawMsg, RawResponse, RawRequest},
14};
15
16pub struct Responder<R: Request> {
17 id: u64,
18 bomb: DropBomb,
19 ph: PhantomData<R>,
20}
21
22impl<R: Request> Responder<R>
23 where
24 R::Params: DeserializeOwned,
25 R::Result: Serialize,
26{
27 pub fn respond_with(self, io: &mut Io, f: impl FnOnce() -> Result<R::Result>) -> Result<()> {
28 match f() {
29 Ok(res) => self.result(io, res)?,
30 Err(e) => {
31 self.error(io)?;
32 return Err(e);
33 }
34 }
35 Ok(())
36 }
37
38 pub fn result(mut self, io: &mut Io, result: R::Result) -> Result<()> {
39 self.bomb.defuse();
40 io.send(RawMsg::Response(RawResponse {
41 id: Some(self.id),
42 result: serde_json::to_value(result)?,
43 error: serde_json::Value::Null,
44 }));
45 Ok(())
46 }
47
48 pub fn error(mut self, io: &mut Io) -> Result<()> {
49 self.bomb.defuse();
50 error(io, self.id, ErrorCode::InternalError, "internal error")
51 }
52}
53
54
55pub fn parse_as<R>(raw: RawRequest) -> Result<::std::result::Result<(R::Params, Responder<R>), RawRequest>>
56 where
57 R: Request,
58 R::Params: DeserializeOwned,
59 R::Result: Serialize,
60{
61 if raw.method != R::METHOD {
62 return Ok(Err(raw));
63 }
64
65 let params: R::Params = serde_json::from_value(raw.params)?;
66 let responder = Responder {
67 id: raw.id,
68 bomb: DropBomb::new("dropped request"),
69 ph: PhantomData,
70 };
71 Ok(Ok((params, responder)))
72}
73
74pub fn expect<R>(io: &mut Io, raw: RawRequest) -> Result<Option<(R::Params, Responder<R>)>>
75 where
76 R: Request,
77 R::Params: DeserializeOwned,
78 R::Result: Serialize,
79{
80 let ret = match parse_as::<R>(raw)? {
81 Ok(x) => Some(x),
82 Err(raw) => {
83 unknown_method(io, raw)?;
84 None
85 }
86 };
87 Ok(ret)
88}
89
90pub fn unknown_method(io: &mut Io, raw: RawRequest) -> Result<()> {
91 error(io, raw.id, ErrorCode::MethodNotFound, "unknown method")
92}
93
94fn error(io: &mut Io, id: u64, code: ErrorCode, message: &'static str) -> Result<()> {
95 #[derive(Serialize)]
96 struct Error {
97 code: i32,
98 message: &'static str,
99 }
100 io.send(RawMsg::Response(RawResponse {
101 id: Some(id),
102 result: serde_json::Value::Null,
103 error: serde_json::to_value(Error {
104 code: code as i32,
105 message,
106 })?,
107 }));
108 Ok(())
109}
110
111
112#[allow(unused)]
113enum ErrorCode {
114 ParseError = -32700,
115 InvalidRequest = -32600,
116 MethodNotFound = -32601,
117 InvalidParams = -32602,
118 InternalError = -32603,
119 ServerErrorStart = -32099,
120 ServerErrorEnd = -32000,
121 ServerNotInitialized = -32002,
122 UnknownErrorCode = -32001,
123 RequestCancelled = -32800,
124}
diff --git a/codeless/server/src/io.rs b/codeless/server/src/io.rs
new file mode 100644
index 000000000..b84103d65
--- /dev/null
+++ b/codeless/server/src/io.rs
@@ -0,0 +1,201 @@
1use std::{
2 thread,
3 io::{
4 stdout, stdin,
5 BufRead, Write,
6 },
7};
8use serde_json::{Value, from_str, to_string};
9use crossbeam_channel::{Receiver, Sender, bounded};
10
11use Result;
12
13
14#[derive(Debug, Serialize, Deserialize)]
15#[serde(untagged)]
16pub enum RawMsg {
17 Request(RawRequest),
18 Notification(RawNotification),
19 Response(RawResponse),
20}
21
22#[derive(Debug, Serialize, Deserialize)]
23pub struct RawRequest {
24 pub id: u64,
25 pub method: String,
26 pub params: Value,
27}
28
29#[derive(Debug, Serialize, Deserialize)]
30pub struct RawNotification {
31 pub method: String,
32 pub params: Value,
33}
34
35#[derive(Debug, Serialize, Deserialize)]
36pub struct RawResponse {
37 pub id: Option<u64>,
38 pub result: Value,
39 pub error: Value,
40}
41
42struct MsgReceiver {
43 chan: Receiver<RawMsg>,
44 thread: Option<thread::JoinHandle<Result<()>>>,
45}
46
47impl MsgReceiver {
48 fn recv(&mut self) -> Result<RawMsg> {
49 match self.chan.recv() {
50 Some(msg) => Ok(msg),
51 None => {
52 self.thread
53 .take()
54 .ok_or_else(|| format_err!("MsgReceiver thread panicked"))?
55 .join()
56 .map_err(|_| format_err!("MsgReceiver thread panicked"))??;
57 bail!("client disconnected")
58 }
59 }
60 }
61
62 fn stop(self) -> Result<()> {
63 // Can't really self.thread.join() here, b/c it might be
64 // blocking on read
65 Ok(())
66 }
67}
68
69struct MsgSender {
70 chan: Sender<RawMsg>,
71 thread: Option<thread::JoinHandle<Result<()>>>,
72}
73
74impl MsgSender {
75 fn send(&mut self, msg: RawMsg) {
76 self.chan.send(msg)
77 }
78
79 fn stop(mut self) -> Result<()> {
80 if let Some(thread) = self.thread.take() {
81 thread.join()
82 .map_err(|_| format_err!("MsgSender thread panicked"))??
83 }
84 Ok(())
85 }
86}
87
88impl Drop for MsgSender {
89 fn drop(&mut self) {
90 if let Some(thread) = self.thread.take() {
91 let res = thread.join();
92 if thread::panicking() {
93 drop(res)
94 } else {
95 res.unwrap().unwrap()
96 }
97 }
98 }
99}
100
101pub struct Io {
102 receiver: MsgReceiver,
103 sender: MsgSender,
104}
105
106impl Io {
107 pub fn from_stdio() -> Io {
108 let sender = {
109 let (tx, rx) = bounded(16);
110 MsgSender {
111 chan: tx,
112 thread: Some(thread::spawn(move || {
113 let stdout = stdout();
114 let mut stdout = stdout.lock();
115 for msg in rx {
116 #[derive(Serialize)]
117 struct JsonRpc {
118 jsonrpc: &'static str,
119 #[serde(flatten)]
120 msg: RawMsg,
121 }
122 let text = to_string(&JsonRpc {
123 jsonrpc: "2.0",
124 msg,
125 })?;
126 write_msg_text(&mut stdout, &text)?;
127 }
128 Ok(())
129 })),
130 }
131 };
132 let receiver = {
133 let (tx, rx) = bounded(16);
134 MsgReceiver {
135 chan: rx,
136 thread: Some(thread::spawn(move || {
137 let stdin = stdin();
138 let mut stdin = stdin.lock();
139 while let Some(text) = read_msg_text(&mut stdin)? {
140 let msg: RawMsg = from_str(&text)?;
141 tx.send(msg);
142 }
143 Ok(())
144 })),
145 }
146 };
147 Io { receiver, sender }
148 }
149
150 pub fn send(&mut self, msg: RawMsg) {
151 self.sender.send(msg)
152 }
153
154 pub fn recv(&mut self) -> Result<RawMsg> {
155 self.receiver.recv()
156 }
157
158 pub fn stop(self) -> Result<()> {
159 self.receiver.stop()?;
160 self.sender.stop()?;
161 Ok(())
162 }
163}
164
165
166fn read_msg_text(inp: &mut impl BufRead) -> Result<Option<String>> {
167 let mut size = None;
168 let mut buf = String::new();
169 loop {
170 buf.clear();
171 if inp.read_line(&mut buf)? == 0 {
172 return Ok(None);
173 }
174 if !buf.ends_with("\r\n") {
175 bail!("malformed header: {:?}", buf);
176 }
177 let buf = &buf[..buf.len() - 2];
178 if buf.is_empty() {
179 break;
180 }
181 let mut parts = buf.splitn(2, ": ");
182 let header_name = parts.next().unwrap();
183 let header_value = parts.next().ok_or_else(|| format_err!("malformed header: {:?}", buf))?;
184 if header_name == "Content-Length" {
185 size = Some(header_value.parse::<usize>()?);
186 }
187 }
188 let size = size.ok_or_else(|| format_err!("no Content-Length"))?;
189 let mut buf = buf.into_bytes();
190 buf.resize(size, 0);
191 inp.read_exact(&mut buf)?;
192 let buf = String::from_utf8(buf)?;
193 Ok(Some(buf))
194}
195
196fn write_msg_text(out: &mut impl Write, msg: &str) -> Result<()> {
197 write!(out, "Content-Length: {}\r\n\r\n", msg.len())?;
198 out.write_all(msg.as_bytes())?;
199 out.flush()?;
200 Ok(())
201}
diff --git a/codeless/server/src/main.rs b/codeless/server/src/main.rs
new file mode 100644
index 000000000..11b6b7067
--- /dev/null
+++ b/codeless/server/src/main.rs
@@ -0,0 +1,84 @@
1#[macro_use]
2extern crate failure;
3#[macro_use]
4extern crate serde_derive;
5extern crate serde;
6extern crate serde_json;
7extern crate languageserver_types;
8extern crate drop_bomb;
9extern crate crossbeam_channel;
10extern crate libeditor;
11extern crate libanalysis;
12
13mod io;
14mod caps;
15mod req;
16mod dispatch;
17
18use languageserver_types::InitializeResult;
19use libanalysis::WorldState;
20use self::io::{Io, RawMsg};
21
22pub type Result<T> = ::std::result::Result<T, ::failure::Error>;
23
24fn main() -> Result<()> {
25 let mut io = Io::from_stdio();
26 initialize(&mut io)?;
27 io.stop()?;
28 Ok(())
29}
30
31fn initialize(io: &mut Io) -> Result<()> {
32 loop {
33 match io.recv()? {
34 RawMsg::Request(req) => {
35 if let Some((_params, resp)) = dispatch::expect::<req::Initialize>(io, req)? {
36 resp.result(io, InitializeResult {
37 capabilities: caps::SERVER_CAPABILITIES
38 })?;
39 match io.recv()? {
40 RawMsg::Notification(n) => {
41 if n.method != "initialized" {
42 bail!("expected initialized notification");
43 }
44 }
45 _ => {
46 bail!("expected initialized notification");
47 }
48 }
49 return initialized(io);
50 }
51 }
52 RawMsg::Notification(n) => {
53 bail!("expected initialize request, got {:?}", n)
54 }
55 RawMsg::Response(res) => {
56 bail!("expected initialize request, got {:?}", res)
57 }
58 }
59 }
60}
61
62fn initialized(io: &mut Io) -> Result<()> {
63 eprintln!("initialized");
64 let world = WorldState::new();
65 loop {
66 match io.recv()? {
67 RawMsg::Request(req) => {
68 let world = world.snapshot();
69 if let Some((params, resp)) = dispatch::expect::<req::SyntaxTree>(io, req)? {
70 resp.respond_with(io, || {
71 let path = params.text_document.uri.to_file_path()
72 .map_err(|()| format_err!("invalid path"))?;
73 let file = world.file_syntax(&path)?;
74 Ok(libeditor::syntax_tree(&file))
75 })?
76 }
77 }
78 msg => {
79 eprintln!("msg = {:?}", msg);
80 }
81 }
82 }
83}
84
diff --git a/codeless/server/src/req.rs b/codeless/server/src/req.rs
new file mode 100644
index 000000000..bc54c1d33
--- /dev/null
+++ b/codeless/server/src/req.rs
@@ -0,0 +1,16 @@
1use languageserver_types::TextDocumentIdentifier;
2pub use languageserver_types::request::*;
3
4pub enum SyntaxTree {}
5
6impl Request for SyntaxTree {
7 type Params = SyntaxTreeParams;
8 type Result = String;
9 const METHOD: &'static str = "m/syntaxTree";
10}
11
12#[derive(Deserialize, Debug)]
13#[serde(rename_all="camelCase")]
14pub struct SyntaxTreeParams {
15 pub text_document: TextDocumentIdentifier
16}
diff --git a/codeless/server/target/.rustc_info.json b/codeless/server/target/.rustc_info.json
new file mode 100644
index 000000000..a37ac2011
--- /dev/null
+++ b/codeless/server/target/.rustc_info.json
@@ -0,0 +1 @@
{"rustc_fingerprint":11898242945176772229,"outputs":{"15337506775154344876":["___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/matklad/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\ndebug_assertions\nproc_macro\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\nunix\n",""],"1617349019360157463":["___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/matklad/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\ndebug_assertions\nproc_macro\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\nunix\n",""],"1164083562126845933":["rustc 1.28.0 (9634041f0 2018-07-30)\nbinary: rustc\ncommit-hash: 9634041f0e8c0f3191d2867311276f19d0a42564\ncommit-date: 2018-07-30\nhost: x86_64-unknown-linux-gnu\nrelease: 1.28.0\nLLVM version: 6.0\n",""]}} \ No newline at end of file
diff --git a/codeless/server/target/debug/.cargo-lock b/codeless/server/target/debug/.cargo-lock
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/codeless/server/target/debug/.cargo-lock
diff --git a/codeless/server/target/debug/libm.d b/codeless/server/target/debug/libm.d
new file mode 100644
index 000000000..04d8bb9ed
--- /dev/null
+++ b/codeless/server/target/debug/libm.d
@@ -0,0 +1 @@
/home/matklad/projects/libsyntax2/codeless/server/target/debug/libm.rmeta: /home/matklad/projects/libsyntax2/codeless/server/src/caps.rs /home/matklad/projects/libsyntax2/codeless/server/src/dispatch.rs /home/matklad/projects/libsyntax2/codeless/server/src/io.rs /home/matklad/projects/libsyntax2/codeless/server/src/main.rs /home/matklad/projects/libsyntax2/codeless/server/src/req.rs /home/matklad/projects/libsyntax2/libanalysis/src/lib.rs /home/matklad/projects/libsyntax2/libeditor/src/extend_selection.rs /home/matklad/projects/libsyntax2/libeditor/src/lib.rs /home/matklad/projects/libsyntax2/src/algo/mod.rs /home/matklad/projects/libsyntax2/src/algo/walk.rs /home/matklad/projects/libsyntax2/src/ast/generated.rs /home/matklad/projects/libsyntax2/src/ast/mod.rs /home/matklad/projects/libsyntax2/src/grammar/attributes.rs /home/matklad/projects/libsyntax2/src/grammar/expressions/atom.rs /home/matklad/projects/libsyntax2/src/grammar/expressions/mod.rs /home/matklad/projects/libsyntax2/src/grammar/items/consts.rs /home/matklad/projects/libsyntax2/src/grammar/items/mod.rs /home/matklad/projects/libsyntax2/src/grammar/items/structs.rs /home/matklad/projects/libsyntax2/src/grammar/items/traits.rs /home/matklad/projects/libsyntax2/src/grammar/items/use_item.rs /home/matklad/projects/libsyntax2/src/grammar/mod.rs /home/matklad/projects/libsyntax2/src/grammar/params.rs /home/matklad/projects/libsyntax2/src/grammar/paths.rs /home/matklad/projects/libsyntax2/src/grammar/patterns.rs /home/matklad/projects/libsyntax2/src/grammar/type_args.rs /home/matklad/projects/libsyntax2/src/grammar/type_params.rs /home/matklad/projects/libsyntax2/src/grammar/types.rs /home/matklad/projects/libsyntax2/src/lexer/classes.rs /home/matklad/projects/libsyntax2/src/lexer/comments.rs /home/matklad/projects/libsyntax2/src/lexer/mod.rs /home/matklad/projects/libsyntax2/src/lexer/numbers.rs /home/matklad/projects/libsyntax2/src/lexer/ptr.rs /home/matklad/projects/libsyntax2/src/lexer/strings.rs /home/matklad/projects/libsyntax2/src/lib.rs /home/matklad/projects/libsyntax2/src/parser_api.rs /home/matklad/projects/libsyntax2/src/parser_impl/event.rs /home/matklad/projects/libsyntax2/src/parser_impl/input.rs /home/matklad/projects/libsyntax2/src/parser_impl/mod.rs /home/matklad/projects/libsyntax2/src/smol_str.rs /home/matklad/projects/libsyntax2/src/syntax_kinds/generated.rs /home/matklad/projects/libsyntax2/src/syntax_kinds/mod.rs /home/matklad/projects/libsyntax2/src/utils.rs /home/matklad/projects/libsyntax2/src/yellow/builder.rs /home/matklad/projects/libsyntax2/src/yellow/green.rs /home/matklad/projects/libsyntax2/src/yellow/mod.rs /home/matklad/projects/libsyntax2/src/yellow/red.rs /home/matklad/projects/libsyntax2/src/yellow/syntax.rs
diff --git a/codeless/server/target/debug/libm.rmeta b/codeless/server/target/debug/libm.rmeta
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/codeless/server/target/debug/libm.rmeta
diff --git a/codeless/src/extension.ts b/codeless/src/extension.ts
new file mode 100644
index 000000000..712d93e04
--- /dev/null
+++ b/codeless/src/extension.ts
@@ -0,0 +1,88 @@
1'use strict';
2import * as vscode from 'vscode';
3import {
4 LanguageClient,
5 LanguageClientOptions,
6 ServerOptions,
7 TransportKind,
8 Executable,
9 TextDocumentIdentifier
10} from 'vscode-languageclient';
11
12
13let client: LanguageClient;
14
15let uris = {
16 syntaxTree: vscode.Uri.parse('libsyntax-rust://syntaxtree')
17}
18
19
20export function activate(context: vscode.ExtensionContext) {
21 let dispose = (disposable) => {
22 context.subscriptions.push(disposable);
23 }
24 let registerCommand = (name, f) => {
25 dispose(vscode.commands.registerCommand(name, f))
26 }
27
28 registerCommand('libsyntax-rust.syntaxTree', () => openDoc(uris.syntaxTree))
29 dispose(vscode.workspace.registerTextDocumentContentProvider(
30 'libsyntax-rust',
31 new TextDocumentContentProvider()
32 ))
33 startServer()
34}
35
36export function deactivate(): Thenable<void> {
37 if (!client) {
38 return undefined;
39 }
40 return client.stop();
41}
42
43function startServer() {
44 let run: Executable = {
45 command: "cargo",
46 args: ["run"],
47 options: {
48 cwd: "./server"
49 }
50 }
51 let serverOptions: ServerOptions = {
52 run,
53 debug: run
54 };
55
56 let clientOptions: LanguageClientOptions = {
57 documentSelector: [{ scheme: 'file', language: 'rust' }],
58 };
59
60 client = new LanguageClient(
61 'm',
62 'm languge server',
63 serverOptions,
64 clientOptions,
65 );
66 client.start();
67}
68
69async function openDoc(uri: vscode.Uri) {
70 let document = await vscode.workspace.openTextDocument(uri)
71 return vscode.window.showTextDocument(document, vscode.ViewColumn.Two, true)
72}
73
74class TextDocumentContentProvider implements vscode.TextDocumentContentProvider {
75 public eventEmitter = new vscode.EventEmitter<vscode.Uri>()
76 public syntaxTree: string = "Not available"
77
78 public provideTextDocumentContent(uri: vscode.Uri): vscode.ProviderResult<string> {
79 let editor = vscode.window.activeTextEditor;
80 if (editor == null) return ""
81 let textDocument: TextDocumentIdentifier = { uri: editor.document.uri.toString() };
82 return client.sendRequest("m/syntaxTree", { textDocument })
83 }
84
85 get onDidChange(): vscode.Event<vscode.Uri> {
86 return this.eventEmitter.event
87 }
88}
diff --git a/codeless/tsconfig.json b/codeless/tsconfig.json
new file mode 100644
index 000000000..11c3126e0
--- /dev/null
+++ b/codeless/tsconfig.json
@@ -0,0 +1,12 @@
1{
2 "compilerOptions": {
3 "module": "commonjs",
4 "target": "es6",
5 "outDir": "out",
6 "lib": [ "es6" ],
7 "sourceMap": true,
8 "rootDir": "."
9 },
10 "include": [ "src" ],
11 "exclude": [ "node_modules" ]
12}
diff --git a/libanalysis/Cargo.toml b/libanalysis/Cargo.toml
new file mode 100644
index 000000000..bde5043e8
--- /dev/null
+++ b/libanalysis/Cargo.toml
@@ -0,0 +1,9 @@
1[package]
2name = "libanalysis"
3version = "0.1.0"
4authors = ["Aleksey Kladov <[email protected]>"]
5
6[dependencies]
7failure = "0.1.2"
8parking_lot = "0.6.3"
9libsyntax2 = { path = "../" }
diff --git a/libanalysis/src/lib.rs b/libanalysis/src/lib.rs
new file mode 100644
index 000000000..07e7d567d
--- /dev/null
+++ b/libanalysis/src/lib.rs
@@ -0,0 +1,107 @@
1extern crate failure;
2extern crate libsyntax2;
3extern crate parking_lot;
4
5use std::{
6 fs,
7 sync::Arc,
8 collections::hash_map::HashMap,
9 path::{PathBuf, Path},
10};
11use parking_lot::RwLock;
12use libsyntax2::ast;
13
14pub type Result<T> = ::std::result::Result<T, ::failure::Error>;
15
16pub struct WorldState {
17 data: Arc<WorldData>
18}
19
20pub struct World {
21 data: Arc<WorldData>,
22}
23
24impl WorldState {
25 pub fn new() -> WorldState {
26 WorldState {
27 data: Arc::new(WorldData::default())
28 }
29 }
30
31 pub fn snapshot(&self) -> World {
32 World { data: self.data.clone() }
33 }
34
35 pub fn change_overlay(&mut self, path: PathBuf, text: Option<String>) {
36 let data = self.data_mut();
37 data.file_map.get_mut().remove(&path);
38 data.fs_map.get_mut().remove(&path);
39 if let Some(text) = text {
40 data.mem_map.insert(path, Arc::new(text));
41 } else {
42 data.mem_map.remove(&path);
43 }
44 }
45
46 fn data_mut(&mut self) -> &mut WorldData {
47 if Arc::get_mut(&mut self.data).is_none() {
48 let fs_map = self.data.fs_map.read().clone();
49 let file_map = self.data.file_map.read().clone();
50 self.data = Arc::new(WorldData {
51 mem_map: self.data.mem_map.clone(),
52 fs_map: RwLock::new(fs_map),
53 file_map: RwLock::new(file_map),
54 });
55 }
56 Arc::get_mut(&mut self.data).unwrap()
57 }
58}
59
60
61impl World {
62 pub fn file_syntax(&self, path: &Path) -> Result<ast::File> {
63 {
64 let guard = self.data.file_map.read();
65 if let Some(file) = guard.get(path) {
66 return Ok(file.clone());
67 }
68 }
69
70 let file = self.with_file_text(path, ast::File::parse)?;
71 let mut guard = self.data.file_map.write();
72 let file = guard.entry(path.to_owned())
73 .or_insert(file)
74 .clone();
75 Ok(file)
76 }
77
78 fn with_file_text<F: FnOnce(&str) -> R, R>(&self, path: &Path, f: F) -> Result<R> {
79 if let Some(text) = self.data.mem_map.get(path) {
80 return Ok(f(&*text));
81 }
82
83 {
84 let guard = self.data.fs_map.read();
85 if let Some(text) = guard.get(path) {
86 return Ok(f(&*text));
87 }
88 }
89
90 let text = fs::read_to_string(path)?;
91 {
92 let mut guard = self.data.fs_map.write();
93 guard.entry(path.to_owned())
94 .or_insert_with(|| Arc::new(text));
95 }
96 let guard = self.data.fs_map.read();
97 Ok(f(&guard[path]))
98 }
99}
100
101
102#[derive(Default)]
103struct WorldData {
104 mem_map: HashMap<PathBuf, Arc<String>>,
105 fs_map: RwLock<HashMap<PathBuf, Arc<String>>>,
106 file_map: RwLock<HashMap<PathBuf, ast::File>>,
107}
diff --git a/libeditor/src/lib.rs b/libeditor/src/lib.rs
index 5ebb49139..817a2d15b 100644
--- a/libeditor/src/lib.rs
+++ b/libeditor/src/lib.rs
@@ -6,13 +6,10 @@ use libsyntax2::{
6 SyntaxNodeRef, AstNode, 6 SyntaxNodeRef, AstNode,
7 algo::walk, 7 algo::walk,
8 SyntaxKind::*, 8 SyntaxKind::*,
9 ast,
9}; 10};
10pub use libsyntax2::{TextRange, TextUnit}; 11pub use libsyntax2::{TextRange, TextUnit};
11 12
12pub struct File {
13 inner: libsyntax2::File
14}
15
16#[derive(Debug)] 13#[derive(Debug)]
17pub struct HighlightedRange { 14pub struct HighlightedRange {
18 pub range: TextRange, 15 pub range: TextRange,
@@ -44,103 +41,95 @@ pub enum RunnableKind {
44 Bin, 41 Bin,
45} 42}
46 43
47impl File { 44pub fn highlight(file: &ast::File) -> Vec<HighlightedRange> {
48 pub fn new(text: &str) -> File { 45 let syntax = file.syntax();
49 File { 46 let mut res = Vec::new();
50 inner: libsyntax2::File::parse(text) 47 for node in walk::preorder(syntax.as_ref()) {
51 } 48 let tag = match node.kind() {
49 ERROR => "error",
50 COMMENT | DOC_COMMENT => "comment",
51 STRING | RAW_STRING | RAW_BYTE_STRING | BYTE_STRING => "string",
52 ATTR => "attribute",
53 NAME_REF => "text",
54 NAME => "function",
55 INT_NUMBER | FLOAT_NUMBER | CHAR | BYTE => "literal",
56 LIFETIME => "parameter",
57 k if k.is_keyword() => "keyword",
58 _ => continue,
59 };
60 res.push(HighlightedRange {
61 range: node.range(),
62 tag,
63 })
52 } 64 }
65 res
66}
53 67
54 pub fn highlight(&self) -> Vec<HighlightedRange> { 68pub fn diagnostics(file: &ast::File) -> Vec<Diagnostic> {
55 let syntax = self.inner.syntax(); 69 let syntax = file.syntax();
56 let mut res = Vec::new(); 70 let mut res = Vec::new();
57 for node in walk::preorder(syntax.as_ref()) {
58 let tag = match node.kind() {
59 ERROR => "error",
60 COMMENT | DOC_COMMENT => "comment",
61 STRING | RAW_STRING | RAW_BYTE_STRING | BYTE_STRING => "string",
62 ATTR => "attribute",
63 NAME_REF => "text",
64 NAME => "function",
65 INT_NUMBER | FLOAT_NUMBER | CHAR | BYTE => "literal",
66 LIFETIME => "parameter",
67 k if k.is_keyword() => "keyword",
68 _ => continue,
69 };
70 res.push(HighlightedRange {
71 range: node.range(),
72 tag,
73 })
74 }
75 res
76 }
77 71
78 pub fn diagnostics(&self) -> Vec<Diagnostic> { 72 for node in walk::preorder(syntax.as_ref()) {
79 let syntax = self.inner.syntax(); 73 if node.kind() == ERROR {
80 let mut res = Vec::new(); 74 res.push(Diagnostic {
81 75 range: node.range(),
82 for node in walk::preorder(syntax.as_ref()) { 76 msg: "Syntax Error".to_string(),
83 if node.kind() == ERROR { 77 });
84 res.push(Diagnostic {
85 range: node.range(),
86 msg: "Syntax Error".to_string(),
87 });
88 }
89 } 78 }
90 res.extend(self.inner.errors().into_iter().map(|err| Diagnostic {
91 range: TextRange::offset_len(err.offset, 1.into()),
92 msg: err.msg,
93 }));
94 res
95 } 79 }
80 res.extend(file.errors().into_iter().map(|err| Diagnostic {
81 range: TextRange::offset_len(err.offset, 1.into()),
82 msg: err.msg,
83 }));
84 res
85}
96 86
97 pub fn syntax_tree(&self) -> String { 87pub fn syntax_tree(file: &ast::File) -> String {
98 ::libsyntax2::utils::dump_tree(&self.inner.syntax()) 88 ::libsyntax2::utils::dump_tree(&file.syntax())
99 } 89}
100 90
101 pub fn symbols(&self) -> Vec<Symbol> { 91pub fn symbols(file: &ast::File) -> Vec<Symbol> {
102 let syntax = self.inner.syntax(); 92 let syntax = file.syntax();
103 let res: Vec<Symbol> = walk::preorder(syntax.as_ref()) 93 let res: Vec<Symbol> = walk::preorder(syntax.as_ref())
104 .filter_map(Declaration::cast) 94 .filter_map(Declaration::cast)
105 .filter_map(|decl| { 95 .filter_map(|decl| {
106 let name = decl.name()?; 96 let name = decl.name()?;
107 let range = decl.range(); 97 let range = decl.range();
108 Some(Symbol { name, range }) 98 Some(Symbol { name, range })
109 }) 99 })
110 .collect(); 100 .collect();
111 res // NLL :-( 101 res // NLL :-(
112 } 102}
113 103
114 pub fn extend_selection(&self, range: TextRange) -> Option<TextRange> { 104pub fn extend_selection(file: &ast::File, range: TextRange) -> Option<TextRange> {
115 let syntax = self.inner.syntax(); 105 let syntax = file.syntax();
116 extend_selection::extend_selection(syntax.as_ref(), range) 106 extend_selection::extend_selection(syntax.as_ref(), range)
117 } 107}
118 108
119 pub fn runnables(&self) -> Vec<Runnable> { 109pub fn runnables(file: &ast::File) -> Vec<Runnable> {
120 self.inner 110 file
121 .functions() 111 .functions()
122 .filter_map(|f| { 112 .filter_map(|f| {
123 let name = f.name()?.text(); 113 let name = f.name()?.text();
124 let kind = if name == "main" { 114 let kind = if name == "main" {
125 RunnableKind::Bin 115 RunnableKind::Bin
126 } else if f.has_atom_attr("test") { 116 } else if f.has_atom_attr("test") {
127 RunnableKind::Test { 117 RunnableKind::Test {
128 name: name.to_string() 118 name: name.to_string()
129 } 119 }
130 } else { 120 } else {
131 return None; 121 return None;
132 }; 122 };
133 Some(Runnable { 123 Some(Runnable {
134 range: f.syntax().range(), 124 range: f.syntax().range(),
135 kind, 125 kind,
136 })
137 }) 126 })
138 .collect() 127 })
139 } 128 .collect()
140} 129}
141 130
142 131
143struct Declaration<'f>(SyntaxNodeRef<'f>); 132struct Declaration<'f> (SyntaxNodeRef<'f>);
144 133
145impl<'f> Declaration<'f> { 134impl<'f> Declaration<'f> {
146 fn cast(node: SyntaxNodeRef<'f>) -> Option<Declaration<'f>> { 135 fn cast(node: SyntaxNodeRef<'f>) -> Option<Declaration<'f>> {
diff --git a/src/ast/generated.rs b/src/ast/generated.rs
index b93c76d0c..2f813050a 100644
--- a/src/ast/generated.rs
+++ b/src/ast/generated.rs
@@ -5,7 +5,7 @@ use {
5}; 5};
6 6
7 7
8#[derive(Debug)] 8#[derive(Debug, Clone, Copy)]
9pub struct File<R: TreeRoot = Arc<SyntaxRoot>> { 9pub struct File<R: TreeRoot = Arc<SyntaxRoot>> {
10 syntax: SyntaxNode<R>, 10 syntax: SyntaxNode<R>,
11} 11}
@@ -21,7 +21,7 @@ impl<R: TreeRoot> AstNode<R> for File<R> {
21} 21}
22 22
23 23
24#[derive(Debug)] 24#[derive(Debug, Clone, Copy)]
25pub struct Function<R: TreeRoot = Arc<SyntaxRoot>> { 25pub struct Function<R: TreeRoot = Arc<SyntaxRoot>> {
26 syntax: SyntaxNode<R>, 26 syntax: SyntaxNode<R>,
27} 27}
@@ -37,7 +37,7 @@ impl<R: TreeRoot> AstNode<R> for Function<R> {
37} 37}
38 38
39 39
40#[derive(Debug)] 40#[derive(Debug, Clone, Copy)]
41pub struct Name<R: TreeRoot = Arc<SyntaxRoot>> { 41pub struct Name<R: TreeRoot = Arc<SyntaxRoot>> {
42 syntax: SyntaxNode<R>, 42 syntax: SyntaxNode<R>,
43} 43}
diff --git a/src/ast/generated.rs.tera b/src/ast/generated.rs.tera
index f2559383a..242837801 100644
--- a/src/ast/generated.rs.tera
+++ b/src/ast/generated.rs.tera
@@ -5,7 +5,7 @@ use {
5}; 5};
6{% for node in ast %} 6{% for node in ast %}
7{% set Name = node.kind | camel %} 7{% set Name = node.kind | camel %}
8#[derive(Debug)] 8#[derive(Debug, Clone, Copy)]
9pub struct {{ Name }}<R: TreeRoot = Arc<SyntaxRoot>> { 9pub struct {{ Name }}<R: TreeRoot = Arc<SyntaxRoot>> {
10 syntax: SyntaxNode<R>, 10 syntax: SyntaxNode<R>,
11} 11}