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":"server.js","names":["search","mapTo: PartialSchemaDeep<AdvancedDocument>[]","breadcrumbs: string[] | undefined","structuredData: StructuredData | undefined","STEMMERS: Record<string, string>"],"sources":["../../src/search/orama/create-endpoint.ts","../../src/search/orama/create-db.ts","../../src/search/orama/create-from-source.ts","../../src/search/orama/_stemmers.ts","../../src/search/orama/create-i18n.ts","../../src/search/server.ts"],"sourcesContent":["import { type SearchAPI, type SearchServer } from '@/search/server';\n\nexport function createEndpoint(server: SearchServer): SearchAPI {\n const { search } = server;\n\n return {\n ...server,\n async staticGET() {\n return Response.json(await server.export());\n },\n async GET(request) {\n const url = new URL(request.url);\n const query = url.searchParams.get('query');\n if (!query) return Response.json([]);\n\n return Response.json(\n await search(query, {\n tag: url.searchParams.get('tag')?.split(',') ?? undefined,\n locale: url.searchParams.get('locale') ?? undefined,\n mode: url.searchParams.get('mode') === 'vector' ? 'vector' : 'full',\n }),\n );\n },\n };\n}\n","import {\n create,\n insertMultiple,\n type Orama,\n type PartialSchemaDeep,\n type TypedDocument,\n} from '@orama/orama';\nimport { type AdvancedOptions, type SimpleOptions } from '@/search/server';\n\nexport type SimpleDocument = TypedDocument<Orama<typeof simpleSchema>>;\nexport const simpleSchema = {\n url: 'string',\n title: 'string',\n breadcrumbs: 'string[]',\n description: 'string',\n content: 'string',\n keywords: 'string',\n} as const;\n\nexport type AdvancedDocument = TypedDocument<Orama<typeof advancedSchema>>;\nexport const advancedSchema = {\n content: 'string',\n page_id: 'string',\n type: 'string',\n breadcrumbs: 'string[]',\n tags: 'enum[]',\n url: 'string',\n embeddings: 'vector[512]',\n} as const;\n\nexport async function createDB({\n indexes,\n tokenizer,\n search: _,\n ...rest\n}: AdvancedOptions): Promise<Orama<typeof advancedSchema>> {\n const items = typeof indexes === 'function' ? await indexes() : indexes;\n\n const db = create({\n schema: advancedSchema,\n ...rest,\n components: {\n ...rest.components,\n tokenizer: tokenizer ?? rest.components?.tokenizer,\n },\n }) as Orama<typeof advancedSchema>;\n\n const mapTo: PartialSchemaDeep<AdvancedDocument>[] = [];\n items.forEach((page) => {\n const pageTag = page.tag ?? [];\n const tags = Array.isArray(pageTag) ? pageTag : [pageTag];\n const data = page.structuredData;\n let id = 0;\n\n mapTo.push({\n id: page.id,\n page_id: page.id,\n type: 'page',\n content: page.title,\n breadcrumbs: page.breadcrumbs,\n tags,\n url: page.url,\n });\n\n const nextId = () => `${page.id}-${id++}`;\n\n if (page.description) {\n mapTo.push({\n id: nextId(),\n page_id: page.id,\n tags,\n type: 'text',\n url: page.url,\n content: page.description,\n });\n }\n\n for (const heading of data.headings) {\n mapTo.push({\n id: nextId(),\n page_id: page.id,\n type: 'heading',\n tags,\n url: `${page.url}#${heading.id}`,\n content: heading.content,\n });\n }\n\n for (const content of data.contents) {\n mapTo.push({\n id: nextId(),\n page_id: page.id,\n tags,\n type: 'text',\n url: content.heading ? `${page.url}#${content.heading}` : page.url,\n content: content.content,\n });\n }\n });\n\n await insertMultiple(db, mapTo);\n return db;\n}\n\nexport async function createDBSimple({\n indexes,\n tokenizer,\n ...rest\n}: SimpleOptions): Promise<Orama<typeof simpleSchema>> {\n const items = typeof indexes === 'function' ? await indexes() : indexes;\n const db = create({\n schema: simpleSchema,\n ...rest,\n components: {\n ...rest.components,\n tokenizer: tokenizer ?? rest.components?.tokenizer,\n },\n }) as Orama<typeof simpleSchema>;\n\n await insertMultiple(\n db,\n items.map((page) => ({\n title: page.title,\n description: page.description,\n breadcrumbs: page.breadcrumbs,\n url: page.url,\n content: page.content,\n keywords: page.keywords,\n })),\n );\n\n return db;\n}\n","import {\n type AdvancedIndex,\n type AdvancedOptions,\n createI18nSearchAPI,\n createSearchAPI,\n type SearchAPI,\n} from '@/search/server';\nimport type { LoaderConfig, LoaderOutput, Page } from '@/source';\nimport { type StructuredData } from '@/mdx-plugins';\nimport { basename, extname } from '@/source/path';\nimport type { I18nConfig } from '@/i18n';\nimport type { Language } from '@orama/orama';\nimport { findPath } from '@/page-tree/utils';\n\ntype Awaitable<T> = T | Promise<T>;\n\nfunction defaultBuildIndex<C extends LoaderConfig>(source: LoaderOutput<C>) {\n function isBreadcrumbItem(item: unknown): item is string {\n return typeof item === 'string' && item.length > 0;\n }\n\n return async (page: Page): Promise<AdvancedIndex> => {\n let breadcrumbs: string[] | undefined;\n let structuredData: StructuredData | undefined;\n\n if ('structuredData' in page.data) {\n structuredData = page.data.structuredData as StructuredData;\n } else if ('load' in page.data && typeof page.data.load === 'function') {\n structuredData = (await page.data.load()).structuredData;\n }\n\n if (!structuredData)\n throw new Error(\n 'Cannot find structured data from page, please define the page to index function.',\n );\n\n const pageTree = source.getPageTree(page.locale);\n const path = findPath(\n pageTree.children,\n (node) => node.type === 'page' && node.url === page.url,\n );\n if (path) {\n breadcrumbs = [];\n path.pop();\n\n if (isBreadcrumbItem(pageTree.name)) {\n breadcrumbs.push(pageTree.name);\n }\n\n for (const segment of path) {\n if (!isBreadcrumbItem(segment.name)) continue;\n\n breadcrumbs.push(segment.name);\n }\n }\n\n return {\n title: page.data.title ?? basename(page.path, extname(page.path)),\n breadcrumbs,\n description: page.data.description,\n url: page.url,\n id: page.url,\n structuredData,\n };\n };\n}\n\ninterface Options<C extends LoaderConfig> extends Omit<AdvancedOptions, 'indexes'> {\n localeMap?: {\n [K in C['i18n'] extends I18nConfig<infer Languages> ? Languages : string]?:\n | Partial<AdvancedOptions>\n | Language;\n };\n buildIndex?: (page: Page<C['source']['pageData']>) => Awaitable<AdvancedIndex>;\n}\n\nexport function createFromSource<C extends LoaderConfig>(\n source: LoaderOutput<C>,\n options?: Options<C>,\n): SearchAPI;\n\nexport function createFromSource<C extends LoaderConfig>(\n source: LoaderOutput<C>,\n options: Options<C> = {},\n): SearchAPI {\n const { buildIndex = defaultBuildIndex(source) } = options;\n\n if (source._i18n) {\n return createI18nSearchAPI('advanced', {\n ...options,\n i18n: source._i18n,\n indexes: async () => {\n const indexes = source.getLanguages().flatMap((entry) => {\n return entry.pages.map(async (page) => ({\n ...(await buildIndex(page)),\n locale: entry.language,\n }));\n });\n\n return Promise.all(indexes);\n },\n });\n }\n\n return createSearchAPI('advanced', {\n ...options,\n indexes: async () => {\n const indexes = source.getPages().map((page) => buildIndex(page));\n\n return Promise.all(indexes);\n },\n });\n}\n","/* Cloned from https://github.com/oramasearch/orama/blob/main/packages/orama/src/components/tokenizer/languages.ts */\nexport const STEMMERS: Record<string, string> = {\n arabic: 'ar',\n armenian: 'am',\n bulgarian: 'bg',\n czech: 'cz',\n danish: 'dk',\n dutch: 'nl',\n english: 'en',\n finnish: 'fi',\n french: 'fr',\n german: 'de',\n greek: 'gr',\n hungarian: 'hu',\n indian: 'in',\n indonesian: 'id',\n irish: 'ie',\n italian: 'it',\n lithuanian: 'lt',\n nepali: 'np',\n norwegian: 'no',\n portuguese: 'pt',\n romanian: 'ro',\n russian: 'ru',\n serbian: 'rs',\n slovenian: 'ru',\n spanish: 'es',\n swedish: 'se',\n tamil: 'ta',\n turkish: 'tr',\n ukrainian: 'uk',\n sanskrit: 'sk',\n};\n","import { type Language, type Tokenizer } from '@orama/orama';\nimport {\n type AdvancedIndex,\n type AdvancedOptions,\n type Dynamic,\n type Index,\n initAdvancedSearch,\n initSimpleSearch,\n type SearchAPI,\n type SearchServer,\n type SimpleOptions,\n} from '@/search/server';\nimport { createEndpoint } from '@/search/orama/create-endpoint';\nimport { type I18nConfig } from '@/i18n';\nimport { STEMMERS } from '@/search/orama/_stemmers';\n\ntype I18nOptions<O extends SimpleOptions | AdvancedOptions, Idx> = Omit<\n O,\n 'language' | 'indexes'\n> & {\n i18n: I18nConfig;\n\n /**\n * Map locale name from i18n config to Orama compatible `language` or options\n */\n localeMap?: Record<string, Language | Partial<O> | undefined>;\n\n indexes: WithLocale<Idx>[] | Dynamic<WithLocale<Idx>>;\n};\n\ntype I18nSimpleOptions = I18nOptions<SimpleOptions, Index>;\ntype I18nAdvancedOptions = I18nOptions<AdvancedOptions, AdvancedIndex>;\n\ntype WithLocale<T> = T & {\n locale: string;\n};\n\nasync function getTokenizer(\n locale: string,\n): Promise<{ language: string } | { tokenizer: Tokenizer }> {\n return {\n language: Object.keys(STEMMERS).find((lang) => STEMMERS[lang] === locale) ?? locale,\n };\n}\n\nasync function initSimple(options: I18nSimpleOptions): Promise<Map<string, SearchServer>> {\n const map = new Map<string, SearchServer>();\n if (options.i18n.languages.length === 0) {\n return map;\n }\n\n const indexes = typeof options.indexes === 'function' ? await options.indexes() : options.indexes;\n\n for (const locale of options.i18n.languages) {\n const localeIndexes = indexes.filter((index) => index.locale === locale);\n const mapped = options.localeMap?.[locale] ?? (await getTokenizer(locale));\n\n map.set(\n locale,\n typeof mapped === 'object'\n ? initSimpleSearch({\n ...options,\n ...mapped,\n indexes: localeIndexes,\n })\n : initSimpleSearch({\n ...options,\n language: mapped,\n indexes: localeIndexes,\n }),\n );\n }\n\n return map;\n}\n\nasync function initAdvanced(options: I18nAdvancedOptions): Promise<Map<string, SearchServer>> {\n const map = new Map<string, SearchServer>();\n if (options.i18n.languages.length === 0) {\n return map;\n }\n\n const indexes = typeof options.indexes === 'function' ? await options.indexes() : options.indexes;\n\n for (const locale of options.i18n.languages) {\n const localeIndexes = indexes.filter((index) => index.locale === locale);\n const mapped = options.localeMap?.[locale] ?? (await getTokenizer(locale));\n\n map.set(\n locale,\n typeof mapped === 'object'\n ? initAdvancedSearch({\n ...options,\n indexes: localeIndexes,\n ...mapped,\n })\n : initAdvancedSearch({\n ...options,\n language: mapped,\n indexes: localeIndexes,\n }),\n );\n }\n\n return map;\n}\n\nexport function createI18nSearchAPI<T extends 'simple' | 'advanced'>(\n type: T,\n options: T extends 'simple' ? I18nSimpleOptions : I18nAdvancedOptions,\n): SearchAPI {\n const get =\n type === 'simple'\n ? initSimple(options as I18nSimpleOptions)\n : initAdvanced(options as I18nAdvancedOptions);\n return createEndpoint({\n async export() {\n const map = await get;\n const entries = Array.from(map.entries()).map(async ([k, v]) => [\n k,\n await (v as SearchServer).export(),\n ]);\n\n return {\n type: 'i18n',\n data: Object.fromEntries(await Promise.all(entries)),\n };\n },\n async search(query, searchOptions) {\n const map = await get;\n\n const locale = searchOptions?.locale ?? options.i18n.defaultLanguage;\n const handler = map.get(locale);\n\n if (handler) return handler.search(query, searchOptions);\n return [];\n },\n });\n}\n","import { create, type Orama, type RawData, save, type SearchParams } from '@orama/orama';\nimport type { StructuredData } from '@/mdx-plugins/remark-structure';\nimport { createEndpoint } from '@/search/orama/create-endpoint';\nimport {\n type AdvancedDocument,\n type advancedSchema,\n createDB,\n createDBSimple,\n type SimpleDocument,\n simpleSchema,\n} from '@/search/orama/create-db';\nimport { searchSimple } from '@/search/orama/search/simple';\nimport { searchAdvanced } from '@/search/orama/search/advanced';\nimport type { SortedResult } from '@/search';\n\ntype SearchType = 'simple' | 'advanced';\n\nexport type ExportedData =\n | (RawData & { type: SearchType })\n | {\n type: 'i18n';\n data: Record<string, RawData & { type: SearchType }>;\n };\n\nexport interface SearchServer {\n search: (\n query: string,\n options?: {\n locale?: string;\n tag?: string | string[];\n mode?: 'vector' | 'full';\n },\n ) => Promise<SortedResult[]>;\n\n /**\n * Export the database\n *\n * You can reference the exported database to implement client-side search\n */\n export: () => Promise<ExportedData>;\n}\n\nexport interface SearchAPI extends SearchServer {\n GET: (request: Request) => Promise<Response>;\n\n /**\n * `GET` route handler that exports search indexes for static search.\n */\n staticGET: () => Promise<Response>;\n}\n\n/**\n * Resolve indexes dynamically\n */\nexport type Dynamic<T> = () => T[] | Promise<T[]>;\n\ntype OramaInput = Parameters<typeof create>[0];\n\ntype SharedOptions = Pick<OramaInput, 'sort' | 'components' | 'plugins'> & {\n language?: string;\n tokenizer?: Required<OramaInput>['components']['tokenizer'];\n};\n\nexport interface SimpleOptions extends SharedOptions {\n indexes: Index[] | Dynamic<Index>;\n\n /**\n * Customise search options on server\n */\n search?: Partial<SearchParams<Orama<typeof simpleSchema>, SimpleDocument>>;\n}\n\nexport interface AdvancedOptions extends SharedOptions {\n indexes: AdvancedIndex[] | Dynamic<AdvancedIndex>;\n\n /**\n * Customise search options on server\n */\n search?: Partial<SearchParams<Orama<typeof advancedSchema>, AdvancedDocument>>;\n}\n\nexport function createSearchAPI<T extends SearchType>(\n type: T,\n options: T extends 'simple' ? SimpleOptions : AdvancedOptions,\n): SearchAPI {\n if (type === 'simple') {\n return createEndpoint(initSimpleSearch(options as SimpleOptions));\n }\n\n return createEndpoint(initAdvancedSearch(options as AdvancedOptions));\n}\n\nexport interface Index {\n title: string;\n description?: string;\n breadcrumbs?: string[];\n content: string;\n url: string;\n keywords?: string;\n}\n\nexport function initSimpleSearch(options: SimpleOptions): SearchServer {\n const doc = createDBSimple(options);\n\n return {\n async export() {\n return {\n type: 'simple',\n ...save(await doc),\n };\n },\n async search(query) {\n const db = await doc;\n\n return searchSimple(db, query, options.search);\n },\n };\n}\n\nexport interface AdvancedIndex {\n id: string;\n title: string;\n description?: string;\n breadcrumbs?: string[];\n\n /**\n * Required if tag filter is enabled\n */\n tag?: string | string[];\n\n /**\n * preprocess mdx content with `structure`\n */\n structuredData: StructuredData;\n url: string;\n}\n\nexport function initAdvancedSearch(options: AdvancedOptions): SearchServer {\n const get = createDB(options);\n\n return {\n async export() {\n return {\n type: 'advanced',\n ...save(await get),\n };\n },\n async search(query, searchOptions) {\n const db = await get;\n const mode = searchOptions?.mode;\n\n return searchAdvanced(db, query, searchOptions?.tag, {\n ...options.search,\n mode: mode === 'vector' ? 'vector' : 'fulltext',\n }).catch((err) => {\n if (mode === 'vector') {\n throw new Error(\n 'failed to search, make sure you have installed `@orama/plugin-embeddings` according to their docs.',\n {\n cause: err,\n },\n );\n }\n\n throw err;\n });\n },\n };\n}\n\nexport { createFromSource } from './orama/create-from-source';\nexport { createI18nSearchAPI } from './orama/create-i18n';\nexport * from './index';\n"],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ //#region src/search/index.ts
2
+ function escapeRegExp(input) {
3
+ return input.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
4
+ }
5
+ function buildRegexFromQuery(q) {
6
+ const trimmed = q.trim();
7
+ if (trimmed.length === 0) return null;
8
+ const terms = Array.from(new Set(trimmed.split(/\s+/).map((t) => t.trim()).filter(Boolean)));
9
+ if (terms.length === 0) return null;
10
+ const escaped = terms.map(escapeRegExp).join("|");
11
+ return new RegExp(`(${escaped})`, "gi");
12
+ }
13
+ function createContentHighlighter(query) {
14
+ const regex = typeof query === "string" ? buildRegexFromQuery(query) : query;
15
+ return { highlight(content) {
16
+ if (!regex) return [{
17
+ type: "text",
18
+ content
19
+ }];
20
+ const out = [];
21
+ let i = 0;
22
+ for (const match of content.matchAll(regex)) {
23
+ if (i < match.index) out.push({
24
+ type: "text",
25
+ content: content.substring(i, match.index)
26
+ });
27
+ out.push({
28
+ type: "text",
29
+ content: match[0],
30
+ styles: { highlight: true }
31
+ });
32
+ i = match.index + match[0].length;
33
+ }
34
+ if (i < content.length) out.push({
35
+ type: "text",
36
+ content: content.substring(i)
37
+ });
38
+ return out;
39
+ } };
40
+ }
41
+
42
+ //#endregion
43
+ export { createContentHighlighter as t };
44
+ //# sourceMappingURL=search-DcH54N2x.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-DcH54N2x.js","names":["out: HighlightedText[]"],"sources":["../src/search/index.ts"],"sourcesContent":["import type { ReactNode } from 'react';\n\nexport interface SortedResult<Content = string> {\n id: string;\n url: string;\n type: 'page' | 'heading' | 'text';\n content: Content;\n\n /**\n * breadcrumbs to be displayed on UI\n */\n breadcrumbs?: Content[];\n contentWithHighlights?: HighlightedText<Content>[];\n}\n\nexport type ReactSortedResult = SortedResult<ReactNode>;\n\nexport interface HighlightedText<Content = string> {\n type: 'text';\n content: Content;\n styles?: {\n highlight?: boolean;\n };\n}\n\nfunction escapeRegExp(input: string): string {\n return input.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nfunction buildRegexFromQuery(q: string): RegExp | null {\n const trimmed = q.trim();\n if (trimmed.length === 0) return null;\n const terms = Array.from(\n new Set(\n trimmed\n .split(/\\s+/)\n .map((t) => t.trim())\n .filter(Boolean),\n ),\n );\n if (terms.length === 0) return null;\n const escaped = terms.map(escapeRegExp).join('|');\n return new RegExp(`(${escaped})`, 'gi');\n}\n\nexport function createContentHighlighter(query: string | RegExp) {\n const regex = typeof query === 'string' ? buildRegexFromQuery(query) : query;\n\n return {\n highlight(content: string): HighlightedText[] {\n if (!regex) return [{ type: 'text', content }];\n const out: HighlightedText[] = [];\n\n let i = 0;\n for (const match of content.matchAll(regex)) {\n if (i < match.index) {\n out.push({\n type: 'text',\n content: content.substring(i, match.index),\n });\n }\n\n out.push({\n type: 'text',\n content: match[0],\n styles: {\n highlight: true,\n },\n });\n\n i = match.index + match[0].length;\n }\n\n if (i < content.length) {\n out.push({\n type: 'text',\n content: content.substring(i),\n });\n }\n\n return out;\n },\n };\n}\n"],"mappings":";AAyBA,SAAS,aAAa,OAAuB;AAC3C,QAAO,MAAM,QAAQ,uBAAuB,OAAO;;AAGrD,SAAS,oBAAoB,GAA0B;CACrD,MAAM,UAAU,EAAE,MAAM;AACxB,KAAI,QAAQ,WAAW,EAAG,QAAO;CACjC,MAAM,QAAQ,MAAM,KAClB,IAAI,IACF,QACG,MAAM,MAAM,CACZ,KAAK,MAAM,EAAE,MAAM,CAAC,CACpB,OAAO,QAAQ,CACnB,CACF;AACD,KAAI,MAAM,WAAW,EAAG,QAAO;CAC/B,MAAM,UAAU,MAAM,IAAI,aAAa,CAAC,KAAK,IAAI;AACjD,QAAO,IAAI,OAAO,IAAI,QAAQ,IAAI,KAAK;;AAGzC,SAAgB,yBAAyB,OAAwB;CAC/D,MAAM,QAAQ,OAAO,UAAU,WAAW,oBAAoB,MAAM,GAAG;AAEvE,QAAO,EACL,UAAU,SAAoC;AAC5C,MAAI,CAAC,MAAO,QAAO,CAAC;GAAE,MAAM;GAAQ;GAAS,CAAC;EAC9C,MAAMA,MAAyB,EAAE;EAEjC,IAAI,IAAI;AACR,OAAK,MAAM,SAAS,QAAQ,SAAS,MAAM,EAAE;AAC3C,OAAI,IAAI,MAAM,MACZ,KAAI,KAAK;IACP,MAAM;IACN,SAAS,QAAQ,UAAU,GAAG,MAAM,MAAM;IAC3C,CAAC;AAGJ,OAAI,KAAK;IACP,MAAM;IACN,SAAS,MAAM;IACf,QAAQ,EACN,WAAW,MACZ;IACF,CAAC;AAEF,OAAI,MAAM,QAAQ,MAAM,GAAG;;AAG7B,MAAI,IAAI,QAAQ,OACd,KAAI,KAAK;GACP,MAAM;GACN,SAAS,QAAQ,UAAU,EAAE;GAC9B,CAAC;AAGJ,SAAO;IAEV"}
@@ -0,0 +1,133 @@
1
+ import { n as StructuredData } from "./remark-structure-CszwnaMR.js";
2
+ import { t as I18nConfig } from "./index-BhVrX5J1.js";
3
+ import { SortedResult } from "./search/index.js";
4
+ import { i as LoaderConfig, o as LoaderOutput, u as Page } from "./index-Co_C8NEi.js";
5
+ import { Language, Orama, RawData, SearchParams, TypedDocument, create } from "@orama/orama";
6
+
7
+ //#region src/search/orama/create-db.d.ts
8
+ type SimpleDocument = TypedDocument<Orama<typeof simpleSchema>>;
9
+ declare const simpleSchema: {
10
+ readonly url: "string";
11
+ readonly title: "string";
12
+ readonly breadcrumbs: "string[]";
13
+ readonly description: "string";
14
+ readonly content: "string";
15
+ readonly keywords: "string";
16
+ };
17
+ type AdvancedDocument = TypedDocument<Orama<typeof advancedSchema>>;
18
+ declare const advancedSchema: {
19
+ readonly content: "string";
20
+ readonly page_id: "string";
21
+ readonly type: "string";
22
+ readonly breadcrumbs: "string[]";
23
+ readonly tags: "enum[]";
24
+ readonly url: "string";
25
+ readonly embeddings: "vector[512]";
26
+ };
27
+ //#endregion
28
+ //#region src/search/orama/create-from-source.d.ts
29
+ type Awaitable<T> = T | Promise<T>;
30
+ interface Options<C extends LoaderConfig> extends Omit<AdvancedOptions, 'indexes'> {
31
+ localeMap?: { [K in C['i18n'] extends I18nConfig<infer Languages> ? Languages : string]?: Partial<AdvancedOptions> | Language };
32
+ buildIndex?: (page: Page<C['source']['pageData']>) => Awaitable<AdvancedIndex>;
33
+ }
34
+ declare function createFromSource<C extends LoaderConfig>(source: LoaderOutput<C>, options?: Options<C>): SearchAPI;
35
+ //#endregion
36
+ //#region src/search/orama/create-i18n.d.ts
37
+ type I18nOptions<O extends SimpleOptions | AdvancedOptions, Idx> = Omit<O, 'language' | 'indexes'> & {
38
+ i18n: I18nConfig;
39
+ /**
40
+ * Map locale name from i18n config to Orama compatible `language` or options
41
+ */
42
+ localeMap?: Record<string, Language | Partial<O> | undefined>;
43
+ indexes: WithLocale<Idx>[] | Dynamic<WithLocale<Idx>>;
44
+ };
45
+ type I18nSimpleOptions = I18nOptions<SimpleOptions, Index>;
46
+ type I18nAdvancedOptions = I18nOptions<AdvancedOptions, AdvancedIndex>;
47
+ type WithLocale<T> = T & {
48
+ locale: string;
49
+ };
50
+ declare function createI18nSearchAPI<T extends 'simple' | 'advanced'>(type: T, options: T extends 'simple' ? I18nSimpleOptions : I18nAdvancedOptions): SearchAPI;
51
+ //#endregion
52
+ //#region src/search/server.d.ts
53
+ type SearchType = 'simple' | 'advanced';
54
+ type ExportedData = (RawData & {
55
+ type: SearchType;
56
+ }) | {
57
+ type: 'i18n';
58
+ data: Record<string, RawData & {
59
+ type: SearchType;
60
+ }>;
61
+ };
62
+ interface SearchServer {
63
+ search: (query: string, options?: {
64
+ locale?: string;
65
+ tag?: string | string[];
66
+ mode?: 'vector' | 'full';
67
+ }) => Promise<SortedResult[]>;
68
+ /**
69
+ * Export the database
70
+ *
71
+ * You can reference the exported database to implement client-side search
72
+ */
73
+ export: () => Promise<ExportedData>;
74
+ }
75
+ interface SearchAPI extends SearchServer {
76
+ GET: (request: Request) => Promise<Response>;
77
+ /**
78
+ * `GET` route handler that exports search indexes for static search.
79
+ */
80
+ staticGET: () => Promise<Response>;
81
+ }
82
+ /**
83
+ * Resolve indexes dynamically
84
+ */
85
+ type Dynamic<T> = () => T[] | Promise<T[]>;
86
+ type OramaInput = Parameters<typeof create>[0];
87
+ type SharedOptions = Pick<OramaInput, 'sort' | 'components' | 'plugins'> & {
88
+ language?: string;
89
+ tokenizer?: Required<OramaInput>['components']['tokenizer'];
90
+ };
91
+ interface SimpleOptions extends SharedOptions {
92
+ indexes: Index[] | Dynamic<Index>;
93
+ /**
94
+ * Customise search options on server
95
+ */
96
+ search?: Partial<SearchParams<Orama<typeof simpleSchema>, SimpleDocument>>;
97
+ }
98
+ interface AdvancedOptions extends SharedOptions {
99
+ indexes: AdvancedIndex[] | Dynamic<AdvancedIndex>;
100
+ /**
101
+ * Customise search options on server
102
+ */
103
+ search?: Partial<SearchParams<Orama<typeof advancedSchema>, AdvancedDocument>>;
104
+ }
105
+ declare function createSearchAPI<T extends SearchType>(type: T, options: T extends 'simple' ? SimpleOptions : AdvancedOptions): SearchAPI;
106
+ interface Index {
107
+ title: string;
108
+ description?: string;
109
+ breadcrumbs?: string[];
110
+ content: string;
111
+ url: string;
112
+ keywords?: string;
113
+ }
114
+ declare function initSimpleSearch(options: SimpleOptions): SearchServer;
115
+ interface AdvancedIndex {
116
+ id: string;
117
+ title: string;
118
+ description?: string;
119
+ breadcrumbs?: string[];
120
+ /**
121
+ * Required if tag filter is enabled
122
+ */
123
+ tag?: string | string[];
124
+ /**
125
+ * preprocess mdx content with `structure`
126
+ */
127
+ structuredData: StructuredData;
128
+ url: string;
129
+ }
130
+ declare function initAdvancedSearch(options: AdvancedOptions): SearchServer;
131
+ //#endregion
132
+ export { Index as a, SimpleOptions as c, initSimpleSearch as d, createI18nSearchAPI as f, ExportedData as i, createSearchAPI as l, AdvancedOptions as n, SearchAPI as o, createFromSource as p, Dynamic as r, SearchServer as s, AdvancedIndex as t, initAdvancedSearch as u };
133
+ //# sourceMappingURL=server-BzFuYBxW.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-BzFuYBxW.d.ts","names":[],"sources":["../src/search/orama/create-db.ts","../src/search/orama/create-from-source.ts","../src/search/orama/create-i18n.ts","../src/search/server.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import { ReactNode } from "react";
2
+ import { Components, Options } from "hast-util-to-jsx-runtime";
3
+ import { BundledHighlighterOptions, BundledLanguage, CodeOptionsMeta, CodeOptionsThemes, CodeToHastOptionsCommon, Highlighter } from "shiki";
4
+ import { Root } from "hast";
5
+ import { BundledTheme } from "shiki/themes";
6
+
7
+ //#region src/highlight/shiki.d.ts
8
+
9
+ type HighlightOptionsCommon = CodeToHastOptionsCommon<BundledLanguage> & CodeOptionsMeta & {
10
+ /**
11
+ * The Regex Engine for Shiki
12
+ *
13
+ * @defaultValue 'js'
14
+ */
15
+ engine?: 'js' | 'oniguruma';
16
+ components?: Partial<Components>;
17
+ fallbackLanguage?: BundledLanguage;
18
+ };
19
+ type HighlightOptionsThemes = CodeOptionsThemes<BundledTheme>;
20
+ type HighlightOptions = HighlightOptionsCommon & (HighlightOptionsThemes | Record<never, never>);
21
+ declare function highlightHast(code: string, options: HighlightOptions): Promise<Root>;
22
+ declare function hastToJsx(hast: Root, options?: Partial<Options>): JSX.Element;
23
+ /**
24
+ * Get Shiki highlighter instance of Fumadocs (mostly for internal use, you should use Shiki directly over this).
25
+ *
26
+ * @param engineType - Shiki Regex engine to use.
27
+ * @param options - Shiki options.
28
+ */
29
+ declare function getHighlighter(engineType: 'js' | 'oniguruma', options: Omit<BundledHighlighterOptions<BundledLanguage, BundledTheme>, 'engine'>): Promise<Highlighter>;
30
+ declare function highlight(code: string, options: HighlightOptions): Promise<ReactNode>;
31
+ //#endregion
32
+ export { hastToJsx as a, getHighlighter as i, HighlightOptionsCommon as n, highlight as o, HighlightOptionsThemes as r, highlightHast as s, HighlightOptions as t };
33
+ //# sourceMappingURL=shiki-Bdk0JGsB.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shiki-Bdk0JGsB.d.ts","names":[],"sources":["../src/highlight/shiki.ts"],"sourcesContent":[],"mappings":";;;;;;;;AAuBqC,KAAzB,sBAAA,GAAyB,uBAAA,CAAwB,eAAxB,CAAA,GACnC,eADmC,GAAA;EACnC;;;;;EAYU,MAAA,CAAA,EAAA,IAAA,GAAA,WAAsB;EAEtB,UAAA,CAAA,EAPK,OAOW,CAPH,UAOG,CAAA;EAAG,gBAAA,CAAA,EALR,eAKQ;CAC5B;AAAyB,KAHhB,sBAAA,GAAyB,iBAGT,CAH2B,YAG3B,CAAA;AAAM,KADtB,gBAAA,GAAmB,sBACG,GAAA,CAA/B,sBAA+B,GAAN,MAAM,CAAA,KAAA,EAAA,KAAA,CAAA,CAAA;AAIZ,iBAAA,aAAA,CAAa,IAAA,EAAA,MAAA,EAAA,OAAA,EAAwB,gBAAxB,CAAA,EAA2C,OAA3C,CAAmD,IAAnD,CAAA;AAAwB,iBAoC3C,SAAA,CApC2C,IAAA,EAoC3B,IApC2B,EAAA,OAAA,CAAA,EAoCX,OApCW,CAoCH,OApCG,CAAA,CAAA,EAoCU,GAAA,CAAA,OApCV;;;;AAoC3D;;;AAAgD,iBAgB1B,cAAA,CAhB0B,UAAA,EAAA,IAAA,GAAA,WAAA,EAAA,OAAA,EAkBrC,IAlBqC,CAkBhC,yBAlBgC,CAkBN,eAlBM,EAkBW,YAlBX,CAAA,EAAA,QAAA,CAAA,CAAA,EAkBmC,OAlBnC,CAkBmC,WAlBnC,CAAA;AAAqB,iBAuD/C,SAAA,CAvD+C,IAAA,EAAA,MAAA,EAAA,OAAA,EAuDd,gBAvDc,CAAA,EAuDK,OAvDL,CAuDa,SAvDb,CAAA"}
@@ -0,0 +1,80 @@
1
+ import { Fragment } from "react";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { toJsxRuntime } from "hast-util-to-jsx-runtime";
4
+
5
+ //#region src/highlight/shiki.ts
6
+ const defaultThemes = {
7
+ light: "github-light",
8
+ dark: "github-dark"
9
+ };
10
+ const highlighters = /* @__PURE__ */ new Map();
11
+ async function highlightHast(code, options) {
12
+ const { lang: initialLang, fallbackLanguage, components: _, engine = "js", ...rest } = options;
13
+ let lang = initialLang;
14
+ let themes;
15
+ let themesToLoad;
16
+ if ("theme" in options && options.theme) {
17
+ themes = { theme: options.theme };
18
+ themesToLoad = [themes.theme];
19
+ } else {
20
+ themes = { themes: "themes" in options && options.themes ? options.themes : defaultThemes };
21
+ themesToLoad = Object.values(themes.themes).filter((v) => v !== void 0);
22
+ }
23
+ const highlighter = await getHighlighter(engine, {
24
+ langs: [],
25
+ themes: themesToLoad
26
+ });
27
+ try {
28
+ await highlighter.loadLanguage(lang);
29
+ } catch {
30
+ lang = fallbackLanguage ?? "text";
31
+ await highlighter.loadLanguage(lang);
32
+ }
33
+ return highlighter.codeToHast(code, {
34
+ lang,
35
+ ...rest,
36
+ ...themes,
37
+ defaultColor: "themes" in themes ? false : void 0
38
+ });
39
+ }
40
+ function hastToJsx(hast, options) {
41
+ return toJsxRuntime(hast, {
42
+ jsx,
43
+ jsxs,
44
+ development: false,
45
+ Fragment,
46
+ ...options
47
+ });
48
+ }
49
+ /**
50
+ * Get Shiki highlighter instance of Fumadocs (mostly for internal use, you should use Shiki directly over this).
51
+ *
52
+ * @param engineType - Shiki Regex engine to use.
53
+ * @param options - Shiki options.
54
+ */
55
+ async function getHighlighter(engineType, options) {
56
+ const { createHighlighter } = await import("shiki");
57
+ let highlighter = highlighters.get(engineType);
58
+ if (!highlighter) {
59
+ let engine;
60
+ if (engineType === "js") engine = import("shiki/engine/javascript").then((res) => res.createJavaScriptRegexEngine());
61
+ else engine = import("shiki/engine/oniguruma").then((res) => res.createOnigurumaEngine(import("shiki/wasm")));
62
+ highlighter = createHighlighter({
63
+ ...options,
64
+ engine
65
+ });
66
+ highlighters.set(engineType, highlighter);
67
+ return highlighter;
68
+ }
69
+ return highlighter.then(async (instance) => {
70
+ await Promise.all([instance.loadLanguage(...options.langs), instance.loadTheme(...options.themes)]);
71
+ return instance;
72
+ });
73
+ }
74
+ async function highlight(code, options) {
75
+ return hastToJsx(await highlightHast(code, options), { components: options.components });
76
+ }
77
+
78
+ //#endregion
79
+ export { highlightHast as a, highlight as i, getHighlighter as n, hastToJsx as r, defaultThemes as t };
80
+ //# sourceMappingURL=shiki-DoHr6fEj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shiki-DoHr6fEj.js","names":["themes: CodeOptionsThemes<BundledTheme>"],"sources":["../src/highlight/shiki.ts"],"sourcesContent":["import {\n type BundledHighlighterOptions,\n type BundledLanguage,\n type CodeOptionsMeta,\n type CodeOptionsThemes,\n type CodeToHastOptionsCommon,\n type Highlighter,\n} from 'shiki';\nimport type { BundledTheme } from 'shiki/themes';\nimport {\n type Components,\n type Options as ToJsxOptions,\n toJsxRuntime,\n} from 'hast-util-to-jsx-runtime';\nimport { Fragment, type ReactNode } from 'react';\nimport { jsx, jsxs } from 'react/jsx-runtime';\nimport type { Root } from 'hast';\n\nexport const defaultThemes = {\n light: 'github-light',\n dark: 'github-dark',\n};\n\nexport type HighlightOptionsCommon = CodeToHastOptionsCommon<BundledLanguage> &\n CodeOptionsMeta & {\n /**\n * The Regex Engine for Shiki\n *\n * @defaultValue 'js'\n */\n engine?: 'js' | 'oniguruma';\n components?: Partial<Components>;\n\n fallbackLanguage?: BundledLanguage;\n };\n\nexport type HighlightOptionsThemes = CodeOptionsThemes<BundledTheme>;\n\nexport type HighlightOptions = HighlightOptionsCommon &\n (HighlightOptionsThemes | Record<never, never>);\n\nconst highlighters = new Map<string, Promise<Highlighter>>();\n\nexport async function highlightHast(code: string, options: HighlightOptions): Promise<Root> {\n const { lang: initialLang, fallbackLanguage, components: _, engine = 'js', ...rest } = options;\n let lang = initialLang;\n let themes: CodeOptionsThemes<BundledTheme>;\n let themesToLoad;\n\n if ('theme' in options && options.theme) {\n themes = { theme: options.theme };\n themesToLoad = [themes.theme];\n } else {\n themes = {\n themes: 'themes' in options && options.themes ? options.themes : defaultThemes,\n };\n themesToLoad = Object.values(themes.themes).filter((v) => v !== undefined);\n }\n\n const highlighter = await getHighlighter(engine, {\n langs: [],\n themes: themesToLoad,\n });\n\n try {\n await highlighter.loadLanguage(lang as BundledLanguage);\n } catch {\n lang = fallbackLanguage ?? 'text';\n await highlighter.loadLanguage(lang as BundledLanguage);\n }\n\n return highlighter.codeToHast(code, {\n lang,\n ...rest,\n ...themes,\n defaultColor: 'themes' in themes ? false : undefined,\n });\n}\n\nexport function hastToJsx(hast: Root, options?: Partial<ToJsxOptions>) {\n return toJsxRuntime(hast, {\n jsx,\n jsxs,\n development: false,\n Fragment,\n ...options,\n });\n}\n\n/**\n * Get Shiki highlighter instance of Fumadocs (mostly for internal use, you should use Shiki directly over this).\n *\n * @param engineType - Shiki Regex engine to use.\n * @param options - Shiki options.\n */\nexport async function getHighlighter(\n engineType: 'js' | 'oniguruma',\n options: Omit<BundledHighlighterOptions<BundledLanguage, BundledTheme>, 'engine'>,\n) {\n const { createHighlighter } = await import('shiki');\n let highlighter = highlighters.get(engineType);\n\n if (!highlighter) {\n let engine;\n\n if (engineType === 'js') {\n engine = import('shiki/engine/javascript').then((res) => res.createJavaScriptRegexEngine());\n } else {\n engine = import('shiki/engine/oniguruma').then((res) =>\n res.createOnigurumaEngine(import('shiki/wasm')),\n );\n }\n\n highlighter = createHighlighter({\n ...options,\n engine,\n });\n\n highlighters.set(engineType, highlighter);\n return highlighter;\n }\n\n return highlighter.then(async (instance) => {\n await Promise.all([\n // @ts-expect-error unknown\n instance.loadLanguage(...options.langs),\n // @ts-expect-error unknown\n instance.loadTheme(...options.themes),\n ]);\n\n return instance;\n });\n}\n\nexport async function highlight(code: string, options: HighlightOptions): Promise<ReactNode> {\n return hastToJsx(await highlightHast(code, options), {\n components: options.components,\n });\n}\n"],"mappings":";;;;;AAkBA,MAAa,gBAAgB;CAC3B,OAAO;CACP,MAAM;CACP;AAoBD,MAAM,+BAAe,IAAI,KAAmC;AAE5D,eAAsB,cAAc,MAAc,SAA0C;CAC1F,MAAM,EAAE,MAAM,aAAa,kBAAkB,YAAY,GAAG,SAAS,MAAM,GAAG,SAAS;CACvF,IAAI,OAAO;CACX,IAAIA;CACJ,IAAI;AAEJ,KAAI,WAAW,WAAW,QAAQ,OAAO;AACvC,WAAS,EAAE,OAAO,QAAQ,OAAO;AACjC,iBAAe,CAAC,OAAO,MAAM;QACxB;AACL,WAAS,EACP,QAAQ,YAAY,WAAW,QAAQ,SAAS,QAAQ,SAAS,eAClE;AACD,iBAAe,OAAO,OAAO,OAAO,OAAO,CAAC,QAAQ,MAAM,MAAM,OAAU;;CAG5E,MAAM,cAAc,MAAM,eAAe,QAAQ;EAC/C,OAAO,EAAE;EACT,QAAQ;EACT,CAAC;AAEF,KAAI;AACF,QAAM,YAAY,aAAa,KAAwB;SACjD;AACN,SAAO,oBAAoB;AAC3B,QAAM,YAAY,aAAa,KAAwB;;AAGzD,QAAO,YAAY,WAAW,MAAM;EAClC;EACA,GAAG;EACH,GAAG;EACH,cAAc,YAAY,SAAS,QAAQ;EAC5C,CAAC;;AAGJ,SAAgB,UAAU,MAAY,SAAiC;AACrE,QAAO,aAAa,MAAM;EACxB;EACA;EACA,aAAa;EACb;EACA,GAAG;EACJ,CAAC;;;;;;;;AASJ,eAAsB,eACpB,YACA,SACA;CACA,MAAM,EAAE,sBAAsB,MAAM,OAAO;CAC3C,IAAI,cAAc,aAAa,IAAI,WAAW;AAE9C,KAAI,CAAC,aAAa;EAChB,IAAI;AAEJ,MAAI,eAAe,KACjB,UAAS,OAAO,2BAA2B,MAAM,QAAQ,IAAI,6BAA6B,CAAC;MAE3F,UAAS,OAAO,0BAA0B,MAAM,QAC9C,IAAI,sBAAsB,OAAO,cAAc,CAChD;AAGH,gBAAc,kBAAkB;GAC9B,GAAG;GACH;GACD,CAAC;AAEF,eAAa,IAAI,YAAY,YAAY;AACzC,SAAO;;AAGT,QAAO,YAAY,KAAK,OAAO,aAAa;AAC1C,QAAM,QAAQ,IAAI,CAEhB,SAAS,aAAa,GAAG,QAAQ,MAAM,EAEvC,SAAS,UAAU,GAAG,QAAQ,OAAO,CACtC,CAAC;AAEF,SAAO;GACP;;AAGJ,eAAsB,UAAU,MAAc,SAA+C;AAC3F,QAAO,UAAU,MAAM,cAAc,MAAM,QAAQ,EAAE,EACnD,YAAY,QAAQ,YACrB,CAAC"}
@@ -1,6 +1,7 @@
1
- import { R as Root } from '../../definitions-pJ7PybYY.js';
2
- import 'react';
1
+ import { i as Root } from "../../definitions-DJAPG-2U.js";
2
+ import "../../page-tree/index.js";
3
3
 
