fumadocs-core 16.4.1 → 16.4.3

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 (284) hide show
  1. package/dist/advanced-DSlc7qa9.js +80 -0
  2. package/dist/advanced-DSlc7qa9.js.map +1 -0
  3. package/dist/algolia-BGWM-DkQ.js +49 -0
  4. package/dist/algolia-BGWM-DkQ.js.map +1 -0
  5. package/dist/algolia-FqjcaTcD.d.ts +68 -0
  6. package/dist/algolia-FqjcaTcD.d.ts.map +1 -0
  7. package/dist/breadcrumb.d.ts +29 -27
  8. package/dist/breadcrumb.d.ts.map +1 -0
  9. package/dist/breadcrumb.js +55 -72
  10. package/dist/breadcrumb.js.map +1 -0
  11. package/dist/chunk-C1JLJEPO.js +42 -0
  12. package/dist/codeblock-utils-Dh1w8ICD.d.ts +37 -0
  13. package/dist/codeblock-utils-Dh1w8ICD.d.ts.map +1 -0
  14. package/dist/content/github.d.ts +43 -32
  15. package/dist/content/github.d.ts.map +1 -0
  16. package/dist/content/github.js +29 -43
  17. package/dist/content/github.js.map +1 -0
  18. package/dist/content/index.d.ts +20 -13
  19. package/dist/content/index.d.ts.map +1 -0
  20. package/dist/content/index.js +17 -23
  21. package/dist/content/index.js.map +1 -0
  22. package/dist/content/mdx/preset-bundler.d.ts +22 -24
  23. package/dist/content/mdx/preset-bundler.d.ts.map +1 -0
  24. package/dist/content/mdx/preset-bundler.js +38 -69
  25. package/dist/content/mdx/preset-bundler.js.map +1 -0
  26. package/dist/content/mdx/preset-runtime.d.ts +22 -24
  27. package/dist/content/mdx/preset-runtime.d.ts.map +1 -0
  28. package/dist/content/mdx/preset-runtime.js +36 -68
  29. package/dist/content/mdx/preset-runtime.js.map +1 -0
  30. package/dist/content/toc.d.ts +7 -6
  31. package/dist/content/toc.d.ts.map +1 -0
  32. package/dist/content/toc.js +15 -19
  33. package/dist/content/toc.js.map +1 -0
  34. package/dist/definitions-DJAPG-2U.d.ts +62 -0
  35. package/dist/definitions-DJAPG-2U.d.ts.map +1 -0
  36. package/dist/dynamic-link.d.ts +7 -5
  37. package/dist/dynamic-link.d.ts.map +1 -0
  38. package/dist/dynamic-link.js +29 -27
  39. package/dist/dynamic-link.js.map +1 -0
  40. package/dist/fetch-B1nmMSyw.js +20 -0
  41. package/dist/fetch-B1nmMSyw.js.map +1 -0
  42. package/dist/framework/index.d.ts +38 -29
  43. package/dist/framework/index.d.ts.map +1 -0
  44. package/dist/framework/index.js +68 -17
  45. package/dist/framework/index.js.map +1 -0
  46. package/dist/framework/next.d.ts +15 -10
  47. package/dist/framework/next.d.ts.map +1 -0
  48. package/dist/framework/next.js +18 -26
  49. package/dist/framework/next.js.map +1 -0
  50. package/dist/framework/react-router.d.ts +15 -10
  51. package/dist/framework/react-router.d.ts.map +1 -0
  52. package/dist/framework/react-router.js +42 -55
  53. package/dist/framework/react-router.js.map +1 -0
  54. package/dist/framework/tanstack.d.ts +15 -10
  55. package/dist/framework/tanstack.d.ts.map +1 -0
  56. package/dist/framework/tanstack.js +54 -69
  57. package/dist/framework/tanstack.js.map +1 -0
  58. package/dist/framework/waku.d.ts +15 -10
  59. package/dist/framework/waku.d.ts.map +1 -0
  60. package/dist/framework/waku.js +47 -58
  61. package/dist/framework/waku.js.map +1 -0
  62. package/dist/highlight/client.d.ts +6 -7
  63. package/dist/highlight/client.d.ts.map +1 -0
  64. package/dist/highlight/client.js +22 -14
  65. package/dist/highlight/client.js.map +1 -0
  66. package/dist/highlight/index.d.ts +2 -30
  67. package/dist/highlight/index.js +3 -13
  68. package/dist/i18n/index.d.ts +2 -39
  69. package/dist/i18n/index.js +6 -7
  70. package/dist/i18n/index.js.map +1 -0
  71. package/dist/i18n/middleware.d.ts +36 -28
  72. package/dist/i18n/middleware.d.ts.map +1 -0
  73. package/dist/i18n/middleware.js +55 -73
  74. package/dist/i18n/middleware.js.map +1 -0
  75. package/dist/icon-5lVe3l-0.js +19 -0
  76. package/dist/icon-5lVe3l-0.js.map +1 -0
  77. package/dist/index-BhVrX5J1.d.ts +41 -0
  78. package/dist/index-BhVrX5J1.d.ts.map +1 -0
  79. package/dist/index-Co_C8NEi.d.ts +380 -0
  80. package/dist/index-Co_C8NEi.d.ts.map +1 -0
  81. package/dist/link.d.ts +17 -15
  82. package/dist/link.d.ts.map +1 -0
  83. package/dist/link.js +29 -9
  84. package/dist/link.js.map +1 -0
  85. package/dist/mdast-utils-ix4DsXJP.js +40 -0
  86. package/dist/mdast-utils-ix4DsXJP.js.map +1 -0
  87. package/dist/mdx-plugins/codeblock-utils.d.ts +2 -29
  88. package/dist/mdx-plugins/codeblock-utils.js +71 -9
  89. package/dist/mdx-plugins/codeblock-utils.js.map +1 -0
  90. package/dist/mdx-plugins/index.d.ts +15 -20
  91. package/dist/mdx-plugins/index.js +18 -73
  92. package/dist/mdx-plugins/rehype-code.d.ts +2 -55
  93. package/dist/mdx-plugins/rehype-code.js +5 -15
  94. package/dist/mdx-plugins/rehype-toc.d.ts +2 -14
  95. package/dist/mdx-plugins/rehype-toc.js +3 -7
  96. package/dist/mdx-plugins/remark-admonition.d.ts +2 -20
  97. package/dist/mdx-plugins/remark-admonition.js +74 -8
  98. package/dist/mdx-plugins/remark-admonition.js.map +1 -0
  99. package/dist/mdx-plugins/remark-code-tab.d.ts +2 -30
  100. package/dist/mdx-plugins/remark-code-tab.js +183 -7
  101. package/dist/mdx-plugins/remark-code-tab.js.map +1 -0
  102. package/dist/mdx-plugins/remark-directive-admonition.d.ts +2 -27
  103. package/dist/mdx-plugins/remark-directive-admonition.js +60 -7
  104. package/dist/mdx-plugins/remark-directive-admonition.js.map +1 -0
  105. package/dist/mdx-plugins/remark-gfm.d.ts +2 -1
  106. package/dist/mdx-plugins/remark-gfm.js +3 -7
  107. package/dist/mdx-plugins/remark-heading.d.ts +2 -31
  108. package/dist/mdx-plugins/remark-heading.js +45 -8
  109. package/dist/mdx-plugins/remark-heading.js.map +1 -0
  110. package/dist/mdx-plugins/remark-image.d.ts +2 -57
  111. package/dist/mdx-plugins/remark-image.js +192 -7
  112. package/dist/mdx-plugins/remark-image.js.map +1 -0
  113. package/dist/mdx-plugins/remark-mdx-files.d.ts +2 -40
  114. package/dist/mdx-plugins/remark-mdx-files.js +187 -7
  115. package/dist/mdx-plugins/remark-mdx-files.js.map +1 -0
  116. package/dist/mdx-plugins/remark-mdx-mermaid.d.ts +2 -15
  117. package/dist/mdx-plugins/remark-mdx-mermaid.js +31 -7
  118. package/dist/mdx-plugins/remark-mdx-mermaid.js.map +1 -0
  119. package/dist/mdx-plugins/remark-npm.d.ts +2 -31
  120. package/dist/mdx-plugins/remark-npm.js +68 -8
  121. package/dist/mdx-plugins/remark-npm.js.map +1 -0
  122. package/dist/mdx-plugins/remark-steps.d.ts +2 -23
  123. package/dist/mdx-plugins/remark-steps.js +77 -7
  124. package/dist/mdx-plugins/remark-steps.js.map +1 -0
  125. package/dist/mdx-plugins/remark-structure.d.ts +2 -71
  126. package/dist/mdx-plugins/remark-structure.js +105 -11
  127. package/dist/mdx-plugins/remark-structure.js.map +1 -0
  128. package/dist/mixedbread-DSiQfUnN.js +88 -0
  129. package/dist/mixedbread-DSiQfUnN.js.map +1 -0
  130. package/dist/negotiation/index.d.ts +6 -4
  131. package/dist/negotiation/index.d.ts.map +1 -0
  132. package/dist/negotiation/index.js +41 -11
  133. package/dist/negotiation/index.js.map +1 -0
  134. package/dist/normalize-url-3WQZ_H_j.js +16 -0
  135. package/dist/normalize-url-3WQZ_H_j.js.map +1 -0
  136. package/dist/orama-cloud-BMDBfk05.js +84 -0
  137. package/dist/orama-cloud-BMDBfk05.js.map +1 -0
  138. package/dist/orama-cloud-legacy-CRZzZXWn.js +82 -0
  139. package/dist/orama-cloud-legacy-CRZzZXWn.js.map +1 -0
  140. package/dist/page-tree/index.d.ts +23 -11
  141. package/dist/page-tree/index.d.ts.map +1 -0
  142. package/dist/page-tree/index.js +3 -17
  143. package/dist/path-D6M0ZQvO.js +60 -0
  144. package/dist/path-D6M0ZQvO.js.map +1 -0
  145. package/dist/rehype-code-Bd52chOe.d.ts +58 -0
  146. package/dist/rehype-code-Bd52chOe.d.ts.map +1 -0
  147. package/dist/rehype-code-Dr35mETC.js +241 -0
  148. package/dist/rehype-code-Dr35mETC.js.map +1 -0
  149. package/dist/rehype-toc-BJVsblvp.d.ts +18 -0
  150. package/dist/rehype-toc-BJVsblvp.d.ts.map +1 -0
  151. package/dist/rehype-toc-Dqgey2tW.js +143 -0
  152. package/dist/rehype-toc-Dqgey2tW.js.map +1 -0
  153. package/dist/remark-admonition-Chku_iWO.d.ts +22 -0
  154. package/dist/remark-admonition-Chku_iWO.d.ts.map +1 -0
  155. package/dist/remark-code-tab-C0f6BPcw.d.ts +32 -0
  156. package/dist/remark-code-tab-C0f6BPcw.d.ts.map +1 -0
  157. package/dist/remark-directive-admonition-CBwJdh9z.d.ts +36 -0
  158. package/dist/remark-directive-admonition-CBwJdh9z.d.ts.map +1 -0
  159. package/dist/remark-gfm-B2aZXutO.d.ts +2 -0
  160. package/dist/remark-heading-CUAe4zIu.d.ts +37 -0
  161. package/dist/remark-heading-CUAe4zIu.d.ts.map +1 -0
  162. package/dist/remark-image-DMRnxsRO.d.ts +65 -0
  163. package/dist/remark-image-DMRnxsRO.d.ts.map +1 -0
  164. package/dist/remark-mdx-files-B5KMXnfh.d.ts +56 -0
  165. package/dist/remark-mdx-files-B5KMXnfh.d.ts.map +1 -0
  166. package/dist/remark-mdx-mermaid-C_4W5gfj.d.ts +17 -0
  167. package/dist/remark-mdx-mermaid-C_4W5gfj.d.ts.map +1 -0
  168. package/dist/remark-npm-CykFgJn2.d.ts +36 -0
  169. package/dist/remark-npm-CykFgJn2.d.ts.map +1 -0
  170. package/dist/remark-steps-5-DmLVv3.d.ts +28 -0
  171. package/dist/remark-steps-5-DmLVv3.d.ts.map +1 -0
  172. package/dist/remark-structure-CszwnaMR.d.ts +77 -0
  173. package/dist/remark-structure-CszwnaMR.d.ts.map +1 -0
  174. package/dist/remove-undefined-B7zJF-YS.js +19 -0
  175. package/dist/remove-undefined-B7zJF-YS.js.map +1 -0
  176. package/dist/search/algolia.d.ts +3 -69
  177. package/dist/search/algolia.js +69 -63
  178. package/dist/search/algolia.js.map +1 -0
  179. package/dist/search/client.d.ts +143 -114
  180. package/dist/search/client.d.ts.map +1 -0
  181. package/dist/search/client.js +98 -91
  182. package/dist/search/client.js.map +1 -0
  183. package/dist/search/index.d.ts +20 -18
  184. package/dist/search/index.d.ts.map +1 -0
  185. package/dist/search/index.js +3 -7
  186. package/dist/search/orama-cloud-legacy.d.ts +81 -0
  187. package/dist/search/orama-cloud-legacy.d.ts.map +1 -0
  188. package/dist/search/orama-cloud-legacy.js +50 -0
  189. package/dist/search/orama-cloud-legacy.js.map +1 -0
  190. package/dist/search/orama-cloud.d.ts +72 -70
  191. package/dist/search/orama-cloud.d.ts.map +1 -0
  192. package/dist/search/orama-cloud.js +46 -54
  193. package/dist/search/orama-cloud.js.map +1 -0
  194. package/dist/search/server.d.ts +6 -136
  195. package/dist/search/server.js +292 -369
  196. package/dist/search/server.js.map +1 -0
  197. package/dist/search-DcH54N2x.js +44 -0
  198. package/dist/search-DcH54N2x.js.map +1 -0
  199. package/dist/server-BzFuYBxW.d.ts +133 -0
  200. package/dist/server-BzFuYBxW.d.ts.map +1 -0
  201. package/dist/shiki-Bdk0JGsB.d.ts +33 -0
  202. package/dist/shiki-Bdk0JGsB.d.ts.map +1 -0
  203. package/dist/shiki-DoHr6fEj.js +80 -0
  204. package/dist/shiki-DoHr6fEj.js.map +1 -0
  205. package/dist/source/client/index.d.ts +7 -5
  206. package/dist/source/client/index.d.ts.map +1 -0
  207. package/dist/source/client/index.js +24 -35
  208. package/dist/source/client/index.js.map +1 -0
  209. package/dist/source/index.d.ts +3 -42
  210. package/dist/source/index.js +599 -752
  211. package/dist/source/index.js.map +1 -0
  212. package/dist/source/plugins/lucide-icons.d.ts +7 -7
  213. package/dist/source/plugins/lucide-icons.d.ts.map +1 -0
  214. package/dist/source/plugins/lucide-icons.js +21 -20
  215. package/dist/source/plugins/lucide-icons.js.map +1 -0
  216. package/dist/source/plugins/slugs.d.ts +3 -0
  217. package/dist/source/plugins/slugs.js +65 -0
  218. package/dist/source/plugins/slugs.js.map +1 -0
  219. package/dist/source/schema.d.ts +17 -14
  220. package/dist/source/schema.d.ts.map +1 -0
  221. package/dist/source/schema.js +26 -22
  222. package/dist/source/schema.js.map +1 -0
  223. package/dist/static-DAjBQpus.js +51 -0
  224. package/dist/static-DAjBQpus.js.map +1 -0
  225. package/dist/toc.d.ts +38 -25
  226. package/dist/toc.d.ts.map +1 -0
  227. package/dist/toc.js +123 -136
  228. package/dist/toc.js.map +1 -0
  229. package/dist/util-92szu3Vf.js +10 -0
  230. package/dist/util-92szu3Vf.js.map +1 -0
  231. package/dist/util-ofJFdM-e.d.ts +8 -0
  232. package/dist/util-ofJFdM-e.d.ts.map +1 -0
  233. package/dist/utils/use-effect-event.d.ts +3 -1
  234. package/dist/utils/use-effect-event.d.ts.map +1 -0
  235. package/dist/utils/use-effect-event.js +16 -13
  236. package/dist/utils/use-effect-event.js.map +1 -0
  237. package/dist/utils/use-media-query.d.ts +3 -1
  238. package/dist/utils/use-media-query.d.ts.map +1 -0
  239. package/dist/utils/use-media-query.js +20 -20
  240. package/dist/utils/use-media-query.js.map +1 -0
  241. package/dist/utils/use-on-change.d.ts +3 -1
  242. package/dist/utils/use-on-change.d.ts.map +1 -0
  243. package/dist/utils/use-on-change.js +23 -7
  244. package/dist/utils/use-on-change.js.map +1 -0
  245. package/dist/utils-bAoAH1Rh.js +134 -0
  246. package/dist/utils-bAoAH1Rh.js.map +1 -0
  247. package/package.json +72 -65
  248. package/dist/algolia-IZEDLPHE.js +0 -58
  249. package/dist/chunk-5PMI7QDD.js +0 -220
  250. package/dist/chunk-ADBHPKXG.js +0 -78
  251. package/dist/chunk-APKPSBSB.js +0 -74
  252. package/dist/chunk-CH7YHH7V.js +0 -222
  253. package/dist/chunk-EFVXL2PP.js +0 -144
  254. package/dist/chunk-EMWGTXSW.js +0 -19
  255. package/dist/chunk-FAEPKD7U.js +0 -20
  256. package/dist/chunk-FUUVPEA5.js +0 -29
  257. package/dist/chunk-GINBKBVQ.js +0 -12
  258. package/dist/chunk-GLRQBLGN.js +0 -59
  259. package/dist/chunk-JUF4WZ6G.js +0 -117
  260. package/dist/chunk-K4WNLOVQ.js +0 -75
  261. package/dist/chunk-L4JKQWCM.js +0 -131
  262. package/dist/chunk-MA6O2UUE.js +0 -50
  263. package/dist/chunk-ONG4RVCR.js +0 -8
  264. package/dist/chunk-OTD7MV33.js +0 -53
  265. package/dist/chunk-PFNP6PEB.js +0 -11
  266. package/dist/chunk-SH7BNTG7.js +0 -38
  267. package/dist/chunk-TWIDBWFG.js +0 -84
  268. package/dist/chunk-U67V476Y.js +0 -35
  269. package/dist/chunk-VLSDGCJE.js +0 -47
  270. package/dist/chunk-W6WTLKRA.js +0 -73
  271. package/dist/chunk-X2HFD5QJ.js +0 -275
  272. package/dist/chunk-XJ6ZQNEX.js +0 -91
  273. package/dist/chunk-XN2LKXFZ.js +0 -101
  274. package/dist/chunk-XOFXGHS4.js +0 -93
  275. package/dist/chunk-XZSI7AHE.js +0 -67
  276. package/dist/chunk-YVVDKJ2H.js +0 -34
  277. package/dist/chunk-ZMWYLUDP.js +0 -21
  278. package/dist/definitions-pJ7PybYY.d.ts +0 -60
  279. package/dist/fetch-IBTWQCJR.js +0 -22
  280. package/dist/loader-_E2HOdV0.d.ts +0 -333
  281. package/dist/mixedbread-A3WLENES.js +0 -117
  282. package/dist/orama-cloud-UZAPMPFV.js +0 -93
  283. package/dist/static-A2YJ5TXV.js +0 -62
  284. package/dist/util-bZU2QeJ2.d.ts +0 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["out: Source<_ConfigUnion_<T>>","source","path","path","storages: Record<string, ContentStorage>","source","file: ContentStorageFile","storage: ContentStorage","isolatedStorage: ContentStorage","out: Record<string, PageTree.Root>","transformers: PageTreeTransformer[]","items: PageTree.Node[]","folders: PageTree.Folder[]","path","node: PageTree.Separator","node: PageTree.Item","index: PageTree.Item | undefined","children: PageTree.Node[]","node: PageTree.Folder","item: PageTree.Item","root: PageTree.Root","path","page: Page","urlLocale: string | undefined","pageTrees: Record<string, PageTree.Root> | undefined","pages: Page[]","list: {\n language: string;\n pages: Page[];\n }[]","config: ResolvedLoaderConfig","flatten: LoaderPlugin[]"],"sources":["../../src/source/source.ts","../../src/source/storage/file-system.ts","../../src/source/storage/content.ts","../../src/source/page-tree/transformer-fallback.ts","../../src/source/page-tree/builder.ts","../../src/source/loader.ts"],"sourcesContent":["export interface Source<Config extends SourceConfig = SourceConfig> {\n files: VirtualFile<Config>[];\n}\n\nexport interface SourceConfig {\n pageData: PageData;\n metaData: MetaData;\n}\n\nexport interface MetaData {\n icon?: string | undefined;\n title?: string | undefined;\n root?: boolean | undefined;\n pages?: string[] | undefined;\n defaultOpen?: boolean | undefined;\n collapsible?: boolean | undefined;\n\n description?: string | undefined;\n}\n\nexport interface PageData {\n icon?: string | undefined;\n title?: string;\n description?: string | undefined;\n}\n\nexport type VirtualFile<Config extends SourceConfig = SourceConfig> =\n | VirtualPage<Config['pageData']>\n | VirtualMeta<Config['metaData']>;\n\ninterface BaseVirtualFile {\n /**\n * Virtualized path (relative to content directory)\n *\n * @example `docs/page.mdx`\n */\n path: string;\n\n /**\n * Absolute path of the file\n */\n absolutePath?: string;\n}\n\ninterface VirtualPage<Data extends PageData> extends BaseVirtualFile {\n type: 'page';\n /**\n * Specified Slugs for page\n */\n slugs?: string[];\n data: Data;\n}\n\ninterface VirtualMeta<Data extends MetaData> extends BaseVirtualFile {\n type: 'meta';\n data: Data;\n}\n\nexport type _ConfigUnion_<T extends Record<string, Source>> = {\n [K in keyof T]: T[K] extends Source<infer Config>\n ? {\n pageData: Config['pageData'] & { type: K };\n metaData: Config['metaData'] & { type: K };\n }\n : never;\n}[keyof T];\n\nexport function multiple<T extends Record<string, Source>>(sources: T) {\n const out: Source<_ConfigUnion_<T>> = { files: [] };\n\n for (const [type, source] of Object.entries(sources)) {\n for (const file of source.files) {\n out.files.push({\n ...file,\n data: {\n ...file.data,\n type,\n },\n });\n }\n }\n\n return out;\n}\n\nexport function source<Page extends PageData, Meta extends MetaData>(config: {\n pages: VirtualPage<Page>[];\n metas: VirtualMeta<Meta>[];\n}): Source<{\n pageData: Page;\n metaData: Meta;\n}> {\n return {\n files: [...config.pages, ...config.metas],\n };\n}\n\nexport interface _SourceUpdate_<Config extends SourceConfig> {\n files: <Page extends PageData, Meta extends MetaData>(\n fn: (files: VirtualFile<Config>[]) => (VirtualPage<Page> | VirtualMeta<Meta>)[],\n ) => _SourceUpdate_<{\n pageData: Page;\n metaData: Meta;\n }>;\n page: <V extends PageData>(\n fn: (page: VirtualPage<Config['pageData']>) => VirtualPage<V>,\n ) => _SourceUpdate_<{\n pageData: V;\n metaData: Config['metaData'];\n }>;\n\n meta: <V extends MetaData>(\n fn: (meta: VirtualMeta<Config['metaData']>) => VirtualMeta<V>,\n ) => _SourceUpdate_<{\n pageData: Config['pageData'];\n metaData: V;\n }>;\n build: () => Source<Config>;\n}\n\n/**\n * update a source object in-place.\n */\nexport function update<Config extends SourceConfig>(\n source: Source<Config>,\n): _SourceUpdate_<Config> {\n return {\n files(fn) {\n source.files = fn(source.files);\n return this as _SourceUpdate_<never>;\n },\n page(fn) {\n for (let i = 0; i < source.files.length; i++) {\n const file = source.files[i];\n if (file.type === 'page') source.files[i] = fn(file);\n }\n\n return this as _SourceUpdate_<never>;\n },\n meta(fn) {\n for (let i = 0; i < source.files.length; i++) {\n const file = source.files[i];\n if (file.type === 'meta') source.files[i] = fn(file);\n }\n\n return this as _SourceUpdate_<never>;\n },\n build() {\n return source;\n },\n };\n}\n","import { dirname, splitPath } from '../path';\n\n/**\n * In memory file system.\n */\nexport class FileSystem<File> {\n files = new Map<string, File>();\n folders = new Map<string, string[]>();\n\n constructor(inherit?: FileSystem<File>) {\n if (inherit) {\n for (const [k, v] of inherit.folders) {\n this.folders.set(k, v);\n }\n\n for (const [k, v] of inherit.files) {\n this.files.set(k, v);\n }\n } else {\n this.folders.set('', []);\n }\n }\n\n read(path: string): File | undefined {\n return this.files.get(path);\n }\n\n /**\n * get the direct children of folder (in virtual file path)\n */\n readDir(path: string): string[] | undefined {\n return this.folders.get(path);\n }\n\n write(path: string, file: File): void {\n if (!this.files.has(path)) {\n const dir = dirname(path);\n this.makeDir(dir);\n this.readDir(dir)?.push(path);\n }\n\n this.files.set(path, file);\n }\n\n /**\n * Delete files at specified path.\n *\n * @param path - the target path.\n * @param [recursive=false] - if set to `true`, it will also delete directories.\n */\n delete(path: string, recursive = false): boolean {\n if (this.files.delete(path)) return true;\n\n if (recursive) {\n const folder = this.folders.get(path);\n if (!folder) return false;\n\n this.folders.delete(path);\n for (const child of folder) {\n this.delete(child);\n }\n return true;\n }\n\n return false;\n }\n\n getFiles(): string[] {\n return Array.from(this.files.keys());\n }\n\n makeDir(path: string): void {\n const segments = splitPath(path);\n\n for (let i = 0; i < segments.length; i++) {\n const segment = segments.slice(0, i + 1).join('/');\n if (this.folders.has(segment)) continue;\n\n this.folders.set(segment, []);\n this.folders.get(dirname(segment))!.push(segment);\n }\n }\n}\n","import { FileSystem } from '@/source/storage/file-system';\nimport { basename, dirname, joinPath, slash, splitPath } from '@/source/path';\nimport type { ResolvedLoaderConfig } from '../loader';\nimport type { SourceConfig } from '../source';\n\nexport type ContentStorage<Config extends SourceConfig = SourceConfig> = FileSystem<\n ContentStorageFile<Config>\n>;\n\nexport type ContentStorageFile<Config extends SourceConfig = SourceConfig> =\n | ContentStorageMetaFile<Config>\n | ContentStoragePageFile<Config>;\n\nexport interface ContentStorageMetaFile<Config extends SourceConfig = SourceConfig> {\n path: string;\n absolutePath?: string;\n\n format: 'meta';\n data: Config['metaData'];\n}\n\nexport interface ContentStoragePageFile<Config extends SourceConfig = SourceConfig> {\n path: string;\n absolutePath?: string;\n\n format: 'page';\n slugs: string[];\n data: Config['pageData'];\n}\n\nfunction isLocaleValid(locale: string) {\n return locale.length > 0 && !/\\d+/.test(locale);\n}\n\nconst parsers = {\n dir(path: string): [string, string?] {\n const [locale, ...segs] = path.split('/');\n\n if (locale && segs.length > 0 && isLocaleValid(locale)) return [segs.join('/'), locale];\n\n return [path];\n },\n dot(path: string): [string, string?] {\n const dir = dirname(path);\n const base = basename(path);\n const parts = base.split('.');\n if (parts.length < 3) return [path];\n\n const [locale] = parts.splice(parts.length - 2, 1);\n if (!isLocaleValid(locale)) return [path];\n\n return [joinPath(dir, parts.join('.')), locale];\n },\n none(path: string): [string, string?] {\n return [path];\n },\n};\n\n/**\n * @param defaultLanguage - language to use when i18n is not configured.\n * @returns a map of locale and its content storage.\n *\n * in the storage, locale codes are removed from file paths, hence the same file will have same file paths in every storage.\n */\nexport function buildContentStorage(\n loaderConfig: ResolvedLoaderConfig,\n defaultLanguage: string,\n): Record<string, ContentStorage> {\n const {\n source,\n plugins = [],\n i18n = {\n defaultLanguage,\n parser: 'none',\n languages: [defaultLanguage],\n },\n } = loaderConfig;\n\n const parser = parsers[i18n.parser ?? 'dot'];\n const storages: Record<string, ContentStorage> = {};\n const normalized = new Map<\n string,\n {\n pathWithoutLocale: string;\n file: ContentStorageFile;\n }[]\n >();\n\n for (const inputFile of source.files) {\n let file: ContentStorageFile;\n if (inputFile.type === 'page') {\n file = {\n format: 'page',\n path: normalizePath(inputFile.path),\n // will be generated by the slugs plugin if unspecified\n slugs: inputFile.slugs as string[],\n data: inputFile.data,\n absolutePath: inputFile.absolutePath,\n };\n } else {\n file = {\n format: 'meta',\n path: normalizePath(inputFile.path),\n absolutePath: inputFile.absolutePath,\n data: inputFile.data,\n };\n }\n\n const [pathWithoutLocale, locale = i18n.defaultLanguage] = parser(file.path);\n const list = normalized.get(locale) ?? [];\n list.push({\n pathWithoutLocale,\n file,\n });\n normalized.set(locale, list);\n }\n\n const fallbackLang =\n i18n.fallbackLanguage !== null ? (i18n.fallbackLanguage ?? i18n.defaultLanguage) : null;\n\n function scan(lang: string) {\n if (storages[lang]) return;\n\n let storage: ContentStorage;\n if (fallbackLang && fallbackLang !== lang) {\n scan(fallbackLang);\n storage = new FileSystem(storages[fallbackLang]);\n } else {\n storage = new FileSystem();\n }\n\n for (const { pathWithoutLocale, file } of normalized.get(lang) ?? []) {\n storage.write(pathWithoutLocale, file);\n }\n\n const context = {\n storage,\n };\n for (const plugin of plugins) {\n plugin.transformStorage?.(context);\n }\n\n storages[lang] = storage;\n }\n\n for (const lang of i18n.languages) scan(lang);\n return storages;\n}\n\n/**\n * @param path - Relative path\n * @returns Normalized path, with no trailing/leading slashes\n * @throws Throws error if path starts with `./` or `../`\n */\nfunction normalizePath(path: string): string {\n const segments = splitPath(slash(path));\n if (segments[0] === '.' || segments[0] === '..')\n throw new Error(\"It must not start with './' or '../'\");\n return segments.join('/');\n}\n","import type { ContentStorage, PageTreeTransformer } from '@/source';\nimport { FileSystem } from '@/source';\n\nexport function transformerFallback(): PageTreeTransformer {\n const addedFiles = new Set<string>();\n\n return {\n root(root) {\n const isolatedStorage: ContentStorage = new FileSystem();\n\n for (const file of this.storage.getFiles()) {\n if (addedFiles.has(file)) continue;\n\n const content = this.storage.read(file);\n if (content) isolatedStorage.write(file, content);\n }\n\n if (isolatedStorage.getFiles().length === 0) return root;\n\n root.fallback = this.builder.build(isolatedStorage, {\n ...this.options,\n id: `fallback-${root.$id ?? ''}`,\n generateFallback: false,\n });\n\n addedFiles.clear();\n return root;\n },\n file(node, file) {\n if (file) addedFiles.add(file);\n\n return node;\n },\n folder(node, _dir, metaPath) {\n if (metaPath) addedFiles.add(metaPath);\n\n return node;\n },\n };\n}\n","import type * as PageTree from '@/page-tree/definitions';\nimport type { LoaderConfig, ResolvedLoaderConfig } from '@/source/loader';\nimport type { ContentStorage } from '@/source/storage/content';\nimport { basename, extname, joinPath } from '@/source/path';\nimport { transformerFallback } from '@/source/page-tree/transformer-fallback';\nimport type { SourceConfig } from '../source';\n\nexport interface PageTreeBuilderContext<Config extends SourceConfig = SourceConfig> {\n rootId: string;\n generateNodeId: () => string;\n options: PageTreeOptions;\n transformers: PageTreeTransformer<Config>[];\n\n builder: PageTreeBuilder;\n storage: ContentStorage<Config>;\n getUrl: ResolvedLoaderConfig['url'];\n\n storages?: Record<string, ContentStorage<Config>>;\n locale?: string;\n}\n\nexport interface PageTreeTransformer<Config extends SourceConfig = SourceConfig> {\n file?: (\n this: PageTreeBuilderContext<Config>,\n node: PageTree.Item,\n filePath?: string,\n ) => PageTree.Item;\n folder?: (\n this: PageTreeBuilderContext<Config>,\n node: PageTree.Folder,\n folderPath: string,\n metaPath?: string,\n ) => PageTree.Folder;\n separator?: (\n this: PageTreeBuilderContext<Config>,\n node: PageTree.Separator,\n ) => PageTree.Separator;\n root?: (this: PageTreeBuilderContext<Config>, node: PageTree.Root) => PageTree.Root;\n}\n\nexport interface PageTreeOptions<Config extends LoaderConfig = LoaderConfig> {\n id?: string;\n /**\n * Remove references to the file path of original nodes (`$ref`)\n *\n * @defaultValue false\n */\n noRef?: boolean;\n /**\n * generate fallback page tree\n *\n * @defaultValue true\n */\n generateFallback?: boolean;\n\n /**\n * Additional page tree transformers to apply\n */\n transformers?: PageTreeTransformer<Config['source']>[];\n}\n\nexport interface PageTreeBuilder {\n build: (storage: ContentStorage, options?: PageTreeOptions) => PageTree.Root;\n\n buildI18n: (\n storages: Record<string, ContentStorage>,\n options?: PageTreeOptions,\n ) => Record<string, PageTree.Root>;\n}\n\nconst group = /^\\((?<name>.+)\\)$/;\nconst link = /^(?<external>external:)?(?:\\[(?<icon>[^\\]]+)])?\\[(?<name>[^\\]]+)]\\((?<url>[^)]+)\\)$/;\nconst separator = /^---(?:\\[(?<icon>[^\\]]+)])?(?<name>.+)---|^---$/;\nconst rest = '...' as const;\nconst restReversed = 'z...a' as const;\nconst extractPrefix = '...';\nconst excludePrefix = '!';\n\nexport function createPageTreeBuilder(loaderConfig: ResolvedLoaderConfig): PageTreeBuilder {\n const { plugins = [], url, pageTree: defaultOptions = {} } = loaderConfig;\n\n return {\n build(storage, options = defaultOptions) {\n const key = '';\n return this.buildI18n({ [key]: storage }, options)[key];\n },\n buildI18n(storages, options = defaultOptions) {\n let nextId = 0;\n const out: Record<string, PageTree.Root> = {};\n const transformers: PageTreeTransformer[] = [];\n\n if (options.transformers) {\n transformers.push(...options.transformers);\n }\n\n for (const plugin of plugins) {\n if (plugin.transformPageTree) transformers.push(plugin.transformPageTree);\n }\n\n if (options.generateFallback ?? true) {\n transformers.push(transformerFallback());\n }\n\n for (const [locale, storage] of Object.entries(storages)) {\n let rootId = locale.length === 0 ? 'root' : locale;\n if (options.id) rootId = `${options.id}-${rootId}`;\n\n out[locale] = createPageTreeBuilderUtils({\n rootId,\n transformers,\n builder: this,\n options,\n getUrl: url,\n locale,\n storage,\n storages,\n generateNodeId() {\n return '_' + nextId++;\n },\n }).root();\n }\n\n return out;\n },\n };\n}\n\nfunction createFlattenPathResolver(storage: ContentStorage) {\n const map = new Map<string, string>();\n const files = storage.getFiles();\n for (const file of files) {\n const content = storage.read(file)!;\n const flattenPath = file.substring(0, file.length - extname(file).length);\n\n map.set(flattenPath + '.' + content.format, file);\n }\n\n return (name: string, format: string) => {\n return map.get(name + '.' + format) ?? name;\n };\n}\n\nfunction createPageTreeBuilderUtils(ctx: PageTreeBuilderContext) {\n const resolveFlattenPath = createFlattenPathResolver(ctx.storage);\n const visitedPaths = new Set<string>();\n\n function nextNodeId(localId = ctx.generateNodeId()) {\n return `${ctx.rootId}:${localId}`;\n }\n\n return {\n buildPaths(paths: string[], reversed = false): PageTree.Node[] {\n const items: PageTree.Node[] = [];\n const folders: PageTree.Folder[] = [];\n const sortedPaths = paths.sort((a, b) => a.localeCompare(b) * (reversed ? -1 : 1));\n\n for (const path of sortedPaths) {\n const fileNode = this.file(path);\n if (fileNode) {\n if (basename(path, extname(path)) === 'index') items.unshift(fileNode);\n else items.push(fileNode);\n\n continue;\n }\n\n const dirNode = this.folder(path, false);\n if (dirNode) folders.push(dirNode);\n }\n\n items.push(...folders);\n return items;\n },\n resolveFolderItem(folderPath: string, item: string): PageTree.Node[] | '...' | 'z...a' {\n if (item === rest || item === restReversed) return item;\n\n let match = separator.exec(item);\n if (match?.groups) {\n let node: PageTree.Separator = {\n $id: nextNodeId(),\n type: 'separator',\n icon: match.groups.icon,\n name: match.groups.name,\n };\n\n for (const transformer of ctx.transformers) {\n if (!transformer.separator) continue;\n node = transformer.separator.call(ctx, node);\n }\n\n return [node];\n }\n\n match = link.exec(item);\n if (match?.groups) {\n const { icon, url, name, external } = match.groups;\n\n let node: PageTree.Item = {\n $id: nextNodeId(),\n type: 'page',\n icon,\n name,\n url,\n external: external ? true : undefined,\n };\n\n for (const transformer of ctx.transformers) {\n if (!transformer.file) continue;\n node = transformer.file.call(ctx, node);\n }\n\n return [node];\n }\n\n const isExcept = item.startsWith(excludePrefix);\n const isExtract = !isExcept && item.startsWith(extractPrefix);\n\n let filename = item;\n if (isExcept) {\n filename = item.slice(excludePrefix.length);\n } else if (isExtract) {\n filename = item.slice(extractPrefix.length);\n }\n\n const path = resolveFlattenPath(joinPath(folderPath, filename), 'page');\n\n if (isExcept) {\n visitedPaths.add(path);\n return [];\n }\n\n const dirNode = this.folder(path, false);\n if (dirNode) {\n return isExtract ? dirNode.children : [dirNode];\n }\n\n const fileNode = this.file(path);\n return fileNode ? [fileNode] : [];\n },\n folder(folderPath: string, isGlobalRoot: boolean): PageTree.Folder | undefined {\n const { storage, options, transformers } = ctx;\n const files = storage.readDir(folderPath);\n if (!files) return;\n\n const metaPath = resolveFlattenPath(joinPath(folderPath, 'meta'), 'meta');\n const indexPath = resolveFlattenPath(joinPath(folderPath, 'index'), 'page');\n\n let meta = storage.read(metaPath);\n if (meta && meta.format !== 'meta') meta = undefined;\n\n const metadata = meta?.data ?? {};\n const { root = isGlobalRoot, pages } = metadata;\n let index: PageTree.Item | undefined;\n let children: PageTree.Node[];\n\n if (pages) {\n const resolved = pages.flatMap<PageTree.Node | typeof rest | typeof restReversed>((item) =>\n this.resolveFolderItem(folderPath, item),\n );\n\n if (!root && !visitedPaths.has(indexPath)) {\n index = this.file(indexPath);\n }\n\n for (let i = 0; i < resolved.length; i++) {\n const item = resolved[i];\n if (item !== rest && item !== restReversed) continue;\n\n const items = this.buildPaths(\n files.filter((file) => !visitedPaths.has(file)),\n item === restReversed,\n );\n\n resolved.splice(i, 1, ...items);\n break;\n }\n\n children = resolved as PageTree.Node[];\n } else {\n if (!root && !visitedPaths.has(indexPath)) {\n index = this.file(indexPath);\n }\n\n children = this.buildPaths(files.filter((file) => !visitedPaths.has(file)));\n }\n\n let node: PageTree.Folder = {\n type: 'folder',\n name:\n metadata.title ??\n index?.name ??\n (() => {\n const folderName = basename(folderPath);\n return pathToName(group.exec(folderName)?.[1] ?? folderName);\n })(),\n icon: metadata.icon ?? index?.icon,\n root: metadata.root,\n defaultOpen: metadata.defaultOpen,\n description: metadata.description,\n collapsible: metadata.collapsible,\n index,\n children,\n $id: nextNodeId(folderPath),\n $ref:\n !options.noRef && meta\n ? {\n metaFile: metaPath,\n }\n : undefined,\n };\n\n visitedPaths.add(folderPath);\n for (const transformer of transformers) {\n if (!transformer.folder) continue;\n node = transformer.folder.call(ctx, node, folderPath, metaPath);\n }\n\n return node;\n },\n file(path: string): PageTree.Item | undefined {\n const { options, getUrl, storage, locale, transformers } = ctx;\n\n const page = storage.read(path);\n if (page?.format !== 'page') return;\n\n const { title, description, icon } = page.data;\n let item: PageTree.Item = {\n $id: nextNodeId(path),\n type: 'page',\n name: title ?? pathToName(basename(path, extname(path))),\n description,\n icon,\n url: getUrl(page.slugs, locale),\n $ref: !options.noRef\n ? {\n file: path,\n }\n : undefined,\n };\n\n visitedPaths.add(path);\n for (const transformer of transformers) {\n if (!transformer.file) continue;\n item = transformer.file.call(ctx, item, path);\n }\n\n return item;\n },\n root(): PageTree.Root {\n const folder = this.folder('', true)!;\n let root: PageTree.Root = {\n $id: ctx.rootId,\n name: folder.name || 'Docs',\n children: folder.children,\n };\n\n for (const transformer of ctx.transformers) {\n if (!transformer.root) continue;\n root = transformer.root.call(ctx, root);\n }\n\n return root;\n },\n };\n}\n\n/**\n * Get item name from file name\n *\n * @param name - file name\n */\nfunction pathToName(name: string): string {\n const result = [];\n for (const c of name) {\n if (result.length === 0) result.push(c.toLocaleUpperCase());\n else if (c === '-') result.push(' ');\n else result.push(c);\n }\n\n return result.join('');\n}\n","import type * as PageTree from '@/page-tree/definitions';\nimport type { I18nConfig } from '@/i18n';\nimport { buildContentStorage, type ContentStorage } from './storage/content';\nimport { createPageTreeBuilder, type PageTreeOptions } from '@/source/page-tree/builder';\nimport { joinPath } from './path';\nimport { normalizeUrl } from '@/utils/normalize-url';\nimport { SlugFn, slugsPlugin } from '@/source/plugins/slugs';\nimport { iconPlugin, type IconResolver } from '@/source/plugins/icon';\nimport type { MetaData, PageData, Source, SourceConfig } from './source';\nimport { visit } from '@/page-tree/utils';\nimport path from 'node:path';\nimport type { PageTreeTransformer } from '@/source/page-tree/builder';\n\nexport interface LoaderConfig {\n source: SourceConfig;\n i18n: I18nConfig | undefined;\n}\n\nexport interface LoaderOptions<C extends LoaderConfig = LoaderConfig> {\n baseUrl: string;\n i18n?: C['i18n'];\n url?: (slugs: string[], locale?: string) => string;\n\n /**\n * Additional options for page tree builder\n */\n pageTree?: PageTreeOptions<C>;\n\n plugins?:\n | LoaderPluginOption[]\n | ((context: {\n typedPlugin: (plugin: LoaderPlugin<C>) => LoaderPlugin;\n }) => LoaderPluginOption[]);\n icon?: IconResolver;\n slugs?: SlugFn<C>;\n}\n\nexport interface ResolvedLoaderConfig {\n source: Source;\n url: (slugs: string[], locale?: string) => string;\n\n plugins?: LoaderPlugin[];\n pageTree?: PageTreeOptions;\n i18n?: I18nConfig | undefined;\n}\n\ninterface SharedFileInfo {\n /**\n * Virtualized file path (relative to content directory)\n *\n * @example `docs/page.mdx`\n */\n path: string;\n\n /**\n * Absolute path of the file\n */\n absolutePath?: string;\n}\n\nexport interface Page<Data = PageData> extends SharedFileInfo {\n slugs: string[];\n url: string;\n data: Data;\n\n locale?: string | undefined;\n}\n\nexport interface Meta<Data = MetaData> extends SharedFileInfo {\n data: Data;\n}\n\nexport interface LoaderOutput<Config extends LoaderConfig> {\n pageTree: Config['i18n'] extends I18nConfig ? Record<string, PageTree.Root> : PageTree.Root;\n\n getPageTree: (locale?: string) => PageTree.Root;\n /**\n * get referenced page from href, supported:\n *\n * - relative file paths, like `./my/page.mdx`.\n * - generated page pathname, like `/docs/my/page`.\n */\n getPageByHref: (\n href: string,\n options?: {\n language?: string;\n\n /**\n * resolve relative file paths in `href` from specified dirname, must be a virtual path.\n */\n dir?: string;\n },\n ) =>\n | {\n page: Page<Config['source']['pageData']>;\n hash?: string;\n }\n | undefined;\n /**\n * resolve special hrefs in a page, including:\n *\n * - relative file paths, like `./my/page.mdx`.\n */\n resolveHref: (href: string, parent: Page<Config['source']['pageData']>) => string;\n\n /**\n * @internal\n */\n _i18n?: I18nConfig;\n\n /**\n * Get a list of pages from specified language\n *\n * @param language - If empty, list pages from all languages.\n */\n getPages: (language?: string) => Page<Config['source']['pageData']>[];\n\n /**\n * get each language and its pages, empty if i18n is not enabled.\n */\n getLanguages: () => {\n language: string;\n pages: Page<Config['source']['pageData']>[];\n }[];\n\n /**\n * Get page with slugs, the slugs can also be URI encoded.\n *\n * @param language - If empty, the default language will be used\n */\n getPage: (\n slugs: string[] | undefined,\n language?: string,\n ) => Page<Config['source']['pageData']> | undefined;\n\n getNodePage: (\n node: PageTree.Item,\n language?: string,\n ) => Page<Config['source']['pageData']> | undefined;\n\n getNodeMeta: (\n node: PageTree.Folder,\n language?: string,\n ) => Meta<Config['source']['metaData']> | undefined;\n\n /**\n * generate static params for Next.js SSG\n *\n * @param slug - customise parameter name for slugs\n * @param lang - customise parameter name for lang\n */\n generateParams: <TSlug extends string = 'slug', TLang extends string = 'lang'>(\n slug?: TSlug,\n lang?: TLang,\n ) => (Record<TSlug, string[]> & Record<TLang, string>)[];\n\n /**\n * serialize page tree for non-RSC environments\n */\n serializePageTree: (tree: PageTree.Root) => Promise<object>;\n}\n\nfunction indexPages(storages: Record<string, ContentStorage>, { url }: ResolvedLoaderConfig) {\n const result = {\n // (locale.slugs -> page)\n pages: new Map<string, Page>(),\n // (locale.path -> page)\n pathToMeta: new Map<string, Meta>(),\n // (locale.path -> meta)\n pathToPage: new Map<string, Page>(),\n };\n\n for (const [lang, storage] of Object.entries(storages)) {\n for (const filePath of storage.getFiles()) {\n const item = storage.read(filePath)!;\n const path = `${lang}.${filePath}`;\n\n if (item.format === 'meta') {\n result.pathToMeta.set(path, {\n path: item.path,\n absolutePath: item.absolutePath,\n data: item.data,\n });\n continue;\n }\n\n const page: Page = {\n absolutePath: item.absolutePath,\n path: item.path,\n url: url(item.slugs, lang),\n slugs: item.slugs,\n data: item.data,\n locale: lang,\n };\n result.pathToPage.set(path, page);\n result.pages.set(`${lang}.${page.slugs.join('/')}`, page);\n }\n }\n\n return result;\n}\n\nexport function createGetUrl(baseUrl: string, i18n?: I18nConfig): ResolvedLoaderConfig['url'] {\n const baseSlugs = baseUrl.split('/');\n\n return (slugs, locale) => {\n const hideLocale = i18n?.hideLocale ?? 'never';\n let urlLocale: string | undefined;\n\n if (hideLocale === 'never') {\n urlLocale = locale;\n } else if (hideLocale === 'default-locale' && locale !== i18n?.defaultLanguage) {\n urlLocale = locale;\n }\n\n const paths = [...baseSlugs, ...slugs];\n if (urlLocale) paths.unshift(urlLocale);\n\n return `/${paths.filter((v) => v.length > 0).join('/')}`;\n };\n}\n\nexport function loader<\n Config extends SourceConfig,\n I18n extends I18nConfig | undefined = undefined,\n>(\n source: Source<Config>,\n options: LoaderOptions<{\n source: NoInfer<Config>;\n i18n: I18n;\n }>,\n): LoaderOutput<{\n source: Config;\n i18n: I18n;\n}>;\n\nexport function loader<\n Config extends SourceConfig,\n I18n extends I18nConfig | undefined = undefined,\n>(\n options: LoaderOptions<{\n source: NoInfer<Config>;\n i18n: I18n;\n }> & {\n source: Source<Config>;\n },\n): LoaderOutput<{\n source: Config;\n i18n: I18n;\n}>;\n\nexport function loader(\n ...args:\n | [\n LoaderOptions & {\n source: Source;\n },\n ]\n | [Source, LoaderOptions]\n): LoaderOutput<LoaderConfig> {\n const loaderConfig =\n args.length === 2 ? resolveConfig(args[0], args[1]) : resolveConfig(args[0].source, args[0]);\n const { i18n } = loaderConfig;\n const defaultLanguage = i18n?.defaultLanguage ?? '';\n const storages = buildContentStorage(loaderConfig, defaultLanguage);\n const walker = indexPages(storages, loaderConfig);\n const builder = createPageTreeBuilder(loaderConfig);\n let pageTrees: Record<string, PageTree.Root> | undefined;\n function getPageTrees() {\n return (pageTrees ??= builder.buildI18n(storages));\n }\n\n return {\n _i18n: i18n,\n get pageTree() {\n const trees = getPageTrees();\n\n return i18n\n ? (trees as unknown as LoaderOutput<LoaderConfig>['pageTree'])\n : trees[defaultLanguage];\n },\n set pageTree(v) {\n if (i18n) {\n pageTrees = v as unknown as Record<string, PageTree.Root>;\n } else {\n pageTrees ??= {};\n pageTrees[defaultLanguage] = v;\n }\n },\n getPageByHref(href, { dir = '', language = defaultLanguage } = {}) {\n const [value, hash] = href.split('#', 2);\n let target;\n\n if (value.startsWith('./')) {\n const path = joinPath(dir, value);\n\n target = walker.pathToPage.get(`${language}.${path}`);\n } else {\n target = this.getPages(language).find((item) => item.url === value);\n }\n\n if (target)\n return {\n page: target,\n hash,\n };\n },\n resolveHref(href, parent) {\n if (href.startsWith('./')) {\n const target = this.getPageByHref(href, {\n dir: path.dirname(parent.path),\n language: parent.locale,\n });\n\n if (target) {\n return target.hash ? `${target.page.url}#${target.hash}` : target.page.url;\n }\n }\n\n return href;\n },\n getPages(language) {\n const pages: Page[] = [];\n\n for (const [key, value] of walker.pages.entries()) {\n if (language === undefined || key.startsWith(`${language}.`)) {\n pages.push(value);\n }\n }\n\n return pages;\n },\n getLanguages() {\n const list: {\n language: string;\n pages: Page[];\n }[] = [];\n\n if (!i18n) return list;\n for (const language of i18n.languages) {\n list.push({\n language,\n pages: this.getPages(language),\n });\n }\n\n return list;\n },\n // the slugs plugin generates encoded slugs by default.\n // we can assume page slugs are always URI encoded.\n getPage(slugs = [], language = defaultLanguage) {\n // `slugs` is already decoded\n let page = walker.pages.get(`${language}.${slugs.join('/')}`);\n if (page) return page;\n\n // `slugs` is URI encoded\n page = walker.pages.get(`${language}.${slugs.map(decodeURI).join('/')}`);\n if (page) return page;\n },\n getNodeMeta(node, language = defaultLanguage) {\n const ref = node.$ref?.metaFile;\n if (!ref) return;\n\n return walker.pathToMeta.get(`${language}.${ref}`);\n },\n getNodePage(node, language = defaultLanguage) {\n const ref = node.$ref?.file;\n if (!ref) return;\n\n return walker.pathToPage.get(`${language}.${ref}`);\n },\n getPageTree(locale = defaultLanguage) {\n const trees = getPageTrees();\n return trees[locale] ?? trees[defaultLanguage];\n },\n // @ts-expect-error -- ignore this\n generateParams(slug, lang) {\n if (i18n) {\n return this.getLanguages().flatMap((entry) =>\n entry.pages.map((page) => ({\n [slug ?? 'slug']: page.slugs,\n [lang ?? 'lang']: entry.language,\n })),\n );\n }\n\n return this.getPages().map((page) => ({\n [slug ?? 'slug']: page.slugs,\n }));\n },\n async serializePageTree(tree: PageTree.Root): Promise<object> {\n const { renderToString } = await import('react-dom/server.edge');\n\n return visit(tree, (node) => {\n node = { ...node };\n if ('icon' in node && node.icon) {\n node.icon = renderToString(node.icon);\n }\n if (node.name) {\n node.name = renderToString(node.name);\n }\n if ('children' in node) {\n node.children = [...node.children];\n }\n\n return node;\n });\n },\n };\n}\n\nfunction resolveConfig(\n source: Source,\n { slugs, icon, plugins = [], baseUrl, url, ...base }: LoaderOptions,\n): ResolvedLoaderConfig {\n let config: ResolvedLoaderConfig = {\n ...base,\n url: url ? (...args) => normalizeUrl(url(...args)) : createGetUrl(baseUrl, base.i18n),\n source,\n plugins: buildPlugins([\n icon && iconPlugin(icon),\n ...(typeof plugins === 'function'\n ? plugins({\n typedPlugin: (plugin) => plugin as unknown as LoaderPlugin,\n })\n : plugins),\n slugsPlugin(slugs),\n ]),\n };\n\n for (const plugin of config.plugins ?? []) {\n const result = plugin.config?.(config);\n if (result) config = result;\n }\n\n return config;\n}\n\nexport interface LoaderPlugin<Config extends LoaderConfig = LoaderConfig> {\n name?: string;\n\n /**\n * Change the order of plugin:\n * - `pre`: before normal plugins\n * - `post`: after normal plugins\n */\n enforce?: 'pre' | 'post';\n\n /**\n * receive & replace loader options\n */\n config?: (config: ResolvedLoaderConfig) => ResolvedLoaderConfig | void | undefined;\n\n /**\n * transform the storage after loading\n */\n transformStorage?: (context: { storage: ContentStorage<Config['source']> }) => void;\n\n /**\n * transform the generated page tree\n */\n transformPageTree?: PageTreeTransformer<Config['source']>;\n}\n\nexport type LoaderPluginOption<Config extends LoaderConfig = LoaderConfig> =\n | LoaderPlugin<Config>\n | LoaderPluginOption<Config>[]\n | undefined;\n\nconst priorityMap = {\n pre: 1,\n default: 0,\n post: -1,\n};\n\nfunction buildPlugins(plugins: LoaderPluginOption[], sort = true): LoaderPlugin[] {\n const flatten: LoaderPlugin[] = [];\n\n for (const plugin of plugins) {\n if (Array.isArray(plugin)) flatten.push(...buildPlugins(plugin, false));\n else if (plugin) flatten.push(plugin);\n }\n\n if (sort)\n return flatten.sort(\n (a, b) => priorityMap[b.enforce ?? 'default'] - priorityMap[a.enforce ?? 'default'],\n );\n return flatten;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- infer types\nexport type InferPageType<Utils extends LoaderOutput<any>> =\n Utils extends LoaderOutput<infer Config> ? Page<Config['source']['pageData']> : never;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any -- infer types\nexport type InferMetaType<Utils extends LoaderOutput<any>> =\n Utils extends LoaderOutput<infer Config> ? Meta<Config['source']['metaData']> : never;\n"],"mappings":"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"}
