Skip to content

Commit ef0dd63

Browse files
Make Oxlint the primary linter
1 parent 371e401 commit ef0dd63

10 files changed

Lines changed: 74 additions & 25 deletions

File tree

‎.github/workflows/tests-main.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ jobs:
5151
- name: Oxlint
5252
run: pnpm lint:oxlint
5353
if: ${{ matrix.os == 'ubuntu-latest' && matrix.node == '26.1.0' }}
54-
- name: Lint
55-
run: pnpm nx run-many --all --target=lint --output-style=stream
54+
- name: ESLint compatibility
55+
run: pnpm lint:eslint --output-style=stream
5656
if: ${{ matrix.os == 'ubuntu-latest' && matrix.node == '26.1.0' }}
5757
- name: Type-check
5858
run: pnpm nx run-many --all --target=type-check --output-style=stream

‎.github/workflows/tests-pr.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ jobs:
5555
run: pnpm prettier
5656
- name: Oxlint
5757
run: pnpm lint:oxlint
58-
- name: Lint
59-
run: pnpm nx run-many --all --target=lint --output-style=stream
58+
- name: ESLint compatibility
59+
run: pnpm lint:eslint --output-style=stream
6060

6161
bundle:
6262
name: 'Bundle'

‎docs/cli/get-started.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@ Besides the scripts for building and running the CLIs, there are others that mig
7070
- `pnpm test`: Runs the tests of all the packages.
7171
- `pnpm prettier`: Checks formatting for all linted source files.
7272
- `pnpm prettier:fix`: Formats all linted source files.
73-
- `pnpm lint`: Runs Prettier, Oxlint, and ESLint checks for all the packages.
74-
- `pnpm lint:fix`: Runs Prettier and ESLint for all the packages and fixes the fixable issues.
73+
- `pnpm lint`: Runs Prettier, Oxlint, and ESLint compatibility checks for all the packages.
74+
- `pnpm lint:fix`: Runs Prettier, Oxlint, and ESLint compatibility checks and fixes supported issues.
7575
- `pnpm type-check`: Type-checks all the packagesusing the Typescript `tsc` tool.
7676
- `pnpm clean`: Removes the `dist` directory from all the packages.
7777

‎eslint.codegen.config.js‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import {eslintBaseConfig} from './eslint.config.js'
2+
3+
// Generated GraphQL output relies on the full ESLint autofix behavior to remain deterministic.
4+
export default eslintBaseConfig

‎eslint.config.js‎

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,38 @@
11
import nxPlugin from '@nx/eslint-plugin'
22
import cliPlugin from '@shopify/eslint-plugin-cli'
33
import jsdocPlugin from 'eslint-plugin-jsdoc'
4+
import {readFileSync} from 'node:fs'
5+
6+
const oxlintConfig = JSON.parse(readFileSync(new URL('./oxlint.json', import.meta.url), 'utf8'))
7+
8+
const eslintPluginNames = {
9+
import: 'import-x',
10+
node: 'n',
11+
typescript: '@typescript-eslint',
12+
}
13+
14+
const eslintRuleName = (oxlintRuleName) => {
15+
const [pluginName, ...ruleNameParts] = oxlintRuleName.split('/')
16+
const eslintPluginName = eslintPluginNames[pluginName]
17+
return eslintPluginName ? `${eslintPluginName}/${ruleNameParts.join('/')}` : oxlintRuleName
18+
}
19+
20+
const isEnabled = (ruleConfiguration) => {
21+
const severity = Array.isArray(ruleConfiguration) ? ruleConfiguration[0] : ruleConfiguration
22+
return severity !== 'off' && severity !== 0
23+
}
24+
25+
const eslintCompatibilityConfig = ({files, rules}) => ({
26+
...(files ? {files} : {}),
27+
rules: Object.fromEntries(
28+
Object.entries(rules)
29+
.filter(([, ruleConfiguration]) => isEnabled(ruleConfiguration))
30+
.map(([ruleName]) => [eslintRuleName(ruleName), 'off']),
31+
),
32+
})
433

