@futdevpro/dynamo-eslint 1.15.6 → 1.15.8
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/.cursor/rules/_ag_frontend-structure.mdc +5 -5
- package/.dynamo/version-bump.config.json +5 -0
- package/.github/workflows/main.yml +424 -395
- package/.husky/pre-commit +1 -0
- package/__documentations/2026-04-18-ccap-review-integration.md +173 -0
- package/build/configs/base.js +20 -1
- package/build/configs/base.js.map +1 -1
- package/build/configs/ngx.js +10 -0
- package/build/configs/ngx.js.map +1 -1
- package/build/plugin/index.d.ts +21 -0
- package/build/plugin/index.d.ts.map +1 -1
- package/build/plugin/index.js +38 -0
- package/build/plugin/index.js.map +1 -1
- package/build/plugin/rules/angular/angular-for-track-logic.d.ts +8 -0
- package/build/plugin/rules/angular/angular-for-track-logic.d.ts.map +1 -0
- package/build/plugin/rules/angular/angular-for-track-logic.js +82 -0
- package/build/plugin/rules/angular/angular-for-track-logic.js.map +1 -0
- package/build/plugin/rules/angular/effect-signal-loop.d.ts +10 -0
- package/build/plugin/rules/angular/effect-signal-loop.d.ts.map +1 -0
- package/build/plugin/rules/angular/effect-signal-loop.js +113 -0
- package/build/plugin/rules/angular/effect-signal-loop.js.map +1 -0
- package/build/plugin/rules/angular/no-async-ngoninit.d.ts +9 -0
- package/build/plugin/rules/angular/no-async-ngoninit.d.ts.map +1 -0
- package/build/plugin/rules/angular/no-async-ngoninit.js +43 -0
- package/build/plugin/rules/angular/no-async-ngoninit.js.map +1 -0
- package/build/plugin/rules/angular/no-component-direct-api.d.ts +10 -0
- package/build/plugin/rules/angular/no-component-direct-api.d.ts.map +1 -0
- package/build/plugin/rules/angular/no-component-direct-api.js +76 -0
- package/build/plugin/rules/angular/no-component-direct-api.js.map +1 -0
- package/build/plugin/rules/angular/no-method-call-in-template.d.ts +9 -0
- package/build/plugin/rules/angular/no-method-call-in-template.d.ts.map +1 -0
- package/build/plugin/rules/angular/no-method-call-in-template.js +80 -0
- package/build/plugin/rules/angular/no-method-call-in-template.js.map +1 -0
- package/build/plugin/rules/angular/no-ngfor-directive.d.ts +8 -0
- package/build/plugin/rules/angular/no-ngfor-directive.d.ts.map +1 -0
- package/build/plugin/rules/angular/no-ngfor-directive.js +60 -0
- package/build/plugin/rules/angular/no-ngfor-directive.js.map +1 -0
- package/build/plugin/rules/angular/no-ngif-directive.d.ts +8 -0
- package/build/plugin/rules/angular/no-ngif-directive.d.ts.map +1 -0
- package/build/plugin/rules/angular/no-ngif-directive.js +60 -0
- package/build/plugin/rules/angular/no-ngif-directive.js.map +1 -0
- package/build/plugin/rules/naming-patterns.d.ts +4 -0
- package/build/plugin/rules/naming-patterns.d.ts.map +1 -1
- package/build/plugin/rules/naming-patterns.js +331 -8
- package/build/plugin/rules/naming-patterns.js.map +1 -1
- package/build/plugin/rules/no-getter-logic.d.ts.map +1 -1
- package/build/plugin/rules/no-getter-logic.js +21 -2
- package/build/plugin/rules/no-getter-logic.js.map +1 -1
- package/build/plugin/rules/require-jsdoc-description.d.ts.map +1 -1
- package/build/plugin/rules/require-jsdoc-description.js +17 -0
- package/build/plugin/rules/require-jsdoc-description.js.map +1 -1
- package/build/plugin/rules/ts/data-model-extends.d.ts +9 -0
- package/build/plugin/rules/ts/data-model-extends.d.ts.map +1 -0
- package/build/plugin/rules/ts/data-model-extends.js +95 -0
- package/build/plugin/rules/ts/data-model-extends.js.map +1 -0
- package/build/plugin/rules/ts/no-any-type.d.ts +9 -0
- package/build/plugin/rules/ts/no-any-type.d.ts.map +1 -0
- package/build/plugin/rules/ts/no-any-type.js +37 -0
- package/build/plugin/rules/ts/no-any-type.js.map +1 -0
- package/build/plugin/rules/ts/no-as-cast.d.ts +9 -0
- package/build/plugin/rules/ts/no-as-cast.d.ts.map +1 -0
- package/build/plugin/rules/ts/no-as-cast.js +50 -0
- package/build/plugin/rules/ts/no-as-cast.js.map +1 -0
- package/build/plugin/rules/ts/no-dynamic-imports.d.ts +9 -0
- package/build/plugin/rules/ts/no-dynamic-imports.d.ts.map +1 -0
- package/build/plugin/rules/ts/no-dynamic-imports.js +51 -0
- package/build/plugin/rules/ts/no-dynamic-imports.js.map +1 -0
- package/build/plugin/rules/ts/no-native-browser-dialogs.d.ts +9 -0
- package/build/plugin/rules/ts/no-native-browser-dialogs.d.ts.map +1 -0
- package/build/plugin/rules/ts/no-native-browser-dialogs.js +79 -0
- package/build/plugin/rules/ts/no-native-browser-dialogs.js.map +1 -0
- package/build/plugin/rules/ts/no-plain-function-export.d.ts +10 -0
- package/build/plugin/rules/ts/no-plain-function-export.d.ts.map +1 -0
- package/build/plugin/rules/ts/no-plain-function-export.js +70 -0
- package/build/plugin/rules/ts/no-plain-function-export.js.map +1 -0
- package/build/plugin/rules/ts/one-export-per-file.d.ts +9 -0
- package/build/plugin/rules/ts/one-export-per-file.d.ts.map +1 -0
- package/build/plugin/rules/ts/one-export-per-file.js +74 -0
- package/build/plugin/rules/ts/one-export-per-file.js.map +1 -0
- package/package.json +6 -9
- package/pipeline.cicd.config.json +152 -0
- package/src/configs/base.ts +21 -1
- package/src/configs/ngx.ts +12 -0
- package/src/plugin/index.ts +44 -3
- package/src/plugin/rules/angular/angular-for-track-logic.spec.ts +44 -0
- package/src/plugin/rules/angular/angular-for-track-logic.ts +88 -0
- package/src/plugin/rules/angular/effect-signal-loop.spec.ts +89 -0
- package/src/plugin/rules/angular/effect-signal-loop.ts +125 -0
- package/src/plugin/rules/angular/no-async-ngoninit.spec.ts +50 -0
- package/src/plugin/rules/angular/no-async-ngoninit.ts +43 -0
- package/src/plugin/rules/angular/no-component-direct-api.spec.ts +78 -0
- package/src/plugin/rules/angular/no-component-direct-api.ts +82 -0
- package/src/plugin/rules/angular/no-method-call-in-template.spec.ts +63 -0
- package/src/plugin/rules/angular/no-method-call-in-template.ts +89 -0
- package/src/plugin/rules/angular/no-ngfor-directive.spec.ts +44 -0
- package/src/plugin/rules/angular/no-ngfor-directive.ts +62 -0
- package/src/plugin/rules/angular/no-ngif-directive.spec.ts +44 -0
- package/src/plugin/rules/angular/no-ngif-directive.ts +62 -0
- package/src/plugin/rules/naming-patterns.spec.ts +108 -22
- package/src/plugin/rules/naming-patterns.ts +390 -11
- package/src/plugin/rules/no-getter-logic.spec.ts +71 -0
- package/src/plugin/rules/no-getter-logic.ts +21 -2
- package/src/plugin/rules/require-jsdoc-description.spec.ts +1 -0
- package/src/plugin/rules/require-jsdoc-description.ts +19 -0
- package/src/plugin/rules/ts/data-model-extends.spec.ts +84 -0
- package/src/plugin/rules/ts/data-model-extends.ts +100 -0
- package/src/plugin/rules/ts/no-any-type.spec.ts +28 -0
- package/src/plugin/rules/ts/no-any-type.ts +36 -0
- package/src/plugin/rules/ts/no-as-cast.spec.ts +51 -0
- package/src/plugin/rules/ts/no-as-cast.ts +51 -0
- package/src/plugin/rules/ts/no-dynamic-imports.spec.ts +54 -0
- package/src/plugin/rules/ts/no-dynamic-imports.ts +49 -0
- package/src/plugin/rules/ts/no-native-browser-dialogs.spec.ts +54 -0
- package/src/plugin/rules/ts/no-native-browser-dialogs.ts +84 -0
- package/src/plugin/rules/ts/no-plain-function-export.spec.ts +72 -0
- package/src/plugin/rules/ts/no-plain-function-export.ts +73 -0
- package/src/plugin/rules/ts/one-export-per-file.spec.ts +64 -0
- package/src/plugin/rules/ts/one-export-per-file.ts +77 -0
- package/futdevpro-dynamo-eslint-1.15.6.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
|
package/build/configs/base.js
CHANGED
|
@@ -86,9 +86,14 @@ module.exports = [
|
|
|
86
86
|
'keyword-spacing': 'warn',
|
|
87
87
|
'no-else-return': 'warn',
|
|
88
88
|
'no-duplicate-imports': 'warn',
|
|
89
|
-
|
|
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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"}
|
package/build/configs/ngx.js
CHANGED
|
@@ -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
|
];
|
package/build/configs/ngx.js.map
CHANGED
|
@@ -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;
|
|
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"}
|
package/build/plugin/index.d.ts
CHANGED
|
@@ -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":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,kBA0DE"}
|
package/build/plugin/index.js
CHANGED
|
@@ -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;
|
|
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
|