@@ -1,14 +1,14 @@
1
- import { L as LoaderPlugin } from '../../loader-_E2HOdV0.js';
2
- import { icons } from 'lucide-react';
3
- import '../../definitions-pJ7PybYY.js';
4
- import 'react';
5
- import '../../i18n/index.js';
1
+ import "../../definitions-DJAPG-2U.js";
2
+ import { s as LoaderPlugin } from "../../index-Co_C8NEi.js";
3
+ import { icons } from "lucide-react";
6
4
 
5
+ //#region src/source/plugins/lucide-icons.d.ts
7
6
  /**
8
7
  * Convert icon names into Lucide Icons, requires `lucide-react` to be installed.
9
8
  */
10
9
  declare function lucideIconsPlugin(options?: {
11
- defaultIcon?: keyof typeof icons;
10
+ defaultIcon?: keyof typeof icons;
12
11
  }): LoaderPlugin;
13
-
12
+ //#endregion
14
13
  export { lucideIconsPlugin };
14
+ //# sourceMappingURL=lucide-icons.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lucide-icons.d.ts","names":[],"sources":["../../../src/source/plugins/lucide-icons.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAQgB,iBAAA,iBAAA,CAEe,QAE5B,EAAA;6BAF4B;IAE5B"}
@@ -1,23 +1,24 @@
1
- import {
2
- iconPlugin
3
- } from "../../chunk-FAEPKD7U.js";
4
- import "../../chunk-U67V476Y.js";
5
-
6
- // src/source/plugins/lucide-icons.ts
7
- import { icons } from "lucide-react";
1
+ import { t as iconPlugin } from "../../icon-5lVe3l-0.js";
8
2
  import { createElement } from "react";
