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

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.34";
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 `@packages/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 @packages/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,30 @@ 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-global-regexp-flag-in-query": "error",
3710
+ "testing-library/no-manual-cleanup": "error",
3711
+ "testing-library/no-node-access": "error",
3712
+ "testing-library/no-promise-in-fire-event": "error",
3713
+ "testing-library/no-render-in-lifecycle": "error",
3714
+ "testing-library/no-unnecessary-act": "error",
3715
+ "testing-library/no-wait-for-multiple-assertions": "error",
3716
+ "testing-library/no-wait-for-side-effects": "error",
3717
+ "testing-library/no-wait-for-snapshot": "error",
3718
+ "testing-library/prefer-explicit-assert": "error",
3719
+ "testing-library/prefer-find-by": "error",
3720
+ "testing-library/prefer-presence-queries": "error",
3721
+ "testing-library/prefer-query-by-disappearance": "error",
3722
+ "testing-library/prefer-screen-queries": "error",
3723
+ "testing-library/render-result-naming-convention": "error",
3724
+ ...restrictedDomImport !== void 0 ? { "no-restricted-imports": restrictedDomImport } : {}
3725
+ } : {},
3687
3726
  ...stylistic !== false ? {
3688
3727
  "flawless/jsx-shorthand-boolean": "warn",
3689
3728
  "flawless/jsx-shorthand-fragment": "warn",
@@ -3783,9 +3822,11 @@ function smallRules(options = {}) {
3783
3822
  //#region src/eslint/configs/react.ts
3784
3823
  init_globs();
3785
3824
  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;
3825
+ 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;
3826
+ const domPackage = options.settings?.["testing-library"]?.domPackage;
3787
3827
  await ensurePackages(["eslint-plugin-react-x", "eslint-plugin-react-jsx"]);
3788
3828
  if (stylistic !== false) await ensurePackages(["eslint-plugin-react-naming-convention"]);
3829
+ if (testing) await ensurePackages(["eslint-plugin-testing-library"]);
3789
3830
  const pluginSmallRules = loadSmallRulesPlugin();
3790
3831
  const pluginStylistic = lazyPlugin("@stylistic/eslint-plugin");
3791
3832
  const [pluginReactCore, pluginReactJsx, pluginFlawless, pluginTs, pluginUnicorn, pluginUnusedImports] = await Promise.all([
@@ -3826,6 +3867,10 @@ async function react(options = {}) {
3826
3867
  name: "isentinel/react/setup/naming",
3827
3868
  plugins: { "react-naming-convention": await interopDefault(import("eslint-plugin-react-naming-convention")) }
3828
3869
  }] : [],
3870
+ ...testing ? [{
3871
+ name: "isentinel/react/setup/testing-library",
3872
+ plugins: { "testing-library": await interopDefault(import("eslint-plugin-testing-library")) }
3873
+ }] : [],
3829
3874
  {
3830
3875
  name: "isentinel/react/rules",
3831
3876
  files,
@@ -3835,13 +3880,18 @@ async function react(options = {}) {
3835
3880
  },
3836
3881
  rules: {
3837
3882
  ...reactRules({
3883
+ domPackage,
3838
3884
  filenameCase,
3839
3885
  reactCompiler,
3840
- stylistic
3886
+ stylistic,
3887
+ testing
3841
3888
  }),
3842
3889
  ...overrides
3843
3890
  },
3844
- settings: { "react-x": reactSettings }
3891
+ settings: {
3892
+ "react-x": reactSettings,
3893
+ ...testing ? { "testing-library/utils-module": "testing-library-lua" } : {}
3894
+ }
3845
3895
  },
3846
3896
  ...isTypeAware ? [{
3847
3897
  name: "isentinel/react/type-aware-rules",
@@ -15065,6 +15115,7 @@ const typeAwarePrefixes = /* @__PURE__ */ new Set([
15065
15115
  "small-rules",
15066
15116
  "sonar",
15067
15117
  "style",
15118
+ "testing-library",
15068
15119
  "toml",
15069
15120
  "ts",
15070
15121
  "unicorn",
@@ -15314,6 +15365,7 @@ var init_adapters = __esmMin((() => {
15314
15365
  "small-rules": "@pobammer-ts/small-rules",
15315
15366
  "sonar": "eslint-plugin-sonarjs",
15316
15367
  "style": "@stylistic/eslint-plugin",
15368
+ "testing-library": "eslint-plugin-testing-library",
15317
15369
  "ts": "@typescript-eslint/eslint-plugin",
15318
15370
  "unicorn-js": "eslint-plugin-unicorn",
15319
15371
  "unused-imports": "eslint-plugin-unused-imports",
@@ -15380,6 +15432,7 @@ var init_adapters = __esmMin((() => {
15380
15432
  "small-rules": NATIVE_FIRST,
15381
15433
  "sonar": NATIVE_FIRST,
15382
15434
  "style": NATIVE_FIRST,
15435
+ "testing-library": "js-plugin",
15383
15436
  "toml": ESLINT_ONLY,
15384
15437
  "ts": NATIVE_FIRST,
15385
15438
  "unicorn": NATIVE_FIRST,
@@ -16797,6 +16850,35 @@ var init_oxlint_capabilities = __esmMin((() => {
16797
16850
  "symbol-description",
16798
16851
  "template-curly-spacing",
16799
16852
  "template-tag-spacing",
16853
+ "testing-library/await-async-events",
16854
+ "testing-library/await-async-queries",
16855
+ "testing-library/await-async-utils",
16856
+ "testing-library/consistent-data-testid",
16857
+ "testing-library/no-await-sync-events",
16858
+ "testing-library/no-await-sync-queries",
16859
+ "testing-library/no-container",
16860
+ "testing-library/no-debugging-utils",
16861
+ "testing-library/no-dom-import",
16862
+ "testing-library/no-global-regexp-flag-in-query",
16863
+ "testing-library/no-manual-cleanup",
16864
+ "testing-library/no-node-access",
16865
+ "testing-library/no-promise-in-fire-event",
16866
+ "testing-library/no-render-in-lifecycle",
16867
+ "testing-library/no-test-id-queries",
16868
+ "testing-library/no-unnecessary-act",
16869
+ "testing-library/no-wait-for-multiple-assertions",
16870
+ "testing-library/no-wait-for-side-effects",
16871
+ "testing-library/no-wait-for-snapshot",
16872
+ "testing-library/prefer-explicit-assert",
16873
+ "testing-library/prefer-find-by",
16874
+ "testing-library/prefer-implicit-assert",
16875
+ "testing-library/prefer-presence-queries",
16876
+ "testing-library/prefer-query-by-disappearance",
16877
+ "testing-library/prefer-query-matchers",
16878
+ "testing-library/prefer-screen-queries",
16879
+ "testing-library/prefer-user-event",
16880
+ "testing-library/prefer-user-event-setup",
16881
+ "testing-library/render-result-naming-convention",
16800
16882
  "ts/adjacent-overload-signatures",
16801
16883
  "ts/array-type",
16802
16884
  "ts/await-thenable",
@@ -19711,7 +19793,8 @@ async function isentinel(options, ...userConfigs) {
19711
19793
  }
19712
19794
  if (enableReact !== false) configs.push(react({
19713
19795
  ...resolveSubOptions(options, "react"),
19714
- ...getOverrides(options, "react")
19796
+ ...getOverrides(options, "react"),
19797
+ settings: options.settings
19715
19798
  }));
19716
19799
  if (enableJsonc !== false && !typeAwareOnly) {
19717
19800
  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.34";
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 `@packages/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,27 @@ 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-global-regexp-flag-in-query",
3466
+ "testing-library/no-manual-cleanup",
3467
+ "testing-library/no-node-access",
3468
+ "testing-library/no-promise-in-fire-event",
3469
+ "testing-library/no-render-in-lifecycle",
3470
+ "testing-library/no-unnecessary-act",
3471
+ "testing-library/no-wait-for-multiple-assertions",
3472
+ "testing-library/no-wait-for-side-effects",
3473
+ "testing-library/no-wait-for-snapshot",
3474
+ "testing-library/prefer-explicit-assert",
3475
+ "testing-library/prefer-find-by",
3476
+ "testing-library/prefer-presence-queries",
3477
+ "testing-library/prefer-query-by-disappearance",
3478
+ "testing-library/prefer-screen-queries",
3479
+ "testing-library/render-result-naming-convention",
3430
3480
  "toml/array-bracket-newline",
