eslint-config-typed 4.10.0 → 5.1.0

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 (104) hide show
  1. package/dist/configs/browser.mjs +1 -1
  2. package/dist/configs/browser.mjs.map +1 -1
  3. package/dist/configs/nodejs.mjs +1 -1
  4. package/dist/configs/nodejs.mjs.map +1 -1
  5. package/dist/plugins/total-functions/rules/no-hidden-type-assertions.d.mts.map +1 -1
  6. package/dist/plugins/total-functions/rules/no-hidden-type-assertions.mjs +2 -4
  7. package/dist/plugins/total-functions/rules/no-hidden-type-assertions.mjs.map +1 -1
  8. package/dist/plugins/total-functions/rules/no-nested-fp-ts-effects.mjs +1 -1
  9. package/dist/plugins/total-functions/rules/no-partial-array-reduce.d.mts.map +1 -1
  10. package/dist/plugins/total-functions/rules/no-partial-array-reduce.mjs +2 -2
  11. package/dist/plugins/total-functions/rules/no-partial-array-reduce.mjs.map +1 -1
  12. package/dist/plugins/ts-data-forge/rules/import-utils.d.mts +24 -0
  13. package/dist/plugins/ts-data-forge/rules/import-utils.d.mts.map +1 -1
  14. package/dist/plugins/ts-data-forge/rules/import-utils.mjs +59 -1
  15. package/dist/plugins/ts-data-forge/rules/import-utils.mjs.map +1 -1
  16. package/dist/plugins/ts-data-forge/rules/no-unnecessary-type-guard.d.mts +10 -0
  17. package/dist/plugins/ts-data-forge/rules/no-unnecessary-type-guard.d.mts.map +1 -0
  18. package/dist/plugins/ts-data-forge/rules/no-unnecessary-type-guard.mjs +335 -0
  19. package/dist/plugins/ts-data-forge/rules/no-unnecessary-type-guard.mjs.map +1 -0
  20. package/dist/plugins/ts-data-forge/rules/prefer-arr-is-array-at-least-length.mjs +2 -2
  21. package/dist/plugins/ts-data-forge/rules/prefer-arr-is-array-at-least-length.mjs.map +1 -1
  22. package/dist/plugins/ts-data-forge/rules/prefer-arr-is-array-of-length.mjs +2 -2
  23. package/dist/plugins/ts-data-forge/rules/prefer-arr-is-array-of-length.mjs.map +1 -1
  24. package/dist/plugins/ts-data-forge/rules/prefer-arr-is-non-empty.mjs +2 -2
  25. package/dist/plugins/ts-data-forge/rules/prefer-arr-is-non-empty.mjs.map +1 -1
  26. package/dist/plugins/ts-data-forge/rules/prefer-comparison-over-nullish-guard.d.mts +6 -0
  27. package/dist/plugins/ts-data-forge/rules/prefer-comparison-over-nullish-guard.d.mts.map +1 -0
  28. package/dist/plugins/ts-data-forge/rules/prefer-comparison-over-nullish-guard.mjs +101 -0
  29. package/dist/plugins/ts-data-forge/rules/prefer-comparison-over-nullish-guard.mjs.map +1 -0
  30. package/dist/plugins/ts-data-forge/rules/rules.d.mts +4 -0
  31. package/dist/plugins/ts-data-forge/rules/rules.d.mts.map +1 -1
  32. package/dist/plugins/ts-data-forge/rules/rules.mjs +4 -0
  33. package/dist/plugins/ts-data-forge/rules/rules.mjs.map +1 -1
  34. package/dist/plugins/ts-restrictions/rules/no-restricted-cast-name.mjs +4 -6
  35. package/dist/plugins/ts-restrictions/rules/no-restricted-cast-name.mjs.map +1 -1
  36. package/dist/rules/eslint-plugin-rules.d.mts +1 -0
  37. package/dist/rules/eslint-plugin-rules.d.mts.map +1 -1
  38. package/dist/rules/eslint-plugin-rules.mjs +1 -0
  39. package/dist/rules/eslint-plugin-rules.mjs.map +1 -1
  40. package/dist/rules/eslint-react-rules.mjs +1 -1
  41. package/dist/rules/eslint-rules.d.mts +1 -1
  42. package/dist/rules/eslint-rules.mjs +1 -1
  43. package/dist/rules/eslint-rules.mjs.map +1 -1
  44. package/dist/rules/eslint-ts-data-forge-rules.d.mts +2 -0
  45. package/dist/rules/eslint-ts-data-forge-rules.d.mts.map +1 -1
  46. package/dist/rules/eslint-ts-data-forge-rules.mjs +4 -0
  47. package/dist/rules/eslint-ts-data-forge-rules.mjs.map +1 -1
  48. package/dist/rules/eslint-unicorn-rules.d.mts +118 -10
  49. package/dist/rules/eslint-unicorn-rules.d.mts.map +1 -1
  50. package/dist/rules/eslint-unicorn-rules.mjs +140 -10
  51. package/dist/rules/eslint-unicorn-rules.mjs.map +1 -1
  52. package/dist/types/rules/eslint-functional-rules.d.mts +30 -20
  53. package/dist/types/rules/eslint-functional-rules.d.mts.map +1 -1
  54. package/dist/types/rules/eslint-import-rules.d.mts +28 -4
  55. package/dist/types/rules/eslint-import-rules.d.mts.map +1 -1
  56. package/dist/types/rules/eslint-n-rules.d.mts +138 -16
  57. package/dist/types/rules/eslint-n-rules.d.mts.map +1 -1
  58. package/dist/types/rules/eslint-plugin-rules.d.mts +18 -15
  59. package/dist/types/rules/eslint-plugin-rules.d.mts.map +1 -1
  60. package/dist/types/rules/eslint-react-rules.d.mts +21 -9
  61. package/dist/types/rules/eslint-react-rules.d.mts.map +1 -1
  62. package/dist/types/rules/eslint-stylistic-rules.d.mts +7 -1
  63. package/dist/types/rules/eslint-stylistic-rules.d.mts.map +1 -1
  64. package/dist/types/rules/eslint-ts-data-forge-rules.d.mts +61 -0
  65. package/dist/types/rules/eslint-ts-data-forge-rules.d.mts.map +1 -1
  66. package/dist/types/rules/eslint-unicorn-rules.d.mts +3143 -409
  67. package/dist/types/rules/eslint-unicorn-rules.d.mts.map +1 -1
  68. package/dist/types/rules/eslint-vitest-rules.d.mts +9 -10
  69. package/dist/types/rules/eslint-vitest-rules.d.mts.map +1 -1
  70. package/package.json +48 -42
  71. package/src/configs/browser.mts +1 -1
  72. package/src/configs/nodejs.mts +1 -1
  73. package/src/plugins/strict-dependencies/rules/resolve-import-path.test.mts +11 -7
  74. package/src/plugins/strict-dependencies/rules/strict-dependencies.mts +1 -1
  75. package/src/plugins/total-functions/rules/no-hidden-type-assertions.mts +2 -4
  76. package/src/plugins/total-functions/rules/no-nested-fp-ts-effects.mts +1 -1
  77. package/src/plugins/total-functions/rules/no-partial-array-reduce.mts +6 -4
  78. package/src/plugins/total-functions/rules/no-partial-url-constructor.test.mts +4 -4
  79. package/src/plugins/total-functions/rules/no-unsafe-readonly-mutable-assignment.test.mts +1 -1
  80. package/src/plugins/ts-data-forge/rules/import-utils.mts +94 -0
  81. package/src/plugins/ts-data-forge/rules/no-unnecessary-type-guard.mts +497 -0
  82. package/src/plugins/ts-data-forge/rules/no-unnecessary-type-guard.test.mts +377 -0
  83. package/src/plugins/ts-data-forge/rules/prefer-arr-is-array-at-least-length.mts +2 -2
  84. package/src/plugins/ts-data-forge/rules/prefer-arr-is-array-of-length.mts +2 -2
  85. package/src/plugins/ts-data-forge/rules/prefer-arr-is-non-empty.mts +2 -2
  86. package/src/plugins/ts-data-forge/rules/prefer-comparison-over-nullish-guard.mts +141 -0
  87. package/src/plugins/ts-data-forge/rules/prefer-comparison-over-nullish-guard.test.mts +171 -0
  88. package/src/plugins/ts-data-forge/rules/rules.mts +4 -0
  89. package/src/plugins/ts-restrictions/rules/no-restricted-cast-name.mts +8 -8
  90. package/src/rules/eslint-plugin-rules.mts +1 -0
  91. package/src/rules/eslint-react-rules.mts +1 -1
  92. package/src/rules/eslint-rules.mts +1 -1
  93. package/src/rules/eslint-ts-data-forge-rules.mts +6 -1
  94. package/src/rules/eslint-unicorn-rules.mts +142 -10
  95. package/src/types/rules/eslint-functional-rules.mts +30 -20
  96. package/src/types/rules/eslint-import-rules.mts +28 -8
  97. package/src/types/rules/eslint-n-rules.mts +191 -15
  98. package/src/types/rules/eslint-plugin-rules.mts +19 -15
  99. package/src/types/rules/eslint-react-rules.mts +21 -14
  100. package/src/types/rules/eslint-stylistic-rules.mts +7 -1
  101. package/src/types/rules/eslint-ts-data-forge-rules.mts +73 -0
  102. package/src/types/rules/eslint-unicorn-rules.mts +4067 -1027
  103. package/src/types/rules/eslint-vitest-rules.mts +9 -10
  104. package/vitest-globals.d.ts +0 -1
