fumadocs-core 15.6.12 → 15.7.0

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,21 @@ type Transformer = (context: {
42
43
  storage: ContentStorage;
43
44
  options: LoadOptions;
44
45
  }) => void;
45
- declare function loadFiles(files: VirtualFile[], options: LoadOptions): ContentStorage;
46
+ declare const parsers: {
47
+ dir(path: string): [string, string?];
48
+ dot(path: string): [string, string?];
49
+ none(path: string): [string, string?];
50
+ };
51
+ /**
52
+ * @returns a map of locale and its content storage.
53
+ *
54
+ * in the storage, locale codes are removed from file paths, hence the same file will have same file paths in every storage.
55
+ */
56
+ declare function loadFiles(files: VirtualFile[], options: LoadOptions, i18n: {
57
+ parser: keyof typeof parsers;
58
+ languages: string[];
59
+ defaultLanguage: string;
60
+ }): Record<string, ContentStorage>;
46
61
 
47
62
  interface FileInfo {
48
63
  /**
@@ -86,7 +101,7 @@ declare function parseFolderPath(path: string): FolderInfo;
86
101
 
87
102
  interface LoaderConfig {
88
103
  source: SourceConfig;
89
- i18n: boolean;
104
+ i18n: I18nConfig | undefined;
90
105
  }
91
106
  interface SourceConfig {
92
107
  pageData: PageData;
@@ -94,7 +109,7 @@ interface SourceConfig {
94
109
  }
95
110
  interface LoaderOptions<T extends SourceConfig = SourceConfig, I18n extends I18nConfig | undefined = I18nConfig | undefined> {
96
111
  baseUrl: string;
97
- icon?: NonNullable<BuildPageTreeOptions['resolveIcon']>;
112
+ icon?: NonNullable<BaseOptions['resolveIcon']>;
98
113
  slugs?: (info: FileInfo) => string[];
99
114
  url?: UrlFn;
100
115
  source: Source<T>;
@@ -102,7 +117,7 @@ interface LoaderOptions<T extends SourceConfig = SourceConfig, I18n extends I18n
102
117
  /**
103
118
  * Additional options for page tree builder
104
119
  */
105
- pageTree?: Partial<Omit<BuildPageTreeOptions<T['pageData'], T['metaData']>, 'storage'>>;
120
+ pageTree?: Partial<BaseOptions<T['pageData'], T['metaData']>>;
106
121
  /**
107
122
  * Configure i18n
108
123
  */
@@ -165,7 +180,7 @@ interface LanguageEntry<Data = PageData> {
165
180
  pages: Page<Data>[];
166
181
  }
167
182
  interface LoaderOutput<Config extends LoaderConfig> {
168
- pageTree: Config['i18n'] extends true ? Record<string, Root> : Root;
183
+ pageTree: Config['i18n'] extends I18nConfig ? Record<string, Root> : Root;
169
184
  getPageTree: (locale?: string) => Root;
170
185
  getPageByHref: (href: string, options?: {
171
186
  language?: string;
@@ -204,7 +219,7 @@ interface LoaderOutput<Config extends LoaderConfig> {
204
219
  declare function createGetUrl(baseUrl: string, i18n?: I18nConfig): UrlFn;
205
220
  declare function loader<Config extends SourceConfig, I18n extends I18nConfig | undefined = undefined>(options: LoaderOptions<Config, I18n>): LoaderOutput<{
206
221
  source: Config;
207
- i18n: I18n extends I18nConfig ? true : false;
222
+ i18n: I18n;
208
223
  }>;
209
224
  /**
210
225
  * Convert file path into slugs, also encode non-ASCII characters, so they can work in pathname
@@ -231,34 +246,72 @@ type InferMetaType<Utils extends LoaderOutput<any>> = Utils extends LoaderOutput
231
246
  */
232
247
  type UrlFn = (slugs: string[], locale?: string) => string;
233
248
 
234
- interface BaseOptions<Page extends PageData = PageData, Meta extends MetaData = MetaData> {
249
+ interface LegacyTransformerOptions<Page extends PageData, Meta extends MetaData> {
235
250
  /**
236
- * Remove references to the file path of original nodes (`$ref`)
237
- *
238
- * @defaultValue false
251
+ * @deprecated use `transformers` instead
239
252
  */
240
- noRef?: boolean;
241
253
  attachFile?: (node: Item, file?: PageFile<Page>) => Item;
254
+ /**
255
+ * @deprecated use `transformers` instead
256
+ */
242
257
  attachFolder?: (node: Folder, folder: {
243
258
  children: (PageFile<Page> | MetaFile<Meta>)[];
244
259
  }, meta?: MetaFile<Meta>) => Folder;
260
+ /**
261
+ * @deprecated use `transformers` instead
262
+ */
245
263
  attachSeparator?: (node: Separator) => Separator;
246
- resolveIcon?: (icon: string | undefined) => ReactElement | undefined;
247
264
  }
248
- interface BuildPageTreeOptions<Page extends PageData = PageData, Meta extends MetaData = MetaData> extends BaseOptions<Page, Meta> {
249
- storage: ContentStorage;
265
+
266
+ interface PageTreeBuilderContext<Page extends PageData = PageData, Meta extends MetaData = MetaData> {
267
+ /**
268
+ * @internal
269
+ */
270
+ resolveName: (name: string, format: 'meta' | 'page') => string;
271
+ options: BaseOptions<Page, Meta>;
272
+ transformers: PageTreeTransformer<Page, Meta>[];
273
+ builder: PageTreeBuilder<Page, Meta>;
274
+ storage: ContentStorage<Page, Meta>;
275
+ getUrl: UrlFn;
276
+ storages?: Record<string, ContentStorage<Page, Meta>>;
277
+ locale?: string;
250
278
  }
251
- interface BuildPageTreeOptionsWithI18n<Page extends PageData = PageData, Meta extends MetaData = MetaData> extends BaseOptions<Page, Meta> {
252
- storages: Record<string, ContentStorage>;
253
- i18n: I18nConfig;
279
+ interface PageTreeTransformer<Page extends PageData = any, Meta extends MetaData = any> {
280
+ name?: string;
281
+ file?: (this: PageTreeBuilderContext<Page, Meta>, node: Item, filePath?: string) => Item;
282
+ folder?: (this: PageTreeBuilderContext<Page, Meta>, node: Folder, folderPath: string, metaPath?: string) => Folder;
283
+ separator?: (this: PageTreeBuilderContext<Page, Meta>, node: Separator) => Separator;
284
+ root?: (this: PageTreeBuilderContext<Page, Meta>, node: Root) => Root;
285
+ }
286
+ interface BaseOptions<Page extends PageData = PageData, Meta extends MetaData = MetaData> extends LegacyTransformerOptions<Page, Meta> {
287
+ /**
288
+ * Remove references to the file path of original nodes (`$ref`)
289
+ *
290
+ * @defaultValue false
291
+ */
292
+ noRef?: boolean;
293
+ transformers?: PageTreeTransformer<Page, Meta>[];
294
+ resolveIcon?: (icon: string | undefined) => ReactNode | undefined;
254
295
  }
255
- interface PageTreeBuilder {
256
- build: (options: BuildPageTreeOptions) => Root;
296
+ interface PageTreeBuilder<Page extends PageData = PageData, Meta extends MetaData = MetaData> {
297
+ build: (options: BaseOptions<Page, Meta> & {
298
+ id?: string;
299
+ storage: ContentStorage<Page, Meta>;
300
+ /**
301
+ * generate fallback page tree
302
+ *
303
+ * @defaultValue true
304
+ */
305
+ generateFallback?: boolean;
306
+ }) => Root;
257
307
  /**
258
308
  * Build page tree and fallback to the default language if the localized page doesn't exist
259
309
  */
260
- buildI18n: (options: BuildPageTreeOptionsWithI18n) => Record<string, Root>;
310
+ buildI18n: (options: BaseOptions<Page, Meta> & {
311
+ id?: string;
312
+ storages: Record<string, ContentStorage<Page, Meta>>;
313
+ }) => Record<string, Root>;
261
314
  }
262
315
  declare function createPageTreeBuilder(getUrl: UrlFn): PageTreeBuilder;
263
316
 
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 };
317
+ 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 };