4
+ //#region src/source/client/index.d.ts
4
5
  declare function deserializePageTree(root: Root): Root;
5
6
  /**
6
7
  * Deserialize data passed from server-side loader.
@@ -8,9 +9,10 @@ declare function deserializePageTree(root: Root): Root;
8
9
  * It only receives the serialized data from server-side, hence not sharing plugins and some properties.
9
10
  */
10
11
  declare function useFumadocsLoader<V extends {
11
- pageTree?: object;
12
+ pageTree?: object;
12
13
  }>(serialized: V): {
13
- pageTree: V["pageTree"] extends object ? Root : undefined;
14
+ pageTree: V["pageTree"] extends object ? Root : undefined;
14
15
  };
15
-
16
+ //#endregion
16
17
  export { deserializePageTree, useFumadocsLoader };
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/source/client/index.tsx"],"sourcesContent":[],"mappings":";;;;iBAIgB,mBAAA,OAA0B,OAAgB;;;AAA1D;AA2BA;;AAWgB,iBAXA,iBAWA,CAAA,UAAA;EAA+B,QAAA,CAAA,EAAA,MAAA;CAAa,CAAA,CAAA,UAAA,EAP9C,CAO8C,CAAA,EAAA;YAA5C,+BAA+B"}
@@ -1,41 +1,30 @@
1
- import {
2
- visit
3
- } from "../../chunk-L4JKQWCM.js";
4
- import "../../chunk-U67V476Y.js";
5
-
6
- // src/source/client/index.tsx
1
+ import { c as visit } from "../../utils-bAoAH1Rh.js";
7
2
  import { useMemo } from "react";
