nuartz 0.1.1 → 0.1.3
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/dist/__tests__/markdown.test.js +1 -1
- package/dist/__tests__/markdown.test.js.map +1 -1
- package/dist/fs.d.ts +7 -1
- package/dist/fs.d.ts.map +1 -1
- package/dist/fs.js +36 -4
- package/dist/fs.js.map +1 -1
- package/dist/markdown.js +2 -2
- package/dist/markdown.js.map +1 -1
- package/package.json +3 -1
- package/src/__fixtures__/basic.md +0 -20
- package/src/__tests__/backlinks.test.ts +0 -156
- package/src/__tests__/fs.test.ts +0 -179
- package/src/__tests__/markdown.test.ts +0 -113
- package/src/__tests__/search.test.ts +0 -167
- package/src/backlinks.ts +0 -52
- package/src/config.ts +0 -63
- package/src/fs.ts +0 -131
- package/src/index.ts +0 -16
- package/src/markdown.ts +0 -131
- package/src/plugins/arrows.ts +0 -14
- package/src/plugins/callout.test.ts +0 -80
- package/src/plugins/callout.ts +0 -78
- package/src/plugins/comment.test.ts +0 -56
- package/src/plugins/comment.ts +0 -35
- package/src/plugins/highlight.test.ts +0 -52
- package/src/plugins/highlight.ts +0 -32
- package/src/plugins/tag.test.ts +0 -80
- package/src/plugins/tag.ts +0 -58
- package/src/plugins/wikilink.test.ts +0 -109
- package/src/plugins/wikilink.ts +0 -107
- package/src/search.ts +0 -42
- package/src/types.ts +0 -35
- package/tsconfig.json +0 -17
- package/vitest.config.ts +0 -20
|
@@ -79,7 +79,7 @@ Content with #beta and #gamma`;
|
|
|
79
79
|
(0, vitest_1.expect)(result.html).toContain("callout-note");
|
|
80
80
|
});
|
|
81
81
|
(0, vitest_1.it)("renders LaTeX with KaTeX", async () => {
|
|
82
|
-
const result = await (0, markdown_1.renderMarkdown)("Inline math:
|
|
82
|
+
const result = await (0, markdown_1.renderMarkdown)("Inline math: $$x^2$$");
|
|
83
83
|
(0, vitest_1.expect)(result.html).toContain("katex");
|
|
84
84
|
});
|
|
85
85
|
(0, vitest_1.it)("renders display math with KaTeX", async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.test.js","sourceRoot":"","sources":["../../src/__tests__/markdown.test.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"markdown.test.js","sourceRoot":"","sources":["../../src/__tests__/markdown.test.ts"],"names":[],"mappings":"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"}
|
package/dist/fs.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export interface MarkdownFile {
|
|
|
4
4
|
filePath: string;
|
|
5
5
|
frontmatter: Frontmatter;
|
|
6
6
|
raw: string;
|
|
7
|
+
mtime?: Date;
|
|
7
8
|
}
|
|
8
9
|
/**
|
|
9
10
|
* Recursively walks a directory and returns all .md files.
|
|
@@ -19,9 +20,14 @@ export interface FileTreeNode {
|
|
|
19
20
|
path: string;
|
|
20
21
|
type: "file" | "folder";
|
|
21
22
|
children?: FileTreeNode[];
|
|
23
|
+
mtime?: Date;
|
|
24
|
+
}
|
|
25
|
+
export interface BuildFileTreeOptions {
|
|
26
|
+
/** Sort method: 'name' (alphabetical) or 'modified' (newest first) */
|
|
27
|
+
sortBy?: 'name' | 'modified';
|
|
22
28
|
}
|
|
23
29
|
/**
|
|
24
30
|
* Builds a nested file tree from a flat list of MarkdownFile entries.
|
|
25
31
|
*/
|
|
26
|
-
export declare function buildFileTree(files: MarkdownFile[]): FileTreeNode[];
|
|
32
|
+
export declare function buildFileTree(files: MarkdownFile[], options?: BuildFileTreeOptions): FileTreeNode[];
|
|
27
33
|
//# sourceMappingURL=fs.d.ts.map
|
package/dist/fs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,WAAW,CAAA;IACxB,GAAG,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAE7C,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,MAAM,CAAA;IAChB,WAAW,EAAE,WAAW,CAAA;IACxB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,IAAI,CAAA;CACb;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC,CA+CzB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAgB9B;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAA;IACvB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAA;IACzB,KAAK,CAAC,EAAE,IAAI,CAAA;CACb;AAED,MAAM,WAAW,oBAAoB;IACnC,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAA;CAC7B;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,OAAO,CAAC,EAAE,oBAAoB,GAAG,YAAY,EAAE,CA8DnG"}
|
package/dist/fs.js
CHANGED
|
@@ -35,11 +35,21 @@ async function getAllMarkdownFiles(contentDir) {
|
|
|
35
35
|
continue;
|
|
36
36
|
const relative = node_path_1.default.relative(contentDir, fullPath);
|
|
37
37
|
const slug = relative.replace(/\.md$/, "").replace(/\\/g, "/");
|
|
38
|
+
// Get file modification time
|
|
39
|
+
let mtime;
|
|
40
|
+
try {
|
|
41
|
+
const stat = await promises_1.default.stat(fullPath);
|
|
42
|
+
mtime = stat.mtime;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
mtime = undefined;
|
|
46
|
+
}
|
|
38
47
|
results.push({
|
|
39
48
|
slug,
|
|
40
49
|
filePath: fullPath,
|
|
41
50
|
frontmatter: data,
|
|
42
51
|
raw,
|
|
52
|
+
mtime,
|
|
43
53
|
});
|
|
44
54
|
}
|
|
45
55
|
}
|
|
@@ -56,7 +66,15 @@ async function getMarkdownBySlug(contentDir, slug) {
|
|
|
56
66
|
try {
|
|
57
67
|
const raw = await promises_1.default.readFile(filePath, "utf-8");
|
|
58
68
|
const { data } = (0, gray_matter_1.default)(raw);
|
|
59
|
-
|
|
69
|
+
let mtime;
|
|
70
|
+
try {
|
|
71
|
+
const stat = await promises_1.default.stat(filePath);
|
|
72
|
+
mtime = stat.mtime;
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
mtime = undefined;
|
|
76
|
+
}
|
|
77
|
+
return { slug, filePath, frontmatter: data, raw, mtime };
|
|
60
78
|
}
|
|
61
79
|
catch {
|
|
62
80
|
return null;
|
|
@@ -65,10 +83,18 @@ async function getMarkdownBySlug(contentDir, slug) {
|
|
|
65
83
|
/**
|
|
66
84
|
* Builds a nested file tree from a flat list of MarkdownFile entries.
|
|
67
85
|
*/
|
|
68
|
-
function buildFileTree(files) {
|
|
86
|
+
function buildFileTree(files, options) {
|
|
87
|
+
const { sortBy = 'name' } = options ?? {};
|
|
69
88
|
const root = [];
|
|
70
89
|
const nodeMap = new Map();
|
|
71
|
-
const sortedFiles = [...files].sort((a, b) =>
|
|
90
|
+
const sortedFiles = [...files].sort((a, b) => {
|
|
91
|
+
if (sortBy === 'modified') {
|
|
92
|
+
const timeA = a.mtime?.getTime() ?? 0;
|
|
93
|
+
const timeB = b.mtime?.getTime() ?? 0;
|
|
94
|
+
return timeB - timeA; // Newest first
|
|
95
|
+
}
|
|
96
|
+
return a.slug.localeCompare(b.slug);
|
|
97
|
+
});
|
|
72
98
|
for (const file of sortedFiles) {
|
|
73
99
|
const parts = file.slug.split("/");
|
|
74
100
|
let parentList = root;
|
|
@@ -81,6 +107,7 @@ function buildFileTree(files) {
|
|
|
81
107
|
name: file.frontmatter.title ?? part,
|
|
82
108
|
path: file.slug,
|
|
83
109
|
type: "file",
|
|
110
|
+
mtime: file.mtime,
|
|
84
111
|
};
|
|
85
112
|
parentList.push(node);
|
|
86
113
|
}
|
|
@@ -95,11 +122,16 @@ function buildFileTree(files) {
|
|
|
95
122
|
}
|
|
96
123
|
}
|
|
97
124
|
}
|
|
98
|
-
// Sort each level: folders first, then
|
|
125
|
+
// Sort each level: folders first, then by name or modification time
|
|
99
126
|
function sortNodes(nodes) {
|
|
100
127
|
nodes.sort((a, b) => {
|
|
101
128
|
if (a.type !== b.type)
|
|
102
129
|
return a.type === "folder" ? -1 : 1;
|
|
130
|
+
if (sortBy === 'modified') {
|
|
131
|
+
const timeA = a.mtime?.getTime() ?? 0;
|
|
132
|
+
const timeB = b.mtime?.getTime() ?? 0;
|
|
133
|
+
return timeB - timeA; // Newest first
|
|
134
|
+
}
|
|
103
135
|
return a.name.localeCompare(b.name, undefined, { sensitivity: "base" });
|
|
104
136
|
});
|
|
105
137
|
for (const node of nodes) {
|
package/dist/fs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"fs.js","sourceRoot":"","sources":["../src/fs.ts"],"names":[],"mappings":"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"}
|
package/dist/markdown.js
CHANGED
|
@@ -74,7 +74,7 @@ async function renderMarkdown(content, options = {}) {
|
|
|
74
74
|
.use(remark_frontmatter_1.default, ["yaml", "toml"])
|
|
75
75
|
.use(comment_js_1.remarkObsidianComment)
|
|
76
76
|
.use(remark_gfm_1.default)
|
|
77
|
-
.use(remark_math_1.default)
|
|
77
|
+
.use(remark_math_1.default, { singleDollarTextMath: false })
|
|
78
78
|
.use(remark_breaks_1.default)
|
|
79
79
|
.use(wikilink_js_1.remarkWikilink, { baseUrl, resolve: resolveLink, knownSlugs })
|
|
80
80
|
.use(callout_js_1.remarkCallout)
|
|
@@ -101,7 +101,7 @@ async function renderMarkdown(content, options = {}) {
|
|
|
101
101
|
],
|
|
102
102
|
},
|
|
103
103
|
})
|
|
104
|
-
.use(rehype_katex_1.default)
|
|
104
|
+
.use(rehype_katex_1.default, { strict: "ignore" })
|
|
105
105
|
.use(rehypeExtractToc)
|
|
106
106
|
.use(rehype_stringify_1.default)
|
|
107
107
|
.process(body);
|
package/dist/markdown.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":";;;;;AA0EA,wCAwDC;AAlID,8DAAgC;AAChC,qCAAiC;AACjC,gEAAsC;AACtC,4EAAkD;AAClD,4DAAkC;AAClC,8DAAoC;AACpC,kEAAwC;AACxC,4DAAkC;AAClC,8DAAoC;AACpC,wFAA6D;AAE7D,gEAAsC;AACtC,wEAA8C;AAC9C,uDAAwC;AAIxC,kEAAwC;AACxC,2DAAqD;AACrD,qDAAoD;AACpD,6CAA4C;AAC5C,uDAAsD;AACtD,yDAAwD;AACxD,qDAA4D;AAC5D,mDAAkD;AAGlD,2DAA2D;AAC3D,MAAM,gBAAgB,GAAyB,GAAG,EAAE;IAClD,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QACpB,MAAM,GAAG,GAAe,EAAE,CAAA;QAE1B,IAAA,wBAAK,EAAC,IAAI,EAAE,SAAS,EAAE,CAAC,IAAa,EAAE,EAAE;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,CAAA;YAC9C,IAAI,CAAC,KAAK;gBAAE,OAAM;YAElB,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;YAChC,MAAM,EAAE,GAAI,IAAI,CAAC,UAAU,EAAE,EAAa,IAAI,EAAE,CAAA;YAChD,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,CAAA;YAE9B,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7C,CAAC,CAAC,CAAA;QAEF,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;IACnC,CAAC,CAAA;AACH,CAAC,CAAA;AAED,SAAS,WAAW,CAAC,IAAa;IAChC,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,IAAA,wBAAK,EAAC,IAA2B,EAAE,MAAM,EAAE,CAAC,CAAoB,EAAE,EAAE;QAClE,IAAI,IAAI,CAAC,CAAC,KAAK,CAAA;IACjB,CAAC,CAAC,CAAA;IACF,OAAO,IAAI,CAAA;AACb,CAAC;AAED,SAAS,YAAY,CAAC,IAAgB;IACpC,MAAM,IAAI,GAAe,EAAE,CAAA;IAC3B,MAAM,KAAK,GAAe,EAAE,CAAA;IAE5B,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACxE,KAAK,CAAC,GAAG,EAAE,CAAA;QACb,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC9C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,OAAe,EACf,UAAyB,EAAE;IAE3B,MAAM,EAAE,OAAO,GAAG,GAAG,EAAE,WAAW,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,OAAO,CAAA;IAErE,qCAAqC;IACrC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAA,qBAAM,EAAC,OAAO,CAAC,CAAA;IAE5D,MAAM,IAAI,GAAG,MAAM,IAAA,iBAAO,GAAE;SACzB,GAAG,CAAC,sBAAW,CAAC;SAChB,GAAG,CAAC,4BAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;SACxC,GAAG,CAAC,kCAAqB,CAAC;SAC1B,GAAG,CAAC,oBAAS,CAAC;SACd,GAAG,CAAC,qBAAU,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,CAAC;SAChD,GAAG,CAAC,uBAAY,CAAC;SACjB,GAAG,CAAC,4BAAc,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC;SAClE,GAAG,CAAC,0BAAa,CAAC;SAClB,GAAG,CAAC,kBAAS,CAAC;SACd,GAAG,CAAC,8BAAe,CAAC;SACpB,GAAG,CAAC,wBAAY,CAAC;SACjB,GAAG,CAAC,uBAAY,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC;SAC/C,GAAG,CAAC,oBAAS,CAAC;SACd,GAAG,CAAC,qCAAgB,EAAE;QACrB,KAAK,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,aAAa,EAAE;QACrD,cAAc,EAAE,KAAK;KACtB,CAAC;SACD,GAAG,CAAC,qBAAU,CAAC;SACf,GAAG,CAAC,kCAAsB,EAAE;QAC3B,QAAQ,EAAE,QAAQ;QAClB,UAAU,EAAE,EAAE,SAAS,EAAE,gBAAgB,EAAE,SAAS,EAAE,sBAAsB,EAAE;QAC9E,OAAO,EAAE;YACP,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK;YAC/B,UAAU,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM;gBACzE,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE;YAC7F,QAAQ,EAAE;gBACR,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,6DAA6D,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;gBACpI,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,8DAA8D,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;aACtI;SACgB;KACpB,CAAC;SACD,GAAG,CAAC,sBAAW,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;SACtC,GAAG,CAAC,gBAAgB,CAAC;SACrB,GAAG,CAAC,0BAAe,CAAC;SACpB,OAAO,CAAC,IAAI,CAAC,CAAA;IAEhB,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;QAClB,WAAW,EAAE,WAA0B;QACvC,GAAG,EAAG,IAAI,CAAC,IAAI,CAAC,GAAkB,IAAI,EAAE;QACxC,KAAK,EAAG,IAAI,CAAC,IAAI,CAAC,KAAkB,IAAI,EAAE;QAC1C,IAAI,EAAE;YACJ,GAAG,CAAE,WAAW,CAAC,IAAiB,IAAI,EAAE,CAAC;YACzC,GAAG,CAAE,IAAI,CAAC,IAAI,CAAC,IAAiB,IAAI,EAAE,CAAC;SACxC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;KAC1C,CAAA;AACH,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "nuartz",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Obsidian-compatible markdown pipeline for Next.js",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -11,9 +11,11 @@
|
|
|
11
11
|
"homepage": "https://github.com/syshin0116/nuartz#readme",
|
|
12
12
|
"main": "./dist/index.js",
|
|
13
13
|
"types": "./dist/index.d.ts",
|
|
14
|
+
"files": ["dist"],
|
|
14
15
|
"exports": {
|
|
15
16
|
".": {
|
|
16
17
|
"types": "./dist/index.d.ts",
|
|
18
|
+
"files": ["dist"],
|
|
17
19
|
"default": "./dist/index.js"
|
|
18
20
|
}
|
|
19
21
|
},
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
# Sample Document
|
|
2
|
-
|
|
3
|
-
This is a paragraph with a [[Wiki Link]] and a #sample-tag.
|
|
4
|
-
|
|
5
|
-
> [!note] Important Note
|
|
6
|
-
> This is a callout with some content.
|
|
7
|
-
|
|
8
|
-
Here is a [[Page|Custom Alias]] and [[Page#Section]] reference.
|
|
9
|
-
|
|
10
|
-
> [!warning]+ Collapsible Warning
|
|
11
|
-
> This warning is collapsible.
|
|
12
|
-
|
|
13
|
-
Tags: #javascript #web-dev
|
|
14
|
-
|
|
15
|
-
![[diagram.png]]
|
|
16
|
-
|
|
17
|
-
> This is a regular blockquote, not a callout.
|
|
18
|
-
|
|
19
|
-
> [!tip]- Collapsed Tip
|
|
20
|
-
> Hidden by default.
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from "vitest"
|
|
2
|
-
import { buildBacklinkIndex, getBacklinks } from "../backlinks"
|
|
3
|
-
import type { RenderResult } from "../types"
|
|
4
|
-
|
|
5
|
-
function mockPage(
|
|
6
|
-
links: string[],
|
|
7
|
-
title: string,
|
|
8
|
-
raw: string
|
|
9
|
-
): { result: RenderResult; raw: string } {
|
|
10
|
-
return {
|
|
11
|
-
result: {
|
|
12
|
-
html: "",
|
|
13
|
-
frontmatter: { title },
|
|
14
|
-
toc: [],
|
|
15
|
-
links,
|
|
16
|
-
tags: [],
|
|
17
|
-
},
|
|
18
|
-
raw,
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
describe("buildBacklinkIndex", () => {
|
|
23
|
-
it("builds index from pages with outgoing links", () => {
|
|
24
|
-
const pages = new Map([
|
|
25
|
-
["page-a", mockPage(["Page B"], "Page A", "Links to Page B")],
|
|
26
|
-
["page-b", mockPage(["Page A"], "Page B", "Links to Page A")],
|
|
27
|
-
])
|
|
28
|
-
|
|
29
|
-
const index = buildBacklinkIndex(pages)
|
|
30
|
-
// "Page B" normalizes to "page-b"
|
|
31
|
-
const backlinksForB = index.get("page-b")
|
|
32
|
-
expect(backlinksForB).toBeDefined()
|
|
33
|
-
expect(backlinksForB).toHaveLength(1)
|
|
34
|
-
expect(backlinksForB![0].slug).toBe("page-a")
|
|
35
|
-
expect(backlinksForB![0].title).toBe("Page A")
|
|
36
|
-
})
|
|
37
|
-
|
|
38
|
-
it("normalizes target slugs: lowercase and spaces to hyphens", () => {
|
|
39
|
-
const pages = new Map([
|
|
40
|
-
["source", mockPage(["My Target Page"], "Source", "Content here")],
|
|
41
|
-
])
|
|
42
|
-
|
|
43
|
-
const index = buildBacklinkIndex(pages)
|
|
44
|
-
expect(index.has("my-target-page")).toBe(true)
|
|
45
|
-
})
|
|
46
|
-
|
|
47
|
-
it("strips non-word/non-hyphen characters from target slug", () => {
|
|
48
|
-
const pages = new Map([
|
|
49
|
-
["source", mockPage(["Page (draft)"], "Source", "Content")],
|
|
50
|
-
])
|
|
51
|
-
|
|
52
|
-
const index = buildBacklinkIndex(pages)
|
|
53
|
-
// "Page (draft)" -> "page-draft" (parens removed)
|
|
54
|
-
expect(index.has("page-draft")).toBe(true)
|
|
55
|
-
})
|
|
56
|
-
|
|
57
|
-
it("collects multiple backlinks for the same target", () => {
|
|
58
|
-
const pages = new Map([
|
|
59
|
-
["alpha", mockPage(["Target"], "Alpha", "Alpha links to target")],
|
|
60
|
-
["beta", mockPage(["Target"], "Beta", "Beta links to target")],
|
|
61
|
-
["gamma", mockPage(["Target"], "Gamma", "Gamma links to target")],
|
|
62
|
-
])
|
|
63
|
-
|
|
64
|
-
const index = buildBacklinkIndex(pages)
|
|
65
|
-
const backlinks = index.get("target")
|
|
66
|
-
expect(backlinks).toHaveLength(3)
|
|
67
|
-
const slugs = backlinks!.map((b) => b.slug)
|
|
68
|
-
expect(slugs).toContain("alpha")
|
|
69
|
-
expect(slugs).toContain("beta")
|
|
70
|
-
expect(slugs).toContain("gamma")
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
it("generates excerpt from raw content stripping frontmatter", () => {
|
|
74
|
-
const raw = `---
|
|
75
|
-
title: Source Page
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
This is the body content that should appear in the excerpt.`
|
|
79
|
-
|
|
80
|
-
const pages = new Map([
|
|
81
|
-
["source", mockPage(["Target"], "Source Page", raw)],
|
|
82
|
-
])
|
|
83
|
-
|
|
84
|
-
const index = buildBacklinkIndex(pages)
|
|
85
|
-
const backlinks = index.get("target")!
|
|
86
|
-
expect(backlinks[0].excerpt).toContain("This is the body content")
|
|
87
|
-
expect(backlinks[0].excerpt).not.toContain("---")
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
it("truncates excerpt to 160 characters plus ellipsis", () => {
|
|
91
|
-
const longBody = "A".repeat(200)
|
|
92
|
-
const pages = new Map([
|
|
93
|
-
["source", mockPage(["Target"], "Source", longBody)],
|
|
94
|
-
])
|
|
95
|
-
|
|
96
|
-
const index = buildBacklinkIndex(pages)
|
|
97
|
-
const backlinks = index.get("target")!
|
|
98
|
-
// 160 chars + ellipsis character
|
|
99
|
-
expect(backlinks[0].excerpt.length).toBeLessThanOrEqual(161)
|
|
100
|
-
expect(backlinks[0].excerpt).toMatch(/\u2026$/)
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
it("uses slug as title fallback when no frontmatter title", () => {
|
|
104
|
-
const pages = new Map([
|
|
105
|
-
[
|
|
106
|
-
"no-title-page",
|
|
107
|
-
{
|
|
108
|
-
result: {
|
|
109
|
-
html: "",
|
|
110
|
-
frontmatter: {},
|
|
111
|
-
toc: [],
|
|
112
|
-
links: ["Target"],
|
|
113
|
-
tags: [],
|
|
114
|
-
} as RenderResult,
|
|
115
|
-
raw: "Some content",
|
|
116
|
-
},
|
|
117
|
-
],
|
|
118
|
-
])
|
|
119
|
-
|
|
120
|
-
const index = buildBacklinkIndex(pages)
|
|
121
|
-
const backlinks = index.get("target")!
|
|
122
|
-
expect(backlinks[0].title).toBe("no-title-page")
|
|
123
|
-
})
|
|
124
|
-
})
|
|
125
|
-
|
|
126
|
-
describe("getBacklinks", () => {
|
|
127
|
-
it("returns correct BacklinkEntry[] for known slug", () => {
|
|
128
|
-
const pages = new Map([
|
|
129
|
-
["source", mockPage(["Target"], "Source Title", "Content about target")],
|
|
130
|
-
])
|
|
131
|
-
|
|
132
|
-
const index = buildBacklinkIndex(pages)
|
|
133
|
-
const backlinks = getBacklinks(index, "target")
|
|
134
|
-
|
|
135
|
-
expect(backlinks).toHaveLength(1)
|
|
136
|
-
expect(backlinks[0].slug).toBe("source")
|
|
137
|
-
expect(backlinks[0].title).toBe("Source Title")
|
|
138
|
-
expect(backlinks[0].excerpt).toBeTruthy()
|
|
139
|
-
})
|
|
140
|
-
|
|
141
|
-
it("returns empty array for unknown slug", () => {
|
|
142
|
-
const pages = new Map([
|
|
143
|
-
["source", mockPage(["Target"], "Source", "Content")],
|
|
144
|
-
])
|
|
145
|
-
|
|
146
|
-
const index = buildBacklinkIndex(pages)
|
|
147
|
-
const backlinks = getBacklinks(index, "nonexistent")
|
|
148
|
-
expect(backlinks).toEqual([])
|
|
149
|
-
})
|
|
150
|
-
|
|
151
|
-
it("returns empty array for empty index", () => {
|
|
152
|
-
const index = buildBacklinkIndex(new Map())
|
|
153
|
-
const backlinks = getBacklinks(index, "anything")
|
|
154
|
-
expect(backlinks).toEqual([])
|
|
155
|
-
})
|
|
156
|
-
})
|
package/src/__tests__/fs.test.ts
DELETED
|
@@ -1,179 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, beforeEach, afterEach } from "vitest"
|
|
2
|
-
import fs from "node:fs/promises"
|
|
3
|
-
import os from "node:os"
|
|
4
|
-
import path from "node:path"
|
|
5
|
-
import { getAllMarkdownFiles, getMarkdownBySlug, buildFileTree } from "../fs"
|
|
6
|
-
import type { MarkdownFile } from "../fs"
|
|
7
|
-
|
|
8
|
-
describe("getAllMarkdownFiles", () => {
|
|
9
|
-
let tmpDir: string
|
|
10
|
-
|
|
11
|
-
beforeEach(async () => {
|
|
12
|
-
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "nuartz-fs-test-"))
|
|
13
|
-
})
|
|
14
|
-
|
|
15
|
-
afterEach(async () => {
|
|
16
|
-
await fs.rm(tmpDir, { recursive: true, force: true })
|
|
17
|
-
})
|
|
18
|
-
|
|
19
|
-
it("returns all .md files recursively", async () => {
|
|
20
|
-
await fs.writeFile(path.join(tmpDir, "root.md"), "# Root")
|
|
21
|
-
await fs.mkdir(path.join(tmpDir, "sub"), { recursive: true })
|
|
22
|
-
await fs.writeFile(path.join(tmpDir, "sub", "nested.md"), "# Nested")
|
|
23
|
-
|
|
24
|
-
const files = await getAllMarkdownFiles(tmpDir)
|
|
25
|
-
const slugs = files.map((f) => f.slug)
|
|
26
|
-
expect(slugs).toContain("root")
|
|
27
|
-
expect(slugs).toContain("sub/nested")
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
it("excludes files starting with _", async () => {
|
|
31
|
-
await fs.writeFile(path.join(tmpDir, "visible.md"), "# Visible")
|
|
32
|
-
await fs.writeFile(path.join(tmpDir, "_hidden.md"), "# Hidden")
|
|
33
|
-
|
|
34
|
-
const files = await getAllMarkdownFiles(tmpDir)
|
|
35
|
-
const slugs = files.map((f) => f.slug)
|
|
36
|
-
expect(slugs).toContain("visible")
|
|
37
|
-
expect(slugs).not.toContain("_hidden")
|
|
38
|
-
})
|
|
39
|
-
|
|
40
|
-
it("returns MarkdownFile[] with correct slug format", async () => {
|
|
41
|
-
await fs.mkdir(path.join(tmpDir, "notes"), { recursive: true })
|
|
42
|
-
await fs.writeFile(path.join(tmpDir, "notes", "foo.md"), "# Foo")
|
|
43
|
-
|
|
44
|
-
const files = await getAllMarkdownFiles(tmpDir)
|
|
45
|
-
expect(files).toHaveLength(1)
|
|
46
|
-
expect(files[0].slug).toBe("notes/foo")
|
|
47
|
-
expect(files[0].filePath).toBe(path.join(tmpDir, "notes", "foo.md"))
|
|
48
|
-
expect(files[0].raw).toContain("# Foo")
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
it("parses frontmatter", async () => {
|
|
52
|
-
const content = `---
|
|
53
|
-
title: My Note
|
|
54
|
-
tags:
|
|
55
|
-
- test
|
|
56
|
-
---
|
|
57
|
-
|
|
58
|
-
Body content`
|
|
59
|
-
await fs.writeFile(path.join(tmpDir, "note.md"), content)
|
|
60
|
-
|
|
61
|
-
const files = await getAllMarkdownFiles(tmpDir)
|
|
62
|
-
expect(files[0].frontmatter.title).toBe("My Note")
|
|
63
|
-
expect(files[0].frontmatter.tags).toEqual(["test"])
|
|
64
|
-
})
|
|
65
|
-
|
|
66
|
-
it("returns empty array for non-existent directory", async () => {
|
|
67
|
-
const files = await getAllMarkdownFiles(path.join(tmpDir, "nonexistent"))
|
|
68
|
-
expect(files).toEqual([])
|
|
69
|
-
})
|
|
70
|
-
})
|
|
71
|
-
|
|
72
|
-
describe("getMarkdownBySlug", () => {
|
|
73
|
-
let tmpDir: string
|
|
74
|
-
|
|
75
|
-
beforeEach(async () => {
|
|
76
|
-
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "nuartz-slug-test-"))
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
afterEach(async () => {
|
|
80
|
-
await fs.rm(tmpDir, { recursive: true, force: true })
|
|
81
|
-
})
|
|
82
|
-
|
|
83
|
-
it("returns MarkdownFile for existing slug", async () => {
|
|
84
|
-
const content = `---
|
|
85
|
-
title: Hello
|
|
86
|
-
---
|
|
87
|
-
|
|
88
|
-
World`
|
|
89
|
-
await fs.writeFile(path.join(tmpDir, "hello.md"), content)
|
|
90
|
-
|
|
91
|
-
const file = await getMarkdownBySlug(tmpDir, "hello")
|
|
92
|
-
expect(file).not.toBeNull()
|
|
93
|
-
expect(file!.slug).toBe("hello")
|
|
94
|
-
expect(file!.frontmatter.title).toBe("Hello")
|
|
95
|
-
expect(file!.raw).toContain("World")
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
it("returns null for non-existent slug", async () => {
|
|
99
|
-
const file = await getMarkdownBySlug(tmpDir, "does-not-exist")
|
|
100
|
-
expect(file).toBeNull()
|
|
101
|
-
})
|
|
102
|
-
|
|
103
|
-
it("works with nested slugs", async () => {
|
|
104
|
-
await fs.mkdir(path.join(tmpDir, "notes"), { recursive: true })
|
|
105
|
-
await fs.writeFile(path.join(tmpDir, "notes", "deep.md"), "# Deep")
|
|
106
|
-
|
|
107
|
-
const file = await getMarkdownBySlug(tmpDir, "notes/deep")
|
|
108
|
-
expect(file).not.toBeNull()
|
|
109
|
-
expect(file!.slug).toBe("notes/deep")
|
|
110
|
-
})
|
|
111
|
-
})
|
|
112
|
-
|
|
113
|
-
describe("buildFileTree", () => {
|
|
114
|
-
it("builds tree from flat list of files", () => {
|
|
115
|
-
const files: MarkdownFile[] = [
|
|
116
|
-
{ slug: "alpha", filePath: "/alpha.md", frontmatter: { title: "Alpha" }, raw: "" },
|
|
117
|
-
{ slug: "beta", filePath: "/beta.md", frontmatter: { title: "Beta" }, raw: "" },
|
|
118
|
-
]
|
|
119
|
-
|
|
120
|
-
const tree = buildFileTree(files)
|
|
121
|
-
expect(tree).toHaveLength(2)
|
|
122
|
-
expect(tree[0].name).toBe("Alpha")
|
|
123
|
-
expect(tree[0].type).toBe("file")
|
|
124
|
-
expect(tree[0].path).toBe("alpha")
|
|
125
|
-
expect(tree[1].name).toBe("Beta")
|
|
126
|
-
})
|
|
127
|
-
|
|
128
|
-
it("creates folder nodes for nested files", () => {
|
|
129
|
-
const files: MarkdownFile[] = [
|
|
130
|
-
{ slug: "notes/page1", filePath: "/notes/page1.md", frontmatter: { title: "Page 1" }, raw: "" },
|
|
131
|
-
{ slug: "notes/page2", filePath: "/notes/page2.md", frontmatter: { title: "Page 2" }, raw: "" },
|
|
132
|
-
]
|
|
133
|
-
|
|
134
|
-
const tree = buildFileTree(files)
|
|
135
|
-
expect(tree).toHaveLength(1)
|
|
136
|
-
expect(tree[0].type).toBe("folder")
|
|
137
|
-
expect(tree[0].name).toBe("notes")
|
|
138
|
-
expect(tree[0].children).toHaveLength(2)
|
|
139
|
-
expect(tree[0].children![0].name).toBe("Page 1")
|
|
140
|
-
expect(tree[0].children![1].name).toBe("Page 2")
|
|
141
|
-
})
|
|
142
|
-
|
|
143
|
-
it("uses frontmatter.title for file display name", () => {
|
|
144
|
-
const files: MarkdownFile[] = [
|
|
145
|
-
{ slug: "my-file", filePath: "/my-file.md", frontmatter: { title: "Custom Title" }, raw: "" },
|
|
146
|
-
]
|
|
147
|
-
|
|
148
|
-
const tree = buildFileTree(files)
|
|
149
|
-
expect(tree[0].name).toBe("Custom Title")
|
|
150
|
-
})
|
|
151
|
-
|
|
152
|
-
it("falls back to filename when no title", () => {
|
|
153
|
-
const files: MarkdownFile[] = [
|
|
154
|
-
{ slug: "my-file", filePath: "/my-file.md", frontmatter: {}, raw: "" },
|
|
155
|
-
]
|
|
156
|
-
|
|
157
|
-
const tree = buildFileTree(files)
|
|
158
|
-
expect(tree[0].name).toBe("my-file")
|
|
159
|
-
})
|
|
160
|
-
|
|
161
|
-
it("handles deeply nested structures", () => {
|
|
162
|
-
const files: MarkdownFile[] = [
|
|
163
|
-
{ slug: "a/b/c", filePath: "/a/b/c.md", frontmatter: { title: "Deep" }, raw: "" },
|
|
164
|
-
]
|
|
165
|
-
|
|
166
|
-
const tree = buildFileTree(files)
|
|
167
|
-
expect(tree[0].type).toBe("folder")
|
|
168
|
-
expect(tree[0].name).toBe("a")
|
|
169
|
-
expect(tree[0].children![0].type).toBe("folder")
|
|
170
|
-
expect(tree[0].children![0].name).toBe("b")
|
|
171
|
-
expect(tree[0].children![0].children![0].type).toBe("file")
|
|
172
|
-
expect(tree[0].children![0].children![0].name).toBe("Deep")
|
|
173
|
-
})
|
|
174
|
-
|
|
175
|
-
it("returns empty array for empty input", () => {
|
|
176
|
-
const tree = buildFileTree([])
|
|
177
|
-
expect(tree).toEqual([])
|
|
178
|
-
})
|
|
179
|
-
})
|