fumadocs-core 16.4.2 → 16.4.4

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 (149) hide show
  1. package/dist/{advanced-BRT5Ij43.js → advanced-DSlc7qa9.js} +3 -3
  2. package/dist/{advanced-BRT5Ij43.js.map → advanced-DSlc7qa9.js.map} +1 -1
  3. package/dist/{algolia-CQPXCnjV.js → algolia-BGWM-DkQ.js} +2 -2
  4. package/dist/{algolia-CQPXCnjV.js.map → algolia-BGWM-DkQ.js.map} +1 -1
  5. package/dist/{algolia-CBBN8R6-.d.ts → algolia-FqjcaTcD.d.ts} +2 -2
  6. package/dist/{algolia-CBBN8R6-.d.ts.map → algolia-FqjcaTcD.d.ts.map} +1 -1
  7. package/dist/breadcrumb.d.ts +1 -1
  8. package/dist/breadcrumb.js +2 -2
  9. package/dist/{codeblock-utils-lld8UiQo.d.ts → codeblock-utils-Dh1w8ICD.d.ts} +1 -1
  10. package/dist/{codeblock-utils-lld8UiQo.d.ts.map → codeblock-utils-Dh1w8ICD.d.ts.map} +1 -1
  11. package/dist/content/index.d.ts +2 -2
  12. package/dist/content/mdx/preset-bundler.d.ts +8 -8
  13. package/dist/content/mdx/preset-bundler.js +1 -1
  14. package/dist/content/mdx/preset-runtime.d.ts +8 -8
  15. package/dist/content/mdx/preset-runtime.js +1 -1
  16. package/dist/content/toc.js +1 -1
  17. package/dist/{definitions-DuxDer_c.d.ts → definitions-DJAPG-2U.d.ts} +1 -1
  18. package/dist/{definitions-DuxDer_c.d.ts.map → definitions-DJAPG-2U.d.ts.map} +1 -1
  19. package/dist/{fetch-B5e9CFfN.js → fetch-B1nmMSyw.js} +1 -1
  20. package/dist/{fetch-B5e9CFfN.js.map → fetch-B1nmMSyw.js.map} +1 -1
  21. package/dist/framework/index.d.ts +4 -4
  22. package/dist/framework/next.d.ts +2 -2
  23. package/dist/framework/react-router.d.ts +2 -2
  24. package/dist/framework/tanstack.d.ts +2 -2
  25. package/dist/framework/waku.d.ts +2 -2
  26. package/dist/highlight/client.d.ts +1 -1
  27. package/dist/highlight/client.js +1 -1
  28. package/dist/highlight/index.d.ts +1 -1
  29. package/dist/highlight/index.js +1 -1
  30. package/dist/i18n/index.d.ts +1 -1
  31. package/dist/i18n/middleware.d.ts +1 -1
  32. package/dist/{icon-Dt7IObrc.js → icon-5lVe3l-0.js} +1 -1
  33. package/dist/{icon-Dt7IObrc.js.map → icon-5lVe3l-0.js.map} +1 -1
  34. package/dist/{index-Bw-DCOra.d.ts → index-BhVrX5J1.d.ts} +1 -1
  35. package/dist/{index-Bw-DCOra.d.ts.map → index-BhVrX5J1.d.ts.map} +1 -1
  36. package/dist/{index-2U6Tl4--.d.ts → index-Co_C8NEi.d.ts} +16 -15
  37. package/dist/index-Co_C8NEi.d.ts.map +1 -0
  38. package/dist/link.d.ts +2 -2
  39. package/dist/{mdast-utils-mc9-X-PK.js → mdast-utils-ix4DsXJP.js} +1 -1
  40. package/dist/{mdast-utils-mc9-X-PK.js.map → mdast-utils-ix4DsXJP.js.map} +1 -1
  41. package/dist/mdx-plugins/codeblock-utils.d.ts +1 -1
  42. package/dist/mdx-plugins/index.d.ts +14 -14
  43. package/dist/mdx-plugins/index.js +4 -4
  44. package/dist/mdx-plugins/rehype-code.d.ts +1 -1
  45. package/dist/mdx-plugins/rehype-code.js +2 -2
  46. package/dist/mdx-plugins/rehype-toc.d.ts +1 -1
  47. package/dist/mdx-plugins/rehype-toc.js +1 -1
  48. package/dist/mdx-plugins/remark-admonition.d.ts +1 -1
  49. package/dist/mdx-plugins/remark-admonition.js +1 -1
  50. package/dist/mdx-plugins/remark-code-tab.d.ts +1 -1
  51. package/dist/mdx-plugins/remark-directive-admonition.d.ts +1 -1
  52. package/dist/mdx-plugins/remark-gfm.d.ts +1 -1
  53. package/dist/mdx-plugins/remark-heading.d.ts +1 -1
  54. package/dist/mdx-plugins/remark-heading.js +1 -1
  55. package/dist/mdx-plugins/remark-image.d.ts +1 -1
  56. package/dist/mdx-plugins/remark-mdx-files.d.ts +1 -1
  57. package/dist/mdx-plugins/remark-mdx-mermaid.d.ts +1 -1
  58. package/dist/mdx-plugins/remark-npm.d.ts +1 -1
  59. package/dist/mdx-plugins/remark-steps.d.ts +1 -1
  60. package/dist/mdx-plugins/remark-structure.d.ts +1 -1
  61. package/dist/mdx-plugins/remark-structure.js +1 -1
  62. package/dist/{mixedbread-DlByNYSd.js → mixedbread-DSiQfUnN.js} +2 -2
  63. package/dist/{mixedbread-DlByNYSd.js.map → mixedbread-DSiQfUnN.js.map} +1 -1
  64. package/dist/{normalize-url-DP9-1I-S.js → normalize-url-3WQZ_H_j.js} +1 -1
  65. package/dist/{normalize-url-DP9-1I-S.js.map → normalize-url-3WQZ_H_j.js.map} +1 -1
  66. package/dist/{orama-cloud-DH3g37zc.js → orama-cloud-BMDBfk05.js} +3 -3
  67. package/dist/{orama-cloud-DH3g37zc.js.map → orama-cloud-BMDBfk05.js.map} +1 -1
  68. package/dist/orama-cloud-legacy-CRZzZXWn.js +82 -0
  69. package/dist/orama-cloud-legacy-CRZzZXWn.js.map +1 -0
  70. package/dist/page-tree/index.d.ts +1 -1
  71. package/dist/page-tree/index.js +1 -1
  72. package/dist/{path-DHIjrDBP.js → path-D6M0ZQvO.js} +2 -2
  73. package/dist/{path-DHIjrDBP.js.map → path-D6M0ZQvO.js.map} +1 -1
  74. package/dist/{rehype-code-vVWG4-ej.d.ts → rehype-code-Bd52chOe.d.ts} +1 -1
  75. package/dist/{rehype-code-vVWG4-ej.d.ts.map → rehype-code-Bd52chOe.d.ts.map} +1 -1
  76. package/dist/{rehype-code-CdiZ1Y6P.js → rehype-code-j8FAEnuU.js} +8 -3
  77. package/dist/{rehype-code-CdiZ1Y6P.js.map → rehype-code-j8FAEnuU.js.map} +1 -1
  78. package/dist/{rehype-toc-DJvSyE0o.d.ts → rehype-toc-BJVsblvp.d.ts} +1 -1
  79. package/dist/{rehype-toc-DJvSyE0o.d.ts.map → rehype-toc-BJVsblvp.d.ts.map} +1 -1
  80. package/dist/{rehype-toc-DVwJcwvA.js → rehype-toc-Dqgey2tW.js} +1 -1
  81. package/dist/{rehype-toc-DVwJcwvA.js.map → rehype-toc-Dqgey2tW.js.map} +1 -1
  82. package/dist/{remark-admonition-DOwBWzsH.d.ts → remark-admonition-Chku_iWO.d.ts} +1 -1
  83. package/dist/{remark-admonition-DOwBWzsH.d.ts.map → remark-admonition-Chku_iWO.d.ts.map} +1 -1
  84. package/dist/{remark-code-tab-CXsYlims.d.ts → remark-code-tab-C0f6BPcw.d.ts} +1 -1
  85. package/dist/{remark-code-tab-CXsYlims.d.ts.map → remark-code-tab-C0f6BPcw.d.ts.map} +1 -1
  86. package/dist/{remark-directive-admonition-BCm_yiU9.d.ts → remark-directive-admonition-CBwJdh9z.d.ts} +1 -1
  87. package/dist/{remark-directive-admonition-BCm_yiU9.d.ts.map → remark-directive-admonition-CBwJdh9z.d.ts.map} +1 -1
  88. package/dist/{remark-heading-CXvCY0go.d.ts → remark-heading-CUAe4zIu.d.ts} +1 -1
  89. package/dist/{remark-heading-CXvCY0go.d.ts.map → remark-heading-CUAe4zIu.d.ts.map} +1 -1
  90. package/dist/{remark-image-CvUis4R1.d.ts → remark-image-DMRnxsRO.d.ts} +1 -1
  91. package/dist/{remark-image-CvUis4R1.d.ts.map → remark-image-DMRnxsRO.d.ts.map} +1 -1
  92. package/dist/{remark-mdx-files-B31xFFG4.d.ts → remark-mdx-files-B5KMXnfh.d.ts} +1 -1
  93. package/dist/{remark-mdx-files-B31xFFG4.d.ts.map → remark-mdx-files-B5KMXnfh.d.ts.map} +1 -1
  94. package/dist/{remark-mdx-mermaid-BdSUUiCG.d.ts → remark-mdx-mermaid-C_4W5gfj.d.ts} +1 -1
  95. package/dist/{remark-mdx-mermaid-BdSUUiCG.d.ts.map → remark-mdx-mermaid-C_4W5gfj.d.ts.map} +1 -1
  96. package/dist/{remark-npm-BIvIEKT2.d.ts → remark-npm-CykFgJn2.d.ts} +1 -1
  97. package/dist/{remark-npm-BIvIEKT2.d.ts.map → remark-npm-CykFgJn2.d.ts.map} +1 -1
  98. package/dist/{remark-steps-CHJN-rtm.d.ts → remark-steps-5-DmLVv3.d.ts} +1 -1
  99. package/dist/{remark-steps-CHJN-rtm.d.ts.map → remark-steps-5-DmLVv3.d.ts.map} +1 -1
  100. package/dist/{remark-structure-RZD2gGKp.d.ts → remark-structure-CszwnaMR.d.ts} +1 -1
  101. package/dist/{remark-structure-RZD2gGKp.d.ts.map → remark-structure-CszwnaMR.d.ts.map} +1 -1
  102. package/dist/{remove-undefined-Cfs4o_mM.js → remove-undefined-B7zJF-YS.js} +1 -1
  103. package/dist/{remove-undefined-Cfs4o_mM.js.map → remove-undefined-B7zJF-YS.js.map} +1 -1
  104. package/dist/search/algolia.d.ts +2 -2
  105. package/dist/search/client.d.ts +28 -5
  106. package/dist/search/client.d.ts.map +1 -1
  107. package/dist/search/client.js +26 -20
  108. package/dist/search/client.js.map +1 -1
  109. package/dist/search/index.js +1 -1
  110. package/dist/search/orama-cloud-legacy.d.ts +81 -0
  111. package/dist/search/orama-cloud-legacy.d.ts.map +1 -0
  112. package/dist/search/orama-cloud-legacy.js +50 -0
  113. package/dist/search/orama-cloud-legacy.js.map +1 -0
  114. package/dist/search/orama-cloud.d.ts +7 -7
  115. package/dist/search/orama-cloud.d.ts.map +1 -1
  116. package/dist/search/orama-cloud.js.map +1 -1
  117. package/dist/search/server.d.ts +4 -4
  118. package/dist/search/server.js +4 -4
  119. package/dist/{search-D6ChCLhY.js → search-DcH54N2x.js} +1 -1
  120. package/dist/{search-D6ChCLhY.js.map → search-DcH54N2x.js.map} +1 -1
  121. package/dist/{server-CPR_fgkH.d.ts → server-BzFuYBxW.d.ts} +4 -4
  122. package/dist/{server-CPR_fgkH.d.ts.map → server-BzFuYBxW.d.ts.map} +1 -1
  123. package/dist/{shiki-CIBQys54.d.ts → shiki-Bdk0JGsB.d.ts} +1 -1
  124. package/dist/{shiki-CIBQys54.d.ts.map → shiki-Bdk0JGsB.d.ts.map} +1 -1
  125. package/dist/{shiki-4oMYwHED.js → shiki-DoHr6fEj.js} +1 -1
  126. package/dist/{shiki-4oMYwHED.js.map → shiki-DoHr6fEj.js.map} +1 -1
  127. package/dist/source/client/index.d.ts +1 -1
  128. package/dist/source/client/index.js +1 -1
  129. package/dist/source/index.d.ts +3 -3
  130. package/dist/source/index.js +4 -4
  131. package/dist/source/index.js.map +1 -1
  132. package/dist/source/plugins/lucide-icons.d.ts +2 -2
  133. package/dist/source/plugins/lucide-icons.js +1 -1
  134. package/dist/source/plugins/slugs.d.ts +2 -2
  135. package/dist/source/plugins/slugs.js +1 -1
  136. package/dist/{static-Dq8pA8Ay.js → static-DAjBQpus.js} +2 -2
  137. package/dist/{static-Dq8pA8Ay.js.map → static-DAjBQpus.js.map} +1 -1
  138. package/dist/toc.d.ts +4 -4
  139. package/dist/{util-s9piKHsk.js → util-92szu3Vf.js} +1 -1
  140. package/dist/{util-s9piKHsk.js.map → util-92szu3Vf.js.map} +1 -1
  141. package/dist/{util-CK2ykiif.d.ts → util-ofJFdM-e.d.ts} +1 -1
  142. package/dist/util-ofJFdM-e.d.ts.map +1 -0
  143. package/dist/{utils-DUvi2WkD.js → utils-bAoAH1Rh.js} +1 -1
  144. package/dist/{utils-DUvi2WkD.js.map → utils-bAoAH1Rh.js.map} +1 -1
  145. package/package.json +13 -8
  146. package/dist/index-2U6Tl4--.d.ts.map +0 -1
  147. package/dist/util-CK2ykiif.d.ts.map +0 -1
  148. /package/dist/{chunk-B-ezknvj.js → chunk-C1JLJEPO.js} +0 -0
  149. /package/dist/{remark-gfm-CeWpMwyk.d.ts → remark-gfm-B2aZXutO.d.ts} +0 -0