8
3
  import { jsx } from "react/jsx-runtime";
4
+
5
+ //#region src/source/client/index.tsx
9
6
  function deserializePageTree(root) {
10
- function deserializeHTML(html) {
11
- return /* @__PURE__ */ jsx(
12
- "span",
13
- {
14
- dangerouslySetInnerHTML: {
15
- __html: html
16
- }
17
- }
18
- );
19
- }
20
- visit(root, (item) => {
21
- if ("icon" in item && typeof item.icon === "string") {
22
- item.icon = deserializeHTML(item.icon);
23
- }
24
- if (typeof item.name === "string") {
25
- item.name = deserializeHTML(item.name);
26
- }
27
- });
28
- return root;
7
+ function deserializeHTML(html) {
8
+ return /* @__PURE__ */ jsx("span", { dangerouslySetInnerHTML: { __html: html } });
9
+ }
10
+ visit(root, (item) => {
11
+ if ("icon" in item && typeof item.icon === "string") item.icon = deserializeHTML(item.icon);
12
+ if (typeof item.name === "string") item.name = deserializeHTML(item.name);
13
+ });
14
+ return root;
29
15
  }
16
+ /**
17
+ * Deserialize data passed from server-side loader.
18
+ *
19
+ * It only receives the serialized data from server-side, hence not sharing plugins and some properties.
20
+ */
30
21
  function useFumadocsLoader(serialized) {
31
- const { pageTree } = serialized;
32
- return useMemo(() => {
33
- return {
34
- pageTree: pageTree ? deserializePageTree(pageTree) : void 0
35
- };
36
- }, [pageTree]);
22
+ const { pageTree } = serialized;
23
+ return useMemo(() => {
24
+ return { pageTree: pageTree ? deserializePageTree(pageTree) : void 0 };
25
+ }, [pageTree]);
37
26
  }