534
// Spread the CLI plugin's base config which includes all necessary plugins
6-
const config = [
35+
export const eslintBaseConfig = [
736
// Base config from @shopify/eslint-plugin-cli (includes shopify, typescript, prettier, etc.)
837
...cliPlugin.configs.config,
938

@@ -243,4 +272,17 @@ const config = [
243272
},
244273
]
245274

275+
const config = [
276+
...eslintBaseConfig,
277+
// ESLint remains as a compatibility layer for rules that Oxlint does not support yet.
278+
// A directive can target an Oxlint-owned rule, so ESLint alone cannot determine whether it is unused.
279+
{
280+
linterOptions: {
281+
reportUnusedDisableDirectives: 'off',
282+
},
283+
},
284+
eslintCompatibilityConfig(oxlintConfig),
285+
...oxlintConfig.overrides.map((override) => eslintCompatibilityConfig(override)),
286+
]
287+
246288
export default config

‎package.json‎

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,12 @@
1717
"graphql-codegen:get-graphql-schemas": "bin/get-graphql-schemas.js",
1818
"graphql-codegen": "nx run-many --target=graphql-codegen --all",
1919
"knip": "knip",
20-
"lint:affected": "pnpm prettier && pnpm lint:oxlint && nx affected --target=lint",
21-
"lint:fix:affected": "pnpm prettier:fix && nx affected --target=lint:fix",
22-
"lint:fix": "pnpm prettier:fix && nx run-many --target=lint:fix --all --skip-nx-cache",
23-
"lint": "pnpm prettier && pnpm lint:oxlint && nx run-many --target=lint --all",
20+
"lint:affected": "pnpm prettier && pnpm lint:oxlint && pnpm lint:eslint:affected",
21+
"lint:eslint:affected": "nx affected --target=lint",
22+
"lint:fix:affected": "pnpm prettier:fix && pnpm lint:oxlint --fix && nx affected --target=lint:fix",
23+
"lint:fix": "pnpm prettier:fix && pnpm lint:oxlint --fix && nx run-many --target=lint:fix --all --skip-nx-cache",
24+
"lint": "pnpm prettier && pnpm lint:oxlint && pnpm lint:eslint",
25+
"lint:eslint": "nx run-many --target=lint --all",
2426
"lint:oxlint": "oxlint --config oxlint.json --deny-warnings packages/app/src packages/cli-kit/src packages/cli/src packages/create-app/src packages/organizations/src packages/plugin-cloudflare/src packages/plugin-did-you-mean/src packages/store/src packages/theme/src packages/ui-extensions-server-kit/src packages/ui-extensions-test-utils/src packages/cli/bin packages/e2e",
2527
"prettier": "prettier --check \"packages/{app,cli-kit,cli,create-app,organizations,plugin-cloudflare,plugin-did-you-mean,store,theme,ui-extensions-server-kit,ui-extensions-test-utils}/src/**/*.{js,ts,tsx}\" \"packages/cli/bin/*.js\" \"packages/e2e/{setup,helpers,tests}/**/*.ts\" \"packages/e2e/*.ts\"",
2628
"prettier:fix": "prettier --write \"packages/{app,cli-kit,cli,create-app,organizations,plugin-cloudflare,plugin-did-you-mean,store,theme,ui-extensions-server-kit,ui-extensions-test-utils}/src/**/*.{js,ts,tsx}\" \"packages/cli/bin/*.js\" \"packages/e2e/{setup,helpers,tests}/**/*.ts\" \"packages/e2e/*.ts\"",
@@ -191,7 +193,8 @@
191193
".": {
192194
"entry": [
193195
"bin/**/*.js",
194-
"configurations/vite.config.ts"
196+
"configurations/vite.config.ts",
197+
"eslint.codegen.config.js"
195198
],
196199
"ignoreBinaries": [
197200
"bin/*",

‎packages/app/project.json‎

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,13 @@
7474
],
7575
"options": {
7676
"commands": [
77-
"pnpm eslint 'src/cli/api/graphql/business-platform-destinations/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/business-platform-destinations/generated/**/*.{ts,tsx}'",
78-
"pnpm eslint 'src/cli/api/graphql/business-platform-organizations/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/business-platform-organizations/generated/**/*.{ts,tsx}'",
79-
"pnpm eslint 'src/cli/api/graphql/app-dev/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/app-dev/generated/**/*.{ts,tsx}'",
80-
"pnpm eslint 'src/cli/api/graphql/app-management/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/app-management/generated/**/*.{ts,tsx}'",
81-
"pnpm eslint 'src/cli/api/graphql/webhooks/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/webhooks/generated/**/*.{ts,tsx}'",
82-
"pnpm eslint 'src/cli/api/graphql/functions/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/functions/generated/**/*.{ts,tsx}'",
83-
"pnpm eslint 'src/cli/api/graphql/admin/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/admin/generated/**/*.{ts,tsx}'"
77+
"pnpm eslint --config ../../eslint.codegen.config.js 'src/cli/api/graphql/business-platform-destinations/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/business-platform-destinations/generated/**/*.{ts,tsx}'",
78+
"pnpm eslint --config ../../eslint.codegen.config.js 'src/cli/api/graphql/business-platform-organizations/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/business-platform-organizations/generated/**/*.{ts,tsx}'",
79+
"pnpm eslint --config ../../eslint.codegen.config.js 'src/cli/api/graphql/app-dev/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/app-dev/generated/**/*.{ts,tsx}'",
80+
"pnpm eslint --config ../../eslint.codegen.config.js 'src/cli/api/graphql/app-management/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/app-management/generated/**/*.{ts,tsx}'",
81+
"pnpm eslint --config ../../eslint.codegen.config.js 'src/cli/api/graphql/webhooks/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/webhooks/generated/**/*.{ts,tsx}'",
82+
"pnpm eslint --config ../../eslint.codegen.config.js 'src/cli/api/graphql/functions/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/functions/generated/**/*.{ts,tsx}'",
83+
"pnpm eslint --config ../../eslint.codegen.config.js 'src/cli/api/graphql/admin/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/admin/generated/**/*.{ts,tsx}'"
8484
],
8585
"cwd": "packages/app"
8686
}

‎packages/cli-kit/project.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,8 @@
109109
],
110110
"options": {
111111
"commands": [
112-
"pnpm eslint 'src/cli/api/graphql/admin/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/admin/generated/**/*.{ts,tsx}'",
113-
"pnpm eslint 'src/cli/api/graphql/bulk-operations/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/bulk-operations/generated/**/*.{ts,tsx}'"
112+
"pnpm eslint --config ../../eslint.codegen.config.js 'src/cli/api/graphql/admin/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/admin/generated/**/*.{ts,tsx}'",
113+
"pnpm eslint --config ../../eslint.codegen.config.js 'src/cli/api/graphql/bulk-operations/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/bulk-operations/generated/**/*.{ts,tsx}'"
114114
],
115115
"cwd": "packages/cli-kit"
116116
}

‎packages/organizations/project.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@
5353
],
5454
"options": {
5555
"commands": [
56-
"pnpm eslint 'src/cli/api/graphql/business-platform-destinations/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/business-platform-destinations/generated/**/*.{ts,tsx}'",
57-
"pnpm eslint 'src/cli/api/graphql/business-platform-organizations/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/business-platform-organizations/generated/**/*.{ts,tsx}'"
56+
"pnpm eslint --config ../../eslint.codegen.config.js 'src/cli/api/graphql/business-platform-destinations/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/business-platform-destinations/generated/**/*.{ts,tsx}'",
57+
"pnpm eslint --config ../../eslint.codegen.config.js 'src/cli/api/graphql/business-platform-organizations/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/business-platform-organizations/generated/**/*.{ts,tsx}'"
5858
],
5959
"cwd": "packages/organizations"
6060
}

‎packages/store/project.json‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,8 @@
5454
],
5555
"options": {
5656
"commands": [
57-
"pnpm eslint 'src/cli/api/graphql/business-platform-destinations/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/business-platform-destinations/generated/**/*.{ts,tsx}'",
58-
"pnpm eslint 'src/cli/api/graphql/business-platform-organizations/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/business-platform-organizations/generated/**/*.{ts,tsx}'"
57+
"pnpm eslint --config ../../eslint.codegen.config.js 'src/cli/api/graphql/business-platform-destinations/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/business-platform-destinations/generated/**/*.{ts,tsx}'",
58+
"pnpm eslint --config ../../eslint.codegen.config.js 'src/cli/api/graphql/business-platform-organizations/generated/**/*.{ts,tsx}' --fix && pnpm exec prettier --write --ignore-path ../../.prettierignore 'src/cli/api/graphql/business-platform-organizations/generated/**/*.{ts,tsx}'"
5959
],
6060
"cwd": "packages/store"
6161
}

0 commit comments

Comments
 (0)