nuartz 0.1.0 → 0.1.1

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 (89) hide show
  1. package/dist/__tests__/backlinks.test.d.ts +2 -0
  2. package/dist/__tests__/backlinks.test.d.ts.map +1 -0
  3. package/dist/__tests__/backlinks.test.js +132 -0
  4. package/dist/__tests__/backlinks.test.js.map +1 -0
  5. package/dist/__tests__/fs.test.d.ts +2 -0
  6. package/dist/__tests__/fs.test.d.ts.map +1 -0
  7. package/dist/__tests__/fs.test.js +153 -0
  8. package/dist/__tests__/fs.test.js.map +1 -0
  9. package/dist/__tests__/markdown.test.d.ts +2 -0
  10. package/dist/__tests__/markdown.test.d.ts.map +1 -0
  11. package/dist/__tests__/markdown.test.js +102 -0
  12. package/dist/__tests__/markdown.test.js.map +1 -0
  13. package/dist/__tests__/search.test.d.ts +2 -0
  14. package/dist/__tests__/search.test.d.ts.map +1 -0
  15. package/dist/__tests__/search.test.js +147 -0
  16. package/dist/__tests__/search.test.js.map +1 -0
  17. package/dist/backlinks.d.ts +25 -0
  18. package/dist/backlinks.d.ts.map +1 -0
  19. package/dist/backlinks.js +37 -0
  20. package/dist/backlinks.js.map +1 -0
  21. package/dist/config.d.ts +46 -0
  22. package/dist/config.d.ts.map +1 -0
  23. package/dist/config.js +23 -0
  24. package/dist/config.js.map +1 -0
  25. package/dist/fs.d.ts +27 -0
  26. package/dist/fs.d.ts.map +1 -0
  27. package/dist/fs.js +113 -0
  28. package/dist/fs.js.map +1 -0
  29. package/dist/index.d.ts +17 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +29 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/markdown.d.ts +3 -0
  34. package/dist/markdown.d.ts.map +1 -0
  35. package/dist/markdown.js +119 -0
  36. package/dist/markdown.js.map +1 -0
  37. package/dist/plugins/arrows.d.ts +4 -0
  38. package/dist/plugins/arrows.d.ts.map +1 -0
  39. package/dist/plugins/arrows.js +16 -0
  40. package/dist/plugins/arrows.js.map +1 -0
  41. package/dist/plugins/callout.d.ts +4 -0
  42. package/dist/plugins/callout.d.ts.map +1 -0
  43. package/dist/plugins/callout.js +75 -0
  44. package/dist/plugins/callout.js.map +1 -0
  45. package/dist/plugins/callout.test.d.ts +2 -0
  46. package/dist/plugins/callout.test.d.ts.map +1 -0
  47. package/dist/plugins/callout.test.js +75 -0
  48. package/dist/plugins/callout.test.js.map +1 -0
  49. package/dist/plugins/comment.d.ts +4 -0
  50. package/dist/plugins/comment.d.ts.map +1 -0
  51. package/dist/plugins/comment.js +36 -0
  52. package/dist/plugins/comment.js.map +1 -0
  53. package/dist/plugins/comment.test.d.ts +2 -0
  54. package/dist/plugins/comment.test.d.ts.map +1 -0
  55. package/dist/plugins/comment.test.js +55 -0
  56. package/dist/plugins/comment.test.js.map +1 -0
  57. package/dist/plugins/highlight.d.ts +4 -0
  58. package/dist/plugins/highlight.d.ts.map +1 -0
  59. package/dist/plugins/highlight.js +33 -0
  60. package/dist/plugins/highlight.js.map +1 -0
  61. package/dist/plugins/highlight.test.d.ts +2 -0
  62. package/dist/plugins/highlight.test.d.ts.map +1 -0
  63. package/dist/plugins/highlight.test.js +51 -0
  64. package/dist/plugins/highlight.test.js.map +1 -0
  65. package/dist/plugins/tag.d.ts +11 -0
  66. package/dist/plugins/tag.d.ts.map +1 -0
  67. package/dist/plugins/tag.js +47 -0
  68. package/dist/plugins/tag.js.map +1 -0
  69. package/dist/plugins/tag.test.d.ts +2 -0
  70. package/dist/plugins/tag.test.d.ts.map +1 -0
  71. package/dist/plugins/tag.test.js +75 -0
  72. package/dist/plugins/tag.test.js.map +1 -0
  73. package/dist/plugins/wikilink.d.ts +12 -0
  74. package/dist/plugins/wikilink.d.ts.map +1 -0
  75. package/dist/plugins/wikilink.js +85 -0
  76. package/dist/plugins/wikilink.js.map +1 -0
  77. package/dist/plugins/wikilink.test.d.ts +2 -0
  78. package/dist/plugins/wikilink.test.d.ts.map +1 -0
  79. package/dist/plugins/wikilink.test.js +99 -0
  80. package/dist/plugins/wikilink.test.js.map +1 -0
  81. package/dist/search.d.ts +14 -0
  82. package/dist/search.d.ts.map +1 -0
  83. package/dist/search.js +35 -0
  84. package/dist/search.js.map +1 -0
  85. package/dist/types.d.ts +33 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/types.js +3 -0
  88. package/dist/types.js.map +1 -0
  89. package/package.json +1 -1
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=backlinks.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlinks.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/backlinks.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const backlinks_1 = require("../backlinks");
5
+ function mockPage(links, title, raw) {
6
+ return {
7
+ result: {
8
+ html: "",
9
+ frontmatter: { title },
10
+ toc: [],
11
+ links,
12
+ tags: [],
13
+ },
14
+ raw,
15
+ };
16
+ }
17
+ (0, vitest_1.describe)("buildBacklinkIndex", () => {
18
+ (0, vitest_1.it)("builds index from pages with outgoing links", () => {
19
+ const pages = new Map([
20
+ ["page-a", mockPage(["Page B"], "Page A", "Links to Page B")],
21
+ ["page-b", mockPage(["Page A"], "Page B", "Links to Page A")],
22
+ ]);
23
+ const index = (0, backlinks_1.buildBacklinkIndex)(pages);
24
+ // "Page B" normalizes to "page-b"
25
+ const backlinksForB = index.get("page-b");
26
+ (0, vitest_1.expect)(backlinksForB).toBeDefined();
27
+ (0, vitest_1.expect)(backlinksForB).toHaveLength(1);
28
+ (0, vitest_1.expect)(backlinksForB[0].slug).toBe("page-a");
29
+ (0, vitest_1.expect)(backlinksForB[0].title).toBe("Page A");
30
+ });
31
+ (0, vitest_1.it)("normalizes target slugs: lowercase and spaces to hyphens", () => {
32
+ const pages = new Map([
33
+ ["source", mockPage(["My Target Page"], "Source", "Content here")],
34
+ ]);
35
+ const index = (0, backlinks_1.buildBacklinkIndex)(pages);
36
+ (0, vitest_1.expect)(index.has("my-target-page")).toBe(true);
37
+ });
38
+ (0, vitest_1.it)("strips non-word/non-hyphen characters from target slug", () => {
39
+ const pages = new Map([
40
+ ["source", mockPage(["Page (draft)"], "Source", "Content")],
41
+ ]);
42
+ const index = (0, backlinks_1.buildBacklinkIndex)(pages);
43
+ // "Page (draft)" -> "page-draft" (parens removed)
44
+ (0, vitest_1.expect)(index.has("page-draft")).toBe(true);
45
+ });
46
+ (0, vitest_1.it)("collects multiple backlinks for the same target", () => {
47
+ const pages = new Map([
48
+ ["alpha", mockPage(["Target"], "Alpha", "Alpha links to target")],
49
+ ["beta", mockPage(["Target"], "Beta", "Beta links to target")],
50
+ ["gamma", mockPage(["Target"], "Gamma", "Gamma links to target")],
51
+ ]);
52
+ const index = (0, backlinks_1.buildBacklinkIndex)(pages);
53
+ const backlinks = index.get("target");
54
+ (0, vitest_1.expect)(backlinks).toHaveLength(3);
55
+ const slugs = backlinks.map((b) => b.slug);
56
+ (0, vitest_1.expect)(slugs).toContain("alpha");
57
+ (0, vitest_1.expect)(slugs).toContain("beta");
58
+ (0, vitest_1.expect)(slugs).toContain("gamma");
59
+ });
60
+ (0, vitest_1.it)("generates excerpt from raw content stripping frontmatter", () => {
61
+ const raw = `---
62
+ title: Source Page
63
+ ---
64
+
65
+ This is the body content that should appear in the excerpt.`;
66
+ const pages = new Map([
67
+ ["source", mockPage(["Target"], "Source Page", raw)],
68
+ ]);
69
+ const index = (0, backlinks_1.buildBacklinkIndex)(pages);
70
+ const backlinks = index.get("target");
71
+ (0, vitest_1.expect)(backlinks[0].excerpt).toContain("This is the body content");
72
+ (0, vitest_1.expect)(backlinks[0].excerpt).not.toContain("---");
73
+ });
74
+ (0, vitest_1.it)("truncates excerpt to 160 characters plus ellipsis", () => {
75
+ const longBody = "A".repeat(200);
76
+ const pages = new Map([
77
+ ["source", mockPage(["Target"], "Source", longBody)],
78
+ ]);
79
+ const index = (0, backlinks_1.buildBacklinkIndex)(pages);
80
+ const backlinks = index.get("target");
81
+ // 160 chars + ellipsis character
82
+ (0, vitest_1.expect)(backlinks[0].excerpt.length).toBeLessThanOrEqual(161);
83
+ (0, vitest_1.expect)(backlinks[0].excerpt).toMatch(/\u2026$/);
84
+ });
85
+ (0, vitest_1.it)("uses slug as title fallback when no frontmatter title", () => {
86
+ const pages = new Map([
87
+ [
88
+ "no-title-page",
89
+ {
90
+ result: {
91
+ html: "",
92
+ frontmatter: {},
93
+ toc: [],
94
+ links: ["Target"],
95
+ tags: [],
96
+ },
97
+ raw: "Some content",
98
+ },
99
+ ],
100
+ ]);
101
+ const index = (0, backlinks_1.buildBacklinkIndex)(pages);
102
+ const backlinks = index.get("target");
103
+ (0, vitest_1.expect)(backlinks[0].title).toBe("no-title-page");
104
+ });
105
+ });
106
+ (0, vitest_1.describe)("getBacklinks", () => {
107
+ (0, vitest_1.it)("returns correct BacklinkEntry[] for known slug", () => {
108
+ const pages = new Map([
109
+ ["source", mockPage(["Target"], "Source Title", "Content about target")],
110
+ ]);
111
+ const index = (0, backlinks_1.buildBacklinkIndex)(pages);
112
+ const backlinks = (0, backlinks_1.getBacklinks)(index, "target");
113
+ (0, vitest_1.expect)(backlinks).toHaveLength(1);
114
+ (0, vitest_1.expect)(backlinks[0].slug).toBe("source");
115
+ (0, vitest_1.expect)(backlinks[0].title).toBe("Source Title");
116
+ (0, vitest_1.expect)(backlinks[0].excerpt).toBeTruthy();
117
+ });
118
+ (0, vitest_1.it)("returns empty array for unknown slug", () => {
119
+ const pages = new Map([
120
+ ["source", mockPage(["Target"], "Source", "Content")],
121
+ ]);
122
+ const index = (0, backlinks_1.buildBacklinkIndex)(pages);
123
+ const backlinks = (0, backlinks_1.getBacklinks)(index, "nonexistent");
124
+ (0, vitest_1.expect)(backlinks).toEqual([]);
125
+ });
126
+ (0, vitest_1.it)("returns empty array for empty index", () => {
127
+ const index = (0, backlinks_1.buildBacklinkIndex)(new Map());
128
+ const backlinks = (0, backlinks_1.getBacklinks)(index, "anything");
129
+ (0, vitest_1.expect)(backlinks).toEqual([]);
130
+ });
131
+ });
132
+ //# sourceMappingURL=backlinks.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backlinks.test.js","sourceRoot":"","sources":["../../src/__tests__/backlinks.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fs.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/fs.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const vitest_1 = require("vitest");
7
+ const promises_1 = __importDefault(require("node:fs/promises"));
8
+ const node_os_1 = __importDefault(require("node:os"));
9
+ const node_path_1 = __importDefault(require("node:path"));
10
+ const fs_1 = require("../fs");
11
+ (0, vitest_1.describe)("getAllMarkdownFiles", () => {
12
+ let tmpDir;
13
+ (0, vitest_1.beforeEach)(async () => {
14
+ tmpDir = await promises_1.default.mkdtemp(node_path_1.default.join(node_os_1.default.tmpdir(), "nuartz-fs-test-"));
15
+ });
16
+ (0, vitest_1.afterEach)(async () => {
17
+ await promises_1.default.rm(tmpDir, { recursive: true, force: true });
18
+ });
19
+ (0, vitest_1.it)("returns all .md files recursively", async () => {
20
+ await promises_1.default.writeFile(node_path_1.default.join(tmpDir, "root.md"), "# Root");
21
+ await promises_1.default.mkdir(node_path_1.default.join(tmpDir, "sub"), { recursive: true });
22
+ await promises_1.default.writeFile(node_path_1.default.join(tmpDir, "sub", "nested.md"), "# Nested");
23
+ const files = await (0, fs_1.getAllMarkdownFiles)(tmpDir);
24
+ const slugs = files.map((f) => f.slug);
25
+ (0, vitest_1.expect)(slugs).toContain("root");
26
+ (0, vitest_1.expect)(slugs).toContain("sub/nested");
27
+ });
28
+ (0, vitest_1.it)("excludes files starting with _", async () => {
29
+ await promises_1.default.writeFile(node_path_1.default.join(tmpDir, "visible.md"), "# Visible");
30
+ await promises_1.default.writeFile(node_path_1.default.join(tmpDir, "_hidden.md"), "# Hidden");
31
+ const files = await (0, fs_1.getAllMarkdownFiles)(tmpDir);
32
+ const slugs = files.map((f) => f.slug);
33
+ (0, vitest_1.expect)(slugs).toContain("visible");
34
+ (0, vitest_1.expect)(slugs).not.toContain("_hidden");
35
+ });
36
+ (0, vitest_1.it)("returns MarkdownFile[] with correct slug format", async () => {
37
+ await promises_1.default.mkdir(node_path_1.default.join(tmpDir, "notes"), { recursive: true });
38
+ await promises_1.default.writeFile(node_path_1.default.join(tmpDir, "notes", "foo.md"), "# Foo");
39
+ const files = await (0, fs_1.getAllMarkdownFiles)(tmpDir);
40
+ (0, vitest_1.expect)(files).toHaveLength(1);
41
+ (0, vitest_1.expect)(files[0].slug).toBe("notes/foo");
42
+ (0, vitest_1.expect)(files[0].filePath).toBe(node_path_1.default.join(tmpDir, "notes", "foo.md"));
43
+ (0, vitest_1.expect)(files[0].raw).toContain("# Foo");
44
+ });
45
+ (0, vitest_1.it)("parses frontmatter", async () => {
46
+ const content = `---
47
+ title: My Note
48
+ tags:
49
+ - test
50
+ ---
51
+
52
+ Body content`;
53
+ await promises_1.default.writeFile(node_path_1.default.join(tmpDir, "note.md"), content);
54
+ const files = await (0, fs_1.getAllMarkdownFiles)(tmpDir);
55
+ (0, vitest_1.expect)(files[0].frontmatter.title).toBe("My Note");
56
+ (0, vitest_1.expect)(files[0].frontmatter.tags).toEqual(["test"]);
57
+ });
58
+ (0, vitest_1.it)("returns empty array for non-existent directory", async () => {
59
+ const files = await (0, fs_1.getAllMarkdownFiles)(node_path_1.default.join(tmpDir, "nonexistent"));
60
+ (0, vitest_1.expect)(files).toEqual([]);
61
+ });
62
+ });
63
+ (0, vitest_1.describe)("getMarkdownBySlug", () => {
64
+ let tmpDir;
65
+ (0, vitest_1.beforeEach)(async () => {
66
+ tmpDir = await promises_1.default.mkdtemp(node_path_1.default.join(node_os_1.default.tmpdir(), "nuartz-slug-test-"));
67
+ });
68
+ (0, vitest_1.afterEach)(async () => {
69
+ await promises_1.default.rm(tmpDir, { recursive: true, force: true });
70
+ });
71
+ (0, vitest_1.it)("returns MarkdownFile for existing slug", async () => {
72
+ const content = `---
73
+ title: Hello
74
+ ---
75
+
76
+ World`;
77
+ await promises_1.default.writeFile(node_path_1.default.join(tmpDir, "hello.md"), content);
78
+ const file = await (0, fs_1.getMarkdownBySlug)(tmpDir, "hello");
79
+ (0, vitest_1.expect)(file).not.toBeNull();
80
+ (0, vitest_1.expect)(file.slug).toBe("hello");
81
+ (0, vitest_1.expect)(file.frontmatter.title).toBe("Hello");
82
+ (0, vitest_1.expect)(file.raw).toContain("World");
83
+ });
84
+ (0, vitest_1.it)("returns null for non-existent slug", async () => {
85
+ const file = await (0, fs_1.getMarkdownBySlug)(tmpDir, "does-not-exist");
86
+ (0, vitest_1.expect)(file).toBeNull();
87
+ });
88
+ (0, vitest_1.it)("works with nested slugs", async () => {
89
+ await promises_1.default.mkdir(node_path_1.default.join(tmpDir, "notes"), { recursive: true });
90
+ await promises_1.default.writeFile(node_path_1.default.join(tmpDir, "notes", "deep.md"), "# Deep");
91
+ const file = await (0, fs_1.getMarkdownBySlug)(tmpDir, "notes/deep");
92
+ (0, vitest_1.expect)(file).not.toBeNull();
93
+ (0, vitest_1.expect)(file.slug).toBe("notes/deep");
94
+ });
95
+ });
96
+ (0, vitest_1.describe)("buildFileTree", () => {
97
+ (0, vitest_1.it)("builds tree from flat list of files", () => {
98
+ const files = [
99
+ { slug: "alpha", filePath: "/alpha.md", frontmatter: { title: "Alpha" }, raw: "" },
100
+ { slug: "beta", filePath: "/beta.md", frontmatter: { title: "Beta" }, raw: "" },
101
+ ];
102
+ const tree = (0, fs_1.buildFileTree)(files);
103
+ (0, vitest_1.expect)(tree).toHaveLength(2);
104
+ (0, vitest_1.expect)(tree[0].name).toBe("Alpha");
105
+ (0, vitest_1.expect)(tree[0].type).toBe("file");
106
+ (0, vitest_1.expect)(tree[0].path).toBe("alpha");
107
+ (0, vitest_1.expect)(tree[1].name).toBe("Beta");
108
+ });
109
+ (0, vitest_1.it)("creates folder nodes for nested files", () => {
110
+ const files = [
111
+ { slug: "notes/page1", filePath: "/notes/page1.md", frontmatter: { title: "Page 1" }, raw: "" },
112
+ { slug: "notes/page2", filePath: "/notes/page2.md", frontmatter: { title: "Page 2" }, raw: "" },
113
+ ];
114
+ const tree = (0, fs_1.buildFileTree)(files);
115
+ (0, vitest_1.expect)(tree).toHaveLength(1);
116
+ (0, vitest_1.expect)(tree[0].type).toBe("folder");
117
+ (0, vitest_1.expect)(tree[0].name).toBe("notes");
118
+ (0, vitest_1.expect)(tree[0].children).toHaveLength(2);
119
+ (0, vitest_1.expect)(tree[0].children[0].name).toBe("Page 1");
120
+ (0, vitest_1.expect)(tree[0].children[1].name).toBe("Page 2");
121
+ });
122
+ (0, vitest_1.it)("uses frontmatter.title for file display name", () => {
123
+ const files = [
124
+ { slug: "my-file", filePath: "/my-file.md", frontmatter: { title: "Custom Title" }, raw: "" },
125
+ ];
126
+ const tree = (0, fs_1.buildFileTree)(files);
127
+ (0, vitest_1.expect)(tree[0].name).toBe("Custom Title");
128
+ });
129
+ (0, vitest_1.it)("falls back to filename when no title", () => {
130
+ const files = [
131
+ { slug: "my-file", filePath: "/my-file.md", frontmatter: {}, raw: "" },
132
+ ];
133
+ const tree = (0, fs_1.buildFileTree)(files);
134
+ (0, vitest_1.expect)(tree[0].name).toBe("my-file");
135
+ });
136
+ (0, vitest_1.it)("handles deeply nested structures", () => {
137
+ const files = [
138
+ { slug: "a/b/c", filePath: "/a/b/c.md", frontmatter: { title: "Deep" }, raw: "" },
139
+ ];
140
+ const tree = (0, fs_1.buildFileTree)(files);
141
+ (0, vitest_1.expect)(tree[0].type).toBe("folder");
142
+ (0, vitest_1.expect)(tree[0].name).toBe("a");
143
+ (0, vitest_1.expect)(tree[0].children[0].type).toBe("folder");
144
+ (0, vitest_1.expect)(tree[0].children[0].name).toBe("b");
145
+ (0, vitest_1.expect)(tree[0].children[0].children[0].type).toBe("file");
146
+ (0, vitest_1.expect)(tree[0].children[0].children[0].name).toBe("Deep");
147
+ });
148
+ (0, vitest_1.it)("returns empty array for empty input", () => {
149
+ const tree = (0, fs_1.buildFileTree)([]);
150
+ (0, vitest_1.expect)(tree).toEqual([]);
151
+ });
152
+ });
153
+ //# sourceMappingURL=fs.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.test.js","sourceRoot":"","sources":["../../src/__tests__/fs.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=markdown.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/markdown.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const markdown_1 = require("../markdown");
5
+ (0, vitest_1.describe)("renderMarkdown", () => {
6
+ (0, vitest_1.it)("returns empty result for empty string", async () => {
7
+ const result = await (0, markdown_1.renderMarkdown)("");
8
+ (0, vitest_1.expect)(result.html).toBe("");
9
+ (0, vitest_1.expect)(result.toc).toEqual([]);
10
+ (0, vitest_1.expect)(result.tags).toEqual([]);
11
+ (0, vitest_1.expect)(result.links).toEqual([]);
12
+ });
13
+ (0, vitest_1.it)("extracts heading into toc", async () => {
14
+ const result = await (0, markdown_1.renderMarkdown)("# Hello World");
15
+ (0, vitest_1.expect)(result.toc).toHaveLength(1);
16
+ (0, vitest_1.expect)(result.toc[0]).toMatchObject({
17
+ depth: 1,
18
+ text: "Hello World",
19
+ });
20
+ (0, vitest_1.expect)(result.toc[0].id).toBeTruthy();
21
+ });
22
+ (0, vitest_1.it)("builds nested toc tree", async () => {
23
+ const md = "# Top\n## Sub\n### Deep";
24
+ const result = await (0, markdown_1.renderMarkdown)(md);
25
+ (0, vitest_1.expect)(result.toc).toHaveLength(1);
26
+ (0, vitest_1.expect)(result.toc[0].text).toBe("Top");
27
+ (0, vitest_1.expect)(result.toc[0].children).toHaveLength(1);
28
+ (0, vitest_1.expect)(result.toc[0].children[0].text).toBe("Sub");
29
+ (0, vitest_1.expect)(result.toc[0].children[0].children).toHaveLength(1);
30
+ (0, vitest_1.expect)(result.toc[0].children[0].children[0].text).toBe("Deep");
31
+ });
32
+ (0, vitest_1.it)("parses frontmatter", async () => {
33
+ const md = `---
34
+ title: My Page
35
+ date: 2024-01-01
36
+ ---
37
+
38
+ Some content`;
39
+ const result = await (0, markdown_1.renderMarkdown)(md);
40
+ (0, vitest_1.expect)(result.frontmatter.title).toBe("My Page");
41
+ // gray-matter parses YAML dates as Date objects
42
+ const date = result.frontmatter.date;
43
+ const dateStr = date instanceof Date ? date.toISOString().split("T")[0] : date;
44
+ (0, vitest_1.expect)(dateStr).toBe("2024-01-01");
45
+ });
46
+ (0, vitest_1.it)("extracts wikilinks into links array", async () => {
47
+ const result = await (0, markdown_1.renderMarkdown)("Check [[Some Page]] for details");
48
+ (0, vitest_1.expect)(result.links).toContain("Some Page");
49
+ });
50
+ (0, vitest_1.it)("extracts wikilink with alias", async () => {
51
+ const result = await (0, markdown_1.renderMarkdown)("See [[Target|display text]]");
52
+ (0, vitest_1.expect)(result.links).toContain("Target");
53
+ (0, vitest_1.expect)(result.html).toContain("display text");
54
+ });
55
+ (0, vitest_1.it)("extracts inline tags", async () => {
56
+ const result = await (0, markdown_1.renderMarkdown)("This has #mytag in it");
57
+ (0, vitest_1.expect)(result.tags).toContain("mytag");
58
+ });
59
+ (0, vitest_1.it)("merges frontmatter tags with inline tags and deduplicates", async () => {
60
+ const md = `---
61
+ tags:
62
+ - alpha
63
+ - beta
64
+ ---
65
+
66
+ Content with #beta and #gamma`;
67
+ const result = await (0, markdown_1.renderMarkdown)(md);
68
+ (0, vitest_1.expect)(result.tags).toContain("alpha");
69
+ (0, vitest_1.expect)(result.tags).toContain("beta");
70
+ (0, vitest_1.expect)(result.tags).toContain("gamma");
71
+ // beta should appear only once
72
+ const betaCount = result.tags.filter((t) => t === "beta").length;
73
+ (0, vitest_1.expect)(betaCount).toBe(1);
74
+ });
75
+ (0, vitest_1.it)("renders callout with correct class", async () => {
76
+ const md = "> [!note]\n> Some note content";
77
+ const result = await (0, markdown_1.renderMarkdown)(md);
78
+ (0, vitest_1.expect)(result.html).toContain("callout");
79
+ (0, vitest_1.expect)(result.html).toContain("callout-note");
80
+ });
81
+ (0, vitest_1.it)("renders LaTeX with KaTeX", async () => {
82
+ const result = await (0, markdown_1.renderMarkdown)("Inline math: $x^2$");
83
+ (0, vitest_1.expect)(result.html).toContain("katex");
84
+ });
85
+ (0, vitest_1.it)("renders display math with KaTeX", async () => {
86
+ const result = await (0, markdown_1.renderMarkdown)("$$\nx^2 + y^2 = z^2\n$$");
87
+ (0, vitest_1.expect)(result.html).toContain("katex");
88
+ });
89
+ (0, vitest_1.it)("generates html for basic markdown", async () => {
90
+ const result = await (0, markdown_1.renderMarkdown)("Hello **world**");
91
+ (0, vitest_1.expect)(result.html).toContain("<strong>world</strong>");
92
+ });
93
+ (0, vitest_1.it)("does not include embed links in outgoing links", async () => {
94
+ const result = await (0, markdown_1.renderMarkdown)("![[image.png]]");
95
+ (0, vitest_1.expect)(result.links).not.toContain("image.png");
96
+ });
97
+ (0, vitest_1.it)("adds slug ids to headings via rehype-slug", async () => {
98
+ const result = await (0, markdown_1.renderMarkdown)("## My Section");
99
+ (0, vitest_1.expect)(result.html).toContain('id="my-section"');
100
+ });
101
+ });
102
+ //# sourceMappingURL=markdown.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.test.js","sourceRoot":"","sources":["../../src/__tests__/markdown.test.ts"],"names":[],"mappings":";;AAAA,mCAA6C;AAC7C,0CAA4C;AAE5C,IAAA,iBAAQ,EAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,IAAA,WAAE,EAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAc,EAAC,EAAE,CAAC,CAAA;QACvC,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC5B,IAAA,eAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC9B,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAC/B,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QACzC,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAc,EAAC,eAAe,CAAC,CAAA;QACpD,IAAA,eAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAClC,IAAA,eAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YAClC,KAAK,EAAE,CAAC;YACR,IAAI,EAAE,aAAa;SACpB,CAAC,CAAA;QACF,IAAA,eAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,CAAA;IACvC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,wBAAwB,EAAE,KAAK,IAAI,EAAE;QACtC,MAAM,EAAE,GAAG,yBAAyB,CAAA;QACpC,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAc,EAAC,EAAE,CAAC,CAAA;QACvC,IAAA,eAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAClC,IAAA,eAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACtC,IAAA,eAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC9C,IAAA,eAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClD,IAAA,eAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC1D,IAAA,eAAM,EAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IACjE,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,EAAE,GAAG;;;;;aAKF,CAAA;QACT,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAc,EAAC,EAAE,CAAC,CAAA;QACvC,IAAA,eAAM,EAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAChD,gDAAgD;QAChD,MAAM,IAAI,GAAG,MAAM,CAAC,WAAW,CAAC,IAAI,CAAA;QACpC,MAAM,OAAO,GAAG,IAAI,YAAY,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAC9E,IAAA,eAAM,EAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IACpC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAc,EAAC,iCAAiC,CAAC,CAAA;QACtE,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAc,EAAC,6BAA6B,CAAC,CAAA;QAClE,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;QACxC,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;QACpC,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAc,EAAC,uBAAuB,CAAC,CAAA;QAC5D,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,2DAA2D,EAAE,KAAK,IAAI,EAAE;QACzE,MAAM,EAAE,GAAG;;;;;;8BAMe,CAAA;QAC1B,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAc,EAAC,EAAE,CAAC,CAAA;QACvC,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QACtC,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QACrC,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QACtC,+BAA+B;QAC/B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,MAAM,CAAA;QAChE,IAAA,eAAM,EAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,EAAE,GAAG,gCAAgC,CAAA;QAC3C,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAc,EAAC,EAAE,CAAC,CAAA;QACvC,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;QACxC,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAc,EAAC,oBAAoB,CAAC,CAAA;QACzD,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAc,EAAC,yBAAyB,CAAC,CAAA;QAC9D,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAc,EAAC,iBAAiB,CAAC,CAAA;QACtD,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,wBAAwB,CAAC,CAAA;IACzD,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAc,EAAC,gBAAgB,CAAC,CAAA;QACrD,IAAA,eAAM,EAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,IAAA,WAAE,EAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,MAAM,GAAG,MAAM,IAAA,yBAAc,EAAC,eAAe,CAAC,CAAA;QACpD,IAAA,eAAM,EAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=search.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/search.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const search_1 = require("../search");
5
+ function makeFile(overrides) {
6
+ return {
7
+ filePath: `/${overrides.slug}.md`,
8
+ frontmatter: {},
9
+ raw: "",
10
+ ...overrides,
11
+ };
12
+ }
13
+ (0, vitest_1.describe)("buildSearchIndex", () => {
14
+ (0, vitest_1.it)("returns SearchEntry[] with slug, title, content, tags", () => {
15
+ const files = [
16
+ makeFile({
17
+ slug: "hello",
18
+ frontmatter: { title: "Hello", tags: ["greeting"] },
19
+ raw: "---\ntitle: Hello\ntags:\n - greeting\n---\nSome body text",
20
+ }),
21
+ ];
22
+ const index = (0, search_1.buildSearchIndex)(files);
23
+ (0, vitest_1.expect)(index).toHaveLength(1);
24
+ (0, vitest_1.expect)(index[0].slug).toBe("hello");
25
+ (0, vitest_1.expect)(index[0].title).toBe("Hello");
26
+ (0, vitest_1.expect)(index[0].content).toContain("Some body text");
27
+ (0, vitest_1.expect)(index[0].tags).toEqual(["greeting"]);
28
+ });
29
+ (0, vitest_1.it)("excludes draft:true files", () => {
30
+ const files = [
31
+ makeFile({
32
+ slug: "published",
33
+ frontmatter: { title: "Published" },
34
+ raw: "Public content",
35
+ }),
36
+ makeFile({
37
+ slug: "draft",
38
+ frontmatter: { title: "Draft", draft: true },
39
+ raw: "---\ntitle: Draft\ndraft: true\n---\nDraft content",
40
+ }),
41
+ ];
42
+ const index = (0, search_1.buildSearchIndex)(files);
43
+ (0, vitest_1.expect)(index).toHaveLength(1);
44
+ (0, vitest_1.expect)(index[0].slug).toBe("published");
45
+ });
46
+ (0, vitest_1.it)("strips heading markers from content", () => {
47
+ const files = [
48
+ makeFile({
49
+ slug: "headings",
50
+ raw: "# Heading One\n## Heading Two\nBody",
51
+ }),
52
+ ];
53
+ const index = (0, search_1.buildSearchIndex)(files);
54
+ (0, vitest_1.expect)(index[0].content).not.toMatch(/^#/);
55
+ (0, vitest_1.expect)(index[0].content).toContain("Heading One");
56
+ (0, vitest_1.expect)(index[0].content).toContain("Body");
57
+ });
58
+ (0, vitest_1.it)("strips bold and italic markers", () => {
59
+ const files = [
60
+ makeFile({
61
+ slug: "emphasis",
62
+ raw: "Some **bold** and *italic* and __also__ text",
63
+ }),
64
+ ];
65
+ const index = (0, search_1.buildSearchIndex)(files);
66
+ (0, vitest_1.expect)(index[0].content).not.toContain("**");
67
+ (0, vitest_1.expect)(index[0].content).not.toContain("*");
68
+ (0, vitest_1.expect)(index[0].content).not.toContain("__");
69
+ (0, vitest_1.expect)(index[0].content).toContain("bold");
70
+ (0, vitest_1.expect)(index[0].content).toContain("italic");
71
+ });
72
+ (0, vitest_1.it)("strips inline code", () => {
73
+ const files = [
74
+ makeFile({
75
+ slug: "code",
76
+ raw: "Use `console.log` to debug",
77
+ }),
78
+ ];
79
+ const index = (0, search_1.buildSearchIndex)(files);
80
+ (0, vitest_1.expect)(index[0].content).not.toContain("`");
81
+ });
82
+ (0, vitest_1.it)("strips wikilinks keeping display text", () => {
83
+ const files = [
84
+ makeFile({
85
+ slug: "links",
86
+ raw: "See [[My Page]] and [[Other|display]]",
87
+ }),
88
+ ];
89
+ const index = (0, search_1.buildSearchIndex)(files);
90
+ // wikilink regex captures target (first group), not alias
91
+ // [[My Page]] → "My Page", [[Other|display]] → "Other"
92
+ (0, vitest_1.expect)(index[0].content).toContain("My Page");
93
+ (0, vitest_1.expect)(index[0].content).toContain("Other");
94
+ (0, vitest_1.expect)(index[0].content).not.toContain("[[");
95
+ (0, vitest_1.expect)(index[0].content).not.toContain("]]");
96
+ });
97
+ (0, vitest_1.it)("uses last slug segment as title fallback", () => {
98
+ const files = [
99
+ makeFile({
100
+ slug: "notes/deep/my-page",
101
+ frontmatter: {},
102
+ raw: "Content without title",
103
+ }),
104
+ ];
105
+ const index = (0, search_1.buildSearchIndex)(files);
106
+ (0, vitest_1.expect)(index[0].title).toBe("my-page");
107
+ });
108
+ (0, vitest_1.it)("includes frontmatter tags", () => {
109
+ const files = [
110
+ makeFile({
111
+ slug: "tagged",
112
+ frontmatter: { tags: ["alpha", "beta"] },
113
+ raw: "---\ntags:\n - alpha\n - beta\n---\nContent",
114
+ }),
115
+ ];
116
+ const index = (0, search_1.buildSearchIndex)(files);
117
+ (0, vitest_1.expect)(index[0].tags).toEqual(["alpha", "beta"]);
118
+ });
119
+ (0, vitest_1.it)("includes description from frontmatter", () => {
120
+ const files = [
121
+ makeFile({
122
+ slug: "desc",
123
+ frontmatter: { title: "Desc", description: "A short summary" },
124
+ raw: "---\ntitle: Desc\ndescription: A short summary\n---\nBody",
125
+ }),
126
+ ];
127
+ const index = (0, search_1.buildSearchIndex)(files);
128
+ (0, vitest_1.expect)(index[0].description).toBe("A short summary");
129
+ });
130
+ (0, vitest_1.it)("returns empty array for empty input", () => {
131
+ const index = (0, search_1.buildSearchIndex)([]);
132
+ (0, vitest_1.expect)(index).toEqual([]);
133
+ });
134
+ (0, vitest_1.it)("strips code blocks from content", () => {
135
+ const files = [
136
+ makeFile({
137
+ slug: "codeblock",
138
+ raw: "Before\n```js\nconsole.log('hi')\n```\nAfter",
139
+ }),
140
+ ];
141
+ const index = (0, search_1.buildSearchIndex)(files);
142
+ (0, vitest_1.expect)(index[0].content).not.toContain("console.log");
143
+ (0, vitest_1.expect)(index[0].content).toContain("Before");
144
+ (0, vitest_1.expect)(index[0].content).toContain("After");
145
+ });
146
+ });
147
+ //# sourceMappingURL=search.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.test.js","sourceRoot":"","sources":["../../src/__tests__/search.test.ts"],"names":[],"mappings":"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"}