38
- export {
39
- deserializePageTree,
40
- useFumadocsLoader
41
- };
27
+
28
+ //#endregion
29
+ export { deserializePageTree, useFumadocsLoader };
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/source/client/index.tsx"],"sourcesContent":["import type * as PageTree from '@/page-tree';\nimport { visit } from '@/page-tree/utils';\nimport { useMemo } from 'react';\n\nexport function deserializePageTree(root: PageTree.Root): PageTree.Root {\n function deserializeHTML(html: string) {\n return (\n <span\n dangerouslySetInnerHTML={{\n __html: html,\n }}\n />\n );\n }\n visit(root, (item) => {\n if ('icon' in item && typeof item.icon === 'string') {\n item.icon = deserializeHTML(item.icon);\n }\n if (typeof item.name === 'string') {\n item.name = deserializeHTML(item.name);\n }\n });\n\n return root;\n}\n\n/**\n * Deserialize data passed from server-side loader.\n *\n * It only receives the serialized data from server-side, hence not sharing plugins and some properties.\n */\nexport function useFumadocsLoader<\n V extends {\n pageTree?: object;\n },\n>(serialized: V) {\n const { pageTree } = serialized;\n\n return useMemo(() => {\n return {\n pageTree: pageTree ? deserializePageTree(pageTree as PageTree.Root) : undefined,\n } as {\n pageTree: V['pageTree'] extends object ? PageTree.Root : undefined;\n };\n }, [pageTree]);\n}\n"],"mappings":";;;;;AAIA,SAAgB,oBAAoB,MAAoC;CACtE,SAAS,gBAAgB,MAAc;AACrC,SACE,oBAAC,UACC,yBAAyB,EACvB,QAAQ,MACT,GACD;;AAGN,OAAM,OAAO,SAAS;AACpB,MAAI,UAAU,QAAQ,OAAO,KAAK,SAAS,SACzC,MAAK,OAAO,gBAAgB,KAAK,KAAK;AAExC,MAAI,OAAO,KAAK,SAAS,SACvB,MAAK,OAAO,gBAAgB,KAAK,KAAK;GAExC;AAEF,QAAO;;;;;;;AAQT,SAAgB,kBAId,YAAe;CACf,MAAM,EAAE,aAAa;AAErB,QAAO,cAAc;AACnB,SAAO,EACL,UAAU,WAAW,oBAAoB,SAA0B,GAAG,QACvE;IAGA,CAAC,SAAS,CAAC"}
@@ -1,42 +1,3 @@
1
- export { C as ContentStorage, p as ContentStorageFile, F as FileSystem, h as InferMetaType, I as InferPageType, b as LoaderConfig, c as LoaderOptions, f as LoaderOutput, L as LoaderPlugin, r as LoaderPluginOption, e as Meta, M as MetaData, d as Page, P as PageData, n as PageTreeBuilder, i as PageTreeBuilderContext, k as PageTreeOptions, j as PageTreeTransformer, R as ResolvedLoaderConfig, S as Source, a as SourceConfig, V as VirtualFile, _ as _ConfigUnion_, q as buildContentStorage, t as buildPlugins, g as createGetUrl, o as createPageTreeBuilder, l as loader, m as multiple, s as source, u as update } from '../loader-_E2HOdV0.js';
2
- import '../definitions-pJ7PybYY.js';
3
- import 'react';
4
- import '../i18n/index.js';
5
-
6
- /**
7
- * Convert file path into slugs, also encode non-ASCII characters, so they can work in pathname
8
- */
9
- declare function getSlugs(file: string): string[];
10
-
11
- declare function basename(path: string, ext?: string): string;
12
- declare function extname(path: string): string;
13
- declare function dirname(path: string): string;
14
- /**
15
- * Split path into segments, trailing/leading slashes are removed
16
- */
17
- declare function splitPath(path: string): string[];
18
- /**
19
- * Resolve paths, slashes within the path will be ignored
20
- * @param paths - Paths to join
21
- * @example
22
- * ```
23
- * ['a','b'] // 'a/b'
24
- * ['/a'] // 'a'
25
- * ['a', '/b'] // 'a/b'
26
- * ['a', '../b/c'] // 'b/c'
27
- * ```
28
- */
29
- declare function joinPath(...paths: string[]): string;
30
- declare function slash(path: string): string;
31
-
32
- declare const path_basename: typeof basename;
33
- declare const path_dirname: typeof dirname;
34
- declare const path_extname: typeof extname;
35
- declare const path_joinPath: typeof joinPath;
36
- declare const path_slash: typeof slash;
37
- declare const path_splitPath: typeof splitPath;
38
- declare namespace path {
39
- export { path_basename as basename, path_dirname as dirname, path_extname as extname, path_joinPath as joinPath, path_slash as slash, path_splitPath as splitPath };
40
- }
41
-
42
- export { path as PathUtils, getSlugs };
1
+ import "../definitions-DJAPG-2U.js";
2
+ import { A as PageData, C as ContentStorage, D as buildContentStorage, E as ContentStoragePageFile, F as _SourceUpdate_, I as multiple, L as source, M as SourceConfig, N as VirtualFile, O as FileSystem, P as _ConfigUnion_, R as update, S as createPageTreeBuilder, T as ContentStorageMetaFile, a as LoaderOptions, b as PageTreeOptions, c as LoaderPluginOption, d as ResolvedLoaderConfig, f as createGetUrl, h as getSlugs, i as LoaderConfig, j as Source, k as MetaData, l as Meta, n as InferMetaType, o as LoaderOutput, p as loader, r as InferPageType, s as LoaderPlugin, t as path_d_exports, u as Page, v as PageTreeBuilder, w as ContentStorageFile, x as PageTreeTransformer, y as PageTreeBuilderContext } from "../index-Co_C8NEi.js";
3
+ export { ContentStorage, ContentStorageFile, ContentStorageMetaFile, ContentStoragePageFile, FileSystem, InferMetaType, InferPageType, LoaderConfig, LoaderOptions, LoaderOutput, LoaderPlugin, LoaderPluginOption, Meta, MetaData, Page, PageData, PageTreeBuilder, PageTreeBuilderContext, PageTreeOptions, PageTreeTransformer, path_d_exports as PathUtils, ResolvedLoaderConfig, Source, SourceConfig, VirtualFile, _ConfigUnion_, _SourceUpdate_, buildContentStorage, createGetUrl, createPageTreeBuilder, getSlugs, loader, multiple, source, update };