@@ -41,4 +41,4 @@ function createContentHighlighter(query) {
41
41
 
42
42
  //#endregion
43
43
  export { createContentHighlighter as t };
44
- //# sourceMappingURL=search-D6ChCLhY.js.map
44
+ //# sourceMappingURL=search-DcH54N2x.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"search-D6ChCLhY.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"}
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"}
@@ -1,7 +1,7 @@
1
- import { n as StructuredData } from "./remark-structure-RZD2gGKp.js";
2
- import { t as I18nConfig } from "./index-Bw-DCOra.js";
1
+ import { n as StructuredData } from "./remark-structure-CszwnaMR.js";
2
+ import { t as I18nConfig } from "./index-BhVrX5J1.js";
3
3
  import { SortedResult } from "./search/index.js";
4
- import { i as LoaderConfig, o as LoaderOutput, u as Page } from "./index-2U6Tl4--.js";
4
+ import { i as LoaderConfig, o as LoaderOutput, u as Page } from "./index-Co_C8NEi.js";
5
5
  import { Language, Orama, RawData, SearchParams, TypedDocument, create } from "@orama/orama";
6
6
 
7
7
  //#region src/search/orama/create-db.d.ts
@@ -130,4 +130,4 @@ interface AdvancedIndex {
130
130
  declare function initAdvancedSearch(options: AdvancedOptions): SearchServer;
131
131
  //#endregion
132
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-CPR_fgkH.d.ts.map
133
+ //# sourceMappingURL=server-BzFuYBxW.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"server-CPR_fgkH.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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"}
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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"}
@@ -30,4 +30,4 @@ declare function getHighlighter(engineType: 'js' | 'oniguruma', options: Omit<Bu
30
30
  declare function highlight(code: string, options: HighlightOptions): Promise<ReactNode>;
31
31
  //#endregion
32
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-CIBQys54.d.ts.map
33
+ //# sourceMappingURL=shiki-Bdk0JGsB.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shiki-CIBQys54.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"}
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"}
@@ -77,4 +77,4 @@ async function highlight(code, options) {
77
77
 
78
78
  //#endregion
79
79
  export { highlightHast as a, highlight as i, getHighlighter as n, hastToJsx as r, defaultThemes as t };
80
- //# sourceMappingURL=shiki-4oMYwHED.js.map
80
+ //# sourceMappingURL=shiki-DoHr6fEj.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shiki-4oMYwHED.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
+ {"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,4 +1,4 @@
1
- import { i as Root } from "../../definitions-DuxDer_c.js";
1
+ import { i as Root } from "../../definitions-DJAPG-2U.js";
2
2
  import "../../page-tree/index.js";
3
3
 
4
4
  //#region src/source/client/index.d.ts
@@ -1,4 +1,4 @@
1
- import { c as visit } from "../../utils-DUvi2WkD.js";
1
+ import { c as visit } from "../../utils-bAoAH1Rh.js";
2
2
  import { useMemo } from "react";
3
3
  import { jsx } from "react/jsx-runtime";
4
4
 
@@ -1,3 +1,3 @@
1
- import "../definitions-DuxDer_c.js";
2
- import { A as PageData, C as ContentStorage, D as buildContentStorage, E as ContentStoragePageFile, F as multiple, I as source, L as update, M as SourceConfig, N as VirtualFile, O as FileSystem, P as _ConfigUnion_, 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-2U6Tl4--.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_, buildContentStorage, createGetUrl, createPageTreeBuilder, getSlugs, loader, multiple, source, update };
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 };
@@ -1,8 +1,8 @@
1
- import { t as normalizeUrl } from "../normalize-url-DP9-1I-S.js";
2
- import { c as visit } from "../utils-DUvi2WkD.js";
3
- import { a as path_exports, i as joinPath, n as dirname, o as slash, r as extname, s as splitPath, t as basename } from "../path-DHIjrDBP.js";
1
+ import { t as normalizeUrl } from "../normalize-url-3WQZ_H_j.js";
2
+ import { c as visit } from "../utils-bAoAH1Rh.js";
3
+ import { a as path_exports, i as joinPath, n as dirname, o as slash, r as extname, s as splitPath, t as basename } from "../path-D6M0ZQvO.js";
4
4
  import { getSlugs, slugsPlugin } from "./plugins/slugs.js";
5
- import { t as iconPlugin } from "../icon-Dt7IObrc.js";
5
+ import { t as iconPlugin } from "../icon-5lVe3l-0.js";
6
6
  import path from "node:path";
7
7
 
8
8
  //#region src/source/source.ts
@@ -1 +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\n/**\n * update a source object in-place.\n */\nexport function update<Config extends SourceConfig>(source: Source<Config>) {\n return {\n files<Page extends PageData, Meta extends MetaData>(\n fn: (files: VirtualFile<Config>[]) => (VirtualPage<Page> | VirtualMeta<Meta>)[],\n ) {\n source.files = fn(source.files);\n return this as unknown as typeof update<{\n pageData: Page;\n metaData: Meta;\n }>;\n },\n page<V extends PageData>(fn: (page: VirtualPage<Config['pageData']>) => VirtualPage<V>) {\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 unknown as typeof update<{\n pageData: V;\n metaData: Config['metaData'];\n }>;\n },\n meta<V extends MetaData>(fn: (meta: VirtualMeta<Config['metaData']>) => VirtualMeta<V>) {\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 unknown as typeof update<{\n pageData: Config['pageData'];\n metaData: V;\n }>;\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
+ {"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,5 +1,5 @@
1
- import "../../definitions-DuxDer_c.js";
2
- import { s as LoaderPlugin } from "../../index-2U6Tl4--.js";
1
+ import "../../definitions-DJAPG-2U.js";
2
+ import { s as LoaderPlugin } from "../../index-Co_C8NEi.js";
3
3
  import { icons } from "lucide-react";
4
4
 
5
5
  //#region src/source/plugins/lucide-icons.d.ts
@@ -1,4 +1,4 @@
1
- import { t as iconPlugin } from "../../icon-Dt7IObrc.js";
1
+ import { t as iconPlugin } from "../../icon-5lVe3l-0.js";
2
2
  import { createElement } from "react";
3
3
  import { icons } from "lucide-react";
4
4
 
@@ -1,3 +1,3 @@
1
- import "../../definitions-DuxDer_c.js";
2
- import { _ as slugsPlugin, g as slugsFromData, h as getSlugs, m as SlugFn } from "../../index-2U6Tl4--.js";
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
3
  export { SlugFn, getSlugs, slugsFromData, slugsPlugin };
@@ -1,4 +1,4 @@
1
- import { n as dirname, r as extname, t as basename } from "../../path-DHIjrDBP.js";
1
+ import { n as dirname, r as extname, t as basename } from "../../path-D6M0ZQvO.js";
2
2
 
3
3
  //#region src/source/plugins/slugs.ts
4
4
  /**
@@ -1,4 +1,4 @@
1
- import { n as searchSimple, t as searchAdvanced } from "./advanced-BRT5Ij43.js";
1
+ import { n as searchSimple, t as searchAdvanced } from "./advanced-DSlc7qa9.js";
2
2
  import { create, load } from "@orama/orama";
3
3
 
4
4
  //#region src/search/client/static.ts
@@ -48,4 +48,4 @@ async function search(query, options) {
48
48
 
49
49
  //#endregion
50
50
  export { search };
51
- //# sourceMappingURL=static-Dq8pA8Ay.js.map
51
+ //# sourceMappingURL=static-DAjBQpus.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"static-Dq8pA8Ay.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"}
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,5 +1,5 @@
1
1
  import { ComponentProps, ReactNode, RefObject } from "react";
2
- import * as react_jsx_runtime6 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/toc.d.ts
5
5
  interface TOCItemType {
@@ -36,12 +36,12 @@ interface ScrollProviderProps {
36
36
  declare function ScrollProvider({
37
37
  containerRef,
38
38
  children
39
- }: ScrollProviderProps): react_jsx_runtime6.JSX.Element;
39
+ }: ScrollProviderProps): react_jsx_runtime0.JSX.Element;
40
40
  declare function AnchorProvider({
41
41
  toc,
42
42
  single,
43
43
  children
44
- }: AnchorProviderProps): react_jsx_runtime6.JSX.Element;
44
+ }: AnchorProviderProps): react_jsx_runtime0.JSX.Element;
45
45
  interface TOCItemProps extends Omit<ComponentProps<'a'>, 'href'> {
46
46
  href: string;
47
47
  onActiveChange?: (v: boolean) => void;
@@ -50,7 +50,7 @@ declare function TOCItem({
50
50
  ref,
51
51
  onActiveChange,
52
52
  ...props
53
- }: TOCItemProps): react_jsx_runtime6.JSX.Element;
53
+ }: TOCItemProps): react_jsx_runtime0.JSX.Element;
54
54
  //#endregion
55
55
  export { AnchorProvider, AnchorProviderProps, ScrollProvider, ScrollProviderProps, TOCItem, TOCItemProps, TOCItemType, TableOfContents, useActiveAnchor, useActiveAnchors };
56
56
  //# sourceMappingURL=toc.d.ts.map
@@ -7,4 +7,4 @@ async function resolvePlugins(def, options = []) {
7
7
 
8
8
  //#endregion
9
9
  export { resolvePlugins as t };
10
- //# sourceMappingURL=util-s9piKHsk.js.map
10
+ //# sourceMappingURL=util-92szu3Vf.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"util-s9piKHsk.js","names":[],"sources":["../src/content/mdx/util.ts"],"sourcesContent":["import type { Pluggable } from 'unified';\n\ntype Thenable<T> = T | PromiseLike<T>;\n\nexport type ResolvePlugins = Thenable<Pluggable>[] | ((v: Pluggable[]) => Thenable<Pluggable>[]);\n\nexport async function resolvePlugins(\n def: (v: Thenable<Pluggable>[]) => Thenable<Pluggable | false>[],\n options: ResolvePlugins = [],\n): Promise<Pluggable[]> {\n const list = (await Promise.all(def(Array.isArray(options) ? options : []))).filter(\n (v) => v !== false,\n );\n\n if (typeof options === 'function') {\n return Promise.all(options(list));\n }\n\n return list;\n}\n"],"mappings":";AAMA,eAAsB,eACpB,KACA,UAA0B,EAAE,EACN;CACtB,MAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,MAAM,QAAQ,QAAQ,GAAG,UAAU,EAAE,CAAC,CAAC,EAAE,QAC1E,MAAM,MAAM,MACd;AAED,KAAI,OAAO,YAAY,WACrB,QAAO,QAAQ,IAAI,QAAQ,KAAK,CAAC;AAGnC,QAAO"}
1
+ {"version":3,"file":"util-92szu3Vf.js","names":[],"sources":["../src/content/mdx/util.ts"],"sourcesContent":["import type { Pluggable } from 'unified';\n\ntype Thenable<T> = T | PromiseLike<T>;\n\nexport type ResolvePlugins = Thenable<Pluggable>[] | ((v: Pluggable[]) => Thenable<Pluggable>[]);\n\nexport async function resolvePlugins(\n def: (v: Thenable<Pluggable>[]) => Thenable<Pluggable | false>[],\n options: ResolvePlugins = [],\n): Promise<Pluggable[]> {\n const list = (await Promise.all(def(Array.isArray(options) ? options : []))).filter(\n (v) => v !== false,\n );\n\n if (typeof options === 'function') {\n return Promise.all(options(list));\n }\n\n return list;\n}\n"],"mappings":";AAMA,eAAsB,eACpB,KACA,UAA0B,EAAE,EACN;CACtB,MAAM,QAAQ,MAAM,QAAQ,IAAI,IAAI,MAAM,QAAQ,QAAQ,GAAG,UAAU,EAAE,CAAC,CAAC,EAAE,QAC1E,MAAM,MAAM,MACd;AAED,KAAI,OAAO,YAAY,WACrB,QAAO,QAAQ,IAAI,QAAQ,KAAK,CAAC;AAGnC,QAAO"}
@@ -5,4 +5,4 @@ type Thenable<T> = T | PromiseLike<T>;
5
5
  type ResolvePlugins = Thenable<Pluggable>[] | ((v: Pluggable[]) => Thenable<Pluggable>[]);
6
6
  //#endregion
7
7
  export { ResolvePlugins as t };
8
- //# sourceMappingURL=util-CK2ykiif.d.ts.map
8
+ //# sourceMappingURL=util-ofJFdM-e.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"util-ofJFdM-e.d.ts","names":[],"sources":["../src/content/mdx/util.ts"],"sourcesContent":[],"mappings":";;;KAEK,cAAc,IAAI,YAAY;KAEvB,cAAA,GAAiB,SAAS,oBAAoB,gBAAgB,SAAS"}
@@ -131,4 +131,4 @@ function visit(root, visitor) {
131
131
 
132
132
  //#endregion
133
133
  export { flattenTree as a, visit as c, findSiblings as i, findParent as n, getPageTreePeers as o, findPath as r, getPageTreeRoots as s, findNeighbour as t };
134
- //# sourceMappingURL=utils-DUvi2WkD.js.map
134
+ //# sourceMappingURL=utils-bAoAH1Rh.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils-DUvi2WkD.js","names":["out: PageTree.Item[]","result: PageTree.Root | PageTree.Folder | undefined","separator: PageTree.Separator | undefined","nodes","items: PageTree.Node[]"],"sources":["../src/page-tree/utils.ts"],"sourcesContent":["import type * as PageTree from '@/page-tree/definitions';\n\n/**\n * Flatten tree to an array of page nodes\n */\nexport function flattenTree(nodes: PageTree.Node[]): PageTree.Item[] {\n const out: PageTree.Item[] = [];\n\n for (const node of nodes) {\n if (node.type === 'folder') {\n if (node.index) out.push(node.index);\n out.push(...flattenTree(node.children));\n } else if (node.type === 'page') {\n out.push(node);\n }\n }\n\n return out;\n}\n\n/**\n * Get neighbours of a page, useful for implementing \"previous & next\" buttons\n */\nexport function findNeighbour(\n tree: PageTree.Root,\n url: string,\n options?: {\n separateRoot?: boolean;\n },\n): {\n previous?: PageTree.Item;\n next?: PageTree.Item;\n} {\n const { separateRoot = true } = options ?? {};\n const roots = separateRoot ? getPageTreeRoots(tree) : [tree];\n if (tree.fallback) roots.push(tree.fallback);\n\n for (const root of roots) {\n const list = flattenTree(root.children);\n const idx = list.findIndex((item) => item.url === url);\n if (idx === -1) continue;\n\n return {\n previous: list[idx - 1],\n next: list[idx + 1],\n };\n }\n\n return {};\n}\n\nexport function getPageTreeRoots(\n pageTree: PageTree.Root | PageTree.Folder,\n): (PageTree.Root | PageTree.Folder)[] {\n const result = pageTree.children.flatMap((child) => {\n if (child.type !== 'folder') return [];\n const roots = getPageTreeRoots(child);\n\n if (child.root) roots.push(child);\n return roots;\n });\n\n if (!('type' in pageTree)) result.push(pageTree);\n return result;\n}\n\n/**\n * Get other item nodes that lives under the same parent.\n */\nexport function getPageTreePeers(\n treeOrTrees: PageTree.Root | Record<string, PageTree.Root>,\n url: string,\n): PageTree.Item[] {\n return findSiblings(treeOrTrees, url).filter((item) => item.type === 'page');\n}\n\n/**\n * Get other tree nodes that lives under the same parent.\n */\nexport function findSiblings(\n treeOrTrees: PageTree.Root | Record<string, PageTree.Root>,\n url: string,\n): PageTree.Node[] {\n // Check if it's a single tree or multiple trees (i18n)\n if ('children' in treeOrTrees) {\n // Single tree case\n const tree = treeOrTrees as PageTree.Root;\n const parent = findParent(tree, url);\n if (!parent) return [];\n\n return parent.children.filter((item) => item.type !== 'page' || item.url !== url);\n }\n\n // Multiple trees case\n for (const lang in treeOrTrees) {\n const result = getPageTreePeers(treeOrTrees[lang], url);\n if (result) return result;\n }\n\n return [];\n}\n\nexport function findParent(\n from: PageTree.Root | PageTree.Folder,\n url: string,\n): PageTree.Root | PageTree.Folder | undefined {\n let result: PageTree.Root | PageTree.Folder | undefined;\n\n visit(from, (node, parent) => {\n if ('type' in node && node.type === 'page' && node.url === url) {\n result = parent;\n return 'break';\n }\n });\n\n return result;\n}\n\n/**\n * Search the path of a node in the tree matched by the matcher.\n *\n * @returns The path to the target node (from starting root), or null if the page doesn't exist\n */\nexport function findPath(\n nodes: PageTree.Node[],\n matcher: (node: PageTree.Node) => boolean,\n options: {\n includeSeparator?: boolean;\n } = {},\n): PageTree.Node[] | null {\n const { includeSeparator = true } = options;\n\n function run(nodes: PageTree.Node[]): PageTree.Node[] | undefined {\n let separator: PageTree.Separator | undefined;\n\n for (const node of nodes) {\n if (matcher(node)) {\n const items: PageTree.Node[] = [];\n if (separator) items.push(separator);\n items.push(node);\n\n return items;\n }\n\n if (node.type === 'separator' && includeSeparator) {\n separator = node;\n continue;\n }\n\n if (node.type === 'folder') {\n const items = node.index && matcher(node.index) ? [node.index] : run(node.children);\n\n if (items) {\n items.unshift(node);\n if (separator) items.unshift(separator);\n\n return items;\n }\n }\n }\n }\n\n return run(nodes) ?? null;\n}\n\nconst VisitBreak = Symbol('VisitBreak');\n\n/**\n * Perform a depth-first search on page tree visiting every node.\n *\n * @param root - the root of page tree to visit.\n * @param visitor - function to receive nodes, return `skip` to skip the children of current node, `break` to stop the search entirely.\n */\nexport function visit<Root extends PageTree.Node | PageTree.Root>(\n root: Root,\n visitor: <T extends PageTree.Node | PageTree.Root>(\n node: T,\n parent?: PageTree.Root | PageTree.Folder,\n ) => 'skip' | 'break' | T | void,\n): Root {\n function onNode<T extends PageTree.Node | PageTree.Root>(\n node: T,\n parent?: PageTree.Root | PageTree.Folder,\n ): T {\n const result = visitor(node, parent);\n switch (result) {\n case 'skip':\n return node;\n case 'break':\n throw VisitBreak;\n default:\n if (result) node = result;\n }\n\n if ('index' in node && node.index) {\n node.index = onNode(node.index, node);\n }\n\n if ('fallback' in node && node.fallback) {\n node.fallback = onNode(node.fallback, node);\n }\n\n if ('children' in node) {\n for (let i = 0; i < node.children.length; i++) {\n node.children[i] = onNode(node.children[i], node);\n }\n }\n\n return node;\n }\n\n try {\n return onNode(root);\n } catch (e) {\n if (e === VisitBreak) return root;\n throw e;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"utils-bAoAH1Rh.js","names":["out: PageTree.Item[]","result: PageTree.Root | PageTree.Folder | undefined","separator: PageTree.Separator | undefined","nodes","items: PageTree.Node[]"],"sources":["../src/page-tree/utils.ts"],"sourcesContent":["import type * as PageTree from '@/page-tree/definitions';\n\n/**\n * Flatten tree to an array of page nodes\n */\nexport function flattenTree(nodes: PageTree.Node[]): PageTree.Item[] {\n const out: PageTree.Item[] = [];\n\n for (const node of nodes) {\n if (node.type === 'folder') {\n if (node.index) out.push(node.index);\n out.push(...flattenTree(node.children));\n } else if (node.type === 'page') {\n out.push(node);\n }\n }\n\n return out;\n}\n\n/**\n * Get neighbours of a page, useful for implementing \"previous & next\" buttons\n */\nexport function findNeighbour(\n tree: PageTree.Root,\n url: string,\n options?: {\n separateRoot?: boolean;\n },\n): {\n previous?: PageTree.Item;\n next?: PageTree.Item;\n} {\n const { separateRoot = true } = options ?? {};\n const roots = separateRoot ? getPageTreeRoots(tree) : [tree];\n if (tree.fallback) roots.push(tree.fallback);\n\n for (const root of roots) {\n const list = flattenTree(root.children);\n const idx = list.findIndex((item) => item.url === url);\n if (idx === -1) continue;\n\n return {\n previous: list[idx - 1],\n next: list[idx + 1],\n };\n }\n\n return {};\n}\n\nexport function getPageTreeRoots(\n pageTree: PageTree.Root | PageTree.Folder,\n): (PageTree.Root | PageTree.Folder)[] {\n const result = pageTree.children.flatMap((child) => {\n if (child.type !== 'folder') return [];\n const roots = getPageTreeRoots(child);\n\n if (child.root) roots.push(child);\n return roots;\n });\n\n if (!('type' in pageTree)) result.push(pageTree);\n return result;\n}\n\n/**\n * Get other item nodes that lives under the same parent.\n */\nexport function getPageTreePeers(\n treeOrTrees: PageTree.Root | Record<string, PageTree.Root>,\n url: string,\n): PageTree.Item[] {\n return findSiblings(treeOrTrees, url).filter((item) => item.type === 'page');\n}\n\n/**\n * Get other tree nodes that lives under the same parent.\n */\nexport function findSiblings(\n treeOrTrees: PageTree.Root | Record<string, PageTree.Root>,\n url: string,\n): PageTree.Node[] {\n // Check if it's a single tree or multiple trees (i18n)\n if ('children' in treeOrTrees) {\n // Single tree case\n const tree = treeOrTrees as PageTree.Root;\n const parent = findParent(tree, url);\n if (!parent) return [];\n\n return parent.children.filter((item) => item.type !== 'page' || item.url !== url);\n }\n\n // Multiple trees case\n for (const lang in treeOrTrees) {\n const result = getPageTreePeers(treeOrTrees[lang], url);\n if (result) return result;\n }\n\n return [];\n}\n\nexport function findParent(\n from: PageTree.Root | PageTree.Folder,\n url: string,\n): PageTree.Root | PageTree.Folder | undefined {\n let result: PageTree.Root | PageTree.Folder | undefined;\n\n visit(from, (node, parent) => {\n if ('type' in node && node.type === 'page' && node.url === url) {\n result = parent;\n return 'break';\n }\n });\n\n return result;\n}\n\n/**\n * Search the path of a node in the tree matched by the matcher.\n *\n * @returns The path to the target node (from starting root), or null if the page doesn't exist\n */\nexport function findPath(\n nodes: PageTree.Node[],\n matcher: (node: PageTree.Node) => boolean,\n options: {\n includeSeparator?: boolean;\n } = {},\n): PageTree.Node[] | null {\n const { includeSeparator = true } = options;\n\n function run(nodes: PageTree.Node[]): PageTree.Node[] | undefined {\n let separator: PageTree.Separator | undefined;\n\n for (const node of nodes) {\n if (matcher(node)) {\n const items: PageTree.Node[] = [];\n if (separator) items.push(separator);\n items.push(node);\n\n return items;\n }\n\n if (node.type === 'separator' && includeSeparator) {\n separator = node;\n continue;\n }\n\n if (node.type === 'folder') {\n const items = node.index && matcher(node.index) ? [node.index] : run(node.children);\n\n if (items) {\n items.unshift(node);\n if (separator) items.unshift(separator);\n\n return items;\n }\n }\n }\n }\n\n return run(nodes) ?? null;\n}\n\nconst VisitBreak = Symbol('VisitBreak');\n\n/**\n * Perform a depth-first search on page tree visiting every node.\n *\n * @param root - the root of page tree to visit.\n * @param visitor - function to receive nodes, return `skip` to skip the children of current node, `break` to stop the search entirely.\n */\nexport function visit<Root extends PageTree.Node | PageTree.Root>(\n root: Root,\n visitor: <T extends PageTree.Node | PageTree.Root>(\n node: T,\n parent?: PageTree.Root | PageTree.Folder,\n ) => 'skip' | 'break' | T | void,\n): Root {\n function onNode<T extends PageTree.Node | PageTree.Root>(\n node: T,\n parent?: PageTree.Root | PageTree.Folder,\n ): T {\n const result = visitor(node, parent);\n switch (result) {\n case 'skip':\n return node;\n case 'break':\n throw VisitBreak;\n default:\n if (result) node = result;\n }\n\n if ('index' in node && node.index) {\n node.index = onNode(node.index, node);\n }\n\n if ('fallback' in node && node.fallback) {\n node.fallback = onNode(node.fallback, node);\n }\n\n if ('children' in node) {\n for (let i = 0; i < node.children.length; i++) {\n node.children[i] = onNode(node.children[i], node);\n }\n }\n\n return node;\n }\n\n try {\n return onNode(root);\n } catch (e) {\n if (e === VisitBreak) return root;\n throw e;\n }\n}\n"],"mappings":"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"}