@futdevpro/dynamo-eslint 1.15.7 → 1.15.9

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.
Files changed (118) hide show
  1. package/.dynamo/version-bump.config.json +5 -0
  2. package/.github/workflows/main.yml +424 -395
  3. package/.husky/pre-commit +1 -0
  4. package/__documentations/2026-04-18-ccap-review-integration.md +173 -0
  5. package/build/configs/base.js +20 -1
  6. package/build/configs/base.js.map +1 -1
  7. package/build/configs/ngx.js +10 -0
  8. package/build/configs/ngx.js.map +1 -1
  9. package/build/plugin/index.d.ts +21 -0
  10. package/build/plugin/index.d.ts.map +1 -1
  11. package/build/plugin/index.js +38 -0
  12. package/build/plugin/index.js.map +1 -1
  13. package/build/plugin/rules/angular/angular-for-track-logic.d.ts +8 -0
  14. package/build/plugin/rules/angular/angular-for-track-logic.d.ts.map +1 -0
  15. package/build/plugin/rules/angular/angular-for-track-logic.js +82 -0
  16. package/build/plugin/rules/angular/angular-for-track-logic.js.map +1 -0
  17. package/build/plugin/rules/angular/effect-signal-loop.d.ts +10 -0
  18. package/build/plugin/rules/angular/effect-signal-loop.d.ts.map +1 -0
  19. package/build/plugin/rules/angular/effect-signal-loop.js +113 -0
  20. package/build/plugin/rules/angular/effect-signal-loop.js.map +1 -0
  21. package/build/plugin/rules/angular/no-async-ngoninit.d.ts +9 -0
  22. package/build/plugin/rules/angular/no-async-ngoninit.d.ts.map +1 -0
  23. package/build/plugin/rules/angular/no-async-ngoninit.js +43 -0
  24. package/build/plugin/rules/angular/no-async-ngoninit.js.map +1 -0
  25. package/build/plugin/rules/angular/no-component-direct-api.d.ts +10 -0
  26. package/build/plugin/rules/angular/no-component-direct-api.d.ts.map +1 -0
  27. package/build/plugin/rules/angular/no-component-direct-api.js +76 -0
  28. package/build/plugin/rules/angular/no-component-direct-api.js.map +1 -0
  29. package/build/plugin/rules/angular/no-method-call-in-template.d.ts +9 -0
  30. package/build/plugin/rules/angular/no-method-call-in-template.d.ts.map +1 -0
  31. package/build/plugin/rules/angular/no-method-call-in-template.js +80 -0
  32. package/build/plugin/rules/angular/no-method-call-in-template.js.map +1 -0
  33. package/build/plugin/rules/angular/no-ngfor-directive.d.ts +8 -0
  34. package/build/plugin/rules/angular/no-ngfor-directive.d.ts.map +1 -0
  35. package/build/plugin/rules/angular/no-ngfor-directive.js +60 -0
  36. package/build/plugin/rules/angular/no-ngfor-directive.js.map +1 -0
  37. package/build/plugin/rules/angular/no-ngif-directive.d.ts +8 -0
  38. package/build/plugin/rules/angular/no-ngif-directive.d.ts.map +1 -0
  39. package/build/plugin/rules/angular/no-ngif-directive.js +60 -0
  40. package/build/plugin/rules/angular/no-ngif-directive.js.map +1 -0
  41. package/build/plugin/rules/naming-patterns.d.ts +4 -0
  42. package/build/plugin/rules/naming-patterns.d.ts.map +1 -1
  43. package/build/plugin/rules/naming-patterns.js +331 -8
  44. package/build/plugin/rules/naming-patterns.js.map +1 -1
  45. package/build/plugin/rules/no-getter-logic.d.ts.map +1 -1
  46. package/build/plugin/rules/no-getter-logic.js +21 -2
  47. package/build/plugin/rules/no-getter-logic.js.map +1 -1
  48. package/build/plugin/rules/require-jsdoc-description.d.ts.map +1 -1
  49. package/build/plugin/rules/require-jsdoc-description.js +17 -0
  50. package/build/plugin/rules/require-jsdoc-description.js.map +1 -1
  51. package/build/plugin/rules/ts/data-model-extends.d.ts +9 -0
  52. package/build/plugin/rules/ts/data-model-extends.d.ts.map +1 -0
  53. package/build/plugin/rules/ts/data-model-extends.js +95 -0
  54. package/build/plugin/rules/ts/data-model-extends.js.map +1 -0
  55. package/build/plugin/rules/ts/no-any-type.d.ts +9 -0
  56. package/build/plugin/rules/ts/no-any-type.d.ts.map +1 -0
  57. package/build/plugin/rules/ts/no-any-type.js +37 -0
  58. package/build/plugin/rules/ts/no-any-type.js.map +1 -0
  59. package/build/plugin/rules/ts/no-as-cast.d.ts +9 -0
  60. package/build/plugin/rules/ts/no-as-cast.d.ts.map +1 -0
  61. package/build/plugin/rules/ts/no-as-cast.js +50 -0
  62. package/build/plugin/rules/ts/no-as-cast.js.map +1 -0
  63. package/build/plugin/rules/ts/no-dynamic-imports.d.ts +9 -0
  64. package/build/plugin/rules/ts/no-dynamic-imports.d.ts.map +1 -0
  65. package/build/plugin/rules/ts/no-dynamic-imports.js +51 -0
  66. package/build/plugin/rules/ts/no-dynamic-imports.js.map +1 -0
  67. package/build/plugin/rules/ts/no-native-browser-dialogs.d.ts +9 -0
  68. package/build/plugin/rules/ts/no-native-browser-dialogs.d.ts.map +1 -0
  69. package/build/plugin/rules/ts/no-native-browser-dialogs.js +79 -0
  70. package/build/plugin/rules/ts/no-native-browser-dialogs.js.map +1 -0
  71. package/build/plugin/rules/ts/no-plain-function-export.d.ts +10 -0
  72. package/build/plugin/rules/ts/no-plain-function-export.d.ts.map +1 -0
  73. package/build/plugin/rules/ts/no-plain-function-export.js +70 -0
  74. package/build/plugin/rules/ts/no-plain-function-export.js.map +1 -0
  75. package/build/plugin/rules/ts/one-export-per-file.d.ts +9 -0
  76. package/build/plugin/rules/ts/one-export-per-file.d.ts.map +1 -0
  77. package/build/plugin/rules/ts/one-export-per-file.js +74 -0
  78. package/build/plugin/rules/ts/one-export-per-file.js.map +1 -0
  79. package/package.json +5 -8
  80. package/pipeline.cicd.config.json +154 -0
  81. package/src/configs/base.ts +21 -1
  82. package/src/configs/ngx.ts +12 -0
  83. package/src/plugin/index.ts +44 -3
  84. package/src/plugin/rules/angular/angular-for-track-logic.spec.ts +44 -0
  85. package/src/plugin/rules/angular/angular-for-track-logic.ts +88 -0
  86. package/src/plugin/rules/angular/effect-signal-loop.spec.ts +89 -0
  87. package/src/plugin/rules/angular/effect-signal-loop.ts +125 -0
  88. package/src/plugin/rules/angular/no-async-ngoninit.spec.ts +50 -0
  89. package/src/plugin/rules/angular/no-async-ngoninit.ts +43 -0
  90. package/src/plugin/rules/angular/no-component-direct-api.spec.ts +78 -0
  91. package/src/plugin/rules/angular/no-component-direct-api.ts +82 -0
  92. package/src/plugin/rules/angular/no-method-call-in-template.spec.ts +63 -0
  93. package/src/plugin/rules/angular/no-method-call-in-template.ts +89 -0
  94. package/src/plugin/rules/angular/no-ngfor-directive.spec.ts +44 -0
  95. package/src/plugin/rules/angular/no-ngfor-directive.ts +62 -0
  96. package/src/plugin/rules/angular/no-ngif-directive.spec.ts +44 -0
  97. package/src/plugin/rules/angular/no-ngif-directive.ts +62 -0
  98. package/src/plugin/rules/naming-patterns.spec.ts +108 -22
  99. package/src/plugin/rules/naming-patterns.ts +390 -11
  100. package/src/plugin/rules/no-getter-logic.spec.ts +71 -0
  101. package/src/plugin/rules/no-getter-logic.ts +21 -2
  102. package/src/plugin/rules/require-jsdoc-description.spec.ts +1 -0
  103. package/src/plugin/rules/require-jsdoc-description.ts +19 -0
  104. package/src/plugin/rules/ts/data-model-extends.spec.ts +84 -0
  105. package/src/plugin/rules/ts/data-model-extends.ts +100 -0
  106. package/src/plugin/rules/ts/no-any-type.spec.ts +28 -0
  107. package/src/plugin/rules/ts/no-any-type.ts +36 -0
  108. package/src/plugin/rules/ts/no-as-cast.spec.ts +51 -0
  109. package/src/plugin/rules/ts/no-as-cast.ts +51 -0
  110. package/src/plugin/rules/ts/no-dynamic-imports.spec.ts +54 -0
  111. package/src/plugin/rules/ts/no-dynamic-imports.ts +49 -0
  112. package/src/plugin/rules/ts/no-native-browser-dialogs.spec.ts +54 -0
  113. package/src/plugin/rules/ts/no-native-browser-dialogs.ts +84 -0
  114. package/src/plugin/rules/ts/no-plain-function-export.spec.ts +72 -0
  115. package/src/plugin/rules/ts/no-plain-function-export.ts +73 -0
  116. package/src/plugin/rules/ts/one-export-per-file.spec.ts +64 -0
  117. package/src/plugin/rules/ts/one-export-per-file.ts +77 -0
  118. package/futdevpro-dynamo-eslint-1.15.7.tgz +0 -0
