@typescript-eslint/eslint-plugin 6.0.0-alpha.99 → 6.0.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/README.md +2 -0
- package/dist/configs/all.js +2 -0
- package/dist/configs/all.js.map +1 -1
- package/dist/configs/disable-type-checked.js +3 -0
- package/dist/configs/disable-type-checked.js.map +1 -1
- package/dist/configs/recommended-type-checked.js +6 -0
- package/dist/configs/recommended-type-checked.js.map +1 -1
- package/dist/configs/recommended.js +2 -0
- package/dist/configs/recommended.js.map +1 -1
- package/dist/configs/strict-type-checked.js +4 -0
- package/dist/configs/strict-type-checked.js.map +1 -1
- package/dist/configs/stylistic-type-checked.js +0 -1
- package/dist/configs/stylistic-type-checked.js.map +1 -1
- package/dist/configs/stylistic.js +0 -2
- package/dist/configs/stylistic.js.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/rules/array-type.js +19 -20
- package/dist/rules/array-type.js.map +1 -1
- package/dist/rules/ban-ts-comment.js +33 -35
- package/dist/rules/ban-ts-comment.js.map +1 -1
- package/dist/rules/ban-types.js +75 -14
- package/dist/rules/ban-types.js.map +1 -1
- package/dist/rules/class-literal-property-style.js +38 -21
- package/dist/rules/class-literal-property-style.js.map +1 -1
- package/dist/rules/comma-dangle.js +4 -2
- package/dist/rules/comma-dangle.js.map +1 -1
- package/dist/rules/comma-spacing.js +5 -0
- package/dist/rules/comma-spacing.js.map +1 -1
- package/dist/rules/consistent-generic-constructors.js +1 -0
- package/dist/rules/consistent-generic-constructors.js.map +1 -1
- package/dist/rules/consistent-indexed-object-style.js +1 -0
- package/dist/rules/consistent-indexed-object-style.js.map +1 -1
- package/dist/rules/consistent-type-assertions.js +49 -0
- package/dist/rules/consistent-type-assertions.js.map +1 -1
- package/dist/rules/consistent-type-definitions.js +1 -0
- package/dist/rules/consistent-type-definitions.js.map +1 -1
- package/dist/rules/consistent-type-exports.js +1 -0
- package/dist/rules/consistent-type-exports.js.map +1 -1
- package/dist/rules/consistent-type-imports.js +2 -0
- package/dist/rules/consistent-type-imports.js.map +1 -1
- package/dist/rules/enum-utils/shared.js +61 -0
- package/dist/rules/enum-utils/shared.js.map +1 -0
- package/dist/rules/explicit-function-return-type.js.map +1 -1
- package/dist/rules/explicit-member-accessibility.js +43 -44
- package/dist/rules/explicit-member-accessibility.js.map +1 -1
- package/dist/rules/explicit-module-boundary-types.js +1 -1
- package/dist/rules/explicit-module-boundary-types.js.map +1 -1
- package/dist/rules/func-call-spacing.js +2 -0
- package/dist/rules/func-call-spacing.js.map +1 -1
- package/dist/rules/indent.js.map +1 -1
- package/dist/rules/index.js +4 -0
- package/dist/rules/index.js.map +1 -1
- package/dist/rules/key-spacing.js.map +1 -1
- package/dist/rules/keyword-spacing.js.map +1 -1
- package/dist/rules/lines-around-comment.js +78 -81
- package/dist/rules/lines-around-comment.js.map +1 -1
- package/dist/rules/lines-between-class-members.js +7 -5
- package/dist/rules/lines-between-class-members.js.map +1 -1
- package/dist/rules/member-delimiter-style.js +45 -27
- package/dist/rules/member-delimiter-style.js.map +1 -1
- package/dist/rules/member-ordering.js +55 -66
- package/dist/rules/member-ordering.js.map +1 -1
- package/dist/rules/method-signature-style.js +1 -0
- package/dist/rules/method-signature-style.js.map +1 -1
- package/dist/rules/naming-convention-utils/enums.js +6 -12
- package/dist/rules/naming-convention-utils/enums.js.map +1 -1
- package/dist/rules/naming-convention-utils/schema.js +50 -25
- package/dist/rules/naming-convention-utils/schema.js.map +1 -1
- package/dist/rules/naming-convention.js.map +1 -1
- package/dist/rules/no-base-to-string.js +2 -2
- package/dist/rules/no-base-to-string.js.map +1 -1
- package/dist/rules/no-confusing-void-expression.js +1 -0
- package/dist/rules/no-confusing-void-expression.js.map +1 -1
- package/dist/rules/no-duplicate-type-constituents.js +161 -0
- package/dist/rules/no-duplicate-type-constituents.js.map +1 -0
- package/dist/rules/no-empty-function.js +1 -0
- package/dist/rules/no-empty-function.js.map +1 -1
- package/dist/rules/no-empty-interface.js +2 -1
- package/dist/rules/no-empty-interface.js.map +1 -1
- package/dist/rules/no-explicit-any.js +1 -1
- package/dist/rules/no-explicit-any.js.map +1 -1
- package/dist/rules/no-extraneous-class.js +2 -3
- package/dist/rules/no-extraneous-class.js.map +1 -1
- package/dist/rules/no-implied-eval.js +1 -0
- package/dist/rules/no-implied-eval.js.map +1 -1
- package/dist/rules/no-inferrable-types.js.map +1 -1
- package/dist/rules/no-invalid-void-type.js +1 -1
- package/dist/rules/no-invalid-void-type.js.map +1 -1
- package/dist/rules/no-loop-func.js.map +1 -1
- package/dist/rules/no-magic-numbers.js.map +1 -1
- package/dist/rules/no-misused-promises.js +3 -2
- package/dist/rules/no-misused-promises.js.map +1 -1
- package/dist/rules/no-redeclare.js +2 -1
- package/dist/rules/no-redeclare.js.map +1 -1
- package/dist/rules/no-redundant-type-constituents.js +2 -0
- package/dist/rules/no-redundant-type-constituents.js.map +1 -1
- package/dist/rules/no-restricted-imports.js +80 -21
- package/dist/rules/no-restricted-imports.js.map +1 -1
- package/dist/rules/no-shadow.js +2 -1
- package/dist/rules/no-shadow.js.map +1 -1
- package/dist/rules/no-type-alias.js +24 -15
- package/dist/rules/no-type-alias.js.map +1 -1
- package/dist/rules/no-unnecessary-condition.js +2 -2
- package/dist/rules/no-unnecessary-condition.js.map +1 -1
- package/dist/rules/no-unnecessary-qualifier.js.map +1 -1
- package/dist/rules/no-unnecessary-type-assertion.js +1 -0
- package/dist/rules/no-unnecessary-type-assertion.js.map +1 -1
- package/dist/rules/no-unsafe-argument.js +3 -3
- package/dist/rules/no-unsafe-argument.js.map +1 -1
- package/dist/rules/no-unsafe-declaration-merging.js +1 -1
- package/dist/rules/no-unsafe-declaration-merging.js.map +1 -1
- package/dist/rules/no-unsafe-enum-comparison.js +119 -0
- package/dist/rules/no-unsafe-enum-comparison.js.map +1 -0
- package/dist/rules/no-unused-vars.js +4 -0
- package/dist/rules/no-unused-vars.js.map +1 -1
- package/dist/rules/no-use-before-define.js +1 -0
- package/dist/rules/no-use-before-define.js.map +1 -1
- package/dist/rules/padding-line-between-statements.js +11 -3
- package/dist/rules/padding-line-between-statements.js.map +1 -1
- package/dist/rules/parameter-properties.js +29 -30
- package/dist/rules/parameter-properties.js.map +1 -1
- package/dist/rules/prefer-includes.js +21 -5
- package/dist/rules/prefer-includes.js.map +1 -1
- package/dist/rules/prefer-nullish-coalescing.js +82 -63
- package/dist/rules/prefer-nullish-coalescing.js.map +1 -1
- package/dist/rules/prefer-optional-chain-utils/PreferOptionalChainOptions.js +3 -0
- package/dist/rules/prefer-optional-chain-utils/PreferOptionalChainOptions.js.map +1 -0
- package/dist/rules/prefer-optional-chain-utils/analyzeChain.js +419 -0
- package/dist/rules/prefer-optional-chain-utils/analyzeChain.js.map +1 -0
- package/dist/rules/prefer-optional-chain-utils/compareNodes.js +318 -0
- package/dist/rules/prefer-optional-chain-utils/compareNodes.js.map +1 -0
- package/dist/rules/prefer-optional-chain-utils/gatherLogicalOperands.js +281 -0
- package/dist/rules/prefer-optional-chain-utils/gatherLogicalOperands.js.map +1 -0
- package/dist/rules/prefer-optional-chain.js +80 -391
- package/dist/rules/prefer-optional-chain.js.map +1 -1
- package/dist/rules/prefer-readonly.js +1 -1
- package/dist/rules/prefer-readonly.js.map +1 -1
- package/dist/rules/prefer-regexp-exec.js +7 -1
- package/dist/rules/prefer-regexp-exec.js.map +1 -1
- package/dist/rules/require-array-sort-compare.js +3 -2
- package/dist/rules/require-array-sort-compare.js.map +1 -1
- package/dist/rules/restrict-plus-operands.js +132 -96
- package/dist/rules/restrict-plus-operands.js.map +1 -1
- package/dist/rules/restrict-template-expressions.js +11 -6
- package/dist/rules/restrict-template-expressions.js.map +1 -1
- package/dist/rules/return-await.js +1 -0
- package/dist/rules/return-await.js.map +1 -1
- package/dist/rules/sort-type-constituents.js +1 -1
- package/dist/rules/sort-type-constituents.js.map +1 -1
- package/dist/rules/space-before-function-paren.js +4 -0
- package/dist/rules/space-before-function-paren.js.map +1 -1
- package/dist/rules/strict-boolean-expressions.js +7 -2
- package/dist/rules/strict-boolean-expressions.js.map +1 -1
- package/dist/rules/switch-exhaustiveness-check.js.map +1 -1
- package/dist/rules/triple-slash-reference.js +3 -0
- package/dist/rules/triple-slash-reference.js.map +1 -1
- package/dist/rules/type-annotation-spacing.js +16 -14
- package/dist/rules/type-annotation-spacing.js.map +1 -1
- package/dist/rules/typedef.js +1 -0
- package/dist/rules/typedef.js.map +1 -1
- package/dist/rules/unbound-method.js +1 -0
- package/dist/rules/unbound-method.js.map +1 -1
- package/dist/rules/unified-signatures.js +3 -3
- package/dist/rules/unified-signatures.js.map +1 -1
- package/dist/util/astUtils.js.map +1 -1
- package/dist/util/collectUnusedVariables.js +1 -1
- package/dist/util/collectUnusedVariables.js.map +1 -1
- package/dist/util/getOperatorPrecedence.js +112 -2
- package/dist/util/getOperatorPrecedence.js.map +1 -1
- package/dist/util/getStringLength.js +2 -2
- package/dist/util/getStringLength.js.map +1 -1
- package/dist/util/misc.js +1 -2
- package/dist/util/misc.js.map +1 -1
- package/docs/rules/README.md +2 -2
- package/docs/rules/ban-types.md +10 -0
- package/docs/rules/comma-dangle.md +1 -1
- package/docs/rules/explicit-module-boundary-types.md +1 -1
- package/docs/rules/lines-around-comment.md +3 -13
- package/docs/rules/naming-convention.md +63 -63
- package/docs/rules/no-duplicate-type-constituents.md +61 -0
- package/docs/rules/no-unnecessary-boolean-literal-compare.md +10 -10
- package/docs/rules/no-unnecessary-type-constraint.md +6 -2
- package/docs/rules/no-unsafe-enum-comparison.md +77 -0
- package/docs/rules/prefer-includes.md +1 -1
- package/docs/rules/prefer-nullish-coalescing.md +23 -0
- package/docs/rules/prefer-optional-chain.md +195 -4
- package/docs/rules/require-await.md +0 -2
- package/docs/rules/restrict-plus-operands.md +135 -25
- package/docs/rules/restrict-template-expressions.md +15 -3
- package/docs/rules/sort-type-constituents.md +3 -3
- package/docs/rules/triple-slash-reference.md +0 -2
- package/docs/rules/type-annotation-spacing.md +22 -8
- package/docs/rules/unified-signatures.md +0 -2
- package/package.json +22 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prefer-nullish-coalescing.js","sourceRoot":"","sources":["../../src/rules/prefer-nullish-coalescing.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AACA,oDAA2E;AAC3E,sDAAwC;AACxC,+CAAiC;AAEjC,8CAAgC;
|
|
1
|
+
{"version":3,"file":"prefer-nullish-coalescing.js","sourceRoot":"","sources":["../../src/rules/prefer-nullish-coalescing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PreferOptionalChainOptions.js","sourceRoot":"","sources":["../../../src/rules/prefer-optional-chain-utils/PreferOptionalChainOptions.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,419 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.analyzeChain = void 0;
|
|
27
|
+
const utils_1 = require("@typescript-eslint/utils");
|
|
28
|
+
const ts_api_utils_1 = require("ts-api-utils");
|
|
29
|
+
const ts = __importStar(require("typescript"));
|
|
30
|
+
const util = __importStar(require("../../util"));
|
|
31
|
+
const compareNodes_1 = require("./compareNodes");
|
|
32
|
+
function includesType(parserServices, node, typeFlagIn) {
|
|
33
|
+
const typeFlag = typeFlagIn | ts.TypeFlags.Any | ts.TypeFlags.Unknown;
|
|
34
|
+
const types = (0, ts_api_utils_1.unionTypeParts)(parserServices.getTypeAtLocation(node));
|
|
35
|
+
for (const type of types) {
|
|
36
|
+
if (util.isTypeFlagSet(type, typeFlag)) {
|
|
37
|
+
return true;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
const analyzeAndChainOperand = (parserServices, operand, index, chain) => {
|
|
43
|
+
switch (operand.comparisonType) {
|
|
44
|
+
case "Boolean" /* NullishComparisonType.Boolean */:
|
|
45
|
+
case "NotEqualNullOrUndefined" /* NullishComparisonType.NotEqualNullOrUndefined */:
|
|
46
|
+
return [operand];
|
|
47
|
+
case "NotStrictEqualNull" /* NullishComparisonType.NotStrictEqualNull */: {
|
|
48
|
+
// handle `x !== null && x !== undefined`
|
|
49
|
+
const nextOperand = chain[index + 1];
|
|
50
|
+
if (nextOperand?.comparisonType ===
|
|
51
|
+
"NotStrictEqualUndefined" /* NullishComparisonType.NotStrictEqualUndefined */ &&
|
|
52
|
+
(0, compareNodes_1.compareNodes)(operand.comparedName, nextOperand.comparedName) ===
|
|
53
|
+
"Equal" /* NodeComparisonResult.Equal */) {
|
|
54
|
+
return [operand, nextOperand];
|
|
55
|
+
}
|
|
56
|
+
if (includesType(parserServices, operand.comparedName, ts.TypeFlags.Undefined)) {
|
|
57
|
+
// we know the next operand is not an `undefined` check and that this
|
|
58
|
+
// operand includes `undefined` - which means that making this an
|
|
59
|
+
// optional chain would change the runtime behavior of the expression
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
return [operand];
|
|
63
|
+
}
|
|
64
|
+
case "NotStrictEqualUndefined" /* NullishComparisonType.NotStrictEqualUndefined */: {
|
|
65
|
+
// handle `x !== undefined && x !== null`
|
|
66
|
+
const nextOperand = chain[index + 1];
|
|
67
|
+
if (nextOperand?.comparisonType ===
|
|
68
|
+
"NotStrictEqualNull" /* NullishComparisonType.NotStrictEqualNull */ &&
|
|
69
|
+
(0, compareNodes_1.compareNodes)(operand.comparedName, nextOperand.comparedName) ===
|
|
70
|
+
"Equal" /* NodeComparisonResult.Equal */) {
|
|
71
|
+
return [operand, nextOperand];
|
|
72
|
+
}
|
|
73
|
+
if (includesType(parserServices, operand.comparedName, ts.TypeFlags.Null)) {
|
|
74
|
+
// we know the next operand is not a `null` check and that this
|
|
75
|
+
// operand includes `null` - which means that making this an
|
|
76
|
+
// optional chain would change the runtime behavior of the expression
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
return [operand];
|
|
80
|
+
}
|
|
81
|
+
default:
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
const analyzeOrChainOperand = (parserServices, operand, index, chain) => {
|
|
86
|
+
switch (operand.comparisonType) {
|
|
87
|
+
case "NotBoolean" /* NullishComparisonType.NotBoolean */:
|
|
88
|
+
case "EqualNullOrUndefined" /* NullishComparisonType.EqualNullOrUndefined */:
|
|
89
|
+
return [operand];
|
|
90
|
+
case "StrictEqualNull" /* NullishComparisonType.StrictEqualNull */: {
|
|
91
|
+
// handle `x === null || x === undefined`
|
|
92
|
+
const nextOperand = chain[index + 1];
|
|
93
|
+
if (nextOperand?.comparisonType ===
|
|
94
|
+
"StrictEqualUndefined" /* NullishComparisonType.StrictEqualUndefined */ &&
|
|
95
|
+
(0, compareNodes_1.compareNodes)(operand.comparedName, nextOperand.comparedName) ===
|
|
96
|
+
"Equal" /* NodeComparisonResult.Equal */) {
|
|
97
|
+
return [operand, nextOperand];
|
|
98
|
+
}
|
|
99
|
+
if (includesType(parserServices, operand.comparedName, ts.TypeFlags.Undefined)) {
|
|
100
|
+
// we know the next operand is not an `undefined` check and that this
|
|
101
|
+
// operand includes `undefined` - which means that making this an
|
|
102
|
+
// optional chain would change the runtime behavior of the expression
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
return [operand];
|
|
106
|
+
}
|
|
107
|
+
case "StrictEqualUndefined" /* NullishComparisonType.StrictEqualUndefined */: {
|
|
108
|
+
// handle `x === undefined || x === null`
|
|
109
|
+
const nextOperand = chain[index + 1];
|
|
110
|
+
if (nextOperand?.comparisonType === "StrictEqualNull" /* NullishComparisonType.StrictEqualNull */ &&
|
|
111
|
+
(0, compareNodes_1.compareNodes)(operand.comparedName, nextOperand.comparedName) ===
|
|
112
|
+
"Equal" /* NodeComparisonResult.Equal */) {
|
|
113
|
+
return [operand, nextOperand];
|
|
114
|
+
}
|
|
115
|
+
if (includesType(parserServices, operand.comparedName, ts.TypeFlags.Null)) {
|
|
116
|
+
// we know the next operand is not a `null` check and that this
|
|
117
|
+
// operand includes `null` - which means that making this an
|
|
118
|
+
// optional chain would change the runtime behavior of the expression
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
return [operand];
|
|
122
|
+
}
|
|
123
|
+
default:
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
function getFixer(sourceCode, parserServices, operator, options, chain) {
|
|
128
|
+
const lastOperand = chain[chain.length - 1];
|
|
129
|
+
let useSuggestionFixer;
|
|
130
|
+
if (options.allowPotentiallyUnsafeFixesThatModifyTheReturnTypeIKnowWhatImDoing ===
|
|
131
|
+
true) {
|
|
132
|
+
// user has opted-in to the unsafe behavior
|
|
133
|
+
useSuggestionFixer = false;
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
// optional chain specifically will union `undefined` into the final type
|
|
137
|
+
// so we need to make sure that there is at least one operand that includes
|
|
138
|
+
// `undefined`, or else we're going to change the final type - which is
|
|
139
|
+
// unsafe and might cause downstream type errors.
|
|
140
|
+
if (lastOperand.comparisonType ===
|
|
141
|
+
"EqualNullOrUndefined" /* NullishComparisonType.EqualNullOrUndefined */ ||
|
|
142
|
+
lastOperand.comparisonType ===
|
|
143
|
+
"NotEqualNullOrUndefined" /* NullishComparisonType.NotEqualNullOrUndefined */ ||
|
|
144
|
+
lastOperand.comparisonType ===
|
|
145
|
+
"StrictEqualUndefined" /* NullishComparisonType.StrictEqualUndefined */ ||
|
|
146
|
+
lastOperand.comparisonType ===
|
|
147
|
+
"NotStrictEqualUndefined" /* NullishComparisonType.NotStrictEqualUndefined */ ||
|
|
148
|
+
(operator === '||' &&
|
|
149
|
+
lastOperand.comparisonType === "NotBoolean" /* NullishComparisonType.NotBoolean */)) {
|
|
150
|
+
// we know the last operand is an equality check - so the change in types
|
|
151
|
+
// DOES NOT matter and will not change the runtime result or cause a type
|
|
152
|
+
// check error
|
|
153
|
+
useSuggestionFixer = false;
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
useSuggestionFixer = true;
|
|
157
|
+
for (const operand of chain) {
|
|
158
|
+
if (includesType(parserServices, operand.node, ts.TypeFlags.Undefined)) {
|
|
159
|
+
useSuggestionFixer = false;
|
|
160
|
+
break;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// TODO - we could further reduce the false-positive rate of this check by
|
|
164
|
+
// checking for cases where the change in types don't matter like
|
|
165
|
+
// the test location of an if/while/etc statement.
|
|
166
|
+
// but it's quite complex to do this without false-negatives, so
|
|
167
|
+
// for now we'll just be over-eager with our matching.
|
|
168
|
+
//
|
|
169
|
+
// it's MUCH better to false-positive here and only provide a
|
|
170
|
+
// suggestion fixer, rather than false-negative and autofix to
|
|
171
|
+
// broken code.
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
// In its most naive form we could just slap `?.` for every single part of the
|
|
175
|
+
// chain. However this would be undesirable because it'd create unnecessary
|
|
176
|
+
// conditions in the user's code where there were none before - and it would
|
|
177
|
+
// cause errors with rules like our `no-unnecessary-condition`.
|
|
178
|
+
//
|
|
179
|
+
// Instead we want to include the minimum number of `?.` required to correctly
|
|
180
|
+
// unify the code into a single chain. Naively you might think that we can
|
|
181
|
+
// just take the final operand add `?.` after the locations from the previous
|
|
182
|
+
// operands - however this won't be correct either because earlier operands
|
|
183
|
+
// can include a necessary `?.` that's not needed or included in a later
|
|
184
|
+
// operand.
|
|
185
|
+
//
|
|
186
|
+
// So instead what we need to do is to start at the first operand and
|
|
187
|
+
// iteratively diff it against the next operand, and add the difference to the
|
|
188
|
+
// first operand.
|
|
189
|
+
//
|
|
190
|
+
// eg
|
|
191
|
+
// `foo && foo.bar && foo.bar.baz?.bam && foo.bar.baz.bam()`
|
|
192
|
+
// 1) `foo`
|
|
193
|
+
// 2) diff(`foo`, `foo.bar`) = `.bar`
|
|
194
|
+
// 3) result = `foo?.bar`
|
|
195
|
+
// 4) diff(`foo.bar`, `foo.bar.baz?.bam`) = `.baz?.bam`
|
|
196
|
+
// 5) result = `foo?.bar?.baz?.bam`
|
|
197
|
+
// 6) diff(`foo.bar.baz?.bam`, `foo.bar.baz.bam()`) = `()`
|
|
198
|
+
// 7) result = `foo?.bar?.baz?.bam?.()`
|
|
199
|
+
const parts = [];
|
|
200
|
+
for (const current of chain) {
|
|
201
|
+
const nextOperand = flattenChainExpression(sourceCode, current.comparedName);
|
|
202
|
+
const diff = nextOperand.slice(parts.length);
|
|
203
|
+
if (diff.length > 0) {
|
|
204
|
+
if (parts.length > 0) {
|
|
205
|
+
// we need to make the first operand of the diff optional so it matches the
|
|
206
|
+
// logic before merging
|
|
207
|
+
// foo.bar && foo.bar.baz
|
|
208
|
+
// diff = .baz
|
|
209
|
+
// result = foo.bar?.baz
|
|
210
|
+
diff[0].optional = true;
|
|
211
|
+
}
|
|
212
|
+
parts.push(...diff);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
let newCode = parts
|
|
216
|
+
.map(part => {
|
|
217
|
+
let str = '';
|
|
218
|
+
if (part.optional) {
|
|
219
|
+
str += '?.';
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
if (part.nonNull) {
|
|
223
|
+
str += '!';
|
|
224
|
+
}
|
|
225
|
+
if (part.requiresDot) {
|
|
226
|
+
str += '.';
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
if (part.precedence !== util.OperatorPrecedence.Invalid &&
|
|
230
|
+
part.precedence < util.OperatorPrecedence.Member) {
|
|
231
|
+
str += `(${part.text})`;
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
str += part.text;
|
|
235
|
+
}
|
|
236
|
+
return str;
|
|
237
|
+
})
|
|
238
|
+
.join('');
|
|
239
|
+
if (lastOperand.node.type === utils_1.AST_NODE_TYPES.BinaryExpression) {
|
|
240
|
+
// retain the ending comparison for cases like
|
|
241
|
+
// x && x.a != null
|
|
242
|
+
// x && typeof x.a !== 'undefined'
|
|
243
|
+
const operator = lastOperand.node.operator;
|
|
244
|
+
const { left, right } = (() => {
|
|
245
|
+
if (lastOperand.isYoda) {
|
|
246
|
+
const unaryOperator = lastOperand.node.right.type === utils_1.AST_NODE_TYPES.UnaryExpression
|
|
247
|
+
? lastOperand.node.right.operator + ' '
|
|
248
|
+
: '';
|
|
249
|
+
return {
|
|
250
|
+
left: sourceCode.getText(lastOperand.node.left),
|
|
251
|
+
right: unaryOperator + newCode,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
const unaryOperator = lastOperand.node.left.type === utils_1.AST_NODE_TYPES.UnaryExpression
|
|
256
|
+
? lastOperand.node.left.operator + ' '
|
|
257
|
+
: '';
|
|
258
|
+
return {
|
|
259
|
+
left: unaryOperator + newCode,
|
|
260
|
+
right: sourceCode.getText(lastOperand.node.right),
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
})();
|
|
264
|
+
newCode = `${left} ${operator} ${right}`;
|
|
265
|
+
}
|
|
266
|
+
else if (lastOperand.comparisonType === "NotBoolean" /* NullishComparisonType.NotBoolean */) {
|
|
267
|
+
newCode = `!${newCode}`;
|
|
268
|
+
}
|
|
269
|
+
const fix = fixer => fixer.replaceTextRange([chain[0].node.range[0], lastOperand.node.range[1]], newCode);
|
|
270
|
+
return useSuggestionFixer
|
|
271
|
+
? { suggest: [{ fix, messageId: 'optionalChainSuggest' }] }
|
|
272
|
+
: { fix };
|
|
273
|
+
function flattenChainExpression(sourceCode, node) {
|
|
274
|
+
switch (node.type) {
|
|
275
|
+
case utils_1.AST_NODE_TYPES.ChainExpression:
|
|
276
|
+
return flattenChainExpression(sourceCode, node.expression);
|
|
277
|
+
case utils_1.AST_NODE_TYPES.CallExpression: {
|
|
278
|
+
const argumentsText = (() => {
|
|
279
|
+
const closingParenToken = util.nullThrows(sourceCode.getLastToken(node), util.NullThrowsReasons.MissingToken('closing parenthesis', node.type));
|
|
280
|
+
const openingParenToken = util.nullThrows(sourceCode.getFirstTokenBetween(node.typeArguments ?? node.callee, closingParenToken, util.isOpeningParenToken), util.NullThrowsReasons.MissingToken('opening parenthesis', node.type));
|
|
281
|
+
return sourceCode.text.substring(openingParenToken.range[0], closingParenToken.range[1]);
|
|
282
|
+
})();
|
|
283
|
+
const typeArgumentsText = (() => {
|
|
284
|
+
if (node.typeArguments == null) {
|
|
285
|
+
return '';
|
|
286
|
+
}
|
|
287
|
+
return sourceCode.getText(node.typeArguments);
|
|
288
|
+
})();
|
|
289
|
+
return [
|
|
290
|
+
...flattenChainExpression(sourceCode, node.callee),
|
|
291
|
+
{
|
|
292
|
+
nonNull: false,
|
|
293
|
+
optional: node.optional,
|
|
294
|
+
// no precedence for this
|
|
295
|
+
precedence: util.OperatorPrecedence.Invalid,
|
|
296
|
+
requiresDot: false,
|
|
297
|
+
text: typeArgumentsText + argumentsText,
|
|
298
|
+
},
|
|
299
|
+
];
|
|
300
|
+
}
|
|
301
|
+
case utils_1.AST_NODE_TYPES.MemberExpression: {
|
|
302
|
+
const propertyText = sourceCode.getText(node.property);
|
|
303
|
+
return [
|
|
304
|
+
...flattenChainExpression(sourceCode, node.object),
|
|
305
|
+
{
|
|
306
|
+
nonNull: node.object.type === utils_1.AST_NODE_TYPES.TSNonNullExpression,
|
|
307
|
+
optional: node.optional,
|
|
308
|
+
precedence: node.computed
|
|
309
|
+
? // computed is already wrapped in [] so no need to wrap in () as well
|
|
310
|
+
util.OperatorPrecedence.Invalid
|
|
311
|
+
: util.getOperatorPrecedenceForNode(node.property),
|
|
312
|
+
requiresDot: !node.computed,
|
|
313
|
+
text: node.computed ? `[${propertyText}]` : propertyText,
|
|
314
|
+
},
|
|
315
|
+
];
|
|
316
|
+
}
|
|
317
|
+
case utils_1.AST_NODE_TYPES.TSNonNullExpression:
|
|
318
|
+
return flattenChainExpression(sourceCode, node.expression);
|
|
319
|
+
default:
|
|
320
|
+
return [
|
|
321
|
+
{
|
|
322
|
+
nonNull: false,
|
|
323
|
+
optional: false,
|
|
324
|
+
precedence: util.getOperatorPrecedenceForNode(node),
|
|
325
|
+
requiresDot: false,
|
|
326
|
+
text: sourceCode.getText(node),
|
|
327
|
+
},
|
|
328
|
+
];
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
function analyzeChain(context, sourceCode, parserServices, options, operator, chain) {
|
|
333
|
+
// need at least 2 operands in a chain for it to be a chain
|
|
334
|
+
if (chain.length <= 1 ||
|
|
335
|
+
/* istanbul ignore next -- previous checks make this unreachable, but keep it for exhaustiveness check */
|
|
336
|
+
operator === '??') {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
const analyzeOperand = (() => {
|
|
340
|
+
switch (operator) {
|
|
341
|
+
case '&&':
|
|
342
|
+
return analyzeAndChainOperand;
|
|
343
|
+
case '||':
|
|
344
|
+
return analyzeOrChainOperand;
|
|
345
|
+
}
|
|
346
|
+
})();
|
|
347
|
+
let subChain = [];
|
|
348
|
+
const maybeReportThenReset = (newChainSeed) => {
|
|
349
|
+
if (subChain.length > 1) {
|
|
350
|
+
context.report({
|
|
351
|
+
messageId: 'preferOptionalChain',
|
|
352
|
+
loc: {
|
|
353
|
+
start: subChain[0].node.loc.start,
|
|
354
|
+
end: subChain[subChain.length - 1].node.loc.end,
|
|
355
|
+
},
|
|
356
|
+
...getFixer(sourceCode, parserServices, operator, options, subChain),
|
|
357
|
+
});
|
|
358
|
+
}
|
|
359
|
+
// we've reached the end of a chain of logical expressions
|
|
360
|
+
// i.e. the current operand doesn't belong to the previous chain.
|
|
361
|
+
//
|
|
362
|
+
// we don't want to throw away the current operand otherwise we will skip it
|
|
363
|
+
// and that can cause us to miss chains. So instead we seed the new chain
|
|
364
|
+
// with the current operand
|
|
365
|
+
//
|
|
366
|
+
// eg this means we can catch cases like:
|
|
367
|
+
// unrelated != null && foo != null && foo.bar != null;
|
|
368
|
+
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ first "chain"
|
|
369
|
+
// ^^^^^^^^^^^ newChainSeed
|
|
370
|
+
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ second chain
|
|
371
|
+
subChain = newChainSeed ? [...newChainSeed] : [];
|
|
372
|
+
};
|
|
373
|
+
for (let i = 0; i < chain.length; i += 1) {
|
|
374
|
+
const lastOperand = subChain[subChain.length - 1];
|
|
375
|
+
const operand = chain[i];
|
|
376
|
+
const validatedOperands = analyzeOperand(parserServices, operand, i, chain);
|
|
377
|
+
if (!validatedOperands) {
|
|
378
|
+
// TODO - #7170
|
|
379
|
+
// check if the name is a superset/equal - if it is, then it likely
|
|
380
|
+
// intended to be part of the chain and something we should include in the
|
|
381
|
+
// report, eg
|
|
382
|
+
// foo == null || foo.bar;
|
|
383
|
+
// ^^^^^^^^^^^ valid OR chain
|
|
384
|
+
// ^^^^^^^ invalid OR chain logical, but still part of
|
|
385
|
+
// the chain for combination purposes
|
|
386
|
+
maybeReportThenReset();
|
|
387
|
+
continue;
|
|
388
|
+
}
|
|
389
|
+
// in case multiple operands were consumed - make sure to correctly increment the index
|
|
390
|
+
i += validatedOperands.length - 1;
|
|
391
|
+
const currentOperand = validatedOperands[0];
|
|
392
|
+
if (lastOperand) {
|
|
393
|
+
const comparisonResult = (0, compareNodes_1.compareNodes)(lastOperand.comparedName,
|
|
394
|
+
// purposely inspect and push the last operand because the prior operands don't matter
|
|
395
|
+
// this also means we won't false-positive in cases like
|
|
396
|
+
// foo !== null && foo !== undefined
|
|
397
|
+
validatedOperands[validatedOperands.length - 1].comparedName);
|
|
398
|
+
if (comparisonResult === "Subset" /* NodeComparisonResult.Subset */) {
|
|
399
|
+
// the operands are comparable, so we can continue searching
|
|
400
|
+
subChain.push(currentOperand);
|
|
401
|
+
}
|
|
402
|
+
else if (comparisonResult === "Invalid" /* NodeComparisonResult.Invalid */) {
|
|
403
|
+
maybeReportThenReset(validatedOperands);
|
|
404
|
+
}
|
|
405
|
+
else if (comparisonResult === "Equal" /* NodeComparisonResult.Equal */) {
|
|
406
|
+
// purposely don't push this case because the node is a no-op and if
|
|
407
|
+
// we consider it then we might report on things like
|
|
408
|
+
// foo && foo
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
subChain.push(currentOperand);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
// check the leftovers
|
|
416
|
+
maybeReportThenReset();
|
|
417
|
+
}
|
|
418
|
+
exports.analyzeChain = analyzeChain;
|
|
419
|
+
//# sourceMappingURL=analyzeChain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzeChain.js","sourceRoot":"","sources":["../../../src/rules/prefer-optional-chain-utils/analyzeChain.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,oDAA0D;AAO1D,+CAA8C;AAC9C,+CAAiC;AAEjC,iDAAmC;AACnC,iDAAoE;AAQpE,SAAS,YAAY,CACnB,cAAiD,EACjD,IAAmB,EACnB,UAAwB;IAExB,MAAM,QAAQ,GAAG,UAAU,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC;IACtE,MAAM,KAAK,GAAG,IAAA,6BAAc,EAAC,cAAc,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IACrE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,IAAI,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE;YACtC,OAAO,IAAI,CAAC;SACb;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAYD,MAAM,sBAAsB,GAAoB,CAC9C,cAAc,EACd,OAAO,EACP,KAAK,EACL,KAAK,EACL,EAAE;IACF,QAAQ,OAAO,CAAC,cAAc,EAAE;QAC9B,mDAAmC;QACnC;YACE,OAAO,CAAC,OAAO,CAAC,CAAC;QAEnB,wEAA6C,CAAC,CAAC;YAC7C,yCAAyC;YACzC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAA6B,CAAC;YACjE,IACE,WAAW,EAAE,cAAc;6FACoB;gBAC/C,IAAA,2BAAY,EAAC,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC;4DAChC,EAC5B;gBACA,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;aAC/B;YACD,IACE,YAAY,CACV,cAAc,EACd,OAAO,CAAC,YAAY,EACpB,EAAE,CAAC,SAAS,CAAC,SAAS,CACvB,EACD;gBACA,qEAAqE;gBACrE,iEAAiE;gBACjE,qEAAqE;gBACrE,OAAO,IAAI,CAAC;aACb;YAED,OAAO,CAAC,OAAO,CAAC,CAAC;SAClB;QAED,kFAAkD,CAAC,CAAC;YAClD,yCAAyC;YACzC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAA6B,CAAC;YACjE,IACE,WAAW,EAAE,cAAc;mFACe;gBAC1C,IAAA,2BAAY,EAAC,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC;4DAChC,EAC5B;gBACA,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;aAC/B;YACD,IACE,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EACrE;gBACA,+DAA+D;gBAC/D,4DAA4D;gBAC5D,qEAAqE;gBACrE,OAAO,IAAI,CAAC;aACb;YAED,OAAO,CAAC,OAAO,CAAC,CAAC;SAClB;QAED;YACE,OAAO,IAAI,CAAC;KACf;AACH,CAAC,CAAC;AACF,MAAM,qBAAqB,GAAoB,CAC7C,cAAc,EACd,OAAO,EACP,KAAK,EACL,KAAK,EACL,EAAE;IACF,QAAQ,OAAO,CAAC,cAAc,EAAE;QAC9B,yDAAsC;QACtC;YACE,OAAO,CAAC,OAAO,CAAC,CAAC;QAEnB,kEAA0C,CAAC,CAAC;YAC1C,yCAAyC;YACzC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAA6B,CAAC;YACjE,IACE,WAAW,EAAE,cAAc;uFACiB;gBAC5C,IAAA,2BAAY,EAAC,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC;4DAChC,EAC5B;gBACA,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;aAC/B;YACD,IACE,YAAY,CACV,cAAc,EACd,OAAO,CAAC,YAAY,EACpB,EAAE,CAAC,SAAS,CAAC,SAAS,CACvB,EACD;gBACA,qEAAqE;gBACrE,iEAAiE;gBACjE,qEAAqE;gBACrE,OAAO,IAAI,CAAC;aACb;YAED,OAAO,CAAC,OAAO,CAAC,CAAC;SAClB;QAED,4EAA+C,CAAC,CAAC;YAC/C,yCAAyC;YACzC,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,GAAG,CAAC,CAA6B,CAAC;YACjE,IACE,WAAW,EAAE,cAAc,kEAA0C;gBACrE,IAAA,2BAAY,EAAC,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC;4DAChC,EAC5B;gBACA,OAAO,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;aAC/B;YACD,IACE,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,EACrE;gBACA,+DAA+D;gBAC/D,4DAA4D;gBAC5D,qEAAqE;gBACrE,OAAO,IAAI,CAAC;aACb;YAED,OAAO,CAAC,OAAO,CAAC,CAAC;SAClB;QAED;YACE,OAAO,IAAI,CAAC;KACf;AACH,CAAC,CAAC;AAEF,SAAS,QAAQ,CACf,UAAsB,EACtB,cAAiD,EACjD,QAAqB,EACrB,OAAmC,EACnC,KAAqB;IAUrB,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE5C,IAAI,kBAA2B,CAAC;IAChC,IACE,OAAO,CAAC,kEAAkE;QAC1E,IAAI,EACJ;QACA,2CAA2C;QAC3C,kBAAkB,GAAG,KAAK,CAAC;KAC5B;SAAM;QACL,yEAAyE;QACzE,2EAA2E;QAC3E,uEAAuE;QACvE,iDAAiD;QAEjD,IACE,WAAW,CAAC,cAAc;mFACkB;YAC5C,WAAW,CAAC,cAAc;6FACqB;YAC/C,WAAW,CAAC,cAAc;uFACkB;YAC5C,WAAW,CAAC,cAAc;6FACqB;YAC/C,CAAC,QAAQ,KAAK,IAAI;gBAChB,WAAW,CAAC,cAAc,wDAAqC,CAAC,EAClE;YACA,yEAAyE;YACzE,yEAAyE;YACzE,cAAc;YACd,kBAAkB,GAAG,KAAK,CAAC;SAC5B;aAAM;YACL,kBAAkB,GAAG,IAAI,CAAC;YAE1B,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE;gBAC3B,IACE,YAAY,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,EAClE;oBACA,kBAAkB,GAAG,KAAK,CAAC;oBAC3B,MAAM;iBACP;aACF;YAED,0EAA0E;YAC1E,wEAAwE;YACxE,yDAAyD;YACzD,uEAAuE;YACvE,6DAA6D;YAC7D,EAAE;YACF,oEAAoE;YACpE,qEAAqE;YACrE,sBAAsB;SACvB;KACF;IAED,8EAA8E;IAC9E,2EAA2E;IAC3E,4EAA4E;IAC5E,+DAA+D;IAC/D,EAAE;IACF,8EAA8E;IAC9E,0EAA0E;IAC1E,6EAA6E;IAC7E,2EAA2E;IAC3E,wEAAwE;IACxE,WAAW;IACX,EAAE;IACF,qEAAqE;IACrE,8EAA8E;IAC9E,iBAAiB;IACjB,EAAE;IACF,KAAK;IACL,4DAA4D;IAC5D,WAAW;IACX,qCAAqC;IACrC,yBAAyB;IACzB,uDAAuD;IACvD,mCAAmC;IACnC,0DAA0D;IAC1D,uCAAuC;IAEvC,MAAM,KAAK,GAAG,EAAE,CAAC;IACjB,KAAK,MAAM,OAAO,IAAI,KAAK,EAAE;QAC3B,MAAM,WAAW,GAAG,sBAAsB,CACxC,UAAU,EACV,OAAO,CAAC,YAAY,CACrB,CAAC;QACF,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC7C,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;YACnB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE;gBACpB,2EAA2E;gBAC3E,uBAAuB;gBACvB,yBAAyB;gBACzB,cAAc;gBACd,wBAAwB;gBACxB,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC;aACzB;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;SACrB;KACF;IAED,IAAI,OAAO,GAAG,KAAK;SAChB,GAAG,CAAC,IAAI,CAAC,EAAE;QACV,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,GAAG,IAAI,IAAI,CAAC;SACb;aAAM;YACL,IAAI,IAAI,CAAC,OAAO,EAAE;gBAChB,GAAG,IAAI,GAAG,CAAC;aACZ;YACD,IAAI,IAAI,CAAC,WAAW,EAAE;gBACpB,GAAG,IAAI,GAAG,CAAC;aACZ;SACF;QACD,IACE,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,kBAAkB,CAAC,OAAO;YACnD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAChD;YACA,GAAG,IAAI,IAAI,IAAI,CAAC,IAAI,GAAG,CAAC;SACzB;aAAM;YACL,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC;SAClB;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;IAEZ,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,KAAK,sBAAc,CAAC,gBAAgB,EAAE;QAC7D,8CAA8C;QAC9C,mBAAmB;QACnB,kCAAkC;QAClC,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC3C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,GAAG,EAAE;YAC5B,IAAI,WAAW,CAAC,MAAM,EAAE;gBACtB,MAAM,aAAa,GACjB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,sBAAc,CAAC,eAAe;oBAC5D,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,GAAG;oBACvC,CAAC,CAAC,EAAE,CAAC;gBAET,OAAO;oBACL,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC/C,KAAK,EAAE,aAAa,GAAG,OAAO;iBAC/B,CAAC;aACH;iBAAM;gBACL,MAAM,aAAa,GACjB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,sBAAc,CAAC,eAAe;oBAC3D,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG;oBACtC,CAAC,CAAC,EAAE,CAAC;gBACT,OAAO;oBACL,IAAI,EAAE,aAAa,GAAG,OAAO;oBAC7B,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;iBAClD,CAAC;aACH;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,OAAO,GAAG,GAAG,IAAI,IAAI,QAAQ,IAAI,KAAK,EAAE,CAAC;KAC1C;SAAM,IAAI,WAAW,CAAC,cAAc,wDAAqC,EAAE;QAC1E,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;KACzB;IAED,MAAM,GAAG,GAAsB,KAAK,CAAC,EAAE,CACrC,KAAK,CAAC,gBAAgB,CACpB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EACnD,OAAO,CACR,CAAC;IAEJ,OAAO,kBAAkB;QACvB,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,sBAAsB,EAAE,CAAC,EAAE;QAC3D,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;IASZ,SAAS,sBAAsB,CAC7B,UAAsB,EACtB,IAAmB;QAEnB,QAAQ,IAAI,CAAC,IAAI,EAAE;YACjB,KAAK,sBAAc,CAAC,eAAe;gBACjC,OAAO,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAE7D,KAAK,sBAAc,CAAC,cAAc,CAAC,CAAC;gBAClC,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE;oBAC1B,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CACvC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,EAC7B,IAAI,CAAC,iBAAiB,CAAC,YAAY,CACjC,qBAAqB,EACrB,IAAI,CAAC,IAAI,CACV,CACF,CAAC;oBACF,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CACvC,UAAU,CAAC,oBAAoB,CAC7B,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,MAAM,EACjC,iBAAiB,EACjB,IAAI,CAAC,mBAAmB,CACzB,EACD,IAAI,CAAC,iBAAiB,CAAC,YAAY,CACjC,qBAAqB,EACrB,IAAI,CAAC,IAAI,CACV,CACF,CAAC;oBACF,OAAO,UAAU,CAAC,IAAI,CAAC,SAAS,CAC9B,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,EAC1B,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAC3B,CAAC;gBACJ,CAAC,CAAC,EAAE,CAAC;gBAEL,MAAM,iBAAiB,GAAG,CAAC,GAAG,EAAE;oBAC9B,IAAI,IAAI,CAAC,aAAa,IAAI,IAAI,EAAE;wBAC9B,OAAO,EAAE,CAAC;qBACX;oBAED,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBAChD,CAAC,CAAC,EAAE,CAAC;gBAEL,OAAO;oBACL,GAAG,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;oBAClD;wBACE,OAAO,EAAE,KAAK;wBACd,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,yBAAyB;wBACzB,UAAU,EAAE,IAAI,CAAC,kBAAkB,CAAC,OAAO;wBAC3C,WAAW,EAAE,KAAK;wBAClB,IAAI,EAAE,iBAAiB,GAAG,aAAa;qBACxC;iBACF,CAAC;aACH;YAED,KAAK,sBAAc,CAAC,gBAAgB,CAAC,CAAC;gBACpC,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvD,OAAO;oBACL,GAAG,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;oBAClD;wBACE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,sBAAc,CAAC,mBAAmB;wBAChE,QAAQ,EAAE,IAAI,CAAC,QAAQ;wBACvB,UAAU,EAAE,IAAI,CAAC,QAAQ;4BACvB,CAAC,CAAC,qEAAqE;gCACrE,IAAI,CAAC,kBAAkB,CAAC,OAAO;4BACjC,CAAC,CAAC,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC;wBACpD,WAAW,EAAE,CAAC,IAAI,CAAC,QAAQ;wBAC3B,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC,YAAY;qBACzD;iBACF,CAAC;aACH;YAED,KAAK,sBAAc,CAAC,mBAAmB;gBACrC,OAAO,sBAAsB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAE7D;gBACE,OAAO;oBACL;wBACE,OAAO,EAAE,KAAK;wBACd,QAAQ,EAAE,KAAK;wBACf,UAAU,EAAE,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC;wBACnD,WAAW,EAAE,KAAK;wBAClB,IAAI,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC;qBAC/B;iBACF,CAAC;SACL;IACH,CAAC;AACH,CAAC;AAED,SAAgB,YAAY,CAC1B,OAGC,EACD,UAAsB,EACtB,cAAiD,EACjD,OAAmC,EACnC,QAAgD,EAChD,KAAqB;IAErB,2DAA2D;IAC3D,IACE,KAAK,CAAC,MAAM,IAAI,CAAC;QACjB,yGAAyG;QACzG,QAAQ,KAAK,IAAI,EACjB;QACA,OAAO;KACR;IAED,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE;QAC3B,QAAQ,QAAQ,EAAE;YAChB,KAAK,IAAI;gBACP,OAAO,sBAAsB,CAAC;YAEhC,KAAK,IAAI;gBACP,OAAO,qBAAqB,CAAC;SAChC;IACH,CAAC,CAAC,EAAE,CAAC;IAEL,IAAI,QAAQ,GAAmB,EAAE,CAAC;IAClC,MAAM,oBAAoB,GAAG,CAC3B,YAAsC,EAChC,EAAE;QACR,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;YACvB,OAAO,CAAC,MAAM,CAAC;gBACb,SAAS,EAAE,qBAAqB;gBAChC,GAAG,EAAE;oBACH,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK;oBACjC,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;iBAChD;gBACD,GAAG,QAAQ,CAAC,UAAU,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC;aACrE,CAAC,CAAC;SACJ;QAED,0DAA0D;QAC1D,iEAAiE;QACjE,EAAE;QACF,4EAA4E;QAC5E,yEAAyE;QACzE,2BAA2B;QAC3B,EAAE;QACF,yCAAyC;QACzC,2DAA2D;QAC3D,qDAAqD;QACrD,oDAAoD;QACpD,uEAAuE;QACvE,QAAQ,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,CAAC,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM,WAAW,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAEnC,CAAC;QACd,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEzB,MAAM,iBAAiB,GAAG,cAAc,CAAC,cAAc,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAC5E,IAAI,CAAC,iBAAiB,EAAE;YACtB,eAAe;YACf,mEAAmE;YACnE,0EAA0E;YAC1E,aAAa;YACb,8BAA8B;YAC9B,iCAAiC;YACjC,yEAAyE;YACzE,gEAAgE;YAEhE,oBAAoB,EAAE,CAAC;YACvB,SAAS;SACV;QACD,uFAAuF;QACvF,CAAC,IAAI,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;QAElC,MAAM,cAAc,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;QAC5C,IAAI,WAAW,EAAE;YACf,MAAM,gBAAgB,GAAG,IAAA,2BAAY,EACnC,WAAW,CAAC,YAAY;YACxB,sFAAsF;YACtF,wDAAwD;YACxD,oCAAoC;YACpC,iBAAiB,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,YAAY,CAC7D,CAAC;YACF,IAAI,gBAAgB,+CAAgC,EAAE;gBACpD,4DAA4D;gBAC5D,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;aAC/B;iBAAM,IAAI,gBAAgB,iDAAiC,EAAE;gBAC5D,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;aACzC;iBAAM,IAAI,gBAAgB,6CAA+B,EAAE;gBAC1D,oEAAoE;gBACpE,qDAAqD;gBACrD,aAAa;aACd;SACF;aAAM;YACL,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;SAC/B;KACF;IAED,sBAAsB;IACtB,oBAAoB,EAAE,CAAC;AACzB,CAAC;AA7GD,oCA6GC"}
|