@typescript-eslint/eslint-plugin 8.45.1-alpha.9 → 8.46.1-alpha.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.
package/dist/index.d.ts CHANGED
@@ -785,7 +785,7 @@ declare const _default: {
785
785
  'no-unsafe-declaration-merging': import("@typescript-eslint/utils/ts-eslint").RuleModule<"unsafeMerging", [], import("../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
786
786
  'no-unsafe-enum-comparison': import("@typescript-eslint/utils/ts-eslint").RuleModule<"mismatchedCase" | "mismatchedCondition" | "replaceValueWithEnum", [], import("../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
787
787
  'no-unsafe-function-type': import("@typescript-eslint/utils/ts-eslint").RuleModule<"bannedFunctionType", [], import("../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
788
- 'no-unsafe-member-access': import("@typescript-eslint/utils/ts-eslint").RuleModule<"unsafeComputedMemberAccess" | "unsafeMemberExpression" | "unsafeThisMemberExpression", [], import("../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
788
+ 'no-unsafe-member-access': import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/no-unsafe-member-access").MessageIds, import("./rules/no-unsafe-member-access").Options, import("../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
789
789
  'no-unsafe-return': import("@typescript-eslint/utils/ts-eslint").RuleModule<"unsafeReturn" | "unsafeReturnAssignment" | "unsafeReturnThis", [], import("../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
790
790
  'no-unsafe-type-assertion': import("@typescript-eslint/utils/ts-eslint").RuleModule<"unsafeOfAnyTypeAssertion" | "unsafeToAnyTypeAssertion" | "unsafeToUnconstrainedTypeAssertion" | "unsafeTypeAssertion" | "unsafeTypeAssertionAssignableToConstraint", [], import("../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
791
791
  'no-unsafe-unary-minus': import("@typescript-eslint/utils/ts-eslint").RuleModule<"unaryMinus", [], import("../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
@@ -808,7 +808,7 @@ declare const _default: {
808
808
  'no-unsafe-declaration-merging': TSESLint.RuleModule<"unsafeMerging", [], import("../rules").ESLintPluginDocs, TSESLint.RuleListener>;
809
809
  'no-unsafe-enum-comparison': TSESLint.RuleModule<"mismatchedCase" | "mismatchedCondition" | "replaceValueWithEnum", [], import("../rules").ESLintPluginDocs, TSESLint.RuleListener>;
810
810
  'no-unsafe-function-type': TSESLint.RuleModule<"bannedFunctionType", [], import("../rules").ESLintPluginDocs, TSESLint.RuleListener>;
811
- 'no-unsafe-member-access': TSESLint.RuleModule<"unsafeComputedMemberAccess" | "unsafeMemberExpression" | "unsafeThisMemberExpression", [], import("../rules").ESLintPluginDocs, TSESLint.RuleListener>;
811
+ 'no-unsafe-member-access': TSESLint.RuleModule<import("./rules/no-unsafe-member-access").MessageIds, import("./rules/no-unsafe-member-access").Options, import("../rules").ESLintPluginDocs, TSESLint.RuleListener>;
812
812
  'no-unsafe-return': TSESLint.RuleModule<"unsafeReturn" | "unsafeReturnAssignment" | "unsafeReturnThis", [], import("../rules").ESLintPluginDocs, TSESLint.RuleListener>;
813
813
  'no-unsafe-type-assertion': TSESLint.RuleModule<"unsafeOfAnyTypeAssertion" | "unsafeToAnyTypeAssertion" | "unsafeToUnconstrainedTypeAssertion" | "unsafeTypeAssertion" | "unsafeTypeAssertionAssignableToConstraint", [], import("../rules").ESLintPluginDocs, TSESLint.RuleListener>;
814
814
  'no-unsafe-unary-minus': TSESLint.RuleModule<"unaryMinus", [], import("../rules").ESLintPluginDocs, TSESLint.RuleListener>;
@@ -115,7 +115,7 @@ declare const rules: {
115
115
  'no-unsafe-declaration-merging': import("@typescript-eslint/utils/ts-eslint").RuleModule<"unsafeMerging", [], import("../../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
116
116
  'no-unsafe-enum-comparison': import("@typescript-eslint/utils/ts-eslint").RuleModule<"mismatchedCase" | "mismatchedCondition" | "replaceValueWithEnum", [], import("../../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
117
117
  'no-unsafe-function-type': import("@typescript-eslint/utils/ts-eslint").RuleModule<"bannedFunctionType", [], import("../../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
118
- 'no-unsafe-member-access': import("@typescript-eslint/utils/ts-eslint").RuleModule<"unsafeComputedMemberAccess" | "unsafeMemberExpression" | "unsafeThisMemberExpression", [], import("../../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
118
+ 'no-unsafe-member-access': import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./no-unsafe-member-access").MessageIds, import("./no-unsafe-member-access").Options, import("../../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
119
119
  'no-unsafe-return': import("@typescript-eslint/utils/ts-eslint").RuleModule<"unsafeReturn" | "unsafeReturnAssignment" | "unsafeReturnThis", [], import("../../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
120
120
  'no-unsafe-type-assertion': import("@typescript-eslint/utils/ts-eslint").RuleModule<"unsafeOfAnyTypeAssertion" | "unsafeToAnyTypeAssertion" | "unsafeToUnconstrainedTypeAssertion" | "unsafeTypeAssertion" | "unsafeTypeAssertionAssignableToConstraint", [], import("../../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
121
121
  'no-unsafe-unary-minus': import("@typescript-eslint/utils/ts-eslint").RuleModule<"unaryMinus", [], import("../../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
@@ -1,2 +1,8 @@
1
- declare const _default: import("@typescript-eslint/utils/ts-eslint").RuleModule<"unsafeComputedMemberAccess" | "unsafeMemberExpression" | "unsafeThisMemberExpression", [], import("../../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
1
+ export type Options = [
2
+ {
3
+ allowOptionalChaining?: boolean;
4
+ }
5
+ ];
6
+ export type MessageIds = 'unsafeComputedMemberAccess' | 'unsafeMemberExpression' | 'unsafeThisMemberExpression';
7
+ declare const _default: import("@typescript-eslint/utils/ts-eslint").RuleModule<MessageIds, Options, import("../../rules").ESLintPluginDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
2
8
  export default _default;
@@ -40,6 +40,7 @@ var State;
40
40
  (function (State) {
41
41
  State[State["Unsafe"] = 1] = "Unsafe";
42
42
  State[State["Safe"] = 2] = "Safe";
43
+ State[State["Chained"] = 3] = "Chained";
43
44
  })(State || (State = {}));
44
45
  function createDataType(type) {
45
46
  const isErrorType = tsutils.isIntrinsicErrorType(type);
@@ -62,15 +63,41 @@ exports.default = (0, util_1.createRule)({
62
63
  'You can try to fix this by turning on the `noImplicitThis` compiler option, or adding a `this` parameter to the function.',
63
64
  ].join('\n'),
64
65
  },
65
- schema: [],
66
+ schema: [
67
+ {
68
+ type: 'object',
69
+ additionalProperties: false,
70
+ properties: {
71
+ allowOptionalChaining: {
72
+ type: 'boolean',
73
+ description: 'Whether to allow `?.` optional chains on `any` values.',
74
+ },
75
+ },
76
+ },
77
+ ],
66
78
  },
67
- defaultOptions: [],
68
- create(context) {
79
+ defaultOptions: [
80
+ {
81
+ allowOptionalChaining: false,
82
+ },
83
+ ],
84
+ create(context, [{ allowOptionalChaining }]) {
69
85
  const services = (0, util_1.getParserServices)(context);
70
86
  const compilerOptions = services.program.getCompilerOptions();
71
87
  const isNoImplicitThis = tsutils.isStrictCompilerOptionEnabled(compilerOptions, 'noImplicitThis');
72
88
  const stateCache = new Map();
89
+ // Case notes:
90
+ // value?.outer.middle.inner
91
+ // The ChainExpression is a child of the root expression, and a parent of all the MemberExpressions.
92
+ // But the left-most expression is what we want to report on: the inner-most expressions.
93
+ // In fact, this is true even if the chain is on the inside!
94
+ // value.outer.middle?.inner;
95
+ // It was already true that every `object` (MemberExpression) has optional: boolean
73
96
  function checkMemberExpression(node) {
97
+ if (allowOptionalChaining && node.optional) {
98
+ stateCache.set(node, State.Chained);
99
+ return State.Chained;
100
+ }
74
101
  const cachedState = stateCache.get(node);
75
102
  if (cachedState) {
76
103
  return cachedState;
@@ -113,6 +140,10 @@ exports.default = (0, util_1.createRule)({
113
140
  // ignore MemberExpressions with ancestors of type `TSClassImplements` or `TSInterfaceHeritage`
114
141
  'MemberExpression:not(TSClassImplements MemberExpression, TSInterfaceHeritage MemberExpression)': checkMemberExpression,
115
142
  'MemberExpression[computed = true] > *.property'(node) {
143
+ if (allowOptionalChaining &&
144
+ node.parent.optional) {
145
+ return;
146
+ }
116
147
  if (
117
148
  // x[1]
118
149
  node.type === utils_1.AST_NODE_TYPES.Literal ||
@@ -76,7 +76,7 @@ exports.default = (0, util_1.createRule)({
76
76
  allow,
77
77
  treatMethodsAsReadonly: !!treatMethodsAsReadonly,
78
78
  });
79
- if (!isReadOnly) {
79
+ if (!isReadOnly && !(0, util_1.isTypeBrandedLiteralLike)(type)) {
80
80
  context.report({
81
81
  node: actualParam,
82
82
  messageId: 'shouldBeReadonly',
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typescript-eslint/eslint-plugin",
3
- "version": "8.45.1-alpha.9",
3
+ "version": "8.46.1-alpha.0",
4
4
  "description": "TypeScript plugin for ESLint",
5
5
  "files": [
6
6
  "dist",
@@ -59,10 +59,10 @@
59
59
  },
60
60
  "dependencies": {
61
61
  "@eslint-community/regexpp": "^4.10.0",
62
- "@typescript-eslint/scope-manager": "8.45.1-alpha.9",
63
- "@typescript-eslint/type-utils": "8.45.1-alpha.9",
64
- "@typescript-eslint/utils": "8.45.1-alpha.9",
65
- "@typescript-eslint/visitor-keys": "8.45.1-alpha.9",
62
+ "@typescript-eslint/scope-manager": "8.46.1-alpha.0",
63
+ "@typescript-eslint/type-utils": "8.46.1-alpha.0",
64
+ "@typescript-eslint/utils": "8.46.1-alpha.0",
65
+ "@typescript-eslint/visitor-keys": "8.46.1-alpha.0",
66
66
  "graphemer": "^1.4.0",
67
67
  "ignore": "^7.0.0",
68
68
  "natural-compare": "^1.4.0",
@@ -71,8 +71,8 @@
71
71
  "devDependencies": {
72
72
  "@types/mdast": "^4.0.3",
73
73
  "@types/natural-compare": "*",
74
- "@typescript-eslint/rule-schema-to-typescript-types": "8.45.1-alpha.9",
75
- "@typescript-eslint/rule-tester": "8.45.1-alpha.9",
74
+ "@typescript-eslint/rule-schema-to-typescript-types": "8.46.1-alpha.0",
75
+ "@typescript-eslint/rule-tester": "8.46.1-alpha.0",
76
76
  "@vitest/coverage-v8": "^3.1.3",
77
77
  "ajv": "^6.12.6",
78
78
  "cross-fetch": "*",
@@ -92,7 +92,7 @@
92
92
  "vitest": "^3.1.3"
93
93
  },
94
94
  "peerDependencies": {
95
- "@typescript-eslint/parser": "^8.45.1-alpha.9",
95
+ "@typescript-eslint/parser": "^8.46.1-alpha.0",
96
96
  "eslint": "^8.57.0 || ^9.0.0",
97
97
  "typescript": ">=4.8.4 <6.0.0"
98
98
  },