diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 00000000000..605758e6df6
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,73 @@
+module.exports = {
+ root: true,
+ extends: [
+ "eslint:recommended",
+ "plugin:compat/recommended",
+ "plugin:svelte/base",
+ "plugin:svelte/recommended",
+ "plugin:svelte/prettier",
+ "plugin:@typescript-eslint/recommended",
+ "plugin:@typescript-eslint/eslint-recommended",
+ "prettier",
+ ],
+ parser: "@typescript-eslint/parser",
+ parserOptions: {
+ extraFileExtensions: [".svelte"],
+ },
+ plugins: [
+ "svelte",
+ "simple-import-sort",
+ "import",
+ "@typescript-eslint",
+ "@typescript-eslint/eslint-plugin",
+ ],
+ rules: {
+ "prefer-const": "warn",
+ "no-nested-ternary": "warn",
+ "simple-import-sort/imports": "warn",
+ "simple-import-sort/exports": "warn",
+ "import/first": "warn",
+ "import/newline-after-import": "warn",
+ "import/no-useless-path-segments": "warn",
+ "import/no-duplicates": "warn",
+ "@typescript-eslint/no-non-null-assertion": "off",
+ "@typescript-eslint/ban-ts-comment": "warn",
+ "@typescript-eslint/no-unused-vars": [
+ "warn",
+ { argsIgnorePattern: "^_", varsIgnorePattern: "^_" },
+ ],
+ },
+ overrides: [
+ {
+ files: "*.svelte",
+ parser: "svelte-eslint-parser",
+ parserOptions: {
+ parser: "@typescript-eslint/parser",
+ },
+ rules: {
+ "svelte/no-useless-mustaches": "warn",
+ "svelte/require-optimized-style-attribute": "warn",
+ "svelte/html-quotes": "warn",
+ "svelte/prefer-class-directive": "warn",
+ "svelte/prefer-style-directive": "warn",
+ "svelte/shorthand-attribute": "warn",
+ "svelte/shorthand-directive": "warn",
+ "no-redeclare": "off",
+ "no-global-assign": "off",
+ "no-self-assign": "off",
+ "no-undef": "off",
+ "svelte/no-at-html-tags": "off",
+ /* We would also ideally get rid of this: */
+ "@typescript-eslint/no-explicit-any": "off",
+ /* Does not recognize that `store` and `$store` belongs to the same var: */
+ "@typescript-eslint/no-unused-vars": "off",
+ },
+ },
+ ],
+ env: { browser: true },
+ ignorePatterns: ["backend_proto.d.ts", "*.svelte.d.ts"],
+ globals: {
+ globalThis: false,
+ NodeListOf: false,
+ },
+};
diff --git a/.prettierrc b/.prettierrc
deleted file mode 100644
index 4f93aaee50c..00000000000
--- a/.prettierrc
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "trailingComma": "all",
- "printWidth": 88,
- "tabWidth": 4,
- "semi": true
-}
diff --git a/.prettierrc.js b/.prettierrc.js
new file mode 100644
index 00000000000..e4ecc75d9c2
--- /dev/null
+++ b/.prettierrc.js
@@ -0,0 +1,6 @@
+ module.exports = {
+ trailingComma: "all",
+ printWidth: 88,
+ tabWidth: 4,
+ semi: true,
+};
diff --git a/BUILD.bazel b/BUILD.bazel
index d6dc535baf3..ad0d082f355 100644
--- a/BUILD.bazel
+++ b/BUILD.bazel
@@ -35,5 +35,7 @@ pkg_tar(
exports_files([
"defs.bzl",
"package.json",
- ".prettierrc",
+ ".prettierignore",
+ ".prettierrc.js",
+ ".eslintrc.js",
])
diff --git a/docs/BUILD.bazel b/docs/BUILD.bazel
index 23af06ebb71..ed474913b98 100644
--- a/docs/BUILD.bazel
+++ b/docs/BUILD.bazel
@@ -1,4 +1,3 @@
load("//ts:prettier.bzl", "prettier_test")
# formatting of the .md files
-prettier_test()
diff --git a/package.json b/package.json
index e15003ea326..992146ec23c 100644
--- a/package.json
+++ b/package.json
@@ -28,7 +28,9 @@
"diff": "^5.0.0",
"escodegen": "^2.0.0",
"eslint": "^7.24.0",
+ "eslint-config-prettier": "^8.5.0",
"eslint-plugin-compat": "^3.13.0",
+ "eslint-plugin-svelte": "^2.2.0",
"espree": "^9.0.0",
"estraverse": "^5.2.0",
"glob": "^7.1.6",
@@ -69,7 +71,6 @@
"d3": "^7.0.0",
"eslint-plugin-import": "^2.25.4",
"eslint-plugin-simple-import-sort": "^7.0.0",
- "eslint-plugin-svelte3": "^3.4.0",
"intl-pluralrules": "^1.2.2",
"jquery": "^3.5.1",
"jquery-ui-dist": "^1.12.1",
diff --git a/ts/.eslintrc.js b/ts/.eslintrc.js
deleted file mode 100644
index 1b909510744..00000000000
--- a/ts/.eslintrc.js
+++ /dev/null
@@ -1,53 +0,0 @@
-module.exports = {
- extends: ["eslint:recommended", "plugin:compat/recommended"],
- parser: "@typescript-eslint/parser",
- plugins: [
- "svelte3",
- "import",
- "simple-import-sort",
- "@typescript-eslint",
- "@typescript-eslint/eslint-plugin",
- ],
- rules: {
- "@typescript-eslint/ban-ts-comment": "warn",
- "@typescript-eslint/no-unused-vars": [
- "warn",
- { argsIgnorePattern: "^_", varsIgnorePattern: "^_" },
- ],
- "import/newline-after-import": "warn",
- "import/no-useless-path-segments": "warn",
- "simple-import-sort/imports": "warn",
- "simple-import-sort/exports": "warn",
- "prefer-const": "warn",
- "no-nested-ternary": "warn",
- },
- overrides: [
- {
- files: "**/*.ts",
- extends: [
- "plugin:@typescript-eslint/eslint-recommended",
- "plugin:@typescript-eslint/recommended",
- ],
- rules: {
- "@typescript-eslint/no-non-null-assertion": "off",
- },
- },
- {
- files: "**/*.svelte",
- processor: "svelte3/svelte3",
- rules: {
- "no-redeclare": "off",
- "no-global-assign": "off",
- },
- },
- ],
- env: { browser: true },
- ignorePatterns: ["backend_proto.d.ts", "*.svelte.d.ts"],
- globals: {
- globalThis: false,
- NodeListOf: false,
- },
- settings: {
- "svelte3/typescript": () => require("typescript"),
- },
-};
diff --git a/ts/BUILD.bazel b/ts/BUILD.bazel
index 9fb25671afa..4cdcc86935b 100644
--- a/ts/BUILD.bazel
+++ b/ts/BUILD.bazel
@@ -9,13 +9,13 @@ prettier_test()
#################
exports_files([
- ".eslintrc.js",
"licenses.json",
"sql_format.ts",
"jest.config.js",
- "package.json",
"protobuf-no-long.js",
"page.html",
+ "tsconfig.json",
+ "format.sh",
])
# a copy needs to be placed in bazel-bin for libs with
diff --git a/ts/card-info/BUILD.bazel b/ts/card-info/BUILD.bazel
index 5f8829d95da..05f0c15faf1 100644
--- a/ts/card-info/BUILD.bazel
+++ b/ts/card-info/BUILD.bazel
@@ -1,5 +1,5 @@
-load("//ts:prettier.bzl", "prettier_test")
load("//ts:eslint.bzl", "eslint_test")
+load("//ts:prettier.bzl", "prettier_test")
load("//ts/svelte:svelte.bzl", "compile_svelte", "svelte_check")
load("//ts:esbuild.bzl", "esbuild")
load("//ts:generate_page.bzl", "generate_page")
@@ -61,7 +61,6 @@ prettier_test()
eslint_test()
svelte_check(
- name = "svelte_check",
srcs = glob([
"*.ts",
"*.svelte",
diff --git a/ts/card-info/CardInfo.svelte b/ts/card-info/CardInfo.svelte
index 694452ea23d..128dab7b54d 100644
--- a/ts/card-info/CardInfo.svelte
+++ b/ts/card-info/CardInfo.svelte
@@ -11,7 +11,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import CardStats from "./CardStats.svelte";
import Revlog from "./Revlog.svelte";
- export let includeRevlog: boolean = true;
+ export let includeRevlog = true;
let stats: Stats.CardStatsResponse | null = null;
let revlog: Stats.CardStatsResponse.StatsRevlogEntry[] | null = null;
diff --git a/ts/change-notetype/Alert.svelte b/ts/change-notetype/Alert.svelte
index 8275373e5d1..795f37970fc 100644
--- a/ts/change-notetype/Alert.svelte
+++ b/ts/change-notetype/Alert.svelte
@@ -19,8 +19,8 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
? tr.changeNotetypeWillDiscardContent()
: tr.changeNotetypeWillDiscardCards();
- const maxItems: number = 3;
- let collapsed: boolean = true;
+ const maxItems = 3;
+ let collapsed = true;
$: collapseMsg = collapsed
? tr.changeNotetypeExpand()
: tr.changeNotetypeCollapse();
diff --git a/ts/change-notetype/ChangeNotetypePage.svelte b/ts/change-notetype/ChangeNotetypePage.svelte
index b1106af9ffc..c8ea1711ffa 100644
--- a/ts/change-notetype/ChangeNotetypePage.svelte
+++ b/ts/change-notetype/ChangeNotetypePage.svelte
@@ -23,7 +23,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html