Skip to content

Remove the ESLint compatibility layer - #8211

Draft
gonzaloriestra wants to merge 1 commit into
gonzalo/oxlint-05-parityfrom
gonzalo/oxlint-06-remove-eslint
Draft

Remove the ESLint compatibility layer#8211
gonzaloriestra wants to merge 1 commit into
gonzalo/oxlint-05-parityfrom
gonzalo/oxlint-06-remove-eslint

Conversation

@gonzaloriestra

@gonzaloriestra gonzaloriestra commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

WHY are these changes introduced?

The preceding PRs make Oxlint the primary linter and close the rule-parity gaps we can preserve. Keeping ESLint as a compatibility pass after that point retains most of its dependency and runtime cost.

Measured on warm macOS arm64 runs across the full stack:

  • Full lint: 26.28s with ESLint compatibility, 10.82s with Oxlint only (about 2.4x faster).
  • Core lint toolchain: 14 direct + 482 transitive dependencies and 195.8 MiB, reduced to 4 direct + 2 transitive dependencies and 37.2 MiB.
  • The lockfile shrinks by roughly 4,100 lines.

WHAT is this pull request doing?

  • Removes the ESLint configs, dependencies, scripts, CI compatibility steps, caches, and editor integration.
  • Runs Oxlint from the Nx package lint targets.
  • Makes GraphQL code generation use Oxlint fixes followed by Prettier and commits the deterministic generated output.
  • Keeps local catch-all and TSDoc checks without their ESLint plugin dependencies.
  • Marks the former public ESLint plugin package private because it is now only an internal home for local Oxlint rules.
  • Updates contributor documentation and VS Code recommendations.

This intentionally drops rules Oxlint cannot currently enforce, notably Nx module boundaries, some JSDoc checks, naming/member ordering, import ordering, and deprecated stylistic rules. The earlier stack layers preserve the supported correctness, type-aware, Vitest, promise, and CLI-specific rules.

No changeset is included because this changes internal development tooling rather than shipped CLI behavior.

How to test your changes?

  • pnpm install --frozen-lockfile
  • pnpm lint
  • pnpm type-check
  • pnpm knip
  • pnpm test
  • Run pnpm graphql-codegen twice and confirm the second run leaves no additional diff.

Local validation passed 5,000 tests across 504 test files, with one skipped test. Two consecutive GraphQL codegen runs produced identical output.

Checklist

  • I've considered possible cross-platform impacts (Mac, Linux, Windows)
  • I've considered possible documentation changes
  • I've considered analytics changes to measure impact
  • This is internal tooling and does not require a changeset

Copy link
Copy Markdown
Contributor Author

Warning

This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
Learn more

This stack of pull requests is managed by Graphite. Learn more about stacking.

@github-actions github-actions Bot added the no-changelog This PR doesn't include a changeset entry. Is an internal only change not relevant to end users. label Jul 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

Differences in type declarations

We detected differences in the type declarations generated by Typescript for this branch compared to the baseline ('main' branch). Please, review them to ensure they are backward-compatible. Here are some important things to keep in mind:

  • Some seemingly private modules might be re-exported through public modules.
  • If the branch is behind main you might see odd diffs, rebase main into this branch.

New type declarations

We found no new type declarations in this PR

Existing type declarations

packages/cli-kit/dist/cli/api/graphql/admin/generated/find_development_theme_by_name.d.ts
@@ -5,12 +5,12 @@ export type FindDevelopmentThemeByNameQueryVariables = Types.Exact<{
 }>;
 export type FindDevelopmentThemeByNameQuery = {
     themes?: {
-        nodes: {
+        nodes: Array<{
             id: string;
             name: string;
             role: Types.ThemeRole;
             processing: boolean;
-        }[];
+        }>;
     } | null;
 };
 export declare const FindDevelopmentThemeByName: DocumentNode<FindDevelopmentThemeByNameQuery, FindDevelopmentThemeByNameQueryVariables>;