@@ -0,0 +1 @@
1
+ dc bump-version
@@ -0,0 +1,173 @@
1
+ # CCAP Revisioned Review integráció a Dynamo ESLint-be
2
+
3
+ **Dátum:** 2026-04-18
4
+
5
+ ## Összefoglaló
6
+
7
+ A `ccap-revisioned/server/src/_modules/developer-tools/` alatti **Code Review
8
+ toolkit** AST-portable részének átültetése a `@futdevpro/dynamo-eslint`
9
+ plugin-be. Eredmény: az IDE a háttér-ben azonnal mutatja a CCAP-szintű
10
+ review-violation-öket — `eslint --fix`-szel a fixálható-k automatikusan
11
+ javíthatók.
12
+
13
+ Az eredeti `ccap-revisioned` projekt-hez **nem** nyúltunk hozzá.
14
+
15
+ ## Áttekintés: 25 AST-portable review
16
+
17
+ A 38 CCAP review-ból:
18
+
19
+ - **8 review** csak filesystem-szinten értelmezhető (cross-file konzisztencia,
20
+ file-rename autofix) → **csak `dc rev`-ben** él (lásd `dynamo-cli` doc).
21
+ - **6 review** lefedve **ESLint built-in** vagy `@typescript-eslint`
22
+ szabállyal — `base.ts`-ben aktiválva.
23
+ - **4 review** **megerősítve** meglévő `@futdevpro/dynamo` szabályokon
24
+ belül (sub-check-ek + szigorúbb logika).
25
+ - **14 review** **új AST-szabály-ként** implementálva.
26
+
27
+ ## 1. Új ESLint built-in / typescript-eslint aktiválás (`base.ts`)
28
+
29
+ | Szabály | Megfelelő CCAP review |
30
+ | ------------------------------------------------ | ---------------------------- |
31
+ | `max-params: [warn, 3]` (régről 4) | `method-input-count` |
32
+ | `object-shorthand: [warn, never]` | `no-object-shorthand` |
33
+ | `dot-notation: warn` | `no-bracket-property-access` |
34
+ | `@typescript-eslint/array-type: [warn, array]` | `no-array-generic` |
35
+ | `@typescript-eslint/prefer-optional-chain: warn` | `prefer-optional-chaining` |
36
+ | `@typescript-eslint/no-require-imports: warn` | `no-dynamic-imports` (CJS) |
37
+
38
+ ## 2. Megerősített meglévő szabályok
39
+
40
+ ### `naming-patterns` (komplett rewrite)
41
+
42
+ Konfigurálható sub-check-ek `checks` schema option-nel — mind a 7 CCAP
43
+ naming-review egy szabály-on belül, AST-alapú PropertyDefinition /
44
+ ClassDeclaration / TSEnumDeclaration visitor-okkal.
45
+
46
+ Sub-check-ek (default: mind aktív):
47
+
48
+ - `booleanIsPrefix` — boolean property `is`-prefix
49
+ - `signalPostfix` — `signal()` / `computed()` factory `_$` postfix
50
+ - `rxjsPostfix` — `BehaviorSubject` `_BS`, `Subject` `_S`, `Observable` `$`
51
+ - `fileClassPostfix` — class-postfix illeszkedik a fájl-pattern-hez
52
+ - `enumValueFormat` — enum kulcs camelCase, érték kebab-case (`*.type-enum.ts`)
53
+ - `servicePropertyPostfix` — `_DataService` injektált prop `_DS`-re végződik (`_AS`, `_CS`, `_MS` is)
54
+ - `fileClassNameConsistency` — fájl-entity rész = class-entity rész (kebab-átkonvertálva)
55
+
56
+ ### `no-getter-logic` (CCAP-megerősítés)
57
+
58
+ - Új tiltott AST node-ok: `IfStatement`, `ForStatement`, `WhileStatement`,
59
+ `SwitchStatement`, `TryStatement`, `ThrowStatement`, `VariableDeclaration`
60
+ - Új ellenőrzés: `BlockStatement.body.length > 1` — több-utasításos getter tilos
61
+
62
+ ### `require-jsdoc-description` (CCAP-megerősítés)
63
+
64
+ - Új visitor: `TSTypeAliasDeclaration` — exportált `type X = …` is kötelező
65
+ JSDoc-os
66
+
67
+ ### `import-order` (változatlanul lefedi)
68
+
69
+ A CCAP `import-group-order` review 4-csoport-os elvét már a meglévő rule
70
+ implementálja.
71
+
72
+ ## 3. Új TypeScript szabályok (`src/plugin/rules/ts/`)
73
+
74
+ | Szabály | CCAP review |
75
+ | ----------------------------- | ---------------------------- |
76
+ | `no-as-cast` | `no-as-cast` (kivéve `as const`) |
77
+ | `no-any-type` | `no-any-type` |
78
+ | `no-dynamic-imports` | `no-dynamic-imports` (ES + CJS) |
79
+ | `one-export-per-file` | `one-export-per-file` (kivételek: `.const.ts`, `.type-enum.ts`, `.interface.ts`, `.data-model.ts`, `.control-model.ts`) |
80
+ | `no-plain-function-export` | `no-plain-function-export` (kivéve `.spec.ts`) |
81
+ | `data-model-extends` | `data-model-extends-metadata` + `parallel-date-fields` (egy szabály) |
82
+ | `no-native-browser-dialogs` | `no-native-browser-dialogs` |
83
+
84
+ ## 4. Új Angular szabályok (`src/plugin/rules/angular/`)
85
+
86
+ ### TypeScript-AST (alkalmazva `*.ts` fájlokra)
87
+
88
+ | Szabály | CCAP review |
89
+ | ----------------------------- | ---------------------------- |
90
+ | `no-async-ngoninit` | `no-async-ngoninit` — `async ngOnInit` tilos |
91
+ | `no-component-direct-api` | `no-component-direct-api` — komponens nem importálhat `*ApiService`-t / `HttpClient`-et |
92
+ | `effect-signal-loop` | `effect-signal-loop` — `effect()` signal read+write detection |
93
+
94
+ ### Template-text-scan (alkalmazva `*.html` fájlokra)
95
+
96
+ | Szabály | CCAP review |
97
+ | ----------------------------- | ---------------------------- |
98
+ | `no-method-call-in-template` | `no-method-call-in-template` — `{{ method() }}` / `[attr]="m()"` / `@if (m())` tilos |
99
+ | `angular-for-track-logic` | `angular-for-track-logic` — `@for track` csak property access lehet |
100
+ | `no-ngif-directive` | `no-ngif-directive` — `*ngIf` helyett `@if` |
101
+ | `no-ngfor-directive` | `no-ngfor-directive` — `*ngFor` helyett `@for` |
102
+
103
+ > **Megjegyzés**: A 4 template-szabály nem AST-t, hanem source-text regex-et
104
+ > használ a `Program` visitor-ban. Ez direkt döntés — robosztusabb a többféle
105
+ > Angular template-parser verzió ellenében, és a CCAP review is ugyanígy
106
+ > szöveg-szinten skennel.
107
+
108
+ ## Aktiválás
109
+
110
+ A 7 új TS szabály mind regisztrálódik a `base.ts`-ben (default: `warn`).
111
+
112
+ A 7 Angular szabály a `ngx.ts`-ben aktiválódik:
113
+
114
+ - 3 darab a `*.ts` block-ban (no-async-ngoninit, no-component-direct-api, effect-signal-loop)
115
+ - 4 darab a `*.html` block-ban (template-szabályok)
116
+
117
+ A `ngx.ts` html-block plugins szekcióját kibővítettük `...ngxBaseConfig[1].plugins`-szal,
118
+ hogy a `@futdevpro/dynamo` plugin a html files alatt is regisztrált legyen.
119
+
120
+ ## Tesztek
121
+
122
+ Minden új szabály-hoz `*.spec.ts` (mock-context pattern, ahogy a meglévő
123
+ specek is csinálták):
124
+
125
+ - 7 darab `src/plugin/rules/ts/*.spec.ts`
126
+ - 7 darab `src/plugin/rules/angular/*.spec.ts`
127
+ - `naming-patterns.spec.ts` — komplett rewrite a 7 sub-check-hez
128
+ - `no-getter-logic.spec.ts` — multi-statement + if-statement edge case-ek
129
+ - `require-jsdoc-description.spec.ts` — `TSTypeAliasDeclaration` visitor expose
130
+
131
+ Eredmény: **186 spec, 0 failure** (a meglévő 167-en felül a 19 új).
132
+
133
+ Futtatás: `pnpm test`.
134
+
135
+ ## Disable comment
136
+
137
+ ESLint natív disable-komment-tel kapcsolható ki egy adott rule:
138
+
139
+ ```typescript
140
+ // eslint-disable-next-line @futdevpro/dynamo/no-as-cast
141
+ const x: MyType = (someUnknown as MyType);
142
+ ```
143
+
144
+ A CCAP `// ccap-review-disable` és az új `// dy-review-disable` szintaxis
145
+ **csak** a CLI-szintű `dc rev` által értelmezett — ESLint-en nem hat. Ha
146
+ mindkét toolból ki akarsz tiltani egy violation-t, mindkét komment-stílust
147
+ használd.
148
+
149
+ ## When to use which?
150
+
151
+ | Helyzet | CLI (`dc rev`) | ESLint plugin |
152
+ | ------------------------------------------------ | -------------- | ------------- |
153
+ | IDE inline-hint, save-on-format autofix | | ✓ |
154
+ | Pre-commit hook (gyors, fájlonkénti) | | ✓ |
155
+ | CI repo-wide audit JSON output-tal | ✓ | |
156
+ | Cross-file konzisztencia (module-export-prefix) | ✓ | |
157
+ | File-rename autofix (file-class-name-consistency) | ✓ | |
158
+ | Bulk autofix (`--fix --apply`) | ✓ | |
159
+ | Per-fájl, AST-pontosságú szabály-violation | | ✓ |
160
+ | Naming + signal + rxjs postfix | ✓ | ✓ (mindkettő) |
161
+ | Template `*ngIf` / `@for track` ellenőrzés | ✓ | ✓ (mindkettő) |
162
+
163
+ A két toolkit **komplementer**: az ESLint az IDE-szintű real-time feedback,
164
+ a CLI a repo-szintű audit + bulk-autofix. Ahol mindkét tool implementálja
165
+ ugyanazt a review-t, ott double-coverage van — ez szándékos: az ESLint az
166
+ IDE-ben azonnal jelez, a CLI pedig CI-ben még egyszer leellenőriz.
167
+
168
+ ## Kapcsolódó dokumentumok
169
+
170
+ - `dynamo-cli/__documentations/2026-04-18-ccap-review-integration.md` — CLI oldal
171
+ - `dynamo-eslint/src/configs/base.ts` — base ruleset (összes új TS szabály)
172
+ - `dynamo-eslint/src/configs/ngx.ts` — Angular ruleset (új Angular + template szabályok)
173
+ - `dynamo-eslint/src/plugin/index.ts` — plugin export + recommended config
@@ -86,9 +86,14 @@ module.exports = [
86
86
  'keyword-spacing': 'warn',
87
87
  'no-else-return': 'warn',
88
88
  'no-duplicate-imports': 'warn',
89
- 'max-params': ['warn', 4],
89
+ // CCAP method-input-count: 3+ paraméter helyett egyetlen object input kötelező
90
+ 'max-params': ['warn', 3],
90
91
  'max-params-no-constructor/max-params-no-constructor': ['warn', 5],
91
92
  'quotes': ['warn', 'single', { allowTemplateLiterals: true }],
93
+ // CCAP no-object-shorthand: tilos a `{ foo }` shorthand, mindig `{ foo: foo }`
94
+ 'object-shorthand': ['warn', 'never'],
95
+ // CCAP no-bracket-property-access: dot-notation előnyben (ahol lehetséges)
96
+ 'dot-notation': 'warn',
92
97
  // TypeScript rules
93
98
  '@typescript-eslint/no-unused-vars': 'warn',
94
99
  '@typescript-eslint/explicit-function-return-type': ['warn', { allowTypedFunctionExpressions: false }],
@@ -100,6 +105,12 @@ module.exports = [
100
105
  },
101
106
  ],
