eslint-plugin-typefest 1.0.4 → 1.0.6

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.
Files changed (61) hide show
  1. package/README.md +88 -79
  2. package/dist/_internal/rule-catalog.d.ts.map +1 -1
  3. package/dist/_internal/rule-catalog.js +9 -0
  4. package/dist/_internal/rule-catalog.js.map +1 -1
  5. package/dist/_internal/rules-registry.d.ts.map +1 -1
  6. package/dist/_internal/rules-registry.js +18 -0
  7. package/dist/_internal/rules-registry.js.map +1 -1
  8. package/dist/plugin.cjs +880 -48
  9. package/dist/plugin.cjs.map +4 -4
  10. package/dist/rules/prefer-type-fest-and-all.d.ts +13 -0
  11. package/dist/rules/prefer-type-fest-and-all.d.ts.map +1 -0
  12. package/dist/rules/prefer-type-fest-and-all.js +105 -0
  13. package/dist/rules/prefer-type-fest-and-all.js.map +1 -0
  14. package/dist/rules/prefer-type-fest-array-length.d.ts +13 -0
  15. package/dist/rules/prefer-type-fest-array-length.d.ts.map +1 -0
  16. package/dist/rules/prefer-type-fest-array-length.js +77 -0
  17. package/dist/rules/prefer-type-fest-array-length.js.map +1 -0
  18. package/dist/rules/prefer-type-fest-conditional-pick-deep.d.ts +13 -0
  19. package/dist/rules/prefer-type-fest-conditional-pick-deep.d.ts.map +1 -0
  20. package/dist/rules/prefer-type-fest-conditional-pick-deep.js +75 -0
  21. package/dist/rules/prefer-type-fest-conditional-pick-deep.js.map +1 -0
  22. package/dist/rules/prefer-type-fest-less-than-or-equal.d.ts +13 -0
  23. package/dist/rules/prefer-type-fest-less-than-or-equal.d.ts.map +1 -0
  24. package/dist/rules/prefer-type-fest-less-than-or-equal.js +153 -0
  25. package/dist/rules/prefer-type-fest-less-than-or-equal.js.map +1 -0
  26. package/dist/rules/prefer-type-fest-less-than.d.ts +13 -0
  27. package/dist/rules/prefer-type-fest-less-than.d.ts.map +1 -0
  28. package/dist/rules/prefer-type-fest-less-than.js +154 -0
  29. package/dist/rules/prefer-type-fest-less-than.js.map +1 -0
  30. package/dist/rules/prefer-type-fest-optional.d.ts +13 -0
  31. package/dist/rules/prefer-type-fest-optional.d.ts.map +1 -0
  32. package/dist/rules/prefer-type-fest-optional.js +130 -0
  33. package/dist/rules/prefer-type-fest-optional.js.map +1 -0
  34. package/dist/rules/prefer-type-fest-or-all.d.ts +13 -0
  35. package/dist/rules/prefer-type-fest-or-all.d.ts.map +1 -0
  36. package/dist/rules/prefer-type-fest-or-all.js +105 -0
  37. package/dist/rules/prefer-type-fest-or-all.js.map +1 -0
  38. package/dist/rules/prefer-type-fest-union-member.d.ts +13 -0
  39. package/dist/rules/prefer-type-fest-union-member.d.ts.map +1 -0
  40. package/dist/rules/prefer-type-fest-union-member.js +159 -0
  41. package/dist/rules/prefer-type-fest-union-member.js.map +1 -0
  42. package/dist/rules/prefer-type-fest-union-to-tuple.d.ts +13 -0
  43. package/dist/rules/prefer-type-fest-union-to-tuple.d.ts.map +1 -0
  44. package/dist/rules/prefer-type-fest-union-to-tuple.js +75 -0
  45. package/dist/rules/prefer-type-fest-union-to-tuple.js.map +1 -0
  46. package/docs/rules/prefer-type-fest-and-all.md +111 -0
  47. package/docs/rules/prefer-type-fest-array-length.md +109 -0
  48. package/docs/rules/prefer-type-fest-conditional-pick-deep.md +112 -0
  49. package/docs/rules/prefer-type-fest-less-than-or-equal.md +111 -0
  50. package/docs/rules/prefer-type-fest-less-than.md +111 -0
  51. package/docs/rules/prefer-type-fest-optional.md +104 -0
  52. package/docs/rules/prefer-type-fest-or-all.md +111 -0
  53. package/docs/rules/prefer-type-fest-union-member.md +119 -0
  54. package/docs/rules/prefer-type-fest-union-to-tuple.md +108 -0
  55. package/docs/rules/presets/all.md +9 -0
  56. package/docs/rules/presets/index.md +87 -78
  57. package/docs/rules/presets/recommended-type-checked.md +74 -65
  58. package/docs/rules/presets/recommended.md +8 -0
  59. package/docs/rules/presets/strict.md +9 -0
  60. package/docs/rules/presets/type-fest-types.md +8 -0
  61. package/package.json +46 -37
package/dist/plugin.cjs CHANGED
@@ -34,13 +34,13 @@ __export(plugin_exports, {
34
34
  });
35
35
  module.exports = __toCommonJS(plugin_exports);
36
36
  var import_parser3 = __toESM(require("@typescript-eslint/parser"), 1);
37
- var import_ts_extras37 = require("ts-extras");
37
+ var import_ts_extras39 = require("ts-extras");
38
38
 
39
39
  // package.json
