@enokdev/springdocs-mcp 1.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.
- package/.github/workflows/publish.yml +64 -0
- package/CHANGELOG.md +82 -0
- package/CONTRIBUTING.md +215 -0
- package/DEPLOYMENT.md +205 -0
- package/EXAMPLES.md +186 -0
- package/INSTALL.md +123 -0
- package/LICENSE +21 -0
- package/PUBLICATION_ENOKDEV.md +170 -0
- package/PUBLISHING.md +196 -0
- package/README.md +219 -0
- package/README_ENOKDEV.md +108 -0
- package/RELEASE_NOTES_v1.1.0.md +106 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +232 -0
- package/build/index.js.map +1 -0
- package/build/services/springboot-docs.d.ts +65 -0
- package/build/services/springboot-docs.d.ts.map +1 -0
- package/build/services/springboot-docs.js +549 -0
- package/build/services/springboot-docs.js.map +1 -0
- package/build/tools/index.d.ts +185 -0
- package/build/tools/index.d.ts.map +1 -0
- package/build/tools/index.js +144 -0
- package/build/tools/index.js.map +1 -0
- package/claude_desktop_config.json +8 -0
- package/docs/index.html +147 -0
- package/guid.md +92 -0
- package/package.json +58 -0
- package/publish.sh +130 -0
- package/src/index.ts +287 -0
- package/src/services/springboot-docs.ts +615 -0
- package/src/tools/index.ts +144 -0
- package/test.sh +64 -0
- package/tsconfig.json +24 -0
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service pour accéder et traiter la documentation Spring Boot
|
|
3
|
+
*/
|
|
4
|
+
export declare class SpringBootDocsService {
|
|
5
|
+
private readonly baseUrl;
|
|
6
|
+
private readonly springProjectsUrl;
|
|
7
|
+
private readonly springGuideUrl;
|
|
8
|
+
private readonly springBootVersion;
|
|
9
|
+
private turndownService;
|
|
10
|
+
constructor();
|
|
11
|
+
/**
|
|
12
|
+
* Recherche dans tous les projets Spring
|
|
13
|
+
*/
|
|
14
|
+
searchSpringProjects(query: string, limit?: number): Promise<any[]>;
|
|
15
|
+
/**
|
|
16
|
+
* Récupère les détails d'un projet Spring spécifique
|
|
17
|
+
*/
|
|
18
|
+
getSpringProject(projectName: string): Promise<string>;
|
|
19
|
+
/**
|
|
20
|
+
* Récupère tous les guides Spring disponibles
|
|
21
|
+
*/
|
|
22
|
+
getAllSpringGuides(category?: string, limit?: number): Promise<any[]>;
|
|
23
|
+
/**
|
|
24
|
+
* Liste des projets Spring populaires
|
|
25
|
+
*/
|
|
26
|
+
private getPopularSpringProjects;
|
|
27
|
+
/**
|
|
28
|
+
* Liste des guides Spring populaires
|
|
29
|
+
*/
|
|
30
|
+
private getPopularSpringGuides;
|
|
31
|
+
searchDocumentation(query: string, docType?: string, limit?: number): Promise<any[]>;
|
|
32
|
+
/**
|
|
33
|
+
* Récupère un guide Spring Boot spécifique
|
|
34
|
+
*/
|
|
35
|
+
getGuide(guideId: string): Promise<string>;
|
|
36
|
+
/**
|
|
37
|
+
* Récupère une section de la documentation de référence
|
|
38
|
+
*/
|
|
39
|
+
getReference(section: string, subsection?: string): Promise<string>;
|
|
40
|
+
/**
|
|
41
|
+
* Recherche des concepts Spring Boot
|
|
42
|
+
*/
|
|
43
|
+
searchConcepts(concept: string, category?: string): Promise<any>;
|
|
44
|
+
/**
|
|
45
|
+
* Recherche dans les guides Spring Boot
|
|
46
|
+
*/
|
|
47
|
+
private searchGuides;
|
|
48
|
+
/**
|
|
49
|
+
* Recherche dans la documentation de référence
|
|
50
|
+
*/
|
|
51
|
+
private searchReference;
|
|
52
|
+
/**
|
|
53
|
+
* Recherche dans la documentation de l'API
|
|
54
|
+
*/
|
|
55
|
+
private searchAPI;
|
|
56
|
+
/**
|
|
57
|
+
* Nettoie le HTML pour une meilleure conversion en Markdown
|
|
58
|
+
*/
|
|
59
|
+
private cleanHtml;
|
|
60
|
+
/**
|
|
61
|
+
* Base de connaissances des concepts Spring Boot
|
|
62
|
+
*/
|
|
63
|
+
private getSpringBootConcepts;
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=springboot-docs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"springboot-docs.d.ts","sourceRoot":"","sources":["../../src/services/springboot-docs.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgC;IAClE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8B;IAC7D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAW;IAC7C,OAAO,CAAC,eAAe,CAAkB;;IASzC;;OAEG;IACG,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW;IA0D5D;;OAEG;IACG,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAuC5D;;OAEG;IACG,kBAAkB,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW;IA+C9D;;OAEG;IACH,OAAO,CAAC,wBAAwB;IA6DhC;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAoExB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,MAAc,EAAE,KAAK,GAAE,MAAW;IA6BpF;;OAEG;IACG,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA8BhD;;OAEG;IACG,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoCzE;;OAEG;IACG,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM;IA0BvD;;OAEG;YACW,YAAY;IA2B1B;;OAEG;YACW,eAAe;IAyB7B;;OAEG;YACW,SAAS;IAsBvB;;OAEG;IACH,OAAO,CAAC,SAAS;IAUjB;;OAEG;IACH,OAAO,CAAC,qBAAqB;CA4E9B"}
|
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
import fetch from 'node-fetch';
|
|
2
|
+
import * as cheerio from 'cheerio';
|
|
3
|
+
import TurndownService from 'turndown';
|
|
4
|
+
/**
|
|
5
|
+
* Service pour accéder et traiter la documentation Spring Boot
|
|
6
|
+
*/
|
|
7
|
+
export class SpringBootDocsService {
|
|
8
|
+
baseUrl = 'https://docs.spring.io';
|
|
9
|
+
springProjectsUrl = 'https://spring.io/projects';
|
|
10
|
+
springGuideUrl = 'https://spring.io/guides';
|
|
11
|
+
springBootVersion = '3.2.0'; // Version par défaut
|
|
12
|
+
turndownService;
|
|
13
|
+
constructor() {
|
|
14
|
+
this.turndownService = new TurndownService({
|
|
15
|
+
headingStyle: 'atx',
|
|
16
|
+
codeBlockStyle: 'fenced',
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Recherche dans tous les projets Spring
|
|
21
|
+
*/
|
|
22
|
+
async searchSpringProjects(query, limit = 10) {
|
|
23
|
+
try {
|
|
24
|
+
const response = await fetch(this.springProjectsUrl);
|
|
25
|
+
if (!response.ok) {
|
|
26
|
+
throw new Error('Impossible d\'accéder à la page des projets Spring');
|
|
27
|
+
}
|
|
28
|
+
const html = await response.text();
|
|
29
|
+
const $ = cheerio.load(html);
|
|
30
|
+
const projects = [];
|
|
31
|
+
// Extraire les projets depuis la page
|
|
32
|
+
$('.project-list .project, .project-item, .card').each((index, element) => {
|
|
33
|
+
const $project = $(element);
|
|
34
|
+
const title = $project.find('h2, h3, .title, .project-title').first().text().trim();
|
|
35
|
+
const description = $project.find('p, .description, .summary').first().text().trim();
|
|
36
|
+
const link = $project.find('a').first().attr('href');
|
|
37
|
+
if (title && (title.toLowerCase().includes(query.toLowerCase()) ||
|
|
38
|
+
description.toLowerCase().includes(query.toLowerCase()))) {
|
|
39
|
+
projects.push({
|
|
40
|
+
type: 'spring-project',
|
|
41
|
+
title: title,
|
|
42
|
+
description: description,
|
|
43
|
+
url: link?.startsWith('http') ? link : `https://spring.io${link}`,
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
// Si peu de résultats, ajouter des projets populaires
|
|
48
|
+
if (projects.length < 3) {
|
|
49
|
+
const popularProjects = this.getPopularSpringProjects()
|
|
50
|
+
.filter(project => project.title.toLowerCase().includes(query.toLowerCase()) ||
|
|
51
|
+
project.description.toLowerCase().includes(query.toLowerCase()) ||
|
|
52
|
+
project.keywords.some((k) => k.toLowerCase().includes(query.toLowerCase())));
|
|
53
|
+
projects.push(...popularProjects);
|
|
54
|
+
}
|
|
55
|
+
return projects.slice(0, limit);
|
|
56
|
+
}
|
|
57
|
+
catch (error) {
|
|
58
|
+
console.error('Erreur lors de la recherche des projets Spring:', error);
|
|
59
|
+
// Fallback sur les projets populaires
|
|
60
|
+
return this.getPopularSpringProjects()
|
|
61
|
+
.filter(project => project.title.toLowerCase().includes(query.toLowerCase()) ||
|
|
62
|
+
project.description.toLowerCase().includes(query.toLowerCase()))
|
|
63
|
+
.slice(0, limit);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Récupère les détails d'un projet Spring spécifique
|
|
68
|
+
*/
|
|
69
|
+
async getSpringProject(projectName) {
|
|
70
|
+
try {
|
|
71
|
+
const url = `${this.springProjectsUrl}/${projectName}`;
|
|
72
|
+
const response = await fetch(url);
|
|
73
|
+
if (!response.ok) {
|
|
74
|
+
throw new Error(`Projet non trouvé: ${projectName}`);
|
|
75
|
+
}
|
|
76
|
+
const html = await response.text();
|
|
77
|
+
const $ = cheerio.load(html);
|
|
78
|
+
// Extrait le contenu principal du projet
|
|
79
|
+
const content = $('.project-overview, .content, main, .project-details').first();
|
|
80
|
+
if (content.length === 0) {
|
|
81
|
+
throw new Error('Contenu du projet non trouvé');
|
|
82
|
+
}
|
|
83
|
+
// Nettoie et convertit en Markdown
|
|
84
|
+
this.cleanHtml($, content);
|
|
85
|
+
const markdown = this.turndownService.turndown(content.html() || '');
|
|
86
|
+
// Ajouter des informations supplémentaires
|
|
87
|
+
const version = $('.version, .current-version').first().text().trim();
|
|
88
|
+
const status = $('.status, .project-status').first().text().trim();
|
|
89
|
+
let result = `# Projet Spring: ${projectName}\n\n`;
|
|
90
|
+
if (version)
|
|
91
|
+
result += `**Version actuelle:** ${version}\n\n`;
|
|
92
|
+
if (status)
|
|
93
|
+
result += `**Statut:** ${status}\n\n`;
|
|
94
|
+
result += markdown;
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
console.error(`Erreur lors de la récupération du projet ${projectName}:`, error);
|
|
99
|
+
throw new Error(`Impossible de récupérer le projet: ${projectName}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Récupère tous les guides Spring disponibles
|
|
104
|
+
*/
|
|
105
|
+
async getAllSpringGuides(category, limit = 20) {
|
|
106
|
+
try {
|
|
107
|
+
const response = await fetch(this.springGuideUrl);
|
|
108
|
+
if (!response.ok) {
|
|
109
|
+
throw new Error('Impossible d\'accéder à la page des guides Spring');
|
|
110
|
+
}
|
|
111
|
+
const html = await response.text();
|
|
112
|
+
const $ = cheerio.load(html);
|
|
113
|
+
const guides = [];
|
|
114
|
+
// Extraire les guides depuis la page
|
|
115
|
+
$('.guide-list .guide, .guide-item, .card').each((index, element) => {
|
|
116
|
+
const $guide = $(element);
|
|
117
|
+
const title = $guide.find('h2, h3, .title, .guide-title').first().text().trim();
|
|
118
|
+
const description = $guide.find('p, .description, .summary').first().text().trim();
|
|
119
|
+
const link = $guide.find('a').first().attr('href');
|
|
120
|
+
const guideCategory = $guide.find('.category, .tag').first().text().trim();
|
|
121
|
+
if (title && (!category || guideCategory.toLowerCase().includes(category.toLowerCase()))) {
|
|
122
|
+
guides.push({
|
|
123
|
+
type: 'spring-guide',
|
|
124
|
+
title: title,
|
|
125
|
+
description: description,
|
|
126
|
+
category: guideCategory,
|
|
127
|
+
url: link?.startsWith('http') ? link : `https://spring.io${link}`,
|
|
128
|
+
id: link?.split('/').pop()?.replace('.html', '') || title.toLowerCase().replace(/\s+/g, '-'),
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
// Si peu de résultats, ajouter des guides populaires
|
|
133
|
+
if (guides.length < 5) {
|
|
134
|
+
const popularGuides = this.getPopularSpringGuides();
|
|
135
|
+
guides.push(...popularGuides);
|
|
136
|
+
}
|
|
137
|
+
return guides.slice(0, limit);
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
console.error('Erreur lors de la récupération des guides Spring:', error);
|
|
141
|
+
// Fallback sur les guides populaires
|
|
142
|
+
return this.getPopularSpringGuides().slice(0, limit);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Liste des projets Spring populaires
|
|
147
|
+
*/
|
|
148
|
+
getPopularSpringProjects() {
|
|
149
|
+
return [
|
|
150
|
+
{
|
|
151
|
+
type: 'spring-project',
|
|
152
|
+
title: 'Spring Boot',
|
|
153
|
+
description: 'Créez des applications Spring de qualité production facilement',
|
|
154
|
+
url: 'https://spring.io/projects/spring-boot',
|
|
155
|
+
keywords: ['boot', 'microservices', 'web', 'standalone'],
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
type: 'spring-project',
|
|
159
|
+
title: 'Spring Framework',
|
|
160
|
+
description: 'Le framework Java le plus populaire pour créer des applications d\'entreprise',
|
|
161
|
+
url: 'https://spring.io/projects/spring-framework',
|
|
162
|
+
keywords: ['framework', 'core', 'mvc', 'ioc', 'dependency injection'],
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
type: 'spring-project',
|
|
166
|
+
title: 'Spring Data',
|
|
167
|
+
description: 'Fournit un modèle de programmation familier pour l\'accès aux données',
|
|
168
|
+
url: 'https://spring.io/projects/spring-data',
|
|
169
|
+
keywords: ['data', 'jpa', 'mongodb', 'redis', 'repository'],
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
type: 'spring-project',
|
|
173
|
+
title: 'Spring Security',
|
|
174
|
+
description: 'Framework de sécurité puissant et hautement personnalisable',
|
|
175
|
+
url: 'https://spring.io/projects/spring-security',
|
|
176
|
+
keywords: ['security', 'authentication', 'authorization', 'oauth'],
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
type: 'spring-project',
|
|
180
|
+
title: 'Spring Cloud',
|
|
181
|
+
description: 'Outils pour développer rapidement des patterns de systèmes distribués',
|
|
182
|
+
url: 'https://spring.io/projects/spring-cloud',
|
|
183
|
+
keywords: ['cloud', 'microservices', 'distributed', 'netflix'],
|
|
184
|
+
},
|
|
185
|
+
{
|
|
186
|
+
type: 'spring-project',
|
|
187
|
+
title: 'Spring Integration',
|
|
188
|
+
description: 'Implémentation des Enterprise Integration Patterns',
|
|
189
|
+
url: 'https://spring.io/projects/spring-integration',
|
|
190
|
+
keywords: ['integration', 'messaging', 'endpoints', 'channels'],
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'spring-project',
|
|
194
|
+
title: 'Spring Batch',
|
|
195
|
+
description: 'Framework pour le traitement batch robuste',
|
|
196
|
+
url: 'https://spring.io/projects/spring-batch',
|
|
197
|
+
keywords: ['batch', 'processing', 'jobs', 'steps'],
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
type: 'spring-project',
|
|
201
|
+
title: 'Spring WebFlux',
|
|
202
|
+
description: 'Framework web réactif pour Spring',
|
|
203
|
+
url: 'https://spring.io/projects/spring-framework',
|
|
204
|
+
keywords: ['reactive', 'webflux', 'non-blocking', 'async'],
|
|
205
|
+
},
|
|
206
|
+
];
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Liste des guides Spring populaires
|
|
210
|
+
*/
|
|
211
|
+
getPopularSpringGuides() {
|
|
212
|
+
return [
|
|
213
|
+
{
|
|
214
|
+
type: 'spring-guide',
|
|
215
|
+
title: 'Building a RESTful Web Service',
|
|
216
|
+
description: 'Apprendre à créer un service web RESTful avec Spring Boot',
|
|
217
|
+
category: 'Web',
|
|
218
|
+
url: 'https://spring.io/guides/gs/rest-service/',
|
|
219
|
+
id: 'gs-rest-service',
|
|
220
|
+
},
|
|
221
|
+
{
|
|
222
|
+
type: 'spring-guide',
|
|
223
|
+
title: 'Building an Application with Spring Boot',
|
|
224
|
+
description: 'Apprendre à construire une application avec une configuration minimale',
|
|
225
|
+
category: 'Getting Started',
|
|
226
|
+
url: 'https://spring.io/guides/gs/spring-boot/',
|
|
227
|
+
id: 'gs-spring-boot',
|
|
228
|
+
},
|
|
229
|
+
{
|
|
230
|
+
type: 'spring-guide',
|
|
231
|
+
title: 'Accessing Data with JPA',
|
|
232
|
+
description: 'Apprendre à travailler avec la persistance de données JPA',
|
|
233
|
+
category: 'Data',
|
|
234
|
+
url: 'https://spring.io/guides/gs/accessing-data-jpa/',
|
|
235
|
+
id: 'gs-accessing-data-jpa',
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
type: 'spring-guide',
|
|
239
|
+
title: 'Securing a Web Application',
|
|
240
|
+
description: 'Apprendre à protéger votre application web avec Spring Security',
|
|
241
|
+
category: 'Security',
|
|
242
|
+
url: 'https://spring.io/guides/gs/securing-web/',
|
|
243
|
+
id: 'gs-securing-web',
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
type: 'spring-guide',
|
|
247
|
+
title: 'Building a RESTful Web Service with Spring Boot Actuator',
|
|
248
|
+
description: 'Apprendre à créer un service prêt pour la production',
|
|
249
|
+
category: 'Production',
|
|
250
|
+
url: 'https://spring.io/guides/gs/actuator-service/',
|
|
251
|
+
id: 'gs-actuator-service',
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
type: 'spring-guide',
|
|
255
|
+
title: 'Testing the Web Layer',
|
|
256
|
+
description: 'Apprendre à tester les applications Spring Boot',
|
|
257
|
+
category: 'Testing',
|
|
258
|
+
url: 'https://spring.io/guides/gs/testing-web/',
|
|
259
|
+
id: 'gs-testing-web',
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
type: 'spring-guide',
|
|
263
|
+
title: 'Building a Reactive RESTful Web Service',
|
|
264
|
+
description: 'Créer des services web réactifs avec Spring WebFlux',
|
|
265
|
+
category: 'Reactive',
|
|
266
|
+
url: 'https://spring.io/guides/gs/reactive-rest-service/',
|
|
267
|
+
id: 'gs-reactive-rest-service',
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
type: 'spring-guide',
|
|
271
|
+
title: 'Consuming a RESTful Web Service',
|
|
272
|
+
description: 'Apprendre à récupérer des données depuis un endpoint REST',
|
|
273
|
+
category: 'Web',
|
|
274
|
+
url: 'https://spring.io/guides/gs/consuming-rest/',
|
|
275
|
+
id: 'gs-consuming-rest',
|
|
276
|
+
},
|
|
277
|
+
];
|
|
278
|
+
}
|
|
279
|
+
async searchDocumentation(query, docType = 'all', limit = 10) {
|
|
280
|
+
const results = [];
|
|
281
|
+
try {
|
|
282
|
+
// Recherche dans les guides
|
|
283
|
+
if (docType === 'all' || docType === 'guides') {
|
|
284
|
+
const guideResults = await this.searchGuides(query, Math.ceil(limit / 3));
|
|
285
|
+
results.push(...guideResults);
|
|
286
|
+
}
|
|
287
|
+
// Recherche dans la documentation de référence
|
|
288
|
+
if (docType === 'all' || docType === 'reference') {
|
|
289
|
+
const refResults = await this.searchReference(query, Math.ceil(limit / 3));
|
|
290
|
+
results.push(...refResults);
|
|
291
|
+
}
|
|
292
|
+
// Recherche dans l'API documentation
|
|
293
|
+
if (docType === 'all' || docType === 'api') {
|
|
294
|
+
const apiResults = await this.searchAPI(query, Math.ceil(limit / 3));
|
|
295
|
+
results.push(...apiResults);
|
|
296
|
+
}
|
|
297
|
+
return results.slice(0, limit);
|
|
298
|
+
}
|
|
299
|
+
catch (error) {
|
|
300
|
+
console.error('Erreur lors de la recherche dans la documentation:', error);
|
|
301
|
+
throw new Error('Impossible de rechercher dans la documentation Spring Boot');
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
/**
|
|
305
|
+
* Récupère un guide Spring Boot spécifique
|
|
306
|
+
*/
|
|
307
|
+
async getGuide(guideId) {
|
|
308
|
+
try {
|
|
309
|
+
const url = `${this.baseUrl}/guides/${guideId}/`;
|
|
310
|
+
const response = await fetch(url);
|
|
311
|
+
if (!response.ok) {
|
|
312
|
+
throw new Error(`Guide non trouvé: ${guideId}`);
|
|
313
|
+
}
|
|
314
|
+
const html = await response.text();
|
|
315
|
+
const $ = cheerio.load(html);
|
|
316
|
+
// Extrait le contenu principal du guide
|
|
317
|
+
const content = $('.content, .guide-content, main').first();
|
|
318
|
+
if (content.length === 0) {
|
|
319
|
+
throw new Error('Contenu du guide non trouvé');
|
|
320
|
+
}
|
|
321
|
+
// Nettoie et convertit en Markdown
|
|
322
|
+
this.cleanHtml($, content);
|
|
323
|
+
const markdown = this.turndownService.turndown(content.html() || '');
|
|
324
|
+
return `# Guide Spring Boot: ${guideId}\n\n${markdown}`;
|
|
325
|
+
}
|
|
326
|
+
catch (error) {
|
|
327
|
+
console.error(`Erreur lors de la récupération du guide ${guideId}:`, error);
|
|
328
|
+
throw new Error(`Impossible de récupérer le guide: ${guideId}`);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Récupère une section de la documentation de référence
|
|
333
|
+
*/
|
|
334
|
+
async getReference(section, subsection) {
|
|
335
|
+
try {
|
|
336
|
+
let url = `${this.baseUrl}/spring-boot/docs/${this.springBootVersion}/reference/html/`;
|
|
337
|
+
if (subsection) {
|
|
338
|
+
url += `${section}.html#${subsection}`;
|
|
339
|
+
}
|
|
340
|
+
else {
|
|
341
|
+
url += `${section}.html`;
|
|
342
|
+
}
|
|
343
|
+
const response = await fetch(url);
|
|
344
|
+
if (!response.ok) {
|
|
345
|
+
throw new Error(`Section de référence non trouvée: ${section}`);
|
|
346
|
+
}
|
|
347
|
+
const html = await response.text();
|
|
348
|
+
const $ = cheerio.load(html);
|
|
349
|
+
// Extrait le contenu principal
|
|
350
|
+
const content = $('.content, .section, main').first();
|
|
351
|
+
if (content.length === 0) {
|
|
352
|
+
throw new Error('Contenu de la section non trouvé');
|
|
353
|
+
}
|
|
354
|
+
this.cleanHtml($, content);
|
|
355
|
+
const markdown = this.turndownService.turndown(content.html() || '');
|
|
356
|
+
return `# Spring Boot Reference: ${section}\n\n${markdown}`;
|
|
357
|
+
}
|
|
358
|
+
catch (error) {
|
|
359
|
+
console.error(`Erreur lors de la récupération de la référence ${section}:`, error);
|
|
360
|
+
throw new Error(`Impossible de récupérer la section de référence: ${section}`);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
/**
|
|
364
|
+
* Recherche des concepts Spring Boot
|
|
365
|
+
*/
|
|
366
|
+
async searchConcepts(concept, category) {
|
|
367
|
+
try {
|
|
368
|
+
const concepts = this.getSpringBootConcepts();
|
|
369
|
+
const results = {};
|
|
370
|
+
for (const [cat, conceptList] of Object.entries(concepts)) {
|
|
371
|
+
if (category && cat !== category)
|
|
372
|
+
continue;
|
|
373
|
+
const matches = conceptList.filter((c) => c.name.toLowerCase().includes(concept.toLowerCase()) ||
|
|
374
|
+
c.description.toLowerCase().includes(concept.toLowerCase()) ||
|
|
375
|
+
c.keywords.some((k) => k.toLowerCase().includes(concept.toLowerCase())));
|
|
376
|
+
if (matches.length > 0) {
|
|
377
|
+
results[cat] = matches;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
return results;
|
|
381
|
+
}
|
|
382
|
+
catch (error) {
|
|
383
|
+
console.error('Erreur lors de la recherche de concepts:', error);
|
|
384
|
+
throw new Error('Impossible de rechercher les concepts Spring Boot');
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Recherche dans les guides Spring Boot
|
|
389
|
+
*/
|
|
390
|
+
async searchGuides(query, limit) {
|
|
391
|
+
// Liste des guides populaires Spring Boot
|
|
392
|
+
const guides = [
|
|
393
|
+
{ id: 'gs-rest-service', title: 'Building a RESTful Web Service', description: 'Learn how to create a RESTful web service with Spring Boot' },
|
|
394
|
+
{ id: 'gs-spring-boot', title: 'Building an Application with Spring Boot', description: 'Learn how to build an application with minimal configuration' },
|
|
395
|
+
{ id: 'gs-accessing-data-jpa', title: 'Accessing Data with JPA', description: 'Learn how to work with JPA data persistence' },
|
|
396
|
+
{ id: 'gs-securing-web', title: 'Securing a Web Application', description: 'Learn how to protect your web application with Spring Security' },
|
|
397
|
+
{ id: 'gs-consuming-rest', title: 'Consuming a RESTful Web Service', description: 'Learn how to retrieve data from a REST endpoint' },
|
|
398
|
+
{ id: 'gs-testing-web', title: 'Testing the Web Layer', description: 'Learn how to test Spring Boot applications' },
|
|
399
|
+
{ id: 'gs-actuator-service', title: 'Building a RESTful Web Service with Spring Boot Actuator', description: 'Learn how to create a production-ready service' },
|
|
400
|
+
];
|
|
401
|
+
return guides
|
|
402
|
+
.filter(guide => guide.title.toLowerCase().includes(query.toLowerCase()) ||
|
|
403
|
+
guide.description.toLowerCase().includes(query.toLowerCase()))
|
|
404
|
+
.slice(0, limit)
|
|
405
|
+
.map(guide => ({
|
|
406
|
+
type: 'guide',
|
|
407
|
+
title: guide.title,
|
|
408
|
+
url: `${this.baseUrl}/guides/${guide.id}/`,
|
|
409
|
+
description: guide.description,
|
|
410
|
+
id: guide.id,
|
|
411
|
+
}));
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Recherche dans la documentation de référence
|
|
415
|
+
*/
|
|
416
|
+
async searchReference(query, limit) {
|
|
417
|
+
const sections = [
|
|
418
|
+
{ name: 'web', title: 'Web Applications', description: 'Building web applications with Spring Boot' },
|
|
419
|
+
{ name: 'data', title: 'Data Access', description: 'Working with databases and data sources' },
|
|
420
|
+
{ name: 'security', title: 'Security', description: 'Securing Spring Boot applications' },
|
|
421
|
+
{ name: 'actuator', title: 'Production-ready Features', description: 'Monitoring and managing applications' },
|
|
422
|
+
{ name: 'testing', title: 'Testing', description: 'Testing Spring Boot applications' },
|
|
423
|
+
{ name: 'configuration', title: 'Configuration', description: 'Configuring Spring Boot applications' },
|
|
424
|
+
];
|
|
425
|
+
return sections
|
|
426
|
+
.filter(section => section.title.toLowerCase().includes(query.toLowerCase()) ||
|
|
427
|
+
section.description.toLowerCase().includes(query.toLowerCase()))
|
|
428
|
+
.slice(0, limit)
|
|
429
|
+
.map(section => ({
|
|
430
|
+
type: 'reference',
|
|
431
|
+
title: section.title,
|
|
432
|
+
url: `${this.baseUrl}/spring-boot/docs/${this.springBootVersion}/reference/html/${section.name}.html`,
|
|
433
|
+
description: section.description,
|
|
434
|
+
section: section.name,
|
|
435
|
+
}));
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Recherche dans la documentation de l'API
|
|
439
|
+
*/
|
|
440
|
+
async searchAPI(query, limit) {
|
|
441
|
+
const apiSections = [
|
|
442
|
+
{ name: 'Configuration Properties', description: 'Spring Boot configuration properties reference' },
|
|
443
|
+
{ name: 'Auto-configuration Classes', description: 'List of auto-configuration classes' },
|
|
444
|
+
{ name: 'Starter Dependencies', description: 'Available Spring Boot starters' },
|
|
445
|
+
{ name: 'Test Utilities', description: 'Testing utilities and annotations' },
|
|
446
|
+
];
|
|
447
|
+
return apiSections
|
|
448
|
+
.filter(section => section.name.toLowerCase().includes(query.toLowerCase()) ||
|
|
449
|
+
section.description.toLowerCase().includes(query.toLowerCase()))
|
|
450
|
+
.slice(0, limit)
|
|
451
|
+
.map(section => ({
|
|
452
|
+
type: 'api',
|
|
453
|
+
title: section.name,
|
|
454
|
+
url: `${this.baseUrl}/spring-boot/docs/${this.springBootVersion}/api/`,
|
|
455
|
+
description: section.description,
|
|
456
|
+
}));
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* Nettoie le HTML pour une meilleure conversion en Markdown
|
|
460
|
+
*/
|
|
461
|
+
cleanHtml($, content) {
|
|
462
|
+
// Supprime les éléments indésirables
|
|
463
|
+
content.find('script, style, nav, .sidebar, .toc, .feedback').remove();
|
|
464
|
+
// Nettoie les classes CSS
|
|
465
|
+
content.find('*').each((index, element) => {
|
|
466
|
+
$(element).removeAttr('class').removeAttr('style').removeAttr('id');
|
|
467
|
+
});
|
|
468
|
+
}
|
|
469
|
+
/**
|
|
470
|
+
* Base de connaissances des concepts Spring Boot
|
|
471
|
+
*/
|
|
472
|
+
getSpringBootConcepts() {
|
|
473
|
+
return {
|
|
474
|
+
core: [
|
|
475
|
+
{
|
|
476
|
+
name: 'Auto-configuration',
|
|
477
|
+
description: 'Mécanisme qui configure automatiquement Spring Boot basé sur les dépendances présentes',
|
|
478
|
+
keywords: ['auto-configuration', '@EnableAutoConfiguration', 'conditional'],
|
|
479
|
+
examples: ['@SpringBootApplication', '@Conditional', 'spring.factories'],
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
name: 'Profiles',
|
|
483
|
+
description: 'Permet de séparer les parties de la configuration d\'application pour différents environnements',
|
|
484
|
+
keywords: ['profiles', '@Profile', 'application.properties'],
|
|
485
|
+
examples: ['application-dev.properties', '@Profile("prod")', 'spring.profiles.active'],
|
|
486
|
+
},
|
|
487
|
+
{
|
|
488
|
+
name: 'Properties',
|
|
489
|
+
description: 'Système de configuration externalisée de Spring Boot',
|
|
490
|
+
keywords: ['properties', '@ConfigurationProperties', '@Value'],
|
|
491
|
+
examples: ['application.yml', '@ConfigurationProperties', 'Environment'],
|
|
492
|
+
},
|
|
493
|
+
],
|
|
494
|
+
web: [
|
|
495
|
+
{
|
|
496
|
+
name: 'Spring MVC',
|
|
497
|
+
description: 'Framework web intégré pour construire des applications web et des API REST',
|
|
498
|
+
keywords: ['mvc', '@Controller', '@RestController', 'web'],
|
|
499
|
+
examples: ['@GetMapping', '@PostMapping', '@RequestMapping'],
|
|
500
|
+
},
|
|
501
|
+
{
|
|
502
|
+
name: 'Embedded Server',
|
|
503
|
+
description: 'Serveur web intégré (Tomcat, Jetty, Undertow) pour déployer des applications standalone',
|
|
504
|
+
keywords: ['embedded', 'tomcat', 'jetty', 'server'],
|
|
505
|
+
examples: ['server.port', 'TomcatServletWebServerFactory'],
|
|
506
|
+
},
|
|
507
|
+
],
|
|
508
|
+
data: [
|
|
509
|
+
{
|
|
510
|
+
name: 'Spring Data JPA',
|
|
511
|
+
description: 'Simplifie l\'accès aux données avec JPA/Hibernate',
|
|
512
|
+
keywords: ['jpa', 'hibernate', '@Entity', '@Repository'],
|
|
513
|
+
examples: ['JpaRepository', '@Query', '@Transactional'],
|
|
514
|
+
},
|
|
515
|
+
{
|
|
516
|
+
name: 'Database Migration',
|
|
517
|
+
description: 'Gestion des évolutions de schéma de base de données',
|
|
518
|
+
keywords: ['flyway', 'liquibase', 'migration', 'schema'],
|
|
519
|
+
examples: ['db/migration', 'V1__Initial_schema.sql'],
|
|
520
|
+
},
|
|
521
|
+
],
|
|
522
|
+
security: [
|
|
523
|
+
{
|
|
524
|
+
name: 'Spring Security',
|
|
525
|
+
description: 'Framework de sécurité pour l\'authentification et l\'autorisation',
|
|
526
|
+
keywords: ['security', 'authentication', 'authorization', '@Secured'],
|
|
527
|
+
examples: ['SecurityConfig', '@PreAuthorize', 'HttpSecurity'],
|
|
528
|
+
},
|
|
529
|
+
],
|
|
530
|
+
testing: [
|
|
531
|
+
{
|
|
532
|
+
name: 'Test Slices',
|
|
533
|
+
description: 'Tests d\'intégration focalisés sur des couches spécifiques',
|
|
534
|
+
keywords: ['test', '@WebMvcTest', '@DataJpaTest', 'slice'],
|
|
535
|
+
examples: ['@SpringBootTest', '@TestConfiguration', 'TestRestTemplate'],
|
|
536
|
+
},
|
|
537
|
+
],
|
|
538
|
+
production: [
|
|
539
|
+
{
|
|
540
|
+
name: 'Actuator',
|
|
541
|
+
description: 'Fonctionnalités de monitoring et gestion pour les applications en production',
|
|
542
|
+
keywords: ['actuator', 'monitoring', 'health', 'metrics'],
|
|
543
|
+
examples: ['/actuator/health', '/actuator/metrics', 'HealthIndicator'],
|
|
544
|
+
},
|
|
545
|
+
],
|
|
546
|
+
};
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
//# sourceMappingURL=springboot-docs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"springboot-docs.js","sourceRoot":"","sources":["../../src/services/springboot-docs.ts"],"names":[],"mappings":"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"}
|