eslint-plugin-rxjs-x 0.4.1 → 0.5.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 +6 -5
- package/dist/index.d.mts +8 -2
- package/dist/index.d.ts +8 -2
- package/dist/index.js +117 -56
- package/dist/index.mjs +117 -56
- package/docs/rules/no-floating-observables.md +47 -0
- package/docs/rules/no-topromise.md +1 -1
- package/docs/rules/prefer-observer.md +1 -1
- package/docs/rules/prefer-root-operators.md +1 -1
- package/docs/rules/throw-error.md +1 -1
- package/package.json +4 -4
- package/docs/rules/no-ignored-observable.md +0 -25
package/README.md
CHANGED
|
@@ -17,6 +17,7 @@ There are some breaking changes:
|
|
|
17
17
|
- If you need to continue using this old format, use the original `eslint-plugin-rxjs` or a different fork.
|
|
18
18
|
- The plugin namespace specified in the `recommended` config was changed from `rxjs` to `rxjs-x`.
|
|
19
19
|
- e.g. In your ESLint config, `rxjs/no-subject-value` should be renamed to `rxjs-x/no-subject-value`.
|
|
20
|
+
- The rule `rxjs/no-ignored-observable` is renamed to `rxjs-x/no-floating-observables`.
|
|
20
21
|
|
|
21
22
|
A complete description of all changes are documented in the [CHANGELOG](CHANGELOG.md) file.
|
|
22
23
|
|
|
@@ -88,10 +89,10 @@ The package includes the following rules.
|
|
|
88
89
|
| [no-explicit-generics](docs/rules/no-explicit-generics.md) | Disallow unnecessary explicit generic type arguments. | 🔒 | | | | |
|
|
89
90
|
| [no-exposed-subjects](docs/rules/no-exposed-subjects.md) | Disallow public and protected subjects. | 🔒 | | | 💭 | |
|
|
90
91
|
| [no-finnish](docs/rules/no-finnish.md) | Disallow Finnish notation. | | | | 💭 | |
|
|
92
|
+
| [no-floating-observables](docs/rules/no-floating-observables.md) | Require Observables to be handled appropriately. | 🔒 | | | 💭 | |
|
|
91
93
|
| [no-ignored-default-value](docs/rules/no-ignored-default-value.md) | Disallow using `firstValueFrom`, `lastValueFrom`, `first`, and `last` without specifying a default value. | 🔒 | | | 💭 | |
|
|
92
94
|
| [no-ignored-error](docs/rules/no-ignored-error.md) | Disallow calling `subscribe` without specifying an error handler. | 🔒 | | | 💭 | |
|
|
93
95
|
| [no-ignored-notifier](docs/rules/no-ignored-notifier.md) | Disallow observables not composed from the `repeatWhen` or `retryWhen` notifier. | ✅ 🔒 | | | 💭 | |
|
|
94
|
-
| [no-ignored-observable](docs/rules/no-ignored-observable.md) | Disallow ignoring observables returned by functions. | 🔒 | | | 💭 | |
|
|
95
96
|
| [no-ignored-replay-buffer](docs/rules/no-ignored-replay-buffer.md) | Disallow using `ReplaySubject`, `publishReplay` or `shareReplay` without specifying the buffer size. | ✅ 🔒 | | | | |
|
|
96
97
|
| [no-ignored-subscribe](docs/rules/no-ignored-subscribe.md) | Disallow calling `subscribe` without specifying arguments. | | | | 💭 | |
|
|
97
98
|
| [no-ignored-subscription](docs/rules/no-ignored-subscription.md) | Disallow ignoring the subscription returned by `subscribe`. | | | | 💭 | |
|
|
@@ -107,16 +108,16 @@ The package includes the following rules.
|
|
|
107
108
|
| [no-subject-value](docs/rules/no-subject-value.md) | Disallow accessing the `value` property of a `BehaviorSubject` instance. | | | | 💭 | |
|
|
108
109
|
| [no-subscribe-handlers](docs/rules/no-subscribe-handlers.md) | Disallow passing handlers to `subscribe`. | | | | 💭 | |
|
|
109
110
|
| [no-tap](docs/rules/no-tap.md) | Disallow the `tap` operator. | | | | | ❌ |
|
|
110
|
-
| [no-topromise](docs/rules/no-topromise.md) | Disallow use of the `toPromise` method. | 🔒
|
|
111
|
+
| [no-topromise](docs/rules/no-topromise.md) | Disallow use of the `toPromise` method. | ✅ 🔒 | | 💡 | 💭 | |
|
|
111
112
|
| [no-unbound-methods](docs/rules/no-unbound-methods.md) | Disallow passing unbound methods. | ✅ 🔒 | | | 💭 | |
|
|
112
113
|
| [no-unsafe-catch](docs/rules/no-unsafe-catch.md) | Disallow unsafe `catchError` usage in effects and epics. | | | | 💭 | |
|
|
113
114
|
| [no-unsafe-first](docs/rules/no-unsafe-first.md) | Disallow unsafe `first`/`take` usage in effects and epics. | | | | 💭 | |
|
|
114
115
|
| [no-unsafe-subject-next](docs/rules/no-unsafe-subject-next.md) | Disallow unsafe optional `next` calls. | ✅ 🔒 | | | 💭 | |
|
|
115
116
|
| [no-unsafe-switchmap](docs/rules/no-unsafe-switchmap.md) | Disallow unsafe `switchMap` usage in effects and epics. | | | | 💭 | |
|
|
116
117
|
| [no-unsafe-takeuntil](docs/rules/no-unsafe-takeuntil.md) | Disallow applying operators after `takeUntil`. | ✅ 🔒 | | | 💭 | |
|
|
117
|
-
| [prefer-observer](docs/rules/prefer-observer.md) | Disallow passing separate handlers to `subscribe` and `tap`. | 🔒
|
|
118
|
-
| [prefer-root-operators](docs/rules/prefer-root-operators.md) | Disallow importing operators from `rxjs/operators`. | 🔒
|
|
118
|
+
| [prefer-observer](docs/rules/prefer-observer.md) | Disallow passing separate handlers to `subscribe` and `tap`. | ✅ 🔒 | 🔧 | 💡 | 💭 | |
|
|
119
|
+
| [prefer-root-operators](docs/rules/prefer-root-operators.md) | Disallow importing operators from `rxjs/operators`. | ✅ 🔒 | 🔧 | 💡 | | |
|
|
119
120
|
| [suffix-subjects](docs/rules/suffix-subjects.md) | Enforce the use of a suffix in subject identifiers. | | | | 💭 | |
|
|
120
|
-
| [throw-error](docs/rules/throw-error.md) | Enforce passing only `Error` values to `throwError`. | 🔒
|
|
121
|
+
| [throw-error](docs/rules/throw-error.md) | Enforce passing only `Error` values to `throwError`. | ✅ 🔒 | | | 💭 | |
|
|
121
122
|
|
|
122
123
|
<!-- end auto-generated rules list -->
|
package/dist/index.d.mts
CHANGED
|
@@ -25,9 +25,13 @@ declare const rxjsX: {
|
|
|
25
25
|
'rxjs-x/no-redundant-notify': "error";
|
|
26
26
|
'rxjs-x/no-sharereplay': "error";
|
|
27
27
|
'rxjs-x/no-subject-unsubscribe': "error";
|
|
28
|
+
'rxjs-x/no-topromise': "error";
|
|
28
29
|
'rxjs-x/no-unbound-methods': "error";
|
|
29
30
|
'rxjs-x/no-unsafe-subject-next': "error";
|
|
30
31
|
'rxjs-x/no-unsafe-takeuntil': "error";
|
|
32
|
+
'rxjs-x/prefer-observer': "error";
|
|
33
|
+
'rxjs-x/prefer-root-operators': "error";
|
|
34
|
+
'rxjs-x/throw-error': "error";
|
|
31
35
|
};
|
|
32
36
|
};
|
|
33
37
|
strict: {
|
|
@@ -39,10 +43,10 @@ declare const rxjsX: {
|
|
|
39
43
|
'rxjs-x/no-create': "error";
|
|
40
44
|
'rxjs-x/no-explicit-generics': "error";
|
|
41
45
|
'rxjs-x/no-exposed-subjects': "error";
|
|
46
|
+
'rxjs-x/no-floating-observables': "error";
|
|
42
47
|
'rxjs-x/no-ignored-default-value': "error";
|
|
43
48
|
'rxjs-x/no-ignored-error': "error";
|
|
44
49
|
'rxjs-x/no-ignored-notifier': "error";
|
|
45
|
-
'rxjs-x/no-ignored-observable': "error";
|
|
46
50
|
'rxjs-x/no-ignored-replay-buffer': "error";
|
|
47
51
|
'rxjs-x/no-ignored-takewhile-value': "error";
|
|
48
52
|
'rxjs-x/no-implicit-any-catch': ["error", {
|
|
@@ -99,10 +103,12 @@ declare const rxjsX: {
|
|
|
99
103
|
allowProtected?: boolean;
|
|
100
104
|
}[], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
101
105
|
'no-finnish': TSESLint.RuleModule<"forbidden", [], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
106
|
+
'no-floating-observables': TSESLint.RuleModule<"forbidden" | "forbiddenNoVoid", readonly {
|
|
107
|
+
ignoreVoid?: boolean;
|
|
108
|
+
}[], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
102
109
|
'no-ignored-default-value': TSESLint.RuleModule<"forbidden", [], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
103
110
|
'no-ignored-error': TSESLint.RuleModule<"forbidden", [], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
104
111
|
'no-ignored-notifier': TSESLint.RuleModule<"forbidden", [], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
105
|
-
'no-ignored-observable': TSESLint.RuleModule<"forbidden", [], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
106
112
|
'no-ignored-replay-buffer': TSESLint.RuleModule<"forbidden", [], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
107
113
|
'no-ignored-subscribe': TSESLint.RuleModule<"forbidden", [], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
108
114
|
'no-ignored-subscription': TSESLint.RuleModule<"forbidden", [], RxjsXRuleDocs, TSESLint.RuleListener>;
|
package/dist/index.d.ts
CHANGED
|
@@ -25,9 +25,13 @@ declare const rxjsX: {
|
|
|
25
25
|
'rxjs-x/no-redundant-notify': "error";
|
|
26
26
|
'rxjs-x/no-sharereplay': "error";
|
|
27
27
|
'rxjs-x/no-subject-unsubscribe': "error";
|
|
28
|
+
'rxjs-x/no-topromise': "error";
|
|
28
29
|
'rxjs-x/no-unbound-methods': "error";
|
|
29
30
|
'rxjs-x/no-unsafe-subject-next': "error";
|
|
30
31
|
'rxjs-x/no-unsafe-takeuntil': "error";
|
|
32
|
+
'rxjs-x/prefer-observer': "error";
|
|
33
|
+
'rxjs-x/prefer-root-operators': "error";
|
|
34
|
+
'rxjs-x/throw-error': "error";
|
|
31
35
|
};
|
|
32
36
|
};
|
|
33
37
|
strict: {
|
|
@@ -39,10 +43,10 @@ declare const rxjsX: {
|
|
|
39
43
|
'rxjs-x/no-create': "error";
|
|
40
44
|
'rxjs-x/no-explicit-generics': "error";
|
|
41
45
|
'rxjs-x/no-exposed-subjects': "error";
|
|
46
|
+
'rxjs-x/no-floating-observables': "error";
|
|
42
47
|
'rxjs-x/no-ignored-default-value': "error";
|
|
43
48
|
'rxjs-x/no-ignored-error': "error";
|
|
44
49
|
'rxjs-x/no-ignored-notifier': "error";
|
|
45
|
-
'rxjs-x/no-ignored-observable': "error";
|
|
46
50
|
'rxjs-x/no-ignored-replay-buffer': "error";
|
|
47
51
|
'rxjs-x/no-ignored-takewhile-value': "error";
|
|
48
52
|
'rxjs-x/no-implicit-any-catch': ["error", {
|
|
@@ -99,10 +103,12 @@ declare const rxjsX: {
|
|
|
99
103
|
allowProtected?: boolean;
|
|
100
104
|
}[], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
101
105
|
'no-finnish': TSESLint.RuleModule<"forbidden", [], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
106
|
+
'no-floating-observables': TSESLint.RuleModule<"forbidden" | "forbiddenNoVoid", readonly {
|
|
107
|
+
ignoreVoid?: boolean;
|
|
108
|
+
}[], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
102
109
|
'no-ignored-default-value': TSESLint.RuleModule<"forbidden", [], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
103
110
|
'no-ignored-error': TSESLint.RuleModule<"forbidden", [], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
104
111
|
'no-ignored-notifier': TSESLint.RuleModule<"forbidden", [], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
105
|
-
'no-ignored-observable': TSESLint.RuleModule<"forbidden", [], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
106
112
|
'no-ignored-replay-buffer': TSESLint.RuleModule<"forbidden", [], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
107
113
|
'no-ignored-subscribe': TSESLint.RuleModule<"forbidden", [], RxjsXRuleDocs, TSESLint.RuleListener>;
|
|
108
114
|
'no-ignored-subscription': TSESLint.RuleModule<"forbidden", [], RxjsXRuleDocs, TSESLint.RuleListener>;
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }// package.json
|
|
2
2
|
var name = "eslint-plugin-rxjs-x";
|
|
3
|
-
var version = "0.
|
|
3
|
+
var version = "0.5.0";
|
|
4
4
|
|
|
5
5
|
// src/configs/recommended.ts
|
|
6
6
|
var createRecommendedConfig = (plugin2) => ({
|
|
@@ -20,9 +20,13 @@ var createRecommendedConfig = (plugin2) => ({
|
|
|
20
20
|
"rxjs-x/no-redundant-notify": "error",
|
|
21
21
|
"rxjs-x/no-sharereplay": "error",
|
|
22
22
|
"rxjs-x/no-subject-unsubscribe": "error",
|
|
23
|
+
"rxjs-x/no-topromise": "error",
|
|
23
24
|
"rxjs-x/no-unbound-methods": "error",
|
|
24
25
|
"rxjs-x/no-unsafe-subject-next": "error",
|
|
25
|
-
"rxjs-x/no-unsafe-takeuntil": "error"
|
|
26
|
+
"rxjs-x/no-unsafe-takeuntil": "error",
|
|
27
|
+
"rxjs-x/prefer-observer": "error",
|
|
28
|
+
"rxjs-x/prefer-root-operators": "error",
|
|
29
|
+
"rxjs-x/throw-error": "error"
|
|
26
30
|
}
|
|
27
31
|
});
|
|
28
32
|
|
|
@@ -36,10 +40,10 @@ var createStrictConfig = (plugin2) => ({
|
|
|
36
40
|
"rxjs-x/no-create": "error",
|
|
37
41
|
"rxjs-x/no-explicit-generics": "error",
|
|
38
42
|
"rxjs-x/no-exposed-subjects": "error",
|
|
43
|
+
"rxjs-x/no-floating-observables": "error",
|
|
39
44
|
"rxjs-x/no-ignored-default-value": "error",
|
|
40
45
|
"rxjs-x/no-ignored-error": "error",
|
|
41
46
|
"rxjs-x/no-ignored-notifier": "error",
|
|
42
|
-
"rxjs-x/no-ignored-observable": "error",
|
|
43
47
|
"rxjs-x/no-ignored-replay-buffer": "error",
|
|
44
48
|
"rxjs-x/no-ignored-takewhile-value": "error",
|
|
45
49
|
"rxjs-x/no-implicit-any-catch": ["error", {
|
|
@@ -295,6 +299,9 @@ function isBlockStatement(node) {
|
|
|
295
299
|
function isCallExpression(node) {
|
|
296
300
|
return node.type === _utils.AST_NODE_TYPES.CallExpression;
|
|
297
301
|
}
|
|
302
|
+
function isChainExpression(node) {
|
|
303
|
+
return node.type === _utils.AST_NODE_TYPES.ChainExpression;
|
|
304
|
+
}
|
|
298
305
|
function isFunctionDeclaration(node) {
|
|
299
306
|
return node.type === _utils.AST_NODE_TYPES.FunctionDeclaration;
|
|
300
307
|
}
|
|
@@ -331,6 +338,9 @@ function isProgram(node) {
|
|
|
331
338
|
function isProperty(node) {
|
|
332
339
|
return node.type === _utils.AST_NODE_TYPES.Property;
|
|
333
340
|
}
|
|
341
|
+
function isUnaryExpression(node) {
|
|
342
|
+
return node.type === _utils.AST_NODE_TYPES.UnaryExpression;
|
|
343
|
+
}
|
|
334
344
|
|
|
335
345
|
// src/etc/get-type-services.ts
|
|
336
346
|
function getTypeServices(context) {
|
|
@@ -1318,6 +1328,87 @@ var noFinnishRule = ruleCreator({
|
|
|
1318
1328
|
}
|
|
1319
1329
|
});
|
|
1320
1330
|
|
|
1331
|
+
// src/rules/no-floating-observables.ts
|
|
1332
|
+
var defaultOptions6 = [];
|
|
1333
|
+
var messageBase = "Observables must be subscribed to, returned, converted to a promise and awaited, or be explicitly marked as ignored with the `void` operator.";
|
|
1334
|
+
var messageBaseNoVoid = "Observables must be subscribed to, returned, or converted to a promise and awaited.";
|
|
1335
|
+
var noFloatingObservablesRule = ruleCreator({
|
|
1336
|
+
defaultOptions: defaultOptions6,
|
|
1337
|
+
meta: {
|
|
1338
|
+
docs: {
|
|
1339
|
+
description: "Require Observables to be handled appropriately.",
|
|
1340
|
+
recommended: "strict",
|
|
1341
|
+
requiresTypeChecking: true
|
|
1342
|
+
},
|
|
1343
|
+
messages: {
|
|
1344
|
+
forbidden: messageBase,
|
|
1345
|
+
forbiddenNoVoid: messageBaseNoVoid
|
|
1346
|
+
},
|
|
1347
|
+
schema: [
|
|
1348
|
+
{
|
|
1349
|
+
properties: {
|
|
1350
|
+
ignoreVoid: { type: "boolean", default: true, description: "Whether to ignore `void` expressions." }
|
|
1351
|
+
},
|
|
1352
|
+
type: "object"
|
|
1353
|
+
}
|
|
1354
|
+
],
|
|
1355
|
+
type: "problem"
|
|
1356
|
+
},
|
|
1357
|
+
name: "no-floating-observables",
|
|
1358
|
+
create: (context) => {
|
|
1359
|
+
const { couldBeObservable } = getTypeServices(context);
|
|
1360
|
+
const [config = {}] = context.options;
|
|
1361
|
+
const { ignoreVoid = true } = config;
|
|
1362
|
+
function checkNode(node) {
|
|
1363
|
+
if (couldBeObservable(node)) {
|
|
1364
|
+
context.report({
|
|
1365
|
+
messageId: ignoreVoid ? "forbidden" : "forbiddenNoVoid",
|
|
1366
|
+
node
|
|
1367
|
+
});
|
|
1368
|
+
}
|
|
1369
|
+
}
|
|
1370
|
+
function checkVoid(node) {
|
|
1371
|
+
if (ignoreVoid) return;
|
|
1372
|
+
if (node.operator !== "void") return;
|
|
1373
|
+
let expression = node.argument;
|
|
1374
|
+
if (isChainExpression(expression)) {
|
|
1375
|
+
expression = expression.expression;
|
|
1376
|
+
}
|
|
1377
|
+
if (!isCallExpression(expression)) return;
|
|
1378
|
+
checkNode(expression);
|
|
1379
|
+
}
|
|
1380
|
+
return {
|
|
1381
|
+
"ExpressionStatement > CallExpression": (node) => {
|
|
1382
|
+
checkNode(node);
|
|
1383
|
+
},
|
|
1384
|
+
"ExpressionStatement > UnaryExpression": (node) => {
|
|
1385
|
+
checkVoid(node);
|
|
1386
|
+
},
|
|
1387
|
+
"ExpressionStatement > ChainExpression": (node) => {
|
|
1388
|
+
if (!isCallExpression(node.expression)) return;
|
|
1389
|
+
checkNode(node.expression);
|
|
1390
|
+
},
|
|
1391
|
+
"ExpressionStatement > SequenceExpression": (node) => {
|
|
1392
|
+
node.expressions.forEach((expression) => {
|
|
1393
|
+
if (isCallExpression(expression)) {
|
|
1394
|
+
checkNode(expression);
|
|
1395
|
+
}
|
|
1396
|
+
});
|
|
1397
|
+
},
|
|
1398
|
+
"ExpressionStatement > ArrayExpression": (node) => {
|
|
1399
|
+
node.elements.forEach((expression) => {
|
|
1400
|
+
if (!expression) return;
|
|
1401
|
+
if (isCallExpression(expression)) {
|
|
1402
|
+
checkNode(expression);
|
|
1403
|
+
} else if (isUnaryExpression(expression)) {
|
|
1404
|
+
checkVoid(expression);
|
|
1405
|
+
}
|
|
1406
|
+
});
|
|
1407
|
+
}
|
|
1408
|
+
};
|
|
1409
|
+
}
|
|
1410
|
+
});
|
|
1411
|
+
|
|
1321
1412
|
// src/rules/no-ignored-default-value.ts
|
|
1322
1413
|
|
|
1323
1414
|
var noIgnoredDefaultValueRule = ruleCreator({
|
|
@@ -1559,37 +1650,6 @@ var noIgnoredNotifierRule = ruleCreator({
|
|
|
1559
1650
|
}
|
|
1560
1651
|
});
|
|
1561
1652
|
|
|
1562
|
-
// src/rules/no-ignored-observable.ts
|
|
1563
|
-
var noIgnoredObservableRule = ruleCreator({
|
|
1564
|
-
defaultOptions: [],
|
|
1565
|
-
meta: {
|
|
1566
|
-
docs: {
|
|
1567
|
-
description: "Disallow ignoring observables returned by functions.",
|
|
1568
|
-
recommended: "strict",
|
|
1569
|
-
requiresTypeChecking: true
|
|
1570
|
-
},
|
|
1571
|
-
messages: {
|
|
1572
|
-
forbidden: "Ignoring a returned Observable is forbidden."
|
|
1573
|
-
},
|
|
1574
|
-
schema: [],
|
|
1575
|
-
type: "problem"
|
|
1576
|
-
},
|
|
1577
|
-
name: "no-ignored-observable",
|
|
1578
|
-
create: (context) => {
|
|
1579
|
-
const { couldBeObservable } = getTypeServices(context);
|
|
1580
|
-
return {
|
|
1581
|
-
"ExpressionStatement > CallExpression": (node) => {
|
|
1582
|
-
if (couldBeObservable(node)) {
|
|
1583
|
-
context.report({
|
|
1584
|
-
messageId: "forbidden",
|
|
1585
|
-
node
|
|
1586
|
-
});
|
|
1587
|
-
}
|
|
1588
|
-
}
|
|
1589
|
-
};
|
|
1590
|
-
}
|
|
1591
|
-
});
|
|
1592
|
-
|
|
1593
1653
|
// src/rules/no-ignored-replay-buffer.ts
|
|
1594
1654
|
var noIgnoredReplayBufferRule = ruleCreator({
|
|
1595
1655
|
defaultOptions: [],
|
|
@@ -1780,9 +1840,9 @@ function isParenthesised(sourceCode, node) {
|
|
|
1780
1840
|
const after = sourceCode.getTokenAfter(node);
|
|
1781
1841
|
return before && after && before.value === "(" && before.range[1] <= node.range[0] && after.value === ")" && after.range[0] >= node.range[1];
|
|
1782
1842
|
}
|
|
1783
|
-
var
|
|
1843
|
+
var defaultOptions7 = [];
|
|
1784
1844
|
var noImplicitAnyCatchRule = ruleCreator({
|
|
1785
|
-
defaultOptions:
|
|
1845
|
+
defaultOptions: defaultOptions7,
|
|
1786
1846
|
meta: {
|
|
1787
1847
|
docs: {
|
|
1788
1848
|
description: "Disallow implicit `any` error parameters in `catchError` operators.",
|
|
@@ -2149,9 +2209,9 @@ function isExpressionObserver(expressionStatement, couldBeType2) {
|
|
|
2149
2209
|
|
|
2150
2210
|
// src/rules/no-sharereplay.ts
|
|
2151
2211
|
|
|
2152
|
-
var
|
|
2212
|
+
var defaultOptions8 = [];
|
|
2153
2213
|
var noSharereplayRule = ruleCreator({
|
|
2154
|
-
defaultOptions:
|
|
2214
|
+
defaultOptions: defaultOptions8,
|
|
2155
2215
|
meta: {
|
|
2156
2216
|
docs: {
|
|
2157
2217
|
description: "Disallow unsafe `shareReplay` usage.",
|
|
@@ -2385,7 +2445,7 @@ var noTopromiseRule = ruleCreator({
|
|
|
2385
2445
|
meta: {
|
|
2386
2446
|
docs: {
|
|
2387
2447
|
description: "Disallow use of the `toPromise` method.",
|
|
2388
|
-
recommended: "
|
|
2448
|
+
recommended: "recommended",
|
|
2389
2449
|
requiresTypeChecking: true
|
|
2390
2450
|
},
|
|
2391
2451
|
hasSuggestions: true,
|
|
@@ -2539,9 +2599,9 @@ var noUnboundMethodsRule = ruleCreator({
|
|
|
2539
2599
|
|
|
2540
2600
|
// src/rules/no-unsafe-catch.ts
|
|
2541
2601
|
|
|
2542
|
-
var
|
|
2602
|
+
var defaultOptions9 = [];
|
|
2543
2603
|
var noUnsafeCatchRule = ruleCreator({
|
|
2544
|
-
defaultOptions:
|
|
2604
|
+
defaultOptions: defaultOptions9,
|
|
2545
2605
|
meta: {
|
|
2546
2606
|
docs: {
|
|
2547
2607
|
description: "Disallow unsafe `catchError` usage in effects and epics.",
|
|
@@ -2600,9 +2660,9 @@ var noUnsafeCatchRule = ruleCreator({
|
|
|
2600
2660
|
|
|
2601
2661
|
// src/rules/no-unsafe-first.ts
|
|
2602
2662
|
|
|
2603
|
-
var
|
|
2663
|
+
var defaultOptions10 = [];
|
|
2604
2664
|
var noUnsafeFirstRule = ruleCreator({
|
|
2605
|
-
defaultOptions:
|
|
2665
|
+
defaultOptions: defaultOptions10,
|
|
2606
2666
|
meta: {
|
|
2607
2667
|
docs: {
|
|
2608
2668
|
description: "Disallow unsafe `first`/`take` usage in effects and epics.",
|
|
@@ -2724,9 +2784,9 @@ var noUnsafeSubjectNext = ruleCreator({
|
|
|
2724
2784
|
// src/rules/no-unsafe-switchmap.ts
|
|
2725
2785
|
|
|
2726
2786
|
var _decamelize = require('decamelize'); var _decamelize2 = _interopRequireDefault(_decamelize);
|
|
2727
|
-
var
|
|
2787
|
+
var defaultOptions11 = [];
|
|
2728
2788
|
var noUnsafeSwitchmapRule = ruleCreator({
|
|
2729
|
-
defaultOptions:
|
|
2789
|
+
defaultOptions: defaultOptions11,
|
|
2730
2790
|
meta: {
|
|
2731
2791
|
docs: {
|
|
2732
2792
|
description: "Disallow unsafe `switchMap` usage in effects and epics.",
|
|
@@ -2849,7 +2909,7 @@ var noUnsafeSwitchmapRule = ruleCreator({
|
|
|
2849
2909
|
|
|
2850
2910
|
// src/rules/no-unsafe-takeuntil.ts
|
|
2851
2911
|
|
|
2852
|
-
var
|
|
2912
|
+
var defaultOptions12 = [];
|
|
2853
2913
|
var allowedOperators = [
|
|
2854
2914
|
"count",
|
|
2855
2915
|
"defaultIfEmpty",
|
|
@@ -2874,7 +2934,7 @@ var allowedOperators = [
|
|
|
2874
2934
|
"toArray"
|
|
2875
2935
|
];
|
|
2876
2936
|
var noUnsafeTakeuntilRule = ruleCreator({
|
|
2877
|
-
defaultOptions:
|
|
2937
|
+
defaultOptions: defaultOptions12,
|
|
2878
2938
|
meta: {
|
|
2879
2939
|
docs: {
|
|
2880
2940
|
description: "Disallow applying operators after `takeUntil`.",
|
|
@@ -2953,13 +3013,13 @@ var noUnsafeTakeuntilRule = ruleCreator({
|
|
|
2953
3013
|
});
|
|
2954
3014
|
|
|
2955
3015
|
// src/rules/prefer-observer.ts
|
|
2956
|
-
var
|
|
3016
|
+
var defaultOptions13 = [];
|
|
2957
3017
|
var preferObserverRule = ruleCreator({
|
|
2958
|
-
defaultOptions:
|
|
3018
|
+
defaultOptions: defaultOptions13,
|
|
2959
3019
|
meta: {
|
|
2960
3020
|
docs: {
|
|
2961
3021
|
description: "Disallow passing separate handlers to `subscribe` and `tap`.",
|
|
2962
|
-
recommended: "
|
|
3022
|
+
recommended: "recommended",
|
|
2963
3023
|
requiresTypeChecking: true
|
|
2964
3024
|
},
|
|
2965
3025
|
fixable: "code",
|
|
@@ -3069,7 +3129,7 @@ var preferRootOperatorsRule = ruleCreator({
|
|
|
3069
3129
|
meta: {
|
|
3070
3130
|
docs: {
|
|
3071
3131
|
description: "Disallow importing operators from `rxjs/operators`.",
|
|
3072
|
-
recommended: "
|
|
3132
|
+
recommended: "recommended"
|
|
3073
3133
|
},
|
|
3074
3134
|
fixable: "code",
|
|
3075
3135
|
hasSuggestions: true,
|
|
@@ -3191,9 +3251,9 @@ var preferRootOperatorsRule = ruleCreator({
|
|
|
3191
3251
|
|
|
3192
3252
|
// src/rules/suffix-subjects.ts
|
|
3193
3253
|
|
|
3194
|
-
var
|
|
3254
|
+
var defaultOptions14 = [];
|
|
3195
3255
|
var suffixSubjectsRule = ruleCreator({
|
|
3196
|
-
defaultOptions:
|
|
3256
|
+
defaultOptions: defaultOptions14,
|
|
3197
3257
|
meta: {
|
|
3198
3258
|
docs: {
|
|
3199
3259
|
description: "Enforce the use of a suffix in subject identifiers.",
|
|
@@ -3390,13 +3450,14 @@ var suffixSubjectsRule = ruleCreator({
|
|
|
3390
3450
|
// src/rules/throw-error.ts
|
|
3391
3451
|
|
|
3392
3452
|
|
|
3393
|
-
var
|
|
3453
|
+
var defaultOptions15 = [];
|
|
3394
3454
|
var throwErrorRule = ruleCreator({
|
|
3395
|
-
defaultOptions:
|
|
3455
|
+
defaultOptions: defaultOptions15,
|
|
3396
3456
|
meta: {
|
|
3397
3457
|
docs: {
|
|
3398
3458
|
description: "Enforce passing only `Error` values to `throwError`.",
|
|
3399
3459
|
recommended: {
|
|
3460
|
+
recommended: true,
|
|
3400
3461
|
strict: [{ allowThrowingAny: false, allowThrowingUnknown: false }]
|
|
3401
3462
|
},
|
|
3402
3463
|
requiresTypeChecking: true
|
|
@@ -3482,10 +3543,10 @@ var plugin = {
|
|
|
3482
3543
|
"no-explicit-generics": noExplicitGenericsRule,
|
|
3483
3544
|
"no-exposed-subjects": noExposedSubjectsRule,
|
|
3484
3545
|
"no-finnish": noFinnishRule,
|
|
3546
|
+
"no-floating-observables": noFloatingObservablesRule,
|
|
3485
3547
|
"no-ignored-default-value": noIgnoredDefaultValueRule,
|
|
3486
3548
|
"no-ignored-error": noIgnoredErrorRule,
|
|
3487
3549
|
"no-ignored-notifier": noIgnoredNotifierRule,
|
|
3488
|
-
"no-ignored-observable": noIgnoredObservableRule,
|
|
3489
3550
|
"no-ignored-replay-buffer": noIgnoredReplayBufferRule,
|
|
3490
3551
|
"no-ignored-subscribe": noIgnoredSubscribeRule,
|
|
3491
3552
|
"no-ignored-subscription": noIgnoredSubscriptionRule,
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// package.json
|
|
2
2
|
var name = "eslint-plugin-rxjs-x";
|
|
3
|
-
var version = "0.
|
|
3
|
+
var version = "0.5.0";
|
|
4
4
|
|
|
5
5
|
// src/configs/recommended.ts
|
|
6
6
|
var createRecommendedConfig = (plugin2) => ({
|
|
@@ -20,9 +20,13 @@ var createRecommendedConfig = (plugin2) => ({
|
|
|
20
20
|
"rxjs-x/no-redundant-notify": "error",
|
|
21
21
|
"rxjs-x/no-sharereplay": "error",
|
|
22
22
|
"rxjs-x/no-subject-unsubscribe": "error",
|
|
23
|
+
"rxjs-x/no-topromise": "error",
|
|
23
24
|
"rxjs-x/no-unbound-methods": "error",
|
|
24
25
|
"rxjs-x/no-unsafe-subject-next": "error",
|
|
25
|
-
"rxjs-x/no-unsafe-takeuntil": "error"
|
|
26
|
+
"rxjs-x/no-unsafe-takeuntil": "error",
|
|
27
|
+
"rxjs-x/prefer-observer": "error",
|
|
28
|
+
"rxjs-x/prefer-root-operators": "error",
|
|
29
|
+
"rxjs-x/throw-error": "error"
|
|
26
30
|
}
|
|
27
31
|
});
|
|
28
32
|
|
|
@@ -36,10 +40,10 @@ var createStrictConfig = (plugin2) => ({
|
|
|
36
40
|
"rxjs-x/no-create": "error",
|
|
37
41
|
"rxjs-x/no-explicit-generics": "error",
|
|
38
42
|
"rxjs-x/no-exposed-subjects": "error",
|
|
43
|
+
"rxjs-x/no-floating-observables": "error",
|
|
39
44
|
"rxjs-x/no-ignored-default-value": "error",
|
|
40
45
|
"rxjs-x/no-ignored-error": "error",
|
|
41
46
|
"rxjs-x/no-ignored-notifier": "error",
|
|
42
|
-
"rxjs-x/no-ignored-observable": "error",
|
|
43
47
|
"rxjs-x/no-ignored-replay-buffer": "error",
|
|
44
48
|
"rxjs-x/no-ignored-takewhile-value": "error",
|
|
45
49
|
"rxjs-x/no-implicit-any-catch": ["error", {
|
|
@@ -295,6 +299,9 @@ function isBlockStatement(node) {
|
|
|
295
299
|
function isCallExpression(node) {
|
|
296
300
|
return node.type === AST_NODE_TYPES2.CallExpression;
|
|
297
301
|
}
|
|
302
|
+
function isChainExpression(node) {
|
|
303
|
+
return node.type === AST_NODE_TYPES2.ChainExpression;
|
|
304
|
+
}
|
|
298
305
|
function isFunctionDeclaration(node) {
|
|
299
306
|
return node.type === AST_NODE_TYPES2.FunctionDeclaration;
|
|
300
307
|
}
|
|
@@ -331,6 +338,9 @@ function isProgram(node) {
|
|
|
331
338
|
function isProperty(node) {
|
|
332
339
|
return node.type === AST_NODE_TYPES2.Property;
|
|
333
340
|
}
|
|
341
|
+
function isUnaryExpression(node) {
|
|
342
|
+
return node.type === AST_NODE_TYPES2.UnaryExpression;
|
|
343
|
+
}
|
|
334
344
|
|
|
335
345
|
// src/etc/get-type-services.ts
|
|
336
346
|
function getTypeServices(context) {
|
|
@@ -1318,6 +1328,87 @@ var noFinnishRule = ruleCreator({
|
|
|
1318
1328
|
}
|
|
1319
1329
|
});
|
|
1320
1330
|
|
|
1331
|
+
// src/rules/no-floating-observables.ts
|
|
1332
|
+
var defaultOptions6 = [];
|
|
1333
|
+
var messageBase = "Observables must be subscribed to, returned, converted to a promise and awaited, or be explicitly marked as ignored with the `void` operator.";
|
|
1334
|
+
var messageBaseNoVoid = "Observables must be subscribed to, returned, or converted to a promise and awaited.";
|
|
1335
|
+
var noFloatingObservablesRule = ruleCreator({
|
|
1336
|
+
defaultOptions: defaultOptions6,
|
|
1337
|
+
meta: {
|
|
1338
|
+
docs: {
|
|
1339
|
+
description: "Require Observables to be handled appropriately.",
|
|
1340
|
+
recommended: "strict",
|
|
1341
|
+
requiresTypeChecking: true
|
|
1342
|
+
},
|
|
1343
|
+
messages: {
|
|
1344
|
+
forbidden: messageBase,
|
|
1345
|
+
forbiddenNoVoid: messageBaseNoVoid
|
|
1346
|
+
},
|
|
1347
|
+
schema: [
|
|
1348
|
+
{
|
|
1349
|
+
properties: {
|
|
1350
|
+
ignoreVoid: { type: "boolean", default: true, description: "Whether to ignore `void` expressions." }
|
|
1351
|
+
},
|
|
1352
|
+
type: "object"
|
|
1353
|
+
}
|
|
1354
|
+
],
|
|
1355
|
+
type: "problem"
|
|
1356
|
+
},
|
|
1357
|
+
name: "no-floating-observables",
|
|
1358
|
+
create: (context) => {
|
|
1359
|
+
const { couldBeObservable } = getTypeServices(context);
|
|
1360
|
+
const [config = {}] = context.options;
|
|
1361
|
+
const { ignoreVoid = true } = config;
|
|
1362
|
+
function checkNode(node) {
|
|
1363
|
+
if (couldBeObservable(node)) {
|
|
1364
|
+
context.report({
|
|
1365
|
+
messageId: ignoreVoid ? "forbidden" : "forbiddenNoVoid",
|
|
1366
|
+
node
|
|
1367
|
+
});
|
|
1368
|
+
}
|
|
1369
|
+
}
|
|
1370
|
+
function checkVoid(node) {
|
|
1371
|
+
if (ignoreVoid) return;
|
|
1372
|
+
if (node.operator !== "void") return;
|
|
1373
|
+
let expression = node.argument;
|
|
1374
|
+
if (isChainExpression(expression)) {
|
|
1375
|
+
expression = expression.expression;
|
|
1376
|
+
}
|
|
1377
|
+
if (!isCallExpression(expression)) return;
|
|
1378
|
+
checkNode(expression);
|
|
1379
|
+
}
|
|
1380
|
+
return {
|
|
1381
|
+
"ExpressionStatement > CallExpression": (node) => {
|
|
1382
|
+
checkNode(node);
|
|
1383
|
+
},
|
|
1384
|
+
"ExpressionStatement > UnaryExpression": (node) => {
|
|
1385
|
+
checkVoid(node);
|
|
1386
|
+
},
|
|
1387
|
+
"ExpressionStatement > ChainExpression": (node) => {
|
|
1388
|
+
if (!isCallExpression(node.expression)) return;
|
|
1389
|
+
checkNode(node.expression);
|
|
1390
|
+
},
|
|
1391
|
+
"ExpressionStatement > SequenceExpression": (node) => {
|
|
1392
|
+
node.expressions.forEach((expression) => {
|
|
1393
|
+
if (isCallExpression(expression)) {
|
|
1394
|
+
checkNode(expression);
|
|
1395
|
+
}
|
|
1396
|
+
});
|
|
1397
|
+
},
|
|
1398
|
+
"ExpressionStatement > ArrayExpression": (node) => {
|
|
1399
|
+
node.elements.forEach((expression) => {
|
|
1400
|
+
if (!expression) return;
|
|
1401
|
+
if (isCallExpression(expression)) {
|
|
1402
|
+
checkNode(expression);
|
|
1403
|
+
} else if (isUnaryExpression(expression)) {
|
|
1404
|
+
checkVoid(expression);
|
|
1405
|
+
}
|
|
1406
|
+
});
|
|
1407
|
+
}
|
|
1408
|
+
};
|
|
1409
|
+
}
|
|
1410
|
+
});
|
|
1411
|
+
|
|
1321
1412
|
// src/rules/no-ignored-default-value.ts
|
|
1322
1413
|
import { ESLintUtils as ESLintUtils6 } from "@typescript-eslint/utils";
|
|
1323
1414
|
var noIgnoredDefaultValueRule = ruleCreator({
|
|
@@ -1559,37 +1650,6 @@ var noIgnoredNotifierRule = ruleCreator({
|
|
|
1559
1650
|
}
|
|
1560
1651
|
});
|
|
1561
1652
|
|
|
1562
|
-
// src/rules/no-ignored-observable.ts
|
|
1563
|
-
var noIgnoredObservableRule = ruleCreator({
|
|
1564
|
-
defaultOptions: [],
|
|
1565
|
-
meta: {
|
|
1566
|
-
docs: {
|
|
1567
|
-
description: "Disallow ignoring observables returned by functions.",
|
|
1568
|
-
recommended: "strict",
|
|
1569
|
-
requiresTypeChecking: true
|
|
1570
|
-
},
|
|
1571
|
-
messages: {
|
|
1572
|
-
forbidden: "Ignoring a returned Observable is forbidden."
|
|
1573
|
-
},
|
|
1574
|
-
schema: [],
|
|
1575
|
-
type: "problem"
|
|
1576
|
-
},
|
|
1577
|
-
name: "no-ignored-observable",
|
|
1578
|
-
create: (context) => {
|
|
1579
|
-
const { couldBeObservable } = getTypeServices(context);
|
|
1580
|
-
return {
|
|
1581
|
-
"ExpressionStatement > CallExpression": (node) => {
|
|
1582
|
-
if (couldBeObservable(node)) {
|
|
1583
|
-
context.report({
|
|
1584
|
-
messageId: "forbidden",
|
|
1585
|
-
node
|
|
1586
|
-
});
|
|
1587
|
-
}
|
|
1588
|
-
}
|
|
1589
|
-
};
|
|
1590
|
-
}
|
|
1591
|
-
});
|
|
1592
|
-
|
|
1593
1653
|
// src/rules/no-ignored-replay-buffer.ts
|
|
1594
1654
|
var noIgnoredReplayBufferRule = ruleCreator({
|
|
1595
1655
|
defaultOptions: [],
|
|
@@ -1780,9 +1840,9 @@ function isParenthesised(sourceCode, node) {
|
|
|
1780
1840
|
const after = sourceCode.getTokenAfter(node);
|
|
1781
1841
|
return before && after && before.value === "(" && before.range[1] <= node.range[0] && after.value === ")" && after.range[0] >= node.range[1];
|
|
1782
1842
|
}
|
|
1783
|
-
var
|
|
1843
|
+
var defaultOptions7 = [];
|
|
1784
1844
|
var noImplicitAnyCatchRule = ruleCreator({
|
|
1785
|
-
defaultOptions:
|
|
1845
|
+
defaultOptions: defaultOptions7,
|
|
1786
1846
|
meta: {
|
|
1787
1847
|
docs: {
|
|
1788
1848
|
description: "Disallow implicit `any` error parameters in `catchError` operators.",
|
|
@@ -2149,9 +2209,9 @@ function isExpressionObserver(expressionStatement, couldBeType2) {
|
|
|
2149
2209
|
|
|
2150
2210
|
// src/rules/no-sharereplay.ts
|
|
2151
2211
|
import { AST_NODE_TYPES as AST_NODE_TYPES6 } from "@typescript-eslint/utils";
|
|
2152
|
-
var
|
|
2212
|
+
var defaultOptions8 = [];
|
|
2153
2213
|
var noSharereplayRule = ruleCreator({
|
|
2154
|
-
defaultOptions:
|
|
2214
|
+
defaultOptions: defaultOptions8,
|
|
2155
2215
|
meta: {
|
|
2156
2216
|
docs: {
|
|
2157
2217
|
description: "Disallow unsafe `shareReplay` usage.",
|
|
@@ -2385,7 +2445,7 @@ var noTopromiseRule = ruleCreator({
|
|
|
2385
2445
|
meta: {
|
|
2386
2446
|
docs: {
|
|
2387
2447
|
description: "Disallow use of the `toPromise` method.",
|
|
2388
|
-
recommended: "
|
|
2448
|
+
recommended: "recommended",
|
|
2389
2449
|
requiresTypeChecking: true
|
|
2390
2450
|
},
|
|
2391
2451
|
hasSuggestions: true,
|
|
@@ -2539,9 +2599,9 @@ var noUnboundMethodsRule = ruleCreator({
|
|
|
2539
2599
|
|
|
2540
2600
|
// src/rules/no-unsafe-catch.ts
|
|
2541
2601
|
import { stripIndent as stripIndent4 } from "common-tags";
|
|
2542
|
-
var
|
|
2602
|
+
var defaultOptions9 = [];
|
|
2543
2603
|
var noUnsafeCatchRule = ruleCreator({
|
|
2544
|
-
defaultOptions:
|
|
2604
|
+
defaultOptions: defaultOptions9,
|
|
2545
2605
|
meta: {
|
|
2546
2606
|
docs: {
|
|
2547
2607
|
description: "Disallow unsafe `catchError` usage in effects and epics.",
|
|
@@ -2600,9 +2660,9 @@ var noUnsafeCatchRule = ruleCreator({
|
|
|
2600
2660
|
|
|
2601
2661
|
// src/rules/no-unsafe-first.ts
|
|
2602
2662
|
import { stripIndent as stripIndent5 } from "common-tags";
|
|
2603
|
-
var
|
|
2663
|
+
var defaultOptions10 = [];
|
|
2604
2664
|
var noUnsafeFirstRule = ruleCreator({
|
|
2605
|
-
defaultOptions:
|
|
2665
|
+
defaultOptions: defaultOptions10,
|
|
2606
2666
|
meta: {
|
|
2607
2667
|
docs: {
|
|
2608
2668
|
description: "Disallow unsafe `first`/`take` usage in effects and epics.",
|
|
@@ -2724,9 +2784,9 @@ var noUnsafeSubjectNext = ruleCreator({
|
|
|
2724
2784
|
// src/rules/no-unsafe-switchmap.ts
|
|
2725
2785
|
import { stripIndent as stripIndent6 } from "common-tags";
|
|
2726
2786
|
import decamelize from "decamelize";
|
|
2727
|
-
var
|
|
2787
|
+
var defaultOptions11 = [];
|
|
2728
2788
|
var noUnsafeSwitchmapRule = ruleCreator({
|
|
2729
|
-
defaultOptions:
|
|
2789
|
+
defaultOptions: defaultOptions11,
|
|
2730
2790
|
meta: {
|
|
2731
2791
|
docs: {
|
|
2732
2792
|
description: "Disallow unsafe `switchMap` usage in effects and epics.",
|
|
@@ -2849,7 +2909,7 @@ var noUnsafeSwitchmapRule = ruleCreator({
|
|
|
2849
2909
|
|
|
2850
2910
|
// src/rules/no-unsafe-takeuntil.ts
|
|
2851
2911
|
import { stripIndent as stripIndent7 } from "common-tags";
|
|
2852
|
-
var
|
|
2912
|
+
var defaultOptions12 = [];
|
|
2853
2913
|
var allowedOperators = [
|
|
2854
2914
|
"count",
|
|
2855
2915
|
"defaultIfEmpty",
|
|
@@ -2874,7 +2934,7 @@ var allowedOperators = [
|
|
|
2874
2934
|
"toArray"
|
|
2875
2935
|
];
|
|
2876
2936
|
var noUnsafeTakeuntilRule = ruleCreator({
|
|
2877
|
-
defaultOptions:
|
|
2937
|
+
defaultOptions: defaultOptions12,
|
|
2878
2938
|
meta: {
|
|
2879
2939
|
docs: {
|
|
2880
2940
|
description: "Disallow applying operators after `takeUntil`.",
|
|
@@ -2953,13 +3013,13 @@ var noUnsafeTakeuntilRule = ruleCreator({
|
|
|
2953
3013
|
});
|
|
2954
3014
|
|
|
2955
3015
|
// src/rules/prefer-observer.ts
|
|
2956
|
-
var
|
|
3016
|
+
var defaultOptions13 = [];
|
|
2957
3017
|
var preferObserverRule = ruleCreator({
|
|
2958
|
-
defaultOptions:
|
|
3018
|
+
defaultOptions: defaultOptions13,
|
|
2959
3019
|
meta: {
|
|
2960
3020
|
docs: {
|
|
2961
3021
|
description: "Disallow passing separate handlers to `subscribe` and `tap`.",
|
|
2962
|
-
recommended: "
|
|
3022
|
+
recommended: "recommended",
|
|
2963
3023
|
requiresTypeChecking: true
|
|
2964
3024
|
},
|
|
2965
3025
|
fixable: "code",
|
|
@@ -3069,7 +3129,7 @@ var preferRootOperatorsRule = ruleCreator({
|
|
|
3069
3129
|
meta: {
|
|
3070
3130
|
docs: {
|
|
3071
3131
|
description: "Disallow importing operators from `rxjs/operators`.",
|
|
3072
|
-
recommended: "
|
|
3132
|
+
recommended: "recommended"
|
|
3073
3133
|
},
|
|
3074
3134
|
fixable: "code",
|
|
3075
3135
|
hasSuggestions: true,
|
|
@@ -3191,9 +3251,9 @@ var preferRootOperatorsRule = ruleCreator({
|
|
|
3191
3251
|
|
|
3192
3252
|
// src/rules/suffix-subjects.ts
|
|
3193
3253
|
import { AST_NODE_TYPES as AST_NODE_TYPES7, ESLintUtils as ESLintUtils10 } from "@typescript-eslint/utils";
|
|
3194
|
-
var
|
|
3254
|
+
var defaultOptions14 = [];
|
|
3195
3255
|
var suffixSubjectsRule = ruleCreator({
|
|
3196
|
-
defaultOptions:
|
|
3256
|
+
defaultOptions: defaultOptions14,
|
|
3197
3257
|
meta: {
|
|
3198
3258
|
docs: {
|
|
3199
3259
|
description: "Enforce the use of a suffix in subject identifiers.",
|
|
@@ -3390,13 +3450,14 @@ var suffixSubjectsRule = ruleCreator({
|
|
|
3390
3450
|
// src/rules/throw-error.ts
|
|
3391
3451
|
import { ESLintUtils as ESLintUtils11 } from "@typescript-eslint/utils";
|
|
3392
3452
|
import * as tsutils3 from "ts-api-utils";
|
|
3393
|
-
var
|
|
3453
|
+
var defaultOptions15 = [];
|
|
3394
3454
|
var throwErrorRule = ruleCreator({
|
|
3395
|
-
defaultOptions:
|
|
3455
|
+
defaultOptions: defaultOptions15,
|
|
3396
3456
|
meta: {
|
|
3397
3457
|
docs: {
|
|
3398
3458
|
description: "Enforce passing only `Error` values to `throwError`.",
|
|
3399
3459
|
recommended: {
|
|
3460
|
+
recommended: true,
|
|
3400
3461
|
strict: [{ allowThrowingAny: false, allowThrowingUnknown: false }]
|
|
3401
3462
|
},
|
|
3402
3463
|
requiresTypeChecking: true
|
|
@@ -3482,10 +3543,10 @@ var plugin = {
|
|
|
3482
3543
|
"no-explicit-generics": noExplicitGenericsRule,
|
|
3483
3544
|
"no-exposed-subjects": noExposedSubjectsRule,
|
|
3484
3545
|
"no-finnish": noFinnishRule,
|
|
3546
|
+
"no-floating-observables": noFloatingObservablesRule,
|
|
3485
3547
|
"no-ignored-default-value": noIgnoredDefaultValueRule,
|
|
3486
3548
|
"no-ignored-error": noIgnoredErrorRule,
|
|
3487
3549
|
"no-ignored-notifier": noIgnoredNotifierRule,
|
|
3488
|
-
"no-ignored-observable": noIgnoredObservableRule,
|
|
3489
3550
|
"no-ignored-replay-buffer": noIgnoredReplayBufferRule,
|
|
3490
3551
|
"no-ignored-subscribe": noIgnoredSubscribeRule,
|
|
3491
3552
|
"no-ignored-subscription": noIgnoredSubscriptionRule,
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Require Observables to be handled appropriately (`rxjs-x/no-floating-observables`)
|
|
2
|
+
|
|
3
|
+
💼 This rule is enabled in the 🔒 `strict` config.
|
|
4
|
+
|
|
5
|
+
💭 This rule requires [type information](https://typescript-eslint.io/linting/typed-linting).
|
|
6
|
+
|
|
7
|
+
<!-- end auto-generated rule header -->
|
|
8
|
+
|
|
9
|
+
A "floating" observable is one that is created without any code set up to handle any errors it might emit.
|
|
10
|
+
Like a floating Promise, floating observables can cause several issues, such as ignored errors, unhandled cold observables, and more.
|
|
11
|
+
|
|
12
|
+
This rule is like [no-floating-promises](https://typescript-eslint.io/rules/no-floating-promises/) but for Observables.
|
|
13
|
+
This rule will report observable-valued statements that are not treated in one of the following ways:
|
|
14
|
+
|
|
15
|
+
- Calling its `.subscribe()`
|
|
16
|
+
- `return`ing it
|
|
17
|
+
- Wrapping it in `lastValueFrom` or `firstValueFrom` and `await`ing it
|
|
18
|
+
- [`void`ing it](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void)
|
|
19
|
+
|
|
20
|
+
> [!TIP]
|
|
21
|
+
> `no-floating-observables` only detects apparently unhandled observable _statements_.
|
|
22
|
+
|
|
23
|
+
## Rule details
|
|
24
|
+
|
|
25
|
+
Examples of **incorrect** code for this rule:
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
import { of } from "rxjs";
|
|
29
|
+
of(42, 54);
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Examples of **correct** code for this rule:
|
|
33
|
+
|
|
34
|
+
```ts
|
|
35
|
+
import { of } from "rxjs";
|
|
36
|
+
const answers = of(42, 54);
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Options
|
|
40
|
+
|
|
41
|
+
<!-- begin auto-generated rule options list -->
|
|
42
|
+
|
|
43
|
+
| Name | Description | Type | Default |
|
|
44
|
+
| :----------- | :------------------------------------ | :------ | :------ |
|
|
45
|
+
| `ignoreVoid` | Whether to ignore `void` expressions. | Boolean | `true` |
|
|
46
|
+
|
|
47
|
+
<!-- end auto-generated rule options list -->
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Disallow use of the `toPromise` method (`rxjs-x/no-topromise`)
|
|
2
2
|
|
|
3
|
-
💼 This rule is enabled in the 🔒 `strict
|
|
3
|
+
💼 This rule is enabled in the following configs: ✅ `recommended`, 🔒 `strict`.
|
|
4
4
|
|
|
5
5
|
💡 This rule is manually fixable by [editor suggestions](https://eslint.org/docs/latest/use/core-concepts#rule-suggestions).
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Disallow passing separate handlers to `subscribe` and `tap` (`rxjs-x/prefer-observer`)
|
|
2
2
|
|
|
3
|
-
💼 This rule is enabled in the 🔒 `strict
|
|
3
|
+
💼 This rule is enabled in the following configs: ✅ `recommended`, 🔒 `strict`.
|
|
4
4
|
|
|
5
5
|
🔧💡 This rule is automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/latest/user-guide/command-line-interface#--fix) and manually fixable by [editor suggestions](https://eslint.org/docs/latest/use/core-concepts#rule-suggestions).
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Disallow importing operators from `rxjs/operators` (`rxjs-x/prefer-root-operators`)
|
|
2
2
|
|
|
3
|
-
💼 This rule is enabled in the 🔒 `strict
|
|
3
|
+
💼 This rule is enabled in the following configs: ✅ `recommended`, 🔒 `strict`.
|
|
4
4
|
|
|
5
5
|
🔧💡 This rule is automatically fixable by the [`--fix` CLI option](https://eslint.org/docs/latest/user-guide/command-line-interface#--fix) and manually fixable by [editor suggestions](https://eslint.org/docs/latest/use/core-concepts#rule-suggestions).
|
|
6
6
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Enforce passing only `Error` values to `throwError` (`rxjs-x/throw-error`)
|
|
2
2
|
|
|
3
|
-
💼 This rule is enabled in the 🔒 `strict
|
|
3
|
+
💼 This rule is enabled in the following configs: ✅ `recommended`, 🔒 `strict`.
|
|
4
4
|
|
|
5
5
|
💭 This rule requires [type information](https://typescript-eslint.io/linting/typed-linting).
|
|
6
6
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-rxjs-x",
|
|
3
3
|
"type": "commonjs",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.5.0",
|
|
5
5
|
"packageManager": "yarn@4.5.3+sha512.3003a14012e2987072d244c720506549c1aab73ee728208f1b2580a9fd67b92d61ba6b08fe93f6dce68fd771e3af1e59a0afa28dd242dd0940d73b95fedd4e90",
|
|
6
6
|
"description": "ESLint v9+ plugin for RxJS",
|
|
7
7
|
"author": "Jason Weinzierl <weinzierljason@gmail.com>",
|
|
@@ -62,7 +62,7 @@
|
|
|
62
62
|
},
|
|
63
63
|
"peerDependencies": {
|
|
64
64
|
"eslint": "^8.57.0 || ^9.0.0",
|
|
65
|
-
"rxjs": ">=7.
|
|
65
|
+
"rxjs": ">=7.2.0",
|
|
66
66
|
"typescript": ">=4.7.4"
|
|
67
67
|
},
|
|
68
68
|
"peerDependenciesMeta": {
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"@stylistic/eslint-plugin": "^2.11.0",
|
|
76
76
|
"@types/common-tags": "^1.8.4",
|
|
77
77
|
"@types/node": "~18.18.0",
|
|
78
|
-
"@typescript-eslint/rule-tester": "^8.
|
|
78
|
+
"@typescript-eslint/rule-tester": "^8.16.0",
|
|
79
79
|
"@typescript/vfs": "^1.6.0",
|
|
80
80
|
"@vitest/coverage-v8": "^2.1.5",
|
|
81
81
|
"@vitest/eslint-plugin": "^1.1.10",
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
"rxjs": "^7.8.1",
|
|
92
92
|
"tsup": "^8.3.5",
|
|
93
93
|
"typescript": "~5.7.2",
|
|
94
|
-
"typescript-eslint": "^8.
|
|
94
|
+
"typescript-eslint": "^8.16.0",
|
|
95
95
|
"vitest": "^2.1.5"
|
|
96
96
|
},
|
|
97
97
|
"engines": {
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
# Disallow ignoring observables returned by functions (`rxjs-x/no-ignored-observable`)
|
|
2
|
-
|
|
3
|
-
💼 This rule is enabled in the 🔒 `strict` config.
|
|
4
|
-
|
|
5
|
-
💭 This rule requires [type information](https://typescript-eslint.io/linting/typed-linting).
|
|
6
|
-
|
|
7
|
-
<!-- end auto-generated rule header -->
|
|
8
|
-
|
|
9
|
-
The effects failures if an observable returned by a function is neither assigned to a variable or property or passed to a function.
|
|
10
|
-
|
|
11
|
-
## Rule details
|
|
12
|
-
|
|
13
|
-
Examples of **incorrect** code for this rule:
|
|
14
|
-
|
|
15
|
-
```ts
|
|
16
|
-
import { of } from "rxjs";
|
|
17
|
-
of(42, 54);
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
Examples of **correct** code for this rule:
|
|
21
|
-
|
|
22
|
-
```ts
|
|
23
|
-
import { of } from "rxjs";
|
|
24
|
-
const answers = of(42, 54);
|
|
25
|
-
```
|