3
+ import { icons } from "lucide-react";
4
+
5
+ //#region src/source/plugins/lucide-icons.ts
6
+ /**
7
+ * Convert icon names into Lucide Icons, requires `lucide-react` to be installed.
8
+ */
9
9
  function lucideIconsPlugin(options = {}) {
10
- const { defaultIcon } = options;
11
- return iconPlugin((icon = defaultIcon) => {
12
- if (icon === void 0) return;
13
- const Icon = icons[icon];
14
- if (!icon) {
15
- console.warn(`[lucide-icons-plugin] Unknown icon detected: ${icon}.`);
16
- return;
17
- }
18
- return createElement(Icon);
19
- });
10
+ const { defaultIcon } = options;
11
+ return iconPlugin((icon = defaultIcon) => {
12
+ if (icon === void 0) return;
13
+ const Icon = icons[icon];
14
+ if (!Icon) {
15
+ console.warn(`[lucide-icons-plugin] Unknown icon detected: ${icon}.`);
16
+ return;
17
+ }
18
+ return createElement(Icon);
19
+ });
20
20
  }
21
- export {
22
- lucideIconsPlugin
23
- };
21
+
22
+ //#endregion
23
+ export { lucideIconsPlugin };
24
+ //# sourceMappingURL=lucide-icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lucide-icons.js","names":[],"sources":["../../../src/source/plugins/lucide-icons.ts"],"sourcesContent":["import type { LoaderPlugin } from '@/source';\nimport { iconPlugin } from '@/source/plugins/icon';\nimport { icons } from 'lucide-react';\nimport { createElement } from 'react';\n\n/**\n * Convert icon names into Lucide Icons, requires `lucide-react` to be installed.\n */\nexport function lucideIconsPlugin(\n options: {\n defaultIcon?: keyof typeof icons;\n } = {},\n): LoaderPlugin {\n const { defaultIcon } = options;\n return iconPlugin((icon = defaultIcon) => {\n if (icon === undefined) return;\n const Icon = icons[icon as keyof typeof icons];\n if (!Icon) {\n console.warn(`[lucide-icons-plugin] Unknown icon detected: ${icon}.`);\n return;\n }\n\n return createElement(Icon);\n });\n}\n"],"mappings":";;;;;;;;AAQA,SAAgB,kBACd,UAEI,EAAE,EACQ;CACd,MAAM,EAAE,gBAAgB;AACxB,QAAO,YAAY,OAAO,gBAAgB;AACxC,MAAI,SAAS,OAAW;EACxB,MAAM,OAAO,MAAM;AACnB,MAAI,CAAC,MAAM;AACT,WAAQ,KAAK,gDAAgD,KAAK,GAAG;AACrE;;AAGF,SAAO,cAAc,KAAK;GAC1B"}
@@ -0,0 +1,3 @@
1
+ import "../../definitions-DJAPG-2U.js";
2
+ import { _ as slugsPlugin, g as slugsFromData, h as getSlugs, m as SlugFn } from "../../index-Co_C8NEi.js";
3
+ export { SlugFn, getSlugs, slugsFromData, slugsPlugin };
@@ -0,0 +1,65 @@
1
+ import { n as dirname, r as extname, t as basename } from "../../path-D6M0ZQvO.js";
2
+
3
+ //#region src/source/plugins/slugs.ts
4
+ /**
5
+ * Generate slugs for pages if missing
6
+ */
7
+ function slugsPlugin(slugFn) {
8
+ function isIndex(file) {
9
+ return basename(file, extname(file)) === "index";
10
+ }
11
+ return {
12
+ name: "fumadocs:slugs",
13
+ transformStorage({ storage }) {
14
+ const indexFiles = [];
15
+ const taken = /* @__PURE__ */ new Set();
16
+ for (const path of storage.getFiles()) {
17
+ const file = storage.read(path);
18
+ if (!file || file.format !== "page" || file.slugs) continue;
19
+ const customSlugs = slugFn?.(file);
20
+ if (customSlugs === void 0 && isIndex(path)) {
21
+ indexFiles.push(path);
22
+ continue;
23
+ }
24
+ file.slugs = customSlugs ?? getSlugs(path);
25
+ const key = file.slugs.join("/");
26
+ if (taken.has(key)) throw new Error(`Duplicated slugs: ${key}`);
27
+ taken.add(key);
28
+ }
29
+ for (const path of indexFiles) {
30
+ const file = storage.read(path);
31
+ if (file?.format !== "page") continue;
32
+ file.slugs = getSlugs(path);
33
+ if (taken.has(file.slugs.join("/"))) file.slugs.push("index");
34
+ }
35
+ }
36
+ };
37
+ }
38
+ /**
39
+ * Generate slugs from file data (e.g. frontmatter).
40
+ *
41
+ * @param key - the property name in file data to generate slugs, default to `slug`.
42
+ */
43
+ function slugsFromData(key = "slug") {
44
+ return (file) => {
45
+ const k = key;
46
+ if (k in file.data && typeof file.data[k] === "string") return file.data[k].split("/").filter((v) => v.length > 0);
47
+ };
48
+ }
49
+ const GroupRegex = /^\(.+\)$/;
50
+ /**
51
+ * Convert file path into slugs, also encode non-ASCII characters, so they can work in pathname
52
+ */
53
+ function getSlugs(file) {
54
+ const dir = dirname(file);
55
+ const name = basename(file, extname(file));
56
+ const slugs = [];
57
+ for (const seg of dir.split("/")) if (seg.length > 0 && !GroupRegex.test(seg)) slugs.push(encodeURI(seg));
58
+ if (GroupRegex.test(name)) throw new Error(`Cannot use folder group in file names: ${file}`);
59
+ if (name !== "index") slugs.push(encodeURI(name));
60
+ return slugs;
61
+ }
62
+
63
+ //#endregion
64
+ export { getSlugs, slugsFromData, slugsPlugin };
65
+ //# sourceMappingURL=slugs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slugs.js","names":["indexFiles: string[]","slugs: string[]"],"sources":["../../../src/source/plugins/slugs.ts"],"sourcesContent":["import { basename, dirname, extname } from '@/source/path';\nimport type { ContentStoragePageFile } from '../storage/content';\nimport type { LoaderConfig, LoaderPlugin } from '../loader';\n\n/**\n * a function to generate slugs, return `undefined` to fallback to default generation.\n */\nexport type SlugFn<Config extends LoaderConfig = LoaderConfig> = (\n file: ContentStoragePageFile<Config['source']>,\n) => string[] | undefined;\n\n/**\n * Generate slugs for pages if missing\n */\nexport function slugsPlugin<Config extends LoaderConfig = LoaderConfig>(\n slugFn?: SlugFn<Config>,\n): LoaderPlugin<Config> {\n function isIndex(file: string) {\n return basename(file, extname(file)) === 'index';\n }\n\n return {\n name: 'fumadocs:slugs',\n transformStorage({ storage }) {\n const indexFiles: string[] = [];\n const taken = new Set<string>();\n\n for (const path of storage.getFiles()) {\n const file = storage.read(path);\n if (!file || file.format !== 'page' || file.slugs) continue;\n\n const customSlugs = slugFn?.(file);\n // for custom slugs function, don't handle conflicting cases like `dir/index.mdx` vs `dir.mdx`\n if (customSlugs === undefined && isIndex(path)) {\n indexFiles.push(path);\n continue;\n }\n\n file.slugs = customSlugs ?? getSlugs(path);\n const key = file.slugs.join('/');\n if (taken.has(key)) throw new Error(`Duplicated slugs: ${key}`);\n taken.add(key);\n }\n\n for (const path of indexFiles) {\n const file = storage.read(path);\n if (file?.format !== 'page') continue;\n\n file.slugs = getSlugs(path);\n if (taken.has(file.slugs.join('/'))) file.slugs.push('index');\n }\n },\n };\n}\n\n/**\n * Generate slugs from file data (e.g. frontmatter).\n *\n * @param key - the property name in file data to generate slugs, default to `slug`.\n */\nexport function slugsFromData<Config extends LoaderConfig = LoaderConfig>(\n key = 'slug',\n): SlugFn<Config> {\n return (file) => {\n const k = key as keyof typeof file.data;\n\n if (k in file.data && typeof file.data[k] === 'string') {\n return file.data[k].split('/').filter((v) => v.length > 0);\n }\n };\n}\n\nconst GroupRegex = /^\\(.+\\)$/;\n\n/**\n * Convert file path into slugs, also encode non-ASCII characters, so they can work in pathname\n */\nexport function getSlugs(file: string): string[] {\n const dir = dirname(file);\n const name = basename(file, extname(file));\n const slugs: string[] = [];\n\n for (const seg of dir.split('/')) {\n // filter empty names and file groups like (group_name)\n if (seg.length > 0 && !GroupRegex.test(seg)) slugs.push(encodeURI(seg));\n }\n\n if (GroupRegex.test(name)) throw new Error(`Cannot use folder group in file names: ${file}`);\n\n if (name !== 'index') {\n slugs.push(encodeURI(name));\n }\n\n return slugs;\n}\n"],"mappings":";;;;;;AAcA,SAAgB,YACd,QACsB;CACtB,SAAS,QAAQ,MAAc;AAC7B,SAAO,SAAS,MAAM,QAAQ,KAAK,CAAC,KAAK;;AAG3C,QAAO;EACL,MAAM;EACN,iBAAiB,EAAE,WAAW;GAC5B,MAAMA,aAAuB,EAAE;GAC/B,MAAM,wBAAQ,IAAI,KAAa;AAE/B,QAAK,MAAM,QAAQ,QAAQ,UAAU,EAAE;IACrC,MAAM,OAAO,QAAQ,KAAK,KAAK;AAC/B,QAAI,CAAC,QAAQ,KAAK,WAAW,UAAU,KAAK,MAAO;IAEnD,MAAM,cAAc,SAAS,KAAK;AAElC,QAAI,gBAAgB,UAAa,QAAQ,KAAK,EAAE;AAC9C,gBAAW,KAAK,KAAK;AACrB;;AAGF,SAAK,QAAQ,eAAe,SAAS,KAAK;IAC1C,MAAM,MAAM,KAAK,MAAM,KAAK,IAAI;AAChC,QAAI,MAAM,IAAI,IAAI,CAAE,OAAM,IAAI,MAAM,qBAAqB,MAAM;AAC/D,UAAM,IAAI,IAAI;;AAGhB,QAAK,MAAM,QAAQ,YAAY;IAC7B,MAAM,OAAO,QAAQ,KAAK,KAAK;AAC/B,QAAI,MAAM,WAAW,OAAQ;AAE7B,SAAK,QAAQ,SAAS,KAAK;AAC3B,QAAI,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI,CAAC,CAAE,MAAK,MAAM,KAAK,QAAQ;;;EAGlE;;;;;;;AAQH,SAAgB,cACd,MAAM,QACU;AAChB,SAAQ,SAAS;EACf,MAAM,IAAI;AAEV,MAAI,KAAK,KAAK,QAAQ,OAAO,KAAK,KAAK,OAAO,SAC5C,QAAO,KAAK,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,MAAM,EAAE,SAAS,EAAE;;;AAKhE,MAAM,aAAa;;;;AAKnB,SAAgB,SAAS,MAAwB;CAC/C,MAAM,MAAM,QAAQ,KAAK;CACzB,MAAM,OAAO,SAAS,MAAM,QAAQ,KAAK,CAAC;CAC1C,MAAMC,QAAkB,EAAE;AAE1B,MAAK,MAAM,OAAO,IAAI,MAAM,IAAI,CAE9B,KAAI,IAAI,SAAS,KAAK,CAAC,WAAW,KAAK,IAAI,CAAE,OAAM,KAAK,UAAU,IAAI,CAAC;AAGzE,KAAI,WAAW,KAAK,KAAK,CAAE,OAAM,IAAI,MAAM,0CAA0C,OAAO;AAE5F,KAAI,SAAS,QACX,OAAM,KAAK,UAAU,KAAK,CAAC;AAG7B,QAAO"}
@@ -1,26 +1,29 @@
1
- import { z } from 'zod';
1
+ import { z } from "zod";
2
+
3
+ //#region src/source/schema.d.ts
2
4
 
