fumadocs-core 15.5.0 → 15.5.2
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/{algolia-RQ5VQJAB.js → algolia-NXNLN7TR.js} +1 -3
- package/dist/breadcrumb.js +0 -2
- package/dist/{chunk-XMCPKVJQ.js → chunk-3JSIVMCJ.js} +3 -4
- package/dist/{chunk-NNKVN7WA.js → chunk-5SU2O5AS.js} +1 -1
- package/dist/chunk-7GNSIKII.js +47 -0
- package/dist/{chunk-FVY6EZ3N.js → chunk-BBP7MIO4.js} +12 -14
- package/dist/content/index.js +0 -2
- package/dist/dynamic-link.js +2 -3
- package/dist/{fetch-W5EHIBOE.js → fetch-ZSD7GUCX.js} +2 -4
- package/dist/framework/index.d.ts +1 -1
- package/dist/framework/index.js +1 -2
- package/dist/framework/next.js +1 -2
- package/dist/framework/react-router.js +1 -2
- package/dist/framework/tanstack.js +1 -2
- package/dist/hide-if-empty.d.ts +14 -0
- package/dist/hide-if-empty.js +63 -0
- package/dist/highlight/client.js +0 -1
- package/dist/highlight/index.js +0 -1
- package/dist/i18n/index.d.ts +32 -2
- package/dist/i18n/index.js +0 -2
- package/dist/link.js +2 -3
- package/dist/mdx-plugins/index.js +1 -2
- package/dist/{orama-cloud-USLSOSXS.js → orama-cloud-I4WBDIAI.js} +2 -3
- package/dist/search/algolia.js +0 -2
- package/dist/search/client.d.ts +70 -7
- package/dist/search/client.js +20 -13
- package/dist/search/orama-cloud.js +0 -2
- package/dist/search/server.d.ts +2 -1
- package/dist/search/server.js +5 -2
- package/dist/server/index.d.ts +2 -1
- package/dist/server/index.js +0 -1
- package/dist/sidebar.js +0 -1
- package/dist/source/index.d.ts +96 -96
- package/dist/source/index.js +214 -224
- package/dist/static-QTPM5MZT.js +60 -0
- package/dist/toc.js +0 -1
- package/dist/utils/use-effect-event.js +0 -1
- package/dist/utils/use-media-query.js +0 -1
- package/dist/utils/use-on-change.js +0 -1
- package/package.json +21 -13
- package/dist/chunk-MLKGABMK.js +0 -9
- package/dist/config-Cm58P4fz.d.ts +0 -32
- package/dist/static-VESU2S64.js +0 -61
package/dist/source/index.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
|
+
import {
|
|
2
|
+
basename,
|
|
3
|
+
dirname,
|
|
4
|
+
extname,
|
|
5
|
+
parseFilePath,
|
|
6
|
+
parseFolderPath
|
|
7
|
+
} from "../chunk-7GNSIKII.js";
|
|
1
8
|
import {
|
|
2
9
|
joinPath,
|
|
3
10
|
slash,
|
|
4
11
|
splitPath
|
|
5
|
-
} from "../chunk-
|
|
6
|
-
import {
|
|
7
|
-
__export
|
|
8
|
-
} from "../chunk-MLKGABMK.js";
|
|
12
|
+
} from "../chunk-3JSIVMCJ.js";
|
|
9
13
|
|
|
10
14
|
// src/source/page-tree-builder.ts
|
|
11
15
|
var group = /^\((?<name>.+)\)$/;
|
|
@@ -15,44 +19,30 @@ var rest = "...";
|
|
|
15
19
|
var restReversed = "z...a";
|
|
16
20
|
var extractPrefix = "...";
|
|
17
21
|
var excludePrefix = "!";
|
|
18
|
-
function
|
|
19
|
-
return "data" in node && node.format === "page";
|
|
20
|
-
}
|
|
21
|
-
function buildAll(nodes, ctx, filter, reversed = false) {
|
|
22
|
-
const { localeStorage } = ctx;
|
|
22
|
+
function buildAll(paths, ctx, filter, reversed = false) {
|
|
23
23
|
const output = [];
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
);
|
|
37
|
-
const treeNode = buildFileNode(localized ?? node, ctx);
|
|
38
|
-
if (node.file.name === "index") {
|
|
39
|
-
output.unshift(treeNode);
|
|
40
|
-
continue;
|
|
41
|
-
}
|
|
42
|
-
output.push(treeNode);
|
|
43
|
-
} else if ("children" in node) {
|
|
44
|
-
output.push(buildFolderNode(node, false, ctx));
|
|
45
|
-
}
|
|
24
|
+
const sortedPaths = (filter ? paths.filter(filter) : [...paths]).sort(
|
|
25
|
+
(a, b) => a.localeCompare(b) * (reversed ? -1 : 1)
|
|
26
|
+
);
|
|
27
|
+
for (const path of sortedPaths) {
|
|
28
|
+
const fileNode = buildFileNode(path, ctx);
|
|
29
|
+
if (!fileNode) continue;
|
|
30
|
+
if (basename(path, extname(path)) === "index") output.unshift(fileNode);
|
|
31
|
+
else output.push(fileNode);
|
|
32
|
+
}
|
|
33
|
+
for (const dir of sortedPaths) {
|
|
34
|
+
const dirNode = buildFolderNode(dir, false, ctx);
|
|
35
|
+
if (dirNode) output.push(dirNode);
|
|
46
36
|
}
|
|
47
37
|
return output;
|
|
48
38
|
}
|
|
49
|
-
function resolveFolderItem(
|
|
39
|
+
function resolveFolderItem(folderPath, item, ctx, idx, restNodePaths) {
|
|
50
40
|
if (item === rest || item === restReversed) return item;
|
|
51
|
-
const { options,
|
|
41
|
+
const { options, resolveName } = ctx;
|
|
52
42
|
let match = separator.exec(item);
|
|
53
43
|
if (match?.groups) {
|
|
54
44
|
const node = {
|
|
55
|
-
$id: `${
|
|
45
|
+
$id: `${folderPath}#${idx}`,
|
|
56
46
|
type: "separator",
|
|
57
47
|
icon: options.resolveIcon?.(match.groups.icon),
|
|
58
48
|
name: match.groups.name
|
|
@@ -80,91 +70,101 @@ function resolveFolderItem(folder, item, ctx, idx, addedNodePaths) {
|
|
|
80
70
|
} else if (isExtract) {
|
|
81
71
|
filename = item.slice(extractPrefix.length);
|
|
82
72
|
}
|
|
83
|
-
const path = joinPath(
|
|
84
|
-
|
|
85
|
-
if (!itemNode) return [];
|
|
86
|
-
addedNodePaths.add(itemNode.file.path);
|
|
73
|
+
const path = resolveName(joinPath(folderPath, filename), "page");
|
|
74
|
+
restNodePaths.delete(path);
|
|
87
75
|
if (isExcept) return [];
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
return isExtract ?
|
|
76
|
+
const dirNode = buildFolderNode(path, false, ctx);
|
|
77
|
+
if (dirNode) {
|
|
78
|
+
return isExtract ? dirNode.children : [dirNode];
|
|
91
79
|
}
|
|
92
|
-
|
|
80
|
+
const fileNode = buildFileNode(path, ctx);
|
|
81
|
+
return fileNode ? [fileNode] : [];
|
|
93
82
|
}
|
|
94
|
-
function buildFolderNode(
|
|
95
|
-
const { storage, localeStorage, options } = ctx;
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
const
|
|
99
|
-
const
|
|
83
|
+
function buildFolderNode(folderPath, isGlobalRoot, ctx) {
|
|
84
|
+
const { storage, localeStorage, options, resolveName } = ctx;
|
|
85
|
+
const files = storage.readDir(folderPath);
|
|
86
|
+
if (!files) return;
|
|
87
|
+
const metaPath = resolveName(joinPath(folderPath, "meta"), "meta");
|
|
88
|
+
const indexPath = resolveName(joinPath(folderPath, "index"), "page");
|
|
89
|
+
let meta = localeStorage?.read(metaPath) ?? storage.read(metaPath);
|
|
90
|
+
if (meta?.format !== "meta") {
|
|
91
|
+
meta = void 0;
|
|
92
|
+
}
|
|
100
93
|
const isRoot = meta?.data.root ?? isGlobalRoot;
|
|
101
|
-
let
|
|
94
|
+
let indexDisabled = false;
|
|
102
95
|
let children;
|
|
103
96
|
if (!meta?.data.pages) {
|
|
104
|
-
|
|
105
|
-
children = buildAll(folder.children, ctx, (node2) => {
|
|
106
|
-
return node2.file.name !== "index" || isRoot;
|
|
107
|
-
});
|
|
97
|
+
children = buildAll(files, ctx, (file) => isRoot || file !== indexPath);
|
|
108
98
|
} else {
|
|
109
|
-
const
|
|
110
|
-
const resolved = meta.data.pages.flatMap((item, i) => resolveFolderItem(
|
|
111
|
-
if (
|
|
112
|
-
|
|
99
|
+
const restItems = new Set(files);
|
|
100
|
+
const resolved = meta.data.pages.flatMap((item, i) => resolveFolderItem(folderPath, item, ctx, i, restItems));
|
|
101
|
+
if (!isRoot && !restItems.has(indexPath)) {
|
|
102
|
+
indexDisabled = true;
|
|
113
103
|
}
|
|
114
104
|
for (let i = 0; i < resolved.length; i++) {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
resolved[i] === restReversed
|
|
127
|
-
)
|
|
128
|
-
);
|
|
129
|
-
break;
|
|
130
|
-
}
|
|
105
|
+
const item = resolved[i];
|
|
106
|
+
if (item !== rest && item !== restReversed) continue;
|
|
107
|
+
const items = buildAll(
|
|
108
|
+
files,
|
|
109
|
+
ctx,
|
|
110
|
+
// index files are not included in ... unless it's a root folder
|
|
111
|
+
(file) => (file !== indexPath || isRoot) && restItems.has(file),
|
|
112
|
+
item === restReversed
|
|
113
|
+
);
|
|
114
|
+
resolved.splice(i, 1, ...items);
|
|
115
|
+
break;
|
|
131
116
|
}
|
|
132
117
|
children = resolved;
|
|
133
118
|
}
|
|
119
|
+
const index = !indexDisabled ? buildFileNode(indexPath, ctx) : void 0;
|
|
120
|
+
let name = meta?.data.title ?? index?.name;
|
|
121
|
+
if (!name) {
|
|
122
|
+
const folderName = basename(folderPath);
|
|
123
|
+
name = pathToName(group.exec(folderName)?.[1] ?? folderName);
|
|
124
|
+
}
|
|
134
125
|
const node = {
|
|
135
126
|
type: "folder",
|
|
136
|
-
name
|
|
137
|
-
pathToName(group.exec(folder.file.name)?.[1] ?? folder.file.name),
|
|
127
|
+
name,
|
|
138
128
|
icon: options.resolveIcon?.(meta?.data.icon) ?? index?.icon,
|
|
139
129
|
root: meta?.data.root,
|
|
140
130
|
defaultOpen: meta?.data.defaultOpen,
|
|
141
131
|
description: meta?.data.description,
|
|
142
132
|
index,
|
|
143
133
|
children,
|
|
144
|
-
$id:
|
|
145
|
-
$ref: !options.noRef ? {
|
|
146
|
-
metaFile:
|
|
134
|
+
$id: folderPath,
|
|
135
|
+
$ref: !options.noRef && meta ? {
|
|
136
|
+
metaFile: metaPath
|
|
147
137
|
} : void 0
|
|
148
138
|
};
|
|
149
|
-
return options.attachFolder?.(
|
|
139
|
+
return options.attachFolder?.(
|
|
140
|
+
node,
|
|
141
|
+
{
|
|
142
|
+
get children() {
|
|
143
|
+
return files.flatMap((file) => storage.read(file) ?? []);
|
|
144
|
+
}
|
|
145
|
+
},
|
|
146
|
+
meta
|
|
147
|
+
) ?? node;
|
|
150
148
|
}
|
|
151
|
-
function buildFileNode(
|
|
149
|
+
function buildFileNode(path, { options, getUrl, storage, localeStorage, locale }) {
|
|
150
|
+
const page = localeStorage?.read(path) ?? storage.read(path);
|
|
151
|
+
if (page?.format !== "page") return;
|
|
152
|
+
const { title, description, icon } = page.data;
|
|
152
153
|
const item = {
|
|
153
|
-
$id:
|
|
154
|
+
$id: path,
|
|
154
155
|
type: "page",
|
|
155
|
-
name:
|
|
156
|
-
description
|
|
157
|
-
icon: options.resolveIcon?.(
|
|
158
|
-
url: getUrl(
|
|
156
|
+
name: title ?? pathToName(basename(path, extname(path))),
|
|
157
|
+
description,
|
|
158
|
+
icon: options.resolveIcon?.(icon),
|
|
159
|
+
url: getUrl(page.slugs, locale),
|
|
159
160
|
$ref: !options.noRef ? {
|
|
160
|
-
file:
|
|
161
|
+
file: path
|
|
161
162
|
} : void 0
|
|
162
163
|
};
|
|
163
|
-
return options.attachFile?.(item,
|
|
164
|
+
return options.attachFile?.(item, page) ?? item;
|
|
164
165
|
}
|
|
165
166
|
function build(ctx) {
|
|
166
|
-
const
|
|
167
|
-
const folder = buildFolderNode(root, true, ctx);
|
|
167
|
+
const folder = buildFolderNode("", true, ctx);
|
|
168
168
|
return {
|
|
169
169
|
$id: ctx.locale ?? "root",
|
|
170
170
|
name: folder.name,
|
|
@@ -172,24 +172,45 @@ function build(ctx) {
|
|
|
172
172
|
};
|
|
173
173
|
}
|
|
174
174
|
function createPageTreeBuilder(getUrl) {
|
|
175
|
+
function createFlattenPathResolver(storage) {
|
|
176
|
+
const map = /* @__PURE__ */ new Map();
|
|
177
|
+
const files = storage.getFiles();
|
|
178
|
+
for (const file of files) {
|
|
179
|
+
const content = storage.read(file);
|
|
180
|
+
const flattenPath = file.substring(0, file.length - extname(file).length);
|
|
181
|
+
map.set(flattenPath + "." + content.format, file);
|
|
182
|
+
}
|
|
183
|
+
return (name, format) => {
|
|
184
|
+
return map.get(name + "." + format);
|
|
185
|
+
};
|
|
186
|
+
}
|
|
175
187
|
return {
|
|
176
188
|
build(options) {
|
|
189
|
+
const resolve = createFlattenPathResolver(options.storage);
|
|
177
190
|
return build({
|
|
178
191
|
options,
|
|
179
192
|
builder: this,
|
|
180
193
|
storage: options.storage,
|
|
181
|
-
getUrl
|
|
194
|
+
getUrl,
|
|
195
|
+
resolveName(name, format) {
|
|
196
|
+
return resolve(name, format) ?? name;
|
|
197
|
+
}
|
|
182
198
|
});
|
|
183
199
|
},
|
|
184
200
|
buildI18n({ i18n, ...options }) {
|
|
201
|
+
const storage = options.storages[i18n.defaultLanguage];
|
|
202
|
+
const resolve = createFlattenPathResolver(storage);
|
|
185
203
|
const entries = i18n.languages.map((lang) => {
|
|
186
204
|
const tree = build({
|
|
187
205
|
options,
|
|
188
206
|
getUrl,
|
|
189
207
|
builder: this,
|
|
190
208
|
locale: lang,
|
|
191
|
-
storage
|
|
192
|
-
localeStorage: options.storages[lang]
|
|
209
|
+
storage,
|
|
210
|
+
localeStorage: options.storages[lang],
|
|
211
|
+
resolveName(name, format) {
|
|
212
|
+
return resolve(name, format) ?? name;
|
|
213
|
+
}
|
|
193
214
|
});
|
|
194
215
|
return [lang, tree];
|
|
195
216
|
});
|
|
@@ -207,118 +228,49 @@ function pathToName(name) {
|
|
|
207
228
|
return result.join("");
|
|
208
229
|
}
|
|
209
230
|
|
|
210
|
-
// src/source/path.ts
|
|
211
|
-
function parseFilePath(path) {
|
|
212
|
-
const segments = splitPath(slash(path));
|
|
213
|
-
const dirname = segments.slice(0, -1).join("/");
|
|
214
|
-
let name = segments.at(-1) ?? "";
|
|
215
|
-
let ext = "";
|
|
216
|
-
const dotIdx = name.lastIndexOf(".");
|
|
217
|
-
if (dotIdx !== -1) {
|
|
218
|
-
ext = name.substring(dotIdx);
|
|
219
|
-
name = name.substring(0, dotIdx);
|
|
220
|
-
}
|
|
221
|
-
return {
|
|
222
|
-
dirname,
|
|
223
|
-
name,
|
|
224
|
-
path: segments.join("/"),
|
|
225
|
-
ext,
|
|
226
|
-
get flattenedPath() {
|
|
227
|
-
return [dirname, name].filter((p) => p.length > 0).join("/");
|
|
228
|
-
}
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
function parseFolderPath(path) {
|
|
232
|
-
const segments = splitPath(slash(path));
|
|
233
|
-
const base = segments.at(-1) ?? "";
|
|
234
|
-
return {
|
|
235
|
-
dirname: segments.slice(0, -1).join("/"),
|
|
236
|
-
name: base,
|
|
237
|
-
path: segments.join("/")
|
|
238
|
-
};
|
|
239
|
-
}
|
|
240
|
-
function normalizePath(path) {
|
|
241
|
-
const segments = splitPath(slash(path));
|
|
242
|
-
if (segments[0] === "." || segments[0] === "..")
|
|
243
|
-
throw new Error("It must not start with './' or '../'");
|
|
244
|
-
return segments.join("/");
|
|
245
|
-
}
|
|
246
|
-
|
|
247
231
|
// src/source/file-system.ts
|
|
248
|
-
var
|
|
249
|
-
__export(file_system_exports, {
|
|
250
|
-
Storage: () => Storage
|
|
251
|
-
});
|
|
252
|
-
var Storage = class {
|
|
232
|
+
var FileSystem = class {
|
|
253
233
|
constructor() {
|
|
254
234
|
this.files = /* @__PURE__ */ new Map();
|
|
255
235
|
this.folders = /* @__PURE__ */ new Map();
|
|
256
|
-
this.
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
this.folders.set("", this.rootFolder);
|
|
236
|
+
this.folders.set("", []);
|
|
237
|
+
}
|
|
238
|
+
read(path) {
|
|
239
|
+
return this.files.get(path);
|
|
261
240
|
}
|
|
262
241
|
/**
|
|
263
|
-
*
|
|
264
|
-
* @param format - file format
|
|
242
|
+
* get the direct children of folder (in virtual file path)
|
|
265
243
|
*/
|
|
266
|
-
read(path, format) {
|
|
267
|
-
return this.files.get(`${path}.${format}`);
|
|
268
|
-
}
|
|
269
244
|
readDir(path) {
|
|
270
245
|
return this.folders.get(path);
|
|
271
246
|
}
|
|
272
|
-
|
|
273
|
-
|
|
247
|
+
write(path, file) {
|
|
248
|
+
const dir = dirname(path);
|
|
249
|
+
this.makeDir(dir);
|
|
250
|
+
this.readDir(dir)?.push(path);
|
|
251
|
+
this.files.set(path, file);
|
|
274
252
|
}
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
format,
|
|
278
|
-
file: parseFilePath(path),
|
|
279
|
-
data
|
|
280
|
-
};
|
|
281
|
-
this.makeDir(node.file.dirname);
|
|
282
|
-
this.readDir(node.file.dirname)?.children.push(node);
|
|
283
|
-
this.files.set(
|
|
284
|
-
joinPath(node.file.dirname, `${node.file.name}.${node.format}`),
|
|
285
|
-
node
|
|
286
|
-
);
|
|
287
|
-
}
|
|
288
|
-
list() {
|
|
289
|
-
return Array.from(this.files.values());
|
|
253
|
+
getFiles() {
|
|
254
|
+
return Array.from(this.files.keys());
|
|
290
255
|
}
|
|
291
256
|
makeDir(path) {
|
|
292
257
|
const segments = splitPath(path);
|
|
293
258
|
for (let i = 0; i < segments.length; i++) {
|
|
294
259
|
const segment = segments.slice(0, i + 1).join("/");
|
|
295
260
|
if (this.folders.has(segment)) continue;
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
children: []
|
|
299
|
-
};
|
|
300
|
-
this.folders.set(folder.file.path, folder);
|
|
301
|
-
this.readDir(folder.file.dirname)?.children.push(folder);
|
|
261
|
+
this.folders.set(segment, []);
|
|
262
|
+
this.readDir(dirname(segment))?.push(path);
|
|
302
263
|
}
|
|
303
264
|
}
|
|
304
265
|
};
|
|
305
266
|
|
|
306
267
|
// src/source/load-files.ts
|
|
307
|
-
function loadFiles(files, options) {
|
|
268
|
+
function loadFiles(files, buildFile, options) {
|
|
308
269
|
const { transformers = [] } = options;
|
|
309
|
-
const storage = new
|
|
270
|
+
const storage = new FileSystem();
|
|
310
271
|
for (const file of files) {
|
|
311
272
|
const parsedPath = normalizePath(file.path);
|
|
312
|
-
|
|
313
|
-
const slugs = file.slugs ?? options.getSlugs(parseFilePath(parsedPath));
|
|
314
|
-
storage.write(parsedPath, file.type, {
|
|
315
|
-
slugs,
|
|
316
|
-
data: file.data
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
if (file.type === "meta") {
|
|
320
|
-
storage.write(parsedPath, file.type, file.data);
|
|
321
|
-
}
|
|
273
|
+
storage.write(parsedPath, buildFile(file));
|
|
322
274
|
}
|
|
323
275
|
for (const transformer of transformers) {
|
|
324
276
|
transformer({
|
|
@@ -328,7 +280,7 @@ function loadFiles(files, options) {
|
|
|
328
280
|
}
|
|
329
281
|
return storage;
|
|
330
282
|
}
|
|
331
|
-
function loadFilesI18n(files, options) {
|
|
283
|
+
function loadFilesI18n(files, buildFile, options) {
|
|
332
284
|
const parser = options.i18n.parser === "dir" ? dirParser : dotParser;
|
|
333
285
|
const storages = {};
|
|
334
286
|
for (const lang of options.i18n.languages) {
|
|
@@ -343,6 +295,7 @@ function loadFilesI18n(files, options) {
|
|
|
343
295
|
}
|
|
344
296
|
return [];
|
|
345
297
|
}),
|
|
298
|
+
buildFile,
|
|
346
299
|
options
|
|
347
300
|
);
|
|
348
301
|
}
|
|
@@ -366,39 +319,56 @@ function dotParser(path) {
|
|
|
366
319
|
}
|
|
367
320
|
return [path];
|
|
368
321
|
}
|
|
322
|
+
function normalizePath(path) {
|
|
323
|
+
const segments = splitPath(slash(path));
|
|
324
|
+
if (segments[0] === "." || segments[0] === "..")
|
|
325
|
+
throw new Error("It must not start with './' or '../'");
|
|
326
|
+
return segments.join("/");
|
|
327
|
+
}
|
|
369
328
|
|
|
370
329
|
// src/source/loader.ts
|
|
371
330
|
function indexPages(storages, getUrl, i18n) {
|
|
331
|
+
const result = {
|
|
332
|
+
// (locale.slugs -> page)
|
|
333
|
+
pages: /* @__PURE__ */ new Map(),
|
|
334
|
+
// (locale.path -> page)
|
|
335
|
+
pathToMeta: /* @__PURE__ */ new Map(),
|
|
336
|
+
// (locale.path -> meta)
|
|
337
|
+
pathToPage: /* @__PURE__ */ new Map()
|
|
338
|
+
};
|
|
372
339
|
const defaultLanguage = i18n?.defaultLanguage ?? "";
|
|
373
|
-
const
|
|
374
|
-
|
|
375
|
-
for (const item of storages[defaultLanguage].list()) {
|
|
340
|
+
for (const filePath of storages[defaultLanguage].getFiles()) {
|
|
341
|
+
const item = storages[defaultLanguage].read(filePath);
|
|
376
342
|
if (item.format === "meta") {
|
|
377
|
-
|
|
343
|
+
result.pathToMeta.set(
|
|
344
|
+
`${defaultLanguage}.${item.path}`,
|
|
345
|
+
fileToMeta(item)
|
|
346
|
+
);
|
|
378
347
|
}
|
|
379
348
|
if (item.format === "page") {
|
|
380
349
|
const page = fileToPage(item, getUrl, defaultLanguage);
|
|
381
|
-
|
|
382
|
-
|
|
350
|
+
result.pathToPage.set(`${defaultLanguage}.${item.path}`, page);
|
|
351
|
+
result.pages.set(`${defaultLanguage}.${page.slugs.join("/")}`, page);
|
|
383
352
|
if (!i18n) continue;
|
|
384
|
-
const path = joinPath(item.file.dirname, item.file.name);
|
|
385
353
|
for (const lang of i18n.languages) {
|
|
386
354
|
if (lang === defaultLanguage) continue;
|
|
387
|
-
const localizedItem = storages[lang].read(
|
|
388
|
-
const localizedPage = fileToPage(
|
|
355
|
+
const localizedItem = storages[lang].read(filePath);
|
|
356
|
+
const localizedPage = fileToPage(
|
|
357
|
+
localizedItem?.format === "page" ? localizedItem : item,
|
|
358
|
+
getUrl,
|
|
359
|
+
lang
|
|
360
|
+
);
|
|
389
361
|
if (localizedItem) {
|
|
390
|
-
|
|
362
|
+
result.pathToPage.set(`${lang}.${item.path}`, localizedPage);
|
|
391
363
|
}
|
|
392
|
-
|
|
364
|
+
result.pages.set(
|
|
365
|
+
`${lang}.${localizedPage.slugs.join("/")}`,
|
|
366
|
+
localizedPage
|
|
367
|
+
);
|
|
393
368
|
}
|
|
394
369
|
}
|
|
395
370
|
}
|
|
396
|
-
return
|
|
397
|
-
pages: map,
|
|
398
|
-
getResultFromFile(file) {
|
|
399
|
-
return fileMapped.get(file);
|
|
400
|
-
}
|
|
401
|
-
};
|
|
371
|
+
return result;
|
|
402
372
|
}
|
|
403
373
|
function createGetUrl(baseUrl, i18n) {
|
|
404
374
|
const baseSlugs = baseUrl.split("/");
|
|
@@ -416,13 +386,14 @@ function createGetUrl(baseUrl, i18n) {
|
|
|
416
386
|
};
|
|
417
387
|
}
|
|
418
388
|
function getSlugs(info) {
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
(
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
389
|
+
const slugs = [];
|
|
390
|
+
for (const seg of info.dirname.split("/")) {
|
|
391
|
+
if (seg.length > 0 && !/^\(.+\)$/.test(seg)) slugs.push(encodeURI(seg));
|
|
392
|
+
}
|
|
393
|
+
if (info.name !== "index") {
|
|
394
|
+
slugs.push(encodeURI(info.name));
|
|
395
|
+
}
|
|
396
|
+
return slugs;
|
|
426
397
|
}
|
|
427
398
|
function loader(options) {
|
|
428
399
|
return createOutput(options);
|
|
@@ -435,18 +406,31 @@ function createOutput(options) {
|
|
|
435
406
|
const defaultLanguage = i18n?.defaultLanguage ?? "";
|
|
436
407
|
const getUrl = options.url ?? createGetUrl(options.baseUrl ?? "/", options.i18n);
|
|
437
408
|
const files = typeof source.files === "function" ? source.files() : source.files;
|
|
438
|
-
|
|
409
|
+
function buildFile(file) {
|
|
410
|
+
if (file.type === "page") {
|
|
411
|
+
return {
|
|
412
|
+
format: "page",
|
|
413
|
+
path: file.path,
|
|
414
|
+
slugs: file.slugs ?? slugsFn(parseFilePath(file.path)),
|
|
415
|
+
data: file.data,
|
|
416
|
+
absolutePath: file.absolutePath ?? ""
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
return {
|
|
420
|
+
format: "meta",
|
|
421
|
+
path: file.path,
|
|
422
|
+
absolutePath: file.absolutePath ?? "",
|
|
423
|
+
data: file.data
|
|
424
|
+
};
|
|
425
|
+
}
|
|
426
|
+
const storages = i18n ? loadFilesI18n(files, buildFile, {
|
|
427
|
+
...options,
|
|
439
428
|
i18n: {
|
|
440
429
|
...i18n,
|
|
441
430
|
parser: i18n.parser ?? "dot"
|
|
442
|
-
}
|
|
443
|
-
transformers: options.transformers,
|
|
444
|
-
getSlugs: slugsFn
|
|
431
|
+
}
|
|
445
432
|
}) : {
|
|
446
|
-
"": loadFiles(files,
|
|
447
|
-
transformers: options.transformers,
|
|
448
|
-
getSlugs: slugsFn
|
|
449
|
-
})
|
|
433
|
+
"": loadFiles(files, buildFile, options)
|
|
450
434
|
};
|
|
451
435
|
const walker = indexPages(storages, getUrl, i18n);
|
|
452
436
|
const builder = createPageTreeBuilder(getUrl);
|
|
@@ -491,8 +475,8 @@ function createOutput(options) {
|
|
|
491
475
|
},
|
|
492
476
|
getPages(language = defaultLanguage) {
|
|
493
477
|
const pages = [];
|
|
494
|
-
for (const key of walker.pages.
|
|
495
|
-
if (key.startsWith(`${language}.`)) pages.push(
|
|
478
|
+
for (const [key, value] of walker.pages.entries()) {
|
|
479
|
+
if (key.startsWith(`${language}.`)) pages.push(value);
|
|
496
480
|
}
|
|
497
481
|
return pages;
|
|
498
482
|
},
|
|
@@ -513,14 +497,12 @@ function createOutput(options) {
|
|
|
513
497
|
getNodeMeta(node, language = defaultLanguage) {
|
|
514
498
|
const ref = node.$ref?.metaFile;
|
|
515
499
|
if (!ref) return;
|
|
516
|
-
|
|
517
|
-
if (file) return walker.getResultFromFile(file);
|
|
500
|
+
return walker.pathToMeta.get(`${language}.${ref}`);
|
|
518
501
|
},
|
|
519
502
|
getNodePage(node, language = defaultLanguage) {
|
|
520
503
|
const ref = node.$ref?.file;
|
|
521
504
|
if (!ref) return;
|
|
522
|
-
|
|
523
|
-
if (file) return walker.getResultFromFile(file);
|
|
505
|
+
return walker.pathToPage.get(`${language}.${ref}`);
|
|
524
506
|
},
|
|
525
507
|
getPageTree(locale) {
|
|
526
508
|
if (options.i18n) {
|
|
@@ -546,21 +528,29 @@ function createOutput(options) {
|
|
|
546
528
|
}
|
|
547
529
|
function fileToMeta(file) {
|
|
548
530
|
return {
|
|
549
|
-
|
|
531
|
+
path: file.path,
|
|
532
|
+
absolutePath: file.absolutePath,
|
|
533
|
+
get file() {
|
|
534
|
+
return parseFilePath(this.path);
|
|
535
|
+
},
|
|
550
536
|
data: file.data
|
|
551
537
|
};
|
|
552
538
|
}
|
|
553
539
|
function fileToPage(file, getUrl, locale) {
|
|
554
540
|
return {
|
|
555
|
-
file
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
541
|
+
get file() {
|
|
542
|
+
return parseFilePath(this.path);
|
|
543
|
+
},
|
|
544
|
+
absolutePath: file.absolutePath,
|
|
545
|
+
path: file.path,
|
|
546
|
+
url: getUrl(file.slugs, locale),
|
|
547
|
+
slugs: file.slugs,
|
|
548
|
+
data: file.data,
|
|
559
549
|
locale
|
|
560
550
|
};
|
|
561
551
|
}
|
|
562
552
|
export {
|
|
563
|
-
|
|
553
|
+
FileSystem,
|
|
564
554
|
createGetUrl,
|
|
565
555
|
createPageTreeBuilder,
|
|
566
556
|
getSlugs,
|