├── .gitignore ├── .vscode ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── LICENSE ├── README.md ├── client ├── package-lock.json ├── package.json ├── src │ ├── extension.ts │ └── test │ │ ├── completion.test.ts │ │ ├── diagnostics.test.ts │ │ ├── helper.ts │ │ └── index.ts ├── testFixture │ ├── completion.txt │ └── diagnostics.txt └── tsconfig.json ├── icons └── logo.png ├── package-lock.json ├── package.json ├── samples ├── await-types.png ├── prop-complete.png ├── prop-type-check.png ├── slot-param-info.png ├── slot-param-type-check.png ├── store-types.png └── transition-parameter-types.png ├── scripts └── e2e.sh ├── server ├── package-lock.json ├── package.json ├── src │ ├── DocumentContext.ts │ ├── DocumentSnapshot.ts │ ├── LanguageService.ts │ ├── mapper.ts │ ├── server.ts │ └── util.ts ├── test │ └── util.js └── tsconfig.json ├── tsconfig.json └── tslint.json /.gitignore: -------------------------------------------------------------------------------- 1 | out 2 | node_modules 3 | client/server 4 | .vscode-test -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | { 3 | "version": "0.2.0", 4 | "configurations": [ 5 | { 6 | "type": "extensionHost", 7 | "request": "launch", 8 | "name": "Launch Client", 9 | "runtimeExecutable": "${execPath}", 10 | "args": ["--extensionDevelopmentPath=${workspaceRoot}"], 11 | "outFiles": ["${workspaceRoot}/client/out/**/*.js"], 12 | "preLaunchTask": { 13 | "type": "npm", 14 | "script": "watch" 15 | } 16 | }, 17 | { 18 | "type": "node", 19 | "request": "attach", 20 | "name": "Attach to Server", 21 | "port": 6010, 22 | "restart": true, 23 | "outFiles": ["${workspaceRoot}/server/out/**/*.js"] 24 | }, 25 | { 26 | "name": "Language Server E2E Test", 27 | "type": "extensionHost", 28 | "request": "launch", 29 | "runtimeExecutable": "${execPath}", 30 | "args": [ 31 | "--extensionDevelopmentPath=${workspaceRoot}", 32 | "--extensionTestsPath=${workspaceRoot}/client/out/test", 33 | "${workspaceRoot}/client/testFixture" 34 | ], 35 | "outFiles": ["${workspaceRoot}/client/out/test/**/*.js"] 36 | } 37 | ], 38 | "compounds": [ 39 | { 40 | "name": "Client + Server", 41 | "configurations": ["Launch Client", "Attach to Server"] 42 | } 43 | ] 44 | } 45 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.insertSpaces": false, 3 | "tslint.enable": true, 4 | "typescript.tsc.autoDetect": "off", 5 | "typescript.preferences.quoteStyle": "single" 6 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "2.0.0", 3 | "tasks": [ 4 | { 5 | "type": "npm", 6 | "script": "compile", 7 | "group": "build", 8 | "presentation": { 9 | "panel": "dedicated", 10 | "reveal": "never" 11 | }, 12 | "problemMatcher": [ 13 | "$tsc" 14 | ] 15 | }, 16 | { 17 | "type": "npm", 18 | "script": "watch", 19 | "isBackground": true, 20 | "group": { 21 | "kind": "build", 22 | "isDefault": true 23 | }, 24 | "presentation": { 25 | "panel": "dedicated", 26 | "reveal": "never" 27 | }, 28 | "problemMatcher": [ 29 | "$tsc-watch" 30 | ] 31 | } 32 | ] 33 | } -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .vscode/** 2 | **/*.ts 3 | **/*.map 4 | .gitignore 5 | **/tsconfig.json 6 | **/tsconfig.base.json 7 | contributing.md 8 | .travis.yml 9 | !server/node_modules/**/*.ts 10 | client/node_modules/** 11 | !client/node_modules/vscode-jsonrpc/** 12 | !client/node_modules/vscode-languageclient/** 13 | !client/node_modules/vscode-languageserver-protocol/** 14 | !client/node_modules/vscode-languageserver-types/** 15 | !client/node_modules/semver/** 16 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) David Pershouse 2 | 3 | All rights reserved. 4 | 5 | MIT License 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation 8 | files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, 9 | modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software 10 | is furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 13 | 14 | THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 15 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 16 | BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT 17 | OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 18 | 19 | 20 | 21 | Based on Exmaple code: 22 | 23 | Copyright (c) Microsoft Corporation 24 | 25 | All rights reserved. 26 | 27 | MIT License 28 | 29 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation 30 | files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, 31 | modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software 32 | is furnished to do so, subject to the following conditions: 33 | 34 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 35 | 36 | THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 37 | OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 38 | BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT 39 | OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 40 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | __Warning__ 2 | > This is now archived, You probably want https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode most of the code in this repo has been incorporated into the official svelte plugin (https://github.com/sveltejs/language-tools/tree/master/packages/svelte-vscode) 3 | 4 | # Svelte Type Checker - DEPRECATED 5 | 6 | Provides deep type checking for Svelte files by leaning on the Typescript language service. 7 | 8 | Requires a Svelte language mode plugin such as [Svelte Beta](https://marketplace.visualstudio.com/items?itemName=svelte.svelte-vscode) 9 | 10 | For best results, disable the typescript complete, hover, and definition features of the Svelte plugin and enable all the settings of this plugin. 11 | 12 | ### Features provided 13 | 14 | * Type checks regular JS as well as Typescript 15 | * Type checking of component template (including prop types and slots) 16 | * Autocomplete for component props 17 | * Go to definition for components and props 18 | * Hover information for template attributes 19 | 20 | 21 | ### Examples 22 | 23 | #### Property Type Checking 24 | ![Property Type Checking](https://raw.githubusercontent.com/halfnelson/svelte-type-checker-vscode/master/samples/prop-type-check.png) 25 | 26 | #### Property Auto Complete 27 | ![Property Completion](https://raw.githubusercontent.com/halfnelson/svelte-type-checker-vscode/master/samples/prop-complete.png) 28 | 29 | #### Slot Parameter Checking 30 | ![Slot Param Check](https://raw.githubusercontent.com/halfnelson/svelte-type-checker-vscode/master/samples/slot-param-type-check.png) 31 | 32 | #### Slot Parameter Info 33 | ![Slot Param Info](https://raw.githubusercontent.com/halfnelson/svelte-type-checker-vscode/master/samples/slot-param-info.png) 34 | 35 | #### Await Type Checking/Info 36 | ![Await Types](https://raw.githubusercontent.com/halfnelson/svelte-type-checker-vscode/master/samples/await-types.png) 37 | 38 | #### Store Type Checking/Info 39 | ![Store Types](https://raw.githubusercontent.com/halfnelson/svelte-type-checker-vscode/master/samples/store-types.png) 40 | 41 | #### Animation Parameter Checking/Info 42 | ![Transition Types](https://raw.githubusercontent.com/halfnelson/svelte-type-checker-vscode/master/samples/transition-parameter-types.png) 43 | -------------------------------------------------------------------------------- /client/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-type-checker-client", 3 | "version": "0.0.1", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "agent-base": { 8 | "version": "4.3.0", 9 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 10 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 11 | "dev": true, 12 | "requires": { 13 | "es6-promisify": "^5.0.0" 14 | } 15 | }, 16 | "ajv": { 17 | "version": "6.10.0", 18 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.0.tgz", 19 | "integrity": "sha512-nffhOpkymDECQyR0mnsUtoCE8RlX38G0rYP+wgLWFyZuUyuuojSSvi/+euOiQBIn63whYwYVIIH1TvE3tu4OEg==", 20 | "dev": true, 21 | "requires": { 22 | "fast-deep-equal": "^2.0.1", 23 | "fast-json-stable-stringify": "^2.0.0", 24 | "json-schema-traverse": "^0.4.1", 25 | "uri-js": "^4.2.2" 26 | } 27 | }, 28 | "asn1": { 29 | "version": "0.2.4", 30 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 31 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 32 | "dev": true, 33 | "requires": { 34 | "safer-buffer": "~2.1.0" 35 | } 36 | }, 37 | "assert-plus": { 38 | "version": "1.0.0", 39 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 40 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", 41 | "dev": true 42 | }, 43 | "asynckit": { 44 | "version": "0.4.0", 45 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 46 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", 47 | "dev": true 48 | }, 49 | "aws-sign2": { 50 | "version": "0.7.0", 51 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 52 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", 53 | "dev": true 54 | }, 55 | "aws4": { 56 | "version": "1.8.0", 57 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", 58 | "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", 59 | "dev": true 60 | }, 61 | "balanced-match": { 62 | "version": "1.0.0", 63 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 64 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 65 | "dev": true 66 | }, 67 | "bcrypt-pbkdf": { 68 | "version": "1.0.2", 69 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 70 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 71 | "dev": true, 72 | "requires": { 73 | "tweetnacl": "^0.14.3" 74 | } 75 | }, 76 | "brace-expansion": { 77 | "version": "1.1.11", 78 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 79 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 80 | "dev": true, 81 | "requires": { 82 | "balanced-match": "^1.0.0", 83 | "concat-map": "0.0.1" 84 | } 85 | }, 86 | "browser-stdout": { 87 | "version": "1.3.1", 88 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 89 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 90 | "dev": true 91 | }, 92 | "buffer-from": { 93 | "version": "1.1.1", 94 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 95 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 96 | "dev": true 97 | }, 98 | "caseless": { 99 | "version": "0.12.0", 100 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 101 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", 102 | "dev": true 103 | }, 104 | "combined-stream": { 105 | "version": "1.0.8", 106 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 107 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 108 | "dev": true, 109 | "requires": { 110 | "delayed-stream": "~1.0.0" 111 | } 112 | }, 113 | "commander": { 114 | "version": "2.15.1", 115 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", 116 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", 117 | "dev": true 118 | }, 119 | "concat-map": { 120 | "version": "0.0.1", 121 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 122 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 123 | "dev": true 124 | }, 125 | "core-util-is": { 126 | "version": "1.0.2", 127 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 128 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", 129 | "dev": true 130 | }, 131 | "dashdash": { 132 | "version": "1.14.1", 133 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 134 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 135 | "dev": true, 136 | "requires": { 137 | "assert-plus": "^1.0.0" 138 | } 139 | }, 140 | "debug": { 141 | "version": "3.1.0", 142 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 143 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 144 | "dev": true, 145 | "requires": { 146 | "ms": "2.0.0" 147 | } 148 | }, 149 | "delayed-stream": { 150 | "version": "1.0.0", 151 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 152 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", 153 | "dev": true 154 | }, 155 | "diff": { 156 | "version": "3.5.0", 157 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 158 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 159 | "dev": true 160 | }, 161 | "ecc-jsbn": { 162 | "version": "0.1.2", 163 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 164 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 165 | "dev": true, 166 | "requires": { 167 | "jsbn": "~0.1.0", 168 | "safer-buffer": "^2.1.0" 169 | } 170 | }, 171 | "es6-promise": { 172 | "version": "4.2.8", 173 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 174 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==", 175 | "dev": true 176 | }, 177 | "es6-promisify": { 178 | "version": "5.0.0", 179 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 180 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 181 | "dev": true, 182 | "requires": { 183 | "es6-promise": "^4.0.3" 184 | } 185 | }, 186 | "escape-string-regexp": { 187 | "version": "1.0.5", 188 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 189 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 190 | "dev": true 191 | }, 192 | "extend": { 193 | "version": "3.0.2", 194 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 195 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", 196 | "dev": true 197 | }, 198 | "extsprintf": { 199 | "version": "1.3.0", 200 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 201 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", 202 | "dev": true 203 | }, 204 | "fast-deep-equal": { 205 | "version": "2.0.1", 206 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 207 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", 208 | "dev": true 209 | }, 210 | "fast-json-stable-stringify": { 211 | "version": "2.0.0", 212 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 213 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", 214 | "dev": true 215 | }, 216 | "forever-agent": { 217 | "version": "0.6.1", 218 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 219 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", 220 | "dev": true 221 | }, 222 | "form-data": { 223 | "version": "2.3.3", 224 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 225 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 226 | "dev": true, 227 | "requires": { 228 | "asynckit": "^0.4.0", 229 | "combined-stream": "^1.0.6", 230 | "mime-types": "^2.1.12" 231 | } 232 | }, 233 | "fs.realpath": { 234 | "version": "1.0.0", 235 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 236 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 237 | "dev": true 238 | }, 239 | "getpass": { 240 | "version": "0.1.7", 241 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 242 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 243 | "dev": true, 244 | "requires": { 245 | "assert-plus": "^1.0.0" 246 | } 247 | }, 248 | "glob": { 249 | "version": "7.1.4", 250 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 251 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 252 | "dev": true, 253 | "requires": { 254 | "fs.realpath": "^1.0.0", 255 | "inflight": "^1.0.4", 256 | "inherits": "2", 257 | "minimatch": "^3.0.4", 258 | "once": "^1.3.0", 259 | "path-is-absolute": "^1.0.0" 260 | } 261 | }, 262 | "growl": { 263 | "version": "1.10.5", 264 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 265 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 266 | "dev": true 267 | }, 268 | "har-schema": { 269 | "version": "2.0.0", 270 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 271 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", 272 | "dev": true 273 | }, 274 | "har-validator": { 275 | "version": "5.1.3", 276 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 277 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 278 | "dev": true, 279 | "requires": { 280 | "ajv": "^6.5.5", 281 | "har-schema": "^2.0.0" 282 | } 283 | }, 284 | "has-flag": { 285 | "version": "3.0.0", 286 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 287 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 288 | "dev": true 289 | }, 290 | "he": { 291 | "version": "1.1.1", 292 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 293 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 294 | "dev": true 295 | }, 296 | "http-proxy-agent": { 297 | "version": "2.1.0", 298 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", 299 | "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", 300 | "dev": true, 301 | "requires": { 302 | "agent-base": "4", 303 | "debug": "3.1.0" 304 | } 305 | }, 306 | "http-signature": { 307 | "version": "1.2.0", 308 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 309 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 310 | "dev": true, 311 | "requires": { 312 | "assert-plus": "^1.0.0", 313 | "jsprim": "^1.2.2", 314 | "sshpk": "^1.7.0" 315 | } 316 | }, 317 | "https-proxy-agent": { 318 | "version": "2.2.1", 319 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", 320 | "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", 321 | "dev": true, 322 | "requires": { 323 | "agent-base": "^4.1.0", 324 | "debug": "^3.1.0" 325 | } 326 | }, 327 | "inflight": { 328 | "version": "1.0.6", 329 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 330 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 331 | "dev": true, 332 | "requires": { 333 | "once": "^1.3.0", 334 | "wrappy": "1" 335 | } 336 | }, 337 | "inherits": { 338 | "version": "2.0.4", 339 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 340 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 341 | "dev": true 342 | }, 343 | "is-typedarray": { 344 | "version": "1.0.0", 345 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 346 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", 347 | "dev": true 348 | }, 349 | "isstream": { 350 | "version": "0.1.2", 351 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 352 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", 353 | "dev": true 354 | }, 355 | "jsbn": { 356 | "version": "0.1.1", 357 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 358 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 359 | "dev": true 360 | }, 361 | "json-schema": { 362 | "version": "0.2.3", 363 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 364 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", 365 | "dev": true 366 | }, 367 | "json-schema-traverse": { 368 | "version": "0.4.1", 369 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 370 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", 371 | "dev": true 372 | }, 373 | "json-stringify-safe": { 374 | "version": "5.0.1", 375 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 376 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", 377 | "dev": true 378 | }, 379 | "jsprim": { 380 | "version": "1.4.1", 381 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 382 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 383 | "dev": true, 384 | "requires": { 385 | "assert-plus": "1.0.0", 386 | "extsprintf": "1.3.0", 387 | "json-schema": "0.2.3", 388 | "verror": "1.10.0" 389 | } 390 | }, 391 | "mime-db": { 392 | "version": "1.40.0", 393 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 394 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==", 395 | "dev": true 396 | }, 397 | "mime-types": { 398 | "version": "2.1.24", 399 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 400 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 401 | "dev": true, 402 | "requires": { 403 | "mime-db": "1.40.0" 404 | } 405 | }, 406 | "minimatch": { 407 | "version": "3.0.4", 408 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 409 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 410 | "dev": true, 411 | "requires": { 412 | "brace-expansion": "^1.1.7" 413 | } 414 | }, 415 | "minimist": { 416 | "version": "0.0.8", 417 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 418 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 419 | "dev": true 420 | }, 421 | "mkdirp": { 422 | "version": "0.5.1", 423 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 424 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 425 | "dev": true, 426 | "requires": { 427 | "minimist": "0.0.8" 428 | } 429 | }, 430 | "mocha": { 431 | "version": "5.2.0", 432 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", 433 | "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", 434 | "dev": true, 435 | "requires": { 436 | "browser-stdout": "1.3.1", 437 | "commander": "2.15.1", 438 | "debug": "3.1.0", 439 | "diff": "3.5.0", 440 | "escape-string-regexp": "1.0.5", 441 | "glob": "7.1.2", 442 | "growl": "1.10.5", 443 | "he": "1.1.1", 444 | "minimatch": "3.0.4", 445 | "mkdirp": "0.5.1", 446 | "supports-color": "5.4.0" 447 | }, 448 | "dependencies": { 449 | "glob": { 450 | "version": "7.1.2", 451 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 452 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 453 | "dev": true, 454 | "requires": { 455 | "fs.realpath": "^1.0.0", 456 | "inflight": "^1.0.4", 457 | "inherits": "2", 458 | "minimatch": "^3.0.4", 459 | "once": "^1.3.0", 460 | "path-is-absolute": "^1.0.0" 461 | } 462 | } 463 | } 464 | }, 465 | "ms": { 466 | "version": "2.0.0", 467 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 468 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 469 | "dev": true 470 | }, 471 | "oauth-sign": { 472 | "version": "0.9.0", 473 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 474 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", 475 | "dev": true 476 | }, 477 | "once": { 478 | "version": "1.4.0", 479 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 480 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 481 | "dev": true, 482 | "requires": { 483 | "wrappy": "1" 484 | } 485 | }, 486 | "path-is-absolute": { 487 | "version": "1.0.1", 488 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 489 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 490 | "dev": true 491 | }, 492 | "performance-now": { 493 | "version": "2.1.0", 494 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 495 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", 496 | "dev": true 497 | }, 498 | "psl": { 499 | "version": "1.2.0", 500 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.2.0.tgz", 501 | "integrity": "sha512-GEn74ZffufCmkDDLNcl3uuyF/aSD6exEyh1v/ZSdAomB82t6G9hzJVRx0jBmLDW+VfZqks3aScmMw9DszwUalA==", 502 | "dev": true 503 | }, 504 | "punycode": { 505 | "version": "2.1.1", 506 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 507 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", 508 | "dev": true 509 | }, 510 | "qs": { 511 | "version": "6.5.2", 512 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 513 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", 514 | "dev": true 515 | }, 516 | "querystringify": { 517 | "version": "2.1.1", 518 | "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", 519 | "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", 520 | "dev": true 521 | }, 522 | "request": { 523 | "version": "2.88.0", 524 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 525 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 526 | "dev": true, 527 | "requires": { 528 | "aws-sign2": "~0.7.0", 529 | "aws4": "^1.8.0", 530 | "caseless": "~0.12.0", 531 | "combined-stream": "~1.0.6", 532 | "extend": "~3.0.2", 533 | "forever-agent": "~0.6.1", 534 | "form-data": "~2.3.2", 535 | "har-validator": "~5.1.0", 536 | "http-signature": "~1.2.0", 537 | "is-typedarray": "~1.0.0", 538 | "isstream": "~0.1.2", 539 | "json-stringify-safe": "~5.0.1", 540 | "mime-types": "~2.1.19", 541 | "oauth-sign": "~0.9.0", 542 | "performance-now": "^2.1.0", 543 | "qs": "~6.5.2", 544 | "safe-buffer": "^5.1.2", 545 | "tough-cookie": "~2.4.3", 546 | "tunnel-agent": "^0.6.0", 547 | "uuid": "^3.3.2" 548 | } 549 | }, 550 | "requires-port": { 551 | "version": "1.0.0", 552 | "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", 553 | "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", 554 | "dev": true 555 | }, 556 | "safe-buffer": { 557 | "version": "5.1.2", 558 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 559 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", 560 | "dev": true 561 | }, 562 | "safer-buffer": { 563 | "version": "2.1.2", 564 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 565 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", 566 | "dev": true 567 | }, 568 | "semver": { 569 | "version": "5.7.0", 570 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 571 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==" 572 | }, 573 | "source-map": { 574 | "version": "0.6.1", 575 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 576 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 577 | "dev": true 578 | }, 579 | "source-map-support": { 580 | "version": "0.5.12", 581 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz", 582 | "integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==", 583 | "dev": true, 584 | "requires": { 585 | "buffer-from": "^1.0.0", 586 | "source-map": "^0.6.0" 587 | } 588 | }, 589 | "sshpk": { 590 | "version": "1.16.1", 591 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 592 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 593 | "dev": true, 594 | "requires": { 595 | "asn1": "~0.2.3", 596 | "assert-plus": "^1.0.0", 597 | "bcrypt-pbkdf": "^1.0.0", 598 | "dashdash": "^1.12.0", 599 | "ecc-jsbn": "~0.1.1", 600 | "getpass": "^0.1.1", 601 | "jsbn": "~0.1.0", 602 | "safer-buffer": "^2.0.2", 603 | "tweetnacl": "~0.14.0" 604 | } 605 | }, 606 | "supports-color": { 607 | "version": "5.4.0", 608 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 609 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 610 | "dev": true, 611 | "requires": { 612 | "has-flag": "^3.0.0" 613 | } 614 | }, 615 | "tough-cookie": { 616 | "version": "2.4.3", 617 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 618 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 619 | "dev": true, 620 | "requires": { 621 | "psl": "^1.1.24", 622 | "punycode": "^1.4.1" 623 | }, 624 | "dependencies": { 625 | "punycode": { 626 | "version": "1.4.1", 627 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 628 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", 629 | "dev": true 630 | } 631 | } 632 | }, 633 | "tunnel-agent": { 634 | "version": "0.6.0", 635 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 636 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 637 | "dev": true, 638 | "requires": { 639 | "safe-buffer": "^5.0.1" 640 | } 641 | }, 642 | "tweetnacl": { 643 | "version": "0.14.5", 644 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 645 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 646 | "dev": true 647 | }, 648 | "uri-js": { 649 | "version": "4.2.2", 650 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 651 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 652 | "dev": true, 653 | "requires": { 654 | "punycode": "^2.1.0" 655 | } 656 | }, 657 | "url-parse": { 658 | "version": "1.4.7", 659 | "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", 660 | "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", 661 | "dev": true, 662 | "requires": { 663 | "querystringify": "^2.1.1", 664 | "requires-port": "^1.0.0" 665 | } 666 | }, 667 | "uuid": { 668 | "version": "3.3.2", 669 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", 670 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", 671 | "dev": true 672 | }, 673 | "verror": { 674 | "version": "1.10.0", 675 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 676 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 677 | "dev": true, 678 | "requires": { 679 | "assert-plus": "^1.0.0", 680 | "core-util-is": "1.0.2", 681 | "extsprintf": "^1.2.0" 682 | } 683 | }, 684 | "vscode": { 685 | "version": "1.1.35", 686 | "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.35.tgz", 687 | "integrity": "sha512-xPnxzQU40LOS2yPyzWW+WKpTV6qA3z16TcgpZ9O38UWLA157Zz4GxUx5H7Gd07pxzw0GqvusbF4D+5GBgNxvEQ==", 688 | "dev": true, 689 | "requires": { 690 | "glob": "^7.1.2", 691 | "mocha": "^5.2.0", 692 | "request": "^2.88.0", 693 | "semver": "^5.4.1", 694 | "source-map-support": "^0.5.0", 695 | "url-parse": "^1.4.4", 696 | "vscode-test": "^0.4.1" 697 | } 698 | }, 699 | "vscode-jsonrpc": { 700 | "version": "4.0.0", 701 | "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", 702 | "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" 703 | }, 704 | "vscode-languageclient": { 705 | "version": "5.2.1", 706 | "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-5.2.1.tgz", 707 | "integrity": "sha512-7jrS/9WnV0ruqPamN1nE7qCxn0phkH5LjSgSp9h6qoJGoeAKzwKz/PF6M+iGA/aklx4GLZg1prddhEPQtuXI1Q==", 708 | "requires": { 709 | "semver": "^5.5.0", 710 | "vscode-languageserver-protocol": "3.14.1" 711 | } 712 | }, 713 | "vscode-languageserver-protocol": { 714 | "version": "3.14.1", 715 | "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz", 716 | "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==", 717 | "requires": { 718 | "vscode-jsonrpc": "^4.0.0", 719 | "vscode-languageserver-types": "3.14.0" 720 | } 721 | }, 722 | "vscode-languageserver-types": { 723 | "version": "3.14.0", 724 | "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", 725 | "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" 726 | }, 727 | "vscode-test": { 728 | "version": "0.4.3", 729 | "resolved": "https://registry.npmjs.org/vscode-test/-/vscode-test-0.4.3.tgz", 730 | "integrity": "sha512-EkMGqBSefZH2MgW65nY05rdRSko15uvzq4VAPM5jVmwYuFQKE7eikKXNJDRxL+OITXHB6pI+a3XqqD32Y3KC5w==", 731 | "dev": true, 732 | "requires": { 733 | "http-proxy-agent": "^2.1.0", 734 | "https-proxy-agent": "^2.2.1" 735 | } 736 | }, 737 | "wrappy": { 738 | "version": "1.0.2", 739 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 740 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 741 | "dev": true 742 | } 743 | } 744 | } 745 | -------------------------------------------------------------------------------- /client/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-type-checker-client", 3 | "description": "VSCode integration for the svelte-type-checker language-server", 4 | "author": "David Pershouse", 5 | "license": "MIT", 6 | "version": "0.0.1", 7 | "engines": { 8 | "vscode": "^1.33.0" 9 | }, 10 | "scripts": { 11 | "update-vscode": "vscode-install", 12 | "postinstall": "vscode-install" 13 | }, 14 | "dependencies": { 15 | "vscode-languageclient": "^5.2.1" 16 | }, 17 | "devDependencies": { 18 | "vscode": "^1.1.35" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /client/src/extension.ts: -------------------------------------------------------------------------------- 1 | import * as path from 'path'; 2 | import { ExtensionContext } from 'vscode'; 3 | 4 | import { 5 | LanguageClient, 6 | LanguageClientOptions, 7 | ServerOptions, 8 | TransportKind 9 | } from 'vscode-languageclient'; 10 | 11 | let client: LanguageClient; 12 | 13 | export function activate(context: ExtensionContext) { 14 | // The server is implemented in node 15 | let serverModule = context.asAbsolutePath( 16 | path.join('server', 'out', 'server.js') 17 | ); 18 | // The debug options for the server 19 | // --inspect=6009: runs the server in Node's Inspector mode so VS Code can attach to the server for debugging 20 | let debugOptions = { execArgv: ['--nolazy', '--inspect=6010'] }; 21 | 22 | // If the extension is launched in debug mode then the debug server options are used 23 | // Otherwise the run options are used 24 | let serverOptions: ServerOptions = { 25 | run: { module: serverModule, transport: TransportKind.ipc }, 26 | debug: { 27 | module: serverModule, 28 | transport: TransportKind.ipc, 29 | options: debugOptions 30 | } 31 | }; 32 | 33 | let clientOptions: LanguageClientOptions = { 34 | documentSelector: [{ scheme: 'file', language: 'svelte' }], 35 | synchronize: { 36 | configurationSection: "svelte-type-checker" 37 | } 38 | }; 39 | 40 | // Create the language client and start the client. 41 | client = new LanguageClient( 42 | 'svelte-type-checker-language-server-client', 43 | 'Svelte Type Checker Client', 44 | serverOptions, 45 | clientOptions 46 | ); 47 | 48 | // Start the client. This will also launch the server 49 | client.start(); 50 | } 51 | 52 | export function deactivate(): Thenable | undefined { 53 | if (!client) { 54 | return undefined; 55 | } 56 | return client.stop(); 57 | } 58 | -------------------------------------------------------------------------------- /client/src/test/completion.test.ts: -------------------------------------------------------------------------------- 1 | /* -------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | * ------------------------------------------------------------------------------------------ */ 5 | 6 | import * as vscode from 'vscode'; 7 | import * as assert from 'assert'; 8 | import { getDocUri, activate } from './helper'; 9 | 10 | describe('Should do completion', () => { 11 | const docUri = getDocUri('completion.txt'); 12 | 13 | it('Completes JS/TS in txt file', async () => { 14 | await testCompletion(docUri, new vscode.Position(0, 0), { 15 | items: [ 16 | { label: 'JavaScript', kind: vscode.CompletionItemKind.Text }, 17 | { label: 'TypeScript', kind: vscode.CompletionItemKind.Text } 18 | ] 19 | }); 20 | }); 21 | }); 22 | 23 | async function testCompletion( 24 | docUri: vscode.Uri, 25 | position: vscode.Position, 26 | expectedCompletionList: vscode.CompletionList 27 | ) { 28 | await activate(docUri); 29 | 30 | // Executing the command `vscode.executeCompletionItemProvider` to simulate triggering completion 31 | const actualCompletionList = (await vscode.commands.executeCommand( 32 | 'vscode.executeCompletionItemProvider', 33 | docUri, 34 | position 35 | )) as vscode.CompletionList; 36 | 37 | assert.equal(actualCompletionList.items.length, expectedCompletionList.items.length); 38 | expectedCompletionList.items.forEach((expectedItem, i) => { 39 | const actualItem = actualCompletionList.items[i]; 40 | assert.equal(actualItem.label, expectedItem.label); 41 | assert.equal(actualItem.kind, expectedItem.kind); 42 | }); 43 | } 44 | -------------------------------------------------------------------------------- /client/src/test/diagnostics.test.ts: -------------------------------------------------------------------------------- 1 | /* -------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | * ------------------------------------------------------------------------------------------ */ 5 | 6 | import * as vscode from 'vscode' 7 | import * as assert from 'assert' 8 | import { getDocUri, activate } from './helper' 9 | 10 | describe('Should get diagnostics', () => { 11 | const docUri = getDocUri('diagnostics.txt') 12 | 13 | it('Diagnoses uppercase texts', async () => { 14 | await testDiagnostics(docUri, [ 15 | { message: 'ANY is all uppercase.', range: toRange(0, 0, 0, 3), severity: vscode.DiagnosticSeverity.Warning, source: 'ex' }, 16 | { message: 'ANY is all uppercase.', range: toRange(0, 14, 0, 17), severity: vscode.DiagnosticSeverity.Warning, source: 'ex' }, 17 | { message: 'OS is all uppercase.', range: toRange(0, 18, 0, 20), severity: vscode.DiagnosticSeverity.Warning, source: 'ex' } 18 | ]) 19 | }) 20 | }) 21 | 22 | function toRange(sLine: number, sChar: number, eLine: number, eChar: number) { 23 | const start = new vscode.Position(sLine, sChar) 24 | const end = new vscode.Position(eLine, eChar) 25 | return new vscode.Range(start, end) 26 | } 27 | 28 | async function testDiagnostics(docUri: vscode.Uri, expectedDiagnostics: vscode.Diagnostic[]) { 29 | await activate(docUri) 30 | 31 | const actualDiagnostics = vscode.languages.getDiagnostics(docUri); 32 | 33 | assert.equal(actualDiagnostics.length, expectedDiagnostics.length); 34 | 35 | expectedDiagnostics.forEach((expectedDiagnostic, i) => { 36 | const actualDiagnostic = actualDiagnostics[i] 37 | assert.equal(actualDiagnostic.message, expectedDiagnostic.message) 38 | assert.deepEqual(actualDiagnostic.range, expectedDiagnostic.range) 39 | assert.equal(actualDiagnostic.severity, expectedDiagnostic.severity) 40 | }) 41 | } -------------------------------------------------------------------------------- /client/src/test/helper.ts: -------------------------------------------------------------------------------- 1 | /* -------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | * ------------------------------------------------------------------------------------------ */ 5 | 6 | import * as vscode from 'vscode'; 7 | import * as path from 'path'; 8 | 9 | export let doc: vscode.TextDocument; 10 | export let editor: vscode.TextEditor; 11 | export let documentEol: string; 12 | export let platformEol: string; 13 | 14 | /** 15 | * Activates the vscode.lsp-sample extension 16 | */ 17 | export async function activate(docUri: vscode.Uri) { 18 | // The extensionId is `publisher.name` from package.json 19 | const ext = vscode.extensions.getExtension('vscode-samples.lsp-sample')!; 20 | await ext.activate(); 21 | try { 22 | doc = await vscode.workspace.openTextDocument(docUri); 23 | editor = await vscode.window.showTextDocument(doc); 24 | await sleep(2000); // Wait for server activation 25 | } catch (e) { 26 | console.error(e); 27 | } 28 | } 29 | 30 | async function sleep(ms: number) { 31 | return new Promise(resolve => setTimeout(resolve, ms)); 32 | } 33 | 34 | export const getDocPath = (p: string) => { 35 | return path.resolve(__dirname, '../../testFixture', p); 36 | }; 37 | export const getDocUri = (p: string) => { 38 | return vscode.Uri.file(getDocPath(p)); 39 | }; 40 | 41 | export async function setTestContent(content: string): Promise { 42 | const all = new vscode.Range( 43 | doc.positionAt(0), 44 | doc.positionAt(doc.getText().length) 45 | ); 46 | return editor.edit(eb => eb.replace(all, content)); 47 | } 48 | -------------------------------------------------------------------------------- /client/src/test/index.ts: -------------------------------------------------------------------------------- 1 | /* -------------------------------------------------------------------------------------------- 2 | * Copyright (c) Microsoft Corporation. All rights reserved. 3 | * Licensed under the MIT License. See License.txt in the project root for license information. 4 | * ------------------------------------------------------------------------------------------ */ 5 | 6 | import * as testRunner from 'vscode/lib/testrunner'; 7 | 8 | testRunner.configure({ 9 | ui: 'bdd', 10 | useColors: true, 11 | timeout: 100000 12 | }); 13 | 14 | module.exports = testRunner; -------------------------------------------------------------------------------- /client/testFixture/completion.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfnelson/svelte-type-checker-vscode/bdad3a6d9c84025e76b4e762ad5e0159fbd4b197/client/testFixture/completion.txt -------------------------------------------------------------------------------- /client/testFixture/diagnostics.txt: -------------------------------------------------------------------------------- 1 | ANY browsers, ANY OS. -------------------------------------------------------------------------------- /client/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "outDir": "out", 6 | "rootDir": "src", 7 | "sourceMap": true 8 | }, 9 | "include": ["src"], 10 | "exclude": ["node_modules", ".vscode-test"] 11 | } 12 | -------------------------------------------------------------------------------- /icons/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfnelson/svelte-type-checker-vscode/bdad3a6d9c84025e76b4e762ad5e0159fbd4b197/icons/logo.png -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-type-checker-vscode", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@babel/code-frame": { 8 | "version": "7.0.0", 9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", 10 | "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", 11 | "dev": true, 12 | "requires": { 13 | "@babel/highlight": "^7.0.0" 14 | } 15 | }, 16 | "@babel/highlight": { 17 | "version": "7.0.0", 18 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", 19 | "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", 20 | "dev": true, 21 | "requires": { 22 | "chalk": "^2.0.0", 23 | "esutils": "^2.0.2", 24 | "js-tokens": "^4.0.0" 25 | } 26 | }, 27 | "@types/mocha": { 28 | "version": "5.2.7", 29 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.7.tgz", 30 | "integrity": "sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==", 31 | "dev": true 32 | }, 33 | "@types/node": { 34 | "version": "12.11.7", 35 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.11.7.tgz", 36 | "integrity": "sha512-JNbGaHFCLwgHn/iCckiGSOZ1XYHsKFwREtzPwSGCVld1SGhOlmZw2D4ZI94HQCrBHbADzW9m4LER/8olJTRGHA==", 37 | "dev": true 38 | }, 39 | "ansi-styles": { 40 | "version": "3.2.1", 41 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 42 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 43 | "dev": true, 44 | "requires": { 45 | "color-convert": "^1.9.0" 46 | } 47 | }, 48 | "argparse": { 49 | "version": "1.0.10", 50 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 51 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 52 | "dev": true, 53 | "requires": { 54 | "sprintf-js": "~1.0.2" 55 | } 56 | }, 57 | "balanced-match": { 58 | "version": "1.0.0", 59 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 60 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 61 | "dev": true 62 | }, 63 | "brace-expansion": { 64 | "version": "1.1.11", 65 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 66 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 67 | "dev": true, 68 | "requires": { 69 | "balanced-match": "^1.0.0", 70 | "concat-map": "0.0.1" 71 | } 72 | }, 73 | "builtin-modules": { 74 | "version": "1.1.1", 75 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 76 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 77 | "dev": true 78 | }, 79 | "chalk": { 80 | "version": "2.4.2", 81 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 82 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 83 | "dev": true, 84 | "requires": { 85 | "ansi-styles": "^3.2.1", 86 | "escape-string-regexp": "^1.0.5", 87 | "supports-color": "^5.3.0" 88 | } 89 | }, 90 | "color-convert": { 91 | "version": "1.9.3", 92 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 93 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 94 | "dev": true, 95 | "requires": { 96 | "color-name": "1.1.3" 97 | } 98 | }, 99 | "color-name": { 100 | "version": "1.1.3", 101 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 102 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 103 | "dev": true 104 | }, 105 | "commander": { 106 | "version": "2.20.0", 107 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz", 108 | "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==", 109 | "dev": true 110 | }, 111 | "concat-map": { 112 | "version": "0.0.1", 113 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 114 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 115 | "dev": true 116 | }, 117 | "diff": { 118 | "version": "3.5.0", 119 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 120 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 121 | "dev": true 122 | }, 123 | "escape-string-regexp": { 124 | "version": "1.0.5", 125 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 126 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 127 | "dev": true 128 | }, 129 | "esprima": { 130 | "version": "4.0.1", 131 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 132 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 133 | "dev": true 134 | }, 135 | "esutils": { 136 | "version": "2.0.2", 137 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 138 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 139 | "dev": true 140 | }, 141 | "fs.realpath": { 142 | "version": "1.0.0", 143 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 144 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 145 | "dev": true 146 | }, 147 | "glob": { 148 | "version": "7.1.4", 149 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", 150 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", 151 | "dev": true, 152 | "requires": { 153 | "fs.realpath": "^1.0.0", 154 | "inflight": "^1.0.4", 155 | "inherits": "2", 156 | "minimatch": "^3.0.4", 157 | "once": "^1.3.0", 158 | "path-is-absolute": "^1.0.0" 159 | } 160 | }, 161 | "has-flag": { 162 | "version": "3.0.0", 163 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 164 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 165 | "dev": true 166 | }, 167 | "inflight": { 168 | "version": "1.0.6", 169 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 170 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 171 | "dev": true, 172 | "requires": { 173 | "once": "^1.3.0", 174 | "wrappy": "1" 175 | } 176 | }, 177 | "inherits": { 178 | "version": "2.0.3", 179 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 180 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 181 | "dev": true 182 | }, 183 | "js-tokens": { 184 | "version": "4.0.0", 185 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 186 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 187 | "dev": true 188 | }, 189 | "js-yaml": { 190 | "version": "3.13.1", 191 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 192 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 193 | "dev": true, 194 | "requires": { 195 | "argparse": "^1.0.7", 196 | "esprima": "^4.0.0" 197 | } 198 | }, 199 | "minimatch": { 200 | "version": "3.0.4", 201 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 202 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 203 | "dev": true, 204 | "requires": { 205 | "brace-expansion": "^1.1.7" 206 | } 207 | }, 208 | "minimist": { 209 | "version": "0.0.8", 210 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 211 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 212 | "dev": true 213 | }, 214 | "mkdirp": { 215 | "version": "0.5.1", 216 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 217 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 218 | "dev": true, 219 | "requires": { 220 | "minimist": "0.0.8" 221 | } 222 | }, 223 | "once": { 224 | "version": "1.4.0", 225 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 226 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 227 | "dev": true, 228 | "requires": { 229 | "wrappy": "1" 230 | } 231 | }, 232 | "path-is-absolute": { 233 | "version": "1.0.1", 234 | "resolved": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 235 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 236 | "dev": true 237 | }, 238 | "path-parse": { 239 | "version": "1.0.6", 240 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 241 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 242 | "dev": true 243 | }, 244 | "resolve": { 245 | "version": "1.10.1", 246 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz", 247 | "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==", 248 | "dev": true, 249 | "requires": { 250 | "path-parse": "^1.0.6" 251 | } 252 | }, 253 | "semver": { 254 | "version": "5.7.0", 255 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz", 256 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==", 257 | "dev": true 258 | }, 259 | "sprintf-js": { 260 | "version": "1.0.3", 261 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 262 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 263 | "dev": true 264 | }, 265 | "supports-color": { 266 | "version": "5.5.0", 267 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 268 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 269 | "dev": true, 270 | "requires": { 271 | "has-flag": "^3.0.0" 272 | } 273 | }, 274 | "tslib": { 275 | "version": "1.9.3", 276 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 277 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", 278 | "dev": true 279 | }, 280 | "tslint": { 281 | "version": "5.16.0", 282 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.16.0.tgz", 283 | "integrity": "sha512-UxG2yNxJ5pgGwmMzPMYh/CCnCnh0HfPgtlVRDs1ykZklufFBL1ZoTlWFRz2NQjcoEiDoRp+JyT0lhBbbH/obyA==", 284 | "dev": true, 285 | "requires": { 286 | "@babel/code-frame": "^7.0.0", 287 | "builtin-modules": "^1.1.1", 288 | "chalk": "^2.3.0", 289 | "commander": "^2.12.1", 290 | "diff": "^3.2.0", 291 | "glob": "^7.1.1", 292 | "js-yaml": "^3.13.0", 293 | "minimatch": "^3.0.4", 294 | "mkdirp": "^0.5.1", 295 | "resolve": "^1.3.2", 296 | "semver": "^5.3.0", 297 | "tslib": "^1.8.0", 298 | "tsutils": "^2.29.0" 299 | } 300 | }, 301 | "tsutils": { 302 | "version": "2.29.0", 303 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 304 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 305 | "dev": true, 306 | "requires": { 307 | "tslib": "^1.8.1" 308 | } 309 | }, 310 | "typescript": { 311 | "version": "3.6.4", 312 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.6.4.tgz", 313 | "integrity": "sha512-unoCll1+l+YK4i4F8f22TaNVPRHcD9PA3yCuZ8g5e0qGqlVlJ/8FSateOLLSagn+Yg5+ZwuPkL8LFUc0Jcvksg==", 314 | "dev": true 315 | }, 316 | "wrappy": { 317 | "version": "1.0.2", 318 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 319 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 320 | "dev": true 321 | } 322 | } 323 | } 324 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-type-checker-vscode", 3 | "displayName": "Svelte Type Checker", 4 | "description": "Check types in your Svelte 3 projects", 5 | "author": "David Pershouse", 6 | "publisher": "halfnelson", 7 | "license": "MIT", 8 | "version": "0.1.0", 9 | "icon": "icons/logo.png", 10 | "galleryBanner": { 11 | "color": "#FF3E00", 12 | "theme": "dark" 13 | }, 14 | "repository": { 15 | "type": "git", 16 | "url": "https://github.com/halfnelson/svelte-type-checker-vscode" 17 | }, 18 | "keywords": [ 19 | "svelte", 20 | "typescript", 21 | "vscode" 22 | ], 23 | "categories": [ 24 | "Programming Languages" 25 | ], 26 | "engines": { 27 | "vscode": "^1.33.0" 28 | }, 29 | "activationEvents": [ 30 | "onLanguage:svelte" 31 | ], 32 | "main": "./client/out/extension", 33 | "contributes": { 34 | "configuration": { 35 | "type": "object", 36 | "title": "Svelte Type Checker", 37 | "properties": { 38 | "svelte-type-checker.enableHoverHints": { 39 | "type": "boolean", 40 | "default": false, 41 | "description": "Show hints from the typescript service on hover" 42 | }, 43 | "svelte-type-checker.enableDefinitions": { 44 | "type": "boolean", 45 | "default": false, 46 | "description": "Enable go to definition" 47 | }, 48 | "svelte-type-checker.enableCompletion": { 49 | "type": "boolean", 50 | "default": false, 51 | "description": "Provide completion suggestions for script and component props" 52 | } 53 | } 54 | } 55 | }, 56 | "scripts": { 57 | "vscode:prepublish": "cd client && npm run update-vscode && cd .. && npm run compile", 58 | "compile": "tsc -b", 59 | "watch": "tsc -b -w", 60 | "postinstall": "cd client && npm install && cd ../server && npm install && cd ..", 61 | "test": "sh ./scripts/e2e.sh" 62 | }, 63 | "devDependencies": { 64 | "@types/mocha": "^5.2.7", 65 | "@types/node": "^12.11.7", 66 | "tslint": "^5.16.0", 67 | "typescript": "^3.6.4" 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /samples/await-types.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfnelson/svelte-type-checker-vscode/bdad3a6d9c84025e76b4e762ad5e0159fbd4b197/samples/await-types.png -------------------------------------------------------------------------------- /samples/prop-complete.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfnelson/svelte-type-checker-vscode/bdad3a6d9c84025e76b4e762ad5e0159fbd4b197/samples/prop-complete.png -------------------------------------------------------------------------------- /samples/prop-type-check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfnelson/svelte-type-checker-vscode/bdad3a6d9c84025e76b4e762ad5e0159fbd4b197/samples/prop-type-check.png -------------------------------------------------------------------------------- /samples/slot-param-info.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfnelson/svelte-type-checker-vscode/bdad3a6d9c84025e76b4e762ad5e0159fbd4b197/samples/slot-param-info.png -------------------------------------------------------------------------------- /samples/slot-param-type-check.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfnelson/svelte-type-checker-vscode/bdad3a6d9c84025e76b4e762ad5e0159fbd4b197/samples/slot-param-type-check.png -------------------------------------------------------------------------------- /samples/store-types.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfnelson/svelte-type-checker-vscode/bdad3a6d9c84025e76b4e762ad5e0159fbd4b197/samples/store-types.png -------------------------------------------------------------------------------- /samples/transition-parameter-types.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/halfnelson/svelte-type-checker-vscode/bdad3a6d9c84025e76b4e762ad5e0159fbd4b197/samples/transition-parameter-types.png -------------------------------------------------------------------------------- /scripts/e2e.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | export CODE_TESTS_PATH="$(pwd)/client/out/test" 4 | export CODE_TESTS_WORKSPACE="$(pwd)/client/testFixture" 5 | 6 | node "$(pwd)/client/node_modules/vscode/bin/test" -------------------------------------------------------------------------------- /server/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-type-checker-language-server", 3 | "version": "0.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ansi-colors": { 8 | "version": "3.2.3", 9 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", 10 | "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", 11 | "dev": true 12 | }, 13 | "ansi-regex": { 14 | "version": "3.0.0", 15 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 16 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", 17 | "dev": true 18 | }, 19 | "ansi-styles": { 20 | "version": "3.2.1", 21 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 22 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 23 | "dev": true, 24 | "requires": { 25 | "color-convert": "^1.9.0" 26 | } 27 | }, 28 | "argparse": { 29 | "version": "1.0.10", 30 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 31 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 32 | "dev": true, 33 | "requires": { 34 | "sprintf-js": "~1.0.2" 35 | } 36 | }, 37 | "assertion-error": { 38 | "version": "1.1.0", 39 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 40 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 41 | "dev": true 42 | }, 43 | "balanced-match": { 44 | "version": "1.0.0", 45 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 46 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 47 | "dev": true 48 | }, 49 | "brace-expansion": { 50 | "version": "1.1.11", 51 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 52 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 53 | "dev": true, 54 | "requires": { 55 | "balanced-match": "^1.0.0", 56 | "concat-map": "0.0.1" 57 | } 58 | }, 59 | "browser-stdout": { 60 | "version": "1.3.1", 61 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 62 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 63 | "dev": true 64 | }, 65 | "buffer-from": { 66 | "version": "1.1.1", 67 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 68 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 69 | "dev": true 70 | }, 71 | "camelcase": { 72 | "version": "5.3.1", 73 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 74 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 75 | "dev": true 76 | }, 77 | "chai": { 78 | "version": "4.2.0", 79 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", 80 | "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", 81 | "dev": true, 82 | "requires": { 83 | "assertion-error": "^1.1.0", 84 | "check-error": "^1.0.2", 85 | "deep-eql": "^3.0.1", 86 | "get-func-name": "^2.0.0", 87 | "pathval": "^1.1.0", 88 | "type-detect": "^4.0.5" 89 | } 90 | }, 91 | "chalk": { 92 | "version": "2.4.2", 93 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 94 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 95 | "dev": true, 96 | "requires": { 97 | "ansi-styles": "^3.2.1", 98 | "escape-string-regexp": "^1.0.5", 99 | "supports-color": "^5.3.0" 100 | }, 101 | "dependencies": { 102 | "supports-color": { 103 | "version": "5.5.0", 104 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 105 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 106 | "dev": true, 107 | "requires": { 108 | "has-flag": "^3.0.0" 109 | } 110 | } 111 | } 112 | }, 113 | "check-error": { 114 | "version": "1.0.2", 115 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 116 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 117 | "dev": true 118 | }, 119 | "cliui": { 120 | "version": "5.0.0", 121 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 122 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 123 | "dev": true, 124 | "requires": { 125 | "string-width": "^3.1.0", 126 | "strip-ansi": "^5.2.0", 127 | "wrap-ansi": "^5.1.0" 128 | }, 129 | "dependencies": { 130 | "ansi-regex": { 131 | "version": "4.1.0", 132 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 133 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 134 | "dev": true 135 | }, 136 | "string-width": { 137 | "version": "3.1.0", 138 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 139 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 140 | "dev": true, 141 | "requires": { 142 | "emoji-regex": "^7.0.1", 143 | "is-fullwidth-code-point": "^2.0.0", 144 | "strip-ansi": "^5.1.0" 145 | } 146 | }, 147 | "strip-ansi": { 148 | "version": "5.2.0", 149 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 150 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 151 | "dev": true, 152 | "requires": { 153 | "ansi-regex": "^4.1.0" 154 | } 155 | } 156 | } 157 | }, 158 | "color-convert": { 159 | "version": "1.9.3", 160 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 161 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 162 | "dev": true, 163 | "requires": { 164 | "color-name": "1.1.3" 165 | } 166 | }, 167 | "color-name": { 168 | "version": "1.1.3", 169 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 170 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 171 | "dev": true 172 | }, 173 | "concat-map": { 174 | "version": "0.0.1", 175 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 176 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 177 | "dev": true 178 | }, 179 | "debug": { 180 | "version": "3.2.6", 181 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 182 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 183 | "dev": true, 184 | "requires": { 185 | "ms": "^2.1.1" 186 | } 187 | }, 188 | "decamelize": { 189 | "version": "1.2.0", 190 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 191 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 192 | "dev": true 193 | }, 194 | "deep-eql": { 195 | "version": "3.0.1", 196 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 197 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 198 | "dev": true, 199 | "requires": { 200 | "type-detect": "^4.0.0" 201 | } 202 | }, 203 | "define-properties": { 204 | "version": "1.1.3", 205 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 206 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 207 | "dev": true, 208 | "requires": { 209 | "object-keys": "^1.0.12" 210 | } 211 | }, 212 | "diff": { 213 | "version": "3.5.0", 214 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 215 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 216 | "dev": true 217 | }, 218 | "emoji-regex": { 219 | "version": "7.0.3", 220 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 221 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", 222 | "dev": true 223 | }, 224 | "es-abstract": { 225 | "version": "1.17.0-next.1", 226 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.0-next.1.tgz", 227 | "integrity": "sha512-7MmGr03N7Rnuid6+wyhD9sHNE2n4tFSwExnU2lQl3lIo2ShXWGePY80zYaoMOmILWv57H0amMjZGHNzzGG70Rw==", 228 | "dev": true, 229 | "requires": { 230 | "es-to-primitive": "^1.2.1", 231 | "function-bind": "^1.1.1", 232 | "has": "^1.0.3", 233 | "has-symbols": "^1.0.1", 234 | "is-callable": "^1.1.4", 235 | "is-regex": "^1.0.4", 236 | "object-inspect": "^1.7.0", 237 | "object-keys": "^1.1.1", 238 | "object.assign": "^4.1.0", 239 | "string.prototype.trimleft": "^2.1.0", 240 | "string.prototype.trimright": "^2.1.0" 241 | } 242 | }, 243 | "es-to-primitive": { 244 | "version": "1.2.1", 245 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 246 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 247 | "dev": true, 248 | "requires": { 249 | "is-callable": "^1.1.4", 250 | "is-date-object": "^1.0.1", 251 | "is-symbol": "^1.0.2" 252 | } 253 | }, 254 | "escape-string-regexp": { 255 | "version": "1.0.5", 256 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 257 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 258 | "dev": true 259 | }, 260 | "esprima": { 261 | "version": "4.0.1", 262 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 263 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 264 | "dev": true 265 | }, 266 | "find-up": { 267 | "version": "3.0.0", 268 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 269 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 270 | "dev": true, 271 | "requires": { 272 | "locate-path": "^3.0.0" 273 | } 274 | }, 275 | "flat": { 276 | "version": "4.1.0", 277 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", 278 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", 279 | "dev": true, 280 | "requires": { 281 | "is-buffer": "~2.0.3" 282 | } 283 | }, 284 | "fs.realpath": { 285 | "version": "1.0.0", 286 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 287 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 288 | "dev": true 289 | }, 290 | "function-bind": { 291 | "version": "1.1.1", 292 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 293 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", 294 | "dev": true 295 | }, 296 | "get-caller-file": { 297 | "version": "2.0.5", 298 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 299 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 300 | "dev": true 301 | }, 302 | "get-func-name": { 303 | "version": "2.0.0", 304 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 305 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 306 | "dev": true 307 | }, 308 | "glob": { 309 | "version": "7.1.3", 310 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 311 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 312 | "dev": true, 313 | "requires": { 314 | "fs.realpath": "^1.0.0", 315 | "inflight": "^1.0.4", 316 | "inherits": "2", 317 | "minimatch": "^3.0.4", 318 | "once": "^1.3.0", 319 | "path-is-absolute": "^1.0.0" 320 | } 321 | }, 322 | "growl": { 323 | "version": "1.10.5", 324 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 325 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 326 | "dev": true 327 | }, 328 | "has": { 329 | "version": "1.0.3", 330 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 331 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 332 | "dev": true, 333 | "requires": { 334 | "function-bind": "^1.1.1" 335 | } 336 | }, 337 | "has-flag": { 338 | "version": "3.0.0", 339 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 340 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 341 | "dev": true 342 | }, 343 | "has-symbols": { 344 | "version": "1.0.1", 345 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 346 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", 347 | "dev": true 348 | }, 349 | "he": { 350 | "version": "1.2.0", 351 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 352 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", 353 | "dev": true 354 | }, 355 | "inflight": { 356 | "version": "1.0.6", 357 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 358 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 359 | "dev": true, 360 | "requires": { 361 | "once": "^1.3.0", 362 | "wrappy": "1" 363 | } 364 | }, 365 | "inherits": { 366 | "version": "2.0.4", 367 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 368 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", 369 | "dev": true 370 | }, 371 | "is-buffer": { 372 | "version": "2.0.4", 373 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", 374 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==", 375 | "dev": true 376 | }, 377 | "is-callable": { 378 | "version": "1.1.4", 379 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 380 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", 381 | "dev": true 382 | }, 383 | "is-date-object": { 384 | "version": "1.0.1", 385 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 386 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", 387 | "dev": true 388 | }, 389 | "is-fullwidth-code-point": { 390 | "version": "2.0.0", 391 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 392 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", 393 | "dev": true 394 | }, 395 | "is-regex": { 396 | "version": "1.0.5", 397 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", 398 | "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", 399 | "dev": true, 400 | "requires": { 401 | "has": "^1.0.3" 402 | } 403 | }, 404 | "is-symbol": { 405 | "version": "1.0.3", 406 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 407 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 408 | "dev": true, 409 | "requires": { 410 | "has-symbols": "^1.0.1" 411 | } 412 | }, 413 | "isexe": { 414 | "version": "2.0.0", 415 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 416 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", 417 | "dev": true 418 | }, 419 | "js-yaml": { 420 | "version": "3.13.1", 421 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 422 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 423 | "dev": true, 424 | "requires": { 425 | "argparse": "^1.0.7", 426 | "esprima": "^4.0.0" 427 | } 428 | }, 429 | "locate-path": { 430 | "version": "3.0.0", 431 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 432 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 433 | "dev": true, 434 | "requires": { 435 | "p-locate": "^3.0.0", 436 | "path-exists": "^3.0.0" 437 | } 438 | }, 439 | "lodash": { 440 | "version": "4.17.15", 441 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 442 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", 443 | "dev": true 444 | }, 445 | "log-symbols": { 446 | "version": "2.2.0", 447 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", 448 | "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", 449 | "dev": true, 450 | "requires": { 451 | "chalk": "^2.0.1" 452 | } 453 | }, 454 | "minimatch": { 455 | "version": "3.0.4", 456 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 457 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 458 | "dev": true, 459 | "requires": { 460 | "brace-expansion": "^1.1.7" 461 | } 462 | }, 463 | "minimist": { 464 | "version": "0.0.8", 465 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 466 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 467 | "dev": true 468 | }, 469 | "mkdirp": { 470 | "version": "0.5.1", 471 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 472 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 473 | "dev": true, 474 | "requires": { 475 | "minimist": "0.0.8" 476 | } 477 | }, 478 | "mocha": { 479 | "version": "6.2.2", 480 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz", 481 | "integrity": "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==", 482 | "dev": true, 483 | "requires": { 484 | "ansi-colors": "3.2.3", 485 | "browser-stdout": "1.3.1", 486 | "debug": "3.2.6", 487 | "diff": "3.5.0", 488 | "escape-string-regexp": "1.0.5", 489 | "find-up": "3.0.0", 490 | "glob": "7.1.3", 491 | "growl": "1.10.5", 492 | "he": "1.2.0", 493 | "js-yaml": "3.13.1", 494 | "log-symbols": "2.2.0", 495 | "minimatch": "3.0.4", 496 | "mkdirp": "0.5.1", 497 | "ms": "2.1.1", 498 | "node-environment-flags": "1.0.5", 499 | "object.assign": "4.1.0", 500 | "strip-json-comments": "2.0.1", 501 | "supports-color": "6.0.0", 502 | "which": "1.3.1", 503 | "wide-align": "1.1.3", 504 | "yargs": "13.3.0", 505 | "yargs-parser": "13.1.1", 506 | "yargs-unparser": "1.6.0" 507 | } 508 | }, 509 | "ms": { 510 | "version": "2.1.1", 511 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 512 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 513 | "dev": true 514 | }, 515 | "node-environment-flags": { 516 | "version": "1.0.5", 517 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", 518 | "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", 519 | "dev": true, 520 | "requires": { 521 | "object.getownpropertydescriptors": "^2.0.3", 522 | "semver": "^5.7.0" 523 | } 524 | }, 525 | "object-inspect": { 526 | "version": "1.7.0", 527 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 528 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", 529 | "dev": true 530 | }, 531 | "object-keys": { 532 | "version": "1.1.1", 533 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 534 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 535 | "dev": true 536 | }, 537 | "object.assign": { 538 | "version": "4.1.0", 539 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 540 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 541 | "dev": true, 542 | "requires": { 543 | "define-properties": "^1.1.2", 544 | "function-bind": "^1.1.1", 545 | "has-symbols": "^1.0.0", 546 | "object-keys": "^1.0.11" 547 | } 548 | }, 549 | "object.getownpropertydescriptors": { 550 | "version": "2.1.0", 551 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", 552 | "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", 553 | "dev": true, 554 | "requires": { 555 | "define-properties": "^1.1.3", 556 | "es-abstract": "^1.17.0-next.1" 557 | } 558 | }, 559 | "once": { 560 | "version": "1.4.0", 561 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 562 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 563 | "dev": true, 564 | "requires": { 565 | "wrappy": "1" 566 | } 567 | }, 568 | "p-limit": { 569 | "version": "2.2.1", 570 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", 571 | "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", 572 | "dev": true, 573 | "requires": { 574 | "p-try": "^2.0.0" 575 | } 576 | }, 577 | "p-locate": { 578 | "version": "3.0.0", 579 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 580 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 581 | "dev": true, 582 | "requires": { 583 | "p-limit": "^2.0.0" 584 | } 585 | }, 586 | "p-try": { 587 | "version": "2.2.0", 588 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 589 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", 590 | "dev": true 591 | }, 592 | "path-exists": { 593 | "version": "3.0.0", 594 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 595 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", 596 | "dev": true 597 | }, 598 | "path-is-absolute": { 599 | "version": "1.0.1", 600 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 601 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 602 | "dev": true 603 | }, 604 | "pathval": { 605 | "version": "1.1.0", 606 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", 607 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 608 | "dev": true 609 | }, 610 | "require-directory": { 611 | "version": "2.1.1", 612 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 613 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", 614 | "dev": true 615 | }, 616 | "require-main-filename": { 617 | "version": "2.0.0", 618 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 619 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", 620 | "dev": true 621 | }, 622 | "semver": { 623 | "version": "5.7.1", 624 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 625 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 626 | "dev": true 627 | }, 628 | "set-blocking": { 629 | "version": "2.0.0", 630 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 631 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", 632 | "dev": true 633 | }, 634 | "source-map": { 635 | "version": "0.6.1", 636 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 637 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" 638 | }, 639 | "source-map-support": { 640 | "version": "0.5.16", 641 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.16.tgz", 642 | "integrity": "sha512-efyLRJDr68D9hBBNIPWFjhpFzURh+KJykQwvMyW5UiZzYwoF6l4YMMDIJJEyFWxWCqfyxLzz6tSfUFR+kXXsVQ==", 643 | "dev": true, 644 | "requires": { 645 | "buffer-from": "^1.0.0", 646 | "source-map": "^0.6.0" 647 | } 648 | }, 649 | "sprintf-js": { 650 | "version": "1.0.3", 651 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 652 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 653 | "dev": true 654 | }, 655 | "string-width": { 656 | "version": "2.1.1", 657 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 658 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 659 | "dev": true, 660 | "requires": { 661 | "is-fullwidth-code-point": "^2.0.0", 662 | "strip-ansi": "^4.0.0" 663 | } 664 | }, 665 | "string.prototype.trimleft": { 666 | "version": "2.1.0", 667 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", 668 | "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", 669 | "dev": true, 670 | "requires": { 671 | "define-properties": "^1.1.3", 672 | "function-bind": "^1.1.1" 673 | } 674 | }, 675 | "string.prototype.trimright": { 676 | "version": "2.1.0", 677 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", 678 | "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", 679 | "dev": true, 680 | "requires": { 681 | "define-properties": "^1.1.3", 682 | "function-bind": "^1.1.1" 683 | } 684 | }, 685 | "strip-ansi": { 686 | "version": "4.0.0", 687 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 688 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 689 | "dev": true, 690 | "requires": { 691 | "ansi-regex": "^3.0.0" 692 | } 693 | }, 694 | "strip-json-comments": { 695 | "version": "2.0.1", 696 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 697 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", 698 | "dev": true 699 | }, 700 | "supports-color": { 701 | "version": "6.0.0", 702 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", 703 | "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", 704 | "dev": true, 705 | "requires": { 706 | "has-flag": "^3.0.0" 707 | } 708 | }, 709 | "svelte": { 710 | "version": "3.16.0", 711 | "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.16.0.tgz", 712 | "integrity": "sha512-k7nCQTd9/rGOi25iv/sBeJe2W89hK2lcaUsmUQqikH0Tye7Gh/tvvF9LuNTSF+dQY/isNX+g8K9fJf+5jMLfxw==" 713 | }, 714 | "svelte2tsx": { 715 | "version": "0.1.4", 716 | "resolved": "https://registry.npmjs.org/svelte2tsx/-/svelte2tsx-0.1.4.tgz", 717 | "integrity": "sha512-7JQSBPVHd6Grx6GvKTed7do96MCumEeL6pmked9Y/UKLQKalVRnkdjtydEmoWA7Rld0xPMHDV9L1xYEKl7GgUg==" 718 | }, 719 | "type-detect": { 720 | "version": "4.0.8", 721 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 722 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 723 | "dev": true 724 | }, 725 | "typescript": { 726 | "version": "3.7.3", 727 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.3.tgz", 728 | "integrity": "sha512-Mcr/Qk7hXqFBXMN7p7Lusj1ktCBydylfQM/FZCk5glCNQJrCUKPkMHdo9R0MTFWsC/4kPFvDS0fDPvukfCkFsw==" 729 | }, 730 | "vscode-jsonrpc": { 731 | "version": "4.0.0", 732 | "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-4.0.0.tgz", 733 | "integrity": "sha512-perEnXQdQOJMTDFNv+UF3h1Y0z4iSiaN9jIlb0OqIYgosPCZGYh/MCUlkFtV2668PL69lRDO32hmvL2yiidUYg==" 734 | }, 735 | "vscode-languageserver": { 736 | "version": "5.2.1", 737 | "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-5.2.1.tgz", 738 | "integrity": "sha512-GuayqdKZqAwwaCUjDvMTAVRPJOp/SLON3mJ07eGsx/Iq9HjRymhKWztX41rISqDKhHVVyFM+IywICyZDla6U3A==", 739 | "requires": { 740 | "vscode-languageserver-protocol": "3.14.1", 741 | "vscode-uri": "^1.0.6" 742 | }, 743 | "dependencies": { 744 | "vscode-uri": { 745 | "version": "1.0.8", 746 | "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.8.tgz", 747 | "integrity": "sha512-obtSWTlbJ+a+TFRYGaUumtVwb+InIUVI0Lu0VBUAPmj2cU5JutEXg3xUE0c2J5Tcy7h2DEKVJBFi+Y9ZSFzzPQ==" 748 | } 749 | } 750 | }, 751 | "vscode-languageserver-protocol": { 752 | "version": "3.14.1", 753 | "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.14.1.tgz", 754 | "integrity": "sha512-IL66BLb2g20uIKog5Y2dQ0IiigW0XKrvmWiOvc0yXw80z3tMEzEnHjaGAb3ENuU7MnQqgnYJ1Cl2l9RvNgDi4g==", 755 | "requires": { 756 | "vscode-jsonrpc": "^4.0.0", 757 | "vscode-languageserver-types": "3.14.0" 758 | } 759 | }, 760 | "vscode-languageserver-types": { 761 | "version": "3.14.0", 762 | "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.14.0.tgz", 763 | "integrity": "sha512-lTmS6AlAlMHOvPQemVwo3CezxBp0sNB95KNPkqp3Nxd5VFEnuG1ByM0zlRWos0zjO3ZWtkvhal0COgiV1xIA4A==" 764 | }, 765 | "vscode-uri": { 766 | "version": "2.1.1", 767 | "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-2.1.1.tgz", 768 | "integrity": "sha512-eY9jmGoEnVf8VE8xr5znSah7Qt1P/xsCdErz+g8HYZtJ7bZqKH5E3d+6oVNm1AC/c6IHUDokbmVXKOi4qPAC9A==" 769 | }, 770 | "which": { 771 | "version": "1.3.1", 772 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 773 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 774 | "dev": true, 775 | "requires": { 776 | "isexe": "^2.0.0" 777 | } 778 | }, 779 | "which-module": { 780 | "version": "2.0.0", 781 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 782 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", 783 | "dev": true 784 | }, 785 | "wide-align": { 786 | "version": "1.1.3", 787 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 788 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 789 | "dev": true, 790 | "requires": { 791 | "string-width": "^1.0.2 || 2" 792 | } 793 | }, 794 | "wrap-ansi": { 795 | "version": "5.1.0", 796 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 797 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 798 | "dev": true, 799 | "requires": { 800 | "ansi-styles": "^3.2.0", 801 | "string-width": "^3.0.0", 802 | "strip-ansi": "^5.0.0" 803 | }, 804 | "dependencies": { 805 | "ansi-regex": { 806 | "version": "4.1.0", 807 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 808 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 809 | "dev": true 810 | }, 811 | "string-width": { 812 | "version": "3.1.0", 813 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 814 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 815 | "dev": true, 816 | "requires": { 817 | "emoji-regex": "^7.0.1", 818 | "is-fullwidth-code-point": "^2.0.0", 819 | "strip-ansi": "^5.1.0" 820 | } 821 | }, 822 | "strip-ansi": { 823 | "version": "5.2.0", 824 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 825 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 826 | "dev": true, 827 | "requires": { 828 | "ansi-regex": "^4.1.0" 829 | } 830 | } 831 | } 832 | }, 833 | "wrappy": { 834 | "version": "1.0.2", 835 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 836 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 837 | "dev": true 838 | }, 839 | "y18n": { 840 | "version": "4.0.0", 841 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 842 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", 843 | "dev": true 844 | }, 845 | "yargs": { 846 | "version": "13.3.0", 847 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", 848 | "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", 849 | "dev": true, 850 | "requires": { 851 | "cliui": "^5.0.0", 852 | "find-up": "^3.0.0", 853 | "get-caller-file": "^2.0.1", 854 | "require-directory": "^2.1.1", 855 | "require-main-filename": "^2.0.0", 856 | "set-blocking": "^2.0.0", 857 | "string-width": "^3.0.0", 858 | "which-module": "^2.0.0", 859 | "y18n": "^4.0.0", 860 | "yargs-parser": "^13.1.1" 861 | }, 862 | "dependencies": { 863 | "ansi-regex": { 864 | "version": "4.1.0", 865 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 866 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", 867 | "dev": true 868 | }, 869 | "string-width": { 870 | "version": "3.1.0", 871 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 872 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 873 | "dev": true, 874 | "requires": { 875 | "emoji-regex": "^7.0.1", 876 | "is-fullwidth-code-point": "^2.0.0", 877 | "strip-ansi": "^5.1.0" 878 | } 879 | }, 880 | "strip-ansi": { 881 | "version": "5.2.0", 882 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 883 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 884 | "dev": true, 885 | "requires": { 886 | "ansi-regex": "^4.1.0" 887 | } 888 | } 889 | } 890 | }, 891 | "yargs-parser": { 892 | "version": "13.1.1", 893 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", 894 | "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", 895 | "dev": true, 896 | "requires": { 897 | "camelcase": "^5.0.0", 898 | "decamelize": "^1.2.0" 899 | } 900 | }, 901 | "yargs-unparser": { 902 | "version": "1.6.0", 903 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", 904 | "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", 905 | "dev": true, 906 | "requires": { 907 | "flat": "^4.1.0", 908 | "lodash": "^4.17.15", 909 | "yargs": "^13.3.0" 910 | } 911 | } 912 | } 913 | } 914 | -------------------------------------------------------------------------------- /server/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "svelte-type-checker-language-server", 3 | "description": "Language Server for svelte-type-checker", 4 | "version": "0.1.0", 5 | "author": "David Pershouse", 6 | "license": "MIT", 7 | "engines": { 8 | "node": "*" 9 | }, 10 | "devDependencies": { 11 | "mocha": "6.2.2", 12 | "chai": "4.2.0", 13 | "source-map-support": "0.5.16" 14 | }, 15 | "scripts": { 16 | "pretest": "npm run build", 17 | "test": "mocha", 18 | "build": "tsc -b" 19 | }, 20 | "dependencies": { 21 | "vscode-languageserver": "^5.2.1", 22 | "svelte2tsx": "~0.1.4", 23 | "svelte": "~3.16.0", 24 | "typescript": "~3.7.3", 25 | "source-map": "0.6.1", 26 | "vscode-uri": "2.1.1" 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /server/src/DocumentContext.ts: -------------------------------------------------------------------------------- 1 | import { Position, Range } from 'vscode-languageserver'; 2 | import { serviceContainerForUri } from './LanguageService'; 3 | import { uriToFilePath, mapSpanToOriginalRange, getMapper, useSvelteTsxName, useSvelteOriginalName } from './util'; 4 | import { DocumentMapper } from './mapper'; 5 | import * as ts from 'typescript'; 6 | import { DocumentSnapshot } from './DocumentSnapshot'; 7 | 8 | export class DocumentContext { 9 | mapper: DocumentMapper; 10 | languageService: ts.LanguageService; 11 | program: ts.Program; 12 | uri: string; 13 | generatedSource: ts.SourceFile; 14 | snapshot: DocumentSnapshot; 15 | 16 | constructor(uri: string, mapper: DocumentMapper, languageService: ts.LanguageService, snapshot: DocumentSnapshot, program: ts.Program, generatedSource: ts.SourceFile) { 17 | this.uri = uri; 18 | this.mapper = mapper; 19 | this.languageService = languageService; 20 | this.snapshot = snapshot; 21 | this.program = program; 22 | this.generatedSource = generatedSource; 23 | } 24 | get generatedFilePath() { 25 | return useSvelteTsxName(uriToFilePath(this.uri)); 26 | } 27 | 28 | get generatedUri() { 29 | return useSvelteTsxName(this.uri); 30 | } 31 | 32 | generatedPositionFromOriginalPosition(position: Position): ts.LineAndCharacter | undefined { 33 | return this.mapper.getGeneratedPosition(position); 34 | } 35 | generatedOffsetFromGeneratedPosition(position: Position): number { 36 | return this.generatedSource.getPositionOfLineAndCharacter(position.line, position.character); 37 | } 38 | generatedOffsetFromOriginalPosition(position: Position): number | undefined { 39 | const genPos = this.generatedPositionFromOriginalPosition(position); 40 | return genPos ? this.generatedOffsetFromGeneratedPosition(genPos) : undefined; 41 | } 42 | originalRangeFromGeneratedSpan(span: ts.TextSpan): Range { 43 | return mapSpanToOriginalRange(this.mapper, this.generatedSource, span.start, span.length); 44 | } 45 | static async createFromUri(svelteFileUri: string): Promise { 46 | let { languageService, getSnapshot } = serviceContainerForUri(svelteFileUri); 47 | let snapshot = getSnapshot(svelteFileUri); 48 | let mapper = await getMapper(svelteFileUri); 49 | let languageServiceFileName = uriToFilePath(useSvelteTsxName(svelteFileUri)); 50 | let program = languageService.getProgram(); 51 | if (!program) { 52 | console.log("Couldn't get program for hover for", svelteFileUri); 53 | return; 54 | } 55 | let source = program.getSourceFile(languageServiceFileName)!; 56 | if (!source) { 57 | console.log("Couldn't get source file for ", languageServiceFileName); 58 | return; 59 | } 60 | return new DocumentContext(svelteFileUri, mapper, languageService, snapshot, program, source); 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /server/src/DocumentSnapshot.ts: -------------------------------------------------------------------------------- 1 | import * as ts from 'typescript'; 2 | import { RawSourceMap, SourceMapConsumer } from 'source-map'; 3 | import svelte2tsx from 'svelte2tsx' 4 | import { DocumentMapper, IdentityMapper, ConsumerDocumentMapper } from './mapper' 5 | 6 | interface Location { 7 | line: number; 8 | column: number; 9 | } 10 | 11 | export interface ParseError { 12 | message: string, 13 | start: Location, 14 | end?: Location 15 | } 16 | 17 | export interface DocumentSnapshot extends ts.IScriptSnapshot { 18 | version: number; 19 | parseError?: ParseError; 20 | scriptKind: ts.ScriptKind; 21 | map: RawSourceMap | undefined; 22 | getMapper(): Promise; 23 | } 24 | 25 | function scriptKindFromExtension(filenameOrUri: string) { 26 | if (filenameOrUri.endsWith(".tsx")) return ts.ScriptKind.TSX; 27 | if (filenameOrUri.endsWith(".ts")) return ts.ScriptKind.TS; 28 | if (filenameOrUri.endsWith(".js")) return ts.ScriptKind.JS; 29 | if (filenameOrUri.endsWith(".json")) return ts.ScriptKind.JSON; 30 | if (filenameOrUri.endsWith(".jsx")) return ts.ScriptKind.JSX; 31 | return ts.ScriptKind.Unknown; 32 | } 33 | 34 | export namespace DocumentSnapshot { 35 | export function create(uri: string, text: string, version: number): DocumentSnapshot { 36 | let tsxSource = text; 37 | let tsxMap:RawSourceMap | undefined = undefined; 38 | let scriptKind = scriptKindFromExtension(uri); 39 | var parseError = undefined; 40 | if (uri.endsWith('.svelte')) { 41 | try { 42 | let tsx = svelte2tsx(text); 43 | tsxSource = tsx.code; 44 | tsxMap = tsx.map; 45 | scriptKind = ts.ScriptKind.TSX; 46 | if (tsxMap) { 47 | tsxMap.sources = [uri] 48 | } 49 | } catch (e) { 50 | parseError = { 51 | message: e.message, 52 | start: e.start, 53 | end: e.end 54 | } 55 | tsxSource = ""; 56 | console.error(`Couldn't convert ${uri} to tsx`, e); 57 | } 58 | console.info(`converted ${uri} to tsx`); 59 | } 60 | 61 | const length = tsxSource.length; 62 | 63 | let mapper: Promise | null = null; 64 | 65 | return { 66 | parseError: parseError, 67 | map: tsxMap, 68 | version: version, 69 | scriptKind: scriptKind, 70 | getText: (start, end) => tsxSource.substring(start, end), 71 | getLength: () => length, 72 | getChangeRange: () => undefined, 73 | getMapper: () => { 74 | if (!tsxMap) return Promise.resolve(new IdentityMapper()); 75 | return mapper || (mapper = Promise.resolve(new ConsumerDocumentMapper(new SourceMapConsumer(tsxMap), uri))) 76 | } 77 | }; 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /server/src/LanguageService.ts: -------------------------------------------------------------------------------- 1 | import * as ts from 'typescript'; 2 | import { DocumentSnapshot } from './DocumentSnapshot'; 3 | import { dirname, resolve } from 'path'; 4 | import { uriToFilePath, filePathToUri, useSvelteTsxName, useSvelteOriginalName, isSvelteTsx, originalNameFromSvelteTsx } from './util'; 5 | 6 | 7 | 8 | export interface LanguageServiceContainer { 9 | languageService: ts.LanguageService; 10 | updateSnapshot(uri: string, content: string, version: number): DocumentSnapshot; 11 | getSnapshot(uri: string): DocumentSnapshot; 12 | } 13 | 14 | const services = new Map(); 15 | 16 | export function serviceContainerForUri(documentUri: string): LanguageServiceContainer { 17 | const searchDir = dirname(uriToFilePath(documentUri)); 18 | const tsconfigPath = 19 | ts.findConfigFile(searchDir, ts.sys.fileExists, 'tsconfig.json') || 20 | ts.findConfigFile(searchDir, ts.sys.fileExists, 'jsconfig.json') || 21 | ''; 22 | 23 | let service: LanguageServiceContainer; 24 | if (services.has(tsconfigPath)) { 25 | service = services.get(tsconfigPath)!; 26 | } else { 27 | service = createLanguageService(tsconfigPath); 28 | services.set(tsconfigPath, service); 29 | } 30 | 31 | return service; 32 | } 33 | 34 | export function createLanguageService(tsconfigPath: string): LanguageServiceContainer { 35 | 36 | const workspacePath = tsconfigPath ? dirname(tsconfigPath) : ''; 37 | const documents = new Map(); 38 | 39 | let compilerOptions: ts.CompilerOptions = { 40 | allowNonTsExtensions: true, 41 | target: ts.ScriptTarget.Latest, 42 | module: ts.ModuleKind.ESNext, 43 | moduleResolution: ts.ModuleResolutionKind.NodeJs, 44 | allowJs: true, 45 | }; 46 | 47 | const configJson = tsconfigPath && ts.readConfigFile(tsconfigPath, ts.sys.readFile).config; 48 | let files: string[] = []; 49 | if (configJson) { 50 | const parsedConfig = ts.parseJsonConfigFileContent( 51 | configJson, 52 | ts.sys, 53 | workspacePath, 54 | compilerOptions, 55 | tsconfigPath, 56 | undefined, 57 | [ 58 | { extension: 'html', isMixedContent: true }, 59 | { extension: 'svelte', isMixedContent: false, scriptKind: ts.ScriptKind.TSX }, 60 | ], 61 | ); 62 | files = parsedConfig.fileNames; 63 | compilerOptions = { ...compilerOptions, ...parsedConfig.options }; 64 | } 65 | 66 | //we force some options 67 | let forcedOptions: ts.CompilerOptions = { 68 | noEmit: true, 69 | declaration: false, 70 | jsx: ts.JsxEmit.Preserve, 71 | jsxFactory: "h", 72 | skipLibCheck: true 73 | } 74 | 75 | compilerOptions = { ...compilerOptions, ...forcedOptions } 76 | const svelteTsPath = dirname(require.resolve('svelte2tsx')) 77 | const svelteTsxFiles = ['./svelte-shims.d.ts', './svelte-jsx.d.ts'].map(f => ts.sys.resolvePath(resolve(svelteTsPath, f))); 78 | 79 | const host: ts.LanguageServiceHost = { 80 | getCompilationSettings: () => compilerOptions, 81 | getScriptFileNames: () => Array.from(new Set([...files, ...Array.from(documents.keys()).map(k => uriToFilePath(k) || k) , ...svelteTsxFiles].map(useSvelteTsxName))), 82 | getScriptVersion(fileName: string) { 83 | const doc = getSnapshot(filePathToUri(fileName)); 84 | return String(doc.version) 85 | }, 86 | getScriptSnapshot(fileName: string): ts.IScriptSnapshot | undefined { 87 | // console.log("get script snapshot", fileName); 88 | return getSnapshot(filePathToUri(fileName)); 89 | }, 90 | getCurrentDirectory: () => workspacePath, 91 | getDefaultLibFileName: ts.getDefaultLibFilePath, 92 | 93 | resolveModuleNames(moduleNames: string[], containingFile: string): ts.ResolvedModule[] { 94 | return moduleNames.map(name => { 95 | const resolved = ts.resolveModuleName( 96 | name, 97 | containingFile, 98 | compilerOptions, 99 | { 100 | fileExists, 101 | readFile 102 | }, 103 | ); 104 | 105 | return resolved.resolvedModule!; 106 | }); 107 | }, 108 | 109 | readFile(path: string, encoding?: string): string | undefined { 110 | if (path.endsWith(".svelte")) { 111 | console.log("reading svelte file from language server host", path); 112 | } 113 | return ts.sys.readFile(path, encoding); 114 | }, 115 | }; 116 | let languageService = ts.createLanguageService(host); 117 | 118 | return { 119 | languageService, 120 | updateSnapshot, 121 | getSnapshot, 122 | }; 123 | 124 | function updateSnapshot(uri: string, content: string, version: number) { 125 | // console.log("update document", document.getFilePath()); 126 | let snap = getSnapshot(uri); 127 | if (snap && snap.version == version) return snap; 128 | 129 | const newSnapshot = DocumentSnapshot.create(uri, content, version); 130 | documents.set(uri, newSnapshot); 131 | return newSnapshot; 132 | } 133 | 134 | function getSnapshot(uri: string): DocumentSnapshot { 135 | const originalName = useSvelteOriginalName(uri); 136 | const doc = documents.get(originalName); 137 | if (doc) { 138 | return doc; 139 | } 140 | 141 | if (isSvelteTsx(uri)) { 142 | const doc = DocumentSnapshot.create(originalName, readFile(uriToFilePath(originalName)) || '', 0) 143 | documents.set(originalName, doc); 144 | return doc; 145 | } 146 | 147 | return DocumentSnapshot.create(uri, ts.sys.readFile(uriToFilePath(uri)) || '', 0); 148 | } 149 | 150 | 151 | 152 | function fileExists(filename: string) { 153 | if (isSvelteTsx(filename)) { 154 | return ts.sys.fileExists(originalNameFromSvelteTsx(filename)) 155 | } 156 | return ts.sys.fileExists(filename); 157 | } 158 | 159 | function readFile(fileName: string) { 160 | if (!isSvelteTsx(fileName)) { 161 | return ts.sys.readFile(fileName) 162 | } 163 | return ts.sys.readFile(originalNameFromSvelteTsx(fileName)); 164 | } 165 | 166 | 167 | 168 | } 169 | -------------------------------------------------------------------------------- /server/src/mapper.ts: -------------------------------------------------------------------------------- 1 | import { SourceMapConsumer } from 'source-map'; 2 | import * as ts from 'typescript'; 3 | import { stringify } from 'querystring'; 4 | 5 | export interface DocumentMapper { 6 | getOriginalPosition(generatedPosition: ts.LineAndCharacter): ts.LineAndCharacter | undefined 7 | getGeneratedPosition(originalPosition: ts.LineAndCharacter): ts.LineAndCharacter | undefined 8 | } 9 | 10 | export class IdentityMapper implements DocumentMapper { 11 | getOriginalPosition(generatedPosition: ts.LineAndCharacter): ts.LineAndCharacter | undefined { 12 | return generatedPosition; 13 | } 14 | getGeneratedPosition(originalPosition: ts.LineAndCharacter): ts.LineAndCharacter | undefined { 15 | return originalPosition; 16 | } 17 | } 18 | 19 | export class ConsumerDocumentMapper implements DocumentMapper { 20 | consumer: SourceMapConsumer; 21 | sourceUri: string; 22 | constructor(consumer: SourceMapConsumer, sourceUri: string) { 23 | this.consumer = consumer; 24 | this.sourceUri = sourceUri; 25 | } 26 | 27 | getOriginalPosition(generatedPosition: ts.LineAndCharacter): ts.LineAndCharacter | undefined { 28 | let mapped = this.consumer.originalPositionFor({ line: generatedPosition.line + 1, column: generatedPosition.character }) 29 | if (!mapped) return; 30 | if (mapped.line == 0) { 31 | console.warn("Got 0 mapped line from", generatedPosition, "col was", mapped.column); 32 | } 33 | return { 34 | line: mapped.line - 1, 35 | character: mapped.column 36 | } 37 | } 38 | 39 | getGeneratedPosition(originalPosition: ts.LineAndCharacter): ts.LineAndCharacter | undefined { 40 | let mapped = this.consumer.generatedPositionFor({ line: originalPosition.line + 1, column: originalPosition.character, source: this.sourceUri }) 41 | if (!mapped) return; 42 | return { 43 | line: mapped.line - 1, 44 | character: mapped.column 45 | } 46 | } 47 | } -------------------------------------------------------------------------------- /server/src/server.ts: -------------------------------------------------------------------------------- 1 | import { 2 | createConnection, 3 | TextDocuments, 4 | ProposedFeatures, 5 | InitializeParams, 6 | TextDocument, 7 | Diagnostic, 8 | Range, 9 | DiagnosticSeverity, 10 | TextDocumentPositionParams, 11 | CompletionItem, 12 | CompletionItemKind, 13 | DidChangeWorkspaceFoldersNotification, 14 | TextEdit, 15 | MarkupContent, 16 | CodeActionKind, 17 | Hover, 18 | DefinitionLink, 19 | Location 20 | } from 'vscode-languageserver'; 21 | 22 | import { serviceContainerForUri } from './LanguageService'; 23 | 24 | import * as ts from 'typescript'; 25 | import { ScriptElementKindToCompletionItemKind, uriToFilePath, filePathToUri, emptyRange, mapSpanToOriginalRange, getMapper, offsetToOriginalPosition, useSvelteOriginalName, useSvelteTsxName } from './util'; 26 | import { DocumentContext } from './DocumentContext'; 27 | 28 | 29 | // The settings interface describe the server relevant settings part 30 | interface Settings { 31 | "svelte-type-checker": TypeCheckerSettings; 32 | } 33 | 34 | // These are the example settings we defined in the client's package.json 35 | // file 36 | interface TypeCheckerSettings { 37 | enableHoverHints: boolean, 38 | enableDefinitions: boolean, 39 | enableCompletion: boolean 40 | } 41 | 42 | 43 | // Create a connection for the server. The connection uses Node's IPC as a transport. 44 | // Also include all preview / proposed LSP features. 45 | let connection = createConnection(ProposedFeatures.all); 46 | 47 | var settings: TypeCheckerSettings = { 48 | enableHoverHints: false, 49 | enableDefinitions: false, 50 | enableCompletion: false 51 | } 52 | 53 | // Create a simple text document manager. The text document manager 54 | // supports full document sync only 55 | export let documents: TextDocuments = new TextDocuments(); 56 | let hasDiagnosticRelatedInformationCapability: boolean = false; 57 | 58 | connection.onDidChangeConfiguration((change) => { 59 | settings = { ...settings, ...change.settings['svelte-type-checker'] } 60 | console.log("got new settings", settings); 61 | }) 62 | 63 | connection.onInitialize((params: InitializeParams) => { 64 | let capabilities = params.capabilities; 65 | 66 | hasDiagnosticRelatedInformationCapability = !!( 67 | capabilities.textDocument && 68 | capabilities.textDocument.publishDiagnostics && 69 | capabilities.textDocument.publishDiagnostics.relatedInformation 70 | ); 71 | 72 | return { 73 | capabilities: { 74 | textDocumentSync: documents.syncKind, 75 | // Tell the client that the server supports code completion 76 | completionProvider: { 77 | resolveProvider: true 78 | }, 79 | hoverProvider: true, 80 | definitionProvider: true 81 | } 82 | }; 83 | }); 84 | 85 | connection.onInitialized(() => { 86 | 87 | }); 88 | 89 | // The content of a document has changed. This event is emitted 90 | // when the text document first opened or when its content has changed. 91 | documents.onDidChangeContent(async change => { 92 | const { updateSnapshot } = serviceContainerForUri(change.document.uri); 93 | updateSnapshot(change.document.uri, change.document.getText(), change.document.version); 94 | 95 | let diagnostics = await getDiagnostics(change.document); 96 | connection.sendDiagnostics({ uri: change.document.uri, diagnostics }); 97 | }); 98 | 99 | 100 | 101 | async function getDiagnostics(document: TextDocument): Promise { 102 | 103 | const { languageService: lang, getSnapshot } = serviceContainerForUri(document.uri); 104 | 105 | var snap = getSnapshot(document.uri); 106 | if (snap && snap.parseError) { 107 | console.log("Parse error, suppressing diagnostics", snap.parseError) 108 | return []; 109 | } 110 | 111 | const documentPath = uriToFilePath(document.uri); 112 | const svelteTsxPath = documentPath + ".tsx"; 113 | 114 | let diagnostics: ts.Diagnostic[] = [ 115 | ...lang.getSyntacticDiagnostics(svelteTsxPath), 116 | ...lang.getSuggestionDiagnostics(svelteTsxPath), 117 | ]; 118 | diagnostics.push(...lang.getSemanticDiagnostics(svelteTsxPath)); 119 | 120 | return Promise.all(diagnostics.map(async diagnostic => ({ 121 | range: await mapDiagnosticLocationToRange(diagnostic), 122 | severity: mapSeverity(diagnostic.category), 123 | source: 'svelte-type-checker', 124 | message: ts.flattenDiagnosticMessageText(diagnostic.messageText, '\n'), 125 | code: diagnostic.code, 126 | } as Diagnostic))); 127 | } 128 | 129 | export function mapSeverity(category: ts.DiagnosticCategory): DiagnosticSeverity { 130 | switch (category) { 131 | case ts.DiagnosticCategory.Error: 132 | return DiagnosticSeverity.Error; 133 | case ts.DiagnosticCategory.Warning: 134 | return DiagnosticSeverity.Warning; 135 | case ts.DiagnosticCategory.Suggestion: 136 | return DiagnosticSeverity.Hint; 137 | case ts.DiagnosticCategory.Message: 138 | return DiagnosticSeverity.Information; 139 | } 140 | 141 | return DiagnosticSeverity.Error; 142 | } 143 | 144 | 145 | async function mapDiagnosticLocationToRange(diagnostic: ts.Diagnostic): Promise { 146 | if (!diagnostic.file) { 147 | console.log("No diagnostic file, using emptyRange", diagnostic) 148 | return emptyRange; 149 | } 150 | 151 | let mapper = await getMapper(filePathToUri(diagnostic.file.fileName)); 152 | return mapSpanToOriginalRange(mapper, diagnostic.file, diagnostic.start, diagnostic.length) 153 | } 154 | 155 | 156 | connection.onHover(async (evt) => { 157 | 158 | if (!settings.enableHoverHints) return null; 159 | 160 | let { textDocument, position } = evt; 161 | 162 | let docContext = await DocumentContext.createFromUri(textDocument.uri); 163 | if (!docContext || docContext.snapshot.parseError) { 164 | return null; 165 | }; 166 | 167 | let offset = docContext.generatedOffsetFromOriginalPosition(position); 168 | if (offset === undefined) { 169 | console.log("couldn't determine generated position for", textDocument.uri, position); 170 | return null; 171 | } 172 | 173 | var info = docContext.languageService.getQuickInfoAtPosition(docContext.generatedFilePath, offset); 174 | 175 | if (!info) { 176 | return null; 177 | } 178 | 179 | let contents = ts.displayPartsToString(info.displayParts); 180 | let h: Hover = { 181 | range: docContext.originalRangeFromGeneratedSpan(info.textSpan), 182 | contents: { 183 | language: "ts", 184 | value: contents 185 | } 186 | } 187 | 188 | return h; 189 | }) 190 | 191 | connection.onDefinition(async (evt) => { 192 | 193 | if (!settings.enableDefinitions) return null; 194 | 195 | let { position, textDocument } = evt; 196 | 197 | let docContext = await DocumentContext.createFromUri(textDocument.uri); 198 | if (docContext === undefined) { 199 | console.log("Couldn't find document context for ", textDocument.uri); 200 | return null; 201 | } 202 | 203 | if (docContext.snapshot.parseError) { 204 | console.log("Skipping definition lookup due to parse error") 205 | return null; 206 | } 207 | 208 | let offset = docContext.generatedOffsetFromOriginalPosition(position); 209 | if (offset === undefined) { 210 | console.log("Couldn't find offset for document and position", textDocument, position); 211 | return null; 212 | } 213 | 214 | const defs = docContext.languageService.getDefinitionAndBoundSpan(docContext.generatedFilePath, offset); 215 | if (!defs || !defs.definitions) { 216 | return null; 217 | } 218 | 219 | let defProms:Promise[] = defs.definitions 220 | .map(async def => { 221 | console.log("definition in ", def.fileName) 222 | var docContext = await DocumentContext.createFromUri(useSvelteOriginalName(filePathToUri(def.fileName))); 223 | if (!docContext) return null; 224 | let range = docContext.originalRangeFromGeneratedSpan(def.textSpan); 225 | 226 | //trying to find the definition of svelte component looks for the class definition which doesn't exist in the original, we map to 0,1 227 | if (range.start.line < 0) { 228 | range.start.line = 0; 229 | range.start.character = 1; 230 | } 231 | 232 | if (range.end.line < 0) { 233 | range.end = range.start; 234 | } 235 | 236 | return Location.create( 237 | docContext.uri, 238 | range 239 | ); 240 | }); 241 | 242 | let defResults = await Promise.all(defProms); 243 | return defResults.filter(x => x != null) as Location[]; 244 | }) 245 | 246 | 247 | // This handler provides the initial list of the completion items. 248 | connection.onCompletion( 249 | async (_textDocumentPosition: TextDocumentPositionParams): Promise => { 250 | 251 | if (!settings.enableCompletion) return []; 252 | 253 | let docContext = await DocumentContext.createFromUri(_textDocumentPosition.textDocument.uri); 254 | 255 | if (docContext === undefined) { 256 | console.error("couldn't find document for completion", _textDocumentPosition.textDocument.uri); 257 | return []; 258 | }; 259 | 260 | if (docContext.snapshot.parseError) { 261 | console.log("skipping completion due to parse error"); 262 | return []; 263 | } 264 | 265 | 266 | let offset = docContext.generatedOffsetFromOriginalPosition(_textDocumentPosition.position); 267 | if (offset === undefined) { 268 | console.error("Couldn't determine offset from position", _textDocumentPosition); 269 | return []; 270 | } 271 | 272 | let completions = docContext.languageService.getCompletionsAtPosition(docContext.generatedFilePath, offset, { 273 | includeCompletionsWithInsertText: true, 274 | includeCompletionsForModuleExports: true 275 | }); 276 | 277 | if (!completions) { 278 | console.log("Couldn't get completions from offset", offset, "for file", docContext.generatedFilePath); 279 | return []; 280 | } 281 | 282 | // The pass parameter contains the position of the text document in 283 | // which code omplete got requested. For the example we ignore this 284 | // info and always provide the same completion items. 285 | 286 | return completions.entries.map((c, i) => { 287 | let textEdit = undefined; 288 | if (c.replacementSpan) { 289 | textEdit = TextEdit.replace(docContext!.originalRangeFromGeneratedSpan(c.replacementSpan), c.insertText || c.name); 290 | } 291 | 292 | let item = { 293 | label: c.name, 294 | kind: ScriptElementKindToCompletionItemKind(c.kind), 295 | sortText: c.sortText + i, 296 | insertText: c.insertText, 297 | textEdit: textEdit, 298 | data: { 299 | // data used for resolving item details (see 'doResolve') 300 | uri: docContext!.uri, 301 | offset, 302 | source: c.source 303 | } 304 | } as CompletionItem 305 | console.log("Returning item ", item.label, item.insertText, item.kind) 306 | return item; 307 | }) 308 | } 309 | ); 310 | 311 | // This handler resolves additional information for the item selected in 312 | // the completion list. 313 | connection.onCompletionResolve( 314 | (item: CompletionItem): CompletionItem => { 315 | let { languageService } = serviceContainerForUri(item.data.uri); 316 | let languageServiceFileName = uriToFilePath(item.data.uri) + ".tsx"; 317 | let details = languageService.getCompletionEntryDetails(languageServiceFileName, item.data.offset, item.label, 318 | {} as ts.FormatCodeSettings, 319 | item.data.source, { 320 | importModuleSpecifierEnding: 'minimal', 321 | importModuleSpecifierPreference: 'relative', 322 | includeCompletionsWithInsertText: true 323 | }) 324 | if (details && item.kind !== CompletionItemKind.File && item.kind !== CompletionItemKind.Folder) { 325 | item.detail = ts.displayPartsToString(details.displayParts); 326 | const documentation: MarkupContent = { 327 | kind: 'markdown', 328 | value: ts.displayPartsToString(details.documentation) 329 | }; 330 | 331 | /* 332 | if (details.codeActions) { 333 | const textEdits = convertCodeAction(doc, details.codeActions, firstScriptRegion); 334 | item.additionalTextEdits = textEdits; 335 | 336 | details.codeActions.forEach(action => { 337 | if (action.description) { 338 | documentation.value += '\n' + action.description; 339 | } 340 | }); 341 | } 342 | */ 343 | item.documentation = documentation; 344 | delete item.data; 345 | } 346 | return item; 347 | } 348 | ); 349 | 350 | // Make the text document manager listen on the connection 351 | // for open, change and close text document events 352 | documents.listen(connection); 353 | 354 | // Listen on the connection 355 | connection.listen(); 356 | -------------------------------------------------------------------------------- /server/src/util.ts: -------------------------------------------------------------------------------- 1 | import ts = require('typescript'); 2 | import { CompletionItemKind, TextDocument, Range } from 'vscode-languageserver'; 3 | import { SourceMapConsumer, RawSourceMap } from 'source-map'; 4 | import { URI } from 'vscode-uri'; 5 | import { serviceContainerForUri } from './LanguageService'; 6 | import { DocumentMapper } from './mapper'; 7 | 8 | export function uriToFilePath(uri: string): string { 9 | return URI.parse(uri).fsPath.replace(/\\/g, "/"); 10 | } 11 | 12 | export function filePathToUri(filePath: string): string { 13 | return URI.file(filePath).toString(); 14 | } 15 | 16 | 17 | export function ScriptElementKindToCompletionItemKind(kind: ts.ScriptElementKind): CompletionItemKind { 18 | switch (kind) { 19 | case ts.ScriptElementKind.primitiveType: 20 | case ts.ScriptElementKind.keyword: 21 | return CompletionItemKind.Keyword; 22 | case ts.ScriptElementKind.variableElement: 23 | case ts.ScriptElementKind.localVariableElement: 24 | case ts.ScriptElementKind.letElement: 25 | case ts.ScriptElementKind.constElement: 26 | case ts.ScriptElementKind.alias: 27 | return CompletionItemKind.Variable; 28 | case ts.ScriptElementKind.memberVariableElement: 29 | case ts.ScriptElementKind.memberGetAccessorElement: 30 | case ts.ScriptElementKind.memberSetAccessorElement: 31 | return CompletionItemKind.Field; 32 | case ts.ScriptElementKind.functionElement: 33 | case ts.ScriptElementKind.memberFunctionElement: 34 | case ts.ScriptElementKind.constructSignatureElement: 35 | case ts.ScriptElementKind.callSignatureElement: 36 | case ts.ScriptElementKind.indexSignatureElement: 37 | return CompletionItemKind.Function; 38 | case ts.ScriptElementKind.enumElement: 39 | return CompletionItemKind.Enum; 40 | case ts.ScriptElementKind.moduleElement: 41 | return CompletionItemKind.Module; 42 | case ts.ScriptElementKind.classElement: 43 | return CompletionItemKind.Class; 44 | case ts.ScriptElementKind.interfaceElement: 45 | return CompletionItemKind.Interface; 46 | case ts.ScriptElementKind.warning: 47 | case ts.ScriptElementKind.scriptElement: 48 | return CompletionItemKind.File; 49 | case ts.ScriptElementKind.directory: 50 | return CompletionItemKind.Folder; 51 | case ts.ScriptElementKind.jsxAttribute: 52 | return CompletionItemKind.Property 53 | default: 54 | console.log("Couldn't determine type for ", kind) 55 | return CompletionItemKind.Text 56 | } 57 | } 58 | 59 | export const emptyRange:Range = { start: { line: 0, character: 0}, end: {line: 0, character: 0} }; 60 | 61 | export async function getMapper(uri: string): Promise { 62 | let { getSnapshot } = serviceContainerForUri(uri); 63 | let snap = getSnapshot(uri); 64 | return await snap.getMapper(); 65 | } 66 | 67 | export function isSvelteTsx(fileNameOrUri: string): boolean { 68 | return fileNameOrUri.endsWith('.svelte.tsx'); 69 | } 70 | 71 | export function isSvelte(fileNameOrUri: string): boolean { 72 | return fileNameOrUri.endsWith(".svelte"); 73 | } 74 | 75 | export function originalNameFromSvelteTsx(fileNameOrUri: string) { 76 | return fileNameOrUri.substring(0, fileNameOrUri.length -'.tsx'.length) 77 | } 78 | 79 | export function useSvelteTsxName(fileNameOrUri: string) { 80 | if (isSvelte(fileNameOrUri)) { 81 | return fileNameOrUri+".tsx"; 82 | } 83 | return fileNameOrUri; 84 | } 85 | 86 | export function useSvelteOriginalName(fileNameOrUri: string) { 87 | if (isSvelteTsx(fileNameOrUri)) { 88 | return originalNameFromSvelteTsx(fileNameOrUri) 89 | } 90 | return fileNameOrUri; 91 | } 92 | 93 | export function lineAndCharacterToOriginalPosition(mapper: DocumentMapper, pos: ts.LineAndCharacter): ts.LineAndCharacter | undefined { 94 | return mapper.getOriginalPosition(pos); 95 | } 96 | 97 | export function offsetToOriginalPosition(mapper: DocumentMapper, file: ts.SourceFile, offset: number): ts.LineAndCharacter | undefined { 98 | return lineAndCharacterToOriginalPosition(mapper, file.getLineAndCharacterOfPosition(offset)); 99 | } 100 | 101 | export function mapSpanToOriginalRange(mapper: DocumentMapper, file: ts.SourceFile, start: number | undefined, length: number | undefined ): Range { 102 | if (typeof start != "number") return emptyRange; 103 | 104 | 105 | let startPos = offsetToOriginalPosition(mapper, file, start); 106 | if (!startPos) return emptyRange; 107 | 108 | let endPos: ts.LineAndCharacter | undefined; 109 | if (typeof length == "number") { 110 | endPos = offsetToOriginalPosition(mapper, file, start + length); 111 | } 112 | endPos = endPos || { 113 | line: startPos.line, 114 | character: startPos.character, 115 | } 116 | 117 | return { start: startPos, end: endPos } 118 | } 119 | 120 | 121 | /* 122 | //source map decoders are cached since they are heavy 123 | //we will see how far a simple Map gets us 124 | let consumers = new Map(); 125 | 126 | 127 | export function getSourceMap(document: TextDocument): RawSourceMap | undefined { 128 | const { getSourceMap } = getOrCreateLanguageServiceForDocument(document); 129 | let sourceMap = getSourceMap(document); 130 | if (!sourceMap) return; 131 | } 132 | 133 | 134 | 135 | 136 | export async function getSourceMapConsumer(sourceMap: RawSourceMap | undefined): Promise { 137 | let decoder = consumers.get(document); 138 | if (decoder && decoder.version == document.version) return decoder.consumer; 139 | 140 | //create a new consumer 141 | let sourceMap = getSourceMap(document); 142 | if (!sourceMap) return; 143 | 144 | decoder = { version: document.version, consumer: await new SourceMapConsumer(sourceMap) }; 145 | consumers.set(document, decoder); 146 | return decoder.consumer; 147 | } 148 | 149 | 150 | export const emptyRange:Range = { start: { line: 0, character: 0}, end: {line: 0, character: 0} }; 151 | 152 | 153 | async function getSourceFileFromDocument(document: TextDocument): ts.SourceFileLike { 154 | 155 | } 156 | 157 | 158 | 159 | async function getOriginalLineAndCharacterOfPosition(document: TextDocument, character: number, line: number) { 160 | let decoder = await getSourceMapConsumer(document); 161 | 162 | } 163 | 164 | 165 | function SpanToRange( sourceMap?: SourceMapConsumer): Range { 166 | if (!diagnostic.file) { 167 | console.log("No diagnostic file, using convertRange") 168 | return emptyRange; 169 | } 170 | 171 | if (typeof diagnostic.start != "number") return emptyRange; 172 | 173 | let start = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start); 174 | 175 | start.character = start.character; 176 | start.line = start.line; 177 | 178 | let end; 179 | if (typeof diagnostic.length == "number") { 180 | end = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start + diagnostic.length); 181 | end.character = end.character; 182 | end.line = end.line; 183 | } else { 184 | end = { 185 | line: start.line, 186 | character: start.character, 187 | } as ts.LineAndCharacter 188 | } 189 | 190 | 191 | if (sourceMap) { 192 | for (let pos of [start, end]) { 193 | let res = sourceMap.originalPositionFor({ line: pos.line + 1, column: pos.character + 1 }) 194 | if (res != null) { 195 | pos.line = (res.line || 1) - 1; 196 | pos.character = (res.column || 1) - 1; 197 | } 198 | } 199 | } 200 | return { start, end } 201 | } 202 | */ -------------------------------------------------------------------------------- /server/test/util.js: -------------------------------------------------------------------------------- 1 | require('source-map-support') 2 | 3 | const util = require('../out/util') 4 | let { assert } = require('chai') 5 | 6 | describe('util', () => { 7 | 8 | describe("#uriToFilePath", () => { 9 | it("Can convert a windows uri to typescript compatible path", () => { 10 | let path = "file:///c%3A/dev/svelte/test-app/src/Test.svelte" 11 | assert.equal(util.uriToFilePath(path), "c:/dev/svelte/test-app/src/Test.svelte") 12 | }) 13 | 14 | it("Can convert a posix uri to typescript compatible path", () => { 15 | let path = "file:///user/svelte/test-app/src/Test.svelte" 16 | assert.equal(util.uriToFilePath(path), "/user/svelte/test-app/src/Test.svelte") 17 | }) 18 | }) 19 | 20 | describe("#filePathToUri", () => { 21 | it("Can convert a windows path to uri", () => { 22 | let path = "c:\\dev\\svelte\\test-app\\src\\Test.svelte" 23 | assert.equal(util.filePathToUri(path), "file:///c%3A/dev/svelte/test-app/src/Test.svelte") 24 | }) 25 | 26 | it("Can convert a windows path with forward slashes to uri", () => { 27 | let path = "c:/dev/svelte/test-app/src/Test.svelte" 28 | assert.equal(util.filePathToUri(path), "file:///c%3A/dev/svelte/test-app/src/Test.svelte") 29 | }) 30 | 31 | it("Can convert a posix path to uri", () => { 32 | let path = "/user/svelte/test-app/src/Test.svelte" 33 | assert.equal(util.filePathToUri(path), "file:///user/svelte/test-app/src/Test.svelte") 34 | }) 35 | }) 36 | }); -------------------------------------------------------------------------------- /server/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es6", 4 | "module": "commonjs", 5 | "moduleResolution": "node", 6 | "sourceMap": true, 7 | "skipLibCheck": true, 8 | "strict": true, 9 | "esModuleInterop": true, 10 | "outDir": "out", 11 | "rootDir": "src" 12 | }, 13 | "include": ["src"], 14 | "exclude": ["node_modules", ".vscode-test"] 15 | } 16 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "commonjs", 4 | "target": "es6", 5 | "outDir": "out", 6 | "rootDir": "src", 7 | "sourceMap": true 8 | }, 9 | "include": [ 10 | "src" 11 | ], 12 | "exclude": [ 13 | "node_modules", 14 | ".vscode-test" 15 | ], 16 | "references": [ 17 | { "path": "./client" }, 18 | { "path": "./server" } 19 | ] 20 | } -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "indent": [true, "tabs"], 4 | "semicolon": [true, "always"] 5 | } 6 | } --------------------------------------------------------------------------------