fumadocs-core 12.5.3 → 12.5.5
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/breadcrumb.js +5 -9
- package/dist/chunk-DVOZJZGH.js +42 -0
- package/dist/chunk-KGMG4N3Y.js +13 -0
- package/dist/chunk-MLKGABMK.js +9 -0
- package/dist/{chunk-EP2HYVJS.js → chunk-V6DBK6TW.js} +1 -1
- package/dist/{chunk-QRNTLL6S.js → chunk-YKIM647L.js} +5 -6
- package/dist/dynamic-link.js +5 -9
- package/dist/link.js +2 -2
- package/dist/mdx-plugins/index.js +24 -20
- package/dist/middleware.js +1 -1
- package/dist/search/client.js +10 -14
- package/dist/search/server.js +113 -124
- package/dist/search-algolia/client.js +18 -23
- package/dist/search-algolia/server.js +29 -36
- package/dist/server/index.js +39 -48
- package/dist/sidebar.js +22 -31
- package/dist/source/index.js +51 -52
- package/dist/toc-internal.js +12 -26
- package/dist/toc.js +6 -12
- package/dist/utils/use-on-change.d.ts +3 -0
- package/dist/utils/use-on-change.js +7 -0
- package/package.json +12 -5
- package/dist/chunk-CWMXXUWU.js +0 -63
- package/dist/chunk-UMTVJNLA.js +0 -52
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
__async,
|
|
3
|
-
__objRest,
|
|
4
|
-
__spreadValues
|
|
5
|
-
} from "../chunk-CWMXXUWU.js";
|
|
1
|
+
import "../chunk-MLKGABMK.js";
|
|
6
2
|
|
|
7
3
|
// src/search-algolia/client.ts
|
|
8
4
|
import { useState } from "react";
|
|
@@ -29,31 +25,30 @@ function groupResults(hits) {
|
|
|
29
25
|
}
|
|
30
26
|
return grouped;
|
|
31
27
|
}
|
|
32
|
-
function searchDocs(index, query, options) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
return groupResults(result.hits);
|
|
28
|
+
async function searchDocs(index, query, options) {
|
|
29
|
+
if (query.length === 0) {
|
|
30
|
+
const result2 = await index.search(query, {
|
|
31
|
+
distinct: 1,
|
|
32
|
+
hitsPerPage: 8,
|
|
33
|
+
...options
|
|
34
|
+
});
|
|
35
|
+
return groupResults(result2.hits).filter((hit) => hit.type === "page");
|
|
36
|
+
}
|
|
37
|
+
const result = await index.search(query, {
|
|
38
|
+
distinct: 5,
|
|
39
|
+
hitsPerPage: 10,
|
|
40
|
+
...options
|
|
46
41
|
});
|
|
42
|
+
return groupResults(result.hits);
|
|
47
43
|
}
|
|
48
|
-
function useAlgoliaSearch(index,
|
|
49
|
-
var _b = _a, { allowEmpty = true } = _b, options = __objRest(_b, ["allowEmpty"]);
|
|
44
|
+
function useAlgoliaSearch(index, { allowEmpty = true, ...options } = {}) {
|
|
50
45
|
const [search, setSearch] = useState("");
|
|
51
46
|
const query = useSWR(
|
|
52
47
|
["algolia-search", search, allowEmpty, options],
|
|
53
|
-
() =>
|
|
48
|
+
async () => {
|
|
54
49
|
if (allowEmpty && search.length === 0) return "empty";
|
|
55
50
|
return searchDocs(index, search, options);
|
|
56
|
-
}
|
|
51
|
+
},
|
|
57
52
|
{
|
|
58
53
|
keepPreviousData: true
|
|
59
54
|
}
|
|
@@ -1,26 +1,19 @@
|
|
|
1
|
-
import
|
|
2
|
-
__async,
|
|
3
|
-
__spreadValues
|
|
4
|
-
} from "../chunk-CWMXXUWU.js";
|
|
1
|
+
import "../chunk-MLKGABMK.js";
|
|
5
2
|
|
|
6
3
|
// src/search-algolia/server.ts
|
|
7
|
-
function sync(client, options) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
yield updateDocuments(index, documents);
|
|
13
|
-
});
|
|
4
|
+
async function sync(client, options) {
|
|
5
|
+
const { document = "document", documents } = options;
|
|
6
|
+
const index = client.initIndex(document);
|
|
7
|
+
await setIndexSettings(index);
|
|
8
|
+
await updateDocuments(index, documents);
|
|
14
9
|
}
|
|
15
|
-
function setIndexSettings(index) {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
attributesForFaceting: ["tag"]
|
|
23
|
-
});
|
|
10
|
+
async function setIndexSettings(index) {
|
|
11
|
+
await index.setSettings({
|
|
12
|
+
attributeForDistinct: "page_id",
|
|
13
|
+
attributesToRetrieve: ["title", "section", "content", "url", "section_id"],
|
|
14
|
+
searchableAttributes: ["title", "section", "content"],
|
|
15
|
+
attributesToSnippet: [],
|
|
16
|
+
attributesForFaceting: ["tag"]
|
|
24
17
|
});
|
|
25
18
|
}
|
|
26
19
|
function getSections(page) {
|
|
@@ -28,8 +21,8 @@ function getSections(page) {
|
|
|
28
21
|
return page.structured.contents.flatMap((p) => {
|
|
29
22
|
const heading = p.heading ? page.structured.headings.find((h) => p.heading === h.id) : null;
|
|
30
23
|
const section = {
|
|
31
|
-
section: heading
|
|
32
|
-
section_id: heading
|
|
24
|
+
section: heading?.content,
|
|
25
|
+
section_id: heading?.id,
|
|
33
26
|
content: p.content
|
|
34
27
|
};
|
|
35
28
|
if (heading && !scannedHeadings.has(heading.id)) {
|
|
@@ -46,21 +39,21 @@ function getSections(page) {
|
|
|
46
39
|
return section;
|
|
47
40
|
});
|
|
48
41
|
}
|
|
49
|
-
function updateDocuments(index, documents) {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
)
|
|
61
|
-
|
|
62
|
-
yield index.replaceAllObjects(objects);
|
|
42
|
+
async function updateDocuments(index, documents) {
|
|
43
|
+
const objects = documents.flatMap((page) => {
|
|
44
|
+
return getSections(page).map(
|
|
45
|
+
(section, idx) => ({
|
|
46
|
+
objectID: `${page._id}-${idx.toString()}`,
|
|
47
|
+
title: page.title,
|
|
48
|
+
url: page.url,
|
|
49
|
+
page_id: page._id,
|
|
50
|
+
tag: page.tag,
|
|
51
|
+
...section,
|
|
52
|
+
...page.extra_data
|
|
53
|
+
})
|
|
54
|
+
);
|
|
63
55
|
});
|
|
56
|
+
await index.replaceAllObjects(objects);
|
|
64
57
|
}
|
|
65
58
|
export {
|
|
66
59
|
setIndexSettings,
|
package/dist/server/index.js
CHANGED
|
@@ -1,20 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
2
|
remarkHeading
|
|
3
|
-
} from "../chunk-
|
|
4
|
-
import
|
|
5
|
-
__async,
|
|
6
|
-
__spreadProps,
|
|
7
|
-
__spreadValues
|
|
8
|
-
} from "../chunk-CWMXXUWU.js";
|
|
3
|
+
} from "../chunk-YKIM647L.js";
|
|
4
|
+
import "../chunk-MLKGABMK.js";
|
|
9
5
|
|
|
10
6
|
// src/server/get-toc.ts
|
|
11
7
|
import { remark } from "remark";
|
|
12
|
-
function getTableOfContents(content) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
return [];
|
|
17
|
-
});
|
|
8
|
+
async function getTableOfContents(content) {
|
|
9
|
+
const result = await remark().use(remarkHeading).process(content);
|
|
10
|
+
if ("toc" in result.data) return result.data.toc;
|
|
11
|
+
return [];
|
|
18
12
|
}
|
|
19
13
|
|
|
20
14
|
// src/server/page-tree-utils.ts
|
|
@@ -43,11 +37,10 @@ function findNeighbour(tree, url) {
|
|
|
43
37
|
}
|
|
44
38
|
function separatePageTree(pageTree) {
|
|
45
39
|
return pageTree.children.flatMap((child) => {
|
|
46
|
-
var _a;
|
|
47
40
|
if (child.type !== "folder") return [];
|
|
48
41
|
return {
|
|
49
42
|
name: child.name,
|
|
50
|
-
url:
|
|
43
|
+
url: child.index?.url,
|
|
51
44
|
children: child.children
|
|
52
45
|
};
|
|
53
46
|
});
|
|
@@ -57,42 +50,40 @@ function separatePageTree(pageTree) {
|
|
|
57
50
|
var page_tree_exports = {};
|
|
58
51
|
|
|
59
52
|
// src/server/git-api.ts
|
|
60
|
-
function getGithubLastEdit(
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
53
|
+
async function getGithubLastEdit({
|
|
54
|
+
repo,
|
|
55
|
+
token,
|
|
56
|
+
owner,
|
|
57
|
+
path,
|
|
58
|
+
options = {},
|
|
59
|
+
params: customParams = {}
|
|
60
|
+
}) {
|
|
61
|
+
const headers = new Headers(options.headers);
|
|
62
|
+
const params = new URLSearchParams();
|
|
63
|
+
params.set("path", path);
|
|
64
|
+
params.set("page", "1");
|
|
65
|
+
params.set("per_page", "1");
|
|
66
|
+
for (const [key, value] of Object.entries(customParams)) {
|
|
67
|
+
params.set(key, value);
|
|
68
|
+
}
|
|
69
|
+
if (token) {
|
|
70
|
+
headers.append("authorization", token);
|
|
71
|
+
}
|
|
72
|
+
const res = await fetch(
|
|
73
|
+
`https://api.github.com/repos/${owner}/${repo}/commits?${params.toString()}`,
|
|
74
|
+
{
|
|
75
|
+
cache: "force-cache",
|
|
76
|
+
...options,
|
|
77
|
+
headers
|
|
79
78
|
}
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
}, options), {
|
|
85
|
-
headers
|
|
86
|
-
})
|
|
79
|
+
);
|
|
80
|
+
if (!res.ok)
|
|
81
|
+
throw new Error(
|
|
82
|
+
`Failed to fetch last edit time from Git ${await res.text()}`
|
|
87
83
|
);
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
);
|
|
92
|
-
const data = yield res.json();
|
|
93
|
-
if (data.length === 0) return null;
|
|
94
|
-
return new Date(data[0].commit.committer.date);
|
|
95
|
-
});
|
|
84
|
+
const data = await res.json();
|
|
85
|
+
if (data.length === 0) return null;
|
|
86
|
+
return new Date(data[0].commit.committer.date);
|
|
96
87
|
}
|
|
97
88
|
export {
|
|
98
89
|
page_tree_exports as PageTree,
|
package/dist/sidebar.js
CHANGED
|
@@ -1,8 +1,4 @@
|
|
|
1
|
-
import
|
|
2
|
-
__objRest,
|
|
3
|
-
__spreadProps,
|
|
4
|
-
__spreadValues
|
|
5
|
-
} from "./chunk-CWMXXUWU.js";
|
|
1
|
+
import "./chunk-MLKGABMK.js";
|
|
6
2
|
|
|
7
3
|
// src/sidebar.tsx
|
|
8
4
|
import {
|
|
@@ -21,41 +17,36 @@ function useSidebarContext() {
|
|
|
21
17
|
return ctx;
|
|
22
18
|
}
|
|
23
19
|
function SidebarProvider(props) {
|
|
24
|
-
var _a, _b;
|
|
25
20
|
const [openInner, setOpenInner] = useState(false);
|
|
26
21
|
const [open, setOpen] = [
|
|
27
|
-
|
|
28
|
-
|
|
22
|
+
props.open ?? openInner,
|
|
23
|
+
props.onOpenChange ?? setOpenInner
|
|
29
24
|
];
|
|
30
25
|
return /* @__PURE__ */ jsx(SidebarContext.Provider, { value: [open, setOpen], children: props.children });
|
|
31
26
|
}
|
|
32
|
-
function SidebarTrigger(
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"as"
|
|
37
|
-
]);
|
|
27
|
+
function SidebarTrigger({
|
|
28
|
+
as,
|
|
29
|
+
...props
|
|
30
|
+
}) {
|
|
38
31
|
const [open, setOpen] = useSidebarContext();
|
|
39
|
-
const As = as
|
|
32
|
+
const As = as ?? "button";
|
|
40
33
|
return /* @__PURE__ */ jsx(
|
|
41
34
|
As,
|
|
42
|
-
|
|
35
|
+
{
|
|
43
36
|
"aria-label": "Toggle Sidebar",
|
|
44
37
|
"data-open": open,
|
|
45
38
|
onClick: useCallback(() => {
|
|
46
39
|
setOpen(!open);
|
|
47
|
-
}, [open, setOpen])
|
|
48
|
-
|
|
40
|
+
}, [open, setOpen]),
|
|
41
|
+
...props
|
|
42
|
+
}
|
|
49
43
|
);
|
|
50
44
|
}
|
|
51
|
-
function SidebarList(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
"as",
|
|
57
|
-
"blockScrollingWidth"
|
|
58
|
-
]);
|
|
45
|
+
function SidebarList({
|
|
46
|
+
as,
|
|
47
|
+
blockScrollingWidth,
|
|
48
|
+
...props
|
|
49
|
+
}) {
|
|
59
50
|
const [open] = useSidebarContext();
|
|
60
51
|
const [isBlocking, setIsBlocking] = useState(false);
|
|
61
52
|
useEffect(() => {
|
|
@@ -74,13 +65,13 @@ function SidebarList(_a) {
|
|
|
74
65
|
}, [blockScrollingWidth]);
|
|
75
66
|
return /* @__PURE__ */ jsx(
|
|
76
67
|
RemoveScroll,
|
|
77
|
-
|
|
78
|
-
as: as
|
|
68
|
+
{
|
|
69
|
+
as: as ?? "aside",
|
|
79
70
|
"data-open": open,
|
|
80
|
-
enabled: Boolean(isBlocking && open)
|
|
81
|
-
|
|
71
|
+
enabled: Boolean(isBlocking && open),
|
|
72
|
+
...props,
|
|
82
73
|
children: props.children
|
|
83
|
-
}
|
|
74
|
+
}
|
|
84
75
|
);
|
|
85
76
|
}
|
|
86
77
|
export {
|
package/dist/source/index.js
CHANGED
|
@@ -2,10 +2,8 @@ import {
|
|
|
2
2
|
slash
|
|
3
3
|
} from "../chunk-UWEEHUJV.js";
|
|
4
4
|
import {
|
|
5
|
-
__export
|
|
6
|
-
|
|
7
|
-
__spreadValues
|
|
8
|
-
} from "../chunk-CWMXXUWU.js";
|
|
5
|
+
__export
|
|
6
|
+
} from "../chunk-MLKGABMK.js";
|
|
9
7
|
|
|
10
8
|
// src/source/path.ts
|
|
11
9
|
import { parse } from "path";
|
|
@@ -61,8 +59,9 @@ function resolvePath(from, join) {
|
|
|
61
59
|
}
|
|
62
60
|
|
|
63
61
|
// src/source/page-tree-builder.ts
|
|
64
|
-
var
|
|
65
|
-
var
|
|
62
|
+
var group = /^\((?<name>.+)\)$/;
|
|
63
|
+
var link = /^\[(?<text>.+)]\((?<url>.+)\)$/;
|
|
64
|
+
var separator = /^---(?<name>.*?)---$/;
|
|
66
65
|
var rest = "...";
|
|
67
66
|
function buildAll(nodes, ctx, skipIndex) {
|
|
68
67
|
const output = [];
|
|
@@ -84,18 +83,17 @@ function buildAll(nodes, ctx, skipIndex) {
|
|
|
84
83
|
return output;
|
|
85
84
|
}
|
|
86
85
|
function resolveFolderItem(folder, item, ctx, addedNodePaths) {
|
|
87
|
-
var _a, _b, _c, _d, _e, _f, _g;
|
|
88
86
|
if (item === rest) return "...";
|
|
89
87
|
const separateResult = separator.exec(item);
|
|
90
|
-
if (separateResult
|
|
88
|
+
if (separateResult?.groups) {
|
|
91
89
|
const node = {
|
|
92
90
|
type: "separator",
|
|
93
91
|
name: separateResult.groups.name
|
|
94
92
|
};
|
|
95
|
-
return [
|
|
93
|
+
return [ctx.options.attachSeparator?.(node) ?? node];
|
|
96
94
|
}
|
|
97
95
|
const linkResult = link.exec(item);
|
|
98
|
-
if (linkResult
|
|
96
|
+
if (linkResult?.groups) {
|
|
99
97
|
const { url, text } = linkResult.groups;
|
|
100
98
|
const isRelative = url.startsWith("/") || url.startsWith("#") || url.startsWith(".");
|
|
101
99
|
const node = {
|
|
@@ -104,7 +102,7 @@ function resolveFolderItem(folder, item, ctx, addedNodePaths) {
|
|
|
104
102
|
url,
|
|
105
103
|
external: !isRelative
|
|
106
104
|
};
|
|
107
|
-
return [
|
|
105
|
+
return [ctx.options.attachFile?.(node) ?? node];
|
|
108
106
|
}
|
|
109
107
|
let filename = item;
|
|
110
108
|
const isExcept = item.startsWith("!");
|
|
@@ -116,7 +114,7 @@ function resolveFolderItem(folder, item, ctx, addedNodePaths) {
|
|
|
116
114
|
filename = item.slice(3);
|
|
117
115
|
}
|
|
118
116
|
const path = resolvePath(folder.file.path, filename);
|
|
119
|
-
const itemNode =
|
|
117
|
+
const itemNode = ctx.storage.readDir(path) ?? ctx.storage.read(path, "page");
|
|
120
118
|
if (!itemNode) return [];
|
|
121
119
|
addedNodePaths.add(itemNode.file.path);
|
|
122
120
|
if (isExcept) return [];
|
|
@@ -127,23 +125,22 @@ function resolveFolderItem(folder, item, ctx, addedNodePaths) {
|
|
|
127
125
|
return [buildFileNode(itemNode, ctx)];
|
|
128
126
|
}
|
|
129
127
|
function buildFolderNode(folder, defaultIsRoot, ctx) {
|
|
130
|
-
var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j;
|
|
131
128
|
const metaPath = resolvePath(folder.file.path, "meta");
|
|
132
129
|
let meta = ctx.storage.read(metaPath, "meta");
|
|
133
|
-
meta =
|
|
130
|
+
meta = findLocalizedFile(metaPath, "meta", ctx) ?? meta;
|
|
134
131
|
const indexFile = ctx.storage.read(
|
|
135
132
|
resolvePath(folder.file.flattenedPath, "index"),
|
|
136
133
|
"page"
|
|
137
134
|
);
|
|
138
|
-
const metadata = meta
|
|
135
|
+
const metadata = meta?.data.data;
|
|
139
136
|
const index = indexFile ? buildFileNode(indexFile, ctx) : void 0;
|
|
140
137
|
let children;
|
|
141
138
|
if (!meta) {
|
|
142
139
|
children = buildAll(folder.children, ctx, !defaultIsRoot);
|
|
143
140
|
} else {
|
|
144
|
-
const isRoot =
|
|
141
|
+
const isRoot = metadata?.root ?? defaultIsRoot;
|
|
145
142
|
const addedNodePaths = /* @__PURE__ */ new Set();
|
|
146
|
-
const resolved =
|
|
143
|
+
const resolved = metadata?.pages?.flatMap((item) => {
|
|
147
144
|
return resolveFolderItem(folder, item, ctx, addedNodePaths);
|
|
148
145
|
});
|
|
149
146
|
const restNodes = buildAll(
|
|
@@ -151,20 +148,20 @@ function buildFolderNode(folder, defaultIsRoot, ctx) {
|
|
|
151
148
|
ctx,
|
|
152
149
|
!isRoot
|
|
153
150
|
);
|
|
154
|
-
const nodes = resolved
|
|
151
|
+
const nodes = resolved?.flatMap((item) => {
|
|
155
152
|
if (item === "...") {
|
|
156
153
|
return restNodes;
|
|
157
154
|
}
|
|
158
155
|
return item;
|
|
159
156
|
});
|
|
160
|
-
children = nodes
|
|
157
|
+
children = nodes ?? restNodes;
|
|
161
158
|
}
|
|
162
159
|
const node = {
|
|
163
160
|
type: "folder",
|
|
164
|
-
name:
|
|
165
|
-
icon:
|
|
166
|
-
root: metadata
|
|
167
|
-
defaultOpen: metadata
|
|
161
|
+
name: metadata?.title ?? index?.name ?? pathToName(folder.file.name, true),
|
|
162
|
+
icon: ctx.options.resolveIcon?.(metadata?.icon),
|
|
163
|
+
root: metadata?.root,
|
|
164
|
+
defaultOpen: metadata?.defaultOpen,
|
|
168
165
|
index,
|
|
169
166
|
children
|
|
170
167
|
};
|
|
@@ -172,20 +169,19 @@ function buildFolderNode(folder, defaultIsRoot, ctx) {
|
|
|
172
169
|
node.id = folder.file.flattenedPath;
|
|
173
170
|
}
|
|
174
171
|
return removeUndefined(
|
|
175
|
-
|
|
172
|
+
ctx.options.attachFolder?.(node, folder, meta) ?? node
|
|
176
173
|
);
|
|
177
174
|
}
|
|
178
175
|
function buildFileNode(file, ctx) {
|
|
179
|
-
|
|
180
|
-
const localized = (_a = findLocalizedFile(file.file.flattenedPath, "page", ctx)) != null ? _a : file;
|
|
176
|
+
const localized = findLocalizedFile(file.file.flattenedPath, "page", ctx) ?? file;
|
|
181
177
|
const data = localized.data;
|
|
182
178
|
const item = {
|
|
183
179
|
type: "page",
|
|
184
180
|
name: data.data.title,
|
|
185
|
-
icon:
|
|
181
|
+
icon: ctx.options.resolveIcon?.(data.data.icon),
|
|
186
182
|
url: ctx.options.getUrl(data.slugs, ctx.lang)
|
|
187
183
|
};
|
|
188
|
-
return removeUndefined(
|
|
184
|
+
return removeUndefined(ctx.options.attachFile?.(item, file) ?? item);
|
|
189
185
|
}
|
|
190
186
|
function build(ctx) {
|
|
191
187
|
const root = ctx.storage.root();
|
|
@@ -204,8 +200,7 @@ function createPageTreeBuilder() {
|
|
|
204
200
|
storage: options.storage
|
|
205
201
|
});
|
|
206
202
|
},
|
|
207
|
-
buildI18n(
|
|
208
|
-
var _b = _a, { languages = [], defaultLanguage } = _b, options = __objRest(_b, ["languages", "defaultLanguage"]);
|
|
203
|
+
buildI18n({ languages = [], defaultLanguage, ...options }) {
|
|
209
204
|
const entries = languages.map((lang) => {
|
|
210
205
|
const tree = build({
|
|
211
206
|
lang: lang === defaultLanguage ? void 0 : lang,
|
|
@@ -223,8 +218,15 @@ function findLocalizedFile(path, format, ctx) {
|
|
|
223
218
|
if (!ctx.lang) return;
|
|
224
219
|
return ctx.storage.read(`${path}.${ctx.lang}`, format);
|
|
225
220
|
}
|
|
226
|
-
function pathToName(
|
|
227
|
-
|
|
221
|
+
function pathToName(name, resolveGroup = false) {
|
|
222
|
+
const resolved = resolveGroup ? group.exec(name)?.[1] ?? name : name;
|
|
223
|
+
const result = [];
|
|
224
|
+
for (const c of resolved) {
|
|
225
|
+
if (result.length === 0) result.push(c.toLocaleUpperCase());
|
|
226
|
+
else if (c === "-") result.push(" ");
|
|
227
|
+
else result.push(c);
|
|
228
|
+
}
|
|
229
|
+
return result.join("");
|
|
228
230
|
}
|
|
229
231
|
function removeUndefined(value) {
|
|
230
232
|
const obj = value;
|
|
@@ -263,21 +265,19 @@ var Storage = class {
|
|
|
263
265
|
return this.rootFolder;
|
|
264
266
|
}
|
|
265
267
|
write(path, format, data) {
|
|
266
|
-
var _a;
|
|
267
268
|
const node = {
|
|
268
269
|
format,
|
|
269
270
|
file: parseFilePath(path),
|
|
270
271
|
data
|
|
271
272
|
};
|
|
272
273
|
this.makeDir(node.file.dirname);
|
|
273
|
-
|
|
274
|
+
this.readDir(node.file.dirname)?.children.push(node);
|
|
274
275
|
this.files.set(`${node.file.flattenedPath}.${node.format}`, node);
|
|
275
276
|
}
|
|
276
277
|
list() {
|
|
277
278
|
return [...this.files.values()];
|
|
278
279
|
}
|
|
279
280
|
makeDir(path) {
|
|
280
|
-
var _a;
|
|
281
281
|
const segments = splitPath(path);
|
|
282
282
|
for (let i = 0; i < segments.length; i++) {
|
|
283
283
|
const segment = segments.slice(0, i + 1).join("/");
|
|
@@ -287,17 +287,16 @@ var Storage = class {
|
|
|
287
287
|
children: []
|
|
288
288
|
};
|
|
289
289
|
this.folders.set(folder.file.path, folder);
|
|
290
|
-
|
|
290
|
+
this.readDir(folder.file.dirname)?.children.push(folder);
|
|
291
291
|
}
|
|
292
292
|
}
|
|
293
293
|
};
|
|
294
294
|
|
|
295
295
|
// src/source/load-files.ts
|
|
296
296
|
function loadFiles(files, options) {
|
|
297
|
-
var _a;
|
|
298
297
|
const { transformers = [] } = options;
|
|
299
298
|
const storage = new Storage();
|
|
300
|
-
const rootDir = normalizePath(
|
|
299
|
+
const rootDir = normalizePath(options.rootDir ?? "");
|
|
301
300
|
for (const file of files) {
|
|
302
301
|
const normalizedPath = normalizePath(file.path);
|
|
303
302
|
if (!normalizedPath.startsWith(rootDir)) continue;
|
|
@@ -327,7 +326,6 @@ function loadFiles(files, options) {
|
|
|
327
326
|
|
|
328
327
|
// src/source/loader.ts
|
|
329
328
|
function buildPageMap(storage, languages, getUrl) {
|
|
330
|
-
var _a;
|
|
331
329
|
const map = /* @__PURE__ */ new Map();
|
|
332
330
|
const defaultMap = /* @__PURE__ */ new Map();
|
|
333
331
|
map.set("", defaultMap);
|
|
@@ -336,12 +334,12 @@ function buildPageMap(storage, languages, getUrl) {
|
|
|
336
334
|
const page = fileToPage(file, getUrl);
|
|
337
335
|
defaultMap.set(page.slugs.join("/"), page);
|
|
338
336
|
for (const lang of languages) {
|
|
339
|
-
const langMap =
|
|
337
|
+
const langMap = map.get(lang) ?? /* @__PURE__ */ new Map();
|
|
340
338
|
const localized = storage.read(
|
|
341
339
|
`${file.file.flattenedPath}.${lang}`,
|
|
342
340
|
"page"
|
|
343
341
|
);
|
|
344
|
-
const localizedPage = fileToPage(localized
|
|
342
|
+
const localizedPage = fileToPage(localized ?? file, getUrl, lang);
|
|
345
343
|
langMap.set(localizedPage.slugs.join("/"), localizedPage);
|
|
346
344
|
map.set(lang, langMap);
|
|
347
345
|
}
|
|
@@ -356,7 +354,8 @@ function createGetUrl(baseUrl) {
|
|
|
356
354
|
}
|
|
357
355
|
function getSlugs(info) {
|
|
358
356
|
const result = [...info.dirname.split("/"), info.name].filter(
|
|
359
|
-
|
|
357
|
+
// filter empty folder names and file groups like (group_name)
|
|
358
|
+
(v) => v.length > 0 && !/^\(.+\)$/.test(v)
|
|
360
359
|
);
|
|
361
360
|
return result[result.length - 1] === "index" ? result.slice(0, -1) : result;
|
|
362
361
|
}
|
|
@@ -383,25 +382,26 @@ function createOutput({
|
|
|
383
382
|
getSlugs: slugsFn
|
|
384
383
|
}
|
|
385
384
|
);
|
|
386
|
-
const i18nMap = buildPageMap(storage, languages
|
|
385
|
+
const i18nMap = buildPageMap(storage, languages ?? [], getUrl);
|
|
387
386
|
const builder = createPageTreeBuilder();
|
|
388
|
-
const pageTree = languages === void 0 ? builder.build(
|
|
387
|
+
const pageTree = languages === void 0 ? builder.build({
|
|
389
388
|
storage,
|
|
390
389
|
resolveIcon,
|
|
391
|
-
getUrl
|
|
392
|
-
|
|
390
|
+
getUrl,
|
|
391
|
+
...pageTreeOptions
|
|
392
|
+
}) : builder.buildI18n({
|
|
393
393
|
languages,
|
|
394
394
|
storage,
|
|
395
395
|
resolveIcon,
|
|
396
396
|
getUrl,
|
|
397
|
-
defaultLanguage
|
|
398
|
-
|
|
397
|
+
defaultLanguage,
|
|
398
|
+
...pageTreeOptions
|
|
399
|
+
});
|
|
399
400
|
return {
|
|
400
401
|
pageTree,
|
|
401
402
|
files: storage.list(),
|
|
402
403
|
getPages(language = "") {
|
|
403
|
-
|
|
404
|
-
return Array.from((_b = (_a = i18nMap.get(language)) == null ? void 0 : _a.values()) != null ? _b : []);
|
|
404
|
+
return Array.from(i18nMap.get(language)?.values() ?? []);
|
|
405
405
|
},
|
|
406
406
|
getLanguages() {
|
|
407
407
|
const list = [];
|
|
@@ -415,8 +415,7 @@ function createOutput({
|
|
|
415
415
|
return list;
|
|
416
416
|
},
|
|
417
417
|
getPage(slugs = [], language = "") {
|
|
418
|
-
|
|
419
|
-
return (_a = i18nMap.get(language)) == null ? void 0 : _a.get(slugs.join("/"));
|
|
418
|
+
return i18nMap.get(language)?.get(slugs.join("/"));
|
|
420
419
|
}
|
|
421
420
|
};
|
|
422
421
|
}
|