fumadocs-core 15.6.12 → 15.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -18,30 +18,30 @@ function getTableOfContents(content, remarkPlugins) {
18
18
  }
19
19
 
20
20
  // src/utils/page-tree.tsx
21
- function flattenTree(tree) {
22
- return tree.flatMap((node) => {
23
- if (node.type === "separator") return [];
21
+ function flattenTree(nodes) {
22
+ const out = [];
23
+ for (const node of nodes) {
24
24
  if (node.type === "folder") {
25
- const child = flattenTree(node.children);
26
- if (node.index) return [node.index, ...child];
27
- return child;
25
+ if (node.index) out.push(node.index);
26
+ out.push(...flattenTree(node.children));
27
+ } else if (node.type === "page") {
28
+ out.push(node);
28
29
  }
29
- return [node];
30
- });
30
+ }
31
+ return out;
31
32
  }
32
33
  function findNeighbour(tree, url, options) {
33
34
  const { separateRoot = true } = options ?? {};
34
35
  const roots = separateRoot ? getPageTreeRoots(tree) : [tree];
36
+ if (tree.fallback) roots.push(tree.fallback);
35
37
  for (const root of roots) {
36
38
  const list = flattenTree(root.children);
37
- for (let i = 0; i < list.length; i++) {
38
- if (list[i].url === url) {
39
- return {
40
- next: list[i + 1],
41
- previous: list[i - 1]
42
- };
43
- }
44
- }
39
+ const idx = list.findIndex((item) => item.url === url);
40
+ if (idx === -1) continue;
41
+ return {
42
+ previous: list[idx - 1],
43
+ next: list[idx + 1]
44
+ };
45
45
  }
46
46
  return {};
47
47
  }
@@ -49,9 +49,7 @@ function getPageTreeRoots(pageTree) {
49
49
  const result = pageTree.children.flatMap((child) => {
50
50
  if (child.type !== "folder") return [];
51
51
  const roots = getPageTreeRoots(child);
52
- if (child.root) {
53
- roots.push(child);
54
- }
52
+ if (child.root) roots.push(child);
55
53
  return roots;
56
54
  });
57
55
  if (!("type" in pageTree)) result.push(pageTree);
@@ -87,10 +85,13 @@ function findParentFromTree(node, url) {
87
85
  return node;
88
86
  }
89
87
  }
88
+ if ("fallback" in node && node.fallback) {
89
+ return findParentFromTree(node.fallback, url);
90
+ }
90
91
  }
91
92
 
92
- // src/server/page-tree.ts
93
- var page_tree_exports = {};
93
+ // src/source/page-tree/definitions.ts
94
+ var definitions_exports = {};
94
95
 
95
96
  // src/server/git-api.ts