102
107
  '@typescript-eslint/no-unnecessary-type-assertion': 'warn',
108
+ // CCAP no-array-generic: `Array<T>` helyett `T[]`
109
+ '@typescript-eslint/array-type': ['warn', { default: 'array' }],
110
+ // CCAP prefer-optional-chaining: `a && a.b` helyett `a?.b`
111
+ '@typescript-eslint/prefer-optional-chain': 'warn',
112
+ // CCAP no-dynamic-imports (CommonJS variant): `require()` helyett ES import
113
+ '@typescript-eslint/no-require-imports': 'warn',
103
114
  // Dynamo custom rules
104
115
  '@futdevpro/dynamo/explicit-types': 'warn',
105
116
  '@futdevpro/dynamo/import-order': 'warn',
@@ -111,6 +122,14 @@ module.exports = [
111
122
  '@futdevpro/dynamo/prefer-enum-over-string-union': ['warn', { minValues: 3 }],
112
123
  '@futdevpro/dynamo/require-test-description-prefix': ['warn', { prefix: '| ' }],
113
124
  '@futdevpro/dynamo/no-getter-logic': 'warn',
125
+ // CCAP-portolt TypeScript review-k (AST-alapú).
126
+ '@futdevpro/dynamo/no-as-cast': 'warn',
127
+ '@futdevpro/dynamo/no-any-type': 'warn',
128
+ '@futdevpro/dynamo/no-dynamic-imports': 'warn',
129
+ '@futdevpro/dynamo/one-export-per-file': 'warn',
130
+ '@futdevpro/dynamo/no-plain-function-export': 'warn',
131
+ '@futdevpro/dynamo/data-model-extends': 'warn',
132
+ '@futdevpro/dynamo/no-native-browser-dialogs': 'warn',
114
133
  },