3
5
  /**
4
6
  * Zod 4 schema
5
7
  */
6
8
  declare const metaSchema: z.ZodObject<{
7
- title: z.ZodOptional<z.ZodString>;
8
- pages: z.ZodOptional<z.ZodArray<z.ZodString>>;
9
- description: z.ZodOptional<z.ZodString>;
10
- root: z.ZodOptional<z.ZodBoolean>;
11
- defaultOpen: z.ZodOptional<z.ZodBoolean>;
12
- collapsible: z.ZodOptional<z.ZodBoolean>;
13
- icon: z.ZodOptional<z.ZodString>;
9
+ title: z.ZodOptional<z.ZodString>;
10
+ pages: z.ZodOptional<z.ZodArray<z.ZodString>>;
11
+ description: z.ZodOptional<z.ZodString>;
12
+ root: z.ZodOptional<z.ZodBoolean>;
13
+ defaultOpen: z.ZodOptional<z.ZodBoolean>;
14
+ collapsible: z.ZodOptional<z.ZodBoolean>;
15
+ icon: z.ZodOptional<z.ZodString>;
14
16
  }, z.core.$strip>;
15
17
  /**
16
18
  * Zod 4 schema
17
19
  */
18
20
  declare const pageSchema: z.ZodObject<{
19
- title: z.ZodString;
20
- description: z.ZodOptional<z.ZodString>;
21
- icon: z.ZodOptional<z.ZodString>;
22
- full: z.ZodOptional<z.ZodBoolean>;
23
- _openapi: z.ZodOptional<z.ZodObject<{}, z.core.$loose>>;
21
+ title: z.ZodString;
22
+ description: z.ZodOptional<z.ZodString>;
23
+ icon: z.ZodOptional<z.ZodString>;
24
+ full: z.ZodOptional<z.ZodBoolean>;
25
+ _openapi: z.ZodOptional<z.ZodObject<{}, z.core.$loose>>;
24
26
  }, z.core.$strip>;
