From 8a014007cc67ea4b27715be7c8bb5db5ae94bf0a Mon Sep 17 00:00:00 2001 From: Kenneth Skovhus Date: Mon, 12 Mar 2018 00:09:22 +0100 Subject: [PATCH 01/10] Correct server/package-lock.json --- server/package-lock.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/package-lock.json b/server/package-lock.json index 07791f086..6c78cecaa 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -1,6 +1,6 @@ { "name": "bash-language-server", - "version": "1.1.0", + "version": "1.1.1", "lockfileVersion": 1, "requires": true, "dependencies": { From 696d1ea98092ab19c59c7bc4245a883c5e37b543 Mon Sep 17 00:00:00 2001 From: Kenneth Skovhus Date: Mon, 12 Mar 2018 00:09:36 +0100 Subject: [PATCH 02/10] Use shared tsconfig configuration --- server/tsconfig.json | 23 ++++++++--------------- tsconfig.base.json | 19 +++++++++++++++++++ vscode-client/tsconfig.json | 21 +++++---------------- 3 files changed, 32 insertions(+), 31 deletions(-) create mode 100644 tsconfig.base.json diff --git a/server/tsconfig.json b/server/tsconfig.json index a11a2e2e4..ce6c7f70b 100644 --- a/server/tsconfig.json +++ b/server/tsconfig.json @@ -1,17 +1,10 @@ { - "compilerOptions": { - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitAny": false, - "noImplicitReturns": true, - "target": "es6", - "module": "commonjs", - "moduleResolution": "node", - "sourceMap": true, - "lib" : [ "es2016" ], - "outDir": "out" - }, - "exclude": [ - "node_modules" - ] + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": "out", + + // TODO: enable: + "strict": false, + "noImplicitAny": false, + } } diff --git a/tsconfig.base.json b/tsconfig.base.json new file mode 100644 index 000000000..974e0da5a --- /dev/null +++ b/tsconfig.base.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitAny": true, + "noImplicitReturns": true, + "strict": true, + "target": "es6", + "module": "commonjs", + "moduleResolution": "node", + "lib": [ + "es2016" + ], + "sourceMap": true + }, + "exclude": [ + "node_modules" + ] +} diff --git a/vscode-client/tsconfig.json b/vscode-client/tsconfig.json index b209ab707..19cdcac49 100644 --- a/vscode-client/tsconfig.json +++ b/vscode-client/tsconfig.json @@ -1,18 +1,7 @@ { - "compilerOptions": { - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitAny": true, - "noImplicitReturns": true, - "target": "es6", - "module": "commonjs", - "moduleResolution": "node", - "rootDir": ".", - "outDir": "out", - "lib": [ "es2016" ], - "sourceMap": true - }, - "exclude": [ - "node_modules" - ] + "extends": "../tsconfig.base.json", + "compilerOptions": { + "outDir": "out", + "rootDir": "." + } } From 970882d9414d0eb06132caa6c09a8a0e7d12ecce Mon Sep 17 00:00:00 2001 From: Kenneth Skovhus Date: Mon, 12 Mar 2018 00:16:24 +0100 Subject: [PATCH 03/10] Consistent usage of tabs and spaces in .json files --- package.json | 52 ++++++++++++------------- vscode-client/package.json | 78 +++++++++++++++++++------------------- 2 files changed, 65 insertions(+), 65 deletions(-) diff --git a/package.json b/package.json index c6ded1670..4754dc605 100644 --- a/package.json +++ b/package.json @@ -1,28 +1,28 @@ { - "name": "bash-language-server", - "description": "A language server for Bash", - "author": "Mads Hartmann", - "license": "MIT", - "version": "1.0.0", - "publisher": "mads-hartmann", - "repository": { - "type": "git", - "url": "https://github.com/mads-hartmann/bash-language-server" - }, - "scripts": { - "postinstall": "cd server && npm install && cd ../vscode-client && npm install && cd ..", - "compile": "cd server && npm run compile && cd ../vscode-client && npm run compile && cd ..", - "compile:client": "cd vscode-client && npm run compile && cd ..", - "watch:client": "cd vscode-client && npm run compile:watch && cd ..", - "compile:server": "cd server && npm run compile && cd ..", - "watch:server": "cd server && npm run compile:watch && cd .." - }, - "devDependencies": { - "@types/node": "^9.4.6", - "electron-rebuild": "^1.7.3", - "typescript": "^2.7.2" - }, - "dependencies": { - "remove": "^0.1.5" - } + "name": "bash-language-server", + "description": "A language server for Bash", + "author": "Mads Hartmann", + "license": "MIT", + "version": "1.0.0", + "publisher": "mads-hartmann", + "repository": { + "type": "git", + "url": "https://github.com/mads-hartmann/bash-language-server" + }, + "scripts": { + "postinstall": "cd server && npm install && cd ../vscode-client && npm install && cd ..", + "compile": "cd server && npm run compile && cd ../vscode-client && npm run compile && cd ..", + "compile:client": "cd vscode-client && npm run compile && cd ..", + "watch:client": "cd vscode-client && npm run compile:watch && cd ..", + "compile:server": "cd server && npm run compile && cd ..", + "watch:server": "cd server && npm run compile:watch && cd .." + }, + "devDependencies": { + "@types/node": "^9.4.6", + "electron-rebuild": "^1.7.3", + "typescript": "^2.7.2" + }, + "dependencies": { + "remove": "^0.1.5" + } } diff --git a/vscode-client/package.json b/vscode-client/package.json index b448c251d..36b728566 100644 --- a/vscode-client/package.json +++ b/vscode-client/package.json @@ -1,41 +1,41 @@ { - "name": "bash-ide-vscode", - "displayName": "Bash IDE", - "description": "A language server for Bash", - "author": "Mads Hartmann", - "license": "MIT", - "version": "1.2.0", - "publisher": "mads-hartmann", - "repository": { - "type": "git", - "url": "https://github.com/mads-hartmann/bash-language-server" - }, - "engines": { - "vscode": "^1.17.0" - }, - "icon": "assets/bash-logo.png", - "categories": [ - "Other" - ], - "keywords": [ - "shell script", - "bash script", - "bash" - ], - "activationEvents": [ - "onLanguage:shellscript" - ], - "main": "./out/src/extension", - "contributes": {}, - "scripts": { - "vscode:prepublish": "tsc -p ./", - "compile": "tsc -p ./", - "compile:watch": "tsc -w -p ./", - "update-vscode": "node ./node_modules/vscode/bin/install", - "postinstall": "node ./node_modules/vscode/bin/install" - }, - "dependencies": { - "vscode": "^1.1.10", - "vscode-languageclient": "^3.5.0" - } + "name": "bash-ide-vscode", + "displayName": "Bash IDE", + "description": "A language server for Bash", + "author": "Mads Hartmann", + "license": "MIT", + "version": "1.2.0", + "publisher": "mads-hartmann", + "repository": { + "type": "git", + "url": "https://github.com/mads-hartmann/bash-language-server" + }, + "engines": { + "vscode": "^1.17.0" + }, + "icon": "assets/bash-logo.png", + "categories": [ + "Other" + ], + "keywords": [ + "shell script", + "bash script", + "bash" + ], + "activationEvents": [ + "onLanguage:shellscript" + ], + "main": "./out/src/extension", + "contributes": {}, + "scripts": { + "vscode:prepublish": "tsc -p ./", + "compile": "tsc -p ./", + "compile:watch": "tsc -w -p ./", + "update-vscode": "node ./node_modules/vscode/bin/install", + "postinstall": "node ./node_modules/vscode/bin/install" + }, + "dependencies": { + "vscode": "^1.1.10", + "vscode-languageclient": "^3.5.0" + } } From 487a3e2fee7a883e7e93e8fff6252e60f5db8384 Mon Sep 17 00:00:00 2001 From: Kenneth Skovhus Date: Mon, 12 Mar 2018 00:18:26 +0100 Subject: [PATCH 04/10] Remove ununsed dependency --- package-lock.json | 38 -------------------------------------- package.json | 3 --- 2 files changed, 41 deletions(-) diff --git a/package-lock.json b/package-lock.json index 49df04dc9..b92ab1455 100644 --- a/package-lock.json +++ b/package-lock.json @@ -151,14 +151,6 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, - "chainsaw": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.0.9.tgz", - "integrity": "sha1-EaBRAtHEx4W20EFdM21aOhYSkT4=", - "requires": { - "traverse": "0.3.9" - } - }, "chalk": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", @@ -520,14 +512,6 @@ "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", "dev": true }, - "hashish": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/hashish/-/hashish-0.0.4.tgz", - "integrity": "sha1-bWC8b/r3Ebav1g5CbQd5iAFOZVQ=", - "requires": { - "traverse": "0.3.9" - } - }, "hawk": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", @@ -1039,14 +1023,6 @@ "util-deprecate": "1.0.2" } }, - "remove": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/remove/-/remove-0.1.5.tgz", - "integrity": "sha1-CV/9gn1lyfQa2X0z5BanWBEHmVU=", - "requires": { - "seq": "0.3.5" - } - }, "request": { "version": "2.83.0", "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", @@ -1129,15 +1105,6 @@ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", "dev": true }, - "seq": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/seq/-/seq-0.3.5.tgz", - "integrity": "sha1-rgKvOkJHk9jMvyEtaRdODFTf/jg=", - "requires": { - "chainsaw": "0.0.9", - "hashish": "0.0.4" - } - }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -1286,11 +1253,6 @@ "punycode": "1.4.1" } }, - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" - }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", diff --git a/package.json b/package.json index 4754dc605..ca63a53d5 100644 --- a/package.json +++ b/package.json @@ -21,8 +21,5 @@ "@types/node": "^9.4.6", "electron-rebuild": "^1.7.3", "typescript": "^2.7.2" - }, - "dependencies": { - "remove": "^0.1.5" } } From 4e77c07968283aa0d22e4e8e3f84b1fc655dee61 Mon Sep 17 00:00:00 2001 From: Kenneth Skovhus Date: Mon, 12 Mar 2018 00:29:41 +0100 Subject: [PATCH 05/10] Add linting setup --- package-lock.json | 196 ++++++++++++++++++++++++++++++++++++++ package.json | 8 +- server/tslint.json | 3 + tslint.base.json | 33 +++++++ vscode-client/tslint.json | 3 + 5 files changed, 242 insertions(+), 1 deletion(-) create mode 100644 server/tslint.json create mode 100644 tslint.base.json create mode 100644 vscode-client/tslint.json diff --git a/package-lock.json b/package-lock.json index b92ab1455..35fa24b04 100644 --- a/package-lock.json +++ b/package-lock.json @@ -59,6 +59,15 @@ "readable-stream": "2.3.4" } }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, "asn1": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", @@ -89,6 +98,44 @@ "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", "dev": true }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -230,6 +277,12 @@ "delayed-stream": "1.0.0" } }, + "commander": { + "version": "2.15.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.0.tgz", + "integrity": "sha512-7B1ilBwtYSbetCgTY1NJFg+gVpestg0fdA1MhC1Vs4ssyfSXnCAjFr+QcQM9/RedXC0EaUx1sG8Smgw2VfgKEg==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -310,6 +363,12 @@ "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=", "dev": true }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, "ecc-jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", @@ -353,6 +412,28 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "eslint-plugin-prettier": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-2.6.0.tgz", + "integrity": "sha512-floiaI4F7hRkTrFe8V2ItOK97QYrX75DjmdzmVITZoAP6Cn06oEDPQRsO6MlHEP/u2SxI3xQ52Kpjw6j5WGfeQ==", + "dev": true, + "requires": { + "fast-diff": "1.1.2", + "jest-docblock": "21.2.0" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, "extend": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", @@ -371,6 +452,12 @@ "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", "dev": true }, + "fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==", + "dev": true + }, "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", @@ -500,6 +587,15 @@ "har-schema": "2.0.0" } }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -623,6 +719,28 @@ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", "dev": true }, + "jest-docblock": { + "version": "21.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-21.2.0.tgz", + "integrity": "sha512-5IZ7sY9dBAYSV+YjQ0Ovb540Ku7AO9Z5o2Cg789xj167iQuZ2cG+z0f3Uct6WeYLbU6aQiM2pCs7sZ+4dotydw==", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.11.0.tgz", + "integrity": "sha512-saJstZWv7oNeOyBh3+Dx1qWzhW0+e6/8eDzo7p5rDFqxntSztloLtuKu+Ejhtq82jsilwOIZYsCz+lIjthg1Hw==", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "4.0.0" + } + }, "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", @@ -931,6 +1049,12 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, "path-type": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", @@ -969,6 +1093,12 @@ "pinkie": "2.0.4" } }, + "prettier": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.11.1.tgz", + "integrity": "sha512-T/KD65Ot0PB97xTrG8afQ46x3oiVhnfGjGESSI9NWYcG92+OUPZKkwHqGWXH2t9jK1crnQjubECW0FuOth+hxw==", + "dev": true + }, "process-nextick-args": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", @@ -1065,6 +1195,15 @@ "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -1158,6 +1297,12 @@ "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", "dev": true }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, "sshpk": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", @@ -1253,6 +1398,57 @@ "punycode": "1.4.1" } }, + "tslib": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.0.tgz", + "integrity": "sha512-f/qGG2tUkrISBlQZEjEqoZ3B2+npJjIf04H1wuAv9iA8i04Icp+61KRXxFdha22670NJopsZCIjhC3SnjPRKrQ==", + "dev": true + }, + "tslint": { + "version": "5.9.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.9.1.tgz", + "integrity": "sha1-ElX4ej/1frCw4fDmEKi0dIBGya4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "builtin-modules": "1.1.1", + "chalk": "2.3.1", + "commander": "2.15.0", + "diff": "3.5.0", + "glob": "7.1.2", + "js-yaml": "3.11.0", + "minimatch": "3.0.4", + "resolve": "1.5.0", + "semver": "5.5.0", + "tslib": "1.9.0", + "tsutils": "2.22.2" + } + }, + "tslint-config-prettier": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/tslint-config-prettier/-/tslint-config-prettier-1.9.0.tgz", + "integrity": "sha512-glCHJJrJYXoP/nvhrmb7gt7q2Er0PaXu3zwySpIxRZvCYgBWt8l+Qi4VVTgFt5Moj/1klWg08PxxjE3/7hvp3Q==", + "dev": true + }, + "tslint-plugin-prettier": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/tslint-plugin-prettier/-/tslint-plugin-prettier-1.3.0.tgz", + "integrity": "sha512-6UqeeV6EABp0RdQkW6eC1vwnAXcKMGJgPeJ5soXiKdSm2vv7c3dp+835CM8pjgx9l4uSa7tICm1Kli+SMsADDg==", + "dev": true, + "requires": { + "eslint-plugin-prettier": "2.6.0", + "tslib": "1.9.0" + } + }, + "tsutils": { + "version": "2.22.2", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.22.2.tgz", + "integrity": "sha512-u06FUSulCJ+Y8a2ftuqZN6kIGqdP2yJjUPEngXqmdPND4UQfb04igcotH+dw+IFr417yP6muCLE8/5/Qlfnx0w==", + "dev": true, + "requires": { + "tslib": "1.9.0" + } + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", diff --git a/package.json b/package.json index ca63a53d5..18c6dd6d6 100644 --- a/package.json +++ b/package.json @@ -15,11 +15,17 @@ "compile:client": "cd vscode-client && npm run compile && cd ..", "watch:client": "cd vscode-client && npm run compile:watch && cd ..", "compile:server": "cd server && npm run compile && cd ..", - "watch:server": "cd server && npm run compile:watch && cd .." + "watch:server": "cd server && npm run compile:watch && cd ..", + "lint": "tslint --project vscode-client --fix", + "lint:bail": "tslint --project vscode-client" }, "devDependencies": { "@types/node": "^9.4.6", "electron-rebuild": "^1.7.3", + "prettier": "^1.11.0", + "tslint": "^5.9.1", + "tslint-config-prettier": "^1.9.0", + "tslint-plugin-prettier": "^1.3.0", "typescript": "^2.7.2" } } diff --git a/server/tslint.json b/server/tslint.json new file mode 100644 index 000000000..92dd65e2e --- /dev/null +++ b/server/tslint.json @@ -0,0 +1,3 @@ +{ + "extends": "../tslint.base.json" +} diff --git a/tslint.base.json b/tslint.base.json new file mode 100644 index 000000000..8cdb1b887 --- /dev/null +++ b/tslint.base.json @@ -0,0 +1,33 @@ +{ + "extends": [ + "tslint:latest", + "tslint-config-prettier" + ], + "rulesDirectory": [ + "tslint-plugin-prettier" + ], + "rules": { + "prettier": [ + true, + { + "singleQuote": true, + "trailingComma": "all", + "printWidth": 90, + "semi": false + } + ], + + "ordered-imports": true, + "object-literal-sort-keys": false, + "interface-over-type-literal": false, + "array-type": false, + "only-arrow-functions": false, + "interface-name": false, + "no-console": false + }, + "linterOptions": { + "exclude": [ + "**/out" + ] + } +} diff --git a/vscode-client/tslint.json b/vscode-client/tslint.json new file mode 100644 index 000000000..92dd65e2e --- /dev/null +++ b/vscode-client/tslint.json @@ -0,0 +1,3 @@ +{ + "extends": "../tslint.base.json" +} From ca9d32640d04eca85a3693434be0140409dd7763 Mon Sep 17 00:00:00 2001 From: Kenneth Skovhus Date: Mon, 12 Mar 2018 00:32:19 +0100 Subject: [PATCH 06/10] Lint vscode-client --- vscode-client/src/extension.ts | 54 ++++++++++++++++++++-------------- vscode-client/src/util.ts | 16 +++++----- 2 files changed, 39 insertions(+), 31 deletions(-) diff --git a/vscode-client/src/extension.ts b/vscode-client/src/extension.ts index 4413aae77..d484741fd 100644 --- a/vscode-client/src/extension.ts +++ b/vscode-client/src/extension.ts @@ -1,13 +1,16 @@ -'use strict'; +'use strict' -import { workspace, window, ExtensionContext } from 'vscode'; -import { LanguageClient, LanguageClientOptions, ServerOptions } from 'vscode-languageclient'; +import { ExtensionContext, window, workspace } from 'vscode' +import { + LanguageClient, + LanguageClientOptions, + ServerOptions, +} from 'vscode-languageclient' -import * as Util from './util'; +import * as Util from './util' export function activate(context: ExtensionContext) { - Util - .base() + Util.base() .then(base => Util.executable(base)) .then(command => start(context, command)) .catch(_ => handleMissingExecutable()) @@ -15,39 +18,46 @@ export function activate(context: ExtensionContext) { function start(context: ExtensionContext, command: string) { const serverOptions: ServerOptions = { - run : { - command: command, - args: ['start'] + run: { + command, + args: ['start'], }, debug: { - command: command, - args: ['start'] - } + command, + args: ['start'], + }, } - let clientOptions: LanguageClientOptions = { - documentSelector: [{ - scheme: 'file', - language: 'shellscript' - }], + const clientOptions: LanguageClientOptions = { + documentSelector: [ + { + scheme: 'file', + language: 'shellscript', + }, + ], synchronize: { configurationSection: 'Bash IDE', // Notify the server about file changes to '.clientrc files contain in the workspace - fileEvents: workspace.createFileSystemWatcher('**/.clientrc') - } + fileEvents: workspace.createFileSystemWatcher('**/.clientrc'), + }, } - let disposable = new LanguageClient('Bash IDE', 'Bash IDE', serverOptions, clientOptions).start(); + const disposable = new LanguageClient( + 'Bash IDE', + 'Bash IDE', + serverOptions, + clientOptions, + ).start() // Push the disposable to the context's subscriptions so that the // client can be deactivated on extension deactivation - context.subscriptions.push(disposable); + context.subscriptions.push(disposable) } function handleMissingExecutable() { const message = `Can't find bash-langauge-server on your PATH. Please install it using npm i -g bash-language-server.` const options = { - modal: false + modal: false, } window.showErrorMessage(message, options) diff --git a/vscode-client/src/util.ts b/vscode-client/src/util.ts index 676eb5fff..7c52d9a23 100644 --- a/vscode-client/src/util.ts +++ b/vscode-client/src/util.ts @@ -1,5 +1,5 @@ -import * as Process from 'child_process'; -import * as Path from 'path'; +import * as Process from 'child_process' +import * as Path from 'path' /** * @@ -10,23 +10,21 @@ export function base(): Promise { if (err) { reject(err) } - const base = stdout.replace(/(\n|\r)+$/, '').trim() - resolve(base) + const basePath = stdout.replace(/(\n|\r)+$/, '').trim() + resolve(basePath) }) }) } -export function executable(base: string): Promise { - const command = Path.join(base, 'bash-language-server') +export function executable(basePath: string): Promise { + const command = Path.join(basePath, 'bash-language-server') return new Promise((resolve, reject) => { // Simply check if the bash-language-server is installed. - Process.execFile(command, ['-v'], (err) => { + Process.execFile(command, ['-v'], err => { if (err) { reject(err) } resolve(command) }) }) - - } From 347b7acbed602f918824699ffcb1af9742750bdb Mon Sep 17 00:00:00 2001 From: Kenneth Skovhus Date: Mon, 12 Mar 2018 00:36:09 +0100 Subject: [PATCH 07/10] Linting server (auto-fix) --- package.json | 4 +- server/src/analyser.ts | 72 +++++++++---------- server/src/server.ts | 155 ++++++++++++++++++++--------------------- 3 files changed, 112 insertions(+), 119 deletions(-) diff --git a/package.json b/package.json index 18c6dd6d6..e67af2eca 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,8 @@ "watch:client": "cd vscode-client && npm run compile:watch && cd ..", "compile:server": "cd server && npm run compile && cd ..", "watch:server": "cd server && npm run compile:watch && cd ..", - "lint": "tslint --project vscode-client --fix", - "lint:bail": "tslint --project vscode-client" + "lint": "tslint --project vscode-client --fix && tslint --project server --fix", + "lint:bail": "tslint --project vscode-client && tslint --project server" }, "devDependencies": { "@types/node": "^9.4.6", diff --git a/server/src/analyser.ts b/server/src/analyser.ts index 939f63865..e85b60dac 100644 --- a/server/src/analyser.ts +++ b/server/src/analyser.ts @@ -1,12 +1,20 @@ -import { Range, Location, SymbolInformation, SymbolKind, Diagnostic, DiagnosticSeverity } from "vscode-languageserver/lib/main"; -import {Document, ASTNode} from "tree-sitter" -const bash = require("tree-sitter-bash") +// tslint:disable:no-submodule-imports +import { ASTNode, Document } from 'tree-sitter' +import * as bash from 'tree-sitter-bash' +import { + Diagnostic, + DiagnosticSeverity, + Location, + Range, + SymbolInformation, + SymbolKind, +} from 'vscode-languageserver/lib/main' // Global mapping from tree-sitter node type to vscode SymbolKind type Kinds = { [type: string]: SymbolKind } const kinds: Kinds = { - 'environment_variable_assignment': SymbolKind.Variable, - 'function_definition': SymbolKind.Function + environment_variable_assignment: SymbolKind.Variable, + function_definition: SymbolKind.Function, } // Global map of all the declarations that we've seen, indexed by file @@ -32,10 +40,9 @@ const texts: Texts = {} * */ export function analyze(uri: string, contents: string): Diagnostic[] { - - const d = new Document(); - d.setLanguage(bash); - d.setInputString(contents); + const d = new Document() + d.setLanguage(bash) + d.setInputString(contents) d.parse() documents[uri] = d @@ -44,32 +51,27 @@ export function analyze(uri: string, contents: string): Diagnostic[] { const problems = [] - - forEach(d.rootNode, (n) => { + forEach(d.rootNode, n => { if (n.type == 'ERROR') { problems.push( Diagnostic.create( range(n), 'Failed to parse expression', - DiagnosticSeverity.Error - ) + DiagnosticSeverity.Error, + ), ) return - } - else if (isDefinition(n)) { + } else if (isDefinition(n)) { const named = n.firstNamedChild const name = contents.slice(named.startIndex, named.endIndex) const namedDeclarations = declarations[uri][name] || [] - namedDeclarations.push(SymbolInformation.create( - name, - kinds[n.type], - range(named), - uri, - )) + namedDeclarations.push( + SymbolInformation.create(name, kinds[n.type], range(named), uri), + ) declarations[uri][name] = namedDeclarations } - }); + }) return problems } @@ -80,7 +82,7 @@ export function analyze(uri: string, contents: string): Diagnostic[] { export function findDefinition(name: string): Location[] { const symbols: SymbolInformation[] = [] Object.keys(declarations).forEach(uri => { - (declarations[uri][name] || []).forEach(d => symbols.push(d)) + ;(declarations[uri][name] || []).forEach(d => symbols.push(d)) }) return symbols.map(s => s.location) } @@ -106,10 +108,9 @@ export function findOccurrences(uri: string, query: string): Location[] { const locations = [] - forEach(doc.rootNode, (n) => { - - var name: string = null - var rng: Range = null + forEach(doc.rootNode, n => { + let name: string = null + let rng: Range = null if (isReference(n)) { const node = n.firstNamedChild || n @@ -124,7 +125,6 @@ export function findOccurrences(uri: string, query: string): Location[] { if (name == query) { locations.push(Location.create(uri, rng)) } - }) return locations @@ -149,7 +149,7 @@ export function wordAtPoint(uri: string, line: number, column: number): string | const document = documents[uri] const contents = texts[uri] - const node = document.rootNode.namedDescendantForPosition({row: line, column: column}) + const node = document.rootNode.namedDescendantForPosition({ row: line, column }) const start = node.startIndex const end = node.endIndex @@ -179,7 +179,7 @@ function range(n: ASTNode): Range { n.startPosition.row, n.startPosition.column, n.endPosition.row, - n.endPosition.column + n.endPosition.column, ) } @@ -189,9 +189,9 @@ function isDefinition(n: ASTNode): boolean { // variable_assignment case 'variable_assignment': case 'function_definition': - return true - default: - return false + return true + default: + return false } } @@ -199,8 +199,8 @@ function isReference(n: ASTNode): boolean { switch (n.type) { case 'variable_name': case 'command_name': - return true - default: - return false + return true + default: + return false } } diff --git a/server/src/server.ts b/server/src/server.ts index a0814fc25..aceabbad2 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -1,64 +1,62 @@ -"use strict"; +'use strict' +// tslint:disable:no-var-requires import { + CompletionItem, createConnection, + Definition, + DocumentHighlight, + DocumentSymbolParams, IConnection, - TextDocuments, InitializeResult, - TextDocumentPositionParams, - CompletionItem, - Definition, + Location, + ReferenceParams, StreamMessageReader, StreamMessageWriter, SymbolInformation, - DocumentSymbolParams, - Location, - DocumentHighlight, - ReferenceParams -} from "vscode-languageserver"; + TextDocumentPositionParams, + TextDocuments, +} from 'vscode-languageserver' -const glob = require("glob"); -const fs = require("fs"); -import * as Path from "path"; +const glob = require('glob') +const fs = require('fs') +import * as Path from 'path' const pkg = require('../package') -import * as Analyser from "./analyser"; +import * as Analyser from './analyser' export function listen() { // Create a connection for the server. // The connection uses stdin/stdout for communication. const connection: IConnection = createConnection( new StreamMessageReader(process.stdin), - new StreamMessageWriter(process.stdout) - ); + new StreamMessageWriter(process.stdout), + ) // Create a simple text document manager. The text document manager // supports full document sync only - const documents: TextDocuments = new TextDocuments(); + const documents: TextDocuments = new TextDocuments() // Make the text document manager listen on the connection // for open, change and close text document events - documents.listen(connection); + documents.listen(connection) connection.onInitialize((params): InitializeResult => { - - connection.console.log( - `Initialized server v. ${pkg.version} for ${params.rootUri}` - ); + connection.console.log(`Initialized server v. ${pkg.version} for ${params.rootUri}`) if (params.rootPath) { - glob("**/*.sh", { cwd: params.rootPath }, (err, paths) => { + glob('**/*.sh', { cwd: params.rootPath }, (err, paths) => { if (err != null) { - connection.console.error(err); + connection.console.error(err) } else { paths.forEach(p => { - const absolute = Path.join(params.rootPath, p); - const uri = "file://" + absolute; - connection.console.log("Analyzing " + uri); - Analyser.analyze(uri, fs.readFileSync(absolute, "utf8")); - }); + const absolute = Path.join(params.rootPath, p) + const uri = 'file://' + absolute + connection.console.log('Analyzing ' + uri) + Analyser.analyze(uri, fs.readFileSync(absolute, 'utf8')) + }) } - }); + }) } return { @@ -67,98 +65,93 @@ export function listen() { // for partial updates. textDocumentSync: documents.syncKind, completionProvider: { - resolveProvider: true + resolveProvider: true, }, documentHighlightProvider: true, definitionProvider: true, documentSymbolProvider: true, - referencesProvider: true - } - }; - }); + referencesProvider: true, + }, + } + }) // The content of a text document has changed. This event is emitted // when the text document first opened or when its content has changed. documents.onDidChangeContent(change => { - connection.console.log("Invoked onDidChangeContent"); - const uri = change.document.uri; - const contents = change.document.getText(); - const diagnostics = Analyser.analyze(uri, contents); + connection.console.log('Invoked onDidChangeContent') + const uri = change.document.uri + const contents = change.document.getText() + const diagnostics = Analyser.analyze(uri, contents) connection.sendDiagnostics({ uri: change.document.uri, - diagnostics - }); - }); + diagnostics, + }) + }) connection.onDidChangeWatchedFiles(_change => { // Monitored files have change in VSCode - connection.console.log("We received an file change event"); - }); + connection.console.log('We received an file change event') + }) connection.onDefinition( (textDocumentPosition: TextDocumentPositionParams): Definition => { connection.console.log( `Asked for definition at ${textDocumentPosition.position.line}:${ textDocumentPosition.position.character - }` - ); + }`, + ) const word = Analyser.wordAtPoint( textDocumentPosition.textDocument.uri, textDocumentPosition.position.line, - textDocumentPosition.position.character - ); - return Analyser.findDefinition(word); - } - ); + textDocumentPosition.position.character, + ) + return Analyser.findDefinition(word) + }, + ) - connection.onDocumentSymbol( - (params: DocumentSymbolParams): SymbolInformation[] => { - return Analyser.findSymbols(params.textDocument.uri); - } - ); + connection.onDocumentSymbol((params: DocumentSymbolParams): SymbolInformation[] => { + return Analyser.findSymbols(params.textDocument.uri) + }) connection.onDocumentHighlight( (textDocumentPosition: TextDocumentPositionParams): DocumentHighlight[] => { const word = Analyser.wordAtPoint( textDocumentPosition.textDocument.uri, textDocumentPosition.position.line, - textDocumentPosition.position.character - ); - return Analyser.findOccurrences( - textDocumentPosition.textDocument.uri, - word - ).map(n => ({ range: n.range })); - } - ); + textDocumentPosition.position.character, + ) + return Analyser.findOccurrences(textDocumentPosition.textDocument.uri, word).map( + n => ({ range: n.range }), + ) + }, + ) connection.onReferences((params: ReferenceParams): Location[] => { const word = Analyser.wordAtPoint( params.textDocument.uri, params.position.line, - params.position.character - ); - return Analyser.findReferences(word); - }); + params.position.character, + ) + return Analyser.findReferences(word) + }) connection.onCompletion( (textDocumentPosition: TextDocumentPositionParams): CompletionItem[] => { connection.console.log( `Asked for completions at ${textDocumentPosition.position.line}:${ textDocumentPosition.position.character - }` - ); - const symbols = Analyser.findSymbols( - textDocumentPosition.textDocument.uri - ); + }`, + ) + const symbols = Analyser.findSymbols(textDocumentPosition.textDocument.uri) return symbols.map((s: SymbolInformation) => { return { label: s.name, kind: s.kind, - data: s.name // Used for later resolving more info. - }; - }); - } - ); + data: s.name, // Used for later resolving more info. + } + }) + }, + ) // This handler resolve additional information for the item selected in // the completion list. @@ -172,9 +165,9 @@ export function listen() { // item.documentation = 'TypeScript documentation' // } - return item; - }); + return item + }) // Listen on the connection - connection.listen(); + connection.listen() } From 344a8003d3563820905b16333c10124b6a153b5e Mon Sep 17 00:00:00 2001 From: Kenneth Skovhus Date: Mon, 12 Mar 2018 00:38:00 +0100 Subject: [PATCH 08/10] Fix equality checks --- server/src/analyser.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/analyser.ts b/server/src/analyser.ts index e85b60dac..0b92a8d86 100644 --- a/server/src/analyser.ts +++ b/server/src/analyser.ts @@ -52,7 +52,7 @@ export function analyze(uri: string, contents: string): Diagnostic[] { const problems = [] forEach(d.rootNode, n => { - if (n.type == 'ERROR') { + if (n.type === 'ERROR') { problems.push( Diagnostic.create( range(n), @@ -122,7 +122,7 @@ export function findOccurrences(uri: string, query: string): Location[] { rng = range(n.firstNamedChild) } - if (name == query) { + if (name === query) { locations.push(Location.create(uri, rng)) } }) From db8dc83074165964a13318e259d1fb72f6fc470d Mon Sep 17 00:00:00 2001 From: Kenneth Skovhus Date: Mon, 12 Mar 2018 00:38:31 +0100 Subject: [PATCH 09/10] Remove unused parameter (tslint complaints) --- server/src/server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/server.ts b/server/src/server.ts index aceabbad2..9e124c3d4 100644 --- a/server/src/server.ts +++ b/server/src/server.ts @@ -88,7 +88,7 @@ export function listen() { }) }) - connection.onDidChangeWatchedFiles(_change => { + connection.onDidChangeWatchedFiles(() => { // Monitored files have change in VSCode connection.console.log('We received an file change event') }) From 557f5315ce2213589547a65761e0a5c5a24d796c Mon Sep 17 00:00:00 2001 From: Kenneth Skovhus Date: Mon, 12 Mar 2018 00:45:04 +0100 Subject: [PATCH 10/10] Remove the need for semicolon inside forEach loop --- server/src/analyser.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/src/analyser.ts b/server/src/analyser.ts index 0b92a8d86..77be7d167 100644 --- a/server/src/analyser.ts +++ b/server/src/analyser.ts @@ -82,7 +82,8 @@ export function analyze(uri: string, contents: string): Diagnostic[] { export function findDefinition(name: string): Location[] { const symbols: SymbolInformation[] = [] Object.keys(declarations).forEach(uri => { - ;(declarations[uri][name] || []).forEach(d => symbols.push(d)) + const declarationNames = declarations[uri][name] || [] + declarationNames.forEach(d => symbols.push(d)) }) return symbols.map(s => s.location) }