diff --git a/apps/console/eslint.config.mjs b/apps/console/eslint.config.mjs index 971d03acd..a33dd3ff0 100644 --- a/apps/console/eslint.config.mjs +++ b/apps/console/eslint.config.mjs @@ -6,6 +6,7 @@ export default defineConfig([ configs.ts, configs.imports, configs.react, + configs.relay, configs.stylistic, configs.languageOptions.browser, ]); diff --git a/apps/trust/eslint.config.mjs b/apps/trust/eslint.config.mjs index 971d03acd..a33dd3ff0 100644 --- a/apps/trust/eslint.config.mjs +++ b/apps/trust/eslint.config.mjs @@ -6,6 +6,7 @@ export default defineConfig([ configs.ts, configs.imports, configs.react, + configs.relay, configs.stylistic, configs.languageOptions.browser, ]); diff --git a/package-lock.json b/package-lock.json index 351dd92ee..bb20673c5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5605,6 +5605,10 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/eslint-plugin-relay": { + "resolved": "packages/eslint-relay-plugin", + "link": true + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -9318,6 +9322,15 @@ "semver": "bin/semver.js" } }, + "node_modules/eslint-plugin-relay": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-relay/-/eslint-plugin-relay-2.0.0.tgz", + "integrity": "sha512-H52u+YM72VhBwhKrGSSdsjbeAWbLIgmph3z4Hgfyqm8Jt5pP5g9PbFmBp8kk10D4vZldrbNwa0esHxDRoczprg==", + "license": "MIT", + "dependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" + } + }, "node_modules/eslint-scope": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", @@ -18004,14 +18017,20 @@ "eslint-plugin-import-x": "^4.16.1", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-relay": "^2.0.0", "globals": "^17.0.0", "typescript-eslint": "^8.53.1" }, "devDependencies": { + "@types/eslint-plugin-relay": "^1.0.0", "eslint": "^9.39.2", "typescript": "^5.8.3" } }, + "packages/eslint-relay-plugin": { + "name": "@types/eslint-plugin-relay", + "version": "1.0.0" + }, "packages/helpers": { "name": "@probo/helpers", "version": "1.0.0", diff --git a/packages/eslint-config/package.json b/packages/eslint-config/package.json index 0a7715be1..0adbc07ba 100644 --- a/packages/eslint-config/package.json +++ b/packages/eslint-config/package.json @@ -14,6 +14,7 @@ "#baseConfigs": "./src/baseConfigs.ts", "#tsConfigs": "./src/tsConfigs.ts", "#reactConfigs": "./src/reactConfigs.ts", + "#relayConfigs": "./src/relayConfigs.ts", "#importsConfigs": "./src/importsConfigs.ts", "#languageOptionsConfigs": "./src/languageOptionsConfigs.ts", "#stylisticConfigs": "./src/stylisticConfigs.ts" @@ -30,10 +31,12 @@ "eslint-plugin-import-x": "^4.16.1", "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^7.0.1", + "eslint-plugin-relay": "^2.0.0", "globals": "^17.0.0", "typescript-eslint": "^8.53.1" }, "devDependencies": { + "@types/eslint-plugin-relay": "^1.0.0", "eslint": "^9.39.2", "typescript": "^5.8.3" } diff --git a/packages/eslint-config/src/index.ts b/packages/eslint-config/src/index.ts index 2b18b94ad..4c3723fd2 100644 --- a/packages/eslint-config/src/index.ts +++ b/packages/eslint-config/src/index.ts @@ -2,6 +2,7 @@ import { baseConfigs } from "#baseConfigs"; import { importsConfigs } from "#importsConfigs"; import { browserLanguageOptionsConfigs, nodeLanguageOptionsConfigs } from "#languageOptionsConfigs"; import { reactConfigs } from "#reactConfigs"; +import { relayConfigs } from "#relayConfigs"; import { stylisticConfigs } from "#stylisticConfigs"; import { tsConfigs } from "#tsConfigs"; @@ -10,6 +11,7 @@ export const configs = { imports: importsConfigs, ts: tsConfigs, react: reactConfigs, + relay: relayConfigs, stylistic: stylisticConfigs, languageOptions: { browser: browserLanguageOptionsConfigs, diff --git a/packages/eslint-config/src/relayConfigs.ts b/packages/eslint-config/src/relayConfigs.ts new file mode 100644 index 000000000..0a9fbf1e2 --- /dev/null +++ b/packages/eslint-config/src/relayConfigs.ts @@ -0,0 +1,11 @@ +import relay from "eslint-plugin-relay"; +import type { FlatConfig } from "typescript-eslint"; + +export const relayConfigs: FlatConfig.ConfigArray = [ + { + plugins: { + relay: relay, + }, + ...relay.configs["ts-recommended"], + }, +]; diff --git a/packages/eslint-relay-plugin/index.d.ts b/packages/eslint-relay-plugin/index.d.ts new file mode 100644 index 000000000..3358f4376 --- /dev/null +++ b/packages/eslint-relay-plugin/index.d.ts @@ -0,0 +1,29 @@ +declare module "eslint-plugin-relay" { + import type { Linter, Rule } from "eslint"; + + export const rules: { + "graphql-syntax": Rule.RuleModule; + "graphql-naming": Rule.RuleModule; + "generated-typescript-types": Rule.RuleModule; + "no-future-added-value": Rule.RuleModule; + "unused-fields": Rule.RuleModule; + "must-colocate-fragment-spreads": Rule.RuleModule; + "function-required-argument": Rule.RuleModule; + "hook-required-argument": Rule.RuleModule; + }; + + export const configs: { + recommended: { + rules: Linter.RulesRecord; + }; + "ts-recommended": { + rules: Linter.RulesRecord; + }; + strict: { + rules: Linter.RulesRecord; + }; + "ts-strict": { + rules: Linter.RulesRecord; + }; + }; +} diff --git a/packages/eslint-relay-plugin/package.json b/packages/eslint-relay-plugin/package.json new file mode 100644 index 000000000..108ac3da4 --- /dev/null +++ b/packages/eslint-relay-plugin/package.json @@ -0,0 +1,7 @@ +{ + "name": "@types/eslint-plugin-relay", + "version": "1.0.0", + "private": true, + "description": "Shared ESLint configuration for Probo monorepo", + "types": "./index.d.ts" +}