\ No newline at end of file
packages/cli-kit/dist/cli/api/graphql/admin/generated/get_theme_file_bodies.d.ts
@@ -3,12 +3,12 @@ import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/
 export type GetThemeFileBodiesQueryVariables = Types.Exact<{
     id: Types.Scalars['ID']['input'];
     after?: Types.InputMaybe<Types.Scalars['String']['input']>;
-    filenames?: Types.InputMaybe<Types.Scalars['String']['input'][] | Types.Scalars['String']['input']>;
+    filenames?: Types.InputMaybe<Array<Types.Scalars['String']['input']> | Types.Scalars['String']['input']>;
 }>;
 export type GetThemeFileBodiesQuery = {
     theme?: {
         files?: {
-            nodes: {
+            nodes: Array<{
                 filename: string;
                 size: unknown;
                 checksumMd5?: string | null;
@@ -22,11 +22,11 @@ export type GetThemeFileBodiesQuery = {
                     __typename: 'OnlineStoreThemeFileBodyUrl';
                     url: string;
                 };
-            }[];
-            userErrors: {
+            }>;
+            userErrors: Array<{
                 filename: string;
                 code: Types.OnlineStoreThemeFileResultType;
-            }[];
+            }>;
             pageInfo: {
                 hasNextPage: boolean;
                 endCursor?: string | null;
packages/cli-kit/dist/cli/api/graphql/admin/generated/get_theme_file_checksums.d.ts
@@ -7,15 +7,15 @@ export type GetThemeFileChecksumsQueryVariables = Types.Exact<{
 export type GetThemeFileChecksumsQuery = {
     theme?: {
         files?: {
-            nodes: {
+            nodes: Array<{
                 filename: string;
                 size: unknown;
                 checksumMd5?: string | null;
-            }[];
-            userErrors: {
+            }>;
+            userErrors: Array<{
                 filename: string;
                 code: Types.OnlineStoreThemeFileResultType;
-            }[];
+            }>;
             pageInfo: {
                 hasNextPage: boolean;
                 endCursor?: string | null;
packages/cli-kit/dist/cli/api/graphql/admin/generated/get_themes.d.ts
@@ -5,12 +5,12 @@ export type GetThemesQueryVariables = Types.Exact<{
 }>;
 export type GetThemesQuery = {
     themes?: {
-        nodes: {
+        nodes: Array<{
             id: string;
             name: string;
             role: Types.ThemeRole;
             processing: boolean;
-        }[];
+        }>;
         pageInfo: {
             hasNextPage: boolean;
             endCursor?: string | null;
packages/cli-kit/dist/cli/api/graphql/admin/generated/metafield_definitions_by_owner_type.d.ts
@@ -5,7 +5,7 @@ export type MetafieldDefinitionsByOwnerTypeQueryVariables = Types.Exact<{
 }>;
 export type MetafieldDefinitionsByOwnerTypeQuery = {
     metafieldDefinitions: {
-        nodes: {
+        nodes: Array<{
             key: string;
             name: string;
             namespace: string;
@@ -14,7 +14,7 @@ export type MetafieldDefinitionsByOwnerTypeQuery = {
                 category: string;
                 name: string;
             };
-        }[];
+        }>;
     };
 };
 export declare const MetafieldDefinitionsByOwnerType: DocumentNode<MetafieldDefinitionsByOwnerTypeQuery, MetafieldDefinitionsByOwnerTypeQueryVariables>;
\ No newline at end of file
packages/cli-kit/dist/cli/api/graphql/admin/generated/public_api_versions.d.ts
@@ -4,9 +4,9 @@ export type PublicApiVersionsQueryVariables = Types.Exact<{
     [key: string]: never;
 }>;
 export type PublicApiVersionsQuery = {
-    publicApiVersions: {
+    publicApiVersions: Array<{
         handle: string;
         supported: boolean;
-    }[];
+    }>;
 };
 export declare const PublicApiVersions: DocumentNode<PublicApiVersionsQuery, PublicApiVersionsQueryVariables>;
\ No newline at end of file
packages/cli-kit/dist/cli/api/graphql/admin/generated/theme_create.d.ts
@@ -12,10 +12,10 @@ export type ThemeCreateMutation = {
             name: string;
             role: Types.ThemeRole;
         } | null;
-        userErrors: {
-            field?: string[] | null;
+        userErrors: Array<{
+            field?: Array<string> | null;
             message: string;
-        }[];
+        }>;
     } | null;
 };
 export declare const ThemeCreate: DocumentNode<ThemeCreateMutation, ThemeCreateMutationVariables>;
\ No newline at end of file
packages/cli-kit/dist/cli/api/graphql/admin/generated/theme_delete.d.ts
@@ -6,10 +6,10 @@ export type ThemeDeleteMutationVariables = Types.Exact<{
 export type ThemeDeleteMutation = {
     themeDelete?: {
         deletedThemeId?: string | null;
-        userErrors: {
-            field?: string[] | null;
+        userErrors: Array<{
+            field?: Array<string> | null;
             message: string;
-        }[];
+        }>;
     } | null;
 };
 export declare const ThemeDelete: DocumentNode<ThemeDeleteMutation, ThemeDeleteMutationVariables>;
\ No newline at end of file
packages/cli-kit/dist/cli/api/graphql/admin/generated/theme_duplicate.d.ts
@@ -11,10 +11,10 @@ export type ThemeDuplicateMutation = {
             name: string;
             role: Types.ThemeRole;
         } | null;
-        userErrors: {
-            field?: string[] | null;
+        userErrors: Array<{
+            field?: Array<string> | null;
             message: string;
-        }[];
+        }>;
     } | null;
 };
 export declare const ThemeDuplicate: DocumentNode<ThemeDuplicateMutation, ThemeDuplicateMutationVariables>;
\ No newline at end of file
packages/cli-kit/dist/cli/api/graphql/admin/generated/theme_files_delete.d.ts
@@ -2,18 +2,18 @@ import * as Types from './types.js';
 import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
 export type ThemeFilesDeleteMutationVariables = Types.Exact<{
     themeId: Types.Scalars['ID']['input'];
-    files: Types.Scalars['String']['input'][] | Types.Scalars['String']['input'];
+    files: Array<Types.Scalars['String']['input']> | Types.Scalars['String']['input'];
 }>;
 export type ThemeFilesDeleteMutation = {
     themeFilesDelete?: {
-        deletedThemeFiles?: {
+        deletedThemeFiles?: Array<{
             filename: string;
-        }[] | null;
-        userErrors: {
+        }> | null;
+        userErrors: Array<{
             filename?: string | null;
             code?: Types.OnlineStoreThemeFilesUserErrorsCode | null;
             message: string;
-        }[];
+        }>;
     } | null;
 };
 export declare const ThemeFilesDelete: DocumentNode<ThemeFilesDeleteMutation, ThemeFilesDeleteMutationVariables>;
\ No newline at end of file
packages/cli-kit/dist/cli/api/graphql/admin/generated/theme_files_upsert.d.ts
@@ -1,18 +1,18 @@
 import * as Types from './types.js';
 import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
 export type ThemeFilesUpsertMutationVariables = Types.Exact<{
-    files: Types.OnlineStoreThemeFilesUpsertFileInput[] | Types.OnlineStoreThemeFilesUpsertFileInput;
+    files: Array<Types.OnlineStoreThemeFilesUpsertFileInput> | Types.OnlineStoreThemeFilesUpsertFileInput;
     themeId: Types.Scalars['ID']['input'];
 }>;
 export type ThemeFilesUpsertMutation = {
     themeFilesUpsert?: {
-        upsertedThemeFiles?: {
+        upsertedThemeFiles?: Array<{
             filename: string;
-        }[] | null;
-        userErrors: {
+        }> | null;
+        userErrors: Array<{
             filename?: string | null;
             message: string;
-        }[];
+        }>;
     } | null;
 };
 export declare const ThemeFilesUpsert: DocumentNode<ThemeFilesUpsertMutation, ThemeFilesUpsertMutationVariables>;
\ No newline at end of file
packages/cli-kit/dist/cli/api/graphql/admin/generated/theme_publish.d.ts
@@ -10,10 +10,10 @@ export type ThemePublishMutation = {
             name: string;
             role: Types.ThemeRole;
         } | null;
-        userErrors: {
-            field?: string[] | null;
+        userErrors: Array<{
+            field?: Array<string> | null;
             message: string;
-        }[];
+        }>;
     } | null;
 };
 export declare const ThemePublish: DocumentNode<ThemePublishMutation, ThemePublishMutationVariables>;
\ No newline at end of file
packages/cli-kit/dist/cli/api/graphql/admin/generated/theme_update.d.ts
@@ -11,10 +11,10 @@ export type ThemeUpdateMutation = {
             name: string;
             role: Types.ThemeRole;
         } | null;
-        userErrors: {
-            field?: string[] | null;
+        userErrors: Array<{
+            field?: Array<string> | null;
             message: string;
-        }[];
+        }>;
     } | null;
 };
 export declare const ThemeUpdate: DocumentNode<ThemeUpdateMutation, ThemeUpdateMutationVariables>;
\ No newline at end of file
packages/cli-kit/dist/cli/api/graphql/bulk-operations/generated/bulk-operation-cancel.d.ts
@@ -19,10 +19,10 @@ export type BulkOperationCancelMutation = {
             type: Types.BulkOperationType;
             url?: string | null;
         } | null;
-        userErrors: {
-            field?: string[] | null;
+        userErrors: Array<{
+            field?: Array<string> | null;
             message: string;
-        }[];
+        }>;
     } | null;
 };
 export declare const BulkOperationCancel: DocumentNode<BulkOperationCancelMutation, BulkOperationCancelMutationVariables>;
\ No newline at end of file
packages/cli-kit/dist/cli/api/graphql/bulk-operations/generated/bulk-operation-run-mutation.d.ts
@@ -18,11 +18,11 @@ export type BulkOperationRunMutationMutation = {
             status: Types.BulkOperationStatus;
             url?: string | null;
         } | null;
-        userErrors: {
+        userErrors: Array<{
             code?: Types.BulkMutationErrorCode | null;
-            field?: string[] | null;
+            field?: Array<string> | null;
             message: string;
-        }[];
+        }>;
     } | null;
 };
 export declare const BulkOperationRunMutation: DocumentNode<BulkOperationRunMutationMutation, BulkOperationRunMutationMutationVariables>;
\ No newline at end of file
packages/cli-kit/dist/cli/api/graphql/bulk-operations/generated/bulk-operation-run-query.d.ts
@@ -16,11 +16,11 @@ export type BulkOperationRunQueryMutation = {
             status: Types.BulkOperationStatus;
             url?: string | null;
         } | null;
-        userErrors: {
+        userErrors: Array<{
             code?: Types.BulkOperationUserErrorCode | null;
-            field?: string[] | null;
+            field?: Array<string> | null;
             message: string;
-        }[];
+        }>;
     } | null;
 };
 export declare const BulkOperationRunQuery: DocumentNode<BulkOperationRunQueryMutation, BulkOperationRunQueryMutationVariables>;