115
134
  },
116
135
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/configs/base.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../src/configs/base.ts"],"names":[],"mappings":"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"}
@@ -44,6 +44,10 @@ module.exports = [
44
44
  '@angular-eslint/no-outputs-metadata-property': 'error',
45
45
  '@angular-eslint/use-lifecycle-interface': 'error',
46
46
  '@angular-eslint/use-pipe-transform-interface': 'error',
47
+ // CCAP-portolt Angular TypeScript review-k.
48
+ '@futdevpro/dynamo/no-async-ngoninit': 'warn',
49
+ '@futdevpro/dynamo/no-component-direct-api': 'warn',
50
+ '@futdevpro/dynamo/effect-signal-loop': 'warn',
47
51
  },
48
52
  },
49
53
  {
@@ -56,6 +60,7 @@ module.exports = [
56
60
  },
57
61
  },
58
62
  plugins: {
63
+ ...ngxBaseConfig[1].plugins,
59
64
  '@angular-eslint/template': angularTemplatePlugin,
60
65
  },
61
66
  rules: {
@@ -66,6 +71,11 @@ module.exports = [
66
71
  '@angular-eslint/template/no-duplicate-attributes': 'error',
67
72
  '@angular-eslint/template/no-negated-async': 'error',
68
73
  '@angular-eslint/template/use-track-by-function': 'error',
74
+ // CCAP-portolt Angular template review-k (regex-alapú text scan).
75
+ '@futdevpro/dynamo/no-method-call-in-template': 'warn',
76
+ '@futdevpro/dynamo/angular-for-track-logic': 'warn',
77
+ '@futdevpro/dynamo/no-ngif-directive': 'warn',
78
+ '@futdevpro/dynamo/no-ngfor-directive': 'warn',
69
79
  },
70
80
  },
71
81
  ];