40
40
  var package_default = {
41
41
  $schema: "https://www.schemastore.org/package.json",
42
42
  name: "eslint-plugin-typefest",
43
- version: "1.0.4",
43
+ version: "1.0.6",
44
44
  private: false,
45
45
  description: "ESLint rules for adopting type-fest and ts-extras conventions.",
46
46
  keywords: [
@@ -61,12 +61,12 @@ var package_default = {
61
61
  url: "git+https://github.com/Nick2bad4u/eslint-plugin-typefest.git"
62
62
  },
63
63
  license: "MIT",
64
- author: "Nick2bad4u <20943337+Nick2bad4u@users.noreply.github.com> (https://nick2bad4u.github.io/eslint-plugin-typefest)",
64
+ author: "Nick2bad4u <20943337+Nick2bad4u@users.noreply.github.com> (https://github.com/Nick2bad4u)",
65
65
  contributors: [
66
66
  {
67
67
  name: "Nick2bad4u",
68
68
  email: "20943337+Nick2bad4u@users.noreply.github.com",
69
- url: "https://nick2bad4u.github.io/eslint-plugin-typefest"
69
+ url: "https://github.com/Nick2bad4u"
70
70
  }
71
71
  ],
72
72
  sideEffects: false,
@@ -115,6 +115,8 @@ var package_default = {
115
115
  "build:clean": `node -e "require('node:fs').rmSync('dist',{recursive:true,force:true})"`,
116
116
  "build:eslint-inspector": 'npx -y @eslint/config-inspector@1.4.2 build --outDir "docs/docusaurus/static/eslint-inspector" --base "/eslint-plugin-typefest/eslint-inspector/"',
117
117
  "build:eslint-inspector:local": "npx @eslint/config-inspector",
118
+ "build:stylelint-inspector": 'npx -y stylelint-config-inspector@latest build --outDir "docs/docusaurus/static/stylelint-inspector" --base "/eslint-plugin-typefest/stylelint-inspector/"',
119
+ "build:stylelint-inspector:local": "npx stylelint-config-inspector@latest",
118
120
  "build:types:cjs": `node -e "require('node:fs').copyFileSync('dist/plugin.d.ts','dist/plugin.d.cts')"`,
119
121
  "changelog:generate": "git-cliff --config cliff.toml --output CHANGELOG.md",
120
122
  "changelog:preview": "git-cliff --config cliff.toml --unreleased",
@@ -146,8 +148,10 @@ var package_default = {
146
148
  "docs:build": "npm run --workspace docs/docusaurus build",
147
149
  "docs:build:local": "npm run --workspace docs/docusaurus build:local",
148
150
  "docs:check-links": "npm run docs:api && node ./scripts/check-doc-links.mjs",
151
+ "docs:devtools:metadata": "node scripts/generate-devtools-workspace-metadata.mjs",
149
152
  "docs:serve": "npm run --workspace docs/docusaurus serve",
150
153
  "docs:start": "npm run --workspace docs/docusaurus start",
154
+ "docs:start:devtools": "npm run docs:devtools:metadata && npm run docs:api:local && npm run --workspace docs/docusaurus start:devtools",
151
155
  "docs:toc": "remark docs --use remark-toc --output",
152
156
  "docs:typecheck": "npm run --workspace docs/docusaurus typecheck",
153
157
  "docs:typedoc": "npm run --workspace docs/docusaurus docs:api",
@@ -209,7 +213,7 @@ var package_default = {
209
213
  "open:coverage": "open-cli coverage/index.html",
210
214
  prepublishOnly: "npm run release:check",
211
215
  "release:check": "npm run release:verify",
212
- "release:verify": "npm run build && npm run lint && npm run typecheck && npm run test && npm run sync:readme-rules-table && npm run sync:presets-rules-matrix && npm run docs:check-links && npm pack --dry-run",
216
+ "release:verify": "cross-env NODE_OPTIONS= npm run build && cross-env NODE_OPTIONS= npm run lint && cross-env NODE_OPTIONS= npm run typecheck && cross-env NODE_OPTIONS= VITEST_TYPECHECK=false npm run test && cross-env NODE_OPTIONS= npm run sync:readme-rules-table && cross-env NODE_OPTIONS= npm run sync:presets-rules-matrix && cross-env NODE_OPTIONS= npm run docs:check-links && cross-env NODE_OPTIONS= npm pack --dry-run",
213
217
  "remark:fix": 'remark --rc-path .remarkrc.mjs --silently-ignore --ignore-path .remarkignore --frail --quiet --output -- "*.{md,mdx}" "docs/**/*.{md,mdx}"',
214
218
  "remark:test-config": 'remark --rc-path .remarkrc.mjs --silently-ignore --ignore-path .remarkignore --frail "README.md"',
215
219
  "sync:node-version-files": "node scripts/sync-node-version-files.mjs",
@@ -254,7 +258,7 @@ var package_default = {
254
258
  "@typescript-eslint/type-utils": "^8.57.1",
255
259
  "@typescript-eslint/utils": "^8.57.1",
256
260
  "ts-extras": "^0.17.0",
257
- "type-fest": "^5.4.4"
261
+ "type-fest": "^5.5.0"
258
262
  },
259
263
  devDependencies: {
260
264
  "@arethetypeswrong/cli": "^0.18.2",
@@ -269,26 +273,26 @@ var package_default = {
269
273
  "@eslint/config-inspector": "^1.5.0",
270
274
  "@eslint/css": "^1.0.0",
271
275
  "@eslint/js": "^10.0.1",
272
- "@eslint/json": "^1.1.0",
276
+ "@eslint/json": "^1.2.0",
273
277
  "@eslint/markdown": "^7.5.1",
274
278
  "@html-eslint/eslint-plugin": "^0.58.1",
275
279
  "@html-eslint/parser": "^0.58.1",
276
280
  "@microsoft/eslint-plugin-sdl": "^1.1.0",
277
281
  "@microsoft/tsdoc-config": "^0.18.1",
278
- "@secretlint/secretlint-rule-anthropic": "^11.3.1",
279
- "@secretlint/secretlint-rule-aws": "^11.3.1",
280
- "@secretlint/secretlint-rule-database-connection-string": "^11.3.1",
281
- "@secretlint/secretlint-rule-gcp": "^11.3.1",
282
- "@secretlint/secretlint-rule-github": "^11.3.1",
283
- "@secretlint/secretlint-rule-no-dotenv": "^11.3.1",
284
- "@secretlint/secretlint-rule-no-homedir": "^11.3.1",
285
- "@secretlint/secretlint-rule-npm": "^11.3.1",
286
- "@secretlint/secretlint-rule-openai": "^11.3.1",
287
- "@secretlint/secretlint-rule-pattern": "^11.3.1",
288
- "@secretlint/secretlint-rule-preset-recommend": "^11.3.1",
289
- "@secretlint/secretlint-rule-privatekey": "^11.3.1",
290
- "@secretlint/secretlint-rule-secp256k1-privatekey": "^11.3.1",
291
- "@secretlint/types": "^11.3.1",
282
+ "@secretlint/secretlint-rule-anthropic": "^11.4.0",
283
+ "@secretlint/secretlint-rule-aws": "^11.4.0",
284
+ "@secretlint/secretlint-rule-database-connection-string": "^11.4.0",
285
+ "@secretlint/secretlint-rule-gcp": "^11.4.0",
286
+ "@secretlint/secretlint-rule-github": "^11.4.0",
287
+ "@secretlint/secretlint-rule-no-dotenv": "^11.4.0",
288
+ "@secretlint/secretlint-rule-no-homedir": "^11.4.0",
289
+ "@secretlint/secretlint-rule-npm": "^11.4.0",
290
+ "@secretlint/secretlint-rule-openai": "^11.4.0",
291
+ "@secretlint/secretlint-rule-pattern": "^11.4.0",
292
+ "@secretlint/secretlint-rule-preset-recommend": "^11.4.0",
293
+ "@secretlint/secretlint-rule-privatekey": "^11.4.0",
294
+ "@secretlint/secretlint-rule-secp256k1-privatekey": "^11.4.0",
295
+ "@secretlint/types": "^11.4.0",
292
296
  "@softonus/prettier-plugin-duplicate-remover": "^1.1.2",
293
297
  "@stryker-ignorer/console-all": "^0.3.2",
294
298
  "@stryker-mutator/core": "^9.6.0",
@@ -324,7 +328,7 @@ var package_default = {
324
328
  "cross-env": "^10.1.0",
325
329
  depcheck: "^1.4.7",
326
330
  "detect-secrets": "^1.0.6",
327
- eslint: "^10.0.3",
331
+ eslint: "^10.1.0",
328
332
  "eslint-config-flat-gitignore": "^2.2.1",
329
333
  "eslint-config-prettier": "^10.1.8",
330
334
  "eslint-formatter-unix": "^9.0.1",
@@ -333,14 +337,16 @@ var package_default = {
333
337
  "eslint-plugin-canonical": "^5.1.3",
334
338
  "eslint-plugin-case-police": "^2.2.0",
335
339
  "eslint-plugin-comment-length": "^2.3.0",
340
+ "eslint-plugin-copilot": "^1.0.5",
336
341
  "eslint-plugin-css-modules": "^2.12.0",
337
342
  "eslint-plugin-de-morgan": "^2.1.1",
338
343
  "eslint-plugin-depend": "^1.5.0",
339
344
  "eslint-plugin-eslint-plugin": "^7.3.2",
340
345
  "eslint-plugin-etc": "^2.0.3",
341
- "eslint-plugin-etc-misc": "^1.0.2",
346
+ "eslint-plugin-etc-misc": "^1.0.4",
342
347
  "eslint-plugin-file-progress-2": "^3.4.3",
343
348
  "eslint-plugin-html": "^8.1.4",
349
+ "eslint-plugin-immutable-2": "^1.0.5",
344
350
  "eslint-plugin-import-x": "^4.16.2",
345
351
  "eslint-plugin-jsdoc": "^62.8.0",
346
352
  "eslint-plugin-jsonc": "^3.1.2",
@@ -361,26 +367,28 @@ var package_default = {
361
367
  "eslint-plugin-no-use-extend-native": "^0.7.2",
362
368
  "eslint-plugin-node-dependencies": "^2.2.0",
363
369
  "eslint-plugin-package-json": "^0.91.0",
364
- "eslint-plugin-perfectionist": "^5.6.0",
370
+ "eslint-plugin-perfectionist": "^5.7.0",
365
371
  "eslint-plugin-prefer-arrow": "^1.2.3",
366
372
  "eslint-plugin-prettier": "^5.5.5",
367
373
  "eslint-plugin-promise": "^7.2.1",
368
374
  "eslint-plugin-redos": "^4.5.0",
369
375
  "eslint-plugin-regexp": "^3.1.0",
370
376
  "eslint-plugin-require-jsdoc": "^1.0.4",
377
+ "eslint-plugin-sdl-2": "^1.0.4",
371
378
  "eslint-plugin-security": "^4.0.0",
372
379
  "eslint-plugin-sonarjs": "^4.0.2",
373
380
  "eslint-plugin-sort-class-members": "^1.21.0",
374
- "eslint-plugin-testing-library": "^7.16.0",
381
+ "eslint-plugin-testing-library": "^7.16.1",
375
382
  "eslint-plugin-toml": "^1.3.1",
376
383
  "eslint-plugin-total-functions": "^7.1.0",
377
384
  "eslint-plugin-tsdoc": "^0.5.2",
378
- "eslint-plugin-tsdoc-require-2": "^1.0.5",
379
- "eslint-plugin-typefest": "^1.0.3",
385
+ "eslint-plugin-tsdoc-require-2": "^1.0.6",
386
+ "eslint-plugin-typefest": "^1.0.5",
380
387
  "eslint-plugin-undefined-css-classes": "^0.1.5",
381
388
  "eslint-plugin-unicorn": "^63.0.0",
382
389
  "eslint-plugin-unused-imports": "^4.4.1",
383
390
  "eslint-plugin-write-good-comments": "^0.2.0",
391
+ "eslint-plugin-write-good-comments-2": "^1.0.4",
384
392
  "eslint-plugin-yml": "^3.3.1",
385
393
  "eslint-rule-benchmark": "^0.8.0",
386
394
  "fast-check": "^4.6.0",
@@ -390,11 +398,11 @@ var package_default = {
390
398
  htmlhint: "^1.9.2",
391
399
  jscpd: "^4.0.8",
392
400
  "jsonc-eslint-parser": "^3.1.0",
393
- knip: "^5.87.0",
401
+ knip: "^6.0.1",
394
402
  leasot: "^14.4.0",
395
403
  madge: "^8.0.0",
396
404
  "markdown-link-check": "^3.14.2",
397
- "npm-check-updates": "^19.6.3",
405
+ "npm-check-updates": "^19.6.5",
398
406
  "npm-package-json-lint": "^9.1.0",
399
407
  picocolors: "^1.1.1",
400
408
  postcss: "^8.5.8",
@@ -534,16 +542,17 @@ var package_default = {
534
542
  "remark-validate-links": "^13.1.0",
535
543
  "remark-wiki-link": "^2.0.1",
536
544
  rimraf: "^6.1.3",
537
- secretlint: "^11.3.1",
545
+ secretlint: "^11.4.0",
538
546
  sloc: "^0.3.2",
539
547
  "sort-package-json": "^3.6.1",
540
- stylelint: "^17.4.0",
548
+ stylelint: "^17.5.0",
541
549
  "stylelint-actions-formatters": "^16.3.1",
542
550
  "stylelint-checkstyle-formatter": "^0.1.2",
543
551
  "stylelint-codeframe-formatter": "^1.2.0",
544
552
  "stylelint-config-alphabetical-order": "^2.0.0",
545
553
  "stylelint-config-idiomatic-order": "^10.0.0",
546
- "stylelint-config-recess-order": "^7.6.1",
554
+ "stylelint-config-inspector": "^2.0.2",
555
+ "stylelint-config-recess-order": "^7.7.0",
547
556
  "stylelint-config-recommended": "^18.0.0",
548
557
  "stylelint-config-sass-guidelines": "^13.0.0",
549
558
  "stylelint-config-standard": "^40.0.0",
@@ -551,7 +560,7 @@ var package_default = {
551
560
  "stylelint-config-tailwindcss": "^1.0.1",
552
561
  "stylelint-declaration-block-no-ignored-properties": "^3.0.0",
553
562
  "stylelint-declaration-strict-value": "^1.11.1",
554
- "stylelint-define-config": "^17.2.0",
563
+ "stylelint-define-config": "^17.5.0",
555
564
  "stylelint-find-new-rules": "^6.0.0",
556
565
  "stylelint-formatter-gitlab-code-quality-report": "^1.1.0",
557
566
  "stylelint-formatter-pretty": "^4.0.1",
@@ -565,9 +574,9 @@ var package_default = {
565
574
  "stylelint-no-unresolved-module": "^2.5.2",
566
575
  "stylelint-no-unsupported-browser-features": "^8.1.1",
567
576
  "stylelint-order": "^8.1.1",
568
- "stylelint-plugin-defensive-css": "^2.6.0",
577
+ "stylelint-plugin-defensive-css": "^2.8.0",
569
578
  "stylelint-plugin-logical-css": "^2.0.2",
570
- "stylelint-plugin-use-baseline": "^1.2.7",
579
+ "stylelint-plugin-use-baseline": "^1.4.0",
571
580
  "stylelint-prettier": "^5.0.3",
572
581
  "stylelint-react-native": "^2.7.0",
573
582
  "stylelint-scales": "^5.0.0",
@@ -581,17 +590,17 @@ var package_default = {
581
590
  "typescript-eslint": "^8.57.1",
582
591
  typesync: "^0.14.3",
583
592
  vfile: "^6.0.3",
584
- vite: "^8.0.0",
593
+ vite: "^8.0.1",
585
594
  "vite-tsconfig-paths": "^6.1.1",
586
595
  vitest: "^4.1.0",
587
596
  "yaml-eslint-parser": "^2.0.0",
588
597
  "yamllint-js": "^0.2.4"
589
598
  },
590
599
  peerDependencies: {
591
- eslint: "^9.0.0 || ^10.0.3",
600
+ eslint: "^9.0.0 || ^10.1.0",
592
601
  typescript: ">=5.0.0"
593
602
  },
594
- packageManager: "npm@11.11.1",
603
+ packageManager: "npm@11.12.0",
595
604
  engines: {
596
605
  node: ">=22.0.0"
597
606
  },
@@ -1167,6 +1176,13 @@ var evaluateIsArrayLikeType = ({ candidateType, checker, resolutionCache, seenTy
1167
1176
  resolutionCache.set(candidateType, false);
1168
1177
  return false;
1169
1178
  };
1179
+ var isArrayLikeType = (checker, type, unionMatchMode = "some") => evaluateIsArrayLikeType({
1180
+ candidateType: type,
1181
+ checker,
1182
+ resolutionCache: /* @__PURE__ */ new Map(),
1183
+ seenTypes: /* @__PURE__ */ new Set(),
1184
+ unionMatchMode
1185
+ });
1170
1186
  var getArrayLikeExpressionPrefilterResult = (expression) => {
1171
1187
  if (expression.type === "ArrayExpression") {
1172
1188
  return true;
@@ -2324,7 +2340,16 @@ var orderedRuleNames = [
2324
2340
  "prefer-type-fest-unwrap-tagged",
2325
2341
  "prefer-type-fest-value-of",
2326
2342
  "prefer-type-fest-writable",
2327
- "prefer-type-fest-writable-deep"
2343
+ "prefer-type-fest-writable-deep",
2344
+ "prefer-type-fest-and-all",
2345
+ "prefer-type-fest-array-length",
2346
+ "prefer-type-fest-optional",
2347
+ "prefer-type-fest-or-all",
2348
+ "prefer-type-fest-union-member",
2349
+ "prefer-type-fest-conditional-pick-deep",
2350
+ "prefer-type-fest-union-to-tuple",
2351
+ "prefer-type-fest-less-than",
2352
+ "prefer-type-fest-less-than-or-equal"
2328
2353
  ];
2329
2354
  var toRuleCatalogId = (ruleNumber) => `R${String(ruleNumber).padStart(3, "0")}`;
2330
2355
  var isTypefestRuleNamePattern2 = (ruleName) => ruleName.startsWith("prefer-");
@@ -6609,6 +6634,140 @@ var preferTypeFestAbstractConstructorRule = createTypedRule({
6609
6634
  });
6610
6635
  var prefer_type_fest_abstract_constructor_default = preferTypeFestAbstractConstructorRule;
6611
6636
 
6637
+ // dist/rules/prefer-type-fest-and-all.js
6638
+ var ALL_EXTEND_TYPE_NAME = "AllExtend";
6639
+ var AND_ALL_TYPE_NAME = "AndAll";
6640
+ var isTrueLiteralType = (node) => node.type === "TSLiteralType" && node.literal.type === "Literal" && node.literal.value === true;
6641
+ var preferTypeFestAndAllRule = createTypedRule({
6642
+ create(context) {
6643
+ const typeFestDirectImports = collectDirectNamedImportsFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
6644
+ const allExtendLocalNames = collectNamedImportLocalNamesFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE, ALL_EXTEND_TYPE_NAME);
6645
+ const typeFestNamespaceImportNames = collectNamespaceImportLocalNamesFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
6646
+ const getAllExtendTupleArgumentText = (typeReference) => {
6647
+ const typeArguments = typeReference.typeArguments?.params ?? [];
6648
+ const [tupleArgument, comparedType] = typeArguments;
6649
+ if (!tupleArgument || !comparedType || !isTrueLiteralType(comparedType)) {
6650
+ return null;
6651
+ }
6652
+ if (typeArguments.length !== 2) {
6653
+ return null;
6654
+ }
6655
+ return context.sourceCode.getText(tupleArgument);
6656
+ };
6657
+ const reportIfAllExtendEquivalent = (node) => {
6658
+ const tupleArgumentText = getAllExtendTupleArgumentText(node);
6659
+ if (tupleArgumentText === null || tupleArgumentText.trim().length === 0) {
6660
+ return;
6661
+ }
6662
+ const fix = createSafeTypeNodeTextReplacementFix(node, AND_ALL_TYPE_NAME, `${AND_ALL_TYPE_NAME}<${tupleArgumentText}>`, typeFestDirectImports);
6663
+ reportWithOptionalFix({
6664
+ context,
6665
+ fix,
6666
+ messageId: "preferAndAll",
6667
+ node
6668
+ });
6669
+ };
6670
+ return {
6671
+ 'TSTypeReference[typeName.type="Identifier"]'(typeReference) {
6672
+ if (typeReference.typeName.type !== "Identifier" || !setContainsValue(allExtendLocalNames, typeReference.typeName.name)) {
6673
+ return;
6674
+ }
6675
+ reportIfAllExtendEquivalent(typeReference);
6676
+ },
6677
+ 'TSTypeReference[typeName.type="TSQualifiedName"]'(typeReference) {
6678
+ if (typeReference.typeName.type !== "TSQualifiedName") {
6679
+ return;
6680
+ }
6681
+ if (typeReference.typeName.left.type !== "Identifier" || !setContainsValue(typeFestNamespaceImportNames, typeReference.typeName.left.name) || typeReference.typeName.right.type !== "Identifier" || typeReference.typeName.right.name !== ALL_EXTEND_TYPE_NAME) {
6682
+ return;
6683
+ }
6684
+ reportIfAllExtendEquivalent(typeReference);
6685
+ }
6686
+ };
6687
+ },
6688
+ defaultOptions: [],
6689
+ meta: {
6690
+ deprecated: false,
6691
+ docs: {
6692
+ description: "require TypeFest AndAll over `AllExtend<TTuple, true>` boolean-tuple checks.",
6693
+ frozen: false,
6694
+ recommended: true,
6695
+ requiresTypeChecking: false,
6696
+ typefestConfigs: [
6697
+ "typefest.configs.recommended",
6698
+ "typefest.configs.strict",
6699
+ "typefest.configs.all",
6700
+ "typefest.configs.type-fest/types"
6701
+ ],
6702
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-and-all"
6703
+ },
6704
+ fixable: "code",
6705
+ messages: {
6706
+ preferAndAll: "Prefer `AndAll<TTuple>` from type-fest over `AllExtend<TTuple, true>` for boolean-tuple conjunction checks."
6707
+ },
6708
+ schema: [],
6709
+ type: "suggestion"
6710
+ },
6711
+ name: "prefer-type-fest-and-all"
6712
+ });
6713
+ var prefer_type_fest_and_all_default = preferTypeFestAndAllRule;
6714
+
6715
+ // dist/rules/prefer-type-fest-array-length.js
6716
+ var ARRAY_LENGTH_TYPE_NAME = "ArrayLength";
6717
+ var isLengthIndexType = (node) => node.type === "TSLiteralType" && node.literal.type === "Literal" && node.literal.value === "length";
6718
+ var preferTypeFestArrayLengthRule = createTypedRule({
6719
+ create(context) {
6720
+ const typeFestDirectImports = collectDirectNamedImportsFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
6721
+ const { checker, parserServices } = getTypedRuleServices(context);
6722
+ return {
6723
+ TSIndexedAccessType(node) {
6724
+ if (!isLengthIndexType(node.indexType)) {
6725
+ return;
6726
+ }
6727
+ const objectType = getConstrainedTypeAtLocationWithFallback(checker, node.objectType, parserServices, "prefer-type-fest-array-length-type-resolution-failed");
6728
+ if (!objectType || !isArrayLikeType(checker, objectType, "every")) {
6729
+ return;
6730
+ }
6731
+ const objectTypeText = context.sourceCode.getText(node.objectType);
6732
+ if (objectTypeText.trim().length === 0) {
6733
+ return;
6734
+ }
6735
+ const fix = createSafeTypeNodeTextReplacementFix(node, ARRAY_LENGTH_TYPE_NAME, `${ARRAY_LENGTH_TYPE_NAME}<${objectTypeText}>`, typeFestDirectImports);
6736
+ reportWithOptionalFix({
6737
+ context,
6738
+ fix,
6739
+ messageId: "preferArrayLength",
6740
+ node
6741
+ });
6742
+ }
6743
+ };
6744
+ },
6745
+ defaultOptions: [],
6746
+ meta: {
6747
+ deprecated: false,
6748
+ docs: {
6749
+ description: 'require TypeFest ArrayLength over array and tuple `T["length"]` type queries.',
6750
+ frozen: false,
6751
+ recommended: false,
6752
+ requiresTypeChecking: true,
6753
+ typefestConfigs: [
6754
+ "typefest.configs.recommended-type-checked",
6755
+ "typefest.configs.strict",
6756
+ "typefest.configs.all"
6757
+ ],
6758
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-array-length"
6759
+ },
6760
+ fixable: "code",
6761
+ messages: {
6762
+ preferArrayLength: 'Prefer `ArrayLength<T>` from type-fest over array and tuple `T["length"]` type queries.'
6763
+ },
6764
+ schema: [],
6765
+ type: "suggestion"
6766
+ },
6767
+ name: "prefer-type-fest-array-length"
6768
+ });
6769
+ var prefer_type_fest_array_length_default = preferTypeFestArrayLengthRule;
6770
+
6612
6771
  // dist/_internal/type-reference-node.js
6613
6772
  var isIdentifierTypeReference = (node, identifierName) => node.type === "TSTypeReference" && node.typeName.type === "Identifier" && node.typeName.name === identifierName;
6614
6773
 
@@ -6766,6 +6925,65 @@ var preferTypeFestAsyncReturnTypeRule = createTypedRule({
6766
6925
  });
6767
6926
  var prefer_type_fest_async_return_type_default = preferTypeFestAsyncReturnTypeRule;
6768
6927
 
6928
+ // dist/rules/prefer-type-fest-conditional-pick-deep.js
6929
+ var conditionalPickDeepAliasReplacements = {
6930
+ PickDeepByType: "ConditionalPickDeep",
6931
+ PickDeepByTypes: "ConditionalPickDeep"
6932
+ };
6933
+ var preferTypeFestConditionalPickDeepRule = createTypedRule({
6934
+ create(context) {
6935
+ const importedAliasMatches = collectImportedTypeAliasMatches(context.sourceCode, conditionalPickDeepAliasReplacements);
6936
+ const typeFestDirectImports = collectDirectNamedImportsFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
6937
+ return {
6938
+ 'TSTypeReference[typeName.type="Identifier"]'(node) {
6939
+ if (node.typeName.type !== "Identifier") {
6940
+ return;
6941
+ }
6942
+ const importedAliasMatch = importedAliasMatches.get(node.typeName.name);
6943
+ if (!importedAliasMatch) {
6944
+ return;
6945
+ }
6946
+ const aliasReplacementFix = createSafeTypeReferenceReplacementFix(node, importedAliasMatch.replacementName, typeFestDirectImports);
6947
+ reportWithOptionalFix({
6948
+ context,
6949
+ data: {
6950
+ alias: importedAliasMatch.importedName,
6951
+ replacement: importedAliasMatch.replacementName
6952
+ },
6953
+ fix: aliasReplacementFix,
6954
+ messageId: "preferConditionalPickDeep",
6955
+ node
6956
+ });
6957
+ }
6958
+ };
6959
+ },
6960
+ defaultOptions: [],
6961
+ meta: {
6962
+ deprecated: false,
6963
+ docs: {
6964
+ description: "require TypeFest ConditionalPickDeep over imported aliases such as PickDeepByTypes.",
6965
+ frozen: false,
6966
+ recommended: true,
6967
+ requiresTypeChecking: false,
6968
+ typefestConfigs: [
6969
+ "typefest.configs.recommended",
6970
+ "typefest.configs.strict",
6971
+ "typefest.configs.all",
6972
+ "typefest.configs.type-fest/types"
6973
+ ],
6974
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-conditional-pick-deep"
6975
+ },
6976
+ fixable: "code",
6977
+ messages: {
6978
+ preferConditionalPickDeep: "Prefer `{{replacement}}` from type-fest for deep conditional property filtering instead of legacy alias `{{alias}}`."
6979
+ },
6980
+ schema: [],
6981
+ type: "suggestion"
6982
+ },
6983
+ name: "prefer-type-fest-conditional-pick-deep"
6984
+ });
6985
+ var prefer_type_fest_conditional_pick_deep_default = preferTypeFestConditionalPickDeepRule;
6986
+
6769
6987
  // dist/rules/prefer-type-fest-conditional-pick.js
6770
6988
  var conditionalPickAliasReplacements = {
6771
6989
  PickByTypes: "ConditionalPick"
@@ -7455,6 +7673,236 @@ var preferTypeFestKeysOfUnionRule = createTypedRule({
7455
7673
  });
7456
7674
  var prefer_type_fest_keys_of_union_default = preferTypeFestKeysOfUnionRule;
7457
7675
 
7676
+ // dist/rules/prefer-type-fest-less-than-or-equal.js
7677
+ var GREATER_THAN_TYPE_NAME = "GreaterThan";
7678
+ var LESS_THAN_OR_EQUAL_TYPE_NAME = "LessThanOrEqual";
7679
+ var isLiteralBooleanType = (node, expectedBooleanValue) => node.type === "TSLiteralType" && node.literal.type === "Literal" && node.literal.value === expectedBooleanValue;
7680
+ var isFalseLiteralType = (node) => isLiteralBooleanType(node, false);
7681
+ var isTrueLiteralType2 = (node) => isLiteralBooleanType(node, true);
7682
+ var preferTypeFestLessThanOrEqualRule = createTypedRule({
7683
+ create(context) {
7684
+ const typeFestDirectImports = collectDirectNamedImportsFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
7685
+ const greaterThanLocalNames = collectNamedImportLocalNamesFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE, GREATER_THAN_TYPE_NAME);
7686
+ const typeFestNamespaceImportNames = collectNamespaceImportLocalNamesFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
7687
+ const getComparatorTypeArgumentTexts = (typeReference) => {
7688
+ const typeArguments = typeReference.typeArguments?.params ?? [];
7689
+ const [leftType, rightType] = typeArguments;
7690
+ if (!leftType || !rightType || typeArguments.length !== 2) {
7691
+ return null;
7692
+ }
7693
+ return {
7694
+ leftTypeText: context.sourceCode.getText(leftType),
7695
+ rightTypeText: context.sourceCode.getText(rightType)
7696
+ };
7697
+ };
7698
+ const isGreaterThanTypeReference = (typeReference) => {
7699
+ if (typeReference.typeName.type === "Identifier") {
7700
+ return setContainsValue(greaterThanLocalNames, typeReference.typeName.name);
7701
+ }
7702
+ if (typeReference.typeName.type !== "TSQualifiedName") {
7703
+ return false;
7704
+ }
7705
+ return typeReference.typeName.left.type === "Identifier" && setContainsValue(typeFestNamespaceImportNames, typeReference.typeName.left.name) && typeReference.typeName.right.type === "Identifier" && typeReference.typeName.right.name === GREATER_THAN_TYPE_NAME;
7706
+ };
7707
+ const getComparatorTypeArgumentTextsFromTypeNode = (typeNode) => {
7708
+ if (typeNode.type !== "TSTypeReference") {
7709
+ return null;
7710
+ }
7711
+ if (!isGreaterThanTypeReference(typeNode)) {
7712
+ return null;
7713
+ }
7714
+ return getComparatorTypeArgumentTexts(typeNode);
7715
+ };
7716
+ const getDirectLessThanOrEqualReplacement = (conditionalTypeNode) => {
7717
+ const comparatorTypeArgumentTexts = getComparatorTypeArgumentTextsFromTypeNode(conditionalTypeNode.checkType);
7718
+ if (!comparatorTypeArgumentTexts) {
7719
+ return null;
7720
+ }
7721
+ if (!isTrueLiteralType2(conditionalTypeNode.extendsType) || !isFalseLiteralType(conditionalTypeNode.trueType) || !isTrueLiteralType2(conditionalTypeNode.falseType)) {
7722
+ return null;
7723
+ }
7724
+ return comparatorTypeArgumentTexts;
7725
+ };
7726
+ const getInferWrappedLessThanOrEqualReplacement = (conditionalTypeNode) => {
7727
+ const comparatorTypeArgumentTexts = getComparatorTypeArgumentTextsFromTypeNode(conditionalTypeNode.checkType);
7728
+ if (!comparatorTypeArgumentTexts) {
7729
+ return null;
7730
+ }
7731
+ if (conditionalTypeNode.extendsType.type !== "TSInferType" || conditionalTypeNode.falseType.type !== "TSNeverKeyword" || conditionalTypeNode.trueType.type !== "TSConditionalType") {
7732
+ return null;
7733
+ }
7734
+ const inferIdentifierName = conditionalTypeNode.extendsType.typeParameter.name.name;
7735
+ const innerConditionalTypeNode = conditionalTypeNode.trueType;
7736
+ if (innerConditionalTypeNode.checkType.type !== "TSTypeReference" || innerConditionalTypeNode.checkType.typeName.type !== "Identifier" || innerConditionalTypeNode.checkType.typeName.name !== inferIdentifierName || innerConditionalTypeNode.checkType.typeArguments !== void 0 || !isTrueLiteralType2(innerConditionalTypeNode.extendsType) || !isFalseLiteralType(innerConditionalTypeNode.trueType) || !isTrueLiteralType2(innerConditionalTypeNode.falseType)) {
7737
+ return null;
7738
+ }
7739
+ return comparatorTypeArgumentTexts;
7740
+ };
7741
+ const getLessThanOrEqualReplacementText = (conditionalTypeNode) => {
7742
+ const comparatorTypeArgumentTexts = getDirectLessThanOrEqualReplacement(conditionalTypeNode) ?? getInferWrappedLessThanOrEqualReplacement(conditionalTypeNode);
7743
+ if (!comparatorTypeArgumentTexts) {
7744
+ return null;
7745
+ }
7746
+ return `${LESS_THAN_OR_EQUAL_TYPE_NAME}<${comparatorTypeArgumentTexts.leftTypeText}, ${comparatorTypeArgumentTexts.rightTypeText}>`;
7747
+ };
7748
+ return {
7749
+ TSConditionalType(node) {
7750
+ const replacementText = getLessThanOrEqualReplacementText(node);
7751
+ if (replacementText === null || replacementText.length === 0) {
7752
+ return;
7753
+ }
7754
+ const fix = createSafeTypeNodeTextReplacementFix(node, LESS_THAN_OR_EQUAL_TYPE_NAME, replacementText, typeFestDirectImports);
7755
+ reportWithOptionalFix({
7756
+ context,
7757
+ fix,
7758
+ messageId: "preferLessThanOrEqual",
7759
+ node
7760
+ });
7761
+ }
7762
+ };
7763
+ },
7764
+ defaultOptions: [],
7765
+ meta: {
7766
+ deprecated: false,
7767
+ docs: {
7768
+ description: "require TypeFest LessThanOrEqual over `GreaterThan<A, B> extends true ? false : true` wrappers.",
7769
+ frozen: false,
7770
+ recommended: true,
7771
+ requiresTypeChecking: false,
7772
+ typefestConfigs: [
7773
+ "typefest.configs.recommended",
7774
+ "typefest.configs.strict",
7775
+ "typefest.configs.all",
7776
+ "typefest.configs.type-fest/types"
7777
+ ],
7778
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-less-than-or-equal"
7779
+ },
7780
+ fixable: "code",
7781
+ messages: {
7782
+ preferLessThanOrEqual: "Prefer `LessThanOrEqual<A, B>` from type-fest over wrappers built from `GreaterThan<A, B>`."
7783
+ },
7784
+ schema: [],
7785
+ type: "suggestion"
7786
+ },
7787
+ name: "prefer-type-fest-less-than-or-equal"
7788
+ });
7789
+ var prefer_type_fest_less_than_or_equal_default = preferTypeFestLessThanOrEqualRule;
7790
+
7791
+ // dist/rules/prefer-type-fest-less-than.js
7792
+ var GREATER_THAN_OR_EQUAL_TYPE_NAME = "GreaterThanOrEqual";
7793
+ var LESS_THAN_TYPE_NAME = "LessThan";
7794
+ var isLiteralBooleanType2 = (node, expectedBooleanValue) => node.type === "TSLiteralType" && node.literal.type === "Literal" && node.literal.value === expectedBooleanValue;
7795
+ var isFalseLiteralType2 = (node) => isLiteralBooleanType2(node, false);
7796
+ var isTrueLiteralType3 = (node) => isLiteralBooleanType2(node, true);
7797
+ var preferTypeFestLessThanRule = createTypedRule({
7798
+ create(context) {
7799
+ const typeFestDirectImports = collectDirectNamedImportsFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
7800
+ const greaterThanOrEqualLocalNames = collectNamedImportLocalNamesFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE, GREATER_THAN_OR_EQUAL_TYPE_NAME);
7801
+ const typeFestNamespaceImportNames = collectNamespaceImportLocalNamesFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
7802
+ const getComparatorTypeArgumentTexts = (typeReference) => {
7803
+ const typeArguments = typeReference.typeArguments?.params ?? [];
7804
+ const [leftType, rightType] = typeArguments;
7805
+ if (!leftType || !rightType || typeArguments.length !== 2) {
7806
+ return null;
7807
+ }
7808
+ return {
7809
+ leftTypeText: context.sourceCode.getText(leftType),
7810
+ rightTypeText: context.sourceCode.getText(rightType)
7811
+ };
7812
+ };
7813
+ const isGreaterThanOrEqualTypeReference = (typeReference) => {
7814
+ if (typeReference.typeName.type === "Identifier") {
7815
+ return setContainsValue(greaterThanOrEqualLocalNames, typeReference.typeName.name);
7816
+ }
7817
+ if (typeReference.typeName.type !== "TSQualifiedName") {
7818
+ return false;
7819
+ }
7820
+ return typeReference.typeName.left.type === "Identifier" && setContainsValue(typeFestNamespaceImportNames, typeReference.typeName.left.name) && typeReference.typeName.right.type === "Identifier" && typeReference.typeName.right.name === GREATER_THAN_OR_EQUAL_TYPE_NAME;
7821
+ };
7822
+ const getComparatorTypeArgumentTextsFromTypeNode = (typeNode) => {
7823
+ if (typeNode.type !== "TSTypeReference") {
7824
+ return null;
7825
+ }
7826
+ if (!isGreaterThanOrEqualTypeReference(typeNode)) {
7827
+ return null;
7828
+ }
7829
+ return getComparatorTypeArgumentTexts(typeNode);
7830
+ };
7831
+ const getDirectLessThanReplacement = (conditionalTypeNode) => {
7832
+ const comparatorTypeArgumentTexts = getComparatorTypeArgumentTextsFromTypeNode(conditionalTypeNode.checkType);
7833
+ if (!comparatorTypeArgumentTexts) {
7834
+ return null;
7835
+ }
7836
+ if (!isTrueLiteralType3(conditionalTypeNode.extendsType) || !isFalseLiteralType2(conditionalTypeNode.trueType) || !isTrueLiteralType3(conditionalTypeNode.falseType)) {
7837
+ return null;
7838
+ }
7839
+ return comparatorTypeArgumentTexts;
7840
+ };
7841
+ const getInferWrappedLessThanReplacement = (conditionalTypeNode) => {
7842
+ const comparatorTypeArgumentTexts = getComparatorTypeArgumentTextsFromTypeNode(conditionalTypeNode.checkType);
7843
+ if (!comparatorTypeArgumentTexts) {
7844
+ return null;
7845
+ }
7846
+ if (conditionalTypeNode.extendsType.type !== "TSInferType" || conditionalTypeNode.falseType.type !== "TSNeverKeyword" || conditionalTypeNode.trueType.type !== "TSConditionalType") {
7847
+ return null;
7848
+ }
7849
+ const inferIdentifierName = conditionalTypeNode.extendsType.typeParameter.name.name;
7850
+ const innerConditionalTypeNode = conditionalTypeNode.trueType;
7851
+ if (innerConditionalTypeNode.checkType.type !== "TSTypeReference" || innerConditionalTypeNode.checkType.typeName.type !== "Identifier" || innerConditionalTypeNode.checkType.typeName.name !== inferIdentifierName || innerConditionalTypeNode.checkType.typeArguments !== void 0 || !isTrueLiteralType3(innerConditionalTypeNode.extendsType) || !isFalseLiteralType2(innerConditionalTypeNode.trueType) || !isTrueLiteralType3(innerConditionalTypeNode.falseType)) {
7852
+ return null;
7853
+ }
7854
+ return comparatorTypeArgumentTexts;
7855
+ };
7856
+ const getLessThanReplacementText = (conditionalTypeNode) => {
7857
+ const comparatorTypeArgumentTexts = getDirectLessThanReplacement(conditionalTypeNode) ?? getInferWrappedLessThanReplacement(conditionalTypeNode);
7858
+ if (!comparatorTypeArgumentTexts) {
7859
+ return null;
7860
+ }
7861
+ return `${LESS_THAN_TYPE_NAME}<${comparatorTypeArgumentTexts.leftTypeText}, ${comparatorTypeArgumentTexts.rightTypeText}>`;
7862
+ };
7863
+ return {
7864
+ TSConditionalType(node) {
7865
+ const replacementText = getLessThanReplacementText(node);
7866
+ if (replacementText === null || replacementText.length === 0) {
7867
+ return;
7868
+ }
7869
+ const fix = createSafeTypeNodeTextReplacementFix(node, LESS_THAN_TYPE_NAME, replacementText, typeFestDirectImports);
7870
+ reportWithOptionalFix({
7871
+ context,
7872
+ fix,
7873
+ messageId: "preferLessThan",
7874
+ node
7875
+ });
7876
+ }
7877
+ };
7878
+ },
7879
+ defaultOptions: [],
7880
+ meta: {
7881
+ deprecated: false,
7882
+ docs: {
7883
+ description: "require TypeFest LessThan over `GreaterThanOrEqual<A, B> extends true ? false : true` wrappers.",
7884
+ frozen: false,
7885
+ recommended: true,
7886
+ requiresTypeChecking: false,
7887
+ typefestConfigs: [
7888
+ "typefest.configs.recommended",
7889
+ "typefest.configs.strict",
7890
+ "typefest.configs.all",
7891
+ "typefest.configs.type-fest/types"
7892
+ ],
7893
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-less-than"
7894
+ },
7895
+ fixable: "code",
7896
+ messages: {
7897
+ preferLessThan: "Prefer `LessThan<A, B>` from type-fest over wrappers built from `GreaterThanOrEqual<A, B>`."
7898
+ },
7899
+ schema: [],
7900
+ type: "suggestion"
7901
+ },
7902
+ name: "prefer-type-fest-less-than"
7903
+ });
7904
+ var prefer_type_fest_less_than_default = preferTypeFestLessThanRule;
7905
+
7458
7906
  // dist/rules/prefer-type-fest-literal-union.js
7459
7907
  var import_ts_extras35 = require("ts-extras");
7460
7908
  var literalUnionFamilies = [
@@ -7780,6 +8228,192 @@ var preferTypeFestOmitIndexSignatureRule = createTypedRule({
7780
8228
  });
7781
8229
  var prefer_type_fest_omit_index_signature_default = preferTypeFestOmitIndexSignatureRule;
7782
8230
 
8231
+ // dist/rules/prefer-type-fest-optional.js
8232
+ var import_ts_extras36 = require("ts-extras");
8233
+ var OPTIONAL_TYPE_NAME = "Optional";
8234
+ var EXCLUDE_TYPE_NAME = "Exclude";
8235
+ var NON_NULLABLE_TYPE_NAME = "NonNullable";
8236
+ var isNullKeywordType = (node) => node.type === "TSNullKeyword";
8237
+ var isUndefinedKeywordType = (node) => node.type === "TSUndefinedKeyword";
8238
+ var isNullishDeleteType = (node) => {
8239
+ if (isNullKeywordType(node)) {
8240
+ return true;
8241
+ }
8242
+ if (node.type !== "TSUnionType" || node.types.length !== 2) {
8243
+ return false;
8244
+ }
8245
+ let hasNull = false;
8246
+ let hasUndefined = false;
8247
+ for (const member of node.types) {
8248
+ if (isNullKeywordType(member)) {
8249
+ hasNull = true;
8250
+ continue;
8251
+ }
8252
+ if (isUndefinedKeywordType(member)) {
8253
+ hasUndefined = true;
8254
+ continue;
8255
+ }
8256
+ return false;
8257
+ }
8258
+ return hasNull && hasUndefined;
8259
+ };
8260
+ var getOptionalInnerTypeText = ({ sourceCode, typeNode }) => {
8261
+ if (typeNode.type !== "TSTypeReference" || typeNode.typeName.type !== "Identifier") {
8262
+ return null;
8263
+ }
8264
+ const typeArguments = typeNode.typeArguments?.params ?? [];
8265
+ if (typeNode.typeName.name === NON_NULLABLE_TYPE_NAME) {
8266
+ const [innerType2] = typeArguments;
8267
+ return innerType2 ? sourceCode.getText(innerType2) : null;
8268
+ }
8269
+ if (typeNode.typeName.name !== EXCLUDE_TYPE_NAME) {
8270
+ return null;
8271
+ }
8272
+ const [innerType, deletedType] = typeArguments;
8273
+ if (!innerType || !deletedType || !isNullishDeleteType(deletedType)) {
8274
+ return null;
8275
+ }
8276
+ return sourceCode.getText(innerType);
8277
+ };
8278
+ var preferTypeFestOptionalRule = createTypedRule({
8279
+ create(context) {
8280
+ const typeFestDirectImports = collectDirectNamedImportsFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
8281
+ return {
8282
+ TSUnionType(node) {
8283
+ if (node.types.length !== 2) {
8284
+ return;
8285
+ }
8286
+ const firstMember = (0, import_ts_extras36.arrayFirst)(node.types);
8287
+ const secondMember = (0, import_ts_extras36.arrayAt)(node.types, 1);
8288
+ if (!firstMember || !secondMember) {
8289
+ return;
8290
+ }
8291
+ const optionalEquivalentMember = isUndefinedKeywordType(firstMember) ? secondMember : isUndefinedKeywordType(secondMember) ? firstMember : null;
8292
+ if (!optionalEquivalentMember) {
8293
+ return;
8294
+ }
8295
+ const innerTypeText = getOptionalInnerTypeText({
8296
+ sourceCode: context.sourceCode,
8297
+ typeNode: optionalEquivalentMember
8298
+ });
8299
+ if (innerTypeText === null || innerTypeText.trim().length === 0) {
8300
+ return;
8301
+ }
8302
+ const fix = createSafeTypeNodeTextReplacementFix(node, OPTIONAL_TYPE_NAME, `${OPTIONAL_TYPE_NAME}<${innerTypeText}>`, typeFestDirectImports);
8303
+ reportWithOptionalFix({
8304
+ context,
8305
+ fix,
8306
+ messageId: "preferOptional",
8307
+ node
8308
+ });
8309
+ }
8310
+ };
8311
+ },
8312
+ defaultOptions: [],
8313
+ meta: {
8314
+ deprecated: false,
8315
+ docs: {
8316
+ description: "require TypeFest Optional over `Exclude<T, null> | undefined` and `NonNullable<T> | undefined` patterns.",
8317
+ frozen: false,
8318
+ recommended: true,
8319
+ requiresTypeChecking: false,
8320
+ typefestConfigs: [
8321
+ "typefest.configs.recommended",
8322
+ "typefest.configs.strict",
8323
+ "typefest.configs.all",
8324
+ "typefest.configs.type-fest/types"
8325
+ ],
8326
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-optional"
8327
+ },
8328
+ fixable: "code",
8329
+ messages: {
8330
+ preferOptional: "Prefer `Optional<T>` from type-fest over `Exclude<T, null> | undefined` and equivalent optional-value patterns."
8331
+ },
8332
+ schema: [],
8333
+ type: "suggestion"
8334
+ },
8335
+ name: "prefer-type-fest-optional"
8336
+ });
8337
+ var prefer_type_fest_optional_default = preferTypeFestOptionalRule;
8338
+
8339
+ // dist/rules/prefer-type-fest-or-all.js
8340
+ var SOME_EXTEND_TYPE_NAME = "SomeExtend";
8341
+ var OR_ALL_TYPE_NAME = "OrAll";
8342
+ var isTrueLiteralType4 = (node) => node.type === "TSLiteralType" && node.literal.type === "Literal" && node.literal.value === true;
8343
+ var preferTypeFestOrAllRule = createTypedRule({
8344
+ create(context) {
8345
+ const typeFestDirectImports = collectDirectNamedImportsFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
8346
+ const someExtendLocalNames = collectNamedImportLocalNamesFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE, SOME_EXTEND_TYPE_NAME);
8347
+ const typeFestNamespaceImportNames = collectNamespaceImportLocalNamesFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
8348
+ const getSomeExtendTupleArgumentText = (typeReference) => {
8349
+ const typeArguments = typeReference.typeArguments?.params ?? [];
8350
+ const [tupleArgument, comparedType] = typeArguments;
8351
+ if (!tupleArgument || !comparedType || !isTrueLiteralType4(comparedType)) {
8352
+ return null;
8353
+ }
8354
+ if (typeArguments.length !== 2) {
8355
+ return null;
8356
+ }
8357
+ return context.sourceCode.getText(tupleArgument);
8358
+ };
8359
+ const reportIfSomeExtendEquivalent = (node) => {
8360
+ const tupleArgumentText = getSomeExtendTupleArgumentText(node);
8361
+ if (tupleArgumentText === null || tupleArgumentText.trim().length === 0) {
8362
+ return;
8363
+ }
8364
+ const fix = createSafeTypeNodeTextReplacementFix(node, OR_ALL_TYPE_NAME, `${OR_ALL_TYPE_NAME}<${tupleArgumentText}>`, typeFestDirectImports);
8365
+ reportWithOptionalFix({
8366
+ context,
8367
+ fix,
8368
+ messageId: "preferOrAll",
8369
+ node
8370
+ });
8371
+ };
8372
+ return {
8373
+ 'TSTypeReference[typeName.type="Identifier"]'(typeReference) {
8374
+ if (typeReference.typeName.type !== "Identifier" || !setContainsValue(someExtendLocalNames, typeReference.typeName.name)) {
8375
+ return;
8376
+ }
8377
+ reportIfSomeExtendEquivalent(typeReference);
8378
+ },
8379
+ 'TSTypeReference[typeName.type="TSQualifiedName"]'(typeReference) {
8380
+ if (typeReference.typeName.type !== "TSQualifiedName") {
8381
+ return;
8382
+ }
8383
+ if (typeReference.typeName.left.type !== "Identifier" || !setContainsValue(typeFestNamespaceImportNames, typeReference.typeName.left.name) || typeReference.typeName.right.type !== "Identifier" || typeReference.typeName.right.name !== SOME_EXTEND_TYPE_NAME) {
8384
+ return;
8385
+ }
8386
+ reportIfSomeExtendEquivalent(typeReference);
8387
+ }
8388
+ };
8389
+ },
8390
+ defaultOptions: [],
8391
+ meta: {
8392
+ deprecated: false,
8393
+ docs: {
8394
+ description: "require TypeFest OrAll over `SomeExtend<TTuple, true>` boolean-tuple checks.",
8395
+ frozen: false,
8396
+ recommended: true,
8397
+ requiresTypeChecking: false,
8398
+ typefestConfigs: [
8399
+ "typefest.configs.recommended",
8400
+ "typefest.configs.strict",
8401
+ "typefest.configs.all",
8402
+ "typefest.configs.type-fest/types"
8403
+ ],
8404
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-or-all"
8405
+ },
8406
+ fixable: "code",
8407
+ messages: {
8408
+ preferOrAll: "Prefer `OrAll<TTuple>` from type-fest over `SomeExtend<TTuple, true>` for boolean-tuple disjunction checks."
8409
+ },
8410
+ schema: [],
8411
+ type: "suggestion"
8412
+ },
8413
+ name: "prefer-type-fest-or-all"
8414
+ });
8415
+ var prefer_type_fest_or_all_default = preferTypeFestOrAllRule;
8416
+
7783
8417
  // dist/rules/prefer-type-fest-partial-deep.js
7784
8418
  var preferTypeFestPartialDeepRule = createTypedRule({
7785
8419
  create(context) {
@@ -7899,7 +8533,7 @@ var preferTypeFestPrimitiveRule = createTypedRule({
7899
8533
  var prefer_type_fest_primitive_default = preferTypeFestPrimitiveRule;
7900
8534
 
7901
8535
  // dist/rules/prefer-type-fest-promisable.js
7902
- var import_ts_extras36 = require("ts-extras");
8536
+ var import_ts_extras37 = require("ts-extras");
7903
8537
  var PROMISABLE_TYPE_NAME = "Promisable";
7904
8538
  var PROMISE_TYPE_NAME = "Promise";
7905
8539
  var promisableAliasReplacements = {
@@ -7915,10 +8549,10 @@ var getPromiseInnerType = (node) => {
7915
8549
  return null;
7916
8550
  }
7917
8551
  const typeArguments = node.typeArguments?.params;
7918
- if (!(0, import_ts_extras36.isDefined)(typeArguments)) {
8552
+ if (!(0, import_ts_extras37.isDefined)(typeArguments)) {
7919
8553
  return null;
7920
8554
  }
7921
- return (0, import_ts_extras36.arrayFirst)(typeArguments) ?? null;
8555
+ return (0, import_ts_extras37.arrayFirst)(typeArguments) ?? null;
7922
8556
  };
7923
8557
  var preferTypeFestPromisableRule = createTypedRule({
7924
8558
  create(context, [options] = defaultOptions3) {
@@ -8979,6 +9613,195 @@ var preferTypeFestTupleOfRule = createTypedRule({
8979
9613
  });
8980
9614
  var prefer_type_fest_tuple_of_default = preferTypeFestTupleOfRule;
8981
9615
 
9616
+ // dist/rules/prefer-type-fest-union-member.js
9617
+ var import_ts_extras38 = require("ts-extras");
9618
+ var UNION_MEMBER_TYPE_NAME = "UnionMember";
9619
+ var UNION_TO_INTERSECTION_TYPE_NAME = "UnionToIntersection";
9620
+ var IS_NEVER_TYPE_NAME = "IsNever";
9621
+ var isIdentifierTypeReferenceNamed = (node, name) => node.type === "TSTypeReference" && node.typeName.type === "Identifier" && node.typeName.name === name;
9622
+ var isBooleanLiteralType = (node, expectedValue) => node.type === "TSLiteralType" && node.literal.type === "Literal" && node.literal.value === expectedValue;
9623
+ var getUnionArgumentTextFromDistributiveFunctionWrapper = ({ node, sourceCode }) => {
9624
+ if (node.type !== "TSConditionalType") {
9625
+ return null;
9626
+ }
9627
+ if (node.extendsType.type !== "TSAnyKeyword" || node.falseType.type !== "TSNeverKeyword") {
9628
+ return null;
9629
+ }
9630
+ if (node.trueType.type !== "TSFunctionType") {
9631
+ return null;
9632
+ }
9633
+ const returnType = node.trueType.returnType?.typeAnnotation;
9634
+ if (!returnType) {
9635
+ return null;
9636
+ }
9637
+ const checkTypeText = sourceCode.getText(node.checkType);
9638
+ const returnTypeText = sourceCode.getText(returnType);
9639
+ return checkTypeText === returnTypeText ? checkTypeText : null;
9640
+ };
9641
+ var getUnionArgumentTextFromExtractor = ({ node, sourceCode }) => {
9642
+ if (node.falseType.type !== "TSNeverKeyword") {
9643
+ return null;
9644
+ }
9645
+ if (!isIdentifierTypeReferenceNamed(node.checkType, UNION_TO_INTERSECTION_TYPE_NAME)) {
9646
+ return null;
9647
+ }
9648
+ const extractorArgument = (0, import_ts_extras38.arrayFirst)(node.checkType.typeArguments?.params ?? []);
9649
+ if (!extractorArgument) {
9650
+ return null;
9651
+ }
9652
+ const unionArgumentText = getUnionArgumentTextFromDistributiveFunctionWrapper({
9653
+ node: extractorArgument,
9654
+ sourceCode
9655
+ });
9656
+ if (unionArgumentText === null) {
9657
+ return null;
9658
+ }
9659
+ if (node.extendsType.type !== "TSFunctionType") {
9660
+ return null;
9661
+ }
9662
+ const inferredReturnType = node.extendsType.returnType?.typeAnnotation;
9663
+ const inferredTypeParameterName = inferredReturnType?.type === "TSInferType" ? inferredReturnType.typeParameter.name.name : null;
9664
+ if (inferredTypeParameterName === null || node.trueType.type !== "TSTypeReference" || node.trueType.typeName.type !== "Identifier" || node.trueType.typeName.name !== inferredTypeParameterName) {
9665
+ return null;
9666
+ }
9667
+ return unionArgumentText;
9668
+ };
9669
+ var getUnionMemberEquivalentArgumentText = ({ node, sourceCode }) => {
9670
+ if (node.type !== "TSConditionalType") {
9671
+ return null;
9672
+ }
9673
+ const directExtractorText = getUnionArgumentTextFromExtractor({
9674
+ node,
9675
+ sourceCode
9676
+ });
9677
+ if (directExtractorText !== null) {
9678
+ return directExtractorText;
9679
+ }
9680
+ if (!isIdentifierTypeReferenceNamed(node.checkType, IS_NEVER_TYPE_NAME) || !isBooleanLiteralType(node.extendsType, true) || node.trueType.type !== "TSNeverKeyword") {
9681
+ return null;
9682
+ }
9683
+ const guardedArgument = (0, import_ts_extras38.arrayFirst)(node.checkType.typeArguments?.params ?? []);
9684
+ if (!guardedArgument) {
9685
+ return null;
9686
+ }
9687
+ const guardedArgumentText = sourceCode.getText(guardedArgument);
9688
+ if (node.falseType.type !== "TSConditionalType") {
9689
+ return null;
9690
+ }
9691
+ const extractorText = getUnionArgumentTextFromExtractor({
9692
+ node: node.falseType,
9693
+ sourceCode
9694
+ });
9695
+ return extractorText === guardedArgumentText ? extractorText : null;
9696
+ };
9697
+ var preferTypeFestUnionMemberRule = createTypedRule({
9698
+ create(context) {
9699
+ const typeFestDirectImports = collectDirectNamedImportsFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
9700
+ return {
9701
+ TSTypeAliasDeclaration(node) {
9702
+ const unionArgumentText = getUnionMemberEquivalentArgumentText({
9703
+ node: node.typeAnnotation,
9704
+ sourceCode: context.sourceCode
9705
+ });
9706
+ if (unionArgumentText === null || unionArgumentText.trim().length === 0) {
9707
+ return;
9708
+ }
9709
+ const fix = createSafeTypeNodeTextReplacementFix(node.typeAnnotation, UNION_MEMBER_TYPE_NAME, `${UNION_MEMBER_TYPE_NAME}<${unionArgumentText}>`, typeFestDirectImports);
9710
+ reportWithOptionalFix({
9711
+ context,
9712
+ fix,
9713
+ messageId: "preferUnionMember",
9714
+ node: node.typeAnnotation
9715
+ });
9716
+ }
9717
+ };
9718
+ },
9719
+ defaultOptions: [],
9720
+ meta: {
9721
+ deprecated: false,
9722
+ docs: {
9723
+ description: "require TypeFest UnionMember over custom union-member extraction helpers based on `UnionToIntersection`.",
9724
+ frozen: false,
9725
+ recommended: true,
9726
+ requiresTypeChecking: false,
9727
+ typefestConfigs: [
9728
+ "typefest.configs.recommended",
9729
+ "typefest.configs.strict",
9730
+ "typefest.configs.all",
9731
+ "typefest.configs.type-fest/types"
9732
+ ],
9733
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-union-member"
9734
+ },
9735
+ fixable: "code",
9736
+ messages: {
9737
+ preferUnionMember: "Prefer `UnionMember<T>` from type-fest over custom union-member extraction helpers based on `UnionToIntersection`."
9738
+ },
9739
+ schema: [],
9740
+ type: "suggestion"
9741
+ },
9742
+ name: "prefer-type-fest-union-member"
9743
+ });
9744
+ var prefer_type_fest_union_member_default = preferTypeFestUnionMemberRule;
9745
+
9746
+ // dist/rules/prefer-type-fest-union-to-tuple.js
9747
+ var unionToTupleAliasReplacements = {
9748
+ TupleFromUnion: "UnionToTuple",
9749
+ TuplifyUnion: "UnionToTuple"
9750
+ };
9751
+ var preferTypeFestUnionToTupleRule = createTypedRule({
9752
+ create(context) {
9753
+ const importedAliasMatches = collectImportedTypeAliasMatches(context.sourceCode, unionToTupleAliasReplacements);
9754
+ const typeFestDirectImports = collectDirectNamedImportsFromSource(context.sourceCode, TYPE_FEST_MODULE_SOURCE);
9755
+ return {
9756
+ 'TSTypeReference[typeName.type="Identifier"]'(node) {
9757
+ if (node.typeName.type !== "Identifier") {
9758
+ return;
9759
+ }
9760
+ const importedAliasMatch = importedAliasMatches.get(node.typeName.name);
9761
+ if (!importedAliasMatch) {
9762
+ return;
9763
+ }
9764
+ const aliasReplacementFix = createSafeTypeReferenceReplacementFix(node, importedAliasMatch.replacementName, typeFestDirectImports);
9765
+ reportWithOptionalFix({
9766
+ context,
9767
+ data: {
9768
+ alias: importedAliasMatch.importedName,
9769
+ replacement: importedAliasMatch.replacementName
9770
+ },
9771
+ fix: aliasReplacementFix,
9772
+ messageId: "preferUnionToTuple",
9773
+ node
9774
+ });
9775
+ }
9776
+ };
9777
+ },
9778
+ defaultOptions: [],
9779
+ meta: {
9780
+ deprecated: false,
9781
+ docs: {
9782
+ description: "require TypeFest UnionToTuple over imported aliases such as TuplifyUnion.",
9783
+ frozen: false,
9784
+ recommended: true,
9785
+ requiresTypeChecking: false,
9786
+ typefestConfigs: [
9787
+ "typefest.configs.recommended",
9788
+ "typefest.configs.strict",
9789
+ "typefest.configs.all",
9790
+ "typefest.configs.type-fest/types"
9791
+ ],
9792
+ url: "https://nick2bad4u.github.io/eslint-plugin-typefest/docs/rules/prefer-type-fest-union-to-tuple"
9793
+ },
9794
+ fixable: "code",
9795
+ messages: {
9796
+ preferUnionToTuple: "Prefer `{{replacement}}` from type-fest to convert unions into tuple forms instead of legacy alias `{{alias}}`."
9797
+ },
9798
+ schema: [],
9799
+ type: "suggestion"
9800
+ },
9801
+ name: "prefer-type-fest-union-to-tuple"
9802
+ });
9803
+ var prefer_type_fest_union_to_tuple_default = preferTypeFestUnionToTupleRule;
9804
+
8982
9805
  // dist/rules/prefer-type-fest-unknown-array.js
8983
9806
  var READONLY_ARRAY_TYPE_NAME2 = "ReadonlyArray";
8984
9807
  var UNKNOWN_ARRAY_TYPE_NAME = "UnknownArray";
@@ -9532,9 +10355,12 @@ var typefestRuleRegistry = {
9532
10355
  "prefer-ts-extras-set-has": prefer_ts_extras_set_has_default,
9533
10356
  "prefer-ts-extras-string-split": prefer_ts_extras_string_split_default,
9534
10357
  "prefer-type-fest-abstract-constructor": prefer_type_fest_abstract_constructor_default,
10358
+ "prefer-type-fest-and-all": prefer_type_fest_and_all_default,
10359
+ "prefer-type-fest-array-length": prefer_type_fest_array_length_default,
9535
10360
  "prefer-type-fest-arrayable": prefer_type_fest_arrayable_default,
9536
10361
  "prefer-type-fest-async-return-type": prefer_type_fest_async_return_type_default,
9537
10362
  "prefer-type-fest-conditional-pick": prefer_type_fest_conditional_pick_default,
10363
+ "prefer-type-fest-conditional-pick-deep": prefer_type_fest_conditional_pick_deep_default,
9538
10364
  "prefer-type-fest-constructor": prefer_type_fest_constructor_default,
9539
10365
  "prefer-type-fest-except": prefer_type_fest_except_default,
9540
10366
  "prefer-type-fest-if": prefer_type_fest_if_default,
@@ -9544,10 +10370,14 @@ var typefestRuleRegistry = {
9544
10370
  "prefer-type-fest-json-primitive": prefer_type_fest_json_primitive_default,
9545
10371
  "prefer-type-fest-json-value": prefer_type_fest_json_value_default,
9546
10372
  "prefer-type-fest-keys-of-union": prefer_type_fest_keys_of_union_default,
10373
+ "prefer-type-fest-less-than": prefer_type_fest_less_than_default,
10374
+ "prefer-type-fest-less-than-or-equal": prefer_type_fest_less_than_or_equal_default,
9547
10375
  "prefer-type-fest-literal-union": prefer_type_fest_literal_union_default,
9548
10376
  "prefer-type-fest-merge-exclusive": prefer_type_fest_merge_exclusive_default,
9549
10377
  "prefer-type-fest-non-empty-tuple": prefer_type_fest_non_empty_tuple_default,
9550
10378
  "prefer-type-fest-omit-index-signature": prefer_type_fest_omit_index_signature_default,
10379
+ "prefer-type-fest-optional": prefer_type_fest_optional_default,
10380
+ "prefer-type-fest-or-all": prefer_type_fest_or_all_default,
9551
10381
  "prefer-type-fest-partial-deep": prefer_type_fest_partial_deep_default,
9552
10382
  "prefer-type-fest-primitive": prefer_type_fest_primitive_default,
9553
10383
  "prefer-type-fest-promisable": prefer_type_fest_promisable_default,
@@ -9565,6 +10395,8 @@ var typefestRuleRegistry = {
9565
10395
  "prefer-type-fest-simplify": prefer_type_fest_simplify_default,
9566
10396
  "prefer-type-fest-tagged-brands": prefer_type_fest_tagged_brands_default,
9567
10397
  "prefer-type-fest-tuple-of": prefer_type_fest_tuple_of_default,
10398
+ "prefer-type-fest-union-member": prefer_type_fest_union_member_default,
10399
+ "prefer-type-fest-union-to-tuple": prefer_type_fest_union_to_tuple_default,
9568
10400
  "prefer-type-fest-unknown-array": prefer_type_fest_unknown_array_default,
9569
10401
  "prefer-type-fest-unknown-map": prefer_type_fest_unknown_map_default,
9570
10402
  "prefer-type-fest-unknown-record": prefer_type_fest_unknown_record_default,
@@ -9586,7 +10418,7 @@ function getPackageVersion(pkg) {
9586
10418
  const version = Reflect.get(pkg, "version");
9587
10419
  return typeof version === "string" ? version : "0.0.0";
9588
10420
  }
9589
- var packageJsonValue = (0, import_ts_extras37.safeCastTo)(package_default);
10421
+ var packageJsonValue = (0, import_ts_extras39.safeCastTo)(package_default);
9590
10422
  var typeScriptParserValue = import_parser3.default;
9591
10423
  var defaultParserOptions = {
9592
10424
  ecmaVersion: "latest",
@@ -9594,10 +10426,10 @@ var defaultParserOptions = {
9594
10426
  };
9595
10427
  var normalizeParserOptions = (parserOptions) => parserOptions !== null && typeof parserOptions === "object" && !Array.isArray(parserOptions) ? { ...parserOptions } : { ...defaultParserOptions };
9596
10428
  var typefestEslintRules = typefestRules;
9597
- var isTypefestRuleName = (value) => (0, import_ts_extras37.objectHasIn)(typefestRules, value);
10429
+ var isTypefestRuleName = (value) => (0, import_ts_extras39.objectHasIn)(typefestRules, value);
9598
10430
  var typefestRuleEntries = (() => {
9599
10431
  const entries = [];
9600
- for (const [ruleName] of (0, import_ts_extras37.objectEntries)(typefestRules)) {
10432
+ for (const [ruleName] of (0, import_ts_extras39.objectEntries)(typefestRules)) {
9601
10433
  if (!isTypefestRuleName(ruleName)) {
9602
10434
  continue;
9603
10435
  }
@@ -9624,7 +10456,7 @@ var derivePresetRuleNamesByConfig = () => {
9624
10456
  const presetRuleNamesByConfig2 = createEmptyPresetRuleMap();
9625
10457
  for (const [ruleName] of typefestRuleEntries) {
9626
10458
  const configNames = rulePresetMembership[ruleName];
9627
- if (!(0, import_ts_extras37.isDefined)(configNames) || (0, import_ts_extras37.isEmpty)(configNames)) {
10459
+ if (!(0, import_ts_extras39.isDefined)(configNames) || (0, import_ts_extras39.isEmpty)(configNames)) {
9628
10460
  throw new TypeError(`Rule '${ruleName}' is missing preset membership metadata.`);
9629
10461
  }
9630
10462
  for (const configName of configNames) {
@@ -9651,7 +10483,7 @@ function errorRulesFor(ruleNames) {
9651
10483
  var presetRuleNamesByConfig = derivePresetRuleNamesByConfig();
9652
10484
  var recommendedRuleNames = [];
9653
10485
  for (const ruleName of presetRuleNamesByConfig.recommended) {
9654
- if ((0, import_ts_extras37.setHas)(typeCheckedRuleNames, ruleName)) {
10486
+ if ((0, import_ts_extras39.setHas)(typeCheckedRuleNames, ruleName)) {
9655
10487
  continue;
9656
10488
  }
9657
10489
  recommendedRuleNames.push(ruleName);
@@ -9669,7 +10501,7 @@ function withTypefestPlugin(config, plugin, options) {
9669
10501
  const existingLanguageOptions = config.languageOptions ?? {};
9670
10502
  const existingParserOptions = existingLanguageOptions["parserOptions"];
9671
10503
  const parserOptions = normalizeParserOptions(existingParserOptions);
9672
- if (options.requiresTypeChecking && !(0, import_ts_extras37.objectHasIn)(parserOptions, "projectService")) {
10504
+ if (options.requiresTypeChecking && !(0, import_ts_extras39.objectHasIn)(parserOptions, "projectService")) {
9673
10505
  Reflect.set(parserOptions, "projectService", true);
9674
10506
  }
9675
10507
  const languageOptions = {