@ngrx/eslint-plugin 18.0.0-beta.1 → 18.0.0-rc.1
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/jest.config.d.ts +15 -0
- package/package.json +4 -5
- package/schematics/ng-add/index.d.ts +3 -0
- package/schematics/ng-add/index.js +32 -20
- package/schematics/ng-add/index.js.map +1 -1
- package/schematics/ng-add/schema.d.ts +3 -0
- package/schematics/ng-add/schema.js.map +1 -1
- package/schematics/ng-add/schema.json +16 -51
- package/scripts/generate-config.d.ts +1 -0
- package/scripts/generate-config.js +73 -73
- package/scripts/generate-config.js.map +1 -1
- package/scripts/generate-docs.d.ts +1 -0
- package/scripts/generate-docs.js +33 -65
- package/scripts/generate-docs.js.map +1 -1
- package/scripts/generate-overview.d.ts +1 -0
- package/scripts/generate-overview.js +43 -75
- package/scripts/generate-overview.js.map +1 -1
- package/spec/utils/from-fixture.d.ts +8 -0
- package/spec/utils/from-fixture.js +62 -0
- package/spec/utils/from-fixture.js.map +1 -0
- package/spec/utils/index.d.ts +2 -0
- package/spec/utils/index.js +16 -19
- package/spec/utils/index.js.map +1 -1
- package/spec/utils/rule-tester.d.ts +5 -0
- package/spec/utils/rule-tester.js +23 -0
- package/spec/utils/rule-tester.js.map +1 -0
- package/src/configs/all.d.ts +7 -0
- package/src/configs/all.js +56 -32
- package/src/configs/all.js.map +1 -1
- package/src/configs/all.json +42 -0
- package/src/configs/component-store.d.ts +7 -0
- package/src/configs/component-store.js +23 -8
- package/src/configs/component-store.js.map +1 -1
- package/src/configs/component-store.json +9 -0
- package/src/configs/effects.d.ts +7 -0
- package/src/configs/effects.js +32 -11
- package/src/configs/effects.js.map +1 -1
- package/src/configs/effects.json +18 -0
- package/src/configs/operators.d.ts +7 -0
- package/src/configs/operators.js +28 -0
- package/src/configs/operators.js.map +1 -0
- package/src/configs/operators.json +7 -0
- package/src/configs/signals.d.ts +7 -0
- package/src/configs/signals.js +34 -0
- package/src/configs/signals.js.map +1 -0
- package/src/configs/signals.json +13 -0
- package/src/configs/store.d.ts +7 -0
- package/src/configs/store.js +38 -23
- package/src/configs/store.js.map +1 -1
- package/src/configs/store.json +24 -0
- package/src/index.d.ts +153 -0
- package/src/index.js +18 -3
- package/src/index.js.map +1 -1
- package/src/rule-creator.d.ts +24 -0
- package/src/rule-creator.js +12 -58
- package/src/rule-creator.js.map +1 -1
- package/src/rules/component-store/avoid-combining-component-store-selectors.d.ts +3 -0
- package/src/rules/component-store/avoid-combining-component-store-selectors.js +22 -47
- package/src/rules/component-store/avoid-combining-component-store-selectors.js.map +1 -1
- package/src/rules/component-store/avoid-mapping-component-store-selectors.d.ts +3 -0
- package/src/rules/component-store/avoid-mapping-component-store-selectors.js +17 -20
- package/src/rules/component-store/avoid-mapping-component-store-selectors.js.map +1 -1
- package/src/rules/component-store/updater-explicit-return-type.d.ts +3 -0
- package/src/rules/component-store/updater-explicit-return-type.js +17 -20
- package/src/rules/component-store/updater-explicit-return-type.js.map +1 -1
- package/src/rules/effects/avoid-cyclic-effects.d.ts +4 -0
- package/src/rules/effects/avoid-cyclic-effects.js +47 -109
- package/src/rules/effects/avoid-cyclic-effects.js.map +1 -1
- package/src/rules/effects/no-dispatch-in-effects.d.ts +5 -0
- package/src/rules/effects/no-dispatch-in-effects.js +17 -21
- package/src/rules/effects/no-dispatch-in-effects.js.map +1 -1
- package/src/rules/effects/no-effects-in-providers.d.ts +3 -0
- package/src/rules/effects/no-effects-in-providers.js +18 -49
- package/src/rules/effects/no-effects-in-providers.js.map +1 -1
- package/src/rules/effects/no-multiple-actions-in-effects.d.ts +5 -0
- package/src/rules/effects/no-multiple-actions-in-effects.js +31 -24
- package/src/rules/effects/no-multiple-actions-in-effects.js.map +1 -1
- package/src/rules/effects/prefer-action-creator-in-of-type.d.ts +3 -0
- package/src/rules/effects/prefer-action-creator-in-of-type.js +10 -13
- package/src/rules/effects/prefer-action-creator-in-of-type.js.map +1 -1
- package/src/rules/effects/prefer-effect-callback-in-block-statement.d.ts +4 -0
- package/src/rules/effects/prefer-effect-callback-in-block-statement.js +24 -43
- package/src/rules/effects/prefer-effect-callback-in-block-statement.js.map +1 -1
- package/src/rules/effects/use-effects-lifecycle-interface.d.ts +3 -0
- package/src/rules/effects/use-effects-lifecycle-interface.js +21 -24
- package/src/rules/effects/use-effects-lifecycle-interface.js.map +1 -1
- package/src/rules/index.d.ts +35 -0
- package/src/rules/index.js +74 -53
- package/src/rules/index.js.map +1 -1
- package/src/rules/operators/prefer-concat-latest-from.d.ts +7 -0
- package/src/rules/operators/prefer-concat-latest-from.js +123 -0
- package/src/rules/operators/prefer-concat-latest-from.js.map +1 -0
- package/src/rules/signals/signal-state-no-arrays-at-root-level.d.ts +3 -0
- package/src/rules/signals/signal-state-no-arrays-at-root-level.js +59 -0
- package/src/rules/signals/signal-state-no-arrays-at-root-level.js.map +1 -0
- package/src/rules/signals/with-state-no-arrays-at-root-level.d.ts +4 -0
- package/src/rules/signals/with-state-no-arrays-at-root-level.js +72 -0
- package/src/rules/signals/with-state-no-arrays-at-root-level.js.map +1 -0
- package/src/rules/store/avoid-combining-selectors.d.ts +3 -0
- package/src/rules/store/avoid-combining-selectors.js +20 -45
- package/src/rules/store/avoid-combining-selectors.js.map +1 -1
- package/src/rules/store/avoid-dispatching-multiple-actions-sequentially.d.ts +3 -0
- package/src/rules/store/avoid-dispatching-multiple-actions-sequentially.js +20 -47
- package/src/rules/store/avoid-dispatching-multiple-actions-sequentially.js.map +1 -1
- package/src/rules/store/avoid-duplicate-actions-in-reducer.d.ts +5 -0
- package/src/rules/store/avoid-duplicate-actions-in-reducer.js +33 -101
- package/src/rules/store/avoid-duplicate-actions-in-reducer.js.map +1 -1
- package/src/rules/store/avoid-mapping-selectors.d.ts +3 -0
- package/src/rules/store/avoid-mapping-selectors.js +24 -30
- package/src/rules/store/avoid-mapping-selectors.js.map +1 -1
- package/src/rules/store/good-action-hygiene.d.ts +3 -0
- package/src/rules/store/good-action-hygiene.js +14 -34
- package/src/rules/store/good-action-hygiene.js.map +1 -1
- package/src/rules/store/no-multiple-global-stores.d.ts +6 -0
- package/src/rules/store/no-multiple-global-stores.js +34 -96
- package/src/rules/store/no-multiple-global-stores.js.map +1 -1
- package/src/rules/store/no-reducer-in-key-names.d.ts +5 -0
- package/src/rules/store/no-reducer-in-key-names.js +16 -20
- package/src/rules/store/no-reducer-in-key-names.js.map +1 -1
- package/src/rules/store/no-store-subscription.d.ts +3 -0
- package/src/rules/store/no-store-subscription.js +13 -16
- package/src/rules/store/no-store-subscription.js.map +1 -1
- package/src/rules/store/no-typed-global-store.d.ts +5 -0
- package/src/rules/store/no-typed-global-store.js +29 -70
- package/src/rules/store/no-typed-global-store.js.map +1 -1
- package/src/rules/store/on-function-explicit-return-type.d.ts +6 -0
- package/src/rules/store/on-function-explicit-return-type.js +23 -43
- package/src/rules/store/on-function-explicit-return-type.js.map +1 -1
- package/src/rules/store/prefer-action-creator-in-dispatch.d.ts +3 -0
- package/src/rules/store/prefer-action-creator-in-dispatch.js +15 -18
- package/src/rules/store/prefer-action-creator-in-dispatch.js.map +1 -1
- package/src/rules/store/prefer-action-creator.d.ts +3 -0
- package/src/rules/store/prefer-action-creator.js +10 -13
- package/src/rules/store/prefer-action-creator.js.map +1 -1
- package/src/rules/store/prefer-inline-action-props.d.ts +5 -0
- package/src/rules/store/prefer-inline-action-props.js +14 -18
- package/src/rules/store/prefer-inline-action-props.js.map +1 -1
- package/src/rules/store/prefer-one-generic-in-create-for-feature-selector.d.ts +5 -0
- package/src/rules/store/prefer-one-generic-in-create-for-feature-selector.js +16 -37
- package/src/rules/store/prefer-one-generic-in-create-for-feature-selector.js.map +1 -1
- package/src/rules/store/prefer-selector-in-select.d.ts +3 -0
- package/src/rules/store/prefer-selector-in-select.js +21 -46
- package/src/rules/store/prefer-selector-in-select.js.map +1 -1
- package/src/rules/store/prefix-selectors-with-select.d.ts +5 -0
- package/src/rules/store/prefix-selectors-with-select.js +26 -39
- package/src/rules/store/prefix-selectors-with-select.js.map +1 -1
- package/src/rules/store/select-style.d.ts +11 -0
- package/src/rules/store/select-style.js +53 -108
- package/src/rules/store/select-style.js.map +1 -1
- package/src/rules/store/use-consistent-global-store-name.d.ts +6 -0
- package/src/rules/store/use-consistent-global-store-name.js +24 -80
- package/src/rules/store/use-consistent-global-store-name.js.map +1 -1
- package/src/utils/helper-functions/docs.d.ts +1 -0
- package/src/utils/helper-functions/docs.js +1 -3
- package/src/utils/helper-functions/docs.js.map +1 -1
- package/src/utils/helper-functions/folder.d.ts +5 -0
- package/src/utils/helper-functions/folder.js +16 -88
- package/src/utils/helper-functions/folder.js.map +1 -1
- package/src/utils/helper-functions/guards.d.ts +97 -0
- package/src/utils/helper-functions/guards.js +27 -31
- package/src/utils/helper-functions/guards.js.map +1 -1
- package/src/utils/helper-functions/index.d.ts +6 -0
- package/src/utils/helper-functions/ngrx-modules.d.ts +8 -0
- package/src/utils/helper-functions/ngrx-modules.js +7 -6
- package/src/utils/helper-functions/ngrx-modules.js.map +1 -1
- package/src/utils/helper-functions/rules.d.ts +3 -0
- package/src/utils/helper-functions/rules.js +47 -0
- package/src/utils/helper-functions/rules.js.map +1 -0
- package/src/utils/helper-functions/utils.d.ts +48 -0
- package/src/utils/helper-functions/utils.js +68 -143
- package/src/utils/helper-functions/utils.js.map +1 -1
- package/src/utils/helper-functions/versions.d.ts +1 -0
- package/src/utils/helper-functions/versions.js +10 -11
- package/src/utils/helper-functions/versions.js.map +1 -1
- package/src/utils/index.d.ts +2 -0
- package/src/utils/selectors/index.d.ts +29 -0
- package/src/utils/selectors/index.js +30 -44
- package/src/utils/selectors/index.js.map +1 -1
- package/v9/index.d.ts +29 -0
- package/v9/index.js +38 -0
- package/v9/index.js.map +1 -0
- package/src/configs/all-requiring-type-checking.js +0 -46
- package/src/configs/all-requiring-type-checking.js.map +0 -1
- package/src/configs/component-store-strict.js +0 -15
- package/src/configs/component-store-strict.js.map +0 -1
- package/src/configs/effects-requiring-type-checking.js +0 -25
- package/src/configs/effects-requiring-type-checking.js.map +0 -1
- package/src/configs/effects-strict-requiring-type-checking.js +0 -25
- package/src/configs/effects-strict-requiring-type-checking.js.map +0 -1
- package/src/configs/effects-strict.js +0 -18
- package/src/configs/effects-strict.js.map +0 -1
- package/src/configs/index.js +0 -33
- package/src/configs/index.js.map +0 -1
- package/src/configs/recommended-requiring-type-checking.js +0 -46
- package/src/configs/recommended-requiring-type-checking.js.map +0 -1
- package/src/configs/recommended.js +0 -39
- package/src/configs/recommended.js.map +0 -1
- package/src/configs/store-strict.js +0 -30
- package/src/configs/store-strict.js.map +0 -1
- package/src/configs/strict-requiring-type-checking.js +0 -46
- package/src/configs/strict-requiring-type-checking.js.map +0 -1
- package/src/configs/strict.js +0 -39
- package/src/configs/strict.js.map +0 -1
- package/src/rules/effects/prefer-concat-latest-from.js +0 -153
- package/src/rules/effects/prefer-concat-latest-from.js.map +0 -1
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { TSESLint, TSESTree } from '@typescript-eslint/utils';
|
|
2
|
+
type ConstructorFunctionExpression = TSESTree.FunctionExpression & {
|
|
3
|
+
parent: TSESTree.MethodDefinition & {
|
|
4
|
+
kind: 'constructor';
|
|
5
|
+
};
|
|
6
|
+
};
|
|
7
|
+
type InjectedParameter = TSESTree.Identifier & {
|
|
8
|
+
typeAnnotation: TSESTree.TSTypeAnnotation;
|
|
9
|
+
parent: ConstructorFunctionExpression | (TSESTree.TSParameterProperty & {
|
|
10
|
+
parent: ConstructorFunctionExpression;
|
|
11
|
+
}) | TSESTree.PropertyDefinition;
|
|
12
|
+
};
|
|
13
|
+
type InjectedParameterWithSourceCode = Readonly<{
|
|
14
|
+
identifiers?: readonly InjectedParameter[];
|
|
15
|
+
sourceCode: Readonly<TSESLint.SourceCode>;
|
|
16
|
+
}>;
|
|
17
|
+
export declare function getNearestUpperNodeFrom<T extends TSESTree.Node>({ parent }: TSESTree.Node, predicate: (parent: TSESTree.Node) => parent is T): T | undefined;
|
|
18
|
+
export declare function getImportDeclarationSpecifier(importDeclarations: readonly TSESTree.ImportDeclaration[], importName: string): {
|
|
19
|
+
readonly importDeclaration: TSESTree.ImportDeclaration;
|
|
20
|
+
readonly importSpecifier: TSESTree.ImportSpecifier;
|
|
21
|
+
} | undefined;
|
|
22
|
+
export declare function getImportDeclarations(node: TSESTree.Node, moduleName: string): readonly TSESTree.ImportDeclaration[] | undefined;
|
|
23
|
+
export declare function getImportAddFix({ compatibleWithTypeOnlyImport, fixer, importName, moduleName, node, }: {
|
|
24
|
+
compatibleWithTypeOnlyImport?: boolean;
|
|
25
|
+
fixer: TSESLint.RuleFixer;
|
|
26
|
+
importName: string;
|
|
27
|
+
moduleName: string;
|
|
28
|
+
node: TSESTree.Node;
|
|
29
|
+
}): TSESLint.RuleFix | TSESLint.RuleFix[];
|
|
30
|
+
export declare function getImportRemoveFix(sourceCode: Readonly<TSESLint.SourceCode>, importDeclarations: readonly TSESTree.ImportDeclaration[], importedName: string, fixer: TSESLint.RuleFixer): TSESLint.RuleFix | TSESLint.RuleFix[];
|
|
31
|
+
export declare function getNodeToCommaRemoveFix(sourceCode: Readonly<TSESLint.SourceCode>, fixer: TSESLint.RuleFixer, node: TSESTree.Node): readonly [TSESLint.RuleFix, ...TSESLint.RuleFix[]];
|
|
32
|
+
export declare function getInterfaceName(interfaceMember: TSESTree.Identifier | TSESTree.MemberExpression): string | undefined;
|
|
33
|
+
export declare function getInterfaces({ implements: classImplements, }: TSESTree.ClassDeclaration): readonly (TSESTree.Identifier | TSESTree.MemberExpression)[];
|
|
34
|
+
export declare function getInterface(node: TSESTree.ClassDeclaration, interfaceName: string): TSESTree.Identifier | TSESTree.MemberExpression | undefined;
|
|
35
|
+
export declare function getImplementsSchemaFixer({ id, implements: classImplements }: TSESTree.ClassDeclaration, interfaceName: string): {
|
|
36
|
+
readonly implementsNodeReplace: TSESTree.Identifier | TSESTree.TSClassImplements;
|
|
37
|
+
readonly implementsTextReplace: string;
|
|
38
|
+
};
|
|
39
|
+
export declare function getLast<T extends readonly unknown[]>(items: T): T[number];
|
|
40
|
+
export declare function getDecoratorName({ expression, }: TSESTree.Decorator): string | undefined;
|
|
41
|
+
export declare function getRawText(node: TSESTree.Node): string | null;
|
|
42
|
+
export declare function capitalize<T extends string>(text: T): Capitalize<T>;
|
|
43
|
+
export declare function getNgRxEffectActions(context: TSESLint.RuleContext<string, readonly unknown[]>): InjectedParameterWithSourceCode;
|
|
44
|
+
export declare function getNgRxComponentStores(context: TSESLint.RuleContext<string, readonly unknown[]>): InjectedParameterWithSourceCode;
|
|
45
|
+
export declare function getNgRxStores(context: TSESLint.RuleContext<string, readonly unknown[]>): InjectedParameterWithSourceCode;
|
|
46
|
+
export declare function escapeText(text: string): string;
|
|
47
|
+
export declare function asPattern(identifiers: readonly InjectedParameter[]): RegExp;
|
|
48
|
+
export {};
|
|
@@ -1,47 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __values = (this && this.__values) || function(o) {
|
|
3
|
-
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
4
|
-
if (m) return m.call(o);
|
|
5
|
-
if (o && typeof o.length === "number") return {
|
|
6
|
-
next: function () {
|
|
7
|
-
if (o && i >= o.length) o = void 0;
|
|
8
|
-
return { value: o && o[i++], done: !o };
|
|
9
|
-
}
|
|
10
|
-
};
|
|
11
|
-
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
12
|
-
};
|
|
13
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
14
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
15
|
-
if (!m) return o;
|
|
16
|
-
var i = m.call(o), r, ar = [], e;
|
|
17
|
-
try {
|
|
18
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
19
|
-
}
|
|
20
|
-
catch (error) { e = { error: error }; }
|
|
21
|
-
finally {
|
|
22
|
-
try {
|
|
23
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
24
|
-
}
|
|
25
|
-
finally { if (e) throw e.error; }
|
|
26
|
-
}
|
|
27
|
-
return ar;
|
|
28
|
-
};
|
|
29
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
30
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
31
|
-
if (ar || !(i in from)) {
|
|
32
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
33
|
-
ar[i] = from[i];
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
37
|
-
};
|
|
38
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
3
|
exports.asPattern = exports.escapeText = exports.getNgRxStores = exports.getNgRxComponentStores = exports.getNgRxEffectActions = exports.capitalize = exports.getRawText = exports.getDecoratorName = exports.getLast = exports.getImplementsSchemaFixer = exports.getInterface = exports.getInterfaces = exports.getInterfaceName = exports.getNodeToCommaRemoveFix = exports.getImportRemoveFix = exports.getImportAddFix = exports.getImportDeclarations = exports.getImportDeclarationSpecifier = exports.getNearestUpperNodeFrom = void 0;
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
function getNearestUpperNodeFrom(
|
|
44
|
-
var parent = _a.parent;
|
|
4
|
+
const utils_1 = require("@typescript-eslint/utils");
|
|
5
|
+
const guards_1 = require("./guards");
|
|
6
|
+
const ngrx_modules_1 = require("./ngrx-modules");
|
|
7
|
+
function getNearestUpperNodeFrom({ parent }, predicate) {
|
|
45
8
|
while (parent && !(0, guards_1.isProgram)(parent)) {
|
|
46
9
|
if (predicate(parent)) {
|
|
47
10
|
return parent;
|
|
@@ -52,104 +15,79 @@ function getNearestUpperNodeFrom(_a, predicate) {
|
|
|
52
15
|
}
|
|
53
16
|
exports.getNearestUpperNodeFrom = getNearestUpperNodeFrom;
|
|
54
17
|
function getImportDeclarationSpecifier(importDeclarations, importName) {
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
});
|
|
63
|
-
if (importSpecifier) {
|
|
64
|
-
return { importDeclaration: importDeclaration, importSpecifier: importSpecifier };
|
|
65
|
-
}
|
|
18
|
+
for (const importDeclaration of importDeclarations) {
|
|
19
|
+
const importSpecifier = importDeclaration.specifiers.find((importClause) => {
|
|
20
|
+
return ((0, guards_1.isImportSpecifier)(importClause) &&
|
|
21
|
+
importClause.imported.name === importName);
|
|
22
|
+
});
|
|
23
|
+
if (importSpecifier) {
|
|
24
|
+
return { importDeclaration, importSpecifier };
|
|
66
25
|
}
|
|
67
26
|
}
|
|
68
|
-
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
69
|
-
finally {
|
|
70
|
-
try {
|
|
71
|
-
if (importDeclarations_1_1 && !importDeclarations_1_1.done && (_a = importDeclarations_1.return)) _a.call(importDeclarations_1);
|
|
72
|
-
}
|
|
73
|
-
finally { if (e_1) throw e_1.error; }
|
|
74
|
-
}
|
|
75
27
|
return undefined;
|
|
76
28
|
}
|
|
77
29
|
exports.getImportDeclarationSpecifier = getImportDeclarationSpecifier;
|
|
78
30
|
function getImportDeclarations(node, moduleName) {
|
|
79
|
-
|
|
31
|
+
let parentNode = node;
|
|
80
32
|
while (parentNode && !(0, guards_1.isProgram)(parentNode)) {
|
|
81
33
|
parentNode = parentNode.parent;
|
|
82
34
|
}
|
|
83
|
-
return parentNode
|
|
35
|
+
return parentNode?.body.filter((node) => {
|
|
84
36
|
return (0, guards_1.isImportDeclaration)(node) && node.source.value === moduleName;
|
|
85
37
|
});
|
|
86
38
|
}
|
|
87
39
|
exports.getImportDeclarations = getImportDeclarations;
|
|
88
|
-
function getCorrespondentImportClause(importDeclarations, compatibleWithTypeOnlyImport) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
var lastImportSpecifier = getLast(specifiers);
|
|
96
|
-
if ((!compatibleWithTypeOnlyImport && importKind === 'type') ||
|
|
97
|
-
(0, guards_1.isImportNamespaceSpecifier)(lastImportSpecifier)) {
|
|
98
|
-
continue;
|
|
99
|
-
}
|
|
100
|
-
importClause = lastImportSpecifier;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
catch (e_2_1) { e_2 = { error: e_2_1 }; }
|
|
104
|
-
finally {
|
|
105
|
-
try {
|
|
106
|
-
if (importDeclarations_2_1 && !importDeclarations_2_1.done && (_a = importDeclarations_2.return)) _a.call(importDeclarations_2);
|
|
40
|
+
function getCorrespondentImportClause(importDeclarations, compatibleWithTypeOnlyImport = false) {
|
|
41
|
+
let importClause;
|
|
42
|
+
for (const { importKind, specifiers } of importDeclarations) {
|
|
43
|
+
const lastImportSpecifier = getLast(specifiers);
|
|
44
|
+
if ((!compatibleWithTypeOnlyImport && importKind === 'type') ||
|
|
45
|
+
(0, guards_1.isImportNamespaceSpecifier)(lastImportSpecifier)) {
|
|
46
|
+
continue;
|
|
107
47
|
}
|
|
108
|
-
|
|
48
|
+
importClause = lastImportSpecifier;
|
|
109
49
|
}
|
|
110
50
|
return importClause;
|
|
111
51
|
}
|
|
112
|
-
function getImportAddFix(
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
if (!(importDeclarations === null || importDeclarations === void 0 ? void 0 : importDeclarations.length)) {
|
|
52
|
+
function getImportAddFix({ compatibleWithTypeOnlyImport = false, fixer, importName, moduleName, node, }) {
|
|
53
|
+
const fullImport = `import { ${importName} } from '${moduleName}';`;
|
|
54
|
+
const importDeclarations = getImportDeclarations(node, moduleName);
|
|
55
|
+
if (!importDeclarations?.length) {
|
|
117
56
|
return fixer.insertTextAfterRange([0, 0], fullImport);
|
|
118
57
|
}
|
|
119
|
-
|
|
58
|
+
const importDeclarationSpecifier = getImportDeclarationSpecifier(importDeclarations, importName);
|
|
120
59
|
if (importDeclarationSpecifier) {
|
|
121
60
|
return [];
|
|
122
61
|
}
|
|
123
|
-
|
|
62
|
+
const importClause = getCorrespondentImportClause(importDeclarations, compatibleWithTypeOnlyImport);
|
|
124
63
|
if (!importClause) {
|
|
125
64
|
return fixer.insertTextAfterRange([0, 0], fullImport);
|
|
126
65
|
}
|
|
127
|
-
|
|
128
|
-
?
|
|
129
|
-
:
|
|
66
|
+
const replacementText = (0, guards_1.isImportDefaultSpecifier)(importClause)
|
|
67
|
+
? `, { ${importName} }`
|
|
68
|
+
: `, ${importName}`;
|
|
130
69
|
return fixer.insertTextAfter(importClause, replacementText);
|
|
131
70
|
}
|
|
132
71
|
exports.getImportAddFix = getImportAddFix;
|
|
133
72
|
function getImportRemoveFix(sourceCode, importDeclarations, importedName, fixer) {
|
|
134
|
-
|
|
135
|
-
var _b = (_a = getImportDeclarationSpecifier(importDeclarations, importedName)) !== null && _a !== void 0 ? _a : {}, importDeclaration = _b.importDeclaration, importSpecifier = _b.importSpecifier;
|
|
73
|
+
const { importDeclaration, importSpecifier } = getImportDeclarationSpecifier(importDeclarations, importedName) ?? {};
|
|
136
74
|
if (!importDeclaration || !importSpecifier) {
|
|
137
75
|
return [];
|
|
138
76
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
77
|
+
const isFirstImportSpecifier = importDeclaration.specifiers[0] === importSpecifier;
|
|
78
|
+
const isLastImportSpecifier = getLast(importDeclaration.specifiers) === importSpecifier;
|
|
79
|
+
const isSingleImportSpecifier = isFirstImportSpecifier && isLastImportSpecifier;
|
|
142
80
|
if (isSingleImportSpecifier) {
|
|
143
81
|
return fixer.remove(importDeclaration);
|
|
144
82
|
}
|
|
145
|
-
|
|
83
|
+
const tokenAfterImportSpecifier = sourceCode.getTokenAfter(importSpecifier);
|
|
146
84
|
if (isFirstImportSpecifier && tokenAfterImportSpecifier) {
|
|
147
85
|
return fixer.removeRange([
|
|
148
86
|
importSpecifier.range[0],
|
|
149
87
|
tokenAfterImportSpecifier.range[1],
|
|
150
88
|
]);
|
|
151
89
|
}
|
|
152
|
-
|
|
90
|
+
const tokenBeforeImportSpecifier = sourceCode.getTokenBefore(importSpecifier);
|
|
153
91
|
if (!tokenBeforeImportSpecifier) {
|
|
154
92
|
return [];
|
|
155
93
|
}
|
|
@@ -160,11 +98,12 @@ function getImportRemoveFix(sourceCode, importDeclarations, importedName, fixer)
|
|
|
160
98
|
}
|
|
161
99
|
exports.getImportRemoveFix = getImportRemoveFix;
|
|
162
100
|
function getNodeToCommaRemoveFix(sourceCode, fixer, node) {
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
return
|
|
166
|
-
fixer.remove(node)
|
|
167
|
-
|
|
101
|
+
const nextToken = sourceCode.getTokenAfter(node);
|
|
102
|
+
const isNextTokenComma = nextToken && utils_1.ASTUtils.isCommaToken(nextToken);
|
|
103
|
+
return [
|
|
104
|
+
fixer.remove(node),
|
|
105
|
+
...(isNextTokenComma ? [fixer.remove(nextToken)] : []),
|
|
106
|
+
];
|
|
168
107
|
}
|
|
169
108
|
exports.getNodeToCommaRemoveFix = getNodeToCommaRemoveFix;
|
|
170
109
|
function getInterfaceName(interfaceMember) {
|
|
@@ -176,34 +115,28 @@ function getInterfaceName(interfaceMember) {
|
|
|
176
115
|
: undefined;
|
|
177
116
|
}
|
|
178
117
|
exports.getInterfaceName = getInterfaceName;
|
|
179
|
-
function getInterfaces(
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
.map(function (_a) {
|
|
183
|
-
var expression = _a.expression;
|
|
184
|
-
return expression;
|
|
185
|
-
})
|
|
118
|
+
function getInterfaces({ implements: classImplements, }) {
|
|
119
|
+
return (classImplements ?? [])
|
|
120
|
+
.map(({ expression }) => expression)
|
|
186
121
|
.filter(guards_1.isIdentifierOrMemberExpression);
|
|
187
122
|
}
|
|
188
123
|
exports.getInterfaces = getInterfaces;
|
|
189
124
|
function getInterface(node, interfaceName) {
|
|
190
|
-
return getInterfaces(node).find(
|
|
125
|
+
return getInterfaces(node).find((interfaceMember) => getInterfaceName(interfaceMember) === interfaceName);
|
|
191
126
|
}
|
|
192
127
|
exports.getInterface = getInterface;
|
|
193
|
-
function getImplementsSchemaFixer(
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
return { implementsNodeReplace: implementsNodeReplace, implementsTextReplace: implementsTextReplace };
|
|
128
|
+
function getImplementsSchemaFixer({ id, implements: classImplements }, interfaceName) {
|
|
129
|
+
const [implementsNodeReplace, implementsTextReplace] = classImplements && classImplements.length
|
|
130
|
+
? [getLast(classImplements), `, ${interfaceName}`]
|
|
131
|
+
: [id, ` implements ${interfaceName}`];
|
|
132
|
+
return { implementsNodeReplace, implementsTextReplace };
|
|
199
133
|
}
|
|
200
134
|
exports.getImplementsSchemaFixer = getImplementsSchemaFixer;
|
|
201
135
|
function getLast(items) {
|
|
202
136
|
return items.slice(-1)[0];
|
|
203
137
|
}
|
|
204
138
|
exports.getLast = getLast;
|
|
205
|
-
function getDecoratorName(
|
|
206
|
-
var expression = _a.expression;
|
|
139
|
+
function getDecoratorName({ expression, }) {
|
|
207
140
|
if ((0, guards_1.isIdentifier)(expression)) {
|
|
208
141
|
return expression.name;
|
|
209
142
|
}
|
|
@@ -225,35 +158,30 @@ function getRawText(node) {
|
|
|
225
158
|
return node.raw;
|
|
226
159
|
}
|
|
227
160
|
if ((0, guards_1.isTemplateElement)(node)) {
|
|
228
|
-
return
|
|
161
|
+
return `\`${node.value.raw}\``;
|
|
229
162
|
}
|
|
230
163
|
if ((0, guards_1.isTemplateLiteral)(node)) {
|
|
231
|
-
return
|
|
164
|
+
return `\`${node.quasis[0].value.raw}\``;
|
|
232
165
|
}
|
|
233
166
|
return null;
|
|
234
167
|
}
|
|
235
168
|
exports.getRawText = getRawText;
|
|
236
169
|
function capitalize(text) {
|
|
237
|
-
return
|
|
170
|
+
return `${text[0].toUpperCase()}${text.slice(1)}`;
|
|
238
171
|
}
|
|
239
172
|
exports.capitalize = capitalize;
|
|
240
173
|
function getInjectedParametersWithSourceCode(context, moduleName, importName) {
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
var injectImportSpecifier = ((_d = getImportDeclarationSpecifier(injectImportDeclarations, 'inject')) !== null && _d !== void 0 ? _d : {}).importSpecifier;
|
|
174
|
+
const sourceCode = context.getSourceCode();
|
|
175
|
+
const importDeclarations = getImportDeclarations(sourceCode.ast, moduleName) ?? [];
|
|
176
|
+
const { importSpecifier } = getImportDeclarationSpecifier(importDeclarations, importName) ?? {};
|
|
177
|
+
const injectImportDeclarations = getImportDeclarations(sourceCode.ast, '@angular/core') ?? [];
|
|
178
|
+
const { importSpecifier: injectImportSpecifier } = getImportDeclarationSpecifier(injectImportDeclarations, 'inject') ?? {};
|
|
247
179
|
if (!importSpecifier) {
|
|
248
|
-
return { sourceCode
|
|
180
|
+
return { sourceCode };
|
|
249
181
|
}
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
return name === importName;
|
|
254
|
-
});
|
|
255
|
-
var identifiers = (_e = typedVariable === null || typedVariable === void 0 ? void 0 : typedVariable.references) === null || _e === void 0 ? void 0 : _e.reduce(function (identifiers, _a) {
|
|
256
|
-
var parent = _a.identifier.parent;
|
|
182
|
+
const variables = sourceCode.getDeclaredVariables(importSpecifier);
|
|
183
|
+
const typedVariable = variables.find(({ name }) => name === importName);
|
|
184
|
+
const identifiers = typedVariable?.references?.reduce((identifiers, { identifier: { parent } }) => {
|
|
257
185
|
if (!parent) {
|
|
258
186
|
return identifiers;
|
|
259
187
|
}
|
|
@@ -264,7 +192,7 @@ function getInjectedParametersWithSourceCode(context, moduleName, importName) {
|
|
|
264
192
|
(0, guards_1.isIdentifier)(parent.parent.parent)) {
|
|
265
193
|
return identifiers.concat(parent.parent.parent);
|
|
266
194
|
}
|
|
267
|
-
|
|
195
|
+
const parentToCheck = (0, guards_1.isTSInstantiationExpression)(parent)
|
|
268
196
|
? parent.parent
|
|
269
197
|
: parent;
|
|
270
198
|
if (parentToCheck &&
|
|
@@ -279,7 +207,7 @@ function getInjectedParametersWithSourceCode(context, moduleName, importName) {
|
|
|
279
207
|
}
|
|
280
208
|
return identifiers;
|
|
281
209
|
}, []);
|
|
282
|
-
return { identifiers
|
|
210
|
+
return { identifiers, sourceCode };
|
|
283
211
|
}
|
|
284
212
|
function getNgRxEffectActions(context) {
|
|
285
213
|
return getInjectedParametersWithSourceCode(context, ngrx_modules_1.NGRX_MODULE_PATHS.effects, 'Actions');
|
|
@@ -299,11 +227,8 @@ function escapeText(text) {
|
|
|
299
227
|
}
|
|
300
228
|
exports.escapeText = escapeText;
|
|
301
229
|
function asPattern(identifiers) {
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
return escapeText(name);
|
|
305
|
-
});
|
|
306
|
-
return new RegExp("^(".concat(escapedNames.join('|'), ")$"));
|
|
230
|
+
const escapedNames = identifiers.map(({ name }) => escapeText(name));
|
|
231
|
+
return new RegExp(`^(${escapedNames.join('|')})$`);
|
|
307
232
|
}
|
|
308
233
|
exports.asPattern = asPattern;
|
|
309
234
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../modules/eslint-plugin/src/utils/helper-functions/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TSESLint, TSESTree } from '@typescript-eslint/experimental-utils';\nimport { ASTUtils } from '@typescript-eslint/experimental-utils';\nimport {\n isCallExpression,\n isIdentifier,\n isIdentifierOrMemberExpression,\n isImportDeclaration,\n isImportDefaultSpecifier,\n isImportNamespaceSpecifier,\n isImportSpecifier,\n isLiteral,\n isMethodDefinition,\n isProgram,\n isProperty,\n isPropertyDefinition,\n isTSTypeAnnotation,\n isTSTypeReference,\n isTemplateElement,\n isTemplateLiteral,\n isTSInstantiationExpression,\n} from './guards';\nimport { NGRX_MODULE_PATHS } from './ngrx-modules';\n\ntype ConstructorFunctionExpression = TSESTree.FunctionExpression & {\n parent: TSESTree.MethodDefinition & { kind: 'constructor' };\n};\ntype InjectedParameter =\n | TSESTree.Identifier & {\n typeAnnotation: TSESTree.TSTypeAnnotation;\n parent:\n | ConstructorFunctionExpression\n | (TSESTree.TSParameterProperty & {\n parent: ConstructorFunctionExpression;\n })\n | TSESTree.PropertyDefinition;\n };\ntype InjectedParameterWithSourceCode = Readonly<{\n identifiers?: readonly InjectedParameter[];\n sourceCode: Readonly<TSESLint.SourceCode>;\n}>;\n\nexport function getNearestUpperNodeFrom<T extends TSESTree.Node>(\n { parent }: TSESTree.Node,\n predicate: (parent: TSESTree.Node) => parent is T\n): T | undefined {\n while (parent && !isProgram(parent)) {\n if (predicate(parent)) {\n return parent;\n }\n\n parent = parent.parent;\n }\n\n return undefined;\n}\n\nexport function getImportDeclarationSpecifier(\n importDeclarations: readonly TSESTree.ImportDeclaration[],\n importName: string\n) {\n for (const importDeclaration of importDeclarations) {\n const importSpecifier = importDeclaration.specifiers.find(\n (importClause): importClause is TSESTree.ImportSpecifier => {\n return (\n isImportSpecifier(importClause) &&\n importClause.imported.name === importName\n );\n }\n );\n\n if (importSpecifier) {\n return { importDeclaration, importSpecifier } as const;\n }\n }\n\n return undefined;\n}\n\nexport function getImportDeclarations(\n node: TSESTree.Node,\n moduleName: string\n): readonly TSESTree.ImportDeclaration[] | undefined {\n let parentNode: TSESTree.Node | undefined = node;\n\n while (parentNode && !isProgram(parentNode)) {\n parentNode = parentNode.parent;\n }\n\n return parentNode?.body.filter((node): node is TSESTree.ImportDeclaration => {\n return isImportDeclaration(node) && node.source.value === moduleName;\n });\n}\n\nfunction getCorrespondentImportClause(\n importDeclarations: readonly TSESTree.ImportDeclaration[],\n compatibleWithTypeOnlyImport = false\n) {\n let importClause: TSESTree.ImportClause | undefined;\n\n for (const { importKind, specifiers } of importDeclarations) {\n const lastImportSpecifier = getLast(specifiers);\n\n if (\n (!compatibleWithTypeOnlyImport && importKind === 'type') ||\n isImportNamespaceSpecifier(lastImportSpecifier)\n ) {\n continue;\n }\n\n importClause = lastImportSpecifier;\n }\n\n return importClause;\n}\n\nexport function getImportAddFix({\n compatibleWithTypeOnlyImport = false,\n fixer,\n importName,\n moduleName,\n node,\n}: {\n compatibleWithTypeOnlyImport?: boolean;\n fixer: TSESLint.RuleFixer;\n importName: string;\n moduleName: string;\n node: TSESTree.Node;\n}): TSESLint.RuleFix | TSESLint.RuleFix[] {\n const fullImport = `import { ${importName} } from '${moduleName}';\\n`;\n const importDeclarations = getImportDeclarations(node, moduleName);\n\n if (!importDeclarations?.length) {\n return fixer.insertTextAfterRange([0, 0], fullImport);\n }\n\n const importDeclarationSpecifier = getImportDeclarationSpecifier(\n importDeclarations,\n importName\n );\n\n if (importDeclarationSpecifier) {\n return [];\n }\n\n const importClause = getCorrespondentImportClause(\n importDeclarations,\n compatibleWithTypeOnlyImport\n );\n\n if (!importClause) {\n return fixer.insertTextAfterRange([0, 0], fullImport);\n }\n\n const replacementText = isImportDefaultSpecifier(importClause)\n ? `, { ${importName} }`\n : `, ${importName}`;\n return fixer.insertTextAfter(importClause, replacementText);\n}\n\nexport function getImportRemoveFix(\n sourceCode: Readonly<TSESLint.SourceCode>,\n importDeclarations: readonly TSESTree.ImportDeclaration[],\n importedName: string,\n fixer: TSESLint.RuleFixer\n): TSESLint.RuleFix | TSESLint.RuleFix[] {\n const { importDeclaration, importSpecifier } =\n getImportDeclarationSpecifier(importDeclarations, importedName) ?? {};\n\n if (!importDeclaration || !importSpecifier) {\n return [];\n }\n\n const isFirstImportSpecifier =\n importDeclaration.specifiers[0] === importSpecifier;\n const isLastImportSpecifier =\n getLast(importDeclaration.specifiers) === importSpecifier;\n const isSingleImportSpecifier =\n isFirstImportSpecifier && isLastImportSpecifier;\n\n if (isSingleImportSpecifier) {\n return fixer.remove(importDeclaration);\n }\n\n const tokenAfterImportSpecifier = sourceCode.getTokenAfter(importSpecifier);\n\n if (isFirstImportSpecifier && tokenAfterImportSpecifier) {\n return fixer.removeRange([\n importSpecifier.range[0],\n tokenAfterImportSpecifier.range[1],\n ]);\n }\n\n const tokenBeforeImportSpecifier = sourceCode.getTokenBefore(importSpecifier);\n\n if (!tokenBeforeImportSpecifier) {\n return [];\n }\n\n return fixer.removeRange([\n tokenBeforeImportSpecifier.range[0],\n importSpecifier.range[1],\n ]);\n}\n\nexport function getNodeToCommaRemoveFix(\n sourceCode: Readonly<TSESLint.SourceCode>,\n fixer: TSESLint.RuleFixer,\n node: TSESTree.Node\n) {\n const nextToken = sourceCode.getTokenAfter(node);\n const isNextTokenComma = nextToken && ASTUtils.isCommaToken(nextToken);\n return [\n fixer.remove(node),\n ...(isNextTokenComma ? [fixer.remove(nextToken)] : []),\n ] as const;\n}\n\nexport function getInterfaceName(\n interfaceMember: TSESTree.Identifier | TSESTree.MemberExpression\n): string | undefined {\n if (isIdentifier(interfaceMember)) {\n return interfaceMember.name;\n }\n\n return isIdentifier(interfaceMember.property)\n ? interfaceMember.property.name\n : undefined;\n}\n\nexport function getInterfaces({\n implements: classImplements,\n}: TSESTree.ClassDeclaration): readonly (\n | TSESTree.Identifier\n | TSESTree.MemberExpression\n)[] {\n return (classImplements ?? [])\n .map(({ expression }) => expression)\n .filter(isIdentifierOrMemberExpression);\n}\n\nexport function getInterface(\n node: TSESTree.ClassDeclaration,\n interfaceName: string\n): TSESTree.Identifier | TSESTree.MemberExpression | undefined {\n return getInterfaces(node).find(\n (interfaceMember) => getInterfaceName(interfaceMember) === interfaceName\n );\n}\n\nexport function getImplementsSchemaFixer(\n { id, implements: classImplements }: TSESTree.ClassDeclaration,\n interfaceName: string\n) {\n const [implementsNodeReplace, implementsTextReplace] =\n classImplements && classImplements.length\n ? [getLast(classImplements), `, ${interfaceName}`]\n : [id as TSESTree.Identifier, ` implements ${interfaceName}`];\n\n return { implementsNodeReplace, implementsTextReplace } as const;\n}\n\nexport function getLast<T extends readonly unknown[]>(items: T): T[number] {\n return items.slice(-1)[0];\n}\n\nexport function getDecoratorName({\n expression,\n}: TSESTree.Decorator): string | undefined {\n if (isIdentifier(expression)) {\n return expression.name;\n }\n\n return isCallExpression(expression) && isIdentifier(expression.callee)\n ? expression.callee.name\n : undefined;\n}\n\nexport function getRawText(node: TSESTree.Node): string | null {\n if (isIdentifier(node)) {\n return node.name;\n }\n\n if (\n isPropertyDefinition(node) ||\n isMethodDefinition(node) ||\n isProperty(node)\n ) {\n return getRawText(node.key);\n }\n\n if (isLiteral(node)) {\n return node.raw;\n }\n\n if (isTemplateElement(node)) {\n return `\\`${node.value.raw}\\``;\n }\n\n if (isTemplateLiteral(node)) {\n return `\\`${node.quasis[0].value.raw}\\``;\n }\n\n return null;\n}\n\nexport function capitalize<T extends string>(text: T): Capitalize<T> {\n return `${text[0].toUpperCase()}${text.slice(1)}` as Capitalize<T>;\n}\n\nfunction getInjectedParametersWithSourceCode(\n context: TSESLint.RuleContext<string, readonly unknown[]>,\n moduleName: string,\n importName: string\n): InjectedParameterWithSourceCode {\n const sourceCode = context.getSourceCode();\n const importDeclarations =\n getImportDeclarations(sourceCode.ast, moduleName) ?? [];\n const { importSpecifier } =\n getImportDeclarationSpecifier(importDeclarations, importName) ?? {};\n\n const injectImportDeclarations =\n getImportDeclarations(sourceCode.ast, '@angular/core') ?? [];\n\n const { importSpecifier: injectImportSpecifier } =\n getImportDeclarationSpecifier(injectImportDeclarations, 'inject') ?? {};\n\n if (!importSpecifier) {\n return { sourceCode };\n }\n\n const variables = context.getDeclaredVariables(importSpecifier);\n const typedVariable = variables.find(({ name }) => name === importName);\n const identifiers = typedVariable?.references?.reduce<\n readonly InjectedParameter[]\n >((identifiers, { identifier: { parent } }) => {\n if (!parent) {\n return identifiers;\n }\n\n if (\n isTSTypeReference(parent) &&\n parent.parent &&\n isTSTypeAnnotation(parent.parent) &&\n parent.parent.parent &&\n isIdentifier(parent.parent.parent)\n ) {\n return identifiers.concat(parent.parent.parent as InjectedParameter);\n }\n\n const parentToCheck = isTSInstantiationExpression(parent)\n ? parent.parent\n : parent;\n\n if (\n parentToCheck &&\n isCallExpression(parentToCheck) &&\n isIdentifier(parentToCheck.callee) &&\n parentToCheck.callee.name == 'inject' &&\n parentToCheck.parent &&\n isPropertyDefinition(parentToCheck.parent) &&\n isIdentifier(parentToCheck.parent.key) &&\n injectImportSpecifier\n ) {\n return identifiers.concat(parentToCheck.parent.key as InjectedParameter);\n }\n\n return identifiers;\n }, []);\n return { identifiers, sourceCode };\n}\n\nexport function getNgRxEffectActions(\n context: TSESLint.RuleContext<string, readonly unknown[]>\n): InjectedParameterWithSourceCode {\n return getInjectedParametersWithSourceCode(\n context,\n NGRX_MODULE_PATHS.effects,\n 'Actions'\n );\n}\n\nexport function getNgRxComponentStores(\n context: TSESLint.RuleContext<string, readonly unknown[]>\n): InjectedParameterWithSourceCode {\n return getInjectedParametersWithSourceCode(\n context,\n NGRX_MODULE_PATHS['component-store'],\n 'ComponentStore'\n );\n}\n\nexport function getNgRxStores(\n context: TSESLint.RuleContext<string, readonly unknown[]>\n): InjectedParameterWithSourceCode {\n return getInjectedParametersWithSourceCode(\n context,\n NGRX_MODULE_PATHS.store,\n 'Store'\n );\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping\nexport function escapeText(text: string): string {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function asPattern(identifiers: readonly InjectedParameter[]): RegExp {\n const escapedNames = identifiers.map(({ name }) => escapeText(name));\n return new RegExp(`^(${escapedNames.join('|')})$`);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../../../modules/eslint-plugin/src/utils/helper-functions/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TSESLint, TSESTree } from '@typescript-eslint/utils';\nimport { ASTUtils } from '@typescript-eslint/utils';\nimport {\n isCallExpression,\n isIdentifier,\n isIdentifierOrMemberExpression,\n isImportDeclaration,\n isImportDefaultSpecifier,\n isImportNamespaceSpecifier,\n isImportSpecifier,\n isLiteral,\n isMethodDefinition,\n isProgram,\n isProperty,\n isPropertyDefinition,\n isTSTypeAnnotation,\n isTSTypeReference,\n isTemplateElement,\n isTemplateLiteral,\n isTSInstantiationExpression,\n} from './guards';\nimport { NGRX_MODULE_PATHS } from './ngrx-modules';\n\ntype ConstructorFunctionExpression = TSESTree.FunctionExpression & {\n parent: TSESTree.MethodDefinition & { kind: 'constructor' };\n};\ntype InjectedParameter =\n | TSESTree.Identifier & {\n typeAnnotation: TSESTree.TSTypeAnnotation;\n parent:\n | ConstructorFunctionExpression\n | (TSESTree.TSParameterProperty & {\n parent: ConstructorFunctionExpression;\n })\n | TSESTree.PropertyDefinition;\n };\ntype InjectedParameterWithSourceCode = Readonly<{\n identifiers?: readonly InjectedParameter[];\n sourceCode: Readonly<TSESLint.SourceCode>;\n}>;\n\nexport function getNearestUpperNodeFrom<T extends TSESTree.Node>(\n { parent }: TSESTree.Node,\n predicate: (parent: TSESTree.Node) => parent is T\n): T | undefined {\n while (parent && !isProgram(parent)) {\n if (predicate(parent)) {\n return parent;\n }\n\n parent = parent.parent;\n }\n\n return undefined;\n}\n\nexport function getImportDeclarationSpecifier(\n importDeclarations: readonly TSESTree.ImportDeclaration[],\n importName: string\n) {\n for (const importDeclaration of importDeclarations) {\n const importSpecifier = importDeclaration.specifiers.find(\n (importClause): importClause is TSESTree.ImportSpecifier => {\n return (\n isImportSpecifier(importClause) &&\n importClause.imported.name === importName\n );\n }\n );\n\n if (importSpecifier) {\n return { importDeclaration, importSpecifier } as const;\n }\n }\n\n return undefined;\n}\n\nexport function getImportDeclarations(\n node: TSESTree.Node,\n moduleName: string\n): readonly TSESTree.ImportDeclaration[] | undefined {\n let parentNode: TSESTree.Node | undefined = node;\n\n while (parentNode && !isProgram(parentNode)) {\n parentNode = parentNode.parent;\n }\n\n return parentNode?.body.filter((node): node is TSESTree.ImportDeclaration => {\n return isImportDeclaration(node) && node.source.value === moduleName;\n });\n}\n\nfunction getCorrespondentImportClause(\n importDeclarations: readonly TSESTree.ImportDeclaration[],\n compatibleWithTypeOnlyImport = false\n) {\n let importClause: TSESTree.ImportClause | undefined;\n\n for (const { importKind, specifiers } of importDeclarations) {\n const lastImportSpecifier = getLast(specifiers);\n\n if (\n (!compatibleWithTypeOnlyImport && importKind === 'type') ||\n isImportNamespaceSpecifier(lastImportSpecifier)\n ) {\n continue;\n }\n\n importClause = lastImportSpecifier;\n }\n\n return importClause;\n}\n\nexport function getImportAddFix({\n compatibleWithTypeOnlyImport = false,\n fixer,\n importName,\n moduleName,\n node,\n}: {\n compatibleWithTypeOnlyImport?: boolean;\n fixer: TSESLint.RuleFixer;\n importName: string;\n moduleName: string;\n node: TSESTree.Node;\n}): TSESLint.RuleFix | TSESLint.RuleFix[] {\n const fullImport = `import { ${importName} } from '${moduleName}';`;\n const importDeclarations = getImportDeclarations(node, moduleName);\n\n if (!importDeclarations?.length) {\n return fixer.insertTextAfterRange([0, 0], fullImport);\n }\n\n const importDeclarationSpecifier = getImportDeclarationSpecifier(\n importDeclarations,\n importName\n );\n\n if (importDeclarationSpecifier) {\n return [];\n }\n\n const importClause = getCorrespondentImportClause(\n importDeclarations,\n compatibleWithTypeOnlyImport\n );\n\n if (!importClause) {\n return fixer.insertTextAfterRange([0, 0], fullImport);\n }\n\n const replacementText = isImportDefaultSpecifier(importClause)\n ? `, { ${importName} }`\n : `, ${importName}`;\n return fixer.insertTextAfter(importClause, replacementText);\n}\n\nexport function getImportRemoveFix(\n sourceCode: Readonly<TSESLint.SourceCode>,\n importDeclarations: readonly TSESTree.ImportDeclaration[],\n importedName: string,\n fixer: TSESLint.RuleFixer\n): TSESLint.RuleFix | TSESLint.RuleFix[] {\n const { importDeclaration, importSpecifier } =\n getImportDeclarationSpecifier(importDeclarations, importedName) ?? {};\n\n if (!importDeclaration || !importSpecifier) {\n return [];\n }\n\n const isFirstImportSpecifier =\n importDeclaration.specifiers[0] === importSpecifier;\n const isLastImportSpecifier =\n getLast(importDeclaration.specifiers) === importSpecifier;\n const isSingleImportSpecifier =\n isFirstImportSpecifier && isLastImportSpecifier;\n\n if (isSingleImportSpecifier) {\n return fixer.remove(importDeclaration);\n }\n\n const tokenAfterImportSpecifier = sourceCode.getTokenAfter(importSpecifier);\n\n if (isFirstImportSpecifier && tokenAfterImportSpecifier) {\n return fixer.removeRange([\n importSpecifier.range[0],\n tokenAfterImportSpecifier.range[1],\n ]);\n }\n\n const tokenBeforeImportSpecifier = sourceCode.getTokenBefore(importSpecifier);\n\n if (!tokenBeforeImportSpecifier) {\n return [];\n }\n\n return fixer.removeRange([\n tokenBeforeImportSpecifier.range[0],\n importSpecifier.range[1],\n ]);\n}\n\nexport function getNodeToCommaRemoveFix(\n sourceCode: Readonly<TSESLint.SourceCode>,\n fixer: TSESLint.RuleFixer,\n node: TSESTree.Node\n) {\n const nextToken = sourceCode.getTokenAfter(node);\n const isNextTokenComma = nextToken && ASTUtils.isCommaToken(nextToken);\n return [\n fixer.remove(node),\n ...(isNextTokenComma ? [fixer.remove(nextToken)] : []),\n ] as const;\n}\n\nexport function getInterfaceName(\n interfaceMember: TSESTree.Identifier | TSESTree.MemberExpression\n): string | undefined {\n if (isIdentifier(interfaceMember)) {\n return interfaceMember.name;\n }\n\n return isIdentifier(interfaceMember.property)\n ? interfaceMember.property.name\n : undefined;\n}\n\nexport function getInterfaces({\n implements: classImplements,\n}: TSESTree.ClassDeclaration): readonly (\n | TSESTree.Identifier\n | TSESTree.MemberExpression\n)[] {\n return (classImplements ?? [])\n .map(({ expression }) => expression)\n .filter(isIdentifierOrMemberExpression);\n}\n\nexport function getInterface(\n node: TSESTree.ClassDeclaration,\n interfaceName: string\n): TSESTree.Identifier | TSESTree.MemberExpression | undefined {\n return getInterfaces(node).find(\n (interfaceMember) => getInterfaceName(interfaceMember) === interfaceName\n );\n}\n\nexport function getImplementsSchemaFixer(\n { id, implements: classImplements }: TSESTree.ClassDeclaration,\n interfaceName: string\n) {\n const [implementsNodeReplace, implementsTextReplace] =\n classImplements && classImplements.length\n ? [getLast(classImplements), `, ${interfaceName}`]\n : [id as TSESTree.Identifier, ` implements ${interfaceName}`];\n\n return { implementsNodeReplace, implementsTextReplace } as const;\n}\n\nexport function getLast<T extends readonly unknown[]>(items: T): T[number] {\n return items.slice(-1)[0];\n}\n\nexport function getDecoratorName({\n expression,\n}: TSESTree.Decorator): string | undefined {\n if (isIdentifier(expression)) {\n return expression.name;\n }\n\n return isCallExpression(expression) && isIdentifier(expression.callee)\n ? expression.callee.name\n : undefined;\n}\n\nexport function getRawText(node: TSESTree.Node): string | null {\n if (isIdentifier(node)) {\n return node.name;\n }\n\n if (\n isPropertyDefinition(node) ||\n isMethodDefinition(node) ||\n isProperty(node)\n ) {\n return getRawText(node.key);\n }\n\n if (isLiteral(node)) {\n return node.raw;\n }\n\n if (isTemplateElement(node)) {\n return `\\`${node.value.raw}\\``;\n }\n\n if (isTemplateLiteral(node)) {\n return `\\`${node.quasis[0].value.raw}\\``;\n }\n\n return null;\n}\n\nexport function capitalize<T extends string>(text: T): Capitalize<T> {\n return `${text[0].toUpperCase()}${text.slice(1)}` as Capitalize<T>;\n}\n\nfunction getInjectedParametersWithSourceCode(\n context: TSESLint.RuleContext<string, readonly unknown[]>,\n moduleName: string,\n importName: string\n): InjectedParameterWithSourceCode {\n const sourceCode = context.getSourceCode();\n const importDeclarations =\n getImportDeclarations(sourceCode.ast, moduleName) ?? [];\n const { importSpecifier } =\n getImportDeclarationSpecifier(importDeclarations, importName) ?? {};\n\n const injectImportDeclarations =\n getImportDeclarations(sourceCode.ast, '@angular/core') ?? [];\n\n const { importSpecifier: injectImportSpecifier } =\n getImportDeclarationSpecifier(injectImportDeclarations, 'inject') ?? {};\n\n if (!importSpecifier) {\n return { sourceCode };\n }\n\n const variables = sourceCode.getDeclaredVariables(importSpecifier);\n const typedVariable = variables.find(({ name }) => name === importName);\n const identifiers = typedVariable?.references?.reduce<\n readonly InjectedParameter[]\n >((identifiers, { identifier: { parent } }) => {\n if (!parent) {\n return identifiers;\n }\n\n if (\n isTSTypeReference(parent) &&\n parent.parent &&\n isTSTypeAnnotation(parent.parent) &&\n parent.parent.parent &&\n isIdentifier(parent.parent.parent)\n ) {\n return identifiers.concat(parent.parent.parent as InjectedParameter);\n }\n\n const parentToCheck = isTSInstantiationExpression(parent)\n ? parent.parent\n : parent;\n\n if (\n parentToCheck &&\n isCallExpression(parentToCheck) &&\n isIdentifier(parentToCheck.callee) &&\n parentToCheck.callee.name == 'inject' &&\n parentToCheck.parent &&\n isPropertyDefinition(parentToCheck.parent) &&\n isIdentifier(parentToCheck.parent.key) &&\n injectImportSpecifier\n ) {\n return identifiers.concat(parentToCheck.parent.key as InjectedParameter);\n }\n\n return identifiers;\n }, []);\n return { identifiers, sourceCode };\n}\n\nexport function getNgRxEffectActions(\n context: TSESLint.RuleContext<string, readonly unknown[]>\n): InjectedParameterWithSourceCode {\n return getInjectedParametersWithSourceCode(\n context,\n NGRX_MODULE_PATHS.effects,\n 'Actions'\n );\n}\n\nexport function getNgRxComponentStores(\n context: TSESLint.RuleContext<string, readonly unknown[]>\n): InjectedParameterWithSourceCode {\n return getInjectedParametersWithSourceCode(\n context,\n NGRX_MODULE_PATHS['component-store'],\n 'ComponentStore'\n );\n}\n\nexport function getNgRxStores(\n context: TSESLint.RuleContext<string, readonly unknown[]>\n): InjectedParameterWithSourceCode {\n return getInjectedParametersWithSourceCode(\n context,\n NGRX_MODULE_PATHS.store,\n 'Store'\n );\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping\nexport function escapeText(text: string): string {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nexport function asPattern(identifiers: readonly InjectedParameter[]): RegExp {\n const escapedNames = identifiers.map(({ name }) => escapeText(name));\n return new RegExp(`^(${escapedNames.join('|')})$`);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function ngrxVersionSatisfies(pkg: string, version: string): boolean;
|
|
@@ -24,25 +24,24 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.ngrxVersionSatisfies = exports.clearCache = exports.setNgrxVersion = void 0;
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
const semver = __importStar(require("semver"));
|
|
28
|
+
const noopVersion = '0.0.0';
|
|
29
|
+
const versionsCache = new Map();
|
|
30
|
+
const satisfiesCache = new Map();
|
|
31
31
|
function getNgrxVersion(pkg) {
|
|
32
32
|
if (!versionsCache.has(pkg)) {
|
|
33
|
-
|
|
34
|
-
versionsCache.set(pkg, version
|
|
33
|
+
const version = readPlatformVersion(pkg);
|
|
34
|
+
versionsCache.set(pkg, version ?? noopVersion);
|
|
35
35
|
}
|
|
36
36
|
return versionsCache.get(pkg);
|
|
37
37
|
}
|
|
38
38
|
function readPlatformVersion(pkg) {
|
|
39
|
-
var _a;
|
|
40
39
|
try {
|
|
41
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
42
|
-
|
|
43
|
-
return
|
|
40
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-require-imports
|
|
41
|
+
const ngrxVersion = require(`${pkg}/package.json`);
|
|
42
|
+
return ngrxVersion.version?.replace(/[^\d.]/g, '');
|
|
44
43
|
}
|
|
45
|
-
catch
|
|
44
|
+
catch {
|
|
46
45
|
return null;
|
|
47
46
|
}
|
|
48
47
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../../../../../modules/eslint-plugin/src/utils/helper-functions/versions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA
|
|
1
|
+
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../../../../../modules/eslint-plugin/src/utils/helper-functions/versions.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AAEjC,MAAM,WAAW,GAAG,OAAO,CAAC;AAC5B,MAAM,aAAa,GAAG,IAAI,GAAG,EAAkB,CAAC;AAChD,MAAM,cAAc,GAAG,IAAI,GAAG,EAAmB,CAAC;AAElD,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACzC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,IAAI,WAAW,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,aAAa,CAAC,GAAG,CAAC,GAAG,CAAW,CAAC;AAC1C,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW;IACtC,IAAI,CAAC;QACH,oGAAoG;QACpG,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,GAAG,eAAe,CAEhD,CAAC;QACF,OAAO,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,iCAAiC;AACjC,SAAgB,cAAc,CAAC,GAAW,EAAE,OAAe;IACzD,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC;AAFD,wCAEC;AAED,iCAAiC;AACjC,SAAgB,UAAU;IACxB,aAAa,CAAC,KAAK,EAAE,CAAC;IACtB,cAAc,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC;AAHD,gCAGC;AAED,SAAS,gBAAgB,CAAC,GAAW,EAAE,OAAe;IACpD,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,cAAc,CAAC,GAAG,CAAC,GAAG,CAAY,CAAC;AAC5C,CAAC;AAED,SAAgB,oBAAoB,CAAC,GAAW,EAAE,OAAe;IAC/D,OAAO,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC;AAFD,oDAEC","sourcesContent":["import * as semver from 'semver';\n\nconst noopVersion = '0.0.0';\nconst versionsCache = new Map<string, string>();\nconst satisfiesCache = new Map<string, boolean>();\n\nfunction getNgrxVersion(pkg: string): string {\n if (!versionsCache.has(pkg)) {\n const version = readPlatformVersion(pkg);\n versionsCache.set(pkg, version ?? noopVersion);\n }\n\n return versionsCache.get(pkg) as string;\n}\n\nfunction readPlatformVersion(pkg: string) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-require-imports\n const ngrxVersion = require(`${pkg}/package.json`) as {\n version?: string;\n };\n return ngrxVersion.version?.replace(/[^\\d.]/g, '');\n } catch {\n return null;\n }\n}\n\n// @internal for testing purposes\nexport function setNgrxVersion(pkg: string, version: string): void {\n versionsCache.set(pkg, version);\n}\n\n// @internal for testing purposes\nexport function clearCache() {\n versionsCache.clear();\n satisfiesCache.clear();\n}\n\nfunction versionSatisfies(pkg: string, version: string) {\n if (!satisfiesCache.has(pkg)) {\n satisfiesCache.set(pkg, semver.satisfies(getNgrxVersion(pkg), version));\n }\n\n return satisfiesCache.get(pkg) as boolean;\n}\n\nexport function ngrxVersionSatisfies(pkg: string, version: string): boolean {\n return versionSatisfies(pkg, version);\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export declare const effectCreator = "PropertyDefinition[value.callee.name='createEffect']";
|
|
2
|
+
export declare const createEffectExpression = "CallExpression[callee.name='createEffect']";
|
|
3
|
+
export declare const effectDecorator = "Decorator[expression.callee.name='Effect']";
|
|
4
|
+
export declare const propertyDefinitionWithEffectDecorator: "ClassDeclaration > ClassBody > PropertyDefinition > Decorator[expression.callee.name='Effect']";
|
|
5
|
+
export declare const actionCreator = "CallExpression[callee.name='createAction']";
|
|
6
|
+
export declare const actionCreatorWithLiteral: "CallExpression[callee.name='createAction'][arguments.0.type='Literal'][arguments.0.raw=/^'/]";
|
|
7
|
+
export declare const actionCreatorProps: "CallExpression[callee.name='createAction'] > CallExpression[callee.name='props']";
|
|
8
|
+
export declare const actionCreatorPropsComputed: "CallExpression[callee.name='createAction'] > CallExpression[callee.name='props'] > TSTypeParameterInstantiation > :matches(TSTypeReference[typeName.name!='Readonly'], [type=/^TS(.*)(Keyword|Type)$/])";
|
|
9
|
+
export declare const constructorDefinition = "MethodDefinition[kind='constructor']";
|
|
10
|
+
export declare function metadataProperty(key: RegExp): string;
|
|
11
|
+
export declare function metadataProperty<TKey extends string>(key: TKey): `Property:matches([key.name=${TKey}][computed=false], [key.value=${TKey}], [key.quasis.0.value.raw=${TKey}])`;
|
|
12
|
+
export declare const ngModuleDecorator = "ClassDeclaration > Decorator > CallExpression[callee.name='NgModule']";
|
|
13
|
+
export declare const ngModuleImports: "ClassDeclaration > Decorator > CallExpression[callee.name='NgModule'] ObjectExpression Property:matches([key.name=imports][computed=false], [key.value=imports], [key.quasis.0.value.raw=imports]) > ArrayExpression";
|
|
14
|
+
export declare const ngModuleProviders: "ClassDeclaration > Decorator > CallExpression[callee.name='NgModule'] ObjectExpression Property:matches([key.name=providers][computed=false], [key.value=providers], [key.quasis.0.value.raw=providers]) > ArrayExpression";
|
|
15
|
+
export declare const effectsInNgModuleImports: "ClassDeclaration > Decorator > CallExpression[callee.name='NgModule'] ObjectExpression Property:matches([key.name=imports][computed=false], [key.value=imports], [key.quasis.0.value.raw=imports]) > ArrayExpression CallExpression[callee.object.name='EffectsModule'][callee.property.name=/^for(Root|Feature)$/] ArrayExpression > Identifier";
|
|
16
|
+
export declare const effectsInNgModuleProviders: "ClassDeclaration > Decorator > CallExpression[callee.name='NgModule'] ObjectExpression Property:matches([key.name=providers][computed=false], [key.value=providers], [key.quasis.0.value.raw=providers]) > ArrayExpression Identifier";
|
|
17
|
+
export declare const namedExpression: (name: RegExp | string) => `:matches(MethodDefinition[kind='constructor'] CallExpression[callee.object.name=${string}], CallExpression[callee.object.object.type='ThisExpression'][callee.object.property.name=${string}])`;
|
|
18
|
+
export declare const namedCallableExpression: (name: RegExp | string) => `:matches(:matches(MethodDefinition[kind='constructor'] CallExpression[callee.object.name=${string}], CallExpression[callee.object.object.type='ThisExpression'][callee.object.property.name=${string}]), MethodDefinition[kind='constructor'] CallExpression[callee.object.callee.object.name=${string}], CallExpression[callee.object.callee.object.object.type='ThisExpression'][callee.object.callee.object.property.name=${string}])`;
|
|
19
|
+
export declare const pipeExpression: (name: RegExp | string) => `:matches(MethodDefinition[kind='constructor'] CallExpression[callee.object.name=${string}], CallExpression[callee.object.object.type='ThisExpression'][callee.object.property.name=${string}])[callee.property.name='pipe']`;
|
|
20
|
+
export declare const pipeableSelect: (name: RegExp | string) => `:matches(MethodDefinition[kind='constructor'] CallExpression[callee.object.name=${string}], CallExpression[callee.object.object.type='ThisExpression'][callee.object.property.name=${string}])[callee.property.name='pipe'] CallExpression[callee.name='select']`;
|
|
21
|
+
export declare const selectExpression: (name: RegExp | string) => `:matches(MethodDefinition[kind='constructor'] CallExpression[callee.object.name=${string}], CallExpression[callee.object.object.type='ThisExpression'][callee.object.property.name=${string}])[callee.property.name='select']`;
|
|
22
|
+
export declare const dispatchExpression: (name: RegExp | string) => `:matches(MethodDefinition[kind='constructor'] CallExpression[callee.object.name=${string}], CallExpression[callee.object.object.type='ThisExpression'][callee.object.property.name=${string}])[callee.property.name='dispatch']`;
|
|
23
|
+
export declare const dispatchInEffects: (name: RegExp | string) => `CallExpression[callee.name='createEffect'] :matches(MethodDefinition[kind='constructor'] CallExpression[callee.object.name=${string}], CallExpression[callee.object.object.type='ThisExpression'][callee.object.property.name=${string}])[callee.property.name='dispatch'] > MemberExpression:has(Identifier[name=${string}])`;
|
|
24
|
+
export declare const createReducer = "CallExpression[callee.name='createReducer']";
|
|
25
|
+
export declare const onFunctionWithoutType: "CallExpression[callee.name='createReducer'] CallExpression[callee.name='on'] > ArrowFunctionExpression:not([returnType.typeAnnotation], :has(CallExpression))";
|
|
26
|
+
export declare const storeActionReducerMap: "ClassDeclaration > Decorator > CallExpression[callee.name='NgModule'] ObjectExpression Property:matches([key.name=imports][computed=false], [key.value=imports], [key.quasis.0.value.raw=imports]) > ArrayExpression CallExpression[callee.object.name='StoreModule'][callee.property.name=/^for(Root|Feature)$/] > ObjectExpression:first-child";
|
|
27
|
+
export declare const actionReducerMap = "VariableDeclarator[id.typeAnnotation.typeAnnotation.typeName.name='ActionReducerMap'] > ObjectExpression";
|
|
28
|
+
export declare const mapLikeOperatorsExplicitReturn: "CallExpression[callee.name=/^(concat|exhaust|flat|merge|switch)Map$/] ReturnStatement";
|
|
29
|
+
export declare const mapLikeOperatorsImplicitReturn: ":matches(CallExpression[callee.name=/^(concat|merge|switch)MapTo$/], CallExpression[callee.name=/^(concat|exhaust|flat|merge|switch)Map$/] > ArrowFunctionExpression)";
|