@@ -16,7 +16,7 @@ const eslintConfigForBrowser = (files) => ({
16
16
  '@typescript-eslint/no-require-imports': 'off',
17
17
  'unicorn/no-new-buffer': 'off',
18
18
  'unicorn/no-process-exit': 'off',
19
- 'unicorn/prefer-json-parse-buffer': 'off',
19
+ 'unicorn/prefer-json-parse-buffer': 0, // removed in v66
20
20
  'unicorn/prefer-module': 'off',
21
21
  'unicorn/prefer-node-protocol': 'off',
22
22
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"browser.mjs","sources":["../../src/configs/browser.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;MAIa,sBAAsB,GAAG,CAAC,KAAyB,MAC7D;AACC,IAAA,IAAI,KAAK,KAAK,SAAS,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACzC,IAAA,eAAe,EAAE;;AAEf,QAAA,OAAO,EAAE;YACP,GAAG,OAAO,CAAC,OAAO;AACnB,SAAA;AACD,QAAA,UAAU,EAAE,QAAQ;AACrB,KAAA;IACD,KAAK,EAAE,gBAAgB,CAAC;AACtB,QAAA,uBAAuB,EAAE,CAAC,OAAO,EAAE,GAAG,2BAA2B,CAAC;AAClE,QAAA,uCAAuC,EAAE,KAAK;AAC9C,QAAA,uBAAuB,EAAE,KAAK;AAC9B,QAAA,yBAAyB,EAAE,KAAK;AAChC,QAAA,kCAAkC,EAAE,KAAK;AACzC,QAAA,uBAAuB,EAAE,KAAK;AAC9B,QAAA,8BAA8B,EAAE,KAAK;KACtC,CAAC;AACH,CAAA;;;;"}
1
+ {"version":3,"file":"browser.mjs","sources":["../../src/configs/browser.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;MAIa,sBAAsB,GAAG,CAAC,KAAyB,MAC7D;AACC,IAAA,IAAI,KAAK,KAAK,SAAS,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACzC,IAAA,eAAe,EAAE;;AAEf,QAAA,OAAO,EAAE;YACP,GAAG,OAAO,CAAC,OAAO;AACnB,SAAA;AACD,QAAA,UAAU,EAAE,QAAQ;AACrB,KAAA;IACD,KAAK,EAAE,gBAAgB,CAAC;AACtB,QAAA,uBAAuB,EAAE,CAAC,OAAO,EAAE,GAAG,2BAA2B,CAAC;AAClE,QAAA,uCAAuC,EAAE,KAAK;AAC9C,QAAA,uBAAuB,EAAE,KAAK;AAC9B,QAAA,yBAAyB,EAAE,KAAK;QAChC,kCAAkC,EAAE,CAAC;AACrC,QAAA,uBAAuB,EAAE,KAAK;AAC9B,QAAA,8BAA8B,EAAE,KAAK;KACtC,CAAC;AACH,CAAA;;;;"}
@@ -21,7 +21,7 @@ const eslintConfigForNodeJs = (files) => ({
21
21
  'unicorn/prefer-blob-reading-methods': 'off',
22
22
  'unicorn/prefer-classlist-toggle': 'off',
23
23
  'unicorn/prefer-dom-node-append': 'off',
24
- 'unicorn/prefer-dom-node-dataset': 'off',
24
+ 'unicorn/prefer-dom-node-dataset': 0, // renamed to unicorn/dom-node-dataset in v66
25
25
  'unicorn/prefer-dom-node-remove': 'off',
26
26
  'unicorn/prefer-dom-node-text-content': 'off',
27
27
  'unicorn/prefer-event-target': 'off',
@@ -1 +1 @@
1
- {"version":3,"file":"nodejs.mjs","sources":["../../src/configs/nodejs.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;MAIa,qBAAqB,GAAG,CAAC,KAAyB,MAC5D;AACC,IAAA,IAAI,KAAK,KAAK,SAAS,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACzC,IAAA,eAAe,EAAE;;AAEf,QAAA,OAAO,EAAE;YACP,GAAG,OAAO,CAAC,IAAI;AAChB,SAAA;AACF,KAAA;IACD,KAAK,EAAE,gBAAgB,CAAC;AACtB,QAAA,uBAAuB,EAAE,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC;AACxD,QAAA,UAAU,EAAE,KAAK;AACjB,QAAA,qBAAqB,EAAE,KAAK;AAC5B,QAAA,eAAe,EAAE,KAAK;AACtB,QAAA,4BAA4B,EAAE,KAAK;AACnC,QAAA,kCAAkC,EAAE,KAAK;AACzC,QAAA,0CAA0C,EAAE,KAAK;AACjD,QAAA,qCAAqC,EAAE,KAAK;AAC5C,QAAA,iCAAiC,EAAE,KAAK;AACxC,QAAA,gCAAgC,EAAE,KAAK;AACvC,QAAA,iCAAiC,EAAE,KAAK;AACxC,QAAA,gCAAgC,EAAE,KAAK;AACvC,QAAA,sCAAsC,EAAE,KAAK;AAC7C,QAAA,6BAA6B,EAAE,KAAK;AACpC,QAAA,mCAAmC,EAAE,KAAK;AAC1C,QAAA,gCAAgC,EAAE,KAAK;AACvC,QAAA,+BAA+B,EAAE,KAAK;AACtC,QAAA,4CAA4C,EAAE,KAAK;KACpD,CAAC;AACH,CAAA;;;;"}
1
+ {"version":3,"file":"nodejs.mjs","sources":["../../src/configs/nodejs.mts"],"sourcesContent":[null],"names":[],"mappings":";;;;MAIa,qBAAqB,GAAG,CAAC,KAAyB,MAC5D;AACC,IAAA,IAAI,KAAK,KAAK,SAAS,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;AACzC,IAAA,eAAe,EAAE;;AAEf,QAAA,OAAO,EAAE;YACP,GAAG,OAAO,CAAC,IAAI;AAChB,SAAA;AACF,KAAA;IACD,KAAK,EAAE,gBAAgB,CAAC;AACtB,QAAA,uBAAuB,EAAE,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC;AACxD,QAAA,UAAU,EAAE,KAAK;AACjB,QAAA,qBAAqB,EAAE,KAAK;AAC5B,QAAA,eAAe,EAAE,KAAK;AACtB,QAAA,4BAA4B,EAAE,KAAK;AACnC,QAAA,kCAAkC,EAAE,KAAK;AACzC,QAAA,0CAA0C,EAAE,KAAK;AACjD,QAAA,qCAAqC,EAAE,KAAK;AAC5C,QAAA,iCAAiC,EAAE,KAAK;AACxC,QAAA,gCAAgC,EAAE,KAAK;QACvC,iCAAiC,EAAE,CAAC;AACpC,QAAA,gCAAgC,EAAE,KAAK;AACvC,QAAA,sCAAsC,EAAE,KAAK;AAC7C,QAAA,6BAA6B,EAAE,KAAK;AACpC,QAAA,mCAAmC,EAAE,KAAK;AAC1C,QAAA,gCAAgC,EAAE,KAAK;AACvC,QAAA,+BAA+B,EAAE,KAAK;AACtC,QAAA,4CAA4C,EAAE,KAAK;KACpD,CAAC;AACH,CAAA;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"no-hidden-type-assertions.d.mts","sourceRoot":"","sources":["../../../../src/plugins/total-functions/rules/no-hidden-type-assertions.mts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAsBvD,oDAAoD;AAEpD,eAAO,MAAM,sBAAsB;;CA4KxB,CAAC"}
1
+ {"version":3,"file":"no-hidden-type-assertions.d.mts","sourceRoot":"","sources":["../../../../src/plugins/total-functions/rules/no-hidden-type-assertions.mts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAsBvD,oDAAoD;AAEpD,eAAO,MAAM,sBAAsB;;CA0KxB,CAAC"}
@@ -45,11 +45,9 @@ const noHiddenTypeAssertions = createRule({
45
45
  ? [type.elementType]
46
46
  : isTypeOperatorNode(type)
47
47
  ? [type.type]
48
- : isUnionTypeNode(type)
48
+ : isUnionTypeNode(type) || isIntersectionTypeNode(type)
49
49
  ? type.types
50
- : isIntersectionTypeNode(type)
51
- ? type.types
52
- : [];
50
+ : [];
53
51
  return [type, ...next.flatMap(explodeTypeNode)];
54
52
  };
55
53
  const parametersToTypeNodes = (parameters, depth) => parameters
@@ -1 +1 @@
1
- {"version":3,"file":"no-hidden-type-assertions.mjs","sources":["../../../../src/plugins/total-functions/rules/no-hidden-type-assertions.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"no-hidden-type-assertions.mjs","sources":["../../../../src/plugins/total-functions/rules/no-hidden-type-assertions.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -27,7 +27,7 @@ const noNestedFpTsEffects = createRule({
27
27
  if (effectType === undefined) {
28
28
  return;
29
29
  }
30
- // TODO report other types of problematic nesting besides Tasks within IOs.
30
+ // TODO: report other types of problematic nesting besides Tasks within I/Os.
31
31
  if (effectType.effectName === 'IO' &&
32
32
  effectType.effectTypeParameter !== undefined) {
33
33
  const effectTypeParameterName = typeSymbolName(effectType.effectTypeParameter);
@@ -1 +1 @@
1
- {"version":3,"file":"no-partial-array-reduce.d.mts","sourceRoot":"","sources":["../../../../src/plugins/total-functions/rules/no-partial-array-reduce.mts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAIvE,8DAA8D;AAE9D,eAAO,MAAM,oBAAoB;;CAwHtB,CAAC"}
1
+ {"version":3,"file":"no-partial-array-reduce.d.mts","sourceRoot":"","sources":["../../../../src/plugins/total-functions/rules/no-partial-array-reduce.mts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAIvE,8DAA8D;AAE9D,eAAO,MAAM,oBAAoB;;CA0HtB,CAAC"}
@@ -37,9 +37,9 @@ const noPartialArrayReduce = createRule({
37
37
  const objectType = checker.getTypeAtLocation(parserServices.esTreeNodeToTSNodeMap.get(node.callee.object));
38
38
  const typeParts = unionTypeParts(objectType);
39
39
  // We only care if this call is on an array or tuple (or a type that is a union that includes one or more arrays or tuples)
40
- if (!typeParts.some((t) => checker.isArrayType(t) ||
40
+ if (typeParts.every((t) => !(checker.isArrayType(t) ||
41
41
  isTupleType(t) ||
42
- isTupleTypeReference(t))) {
42
+ isTupleTypeReference(t)))) {
43
43
  return;
44
44
  }
45
45
  const isProvablyNonEmpty = typeParts.every((t) => (isTupleType(t) && t.minLength >= 1) ||
@@ -1 +1 @@
1
- {"version":3,"file":"no-partial-array-reduce.mjs","sources":["../../../../src/plugins/total-functions/rules/no-partial-array-reduce.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"no-partial-array-reduce.mjs","sources":["../../../../src/plugins/total-functions/rules/no-partial-array-reduce.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -2,5 +2,29 @@ import { type TSESLint, type TSESTree } from '@typescript-eslint/utils';
2
2
  import { type DeepReadonly } from 'ts-type-forge';
3
3
  export declare const getTsDataForgeImport: (program: TSESTree.Program) => TSESTree.ImportDeclaration | undefined;
4
4
  export declare const getNamedImports: (node: DeepReadonly<TSESTree.ImportDeclaration> | undefined) => readonly string[];
5
+ /**
6
+ * Returns the in-scope local name a given canonical export is imported as
7
+ * (handling aliases such as `import { isX as y }` → `'y'`), or `undefined` when
8
+ * it is not imported. Used so autofixes reference the binding that actually
9
+ * exists rather than the canonical name.
10
+ */
11
+ export declare const getImportedLocalName: (node: DeepReadonly<TSESTree.ImportDeclaration> | undefined, importedName: string) => string | undefined;
12
+ type ResolvedCallee = Readonly<{
13
+ /** The canonical (imported) ts-data-forge name, regardless of local alias. */
14
+ canonicalName: string;
15
+ /** The identifier node to rewrite when replacing the callee name. */
16
+ propertyNode: TSESTree.Node;
17
+ /** Whether the call was made through a namespace import (`tf.isX(...)`). */
18
+ isNamespace: boolean;
19
+ }>;
20
+ /**
21
+ * Builds a resolver that maps a call expression's callee to the canonical
22
+ * ts-data-forge function it refers to. Handles named imports (including aliases
23
+ * such as `import { isX as y }`) and namespace imports (`import * as tf` →
24
+ * `tf.isX(...)`). Returns `undefined` for any callee that does not reference the
25
+ * given ts-data-forge import.
26
+ */
27
+ export declare const buildCalleeResolver: (importDecl: TSESTree.ImportDeclaration | undefined) => ((callee: DeepReadonly<TSESTree.Expression>) => ResolvedCallee | undefined);
5
28
  export declare const buildImportFixes: (fixer: TSESLint.RuleFixer, program: TSESTree.Program, _tsDataForgeImport: TSESTree.ImportDeclaration | undefined, requiredNames: readonly string[]) => readonly TSESLint.RuleFix[];
29
+ export {};
6
30
  //# sourceMappingURL=import-utils.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"import-utils.d.mts","sourceRoot":"","sources":["../../../../src/plugins/ts-data-forge/rules/import-utils.mts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAKlD,eAAO,MAAM,oBAAoB,GAC/B,SAAS,QAAQ,CAAC,OAAO,KACxB,QAAQ,CAAC,iBAAiB,GAAG,SAK7B,CAAC;AAEJ,eAAO,MAAM,eAAe,GAC1B,MAAM,YAAY,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GAAG,SAAS,KACzD,SAAS,MAAM,EAejB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,QAAQ,CAAC,SAAS,EACzB,SAAS,QAAQ,CAAC,OAAO,EACzB,oBAAoB,QAAQ,CAAC,iBAAiB,GAAG,SAAS,EAC1D,eAAe,SAAS,MAAM,EAAE,KAC/B,SAAS,QAAQ,CAAC,OAAO,EAa3B,CAAC"}
1
+ {"version":3,"file":"import-utils.d.mts","sourceRoot":"","sources":["../../../../src/plugins/ts-data-forge/rules/import-utils.mts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,QAAQ,EACb,KAAK,QAAQ,EACd,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAKlD,eAAO,MAAM,oBAAoB,GAC/B,SAAS,QAAQ,CAAC,OAAO,KACxB,QAAQ,CAAC,iBAAiB,GAAG,SAK7B,CAAC;AAEJ,eAAO,MAAM,eAAe,GAC1B,MAAM,YAAY,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GAAG,SAAS,KACzD,SAAS,MAAM,EAejB,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,MAAM,YAAY,CAAC,QAAQ,CAAC,iBAAiB,CAAC,GAAG,SAAS,EAC1D,cAAc,MAAM,KACnB,MAAM,GAAG,SAOG,CAAC;AAEhB,KAAK,cAAc,GAAG,QAAQ,CAAC;IAC7B,8EAA8E;IAC9E,aAAa,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC;IAC5B,4EAA4E;IAC5E,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,GAC9B,YAAY,QAAQ,CAAC,iBAAiB,GAAG,SAAS,KACjD,CAAC,CACF,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,UAAU,CAAC,KACtC,cAAc,GAAG,SAAS,CAsD9B,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAC3B,OAAO,QAAQ,CAAC,SAAS,EACzB,SAAS,QAAQ,CAAC,OAAO,EACzB,oBAAoB,QAAQ,CAAC,iBAAiB,GAAG,SAAS,EAC1D,eAAe,SAAS,MAAM,EAAE,KAC/B,SAAS,QAAQ,CAAC,OAAO,EAa3B,CAAC"}
@@ -16,6 +16,64 @@ const getNamedImports = (node) => {
16
16
  })()
17
17
  : []);
18
18
  };
19
+ /**
20
+ * Returns the in-scope local name a given canonical export is imported as
21
+ * (handling aliases such as `import { isX as y }` → `'y'`), or `undefined` when
22
+ * it is not imported. Used so autofixes reference the binding that actually
23
+ * exists rather than the canonical name.
24
+ */
25
+ const getImportedLocalName = (node, importedName) => node?.specifiers.find((specifier) => specifier.type === AST_NODE_TYPES.ImportSpecifier &&
26
+ (specifier.imported.type === AST_NODE_TYPES.Identifier
27
+ ? specifier.imported.name
28
+ : specifier.imported.value) === importedName)?.local.name;
29
+ /**
30
+ * Builds a resolver that maps a call expression's callee to the canonical
31
+ * ts-data-forge function it refers to. Handles named imports (including aliases
32
+ * such as `import { isX as y }`) and namespace imports (`import * as tf` →
33
+ * `tf.isX(...)`). Returns `undefined` for any callee that does not reference the
34
+ * given ts-data-forge import.
35
+ */
36
+ const buildCalleeResolver = (importDecl) => {
37
+ const specifiers = importDecl?.specifiers ?? [];
38
+ const namespaceName = specifiers.find((specifier) => specifier.type === AST_NODE_TYPES.ImportNamespaceSpecifier)?.local.name;
39
+ const localToCanonical = new Map(specifiers.flatMap((specifier) => {
40
+ if (specifier.type !== AST_NODE_TYPES.ImportSpecifier)
41
+ return [];
42
+ const importedName = specifier.imported.type === AST_NODE_TYPES.Identifier
43
+ ? specifier.imported.name
44
+ : specifier.imported.value;
45
+ return typeof importedName === 'string'
46
+ ? [[specifier.local.name, importedName]]
47
+ : [];
48
+ }));
49
+ return (callee) => {
50
+ if (callee.type === AST_NODE_TYPES.Identifier) {
51
+ const canonicalName = localToCanonical.get(callee.name);
52
+ return canonicalName === undefined
53
+ ? undefined
54
+ : {
55
+ canonicalName,
56
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
57
+ propertyNode: callee,
58
+ isNamespace: false,
59
+ };
60
+ }
61
+ if (callee.type === AST_NODE_TYPES.MemberExpression &&
62
+ !callee.computed &&
63
+ callee.object.type === AST_NODE_TYPES.Identifier &&
64
+ namespaceName !== undefined &&
65
+ callee.object.name === namespaceName &&
66
+ callee.property.type === AST_NODE_TYPES.Identifier) {
67
+ return {
68
+ canonicalName: callee.property.name,
69
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
70
+ propertyNode: callee.property,
71
+ isNamespace: true,
72
+ };
73
+ }
74
+ return undefined;
75
+ };
76
+ };
19
77
  const buildImportFixes = (fixer, program, _tsDataForgeImport, requiredNames) => {
20
78
  const specifierText = requiredNames.join(', ');
21
79
  const importStatement = `import { ${specifierText} } from '${TS_DATA_FORGE_MODULE}';`;
@@ -27,5 +85,5 @@ const buildImportFixes = (fixer, program, _tsDataForgeImport, requiredNames) =>
27
85
  };
28
86
  /* eslint-enable @typescript-eslint/prefer-readonly-parameter-types */
29
87
 
30
- export { buildImportFixes, getNamedImports, getTsDataForgeImport };
88
+ export { buildCalleeResolver, buildImportFixes, getImportedLocalName, getNamedImports, getTsDataForgeImport };
31
89
  //# sourceMappingURL=import-utils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"import-utils.mjs","sources":["../../../../src/plugins/ts-data-forge/rules/import-utils.mts"],"sourcesContent":[null],"names":[],"mappings":";;;AAQA;AAEO,MAAM,oBAAoB,GAAG,CAClC,OAAyB,KAEzB,OAAO,CAAC,IAAI,CAAC,IAAI,CACf,CAAC,IAAI,KACH,IAAI,CAAC,IAAI,KAAK,cAAc,CAAC,iBAAiB;AAC9C,IAAA,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,oBAAoB;AAGzC,MAAM,eAAe,GAAG,CAC7B,IAA0D,KACrC;IACrB,IAAI,IAAI,KAAK,SAAS;AAAE,QAAA,OAAO,EAAE;AAEjC,IAAA,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,SAAS,KACvC,SAAS,CAAC,IAAI,KAAK,cAAc,CAAC;UAC9B,CAAC,MAAK;YACJ,MAAM,YAAY,GAChB,SAAS,CAAC,QAAQ,CAAC,IAAI,KAAK,cAAc,CAAC;AACzC,kBAAE,SAAS,CAAC,QAAQ,CAAC;AACrB,kBAAE,SAAS,CAAC,QAAQ,CAAC,KAAK;AAE9B,YAAA,OAAO,OAAO,YAAY,KAAK,QAAQ,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE;AAC/D,QAAA,CAAC;UACD,EAAE,CACP;AACH;AAEO,MAAM,gBAAgB,GAAG,CAC9B,KAAyB,EACzB,OAAyB,EACzB,kBAA0D,EAC1D,aAAgC,KACD;IAC/B,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC;AAE9C,IAAA,MAAM,eAAe,GACnB,CAAA,SAAA,EAAY,aAAa,CAAA,SAAA,EAAY,oBAAoB,IAAa;IAExE,MAAM,OAAO,GAAG,IAAI;AAEpB,IAAA,MAAM,aAAa,GAAG,CAAA,EAAG,eAAe,CAAA,EAAG,OAAO,EAAW;;;IAI7D,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AACzD;AACA;;;;"}
1
+ {"version":3,"file":"import-utils.mjs","sources":["../../../../src/plugins/ts-data-forge/rules/import-utils.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type TSESLint } from '@typescript-eslint/utils';
2
+ type Options = readonly [
3
+ Readonly<{
4
+ ignore?: readonly string[];
5
+ }>?
6
+ ];
7
+ type MessageIds = 'alwaysTrue' | 'alwaysFalse' | 'replaceTypeGuard';
8
+ export declare const noUnnecessaryTypeGuard: TSESLint.RuleModule<MessageIds, Options>;
9
+ export {};
10
+ //# sourceMappingURL=no-unnecessary-type-guard.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-unnecessary-type-guard.d.mts","sourceRoot":"","sources":["../../../../src/plugins/ts-data-forge/rules/no-unnecessary-type-guard.mts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,QAAQ,EAEd,MAAM,0BAA0B,CAAC;AAUlC,KAAK,OAAO,GAAG,SAAS;IACtB,QAAQ,CAAC;QACP,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KAC5B,CAAC,CAAC;CACJ,CAAC;AAEF,KAAK,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,kBAAkB,CAAC;AAyFpE,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAAC,UAAU,CAAC,UAAU,EAAE,OAAO,CAgRhE,CAAC"}
@@ -0,0 +1,335 @@
1
+ import { ESLintUtils, AST_NODE_TYPES } from '@typescript-eslint/utils';
2
+ import * as ts from 'typescript';
3
+ import { getTsDataForgeImport, buildCalleeResolver, getImportedLocalName, buildImportFixes } from './import-utils.mjs';
4
+
5
+ /**
6
+ * Internal marker property attached to every `ts-type-forge` branded type. Its
7
+ * presence (together with the brand key) lets us recognize a `NonEmptyString`
8
+ * without holding a reference to the type itself.
9
+ */
10
+ const BRAND_MARKER_PROPERTY = 'TSTypeForgeInternals--edd2f9ce-7ca5-45b0-9d1a-bd61b9b5d9c3';
11
+ const NON_EMPTY_STRING_BRAND_KEY = 'NonEmptyString';
12
+ const NULLISH_REPLACEMENTS_EXCLUDE = {
13
+ undefined: 'isNotUndefined',
14
+ null: 'isNotNull',
15
+ };
16
+ const NULLISH_REPLACEMENTS_NARROW = {
17
+ undefined: 'isUndefined',
18
+ null: 'isNull',
19
+ };
20
+ const GUARD_SPECS = {
21
+ isUndefined: { kind: 'narrowTo', atoms: ['undefined'] },
22
+ isNotUndefined: { kind: 'excludeFrom', atoms: ['undefined'] },
23
+ isNull: { kind: 'narrowTo', atoms: ['null'] },
24
+ isNotNull: { kind: 'excludeFrom', atoms: ['null'] },
25
+ isBoolean: { kind: 'narrowTo', atoms: ['boolean'] },
26
+ isNotBoolean: { kind: 'excludeFrom', atoms: ['boolean'] },
27
+ isNumber: { kind: 'narrowTo', atoms: ['number'] },
28
+ isNotNumber: { kind: 'excludeFrom', atoms: ['number'] },
29
+ isString: { kind: 'narrowTo', atoms: ['string'] },
30
+ isNotString: { kind: 'excludeFrom', atoms: ['string'] },
31
+ isBigint: { kind: 'narrowTo', atoms: ['bigint'] },
32
+ isNotBigint: { kind: 'excludeFrom', atoms: ['bigint'] },
33
+ isSymbol: { kind: 'narrowTo', atoms: ['symbol'] },
34
+ isNotSymbol: { kind: 'excludeFrom', atoms: ['symbol'] },
35
+ isNullish: {
36
+ kind: 'narrowTo',
37
+ atoms: ['null', 'undefined'],
38
+ replacements: NULLISH_REPLACEMENTS_NARROW,
39
+ },
40
+ isNonNullish: {
41
+ kind: 'excludeFrom',
42
+ atoms: ['null', 'undefined'],
43
+ replacements: NULLISH_REPLACEMENTS_EXCLUDE,
44
+ },
45
+ isNonEmptyString: { kind: 'nonEmptyString' },
46
+ };
47
+ const DEFERRED_OR_OPAQUE_FLAGS = ts.TypeFlags.Any |
48
+ ts.TypeFlags.Unknown |
49
+ ts.TypeFlags.Never |
50
+ ts.TypeFlags.TypeParameter |
51
+ ts.TypeFlags.IndexedAccess |
52
+ ts.TypeFlags.Conditional |
53
+ ts.TypeFlags.Substitution;
54
+ const noUnnecessaryTypeGuard = {
55
+ meta: {
56
+ type: 'suggestion',
57
+ docs: {
58
+ description: 'Detect ts-data-forge type guard calls that perform no narrowing (the argument type already satisfies, or can never satisfy, the guard).',
59
+ },
60
+ fixable: 'code',
61
+ schema: [
62
+ {
63
+ type: 'object',
64
+ properties: {
65
+ ignore: {
66
+ type: 'array',
67
+ items: { type: 'string' },
68
+ description: 'Names of ts-data-forge guard functions to skip checking.',
69
+ },
70
+ },
71
+ additionalProperties: false,
72
+ },
73
+ ],
74
+ messages: {
75
+ alwaysTrue: 'Unnecessary `{{name}}` call: the argument type guarantees it always returns `true`. Replace the call with `true`.',
76
+ alwaysFalse: 'Unnecessary `{{name}}` call: the argument type guarantees it always returns `false`. Replace the call with `false`.',
77
+ replaceTypeGuard: 'Unnecessary `{{from}}` call: the argument can only be narrowed by `{{to}}`. Use `{{to}}` instead.',
78
+ },
79
+ },
80
+ create: (context) => {
81
+ const options = context.options[0];
82
+ const parserServices = ESLintUtils.getParserServices(context);
83
+ const compilerOptions = parserServices.program.getCompilerOptions();
84
+ // Without `strictNullChecks`, `null` / `undefined` are erased from the type
85
+ // system, so reasoning about nullish narrowing is unsound. Disable entirely.
86
+ const strictNullChecks = compilerOptions.strictNullChecks ?? compilerOptions.strict ?? false;
87
+ if (!strictNullChecks)
88
+ return {};
89
+ const checker = parserServices.program.getTypeChecker();
90
+ const sourceCode = context.sourceCode;
91
+ const program = sourceCode.ast;
92
+ const ignored = new Set(options?.ignore);
93
+ const tsDataForgeImport = getTsDataForgeImport(program);
94
+ const resolveGuard = buildCalleeResolver(tsDataForgeImport);
95
+ const buildReplaceFix = (isNamespace,
96
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
97
+ propertyNode, replacement) => (fixer) => {
98
+ // A namespace member access (`tf.isX`) exposes every export, so the
99
+ // canonical name is always in scope.
100
+ if (isNamespace) {
101
+ return [fixer.replaceText(propertyNode, replacement)];
102
+ }
103
+ // If the replacement guard is already imported (possibly under an
104
+ // alias), rename to its in-scope local name. Otherwise add a new
105
+ // import and rename to the canonical name.
106
+ const localName = getImportedLocalName(tsDataForgeImport, replacement);
107
+ if (localName !== undefined) {
108
+ return [fixer.replaceText(propertyNode, localName)];
109
+ }
110
+ return [
111
+ ...buildImportFixes(fixer, program, tsDataForgeImport, [
112
+ replacement,
113
+ ]),
114
+ fixer.replaceText(propertyNode, replacement),
115
+ ];
116
+ };
117
+ const reportConstant = (node, name, value, argument) => {
118
+ // Replacing the call with a literal drops the argument expression, so only
119
+ // autofix when evaluating it cannot have observable side effects.
120
+ const canFix = isSideEffectFreeArg(argument);
121
+ context.report({
122
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
123
+ node: node,
124
+ messageId: value ? 'alwaysTrue' : 'alwaysFalse',
125
+ data: { name },
126
+ fix: canFix
127
+ ? (fixer) => fixer.replaceText(
128
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
129
+ node, value ? 'true' : 'false')
130
+ : undefined,
131
+ });
132
+ };
133
+ const reportReplace = (node, from, to, isNamespace,
134
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
135
+ propertyNode) => {
136
+ context.report({
137
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion
138
+ node: node,
139
+ messageId: 'replaceTypeGuard',
140
+ data: { from, to },
141
+ fix: buildReplaceFix(isNamespace, propertyNode, to),
142
+ });
143
+ };
144
+ return {
145
+ CallExpression: (node) => {
146
+ if (node.arguments.length !== 1)
147
+ return;
148
+ const argument = node.arguments[0];
149
+ if (argument === undefined ||
150
+ argument.type === AST_NODE_TYPES.SpreadElement) {
151
+ return;
152
+ }
153
+ const resolved = resolveGuard(node.callee);
154
+ if (resolved === undefined)
155
+ return;
156
+ const { canonicalName, propertyNode, isNamespace } = resolved;
157
+ if (ignored.has(canonicalName))
158
+ return;
159
+ const spec = GUARD_SPECS[canonicalName];
160
+ if (spec === undefined)
161
+ return;
162
+ const argTsNode = parserServices.esTreeNodeToTSNodeMap.get(argument);
163
+ const argType = checker.getTypeAtLocation(argTsNode);
164
+ const parts = collectUnionParts(argType);
165
+ if (parts === undefined)
166
+ return; // opaque / generic → bail conservatively
167
+ const inputAtoms = new Set(parts.map(classifyAtom));
168
+ const hasMemberOutsideTarget = (atoms) => {
169
+ const targetSet = new Set(atoms);
170
+ return parts.some((p) => !targetSet.has(classifyAtom(p)));
171
+ };
172
+ switch (spec.kind) {
173
+ case 'excludeFrom': {
174
+ const removable = spec.atoms.filter((a) => inputAtoms.has(a));
175
+ if (removable.length === 0) {
176
+ // Nothing to exclude → the guard always holds.
177
+ reportConstant(node, canonicalName, true, argument);
178
+ }
179
+ else if (!hasMemberOutsideTarget(spec.atoms)) {
180
+ // Every member is excluded → the guard never holds.
181
+ reportConstant(node, canonicalName, false, argument);
182
+ }
183
+ else if (removable.length < spec.atoms.length) {
184
+ const replacement = spec.replacements?.[joinAtoms(removable)];
185
+ if (replacement !== undefined) {
186
+ reportReplace(node, canonicalName, replacement, isNamespace, propertyNode);
187
+ }
188
+ }
189
+ break;
190
+ }
191
+ case 'narrowTo': {
192
+ const present = spec.atoms.filter((a) => inputAtoms.has(a));
193
+ if (present.length === 0) {
194
+ // No member is in the target set → the guard never holds.
195
+ reportConstant(node, canonicalName, false, argument);
196
+ }
197
+ else if (!hasMemberOutsideTarget(spec.atoms)) {
198
+ // Input ⊆ target → the guard always holds and narrows nothing.
199
+ reportConstant(node, canonicalName, true, argument);
200
+ }
201
+ else if (present.length < spec.atoms.length) {
202
+ const replacement = spec.replacements?.[joinAtoms(present)];
203
+ if (replacement !== undefined) {
204
+ reportReplace(node, canonicalName, replacement, isNamespace, propertyNode);
205
+ }
206
+ }
207
+ break;
208
+ }
209
+ case 'nonEmptyString': {
210
+ const hasNullish = inputAtoms.has('undefined') || inputAtoms.has('null');
211
+ const nonNullishParts = parts.filter((p) => {
212
+ const atom = classifyAtom(p);
213
+ return atom !== 'undefined' && atom !== 'null';
214
+ });
215
+ if (!nonNullishParts.some(couldBeNonEmptyString)) {
216
+ // No member can be a non-empty string → the guard never holds.
217
+ reportConstant(node, canonicalName, false, argument);
218
+ break;
219
+ }
220
+ if (!nonNullishParts.every(isGuaranteedNonEmptyString)) {
221
+ break; // still does real string/empty work
222
+ }
223
+ if (hasNullish) {
224
+ reportReplace(node, canonicalName, 'isNonNullish', isNamespace, propertyNode);
225
+ }
226
+ else {
227
+ reportConstant(node, canonicalName, true, argument);
228
+ }
229
+ break;
230
+ }
231
+ }
232
+ },
233
+ };
234
+ },
235
+ defaultOptions: [{}],
236
+ };
237
+ /**
238
+ * Decomposes a type into its union members. Returns `undefined` when any member
239
+ * is opaque (`any` / `unknown` / `never`) or deferred (type parameter, indexed
240
+ * access, …), signalling that the rule should not draw conclusions.
241
+ */
242
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
243
+ const collectUnionParts = (type) => {
244
+ const parts = type.isUnion() ? type.types : [type];
245
+ for (const part of parts) {
246
+ if ((part.flags & DEFERRED_OR_OPAQUE_FLAGS) !== 0)
247
+ return undefined;
248
+ }
249
+ return parts;
250
+ };
251
+ /** Classifies a single (non-union) type into a primitive {@link Atom}. */
252
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
253
+ const classifyAtom = (type) => {
254
+ const { flags } = type;
255
+ if ((flags & ts.TypeFlags.Undefined) !== 0)
256
+ return 'undefined';
257
+ if ((flags & ts.TypeFlags.Null) !== 0)
258
+ return 'null';
259
+ if ((flags & ts.TypeFlags.BooleanLike) !== 0)
260
+ return 'boolean';
261
+ if ((flags & ts.TypeFlags.NumberLike) !== 0)
262
+ return 'number';
263
+ if ((flags & ts.TypeFlags.StringLike) !== 0)
264
+ return 'string';
265
+ if ((flags & ts.TypeFlags.BigIntLike) !== 0)
266
+ return 'bigint';
267
+ if ((flags & ts.TypeFlags.ESSymbolLike) !== 0)
268
+ return 'symbol';
269
+ // Branded primitives (e.g. `NonEmptyString = string & {...}`) are
270
+ // intersections; classify them by their underlying primitive constituent.
271
+ if (type.isIntersection()) {
272
+ for (const constituent of type.types) {
273
+ const atom = classifyAtom(constituent);
274
+ if (atom !== 'other')
275
+ return atom;
276
+ }
277
+ }
278
+ return 'other';
279
+ };
280
+ const ATOM_ORDER = [
281
+ 'undefined',
282
+ 'null',
283
+ 'boolean',
284
+ 'number',
285
+ 'string',
286
+ 'bigint',
287
+ 'symbol',
288
+ ];
289
+ /** A stable key for a set of atoms, used to look up replacement guards. */
290
+ const joinAtoms = (atoms) => ATOM_ORDER.filter((atom) => atoms.includes(atom)).join('|');
291
+ /**
292
+ * Returns `true` when the type is guaranteed to be a non-empty string: either a
293
+ * non-empty string literal or a value branded as `NonEmptyString`.
294
+ */
295
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
296
+ const isGuaranteedNonEmptyString = (type) => {
297
+ if (type.isStringLiteral())
298
+ return type.value !== '';
299
+ return (type.getProperty(NON_EMPTY_STRING_BRAND_KEY) !== undefined &&
300
+ type.getProperty(BRAND_MARKER_PROPERTY) !== undefined);
301
+ };
302
+ /**
303
+ * Returns `true` when the type can possibly be a non-empty string (a general
304
+ * `string`, a branded string, or a non-empty string literal). The empty string
305
+ * literal and non-string types cannot.
306
+ */
307
+ // eslint-disable-next-line @typescript-eslint/prefer-readonly-parameter-types
308
+ const couldBeNonEmptyString = (type) => {
309
+ if (type.isStringLiteral())
310
+ return type.value !== '';
311
+ return classifyAtom(type) === 'string';
312
+ };
313
+ /**
314
+ * Returns `true` when evaluating the expression cannot have observable side
315
+ * effects, so replacing the surrounding call with a literal is safe. Limited to
316
+ * simple references (identifiers, `this`, literals, and member-access chains).
317
+ */
318
+ const isSideEffectFreeArg = (node) => {
319
+ // `node.type` is one of 130+ AST kinds; only a handful are relevant here.
320
+ // eslint-disable-next-line @typescript-eslint/switch-exhaustiveness-check
321
+ switch (node.type) {
322
+ case AST_NODE_TYPES.Identifier:
323
+ case AST_NODE_TYPES.ThisExpression:
324
+ case AST_NODE_TYPES.Literal:
325
+ return true;
326
+ case AST_NODE_TYPES.MemberExpression:
327
+ return (isSideEffectFreeArg(node.object) &&
328
+ (!node.computed || isSideEffectFreeArg(node.property)));
329
+ default:
330
+ return false;
331
+ }
332
+ };
333
+
334
+ export { noUnnecessaryTypeGuard };
335
+ //# sourceMappingURL=no-unnecessary-type-guard.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-unnecessary-type-guard.mjs","sources":["../../../../src/plugins/ts-data-forge/rules/no-unnecessary-type-guard.mts"],"sourcesContent":[null],"names":[],"mappings":"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"}
@@ -27,8 +27,8 @@ const preferArrIsArrayAtLeastLength = {
27
27
  return;
28
28
  // xs.length >= n or n <= xs.length
29
29
  const isLengthOnLeft = node.operator === '>=';
30
- const lengthSide = isLengthOnLeft ? node.left : node.right;
31
- const valueSide = isLengthOnLeft ? node.right : node.left;
30
+ const lengthSide = node[isLengthOnLeft ? 'left' : 'right'];
31
+ const valueSide = node[isLengthOnLeft ? 'right' : 'left'];
32
32
  // Check if lengthSide is accessing .length
33
33
  if (!isLengthAccess(lengthSide))
34
34
  return;