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.
- package/README.md +88 -79
- package/dist/_internal/rule-catalog.d.ts.map +1 -1
- package/dist/_internal/rule-catalog.js +9 -0
- package/dist/_internal/rule-catalog.js.map +1 -1
- package/dist/_internal/rules-registry.d.ts.map +1 -1
- package/dist/_internal/rules-registry.js +18 -0
- package/dist/_internal/rules-registry.js.map +1 -1
- package/dist/plugin.cjs +880 -48
- package/dist/plugin.cjs.map +4 -4
- package/dist/rules/prefer-type-fest-and-all.d.ts +13 -0
- package/dist/rules/prefer-type-fest-and-all.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-and-all.js +105 -0
- package/dist/rules/prefer-type-fest-and-all.js.map +1 -0
- package/dist/rules/prefer-type-fest-array-length.d.ts +13 -0
- package/dist/rules/prefer-type-fest-array-length.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-array-length.js +77 -0
- package/dist/rules/prefer-type-fest-array-length.js.map +1 -0
- package/dist/rules/prefer-type-fest-conditional-pick-deep.d.ts +13 -0
- package/dist/rules/prefer-type-fest-conditional-pick-deep.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-conditional-pick-deep.js +75 -0
- package/dist/rules/prefer-type-fest-conditional-pick-deep.js.map +1 -0
- package/dist/rules/prefer-type-fest-less-than-or-equal.d.ts +13 -0
- package/dist/rules/prefer-type-fest-less-than-or-equal.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-less-than-or-equal.js +153 -0
- package/dist/rules/prefer-type-fest-less-than-or-equal.js.map +1 -0
- package/dist/rules/prefer-type-fest-less-than.d.ts +13 -0
- package/dist/rules/prefer-type-fest-less-than.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-less-than.js +154 -0
- package/dist/rules/prefer-type-fest-less-than.js.map +1 -0
- package/dist/rules/prefer-type-fest-optional.d.ts +13 -0
- package/dist/rules/prefer-type-fest-optional.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-optional.js +130 -0
- package/dist/rules/prefer-type-fest-optional.js.map +1 -0
- package/dist/rules/prefer-type-fest-or-all.d.ts +13 -0
- package/dist/rules/prefer-type-fest-or-all.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-or-all.js +105 -0
- package/dist/rules/prefer-type-fest-or-all.js.map +1 -0
- package/dist/rules/prefer-type-fest-union-member.d.ts +13 -0
- package/dist/rules/prefer-type-fest-union-member.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-union-member.js +159 -0
- package/dist/rules/prefer-type-fest-union-member.js.map +1 -0
- package/dist/rules/prefer-type-fest-union-to-tuple.d.ts +13 -0
- package/dist/rules/prefer-type-fest-union-to-tuple.d.ts.map +1 -0
- package/dist/rules/prefer-type-fest-union-to-tuple.js +75 -0
- package/dist/rules/prefer-type-fest-union-to-tuple.js.map +1 -0
- package/docs/rules/prefer-type-fest-and-all.md +111 -0
- package/docs/rules/prefer-type-fest-array-length.md +109 -0
- package/docs/rules/prefer-type-fest-conditional-pick-deep.md +112 -0
- package/docs/rules/prefer-type-fest-less-than-or-equal.md +111 -0
- package/docs/rules/prefer-type-fest-less-than.md +111 -0
- package/docs/rules/prefer-type-fest-optional.md +104 -0
- package/docs/rules/prefer-type-fest-or-all.md +111 -0
- package/docs/rules/prefer-type-fest-union-member.md +119 -0
- package/docs/rules/prefer-type-fest-union-to-tuple.md +108 -0
- package/docs/rules/presets/all.md +9 -0
- package/docs/rules/presets/index.md +87 -78
- package/docs/rules/presets/recommended-type-checked.md +74 -65
- package/docs/rules/presets/recommended.md +8 -0
- package/docs/rules/presets/strict.md +9 -0
- package/docs/rules/presets/type-fest-types.md +8 -0
- 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
|
|
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.
|
|
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://
|
|
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://
|
|
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.
|
|
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.
|
|
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.
|
|
279
|
-
"@secretlint/secretlint-rule-aws": "^11.
|
|
280
|
-
"@secretlint/secretlint-rule-database-connection-string": "^11.
|
|
281
|
-
"@secretlint/secretlint-rule-gcp": "^11.
|
|
282
|
-
"@secretlint/secretlint-rule-github": "^11.
|
|
283
|
-
"@secretlint/secretlint-rule-no-dotenv": "^11.
|
|
284
|
-
"@secretlint/secretlint-rule-no-homedir": "^11.
|
|
285
|
-
"@secretlint/secretlint-rule-npm": "^11.
|
|
286
|
-
"@secretlint/secretlint-rule-openai": "^11.
|
|
287
|
-
"@secretlint/secretlint-rule-pattern": "^11.
|
|
288
|
-
"@secretlint/secretlint-rule-preset-recommend": "^11.
|
|
289
|
-
"@secretlint/secretlint-rule-privatekey": "^11.
|
|
290
|
-
"@secretlint/secretlint-rule-secp256k1-privatekey": "^11.
|
|
291
|
-
"@secretlint/types": "^11.
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
379
|
-
"eslint-plugin-typefest": "^1.0.
|
|
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: "^
|
|
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.
|
|
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.
|
|
545
|
+
secretlint: "^11.4.0",
|
|
538
546
|
sloc: "^0.3.2",
|
|
539
547
|
"sort-package-json": "^3.6.1",
|
|
540
|
-
stylelint: "^17.
|
|
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-
|
|
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.
|
|
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.
|
|
577
|
+
"stylelint-plugin-defensive-css": "^2.8.0",
|
|
569
578
|
"stylelint-plugin-logical-css": "^2.0.2",
|
|
570
|
-
"stylelint-plugin-use-baseline": "^1.
|
|
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.
|
|
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
|
|
600
|
+
eslint: "^9.0.0 || ^10.1.0",
|
|
592
601
|
typescript: ">=5.0.0"
|
|
593
602
|
},
|
|
594
|
-
packageManager: "npm@11.
|
|
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
|
|
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,
|
|
8552
|
+
if (!(0, import_ts_extras37.isDefined)(typeArguments)) {
|
|
7919
8553
|
return null;
|
|
7920
8554
|
}
|
|
7921
|
-
return (0,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
10504
|
+
if (options.requiresTypeChecking && !(0, import_ts_extras39.objectHasIn)(parserOptions, "projectService")) {
|
|
9673
10505
|
Reflect.set(parserOptions, "projectService", true);
|
|
9674
10506
|
}
|
|
9675
10507
|
const languageOptions = {
|