@isentinel/eslint-config 6.0.0-beta.33 → 6.0.0-beta.35

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.mjs CHANGED
@@ -9,7 +9,7 @@ import path from "node:path";
9
9
  import { existsSync, readFileSync } from "fs";
10
10
  import { execSync } from "node:child_process";
11
11
  //#region package.json
12
- var version = "6.0.0-beta.33";
12
+ var version = "6.0.0-beta.35";
13
13
  var package_default = {
14
14
  name: "@isentinel/eslint-config",
15
15
  version,
@@ -156,6 +156,7 @@ var package_default = {
156
156
  "eslint-plugin-react-jsx": "catalog:peer",
157
157
  "eslint-plugin-react-naming-convention": "catalog:peer",
158
158
  "eslint-plugin-react-x": "catalog:peer",
159
+ "eslint-plugin-testing-library": "catalog:peer",
159
160
  "eslint-typegen": "catalog:dev",
160
161
  "jiti": "catalog:dev",
161
162
  "oxlint": "catalog:peer",
@@ -179,6 +180,7 @@ var package_default = {
179
180
  "eslint-plugin-react-jsx": "^5.10.0",
180
181
  "eslint-plugin-react-naming-convention": "^5.10.0",
181
182
  "eslint-plugin-react-x": "^5.10.0",
183
+ "eslint-plugin-testing-library": "^7.16.2",
182
184
  "oxlint": ">=1.73.0",
183
185
  "oxlint-tsgolint": ">=0.24.0"
184
186
  },
@@ -191,6 +193,7 @@ var package_default = {
191
193
  "eslint-plugin-react-jsx": { "optional": true },
192
194
  "eslint-plugin-react-naming-convention": { "optional": true },
193
195
  "eslint-plugin-react-x": { "optional": true },
196
+ "eslint-plugin-testing-library": { "optional": true },
194
197
  "oxlint": { "optional": true },
195
198
  "oxlint-tsgolint": { "optional": true }
196
199
  },
package/dist/index.d.mts CHANGED
@@ -13346,6 +13346,151 @@ interface RuleOptions {
13346
13346
  * @deprecated
13347
13347
  */
13348
13348
  'template-tag-spacing'?: Linter.RuleEntry<TemplateTagSpacing>;
13349
+ /**
13350
+ * Enforce promises from async event methods are handled
13351
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/await-async-events.md
13352
+ */
13353
+ 'testing-library/await-async-events'?: Linter.RuleEntry<TestingLibraryAwaitAsyncEvents>;
13354
+ /**
13355
+ * Enforce promises from async queries to be handled
13356
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/await-async-queries.md
13357
+ */
13358
+ 'testing-library/await-async-queries'?: Linter.RuleEntry<[]>;
13359
+ /**
13360
+ * Enforce promises from async utils to be awaited properly
13361
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/await-async-utils.md
13362
+ */
13363
+ 'testing-library/await-async-utils'?: Linter.RuleEntry<[]>;
13364
+ /**
13365
+ * Ensures consistent usage of `data-testid`
13366
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/consistent-data-testid.md
13367
+ */
13368
+ 'testing-library/consistent-data-testid'?: Linter.RuleEntry<TestingLibraryConsistentDataTestid>;
13369
+ /**
13370
+ * Disallow unnecessary `await` for sync events
13371
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-await-sync-events.md
13372
+ */
13373
+ 'testing-library/no-await-sync-events'?: Linter.RuleEntry<TestingLibraryNoAwaitSyncEvents>;
13374
+ /**
13375
+ * Disallow unnecessary `await` for sync queries
13376
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-await-sync-queries.md
13377
+ */
13378
+ 'testing-library/no-await-sync-queries'?: Linter.RuleEntry<[]>;
13379
+ /**
13380
+ * Disallow the use of `container` methods
13381
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-container.md
13382
+ */
13383
+ 'testing-library/no-container'?: Linter.RuleEntry<[]>;
13384
+ /**
13385
+ * Disallow the use of debugging utilities like `debug`
13386
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-debugging-utils.md
13387
+ */
13388
+ 'testing-library/no-debugging-utils'?: Linter.RuleEntry<TestingLibraryNoDebuggingUtils>;
13389
+ /**
13390
+ * Disallow importing from DOM Testing Library
13391
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-dom-import.md
13392
+ */
13393
+ 'testing-library/no-dom-import'?: Linter.RuleEntry<TestingLibraryNoDomImport>;
13394
+ /**
13395
+ * Disallow the use of the global RegExp flag (/g) in queries
13396
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-global-regexp-flag-in-query.md
13397
+ */
13398
+ 'testing-library/no-global-regexp-flag-in-query'?: Linter.RuleEntry<[]>;
13399
+ /**
13400
+ * Disallow the use of `cleanup`
13401
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-manual-cleanup.md
13402
+ */
13403
+ 'testing-library/no-manual-cleanup'?: Linter.RuleEntry<[]>;
13404
+ /**
13405
+ * Disallow direct Node access
13406
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-node-access.md
13407
+ */
13408
+ 'testing-library/no-node-access'?: Linter.RuleEntry<TestingLibraryNoNodeAccess>;
13409
+ /**
13410
+ * Disallow the use of promises passed to a `fireEvent` method
13411
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-promise-in-fire-event.md
13412
+ */
13413
+ 'testing-library/no-promise-in-fire-event'?: Linter.RuleEntry<[]>;
13414
+ /**
13415
+ * Disallow the use of `render` in testing frameworks setup functions
13416
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-render-in-lifecycle.md
13417
+ */
13418
+ 'testing-library/no-render-in-lifecycle'?: Linter.RuleEntry<TestingLibraryNoRenderInLifecycle>;
13419
+ /**
13420
+ * Ensure no `data-testid` queries are used
13421
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-test-id-queries.md
13422
+ */
13423
+ 'testing-library/no-test-id-queries'?: Linter.RuleEntry<[]>;
13424
+ /**
13425
+ * Disallow wrapping Testing Library utils or empty callbacks in `act`
13426
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-unnecessary-act.md
13427
+ */
13428
+ 'testing-library/no-unnecessary-act'?: Linter.RuleEntry<TestingLibraryNoUnnecessaryAct>;
13429
+ /**
13430
+ * Disallow the use of multiple `expect` calls inside `waitFor`
13431
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-wait-for-multiple-assertions.md
13432
+ */
13433
+ 'testing-library/no-wait-for-multiple-assertions'?: Linter.RuleEntry<[]>;
13434
+ /**
13435
+ * Disallow the use of side effects in `waitFor`
13436
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-wait-for-side-effects.md
13437
+ */
13438
+ 'testing-library/no-wait-for-side-effects'?: Linter.RuleEntry<[]>;
13439
+ /**
13440
+ * Ensures no snapshot is generated inside of a `waitFor` call
13441
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-wait-for-snapshot.md
13442
+ */
13443
+ 'testing-library/no-wait-for-snapshot'?: Linter.RuleEntry<[]>;
13444
+ /**
13445
+ * Suggest using explicit assertions rather than standalone queries
13446
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-explicit-assert.md
13447
+ */
13448
+ 'testing-library/prefer-explicit-assert'?: Linter.RuleEntry<TestingLibraryPreferExplicitAssert>;
13449
+ /**
13450
+ * Suggest using `find(All)By*` query instead of `waitFor` + `get(All)By*` to wait for elements
13451
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-find-by.md
13452
+ */
13453
+ 'testing-library/prefer-find-by'?: Linter.RuleEntry<[]>;
13454
+ /**
13455
+ * Suggest using implicit assertions for getBy* & findBy* queries
13456
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-implicit-assert.md
13457
+ */
13458
+ 'testing-library/prefer-implicit-assert'?: Linter.RuleEntry<[]>;
13459
+ /**
13460
+ * Ensure appropriate `get*`/`query*` queries are used with their respective matchers
13461
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-presence-queries.md
13462
+ */
13463
+ 'testing-library/prefer-presence-queries'?: Linter.RuleEntry<TestingLibraryPreferPresenceQueries>;
13464
+ /**
13465
+ * Suggest using `queryBy*` queries when waiting for disappearance
13466
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-query-by-disappearance.md
13467
+ */
13468
+ 'testing-library/prefer-query-by-disappearance'?: Linter.RuleEntry<[]>;
13469
+ /**
13470
+ * Ensure the configured `get*`/`query*` query is used with the corresponding matchers
13471
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-query-matchers.md
13472
+ */
13473
+ 'testing-library/prefer-query-matchers'?: Linter.RuleEntry<TestingLibraryPreferQueryMatchers>;
13474
+ /**
13475
+ * Suggest using `screen` while querying
13476
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-screen-queries.md
13477
+ */
13478
+ 'testing-library/prefer-screen-queries'?: Linter.RuleEntry<[]>;
13479
+ /**
13480
+ * Suggest using `userEvent` over `fireEvent` for simulating user interactions
13481
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-user-event.md
13482
+ */
13483
+ 'testing-library/prefer-user-event'?: Linter.RuleEntry<TestingLibraryPreferUserEvent>;
13484
+ /**
13485
+ * Suggest using userEvent with setup() instead of direct methods
13486
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-user-event-setup.md
13487
+ */
13488
+ 'testing-library/prefer-user-event-setup'?: Linter.RuleEntry<[]>;
13489
+ /**
13490
+ * Enforce a valid naming for return value from `render`
13491
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/render-result-naming-convention.md
13492
+ */
13493
+ 'testing-library/render-result-naming-convention'?: Linter.RuleEntry<[]>;
13349
13494
  /**
13350
13495
  * enforce linebreaks after opening and before closing array brackets
13351
13496
  * @see https://ota-meshi.github.io/eslint-plugin-toml/rules/array-bracket-newline.html
@@ -24744,6 +24889,66 @@ type SwitchColonSpacing = [] | [{
24744
24889
  type TemplateCurlySpacing = [] | [("always" | "never")];
24745
24890
  // ----- template-tag-spacing -----
24746
24891
  type TemplateTagSpacing = [] | [("always" | "never")];
24892
+ // ----- testing-library/await-async-events -----
24893
+ type TestingLibraryAwaitAsyncEvents = [] | [{
24894
+ eventModule?: (("fireEvent" | "userEvent") | ("fireEvent" | "userEvent")[]);
24895
+ }];
24896
+ // ----- testing-library/consistent-data-testid -----
24897
+ type TestingLibraryConsistentDataTestid = [] | [{
24898
+ testIdPattern: string;
24899
+ testIdAttribute?: (string | string[]);
24900
+ customMessage?: string;
24901
+ }];
24902
+ // ----- testing-library/no-await-sync-events -----
24903
+ type TestingLibraryNoAwaitSyncEvents = [] | [{
24904
+ eventModules?: [("fire-event" | "user-event"), ...(("fire-event" | "user-event"))[]];
24905
+ }];
24906
+ // ----- testing-library/no-debugging-utils -----
24907
+ type TestingLibraryNoDebuggingUtils = [] | [{
24908
+ utilsToCheckFor?: {
24909
+ prettyFormat?: boolean;
24910
+ logDOM?: boolean;
24911
+ logRoles?: boolean;
24912
+ prettyDOM?: boolean;
24913
+ logTestingPlaygroundURL?: boolean;
24914
+ debug?: boolean;
24915
+ };
24916
+ }];
24917
+ // ----- testing-library/no-dom-import -----
24918
+ type TestingLibraryNoDomImport = [] | [string];
24919
+ // ----- testing-library/no-node-access -----
24920
+ type TestingLibraryNoNodeAccess = [] | [{
24921
+ allowContainerFirstChild?: boolean;
24922
+ }];
24923
+ // ----- testing-library/no-render-in-lifecycle -----
24924
+ type TestingLibraryNoRenderInLifecycle = [] | [{
24925
+ allowTestingFrameworkSetupHook?: ("beforeEach" | "beforeAll");
24926
+ }];
24927
+ // ----- testing-library/no-unnecessary-act -----
24928
+ type TestingLibraryNoUnnecessaryAct = [] | [{
24929
+ isStrict?: boolean;
24930
+ }];
24931
+ // ----- testing-library/prefer-explicit-assert -----
24932
+ type TestingLibraryPreferExplicitAssert = [] | [{
24933
+ assertion?: ("toBeOnTheScreen" | "toBeInTheDocument" | "toBeTruthy" | "toBeDefined");
24934
+ includeFindQueries?: boolean;
24935
+ }];
24936
+ // ----- testing-library/prefer-presence-queries -----
24937
+ type TestingLibraryPreferPresenceQueries = [] | [{
24938
+ presence?: boolean;
24939
+ absence?: boolean;
24940
+ }];
24941
+ // ----- testing-library/prefer-query-matchers -----
24942
+ type TestingLibraryPreferQueryMatchers = [] | [{
24943
+ validEntries?: {
24944
+ query?: ("get" | "query");
24945
+ matcher?: string;
24946
+ }[];
24947
+ }];
24948
+ // ----- testing-library/prefer-user-event -----
24949
+ type TestingLibraryPreferUserEvent = [] | [{
24950
+ allowedMethods?: unknown[];
24951
+ }];
24747
24952
  // ----- toml/array-bracket-newline -----
24748
24953
  type TomlArrayBracketNewline = [] | [(("always" | "never" | "consistent") | {
24749
24954
  multiline?: boolean;
@@ -26665,7 +26870,7 @@ type Yoda = [] | [("always" | "never")] | [("always" | "never"), {
26665
26870
  onlyEquality?: boolean;
26666
26871
  }];
26667
26872
  // Names of all the configs
26668
- type ConfigNames = 'isentinel/eslint/comments' | 'isentinel/eslint/comments/src' | 'isentinel/e18e/rules' | 'isentinel/eslint-plugin/setup' | 'isentinel/eslint-plugin/rules' | 'isentinel/flawless/setup' | 'isentinel/flawless/rules' | 'isentinel/flawless/markdown-code' | 'isentinel/flawless/rules-type-aware' | 'isentinel/gitignore' | 'isentinel/ignores' | 'isentinel/imports/rules' | 'isentinel/imports/game' | 'isentinel/javascript/setup' | 'isentinel/javascript/rules' | 'isentinel/jsdoc/setup' | 'isentinel/jsdoc' | 'isentinel/jsonc/setup' | 'isentinel/jsonc/rules' | 'isentinel/jsonc/tsconfig' | 'isentinel/markdown/setup' | 'isentinel/markdown/processor' | 'isentinel/markdown/parser' | 'isentinel/markdown/disables' | 'isentinel/naming/setup' | 'isentinel/naming/ts/rules-type-aware' | 'isentinel/naming/tsx/rules-type-aware' | 'isentinel/node/rules' | 'isentinel/oxfmt/setup' | 'isentinel/oxfmt/javascript' | 'isentinel/oxfmt/typescript' | 'isentinel/oxfmt/css' | 'isentinel/oxfmt/scss' | 'isentinel/oxfmt/less' | 'isentinel/oxfmt/html' | 'isentinel/oxfmt/markdown' | 'isentinel/oxfmt/graphql' | 'isentinel/oxfmt/json' | 'isentinel/oxfmt/yaml' | 'isentinel/package-json/setup' | 'isentinel/package-json' | 'isentinel/package-json/root' | 'isentinel/perfectionist/setup' | 'isentinel/perfectionist' | 'isentinel/perfectionist/jsx' | 'isentinel/pnpm/setup' | 'isentinel/pnpm/package-json' | 'isentinel/pnpm/pnpm-workspace-yaml' | 'isentinel/promise' | 'isentinel/react/setup' | 'isentinel/react/setup/naming' | 'isentinel/react/rules' | 'isentinel/react/type-aware-rules' | 'isentinel/roblox/setup' | 'isentinel/roblox/parser' | 'isentinel/roblox/type-aware-parser' | 'isentinel/roblox' | 'isentinel/roblox/rules-type-aware' | 'isentinel/roblox/format-lua/setup' | 'isentinel/roblox/format-lua' | 'isentinel/small-rules/setup' | 'isentinel/small-rules' | 'isentinel/sonarjs' | 'isentinel/spelling/setup' | 'isentinel/spelling' | 'isentinel/stylistic/setup' | 'isentinel/stylistic' | 'isentinel/test/jest/setup' | 'isentinel/test/jest/rules' | 'isentinel/test/jest/type-tests' | 'isentinel/test/vitest/setup' | 'isentinel/test/vitest/rules' | 'isentinel/test/vitest/type-tests' | 'isentinel/toml/setup' | 'isentinel/toml/rules' | 'isentinel/typescript/setup' | 'isentinel/typescript/parser' | 'isentinel/typescript/type-aware-parser' | 'isentinel/typescript/rules' | 'isentinel/typescript/rules-type-aware' | 'isentinel/typescript/erasable-syntax-only' | 'isentinel/unicorn/setup' | 'isentinel/unicorn/rules' | 'isentinel/unicorn/root' | 'isentinel/yaml/setup' | 'isentinel/yaml/rules';
26873
+ type ConfigNames = 'isentinel/eslint/comments' | 'isentinel/eslint/comments/src' | 'isentinel/e18e/rules' | 'isentinel/eslint-plugin/setup' | 'isentinel/eslint-plugin/rules' | 'isentinel/flawless/setup' | 'isentinel/flawless/rules' | 'isentinel/flawless/markdown-code' | 'isentinel/flawless/rules-type-aware' | 'isentinel/gitignore' | 'isentinel/ignores' | 'isentinel/imports/rules' | 'isentinel/imports/game' | 'isentinel/javascript/setup' | 'isentinel/javascript/rules' | 'isentinel/jsdoc/setup' | 'isentinel/jsdoc' | 'isentinel/jsonc/setup' | 'isentinel/jsonc/rules' | 'isentinel/jsonc/tsconfig' | 'isentinel/markdown/setup' | 'isentinel/markdown/processor' | 'isentinel/markdown/parser' | 'isentinel/markdown/disables' | 'isentinel/naming/setup' | 'isentinel/naming/ts/rules-type-aware' | 'isentinel/naming/tsx/rules-type-aware' | 'isentinel/node/rules' | 'isentinel/oxfmt/setup' | 'isentinel/oxfmt/javascript' | 'isentinel/oxfmt/typescript' | 'isentinel/oxfmt/css' | 'isentinel/oxfmt/scss' | 'isentinel/oxfmt/less' | 'isentinel/oxfmt/html' | 'isentinel/oxfmt/markdown' | 'isentinel/oxfmt/graphql' | 'isentinel/oxfmt/json' | 'isentinel/oxfmt/yaml' | 'isentinel/package-json/setup' | 'isentinel/package-json' | 'isentinel/package-json/root' | 'isentinel/perfectionist/setup' | 'isentinel/perfectionist' | 'isentinel/perfectionist/jsx' | 'isentinel/pnpm/setup' | 'isentinel/pnpm/package-json' | 'isentinel/pnpm/pnpm-workspace-yaml' | 'isentinel/promise' | 'isentinel/react/setup' | 'isentinel/react/setup/naming' | 'isentinel/react/setup/testing-library' | 'isentinel/react/rules' | 'isentinel/react/type-aware-rules' | 'isentinel/roblox/setup' | 'isentinel/roblox/parser' | 'isentinel/roblox/type-aware-parser' | 'isentinel/roblox' | 'isentinel/roblox/rules-type-aware' | 'isentinel/roblox/format-lua/setup' | 'isentinel/roblox/format-lua' | 'isentinel/small-rules/setup' | 'isentinel/small-rules' | 'isentinel/sonarjs' | 'isentinel/spelling/setup' | 'isentinel/spelling' | 'isentinel/stylistic/setup' | 'isentinel/stylistic' | 'isentinel/test/jest/setup' | 'isentinel/test/jest/rules' | 'isentinel/test/jest/type-tests' | 'isentinel/test/vitest/setup' | 'isentinel/test/vitest/rules' | 'isentinel/test/vitest/type-tests' | 'isentinel/toml/setup' | 'isentinel/toml/rules' | 'isentinel/typescript/setup' | 'isentinel/typescript/parser' | 'isentinel/typescript/type-aware-parser' | 'isentinel/typescript/rules' | 'isentinel/typescript/rules-type-aware' | 'isentinel/typescript/erasable-syntax-only' | 'isentinel/unicorn/setup' | 'isentinel/unicorn/rules' | 'isentinel/unicorn/root' | 'isentinel/yaml/setup' | 'isentinel/yaml/rules';
26669
26874
  //#endregion
26670
26875
  //#region src/utils.d.ts
26671
26876
  type ExtractRuleOptions<T> = T extends Linter.RuleEntry<infer U> ? U : never;
@@ -26722,12 +26927,23 @@ interface JsdocOptions {
26722
26927
  full?: boolean;
26723
26928
  }
26724
26929
  type Rules = Record<string, Linter.RuleEntry<any> | undefined> & RuleOptions;
26930
+ type ConfigSettings = NonNullable<Linter.Config["settings"]> & {
26931
+ "testing-library"?: {
26932
+ /**
26933
+ * Package name for DOM Testing Library.
26934
+ *
26935
+ * When React testing support is enabled, importing this package is
26936
+ * forbidden in favor of `react-testing-library-lua`.
26937
+ */
26938
+ domPackage?: string;
26939
+ };
26940
+ };
26725
26941
  /**
26726
26942
  * An updated version of ESLint's `Linter.Config`, which provides autocompletion
26727
26943
  * for `rules` and relaxes type limitations for `plugins` and `rules`, because
26728
26944
  * many plugins still lack proper type definitions.
26729
26945
  */
26730
- type TypedFlatConfigItem = Omit<Linter.Config<Linter.RulesRecord & Rules>, "plugins"> & {
26946
+ type TypedFlatConfigItem = Omit<Linter.Config<Linter.RulesRecord & Rules>, "plugins" | "settings"> & {
26731
26947
  /**
26732
26948
  * The base directory that `files` and `ignores` patterns in this config
26733
26949
  * object are resolved against. Defaults to the location ESLint derives the
@@ -26750,6 +26966,8 @@ type TypedFlatConfigItem = Omit<Linter.Config<Linter.RulesRecord & Rules>, "plug
26750
26966
  * files.
26751
26967
  */
26752
26968
  rules?: Rules;
26969
+ /** Shared settings consumed by configured plugins and presets. */
26970
+ settings?: ConfigSettings;
26753
26971
  };
26754
26972
  interface OptionsComponentExtensions {
26755
26973
  /** Additional extensions for components. */
@@ -27087,6 +27305,14 @@ type ReactConfig = OptionsOverridesTypeAware & ReactSettings & {
27087
27305
  * @default true
27088
27306
  */
27089
27307
  reactCompiler?: boolean;
27308
+ /**
27309
+ * Whether to enable Testing Library rules for testing-library-lua.
27310
+ *
27311
+ * Requires installing `eslint-plugin-testing-library`.
27312
+ *
27313
+ * @default false
27314
+ */
27315
+ testing?: boolean;
27090
27316
  } & {
27091
27317
  filenameCase?: "kebabCase" | "pascalCase";
27092
27318
  };
@@ -27326,6 +27552,10 @@ interface OptionsConfig extends OptionsComponentExtensions, OptionsProjectType {
27326
27552
  *
27327
27553
  * - `eslint-plugin-react-naming-convention`.
27328
27554
  *
27555
+ * If `testing` is enabled, also requires:
27556
+ *
27557
+ * - `eslint-plugin-testing-library`.
27558
+ *
27329
27559
  * @default false
27330
27560
  */
27331
27561
  react?: boolean | ReactConfig;
@@ -27749,7 +27979,9 @@ declare function pnpm(options: OptionsPnpm & Required<OptionsIsInEditor>): Promi
27749
27979
  declare function promise(): Array<TypedFlatConfigItem>;
27750
27980
  //#endregion
27751
27981
  //#region src/eslint/configs/react.d.ts
27752
- declare function react(options?: OptionsComponentExtensions & OptionsFiles & OptionsStylistic & OptionsTypeScriptParserOptions & OptionsTypeScriptWithTypes & ReactConfig): Promise<Array<TypedFlatConfigItem>>;
27982
+ declare function react(options?: OptionsComponentExtensions & OptionsFiles & OptionsStylistic & OptionsTypeScriptParserOptions & OptionsTypeScriptWithTypes & ReactConfig & {
27983
+ settings?: ConfigSettings;
27984
+ }): Promise<Array<TypedFlatConfigItem>>;
27753
27985
  //#endregion
27754
27986
  //#region src/eslint/configs/roblox.d.ts
27755
27987
  declare function roblox$1(options?: OptionsComponentExtensions & OptionsFilesTypeAware & OptionsOverridesTypeAware & OptionsStylistic & OptionsTypeScriptParserOptions & OptionsTypeScriptWithTypes, formatLua?: boolean): Promise<Array<TypedFlatConfigItem>>;
@@ -27849,4 +28081,4 @@ declare function unicorn({ complementIgnores, nameReplacements, roblox, root: cu
27849
28081
  //#region src/eslint/configs/yaml.d.ts
27850
28082
  declare function yaml({ files, overrides, stylistic }?: OptionsFiles & OptionsOverrides & OptionsStylistic): Promise<Array<TypedFlatConfigItem>>;
27851
28083
  //#endregion
27852
- export { type Awaitable, type ConfigNames, type FlatConfigComposer, GLOB_ALL_JSON, GLOB_ALL_SRC, GLOB_BIN, GLOB_BUILD_CONFIGS, GLOB_CSS, GLOB_DTS, GLOB_EXCLUDE, GLOB_GRAPHQL, GLOB_HTML, GLOB_JS, GLOB_JSON, GLOB_JSON5, GLOB_JSONC, GLOB_JSX, GLOB_LESS, GLOB_LINTABLE_EXTENSIONS, GLOB_LUA, GLOB_MARKDOWN, GLOB_MARKDOWN_BLOCKS, GLOB_MARKDOWN_CODE, GLOB_MARKDOWN_IN_MARKDOWN, GLOB_MISE, GLOB_PACKAGE_JSON, GLOB_PACKAGE_JSON_ROOT, GLOB_POSTCSS, GLOB_ROOT, GLOB_ROOT_SRC, GLOB_SCSS, GLOB_SRC, GLOB_SRC_EXT, GLOB_SRC_EXTENSIONS, GLOB_STYLE, GLOB_TESTS, GLOB_TOML, GLOB_TS, GLOB_TSCONFIG, GLOB_TSX, GLOB_TYPE_TESTS, GLOB_XML, GLOB_YAML, GitignoreOptions, type JsdocOptions, MARKDOWN_PROCESSOR_NAME, type NamedFlatConfigItem, type NamedOptionsConfig, type NamingConfig, type NamingSelector, type OptionsComponentExtensions, type OptionsConfig, type OptionsE18e, type OptionsFiles, type OptionsFilesTypeAware, type OptionsFormatters, type OptionsHasRoblox, type OptionsHasTypeScript, type OptionsIsInEditor, type OptionsJest, type OptionsOverrides, type OptionsOverridesTypeAware, type OptionsPnpm, type OptionsProjectType, type OptionsStylistic, type OptionsTestFramework, type OptionsTypeScriptErasableOnly, type OptionsTypeScriptParserOptions, type OptionsTypeScriptWithTypes, type OptionsTypescript, type OptionsUnicorn, type OptionsVitest, type OxfmtOptions, type PerfectionistConfig, type PrettierOptions, type ReactConfig, type ReactSettings, type Rules, type SpellCheckConfig, type StylisticConfig, StylisticConfigDefaults, type TypedFlatConfigItem, comments, isentinel as default, isentinel, defaultPluginRenaming, disables, e18e, eslintPlugin, flawless, gitignore, ignores$1 as ignores, imports, isAgentAutofixDisabled, isInAgentSession, isInEditorEnvironment, isInGitHooksOrLintStaged, javascript, jsdoc, jsonc, loadSmallRulesPlugin, markdown, naming, node, oxfmt, packageJson, perfectionist, pnpm, promise, react, roblox$1 as roblox, smallRules, sonarjs, sortCspell, sortGithubAction, sortMiseToml, sortPnpmWorkspace, sortRojoProject, sortTsconfig, spelling, stylistic$1 as stylistic, test, toml, typescript, unicorn, yaml };
28084
+ export { type Awaitable, type ConfigNames, type ConfigSettings, type FlatConfigComposer, GLOB_ALL_JSON, GLOB_ALL_SRC, GLOB_BIN, GLOB_BUILD_CONFIGS, GLOB_CSS, GLOB_DTS, GLOB_EXCLUDE, GLOB_GRAPHQL, GLOB_HTML, GLOB_JS, GLOB_JSON, GLOB_JSON5, GLOB_JSONC, GLOB_JSX, GLOB_LESS, GLOB_LINTABLE_EXTENSIONS, GLOB_LUA, GLOB_MARKDOWN, GLOB_MARKDOWN_BLOCKS, GLOB_MARKDOWN_CODE, GLOB_MARKDOWN_IN_MARKDOWN, GLOB_MISE, GLOB_PACKAGE_JSON, GLOB_PACKAGE_JSON_ROOT, GLOB_POSTCSS, GLOB_ROOT, GLOB_ROOT_SRC, GLOB_SCSS, GLOB_SRC, GLOB_SRC_EXT, GLOB_SRC_EXTENSIONS, GLOB_STYLE, GLOB_TESTS, GLOB_TOML, GLOB_TS, GLOB_TSCONFIG, GLOB_TSX, GLOB_TYPE_TESTS, GLOB_XML, GLOB_YAML, GitignoreOptions, type JsdocOptions, MARKDOWN_PROCESSOR_NAME, type NamedFlatConfigItem, type NamedOptionsConfig, type NamingConfig, type NamingSelector, type OptionsComponentExtensions, type OptionsConfig, type OptionsE18e, type OptionsFiles, type OptionsFilesTypeAware, type OptionsFormatters, type OptionsHasRoblox, type OptionsHasTypeScript, type OptionsIsInEditor, type OptionsJest, type OptionsOverrides, type OptionsOverridesTypeAware, type OptionsPnpm, type OptionsProjectType, type OptionsStylistic, type OptionsTestFramework, type OptionsTypeScriptErasableOnly, type OptionsTypeScriptParserOptions, type OptionsTypeScriptWithTypes, type OptionsTypescript, type OptionsUnicorn, type OptionsVitest, type OxfmtOptions, type PerfectionistConfig, type PrettierOptions, type ReactConfig, type ReactSettings, type Rules, type SpellCheckConfig, type StylisticConfig, StylisticConfigDefaults, type TypedFlatConfigItem, comments, isentinel as default, isentinel, defaultPluginRenaming, disables, e18e, eslintPlugin, flawless, gitignore, ignores$1 as ignores, imports, isAgentAutofixDisabled, isInAgentSession, isInEditorEnvironment, isInGitHooksOrLintStaged, javascript, jsdoc, jsonc, loadSmallRulesPlugin, markdown, naming, node, oxfmt, packageJson, perfectionist, pnpm, promise, react, roblox$1 as roblox, smallRules, sonarjs, sortCspell, sortGithubAction, sortMiseToml, sortPnpmWorkspace, sortRojoProject, sortTsconfig, spelling, stylistic$1 as stylistic, test, toml, typescript, unicorn, yaml };
package/dist/index.mjs CHANGED
@@ -3578,6 +3578,20 @@ function promise() {
3578
3578
  //#endregion
3579
3579
  //#region src/rules/react.ts
3580
3580
  /**
3581
+ * Build the direct DOM Testing Library import restriction shared by both
3582
+ * engines.
3583
+ *
3584
+ * @param domPackage - Package name for DOM Testing Library.
3585
+ * @returns The configured restriction, or `undefined` when no package is set.
3586
+ */
3587
+ function restrictedDomImportRule(domPackage) {
3588
+ if (domPackage === void 0) return;
3589
+ return ["error", { paths: [{
3590
+ name: domPackage,
3591
+ message: "Import from react-testing-library-lua instead; it re-exports the DOM utilities, and eslint-plugin-testing-library only detects one module per file."
3592
+ }] }];
3593
+ }
3594
+ /**
3581
3595
  * React rules shared between the ESLint and oxlint factories.
3582
3596
  *
3583
3597
  * The type-aware react rules stay in the ESLint config (oxlint jsPlugins have
@@ -3586,7 +3600,8 @@ function promise() {
3586
3600
  * @param options - Shared rule options.
3587
3601
  * @returns The rule map.
3588
3602
  */
3589
- function reactRules({ filenameCase = "kebabCase", reactCompiler = true, stylistic = true } = {}) {
3603
+ function reactRules({ domPackage, filenameCase = "kebabCase", reactCompiler = true, stylistic = true, testing = false } = {}) {
3604
+ const restrictedDomImport = testing ? restrictedDomImportRule(domPackage) : void 0;
3590
3605
  return {
3591
3606
  "flawless/no-unnecessary-use-callback": "error",
3592
3607
  "flawless/no-unnecessary-use-memo": "error",
@@ -3684,6 +3699,28 @@ function reactRules({ filenameCase = "kebabCase", reactCompiler = true, stylisti
3684
3699
  enforceAssignment: false,
3685
3700
  enforceSetterName: false
3686
3701
  }],
3702
+ ...testing ? {
3703
+ "testing-library/await-async-queries": "error",
3704
+ "testing-library/await-async-utils": "error",
3705
+ "testing-library/no-await-sync-events": ["error", { eventModules: ["fire-event"] }],
3706
+ "testing-library/no-await-sync-queries": "error",
3707
+ "testing-library/no-container": "error",
3708
+ "testing-library/no-debugging-utils": "error",
3709
+ "testing-library/no-manual-cleanup": "error",
3710
+ "testing-library/no-promise-in-fire-event": "error",
3711
+ "testing-library/no-render-in-lifecycle": "error",
3712
+ "testing-library/no-unnecessary-act": "error",
3713
+ "testing-library/no-wait-for-multiple-assertions": "error",
3714
+ "testing-library/no-wait-for-side-effects": "error",
3715
+ "testing-library/no-wait-for-snapshot": "error",
3716
+ "testing-library/prefer-explicit-assert": "error",
3717
+ "testing-library/prefer-find-by": "error",
3718
+ "testing-library/prefer-presence-queries": "error",
3719
+ "testing-library/prefer-query-by-disappearance": "error",
3720
+ "testing-library/prefer-screen-queries": "error",
3721
+ "testing-library/render-result-naming-convention": "error",
3722
+ ...restrictedDomImport !== void 0 ? { "no-restricted-imports": restrictedDomImport } : {}
3723
+ } : {},
3687
3724
  ...stylistic !== false ? {
3688
3725
  "flawless/jsx-shorthand-boolean": "warn",
3689
3726
  "flawless/jsx-shorthand-fragment": "warn",
@@ -3783,9 +3820,11 @@ function smallRules(options = {}) {
3783
3820
  //#region src/eslint/configs/react.ts
3784
3821
  init_globs();
3785
3822
  async function react(options = {}) {
3786
- const { filenameCase = "kebabCase", files = [GLOB_JSX, GLOB_TSX], filesTypeAware = [GLOB_TSX], ignoresTypeAware = [`${GLOB_MARKDOWN}/**`], importSource, overrides = {}, overridesTypeAware, reactCompiler = true, stylistic = true, typeAware = true } = options;
3823
+ const { filenameCase = "kebabCase", files = [GLOB_JSX, GLOB_TSX], filesTypeAware = [GLOB_TSX], ignoresTypeAware = [`${GLOB_MARKDOWN}/**`], importSource, overrides = {}, overridesTypeAware, reactCompiler = true, stylistic = true, testing = false, typeAware = true } = options;
3824
+ const domPackage = options.settings?.["testing-library"]?.domPackage;
3787
3825
  await ensurePackages(["eslint-plugin-react-x", "eslint-plugin-react-jsx"]);
3788
3826
  if (stylistic !== false) await ensurePackages(["eslint-plugin-react-naming-convention"]);
3827
+ if (testing) await ensurePackages(["eslint-plugin-testing-library"]);
3789
3828
  const pluginSmallRules = loadSmallRulesPlugin();
3790
3829
  const pluginStylistic = lazyPlugin("@stylistic/eslint-plugin");
3791
3830
  const [pluginReactCore, pluginReactJsx, pluginFlawless, pluginTs, pluginUnicorn, pluginUnusedImports] = await Promise.all([
@@ -3826,6 +3865,10 @@ async function react(options = {}) {
3826
3865
  name: "isentinel/react/setup/naming",
3827
3866
  plugins: { "react-naming-convention": await interopDefault(import("eslint-plugin-react-naming-convention")) }
3828
3867
  }] : [],
3868
+ ...testing ? [{
3869
+ name: "isentinel/react/setup/testing-library",
3870
+ plugins: { "testing-library": await interopDefault(import("eslint-plugin-testing-library")) }
3871
+ }] : [],
3829
3872
  {
3830
3873
  name: "isentinel/react/rules",
3831
3874
  files,
@@ -3835,13 +3878,18 @@ async function react(options = {}) {
3835
3878
  },
3836
3879
  rules: {
3837
3880
  ...reactRules({
3881
+ domPackage,
3838
3882
  filenameCase,
3839
3883
  reactCompiler,
3840
- stylistic
3884
+ stylistic,
3885
+ testing
3841
3886
  }),
3842
3887
  ...overrides
3843
3888
  },
3844
- settings: { "react-x": reactSettings }
3889
+ settings: {
3890
+ "react-x": reactSettings,
3891
+ ...testing ? { "testing-library/utils-module": "testing-library-lua" } : {}
3892
+ }
3845
3893
  },
3846
3894
  ...isTypeAware ? [{
3847
3895
  name: "isentinel/react/type-aware-rules",
@@ -15065,6 +15113,7 @@ const typeAwarePrefixes = /* @__PURE__ */ new Set([
15065
15113
  "small-rules",
15066
15114
  "sonar",
15067
15115
  "style",
15116
+ "testing-library",
15068
15117
  "toml",
15069
15118
  "ts",
15070
15119
  "unicorn",
@@ -15314,6 +15363,7 @@ var init_adapters = __esmMin((() => {
15314
15363
  "small-rules": "@pobammer-ts/small-rules",
15315
15364
  "sonar": "eslint-plugin-sonarjs",
15316
15365
  "style": "@stylistic/eslint-plugin",
15366
+ "testing-library": "eslint-plugin-testing-library",
15317
15367
  "ts": "@typescript-eslint/eslint-plugin",
15318
15368
  "unicorn-js": "eslint-plugin-unicorn",
15319
15369
  "unused-imports": "eslint-plugin-unused-imports",
@@ -15380,6 +15430,7 @@ var init_adapters = __esmMin((() => {
15380
15430
  "small-rules": NATIVE_FIRST,
15381
15431
  "sonar": NATIVE_FIRST,
15382
15432
  "style": NATIVE_FIRST,
15433
+ "testing-library": "js-plugin",
15383
15434
  "toml": ESLINT_ONLY,
15384
15435
  "ts": NATIVE_FIRST,
15385
15436
  "unicorn": NATIVE_FIRST,
@@ -16797,6 +16848,35 @@ var init_oxlint_capabilities = __esmMin((() => {
16797
16848
  "symbol-description",
16798
16849
  "template-curly-spacing",
16799
16850
  "template-tag-spacing",
16851
+ "testing-library/await-async-events",
16852
+ "testing-library/await-async-queries",
16853
+ "testing-library/await-async-utils",
16854
+ "testing-library/consistent-data-testid",
16855
+ "testing-library/no-await-sync-events",
16856
+ "testing-library/no-await-sync-queries",
16857
+ "testing-library/no-container",
16858
+ "testing-library/no-debugging-utils",
16859
+ "testing-library/no-dom-import",
16860
+ "testing-library/no-global-regexp-flag-in-query",
16861
+ "testing-library/no-manual-cleanup",
16862
+ "testing-library/no-node-access",
16863
+ "testing-library/no-promise-in-fire-event",
16864
+ "testing-library/no-render-in-lifecycle",
16865
+ "testing-library/no-test-id-queries",
16866
+ "testing-library/no-unnecessary-act",
16867
+ "testing-library/no-wait-for-multiple-assertions",
16868
+ "testing-library/no-wait-for-side-effects",
16869
+ "testing-library/no-wait-for-snapshot",
16870
+ "testing-library/prefer-explicit-assert",
16871
+ "testing-library/prefer-find-by",
16872
+ "testing-library/prefer-implicit-assert",
16873
+ "testing-library/prefer-presence-queries",
16874
+ "testing-library/prefer-query-by-disappearance",
16875
+ "testing-library/prefer-query-matchers",
16876
+ "testing-library/prefer-screen-queries",
16877
+ "testing-library/prefer-user-event",
16878
+ "testing-library/prefer-user-event-setup",
16879
+ "testing-library/render-result-naming-convention",
16800
16880
  "ts/adjacent-overload-signatures",
16801
16881
  "ts/array-type",
16802
16882
  "ts/await-thenable",
@@ -19711,7 +19791,8 @@ async function isentinel(options, ...userConfigs) {
19711
19791
  }
19712
19792
  if (enableReact !== false) configs.push(react({
19713
19793
  ...resolveSubOptions(options, "react"),
19714
- ...getOverrides(options, "react")
19794
+ ...getOverrides(options, "react"),
19795
+ settings: options.settings
19715
19796
  }));
19716
19797
  if (enableJsonc !== false && !typeAwareOnly) {
19717
19798
  configs.push(jsonc({
package/dist/lint-cli.mjs CHANGED
@@ -38,7 +38,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
38
38
  }) : target, mod));
39
39
  //#endregion
40
40
  //#region package.json
41
- var version = "6.0.0-beta.33";
41
+ var version = "6.0.0-beta.35";
42
42
  //#endregion
43
43
  //#region src/lint-cli/lib/cli/types.ts
44
44
  /**
package/dist/oxlint.d.mts CHANGED
@@ -10750,6 +10750,151 @@ interface RuleOptions {
10750
10750
  * @deprecated
10751
10751
  */
10752
10752
  'template-tag-spacing'?: Linter.RuleEntry<TemplateTagSpacing>;
10753
+ /**
10754
+ * Enforce promises from async event methods are handled
10755
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/await-async-events.md
10756
+ */
10757
+ 'testing-library/await-async-events'?: Linter.RuleEntry<TestingLibraryAwaitAsyncEvents>;
10758
+ /**
10759
+ * Enforce promises from async queries to be handled
10760
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/await-async-queries.md
10761
+ */
10762
+ 'testing-library/await-async-queries'?: Linter.RuleEntry<[]>;
10763
+ /**
10764
+ * Enforce promises from async utils to be awaited properly
10765
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/await-async-utils.md
10766
+ */
10767
+ 'testing-library/await-async-utils'?: Linter.RuleEntry<[]>;
10768
+ /**
10769
+ * Ensures consistent usage of `data-testid`
10770
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/consistent-data-testid.md
10771
+ */
10772
+ 'testing-library/consistent-data-testid'?: Linter.RuleEntry<TestingLibraryConsistentDataTestid>;
10773
+ /**
10774
+ * Disallow unnecessary `await` for sync events
10775
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-await-sync-events.md
10776
+ */
10777
+ 'testing-library/no-await-sync-events'?: Linter.RuleEntry<TestingLibraryNoAwaitSyncEvents>;
10778
+ /**
10779
+ * Disallow unnecessary `await` for sync queries
10780
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-await-sync-queries.md
10781
+ */
10782
+ 'testing-library/no-await-sync-queries'?: Linter.RuleEntry<[]>;
10783
+ /**
10784
+ * Disallow the use of `container` methods
10785
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-container.md
10786
+ */
10787
+ 'testing-library/no-container'?: Linter.RuleEntry<[]>;
10788
+ /**
10789
+ * Disallow the use of debugging utilities like `debug`
10790
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-debugging-utils.md
10791
+ */
10792
+ 'testing-library/no-debugging-utils'?: Linter.RuleEntry<TestingLibraryNoDebuggingUtils>;
10793
+ /**
10794
+ * Disallow importing from DOM Testing Library
10795
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-dom-import.md
10796
+ */
10797
+ 'testing-library/no-dom-import'?: Linter.RuleEntry<TestingLibraryNoDomImport>;
10798
+ /**
10799
+ * Disallow the use of the global RegExp flag (/g) in queries
10800
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-global-regexp-flag-in-query.md
10801
+ */
10802
+ 'testing-library/no-global-regexp-flag-in-query'?: Linter.RuleEntry<[]>;
10803
+ /**
10804
+ * Disallow the use of `cleanup`
10805
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-manual-cleanup.md
10806
+ */
10807
+ 'testing-library/no-manual-cleanup'?: Linter.RuleEntry<[]>;
10808
+ /**
10809
+ * Disallow direct Node access
10810
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-node-access.md
10811
+ */
10812
+ 'testing-library/no-node-access'?: Linter.RuleEntry<TestingLibraryNoNodeAccess>;
10813
+ /**
10814
+ * Disallow the use of promises passed to a `fireEvent` method
10815
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-promise-in-fire-event.md
10816
+ */
10817
+ 'testing-library/no-promise-in-fire-event'?: Linter.RuleEntry<[]>;
10818
+ /**
10819
+ * Disallow the use of `render` in testing frameworks setup functions
10820
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-render-in-lifecycle.md
10821
+ */
10822
+ 'testing-library/no-render-in-lifecycle'?: Linter.RuleEntry<TestingLibraryNoRenderInLifecycle>;
10823
+ /**
10824
+ * Ensure no `data-testid` queries are used
10825
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-test-id-queries.md
10826
+ */
10827
+ 'testing-library/no-test-id-queries'?: Linter.RuleEntry<[]>;
10828
+ /**
10829
+ * Disallow wrapping Testing Library utils or empty callbacks in `act`
10830
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-unnecessary-act.md
10831
+ */
10832
+ 'testing-library/no-unnecessary-act'?: Linter.RuleEntry<TestingLibraryNoUnnecessaryAct>;
10833
+ /**
10834
+ * Disallow the use of multiple `expect` calls inside `waitFor`
10835
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-wait-for-multiple-assertions.md
10836
+ */
10837
+ 'testing-library/no-wait-for-multiple-assertions'?: Linter.RuleEntry<[]>;
10838
+ /**
10839
+ * Disallow the use of side effects in `waitFor`
10840
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-wait-for-side-effects.md
10841
+ */
10842
+ 'testing-library/no-wait-for-side-effects'?: Linter.RuleEntry<[]>;
10843
+ /**
10844
+ * Ensures no snapshot is generated inside of a `waitFor` call
10845
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/no-wait-for-snapshot.md
10846
+ */
10847
+ 'testing-library/no-wait-for-snapshot'?: Linter.RuleEntry<[]>;
10848
+ /**
10849
+ * Suggest using explicit assertions rather than standalone queries
10850
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-explicit-assert.md
10851
+ */
10852
+ 'testing-library/prefer-explicit-assert'?: Linter.RuleEntry<TestingLibraryPreferExplicitAssert>;
10853
+ /**
10854
+ * Suggest using `find(All)By*` query instead of `waitFor` + `get(All)By*` to wait for elements
10855
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-find-by.md
10856
+ */
10857
+ 'testing-library/prefer-find-by'?: Linter.RuleEntry<[]>;
10858
+ /**
10859
+ * Suggest using implicit assertions for getBy* & findBy* queries
10860
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-implicit-assert.md
10861
+ */
10862
+ 'testing-library/prefer-implicit-assert'?: Linter.RuleEntry<[]>;
10863
+ /**
10864
+ * Ensure appropriate `get*`/`query*` queries are used with their respective matchers
10865
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-presence-queries.md
10866
+ */
10867
+ 'testing-library/prefer-presence-queries'?: Linter.RuleEntry<TestingLibraryPreferPresenceQueries>;
10868
+ /**
10869
+ * Suggest using `queryBy*` queries when waiting for disappearance
10870
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-query-by-disappearance.md
10871
+ */
10872
+ 'testing-library/prefer-query-by-disappearance'?: Linter.RuleEntry<[]>;
10873
+ /**
10874
+ * Ensure the configured `get*`/`query*` query is used with the corresponding matchers
10875
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-query-matchers.md
10876
+ */
10877
+ 'testing-library/prefer-query-matchers'?: Linter.RuleEntry<TestingLibraryPreferQueryMatchers>;
10878
+ /**
10879
+ * Suggest using `screen` while querying
10880
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-screen-queries.md
10881
+ */
10882
+ 'testing-library/prefer-screen-queries'?: Linter.RuleEntry<[]>;
10883
+ /**
10884
+ * Suggest using `userEvent` over `fireEvent` for simulating user interactions
10885
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-user-event.md
10886
+ */
10887
+ 'testing-library/prefer-user-event'?: Linter.RuleEntry<TestingLibraryPreferUserEvent>;
10888
+ /**
10889
+ * Suggest using userEvent with setup() instead of direct methods
10890
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/prefer-user-event-setup.md
10891
+ */
10892
+ 'testing-library/prefer-user-event-setup'?: Linter.RuleEntry<[]>;
10893
+ /**
10894
+ * Enforce a valid naming for return value from `render`
10895
+ * @see https://github.com/testing-library/eslint-plugin-testing-library/tree/main/docs/rules/render-result-naming-convention.md
10896
+ */
10897
+ 'testing-library/render-result-naming-convention'?: Linter.RuleEntry<[]>;
10753
10898
  /**
10754
10899
  * enforce linebreaks after opening and before closing array brackets
10755
10900
  * @see https://ota-meshi.github.io/eslint-plugin-toml/rules/array-bracket-newline.html
@@ -22148,6 +22293,66 @@ type SwitchColonSpacing = [] | [{
22148
22293
  type TemplateCurlySpacing = [] | [("always" | "never")];
22149
22294
  // ----- template-tag-spacing -----
22150
22295
  type TemplateTagSpacing = [] | [("always" | "never")];
22296
+ // ----- testing-library/await-async-events -----
22297
+ type TestingLibraryAwaitAsyncEvents = [] | [{
22298
+ eventModule?: (("fireEvent" | "userEvent") | ("fireEvent" | "userEvent")[]);
22299
+ }];
22300
+ // ----- testing-library/consistent-data-testid -----
22301
+ type TestingLibraryConsistentDataTestid = [] | [{
22302
+ testIdPattern: string;
22303
+ testIdAttribute?: (string | string[]);
22304
+ customMessage?: string;
22305
+ }];
22306
+ // ----- testing-library/no-await-sync-events -----
22307
+ type TestingLibraryNoAwaitSyncEvents = [] | [{
22308
+ eventModules?: [("fire-event" | "user-event"), ...(("fire-event" | "user-event"))[]];
22309
+ }];
22310
+ // ----- testing-library/no-debugging-utils -----
22311
+ type TestingLibraryNoDebuggingUtils = [] | [{
22312
+ utilsToCheckFor?: {
22313
+ prettyFormat?: boolean;
22314
+ logDOM?: boolean;
22315
+ logRoles?: boolean;
22316
+ prettyDOM?: boolean;
22317
+ logTestingPlaygroundURL?: boolean;
22318
+ debug?: boolean;
22319
+ };
22320
+ }];
22321
+ // ----- testing-library/no-dom-import -----
22322
+ type TestingLibraryNoDomImport = [] | [string];
22323
+ // ----- testing-library/no-node-access -----
22324
+ type TestingLibraryNoNodeAccess = [] | [{
22325
+ allowContainerFirstChild?: boolean;
22326
+ }];
22327
+ // ----- testing-library/no-render-in-lifecycle -----
22328
+ type TestingLibraryNoRenderInLifecycle = [] | [{
22329
+ allowTestingFrameworkSetupHook?: ("beforeEach" | "beforeAll");
22330
+ }];
22331
+ // ----- testing-library/no-unnecessary-act -----
22332
+ type TestingLibraryNoUnnecessaryAct = [] | [{
22333
+ isStrict?: boolean;
22334
+ }];
22335
+ // ----- testing-library/prefer-explicit-assert -----
22336
+ type TestingLibraryPreferExplicitAssert = [] | [{
22337
+ assertion?: ("toBeOnTheScreen" | "toBeInTheDocument" | "toBeTruthy" | "toBeDefined");
22338
+ includeFindQueries?: boolean;
22339
+ }];
22340
+ // ----- testing-library/prefer-presence-queries -----
22341
+ type TestingLibraryPreferPresenceQueries = [] | [{
22342
+ presence?: boolean;
22343
+ absence?: boolean;
22344
+ }];
22345
+ // ----- testing-library/prefer-query-matchers -----
22346
+ type TestingLibraryPreferQueryMatchers = [] | [{
22347
+ validEntries?: {
22348
+ query?: ("get" | "query");
22349
+ matcher?: string;
22350
+ }[];
22351
+ }];
22352
+ // ----- testing-library/prefer-user-event -----
22353
+ type TestingLibraryPreferUserEvent = [] | [{
22354
+ allowedMethods?: unknown[];
22355
+ }];
22151
22356
  // ----- toml/array-bracket-newline -----
22152
22357
  type TomlArrayBracketNewline = [] | [(("always" | "never" | "consistent") | {
22153
22358
  multiline?: boolean;
@@ -24094,12 +24299,23 @@ interface JsdocOptions {
24094
24299
  full?: boolean;
24095
24300
  }
24096
24301
  type Rules = Record<string, Linter.RuleEntry<any> | undefined> & RuleOptions;
24302
+ type ConfigSettings = NonNullable<Linter.Config["settings"]> & {
24303
+ "testing-library"?: {
24304
+ /**
24305
+ * Package name for DOM Testing Library.
24306
+ *
24307
+ * When React testing support is enabled, importing this package is
24308
+ * forbidden in favor of `react-testing-library-lua`.
24309
+ */
24310
+ domPackage?: string;
24311
+ };
24312
+ };
24097
24313
  /**
24098
24314
  * An updated version of ESLint's `Linter.Config`, which provides autocompletion
24099
24315
  * for `rules` and relaxes type limitations for `plugins` and `rules`, because
24100
24316
  * many plugins still lack proper type definitions.
24101
24317
  */
24102
- type TypedFlatConfigItem = Omit<Linter.Config<Linter.RulesRecord & Rules>, "plugins"> & {
24318
+ type TypedFlatConfigItem = Omit<Linter.Config<Linter.RulesRecord & Rules>, "plugins" | "settings"> & {
24103
24319
  /**
24104
24320
  * The base directory that `files` and `ignores` patterns in this config
24105
24321
  * object are resolved against. Defaults to the location ESLint derives the
@@ -24122,6 +24338,8 @@ type TypedFlatConfigItem = Omit<Linter.Config<Linter.RulesRecord & Rules>, "plug
24122
24338
  * files.
24123
24339
  */
24124
24340
  rules?: Rules;
24341
+ /** Shared settings consumed by configured plugins and presets. */
24342
+ settings?: ConfigSettings;
24125
24343
  };
24126
24344
  interface OptionsComponentExtensions {
24127
24345
  /** Additional extensions for components. */
@@ -24442,6 +24660,14 @@ type ReactConfig = OptionsOverridesTypeAware & ReactSettings & {
24442
24660
  * @default true
24443
24661
  */
24444
24662
  reactCompiler?: boolean;
24663
+ /**
24664
+ * Whether to enable Testing Library rules for testing-library-lua.
24665
+ *
24666
+ * Requires installing `eslint-plugin-testing-library`.
24667
+ *
24668
+ * @default false
24669
+ */
24670
+ testing?: boolean;
24445
24671
  } & {
24446
24672
  filenameCase?: "kebabCase" | "pascalCase";
24447
24673
  };
@@ -24681,6 +24907,10 @@ interface OptionsConfig extends OptionsComponentExtensions, OptionsProjectType {
24681
24907
  *
24682
24908
  * - `eslint-plugin-react-naming-convention`.
24683
24909
  *
24910
+ * If `testing` is enabled, also requires:
24911
+ *
24912
+ * - `eslint-plugin-testing-library`.
24913
+ *
24684
24914
  * @default false
24685
24915
  */
24686
24916
  react?: boolean | ReactConfig;
@@ -32714,7 +32944,7 @@ type OxlintCommentsRequireDescription = [] | [{
32714
32944
  ignore?: ("oxlint-disable" | "oxlint-disable-line" | "oxlint-disable-next-line" | "oxlint-enable")[];
32715
32945
  }];
32716
32946
  /** JsPlugin prefixes whose rules keep their ESLint-side names in oxlint configs. */
32717
- type OxlintKeptJsPluginPrefix = '@cspell' | 'antfu' | 'better-max-params' | 'comment-length' | 'de-morgan' | 'e18e' | 'erasable-syntax-only' | 'eslint-plugin' | 'flawless' | 'jest-extended' | 'oxfmt' | 'perfectionist' | 'react-jsx' | 'react-naming-convention' | 'roblox' | 'sentinel' | 'small-rules' | 'sonar' | 'style' | 'ts' | 'unused-imports';
32947
+ type OxlintKeptJsPluginPrefix = '@cspell' | 'antfu' | 'better-max-params' | 'comment-length' | 'de-morgan' | 'e18e' | 'erasable-syntax-only' | 'eslint-plugin' | 'flawless' | 'jest-extended' | 'oxfmt' | 'perfectionist' | 'react-jsx' | 'react-naming-convention' | 'roblox' | 'sentinel' | 'small-rules' | 'sonar' | 'style' | 'testing-library' | 'ts' | 'unused-imports';
32718
32948
  /** JsPlugin rules whose oxlint names match the ESLint-side names. */
32719
32949
  type OxlintKeptJsPluginRuleOptions = { [K in keyof RuleOptions as K extends `${OxlintKeptJsPluginPrefix}/${string}` ? K : never]: RuleOptions[K]; };
32720
32950
  /** All rules known to the oxlint factory, keyed by canonical oxlint rule name. */
package/dist/oxlint.mjs CHANGED
@@ -1223,6 +1223,35 @@ const jsPluginRuleNames = /* @__PURE__ */ new Set([
1223
1223
  "symbol-description",
1224
1224
  "template-curly-spacing",
1225
1225
  "template-tag-spacing",
1226
+ "testing-library/await-async-events",
1227
+ "testing-library/await-async-queries",
1228
+ "testing-library/await-async-utils",
1229
+ "testing-library/consistent-data-testid",
1230
+ "testing-library/no-await-sync-events",
1231
+ "testing-library/no-await-sync-queries",
1232
+ "testing-library/no-container",
1233
+ "testing-library/no-debugging-utils",
1234
+ "testing-library/no-dom-import",
1235
+ "testing-library/no-global-regexp-flag-in-query",
1236
+ "testing-library/no-manual-cleanup",
1237
+ "testing-library/no-node-access",
1238
+ "testing-library/no-promise-in-fire-event",
1239
+ "testing-library/no-render-in-lifecycle",
1240
+ "testing-library/no-test-id-queries",
1241
+ "testing-library/no-unnecessary-act",
1242
+ "testing-library/no-wait-for-multiple-assertions",
1243
+ "testing-library/no-wait-for-side-effects",
1244
+ "testing-library/no-wait-for-snapshot",
1245
+ "testing-library/prefer-explicit-assert",
1246
+ "testing-library/prefer-find-by",
1247
+ "testing-library/prefer-implicit-assert",
1248
+ "testing-library/prefer-presence-queries",
1249
+ "testing-library/prefer-query-by-disappearance",
1250
+ "testing-library/prefer-query-matchers",
1251
+ "testing-library/prefer-screen-queries",
1252
+ "testing-library/prefer-user-event",
1253
+ "testing-library/prefer-user-event-setup",
1254
+ "testing-library/render-result-naming-convention",
1226
1255
  "ts/adjacent-overload-signatures",
1227
1256
  "ts/array-type",
1228
1257
  "ts/await-thenable",
@@ -3427,6 +3456,25 @@ const enabledPresetRuleNames = /* @__PURE__ */ new Set([
3427
3456
  "style/wrap-iife",
3428
3457
  "style/yield-star-spacing",
3429
3458
  "symbol-description",
3459
+ "testing-library/await-async-queries",
3460
+ "testing-library/await-async-utils",
3461
+ "testing-library/no-await-sync-events",
3462
+ "testing-library/no-await-sync-queries",
3463
+ "testing-library/no-container",
3464
+ "testing-library/no-debugging-utils",
3465
+ "testing-library/no-manual-cleanup",
3466
+ "testing-library/no-promise-in-fire-event",
3467
+ "testing-library/no-render-in-lifecycle",
3468
+ "testing-library/no-unnecessary-act",
3469
+ "testing-library/no-wait-for-multiple-assertions",
3470
+ "testing-library/no-wait-for-side-effects",
3471
+ "testing-library/no-wait-for-snapshot",
3472
+ "testing-library/prefer-explicit-assert",
3473
+ "testing-library/prefer-find-by",
3474
+ "testing-library/prefer-presence-queries",
3475
+ "testing-library/prefer-query-by-disappearance",
3476
+ "testing-library/prefer-screen-queries",
3477
+ "testing-library/render-result-naming-convention",
3430
3478
  "toml/array-bracket-newline",
3431
3479
  "toml/array-bracket-spacing",
3432
3480
  "toml/array-element-newline",
@@ -4698,6 +4746,7 @@ const oxlintJsPlugins = {
4698
4746
  "small-rules": "@pobammer-ts/small-rules",
4699
4747
  "sonar": "eslint-plugin-sonarjs",
4700
4748
  "style": "@stylistic/eslint-plugin",
4749
+ "testing-library": "eslint-plugin-testing-library",
4701
4750
  "ts": "@typescript-eslint/eslint-plugin",
4702
4751
  "unicorn-js": "eslint-plugin-unicorn",
4703
4752
  "unused-imports": "eslint-plugin-unused-imports",
@@ -4787,6 +4836,7 @@ const oxlintFamilyPolicies = {
4787
4836
  "small-rules": NATIVE_FIRST,
4788
4837
  "sonar": NATIVE_FIRST,
4789
4838
  "style": NATIVE_FIRST,
4839
+ "testing-library": "js-plugin",
4790
4840
  "toml": ESLINT_ONLY,
4791
4841
  "ts": NATIVE_FIRST,
4792
4842
  "unicorn": NATIVE_FIRST,
@@ -7777,6 +7827,20 @@ function oxlintPromise() {
7777
7827
  //#endregion
7778
7828
  //#region src/rules/react.ts
7779
7829
  /**
7830
+ * Build the direct DOM Testing Library import restriction shared by both
7831
+ * engines.
7832
+ *
7833
+ * @param domPackage - Package name for DOM Testing Library.
7834
+ * @returns The configured restriction, or `undefined` when no package is set.
7835
+ */
7836
+ function restrictedDomImportRule(domPackage) {
7837
+ if (domPackage === void 0) return;
7838
+ return ["error", { paths: [{
7839
+ name: domPackage,
7840
+ message: "Import from react-testing-library-lua instead; it re-exports the DOM utilities, and eslint-plugin-testing-library only detects one module per file."
7841
+ }] }];
7842
+ }
7843
+ /**
7780
7844
  * React rules shared between the ESLint and oxlint factories.
7781
7845
  *
7782
7846
  * The type-aware react rules stay in the ESLint config (oxlint jsPlugins have
@@ -7785,7 +7849,8 @@ function oxlintPromise() {
7785
7849
  * @param options - Shared rule options.
7786
7850
  * @returns The rule map.
7787
7851
  */
7788
- function reactRules({ filenameCase = "kebabCase", reactCompiler = true, stylistic = true } = {}) {
7852
+ function reactRules({ domPackage, filenameCase = "kebabCase", reactCompiler = true, stylistic = true, testing = false } = {}) {
7853
+ const restrictedDomImport = testing ? restrictedDomImportRule(domPackage) : void 0;
7789
7854
  return {
7790
7855
  "flawless/no-unnecessary-use-callback": "error",
7791
7856
  "flawless/no-unnecessary-use-memo": "error",
@@ -7883,6 +7948,28 @@ function reactRules({ filenameCase = "kebabCase", reactCompiler = true, stylisti
7883
7948
  enforceAssignment: false,
7884
7949
  enforceSetterName: false
7885
7950
  }],
7951
+ ...testing ? {
7952
+ "testing-library/await-async-queries": "error",
7953
+ "testing-library/await-async-utils": "error",
7954
+ "testing-library/no-await-sync-events": ["error", { eventModules: ["fire-event"] }],
7955
+ "testing-library/no-await-sync-queries": "error",
7956
+ "testing-library/no-container": "error",
7957
+ "testing-library/no-debugging-utils": "error",
7958
+ "testing-library/no-manual-cleanup": "error",
7959
+ "testing-library/no-promise-in-fire-event": "error",
7960
+ "testing-library/no-render-in-lifecycle": "error",
7961
+ "testing-library/no-unnecessary-act": "error",
7962
+ "testing-library/no-wait-for-multiple-assertions": "error",
7963
+ "testing-library/no-wait-for-side-effects": "error",
7964
+ "testing-library/no-wait-for-snapshot": "error",
7965
+ "testing-library/prefer-explicit-assert": "error",
7966
+ "testing-library/prefer-find-by": "error",
7967
+ "testing-library/prefer-presence-queries": "error",
7968
+ "testing-library/prefer-query-by-disappearance": "error",
7969
+ "testing-library/prefer-screen-queries": "error",
7970
+ "testing-library/render-result-naming-convention": "error",
7971
+ ...restrictedDomImport !== void 0 ? { "no-restricted-imports": restrictedDomImport } : {}
7972
+ } : {},
7886
7973
  ...stylistic !== false ? {
7887
7974
  "flawless/jsx-shorthand-boolean": "warn",
7888
7975
  "flawless/jsx-shorthand-fragment": "warn",
@@ -7929,7 +8016,7 @@ function reactRules({ filenameCase = "kebabCase", reactCompiler = true, stylisti
7929
8016
  * @returns The react config fragments.
7930
8017
  */
7931
8018
  function oxlintReact(options = {}) {
7932
- const { filenameCase = "kebabCase", importSource, overrides = {}, reactCompiler = true, roblox = true, stylistic = true } = options;
8019
+ const { domPackage = options.settings?.["testing-library"]?.domPackage, filenameCase = "kebabCase", importSource, overrides = {}, reactCompiler = true, roblox = true, stylistic = true, testing = false } = options;
7933
8020
  const files = options.files?.flat() ?? ["**/*.{,c,m}jsx", "**/*.{,c,m}tsx"];
7934
8021
  const performanceRule = roblox ? ["error", { nativeAllowList: "all" }] : "error";
7935
8022
  return [...createOxlintConfigs({
@@ -7937,14 +8024,20 @@ function oxlintReact(options = {}) {
7937
8024
  files,
7938
8025
  overrides,
7939
8026
  rules: reactRules({
8027
+ domPackage,
7940
8028
  filenameCase,
7941
8029
  reactCompiler,
7942
- stylistic
8030
+ stylistic,
8031
+ testing
7943
8032
  }),
7944
- settings: { "react-x": {
7945
- importSource: importSource ?? "@rbxts",
7946
- version: "17.0.2"
7947
- } }
8033
+ settings: {
8034
+ "react-x": {
8035
+ importSource: importSource ?? "@rbxts",
8036
+ version: "17.0.2"
8037
+ },
8038
+ ...testing ? { "testing-library/utils-module": "testing-library-lua" } : {},
8039
+ ...options.settings?.["testing-library"] ? { "testing-library": options.settings["testing-library"] } : {}
8040
+ }
7948
8041
  }), {
7949
8042
  name: "isentinel/react/perf",
7950
8043
  files,
@@ -9200,6 +9293,7 @@ function isentinel(factoryOptions, ...userConfigs) {
9200
9293
  const reactOptions = typeof enableReact === "object" ? enableReact : {};
9201
9294
  configs.push(oxlintReact({
9202
9295
  roblox: enableRoblox,
9296
+ settings: options.settings,
9203
9297
  stylistic: stylisticOptions,
9204
9298
  ...reactOptions
9205
9299
  }));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@isentinel/eslint-config",
3
- "version": "6.0.0-beta.33",
3
+ "version": "6.0.0-beta.35",
4
4
  "description": "iSentinel's ESLint config",
5
5
  "keywords": [
6
6
  "eslint-config",
@@ -130,6 +130,7 @@
130
130
  "eslint-plugin-react-jsx": "5.17.3",
131
131
  "eslint-plugin-react-naming-convention": "5.17.3",
132
132
  "eslint-plugin-react-x": "5.17.3",
133
+ "eslint-plugin-testing-library": "7.16.2",
133
134
  "eslint-typegen": "2.3.1",
134
135
  "jiti": "2.7.0",
135
136
  "oxlint": "1.74.0",
@@ -142,7 +143,7 @@
142
143
  "typescript": "6.0.3",
143
144
  "unplugin-unused": "0.5.7",
144
145
  "vitest": "4.1.10",
145
- "@isentinel/eslint-config": "6.0.0-beta.33"
146
+ "@isentinel/eslint-config": "6.0.0-beta.35"
146
147
  },
147
148
  "peerDependencies": {
148
149
  "@vitest/eslint-plugin": "^1.6.4",
@@ -154,6 +155,7 @@
154
155
  "eslint-plugin-react-jsx": "^5.10.0",
155
156
  "eslint-plugin-react-naming-convention": "^5.10.0",
156
157
  "eslint-plugin-react-x": "^5.10.0",
158
+ "eslint-plugin-testing-library": "^7.16.2",
157
159
  "oxlint": ">=1.73.0",
158
160
  "oxlint-tsgolint": ">=0.24.0"
159
161
  },
@@ -182,6 +184,9 @@
182
184
  "eslint-plugin-react-x": {
183
185
  "optional": true
184
186
  },
187
+ "eslint-plugin-testing-library": {
188
+ "optional": true
189
+ },
185
190
  "oxlint": {
186
191
  "optional": true
187
192
  },