25
-
27
+ //#endregion
26
28
  export { metaSchema, pageSchema };
29
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","names":[],"sources":["../../src/source/schema.ts"],"sourcesContent":[],"mappings":";;;;;;AAKA;cAAa,YAAU,CAAA,CAAA;;;;;;;;;;;;cAaV,YAAU,CAAA,CAAA;;;;EAbA,IAAA,eAAA,aAAA,CAAA;EAAA,QAAA,eAAA,YAAA,CAAA,CAAA,CAAA,eAAA,CAAA,CAAA;AAavB,CAAA,eAAa,CAQX"}
@@ -1,25 +1,29 @@
1
- import "../chunk-U67V476Y.js";
2
-
3
- // src/source/schema.ts
4
1
  import { z } from "zod";
5
- var metaSchema = z.object({
6
- title: z.string().optional(),
7
- pages: z.array(z.string()).optional(),
8
- description: z.string().optional(),
9
- root: z.boolean().optional(),
10
- defaultOpen: z.boolean().optional(),
11
- collapsible: z.boolean().optional(),
12
- icon: z.string().optional()
2
+
3
+ //#region src/source/schema.ts
4
+ /**
5
+ * Zod 4 schema
6
+ */
7
+ const metaSchema = z.object({
8
+ title: z.string().optional(),
9
+ pages: z.array(z.string()).optional(),
10
+ description: z.string().optional(),
11
+ root: z.boolean().optional(),
12
+ defaultOpen: z.boolean().optional(),
13
+ collapsible: z.boolean().optional(),
14
+ icon: z.string().optional()
13
15
  });
14
- var pageSchema = z.object({
15
- title: z.string(),
16
- description: z.string().optional(),
17
- icon: z.string().optional(),
18
- full: z.boolean().optional(),
19
- // Fumadocs OpenAPI generated
20
- _openapi: z.looseObject({}).optional()
16
+ /**
17
+ * Zod 4 schema
18
+ */
19
+ const pageSchema = z.object({
20
+ title: z.string(),
21
+ description: z.string().optional(),
22
+ icon: z.string().optional(),
23
+ full: z.boolean().optional(),
24
+ _openapi: z.looseObject({}).optional()
21
25
  });
22
- export {
23
- metaSchema,
24
- pageSchema
25
- };
26
+
27
+ //#endregion
28
+ export { metaSchema, pageSchema };
29
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","names":[],"sources":["../../src/source/schema.ts"],"sourcesContent":["import { z } from 'zod';\n\n/**\n * Zod 4 schema\n */\nexport const metaSchema = z.object({\n title: z.string().optional(),\n pages: z.array(z.string()).optional(),\n description: z.string().optional(),\n root: z.boolean().optional(),\n defaultOpen: z.boolean().optional(),\n collapsible: z.boolean().optional(),\n icon: z.string().optional(),\n});\n\n/**\n * Zod 4 schema\n */\nexport const pageSchema = z.object({\n title: z.string(),\n description: z.string().optional(),\n icon: z.string().optional(),\n full: z.boolean().optional(),\n\n // Fumadocs OpenAPI generated\n _openapi: z.looseObject({}).optional(),\n});\n"],"mappings":";;;;;;AAKA,MAAa,aAAa,EAAE,OAAO;CACjC,OAAO,EAAE,QAAQ,CAAC,UAAU;CAC5B,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,UAAU;CACrC,aAAa,EAAE,QAAQ,CAAC,UAAU;CAClC,MAAM,EAAE,SAAS,CAAC,UAAU;CAC5B,aAAa,EAAE,SAAS,CAAC,UAAU;CACnC,aAAa,EAAE,SAAS,CAAC,UAAU;CACnC,MAAM,EAAE,QAAQ,CAAC,UAAU;CAC5B,CAAC;;;;AAKF,MAAa,aAAa,EAAE,OAAO;CACjC,OAAO,EAAE,QAAQ;CACjB,aAAa,EAAE,QAAQ,CAAC,UAAU;CAClC,MAAM,EAAE,QAAQ,CAAC,UAAU;CAC3B,MAAM,EAAE,SAAS,CAAC,UAAU;CAG5B,UAAU,EAAE,YAAY,EAAE,CAAC,CAAC,UAAU;CACvC,CAAC"}
@@ -0,0 +1,51 @@
1
+ import { n as searchSimple, t as searchAdvanced } from "./advanced-DSlc7qa9.js";
2
+ import { create, load } from "@orama/orama";
3
+
4
+ //#region src/search/client/static.ts
5
+ const cache = /* @__PURE__ */ new Map();
6
+ async function loadDB({ from = "/api/search", initOrama = (locale) => create({
7
+ schema: { _: "string" },
8
+ language: locale
9
+ }) }) {
10
+ const cacheKey = from;
11
+ const cached = cache.get(cacheKey);
12
+ if (cached) return cached;
13
+ async function init() {
14
+ const res = await fetch(from);
15
+ if (!res.ok) throw new Error(`failed to fetch exported search indexes from ${from}, make sure the search database is exported and available for client.`);
16
+ const data = await res.json();
17
+ const dbs = /* @__PURE__ */ new Map();
18
+ if (data.type === "i18n") {
19
+ await Promise.all(Object.entries(data.data).map(async ([k, v]) => {
20
+ const db$1 = await initOrama(k);
21
+ load(db$1, v);
22
+ dbs.set(k, {
23
+ type: v.type,
24
+ db: db$1
25
+ });
26
+ }));
27
+ return dbs;
28
+ }
29
+ const db = await initOrama();
30
+ load(db, data);
31
+ dbs.set("", {
32
+ type: data.type,
33
+ db
34
+ });
35
+ return dbs;
36
+ }
37
+ const result = init();
38
+ cache.set(cacheKey, result);
39
+ return result;
40
+ }
41
+ async function search(query, options) {
42
+ const { tag, locale } = options;
43
+ const db = (await loadDB(options)).get(locale ?? "");
44
+ if (!db) return [];
45
+ if (db.type === "simple") return searchSimple(db, query);
46
+ return searchAdvanced(db.db, query, tag);
47
+ }
48
+
49
+ //#endregion
50
+ export { search };
51
+ //# sourceMappingURL=static-DAjBQpus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"static-DAjBQpus.js","names":["dbs: Database","db"],"sources":["../src/search/client/static.ts"],"sourcesContent":["import { type AnyOrama, create, load, type Orama } from '@orama/orama';\nimport { searchSimple } from '@/search/orama/search/simple';\nimport { searchAdvanced } from '@/search/orama/search/advanced';\nimport { type advancedSchema, type simpleSchema } from '@/search/orama/create-db';\nimport type { ExportedData } from '@/search/server';\n\nexport interface StaticOptions {\n /**\n * Where to download exported search indexes (URL)\n *\n * @defaultValue '/api/search'\n */\n from?: string;\n\n initOrama?: (locale?: string) => AnyOrama | Promise<AnyOrama>;\n\n /**\n * Filter results with specific tag(s).\n */\n tag?: string | string[];\n\n /**\n * Filter by locale (unsupported at the moment)\n */\n locale?: string;\n}\n\nconst cache = new Map<string, Promise<Database>>();\n\n// locale -> db\ntype Database = Map<\n string,\n {\n type: 'simple' | 'advanced';\n db: AnyOrama;\n }\n>;\n\nasync function loadDB({\n from = '/api/search',\n initOrama = (locale) => create({ schema: { _: 'string' }, language: locale }),\n}: StaticOptions): Promise<Database> {\n const cacheKey = from;\n const cached = cache.get(cacheKey);\n if (cached) return cached;\n\n async function init() {\n const res = await fetch(from);\n\n if (!res.ok)\n throw new Error(\n `failed to fetch exported search indexes from ${from}, make sure the search database is exported and available for client.`,\n );\n\n const data = (await res.json()) as ExportedData;\n const dbs: Database = new Map();\n\n if (data.type === 'i18n') {\n await Promise.all(\n Object.entries(data.data).map(async ([k, v]) => {\n const db = await initOrama(k);\n\n load(db, v);\n dbs.set(k, {\n type: v.type,\n db,\n });\n }),\n );\n\n return dbs;\n }\n\n const db = await initOrama();\n load(db, data);\n dbs.set('', {\n type: data.type,\n db,\n });\n return dbs;\n }\n\n const result = init();\n cache.set(cacheKey, result);\n return result;\n}\n\nexport async function search(query: string, options: StaticOptions) {\n const { tag, locale } = options;\n\n const db = (await loadDB(options)).get(locale ?? '');\n\n if (!db) return [];\n if (db.type === 'simple') return searchSimple(db as unknown as Orama<typeof simpleSchema>, query);\n\n return searchAdvanced(db.db as Orama<typeof advancedSchema>, query, tag);\n}\n"],"mappings":";;;;AA2BA,MAAM,wBAAQ,IAAI,KAAgC;AAWlD,eAAe,OAAO,EACpB,OAAO,eACP,aAAa,WAAW,OAAO;CAAE,QAAQ,EAAE,GAAG,UAAU;CAAE,UAAU;CAAQ,CAAC,IAC1C;CACnC,MAAM,WAAW;CACjB,MAAM,SAAS,MAAM,IAAI,SAAS;AAClC,KAAI,OAAQ,QAAO;CAEnB,eAAe,OAAO;EACpB,MAAM,MAAM,MAAM,MAAM,KAAK;AAE7B,MAAI,CAAC,IAAI,GACP,OAAM,IAAI,MACR,gDAAgD,KAAK,uEACtD;EAEH,MAAM,OAAQ,MAAM,IAAI,MAAM;EAC9B,MAAMA,sBAAgB,IAAI,KAAK;AAE/B,MAAI,KAAK,SAAS,QAAQ;AACxB,SAAM,QAAQ,IACZ,OAAO,QAAQ,KAAK,KAAK,CAAC,IAAI,OAAO,CAAC,GAAG,OAAO;IAC9C,MAAMC,OAAK,MAAM,UAAU,EAAE;AAE7B,SAAKA,MAAI,EAAE;AACX,QAAI,IAAI,GAAG;KACT,MAAM,EAAE;KACR;KACD,CAAC;KACF,CACH;AAED,UAAO;;EAGT,MAAM,KAAK,MAAM,WAAW;AAC5B,OAAK,IAAI,KAAK;AACd,MAAI,IAAI,IAAI;GACV,MAAM,KAAK;GACX;GACD,CAAC;AACF,SAAO;;CAGT,MAAM,SAAS,MAAM;AACrB,OAAM,IAAI,UAAU,OAAO;AAC3B,QAAO;;AAGT,eAAsB,OAAO,OAAe,SAAwB;CAClE,MAAM,EAAE,KAAK,WAAW;CAExB,MAAM,MAAM,MAAM,OAAO,QAAQ,EAAE,IAAI,UAAU,GAAG;AAEpD,KAAI,CAAC,GAAI,QAAO,EAAE;AAClB,KAAI,GAAG,SAAS,SAAU,QAAO,aAAa,IAA6C,MAAM;AAEjG,QAAO,eAAe,GAAG,IAAoC,OAAO,IAAI"}
package/dist/toc.d.ts CHANGED
@@ -1,10 +1,11 @@
1
- import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import { ReactNode, RefObject, ComponentProps } from 'react';
1
+ import { ComponentProps, ReactNode, RefObject } from "react";
2
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
3
3
 
4
+ //#region src/toc.d.ts
4
5
  interface TOCItemType {
5
- title: ReactNode;
6
- url: string;
7
- depth: number;
6
+ title: ReactNode;
7
+ url: string;
8
+ depth: number;
8
9
  }
9
10
  type TableOfContents = TOCItemType[];
10
11
  /**
@@ -16,28 +17,40 @@ declare function useActiveAnchor(): string | undefined;
16
17
  */
17
18
  declare function useActiveAnchors(): string[];
18
19
  interface AnchorProviderProps {
19
- toc: TableOfContents;
20
- /**
21
- * Only accept one active item at most
22
- *
23
- * @defaultValue false
24
- */
25
- single?: boolean;
26
- children?: ReactNode;
20
+ toc: TableOfContents;
21
+ /**
22
+ * Only accept one active item at most
23
+ *
24
+ * @defaultValue false
25
+ */
26
+ single?: boolean;
27
+ children?: ReactNode;
27
28
  }
28
29
  interface ScrollProviderProps {
29
- /**
30
- * Scroll into the view of container when active
31
- */
32
- containerRef: RefObject<HTMLElement | null>;
33
- children?: ReactNode;
30
+ /**
31
+ * Scroll into the view of container when active
32
+ */
33
+ containerRef: RefObject<HTMLElement | null>;
34
+ children?: ReactNode;
34
35
  }
35
- declare function ScrollProvider({ containerRef, children, }: ScrollProviderProps): react_jsx_runtime.JSX.Element;
36
- declare function AnchorProvider({ toc, single, children, }: AnchorProviderProps): react_jsx_runtime.JSX.Element;
36
+ declare function ScrollProvider({
37
+ containerRef,
38
+ children
39
+ }: ScrollProviderProps): react_jsx_runtime0.JSX.Element;
40
+ declare function AnchorProvider({
41
+ toc,
42
+ single,
43
+ children
44
+ }: AnchorProviderProps): react_jsx_runtime0.JSX.Element;
37
45
  interface TOCItemProps extends Omit<ComponentProps<'a'>, 'href'> {
38
- href: string;
39
- onActiveChange?: (v: boolean) => void;
46
+ href: string;
47
+ onActiveChange?: (v: boolean) => void;
40
48
  }
41
- declare function TOCItem({ ref, onActiveChange, ...props }: TOCItemProps): react_jsx_runtime.JSX.Element;
42
-
43
- export { AnchorProvider, type AnchorProviderProps, ScrollProvider, type ScrollProviderProps, TOCItem, type TOCItemProps, type TOCItemType, type TableOfContents, useActiveAnchor, useActiveAnchors };
49
+ declare function TOCItem({
50
+ ref,
51
+ onActiveChange,
52
+ ...props
53
+ }: TOCItemProps): react_jsx_runtime0.JSX.Element;
54
+ //#endregion
55
+ export { AnchorProvider, AnchorProviderProps, ScrollProvider, ScrollProviderProps, TOCItem, TOCItemProps, TOCItemType, TableOfContents, useActiveAnchor, useActiveAnchors };
56
+ //# sourceMappingURL=toc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toc.d.ts","names":[],"sources":["../src/toc.tsx"],"sourcesContent":[],"mappings":";;;;UAiBiB,WAAA;SACR;;EADQ,KAAA,EAAA,MAAA;AAMjB;AAWgB,KAXJ,eAAA,GAAkB,WAWC,EAAA;AAO/B;AAIA;AAWA;AAI0B,iBA1BV,eAAA,CAAA,CA0BU,EAAA,MAAA,GAAA,SAAA;;;;AAKV,iBAxBA,gBAAA,CAAA,CAwBc,EAAA,MAAA,EAAA;AAAG,UApBhB,mBAAA,CAoBgB;EAAc,GAAA,EAnBxC,eAmBwC;EAAY;;;AAI3D;;EAAsC,MAAA,CAAA,EAAA,OAAA;EAAgB,QAAA,CAAA,EAhBzC,SAgByC;;AAA+B,UAbpE,mBAAA,CAaoE;EAAA;AAYrF;AAKA;EAA0B,YAAA,EA1BV,SA0BU,CA1BA,WA0BA,GAAA,IAAA,CAAA;EAAK,QAAA,CAAA,EAxBlB,SAwBkB;;AAAqD,iBArBpE,cAAA,CAqBoE;EAAA,YAAA;EAAA;AAAA,CAAA,EArBzB,mBAqByB,CAAA,EArBN,kBAAA,CAAA,GAAA,CAAA,OAqBM;AAAA,iBAjBpE,cAAA,CAiBoE;EAAA,GAAA;EAAA,MAAA;EAAA;AAAA,CAAA,EAjBlB,mBAiBkB,CAAA,EAjBC,kBAAA,CAAA,GAAA,CAAA,OAiBD;UALnE,YAAA,SAAqB,KAAK;;;;iBAK3B,OAAA;;;;GAAwD,eAAY,kBAAA,CAAA,GAAA,CAAA"}