@silvestv/migration-planificator 3.0.0 → 4.1.0

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 (43) hide show
  1. package/LICENSE +201 -96
  2. package/NOTICE +105 -0
  3. package/README.fr.md +30 -24
  4. package/README.md +29 -25
  5. package/SECURITY.md +223 -187
  6. package/dist/client.bundle.js +51 -48
  7. package/dist/src/core/ast/matchers/html/html-pipe-variable-matcher.js +250 -0
  8. package/dist/src/core/ast/matchers/html/html-variable-resolver.js +105 -0
  9. package/dist/src/core/ast/matchers/index.js +7 -0
  10. package/dist/src/core/ast/matchers/ts/hierarchy-matcher.js +2 -1
  11. package/dist/src/core/ast/matchers/ts/rxjs-matcher.js +128 -0
  12. package/dist/src/core/workload/hierarchy-calculator.js +4 -4
  13. package/dist/src/core/workload/special-workload.js +2 -2
  14. package/dist/src/data/angular-migration-rules.json +2336 -2336
  15. package/dist/src/data/rules/rearchitecture/rearchitecture-rules.json +2 -2
  16. package/dist/src/data/rules/to18/rules-18-obligatoire.json +373 -373
  17. package/dist/src/data/rules/to18/rules-18-optionnelle.json +187 -187
  18. package/dist/src/data/rules/to18/rules-18-recommande.json +217 -217
  19. package/dist/src/data/rules/to19/rules-19-obligatoire.json +347 -347
  20. package/dist/src/data/rules/to19/rules-19-optionnelle.json +217 -222
  21. package/dist/src/data/rules/to19/rules-19-recommande.json +174 -199
  22. package/dist/src/data/rules/to20/rules-20-obligatoire.json +558 -555
  23. package/dist/src/data/rules/to20/rules-20-optionnelle.json +189 -189
  24. package/dist/src/data/rules/to20/rules-20-recommande.json +150 -150
  25. package/dist/src/models/interfaces/{ast-interfaces.js → angular-artifact-counts.interface.js} +0 -3
  26. package/dist/src/models/interfaces/base-target.interface.js +2 -0
  27. package/dist/src/models/interfaces/checklist-state.interface.js +2 -0
  28. package/dist/src/models/interfaces/dependency-counts.interface.js +2 -0
  29. package/dist/src/models/interfaces/migration-guide-data.interface.js +2 -0
  30. package/dist/src/models/interfaces/module-info.interface.js +2 -0
  31. package/dist/src/models/interfaces/parallelization.interface.js +2 -0
  32. package/dist/src/models/interfaces/refer-to-pattern.interface.js +2 -0
  33. package/dist/src/models/interfaces/summary-totals.interface.js +2 -0
  34. package/dist/src/models/interfaces/window-with-data.interface.js +2 -0
  35. package/dist/src/templates/workload/dashboard.template.js +7 -44
  36. package/dist/src/templates/workload/guide-rule-card.template.js +1 -1
  37. package/dist/src/templates/workload/rule-modal.template.js +6 -21
  38. package/dist/src/templates/workload/unified-settings-panel.template.js +149 -0
  39. package/dist/src/utils/core/args-parser.js +16 -1
  40. package/dist/styles.css +1 -1
  41. package/package.json +8 -7
  42. /package/dist/src/models/{chip-config.js → constants/chip-config.js} +0 -0
  43. /package/dist/src/models/interfaces/{client-interfaces.js → client-interfaces.interface.js} +0 -0
