@code-rag/core 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +19 -0
- package/dist/auth/audit-log.d.ts +35 -0
- package/dist/auth/audit-log.js +110 -0
- package/dist/auth/audit-log.js.map +1 -0
- package/dist/auth/audit-log.test.d.ts +1 -0
- package/dist/auth/audit-log.test.js +261 -0
- package/dist/auth/audit-log.test.js.map +1 -0
- package/dist/auth/index.d.ts +6 -0
- package/dist/auth/index.js +5 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/oidc-provider.d.ts +49 -0
- package/dist/auth/oidc-provider.js +358 -0
- package/dist/auth/oidc-provider.js.map +1 -0
- package/dist/auth/oidc-provider.test.d.ts +1 -0
- package/dist/auth/oidc-provider.test.js +520 -0
- package/dist/auth/oidc-provider.test.js.map +1 -0
- package/dist/auth/rbac.d.ts +29 -0
- package/dist/auth/rbac.js +75 -0
- package/dist/auth/rbac.js.map +1 -0
- package/dist/auth/rbac.test.d.ts +1 -0
- package/dist/auth/rbac.test.js +224 -0
- package/dist/auth/rbac.test.js.map +1 -0
- package/dist/auth/saml-provider.d.ts +51 -0
- package/dist/auth/saml-provider.js +355 -0
- package/dist/auth/saml-provider.js.map +1 -0
- package/dist/auth/saml-provider.test.d.ts +1 -0
- package/dist/auth/saml-provider.test.js +422 -0
- package/dist/auth/saml-provider.test.js.map +1 -0
- package/dist/auth/types.d.ts +81 -0
- package/dist/auth/types.js +11 -0
- package/dist/auth/types.js.map +1 -0
- package/dist/auth/types.test.d.ts +1 -0
- package/dist/auth/types.test.js +147 -0
- package/dist/auth/types.test.js.map +1 -0
- package/dist/backlog/ab-reference-scanner.d.ts +10 -0
- package/dist/backlog/ab-reference-scanner.js +22 -0
- package/dist/backlog/ab-reference-scanner.js.map +1 -0
- package/dist/backlog/ab-reference-scanner.test.d.ts +1 -0
- package/dist/backlog/ab-reference-scanner.test.js +83 -0
- package/dist/backlog/ab-reference-scanner.test.js.map +1 -0
- package/dist/backlog/azure-devops-provider.d.ts +59 -0
- package/dist/backlog/azure-devops-provider.js +283 -0
- package/dist/backlog/azure-devops-provider.js.map +1 -0
- package/dist/backlog/backlog-provider.d.ts +13 -0
- package/dist/backlog/backlog-provider.js +6 -0
- package/dist/backlog/backlog-provider.js.map +1 -0
- package/dist/backlog/backlog-provider.test.d.ts +1 -0
- package/dist/backlog/backlog-provider.test.js +426 -0
- package/dist/backlog/backlog-provider.test.js.map +1 -0
- package/dist/backlog/clickup-provider.d.ts +55 -0
- package/dist/backlog/clickup-provider.js +301 -0
- package/dist/backlog/clickup-provider.js.map +1 -0
- package/dist/backlog/clickup-provider.test.d.ts +1 -0
- package/dist/backlog/clickup-provider.test.js +426 -0
- package/dist/backlog/clickup-provider.test.js.map +1 -0
- package/dist/backlog/clickup-reference-scanner.d.ts +10 -0
- package/dist/backlog/clickup-reference-scanner.js +32 -0
- package/dist/backlog/clickup-reference-scanner.js.map +1 -0
- package/dist/backlog/clickup-reference-scanner.test.d.ts +1 -0
- package/dist/backlog/clickup-reference-scanner.test.js +92 -0
- package/dist/backlog/clickup-reference-scanner.test.js.map +1 -0
- package/dist/backlog/code-linker.d.ts +63 -0
- package/dist/backlog/code-linker.js +90 -0
- package/dist/backlog/code-linker.js.map +1 -0
- package/dist/backlog/code-linker.test.d.ts +1 -0
- package/dist/backlog/code-linker.test.js +325 -0
- package/dist/backlog/code-linker.test.js.map +1 -0
- package/dist/backlog/index.d.ts +14 -0
- package/dist/backlog/index.js +8 -0
- package/dist/backlog/index.js.map +1 -0
- package/dist/backlog/jira-provider.d.ts +60 -0
- package/dist/backlog/jira-provider.js +272 -0
- package/dist/backlog/jira-provider.js.map +1 -0
- package/dist/backlog/jira-provider.test.d.ts +1 -0
- package/dist/backlog/jira-provider.test.js +449 -0
- package/dist/backlog/jira-provider.test.js.map +1 -0
- package/dist/backlog/jira-reference-scanner.d.ts +11 -0
- package/dist/backlog/jira-reference-scanner.js +26 -0
- package/dist/backlog/jira-reference-scanner.js.map +1 -0
- package/dist/backlog/jira-reference-scanner.test.d.ts +1 -0
- package/dist/backlog/jira-reference-scanner.test.js +127 -0
- package/dist/backlog/jira-reference-scanner.test.js.map +1 -0
- package/dist/backlog/types.d.ts +22 -0
- package/dist/backlog/types.js +1 -0
- package/dist/backlog/types.js.map +1 -0
- package/dist/chunker/ast-chunker.d.ts +45 -0
- package/dist/chunker/ast-chunker.js +292 -0
- package/dist/chunker/ast-chunker.js.map +1 -0
- package/dist/chunker/ast-chunker.test.d.ts +1 -0
- package/dist/chunker/ast-chunker.test.js +391 -0
- package/dist/chunker/ast-chunker.test.js.map +1 -0
- package/dist/chunker/chunker.d.ts +8 -0
- package/dist/chunker/chunker.js +1 -0
- package/dist/chunker/chunker.js.map +1 -0
- package/dist/chunker/index.d.ts +3 -0
- package/dist/chunker/index.js +2 -0
- package/dist/chunker/index.js.map +1 -0
- package/dist/config/config-parser.d.ts +15 -0
- package/dist/config/config-parser.js +283 -0
- package/dist/config/config-parser.js.map +1 -0
- package/dist/config/config-parser.test.d.ts +1 -0
- package/dist/config/config-parser.test.js +699 -0
- package/dist/config/config-parser.test.js.map +1 -0
- package/dist/docs/confluence-provider.d.ts +121 -0
- package/dist/docs/confluence-provider.js +459 -0
- package/dist/docs/confluence-provider.js.map +1 -0
- package/dist/docs/confluence-provider.test.d.ts +1 -0
- package/dist/docs/confluence-provider.test.js +765 -0
- package/dist/docs/confluence-provider.test.js.map +1 -0
- package/dist/docs/index.d.ts +4 -0
- package/dist/docs/index.js +2 -0
- package/dist/docs/index.js.map +1 -0
- package/dist/docs/sharepoint-provider.d.ts +150 -0
- package/dist/docs/sharepoint-provider.js +637 -0
- package/dist/docs/sharepoint-provider.js.map +1 -0
- package/dist/docs/sharepoint-provider.test.d.ts +1 -0
- package/dist/docs/sharepoint-provider.test.js +873 -0
- package/dist/docs/sharepoint-provider.test.js.map +1 -0
- package/dist/embedding/bm25-index.d.ts +12 -0
- package/dist/embedding/bm25-index.js +89 -0
- package/dist/embedding/bm25-index.js.map +1 -0
- package/dist/embedding/bm25-index.test.d.ts +1 -0
- package/dist/embedding/bm25-index.test.js +289 -0
- package/dist/embedding/bm25-index.test.js.map +1 -0
- package/dist/embedding/hybrid-search.d.ts +13 -0
- package/dist/embedding/hybrid-search.js +124 -0
- package/dist/embedding/hybrid-search.js.map +1 -0
- package/dist/embedding/hybrid-search.test.d.ts +1 -0
- package/dist/embedding/hybrid-search.test.js +266 -0
- package/dist/embedding/hybrid-search.test.js.map +1 -0
- package/dist/embedding/index.d.ts +11 -0
- package/dist/embedding/index.js +7 -0
- package/dist/embedding/index.js.map +1 -0
- package/dist/embedding/lancedb-store.d.ts +21 -0
- package/dist/embedding/lancedb-store.js +172 -0
- package/dist/embedding/lancedb-store.js.map +1 -0
- package/dist/embedding/lancedb-store.test.d.ts +1 -0
- package/dist/embedding/lancedb-store.test.js +268 -0
- package/dist/embedding/lancedb-store.test.js.map +1 -0
- package/dist/embedding/model-lifecycle-manager.d.ts +83 -0
- package/dist/embedding/model-lifecycle-manager.js +419 -0
- package/dist/embedding/model-lifecycle-manager.js.map +1 -0
- package/dist/embedding/model-lifecycle-manager.test.d.ts +1 -0
- package/dist/embedding/model-lifecycle-manager.test.js +642 -0
- package/dist/embedding/model-lifecycle-manager.test.js.map +1 -0
- package/dist/embedding/ollama-embedding-provider.d.ts +16 -0
- package/dist/embedding/ollama-embedding-provider.js +74 -0
- package/dist/embedding/ollama-embedding-provider.js.map +1 -0
- package/dist/embedding/ollama-embedding-provider.test.d.ts +1 -0
- package/dist/embedding/ollama-embedding-provider.test.js +198 -0
- package/dist/embedding/ollama-embedding-provider.test.js.map +1 -0
- package/dist/embedding/openai-compatible-embedding-provider.d.ts +19 -0
- package/dist/embedding/openai-compatible-embedding-provider.js +108 -0
- package/dist/embedding/openai-compatible-embedding-provider.js.map +1 -0
- package/dist/embedding/openai-compatible-embedding-provider.test.d.ts +1 -0
- package/dist/embedding/openai-compatible-embedding-provider.test.js +456 -0
- package/dist/embedding/openai-compatible-embedding-provider.test.js.map +1 -0
- package/dist/embedding/qdrant-store.d.ts +28 -0
- package/dist/embedding/qdrant-store.js +174 -0
- package/dist/embedding/qdrant-store.js.map +1 -0
- package/dist/embedding/qdrant-store.test.d.ts +1 -0
- package/dist/embedding/qdrant-store.test.js +359 -0
- package/dist/embedding/qdrant-store.test.js.map +1 -0
- package/dist/enrichment/index.d.ts +4 -0
- package/dist/enrichment/index.js +2 -0
- package/dist/enrichment/index.js.map +1 -0
- package/dist/enrichment/nl-enricher.d.ts +16 -0
- package/dist/enrichment/nl-enricher.js +47 -0
- package/dist/enrichment/nl-enricher.js.map +1 -0
- package/dist/enrichment/nl-enricher.test.d.ts +1 -0
- package/dist/enrichment/nl-enricher.test.js +154 -0
- package/dist/enrichment/nl-enricher.test.js.map +1 -0
- package/dist/enrichment/ollama-client.d.ts +18 -0
- package/dist/enrichment/ollama-client.js +55 -0
- package/dist/enrichment/ollama-client.js.map +1 -0
- package/dist/enrichment/ollama-client.test.d.ts +1 -0
- package/dist/enrichment/ollama-client.test.js +129 -0
- package/dist/enrichment/ollama-client.test.js.map +1 -0
- package/dist/git/git-client.d.ts +22 -0
- package/dist/git/git-client.js +6 -0
- package/dist/git/git-client.js.map +1 -0
- package/dist/git/git-client.test.d.ts +1 -0
- package/dist/git/git-client.test.js +200 -0
- package/dist/git/git-client.test.js.map +1 -0
- package/dist/git/ignore-filter.d.ts +2 -0
- package/dist/git/ignore-filter.js +31 -0
- package/dist/git/ignore-filter.js.map +1 -0
- package/dist/git/ignore-filter.test.d.ts +1 -0
- package/dist/git/ignore-filter.test.js +87 -0
- package/dist/git/ignore-filter.test.js.map +1 -0
- package/dist/git/index.d.ts +4 -0
- package/dist/git/index.js +3 -0
- package/dist/git/index.js.map +1 -0
- package/dist/git/simple-git-client.d.ts +12 -0
- package/dist/git/simple-git-client.js +138 -0
- package/dist/git/simple-git-client.js.map +1 -0
- package/dist/graph/cross-repo-resolver.d.ts +50 -0
- package/dist/graph/cross-repo-resolver.js +315 -0
- package/dist/graph/cross-repo-resolver.js.map +1 -0
- package/dist/graph/cross-repo-resolver.test.d.ts +1 -0
- package/dist/graph/cross-repo-resolver.test.js +548 -0
- package/dist/graph/cross-repo-resolver.test.js.map +1 -0
- package/dist/graph/dependency-graph.d.ts +44 -0
- package/dist/graph/dependency-graph.js +108 -0
- package/dist/graph/dependency-graph.js.map +1 -0
- package/dist/graph/dependency-graph.test.d.ts +1 -0
- package/dist/graph/dependency-graph.test.js +276 -0
- package/dist/graph/dependency-graph.test.js.map +1 -0
- package/dist/graph/graph-builder.d.ts +11 -0
- package/dist/graph/graph-builder.js +113 -0
- package/dist/graph/graph-builder.js.map +1 -0
- package/dist/graph/graph-builder.test.d.ts +1 -0
- package/dist/graph/graph-builder.test.js +178 -0
- package/dist/graph/graph-builder.test.js.map +1 -0
- package/dist/graph/import-resolver.d.ts +11 -0
- package/dist/graph/import-resolver.js +199 -0
- package/dist/graph/import-resolver.js.map +1 -0
- package/dist/graph/import-resolver.test.d.ts +1 -0
- package/dist/graph/import-resolver.test.js +282 -0
- package/dist/graph/import-resolver.test.js.map +1 -0
- package/dist/graph/index.d.ts +7 -0
- package/dist/graph/index.js +4 -0
- package/dist/graph/index.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/file-scanner.d.ts +34 -0
- package/dist/indexer/file-scanner.js +69 -0
- package/dist/indexer/file-scanner.js.map +1 -0
- package/dist/indexer/file-scanner.test.d.ts +1 -0
- package/dist/indexer/file-scanner.test.js +110 -0
- package/dist/indexer/file-scanner.test.js.map +1 -0
- package/dist/indexer/file-watcher.d.ts +79 -0
- package/dist/indexer/file-watcher.js +148 -0
- package/dist/indexer/incremental-indexer.d.ts +67 -0
- package/dist/indexer/incremental-indexer.js +142 -0
- package/dist/indexer/incremental-indexer.js.map +1 -0
- package/dist/indexer/incremental-indexer.test.d.ts +1 -0
- package/dist/indexer/incremental-indexer.test.js +266 -0
- package/dist/indexer/incremental-indexer.test.js.map +1 -0
- package/dist/indexer/index-check.d.ts +22 -0
- package/dist/indexer/index-check.js +74 -0
- package/dist/indexer/index-check.js.map +1 -0
- package/dist/indexer/index-check.test.d.ts +1 -0
- package/dist/indexer/index-check.test.js +100 -0
- package/dist/indexer/index-check.test.js.map +1 -0
- package/dist/indexer/index-state.d.ts +61 -0
- package/dist/indexer/index-state.js +82 -0
- package/dist/indexer/index-state.js.map +1 -0
- package/dist/indexer/index-state.test.d.ts +1 -0
- package/dist/indexer/index-state.test.js +140 -0
- package/dist/indexer/index-state.test.js.map +1 -0
- package/dist/indexer/index.d.ts +12 -0
- package/dist/indexer/index.js +6 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/multi-repo-indexer.d.ts +63 -0
- package/dist/indexer/multi-repo-indexer.js +144 -0
- package/dist/indexer/multi-repo-indexer.js.map +1 -0
- package/dist/indexer/multi-repo-indexer.test.d.ts +1 -0
- package/dist/indexer/multi-repo-indexer.test.js +238 -0
- package/dist/indexer/multi-repo-indexer.test.js.map +1 -0
- package/dist/parser/index.d.ts +4 -0
- package/dist/parser/index.js +3 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/language-registry.d.ts +46 -0
- package/dist/parser/language-registry.js +219 -0
- package/dist/parser/language-registry.js.map +1 -0
- package/dist/parser/language-registry.test.d.ts +1 -0
- package/dist/parser/language-registry.test.js +225 -0
- package/dist/parser/language-registry.test.js.map +1 -0
- package/dist/parser/markdown-parser.d.ts +124 -0
- package/dist/parser/markdown-parser.js +487 -0
- package/dist/parser/markdown-parser.js.map +1 -0
- package/dist/parser/markdown-parser.test.d.ts +1 -0
- package/dist/parser/markdown-parser.test.js +600 -0
- package/dist/parser/markdown-parser.test.js.map +1 -0
- package/dist/parser/tree-sitter-parser.d.ts +32 -0
- package/dist/parser/tree-sitter-parser.js +146 -0
- package/dist/parser/tree-sitter-parser.js.map +1 -0
- package/dist/retrieval/context-expander.d.ts +51 -0
- package/dist/retrieval/context-expander.js +218 -0
- package/dist/retrieval/context-expander.js.map +1 -0
- package/dist/retrieval/context-expander.test.d.ts +1 -0
- package/dist/retrieval/context-expander.test.js +339 -0
- package/dist/retrieval/context-expander.test.js.map +1 -0
- package/dist/retrieval/cross-encoder-reranker.d.ts +16 -0
- package/dist/retrieval/cross-encoder-reranker.js +90 -0
- package/dist/retrieval/cross-encoder-reranker.js.map +1 -0
- package/dist/retrieval/cross-encoder-reranker.test.d.ts +1 -0
- package/dist/retrieval/cross-encoder-reranker.test.js +305 -0
- package/dist/retrieval/cross-encoder-reranker.test.js.map +1 -0
- package/dist/retrieval/index.d.ts +8 -0
- package/dist/retrieval/index.js +4 -0
- package/dist/retrieval/index.js.map +1 -0
- package/dist/retrieval/query-analyzer.d.ts +29 -0
- package/dist/retrieval/query-analyzer.js +238 -0
- package/dist/retrieval/query-analyzer.js.map +1 -0
- package/dist/retrieval/query-analyzer.test.d.ts +1 -0
- package/dist/retrieval/query-analyzer.test.js +236 -0
- package/dist/retrieval/query-analyzer.test.js.map +1 -0
- package/dist/retrieval/token-budget.d.ts +51 -0
- package/dist/retrieval/token-budget.js +141 -0
- package/dist/retrieval/token-budget.js.map +1 -0
- package/dist/retrieval/token-budget.test.d.ts +1 -0
- package/dist/retrieval/token-budget.test.js +404 -0
- package/dist/retrieval/token-budget.test.js.map +1 -0
- package/dist/storage/azure-blob-provider.d.ts +19 -0
- package/dist/storage/azure-blob-provider.js +199 -0
- package/dist/storage/azure-blob-provider.js.map +1 -0
- package/dist/storage/azure-blob-provider.test.d.ts +1 -0
- package/dist/storage/azure-blob-provider.test.js +250 -0
- package/dist/storage/azure-blob-provider.test.js.map +1 -0
- package/dist/storage/gcs-provider.d.ts +22 -0
- package/dist/storage/gcs-provider.js +241 -0
- package/dist/storage/gcs-provider.js.map +1 -0
- package/dist/storage/gcs-provider.test.d.ts +1 -0
- package/dist/storage/gcs-provider.test.js +299 -0
- package/dist/storage/gcs-provider.test.js.map +1 -0
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.js +4 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/s3-provider.d.ts +21 -0
- package/dist/storage/s3-provider.js +220 -0
- package/dist/storage/s3-provider.js.map +1 -0
- package/dist/storage/s3-provider.test.d.ts +1 -0
- package/dist/storage/s3-provider.test.js +329 -0
- package/dist/storage/s3-provider.test.js.map +1 -0
- package/dist/storage/types.d.ts +65 -0
- package/dist/storage/types.js +12 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/types/chunk.d.ts +32 -0
- package/dist/types/chunk.js +1 -0
- package/dist/types/chunk.js.map +1 -0
- package/dist/types/config.d.ts +71 -0
- package/dist/types/config.js +1 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/provider.d.ts +54 -0
- package/dist/types/provider.js +36 -0
- package/dist/types/provider.js.map +1 -0
- package/dist/types/search.d.ts +27 -0
- package/dist/types/search.js +1 -0
- package/dist/types/search.js.map +1 -0
- package/package.json +70 -0
|
@@ -0,0 +1,600 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { MarkdownParser, parseFrontmatter, extractWikilinks, extractTags, } from './markdown-parser.js';
|
|
3
|
+
describe('MarkdownParser', () => {
|
|
4
|
+
describe('parseFrontmatter', () => {
|
|
5
|
+
it('should parse simple key-value frontmatter', () => {
|
|
6
|
+
const content = `---
|
|
7
|
+
title: My Document
|
|
8
|
+
author: John
|
|
9
|
+
---
|
|
10
|
+
# Hello`;
|
|
11
|
+
const { frontmatter, bodyStartLine } = parseFrontmatter(content);
|
|
12
|
+
expect(frontmatter.title).toBe('My Document');
|
|
13
|
+
expect(frontmatter.raw['author']).toBe('John');
|
|
14
|
+
expect(bodyStartLine).toBe(4);
|
|
15
|
+
});
|
|
16
|
+
it('should parse tags as array', () => {
|
|
17
|
+
const content = `---
|
|
18
|
+
title: Tagged Doc
|
|
19
|
+
tags:
|
|
20
|
+
- javascript
|
|
21
|
+
- typescript
|
|
22
|
+
- react
|
|
23
|
+
---
|
|
24
|
+
Content here`;
|
|
25
|
+
const { frontmatter } = parseFrontmatter(content);
|
|
26
|
+
expect(frontmatter.tags).toEqual(['javascript', 'typescript', 'react']);
|
|
27
|
+
});
|
|
28
|
+
it('should parse inline array tags', () => {
|
|
29
|
+
const content = `---
|
|
30
|
+
tags: [javascript, typescript, react]
|
|
31
|
+
---
|
|
32
|
+
Content`;
|
|
33
|
+
const { frontmatter } = parseFrontmatter(content);
|
|
34
|
+
expect(frontmatter.tags).toEqual(['javascript', 'typescript', 'react']);
|
|
35
|
+
});
|
|
36
|
+
it('should parse aliases', () => {
|
|
37
|
+
const content = `---
|
|
38
|
+
title: Main Doc
|
|
39
|
+
aliases:
|
|
40
|
+
- doc-alias
|
|
41
|
+
- another-name
|
|
42
|
+
---
|
|
43
|
+
Content`;
|
|
44
|
+
const { frontmatter } = parseFrontmatter(content);
|
|
45
|
+
expect(frontmatter.aliases).toEqual(['doc-alias', 'another-name']);
|
|
46
|
+
});
|
|
47
|
+
it('should return empty frontmatter when no delimiters found', () => {
|
|
48
|
+
const content = `# Just a heading
|
|
49
|
+
Some content`;
|
|
50
|
+
const { frontmatter, bodyStartLine } = parseFrontmatter(content);
|
|
51
|
+
expect(frontmatter.title).toBeUndefined();
|
|
52
|
+
expect(frontmatter.tags).toBeUndefined();
|
|
53
|
+
expect(frontmatter.raw).toEqual({});
|
|
54
|
+
expect(bodyStartLine).toBe(0);
|
|
55
|
+
});
|
|
56
|
+
it('should return empty frontmatter when only opening delimiter', () => {
|
|
57
|
+
const content = `---
|
|
58
|
+
title: Broken
|
|
59
|
+
# No closing delimiter`;
|
|
60
|
+
const { frontmatter, bodyStartLine } = parseFrontmatter(content);
|
|
61
|
+
expect(frontmatter.raw).toEqual({});
|
|
62
|
+
expect(bodyStartLine).toBe(0);
|
|
63
|
+
});
|
|
64
|
+
it('should handle quoted values', () => {
|
|
65
|
+
const content = `---
|
|
66
|
+
title: "Quoted Title"
|
|
67
|
+
description: 'Single Quoted'
|
|
68
|
+
---
|
|
69
|
+
Content`;
|
|
70
|
+
const { frontmatter } = parseFrontmatter(content);
|
|
71
|
+
expect(frontmatter.title).toBe('Quoted Title');
|
|
72
|
+
expect(frontmatter.raw['description']).toBe('Single Quoted');
|
|
73
|
+
});
|
|
74
|
+
it('should handle empty frontmatter block', () => {
|
|
75
|
+
const content = `---
|
|
76
|
+
---
|
|
77
|
+
Content`;
|
|
78
|
+
const { frontmatter, bodyStartLine } = parseFrontmatter(content);
|
|
79
|
+
expect(frontmatter.raw).toEqual({});
|
|
80
|
+
expect(bodyStartLine).toBe(2);
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
describe('extractWikilinks', () => {
|
|
84
|
+
it('should extract simple wikilinks', () => {
|
|
85
|
+
const content = 'See [[Document A]] and [[Document B]] for details.';
|
|
86
|
+
const links = extractWikilinks(content);
|
|
87
|
+
expect(links).toEqual(['Document A', 'Document B']);
|
|
88
|
+
});
|
|
89
|
+
it('should extract wikilinks with display text', () => {
|
|
90
|
+
const content = 'Check [[actual-page|displayed text]] here.';
|
|
91
|
+
const links = extractWikilinks(content);
|
|
92
|
+
expect(links).toEqual(['actual-page']);
|
|
93
|
+
});
|
|
94
|
+
it('should deduplicate wikilinks', () => {
|
|
95
|
+
const content = '[[PageA]] and [[PageA]] again and [[PageB]].';
|
|
96
|
+
const links = extractWikilinks(content);
|
|
97
|
+
expect(links).toEqual(['PageA', 'PageB']);
|
|
98
|
+
});
|
|
99
|
+
it('should return empty array when no wikilinks', () => {
|
|
100
|
+
const content = 'Just regular [markdown](link) here.';
|
|
101
|
+
const links = extractWikilinks(content);
|
|
102
|
+
expect(links).toEqual([]);
|
|
103
|
+
});
|
|
104
|
+
it('should handle wikilinks with paths', () => {
|
|
105
|
+
const content = 'See [[folder/subfolder/doc]] for more.';
|
|
106
|
+
const links = extractWikilinks(content);
|
|
107
|
+
expect(links).toEqual(['folder/subfolder/doc']);
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
describe('extractTags', () => {
|
|
111
|
+
it('should extract hashtags from content', () => {
|
|
112
|
+
const content = 'This is about #javascript and #typescript.';
|
|
113
|
+
const tags = extractTags(content);
|
|
114
|
+
expect(tags).toEqual(['javascript', 'typescript']);
|
|
115
|
+
});
|
|
116
|
+
it('should not extract headings as tags', () => {
|
|
117
|
+
const content = `# Heading 1
|
|
118
|
+
## Heading 2
|
|
119
|
+
Some text with #real-tag here.`;
|
|
120
|
+
const tags = extractTags(content);
|
|
121
|
+
// Headings should not be treated as tags because they have space after #
|
|
122
|
+
expect(tags).toEqual(['real-tag']);
|
|
123
|
+
});
|
|
124
|
+
it('should not extract tags from code blocks', () => {
|
|
125
|
+
const content = `Some text #real-tag
|
|
126
|
+
|
|
127
|
+
\`\`\`javascript
|
|
128
|
+
const color = '#ff0000';
|
|
129
|
+
\`\`\`
|
|
130
|
+
|
|
131
|
+
More text #another-tag`;
|
|
132
|
+
const tags = extractTags(content);
|
|
133
|
+
expect(tags).toContain('real-tag');
|
|
134
|
+
expect(tags).toContain('another-tag');
|
|
135
|
+
expect(tags).not.toContain('ff0000');
|
|
136
|
+
});
|
|
137
|
+
it('should not extract tags from inline code', () => {
|
|
138
|
+
const content = 'Use `#selector` in CSS. But #real-tag is here.';
|
|
139
|
+
const tags = extractTags(content);
|
|
140
|
+
expect(tags).toEqual(['real-tag']);
|
|
141
|
+
});
|
|
142
|
+
it('should deduplicate tags', () => {
|
|
143
|
+
const content = '#tag1 and #tag1 and #tag2';
|
|
144
|
+
const tags = extractTags(content);
|
|
145
|
+
expect(tags).toEqual(['tag1', 'tag2']);
|
|
146
|
+
});
|
|
147
|
+
it('should handle tags with slashes and dots', () => {
|
|
148
|
+
const content = 'Tagged with #project/subtopic and #v2.0';
|
|
149
|
+
const tags = extractTags(content);
|
|
150
|
+
expect(tags).toContain('project/subtopic');
|
|
151
|
+
expect(tags).toContain('v2.0');
|
|
152
|
+
});
|
|
153
|
+
it('should return empty array when no tags', () => {
|
|
154
|
+
const content = 'Just plain text without any tags.';
|
|
155
|
+
const tags = extractTags(content);
|
|
156
|
+
expect(tags).toEqual([]);
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
describe('MarkdownParser.isMarkdownFile', () => {
|
|
160
|
+
it('should recognize .md files', () => {
|
|
161
|
+
expect(MarkdownParser.isMarkdownFile('README.md')).toBe(true);
|
|
162
|
+
});
|
|
163
|
+
it('should recognize .mdx files', () => {
|
|
164
|
+
expect(MarkdownParser.isMarkdownFile('component.mdx')).toBe(true);
|
|
165
|
+
});
|
|
166
|
+
it('should recognize .markdown files', () => {
|
|
167
|
+
expect(MarkdownParser.isMarkdownFile('guide.markdown')).toBe(true);
|
|
168
|
+
});
|
|
169
|
+
it('should be case-insensitive', () => {
|
|
170
|
+
expect(MarkdownParser.isMarkdownFile('README.MD')).toBe(true);
|
|
171
|
+
expect(MarkdownParser.isMarkdownFile('notes.Md')).toBe(true);
|
|
172
|
+
});
|
|
173
|
+
it('should reject non-markdown files', () => {
|
|
174
|
+
expect(MarkdownParser.isMarkdownFile('script.ts')).toBe(false);
|
|
175
|
+
expect(MarkdownParser.isMarkdownFile('style.css')).toBe(false);
|
|
176
|
+
expect(MarkdownParser.isMarkdownFile('data.json')).toBe(false);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
describe('MarkdownParser.parse', () => {
|
|
180
|
+
const parser = new MarkdownParser();
|
|
181
|
+
it('should parse empty content', () => {
|
|
182
|
+
const result = parser.parse('empty.md', '');
|
|
183
|
+
expect(result.isOk()).toBe(true);
|
|
184
|
+
const parsed = result._unsafeUnwrap();
|
|
185
|
+
expect(parsed.chunks).toHaveLength(0);
|
|
186
|
+
expect(parsed.sections).toHaveLength(0);
|
|
187
|
+
});
|
|
188
|
+
it('should parse whitespace-only content', () => {
|
|
189
|
+
const result = parser.parse('whitespace.md', ' \n \n ');
|
|
190
|
+
expect(result.isOk()).toBe(true);
|
|
191
|
+
const parsed = result._unsafeUnwrap();
|
|
192
|
+
expect(parsed.chunks).toHaveLength(0);
|
|
193
|
+
});
|
|
194
|
+
it('should parse simple document with headings', () => {
|
|
195
|
+
const content = `# Introduction
|
|
196
|
+
|
|
197
|
+
This is the intro paragraph.
|
|
198
|
+
|
|
199
|
+
## Details
|
|
200
|
+
|
|
201
|
+
Here are the details.
|
|
202
|
+
|
|
203
|
+
## Conclusion
|
|
204
|
+
|
|
205
|
+
Final thoughts.`;
|
|
206
|
+
const result = parser.parse('doc.md', content);
|
|
207
|
+
expect(result.isOk()).toBe(true);
|
|
208
|
+
const parsed = result._unsafeUnwrap();
|
|
209
|
+
expect(parsed.chunks.length).toBeGreaterThanOrEqual(3);
|
|
210
|
+
// All chunks should have type 'doc'
|
|
211
|
+
for (const chunk of parsed.chunks) {
|
|
212
|
+
expect(chunk.metadata.chunkType).toBe('doc');
|
|
213
|
+
}
|
|
214
|
+
// All chunks should have language 'markdown'
|
|
215
|
+
for (const chunk of parsed.chunks) {
|
|
216
|
+
expect(chunk.language).toBe('markdown');
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
it('should parse document with frontmatter', () => {
|
|
220
|
+
const content = `---
|
|
221
|
+
title: Architecture Guide
|
|
222
|
+
tags:
|
|
223
|
+
- architecture
|
|
224
|
+
- design
|
|
225
|
+
aliases:
|
|
226
|
+
- arch-guide
|
|
227
|
+
---
|
|
228
|
+
|
|
229
|
+
# Architecture
|
|
230
|
+
|
|
231
|
+
This document describes the architecture.`;
|
|
232
|
+
const result = parser.parse('arch.md', content);
|
|
233
|
+
expect(result.isOk()).toBe(true);
|
|
234
|
+
const parsed = result._unsafeUnwrap();
|
|
235
|
+
expect(parsed.frontmatter.title).toBe('Architecture Guide');
|
|
236
|
+
expect(parsed.frontmatter.tags).toEqual(['architecture', 'design']);
|
|
237
|
+
expect(parsed.frontmatter.aliases).toEqual(['arch-guide']);
|
|
238
|
+
// Chunks should include frontmatter metadata
|
|
239
|
+
expect(parsed.chunks.length).toBeGreaterThan(0);
|
|
240
|
+
const chunk = parsed.chunks[0];
|
|
241
|
+
expect(chunk.metadata.tags).toContain('architecture');
|
|
242
|
+
expect(chunk.metadata.aliases).toEqual(['arch-guide']);
|
|
243
|
+
expect(chunk.metadata.docTitle).toBe('Architecture Guide');
|
|
244
|
+
});
|
|
245
|
+
it('should extract wikilinks from content and store in metadata', () => {
|
|
246
|
+
const content = `# References
|
|
247
|
+
|
|
248
|
+
See [[API Guide]] and [[Setup Instructions|setup]] for more info.
|
|
249
|
+
|
|
250
|
+
Also check [[API Guide]] again.`;
|
|
251
|
+
const result = parser.parse('refs.md', content);
|
|
252
|
+
expect(result.isOk()).toBe(true);
|
|
253
|
+
const parsed = result._unsafeUnwrap();
|
|
254
|
+
expect(parsed.chunks.length).toBeGreaterThan(0);
|
|
255
|
+
const chunk = parsed.chunks[0];
|
|
256
|
+
expect(chunk.metadata.links).toContain('API Guide');
|
|
257
|
+
expect(chunk.metadata.links).toContain('Setup Instructions');
|
|
258
|
+
});
|
|
259
|
+
it('should extract tags from content and store in metadata', () => {
|
|
260
|
+
const content = `# Development
|
|
261
|
+
|
|
262
|
+
Working with #typescript and #nodejs.
|
|
263
|
+
|
|
264
|
+
Remember #best-practices.`;
|
|
265
|
+
const result = parser.parse('dev.md', content);
|
|
266
|
+
expect(result.isOk()).toBe(true);
|
|
267
|
+
const parsed = result._unsafeUnwrap();
|
|
268
|
+
expect(parsed.chunks.length).toBeGreaterThan(0);
|
|
269
|
+
const chunk = parsed.chunks[0];
|
|
270
|
+
expect(chunk.metadata.tags).toContain('typescript');
|
|
271
|
+
expect(chunk.metadata.tags).toContain('nodejs');
|
|
272
|
+
expect(chunk.metadata.tags).toContain('best-practices');
|
|
273
|
+
});
|
|
274
|
+
it('should merge frontmatter tags with inline tags', () => {
|
|
275
|
+
const content = `---
|
|
276
|
+
tags:
|
|
277
|
+
- guide
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
# Section
|
|
281
|
+
|
|
282
|
+
Content with #inline-tag here.`;
|
|
283
|
+
const result = parser.parse('merged.md', content);
|
|
284
|
+
expect(result.isOk()).toBe(true);
|
|
285
|
+
const parsed = result._unsafeUnwrap();
|
|
286
|
+
const chunk = parsed.chunks[0];
|
|
287
|
+
expect(chunk.metadata.tags).toContain('guide');
|
|
288
|
+
expect(chunk.metadata.tags).toContain('inline-tag');
|
|
289
|
+
});
|
|
290
|
+
it('should handle document without headings', () => {
|
|
291
|
+
const content = `Just a simple document without any headings.
|
|
292
|
+
|
|
293
|
+
It has multiple paragraphs.
|
|
294
|
+
|
|
295
|
+
And references to [[Other Doc]].`;
|
|
296
|
+
const result = parser.parse('simple.md', content);
|
|
297
|
+
expect(result.isOk()).toBe(true);
|
|
298
|
+
const parsed = result._unsafeUnwrap();
|
|
299
|
+
expect(parsed.chunks.length).toBeGreaterThan(0);
|
|
300
|
+
expect(parsed.chunks[0].metadata.name).toBe('(document)');
|
|
301
|
+
});
|
|
302
|
+
it('should handle code blocks in markdown', () => {
|
|
303
|
+
const content = `# Usage
|
|
304
|
+
|
|
305
|
+
Here is how to use it:
|
|
306
|
+
|
|
307
|
+
\`\`\`typescript
|
|
308
|
+
const parser = new MarkdownParser();
|
|
309
|
+
const result = parser.parse('file.md', content);
|
|
310
|
+
\`\`\`
|
|
311
|
+
|
|
312
|
+
And another example:
|
|
313
|
+
|
|
314
|
+
\`\`\`python
|
|
315
|
+
print("hello world")
|
|
316
|
+
\`\`\``;
|
|
317
|
+
const result = parser.parse('usage.md', content);
|
|
318
|
+
expect(result.isOk()).toBe(true);
|
|
319
|
+
const parsed = result._unsafeUnwrap();
|
|
320
|
+
expect(parsed.sections.length).toBeGreaterThan(0);
|
|
321
|
+
// The section should have detected code blocks
|
|
322
|
+
const section = parsed.sections[0];
|
|
323
|
+
expect(section.codeBlocks.length).toBe(2);
|
|
324
|
+
expect(section.codeBlocks[0].language).toBe('typescript');
|
|
325
|
+
expect(section.codeBlocks[1].language).toBe('python');
|
|
326
|
+
});
|
|
327
|
+
it('should use heading as chunk name', () => {
|
|
328
|
+
const content = `# My Feature
|
|
329
|
+
|
|
330
|
+
Description of the feature.
|
|
331
|
+
|
|
332
|
+
## Implementation
|
|
333
|
+
|
|
334
|
+
Details about implementation.`;
|
|
335
|
+
const result = parser.parse('feature.md', content);
|
|
336
|
+
expect(result.isOk()).toBe(true);
|
|
337
|
+
const parsed = result._unsafeUnwrap();
|
|
338
|
+
const names = parsed.chunks.map((c) => c.metadata.name);
|
|
339
|
+
expect(names).toContain('My Feature');
|
|
340
|
+
expect(names).toContain('Implementation');
|
|
341
|
+
});
|
|
342
|
+
it('should use frontmatter title as fallback name', () => {
|
|
343
|
+
const content = `---
|
|
344
|
+
title: API Reference
|
|
345
|
+
---
|
|
346
|
+
|
|
347
|
+
This document has no headings but has a title in frontmatter.`;
|
|
348
|
+
const result = parser.parse('api.md', content);
|
|
349
|
+
expect(result.isOk()).toBe(true);
|
|
350
|
+
const parsed = result._unsafeUnwrap();
|
|
351
|
+
expect(parsed.chunks[0].metadata.name).toBe('API Reference');
|
|
352
|
+
});
|
|
353
|
+
it('should set correct file path on chunks', () => {
|
|
354
|
+
const content = `# Test
|
|
355
|
+
|
|
356
|
+
Some content.`;
|
|
357
|
+
const filePath = '/docs/test-file.md';
|
|
358
|
+
const result = parser.parse(filePath, content);
|
|
359
|
+
expect(result.isOk()).toBe(true);
|
|
360
|
+
const parsed = result._unsafeUnwrap();
|
|
361
|
+
for (const chunk of parsed.chunks) {
|
|
362
|
+
expect(chunk.filePath).toBe(filePath);
|
|
363
|
+
}
|
|
364
|
+
});
|
|
365
|
+
it('should generate unique chunk IDs', () => {
|
|
366
|
+
const content = `# Section A
|
|
367
|
+
|
|
368
|
+
Content A.
|
|
369
|
+
|
|
370
|
+
## Section B
|
|
371
|
+
|
|
372
|
+
Content B.
|
|
373
|
+
|
|
374
|
+
## Section C
|
|
375
|
+
|
|
376
|
+
Content C.`;
|
|
377
|
+
const result = parser.parse('doc.md', content);
|
|
378
|
+
expect(result.isOk()).toBe(true);
|
|
379
|
+
const parsed = result._unsafeUnwrap();
|
|
380
|
+
const ids = parsed.chunks.map((c) => c.id);
|
|
381
|
+
const uniqueIds = new Set(ids);
|
|
382
|
+
expect(uniqueIds.size).toBe(ids.length);
|
|
383
|
+
});
|
|
384
|
+
it('should handle deeply nested headings', () => {
|
|
385
|
+
const content = `# H1
|
|
386
|
+
|
|
387
|
+
## H2
|
|
388
|
+
|
|
389
|
+
### H3
|
|
390
|
+
|
|
391
|
+
#### H4
|
|
392
|
+
|
|
393
|
+
##### H5
|
|
394
|
+
|
|
395
|
+
###### H6
|
|
396
|
+
|
|
397
|
+
Content at level 6.`;
|
|
398
|
+
const result = parser.parse('nested.md', content);
|
|
399
|
+
expect(result.isOk()).toBe(true);
|
|
400
|
+
const parsed = result._unsafeUnwrap();
|
|
401
|
+
expect(parsed.sections.length).toBe(6);
|
|
402
|
+
});
|
|
403
|
+
it('should handle Obsidian-style document with mixed features', () => {
|
|
404
|
+
const content = `---
|
|
405
|
+
title: Project Notes
|
|
406
|
+
tags: [project, notes]
|
|
407
|
+
aliases:
|
|
408
|
+
- proj-notes
|
|
409
|
+
---
|
|
410
|
+
|
|
411
|
+
# Project Overview
|
|
412
|
+
|
|
413
|
+
This project uses [[TypeScript]] and [[Node.js]].
|
|
414
|
+
|
|
415
|
+
## Key Features #important
|
|
416
|
+
|
|
417
|
+
- Feature 1: See [[Feature 1 Doc]]
|
|
418
|
+
- Feature 2: Related to #backend
|
|
419
|
+
- Feature 3: Uses [[API Layer|API]]
|
|
420
|
+
|
|
421
|
+
## Code Example
|
|
422
|
+
|
|
423
|
+
\`\`\`typescript
|
|
424
|
+
export function hello(): string {
|
|
425
|
+
return 'hello';
|
|
426
|
+
}
|
|
427
|
+
\`\`\``;
|
|
428
|
+
const result = parser.parse('project.md', content);
|
|
429
|
+
expect(result.isOk()).toBe(true);
|
|
430
|
+
const parsed = result._unsafeUnwrap();
|
|
431
|
+
// Should have frontmatter
|
|
432
|
+
expect(parsed.frontmatter.title).toBe('Project Notes');
|
|
433
|
+
expect(parsed.frontmatter.tags).toEqual(['project', 'notes']);
|
|
434
|
+
expect(parsed.frontmatter.aliases).toEqual(['proj-notes']);
|
|
435
|
+
// Should have multiple sections
|
|
436
|
+
expect(parsed.sections.length).toBe(3);
|
|
437
|
+
// All chunks should be 'doc' type
|
|
438
|
+
for (const chunk of parsed.chunks) {
|
|
439
|
+
expect(chunk.metadata.chunkType).toBe('doc');
|
|
440
|
+
}
|
|
441
|
+
// Check wikilinks are extracted
|
|
442
|
+
const allLinks = parsed.sections.flatMap((s) => s.wikilinks);
|
|
443
|
+
expect(allLinks).toContain('TypeScript');
|
|
444
|
+
expect(allLinks).toContain('Node.js');
|
|
445
|
+
expect(allLinks).toContain('Feature 1 Doc');
|
|
446
|
+
expect(allLinks).toContain('API Layer');
|
|
447
|
+
});
|
|
448
|
+
it('should handle lists grouped under headings', () => {
|
|
449
|
+
const content = `# Todo List
|
|
450
|
+
|
|
451
|
+
- Item 1
|
|
452
|
+
- Item 2
|
|
453
|
+
- Sub-item 2a
|
|
454
|
+
- Sub-item 2b
|
|
455
|
+
- Item 3
|
|
456
|
+
|
|
457
|
+
## Completed
|
|
458
|
+
|
|
459
|
+
1. Done A
|
|
460
|
+
2. Done B`;
|
|
461
|
+
const result = parser.parse('todo.md', content);
|
|
462
|
+
expect(result.isOk()).toBe(true);
|
|
463
|
+
const parsed = result._unsafeUnwrap();
|
|
464
|
+
// Lists should be part of their parent heading's chunk
|
|
465
|
+
expect(parsed.chunks.length).toBeGreaterThanOrEqual(2);
|
|
466
|
+
const todoChunk = parsed.chunks.find((c) => c.metadata.name === 'Todo List');
|
|
467
|
+
expect(todoChunk).toBeDefined();
|
|
468
|
+
expect(todoChunk.content).toContain('Item 1');
|
|
469
|
+
expect(todoChunk.content).toContain('Sub-item 2a');
|
|
470
|
+
});
|
|
471
|
+
it('should set nlSummary to empty string', () => {
|
|
472
|
+
const content = `# Test
|
|
473
|
+
|
|
474
|
+
Content.`;
|
|
475
|
+
const result = parser.parse('test.md', content);
|
|
476
|
+
expect(result.isOk()).toBe(true);
|
|
477
|
+
const parsed = result._unsafeUnwrap();
|
|
478
|
+
for (const chunk of parsed.chunks) {
|
|
479
|
+
expect(chunk.nlSummary).toBe('');
|
|
480
|
+
}
|
|
481
|
+
});
|
|
482
|
+
it('should set empty arrays for declarations, imports, exports in metadata', () => {
|
|
483
|
+
const content = `# Test
|
|
484
|
+
|
|
485
|
+
Content.`;
|
|
486
|
+
const result = parser.parse('test.md', content);
|
|
487
|
+
expect(result.isOk()).toBe(true);
|
|
488
|
+
const parsed = result._unsafeUnwrap();
|
|
489
|
+
for (const chunk of parsed.chunks) {
|
|
490
|
+
expect(chunk.metadata.declarations).toEqual([]);
|
|
491
|
+
expect(chunk.metadata.imports).toEqual([]);
|
|
492
|
+
expect(chunk.metadata.exports).toEqual([]);
|
|
493
|
+
}
|
|
494
|
+
});
|
|
495
|
+
});
|
|
496
|
+
describe('MarkdownParser with custom config', () => {
|
|
497
|
+
it('should split large sections when exceeding maxTokensPerChunk', () => {
|
|
498
|
+
const parser = new MarkdownParser({ maxTokensPerChunk: 50 });
|
|
499
|
+
// Create content that exceeds 50 tokens (50 * 4 = 200 characters)
|
|
500
|
+
const longParagraph = 'This is a fairly long paragraph that should exceed the token limit. '.repeat(5);
|
|
501
|
+
const content = `# Large Section
|
|
502
|
+
|
|
503
|
+
${longParagraph}
|
|
504
|
+
|
|
505
|
+
Another paragraph here for good measure with some extra text.
|
|
506
|
+
|
|
507
|
+
Yet another paragraph to push us over the limit.`;
|
|
508
|
+
const result = parser.parse('large.md', content);
|
|
509
|
+
expect(result.isOk()).toBe(true);
|
|
510
|
+
const parsed = result._unsafeUnwrap();
|
|
511
|
+
// Should have been split into multiple chunks
|
|
512
|
+
expect(parsed.chunks.length).toBeGreaterThan(1);
|
|
513
|
+
});
|
|
514
|
+
});
|
|
515
|
+
describe('Edge cases', () => {
|
|
516
|
+
const parser = new MarkdownParser();
|
|
517
|
+
it('should handle document with only frontmatter', () => {
|
|
518
|
+
const content = `---
|
|
519
|
+
title: Empty Body
|
|
520
|
+
tags: [test]
|
|
521
|
+
---`;
|
|
522
|
+
const result = parser.parse('frontmatter-only.md', content);
|
|
523
|
+
expect(result.isOk()).toBe(true);
|
|
524
|
+
const parsed = result._unsafeUnwrap();
|
|
525
|
+
expect(parsed.frontmatter.title).toBe('Empty Body');
|
|
526
|
+
expect(parsed.chunks).toHaveLength(0);
|
|
527
|
+
});
|
|
528
|
+
it('should handle document with only a heading', () => {
|
|
529
|
+
const content = `# Just a Heading`;
|
|
530
|
+
const result = parser.parse('heading-only.md', content);
|
|
531
|
+
expect(result.isOk()).toBe(true);
|
|
532
|
+
const parsed = result._unsafeUnwrap();
|
|
533
|
+
expect(parsed.chunks.length).toBe(1);
|
|
534
|
+
expect(parsed.chunks[0].metadata.name).toBe('Just a Heading');
|
|
535
|
+
});
|
|
536
|
+
it('should handle consecutive headings without content', () => {
|
|
537
|
+
const content = `# H1
|
|
538
|
+
|
|
539
|
+
## H2
|
|
540
|
+
|
|
541
|
+
## H3`;
|
|
542
|
+
const result = parser.parse('consecutive.md', content);
|
|
543
|
+
expect(result.isOk()).toBe(true);
|
|
544
|
+
const parsed = result._unsafeUnwrap();
|
|
545
|
+
// Each heading becomes its own section
|
|
546
|
+
expect(parsed.sections.length).toBe(3);
|
|
547
|
+
});
|
|
548
|
+
it('should handle special characters in headings', () => {
|
|
549
|
+
const content = `# What's new in v2.0?
|
|
550
|
+
|
|
551
|
+
Details here.
|
|
552
|
+
|
|
553
|
+
## Bug fixes & improvements
|
|
554
|
+
|
|
555
|
+
More details.`;
|
|
556
|
+
const result = parser.parse('special.md', content);
|
|
557
|
+
expect(result.isOk()).toBe(true);
|
|
558
|
+
const parsed = result._unsafeUnwrap();
|
|
559
|
+
const names = parsed.chunks.map((c) => c.metadata.name);
|
|
560
|
+
expect(names).toContain("What's new in v2.0?");
|
|
561
|
+
expect(names).toContain('Bug fixes & improvements');
|
|
562
|
+
});
|
|
563
|
+
it('should handle frontmatter with complex values', () => {
|
|
564
|
+
const content = `---
|
|
565
|
+
title: Complex
|
|
566
|
+
date: 2024-01-15
|
|
567
|
+
draft: false
|
|
568
|
+
tags: [a, b, c]
|
|
569
|
+
---
|
|
570
|
+
|
|
571
|
+
# Content`;
|
|
572
|
+
const { frontmatter } = parseFrontmatter(content);
|
|
573
|
+
expect(frontmatter.title).toBe('Complex');
|
|
574
|
+
expect(frontmatter.raw['date']).toBe('2024-01-15');
|
|
575
|
+
expect(frontmatter.raw['draft']).toBe('false');
|
|
576
|
+
expect(frontmatter.tags).toEqual(['a', 'b', 'c']);
|
|
577
|
+
});
|
|
578
|
+
it('should handle content before first heading', () => {
|
|
579
|
+
const content = `Some introductory text before any heading.
|
|
580
|
+
|
|
581
|
+
# First Heading
|
|
582
|
+
|
|
583
|
+
Content under heading.`;
|
|
584
|
+
const result = parser.parse('pre-heading.md', content);
|
|
585
|
+
expect(result.isOk()).toBe(true);
|
|
586
|
+
const parsed = result._unsafeUnwrap();
|
|
587
|
+
// Should have 2 sections: pre-heading content + heading section
|
|
588
|
+
expect(parsed.sections.length).toBe(2);
|
|
589
|
+
});
|
|
590
|
+
it('should handle wikilinks in frontmatter-less doc', () => {
|
|
591
|
+
const content = `This links to [[SomePage]] and [[Other/Page]].`;
|
|
592
|
+
const result = parser.parse('links.md', content);
|
|
593
|
+
expect(result.isOk()).toBe(true);
|
|
594
|
+
const parsed = result._unsafeUnwrap();
|
|
595
|
+
expect(parsed.chunks[0].metadata.links).toContain('SomePage');
|
|
596
|
+
expect(parsed.chunks[0].metadata.links).toContain('Other/Page');
|
|
597
|
+
});
|
|
598
|
+
});
|
|
599
|
+
});
|
|
600
|
+
//# sourceMappingURL=markdown-parser.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown-parser.test.js","sourceRoot":"","sources":["../../src/parser/markdown-parser.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type Result } from 'neverthrow';
|
|
2
|
+
import type { Parser, ParsedFile } from '../types/provider.js';
|
|
3
|
+
import { ParseError } from '../types/provider.js';
|
|
4
|
+
/**
|
|
5
|
+
* A Parser implementation that uses tree-sitter WASM bindings
|
|
6
|
+
* to parse source files and extract top-level declarations.
|
|
7
|
+
*/
|
|
8
|
+
export declare class TreeSitterParser implements Parser {
|
|
9
|
+
private parser;
|
|
10
|
+
private registry;
|
|
11
|
+
private initialized;
|
|
12
|
+
/**
|
|
13
|
+
* Initialize the tree-sitter WASM runtime and create internal instances.
|
|
14
|
+
* Must be called before `parse()`.
|
|
15
|
+
*/
|
|
16
|
+
initialize(): Promise<Result<void, ParseError>>;
|
|
17
|
+
/**
|
|
18
|
+
* Parse a source file and extract its top-level declarations.
|
|
19
|
+
*
|
|
20
|
+
* Detects the language from the file path, loads the corresponding WASM grammar,
|
|
21
|
+
* parses the content into an AST, and extracts declaration names.
|
|
22
|
+
*/
|
|
23
|
+
parse(filePath: string, content: string): Promise<Result<ParsedFile, ParseError>>;
|
|
24
|
+
/**
|
|
25
|
+
* Get the list of all file extensions / languages this parser supports.
|
|
26
|
+
*/
|
|
27
|
+
supportedLanguages(): string[];
|
|
28
|
+
/**
|
|
29
|
+
* Clean up parser resources.
|
|
30
|
+
*/
|
|
31
|
+
dispose(): void;
|
|
32
|
+
}
|