Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: update eslint to fix linting issues #29988

Merged
merged 10 commits into from Mar 4, 2021
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 3 additions & 3 deletions .babelrc.js
Expand Up @@ -2,9 +2,9 @@ let ignore = [`**/dist`]

// Jest needs to compile this code, but generally we don't want this copied
// to output folders
if (process.env.NODE_ENV !== `test`) {
ignore.push(`**/__tests__`)
}
// if (process.env.NODE_ENV !== `test`) {
// ignore.push(`**/__tests__`)
// }
Comment on lines +5 to +7
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This breaks linting as babel will return an empty ast. Packages should be build with babel src --out-dir . --ignore \"**/__tests__\"


module.exports = {
sourceMaps: true,
Expand Down
211 changes: 115 additions & 96 deletions .eslintrc.js
@@ -1,23 +1,22 @@
const TSEslint = require("@typescript-eslint/eslint-plugin")

module.exports = {
parser: "babel-eslint",
parser: `@babel/eslint-parser`,
extends: [
"google",
"eslint:recommended",
"plugin:flowtype/recommended",
"plugin:react/recommended",
"prettier",
"prettier/flowtype",
"prettier/react",
Comment on lines -11 to -12
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these are now inside prettier

`google`,
`eslint:recommended`,
`plugin:flowtype/recommended`,
`plugin:react/recommended`,
`prettier`,
],
plugins: ["flowtype", "prettier", "react", "filenames"],
plugins: [`flowtype`, `prettier`, `react`, `filenames`, `@babel`],
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added @babel to augment the this rules

parserOptions: {
ecmaVersion: 2016,
sourceType: "module",
sourceType: `module`,
ecmaFeatures: {
jsx: true,
},
babelOptions: {
configFile: `./.babelrc.js`,
},
},
env: {
browser: true,
Expand All @@ -39,43 +38,63 @@ module.exports = {
__ASSET_PREFIX__: true,
},
rules: {
"arrow-body-style": [
"error",
"as-needed",
{ requireReturnForObjectLiteral: true },
],
"no-unused-expressions": [
"error",
"@babel/no-unused-expressions": [
`error`,
{
allowTaggedTemplates: true,
},
],
"no-unused-expressions": `off`,
"@babel/no-invalid-this": `error`,
"no-invalid-this": `off`,
"arrow-body-style": [
`error`,
`as-needed`,
{ requireReturnForObjectLiteral: true },
],
"new-cap": `off`,
"no-unused-vars": [
"warn",
`warn`,
{
varsIgnorePattern: "^_",
argsIgnorePattern: "^_",
varsIgnorePattern: `^_`,
argsIgnorePattern: `^_`,
ignoreRestSiblings: true,
},
],
"consistent-return": ["error"],
"filenames/match-regex": ["error", "^[a-z-\\d\\.]+$", true],
"no-console": "off",
"no-inner-declarations": "off",
"prettier/prettier": "error",
quotes: ["error", "backtick"],
"react/display-name": "off",
"react/jsx-key": "warn",
"react/no-unescaped-entities": "off",
"react/prop-types": "off",
"require-jsdoc": "off",
"valid-jsdoc": "off",
"consistent-return": [`error`],
"filenames/match-regex": [`error`, `^[a-z-\\d\\.]+$`, true],
"no-console": `off`,
"no-inner-declarations": `off`,
"prettier/prettier": `error`,
quotes: [`error`, `backtick`],
"react/display-name": `off`,
"react/jsx-key": `warn`,
"react/no-unescaped-entities": `off`,
"react/prop-types": `off`,
"require-jsdoc": `off`,
"valid-jsdoc": `off`,
"prefer-promise-reject-errors": `warn`,
"no-prototype-builtins": `warn`,
"guard-for-in": `warn`,
Comment on lines +76 to +78
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These are new rules and moved them to warnings because there were too many.

"spaced-comment": [
`error`,
`always`,
{ markers: [`/`], exceptions: [`*`, `+`] },
],
camelcase: [
`error`,
{
properties: `never`,
ignoreDestructuring: true,
allow: [`^unstable_`],
},
],
Comment on lines +84 to +91
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have no idea why this wasn't necessary before 🤷

},
overrides: [
{
files: [
"packages/**/gatsby-browser.js",
"packages/gatsby/cache-dir/**/*",
`packages/**/gatsby-browser.js`,
`packages/gatsby/cache-dir/**/*`,
],
env: {
browser: true,
Expand All @@ -86,115 +105,115 @@ module.exports = {
},
},
{
files: ["**/cypress/integration/**/*", "**/cypress/support/**/*"],
files: [`**/cypress/integration/**/*`, `**/cypress/support/**/*`],
globals: {
cy: false,
Cypress: false,
},
},
{
files: ["*.ts", "*.tsx"],
parser: "@typescript-eslint/parser",
plugins: ["@typescript-eslint/eslint-plugin"],
files: [`*.ts`, `*.tsx`],
parser: `@typescript-eslint/parser`,
plugins: [`@typescript-eslint/eslint-plugin`],
extends: [`plugin:@typescript-eslint/recommended`],
rules: {
...TSEslint.configs.recommended.rules,
// We should absolutely avoid using ts-ignore, but it's not always possible.
// particular when a dependencies types are incorrect.
"@typescript-eslint/ban-ts-comment": [
"warn",
{ "ts-ignore": "allow-with-description" }
`warn`,
{ "ts-ignore": `allow-with-description` },
],
// This rule is great. It helps us not throw on types for areas that are
// easily inferrable. However we have a desire to have all function inputs
// and outputs declaratively typed. So this let's us ignore the parameters
// inferrable lint.
"@typescript-eslint/no-inferrable-types": [
"error",
`error`,
{ ignoreParameters: true },
],
"@typescript-eslint/ban-types": [
"error",
`error`,
{
extendDefaults: true,
types: {
"{}": {
fixWith: "Record<string, unknown>",
fixWith: `Record<string, unknown>`,
},
object: {
fixWith: "Record<string, unknown>",
fixWith: `Record<string, unknown>`,
},
},
},
],
"camelcase": "off",
camelcase: `off`,
// TODO: These rules allow a lot of stuff and don't really enforce. If we want to apply our styleguide, we'd need to fix a lot of stuff
"@typescript-eslint/naming-convention": [
"error",
`error`,
{
selector: "default",
format: ["camelCase"],
selector: `default`,
format: [`camelCase`],
},
{
selector: "variable",
format: ["camelCase", "UPPER_CASE", "PascalCase"],
leadingUnderscore: "allowSingleOrDouble",
trailingUnderscore: "allowSingleOrDouble",
selector: `variable`,
format: [`camelCase`, `UPPER_CASE`, `PascalCase`],
leadingUnderscore: `allowSingleOrDouble`,
trailingUnderscore: `allowSingleOrDouble`,
},
{
selector: "function",
format: ["camelCase", "PascalCase"],
leadingUnderscore: "allow",
selector: `function`,
format: [`camelCase`, `PascalCase`],
leadingUnderscore: `allow`,
},
{
selector: "parameter",
format: ["camelCase", "PascalCase", "snake_case"],
leadingUnderscore: "allowSingleOrDouble",
selector: `parameter`,
format: [`camelCase`, `PascalCase`, `snake_case`],
leadingUnderscore: `allowSingleOrDouble`,
},
{
selector: "enumMember",
format: ["camelCase", "UPPER_CASE", "PascalCase"]
selector: `enumMember`,
format: [`camelCase`, `UPPER_CASE`, `PascalCase`],
},
{
selector: "typeLike",
format: ["PascalCase"],
selector: `typeLike`,
format: [`PascalCase`],
},
{
selector: "typeAlias",
format: ["camelCase", "PascalCase"]
selector: `typeAlias`,
format: [`camelCase`, `PascalCase`],
},
{
selector: "property",
format: ["PascalCase", "UPPER_CASE", "camelCase", "snake_case"],
leadingUnderscore: "allowSingleOrDouble",
selector: `property`,
format: [`PascalCase`, `UPPER_CASE`, `camelCase`, `snake_case`],
leadingUnderscore: `allowSingleOrDouble`,
},
{
selector: "objectLiteralProperty",
format: ["PascalCase", "UPPER_CASE", "camelCase", "snake_case"],
leadingUnderscore: "allowSingleOrDouble",
trailingUnderscore: "allowSingleOrDouble",
selector: `objectLiteralProperty`,
format: [`PascalCase`, `UPPER_CASE`, `camelCase`, `snake_case`],
leadingUnderscore: `allowSingleOrDouble`,
trailingUnderscore: `allowSingleOrDouble`,
},
{
selector: "enum",
format: ["PascalCase", "UPPER_CASE"]
selector: `enum`,
format: [`PascalCase`, `UPPER_CASE`],
},
{
selector: "method",
format: ["PascalCase", "camelCase"],
leadingUnderscore: "allowSingleOrDouble",
selector: `method`,
format: [`PascalCase`, `camelCase`],
leadingUnderscore: `allowSingleOrDouble`,
},
{
selector: "interface",
format: ["PascalCase"],
prefix: ["I"],
selector: `interface`,
format: [`PascalCase`],
prefix: [`I`],
},
],
// This rule tries to prevent using `require()`. However in node code,
// there are times where this makes sense. And it specifically is causing
// problems in our tests where we often want this functionality for module
// mocking. At this point it's easier to have it off and just encourage
// using top-level imports via code reviews.
"@typescript-eslint/no-var-requires": "off",
"@typescript-eslint/no-extra-semi": "off",
"@typescript-eslint/no-var-requires": `off`,
"@typescript-eslint/no-extra-semi": `off`,
// This rule ensures that typescript types do not have semicolons
// at the end of their lines, since our prettier setup is to have no semicolons
// e.g.,
Expand All @@ -203,50 +222,50 @@ module.exports = {
// + baz: string
// }
"@typescript-eslint/member-delimiter-style": [
"error",
`error`,
{
multiline: {
delimiter: "none",
delimiter: `none`,
},
},
],
"@typescript-eslint/no-empty-function": "off",
"@typescript-eslint/no-empty-function": `off`,
// This ensures that we always type the return type of functions
// a high level focus of our TS setup is typing fn inputs and outputs.
"@typescript-eslint/explicit-function-return-type": "error",
"@typescript-eslint/explicit-function-return-type": `error`,
// This forces us to use interfaces over types aliases for object definitions.
// Type is still useful for opaque types
// e.g.,
// type UUID = string
"@typescript-eslint/consistent-type-definitions": [
"error",
"interface",
`error`,
`interface`,
],
"@typescript-eslint/no-use-before-define": [
"error",
`error`,
{ functions: false },
],
// Allows us to write unions like `type Foo = "baz" | "bar"`
// otherwise eslint will want to switch the strings to backticks,
// which then crashes the ts compiler
quotes: "off",
quotes: `off`,
"@typescript-eslint/quotes": [
2,
"backtick",
`backtick`,
{
avoidEscape: true,
},
],
// bump to @typescript-eslint/parser started showing Flow related errors in ts(x) files
// so disabling them in .ts(x) files
"flowtype/no-types-missing-file-annotation": "off",
"@typescript-eslint/array-type": ["error", { default: "generic" }],
"flowtype/no-types-missing-file-annotation": `off`,
"@typescript-eslint/array-type": [`error`, { default: `generic` }],
},
},
],
settings: {
react: {
version: "16.9.0",
version: `16.9.0`,
},
},
}
Expand Up @@ -41,7 +41,7 @@ exports.onRenderBody = (
matchedPages.forEach(p => {
if (p && p.componentChunkName) {
const fetchKey = `assetsByChunkName[${p.componentChunkName}]`
let chunks = _.get(stats, fetchKey)
const chunks = _.get(stats, fetchKey)
componentUrls = [...componentUrls, ...chunks]
}
})
Expand Down
@@ -1,7 +1,6 @@
import React, { Component } from "react"

class ClassComponent extends Component {
// eslint-disable-next-line no-undef
state = {
custom: true,
}
Expand Down