@justmpm/deps-consult 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +227 -0
  2. package/build/cache/package-cache.d.ts +39 -0
  3. package/build/cache/package-cache.d.ts.map +1 -0
  4. package/build/cache/package-cache.js +90 -0
  5. package/build/cache/package-cache.js.map +1 -0
  6. package/build/extractors/api-extractor.d.ts +6 -0
  7. package/build/extractors/api-extractor.d.ts.map +1 -0
  8. package/build/extractors/api-extractor.js +191 -0
  9. package/build/extractors/api-extractor.js.map +1 -0
  10. package/build/extractors/examples-extractor.d.ts +16 -0
  11. package/build/extractors/examples-extractor.d.ts.map +1 -0
  12. package/build/extractors/examples-extractor.js +224 -0
  13. package/build/extractors/examples-extractor.js.map +1 -0
  14. package/build/extractors/jsdoc-extractor.d.ts +11 -0
  15. package/build/extractors/jsdoc-extractor.d.ts.map +1 -0
  16. package/build/extractors/jsdoc-extractor.js +115 -0
  17. package/build/extractors/jsdoc-extractor.js.map +1 -0
  18. package/build/extractors/readme-extractor.d.ts +6 -0
  19. package/build/extractors/readme-extractor.d.ts.map +1 -0
  20. package/build/extractors/readme-extractor.js +138 -0
  21. package/build/extractors/readme-extractor.js.map +1 -0
  22. package/build/formatters/markdown-formatter.d.ts +12 -0
  23. package/build/formatters/markdown-formatter.d.ts.map +1 -0
  24. package/build/formatters/markdown-formatter.js +251 -0
  25. package/build/formatters/markdown-formatter.js.map +1 -0
  26. package/build/index.d.ts +12 -0
  27. package/build/index.d.ts.map +1 -0
  28. package/build/index.js +226 -0
  29. package/build/index.js.map +1 -0
  30. package/build/pipeline.d.ts +31 -0
  31. package/build/pipeline.d.ts.map +1 -0
  32. package/build/pipeline.js +203 -0
  33. package/build/pipeline.js.map +1 -0
  34. package/build/resolvers/exports-resolver.d.ts +12 -0
  35. package/build/resolvers/exports-resolver.d.ts.map +1 -0
  36. package/build/resolvers/exports-resolver.js +235 -0
  37. package/build/resolvers/exports-resolver.js.map +1 -0
  38. package/build/resolvers/package-resolver.d.ts +25 -0
  39. package/build/resolvers/package-resolver.d.ts.map +1 -0
  40. package/build/resolvers/package-resolver.js +189 -0
  41. package/build/resolvers/package-resolver.js.map +1 -0
  42. package/build/resolvers/types-resolver.d.ts +19 -0
  43. package/build/resolvers/types-resolver.d.ts.map +1 -0
  44. package/build/resolvers/types-resolver.js +155 -0
  45. package/build/resolvers/types-resolver.js.map +1 -0
  46. package/build/schemas/package-json.schema.d.ts +81 -0
  47. package/build/schemas/package-json.schema.d.ts.map +1 -0
  48. package/build/schemas/package-json.schema.js +91 -0
  49. package/build/schemas/package-json.schema.js.map +1 -0
  50. package/build/test.d.ts +6 -0
  51. package/build/test.d.ts.map +1 -0
  52. package/build/test.js.map +1 -0
  53. package/build/types/index.d.ts +117 -0
  54. package/build/types/index.d.ts.map +1 -0
  55. package/build/types/index.js +14 -0
  56. package/build/types/index.js.map +1 -0
  57. package/package.json +48 -0
