@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
- // Check if it's a boolean property with @Input() decorator
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 (!hasInputDecorator) {
41
- return;
42
- }
43
- // Check if it already has transform: booleanAttribute
44
- const inputDecorator = node.decorators?.find((decorator) => decorator.expression.type === 'CallExpression' &&
45
- decorator.expression.callee.type === 'Identifier' &&
46
- decorator.expression.callee.name === 'Input');
47
- if (inputDecorator?.expression.type === 'CallExpression') {
48
- const args = inputDecorator.expression.arguments;
49
- if (args.length > 0 && args[0].type === 'ObjectExpression') {
50
- const hasTransform = args[0].properties.some((prop) => prop.type === 'Property' &&
51
- prop.key.type === 'Identifier' &&
52
- prop.key.name === 'transform' &&
53
- prop.value.type === 'Identifier' &&
54
- prop.value.name === 'booleanAttribute');
55
- if (hasTransform) {
56
- return; // Already has transform
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
- // Report the issue
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: 'requireTransformDecorator',
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@yoo-digital/eslint-plugin-angular",
3
- "version": "2.0.3",
3
+ "version": "2.0.5",
4
4
  "description": "Yoo Digital custom Angular ESLint plugin for enforcing boolean attribute best practices.",
5
5
  "type": "commonjs",
6
6
  "main": "dist/index.js",