@@ -1,188 +1,188 @@
1
- [
2
- {
3
- "key": "guards_RedirectCommand",
4
- "summary": "Guards peuvent retourner RedirectCommand",
5
- "description": "Les guards de routage peuvent maintenant retourner RedirectCommand pour des redirections plus explicites et typées, offrant un meilleur contrôle que les simples UrlTree. Mettre à jour les signatures de type des guards.",
6
- "estimated_time_per_occurrence": 8,
7
- "onFile": null,
8
- "fileTypes": [
9
- "*.ts"
10
- ],
11
- "regex": "canActivate.*:.*boolean\\s*\\|\\s*UrlTree",
12
- "category": "routing",
13
- "auto_fixable": false,
14
- "migration_command": null,
15
- "risk_level": "medium",
16
- "code_description": "// Avant:\ncanActivate(): boolean | UrlTree\n\n// Après:\ncanActivate(): boolean | UrlTree | RedirectCommand {\n return new RedirectCommand('/login');\n}",
17
- "astPattern": {
18
- "nodeType": "MethodDeclaration",
19
- "name": [
20
- "canActivate",
21
- "canActivateChild",
22
- "canDeactivate",
23
- "canMatch"
24
- ],
25
- "returnType": {
26
- "union": {
27
- "contains": [
28
- "boolean",
29
- "UrlTree"
30
- ],
31
- "missing": "RedirectCommand"
32
- }
33
- },
34
- "excludeContext": [
35
- "StringLiteral",
36
- "Comment"
37
- ]
38
- },
39
- "doc_url": "https://angular.dev/reference/migrations"
40
- },
41
- {
42
- "key": "guards_RedirectCommand_fn",
43
- "summary": "Guards fonctionnels peuvent retourner RedirectCommand",
44
- "description": "Les guards fonctionnels (CanActivateFn, CanMatchFn...) peuvent maintenant retourner RedirectCommand pour une meilleure expressivité des redirections.",
45
- "estimated_time_per_occurrence": 6,
46
- "fileTypes": [
47
- "*.ts"
48
- ],
49
- "regex": "\\bCan(?:Activate|Match|Deactivate|Load)Fn\\b[\\s\\S]*?boolean\\s*\\|\\s*UrlTree(?![\\s\\S]*RedirectCommand)",
50
- "category": "routing",
51
- "auto_fixable": false,
52
- "risk_level": "medium",
53
- "code_description": "// Avant:\nexport const authGuard: CanActivateFn = (route, state) => {\n return Authservice.isAuth() ? true : inject(Router).createUrlTree(['/login']);\n};\n\n// Après:\nexport const authGuard: CanActivateFn = (route, state) => {\n return Authservice.isAuth() ? true : new RedirectCommand('/login');\n};",
54
- "astPattern": {
55
- "nodeType": "VariableDeclaration",
56
- "type": {
57
- "containsAny": [
58
- "CanActivateFn",
59
- "CanMatchFn",
60
- "CanDeactivateFn",
61
- "CanLoadFn"
62
- ]
63
- },
64
- "initializer": {
65
- "nodeType": "ArrowFunction"
66
- },
67
- "returnType": {
68
- "union": {
69
- "contains": [
70
- "boolean",
71
- "UrlTree"
72
- ],
73
- "missing": "RedirectCommand"
74
- }
75
- }
76
- },
77
- "doc_url": "https://angular.dev/guide/router#redirectcommand"
78
- },
79
- {
80
- "key": "ng_content_fallback",
81
- "summary": "Utiliser fallback content dans ng-content",
82
- "description": "Angular 18 permet de définir un contenu par défaut à l'intérieur de ng-content qui sera affiché si aucun contenu n'est projeté. Utile pour créer des composants avec des valeurs par défaut sans logique conditionnelle complexe.",
83
- "estimated_time_per_occurrence": 3,
84
- "onFile": null,
85
- "fileTypes": [
86
- "*.html",
87
- "*.ts"
88
- ],
89
- "regex": "<ng-content[^>]*></ng-content>",
90
- "astPattern": {
91
- "nodeType": "Element",
92
- "name": "ng-content",
93
- "hasChildren": false,
94
- "excludeContext": [
95
- "Comment"
96
- ]
97
- },
98
- "category": "template",
99
- "auto_fixable": false,
100
- "migration_command": null,
101
- "risk_level": "low",
102
- "code_description": "// Avant:\n<ng-content></ng-content>\n\n// Après:\n<ng-content>\n <div class=\"default\">Contenu par défaut</div>\n</ng-content>",
103
- "doc_url": "https://angular.dev/reference/migrations"
104
- },
105
- {
106
- "key": "http_cache_auth",
107
- "summary": "Cache HTTP avec headers auth",
108
- "description": "Par défaut, le cache HTTP de transfert d'état exclut les requêtes avec headers d'authentification. Activer includeRequestsWithAuthHeaders: true si votre application nécessite le cache de ces requêtes.",
109
- "estimated_time_per_occurrence": 5,
110
- "fileTypes": [
111
- "*.ts"
112
- ],
113
- "category": "http",
114
- "risk_level": "low",
115
- "auto_fixable": false,
116
- "regex": "provideHttpClient\\s*\\([^)]*withHttpTransferCache\\s*\\([^)]*\\)",
117
- "code_description": "provideHttpClient(\n withHttpTransferCache({ \n includeRequestsWithAuthHeaders: true \n })\n)",
118
- "astPattern": {
119
- "nodeType": "CallExpression",
120
- "functionName": "provideHttpClient",
121
- "arguments": {
122
- "containsCall": {
123
- "functionName": "withHttpTransferCache",
124
- "object": {
125
- "properties": {
126
- "includeRequestsWithAuthHeaders": {
127
- "missing": true
128
- }
129
- }
130
- }
131
- }
132
- }
133
- },
134
- "doc_url": "https://angular.dev/reference/migrations"
135
- },
136
- {
137
- "key": "partial_hydration_defer",
138
- "summary": "Hydratation partielle avec @defer SSR",
139
- "description": "L'hydratation partielle avec @defer permet de rendre des composants côté serveur mais de différer leur hydratation côté client, réduisant le JavaScript initial et améliorant le TTI. Cette règle identifie les blocs @defer dont la configuration est sous-optimale (absence de déclencheur, de placeholder, ou usage non différé), afin d'améliorer la qualité du rendu progressif et la performance SSR.",
140
- "estimated_time_per_occurrence": 15,
141
- "fileTypes": [
142
- "*.html",
143
- "*.ts"
144
- ],
145
- "category": "ssr",
146
- "risk_level": "medium",
147
- "auto_fixable": false,
148
- "regex": "(?<!<!--[^>]*?)@defer\\s*\\(",
149
- "astPattern": {
150
- "nodeType": "DeferredBlock",
151
- "excludeContext": [
152
- "Comment"
153
- ]
154
- },
155
- "code_description": "@defer (on viewport) {\n <heavy-component />\n} @placeholder {\n <div>Chargement...</div>\n}",
156
- "doc_url": "https://angular.dev/reference/migrations"
157
- },
158
- {
159
- "key": "decouple_legacy_providers",
160
- "summary": "Découpler les services fournis dans des modules ou composants",
161
- "description": "Détecte les services Angular encore déclarés dans des tableaux `providers` d’un `@NgModule` ou d’un `@Component`. Depuis Angular standalone, il est recommandé que les services soient autonomes et marqués `providedIn: 'root'` pour être des singletons globaux. Les providers locaux créent des instances dupliquées et complexifient la gestion d’état.",
162
- "estimated_time_per_occurrence": 25,
163
- "onFile": null,
164
- "fileTypes": ["*.ts"],
165
- "regex": "@(?:NgModule|Component)\\s*\\([^)]*\\bproviders\\s*:\\s*\\[[^\\]]*\\]",
166
- "category": "architecture",
167
- "auto_fixable": false,
168
- "migration_command": null,
169
- "risk_level": "high",
170
- "code_description": "// Avant (ancien modèle):\n@NgModule({\n providers: [UserService, AuthService]\n})\nexport class UserModule {}\n\n@Component({\n selector: 'app-profile',\n providers: [ProfileService]\n})\nexport class ProfileComponent {}\n\n// Après (standalone / moderne):\n@Injectable({ providedIn: 'root' })\nexport class UserService {}\n\n@Injectable({ providedIn: 'root' })\nexport class ProfileService {}\n\n// Puis retirer les providers des décorateurs.",
171
- "astPattern": {
172
- "nodeType": ["Identifier", "CallExpression"],
173
- "context": "ProvidersArray",
174
- "referTo": {
175
- "decorator": "Injectable",
176
- "elementNodeType": ["Identifier", "CallExpression"],
177
- "propertyNotEqual": {
178
- "key": "providedIn",
179
- "value": "root"
180
- }
181
- },
182
- "excludeContext": [
183
- "StringLiteral",
184
- "Comment"
185
- ]
186
- }
187
- }
1
+ [
2
+ {
3
+ "key": "guards_RedirectCommand",
4
+ "summary": "Guards peuvent retourner RedirectCommand",
5
+ "description": "Les guards de routage peuvent maintenant retourner RedirectCommand pour des redirections plus explicites et typées, offrant un meilleur contrôle que les simples UrlTree. Mettre à jour les signatures de type des guards.",
6
+ "estimated_time_per_occurrence": 8,
7
+ "onFile": null,
8
+ "fileTypes": [
9
+ "*.ts"
10
+ ],
11
+ "regex": "canActivate.*:.*boolean\\s*\\|\\s*UrlTree",
12
+ "category": "routing",
13
+ "isAutoFixable": false,
14
+ "migration_command": null,
15
+ "risk_level": "medium",
16
+ "code_description": "// Avant:\ncanActivate(): boolean | UrlTree\n\n// Après:\ncanActivate(): boolean | UrlTree | RedirectCommand {\n return new RedirectCommand('/login');\n}",
17
+ "astPattern": {
18
+ "nodeType": "MethodDeclaration",
19
+ "name": [
20
+ "canActivate",
21
+ "canActivateChild",
22
+ "canDeactivate",
23
+ "canMatch"
24
+ ],
25
+ "returnType": {
26
+ "union": {
27
+ "contains": [
28
+ "boolean",
29
+ "UrlTree"
30
+ ],
31
+ "missing": "RedirectCommand"
32
+ }
33
+ },
34
+ "excludeContext": [
35
+ "StringLiteral",
36
+ "Comment"
37
+ ]
38
+ },
39
+ "doc_url": "https://angular.dev/reference/migrations"
40
+ },
41
+ {
42
+ "key": "guards_RedirectCommand_fn",
43
+ "summary": "Guards fonctionnels peuvent retourner RedirectCommand",
44
+ "description": "Les guards fonctionnels (CanActivateFn, CanMatchFn...) peuvent maintenant retourner RedirectCommand pour une meilleure expressivité des redirections.",
45
+ "estimated_time_per_occurrence": 6,
46
+ "fileTypes": [
47
+ "*.ts"
48
+ ],
49
+ "regex": "\\bCan(?:Activate|Match|Deactivate|Load)Fn\\b[\\s\\S]*?boolean\\s*\\|\\s*UrlTree(?![\\s\\S]*RedirectCommand)",
50
+ "category": "routing",
51
+ "isAutoFixable": false,
52
+ "risk_level": "medium",
53
+ "code_description": "// Avant:\nexport const authGuard: CanActivateFn = (route, state) => {\n return Authservice.isAuth() ? true : inject(Router).createUrlTree(['/login']);\n};\n\n// Après:\nexport const authGuard: CanActivateFn = (route, state) => {\n return Authservice.isAuth() ? true : new RedirectCommand('/login');\n};",
54
+ "astPattern": {
55
+ "nodeType": "VariableDeclaration",
56
+ "type": {
57
+ "containsAny": [
58
+ "CanActivateFn",
59
+ "CanMatchFn",
60
+ "CanDeactivateFn",
61
+ "CanLoadFn"
62
+ ]
63
+ },
64
+ "initializer": {
65
+ "nodeType": "ArrowFunction"
66
+ },
67
+ "returnType": {
68
+ "union": {
69
+ "contains": [
70
+ "boolean",
71
+ "UrlTree"
72
+ ],
73
+ "missing": "RedirectCommand"
74
+ }
75
+ }
76
+ },
77
+ "doc_url": "https://angular.dev/guide/router#redirectcommand"
78
+ },
79
+ {
80
+ "key": "ng_content_fallback",
81
+ "summary": "Utiliser fallback content dans ng-content",
82
+ "description": "Angular 18 permet de définir un contenu par défaut à l'intérieur de ng-content qui sera affiché si aucun contenu n'est projeté. Utile pour créer des composants avec des valeurs par défaut sans logique conditionnelle complexe.",
83
+ "estimated_time_per_occurrence": 3,
84
+ "onFile": null,
85
+ "fileTypes": [
86
+ "*.html",
87
+ "*.ts"
88
+ ],
89
+ "regex": "<ng-content[^>]*></ng-content>",
90
+ "astPattern": {
91
+ "nodeType": "Element",
92
+ "name": "ng-content",
93
+ "hasChildren": false,
94
+ "excludeContext": [
95
+ "Comment"
96
+ ]
97
+ },
98
+ "category": "template",
99
+ "isAutoFixable": false,
100
+ "migration_command": null,
101
+ "risk_level": "low",
102
+ "code_description": "// Avant:\n<ng-content></ng-content>\n\n// Après:\n<ng-content>\n <div class=\"default\">Contenu par défaut</div>\n</ng-content>",
103
+ "doc_url": "https://angular.dev/reference/migrations"
104
+ },
105
+ {
106
+ "key": "http_cache_auth",
107
+ "summary": "Cache HTTP avec headers auth",
108
+ "description": "Par défaut, le cache HTTP de transfert d'état exclut les requêtes avec headers d'authentification. Activer includeRequestsWithAuthHeaders: true si votre application nécessite le cache de ces requêtes.",
109
+ "estimated_time_per_occurrence": 5,
110
+ "fileTypes": [
111
+ "*.ts"
112
+ ],
113
+ "category": "http",
114
+ "risk_level": "low",
115
+ "isAutoFixable": false,
116
+ "regex": "provideHttpClient\\s*\\([^)]*withHttpTransferCache\\s*\\([^)]*\\)",
117
+ "code_description": "provideHttpClient(\n withHttpTransferCache({ \n includeRequestsWithAuthHeaders: true \n })\n)",
118
+ "astPattern": {
119
+ "nodeType": "CallExpression",
120
+ "functionName": "provideHttpClient",
121
+ "arguments": {
122
+ "containsCall": {
123
+ "functionName": "withHttpTransferCache",
124
+ "object": {
125
+ "properties": {
126
+ "includeRequestsWithAuthHeaders": {
127
+ "missing": true
128
+ }
129
+ }
130
+ }
131
+ }
132
+ }
133
+ },
134
+ "doc_url": "https://angular.dev/reference/migrations"
135
+ },
136
+ {
137
+ "key": "partial_hydration_defer",
138
+ "summary": "Hydratation partielle avec @defer SSR",
139
+ "description": "L'hydratation partielle avec @defer permet de rendre des composants côté serveur mais de différer leur hydratation côté client, réduisant le JavaScript initial et améliorant le TTI. Cette règle identifie les blocs @defer dont la configuration est sous-optimale (absence de déclencheur, de placeholder, ou usage non différé), afin d'améliorer la qualité du rendu progressif et la performance SSR.",
140
+ "estimated_time_per_occurrence": 15,
141
+ "fileTypes": [
142
+ "*.html",
143
+ "*.ts"
144
+ ],
145
+ "category": "ssr",
146
+ "risk_level": "medium",
147
+ "isAutoFixable": false,
148
+ "regex": "(?<!<!--[^>]*?)@defer\\s*\\(",
149
+ "astPattern": {
150
+ "nodeType": "DeferredBlock",
151
+ "excludeContext": [
152
+ "Comment"
153
+ ]
154
+ },
155
+ "code_description": "@defer (on viewport) {\n <heavy-component />\n} @placeholder {\n <div>Chargement...</div>\n}",
156
+ "doc_url": "https://angular.dev/reference/migrations"
157
+ },
158
+ {
159
+ "key": "decouple_legacy_providers",
160
+ "summary": "Découpler les services fournis dans des modules ou composants",
161
+ "description": "Détecte les services Angular encore déclarés dans des tableaux `providers` d’un `@NgModule` ou d’un `@Component`. Depuis Angular standalone, il est recommandé que les services soient autonomes et marqués `providedIn: 'root'` pour être des singletons globaux. Les providers locaux créent des instances dupliquées et complexifient la gestion d’état.",
162
+ "estimated_time_per_occurrence": 25,
163
+ "onFile": null,
164
+ "fileTypes": ["*.ts"],
165
+ "regex": "@(?:NgModule|Component)\\s*\\([^)]*\\bproviders\\s*:\\s*\\[[^\\]]*\\]",
166
+ "category": "architecture",
167
+ "isAutoFixable": false,
168
+ "migration_command": null,
169
+ "risk_level": "high",
170
+ "code_description": "// Avant (ancien modèle):\n@NgModule({\n providers: [UserService, AuthService]\n})\nexport class UserModule {}\n\n@Component({\n selector: 'app-profile',\n providers: [ProfileService]\n})\nexport class ProfileComponent {}\n\n// Après (standalone / moderne):\n@Injectable({ providedIn: 'root' })\nexport class UserService {}\n\n@Injectable({ providedIn: 'root' })\nexport class ProfileService {}\n\n// Puis retirer les providers des décorateurs.",
171
+ "astPattern": {
172
+ "nodeType": ["Identifier", "CallExpression"],
173
+ "context": "ProvidersArray",
174
+ "referTo": {
175
+ "decorator": "Injectable",
176
+ "elementNodeType": ["Identifier", "CallExpression"],
177
+ "propertyNotEqual": {
178
+ "key": "providedIn",
179
+ "value": "root"
180
+ }
181
+ },
182
+ "excludeContext": [
183
+ "StringLiteral",
184
+ "Comment"
185
+ ]
186
+ }
187
+ }
188
188
  ]