package/README.md ADDED
@@ -0,0 +1,227 @@
1
+ # @justmpm/deps-consult
2
+
3
+ MCP server que consulta pacotes npm instalados no `node_modules` diretamente. Extrai API surfaces, JSDoc, exemplos de uso e metadados -- zero config, offline, sem API keys.
4
+
5
+ [![npm version](https://img.shields.io/npm/v/@justmpm/deps-consult.svg)](https://www.npmjs.com/package/@justmpm/deps-consult)
6
+ [![license](https://img.shields.io/npm/l/@justmpm/deps-consult.svg)](https://github.com/Just-mpm/deps-consult/blob/main/LICENSE)
7
+ [![node](https://img.shields.io/badge/node-%3E%3D22.0.0-brightgreen.svg)](https://nodejs.org/)
8
+
9
+ ## Features
10
+
11
+ - **API surface completa** -- funcoes, classes, interfaces, tipos, enums e variaveis exportadas com assinaturas TypeScript
12
+ - **JSDoc rico** -- extrai `@param`, `@returns`, `@example`, `@deprecated`, `@since`, `@see`, `@throws`, `@default`
13
+ - **Exemplos de codigo** -- coleta de 4 fontes: JSDoc `@example`, diretorio `/examples`, blocos de codigo do README e `/docs`
14
+ - **Busca inteligente** -- match exato, prefixo (`Button*`), sufixo (`*Button`), contem (`*Button*`) e fuzzy matching com scoring
15
+ - **Zero config** -- funciona com qualquer pacote npm, sem internet, sem API keys, sem arquivos de configuracao
16
+ - **Deduplicacao automatica** -- pacotes com multiplos entry points (como es-toolkit) nao geram resultados duplicados
17
+ - **Cache LRU** -- 50 pacotes em cache com TTL de 30 minutos e invalidacao automatica por hash do package.json
18
+ - **Suporte completo** -- pacotes scoped, workspaces, symlinks, conditional exports e fallbacks legados
19
+
20
+ ## Instalacao
21
+
22
+ ### npx (sem instalar)
23
+
24
+ ```json
25
+ {
26
+ "mcpServers": {
27
+ "deps-consult": {
28
+ "command": "npx",
29
+ "args": ["-y", "@justmpm/deps-consult"]
30
+ }
31
+ }
32
+ }
33
+ ```
34
+
35
+ ### Instalacao global
36
+
37
+ ```bash
38
+ npm install -g @justmpm/deps-consult
39
+ ```
40
+
41
+ ```json
42
+ {
43
+ "mcpServers": {
44
+ "deps-consult": {
45
+ "command": "deps-consult"
46
+ }
47
+ }
48
+ }
49
+ ```
50
+
51
+ ### Como projeto local
52
+
53
+ ```bash
54
+ git clone https://github.com/Just-mpm/deps-consult.git
55
+ cd deps-consult
56
+ npm install && npm run build
57
+ ```
58
+
59
+ ```json
60
+ {
61
+ "mcpServers": {
62
+ "deps-consult": {
63
+ "command": "node",
64
+ "args": ["D:/caminho/para/deps-consult/build/index.js"]
65
+ }
66
+ }
67
+ }
68
+ ```
69
+
70
+ ## Configuracao MCP
71
+
72
+ O `deps-consult` usa transporte stdio (JSON-RPC). Adicione a configuracao acima no arquivo de configuracao do seu cliente:
73
+
74
+ | Cliente | Arquivo de configuracao |
75
+ |---------|------------------------|
76
+ | Claude Desktop | `~/.claude/claude_desktop_config.json` |
77
+ | OpenCode | `.opencode/config.json` |
78
+ | Cursor | `.cursor/mcp.json` |
79
+
80
+ ## Referencia das Tools
81
+
82
+ | Tool | Descricao | Parametros |
83
+ |------|-----------|------------|
84
+ | `deps_info` | Visao geral do pacote: versao, descricao, entry points, dependencias, peer deps, tipos, tamanho | `package`, `projectDir?` |
85
+ | `deps_api` | API surface completa: todas as funcoes, classes, interfaces, tipos, enums e variaveis com assinaturas | `package`, `entrypoint?`, `kind?`, `limit?` |
86
+ | `deps_search` | Busca simbolos por nome com wildcards e fuzzy matching | `package`, `query`, `entrypoint?`, `kind?` |
87
+ | `deps_usage` | Detalhes de uso de um simbolo: assinatura, JSDoc, parametros, return type, exemplos, imports | `package`, `symbol`, `entrypoint?` |
88
+ | `deps_examples` | Exemplos de codigo extraidos de JSDoc, /examples, README e /docs | `package`, `symbol?`, `entrypoint?` |
89
+
90
+ ### Parametros em detalhe
91
+
92
+ **deps_info**
93
+ - `package` (string, obrigatorio) -- Nome do pacote (ex: `zod`, `@mui/material`)
94
+ - `projectDir` (string, opcional) -- Diretorio do projeto. Default: `process.cwd()`
95
+
96
+ **deps_api**
97
+ - `package` (string, obrigatorio)
98
+ - `entrypoint` (string, opcional) -- Subpath do entry point (ex: `"hooks"`, `"utils"`)
99
+ - `kind` (enum, opcional) -- `all` | `functions` | `classes` | `interfaces` | `types` | `enums` | `variables`. Default: `all`
100
+ - `limit` (number, opcional) -- Maximo de simbolos por categoria. Range: 1-200. Default: 50
101
+
102
+ **deps_search**
103
+ - `package` (string, obrigatorio)
104
+ - `query` (string, obrigatorio) -- Suporta wildcards: `Button` (exato), `Button*` (prefixo), `*Button` (sufixo), `*Button*` (contem)
105
+ - `entrypoint` (string, opcional)
106
+ - `kind` (enum, opcional) -- Mesmas opcoes do `deps_api`
107
+
108
+ **deps_usage**
109
+ - `package` (string, obrigatorio)
110
+ - `symbol` (string, obrigatorio) -- Nome exato do simbolo. Se nao encontrar, faz busca fuzzy com score > 0.5
111
+ - `entrypoint` (string, opcional)
112
+
113
+ **deps_examples**
114
+ - `package` (string, obrigatorio)
115
+ - `symbol` (string, opcional) -- Filtra exemplos por simbolo
116
+ - `entrypoint` (string, opcional)
117
+
118
+ ## Exemplos de Uso
119
+
120
+ ### Conhecer um pacote novo
121
+
122
+ ```
123
+ deps_info zod
124
+ ```
125
+
126
+ Retorna versao, descricao, entry points, dependencias, se tem tipos e tamanho no disco.
127
+
128
+ ### Ver a API completa
129
+
130
+ ```
131
+ deps_api es-toolkit kind=functions limit=30
132
+ ```
133
+
134
+ Lista as primeiras 30 funcoes exportadas com assinaturas TypeScript.
135
+
136
+ ### Buscar um simbolo
137
+
138
+ ```
139
+ deps_search @mui/material query="Button*"
140
+ ```
141
+
142
+ Encontra todos os simbolos com prefixo "Button" no MUI.
143
+
144
+ ### Entender como usar um simbolo
145
+
146
+ ```
147
+ deps_usage zod symbol="object"
148
+ ```
149
+
150
+ Retorna a assinatura completa, JSDoc (params, returns), exemplos e todos os caminhos de import possiveis.
151
+
152
+ ### Ver exemplos de codigo
153
+
154
+ ```
155
+ deps_examples react-hook-form
156
+ ```
157
+
158
+ Coleta exemplos de todas as fontes: JSDoc, diretorio de exemplos, README e docs.
159
+
160
+ ## Arquitetura
161
+
162
+ ```
163
+ src/
164
+ index.ts MCP server (5 tools registradas)
165
+ pipeline.ts Orquestracao: resolvers -> extractors -> cache
166
+ types/index.ts Tipos compartilhados
167
+ schemas/package-json.schema.ts Zod v4 schemas (package.json + inputs)
168
+ cache/package-cache.ts LRU cache (50 pacotes, 30min TTL)
169
+ resolvers/
170
+ package-resolver.ts Encontra pacote no node_modules
171
+ exports-resolver.ts Resolve conditional exports
172
+ types-resolver.ts 5 estrategias para achar .d.ts
173
+ extractors/
174
+ api-extractor.ts ts-morph: extrai API surface
175
+ jsdoc-extractor.ts Extrai @param, @returns, @example, etc.
176
+ readme-extractor.ts Parser manual de markdown
177
+ examples-extractor.ts 4 fontes de exemplos
178
+ formatters/
179
+ markdown-formatter.ts Output otimizado para contexto de LLM
180
+ ```
181
+
182
+ Fluxo de dados:
183
+
184
+ ```
185
+ Tool call
186
+ -> Cache (hit? retorna)
187
+ -> PackageResolver (acha no node_modules)
188
+ -> ExportsResolver (resolve entry points)
189
+ -> TypesResolver (acha .d.ts com 5 estrategias)
190
+ -> ApiExtractor (ts-morph: funcoes, classes, tipos...)
191
+ -> ReadmeExtractor (parser manual)
192
+ -> Deduplicacao por nome (Set)
193
+ -> Salva no cache
194
+ -> Formatter (markdown para LLM)
195
+ -> Response
196
+ ```
197
+
198
+ ## Desenvolvimento
199
+
200
+ ```bash
201
+ # Instalar dependencias
202
+ npm install
203
+
204
+ # Build
205
+ npm run build
206
+
207
+ # Desenvolvimento (watch)
208
+ npm run dev
209
+
210
+ # Lint
211
+ npm run lint
212
+
213
+ # Type check
214
+ npm run type-check
215
+
216
+ # Testes (JSON-RPC real via stdin/stdout)
217
+ node test-mcp.ts
218
+ ```
219
+
220
+ ### Requisitos
221
+
222
+ - Node.js >= 22.0.0
223
+ - npm (ou bun)
224
+
225
+ ## Licenca
226
+
227
+ [MIT](https://github.com/Just-mpm/deps-consult/blob/main/LICENSE) -- Koda AI Studio
@@ -0,0 +1,39 @@
1
+ import type { CachedPackage } from '../types/index.js';
2
+ export declare class PackageCache {
3
+ private readonly cache;
4
+ constructor(maxPackages?: number, ttlMs?: number);
5
+ /**
6
+ * Gera a cache key: `${projectDir}:${packageName}`
7
+ */
8
+ private getKey;
9
+ /**
10
+ * Computa hash do package.json para invalidação.
11
+ */
12
+ computePackageJsonHash(packageDir: string): Promise<string>;
13
+ /**
14
+ * Busca pacote no cache. Retorna null se não existe ou se o hash mudou.
15
+ */
16
+ get(projectDir: string, packageName: string): Promise<CachedPackage | null>;
17
+ /**
18
+ * Armazena pacote no cache.
19
+ */
20
+ set(projectDir: string, packageName: string, data: CachedPackage): Promise<void>;
21
+ /**
22
+ * Invalida um pacote específico.
23
+ */
24
+ invalidate(projectDir: string, packageName: string): void;
25
+ /**
26
+ * Limpa todo o cache.
27
+ */
28
+ clear(): void;
29
+ /**
30
+ * Estatísticas do cache.
31
+ */
32
+ get stats(): {
33
+ size: number;
34
+ max: number;
35
+ };
36
+ }
37
+ /** Singleton compartilhado entre todas as tools */
38
+ export declare const packageCache: PackageCache;
39
+ //# sourceMappingURL=package-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-cache.d.ts","sourceRoot":"","sources":["../../src/cache/package-cache.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAUvD,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA+B;gBAEzC,WAAW,GAAE,MAA6B,EAAE,KAAK,GAAE,MAAuB;IAQtF;;OAEG;IACH,OAAO,CAAC,MAAM;IAId;;OAEG;IACG,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASjE;;OAEG;IACG,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC;IAgBjF;;OAEG;IACG,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAUtF;;OAEG;IACH,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IAIzD;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,IAAI,KAAK,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAKzC;CACF;AAED,mDAAmD;AACnD,eAAO,MAAM,YAAY,cAAqB,CAAC"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Cache LRU para pacotes extraídos.
3
+ * Evita re-parsear pacotes já consultados na mesma sessão.
4
+ * Invalidação automática por TTL e por hash do package.json.
5
+ */
6
+ import { LRUCache } from 'lru-cache';
7
+ import { createHash } from 'node:crypto';
8
+ import { readFile } from 'node:fs/promises';
9
+ import { join } from 'node:path';
10
+ const DEFAULT_MAX_PACKAGES = 50;
11
+ const DEFAULT_TTL_MS = 30 * 60 * 1000; // 30 minutos
12
+ export class PackageCache {
13
+ cache;
14
+ constructor(maxPackages = DEFAULT_MAX_PACKAGES, ttlMs = DEFAULT_TTL_MS) {
15
+ this.cache = new LRUCache({
16
+ max: maxPackages,
17
+ ttl: ttlMs,
18
+ allowStaleOnFetchAbort: true,
19
+ });
20
+ }
21
+ /**
22
+ * Gera a cache key: `${projectDir}:${packageName}`
23
+ */
24
+ getKey(projectDir, packageName) {
25
+ return `${projectDir}:${packageName}`;
26
+ }
27
+ /**
28
+ * Computa hash do package.json para invalidação.
29
+ */
30
+ async computePackageJsonHash(packageDir) {
31
+ try {
32
+ const content = await readFile(join(packageDir, 'package.json'), 'utf-8');
33
+ return createHash('md5').update(content).digest('hex');
34
+ }
35
+ catch {
36
+ return '';
37
+ }
38
+ }
39
+ /**
40
+ * Busca pacote no cache. Retorna null se não existe ou se o hash mudou.
41
+ */
42
+ async get(projectDir, packageName) {
43
+ const key = this.getKey(projectDir, packageName);
44
+ const entry = this.cache.get(key);
45
+ if (!entry)
46
+ return null;
47
+ // Verificar se o package.json mudou desde o cache
48
+ const currentHash = await this.computePackageJsonHash(entry.data.meta.packageDir);
49
+ if (currentHash !== entry.packageJsonHash) {
50
+ this.cache.delete(key);
51
+ return null;
52
+ }
53
+ return entry.data;
54
+ }
55
+ /**
56
+ * Armazena pacote no cache.
57
+ */
58
+ async set(projectDir, packageName, data) {
59
+ const key = this.getKey(projectDir, packageName);
60
+ const packageJsonHash = await this.computePackageJsonHash(data.meta.packageDir);
61
+ this.cache.set(key, {
62
+ data,
63
+ packageJsonHash,
64
+ });
65
+ }
66
+ /**
67
+ * Invalida um pacote específico.
68
+ */
69
+ invalidate(projectDir, packageName) {
70
+ this.cache.delete(this.getKey(projectDir, packageName));
71
+ }
72
+ /**
73
+ * Limpa todo o cache.
74
+ */
75
+ clear() {
76
+ this.cache.clear();
77
+ }
78
+ /**
79
+ * Estatísticas do cache.
80
+ */
81
+ get stats() {
82
+ return {
83
+ size: this.cache.size,
84
+ max: this.cache.max,
85
+ };
86
+ }
87
+ }
88
+ /** Singleton compartilhado entre todas as tools */
89
+ export const packageCache = new PackageCache();
90
+ //# sourceMappingURL=package-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-cache.js","sourceRoot":"","sources":["../../src/cache/package-cache.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ExtractedSymbol } from '../types/index.js';
2
+ /**
3
+ * Extrai todos os símbolos exportados de uma lista de arquivos de tipos.
4
+ */
5
+ export declare function extractApiSurface(typeFiles: ReadonlyArray<string>, entrypoint: string | undefined, packageDir: string): ReadonlyArray<ExtractedSymbol>;
6
+ //# sourceMappingURL=api-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-extractor.d.ts","sourceRoot":"","sources":["../../src/extractors/api-extractor.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAc,MAAM,mBAAmB,CAAC;AAOrE;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,aAAa,CAAC,MAAM,CAAC,EAChC,UAAU,EAAE,MAAM,YAAM,EACxB,UAAU,EAAE,MAAM,GACjB,aAAa,CAAC,eAAe,CAAC,CAoChC"}
@@ -0,0 +1,191 @@
1
+ /**
2
+ * Extrai a API surface completa de arquivos .d.ts usando ts-morph.
3
+ * Resolve re-exports, aliases e segue a cadeia de exports automaticamente.
4
+ */
5
+ import { Project, SyntaxKind } from 'ts-morph';
6
+ import { relative } from 'node:path';
7
+ import { extractJSDoc } from './jsdoc-extractor.js';
8
+ import { uniqBy } from 'es-toolkit';
9
+ /** Limite de profundidade para seguir re-exports */
10
+ const MAX_REEXPORT_DEPTH = 10;
11
+ /**
12
+ * Extrai todos os símbolos exportados de uma lista de arquivos de tipos.
13
+ */
14
+ export function extractApiSurface(typeFiles, entrypoint = '.', packageDir) {
15
+ const project = new Project({
16
+ skipAddingFilesFromTsConfig: true,
17
+ useInMemoryFileSystem: false,
18
+ compilerOptions: {
19
+ strict: true,
20
+ esModuleInterop: true,
21
+ skipLibCheck: true,
22
+ noEmit: true,
23
+ },
24
+ });
25
+ // Adicionar arquivos de tipos ao projeto
26
+ const sourceFiles = [];
27
+ for (const filePath of typeFiles) {
28
+ try {
29
+ const sf = project.addSourceFileAtPath(filePath);
30
+ sourceFiles.push(sf);
31
+ }
32
+ catch (error) {
33
+ console.error(`[deps-consult] Falha ao parsear ${filePath}: ${error}`);
34
+ }
35
+ }
36
+ const symbols = [];
37
+ for (const sourceFile of sourceFiles) {
38
+ try {
39
+ const fileSymbols = extractFromFile(sourceFile, entrypoint, packageDir);
40
+ symbols.push(...fileSymbols);
41
+ }
42
+ catch (error) {
43
+ console.error(`[deps-consult] Erro ao extrair de ${sourceFile.getFilePath()}: ${error}`);
44
+ }
45
+ }
46
+ // Deduplicar (mesmo símbolo pode vir de múltiplos .d.ts)
47
+ return uniqBy(symbols, s => `${s.kind}:${s.name}`);
48
+ }
49
+ /**
50
+ * Extrai símbolos de um único source file.
51
+ */
52
+ function extractFromFile(sourceFile, entrypoint, packageDir) {
53
+ const symbols = [];
54
+ const filePath = sourceFile.getFilePath();
55
+ // getExportedDeclarations() resolve re-exports automaticamente!
56
+ const exportedDeclarations = sourceFile.getExportedDeclarations();
57
+ for (const [exportName, declarations] of exportedDeclarations) {
58
+ // Pular export * (nome é asterisk-like ou Symbol)
59
+ if (!exportName || exportName === 'default')
60
+ continue;
61
+ for (const decl of declarations) {
62
+ const symbol = extractSymbol(exportName, decl, entrypoint, packageDir);
63
+ if (symbol)
64
+ symbols.push(symbol);
65
+ }
66
+ }
67
+ // Capturar default export
68
+ const defaultExports = sourceFile.getExportAssignments();
69
+ for (const defaultExport of defaultExports) {
70
+ const expression = defaultExport.getExpression();
71
+ const decl = expression.getSymbol()?.getDeclarations()[0];
72
+ if (decl) {
73
+ const symbol = extractSymbol('default', decl, entrypoint, packageDir);
74
+ if (symbol)
75
+ symbols.push(symbol);
76
+ }
77
+ }
78
+ return symbols;
79
+ }
80
+ /**
81
+ * Extrai um único símbolo de uma declaração.
82
+ */
83
+ function extractSymbol(name, decl, entrypoint, packageDir) {
84
+ try {
85
+ const kind = getSymbolKind(decl);
86
+ if (!kind)
87
+ return null;
88
+ const signature = getSignature(decl, name);
89
+ // getSourceFile() está disponível em nós que têm arquivo
90
+ const sourceFile = decl.getSourceFile?.();
91
+ if (!sourceFile)
92
+ return null;
93
+ const filePath = sourceFile.getFilePath();
94
+ const lineNumber = decl.getStartLineNumber?.() ?? 0;
95
+ const jsdoc = extractJSDoc(decl);
96
+ return {
97
+ name,
98
+ kind,
99
+ signature,
100
+ file: relative(packageDir, filePath).replace(/\\/g, '/'),
101
+ line: lineNumber,
102
+ entrypoint,
103
+ jsdoc,
104
+ isReExport: false,
105
+ originalModule: undefined,
106
+ };
107
+ }
108
+ catch (error) {
109
+ console.error(`[deps-consult] Erro ao extrair símbolo '${name}': ${error}`);
110
+ return null;
111
+ }
112
+ }
113
+ /**
114
+ * Determina o tipo do símbolo baseado no SyntaxKind.
115
+ */
116
+ function getSymbolKind(decl) {
117
+ const kind = decl.getKind();
118
+ switch (kind) {
119
+ case SyntaxKind.FunctionDeclaration:
120
+ case SyntaxKind.FunctionExpression:
121
+ case SyntaxKind.ArrowFunction:
122
+ case SyntaxKind.MethodDeclaration:
123
+ return 'function';
124
+ case SyntaxKind.ClassDeclaration:
125
+ return 'class';
126
+ case SyntaxKind.InterfaceDeclaration:
127
+ return 'interface';
128
+ case SyntaxKind.TypeAliasDeclaration:
129
+ return 'type';
130
+ case SyntaxKind.EnumDeclaration:
131
+ return 'enum';
132
+ case SyntaxKind.VariableDeclaration:
133
+ case SyntaxKind.VariableStatement: {
134
+ try {
135
+ const parent = decl.getParentIfKind?.(SyntaxKind.VariableDeclarationList);
136
+ if (parent) {
137
+ const flags = parent.getDeclarationFlags?.();
138
+ if (flags !== undefined && (flags & 2)) {
139
+ return 'constant';
140
+ }
141
+ }
142
+ }
143
+ catch {
144
+ // Fallback
145
+ }
146
+ return 'variable';
147
+ }
148
+ default:
149
+ return null;
150
+ }
151
+ }
152
+ /**
153
+ * Extrai a assinatura completa do símbolo como string.
154
+ */
155
+ function getSignature(decl, name) {
156
+ try {
157
+ const kind = decl.getKind();
158
+ const text = decl.getText();
159
+ switch (kind) {
160
+ case SyntaxKind.FunctionDeclaration: {
161
+ const bodyIndex = text.indexOf('=> {') !== -1 ? text.indexOf('=> {') : text.indexOf(') {');
162
+ return bodyIndex > -1 ? text.substring(0, bodyIndex).trim() : `function ${name}()`;
163
+ }
164
+ case SyntaxKind.ClassDeclaration: {
165
+ const className = decl.getName?.() ?? name;
166
+ return `class ${className}`;
167
+ }
168
+ case SyntaxKind.InterfaceDeclaration: {
169
+ const ifaceName = decl.getName?.() ?? name;
170
+ return `interface ${ifaceName}`;
171
+ }
172
+ case SyntaxKind.TypeAliasDeclaration: {
173
+ return text.length > 500 ? text.substring(0, 500) + '...' : text;
174
+ }
175
+ case SyntaxKind.EnumDeclaration: {
176
+ const enumName = decl.getName?.() ?? name;
177
+ return `enum ${enumName}`;
178
+ }
179
+ case SyntaxKind.VariableDeclaration: {
180
+ const typeText = decl.getType?.()?.getText(decl) ?? 'unknown';
181
+ return `const ${name}: ${typeText}`;
182
+ }
183
+ default:
184
+ return name;
185
+ }
186
+ }
187
+ catch {
188
+ return name;
189
+ }
190
+ }
191
+ //# sourceMappingURL=api-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-extractor.js","sourceRoot":"","sources":["../../src/extractors/api-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { ExtractedSymbol, ReadmeData } from '../types/index.js';
2
+ export interface CodeExample {
3
+ /** Código do exemplo */
4
+ code: string;
5
+ /** Linguagem (typescript, javascript, etc) */
6
+ language?: string;
7
+ /** Contexto (qual símbolo ou seção) */
8
+ context?: string;
9
+ /** Origem do exemplo */
10
+ source: 'jsdoc' | 'examples-dir' | 'readme' | 'docs';
11
+ }
12
+ /**
13
+ * Coleta exemplos de todas as fontes disponíveis.
14
+ */
15
+ export declare function extractExamples(packageDir: string, symbols: ReadonlyArray<ExtractedSymbol>, readme: ReadmeData | null, targetSymbol?: string): Promise<ReadonlyArray<CodeExample>>;
16
+ //# sourceMappingURL=examples-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"examples-extractor.d.ts","sourceRoot":"","sources":["../../src/extractors/examples-extractor.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAGrE,MAAM,WAAW,WAAW;IAC1B,wBAAwB;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,uCAAuC;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,wBAAwB;IACxB,MAAM,EAAE,OAAO,GAAG,cAAc,GAAG,QAAQ,GAAG,MAAM,CAAC;CACtD;AAED;;GAEG;AACH,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,aAAa,CAAC,eAAe,CAAC,EACvC,MAAM,EAAE,UAAU,GAAG,IAAI,EACzB,YAAY,CAAC,EAAE,MAAM,GACpB,OAAO,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAsBrC"}