whatsapp-docs-mcp 1.0.0 → 1.0.2
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/dist/prompts.test.d.ts +2 -0
- package/dist/prompts.test.d.ts.map +1 -0
- package/dist/prompts.test.js +228 -0
- package/dist/prompts.test.js.map +1 -0
- package/dist/resources.test.d.ts +2 -0
- package/dist/resources.test.d.ts.map +1 -0
- package/dist/resources.test.js +104 -0
- package/dist/resources.test.js.map +1 -0
- package/dist/tools.d.ts +37 -0
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +10 -3
- package/dist/tools.js.map +1 -1
- package/dist/tools.test.d.ts +2 -0
- package/dist/tools.test.d.ts.map +1 -0
- package/dist/tools.test.js +262 -0
- package/dist/tools.test.js.map +1 -0
- package/dist/utils/fileLoader.test.d.ts +2 -0
- package/dist/utils/fileLoader.test.d.ts.map +1 -0
- package/dist/utils/fileLoader.test.js +147 -0
- package/dist/utils/fileLoader.test.js.map +1 -0
- package/dist/utils/search.d.ts +9 -4
- package/dist/utils/search.d.ts.map +1 -1
- package/dist/utils/search.js +74 -17
- package/dist/utils/search.js.map +1 -1
- package/dist/utils/search.test.d.ts +2 -0
- package/dist/utils/search.test.d.ts.map +1 -0
- package/dist/utils/search.test.js +126 -0
- package/dist/utils/search.test.js.map +1 -0
- package/package.json +9 -3
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const vitest_1 = require("vitest");
|
|
37
|
+
const tools_1 = require("./tools");
|
|
38
|
+
const fileLoader_1 = require("./utils/fileLoader");
|
|
39
|
+
const fs = __importStar(require("fs"));
|
|
40
|
+
// Mock do fs também
|
|
41
|
+
vitest_1.vi.mock('fs', async () => {
|
|
42
|
+
const actual = await vitest_1.vi.importActual('fs');
|
|
43
|
+
return {
|
|
44
|
+
...actual,
|
|
45
|
+
default: {
|
|
46
|
+
...actual,
|
|
47
|
+
existsSync: vitest_1.vi.fn(),
|
|
48
|
+
},
|
|
49
|
+
existsSync: vitest_1.vi.fn(),
|
|
50
|
+
};
|
|
51
|
+
});
|
|
52
|
+
// Mock do fileLoader
|
|
53
|
+
vitest_1.vi.mock('./utils/fileLoader', async () => {
|
|
54
|
+
const actual = await vitest_1.vi.importActual('./utils/fileLoader');
|
|
55
|
+
return {
|
|
56
|
+
...actual,
|
|
57
|
+
getDocsPath: vitest_1.vi.fn(() => '/mock/docs'),
|
|
58
|
+
findAllMarkdownFiles: vitest_1.vi.fn(() => [
|
|
59
|
+
'/mock/docs/mensagens/tipos_de_mensagens/audio_messages.md',
|
|
60
|
+
'/mock/docs/mensagens/tipos_de_mensagens/text_messages.md',
|
|
61
|
+
'/mock/docs/referencia/midias/media_upload_api.md',
|
|
62
|
+
]),
|
|
63
|
+
loadMarkdownFile: vitest_1.vi.fn((filePath) => {
|
|
64
|
+
const mockFiles = {
|
|
65
|
+
'/mock/docs/mensagens/tipos_de_mensagens/audio_messages.md': `# Mensagens de áudio
|
|
66
|
+
|
|
67
|
+
É possível usar a API para enviar mensagens de voz e mensagens de áudio básicas.
|
|
68
|
+
As mensagens de áudio são suportadas pela API.`,
|
|
69
|
+
'/mock/docs/mensagens/tipos_de_mensagens/text_messages.md': `# Mensagens de texto
|
|
70
|
+
|
|
71
|
+
Os SMS contêm somente um corpo de texto e uma prévia de link opcional.`,
|
|
72
|
+
'/mock/docs/referencia/midias/media_upload_api.md': `# API de Upload de Mídia
|
|
73
|
+
|
|
74
|
+
Envie arquivos de mídia (imagens, vídeos, áudio, documentos) para o WhatsApp.`,
|
|
75
|
+
};
|
|
76
|
+
return mockFiles[filePath] || '';
|
|
77
|
+
}),
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
(0, vitest_1.describe)('searchDocumentation', () => {
|
|
81
|
+
(0, vitest_1.beforeEach)(() => {
|
|
82
|
+
vitest_1.vi.clearAllMocks();
|
|
83
|
+
});
|
|
84
|
+
(0, vitest_1.it)('deve encontrar documentos por nome de arquivo', async () => {
|
|
85
|
+
const results = await (0, tools_1.searchDocumentation)('audio');
|
|
86
|
+
(0, vitest_1.expect)(results.length).toBeGreaterThan(0);
|
|
87
|
+
const audioResult = results.find(r => r.path.includes('audio'));
|
|
88
|
+
(0, vitest_1.expect)(audioResult).toBeDefined();
|
|
89
|
+
(0, vitest_1.expect)(audioResult?.relevance).toBeGreaterThan(50); // Alta relevância por nome
|
|
90
|
+
});
|
|
91
|
+
(0, vitest_1.it)('deve encontrar documentos por conteúdo', async () => {
|
|
92
|
+
const results = await (0, tools_1.searchDocumentation)('mensagens');
|
|
93
|
+
(0, vitest_1.expect)(results.length).toBeGreaterThan(0);
|
|
94
|
+
// Deve encontrar tanto audio quanto text messages
|
|
95
|
+
const paths = results.map(r => r.path);
|
|
96
|
+
(0, vitest_1.expect)(paths.some(p => p.includes('audio'))).toBe(true);
|
|
97
|
+
(0, vitest_1.expect)(paths.some(p => p.includes('text'))).toBe(true);
|
|
98
|
+
});
|
|
99
|
+
(0, vitest_1.it)('deve encontrar documentos com busca normalizada (áudio/audio)', async () => {
|
|
100
|
+
const resultsAudio = await (0, tools_1.searchDocumentation)('audio');
|
|
101
|
+
const resultsAcento = await (0, tools_1.searchDocumentation)('áudio');
|
|
102
|
+
// Ambos devem encontrar resultados
|
|
103
|
+
(0, vitest_1.expect)(resultsAudio.length).toBeGreaterThan(0);
|
|
104
|
+
(0, vitest_1.expect)(resultsAcento.length).toBeGreaterThan(0);
|
|
105
|
+
const pathsAudio = resultsAudio.map(r => r.path);
|
|
106
|
+
const pathsAcento = resultsAcento.map(r => r.path);
|
|
107
|
+
// Deve encontrar arquivos similares
|
|
108
|
+
(0, vitest_1.expect)(pathsAudio.some(p => p.includes('audio'))).toBe(true);
|
|
109
|
+
(0, vitest_1.expect)(pathsAcento.some(p => p.includes('audio'))).toBe(true);
|
|
110
|
+
});
|
|
111
|
+
(0, vitest_1.it)('deve encontrar documentos com múltiplas palavras', async () => {
|
|
112
|
+
const results = await (0, tools_1.searchDocumentation)('audio message');
|
|
113
|
+
(0, vitest_1.expect)(results.length).toBeGreaterThan(0);
|
|
114
|
+
const audioResult = results.find(r => r.path.includes('audio'));
|
|
115
|
+
(0, vitest_1.expect)(audioResult).toBeDefined();
|
|
116
|
+
});
|
|
117
|
+
(0, vitest_1.it)('deve filtrar por seção quando especificado', async () => {
|
|
118
|
+
const results = await (0, tools_1.searchDocumentation)('mensagens', 'mensagens');
|
|
119
|
+
(0, vitest_1.expect)(results.length).toBeGreaterThan(0);
|
|
120
|
+
// Todos os resultados devem estar na seção mensagens
|
|
121
|
+
results.forEach(result => {
|
|
122
|
+
(0, vitest_1.expect)(result.path).toContain('mensagens');
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
(0, vitest_1.it)('deve ordenar resultados por relevância', async () => {
|
|
126
|
+
const results = await (0, tools_1.searchDocumentation)('audio');
|
|
127
|
+
(0, vitest_1.expect)(results.length).toBeGreaterThan(0);
|
|
128
|
+
// Primeiro resultado deve ter maior relevância
|
|
129
|
+
for (let i = 1; i < results.length; i++) {
|
|
130
|
+
(0, vitest_1.expect)(results[i - 1].relevance).toBeGreaterThanOrEqual(results[i].relevance);
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
(0, vitest_1.it)('deve limitar resultados a 20', async () => {
|
|
134
|
+
// Mock com muitos arquivos
|
|
135
|
+
const manyFiles = Array.from({ length: 30 }, (_, i) => `/mock/docs/test/file${i}.md`);
|
|
136
|
+
vitest_1.vi.mocked(fileLoader_1.findAllMarkdownFiles).mockReturnValueOnce(manyFiles);
|
|
137
|
+
vitest_1.vi.mocked(fileLoader_1.loadMarkdownFile).mockImplementation(() => 'conteúdo de teste com audio');
|
|
138
|
+
const results = await (0, tools_1.searchDocumentation)('audio');
|
|
139
|
+
(0, vitest_1.expect)(results.length).toBeLessThanOrEqual(20);
|
|
140
|
+
});
|
|
141
|
+
(0, vitest_1.it)('deve retornar array vazio quando não encontra nada', async () => {
|
|
142
|
+
vitest_1.vi.mocked(fileLoader_1.loadMarkdownFile).mockImplementation(() => 'conteúdo completamente diferente sem relação');
|
|
143
|
+
const results = await (0, tools_1.searchDocumentation)('xyzabc123nenhummatch');
|
|
144
|
+
(0, vitest_1.expect)(results.length).toBe(0);
|
|
145
|
+
});
|
|
146
|
+
(0, vitest_1.it)('deve incluir título e excerpt nos resultados', async () => {
|
|
147
|
+
const results = await (0, tools_1.searchDocumentation)('audio');
|
|
148
|
+
(0, vitest_1.expect)(results.length).toBeGreaterThan(0);
|
|
149
|
+
const firstResult = results[0];
|
|
150
|
+
(0, vitest_1.expect)(firstResult.title).toBeDefined();
|
|
151
|
+
(0, vitest_1.expect)(firstResult.excerpt).toBeDefined();
|
|
152
|
+
(0, vitest_1.expect)(firstResult.path).toBeDefined();
|
|
153
|
+
(0, vitest_1.expect)(firstResult.relevance).toBeGreaterThanOrEqual(0);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
(0, vitest_1.describe)('getDocumentByPath', () => {
|
|
157
|
+
(0, vitest_1.beforeEach)(() => {
|
|
158
|
+
vitest_1.vi.clearAllMocks();
|
|
159
|
+
});
|
|
160
|
+
(0, vitest_1.it)('deve retornar conteúdo do documento', async () => {
|
|
161
|
+
const { getDocumentByPath } = await Promise.resolve().then(() => __importStar(require('./tools')));
|
|
162
|
+
const mockContent = '# Título\n\nConteúdo de teste';
|
|
163
|
+
vitest_1.vi.mocked(fileLoader_1.loadMarkdownFile).mockReturnValueOnce(mockContent);
|
|
164
|
+
const content = await getDocumentByPath('mensagens/tipos_de_mensagens/audio_messages.md');
|
|
165
|
+
// Verifica comportamento: retorna conteúdo carregado
|
|
166
|
+
(0, vitest_1.expect)(content).toBe(mockContent);
|
|
167
|
+
(0, vitest_1.expect)(content.length).toBeGreaterThan(0);
|
|
168
|
+
});
|
|
169
|
+
(0, vitest_1.it)('deve lançar erro para caminho inválido', async () => {
|
|
170
|
+
const { getDocumentByPath } = await Promise.resolve().then(() => __importStar(require('./tools')));
|
|
171
|
+
await (0, vitest_1.expect)(getDocumentByPath('../../../etc/passwd')).rejects.toThrow('Invalid path');
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
(0, vitest_1.describe)('listDocumentationSections', () => {
|
|
175
|
+
(0, vitest_1.it)('deve listar todas as seções', async () => {
|
|
176
|
+
const { listDocumentationSections } = await Promise.resolve().then(() => __importStar(require('./tools')));
|
|
177
|
+
const sections = await listDocumentationSections();
|
|
178
|
+
(0, vitest_1.expect)(sections.sections).toBeDefined();
|
|
179
|
+
(0, vitest_1.expect)(Array.isArray(sections.sections)).toBe(true);
|
|
180
|
+
});
|
|
181
|
+
(0, vitest_1.it)('deve filtrar por seção quando especificado', async () => {
|
|
182
|
+
const { listDocumentationSections } = await Promise.resolve().then(() => __importStar(require('./tools')));
|
|
183
|
+
const sections = await listDocumentationSections('mensagens');
|
|
184
|
+
sections.sections.forEach(section => {
|
|
185
|
+
(0, vitest_1.expect)(section.name).toContain('mensagens');
|
|
186
|
+
});
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
(0, vitest_1.describe)('getEndpointReference', () => {
|
|
190
|
+
(0, vitest_1.beforeEach)(() => {
|
|
191
|
+
vitest_1.vi.clearAllMocks();
|
|
192
|
+
vitest_1.vi.mocked(fileLoader_1.getDocsPath).mockReturnValue('/mock/docs');
|
|
193
|
+
});
|
|
194
|
+
(0, vitest_1.it)('deve encontrar referência de endpoint', async () => {
|
|
195
|
+
const { getEndpointReference } = await Promise.resolve().then(() => __importStar(require('./tools')));
|
|
196
|
+
const mockContent = '# API Reference\n\nPOST /media';
|
|
197
|
+
vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
198
|
+
vitest_1.vi.mocked(fileLoader_1.findAllMarkdownFiles).mockReturnValue([
|
|
199
|
+
'/mock/docs/referencia/midias/media_api.md',
|
|
200
|
+
]);
|
|
201
|
+
vitest_1.vi.mocked(fileLoader_1.loadMarkdownFile).mockReturnValue(mockContent);
|
|
202
|
+
const content = await getEndpointReference('/media');
|
|
203
|
+
// Verifica comportamento: retorna conteúdo encontrado
|
|
204
|
+
(0, vitest_1.expect)(content).toBe(mockContent);
|
|
205
|
+
(0, vitest_1.expect)(content.length).toBeGreaterThan(0);
|
|
206
|
+
});
|
|
207
|
+
(0, vitest_1.it)('deve lançar erro quando endpoint não encontrado', async () => {
|
|
208
|
+
const { getEndpointReference } = await Promise.resolve().then(() => __importStar(require('./tools')));
|
|
209
|
+
vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
210
|
+
vitest_1.vi.mocked(fileLoader_1.findAllMarkdownFiles).mockReturnValue([]);
|
|
211
|
+
await (0, vitest_1.expect)(getEndpointReference('/nonexistent')).rejects.toThrow('Endpoint reference not found');
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
(0, vitest_1.describe)('getErrorCodeInfo', () => {
|
|
215
|
+
(0, vitest_1.beforeEach)(() => {
|
|
216
|
+
vitest_1.vi.clearAllMocks();
|
|
217
|
+
vitest_1.vi.mocked(fileLoader_1.getDocsPath).mockReturnValue('/mock/docs');
|
|
218
|
+
});
|
|
219
|
+
(0, vitest_1.it)('deve retornar informações de código de erro', async () => {
|
|
220
|
+
const { getErrorCodeInfo } = await Promise.resolve().then(() => __importStar(require('./tools')));
|
|
221
|
+
vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
222
|
+
vitest_1.vi.mocked(fileLoader_1.loadMarkdownFile).mockReturnValue('100 - Rate limit exceeded\n200 - Invalid token');
|
|
223
|
+
const info = await getErrorCodeInfo(100);
|
|
224
|
+
(0, vitest_1.expect)(info.code).toBe(100);
|
|
225
|
+
(0, vitest_1.expect)(info.message).toBeDefined();
|
|
226
|
+
(0, vitest_1.expect)(info.relatedDocs).toContain('suporte/error_codes.md');
|
|
227
|
+
});
|
|
228
|
+
(0, vitest_1.it)('deve lançar erro quando código não encontrado', async () => {
|
|
229
|
+
const { getErrorCodeInfo } = await Promise.resolve().then(() => __importStar(require('./tools')));
|
|
230
|
+
vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
231
|
+
vitest_1.vi.mocked(fileLoader_1.loadMarkdownFile).mockReturnValue('100 - Rate limit exceeded');
|
|
232
|
+
await (0, vitest_1.expect)(getErrorCodeInfo(999)).rejects.toThrow('Error code 999 not found');
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
(0, vitest_1.describe)('getQuickReference', () => {
|
|
236
|
+
(0, vitest_1.beforeEach)(() => {
|
|
237
|
+
vitest_1.vi.clearAllMocks();
|
|
238
|
+
vitest_1.vi.mocked(fileLoader_1.getDocsPath).mockReturnValue('/mock/docs');
|
|
239
|
+
});
|
|
240
|
+
(0, vitest_1.it)('deve retornar referência rápida quando arquivo existe', async () => {
|
|
241
|
+
const { getQuickReference } = await Promise.resolve().then(() => __importStar(require('./tools')));
|
|
242
|
+
const mockContent = '## Operação\n\nDescrição da operação';
|
|
243
|
+
vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
244
|
+
vitest_1.vi.mocked(fileLoader_1.loadMarkdownFile).mockReturnValue(mockContent);
|
|
245
|
+
const content = await getQuickReference('send_message');
|
|
246
|
+
// Verifica comportamento: retorna conteúdo válido
|
|
247
|
+
(0, vitest_1.expect)(content).toBeDefined();
|
|
248
|
+
(0, vitest_1.expect)(typeof content).toBe('string');
|
|
249
|
+
(0, vitest_1.expect)(content.length).toBeGreaterThan(0);
|
|
250
|
+
});
|
|
251
|
+
(0, vitest_1.it)('deve fazer fallback para busca quando arquivo não existe', async () => {
|
|
252
|
+
const { getQuickReference } = await Promise.resolve().then(() => __importStar(require('./tools')));
|
|
253
|
+
vitest_1.vi.mocked(fs.existsSync).mockReturnValue(false);
|
|
254
|
+
vitest_1.vi.mocked(fileLoader_1.findAllMarkdownFiles).mockReturnValue([
|
|
255
|
+
'/mock/docs/mensagens/tipos_de_mensagens/audio_messages.md',
|
|
256
|
+
]);
|
|
257
|
+
vitest_1.vi.mocked(fileLoader_1.loadMarkdownFile).mockReturnValue('# Mensagens de áudio');
|
|
258
|
+
const content = await getQuickReference('audio');
|
|
259
|
+
(0, vitest_1.expect)(content).toBeDefined();
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
//# sourceMappingURL=tools.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tools.test.js","sourceRoot":"","sources":["../src/tools.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileLoader.test.d.ts","sourceRoot":"","sources":["../../src/utils/fileLoader.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const vitest_1 = require("vitest");
|
|
37
|
+
const fs = __importStar(require("fs"));
|
|
38
|
+
const fileLoader_1 = require("./fileLoader");
|
|
39
|
+
// Mock do fs
|
|
40
|
+
vitest_1.vi.mock('fs', () => {
|
|
41
|
+
return {
|
|
42
|
+
default: {
|
|
43
|
+
readFileSync: vitest_1.vi.fn(),
|
|
44
|
+
readdirSync: vitest_1.vi.fn(),
|
|
45
|
+
statSync: vitest_1.vi.fn(),
|
|
46
|
+
existsSync: vitest_1.vi.fn(),
|
|
47
|
+
},
|
|
48
|
+
readFileSync: vitest_1.vi.fn(),
|
|
49
|
+
readdirSync: vitest_1.vi.fn(),
|
|
50
|
+
statSync: vitest_1.vi.fn(),
|
|
51
|
+
existsSync: vitest_1.vi.fn(),
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
(0, vitest_1.describe)('loadMarkdownFile', () => {
|
|
55
|
+
(0, vitest_1.beforeEach)(() => {
|
|
56
|
+
vitest_1.vi.clearAllMocks();
|
|
57
|
+
});
|
|
58
|
+
(0, vitest_1.it)('deve carregar conteúdo de arquivo markdown', () => {
|
|
59
|
+
const mockContent = '# Título\n\nConteúdo do arquivo';
|
|
60
|
+
vitest_1.vi.mocked(fs.readFileSync).mockReturnValue(mockContent);
|
|
61
|
+
const result = (0, fileLoader_1.loadMarkdownFile)('/path/to/file.md');
|
|
62
|
+
(0, vitest_1.expect)(result).toBe(mockContent);
|
|
63
|
+
(0, vitest_1.expect)(fs.readFileSync).toHaveBeenCalledWith('/path/to/file.md', 'utf-8');
|
|
64
|
+
});
|
|
65
|
+
(0, vitest_1.it)('deve lançar erro quando arquivo não existe', () => {
|
|
66
|
+
vitest_1.vi.mocked(fs.readFileSync).mockImplementation(() => {
|
|
67
|
+
throw new Error('ENOENT: no such file or directory');
|
|
68
|
+
});
|
|
69
|
+
(0, vitest_1.expect)(() => {
|
|
70
|
+
(0, fileLoader_1.loadMarkdownFile)('/path/to/nonexistent.md');
|
|
71
|
+
}).toThrow('Failed to load file');
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
(0, vitest_1.describe)('findAllMarkdownFiles', () => {
|
|
75
|
+
(0, vitest_1.beforeEach)(() => {
|
|
76
|
+
vitest_1.vi.clearAllMocks();
|
|
77
|
+
});
|
|
78
|
+
(0, vitest_1.it)('deve encontrar todos os arquivos .md recursivamente', () => {
|
|
79
|
+
const calls = [];
|
|
80
|
+
vitest_1.vi.mocked(fs.readdirSync).mockImplementation(((dir) => {
|
|
81
|
+
const dirStr = String(dir);
|
|
82
|
+
calls.push(dirStr);
|
|
83
|
+
if (dirStr === '/docs') {
|
|
84
|
+
return ['file1.md', 'subdir', 'file2.md'];
|
|
85
|
+
}
|
|
86
|
+
if (dirStr === '/docs/subdir') {
|
|
87
|
+
return ['file3.md'];
|
|
88
|
+
}
|
|
89
|
+
return [];
|
|
90
|
+
}));
|
|
91
|
+
vitest_1.vi.mocked(fs.statSync).mockImplementation(((filePath) => {
|
|
92
|
+
const filePathStr = String(filePath);
|
|
93
|
+
const isDir = filePathStr.includes('subdir') && !filePathStr.endsWith('.md');
|
|
94
|
+
return {
|
|
95
|
+
isDirectory: () => isDir,
|
|
96
|
+
};
|
|
97
|
+
}));
|
|
98
|
+
const result = (0, fileLoader_1.findAllMarkdownFiles)('/docs');
|
|
99
|
+
(0, vitest_1.expect)(result).toContain('/docs/file1.md');
|
|
100
|
+
(0, vitest_1.expect)(result).toContain('/docs/file2.md');
|
|
101
|
+
// Verifica que subdir foi processado
|
|
102
|
+
(0, vitest_1.expect)(calls).toContain('/docs/subdir');
|
|
103
|
+
});
|
|
104
|
+
(0, vitest_1.it)('deve ignorar arquivos que não são .md', () => {
|
|
105
|
+
vitest_1.vi.mocked(fs.readdirSync).mockReturnValue(['file1.md', 'file2.txt', 'file3.js']);
|
|
106
|
+
vitest_1.vi.mocked(fs.statSync).mockReturnValue({
|
|
107
|
+
isDirectory: () => false,
|
|
108
|
+
});
|
|
109
|
+
const result = (0, fileLoader_1.findAllMarkdownFiles)('/docs');
|
|
110
|
+
(0, vitest_1.expect)(result).toContain('/docs/file1.md');
|
|
111
|
+
(0, vitest_1.expect)(result).not.toContain('/docs/file2.txt');
|
|
112
|
+
(0, vitest_1.expect)(result).not.toContain('/docs/file3.js');
|
|
113
|
+
});
|
|
114
|
+
(0, vitest_1.it)('deve retornar array vazio para diretório vazio', () => {
|
|
115
|
+
vitest_1.vi.mocked(fs.readdirSync).mockReturnValue([]);
|
|
116
|
+
const result = (0, fileLoader_1.findAllMarkdownFiles)('/empty');
|
|
117
|
+
(0, vitest_1.expect)(result).toEqual([]);
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
(0, vitest_1.describe)('getDocsPath', () => {
|
|
121
|
+
(0, vitest_1.beforeEach)(() => {
|
|
122
|
+
vitest_1.vi.clearAllMocks();
|
|
123
|
+
});
|
|
124
|
+
(0, vitest_1.it)('deve encontrar docs/ no caminho esperado', () => {
|
|
125
|
+
// getDocsPath usa require('fs') internamente, então testamos apenas que retorna um caminho válido
|
|
126
|
+
const result = (0, fileLoader_1.getDocsPath)();
|
|
127
|
+
(0, vitest_1.expect)(result).toBeDefined();
|
|
128
|
+
(0, vitest_1.expect)(typeof result).toBe('string');
|
|
129
|
+
(0, vitest_1.expect)(result.length).toBeGreaterThan(0);
|
|
130
|
+
});
|
|
131
|
+
(0, vitest_1.it)('deve retornar caminho válido mesmo quando validação falha', () => {
|
|
132
|
+
const result = (0, fileLoader_1.getDocsPath)();
|
|
133
|
+
(0, vitest_1.expect)(result).toBeDefined();
|
|
134
|
+
(0, vitest_1.expect)(typeof result).toBe('string');
|
|
135
|
+
});
|
|
136
|
+
(0, vitest_1.it)('deve validar que docs/ contém arquivos markdown', () => {
|
|
137
|
+
vitest_1.vi.mocked(fs.existsSync).mockReturnValue(true);
|
|
138
|
+
vitest_1.vi.mocked(fs.readdirSync).mockReturnValue(['file.txt', 'subdir']); // Sem .md
|
|
139
|
+
vitest_1.vi.mocked(fs.statSync).mockReturnValue({
|
|
140
|
+
isDirectory: () => true,
|
|
141
|
+
});
|
|
142
|
+
const result = (0, fileLoader_1.getDocsPath)();
|
|
143
|
+
// Deve tentar fallbacks ou retornar caminho esperado mesmo sem validação
|
|
144
|
+
(0, vitest_1.expect)(result).toBeDefined();
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
//# sourceMappingURL=fileLoader.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileLoader.test.js","sourceRoot":"","sources":["../../src/utils/fileLoader.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mCAA8D;AAC9D,uCAAyB;AAEzB,6CAIsB;AAEtB,aAAa;AACb,WAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE;IACjB,OAAO;QACL,OAAO,EAAE;YACP,YAAY,EAAE,WAAE,CAAC,EAAE,EAAE;YACrB,WAAW,EAAE,WAAE,CAAC,EAAE,EAAE;YACpB,QAAQ,EAAE,WAAE,CAAC,EAAE,EAAE;YACjB,UAAU,EAAE,WAAE,CAAC,EAAE,EAAE;SACpB;QACD,YAAY,EAAE,WAAE,CAAC,EAAE,EAAE;QACrB,WAAW,EAAE,WAAE,CAAC,EAAE,EAAE;QACpB,QAAQ,EAAE,WAAE,CAAC,EAAE,EAAE;QACjB,UAAU,EAAE,WAAE,CAAC,EAAE,EAAE;KACpB,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,WAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,WAAW,GAAG,iCAAiC,CAAC;QACtD,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;QAExD,MAAM,MAAM,GAAG,IAAA,6BAAgB,EAAC,kBAAkB,CAAC,CAAC;QAEpD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,IAAA,eAAM,EAAC,EAAE,CAAC,YAAY,CAAC,CAAC,oBAAoB,CAAC,kBAAkB,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE;YACjD,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,IAAA,eAAM,EAAC,GAAG,EAAE;YACV,IAAA,6BAAgB,EAAC,yBAAyB,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,WAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,GAAgB,EAAE,EAAE;YACjE,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3B,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACnB,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,OAAO,CAAC,UAAU,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,MAAM,KAAK,cAAc,EAAE,CAAC;gBAC9B,OAAO,CAAC,UAAU,CAAC,CAAC;YACtB,CAAC;YACD,OAAO,EAAE,CAAC;QACZ,CAAC,CAAQ,CAAC,CAAC;QAEX,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,QAAqB,EAAE,EAAE;YACnE,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;YACrC,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC7E,OAAO;gBACL,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;aACb,CAAC;QAChB,CAAC,CAAQ,CAAC,CAAC;QAEX,MAAM,MAAM,GAAG,IAAA,iCAAoB,EAAC,OAAO,CAAC,CAAC;QAE7C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC3C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC3C,qCAAqC;QACrC,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,CAAQ,CAAC,CAAC;QACxF,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC;YACrC,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK;SACb,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,IAAA,iCAAoB,EAAC,OAAO,CAAC,CAAC;QAE7C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC3C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAChD,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gDAAgD,EAAE,GAAG,EAAE;QACxD,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,EAAS,CAAC,CAAC;QAErD,MAAM,MAAM,GAAG,IAAA,iCAAoB,EAAC,QAAQ,CAAC,CAAC;QAE9C,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAA,iBAAQ,EAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAA,mBAAU,EAAC,GAAG,EAAE;QACd,WAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,kGAAkG;QAClG,MAAM,MAAM,GAAG,IAAA,wBAAW,GAAE,CAAC;QAE7B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,IAAA,eAAM,EAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAA,eAAM,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,MAAM,GAAG,IAAA,wBAAW,GAAE,CAAC;QAE7B,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;QAC7B,IAAA,eAAM,EAAC,OAAO,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAC/C,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,eAAe,CAAC,CAAC,UAAU,EAAE,QAAQ,CAAQ,CAAC,CAAC,CAAC,UAAU;QACpF,WAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,eAAe,CAAC;YACrC,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI;SACZ,CAAC,CAAC;QAEf,MAAM,MAAM,GAAG,IAAA,wBAAW,GAAE,CAAC;QAE7B,yEAAyE;QACzE,IAAA,eAAM,EAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/utils/search.d.ts
CHANGED
|
@@ -5,9 +5,14 @@ export interface SearchResult {
|
|
|
5
5
|
relevance: number;
|
|
6
6
|
}
|
|
7
7
|
/**
|
|
8
|
-
*
|
|
8
|
+
* Normaliza texto removendo acentos e convertendo para minúsculas
|
|
9
9
|
*/
|
|
10
|
-
export declare function
|
|
10
|
+
export declare function normalizeText(text: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Busca textual melhorada em conteúdo markdown
|
|
13
|
+
* Busca por palavras individuais e considera nome do arquivo
|
|
14
|
+
*/
|
|
15
|
+
export declare function searchInContent(content: string, query: string, filePath?: string): boolean;
|
|
11
16
|
/**
|
|
12
17
|
* Extrai título do arquivo markdown (primeiro # ou nome do arquivo)
|
|
13
18
|
*/
|
|
@@ -21,7 +26,7 @@ export declare function extractDescription(content: string, maxLength?: number):
|
|
|
21
26
|
*/
|
|
22
27
|
export declare function extractExcerpt(content: string, query: string, contextLines?: number): string;
|
|
23
28
|
/**
|
|
24
|
-
* Calcula relevância
|
|
29
|
+
* Calcula relevância melhorada baseada em ocorrências, nome do arquivo e título
|
|
25
30
|
*/
|
|
26
|
-
export declare function calculateRelevance(content: string, query: string): number;
|
|
31
|
+
export declare function calculateRelevance(content: string, query: string, filePath?: string): number;
|
|
27
32
|
//# sourceMappingURL=search.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/utils/search.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/utils/search.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAwB1F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAgBtE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,GAAE,MAAY,GAAG,MAAM,CAmBnF;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,GAAE,MAAU,GAAG,MAAM,CA6B/F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CA+C5F"}
|
package/dist/utils/search.js
CHANGED
|
@@ -1,17 +1,39 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizeText = normalizeText;
|
|
3
4
|
exports.searchInContent = searchInContent;
|
|
4
5
|
exports.extractTitle = extractTitle;
|
|
5
6
|
exports.extractDescription = extractDescription;
|
|
6
7
|
exports.extractExcerpt = extractExcerpt;
|
|
7
8
|
exports.calculateRelevance = calculateRelevance;
|
|
8
9
|
/**
|
|
9
|
-
*
|
|
10
|
+
* Normaliza texto removendo acentos e convertendo para minúsculas
|
|
10
11
|
*/
|
|
11
|
-
function
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
function normalizeText(text) {
|
|
13
|
+
return text.normalize('NFD').replace(/[\u0300-\u036f]/g, '').toLowerCase();
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Busca textual melhorada em conteúdo markdown
|
|
17
|
+
* Busca por palavras individuais e considera nome do arquivo
|
|
18
|
+
*/
|
|
19
|
+
function searchInContent(content, query, filePath) {
|
|
20
|
+
const normalizedQuery = normalizeText(query.trim());
|
|
21
|
+
const normalizedContent = normalizeText(content);
|
|
22
|
+
const normalizedFilePath = filePath ? normalizeText(filePath) : '';
|
|
23
|
+
// Busca no nome do arquivo primeiro (maior relevância)
|
|
24
|
+
if (filePath && normalizedFilePath.includes(normalizedQuery)) {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
// Divide query em palavras (filtra palavras muito curtas)
|
|
28
|
+
const queryWords = normalizedQuery.split(/\s+/).filter(w => w.length > 2);
|
|
29
|
+
// Se query tem múltiplas palavras, busca por todas (AND)
|
|
30
|
+
if (queryWords.length > 1) {
|
|
31
|
+
return queryWords.every(word => normalizedContent.includes(word) ||
|
|
32
|
+
normalizedFilePath.includes(word));
|
|
33
|
+
}
|
|
34
|
+
// Busca simples para query de uma palavra
|
|
35
|
+
return normalizedContent.includes(normalizedQuery) ||
|
|
36
|
+
normalizedFilePath.includes(normalizedQuery);
|
|
15
37
|
}
|
|
16
38
|
/**
|
|
17
39
|
* Extrai título do arquivo markdown (primeiro # ou nome do arquivo)
|
|
@@ -56,10 +78,16 @@ function extractDescription(content, maxLength = 200) {
|
|
|
56
78
|
* Extrai trecho relevante ao redor da busca
|
|
57
79
|
*/
|
|
58
80
|
function extractExcerpt(content, query, contextLines = 3) {
|
|
59
|
-
const normalizedQuery = query
|
|
81
|
+
const normalizedQuery = normalizeText(query);
|
|
60
82
|
const lines = content.split('\n');
|
|
83
|
+
// Busca por palavras individuais também
|
|
84
|
+
const queryWords = normalizedQuery.split(/\s+/).filter(w => w.length > 2);
|
|
61
85
|
for (let i = 0; i < lines.length; i++) {
|
|
62
|
-
|
|
86
|
+
const normalizedLine = normalizeText(lines[i]);
|
|
87
|
+
// Verifica se linha contém query completa ou todas as palavras
|
|
88
|
+
const matchesQuery = normalizedLine.includes(normalizedQuery) ||
|
|
89
|
+
(queryWords.length > 0 && queryWords.every(word => normalizedLine.includes(word)));
|
|
90
|
+
if (matchesQuery) {
|
|
63
91
|
const start = Math.max(0, i - contextLines);
|
|
64
92
|
const end = Math.min(lines.length, i + contextLines + 1);
|
|
65
93
|
const excerpt = lines.slice(start, end).join('\n');
|
|
@@ -74,18 +102,47 @@ function extractExcerpt(content, query, contextLines = 3) {
|
|
|
74
102
|
return lines.slice(0, 5).join('\n').substring(0, 300);
|
|
75
103
|
}
|
|
76
104
|
/**
|
|
77
|
-
* Calcula relevância
|
|
105
|
+
* Calcula relevância melhorada baseada em ocorrências, nome do arquivo e título
|
|
78
106
|
*/
|
|
79
|
-
function calculateRelevance(content, query) {
|
|
80
|
-
const normalizedQuery = query
|
|
81
|
-
const normalizedContent = content
|
|
82
|
-
const
|
|
107
|
+
function calculateRelevance(content, query, filePath) {
|
|
108
|
+
const normalizedQuery = normalizeText(query);
|
|
109
|
+
const normalizedContent = normalizeText(content);
|
|
110
|
+
const normalizedFilePath = filePath ? normalizeText(filePath) : '';
|
|
111
|
+
const queryWords = normalizedQuery.split(/\s+/).filter(w => w.length > 2);
|
|
83
112
|
let score = 0;
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
score +=
|
|
113
|
+
// Bônus alto se encontra no nome do arquivo
|
|
114
|
+
if (filePath && normalizedFilePath.includes(normalizedQuery)) {
|
|
115
|
+
score += 50;
|
|
116
|
+
}
|
|
117
|
+
// Bônus se encontra no título (primeiro H1)
|
|
118
|
+
const h1Match = content.match(/^#\s+(.+)$/m);
|
|
119
|
+
if (h1Match) {
|
|
120
|
+
const normalizedTitle = normalizeText(h1Match[1]);
|
|
121
|
+
if (normalizedTitle.includes(normalizedQuery)) {
|
|
122
|
+
score += 30;
|
|
123
|
+
}
|
|
124
|
+
// Bônus adicional se cada palavra da query está no título
|
|
125
|
+
queryWords.forEach(word => {
|
|
126
|
+
if (normalizedTitle.includes(word)) {
|
|
127
|
+
score += 5;
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
// Conta ocorrências de cada palavra no conteúdo
|
|
132
|
+
queryWords.forEach(word => {
|
|
133
|
+
const contentMatches = (normalizedContent.match(new RegExp(word, 'g')) || []).length;
|
|
134
|
+
score += contentMatches * 2;
|
|
135
|
+
// Bônus adicional se palavra está no nome do arquivo
|
|
136
|
+
if (normalizedFilePath.includes(word)) {
|
|
137
|
+
score += 10;
|
|
138
|
+
}
|
|
87
139
|
});
|
|
88
|
-
//
|
|
89
|
-
|
|
140
|
+
// Se query de uma palavra, também conta ocorrências da query completa
|
|
141
|
+
if (queryWords.length === 0 && normalizedQuery.length > 2) {
|
|
142
|
+
const fullMatches = (normalizedContent.match(new RegExp(normalizedQuery, 'g')) || []).length;
|
|
143
|
+
score += fullMatches * 2;
|
|
144
|
+
}
|
|
145
|
+
// Normaliza para 0-100
|
|
146
|
+
return Math.min(100, score);
|
|
90
147
|
}
|
|
91
148
|
//# sourceMappingURL=search.js.map
|
package/dist/utils/search.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/utils/search.ts"],"names":[],"mappings":";;AAYA,
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/utils/search.ts"],"names":[],"mappings":";;AAYA,sCAEC;AAMD,0CAwBC;AAKD,oCAgBC;AAKD,gDAmBC;AAKD,wCA6BC;AAKD,gDA+CC;AAtKD;;GAEG;AACH,SAAgB,aAAa,CAAC,IAAY;IACxC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AAC7E,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,OAAe,EAAE,KAAa,EAAE,QAAiB;IAC/E,MAAM,eAAe,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,MAAM,iBAAiB,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnE,uDAAuD;IACvD,IAAI,QAAQ,IAAI,kBAAkB,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAC7D,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0DAA0D;IAC1D,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE1E,yDAAyD;IACzD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAC7B,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC;YAChC,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAClC,CAAC;IACJ,CAAC;IAED,0CAA0C;IAC1C,OAAO,iBAAiB,CAAC,QAAQ,CAAC,eAAe,CAAC;QAC3C,kBAAkB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;AACtD,CAAC;AAED;;GAEG;AACH,SAAgB,YAAY,CAAC,OAAe,EAAE,QAAgB;IAC5D,qCAAqC;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC7C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,qCAAqC;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC9C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,oCAAoC;IACpC,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC;IACvD,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AAC3E,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,OAAe,EAAE,YAAoB,GAAG;IACzE,wBAAwB;IACxB,MAAM,YAAY,GAAG,OAAO;SACzB,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;SAC9B,OAAO,CAAC,yBAAyB,EAAE,IAAI,CAAC;SACxC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC;SACzB,IAAI,EAAE,CAAC;IAEV,wCAAwC;IACxC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAC/E,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAChC,IAAI,cAAc,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YACtC,OAAO,cAAc,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;QACxD,CAAC;QACD,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AAC/F,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAAC,OAAe,EAAE,KAAa,EAAE,eAAuB,CAAC;IACrF,MAAM,eAAe,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAElC,wCAAwC;IACxC,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE1E,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,cAAc,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAE/C,+DAA+D;QAC/D,MAAM,YAAY,GAAG,cAAc,CAAC,QAAQ,CAAC,eAAe,CAAC;YAC3D,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAErF,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,GAAG,YAAY,GAAG,CAAC,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAEnD,iBAAiB;YACjB,IAAI,OAAO,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;gBACzB,OAAO,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;YAC3C,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAAC,OAAe,EAAE,KAAa,EAAE,QAAiB;IAClF,MAAM,eAAe,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,iBAAiB,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACjD,MAAM,kBAAkB,GAAG,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,MAAM,UAAU,GAAG,eAAe,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE1E,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,4CAA4C;IAC5C,IAAI,QAAQ,IAAI,kBAAkB,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAC7D,KAAK,IAAI,EAAE,CAAC;IACd,CAAC;IAED,4CAA4C;IAC5C,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IAC7C,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,eAAe,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,IAAI,eAAe,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;YAC9C,KAAK,IAAI,EAAE,CAAC;QACd,CAAC;QACD,0DAA0D;QAC1D,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACxB,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBACnC,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gDAAgD;IAChD,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACxB,MAAM,cAAc,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QACrF,KAAK,IAAI,cAAc,GAAG,CAAC,CAAC;QAE5B,qDAAqD;QACrD,IAAI,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,KAAK,IAAI,EAAE,CAAC;QACd,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,sEAAsE;IACtE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,WAAW,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;QAC7F,KAAK,IAAI,WAAW,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,uBAAuB;IACvB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.test.d.ts","sourceRoot":"","sources":["../../src/utils/search.test.ts"],"names":[],"mappings":""}
|