opencode-rag-plugin 1.0.0 → 1.2.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 (143) hide show
  1. package/ReadMe.md +463 -423
  2. package/dist/__tests__/chunker/c.test.d.ts +1 -0
  3. package/dist/__tests__/chunker/c.test.js +82 -0
  4. package/dist/__tests__/chunker/c.test.js.map +1 -0
  5. package/dist/__tests__/chunker/cpp.test.d.ts +1 -0
  6. package/dist/__tests__/chunker/cpp.test.js +96 -0
  7. package/dist/__tests__/chunker/cpp.test.js.map +1 -0
  8. package/dist/__tests__/chunker/csharp.test.d.ts +1 -0
  9. package/dist/__tests__/chunker/csharp.test.js +85 -0
  10. package/dist/__tests__/chunker/csharp.test.js.map +1 -0
  11. package/dist/__tests__/chunker/css.test.d.ts +1 -0
  12. package/dist/__tests__/chunker/css.test.js +64 -0
  13. package/dist/__tests__/chunker/css.test.js.map +1 -0
  14. package/dist/__tests__/chunker/factory.test.d.ts +1 -0
  15. package/dist/__tests__/chunker/factory.test.js +202 -0
  16. package/dist/__tests__/chunker/factory.test.js.map +1 -0
  17. package/dist/__tests__/chunker/fallback.test.d.ts +1 -0
  18. package/dist/__tests__/chunker/fallback.test.js +67 -0
  19. package/dist/__tests__/chunker/fallback.test.js.map +1 -0
  20. package/dist/__tests__/chunker/go.test.d.ts +1 -0
  21. package/dist/__tests__/chunker/go.test.js +90 -0
  22. package/dist/__tests__/chunker/go.test.js.map +1 -0
  23. package/dist/__tests__/chunker/grammar.test.d.ts +1 -0
  24. package/dist/__tests__/chunker/grammar.test.js +108 -0
  25. package/dist/__tests__/chunker/grammar.test.js.map +1 -0
  26. package/dist/__tests__/chunker/html.test.d.ts +1 -0
  27. package/dist/__tests__/chunker/html.test.js +64 -0
  28. package/dist/__tests__/chunker/html.test.js.map +1 -0
  29. package/dist/__tests__/chunker/java.test.d.ts +1 -0
  30. package/dist/__tests__/chunker/java.test.js +83 -0
  31. package/dist/__tests__/chunker/java.test.js.map +1 -0
  32. package/dist/__tests__/chunker/javascript.test.d.ts +1 -0
  33. package/dist/__tests__/chunker/javascript.test.js +88 -0
  34. package/dist/__tests__/chunker/javascript.test.js.map +1 -0
  35. package/dist/__tests__/chunker/json.test.d.ts +1 -0
  36. package/dist/__tests__/chunker/json.test.js +54 -0
  37. package/dist/__tests__/chunker/json.test.js.map +1 -0
  38. package/dist/__tests__/chunker/kotlin.test.d.ts +1 -0
  39. package/dist/__tests__/chunker/kotlin.test.js +42 -0
  40. package/dist/__tests__/chunker/kotlin.test.js.map +1 -0
  41. package/dist/__tests__/chunker/markdown.test.d.ts +1 -0
  42. package/dist/__tests__/chunker/markdown.test.js +76 -0
  43. package/dist/__tests__/chunker/markdown.test.js.map +1 -0
  44. package/dist/__tests__/chunker/python.test.d.ts +1 -0
  45. package/dist/__tests__/chunker/python.test.js +81 -0
  46. package/dist/__tests__/chunker/python.test.js.map +1 -0
  47. package/dist/__tests__/chunker/razor.test.d.ts +1 -0
  48. package/dist/__tests__/chunker/razor.test.js +73 -0
  49. package/dist/__tests__/chunker/razor.test.js.map +1 -0
  50. package/dist/__tests__/chunker/register.test.d.ts +1 -0
  51. package/dist/__tests__/chunker/register.test.js +93 -0
  52. package/dist/__tests__/chunker/register.test.js.map +1 -0
  53. package/dist/__tests__/chunker/ruby.test.d.ts +1 -0
  54. package/dist/__tests__/chunker/ruby.test.js +40 -0
  55. package/dist/__tests__/chunker/ruby.test.js.map +1 -0
  56. package/dist/__tests__/chunker/rust.test.d.ts +1 -0
  57. package/dist/__tests__/chunker/rust.test.js +42 -0
  58. package/dist/__tests__/chunker/rust.test.js.map +1 -0
  59. package/dist/__tests__/chunker/sln.test.d.ts +1 -0
  60. package/dist/__tests__/chunker/sln.test.js +45 -0
  61. package/dist/__tests__/chunker/sln.test.js.map +1 -0
  62. package/dist/__tests__/chunker/swift.test.d.ts +1 -0
  63. package/dist/__tests__/chunker/swift.test.js +49 -0
  64. package/dist/__tests__/chunker/swift.test.js.map +1 -0
  65. package/dist/__tests__/chunker/typescript.test.d.ts +1 -0
  66. package/dist/__tests__/chunker/typescript.test.js +92 -0
  67. package/dist/__tests__/chunker/typescript.test.js.map +1 -0
  68. package/dist/__tests__/chunker/uuid.test.d.ts +1 -0
  69. package/dist/__tests__/chunker/uuid.test.js +19 -0
  70. package/dist/__tests__/chunker/uuid.test.js.map +1 -0
  71. package/dist/__tests__/chunker/xml.test.d.ts +1 -0
  72. package/dist/__tests__/chunker/xml.test.js +50 -0
  73. package/dist/__tests__/chunker/xml.test.js.map +1 -0
  74. package/dist/__tests__/core/config.test.d.ts +1 -0
  75. package/dist/__tests__/core/config.test.js +75 -0
  76. package/dist/__tests__/core/config.test.js.map +1 -0
  77. package/dist/__tests__/core/fileLogger.test.d.ts +1 -0
  78. package/dist/__tests__/core/fileLogger.test.js +34 -0
  79. package/dist/__tests__/core/fileLogger.test.js.map +1 -0
  80. package/dist/__tests__/core/manifest.test.d.ts +1 -0
  81. package/dist/__tests__/core/manifest.test.js +56 -0
  82. package/dist/__tests__/core/manifest.test.js.map +1 -0
  83. package/dist/__tests__/embedder/embedBatch.test.d.ts +1 -0
  84. package/dist/__tests__/embedder/embedBatch.test.js +88 -0
  85. package/dist/__tests__/embedder/embedBatch.test.js.map +1 -0
  86. package/dist/__tests__/embedder/factory.test.d.ts +1 -0
  87. package/dist/__tests__/embedder/factory.test.js +71 -0
  88. package/dist/__tests__/embedder/factory.test.js.map +1 -0
  89. package/dist/__tests__/embedder/ollama.test.d.ts +1 -0
  90. package/dist/__tests__/embedder/ollama.test.js +106 -0
  91. package/dist/__tests__/embedder/ollama.test.js.map +1 -0
  92. package/dist/__tests__/embedder/openai.test.d.ts +1 -0
  93. package/dist/__tests__/embedder/openai.test.js +94 -0
  94. package/dist/__tests__/embedder/openai.test.js.map +1 -0
  95. package/dist/__tests__/indexer/indexer.test.d.ts +1 -0
  96. package/dist/__tests__/indexer/indexer.test.js +176 -0
  97. package/dist/__tests__/indexer/indexer.test.js.map +1 -0
  98. package/dist/__tests__/plugin.test.d.ts +1 -0
  99. package/dist/__tests__/plugin.test.js +77 -0
  100. package/dist/__tests__/plugin.test.js.map +1 -0
  101. package/dist/__tests__/retriever/retriever.test.d.ts +1 -0
  102. package/dist/__tests__/retriever/retriever.test.js +97 -0
  103. package/dist/__tests__/retriever/retriever.test.js.map +1 -0
  104. package/dist/__tests__/vectorstore/lancedb.test.d.ts +1 -0
  105. package/dist/__tests__/vectorstore/lancedb.test.js +159 -0
  106. package/dist/__tests__/vectorstore/lancedb.test.js.map +1 -0
  107. package/dist/chunker/doc.d.ts +8 -0
  108. package/dist/chunker/doc.js +79 -0
  109. package/dist/chunker/doc.js.map +1 -0
  110. package/dist/chunker/docx.d.ts +8 -0
  111. package/dist/chunker/docx.js +78 -0
  112. package/dist/chunker/docx.js.map +1 -0
  113. package/dist/chunker/excel.d.ts +8 -0
  114. package/dist/chunker/excel.js +78 -0
  115. package/dist/chunker/excel.js.map +1 -0
  116. package/dist/chunker/factory.d.ts +1 -0
  117. package/dist/chunker/factory.js +9 -0
  118. package/dist/chunker/factory.js.map +1 -1
  119. package/dist/cli.js +272 -1
  120. package/dist/cli.js.map +1 -1
  121. package/dist/core/config.d.ts +4 -0
  122. package/dist/core/config.js +6 -1
  123. package/dist/core/config.js.map +1 -1
  124. package/dist/indexer.js +18 -0
  125. package/dist/indexer.js.map +1 -1
  126. package/dist/opencode/create-read-tool.d.ts +30 -0
  127. package/dist/opencode/create-read-tool.js +248 -0
  128. package/dist/opencode/create-read-tool.js.map +1 -0
  129. package/dist/opencode/read-fallback.d.ts +21 -0
  130. package/dist/opencode/read-fallback.js +90 -0
  131. package/dist/opencode/read-fallback.js.map +1 -0
  132. package/dist/opencode/read-format.d.ts +40 -0
  133. package/dist/opencode/read-format.js +86 -0
  134. package/dist/opencode/read-format.js.map +1 -0
  135. package/dist/opencode/read-query.d.ts +26 -0
  136. package/dist/opencode/read-query.js +39 -0
  137. package/dist/opencode/read-query.js.map +1 -0
  138. package/dist/opencode/tool-args.d.ts +51 -0
  139. package/dist/opencode/tool-args.js +70 -0
  140. package/dist/opencode/tool-args.js.map +1 -0
  141. package/dist/plugin.js +1 -0
  142. package/dist/plugin.js.map +1 -1
  143. package/package.json +89 -82
