Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/tests-main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,8 @@ jobs:
- name: Oxlint
run: pnpm lint:oxlint
if: ${{ matrix.os == 'ubuntu-latest' && matrix.node == '26.1.0' }}
- name: Lint
run: pnpm nx run-many --all --skip-nx-cache --target=lint --output-style=stream
- name: ESLint compatibility
run: pnpm lint:eslint --output-style=stream
if: ${{ matrix.os == 'ubuntu-latest' && matrix.node == '26.1.0' }}
- name: Type-check
run: pnpm nx run-many --all --skip-nx-cache --target=type-check --output-style=stream
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/tests-pr.yml
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,8 @@ jobs:
run: pnpm prettier
- name: Oxlint
run: pnpm lint:oxlint
- name: Lint
run: pnpm nx run-many --all --skip-nx-cache --target=lint --output-style=stream
- name: ESLint compatibility
run: pnpm lint:eslint --output-style=stream

bundle:
name: 'Bundle'
Expand Down
4 changes: 2 additions & 2 deletions docs/cli/get-started.md
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,8 @@ Besides the scripts for building and running the CLIs, there are others that mig
- `pnpm test`: Runs the tests of all the packages.
- `pnpm prettier`: Checks formatting for all linted source files.
- `pnpm prettier:fix`: Formats all linted source files.
- `pnpm lint`: Runs Prettier, Oxlint, and ESLint checks for all the packages.
- `pnpm lint:fix`: Runs Prettier and ESLint for all the packages and fixes the fixable issues.
- `pnpm lint`: Runs Prettier, Oxlint, and ESLint compatibility checks for all the packages.
- `pnpm lint:fix`: Runs Prettier, Oxlint, and ESLint compatibility checks and fixes supported issues.
- `pnpm type-check`: Type-checks all the packagesusing the Typescript `tsc` tool.
- `pnpm clean`: Removes the `dist` directory from all the packages.

Expand Down
4 changes: 4 additions & 0 deletions eslint.codegen.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import {eslintBaseConfig} from './eslint.config.js'

// Generated GraphQL output relies on the full ESLint autofix behavior to remain deterministic.
export default eslintBaseConfig
44 changes: 43 additions & 1 deletion eslint.config.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,38 @@
import nxPlugin from '@nx/eslint-plugin'
import cliPlugin from '@shopify/eslint-plugin-cli'
import jsdocPlugin from 'eslint-plugin-jsdoc'
import {readFileSync} from 'node:fs'

const oxlintConfig = JSON.parse(readFileSync(new URL('./oxlint.json', import.meta.url), 'utf8'))

const eslintPluginNames = {
import: 'import-x',
node: 'n',
typescript: '@typescript-eslint',
}

const eslintRuleName = (oxlintRuleName) => {
const [pluginName, ...ruleNameParts] = oxlintRuleName.split('/')
const eslintPluginName = eslintPluginNames[pluginName]
return eslintPluginName ? `${eslintPluginName}/${ruleNameParts.join('/')}` : oxlintRuleName
}

const isEnabled = (ruleConfiguration) => {
const severity = Array.isArray(ruleConfiguration) ? ruleConfiguration[0] : ruleConfiguration
return severity !== 'off' && severity !== 0
}

const eslintCompatibilityConfig = ({files, rules}) => ({
...(files ? {files} : {}),
rules: Object.fromEntries(
Object.entries(rules)
.filter(([, ruleConfiguration]) => isEnabled(ruleConfiguration))
.map(([ruleName]) => [eslintRuleName(ruleName), 'off']),
),
})

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

Expand Down Expand Up @@ -223,4 +252,17 @@ const config = [
},
]

const config = [
...eslintBaseConfig,
// ESLint remains as a compatibility layer for rules that Oxlint does not support yet.
// A directive can target an Oxlint-owned rule, so ESLint alone cannot determine whether it is unused.
{
linterOptions: {
reportUnusedDisableDirectives: 'off',
},
},
eslintCompatibilityConfig(oxlintConfig),
...oxlintConfig.overrides.map((override) => eslintCompatibilityConfig(override)),
]

export default config
11 changes: 7 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,12 @@
"graphql-codegen:get-graphql-schemas": "bin/get-graphql-schemas.js",
"graphql-codegen": "nx run-many --target=graphql-codegen --all",
"knip": "knip",
"lint:affected": "pnpm prettier && pnpm lint:oxlint && nx affected --target=lint",
"lint:fix:affected": "pnpm prettier:fix && nx affected --target=lint:fix",
"lint:fix": "pnpm prettier:fix && nx run-many --target=lint:fix --all --skip-nx-cache",
"lint": "pnpm prettier && pnpm lint:oxlint && nx run-many --target=lint --all --skip-nx-cache",
"lint:affected": "pnpm prettier && pnpm lint:oxlint && pnpm lint:eslint:affected",
"lint:eslint:affected": "nx affected --target=lint",
"lint:fix:affected": "pnpm prettier:fix && pnpm lint:oxlint --fix && nx affected --target=lint:fix",
"lint:fix": "pnpm prettier:fix && pnpm lint:oxlint --fix && nx run-many --target=lint:fix --all --skip-nx-cache",
"lint": "pnpm prettier && pnpm lint:oxlint && pnpm lint:eslint",
"lint:eslint": "nx run-many --target=lint --all --skip-nx-cache",
"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",
"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\"",
"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\"",
Expand Down Expand Up @@ -193,6 +195,7 @@
"bin/**/*.js",
"configurations/vite.config.ts",
"docs-shopify.dev/**/*.ts",
"eslint.codegen.config.js",
"vite.config.ts",
"docs/api/cli-kit/**/*.js",
"graphql.config.ts"
Expand Down
14 changes: 7 additions & 7 deletions packages/app/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,13 @@
],
"options": {
"commands": [
"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}'",
"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}'",
"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}'",
"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}'",
"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}'",
"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}'",
"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}'"
"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}'",
"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}'",
"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}'",
"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}'",
"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}'",
"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}'",
"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}'"
],
"cwd": "packages/app"
}
Expand Down
4 changes: 2 additions & 2 deletions packages/cli-kit/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -112,8 +112,8 @@
],
"options": {
"commands": [
"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}'",
"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}'"
"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}'",
"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}'"
],
"cwd": "packages/cli-kit"
}
Expand Down
2 changes: 1 addition & 1 deletion packages/organizations/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
"dependsOn": ["graphql-codegen:postfix"],
"outputs": ["{projectRoot}/src/cli/api/graphql/business-platform-destinations/generated/**/*.ts"],
"options": {
"commands": ["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}'"],
"commands": ["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}'"],
"cwd": "packages/organizations"
}
},
Expand Down
4 changes: 2 additions & 2 deletions packages/store/project.json
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,8 @@
],
"options": {
"commands": [
"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}'",
"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}'"
"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}'",
"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}'"
],
"cwd": "packages/store"
}
Expand Down
Loading