From 697dfb968d79523b91ee2eae1313821dcbd97e4c Mon Sep 17 00:00:00 2001 From: orosmatthew Date: Mon, 16 Oct 2023 13:51:50 -0400 Subject: [PATCH] [extension] Add eslint --- extension/bwcontest/.eslintignore | 2 + extension/bwcontest/.eslintrc.cjs | 37 +++++ extension/bwcontest/.prettierignore | 2 +- extension/bwcontest/package-lock.json | 164 +++++++++++++++++---- extension/bwcontest/package.json | 8 +- extension/bwcontest/src/SidebarProvider.ts | 16 +- extension/bwcontest/src/extension.ts | 2 +- extension/bwcontest/src/problemPanel.ts | 6 +- extension/bwcontest/src/run/java.ts | 2 +- extension/bwcontest/webviews/global.d.ts | 1 + 10 files changed, 197 insertions(+), 43 deletions(-) create mode 100644 extension/bwcontest/.eslintignore create mode 100644 extension/bwcontest/.eslintrc.cjs diff --git a/extension/bwcontest/.eslintignore b/extension/bwcontest/.eslintignore new file mode 100644 index 0000000..07d2252 --- /dev/null +++ b/extension/bwcontest/.eslintignore @@ -0,0 +1,2 @@ +node_modules +out \ No newline at end of file diff --git a/extension/bwcontest/.eslintrc.cjs b/extension/bwcontest/.eslintrc.cjs new file mode 100644 index 0000000..468dfe3 --- /dev/null +++ b/extension/bwcontest/.eslintrc.cjs @@ -0,0 +1,37 @@ +module.exports = { + root: true, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:svelte/recommended', + 'prettier' + ], + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint'], + parserOptions: { + sourceType: 'module', + ecmaVersion: 2020, + extraFileExtensions: ['.svelte'] + }, + env: { + es2017: true, + node: true + }, + overrides: [ + { files: ['*.ts', '*.svelte'], rules: { 'no-undef': 'off' } }, + { + files: ['*.ts'], + rules: { + '@typescript-eslint/consistent-type-assertions': ['error', { assertionStyle: 'never' }] + }, + parserOptions: { project: ['./tsconfig.json', './webviews/tsconfig.json'] } + }, + { + files: ['*.svelte'], + parser: 'svelte-eslint-parser', + parserOptions: { + parser: '@typescript-eslint/parser' + } + } + ] +}; diff --git a/extension/bwcontest/.prettierignore b/extension/bwcontest/.prettierignore index baa198e..07d2252 100644 --- a/extension/bwcontest/.prettierignore +++ b/extension/bwcontest/.prettierignore @@ -1,2 +1,2 @@ node_modules -compiled \ No newline at end of file +out \ No newline at end of file diff --git a/extension/bwcontest/package-lock.json b/extension/bwcontest/package-lock.json index 56b7e14..053daef 100644 --- a/extension/bwcontest/package-lock.json +++ b/extension/bwcontest/package-lock.json @@ -13,7 +13,8 @@ "fs-extra": "^11.1.1", "isomorphic-git": "^1.24.5", "tree-kill": "^1.2.2", - "url-join": "^5.0.0" + "url-join": "^5.0.0", + "zod": "^3.22.4" }, "devDependencies": { "@rollup/plugin-commonjs": "^25.0.7", @@ -32,6 +33,8 @@ "concurrently": "^8.2.1", "esbuild": "^0.19.4", "eslint": "^8.51.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-svelte": "^2.34.0", "glob": "^10.3.10", "mocha": "^10.2.0", "postcss": "^8.4.31", @@ -2686,19 +2689,53 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/eslint-config-prettier": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.0.0.tgz", + "integrity": "sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==", "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "bin": { + "eslint-config-prettier": "bin/cli.js" }, - "funding": { - "url": "https://opencollective.com/eslint" + "peerDependencies": { + "eslint": ">=7.0.0" } }, - "node_modules/eslint/node_modules/eslint-scope": { + "node_modules/eslint-plugin-svelte": { + "version": "2.34.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.34.0.tgz", + "integrity": "sha512-4RYUgNai7wr0v+T/kljMiYSjC/oqwgq5i+cPppawryAayj4C7WK1ixFlWCGmNmBppnoKCl4iA4ZPzPtlHcb4CA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@jridgewell/sourcemap-codec": "^1.4.14", + "debug": "^4.3.1", + "esutils": "^2.0.3", + "known-css-properties": "^0.28.0", + "postcss": "^8.4.5", + "postcss-load-config": "^3.1.4", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.11", + "semver": "^7.5.3", + "svelte-eslint-parser": ">=0.33.0 <1.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0-0", + "svelte": "^3.37.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { "version": "7.2.2", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", @@ -2714,13 +2751,16 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { - "node": ">=4.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/espree": { @@ -2752,15 +2792,6 @@ "node": ">=0.10" } }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -2773,7 +2804,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -3725,6 +3756,12 @@ "prebuild-install": "^7.0.1" } }, + "node_modules/known-css-properties": { + "version": "0.28.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.28.0.tgz", + "integrity": "sha512-9pSL5XB4J+ifHP0e0jmmC98OGC1nL8/JjS+fi6mnTlIf//yt/MfVLtKg7S6nCtj/8KTcWX7nRlY0XywoYY1ISQ==", + "dev": true + }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -5065,6 +5102,48 @@ "postcss": "^8.2.15" } }, + "node_modules/postcss-safe-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "dev": true, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, "node_modules/postcss-selector-parser": { "version": "6.0.12", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", @@ -6037,6 +6116,33 @@ "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0" } }, + "node_modules/svelte-eslint-parser": { + "version": "0.33.1", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.33.1.tgz", + "integrity": "sha512-vo7xPGTlKBGdLH8T5L64FipvTrqv3OQRx9d2z5X05KKZDlF4rQk8KViZO4flKERY+5BiVdOh7zZ7JGJWo5P0uA==", + "dev": true, + "dependencies": { + "eslint-scope": "^7.0.0", + "eslint-visitor-keys": "^3.0.0", + "espree": "^9.0.0", + "postcss": "^8.4.29", + "postcss-scss": "^4.0.8" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "svelte": "^3.37.0 || ^4.0.0" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, "node_modules/svelte-preprocess": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.0.4.tgz", @@ -6606,6 +6712,14 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/extension/bwcontest/package.json b/extension/bwcontest/package.json index 6a0f469..8ed28ef 100644 --- a/extension/bwcontest/package.json +++ b/extension/bwcontest/package.json @@ -65,7 +65,8 @@ "esbuild": "npm run esbuild-base -- --sourcemap", "compile": "rollup -c && npm run esbuild-base -- --minify", "format": "prettier --plugin prettier-plugin-svelte --write .", - "watch": "concurrently \"rollup -c -w\" \"npm run esbuild-base -- --sourcemap --watch\"" + "watch": "concurrently \"rollup -c -w\" \"npm run esbuild-base -- --sourcemap --watch\"", + "lint": "prettier --plugin prettier-plugin-svelte --check . && eslint ." }, "devDependencies": { "@rollup/plugin-commonjs": "^25.0.7", @@ -84,6 +85,8 @@ "concurrently": "^8.2.1", "esbuild": "^0.19.4", "eslint": "^8.51.0", + "eslint-config-prettier": "^9.0.0", + "eslint-plugin-svelte": "^2.34.0", "glob": "^10.3.10", "mocha": "^10.2.0", "postcss": "^8.4.31", @@ -103,6 +106,7 @@ "fs-extra": "^11.1.1", "isomorphic-git": "^1.24.5", "tree-kill": "^1.2.2", - "url-join": "^5.0.0" + "url-join": "^5.0.0", + "zod": "^3.22.4" } } diff --git a/extension/bwcontest/src/SidebarProvider.ts b/extension/bwcontest/src/SidebarProvider.ts index 9f4e8ec..3db0ca0 100644 --- a/extension/bwcontest/src/SidebarProvider.ts +++ b/extension/bwcontest/src/SidebarProvider.ts @@ -47,7 +47,7 @@ export class SidebarProvider implements vscode.WebviewViewProvider { } case 'onStartup': { const token: string | undefined = this.context.globalState.get('token'); - const teamData = this.context.globalState.get('teamData') as TeamData | undefined; + const teamData: TeamData | undefined = this.context.globalState.get('teamData'); if (token && teamData !== undefined) { webviewPostMessage({ msg: 'onLogin', @@ -69,21 +69,21 @@ export class SidebarProvider implements vscode.WebviewViewProvider { password: m.data.password }) }); - const thing = await res.json(); - if (thing.success !== true) { - return; + const resData = await res.json(); + if (resData.success !== true) { + throw new Error(resData.error.message); } - const sessionToken = thing.token; + const sessionToken = resData.token; this.context.globalState.update('token', sessionToken); - const res1 = await fetch(urlJoin(this.webUrl, `api/team/${sessionToken}`), { + const teamRes = await fetch(urlJoin(this.webUrl, `api/team/${sessionToken}`), { method: 'GET' }); - const data2 = await res1.json(); + const data2 = await teamRes.json(); if (!data2.success) { return; } this.context.globalState.update('teamData', data2.data); - webviewPostMessage({ msg: 'onLogout' }); + webviewPostMessage({ msg: 'onLogin', data: data2.data }); break; } case 'onLogout': { diff --git a/extension/bwcontest/src/extension.ts b/extension/bwcontest/src/extension.ts index b232092..4361d2c 100644 --- a/extension/bwcontest/src/extension.ts +++ b/extension/bwcontest/src/extension.ts @@ -50,7 +50,7 @@ export async function cloneAndOpenRepo(contestId: number, teamId: number) { `${teamId.toString()}.git` ); - const repoName = repoUrl.split('/').pop()?.replace('.git', '')!; + const repoName = teamId.toString(); if (!fs.existsSync(`${currentSettings.repoClonePath}/BWContest`)) { fs.mkdirSync(`${currentSettings.repoClonePath}/BWContest`); diff --git a/extension/bwcontest/src/problemPanel.ts b/extension/bwcontest/src/problemPanel.ts index 8d40d45..2bb4da5 100644 --- a/extension/bwcontest/src/problemPanel.ts +++ b/extension/bwcontest/src/problemPanel.ts @@ -1,9 +1,5 @@ import * as vscode from 'vscode'; import { getNonce } from './getNonce'; -import { runJava } from './run/java'; -import { extensionSettings } from './extension'; -import { join } from 'path'; -import { submitProblem } from './submit'; import urlJoin from 'url-join'; export type ProblemData = { @@ -24,7 +20,7 @@ export class BWPanel { public static currentPanel: BWPanel | undefined; private running: boolean = false; - private kill: Function | null = null; + // private kill: () => void | null = null; private constructor( private readonly context: vscode.ExtensionContext, diff --git a/extension/bwcontest/src/run/java.ts b/extension/bwcontest/src/run/java.ts index 13580f6..9a5c3d3 100644 --- a/extension/bwcontest/src/run/java.ts +++ b/extension/bwcontest/src/run/java.ts @@ -14,7 +14,7 @@ export async function runJava( mainFile: string, mainClass: string, input: string -): Promise<{ output: Promise; kill: Function | null }> { +): Promise<{ output: Promise; kill: () => void | null }> { const javaPath = extensionSettings().javaPath; if (javaPath == '') { throw error('Java path not set'); diff --git a/extension/bwcontest/webviews/global.d.ts b/extension/bwcontest/webviews/global.d.ts index af88f57..a6eafa6 100644 --- a/extension/bwcontest/webviews/global.d.ts +++ b/extension/bwcontest/webviews/global.d.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ /// type VSCode = {