From 04df20a732696e553735e5024a5d1edf177eb4b3 Mon Sep 17 00:00:00 2001 From: Robert Date: Fri, 21 Jul 2023 15:22:44 +0100 Subject: [PATCH 1/6] Install ts-unused-exports --- extensions/ql-vscode/package-lock.json | 156 +++++++++++++++++++++++++ extensions/ql-vscode/package.json | 1 + 2 files changed, 157 insertions(+) diff --git a/extensions/ql-vscode/package-lock.json b/extensions/ql-vscode/package-lock.json index 6c17228ea86..17515108399 100644 --- a/extensions/ql-vscode/package-lock.json +++ b/extensions/ql-vscode/package-lock.json @@ -151,6 +151,7 @@ "ts-loader": "^9.4.2", "ts-node": "^10.7.0", "ts-protoc-gen": "^0.9.0", + "ts-unused-exports": "^9.0.5", "typescript": "^5.0.2", "webpack": "^5.76.0", "webpack-cli": "^5.0.1" @@ -34708,6 +34709,100 @@ "protoc-gen-ts": "bin/protoc-gen-ts" } }, + "node_modules/ts-unused-exports": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ts-unused-exports/-/ts-unused-exports-9.0.5.tgz", + "integrity": "sha512-1XAXaH2i4Al/aZO06pWDn9MUgTN0KQi+fvWudiWfHUTHAav45gzrx7Xq6JAsu6+LoMlVoyGvNvZSPW3KTjDncA==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "tsconfig-paths": "^3.9.0" + }, + "bin": { + "ts-unused-exports": "bin/ts-unused-exports" + }, + "funding": { + "url": "https://github.com/pzavolinsky/ts-unused-exports?sponsor=1" + }, + "peerDependencies": { + "typescript": ">=3.8.3" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": false + } + } + }, + "node_modules/ts-unused-exports/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ts-unused-exports/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ts-unused-exports/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ts-unused-exports/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ts-unused-exports/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-unused-exports/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -62374,6 +62469,67 @@ "integrity": "sha512-cFEUTY9U9o6C4DPPfMHk2ZUdIAKL91hZN1fyx5Stz3g56BDVOC7hk+r5fEMCAGaaIgi2akkT1a2hrxu1wo2Phg==", "dev": true }, + "ts-unused-exports": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ts-unused-exports/-/ts-unused-exports-9.0.5.tgz", + "integrity": "sha512-1XAXaH2i4Al/aZO06pWDn9MUgTN0KQi+fvWudiWfHUTHAav45gzrx7Xq6JAsu6+LoMlVoyGvNvZSPW3KTjDncA==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "tsconfig-paths": "^3.9.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", diff --git a/extensions/ql-vscode/package.json b/extensions/ql-vscode/package.json index 55b6db41ab7..2fcd65a81c9 100644 --- a/extensions/ql-vscode/package.json +++ b/extensions/ql-vscode/package.json @@ -1882,6 +1882,7 @@ "ts-loader": "^9.4.2", "ts-node": "^10.7.0", "ts-protoc-gen": "^0.9.0", + "ts-unused-exports": "^9.0.5", "typescript": "^5.0.2", "webpack": "^5.76.0", "webpack-cli": "^5.0.1" From d73276c136fbcb75af84a3067b902f1a0764680e Mon Sep 17 00:00:00 2001 From: Robert Date: Fri, 21 Jul 2023 14:55:35 +0100 Subject: [PATCH 2/6] Add find-deadcode npm script --- extensions/ql-vscode/find-deadcode-tsconfig.json | 5 +++++ extensions/ql-vscode/package.json | 1 + 2 files changed, 6 insertions(+) create mode 100644 extensions/ql-vscode/find-deadcode-tsconfig.json diff --git a/extensions/ql-vscode/find-deadcode-tsconfig.json b/extensions/ql-vscode/find-deadcode-tsconfig.json new file mode 100644 index 00000000000..678ff8ad171 --- /dev/null +++ b/extensions/ql-vscode/find-deadcode-tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../tsconfig.json", + "include": ["**/*.ts*"], + "exclude": ["node_modules"] +} diff --git a/extensions/ql-vscode/package.json b/extensions/ql-vscode/package.json index 2fcd65a81c9..224cae1f504 100644 --- a/extensions/ql-vscode/package.json +++ b/extensions/ql-vscode/package.json @@ -1732,6 +1732,7 @@ "format": "prettier --write **/*.{ts,tsx} && eslint . --ext .ts,.tsx --fix", "lint": "eslint . --ext .js,.ts,.tsx --max-warnings=0", "lint:markdown": "markdownlint-cli2 \"../../**/*.{md,mdx}\" \"!**/node_modules/**\" \"!**/.vscode-test/**\" \"!**/build/cli/v*/**\"", + "find-deadcode": "ts-unused-exports find-deadcode-tsconfig.json --showLineNumber --excludePathsFromReport=$(find src test -type f '(' -name jest.config.ts -or -name 'index.tsx' -or -name 'index.ts' ')' -print0 | tr '\\0' ';')'gulpfile.ts/;src/stories/;test/vscode-tests/jest-runner-installed-extensions.ts'", "format-staged": "lint-staged", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", From 814acfa74af921a457f65818d6a620f75be0c7f8 Mon Sep 17 00:00:00 2001 From: Robert Date: Fri, 21 Jul 2023 14:56:02 +0100 Subject: [PATCH 3/6] Add find-deadcode to CI linting workflow --- .github/workflows/main.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b7e1aa9a40d..a61d97e2577 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -110,6 +110,11 @@ jobs: run: | npm run lint:scenarios + - name: Find deadcode + working-directory: extensions/ql-vscode + run: | + npm run find-deadcode + unit-test: name: Unit Test runs-on: ${{ matrix.os }} From 10c6708db5f0848cae93f7bf5c62603e2a971aba Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 24 Jul 2023 14:28:10 +0100 Subject: [PATCH 4/6] Fix reference to tsconfig.json --- extensions/ql-vscode/find-deadcode-tsconfig.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extensions/ql-vscode/find-deadcode-tsconfig.json b/extensions/ql-vscode/find-deadcode-tsconfig.json index 678ff8ad171..d22c31eefb5 100644 --- a/extensions/ql-vscode/find-deadcode-tsconfig.json +++ b/extensions/ql-vscode/find-deadcode-tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../tsconfig.json", + "extends": "./tsconfig.json", "include": ["**/*.ts*"], "exclude": ["node_modules"] } From 08675e6713d3d0044eb2b3bf835a16611de378b6 Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 24 Jul 2023 17:27:39 +0100 Subject: [PATCH 5/6] Rename to tsconfig.deadcode.json --- extensions/ql-vscode/package.json | 2 +- .../{find-deadcode-tsconfig.json => tsconfig.deadcode.json} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename extensions/ql-vscode/{find-deadcode-tsconfig.json => tsconfig.deadcode.json} (100%) diff --git a/extensions/ql-vscode/package.json b/extensions/ql-vscode/package.json index 224cae1f504..0415eb045a5 100644 --- a/extensions/ql-vscode/package.json +++ b/extensions/ql-vscode/package.json @@ -1732,7 +1732,7 @@ "format": "prettier --write **/*.{ts,tsx} && eslint . --ext .ts,.tsx --fix", "lint": "eslint . --ext .js,.ts,.tsx --max-warnings=0", "lint:markdown": "markdownlint-cli2 \"../../**/*.{md,mdx}\" \"!**/node_modules/**\" \"!**/.vscode-test/**\" \"!**/build/cli/v*/**\"", - "find-deadcode": "ts-unused-exports find-deadcode-tsconfig.json --showLineNumber --excludePathsFromReport=$(find src test -type f '(' -name jest.config.ts -or -name 'index.tsx' -or -name 'index.ts' ')' -print0 | tr '\\0' ';')'gulpfile.ts/;src/stories/;test/vscode-tests/jest-runner-installed-extensions.ts'", + "find-deadcode": "ts-unused-exports tsconfig.deadcode.json --showLineNumber --excludePathsFromReport=$(find src test -type f '(' -name jest.config.ts -or -name 'index.tsx' -or -name 'index.ts' ')' -print0 | tr '\\0' ';')'gulpfile.ts/;src/stories/;test/vscode-tests/jest-runner-installed-extensions.ts'", "format-staged": "lint-staged", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", diff --git a/extensions/ql-vscode/find-deadcode-tsconfig.json b/extensions/ql-vscode/tsconfig.deadcode.json similarity index 100% rename from extensions/ql-vscode/find-deadcode-tsconfig.json rename to extensions/ql-vscode/tsconfig.deadcode.json From 5572cece8357c835a45d6b0726be03798573046b Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 24 Jul 2023 17:59:34 +0100 Subject: [PATCH 6/6] Convert find-deadcode to a script --- extensions/ql-vscode/package.json | 2 +- extensions/ql-vscode/scripts/find-deadcode.ts | 47 +++++++++++++++++++ 2 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 extensions/ql-vscode/scripts/find-deadcode.ts diff --git a/extensions/ql-vscode/package.json b/extensions/ql-vscode/package.json index 0415eb045a5..11d864a7b64 100644 --- a/extensions/ql-vscode/package.json +++ b/extensions/ql-vscode/package.json @@ -1732,7 +1732,7 @@ "format": "prettier --write **/*.{ts,tsx} && eslint . --ext .ts,.tsx --fix", "lint": "eslint . --ext .js,.ts,.tsx --max-warnings=0", "lint:markdown": "markdownlint-cli2 \"../../**/*.{md,mdx}\" \"!**/node_modules/**\" \"!**/.vscode-test/**\" \"!**/build/cli/v*/**\"", - "find-deadcode": "ts-unused-exports tsconfig.deadcode.json --showLineNumber --excludePathsFromReport=$(find src test -type f '(' -name jest.config.ts -or -name 'index.tsx' -or -name 'index.ts' ')' -print0 | tr '\\0' ';')'gulpfile.ts/;src/stories/;test/vscode-tests/jest-runner-installed-extensions.ts'", + "find-deadcode": "ts-node scripts/find-deadcode.ts", "format-staged": "lint-staged", "storybook": "storybook dev -p 6006", "build-storybook": "storybook build", diff --git a/extensions/ql-vscode/scripts/find-deadcode.ts b/extensions/ql-vscode/scripts/find-deadcode.ts new file mode 100644 index 00000000000..b45199250b2 --- /dev/null +++ b/extensions/ql-vscode/scripts/find-deadcode.ts @@ -0,0 +1,47 @@ +import { basename, join, relative, resolve } from "path"; +import analyzeTsConfig from "ts-unused-exports"; +import { containsPath, pathsEqual } from "../src/common/files"; +import { exit } from "process"; + +function ignoreFile(file: string): boolean { + return ( + containsPath("gulpfile.ts", file) || + containsPath(join("src", "stories"), file) || + pathsEqual( + join("test", "vscode-tests", "jest-runner-installed-extensions.ts"), + file, + ) || + basename(file) === "jest.config.ts" || + basename(file) === "index.tsx" || + basename(file) === "index.ts" + ); +} + +function main() { + const repositoryRoot = resolve(join(__dirname, "..")); + + const result = analyzeTsConfig("tsconfig.deadcode.json"); + let foundUnusedExports = false; + + for (const [filepath, exportNameAndLocations] of Object.entries(result)) { + const relativeFilepath = relative(repositoryRoot, filepath); + + if (ignoreFile(relativeFilepath)) { + continue; + } + + foundUnusedExports = true; + + console.log(relativeFilepath); + for (const exportNameAndLocation of exportNameAndLocations) { + console.log(` ${exportNameAndLocation.exportName}`); + } + console.log(); + } + + if (foundUnusedExports) { + exit(1); + } +} + +main();