@angular-eslint/eslint-plugin-template 20.4.1-alpha.0 → 20.4.1-alpha.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/README.md +1 -0
- package/dist/configs/all.json +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/rules/no-call-expression.d.ts.map +1 -1
- package/dist/rules/no-call-expression.js +6 -11
- package/dist/rules/prefer-built-in-pipes.d.ts +11 -0
- package/dist/rules/prefer-built-in-pipes.d.ts.map +1 -0
- package/dist/rules/prefer-built-in-pipes.js +90 -0
- package/dist/utils/is-ast-with-name.d.ts +10 -0
- package/dist/utils/is-ast-with-name.d.ts.map +1 -0
- package/dist/utils/is-ast-with-name.js +9 -0
- package/dist/utils/is-bound-event.d.ts +6 -0
- package/dist/utils/is-bound-event.d.ts.map +1 -0
- package/dist/utils/is-bound-event.js +10 -0
- package/package.json +5 -5
package/README.md
CHANGED
|
@@ -65,6 +65,7 @@ Please see https://github.com/angular-eslint/angular-eslint for full usage instr
|
|
|
65
65
|
| [`no-positive-tabindex`](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/no-positive-tabindex.md) | Ensures that the `tabindex` attribute is not positive | | | :bulb: | |
|
|
66
66
|
| [`prefer-at-else`](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-at-else.md) | Prefer using `@else` instead of a second `@if` with the opposite condition to reduce code and make it easier to read. | | :wrench: | | |
|
|
67
67
|
| [`prefer-at-empty`](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-at-empty.md) | Prefer using `@empty` with `@for` loops instead of a separate `@if` or `@else` block to reduce code and make it easier to read. | | :wrench: | | |
|
|
68
|
+
| [`prefer-built-in-pipes`](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-built-in-pipes.md) | Encourages the use of Angular built-in pipes (e.g. lowercase, uppercase, titlecase) instead of certain JavaScript methods in Angular templates. | | | | |
|
|
68
69
|
| [`prefer-contextual-for-variables`](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-contextual-for-variables.md) | Ensures that contextual variables are used in @for blocks where possible instead of aliasing them. | | :wrench: | | |
|
|
69
70
|
| [`prefer-control-flow`](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-control-flow.md) | Ensures that the built-in control flow is used. | | | | |
|
|
70
71
|
| [`prefer-ngsrc`](https://github.com/angular-eslint/angular-eslint/blob/main/packages/eslint-plugin-template/docs/rules/prefer-ngsrc.md) | Ensures ngSrc is used instead of src for img elements | | | | |
|
package/dist/configs/all.json
CHANGED
|
@@ -28,6 +28,7 @@
|
|
|
28
28
|
"@angular-eslint/template/no-positive-tabindex": "error",
|
|
29
29
|
"@angular-eslint/template/prefer-at-else": "error",
|
|
30
30
|
"@angular-eslint/template/prefer-at-empty": "error",
|
|
31
|
+
"@angular-eslint/template/prefer-built-in-pipes": "error",
|
|
31
32
|
"@angular-eslint/template/prefer-contextual-for-variables": "error",
|
|
32
33
|
"@angular-eslint/template/prefer-control-flow": "error",
|
|
33
34
|
"@angular-eslint/template/prefer-ngsrc": "error",
|
package/dist/index.d.ts
CHANGED
|
@@ -30,6 +30,7 @@ declare const _default: {
|
|
|
30
30
|
"@angular-eslint/template/no-positive-tabindex": string;
|
|
31
31
|
"@angular-eslint/template/prefer-at-else": string;
|
|
32
32
|
"@angular-eslint/template/prefer-at-empty": string;
|
|
33
|
+
"@angular-eslint/template/prefer-built-in-pipes": string;
|
|
33
34
|
"@angular-eslint/template/prefer-contextual-for-variables": string;
|
|
34
35
|
"@angular-eslint/template/prefer-control-flow": string;
|
|
35
36
|
"@angular-eslint/template/prefer-ngsrc": string;
|
|
@@ -105,6 +106,7 @@ declare const _default: {
|
|
|
105
106
|
"no-any": import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/no-any").MessageIds, [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
106
107
|
"no-autofocus": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noAutofocus", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
107
108
|
"no-call-expression": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noCallExpression", import("./rules/no-call-expression").Options, import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
109
|
+
"prefer-built-in-pipes": import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferBuiltInPipes", import("./rules/prefer-built-in-pipes").Options, import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
108
110
|
"no-distracting-elements": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noDistractingElements", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
109
111
|
"no-duplicate-attributes": import("@typescript-eslint/utils/ts-eslint").RuleModule<import("./rules/no-duplicate-attributes").MessageIds, import("./rules/no-duplicate-attributes").Options, import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
110
112
|
"no-empty-control-flow": import("@typescript-eslint/utils/ts-eslint").RuleModule<"noEmptyControlFlow", [], import("./utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2GA,kBA+CE"}
|
package/dist/index.js
CHANGED
|
@@ -56,6 +56,7 @@ const mouse_events_have_key_events_1 = __importStar(require("./rules/mouse-event
|
|
|
56
56
|
const no_any_1 = __importStar(require("./rules/no-any"));
|
|
57
57
|
const no_autofocus_1 = __importStar(require("./rules/no-autofocus"));
|
|
58
58
|
const no_call_expression_1 = __importStar(require("./rules/no-call-expression"));
|
|
59
|
+
const prefer_built_in_pipes_1 = __importStar(require("./rules/prefer-built-in-pipes"));
|
|
59
60
|
const no_distracting_elements_1 = __importStar(require("./rules/no-distracting-elements"));
|
|
60
61
|
const no_duplicate_attributes_1 = __importStar(require("./rules/no-duplicate-attributes"));
|
|
61
62
|
const no_empty_control_flow_1 = __importStar(require("./rules/no-empty-control-flow"));
|
|
@@ -101,6 +102,7 @@ module.exports = {
|
|
|
101
102
|
[no_any_1.RULE_NAME]: no_any_1.default,
|
|
102
103
|
[no_autofocus_1.RULE_NAME]: no_autofocus_1.default,
|
|
103
104
|
[no_call_expression_1.RULE_NAME]: no_call_expression_1.default,
|
|
105
|
+
[prefer_built_in_pipes_1.RULE_NAME]: prefer_built_in_pipes_1.default,
|
|
104
106
|
[no_distracting_elements_1.RULE_NAME]: no_distracting_elements_1.default,
|
|
105
107
|
[no_duplicate_attributes_1.RULE_NAME]: no_duplicate_attributes_1.default,
|
|
106
108
|
[no_empty_control_flow_1.RULE_NAME]: no_empty_control_flow_1.default,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-call-expression.d.ts","sourceRoot":"","sources":["../../src/rules/no-call-expression.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"no-call-expression.d.ts","sourceRoot":"","sources":["../../src/rules/no-call-expression.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,OAAO,GAAG;IACpB;QACE,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QACvC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;QAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;KAC/B;CACF,CAAC;AACF,MAAM,MAAM,UAAU,GAAG,kBAAkB,CAAC;AAC5C,eAAO,MAAM,SAAS,uBAAuB,CAAC;;AAE9C,wBA4EG"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RULE_NAME = void 0;
|
|
4
|
-
const bundled_angular_compiler_1 = require("@angular-eslint/bundled-angular-compiler");
|
|
5
4
|
const utils_1 = require("@angular-eslint/utils");
|
|
6
5
|
const create_eslint_rule_1 = require("../utils/create-eslint-rule");
|
|
7
6
|
const get_nearest_node_from_1 = require("../utils/get-nearest-node-from");
|
|
7
|
+
const is_bound_event_1 = require("../utils/is-bound-event");
|
|
8
|
+
const is_ast_with_name_1 = require("../utils/is-ast-with-name");
|
|
8
9
|
exports.RULE_NAME = 'no-call-expression';
|
|
9
10
|
exports.default = (0, create_eslint_rule_1.createESLintRule)({
|
|
10
11
|
name: exports.RULE_NAME,
|
|
@@ -40,18 +41,18 @@ exports.default = (0, create_eslint_rule_1.createESLintRule)({
|
|
|
40
41
|
const sourceCode = context.sourceCode;
|
|
41
42
|
return {
|
|
42
43
|
'Call[receiver.name!="$any"]'(node) {
|
|
43
|
-
const isChildOfBoundEvent = Boolean((0, get_nearest_node_from_1.getNearestNodeFrom)(node, isBoundEvent));
|
|
44
|
+
const isChildOfBoundEvent = Boolean((0, get_nearest_node_from_1.getNearestNodeFrom)(node, is_bound_event_1.isBoundEvent));
|
|
44
45
|
if (isChildOfBoundEvent ||
|
|
45
46
|
isCallNameInAllowList(node.receiver, allowList)) {
|
|
46
47
|
return;
|
|
47
48
|
}
|
|
48
49
|
if (allowPrefix &&
|
|
49
|
-
isASTWithName(node.receiver) &&
|
|
50
|
+
(0, is_ast_with_name_1.isASTWithName)(node.receiver) &&
|
|
50
51
|
node.receiver.name.startsWith(allowPrefix)) {
|
|
51
52
|
return;
|
|
52
53
|
}
|
|
53
54
|
if (allowSuffix &&
|
|
54
|
-
isASTWithName(node.receiver) &&
|
|
55
|
+
(0, is_ast_with_name_1.isASTWithName)(node.receiver) &&
|
|
55
56
|
node.receiver.name.endsWith(allowSuffix)) {
|
|
56
57
|
return;
|
|
57
58
|
}
|
|
@@ -67,15 +68,9 @@ exports.default = (0, create_eslint_rule_1.createESLintRule)({
|
|
|
67
68
|
};
|
|
68
69
|
},
|
|
69
70
|
});
|
|
70
|
-
function isBoundEvent(node) {
|
|
71
|
-
return node instanceof bundled_angular_compiler_1.TmplAstBoundEvent;
|
|
72
|
-
}
|
|
73
|
-
function isASTWithName(ast) {
|
|
74
|
-
return !!ast.name;
|
|
75
|
-
}
|
|
76
71
|
function isCallNameInAllowList(ast, allowList) {
|
|
77
72
|
return (allowList &&
|
|
78
73
|
allowList.length > 0 &&
|
|
79
|
-
isASTWithName(ast) &&
|
|
74
|
+
(0, is_ast_with_name_1.isASTWithName)(ast) &&
|
|
80
75
|
allowList.indexOf(ast.name) > -1);
|
|
81
76
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export type Options = [
|
|
2
|
+
{
|
|
3
|
+
readonly disallowList?: readonly string[];
|
|
4
|
+
readonly allowInOutputHandlers?: boolean;
|
|
5
|
+
}
|
|
6
|
+
];
|
|
7
|
+
export type MessageIds = 'preferBuiltInPipes';
|
|
8
|
+
export declare const RULE_NAME = "prefer-built-in-pipes";
|
|
9
|
+
declare const _default: import("@typescript-eslint/utils/ts-eslint").RuleModule<"preferBuiltInPipes", Options, import("../utils/create-eslint-rule").RuleDocs, import("@typescript-eslint/utils/ts-eslint").RuleListener>;
|
|
10
|
+
export default _default;
|
|
11
|
+
//# sourceMappingURL=prefer-built-in-pipes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prefer-built-in-pipes.d.ts","sourceRoot":"","sources":["../../src/rules/prefer-built-in-pipes.ts"],"names":[],"mappings":"AAWA,MAAM,MAAM,OAAO,GAAG;IACpB;QACE,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC1C,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC;KAC1C;CACF,CAAC;AASF,MAAM,MAAM,UAAU,GAAG,oBAAoB,CAAC;AAC9C,eAAO,MAAM,SAAS,0BAA0B,CAAC;;AAEjD,wBA6EG"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RULE_NAME = void 0;
|
|
4
|
+
const bundled_angular_compiler_1 = require("@angular-eslint/bundled-angular-compiler");
|
|
5
|
+
const utils_1 = require("@angular-eslint/utils");
|
|
6
|
+
const create_eslint_rule_1 = require("../utils/create-eslint-rule");
|
|
7
|
+
const get_nearest_node_from_1 = require("../utils/get-nearest-node-from");
|
|
8
|
+
const is_bound_event_1 = require("../utils/is-bound-event");
|
|
9
|
+
const is_ast_with_name_1 = require("../utils/is-ast-with-name");
|
|
10
|
+
const DEFAULT_DISALLOW_LIST = [
|
|
11
|
+
'toLowerCase',
|
|
12
|
+
'toUpperCase',
|
|
13
|
+
'toLocaleLowerCase',
|
|
14
|
+
'toLocaleUpperCase',
|
|
15
|
+
];
|
|
16
|
+
exports.RULE_NAME = 'prefer-built-in-pipes';
|
|
17
|
+
exports.default = (0, create_eslint_rule_1.createESLintRule)({
|
|
18
|
+
name: exports.RULE_NAME,
|
|
19
|
+
meta: {
|
|
20
|
+
type: 'suggestion',
|
|
21
|
+
docs: {
|
|
22
|
+
description: 'Encourages the use of Angular built-in pipes (e.g. lowercase, uppercase, titlecase) instead of certain JavaScript methods in Angular templates.',
|
|
23
|
+
},
|
|
24
|
+
schema: [
|
|
25
|
+
{
|
|
26
|
+
additionalProperties: false,
|
|
27
|
+
properties: {
|
|
28
|
+
disallowList: {
|
|
29
|
+
items: { type: 'string' },
|
|
30
|
+
type: 'array',
|
|
31
|
+
uniqueItems: true,
|
|
32
|
+
description: 'Additional method names to disallow (defaults include common case/title casing helpers)',
|
|
33
|
+
},
|
|
34
|
+
allowInOutputHandlers: {
|
|
35
|
+
type: 'boolean',
|
|
36
|
+
description: 'Whether to allow these method calls inside output event handlers',
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
type: 'object',
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
messages: {
|
|
43
|
+
preferBuiltInPipes: 'Avoid using method "{{ methodName }}" in templates. Prefer the Angular built-in pipes instead (e.g. lowercase, uppercase, titlecase).',
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
defaultOptions: [
|
|
47
|
+
{
|
|
48
|
+
disallowList: [...DEFAULT_DISALLOW_LIST],
|
|
49
|
+
allowInOutputHandlers: true,
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
create(context, [{ disallowList, allowInOutputHandlers }]) {
|
|
53
|
+
(0, utils_1.ensureTemplateParser)(context);
|
|
54
|
+
const sourceCode = context.sourceCode;
|
|
55
|
+
const methodsToDisallow = disallowList || [...DEFAULT_DISALLOW_LIST];
|
|
56
|
+
return {
|
|
57
|
+
Call(node) {
|
|
58
|
+
if (!isDisallowedMethod(node.receiver, methodsToDisallow)) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
if (allowInOutputHandlers) {
|
|
62
|
+
const isChildOfBoundEvent = Boolean((0, get_nearest_node_from_1.getNearestNodeFrom)(node, is_bound_event_1.isBoundEvent));
|
|
63
|
+
if (isChildOfBoundEvent) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const methodName = getMethodName(node.receiver);
|
|
68
|
+
const { sourceSpan: { start, end }, } = node.receiver;
|
|
69
|
+
context.report({
|
|
70
|
+
loc: {
|
|
71
|
+
start: sourceCode.getLocFromIndex(start),
|
|
72
|
+
end: sourceCode.getLocFromIndex(end),
|
|
73
|
+
},
|
|
74
|
+
messageId: 'preferBuiltInPipes',
|
|
75
|
+
data: {
|
|
76
|
+
methodName,
|
|
77
|
+
},
|
|
78
|
+
});
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
},
|
|
82
|
+
});
|
|
83
|
+
function isDisallowedMethod(ast, disallowList) {
|
|
84
|
+
return ((0, is_ast_with_name_1.isASTWithName)(ast) &&
|
|
85
|
+
ast instanceof bundled_angular_compiler_1.PropertyRead &&
|
|
86
|
+
disallowList.includes(ast.name));
|
|
87
|
+
}
|
|
88
|
+
function getMethodName(ast) {
|
|
89
|
+
return (0, is_ast_with_name_1.isASTWithName)(ast) ? ast.name : 'unknown';
|
|
90
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { AST } from '@angular-eslint/bundled-angular-compiler';
|
|
2
|
+
/**
|
|
3
|
+
* Type guard to check if an AST node has a name property
|
|
4
|
+
*/
|
|
5
|
+
export declare function isASTWithName(ast: AST & {
|
|
6
|
+
name?: string;
|
|
7
|
+
}): ast is AST & {
|
|
8
|
+
name: string;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=is-ast-with-name.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-ast-with-name.d.ts","sourceRoot":"","sources":["../../src/utils/is-ast-with-name.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,0CAA0C,CAAC;AAEpE;;GAEG;AACH,wBAAgB,aAAa,CAC3B,GAAG,EAAE,GAAG,GAAG;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3B,GAAG,IAAI,GAAG,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAE/B"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { TmplAstBoundEvent } from '@angular-eslint/bundled-angular-compiler';
|
|
2
|
+
/**
|
|
3
|
+
* Type guard to check if a node is a TmplAstBoundEvent (output event handler)
|
|
4
|
+
*/
|
|
5
|
+
export declare function isBoundEvent(node: unknown): node is TmplAstBoundEvent;
|
|
6
|
+
//# sourceMappingURL=is-bound-event.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-bound-event.d.ts","sourceRoot":"","sources":["../../src/utils/is-bound-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,0CAA0C,CAAC;AAE7E;;GAEG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,iBAAiB,CAErE"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.isBoundEvent = isBoundEvent;
|
|
4
|
+
const bundled_angular_compiler_1 = require("@angular-eslint/bundled-angular-compiler");
|
|
5
|
+
/**
|
|
6
|
+
* Type guard to check if a node is a TmplAstBoundEvent (output event handler)
|
|
7
|
+
*/
|
|
8
|
+
function isBoundEvent(node) {
|
|
9
|
+
return node instanceof bundled_angular_compiler_1.TmplAstBoundEvent;
|
|
10
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@angular-eslint/eslint-plugin-template",
|
|
3
|
-
"version": "20.4.1-alpha.
|
|
3
|
+
"version": "20.4.1-alpha.1",
|
|
4
4
|
"description": "ESLint plugin for Angular Templates",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -20,19 +20,19 @@
|
|
|
20
20
|
"dependencies": {
|
|
21
21
|
"aria-query": "5.3.2",
|
|
22
22
|
"axobject-query": "4.1.0",
|
|
23
|
-
"@angular-eslint/bundled-angular-compiler": "20.4.1-alpha.
|
|
24
|
-
"@angular-eslint/utils": "20.4.1-alpha.
|
|
23
|
+
"@angular-eslint/bundled-angular-compiler": "20.4.1-alpha.1",
|
|
24
|
+
"@angular-eslint/utils": "20.4.1-alpha.1"
|
|
25
25
|
},
|
|
26
26
|
"devDependencies": {
|
|
27
27
|
"@types/aria-query": "5.0.4",
|
|
28
|
-
"@angular-eslint/test-utils": "20.4.1-alpha.
|
|
28
|
+
"@angular-eslint/test-utils": "20.4.1-alpha.1"
|
|
29
29
|
},
|
|
30
30
|
"peerDependencies": {
|
|
31
31
|
"@typescript-eslint/types": "^7.11.0 || ^8.0.0",
|
|
32
32
|
"@typescript-eslint/utils": "^7.11.0 || ^8.0.0",
|
|
33
33
|
"eslint": "^8.57.0 || ^9.0.0",
|
|
34
34
|
"typescript": "*",
|
|
35
|
-
"@angular-eslint/template-parser": "20.4.1-alpha.
|
|
35
|
+
"@angular-eslint/template-parser": "20.4.1-alpha.1"
|
|
36
36
|
},
|
|
37
37
|
"gitHead": "e2006e5e9c99e5a943d1a999e0efa5247d29ec24"
|
|
38
38
|
}
|