@yoo-digital/eslint-plugin-angular 2.0.3 → 2.0.5
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.
|
@@ -28,44 +28,90 @@ exports.requireBooleanAttributeTransformRule = {
|
|
|
28
28
|
defaultOptions: [],
|
|
29
29
|
create(context) {
|
|
30
30
|
return {
|
|
31
|
-
// Handle @Input() decorator syntax
|
|
31
|
+
// Handle both @Input() decorator syntax and input() signal syntax
|
|
32
32
|
PropertyDefinition(node) {
|
|
33
|
-
//
|
|
34
|
-
if (!node.typeAnnotation || node.typeAnnotation.typeAnnotation.type !== 'TSBooleanKeyword') {
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
33
|
+
// Case 1: Check for @Input() decorator with boolean type
|
|
37
34
|
const hasInputDecorator = node.decorators?.some((decorator) => decorator.expression.type === 'CallExpression' &&
|
|
38
35
|
decorator.expression.callee.type === 'Identifier' &&
|
|
39
36
|
decorator.expression.callee.name === 'Input');
|
|
40
|
-
if (
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
decorator.expression.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (
|
|
50
|
-
const
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
37
|
+
if (hasInputDecorator) {
|
|
38
|
+
// Handle @Input() decorator
|
|
39
|
+
if (!node.typeAnnotation || node.typeAnnotation.typeAnnotation.type !== 'TSBooleanKeyword') {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// Check if it already has transform: booleanAttribute
|
|
43
|
+
const inputDecorator = node.decorators?.find((decorator) => decorator.expression.type === 'CallExpression' &&
|
|
44
|
+
decorator.expression.callee.type === 'Identifier' &&
|
|
45
|
+
decorator.expression.callee.name === 'Input');
|
|
46
|
+
if (inputDecorator?.expression.type === 'CallExpression') {
|
|
47
|
+
const args = inputDecorator.expression.arguments;
|
|
48
|
+
if (args.length > 0 && args[0].type === 'ObjectExpression') {
|
|
49
|
+
const hasTransform = args[0].properties.some((prop) => prop.type === 'Property' &&
|
|
50
|
+
prop.key.type === 'Identifier' &&
|
|
51
|
+
prop.key.name === 'transform' &&
|
|
52
|
+
prop.value.type === 'Identifier' &&
|
|
53
|
+
prop.value.name === 'booleanAttribute');
|
|
54
|
+
if (hasTransform) {
|
|
55
|
+
return; // Already has transform
|
|
56
|
+
}
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
|
+
// Report the issue for @Input()
|
|
60
|
+
const propertyName = node.key.type === 'Identifier' ? node.key.name : 'unknown';
|
|
61
|
+
context.report({
|
|
62
|
+
node: node.key,
|
|
63
|
+
messageId: 'requireTransformDecorator',
|
|
64
|
+
data: { name: propertyName },
|
|
65
|
+
});
|
|
66
|
+
return;
|
|
59
67
|
}
|
|
60
|
-
//
|
|
68
|
+
// Case 2: Check for input() signal syntax
|
|
69
|
+
if (!node.value ||
|
|
70
|
+
node.value.type !== 'CallExpression' ||
|
|
71
|
+
node.value.callee.type !== 'Identifier' ||
|
|
72
|
+
node.value.callee.name !== 'input') {
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
const callExpr = node.value;
|
|
76
|
+
// Check if it's a boolean input (with or without type arguments)
|
|
77
|
+
let isBooleanInput = false;
|
|
78
|
+
if (callExpr.typeArguments && callExpr.typeArguments.params.length > 0) {
|
|
79
|
+
const firstTypeParam = callExpr.typeArguments.params[0];
|
|
80
|
+
isBooleanInput = firstTypeParam.type === 'TSBooleanKeyword';
|
|
81
|
+
}
|
|
82
|
+
if (!isBooleanInput) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
// At this point, we know typeArguments exists and has at least one boolean param
|
|
86
|
+
const typeArgs = callExpr.typeArguments;
|
|
87
|
+
// Check if it already has BooleanInput as second type parameter
|
|
88
|
+
const hasBooleanInput = typeArgs.params.length > 1 &&
|
|
89
|
+
typeArgs.params[1].type === 'TSTypeReference' &&
|
|
90
|
+
typeArgs.params[1].typeName.type === 'Identifier' &&
|
|
91
|
+
typeArgs.params[1].typeName.name === 'BooleanInput';
|
|
92
|
+
// Check if it already has transform in options
|
|
93
|
+
const hasTransformOption = callExpr.arguments.length > 1 &&
|
|
94
|
+
callExpr.arguments[1].type === 'ObjectExpression' &&
|
|
95
|
+
callExpr.arguments[1].properties.some((prop) => prop.type === 'Property' &&
|
|
96
|
+
prop.key.type === 'Identifier' &&
|
|
97
|
+
prop.key.name === 'transform' &&
|
|
98
|
+
prop.value.type === 'Identifier' &&
|
|
99
|
+
prop.value.name === 'booleanAttribute');
|
|
100
|
+
// Both BooleanInput type and transform option are required
|
|
101
|
+
// Only skip if BOTH are present
|
|
102
|
+
if (hasBooleanInput && hasTransformOption) {
|
|
103
|
+
return; // Already correctly configured
|
|
104
|
+
}
|
|
105
|
+
// If we reach here, at least one requirement is missing
|
|
106
|
+
// Report the issue for input() signal
|
|
61
107
|
const propertyName = node.key.type === 'Identifier' ? node.key.name : 'unknown';
|
|
62
108
|
context.report({
|
|
63
109
|
node: node.key,
|
|
64
|
-
messageId: '
|
|
110
|
+
messageId: 'requireTransformSignal',
|
|
65
111
|
data: { name: propertyName },
|
|
66
112
|
});
|
|
67
113
|
},
|
|
68
|
-
// Handle input() signal syntax
|
|
114
|
+
// Handle input() signal syntax (standalone variable declarations - rare)
|
|
69
115
|
VariableDeclarator(node) {
|
|
70
116
|
if (node.init?.type !== 'CallExpression' ||
|
|
71
117
|
node.init.callee.type !== 'Identifier' ||
|
|
@@ -98,9 +144,11 @@ exports.requireBooleanAttributeTransformRule = {
|
|
|
98
144
|
prop.value.type === 'Identifier' &&
|
|
99
145
|
prop.value.name === 'booleanAttribute');
|
|
100
146
|
// Both BooleanInput type and transform option are required
|
|
147
|
+
// Only skip if BOTH are present
|
|
101
148
|
if (hasBooleanInput && hasTransformOption) {
|
|
102
149
|
return; // Already correctly configured
|
|
103
150
|
}
|
|
151
|
+
// If we reach here, at least one requirement is missing
|
|
104
152
|
// Report the issue
|
|
105
153
|
const propertyName = node.id.type === 'Identifier' ? node.id.name : 'unknown';
|
|
106
154
|
context.report({
|
package/package.json
CHANGED