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.
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fileLoader.test.d.ts.map
@@ -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":"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"}
@@ -5,9 +5,14 @@ export interface SearchResult {
5
5
  relevance: number;
6
6
  }
7
7
  /**
8
- * Busca textual simples em conteúdo markdown
8
+ * Normaliza texto removendo acentos e convertendo para minúsculas
9
9
  */
10
- export declare function searchInContent(content: string, query: string): boolean;
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 simples baseada em ocorrências
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,CAKvE;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,CAoB/F;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAczE"}
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"}
@@ -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
- * Busca textual simples em conteúdo markdown
10
+ * Normaliza texto removendo acentos e convertendo para minúsculas
10
11
  */
11
- function searchInContent(content, query) {
12
- const normalizedQuery = query.toLowerCase().trim();
13
- const normalizedContent = content.toLowerCase();
14
- return normalizedContent.includes(normalizedQuery);
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.toLowerCase();
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
- if (lines[i].toLowerCase().includes(normalizedQuery)) {
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 simples baseada em ocorrências
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.toLowerCase();
81
- const normalizedContent = content.toLowerCase();
82
- const words = normalizedQuery.split(/\s+/).filter(w => w.length > 2);
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
- words.forEach(word => {
85
- const occurrences = (normalizedContent.match(new RegExp(word, 'g')) || []).length;
86
- score += occurrences;
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
- // Normaliza para 0-1
89
- return Math.min(1, score / 10);
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
@@ -1 +1 @@
1
- {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/utils/search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/utils/search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=search.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.test.d.ts","sourceRoot":"","sources":["../../src/utils/search.test.ts"],"names":[],"mappings":""}