From baab16f91bc2f5e4209b844686758084794d66e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josh=20Goldberg=20=E2=9C=A8?= Date: Thu, 15 Jun 2023 13:27:47 -0400 Subject: [PATCH] feat(remix-eslint-config): extend from typescript-eslint/recommended (#6248) Co-authored-by: Matt Brophy --- packages/remix-dev/__tests__/cli-test.ts | 2 +- packages/remix-dev/server-build.ts | 1 - packages/remix-eslint-config/index.js | 9 ++- packages/remix-eslint-config/rules/import.js | 1 + .../remix-eslint-config/rules/typescript.js | 59 +++++++++---------- .../remix-netlify/__tests__/server-test.ts | 4 -- packages/remix-node/__tests__/fetch-test.ts | 1 - packages/remix-server-runtime/responses.ts | 7 +-- 8 files changed, 37 insertions(+), 47 deletions(-) diff --git a/packages/remix-dev/__tests__/cli-test.ts b/packages/remix-dev/__tests__/cli-test.ts index 91d8fea10b5..458cf17ec60 100644 --- a/packages/remix-dev/__tests__/cli-test.ts +++ b/packages/remix-dev/__tests__/cli-test.ts @@ -289,7 +289,7 @@ function defer() { async function interactWithShell( proc: childProcess.ChildProcessWithoutNullStreams, qAndA: Array< - | { question: RegExp; type: Array; answer?: never } + | { question: RegExp; type: Array; answer?: never } | { question: RegExp; answer: RegExp; type?: never } > ) { diff --git a/packages/remix-dev/server-build.ts b/packages/remix-dev/server-build.ts index d9144b95fe1..2098896e6f5 100644 --- a/packages/remix-dev/server-build.ts +++ b/packages/remix-dev/server-build.ts @@ -1,4 +1,3 @@ -/* eslint-disable no-unreachable */ import type { ServerBuild } from "@remix-run/server-runtime"; throw new Error( diff --git a/packages/remix-eslint-config/index.js b/packages/remix-eslint-config/index.js index 660bb16fa95..2b5ec34853d 100644 --- a/packages/remix-eslint-config/index.js +++ b/packages/remix-eslint-config/index.js @@ -62,15 +62,14 @@ const config = { overrides: [ { files: ["**/*.ts?(x)"], - extends: ["plugin:import/typescript"], + extends: [ + "plugin:import/typescript", + "plugin:@typescript-eslint/recommended", + ], parser: "@typescript-eslint/parser", parserOptions: { sourceType: "module", ecmaVersion: 2019, - ecmaFeatures: { - jsx: true, - }, - warnOnUnsupportedTypeScriptVersion: true, }, plugins: ["@typescript-eslint"], rules: { diff --git a/packages/remix-eslint-config/rules/import.js b/packages/remix-eslint-config/rules/import.js index b98e759d545..1b7d20e4d39 100644 --- a/packages/remix-eslint-config/rules/import.js +++ b/packages/remix-eslint-config/rules/import.js @@ -5,5 +5,6 @@ const ERROR = 2; module.exports = { "import/first": ERROR, "import/no-amd": ERROR, + "import/no-duplicates": ERROR, "import/no-webpack-loader-syntax": ERROR, }; diff --git a/packages/remix-eslint-config/rules/typescript.js b/packages/remix-eslint-config/rules/typescript.js index f81d2f1280d..3ce6a83f9f0 100644 --- a/packages/remix-eslint-config/rules/typescript.js +++ b/packages/remix-eslint-config/rules/typescript.js @@ -1,30 +1,20 @@ -const OFF = 0; -const WARN = 1; -const ERROR = 2; - module.exports = { - "no-dupe-class-members": OFF, - "no-undef": OFF, - - // Add TypeScript specific rules (and turn off ESLint equivalents) - "@typescript-eslint/consistent-type-assertions": WARN, - "@typescript-eslint/consistent-type-imports": WARN, - - "no-array-constructor": OFF, - "@typescript-eslint/no-array-constructor": WARN, - - // There is a bug w/ @typescript-eslint/no-duplicate-imports triggered - // by multiple imports inside of module declarations. We should reenable - // this rule when the bug is fixed. - // https://github.com/typescript-eslint/typescript-eslint/issues/3071 - "no-duplicate-imports": OFF, - // "@typescript-eslint/no-duplicate-imports": WARN, + // TODO: These rules might be nice to enable... we should investigate eventually! + "@typescript-eslint/ban-ts-comment": "off", + "@typescript-eslint/ban-types": "off", + "@typescript-eslint/no-empty-function": "off", + "@typescript-eslint/no-empty-interface": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-inferrable-types": "off", + "@typescript-eslint/no-namespace": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-var-requires": "off", + "no-var": "off", + "prefer-rest-params": "off", - "no-redeclare": OFF, - "@typescript-eslint/no-redeclare": ERROR, - "no-use-before-define": OFF, + // These rules are nice and we want to configure over the defaults "@typescript-eslint/no-use-before-define": [ - WARN, + "error", { functions: false, classes: false, @@ -32,23 +22,32 @@ module.exports = { typedefs: false, }, ], - "no-unused-expressions": OFF, "@typescript-eslint/no-unused-expressions": [ - WARN, + "error", { allowShortCircuit: true, allowTernary: true, allowTaggedTemplates: true, }, ], - "no-unused-vars": OFF, "@typescript-eslint/no-unused-vars": [ - WARN, + "error", { args: "none", ignoreRestSiblings: true, }, ], - "no-useless-constructor": OFF, - "@typescript-eslint/no-useless-constructor": WARN, + + // These rules are turned on in the core rules but aren't needed for TypeScript code + "no-dupe-class-members": "off", + "no-undef": "off", + + // These stylistic rules don't match our preferences + "no-use-before-define": "off", + "prefer-const": "off", + + // These rules should eventually come from @typescript-eslint/stylistic + // in typescript-eslint@6 + "@typescript-eslint/consistent-type-assertions": "warn", + "@typescript-eslint/consistent-type-imports": "warn", }; diff --git a/packages/remix-netlify/__tests__/server-test.ts b/packages/remix-netlify/__tests__/server-test.ts index 80fc451de8b..0b643a81410 100644 --- a/packages/remix-netlify/__tests__/server-test.ts +++ b/packages/remix-netlify/__tests__/server-test.ts @@ -2,10 +2,6 @@ import fsp from "fs/promises"; import path from "path"; import lambdaTester from "lambda-tester"; import { - // This has been added as a global in node 15+, but we expose it here while we - // support Node 14 - // eslint-disable-next-line @typescript-eslint/no-unused-vars - AbortController, createRequestHandler as createRemixRequestHandler, Response as NodeResponse, } from "@remix-run/node"; diff --git a/packages/remix-node/__tests__/fetch-test.ts b/packages/remix-node/__tests__/fetch-test.ts index 4fd79135ee5..6f7c8480662 100644 --- a/packages/remix-node/__tests__/fetch-test.ts +++ b/packages/remix-node/__tests__/fetch-test.ts @@ -1,4 +1,3 @@ -import { PassThrough } from "stream"; import { ReadableStream } from "@remix-run/web-stream"; import { Request } from "../fetch"; diff --git a/packages/remix-server-runtime/responses.ts b/packages/remix-server-runtime/responses.ts index baf9128bf49..e26a706ccf7 100644 --- a/packages/remix-server-runtime/responses.ts +++ b/packages/remix-server-runtime/responses.ts @@ -24,17 +24,14 @@ export type DeferFunction = >( init?: number | ResponseInit ) => TypedDeferredData; -export type JsonFunction = ( +export type JsonFunction = ( data: Data, init?: number | ResponseInit ) => TypedResponse; // must be a type since this is a subtype of response // interfaces must conform to the types they extend -export type TypedResponse = Omit< - Response, - "json" -> & { +export type TypedResponse = Omit & { json(): Promise; };