96
97
  async function getGithubLastEdit({
@@ -190,7 +191,7 @@ function createMetadataImage(options) {
190
191
  };
191
192
  }
192
193
  export {
193
- page_tree_exports as PageTree,
194
+ definitions_exports as PageTree,
194
195
  createMetadataImage,
195
196
  findNeighbour,
196
197
  flattenTree,
@@ -1,7 +1,6 @@
1
- import { ReactElement } from 'react';
1
+ import { ReactNode } from 'react';
2
+ import { R as Root, I as Item, F as Folder, S as Separator } from '../definitions-Q95-psoo.js';
2
3
  import { I18nConfig } from '../i18n/index.js';
3
- import { R as Root, I as Item, F as Folder, S as Separator } from '../page-tree-bSt6K__E.js';
4
- import 'next/dist/server/web/types';
5
4
 
6
5
  /**
7
6
  * In memory file system.
@@ -9,22 +8,24 @@ import 'next/dist/server/web/types';
9
8
  declare class FileSystem<File> {
10
9
  files: Map<string, File>;
11
10
  folders: Map<string, string[]>;
12
- constructor();
11
+ constructor(inherit?: FileSystem<File>);
13
12
  read(path: string): File | undefined;
14
13
  /**
15
14
  * get the direct children of folder (in virtual file path)
16
15
  */
17
16
  readDir(path: string): string[] | undefined;
18
17
  write(path: string, file: File): void;
18
+ delete(path: string): boolean;
19
+ deleteDir(path: string): boolean;
19
20
  getFiles(): string[];
20
21
  makeDir(path: string): void;
21
22
  }
22
23
 
23
24
  interface LoadOptions {
24
25
  transformers?: Transformer[];
25
- buildFiles: (files: VirtualFile[]) => (MetaFile | PageFile)[];
26
+ buildFile: (file: VirtualFile) => MetaFile | PageFile;
26
27
  }
27
- type ContentStorage = FileSystem<MetaFile | PageFile>;
28
+ type ContentStorage<Page extends PageData = PageData, Meta extends MetaData = MetaData> = FileSystem<MetaFile<Meta> | PageFile<Page>>;
28
29
  interface MetaFile<Data extends MetaData = MetaData> {
29
30
  path: string;
30
31
  absolutePath: string;
@@ -42,7 +43,12 @@ type Transformer = (context: {
42
43
  storage: ContentStorage;
43
44
  options: LoadOptions;
44
45
  }) => void;
45
- declare function loadFiles(files: VirtualFile[], options: LoadOptions): ContentStorage;
46
+ /**
47
+ * @returns a map of locale and its content storage.
48
+ *
49
+ * in the storage, locale codes are removed from file paths, hence the same file will have same file paths in every storage.
50
+ */
51
+ declare function loadFiles(files: VirtualFile[], options: LoadOptions, i18n: I18nConfig): Record<string, ContentStorage>;
46
52
 
47
53
  interface FileInfo {
48
54
  /**
@@ -86,7 +92,7 @@ declare function parseFolderPath(path: string): FolderInfo;
86
92
 
87
93
  interface LoaderConfig {
88
94
  source: SourceConfig;
89
- i18n: boolean;
95
+ i18n: I18nConfig | undefined;
90
96
  }
91
97
  interface SourceConfig {
92
98
  pageData: PageData;
@@ -94,15 +100,15 @@ interface SourceConfig {
94
100
  }
95
101
  interface LoaderOptions<T extends SourceConfig = SourceConfig, I18n extends I18nConfig | undefined = I18nConfig | undefined> {
96
102
  baseUrl: string;
97
- icon?: NonNullable<BuildPageTreeOptions['resolveIcon']>;
103
+ icon?: NonNullable<BaseOptions['resolveIcon']>;
98
104
  slugs?: (info: FileInfo) => string[];
99
105
  url?: UrlFn;
100
- source: Source<T>;
106
+ source: Source<T> | Source<T>[];
101
107
  transformers?: Transformer[];
102
108
  /**
103
109
  * Additional options for page tree builder
104
110
  */
105
- pageTree?: Partial<Omit<BuildPageTreeOptions<T['pageData'], T['metaData']>, 'storage'>>;
111
+ pageTree?: Partial<BaseOptions<T['pageData'], T['metaData']>>;
106
112
  /**
107
113
  * Configure i18n
108
114
  */
@@ -165,7 +171,7 @@ interface LanguageEntry<Data = PageData> {
165
171
  pages: Page<Data>[];
166
172
  }
167
173
  interface LoaderOutput<Config extends LoaderConfig> {
168
- pageTree: Config['i18n'] extends true ? Record<string, Root> : Root;
174
+ pageTree: Config['i18n'] extends I18nConfig ? Record<string, Root> : Root;
169
175
  getPageTree: (locale?: string) => Root;
170
176
  getPageByHref: (href: string, options?: {
171
177
  language?: string;
@@ -204,7 +210,7 @@ interface LoaderOutput<Config extends LoaderConfig> {
204
210
  declare function createGetUrl(baseUrl: string, i18n?: I18nConfig): UrlFn;
205
211
  declare function loader<Config extends SourceConfig, I18n extends I18nConfig | undefined = undefined>(options: LoaderOptions<Config, I18n>): LoaderOutput<{
206
212
  source: Config;
207
- i18n: I18n extends I18nConfig ? true : false;
213
+ i18n: I18n;
208
214
  }>;
209
215
  /**
210
216
  * Convert file path into slugs, also encode non-ASCII characters, so they can work in pathname
@@ -231,34 +237,72 @@ type InferMetaType<Utils extends LoaderOutput<any>> = Utils extends LoaderOutput
231
237
  */
232
238
  type UrlFn = (slugs: string[], locale?: string) => string;
233
239
 
234
- interface BaseOptions<Page extends PageData = PageData, Meta extends MetaData = MetaData> {
240
+ interface LegacyTransformerOptions<Page extends PageData, Meta extends MetaData> {
235
241
  /**
236
- * Remove references to the file path of original nodes (`$ref`)
237
- *
238
- * @defaultValue false
242
+ * @deprecated use `transformers` instead
239
243
  */
240
- noRef?: boolean;
241
244
  attachFile?: (node: Item, file?: PageFile<Page>) => Item;
245
+ /**
246
+ * @deprecated use `transformers` instead
247
+ */
242
248
  attachFolder?: (node: Folder, folder: {
243
249
  children: (PageFile<Page> | MetaFile<Meta>)[];
244
250
  }, meta?: MetaFile<Meta>) => Folder;
251
+ /**
252
+ * @deprecated use `transformers` instead
253
+ */
245
254
  attachSeparator?: (node: Separator) => Separator;
246
- resolveIcon?: (icon: string | undefined) => ReactElement | undefined;
247
255
  }
248
- interface BuildPageTreeOptions<Page extends PageData = PageData, Meta extends MetaData = MetaData> extends BaseOptions<Page, Meta> {
249
- storage: ContentStorage;
256
+
257
+ interface PageTreeBuilderContext<Page extends PageData = PageData, Meta extends MetaData = MetaData> {
258
+ /**
259
+ * @internal resolve paths without extensions
260
+ */
261
+ resolveName: (name: string, format: 'meta' | 'page') => string;
262
+ options: BaseOptions<Page, Meta>;
263
+ transformers: PageTreeTransformer<Page, Meta>[];
264
+ builder: PageTreeBuilder<Page, Meta>;
265
+ storage: ContentStorage<Page, Meta>;
266
+ getUrl: UrlFn;
267
+ storages?: Record<string, ContentStorage<Page, Meta>>;
268
+ locale?: string;
269
+ }
270
+ interface PageTreeTransformer<Page extends PageData = any, Meta extends MetaData = any> {
271
+ name?: string;
272
+ file?: (this: PageTreeBuilderContext<Page, Meta>, node: Item, filePath?: string) => Item;
273
+ folder?: (this: PageTreeBuilderContext<Page, Meta>, node: Folder, folderPath: string, metaPath?: string) => Folder;
274
+ separator?: (this: PageTreeBuilderContext<Page, Meta>, node: Separator) => Separator;
275
+ root?: (this: PageTreeBuilderContext<Page, Meta>, node: Root) => Root;
250
276
  }
251
- interface BuildPageTreeOptionsWithI18n<Page extends PageData = PageData, Meta extends MetaData = MetaData> extends BaseOptions<Page, Meta> {
252
- storages: Record<string, ContentStorage>;
253
- i18n: I18nConfig;
277
+ interface BaseOptions<Page extends PageData = PageData, Meta extends MetaData = MetaData> extends LegacyTransformerOptions<Page, Meta> {
278
+ /**
279
+ * Remove references to the file path of original nodes (`$ref`)
280
+ *
281
+ * @defaultValue false
282
+ */
283
+ noRef?: boolean;
284
+ transformers?: PageTreeTransformer<Page, Meta>[];
285
+ resolveIcon?: (icon: string | undefined) => ReactNode | undefined;
286
+ /**
287
+ * generate fallback page tree
288
+ *
289
+ * @defaultValue true
290
+ */
291
+ generateFallback?: boolean;
254
292
  }
255
- interface PageTreeBuilder {
256
- build: (options: BuildPageTreeOptions) => Root;
293
+ interface PageTreeBuilder<Page extends PageData = PageData, Meta extends MetaData = MetaData> {
294
+ build: (options: BaseOptions<Page, Meta> & {
295
+ id?: string;
296
+ storage: ContentStorage<Page, Meta>;
297
+ }) => Root;
257
298
  /**
258
299
  * Build page tree and fallback to the default language if the localized page doesn't exist
259
300
  */
260
- buildI18n: (options: BuildPageTreeOptionsWithI18n) => Record<string, Root>;
301
+ buildI18n: (options: BaseOptions<Page, Meta> & {
302
+ id?: string;
303
+ storages: Record<string, ContentStorage<Page, Meta>>;
304
+ }) => Record<string, Root>;
261
305
  }
262
306
  declare function createPageTreeBuilder(getUrl: UrlFn): PageTreeBuilder;
263
307
 
264
- export { type BuildPageTreeOptions, type BuildPageTreeOptionsWithI18n, type ContentStorage, type FileInfo, FileSystem, type FolderInfo, type InferMetaType, type InferPageType, type LanguageEntry, type LoadOptions, type LoaderConfig, type LoaderOptions, type LoaderOutput, type Meta, type MetaData, type MetaFile, type Page, type PageData, type PageFile, type PageTreeBuilder, type Source, type SourceConfig, type Transformer, type UrlFn, type VirtualFile, createGetUrl, createPageTreeBuilder, getSlugs, loadFiles, loader, parseFilePath, parseFolderPath };
308
+ export { type BaseOptions, type ContentStorage, type FileInfo, FileSystem, type FolderInfo, type InferMetaType, type InferPageType, type LanguageEntry, type LoadOptions, type LoaderConfig, type LoaderOptions, type LoaderOutput, type Meta, type MetaData, type MetaFile, type Page, type PageData, type PageFile, type PageTreeBuilder, type PageTreeBuilderContext, type PageTreeTransformer, type Source, type SourceConfig, type Transformer, type UrlFn, type VirtualFile, createGetUrl, createPageTreeBuilder, getSlugs, loadFiles, loader, parseFilePath, parseFolderPath };