@@ -0,0 +1,67 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { FallbackChunker } from "../../chunker/fallback.js";
4
+ describe("FallbackChunker", () => {
5
+ it("returns empty array for empty content", async () => {
6
+ const chunker = new FallbackChunker();
7
+ const chunks = await chunker.chunk("test.txt", "");
8
+ assert.deepStrictEqual(chunks, []);
9
+ });
10
+ it("returns empty array for whitespace-only content", async () => {
11
+ const chunker = new FallbackChunker();
12
+ const chunks = await chunker.chunk("test.txt", " \n \n ");
13
+ assert.deepStrictEqual(chunks, []);
14
+ });
15
+ it("splits content by maxLines", async () => {
16
+ const chunker = new FallbackChunker(3);
17
+ const lines = ["line 1", "line 2", "line 3", "line 4", "line 5"];
18
+ const chunks = await chunker.chunk("test.txt", lines.join("\n"));
19
+ assert.equal(chunks.length, 2);
20
+ assert.equal(chunks[0].metadata.startLine, 1);
21
+ assert.equal(chunks[0].metadata.endLine, 3);
22
+ assert.equal(chunks[1].metadata.startLine, 4);
23
+ assert.equal(chunks[1].metadata.endLine, 5);
24
+ });
25
+ it("creates single chunk for content under maxLines", async () => {
26
+ const chunker = new FallbackChunker(100);
27
+ const chunks = await chunker.chunk("test.txt", "single line");
28
+ assert.equal(chunks.length, 1);
29
+ assert.equal(chunks[0].metadata.startLine, 1);
30
+ assert.equal(chunks[0].metadata.endLine, 1);
31
+ });
32
+ it("sets correct filePath and language metadata", async () => {
33
+ const chunker = new FallbackChunker();
34
+ const chunks = await chunker.chunk("/path/to/file.txt", "content");
35
+ assert.equal(chunks[0].metadata.filePath, "/path/to/file.txt");
36
+ assert.equal(chunks[0].metadata.language, "text");
37
+ });
38
+ it("generates unique id for each chunk", async () => {
39
+ const chunker = new FallbackChunker(1);
40
+ const chunks = await chunker.chunk("test.txt", "a\nb\nc");
41
+ assert.equal(chunks.length, 3);
42
+ const ids = new Set(chunks.map((c) => c.id));
43
+ assert.equal(ids.size, 3);
44
+ });
45
+ it("uses default maxLines of 100", async () => {
46
+ const chunker = new FallbackChunker();
47
+ const lines = Array.from({ length: 150 }, (_, i) => `line ${i + 1}`);
48
+ const chunks = await chunker.chunk("test.txt", lines.join("\n"));
49
+ assert.equal(chunks.length, 2);
50
+ assert.equal(chunks[0].metadata.endLine, 100);
51
+ assert.equal(chunks[1].metadata.startLine, 101);
52
+ assert.equal(chunks[1].metadata.endLine, 150);
53
+ });
54
+ it("skips empty chunks from whitespace-only lines", async () => {
55
+ const chunker = new FallbackChunker(5);
56
+ const content = "line 1\n\n\n\n\nline 6\n\n\n\n\nline 11";
57
+ const chunks = await chunker.chunk("test.txt", content);
58
+ // 11 lines total, chunks of 5: lines 1-5 (trimmed keeps only "line 1"),
59
+ // lines 6-10 (trimmed keeps only "line 6"), lines 11-11 (trimmed keeps "line 11")
60
+ assert.equal(chunks.length, 3);
61
+ });
62
+ it("language property returns 'text'", () => {
63
+ const chunker = new FallbackChunker();
64
+ assert.equal(chunker.language, "text");
65
+ });
66
+ });
67
+ //# sourceMappingURL=fallback.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fallback.test.js","sourceRoot":"","sources":["../../../src/__tests__/chunker/fallback.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,90 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { goChunker } from "../../chunker/go.js";
4
+ describe("GoChunker", () => {
5
+ it("language is 'go'", () => {
6
+ assert.equal(goChunker.language, "go");
7
+ });
8
+ it("fileExtensions includes .go", () => {
9
+ assert.ok(goChunker.fileExtensions.includes(".go"));
10
+ });
11
+ it("grammarName is 'go'", () => {
12
+ assert.equal(goChunker.grammarName, "go");
13
+ });
14
+ it("nodeTypes contains expected types", () => {
15
+ const types = goChunker.nodeTypes;
16
+ assert.ok(types.has("function_declaration"));
17
+ assert.ok(types.has("method_declaration"));
18
+ assert.ok(types.has("type_declaration"));
19
+ });
20
+ it("chunk returns empty array for empty content", async () => {
21
+ const chunks = await goChunker.chunk("test.go", "");
22
+ assert.deepStrictEqual(chunks, []);
23
+ });
24
+ it("chunk returns empty array for whitespace-only content", async () => {
25
+ const chunks = await goChunker.chunk("test.go", " \n \n ");
26
+ assert.deepStrictEqual(chunks, []);
27
+ });
28
+ it("chunk parses a function declaration", async () => {
29
+ const code = "package main\n\nfunc hello() string {\n\treturn \"world\"\n}\n";
30
+ const chunks = await goChunker.chunk("test.go", code);
31
+ assert.ok(chunks.length > 0, "expected at least one chunk");
32
+ assert.equal(chunks[0].metadata.language, "go");
33
+ assert.equal(chunks[0].metadata.filePath, "test.go");
34
+ assert.ok(chunks[0].content.includes("hello"));
35
+ });
36
+ it("chunk parses a method declaration", async () => {
37
+ const code = [
38
+ "package main",
39
+ "",
40
+ "type Counter struct {",
41
+ "\tvalue int",
42
+ "}",
43
+ "",
44
+ "func (c *Counter) Increment() {",
45
+ "\tc.value++",
46
+ "}",
47
+ ].join("\n");
48
+ const chunks = await goChunker.chunk("counter.go", code);
49
+ assert.ok(chunks.length > 0, "expected at least one chunk");
50
+ const methodChunks = chunks.filter((c) => c.content.includes("Increment"));
51
+ assert.ok(methodChunks.length > 0, "expected Increment method chunk");
52
+ });
53
+ it("chunk parses a type declaration", async () => {
54
+ const code = "package main\n\ntype User struct {\n\tName string\n\tAge int\n}\n";
55
+ const chunks = await goChunker.chunk("user.go", code);
56
+ assert.ok(chunks.length > 0, "expected at least one chunk");
57
+ assert.ok(chunks.some((c) => c.content.includes("type User")));
58
+ });
59
+ it("chunk generates unique IDs for multiple declarations", async () => {
60
+ const code = [
61
+ "package main",
62
+ "",
63
+ "func foo() {}",
64
+ "",
65
+ "func bar() {}",
66
+ "",
67
+ "func baz() {}",
68
+ ].join("\n");
69
+ const chunks = await goChunker.chunk("multi.go", code);
70
+ const ids = new Set(chunks.map((c) => c.id));
71
+ assert.equal(ids.size, chunks.length);
72
+ });
73
+ it("chunk sets correct startLine metadata", async () => {
74
+ const code = [
75
+ "package main",
76
+ "",
77
+ "// first function",
78
+ "func first() {}",
79
+ "",
80
+ "// second function",
81
+ "func second() {}",
82
+ ].join("\n");
83
+ const chunks = await goChunker.chunk("lines.go", code);
84
+ assert.ok(chunks.length >= 2, "expected at least two chunks");
85
+ const firstFn = chunks.find((c) => c.content.includes("first"));
86
+ assert.ok(firstFn, "should find first() chunk");
87
+ assert.equal(firstFn.metadata.startLine, 4);
88
+ });
89
+ });
90
+ //# sourceMappingURL=go.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go.test.js","sourceRoot":"","sources":["../../../src/__tests__/chunker/go.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,108 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { walkTree } from "../../chunker/grammar.js";
4
+ function makeNode(type, startIndex, endIndex, startRow, endRow, children = []) {
5
+ return {
6
+ type,
7
+ startIndex,
8
+ endIndex,
9
+ startPosition: { row: startRow },
10
+ endPosition: { row: endRow },
11
+ children,
12
+ };
13
+ }
14
+ describe("walkTree", () => {
15
+ it("returns empty array for leaf node", () => {
16
+ const node = makeNode("identifier", 0, 5, 0, 0);
17
+ const result = walkTree(node, new Set(["function"]), "hello");
18
+ assert.deepStrictEqual(result, []);
19
+ });
20
+ it("does not match at depth 0 (root node type is ignored)", () => {
21
+ const node = makeNode("function_declaration", 0, 20, 0, 2, [
22
+ makeNode("identifier", 5, 10, 0, 0),
23
+ ]);
24
+ const result = walkTree(node, new Set(["function_declaration"]), "function hello() {}");
25
+ // Root node type matches but depth=0 → not collected
26
+ assert.deepStrictEqual(result, []);
27
+ });
28
+ it("matches node at depth 1 when type is in nodeTypes", () => {
29
+ const child = makeNode("function_declaration", 0, 20, 1, 3);
30
+ const root = makeNode("program", 0, 20, 0, 3, [child]);
31
+ const result = walkTree(root, new Set(["function_declaration"]), "function hello() {}");
32
+ assert.equal(result.length, 1);
33
+ assert.equal(result[0].type, "function_declaration");
34
+ });
35
+ it("recurses into children to find matching node", () => {
36
+ const grandchild = makeNode("function_declaration", 0, 20, 2, 5);
37
+ const child = makeNode("block", 0, 20, 1, 5, [grandchild]);
38
+ const root = makeNode("program", 0, 20, 0, 5, [child]);
39
+ const result = walkTree(root, new Set(["function_declaration"]), "function hello() {}");
40
+ assert.equal(result.length, 1);
41
+ assert.equal(result[0].type, "function_declaration");
42
+ });
43
+ it("respects maxDepth parameter", () => {
44
+ const deep = makeNode("function_declaration", 0, 20, 3, 5);
45
+ const mid = makeNode("block", 0, 20, 2, 5, [deep]);
46
+ const child = makeNode("class", 0, 20, 1, 5, [mid]);
47
+ const root = makeNode("program", 0, 20, 0, 5, [child]);
48
+ // Default maxDepth=10: searches depths 0–10 → reaches depth 3
49
+ const result = walkTree(root, new Set(["function_declaration"]), "content");
50
+ assert.equal(result.length, 1);
51
+ // maxDepth=2: searches depths 0–2 → won't reach depth 3
52
+ const resultShallow = walkTree(root, new Set(["function_declaration"]), "content", 2);
53
+ assert.deepStrictEqual(resultShallow, []);
54
+ });
55
+ it("finds multiple matching nodes at same depth", () => {
56
+ const fn1 = makeNode("function_declaration", 0, 10, 1, 1);
57
+ const fn2 = makeNode("function_declaration", 11, 21, 2, 2);
58
+ const root = makeNode("program", 0, 21, 0, 2, [fn1, fn2]);
59
+ const result = walkTree(root, new Set(["function_declaration"]), "fn1() {} fn2() {}");
60
+ assert.equal(result.length, 2);
61
+ });
62
+ it("extracts correct text from source using startIndex/endIndex", () => {
63
+ const source = "function hello() { return 'world'; }";
64
+ const child = makeNode("function_declaration", 0, source.length, 1, 1);
65
+ const root = makeNode("program", 0, source.length, 0, 1, [child]);
66
+ const result = walkTree(root, new Set(["function_declaration"]), source);
67
+ assert.equal(result.length, 1);
68
+ assert.equal(result[0].text, source);
69
+ });
70
+ it("sets correct 1-indexed line numbers from row positions", () => {
71
+ const child = makeNode("function_declaration", 10, 50, 5, 8);
72
+ const root = makeNode("program", 0, 60, 0, 10, [child]);
73
+ const result = walkTree(root, new Set(["function_declaration"]), "some\ncontent\nhere\nmore\nstuff\nfunction foo() {\n return 1;\n}\n");
74
+ assert.equal(result.length, 1);
75
+ assert.equal(result[0].startLine, 6); // row 5 + 1
76
+ assert.equal(result[0].endLine, 9); // row 8 + 1
77
+ });
78
+ it("returns empty array when no node types match within maxDepth", () => {
79
+ const child = makeNode("variable_declaration", 0, 10, 1, 1);
80
+ const root = makeNode("program", 0, 10, 0, 1, [child]);
81
+ const result = walkTree(root, new Set(["function_declaration", "class_declaration"]), "let x = 1;");
82
+ assert.deepStrictEqual(result, []);
83
+ });
84
+ it("empty nodeTypes set returns nothing", () => {
85
+ const child = makeNode("function_declaration", 0, 10, 1, 1);
86
+ const root = makeNode("program", 0, 10, 0, 1, [child]);
87
+ const result = walkTree(root, new Set(), "function foo() {}");
88
+ assert.deepStrictEqual(result, []);
89
+ });
90
+ it("stops recursing once a matching node is found (no grandchildren)", () => {
91
+ const grandchild = makeNode("method_definition", 5, 15, 3, 4);
92
+ const classNode = makeNode("class_declaration", 0, 20, 1, 5, [grandchild]);
93
+ const root = makeNode("program", 0, 20, 0, 5, [classNode]);
94
+ // class_declaration matches at depth 1 → stops, never reaches grandchild
95
+ const result = walkTree(root, new Set(["class_declaration", "method_definition"]), "class A { foo() {} }");
96
+ assert.equal(result.length, 1);
97
+ assert.equal(result[0].type, "class_declaration");
98
+ });
99
+ it("preserves correct startIndex and endIndex in result", () => {
100
+ const child = makeNode("function_declaration", 5, 15, 1, 2);
101
+ const root = makeNode("program", 0, 20, 0, 3, [child]);
102
+ const result = walkTree(root, new Set(["function_declaration"]), "01234function foo()0123456789");
103
+ assert.equal(result.length, 1);
104
+ assert.equal(result[0].startIndex, 5);
105
+ assert.equal(result[0].endIndex, 15);
106
+ });
107
+ });
108
+ //# sourceMappingURL=grammar.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grammar.test.js","sourceRoot":"","sources":["../../../src/__tests__/chunker/grammar.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,64 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { htmlChunker } from "../../chunker/html.js";
4
+ describe("HtmlChunker", () => {
5
+ it("language is 'html'", () => {
6
+ assert.equal(htmlChunker.language, "html");
7
+ });
8
+ it("fileExtensions includes .html and .htm", () => {
9
+ assert.ok(htmlChunker.fileExtensions.includes(".html"));
10
+ assert.ok(htmlChunker.fileExtensions.includes(".htm"));
11
+ assert.equal(htmlChunker.fileExtensions.length, 2);
12
+ });
13
+ it("grammarName is 'html'", () => {
14
+ assert.equal(htmlChunker.grammarName, "html");
15
+ });
16
+ it("nodeTypes contains script_element and style_element", () => {
17
+ assert.ok(htmlChunker.nodeTypes.has("script_element"));
18
+ assert.ok(htmlChunker.nodeTypes.has("style_element"));
19
+ });
20
+ it("chunk returns empty array for empty content", async () => {
21
+ const chunks = await htmlChunker.chunk("test.html", "");
22
+ assert.deepStrictEqual(chunks, []);
23
+ });
24
+ it("chunk returns empty array for whitespace-only content", async () => {
25
+ const chunks = await htmlChunker.chunk("test.html", " \n ");
26
+ assert.deepStrictEqual(chunks, []);
27
+ });
28
+ it("chunk parses a script element", async () => {
29
+ const html = "<html><body><script>const x = 1;</script></body></html>";
30
+ const chunks = await htmlChunker.chunk("test.html", html);
31
+ assert.equal(chunks.length, 1);
32
+ assert.ok(chunks[0].content.includes("<script>"));
33
+ });
34
+ it("chunk parses a style element", async () => {
35
+ const html = "<html><head><style>body { color: red; }</style></head></html>";
36
+ const chunks = await htmlChunker.chunk("test.html", html);
37
+ assert.equal(chunks.length, 1);
38
+ assert.ok(chunks[0].content.includes("<style>"));
39
+ });
40
+ it("chunk parses both script and style elements", async () => {
41
+ const html = `<html>
42
+ <head><style>.a { x: 1; }</style></head>
43
+ <body><script>const y = 2;</script></body>
44
+ </html>`;
45
+ const chunks = await htmlChunker.chunk("test.html", html);
46
+ assert.equal(chunks.length, 2);
47
+ const hasStyle = chunks.some((c) => c.content.includes("<style>"));
48
+ const hasScript = chunks.some((c) => c.content.includes("<script>"));
49
+ assert.ok(hasStyle);
50
+ assert.ok(hasScript);
51
+ });
52
+ it("chunk generates unique IDs", async () => {
53
+ const html = "<html><head><style>.a{}</style></head><body><script>const x = 1;</script></body></html>";
54
+ const chunks = await htmlChunker.chunk("test.html", html);
55
+ const ids = chunks.map((c) => c.id);
56
+ assert.equal(new Set(ids).size, ids.length);
57
+ });
58
+ it("chunk sets correct startLine metadata", async () => {
59
+ const html = "\n\n\n<style>body { color: red; }</style>";
60
+ const chunks = await htmlChunker.chunk("test.html", html);
61
+ assert.equal(chunks[0].metadata.startLine, 4);
62
+ });
63
+ });
64
+ //# sourceMappingURL=html.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.test.js","sourceRoot":"","sources":["../../../src/__tests__/chunker/html.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,83 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { javaChunker } from "../../chunker/java.js";
4
+ describe("JavaChunker", () => {
5
+ it("language is 'java'", () => {
6
+ assert.equal(javaChunker.language, "java");
7
+ });
8
+ it("fileExtensions includes .java", () => {
9
+ assert.ok(javaChunker.fileExtensions.includes(".java"));
10
+ });
11
+ it("grammarName is 'java'", () => {
12
+ assert.equal(javaChunker.grammarName, "java");
13
+ });
14
+ it("nodeTypes contains expected types", () => {
15
+ const types = javaChunker.nodeTypes;
16
+ assert.ok(types.has("method_declaration"));
17
+ assert.ok(types.has("class_declaration"));
18
+ assert.ok(types.has("interface_declaration"));
19
+ assert.ok(types.has("enum_declaration"));
20
+ });
21
+ it("chunk returns empty array for empty content", async () => {
22
+ const chunks = await javaChunker.chunk("test.java", "");
23
+ assert.deepStrictEqual(chunks, []);
24
+ });
25
+ it("chunk returns empty array for whitespace-only content", async () => {
26
+ const chunks = await javaChunker.chunk("test.java", " \n \n ");
27
+ assert.deepStrictEqual(chunks, []);
28
+ });
29
+ it("chunk parses a class declaration with a method", async () => {
30
+ const code = "class Foo {\n void bar() {\n return;\n }\n}";
31
+ const chunks = await javaChunker.chunk("test.java", code);
32
+ assert.ok(chunks.length > 0, "expected at least one chunk");
33
+ assert.equal(chunks[0].metadata.language, "java");
34
+ assert.equal(chunks[0].metadata.filePath, "test.java");
35
+ assert.ok(chunks[0].content.includes("class Foo"));
36
+ });
37
+ it("chunk parses an interface declaration", async () => {
38
+ const code = "interface Runnable {\n void run();\n}";
39
+ const chunks = await javaChunker.chunk("Runnable.java", code);
40
+ assert.ok(chunks.length > 0, "expected at least one chunk");
41
+ assert.ok(chunks[0].content.includes("interface Runnable"));
42
+ });
43
+ it("chunk parses an enum declaration", async () => {
44
+ const code = "enum Color {\n RED, GREEN, BLUE\n}";
45
+ const chunks = await javaChunker.chunk("Color.java", code);
46
+ assert.ok(chunks.length > 0, "expected at least one chunk");
47
+ assert.ok(chunks[0].content.includes("enum Color"));
48
+ });
49
+ it("chunk generates unique IDs for multiple declarations", async () => {
50
+ const code = [
51
+ "class Foo {",
52
+ " void bar() {}",
53
+ "}",
54
+ "",
55
+ "class Baz {",
56
+ " void qux() {}",
57
+ "}",
58
+ ].join("\n");
59
+ const chunks = await javaChunker.chunk("multi.java", code);
60
+ const ids = new Set(chunks.map((c) => c.id));
61
+ assert.equal(ids.size, chunks.length);
62
+ });
63
+ it("chunk sets correct startLine metadata", async () => {
64
+ const code = [
65
+ "// top comment",
66
+ "",
67
+ "class First {",
68
+ " void doThing() {}",
69
+ "}",
70
+ "",
71
+ "class Second {",
72
+ " void doOther() {}",
73
+ "}",
74
+ ].join("\n");
75
+ const chunks = await javaChunker.chunk("lines.java", code);
76
+ const classChunks = chunks.filter((c) => c.content.includes("class "));
77
+ assert.ok(classChunks.length >= 2, "expected at least two class chunks");
78
+ const firstClass = classChunks.find((c) => c.content.includes("First"));
79
+ assert.ok(firstClass, "should find First class chunk");
80
+ assert.equal(firstClass.metadata.startLine, 3);
81
+ });
82
+ });
83
+ //# sourceMappingURL=java.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"java.test.js","sourceRoot":"","sources":["../../../src/__tests__/chunker/java.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,88 @@
1
+ import { describe, it } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { javascriptChunker } from "../../chunker/javascript.js";
4
+ describe("JavaScriptChunker", () => {
5
+ it("language is 'javascript'", () => {
6
+ assert.equal(javascriptChunker.language, "javascript");
7
+ });
8
+ it("fileExtensions includes .js, .jsx, .mjs, .cjs", () => {
9
+ assert.ok(javascriptChunker.fileExtensions.includes(".js"));
10
+ assert.ok(javascriptChunker.fileExtensions.includes(".jsx"));
11
+ assert.ok(javascriptChunker.fileExtensions.includes(".mjs"));
12
+ assert.ok(javascriptChunker.fileExtensions.includes(".cjs"));
13
+ });
14
+ it("grammarName is 'javascript'", () => {
15
+ assert.equal(javascriptChunker.grammarName, "javascript");
16
+ });
17
+ it("nodeTypes contains expected types", () => {
18
+ const types = javascriptChunker.nodeTypes;
19
+ assert.ok(types.has("function_declaration"));
20
+ assert.ok(types.has("method_definition"));
21
+ assert.ok(types.has("class_declaration"));
22
+ assert.ok(types.has("arrow_function"));
23
+ assert.ok(types.has("export_statement"));
24
+ });
25
+ it("chunk returns empty array for empty content", async () => {
26
+ const chunks = await javascriptChunker.chunk("test.js", "");
27
+ assert.deepStrictEqual(chunks, []);
28
+ });
29
+ it("chunk returns empty array for whitespace-only content", async () => {
30
+ const chunks = await javascriptChunker.chunk("test.js", " \n \n ");
31
+ assert.deepStrictEqual(chunks, []);
32
+ });
33
+ it("chunk parses a function declaration", async () => {
34
+ const code = "function hello() { return 'world'; }";
35
+ const chunks = await javascriptChunker.chunk("test.js", code);
36
+ assert.ok(chunks.length > 0, "expected at least one chunk");
37
+ assert.equal(chunks[0].metadata.language, "javascript");
38
+ assert.equal(chunks[0].metadata.filePath, "test.js");
39
+ assert.ok(chunks[0].content.includes("hello"));
40
+ });
41
+ it("chunk parses a class declaration", async () => {
42
+ const code = "class Counter { increment() { this.value++; } }";
43
+ const chunks = await javascriptChunker.chunk("counter.js", code);
44
+ assert.ok(chunks.length > 0, "expected at least one chunk");
45
+ assert.ok(chunks.some((c) => c.content.includes("class Counter")));
46
+ });
47
+ it("chunk parses an arrow function", async () => {
48
+ const code = "const add = (a, b) => a + b;";
49
+ const chunks = await javascriptChunker.chunk("arrow.js", code);
50
+ assert.ok(chunks.length > 0, "expected at least one chunk");
51
+ assert.ok(chunks.some((c) => c.content.includes("=>")));
52
+ });
53
+ it("chunk parses an export statement", async () => {
54
+ const code = "export function greet() { return 'hi'; }";
55
+ const chunks = await javascriptChunker.chunk("mod.js", code);
56
+ assert.ok(chunks.length > 0, "expected at least one chunk");
57
+ assert.ok(chunks.some((c) => c.content.includes("export")));
58
+ });
59
+ it("chunk generates unique IDs for multiple declarations", async () => {
60
+ const code = [
61
+ "function foo() { return 1; }",
62
+ "function bar() { return 2; }",
63
+ "function baz() { return 3; }",
64
+ ].join("\n");
65
+ const chunks = await javascriptChunker.chunk("multi.js", code);
66
+ const ids = new Set(chunks.map((c) => c.id));
67
+ assert.equal(ids.size, chunks.length);
68
+ });
69
+ it("chunk sets correct startLine metadata", async () => {
70
+ const code = [
71
+ "// top comment",
72
+ "",
73
+ "function first() {",
74
+ " return 1;",
75
+ "}",
76
+ "",
77
+ "function second() {",
78
+ " return 2;",
79
+ "}",
80
+ ].join("\n");
81
+ const chunks = await javascriptChunker.chunk("lines.js", code);
82
+ assert.ok(chunks.length >= 2, "expected at least two chunks");
83
+ const firstFn = chunks.find((c) => c.content.includes("first"));
84
+ assert.ok(firstFn, "should find first() chunk");
85
+ assert.equal(firstFn.metadata.startLine, 3);
86
+ });
87
+ });
88
+ //# sourceMappingURL=javascript.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"javascript.test.js","sourceRoot":"","sources":["../../../src/__tests__/chunker/javascript.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};