3431
3481
  "toml/array-bracket-spacing",
3432
3482
  "toml/array-element-newline",
@@ -4698,6 +4748,7 @@ const oxlintJsPlugins = {
4698
4748
  "small-rules": "@pobammer-ts/small-rules",
4699
4749
  "sonar": "eslint-plugin-sonarjs",
4700
4750
  "style": "@stylistic/eslint-plugin",
4751
+ "testing-library": "eslint-plugin-testing-library",
4701
4752
  "ts": "@typescript-eslint/eslint-plugin",
4702
4753
  "unicorn-js": "eslint-plugin-unicorn",
4703
4754
  "unused-imports": "eslint-plugin-unused-imports",
@@ -4787,6 +4838,7 @@ const oxlintFamilyPolicies = {
4787
4838
  "small-rules": NATIVE_FIRST,
4788
4839
  "sonar": NATIVE_FIRST,
4789
4840
  "style": NATIVE_FIRST,
4841
+ "testing-library": "js-plugin",
4790
4842
  "toml": ESLINT_ONLY,
4791
4843
  "ts": NATIVE_FIRST,
4792
4844
  "unicorn": NATIVE_FIRST,
@@ -7777,6 +7829,20 @@ function oxlintPromise() {
7777
7829
  //#endregion
7778
7830
  //#region src/rules/react.ts
7779
7831
  /**
7832
+ * Build the direct DOM Testing Library import restriction shared by both
7833
+ * engines.
7834
+ *
7835
+ * @param domPackage - Package name for DOM Testing Library.
7836
+ * @returns The configured restriction, or `undefined` when no package is set.
7837
+ */
7838
+ function restrictedDomImportRule(domPackage) {
7839
+ if (domPackage === void 0) return;
7840
+ return ["error", { paths: [{
7841
+ name: domPackage,
7842
+ message: "Import from @packages/react-testing-library-lua instead; it re-exports the DOM utilities, and eslint-plugin-testing-library only detects one module per file."
7843
+ }] }];
7844
+ }
7845
+ /**
7780
7846
  * React rules shared between the ESLint and oxlint factories.
7781
7847
  *
7782
7848
  * The type-aware react rules stay in the ESLint config (oxlint jsPlugins have
@@ -7785,7 +7851,8 @@ function oxlintPromise() {
7785
7851
  * @param options - Shared rule options.
7786
7852
  * @returns The rule map.
7787
7853
  */
7788
- function reactRules({ filenameCase = "kebabCase", reactCompiler = true, stylistic = true } = {}) {
7854
+ function reactRules({ domPackage, filenameCase = "kebabCase", reactCompiler = true, stylistic = true, testing = false } = {}) {
7855
+ const restrictedDomImport = testing ? restrictedDomImportRule(domPackage) : void 0;
7789
7856
  return {
7790
7857
  "flawless/no-unnecessary-use-callback": "error",
7791
7858
  "flawless/no-unnecessary-use-memo": "error",
@@ -7883,6 +7950,30 @@ function reactRules({ filenameCase = "kebabCase", reactCompiler = true, stylisti
7883
7950
  enforceAssignment: false,
7884
7951
  enforceSetterName: false
7885
7952
  }],
7953
+ ...testing ? {
7954
+ "testing-library/await-async-queries": "error",
7955
+ "testing-library/await-async-utils": "error",
7956
+ "testing-library/no-await-sync-events": ["error", { eventModules: ["fire-event"] }],
7957
+ "testing-library/no-await-sync-queries": "error",
7958
+ "testing-library/no-container": "error",
7959
+ "testing-library/no-debugging-utils": "error",
7960
+ "testing-library/no-global-regexp-flag-in-query": "error",
7961
+ "testing-library/no-manual-cleanup": "error",
7962
+ "testing-library/no-node-access": "error",
7963
+ "testing-library/no-promise-in-fire-event": "error",
7964
+ "testing-library/no-render-in-lifecycle": "error",
7965
+ "testing-library/no-unnecessary-act": "error",
7966
+ "testing-library/no-wait-for-multiple-assertions": "error",
7967
+ "testing-library/no-wait-for-side-effects": "error",
7968
+ "testing-library/no-wait-for-snapshot": "error",
7969
+ "testing-library/prefer-explicit-assert": "error",
7970
+ "testing-library/prefer-find-by": "error",
7971
+ "testing-library/prefer-presence-queries": "error",
7972
+ "testing-library/prefer-query-by-disappearance": "error",
7973
+ "testing-library/prefer-screen-queries": "error",
7974
+ "testing-library/render-result-naming-convention": "error",
7975
+ ...restrictedDomImport !== void 0 ? { "no-restricted-imports": restrictedDomImport } : {}
7976
+ } : {},
7886
7977
  ...stylistic !== false ? {
7887
7978
  "flawless/jsx-shorthand-boolean": "warn",
7888
7979
  "flawless/jsx-shorthand-fragment": "warn",
@@ -7929,7 +8020,7 @@ function reactRules({ filenameCase = "kebabCase", reactCompiler = true, stylisti
7929
8020
  * @returns The react config fragments.
7930
8021
  */
7931
8022
  function oxlintReact(options = {}) {
7932
- const { filenameCase = "kebabCase", importSource, overrides = {}, reactCompiler = true, roblox = true, stylistic = true } = options;
8023
+ const { domPackage = options.settings?.["testing-library"]?.domPackage, filenameCase = "kebabCase", importSource, overrides = {}, reactCompiler = true, roblox = true, stylistic = true, testing = false } = options;
7933
8024
  const files = options.files?.flat() ?? ["**/*.{,c,m}jsx", "**/*.{,c,m}tsx"];
7934
8025
  const performanceRule = roblox ? ["error", { nativeAllowList: "all" }] : "error";
7935
8026
  return [...createOxlintConfigs({
@@ -7937,14 +8028,20 @@ function oxlintReact(options = {}) {
7937
8028
  files,
7938
8029
  overrides,
7939
8030
  rules: reactRules({
8031
+ domPackage,
7940
8032
  filenameCase,
7941
8033
  reactCompiler,
7942
- stylistic
8034
+ stylistic,
8035
+ testing
7943
8036
  }),
7944
- settings: { "react-x": {
7945
- importSource: importSource ?? "@rbxts",
7946
- version: "17.0.2"
7947
- } }
8037
+ settings: {
8038
+ "react-x": {
8039
+ importSource: importSource ?? "@rbxts",
8040
+ version: "17.0.2"
8041
+ },
8042
+ ...testing ? { "testing-library/utils-module": "testing-library-lua" } : {},
8043
+ ...options.settings?.["testing-library"] ? { "testing-library": options.settings["testing-library"] } : {}
8044
+ }
7948
8045
  }), {
7949
8046
  name: "isentinel/react/perf",
7950
8047
  files,
@@ -9200,6 +9297,7 @@ function isentinel(factoryOptions, ...userConfigs) {
9200
9297
  const reactOptions = typeof enableReact === "object" ? enableReact : {};
9201
9298
  configs.push(oxlintReact({
9202
9299
  roblox: enableRoblox,
9300
+ settings: options.settings,
9203
9301
  stylistic: stylisticOptions,
9204
9302
  ...reactOptions
9205
9303
  }));
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.34",
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.34"
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
  },