@silvestv/migration-planificator 3.0.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 (122) hide show
  1. package/LICENSE +96 -0
  2. package/README.fr.md +359 -0
  3. package/README.md +360 -0
  4. package/SECURITY.md +187 -0
  5. package/dist/client.bundle.js +357 -0
  6. package/dist/src/core/app-analyzer.js +134 -0
  7. package/dist/src/core/ast/matchers/html/html-attribute-matcher.js +86 -0
  8. package/dist/src/core/ast/matchers/html/html-component-matcher.js +40 -0
  9. package/dist/src/core/ast/matchers/html/html-element-matcher.js +54 -0
  10. package/dist/src/core/ast/matchers/html/html-parser.js +58 -0
  11. package/dist/src/core/ast/matchers/html/html-pipe-matcher.js +95 -0
  12. package/dist/src/core/ast/matchers/html/html-text-matcher.js +53 -0
  13. package/dist/src/core/ast/matchers/html/index.js +118 -0
  14. package/dist/src/core/ast/matchers/index.js +377 -0
  15. package/dist/src/core/ast/matchers/ts/collection-matcher.js +51 -0
  16. package/dist/src/core/ast/matchers/ts/context-matcher.js +275 -0
  17. package/dist/src/core/ast/matchers/ts/decorator-matcher.js +465 -0
  18. package/dist/src/core/ast/matchers/ts/expression-matcher.js +237 -0
  19. package/dist/src/core/ast/matchers/ts/file-matcher.js +97 -0
  20. package/dist/src/core/ast/matchers/ts/hierarchy-matcher.js +172 -0
  21. package/dist/src/core/ast/matchers/ts/import-matcher.js +39 -0
  22. package/dist/src/core/ast/matchers/ts/index.js +53 -0
  23. package/dist/src/core/ast/matchers/ts/node-matcher.js +156 -0
  24. package/dist/src/core/ast/matchers/ts/symbol-matcher.js +281 -0
  25. package/dist/src/core/ast/matchers/ts/type-matcher.js +207 -0
  26. package/dist/src/core/ast/matchers/utils/matcher-helpers.js +37 -0
  27. package/dist/src/core/ast/scanner-ast.js +444 -0
  28. package/dist/src/core/project-detector.js +196 -0
  29. package/dist/src/core/project-strategy/index.js +9 -0
  30. package/dist/src/core/project-strategy/nx-strategy.js +130 -0
  31. package/dist/src/core/project-strategy/project-strategy.interface.js +2 -0
  32. package/dist/src/core/project-strategy/standalone-strategy.js +74 -0
  33. package/dist/src/core/project-strategy/strategy-factory.js +15 -0
  34. package/dist/src/core/rules-loader.js +89 -0
  35. package/dist/src/core/scan-reporter.js +316 -0
  36. package/dist/src/core/scanner-delta.js +339 -0
  37. package/dist/src/core/scanner-orchestrator.js +266 -0
  38. package/dist/src/core/scanner-regex.js +298 -0
  39. package/dist/src/core/workload/calculator.js +82 -0
  40. package/dist/src/core/workload/constants.js +15 -0
  41. package/dist/src/core/workload/grouping.js +18 -0
  42. package/dist/src/core/workload/hierarchy-calculator.js +127 -0
  43. package/dist/src/core/workload/index.js +11 -0
  44. package/dist/src/core/workload/metadata.js +20 -0
  45. package/dist/src/core/workload/special-workload.js +101 -0
  46. package/dist/src/core/workload/target-resolver.js +34 -0
  47. package/dist/src/data/angular-migration-rules.json +2337 -0
  48. package/dist/src/data/markdown/angular-migration-17-18.md +408 -0
  49. package/dist/src/data/markdown/angular-migration-18-19.md +600 -0
  50. package/dist/src/data/markdown/angular-migration-19-20.md +521 -0
  51. package/dist/src/data/rules/rearchitecture/rearchitecture-rules.json +66 -0
  52. package/dist/src/data/rules/to18/rules-18-obligatoire.json +374 -0
  53. package/dist/src/data/rules/to18/rules-18-optionnelle.json +188 -0
  54. package/dist/src/data/rules/to18/rules-18-recommande.json +218 -0
  55. package/dist/src/data/rules/to19/rules-19-obligatoire.json +348 -0
  56. package/dist/src/data/rules/to19/rules-19-optionnelle.json +223 -0
  57. package/dist/src/data/rules/to19/rules-19-recommande.json +200 -0
  58. package/dist/src/data/rules/to20/rules-20-obligatoire.json +556 -0
  59. package/dist/src/data/rules/to20/rules-20-optionnelle.json +190 -0
  60. package/dist/src/data/rules/to20/rules-20-recommande.json +151 -0
  61. package/dist/src/index.js +161 -0
  62. package/dist/src/models/chip-config.js +45 -0
  63. package/dist/src/models/interfaces/app-details.interface.js +2 -0
  64. package/dist/src/models/interfaces/ast-interfaces.js +5 -0
  65. package/dist/src/models/interfaces/ast-pattern.interface.js +2 -0
  66. package/dist/src/models/interfaces/client-interfaces.js +6 -0
  67. package/dist/src/models/interfaces/detection-stats.interface.js +2 -0
  68. package/dist/src/models/interfaces/html-match.interface.js +2 -0
  69. package/dist/src/models/interfaces/html-report-data.interface.js +2 -0
  70. package/dist/src/models/interfaces/lib-details.interface.js +2 -0
  71. package/dist/src/models/interfaces/migration-rules.interface.js +2 -0
  72. package/dist/src/models/interfaces/parsed-args.interface.js +2 -0
  73. package/dist/src/models/interfaces/project-info.interface.js +2 -0
  74. package/dist/src/models/interfaces/project-overview-data.interface.js +2 -0
  75. package/dist/src/models/interfaces/rule-match.interface.js +2 -0
  76. package/dist/src/models/interfaces/rule.interface.js +2 -0
  77. package/dist/src/models/interfaces/rules-by-priority.interface.js +2 -0
  78. package/dist/src/models/interfaces/scanner-comparison.interface.js +2 -0
  79. package/dist/src/models/interfaces/special-workload.interface.js +2 -0
  80. package/dist/src/models/interfaces/workload-report.interface.js +2 -0
  81. package/dist/src/models/types/build-block-blob.type.js +2 -0
  82. package/dist/src/models/types/migration-version.type.js +2 -0
  83. package/dist/src/models/types/project-type.type.js +2 -0
  84. package/dist/src/models/types/risk-level.type.js +2 -0
  85. package/dist/src/models/types/rule-category.type.js +2 -0
  86. package/dist/src/models/types/rule-priority.type.js +2 -0
  87. package/dist/src/models/types/rule-workload-type.type.js +2 -0
  88. package/dist/src/templates/landing/applications-analyzed.template.js +18 -0
  89. package/dist/src/templates/landing/card-app-info.template.js +63 -0
  90. package/dist/src/templates/landing/card-lib-info.template.js +67 -0
  91. package/dist/src/templates/landing/libs-analyzed.template.js +22 -0
  92. package/dist/src/templates/landing/nx-summary.template.js +115 -0
  93. package/dist/src/templates/landing/project-overview.template.js +27 -0
  94. package/dist/src/templates/page/index-page.template.js +95 -0
  95. package/dist/src/templates/page/main.template.js +83 -0
  96. package/dist/src/templates/page/migration-guide.template.js +175 -0
  97. package/dist/src/templates/page/workload-report.template.js +53 -0
  98. package/dist/src/templates/workload/dashboard.template.js +184 -0
  99. package/dist/src/templates/workload/filters-panel.template.js +215 -0
  100. package/dist/src/templates/workload/guide-rule-card.template.js +107 -0
  101. package/dist/src/templates/workload/hierarchy-nx.template.js +104 -0
  102. package/dist/src/templates/workload/hierarchy-shared.js +163 -0
  103. package/dist/src/templates/workload/hierarchy-standalone.template.js +36 -0
  104. package/dist/src/templates/workload/hierarchy.template.js +35 -0
  105. package/dist/src/templates/workload/rule-modal.template.js +280 -0
  106. package/dist/src/utils/core/args-parser.js +123 -0
  107. package/dist/src/utils/core/array-helpers.js +18 -0
  108. package/dist/src/utils/core/ast-helpers.js +99 -0
  109. package/dist/src/utils/core/file-helpers.js +109 -0
  110. package/dist/src/utils/core/html-helpers.js +36 -0
  111. package/dist/src/utils/core/index.js +28 -0
  112. package/dist/src/utils/core/logger.js +38 -0
  113. package/dist/src/utils/core/rule-helpers.js +15 -0
  114. package/dist/src/utils/core/workload-formatter.js +6 -0
  115. package/dist/src/utils/shared/array-helpers.js +25 -0
  116. package/dist/src/utils/shared/date-helpers.js +109 -0
  117. package/dist/src/utils/shared/html-helpers.js +37 -0
  118. package/dist/src/utils/shared/index.js +25 -0
  119. package/dist/src/utils/shared/rule-helpers.js +20 -0
  120. package/dist/src/utils/shared/time-formatters.js +76 -0
  121. package/dist/styles.css +2 -0
  122. package/package.json +107 -0
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderApplicationsAnalyzed = renderApplicationsAnalyzed;
4
+ const card_app_info_template_1 = require("./card-app-info.template");
5
+ function renderApplicationsAnalyzed(apps) {
6
+ if (apps.length === 0) {
7
+ return '';
8
+ }
9
+ const appsCards = apps.map(card_app_info_template_1.renderAppCard).join('');
10
+ return `
11
+ <section class="mb-8">
12
+ <h2 class="text-3xl font-bold text-gray-800 mb-6">🚀 Applications Analysées</h2>
13
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
14
+ ${appsCards}
15
+ </div>
16
+ </section>
17
+ `;
18
+ }
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderAppCard = renderAppCard;
4
+ function renderAppCard(app) {
5
+ return `
6
+ <div class="bg-white rounded-xl shadow-lg p-6 border-l-4 border-indigo-500">
7
+ <h3 class="text-2xl font-bold text-gray-800 mb-2">${app.name}</h3>
8
+ ${app.description ? `<p class="text-gray-600 mb-4 italic">${app.description}</p>` : ''}
9
+
10
+ <div class="mb-4">
11
+ <h4 class="text-sm font-semibold text-gray-700 mb-2 uppercase">Dépendances</h4>
12
+ <div class="grid grid-cols-2 gap-3">
13
+ <div class="bg-blue-50 p-3 rounded-lg">
14
+ <p class="text-xs text-blue-600 font-semibold uppercase">Dependencies</p>
15
+ <p class="text-2xl font-bold text-blue-700">${app.dependencies}</p>
16
+ </div>
17
+ <div class="bg-indigo-50 p-3 rounded-lg">
18
+ <p class="text-xs text-indigo-600 font-semibold uppercase">Dev Dependencies</p>
19
+ <p class="text-2xl font-bold text-indigo-700">${app.devDependencies}</p>
20
+ </div>
21
+ </div>
22
+ </div>
23
+
24
+ <div>
25
+ <h4 class="text-sm font-semibold text-gray-700 mb-2 uppercase">Architecture Angular</h4>
26
+ <div class="grid grid-cols-3 gap-3">
27
+ <div class="bg-green-50 p-3 rounded-lg text-center">
28
+ <p class="text-xs text-green-600 font-semibold uppercase">Components</p>
29
+ <p class="text-xl font-bold text-green-700">${app.components}</p>
30
+ </div>
31
+ <div class="bg-purple-50 p-3 rounded-lg text-center">
32
+ <p class="text-xs text-purple-600 font-semibold uppercase">Modules</p>
33
+ <p class="text-xl font-bold text-purple-700">${app.modules}</p>
34
+ </div>
35
+ <div class="bg-blue-50 p-3 rounded-lg text-center">
36
+ <p class="text-xs text-blue-600 font-semibold uppercase">Services</p>
37
+ <p class="text-xl font-bold text-blue-700">${app.services}</p>
38
+ </div>
39
+ <div class="bg-yellow-50 p-3 rounded-lg text-center">
40
+ <p class="text-xs text-yellow-600 font-semibold uppercase">Directives</p>
41
+ <p class="text-xl font-bold text-yellow-700">${app.directives}</p>
42
+ </div>
43
+ <div class="bg-indigo-50 p-3 rounded-lg text-center">
44
+ <p class="text-xs text-indigo-600 font-semibold uppercase">Pipes</p>
45
+ <p class="text-xl font-bold text-indigo-700">${app.pipes}</p>
46
+ </div>
47
+ <div class="bg-pink-50 p-3 rounded-lg text-center">
48
+ <p class="text-xs text-pink-600 font-semibold uppercase">Guards</p>
49
+ <p class="text-xl font-bold text-pink-700">${app.guards}</p>
50
+ </div>
51
+ <div class="bg-teal-50 p-3 rounded-lg text-center">
52
+ <p class="text-xs text-teal-600 font-semibold uppercase">Interceptors</p>
53
+ <p class="text-xl font-bold text-teal-700">${app.interceptors}</p>
54
+ </div>
55
+ <div class="bg-orange-50 p-3 rounded-lg text-center">
56
+ <p class="text-xs text-orange-600 font-semibold uppercase">Resolvers</p>
57
+ <p class="text-xl font-bold text-orange-700">${app.resolvers}</p>
58
+ </div>
59
+ </div>
60
+ </div>
61
+ </div>
62
+ `;
63
+ }
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderLibCard = renderLibCard;
4
+ /**
5
+ * Template pour afficher une card de librairie Nx
6
+ * Même structure que card-app-info mais avec couleurs différentes (violet/indigo)
7
+ */
8
+ function renderLibCard(lib) {
9
+ return `
10
+ <div class="bg-white rounded-xl shadow-lg p-6 border-l-4 border-purple-500">
11
+ <h3 class="text-2xl font-bold text-gray-800 mb-2">${lib.name}</h3>
12
+ ${lib.description ? `<p class="text-gray-600 mb-4 italic">${lib.description}</p>` : ''}
13
+
14
+ <div class="mb-4">
15
+ <h4 class="text-sm font-semibold text-gray-700 mb-2 uppercase">Dépendances</h4>
16
+ <div class="grid grid-cols-2 gap-3">
17
+ <div class="bg-purple-50 p-3 rounded-lg">
18
+ <p class="text-xs text-purple-600 font-semibold uppercase">Dependencies</p>
19
+ <p class="text-2xl font-bold text-purple-700">${lib.dependencies}</p>
20
+ </div>
21
+ <div class="bg-violet-50 p-3 rounded-lg">
22
+ <p class="text-xs text-violet-600 font-semibold uppercase">Dev Dependencies</p>
23
+ <p class="text-2xl font-bold text-violet-700">${lib.devDependencies}</p>
24
+ </div>
25
+ </div>
26
+ </div>
27
+
28
+ <div>
29
+ <h4 class="text-sm font-semibold text-gray-700 mb-2 uppercase">Architecture Angular</h4>
30
+ <div class="grid grid-cols-3 gap-3">
31
+ <div class="bg-green-50 p-3 rounded-lg text-center">
32
+ <p class="text-xs text-green-600 font-semibold uppercase">Components</p>
33
+ <p class="text-xl font-bold text-green-700">${lib.components}</p>
34
+ </div>
35
+ <div class="bg-purple-50 p-3 rounded-lg text-center">
36
+ <p class="text-xs text-purple-600 font-semibold uppercase">Modules</p>
37
+ <p class="text-xl font-bold text-purple-700">${lib.modules}</p>
38
+ </div>
39
+ <div class="bg-blue-50 p-3 rounded-lg text-center">
40
+ <p class="text-xs text-blue-600 font-semibold uppercase">Services</p>
41
+ <p class="text-xl font-bold text-blue-700">${lib.services}</p>
42
+ </div>
43
+ <div class="bg-yellow-50 p-3 rounded-lg text-center">
44
+ <p class="text-xs text-yellow-600 font-semibold uppercase">Directives</p>
45
+ <p class="text-xl font-bold text-yellow-700">${lib.directives}</p>
46
+ </div>
47
+ <div class="bg-indigo-50 p-3 rounded-lg text-center">
48
+ <p class="text-xs text-indigo-600 font-semibold uppercase">Pipes</p>
49
+ <p class="text-xl font-bold text-indigo-700">${lib.pipes}</p>
50
+ </div>
51
+ <div class="bg-pink-50 p-3 rounded-lg text-center">
52
+ <p class="text-xs text-pink-600 font-semibold uppercase">Guards</p>
53
+ <p class="text-xl font-bold text-pink-700">${lib.guards}</p>
54
+ </div>
55
+ <div class="bg-teal-50 p-3 rounded-lg text-center">
56
+ <p class="text-xs text-teal-600 font-semibold uppercase">Interceptors</p>
57
+ <p class="text-xl font-bold text-teal-700">${lib.interceptors}</p>
58
+ </div>
59
+ <div class="bg-orange-50 p-3 rounded-lg text-center">
60
+ <p class="text-xs text-orange-600 font-semibold uppercase">Resolvers</p>
61
+ <p class="text-xl font-bold text-orange-700">${lib.resolvers}</p>
62
+ </div>
63
+ </div>
64
+ </div>
65
+ </div>
66
+ `;
67
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderLibsAnalyzed = renderLibsAnalyzed;
4
+ const card_lib_info_template_1 = require("./card-lib-info.template");
5
+ /**
6
+ * Template pour afficher les librairies Nx analysées
7
+ * Utilisé UNIQUEMENT pour les projets Nx Monorepo
8
+ */
9
+ function renderLibsAnalyzed(libs) {
10
+ if (libs.length === 0) {
11
+ return '';
12
+ }
13
+ const libsCards = libs.map(card_lib_info_template_1.renderLibCard).join('');
14
+ return `
15
+ <section class="mb-8">
16
+ <h2 class="text-3xl font-bold text-gray-800 mb-6">📚 Librairies Analysées</h2>
17
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-6">
18
+ ${libsCards}
19
+ </div>
20
+ </section>
21
+ `;
22
+ }
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderNxSummary = renderNxSummary;
4
+ /**
5
+ * Calcule les totaux pour un ensemble d'apps ou de libs
6
+ * Note: dependencies et devDependencies ne sont PAS additionnées car elles sont
7
+ * partagées au niveau global du monorepo Nx
8
+ */
9
+ function calculateTotals(items) {
10
+ return items.reduce((totals, item) => ({
11
+ components: totals.components + item.components,
12
+ modules: totals.modules + item.modules,
13
+ services: totals.services + item.services,
14
+ directives: totals.directives + item.directives,
15
+ pipes: totals.pipes + item.pipes,
16
+ guards: totals.guards + item.guards,
17
+ interceptors: totals.interceptors + item.interceptors,
18
+ resolvers: totals.resolvers + item.resolvers
19
+ }), {
20
+ components: 0,
21
+ modules: 0,
22
+ services: 0,
23
+ directives: 0,
24
+ pipes: 0,
25
+ guards: 0,
26
+ interceptors: 0,
27
+ resolvers: 0
28
+ });
29
+ }
30
+ /**
31
+ * Génère une card de résumé
32
+ */
33
+ function renderSummaryCard(title, emoji, count, totals, borderColor, accentColor) {
34
+ return `
35
+ <div class="bg-white rounded-xl shadow-lg p-6 border-l-4 ${borderColor}">
36
+ <div class="flex items-center justify-between mb-4">
37
+ <h3 class="text-2xl font-bold text-gray-800">${emoji} ${title}</h3>
38
+ <span class="px-3 py-1 bg-gray-100 text-gray-700 rounded-full text-sm font-semibold">
39
+ ${count} ${count > 1 ? 'éléments' : 'élément'}
40
+ </span>
41
+ </div>
42
+
43
+ <div>
44
+ <h4 class="text-sm font-semibold text-gray-700 mb-3 uppercase">Architecture Angular Totale</h4>
45
+ <div class="grid grid-cols-4 gap-3">
46
+ <div class="bg-green-50 p-3 rounded-lg text-center">
47
+ <p class="text-xs text-green-600 font-semibold uppercase">Comp.</p>
48
+ <p class="text-2xl font-bold text-green-700">${totals.components}</p>
49
+ </div>
50
+ <div class="bg-purple-50 p-3 rounded-lg text-center">
51
+ <p class="text-xs text-purple-600 font-semibold uppercase">Mod.</p>
52
+ <p class="text-2xl font-bold text-purple-700">${totals.modules}</p>
53
+ </div>
54
+ <div class="bg-blue-50 p-3 rounded-lg text-center">
55
+ <p class="text-xs text-blue-600 font-semibold uppercase">Serv.</p>
56
+ <p class="text-2xl font-bold text-blue-700">${totals.services}</p>
57
+ </div>
58
+ <div class="bg-yellow-50 p-3 rounded-lg text-center">
59
+ <p class="text-xs text-yellow-600 font-semibold uppercase">Dir.</p>
60
+ <p class="text-2xl font-bold text-yellow-700">${totals.directives}</p>
61
+ </div>
62
+ <div class="bg-indigo-50 p-3 rounded-lg text-center">
63
+ <p class="text-xs text-indigo-600 font-semibold uppercase">Pipes</p>
64
+ <p class="text-2xl font-bold text-indigo-700">${totals.pipes}</p>
65
+ </div>
66
+ <div class="bg-pink-50 p-3 rounded-lg text-center">
67
+ <p class="text-xs text-pink-600 font-semibold uppercase">Guard.</p>
68
+ <p class="text-2xl font-bold text-pink-700">${totals.guards}</p>
69
+ </div>
70
+ <div class="bg-teal-50 p-3 rounded-lg text-center">
71
+ <p class="text-xs text-teal-600 font-semibold uppercase">Int.</p>
72
+ <p class="text-2xl font-bold text-teal-700">${totals.interceptors}</p>
73
+ </div>
74
+ <div class="bg-orange-50 p-3 rounded-lg text-center">
75
+ <p class="text-xs text-orange-600 font-semibold uppercase">Res.</p>
76
+ <p class="text-2xl font-bold text-orange-700">${totals.resolvers}</p>
77
+ </div>
78
+ </div>
79
+ </div>
80
+ </div>
81
+ `;
82
+ }
83
+ /**
84
+ * Template pour afficher le résumé Nx (3 cards : Apps, Libs, Global)
85
+ * Utilisé UNIQUEMENT pour les projets Nx Monorepo
86
+ */
87
+ function renderNxSummary(apps, libs) {
88
+ // Si pas de données, ne rien afficher
89
+ if (apps.length === 0 && libs.length === 0) {
90
+ return '';
91
+ }
92
+ const appsTotals = calculateTotals(apps);
93
+ const libsTotals = calculateTotals(libs);
94
+ // Totaux globaux = apps + libs (architecture Angular uniquement)
95
+ const globalTotals = {
96
+ components: appsTotals.components + libsTotals.components,
97
+ modules: appsTotals.modules + libsTotals.modules,
98
+ services: appsTotals.services + libsTotals.services,
99
+ directives: appsTotals.directives + libsTotals.directives,
100
+ pipes: appsTotals.pipes + libsTotals.pipes,
101
+ guards: appsTotals.guards + libsTotals.guards,
102
+ interceptors: appsTotals.interceptors + libsTotals.interceptors,
103
+ resolvers: appsTotals.resolvers + libsTotals.resolvers
104
+ };
105
+ return `
106
+ <section class="mb-8">
107
+ <h2 class="text-3xl font-bold text-gray-800 mb-6">📈 Vue d'Ensemble Nx Monorepo</h2>
108
+ <div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
109
+ ${apps.length > 0 ? renderSummaryCard('Totaux Applications', '🚀', apps.length, appsTotals, 'border-blue-500', 'blue') : ''}
110
+ ${libs.length > 0 ? renderSummaryCard('Totaux Librairies', '📚', libs.length, libsTotals, 'border-purple-500', 'purple') : ''}
111
+ ${renderSummaryCard('Totaux Global', '🎯', apps.length + libs.length, globalTotals, 'border-green-500', 'green')}
112
+ </div>
113
+ </section>
114
+ `;
115
+ }
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderProjectOverview = renderProjectOverview;
4
+ function renderProjectOverview(data) {
5
+ return `
6
+ <header class="bg-white rounded-2xl shadow-2xl p-8 mb-8">
7
+ <h1 class="text-5xl font-bold text-transparent bg-clip-text bg-gradient-to-r from-blue-600 to-indigo-600 mb-4">
8
+ Rapport de Migration Angular
9
+ </h1>
10
+ <p class="text-gray-600 text-lg mb-4">
11
+ Analyse et planification de charge pour migrations Angular 17→18, 18→19, 19→20
12
+ </p>
13
+ <div class="bg-gray-50 rounded-lg p-4 mb-6">
14
+ <h3 class="text-lg font-semibold text-gray-700 mb-2">Projet analysé</h3>
15
+ <p class="text-gray-600"><strong>Nom:</strong> ${data.name}</p>
16
+ <p class="text-gray-600"><strong>Type:</strong> ${data.type}</p>
17
+ ${data.angularVersion ? `<p class="text-gray-600"><strong>Version Angular:</strong> ${data.angularVersion}</p>` : ''}
18
+ ${data.appsCount > 0 ? `<p class="text-gray-600"><strong>Applications:</strong> ${data.appsCount}</p>` : ''}
19
+ </div>
20
+ <div class="flex gap-4">
21
+ <span class="px-4 py-2 bg-blue-100 text-blue-700 rounded-lg font-medium">Angular 17→18</span>
22
+ <span class="px-4 py-2 bg-indigo-100 text-indigo-700 rounded-lg font-medium">Angular 18→19</span>
23
+ <span class="px-4 py-2 bg-purple-100 text-purple-700 rounded-lg font-medium">Angular 19→20</span>
24
+ </div>
25
+ </header>
26
+ `;
27
+ }
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ /**
3
+ * Template : Landing Page (index.html)
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.renderIndexPage = renderIndexPage;
7
+ const core_1 = require("../../utils/core");
8
+ function renderIndexPage(projectInfo, cssContent, timestamp, version) {
9
+ const dateStr = timestamp.split('T')[0];
10
+ return `
11
+ <!DOCTYPE html>
12
+ <html lang="fr">
13
+ <head>
14
+ <meta charset="UTF-8">
15
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
16
+ <title>Migration Planner - ${projectInfo.name}</title>
17
+ <style>${cssContent}</style>
18
+ </head>
19
+ <body class="bg-gradient-to-br from-blue-50 to-indigo-100 min-h-screen p-8">
20
+ <div class="max-w-4xl mx-auto">
21
+ <!-- Header -->
22
+ <div class="text-center mb-12">
23
+ <h1 class="text-5xl font-bold text-gray-800 mb-4">🚀 Migration Planner</h1>
24
+ <p class="text-xl text-gray-600">${projectInfo.name}</p>
25
+ <p class="text-sm text-gray-500 mt-2">Généré le ${(0, core_1.formatDate)(timestamp)}</p>
26
+ </div>
27
+
28
+ <!-- Cards -->
29
+ <div class="grid grid-cols-1 md:grid-cols-2 gap-8">
30
+ <!-- Workload Planner (Dashboard Global) -->
31
+ <a href="workload-planner.html" class="block bg-white rounded-2xl shadow-xl p-8 hover:shadow-2xl transition-shadow">
32
+ <div class="text-6xl mb-4">📊</div>
33
+ <h2 class="text-2xl font-bold text-gray-800 mb-3">Dashboard Global</h2>
34
+ <p class="text-gray-600 mb-4">
35
+ Dashboard interactif complet : charge de travail détaillée, configuration multi-devs,
36
+ temps éditables, charts et hiérarchie pliable.
37
+ </p>
38
+ <div class="flex items-center text-blue-600 font-semibold">
39
+ Accéder au dashboard
40
+ <svg class="w-5 h-5 ml-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
41
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/>
42
+ </svg>
43
+ </div>
44
+ </a>
45
+
46
+ <!-- Migration Guide -->
47
+ <a href="migration-guide.html" class="block bg-white rounded-2xl shadow-xl p-8 hover:shadow-2xl transition-shadow">
48
+ <div class="text-6xl mb-4">📖</div>
49
+ <h2 class="text-2xl font-bold text-gray-800 mb-3">Migration Guide</h2>
50
+ <p class="text-gray-600 mb-4">
51
+ Guide méthodologique étape par étape : checklists interactives, bonnes pratiques,
52
+ commandes de migration, fichiers concernés.
53
+ </p>
54
+ <div class="flex items-center text-blue-600 font-semibold">
55
+ Accéder au guide
56
+ <svg class="w-5 h-5 ml-2" fill="none" stroke="currentColor" viewBox="0 0 24 24">
57
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"/>
58
+ </svg>
59
+ </div>
60
+ </a>
61
+ </div>
62
+
63
+ <!-- Info Section -->
64
+ <div class="mt-12 bg-white rounded-2xl shadow-xl p-8">
65
+ <h3 class="text-xl font-bold text-gray-800 mb-4">📦 Informations Projet</h3>
66
+ <dl class="grid grid-cols-2 gap-4">
67
+ <div>
68
+ <dt class="text-sm font-medium text-gray-500">Type</dt>
69
+ <dd class="text-lg font-semibold text-gray-800">${projectInfo.type}</dd>
70
+ </div>
71
+ <div>
72
+ <dt class="text-sm font-medium text-gray-500">Version Angular</dt>
73
+ <dd class="text-lg font-semibold text-gray-800">${projectInfo.angularVersion || 'N/A'}</dd>
74
+ </div>
75
+ <div>
76
+ <dt class="text-sm font-medium text-gray-500">Applications</dt>
77
+ <dd class="text-lg font-semibold text-gray-800">${projectInfo.apps.length}</dd>
78
+ </div>
79
+ <div>
80
+ <dt class="text-sm font-medium text-gray-500">Chemin</dt>
81
+ <dd class="text-sm text-gray-600 truncate">${projectInfo.path}</dd>
82
+ </div>
83
+ </dl>
84
+ </div>
85
+
86
+ <!-- Footer -->
87
+ <footer class="mt-8 text-center text-gray-600 text-sm">
88
+ <p class="mb-1">Angular Migration Planner v${version || '1.0.0'}</p>
89
+ <p class="text-gray-500">Généré le ${(0, core_1.formatDate)(timestamp)}</p>
90
+ </footer>
91
+ </div>
92
+ </body>
93
+ </html>
94
+ `.trim();
95
+ }
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderMainPage = renderMainPage;
4
+ const project_overview_template_1 = require("../landing/project-overview.template");
5
+ const nx_summary_template_1 = require("../landing/nx-summary.template");
6
+ const applications_analyzed_template_1 = require("../landing/applications-analyzed.template");
7
+ const libs_analyzed_template_1 = require("../landing/libs-analyzed.template");
8
+ const core_1 = require("../../utils/core");
9
+ function renderMainPage(projectInfo, cssContent, workloadReport, uniqueRules, uniqueFiles, workloadReportPath, version) {
10
+ const projectOverview = (0, project_overview_template_1.renderProjectOverview)({
11
+ name: projectInfo.name,
12
+ type: projectInfo.type,
13
+ angularVersion: projectInfo.angularVersion,
14
+ appsCount: projectInfo.apps.length
15
+ });
16
+ // Séparation Apps / Libs pour Nx Monorepo
17
+ const isNxMonorepo = projectInfo.type === 'nx-monorepo';
18
+ const nxSummarySection = isNxMonorepo ? (0, nx_summary_template_1.renderNxSummary)(projectInfo.apps, projectInfo.libs) : '';
19
+ const applicationsSection = (0, applications_analyzed_template_1.renderApplicationsAnalyzed)(projectInfo.apps);
20
+ const librariesSection = isNxMonorepo ? (0, libs_analyzed_template_1.renderLibsAnalyzed)(projectInfo.libs) : '';
21
+ return `
22
+ <!DOCTYPE html>
23
+ <html lang="fr">
24
+ <head>
25
+ <meta charset="UTF-8">
26
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
27
+ <title>Rapport de Migration Angular - ${projectInfo.name}</title>
28
+ <style>${cssContent}</style>
29
+ </head>
30
+ <body class="bg-gradient-to-br from-blue-50 to-indigo-100 min-h-screen p-8">
31
+ <div class="max-w-7xl mx-auto">
32
+ ${projectOverview}
33
+
34
+ ${nxSummarySection}
35
+
36
+ ${applicationsSection}
37
+
38
+ ${librariesSection}
39
+
40
+ <main class="bg-white rounded-2xl shadow-2xl p-8">
41
+ <h2 class="text-3xl font-bold text-gray-800 mb-6">Vue d'ensemble</h2>
42
+ <div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8">
43
+ <div class="bg-gradient-to-br from-blue-50 to-blue-100 p-6 rounded-xl">
44
+ <h3 class="text-xl font-semibold text-blue-900 mb-2">Règles détectées</h3>
45
+ <p class="text-4xl font-bold text-blue-600">${uniqueRules || 0}</p>
46
+ </div>
47
+ <div class="bg-gradient-to-br from-indigo-50 to-indigo-100 p-6 rounded-xl">
48
+ <h3 class="text-xl font-semibold text-indigo-900 mb-2">Fichiers impactés</h3>
49
+ <p class="text-4xl font-bold text-indigo-600">${uniqueFiles || 0}</p>
50
+ </div>
51
+ <div class="bg-gradient-to-br from-purple-50 to-purple-100 p-6 rounded-xl">
52
+ <h3 class="text-xl font-semibold text-purple-900 mb-2">Temps estimé</h3>
53
+ <p class="text-4xl font-bold text-purple-600">${workloadReport ? (0, core_1.formatTime)(workloadReport.totalTime.minutes, workloadReport.totalTime.hours, workloadReport.totalTime.days) : '0h'}</p>
54
+ </div>
55
+ </div>
56
+ ${workloadReportPath ? `
57
+ <div class="flex justify-center">
58
+ <a href="${workloadReportPath}" class="inline-flex items-center px-8 py-4 bg-blue-600 text-white text-lg font-semibold rounded-xl hover:bg-blue-700 transition-colors shadow-lg hover:shadow-xl">
59
+ <svg class="w-6 h-6 mr-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
60
+ <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z" />
61
+ </svg>
62
+ Accéder à la planification de migration
63
+ </a>
64
+ </div>
65
+ ` : `
66
+ <div class="mt-8 p-4 bg-yellow-50 border-l-4 border-yellow-400 rounded">
67
+ <p class="text-yellow-800">
68
+ <strong>Note:</strong> Rapport de synthèse. Utilisez le rapport de planification complet pour plus de détails.
69
+ </p>
70
+ </div>
71
+ `}
72
+ </main>
73
+
74
+ <!-- Footer avec version -->
75
+ <footer class="mt-12 text-center text-gray-600 text-sm">
76
+ <p class="mb-1">Angular Migration Planner v${version || '1.0.0'}</p>
77
+ <p class="text-gray-500">Généré le ${new Date().toLocaleDateString('fr-FR', { year: 'numeric', month: 'long', day: 'numeric' })}</p>
78
+ </footer>
79
+ </div>
80
+ </body>
81
+ </html>
82
+ `;
83
+ }