@@ -1 +1 @@
1
- {"version":3,"file":"ngx.js","sourceRoot":"","sources":["../../src/configs/ngx.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACxC,MAAM,aAAa,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAAC;AAC/D,MAAM,qBAAqB,GAAG,OAAO,CAAC,wCAAwC,CAAC,CAAC;AAChF,MAAM,qBAAqB,GAAG,OAAO,CAAC,iCAAiC,CAAC,CAAC;AAEzE;;;;GAIG;AACH,MAAM,CAAC,OAAO,GAAG;IACf,GAAG,aAAa;IAChB;QACE,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;QAC9B,eAAe,EAAE;YACf,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,eAAe;YACnC,OAAO,EAAE;gBACP,kBAAkB;gBAClB,MAAM,EAAE,UAAU;gBAClB,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,UAAU;gBACnB,OAAO,EAAE,UAAU;gBACnB,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,UAAU;gBAClB,SAAS,EAAE,UAAU;gBACrB,UAAU,EAAE,UAAU;gBACtB,MAAM,EAAE,UAAU;gBAClB,OAAO,EAAE,UAAU;gBACnB,OAAO,EAAE,UAAU;aACpB;SACF;QACD,OAAO,EAAE;YACP,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO;YAC3B,iBAAiB,EAAE,aAAa;SACjC;QACD,KAAK,EAAE;YACL,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK;YACzB,yBAAyB;YACzB,oCAAoC,EAAE,OAAO;YAC7C,oCAAoC,EAAE,OAAO;YAC7C,0CAA0C,EAAE,OAAO;YACnD,2CAA2C,EAAE,OAAO;YACpD,iCAAiC,EAAE,OAAO;YAC1C,kCAAkC,EAAE,OAAO;YAC3C,8CAA8C,EAAE,OAAO;YACvD,yCAAyC,EAAE,OAAO;YAClD,8CAA8C,EAAE,OAAO;SACxD;KACF;IACD;QACE,KAAK,EAAE,CAAC,WAAW,CAAC;QACpB,eAAe,EAAE;YACf,MAAM,EAAE,qBAAqB;YAC7B,aAAa,EAAE;gBACb,WAAW,EAAE,QAAQ;gBACrB,UAAU,EAAE,QAAQ;aACrB;SACF;QACD,OAAO,EAAE;YACP,0BAA0B,EAAE,qBAAqB;SAClD;QACD,KAAK,EAAE;YACL,wCAAwC,EAAE,OAAO;YACjD,gDAAgD,EAAE,OAAO;YACzD,iCAAiC,EAAE,OAAO;YAC1C,6CAA6C,EAAE,OAAO;YACtD,kDAAkD,EAAE,OAAO;YAC3D,2CAA2C,EAAE,OAAO;YACpD,gDAAgD,EAAE,OAAO;SAC1D;KACF;CACF,CAAC"}
1
+ {"version":3,"file":"ngx.js","sourceRoot":"","sources":["../../src/configs/ngx.ts"],"names":[],"mappings":"AAAA,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AACxC,MAAM,aAAa,GAAG,OAAO,CAAC,+BAA+B,CAAC,CAAC;AAC/D,MAAM,qBAAqB,GAAG,OAAO,CAAC,wCAAwC,CAAC,CAAC;AAChF,MAAM,qBAAqB,GAAG,OAAO,CAAC,iCAAiC,CAAC,CAAC;AAEzE;;;;GAIG;AACH,MAAM,CAAC,OAAO,GAAG;IACf,GAAG,aAAa;IAChB;QACE,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,CAAC;QAC9B,eAAe,EAAE;YACf,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,eAAe;YACnC,OAAO,EAAE;gBACP,kBAAkB;gBAClB,MAAM,EAAE,UAAU;gBAClB,QAAQ,EAAE,UAAU;gBACpB,OAAO,EAAE,UAAU;gBACnB,OAAO,EAAE,UAAU;gBACnB,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,UAAU;gBAClB,SAAS,EAAE,UAAU;gBACrB,UAAU,EAAE,UAAU;gBACtB,MAAM,EAAE,UAAU;gBAClB,OAAO,EAAE,UAAU;gBACnB,OAAO,EAAE,UAAU;aACpB;SACF;QACD,OAAO,EAAE;YACP,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO;YAC3B,iBAAiB,EAAE,aAAa;SACjC;QACD,KAAK,EAAE;YACL,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,KAAK;YACzB,yBAAyB;YACzB,oCAAoC,EAAE,OAAO;YAC7C,oCAAoC,EAAE,OAAO;YAC7C,0CAA0C,EAAE,OAAO;YACnD,2CAA2C,EAAE,OAAO;YACpD,iCAAiC,EAAE,OAAO;YAC1C,kCAAkC,EAAE,OAAO;YAC3C,8CAA8C,EAAE,OAAO;YACvD,yCAAyC,EAAE,OAAO;YAClD,8CAA8C,EAAE,OAAO;YAEvD,4CAA4C;YAC5C,qCAAqC,EAAE,MAAM;YAC7C,2CAA2C,EAAE,MAAM;YACnD,sCAAsC,EAAE,MAAM;SAC/C;KACF;IACD;QACE,KAAK,EAAE,CAAC,WAAW,CAAC;QACpB,eAAe,EAAE;YACf,MAAM,EAAE,qBAAqB;YAC7B,aAAa,EAAE;gBACb,WAAW,EAAE,QAAQ;gBACrB,UAAU,EAAE,QAAQ;aACrB;SACF;QACD,OAAO,EAAE;YACP,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,OAAO;YAC3B,0BAA0B,EAAE,qBAAqB;SAClD;QACD,KAAK,EAAE;YACL,wCAAwC,EAAE,OAAO;YACjD,gDAAgD,EAAE,OAAO;YACzD,iCAAiC,EAAE,OAAO;YAC1C,6CAA6C,EAAE,OAAO;YACtD,kDAAkD,EAAE,OAAO;YAC3D,2CAA2C,EAAE,OAAO;YACpD,gDAAgD,EAAE,OAAO;YAEzD,kEAAkE;YAClE,8CAA8C,EAAE,MAAM;YACtD,2CAA2C,EAAE,MAAM;YACnD,qCAAqC,EAAE,MAAM;YAC7C,sCAAsC,EAAE,MAAM;SAC/C;KACF;CACF,CAAC"}
@@ -10,6 +10,20 @@ declare const _default: {
10
10
  'require-test-description-prefix': Rule.RuleModule;
11
11
  'no-getter-logic': Rule.RuleModule;
12
12
  'naming-patterns': Rule.RuleModule;
13
+ 'no-as-cast': Rule.RuleModule;
14
+ 'no-any-type': Rule.RuleModule;
15
+ 'no-dynamic-imports': Rule.RuleModule;
16
+ 'one-export-per-file': Rule.RuleModule;
17
+ 'no-plain-function-export': Rule.RuleModule;
18
+ 'data-model-extends': Rule.RuleModule;
19
+ 'no-native-browser-dialogs': Rule.RuleModule;
20
+ 'no-async-ngoninit': Rule.RuleModule;
21
+ 'no-component-direct-api': Rule.RuleModule;
22
+ 'effect-signal-loop': Rule.RuleModule;
23
+ 'no-method-call-in-template': Rule.RuleModule;
24
+ 'angular-for-track-logic': Rule.RuleModule;
25
+ 'no-ngif-directive': Rule.RuleModule;
26
+ 'no-ngfor-directive': Rule.RuleModule;
13
27
  };
14
28
  configs: {
15
29
  recommended: {
@@ -24,6 +38,13 @@ declare const _default: {
24
38
  '@futdevpro/dynamo/require-test-description-prefix': string;
25
39
  '@futdevpro/dynamo/no-getter-logic': string;
26
40
  '@futdevpro/dynamo/naming-patterns': string;
41
+ '@futdevpro/dynamo/no-as-cast': string;
42
+ '@futdevpro/dynamo/no-any-type': string;
43
+ '@futdevpro/dynamo/no-dynamic-imports': string;
44
+ '@futdevpro/dynamo/one-export-per-file': string;
45
+ '@futdevpro/dynamo/no-plain-function-export': string;
46
+ '@futdevpro/dynamo/data-model-extends': string;
47
+ '@futdevpro/dynamo/no-native-browser-dialogs': string;
27
48
  };
28
49
  };
29
50
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,kBA+BE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,kBA0DE"}
@@ -10,6 +10,20 @@ const require_jsdoc_description_1 = tslib_1.__importDefault(require("./rules/req
10
10
  const prefer_enum_over_string_union_1 = tslib_1.__importDefault(require("./rules/prefer-enum-over-string-union"));
11
11
  const require_test_description_prefix_1 = tslib_1.__importDefault(require("./rules/require-test-description-prefix"));
12
12
  const no_getter_logic_1 = tslib_1.__importDefault(require("./rules/no-getter-logic"));
13
+ const no_as_cast_1 = tslib_1.__importDefault(require("./rules/ts/no-as-cast"));
14
+ const no_any_type_1 = tslib_1.__importDefault(require("./rules/ts/no-any-type"));
15
+ const no_dynamic_imports_1 = tslib_1.__importDefault(require("./rules/ts/no-dynamic-imports"));
16
+ const one_export_per_file_1 = tslib_1.__importDefault(require("./rules/ts/one-export-per-file"));
17
+ const no_plain_function_export_1 = tslib_1.__importDefault(require("./rules/ts/no-plain-function-export"));
18
+ const data_model_extends_1 = tslib_1.__importDefault(require("./rules/ts/data-model-extends"));
19
+ const no_native_browser_dialogs_1 = tslib_1.__importDefault(require("./rules/ts/no-native-browser-dialogs"));
20
+ const no_async_ngoninit_1 = tslib_1.__importDefault(require("./rules/angular/no-async-ngoninit"));
21
+ const no_component_direct_api_1 = tslib_1.__importDefault(require("./rules/angular/no-component-direct-api"));
22
+ const effect_signal_loop_1 = tslib_1.__importDefault(require("./rules/angular/effect-signal-loop"));
23
+ const no_method_call_in_template_1 = tslib_1.__importDefault(require("./rules/angular/no-method-call-in-template"));
24
+ const angular_for_track_logic_1 = tslib_1.__importDefault(require("./rules/angular/angular-for-track-logic"));
25
+ const no_ngif_directive_1 = tslib_1.__importDefault(require("./rules/angular/no-ngif-directive"));
26
+ const no_ngfor_directive_1 = tslib_1.__importDefault(require("./rules/angular/no-ngfor-directive"));
13
27
  module.exports = {
14
28
  rules: {
15
29
  'explicit-types': explicit_types_1.default,
@@ -22,6 +36,22 @@ module.exports = {
22
36
  'require-test-description-prefix': require_test_description_prefix_1.default,
23
37
  'no-getter-logic': no_getter_logic_1.default,
24
38
  'naming-patterns': naming_patterns_1.default,
39
+ // CCAP-portolt TypeScript review-k (AST-alapú).
40
+ 'no-as-cast': no_as_cast_1.default,
41
+ 'no-any-type': no_any_type_1.default,
42
+ 'no-dynamic-imports': no_dynamic_imports_1.default,
43
+ 'one-export-per-file': one_export_per_file_1.default,
44
+ 'no-plain-function-export': no_plain_function_export_1.default,
45
+ 'data-model-extends': data_model_extends_1.default,
46
+ 'no-native-browser-dialogs': no_native_browser_dialogs_1.default,
47
+ // CCAP-portolt Angular review-k (TS + template-szöveg AST-alapú).
48
+ 'no-async-ngoninit': no_async_ngoninit_1.default,
49
+ 'no-component-direct-api': no_component_direct_api_1.default,
50
+ 'effect-signal-loop': effect_signal_loop_1.default,
51
+ 'no-method-call-in-template': no_method_call_in_template_1.default,
52
+ 'angular-for-track-logic': angular_for_track_logic_1.default,
53
+ 'no-ngif-directive': no_ngif_directive_1.default,
54
+ 'no-ngfor-directive': no_ngfor_directive_1.default,
25
55
  },
26
56
  configs: {
27
57
  recommended: {
@@ -36,6 +66,14 @@ module.exports = {
36
66
  '@futdevpro/dynamo/require-test-description-prefix': 'warn',
37
67
  '@futdevpro/dynamo/no-getter-logic': 'warn',
38
68
  '@futdevpro/dynamo/naming-patterns': 'warn',
69
+ // CCAP-portolt TypeScript review-k (AST-alapú).
70
+ '@futdevpro/dynamo/no-as-cast': 'warn',
71
+ '@futdevpro/dynamo/no-any-type': 'warn',
72
+ '@futdevpro/dynamo/no-dynamic-imports': 'warn',
73
+ '@futdevpro/dynamo/one-export-per-file': 'warn',
74
+ '@futdevpro/dynamo/no-plain-function-export': 'warn',
75
+ '@futdevpro/dynamo/data-model-extends': 'warn',
76
+ '@futdevpro/dynamo/no-native-browser-dialogs': 'warn',
39
77
  },
40
78
  },
41
79
  },
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":";;AAAA,oFAAuD;AACvD,uFAA0D;AAC1D,sFAAyD;AACzD,2FAA6D;AAC7D,uFAA4D;AAC5D,kIAAgF;AAChF,0GAAiE;AACjE,kHAAmE;AACnE,sHAA4E;AAC5E,sFAAwD;AAExD,iBAAS;IACP,KAAK,EAAE;QACL,gBAAgB,EAAE,wBAAiB;QACnC,cAAc,EAAE,sBAAe;QAC/B,gBAAgB,EAAE,wBAAgB;QAClC,cAAc,EAAE,sBAAiB;QACjC,uCAAuC,EAAE,+CAAmB;QAC5D,2BAA2B,EAAE,mCAAgB;QAC7C,+BAA+B,EAAE,uCAAc;QAC/C,iCAAiC,EAAE,yCAAqB;QACxD,iBAAiB,EAAE,yBAAiB;QAEpC,iBAAiB,EAAE,yBAAkB;KACtC;IACD,OAAO,EAAE;QACP,WAAW,EAAE;YACX,KAAK,EAAE;gBACL,kCAAkC,EAAE,MAAM;gBAC1C,gCAAgC,EAAE,MAAM;gBACxC,kCAAkC,EAAE,MAAM;gBAC1C,gCAAgC,EAAE,MAAM;gBACxC,yDAAyD,EAAE,MAAM;gBACjE,6CAA6C,EAAE,MAAM;gBACrD,iDAAiD,EAAE,MAAM;gBACzD,mDAAmD,EAAE,MAAM;gBAC3D,mCAAmC,EAAE,MAAM;gBAE3C,mCAAmC,EAAE,MAAM;aAC5C;SACF;KACF;CACF,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":";;AAAA,oFAAuD;AACvD,uFAA0D;AAC1D,sFAAyD;AACzD,2FAA6D;AAC7D,uFAA4D;AAC5D,kIAAgF;AAChF,0GAAiE;AACjE,kHAAmE;AACnE,sHAA4E;AAC5E,sFAAwD;AAExD,+EAAiD;AACjD,iFAAmD;AACnD,+FAAiE;AACjE,iGAAkE;AAClE,2GAA4E;AAC5E,+FAAiE;AACjE,6GAA8E;AAE9E,kGAAoE;AACpE,8GAA+E;AAC/E,oGAAsE;AACtE,oHAAoF;AACpF,8GAA+E;AAC/E,kGAAoE;AACpE,oGAAsE;AAEtE,iBAAS;IACP,KAAK,EAAE;QACL,gBAAgB,EAAE,wBAAiB;QACnC,cAAc,EAAE,sBAAe;QAC/B,gBAAgB,EAAE,wBAAgB;QAClC,cAAc,EAAE,sBAAiB;QACjC,uCAAuC,EAAE,+CAAmB;QAC5D,2BAA2B,EAAE,mCAAgB;QAC7C,+BAA+B,EAAE,uCAAc;QAC/C,iCAAiC,EAAE,yCAAqB;QACxD,iBAAiB,EAAE,yBAAiB;QAEpC,iBAAiB,EAAE,yBAAkB;QAErC,gDAAgD;QAChD,YAAY,EAAE,oBAAY;QAC1B,aAAa,EAAE,qBAAa;QAC5B,oBAAoB,EAAE,4BAAoB;QAC1C,qBAAqB,EAAE,6BAAoB;QAC3C,0BAA0B,EAAE,kCAAyB;QACrD,oBAAoB,EAAE,4BAAoB;QAC1C,2BAA2B,EAAE,mCAA0B;QAEvD,kEAAkE;QAClE,mBAAmB,EAAE,2BAAmB;QACxC,yBAAyB,EAAE,iCAAwB;QACnD,oBAAoB,EAAE,4BAAoB;QAC1C,4BAA4B,EAAE,oCAA0B;QACxD,yBAAyB,EAAE,iCAAwB;QACnD,mBAAmB,EAAE,2BAAmB;QACxC,oBAAoB,EAAE,4BAAoB;KAC3C;IACD,OAAO,EAAE;QACP,WAAW,EAAE;YACX,KAAK,EAAE;gBACL,kCAAkC,EAAE,MAAM;gBAC1C,gCAAgC,EAAE,MAAM;gBACxC,kCAAkC,EAAE,MAAM;gBAC1C,gCAAgC,EAAE,MAAM;gBACxC,yDAAyD,EAAE,MAAM;gBACjE,6CAA6C,EAAE,MAAM;gBACrD,iDAAiD,EAAE,MAAM;gBACzD,mDAAmD,EAAE,MAAM;gBAC3D,mCAAmC,EAAE,MAAM;gBAE3C,mCAAmC,EAAE,MAAM;gBAE3C,gDAAgD;gBAChD,8BAA8B,EAAE,MAAM;gBACtC,+BAA+B,EAAE,MAAM;gBACvC,sCAAsC,EAAE,MAAM;gBAC9C,uCAAuC,EAAE,MAAM;gBAC/C,4CAA4C,EAAE,MAAM;gBACpD,sCAAsC,EAAE,MAAM;gBAC9C,6CAA6C,EAAE,MAAM;aACtD;SACF;KACF;CACF,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { Rule } from 'eslint';
2
+ /**
3
+ * Angular-for-track-logic szabály: tilos logika `@for (...; track <expr>)` kifejezésben.
4
+ * CCAP "angular-for-track-logic" review ESLint template-text-scan portja.
5
+ */
6
+ declare const rule: Rule.RuleModule;
7
+ export default rule;
8
+ //# sourceMappingURL=angular-for-track-logic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular-for-track-logic.d.ts","sourceRoot":"","sources":["../../../../src/plugin/rules/angular/angular-for-track-logic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAkC9B;;;GAGG;AACH,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UA+ChB,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * `@for (...; track <expr>)` kifejezés keresése — capture group 1: a track expression.
5
+ */
6
+ const FOR_TRACK_REGEX = /@for\s*\([^)]*;\s*track\s+([^;)]+)/g;
7
+ /**
8
+ * Logika detektáló minták a track kifejezésben.
9
+ * Tiltott: `??`, `||`, `&&`, `()`, `+-*\/`, ternary `?`.
10
+ * Megengedett: egyszerű property access (`item.id`).
11
+ */
12
+ const TRACK_LOGIC_PATTERNS = [
13
+ /\?\?/,
14
+ /\|\|/,
15
+ /&&/,
16
+ /\(/,
17
+ /\)/,
18
+ /[+\-*/%]/,
19
+ /\?\s*[^:]/,
20
+ ];
21
+ /**
22
+ * Adott offset alapján a sor és oszlop kiszámítása az alap szövegből.
23
+ */
24
+ function computeLoc(text, index) {
25
+ const before = text.substring(0, index);
26
+ const newlineMatches = before.match(/\n/g);
27
+ const line = (newlineMatches ? newlineMatches.length : 0) + 1;
28
+ const lastNewline = before.lastIndexOf('\n');
29
+ const column = lastNewline === -1 ? index : index - lastNewline - 1;
30
+ return { line: line, column: column };
31
+ }
32
+ /**
33
+ * Angular-for-track-logic szabály: tilos logika `@for (...; track <expr>)` kifejezésben.
34
+ * CCAP "angular-for-track-logic" review ESLint template-text-scan portja.
35
+ */
36
+ const rule = {
37
+ meta: {
38
+ type: 'problem',
39
+ docs: {
40
+ description: 'Forbid logic in Angular `@for (...; track <expr>)`; '
41
+ + 'only direct property access (`item.id`) allowed.',
42
+ recommended: true,
43
+ },
44
+ schema: [],
45
+ messages: {
46
+ trackLogic: 'Logika a `@for track` kifejezésben: `track {{expr}}`.',
47
+ },
48
+ },
49
+ create(context) {
50
+ const filename = context.filename ?? '';
51
+ if (!filename.endsWith('.html')) {
52
+ return {};
53
+ }
54
+ const text = context.sourceCode.text ?? '';
55
+ return {
56
+ Program() {
57
+ try {
58
+ const localRegex = new RegExp(FOR_TRACK_REGEX.source, 'g');
59
+ let match = localRegex.exec(text);
60
+ while (match !== null) {
61
+ const expr = match[1].trim();
62
+ const hasLogic = TRACK_LOGIC_PATTERNS.some((p) => p.test(expr));
63
+ if (hasLogic) {
64
+ const loc = computeLoc(text, match.index);
65
+ context.report({
66
+ loc: { start: loc, end: { line: loc.line, column: loc.column + match[0].length } },
67
+ messageId: 'trackLogic',
68
+ data: { expr: expr },
69
+ });
70
+ }
71
+ match = localRegex.exec(text);
72
+ }
73
+ }
74
+ catch (error) {
75
+ console.error('[angular-for-track-logic] Error in Program visitor:', error);
76
+ }
77
+ },
78
+ };
79
+ },
80
+ };
81
+ exports.default = rule;
82
+ //# sourceMappingURL=angular-for-track-logic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"angular-for-track-logic.js","sourceRoot":"","sources":["../../../../src/plugin/rules/angular/angular-for-track-logic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Rule } from 'eslint';
2
+ /**
3
+ * Effect-signal-loop szabály: detektálja azt az `effect(...)` hívást ami
4
+ * ugyanazt a signal-t olvassa (dependency-ként) és írja (`.set` / `.update`).
5
+ * Ez végtelen loop-ot okozna, mert a write újra triggereli az effect-et.
6
+ * CCAP "effect-signal-loop" review ESLint AST-portja.
7
+ */
8
+ declare const rule: Rule.RuleModule;
9
+ export default rule;
10
+ //# sourceMappingURL=effect-signal-loop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-signal-loop.d.ts","sourceRoot":"","sources":["../../../../src/plugin/rules/angular/effect-signal-loop.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAwE9B;;;;;GAKG;AACH,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UA4ChB,CAAC;AAEF,eAAe,IAAI,CAAC"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ /**
4
+ * Adott AST node alá tartozó signal olvasások / írások begyűjtése.
5
+ * Olvasás: `something_$()` hívás (callee Identifier `*_$` névvel vagy
6
+ * MemberExpression `.foo_$()` property-vel).
7
+ * Írás: `something_$.set(...)` vagy `something_$.update(...)`.
8
+ */
9
+ function collectSignals(rootNode, reads, writes) {
10
+ if (!rootNode || typeof rootNode !== 'object') {
11
+ return;
12
+ }
13
+ if (rootNode.type === 'CallExpression') {
14
+ const callee = rootNode.callee;
15
+ // Signal olvasás: `name_$()` direkt hívás (Identifier callee)
16
+ if (callee && callee.type === 'Identifier' && /_\$$/.test(callee.name)) {
17
+ reads.add(callee.name);
18
+ }
19
+ // Signal olvasás: `this.name_$()` vagy `obj.name_$()`
20
+ if (callee
21
+ && callee.type === 'MemberExpression'
22
+ && callee.property
23
+ && callee.property.type === 'Identifier'
24
+ && /_\$$/.test(callee.property.name)) {
25
+ reads.add(callee.property.name);
26
+ }
27
+ // Signal írás: `name_$.set(...)` / `name_$.update(...)`
28
+ if (callee
29
+ && callee.type === 'MemberExpression'
30
+ && callee.property
31
+ && callee.property.type === 'Identifier'
32
+ && (callee.property.name === 'set' || callee.property.name === 'update')) {
33
+ const obj = callee.object;
34
+ if (obj && obj.type === 'Identifier' && /_\$$/.test(obj.name)) {
35
+ writes.add(obj.name);
36
+ }
37
+ if (obj
38
+ && obj.type === 'MemberExpression'
39
+ && obj.property
40
+ && obj.property.type === 'Identifier'
41
+ && /_\$$/.test(obj.property.name)) {
42
+ writes.add(obj.property.name);
43
+ }
44
+ }
45
+ }
46
+ for (const key in rootNode) {
47
+ if (key === 'parent' || key === 'loc' || key === 'range') {
48
+ continue;
49
+ }
50
+ const value = rootNode[key];
51
+ if (Array.isArray(value)) {
52
+ for (const item of value) {
53
+ collectSignals(item, reads, writes);
54
+ }
55
+ }
56
+ else if (value && typeof value === 'object' && typeof value.type === 'string') {
57
+ collectSignals(value, reads, writes);
58
+ }
59
+ }
60
+ }
61
+ /**
62
+ * Effect-signal-loop szabály: detektálja azt az `effect(...)` hívást ami
63
+ * ugyanazt a signal-t olvassa (dependency-ként) és írja (`.set` / `.update`).
64
+ * Ez végtelen loop-ot okozna, mert a write újra triggereli az effect-et.
65
+ * CCAP "effect-signal-loop" review ESLint AST-portja.
66
+ */
67
+ const rule = {
68
+ meta: {
69
+ type: 'problem',
70
+ docs: {
71
+ description: 'Detect `effect()` callbacks that read and write the same signal — infinite loop risk.',
72
+ recommended: true,
73
+ },
74
+ schema: [],
75
+ messages: {
76
+ effectSignalLoop: 'Effect-signal loop: `{{signalName}}` olvasva ÉS írva (.set/.update) ugyanabban az `effect()`-ben. '
77
+ + 'Végtelen újrafutás veszélye — a signal-írás újra triggereli az effect-et.',
78
+ },
79
+ },
80
+ create(context) {
81
+ return {
82
+ CallExpression(node) {
83
+ try {
84
+ const callee = node.callee;
85
+ if (!callee || callee.type !== 'Identifier' || callee.name !== 'effect') {
86
+ return;
87
+ }
88
+ const firstArg = node.arguments && node.arguments[0];
89
+ if (!firstArg) {
90
+ return;
91
+ }
92
+ const reads = new Set();
93
+ const writes = new Set();
94
+ collectSignals(firstArg, reads, writes);
95
+ for (const signalName of writes) {
96
+ if (reads.has(signalName)) {
97
+ context.report({
98
+ node: node,
99
+ messageId: 'effectSignalLoop',
100
+ data: { signalName: signalName },
101
+ });
102
+ }
103
+ }
104
+ }
105
+ catch (error) {
106
+ console.error('[effect-signal-loop] Error in CallExpression visitor:', error);
107
+ }
108
+ },
109
+ };
110
+ },
111
+ };
112
+ exports.default = rule;
113
+ //# sourceMappingURL=effect-signal-loop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-signal-loop.js","sourceRoot":"","sources":["../../../../src/plugin/rules/angular/effect-signal-loop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Rule } from 'eslint';
2
+ /**
3
+ * No-async-ngOnInit szabály: `ngOnInit` metódus nem lehet `async`.
4
+ * Angular nem várja le az `async ngOnInit`-et — ez néma hibát okoz.
5
+ * CCAP "no-async-ngoninit" review ESLint AST-portja.
6
+ */
7
+ declare const rule: Rule.RuleModule;
8
+ export default rule;
9
+ //# sourceMappingURL=no-async-ngoninit.d.ts.map