eslint-plugin-rxjs-x 0.4.0 → 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 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.4.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 defaultOptions6 = [];
1843
+ var defaultOptions7 = [];
1784
1844
  var noImplicitAnyCatchRule = ruleCreator({
1785
- defaultOptions: defaultOptions6,
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 defaultOptions7 = [];
2212
+ var defaultOptions8 = [];
2153
2213
  var noSharereplayRule = ruleCreator({
2154
- defaultOptions: defaultOptions7,
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: "strict",
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 defaultOptions8 = [];
2602
+ var defaultOptions9 = [];
2543
2603
  var noUnsafeCatchRule = ruleCreator({
2544
- defaultOptions: defaultOptions8,
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 defaultOptions9 = [];
2663
+ var defaultOptions10 = [];
2604
2664
  var noUnsafeFirstRule = ruleCreator({
2605
- defaultOptions: defaultOptions9,
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 defaultOptions10 = [];
2787
+ var defaultOptions11 = [];
2728
2788
  var noUnsafeSwitchmapRule = ruleCreator({
2729
- defaultOptions: defaultOptions10,
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 defaultOptions11 = [];
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: defaultOptions11,
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 defaultOptions12 = [];
3016
+ var defaultOptions13 = [];
2957
3017
  var preferObserverRule = ruleCreator({
2958
- defaultOptions: defaultOptions12,
3018
+ defaultOptions: defaultOptions13,
2959
3019
  meta: {
2960
3020
  docs: {
2961
3021
  description: "Disallow passing separate handlers to `subscribe` and `tap`.",
2962
- recommended: "strict",
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: "strict"
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 defaultOptions13 = [];
3254
+ var defaultOptions14 = [];
3195
3255
  var suffixSubjectsRule = ruleCreator({
3196
- defaultOptions: defaultOptions13,
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 defaultOptions14 = [];
3453
+ var defaultOptions15 = [];
3394
3454
  var throwErrorRule = ruleCreator({
3395
- defaultOptions: defaultOptions14,
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.4.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 defaultOptions6 = [];
1843
+ var defaultOptions7 = [];
1784
1844
  var noImplicitAnyCatchRule = ruleCreator({
1785
- defaultOptions: defaultOptions6,
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 defaultOptions7 = [];
2212
+ var defaultOptions8 = [];
2153
2213
  var noSharereplayRule = ruleCreator({
2154
- defaultOptions: defaultOptions7,
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: "strict",
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 defaultOptions8 = [];
2602
+ var defaultOptions9 = [];
2543
2603
  var noUnsafeCatchRule = ruleCreator({
2544
- defaultOptions: defaultOptions8,
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 defaultOptions9 = [];
2663
+ var defaultOptions10 = [];
2604
2664
  var noUnsafeFirstRule = ruleCreator({
2605
- defaultOptions: defaultOptions9,
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 defaultOptions10 = [];
2787
+ var defaultOptions11 = [];
2728
2788
  var noUnsafeSwitchmapRule = ruleCreator({
2729
- defaultOptions: defaultOptions10,
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 defaultOptions11 = [];
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: defaultOptions11,
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 defaultOptions12 = [];
3016
+ var defaultOptions13 = [];
2957
3017
  var preferObserverRule = ruleCreator({
2958
- defaultOptions: defaultOptions12,
3018
+ defaultOptions: defaultOptions13,
2959
3019
  meta: {
2960
3020
  docs: {
2961
3021
  description: "Disallow passing separate handlers to `subscribe` and `tap`.",
2962
- recommended: "strict",
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: "strict"
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 defaultOptions13 = [];
3254
+ var defaultOptions14 = [];
3195
3255
  var suffixSubjectsRule = ruleCreator({
3196
- defaultOptions: defaultOptions13,
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 defaultOptions14 = [];
3453
+ var defaultOptions15 = [];
3394
3454
  var throwErrorRule = ruleCreator({
3395
- defaultOptions: defaultOptions14,
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` config.
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` config.
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` config.
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` config.
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,8 +1,8 @@
1
1
  {
2
2
  "name": "eslint-plugin-rxjs-x",
3
3
  "type": "commonjs",
4
- "version": "0.4.0",
5
- "packageManager": "yarn@4.5.1+sha512.341db9396b6e289fecc30cd7ab3af65060e05ebff4b3b47547b278b9e67b08f485ecd8c79006b405446262142c7a38154445ef7f17c1d5d1de7d90bf9ce7054d",
4
+ "version": "0.5.0",
5
+ "packageManager": "yarn@4.5.3+sha512.3003a14012e2987072d244c720506549c1aab73ee728208f1b2580a9fd67b92d61ba6b08fe93f6dce68fd771e3af1e59a0afa28dd242dd0940d73b95fedd4e90",
6
6
  "description": "ESLint v9+ plugin for RxJS",
7
7
  "author": "Jason Weinzierl <weinzierljason@gmail.com>",
8
8
  "license": "MIT",
@@ -47,7 +47,7 @@
47
47
  "lint-docs": "markdownlint-cli2 \"**/*.md\" \"#node_modules\"",
48
48
  "lint-eslint-docs": "yarn build && eslint-doc-generator --check",
49
49
  "docs": "eslint-doc-generator",
50
- "release": "bumpp && yarn run build",
50
+ "release": "bumpp && echo \"Create a new release in GitHub to trigger the publish workflow.\"",
51
51
  "test": "vitest",
52
52
  "coverage": "vitest run --coverage",
53
53
  "typecheck": "tsc --noEmit"
@@ -62,7 +62,7 @@
62
62
  },
63
63
  "peerDependencies": {
64
64
  "eslint": "^8.57.0 || ^9.0.0",
65
- "rxjs": ">=7.0.0",
65
+ "rxjs": ">=7.2.0",
66
66
  "typescript": ">=4.7.4"
67
67
  },
68
68
  "peerDependenciesMeta": {
@@ -72,10 +72,10 @@
72
72
  },
73
73
  "devDependencies": {
74
74
  "@eslint/js": "^9.14.0",
75
- "@stylistic/eslint-plugin": "^2.10.1",
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.14.0",
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",
@@ -86,12 +86,12 @@
86
86
  "eslint-import-resolver-typescript": "^3.6.3",
87
87
  "eslint-plugin-eslint-plugin": "^6.3.2",
88
88
  "eslint-plugin-import-x": "^4.4.2",
89
- "eslint-plugin-n": "^17.13.2",
89
+ "eslint-plugin-n": "^17.14.0",
90
90
  "markdownlint-cli2": "^0.15.0",
91
91
  "rxjs": "^7.8.1",
92
92
  "tsup": "^8.3.5",
93
- "typescript": "~5.6.3",
94
- "typescript-eslint": "^8.14.0",
93
+ "typescript": "~5.7.2",
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
- ```