\ No newline at end of file
packages/cli-kit/dist/cli/api/graphql/bulk-operations/generated/list-bulk-operations.d.ts
@@ -7,7 +7,7 @@ export type ListBulkOperationsQueryVariables = Types.Exact<{
 }>;
 export type ListBulkOperationsQuery = {
     bulkOperations: {
-        nodes: {
+        nodes: Array<{
             id: string;
             status: Types.BulkOperationStatus;
             errorCode?: Types.BulkOperationErrorCode | null;
@@ -16,7 +16,7 @@ export type ListBulkOperationsQuery = {
             completedAt?: unknown | null;
             url?: string | null;
             partialDataUrl?: string | null;
-        }[];
+        }>;
     };
 };
 export declare const ListBulkOperations: DocumentNode<ListBulkOperationsQuery, ListBulkOperationsQueryVariables>;
\ No newline at end of file
packages/cli-kit/dist/cli/api/graphql/bulk-operations/generated/staged-uploads-create.d.ts
@@ -1,22 +1,22 @@
 import * as Types from './types.js';
 import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core';
 export type StagedUploadsCreateMutationVariables = Types.Exact<{
-    input: Types.StagedUploadInput[] | Types.StagedUploadInput;
+    input: Array<Types.StagedUploadInput> | Types.StagedUploadInput;
 }>;
 export type StagedUploadsCreateMutation = {
     stagedUploadsCreate?: {
-        stagedTargets?: {
+        stagedTargets?: Array<{
             url?: string | null;
             resourceUrl?: string | null;
-            parameters: {
+            parameters: Array<{
                 name: string;
                 value: string;
-            }[];
-        }[] | null;
-        userErrors: {
-            field?: string[] | null;
+            }>;
+        }> | null;
+        userErrors: Array<{
+            field?: Array<string> | null;
             message: string;
-        }[];
+        }>;
     } | null;
 };
 export declare const StagedUploadsCreate: DocumentNode<StagedUploadsCreateMutation, StagedUploadsCreateMutationVariables>;
\ No newline at end of file

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

no-changelog This PR doesn't include a changeset entry. Is an internal only change not relevant to end users.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant