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.
Files changed (43) hide show
  1. package/dist/{algolia-RQ5VQJAB.js → algolia-NXNLN7TR.js} +1 -3
  2. package/dist/breadcrumb.js +0 -2
  3. package/dist/{chunk-XMCPKVJQ.js → chunk-3JSIVMCJ.js} +3 -4
  4. package/dist/{chunk-NNKVN7WA.js → chunk-5SU2O5AS.js} +1 -1
  5. package/dist/chunk-7GNSIKII.js +47 -0
  6. package/dist/{chunk-FVY6EZ3N.js → chunk-BBP7MIO4.js} +12 -14
  7. package/dist/content/index.js +0 -2
  8. package/dist/dynamic-link.js +2 -3
  9. package/dist/{fetch-W5EHIBOE.js → fetch-ZSD7GUCX.js} +2 -4
  10. package/dist/framework/index.d.ts +1 -1
  11. package/dist/framework/index.js +1 -2
  12. package/dist/framework/next.js +1 -2
  13. package/dist/framework/react-router.js +1 -2
  14. package/dist/framework/tanstack.js +1 -2
  15. package/dist/hide-if-empty.d.ts +14 -0
  16. package/dist/hide-if-empty.js +63 -0
  17. package/dist/highlight/client.js +0 -1
  18. package/dist/highlight/index.js +0 -1
  19. package/dist/i18n/index.d.ts +32 -2
  20. package/dist/i18n/index.js +0 -2
  21. package/dist/link.js +2 -3
  22. package/dist/mdx-plugins/index.js +1 -2
  23. package/dist/{orama-cloud-USLSOSXS.js → orama-cloud-I4WBDIAI.js} +2 -3
  24. package/dist/search/algolia.js +0 -2
  25. package/dist/search/client.d.ts +70 -7
  26. package/dist/search/client.js +20 -13
  27. package/dist/search/orama-cloud.js +0 -2
  28. package/dist/search/server.d.ts +2 -1
  29. package/dist/search/server.js +5 -2
  30. package/dist/server/index.d.ts +2 -1
  31. package/dist/server/index.js +0 -1
  32. package/dist/sidebar.js +0 -1
  33. package/dist/source/index.d.ts +96 -96
  34. package/dist/source/index.js +214 -224
  35. package/dist/static-QTPM5MZT.js +60 -0
  36. package/dist/toc.js +0 -1
  37. package/dist/utils/use-effect-event.js +0 -1
  38. package/dist/utils/use-media-query.js +0 -1
  39. package/dist/utils/use-on-change.js +0 -1
  40. package/package.json +21 -13
  41. package/dist/chunk-MLKGABMK.js +0 -9
  42. package/dist/config-Cm58P4fz.d.ts +0 -32
  43. package/dist/static-VESU2S64.js +0 -61
@@ -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-XMCPKVJQ.js";
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 isPageFile(node) {
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
- for (const node of [...nodes].sort((a, b) => {
25
- let result;
26
- if (isPageFile(a) && "children" in b) result = -1;
27
- else if ("children" in a && isPageFile(b)) result = 1;
28
- else result = a.file.name.localeCompare(b.file.name);
29
- return reversed ? result * -1 : result;
30
- })) {
31
- if (filter && !filter(node)) continue;
32
- if (isPageFile(node)) {
33
- const localized = localeStorage?.read(
34
- joinPath(node.file.dirname, node.file.name),
35
- "page"
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(folder, item, ctx, idx, addedNodePaths) {
39
+ function resolveFolderItem(folderPath, item, ctx, idx, restNodePaths) {
50
40
  if (item === rest || item === restReversed) return item;
51
- const { options, storage, localeStorage } = ctx;
41
+ const { options, resolveName } = ctx;
52
42
  let match = separator.exec(item);
53
43
  if (match?.groups) {
54
44
  const node = {
55
- $id: `${folder.file.path}#${idx}`,
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(folder.file.path, filename);
84
- const itemNode = storage.readDir(path) ?? localeStorage?.read(path, "page") ?? storage.read(path, "page");
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
- if ("children" in itemNode) {
89
- const node = buildFolderNode(itemNode, false, ctx);
90
- return isExtract ? node.children : [node];
76
+ const dirNode = buildFolderNode(path, false, ctx);
77
+ if (dirNode) {
78
+ return isExtract ? dirNode.children : [dirNode];
91
79
  }
92
- return [buildFileNode(itemNode, ctx)];
80
+ const fileNode = buildFileNode(path, ctx);
81
+ return fileNode ? [fileNode] : [];
93
82
  }
94
- function buildFolderNode(folder, isGlobalRoot, ctx) {
95
- const { storage, localeStorage, options } = ctx;
96
- const metaPath = joinPath(folder.file.path, "meta");
97
- const meta = localeStorage?.read(metaPath, "meta") ?? storage.read(metaPath, "meta");
98
- const indexPath = joinPath(folder.file.path, "index");
99
- const indexFile = localeStorage?.read(indexPath, "page") ?? storage.read(indexPath, "page");
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 index;
94
+ let indexDisabled = false;
102
95
  let children;
103
96
  if (!meta?.data.pages) {
104
- if (indexFile) index = buildFileNode(indexFile, ctx);
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 addedNodePaths = /* @__PURE__ */ new Set();
110
- const resolved = meta.data.pages.flatMap((item, i) => resolveFolderItem(folder, item, ctx, i, addedNodePaths));
111
- if (indexFile && (isRoot || !addedNodePaths.has(indexFile.file.path))) {
112
- index = buildFileNode(indexFile, ctx);
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
- if (resolved[i] === rest || resolved[i] === restReversed) {
116
- resolved.splice(
117
- i,
118
- 1,
119
- ...buildAll(
120
- folder.children,
121
- ctx,
122
- (node2) => {
123
- if (node2.file.name === "index" && !isRoot) return false;
124
- return !addedNodePaths.has(node2.file.path);
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: meta?.data.title ?? index?.name ?? // resolve folder groups like (group_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: folder.file.path,
145
- $ref: !options.noRef ? {
146
- metaFile: meta?.file.path
134
+ $id: folderPath,
135
+ $ref: !options.noRef && meta ? {
136
+ metaFile: metaPath
147
137
  } : void 0
148
138
  };
149
- return options.attachFolder?.(node, folder, meta) ?? node;
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(file, { options, getUrl, locale }) {
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: file.file.path,
154
+ $id: path,
154
155
  type: "page",
155
- name: file.data.data.title ?? pathToName(file.file.name),
156
- description: file.data.data.description,
157
- icon: options.resolveIcon?.(file.data.data.icon),
158
- url: getUrl(file.data.slugs, locale),
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: file.file.path
161
+ file: path
161
162
  } : void 0
162
163
  };
163
- return options.attachFile?.(item, file) ?? item;
164
+ return options.attachFile?.(item, page) ?? item;
164
165
  }
165
166
  function build(ctx) {
166
- const root = ctx.storage.root();
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: options.storages[i18n.defaultLanguage],
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 file_system_exports = {};
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.rootFolder = {
257
- file: parseFolderPath(""),
258
- children: []
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
- * @param path - flattened path
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
- root() {
273
- return this.rootFolder;
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
- write(path, format, data) {
276
- const node = {
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
- const folder = {
297
- file: parseFolderPath(segment),
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 Storage();
270
+ const storage = new FileSystem();
310
271
  for (const file of files) {
311
272
  const parsedPath = normalizePath(file.path);
312
- if (file.type === "page") {
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 map = /* @__PURE__ */ new Map();
374
- const fileMapped = /* @__PURE__ */ new WeakMap();
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
- fileMapped.set(item, fileToMeta(item));
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
- fileMapped.set(item, page);
382
- map.set(`${defaultLanguage}.${page.slugs.join("/")}`, page);
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(path, "page");
388
- const localizedPage = fileToPage(localizedItem ?? item, getUrl, lang);
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
- fileMapped.set(localizedItem, localizedPage);
362
+ result.pathToPage.set(`${lang}.${item.path}`, localizedPage);
391
363
  }
392
- map.set(`${lang}.${localizedPage.slugs.join("/")}`, localizedPage);
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
- return [...info.dirname.split("/"), info.name].filter(
420
- // filter empty folder names and file groups like (group_name)
421
- (v, i, arr) => {
422
- if (v.length === 0) return false;
423
- return i === arr.length - 1 ? v !== "index" : !/^\(.+\)$/.test(v);
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
- const storages = i18n ? loadFilesI18n(files, {
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.keys()) {
495
- if (key.startsWith(`${language}.`)) pages.push(walker.pages.get(key));
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
- const file = storages[language].list().find((v) => v.format === "meta" && v.file.path === ref);
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
- const file = storages[language].list().find((v) => v.format === "page" && v.file.path === ref);
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
- file: file.file,
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: file.file,
556
- url: getUrl(file.data.slugs, locale),
557
- slugs: file.data.slugs,
558
- data: file.data.data,
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
- file_system_exports as FileSystem,
553
+ FileSystem,
564
554
  createGetUrl,
565
555
  createPageTreeBuilder,
566
556
  getSlugs,