fumadocs-core 16.4.1 → 16.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/dist/advanced-DSlc7qa9.js +80 -0
  2. package/dist/advanced-DSlc7qa9.js.map +1 -0
  3. package/dist/algolia-BGWM-DkQ.js +49 -0
  4. package/dist/algolia-BGWM-DkQ.js.map +1 -0
  5. package/dist/algolia-FqjcaTcD.d.ts +68 -0
  6. package/dist/algolia-FqjcaTcD.d.ts.map +1 -0
  7. package/dist/breadcrumb.d.ts +29 -27
  8. package/dist/breadcrumb.d.ts.map +1 -0
  9. package/dist/breadcrumb.js +55 -72
  10. package/dist/breadcrumb.js.map +1 -0
  11. package/dist/chunk-C1JLJEPO.js +42 -0
  12. package/dist/codeblock-utils-Dh1w8ICD.d.ts +37 -0
  13. package/dist/codeblock-utils-Dh1w8ICD.d.ts.map +1 -0
  14. package/dist/content/github.d.ts +43 -32
  15. package/dist/content/github.d.ts.map +1 -0
  16. package/dist/content/github.js +29 -43
  17. package/dist/content/github.js.map +1 -0
  18. package/dist/content/index.d.ts +20 -13
  19. package/dist/content/index.d.ts.map +1 -0
  20. package/dist/content/index.js +17 -23
  21. package/dist/content/index.js.map +1 -0
  22. package/dist/content/mdx/preset-bundler.d.ts +22 -24
  23. package/dist/content/mdx/preset-bundler.d.ts.map +1 -0
  24. package/dist/content/mdx/preset-bundler.js +38 -69
  25. package/dist/content/mdx/preset-bundler.js.map +1 -0
  26. package/dist/content/mdx/preset-runtime.d.ts +22 -24
  27. package/dist/content/mdx/preset-runtime.d.ts.map +1 -0
  28. package/dist/content/mdx/preset-runtime.js +36 -68
  29. package/dist/content/mdx/preset-runtime.js.map +1 -0
  30. package/dist/content/toc.d.ts +7 -6
  31. package/dist/content/toc.d.ts.map +1 -0
  32. package/dist/content/toc.js +15 -19
  33. package/dist/content/toc.js.map +1 -0
  34. package/dist/definitions-DJAPG-2U.d.ts +62 -0
  35. package/dist/definitions-DJAPG-2U.d.ts.map +1 -0
  36. package/dist/dynamic-link.d.ts +7 -5
  37. package/dist/dynamic-link.d.ts.map +1 -0
  38. package/dist/dynamic-link.js +29 -27
  39. package/dist/dynamic-link.js.map +1 -0
  40. package/dist/fetch-B1nmMSyw.js +20 -0
  41. package/dist/fetch-B1nmMSyw.js.map +1 -0
  42. package/dist/framework/index.d.ts +38 -29
  43. package/dist/framework/index.d.ts.map +1 -0
  44. package/dist/framework/index.js +68 -17
  45. package/dist/framework/index.js.map +1 -0
  46. package/dist/framework/next.d.ts +15 -10
  47. package/dist/framework/next.d.ts.map +1 -0
  48. package/dist/framework/next.js +18 -26
  49. package/dist/framework/next.js.map +1 -0
  50. package/dist/framework/react-router.d.ts +15 -10
  51. package/dist/framework/react-router.d.ts.map +1 -0
  52. package/dist/framework/react-router.js +42 -55
  53. package/dist/framework/react-router.js.map +1 -0
  54. package/dist/framework/tanstack.d.ts +15 -10
  55. package/dist/framework/tanstack.d.ts.map +1 -0
  56. package/dist/framework/tanstack.js +54 -69
  57. package/dist/framework/tanstack.js.map +1 -0
  58. package/dist/framework/waku.d.ts +15 -10
  59. package/dist/framework/waku.d.ts.map +1 -0
  60. package/dist/framework/waku.js +47 -58
  61. package/dist/framework/waku.js.map +1 -0
  62. package/dist/highlight/client.d.ts +6 -7
  63. package/dist/highlight/client.d.ts.map +1 -0
  64. package/dist/highlight/client.js +22 -14
  65. package/dist/highlight/client.js.map +1 -0
  66. package/dist/highlight/index.d.ts +2 -30
  67. package/dist/highlight/index.js +3 -13
  68. package/dist/i18n/index.d.ts +2 -39
  69. package/dist/i18n/index.js +6 -7
  70. package/dist/i18n/index.js.map +1 -0
  71. package/dist/i18n/middleware.d.ts +36 -28
  72. package/dist/i18n/middleware.d.ts.map +1 -0
  73. package/dist/i18n/middleware.js +55 -73
  74. package/dist/i18n/middleware.js.map +1 -0
  75. package/dist/icon-5lVe3l-0.js +19 -0
  76. package/dist/icon-5lVe3l-0.js.map +1 -0
  77. package/dist/index-BhVrX5J1.d.ts +41 -0
  78. package/dist/index-BhVrX5J1.d.ts.map +1 -0
  79. package/dist/index-Co_C8NEi.d.ts +380 -0
  80. package/dist/index-Co_C8NEi.d.ts.map +1 -0
  81. package/dist/link.d.ts +17 -15
  82. package/dist/link.d.ts.map +1 -0
  83. package/dist/link.js +29 -9
  84. package/dist/link.js.map +1 -0
  85. package/dist/mdast-utils-ix4DsXJP.js +40 -0
  86. package/dist/mdast-utils-ix4DsXJP.js.map +1 -0
  87. package/dist/mdx-plugins/codeblock-utils.d.ts +2 -29
  88. package/dist/mdx-plugins/codeblock-utils.js +71 -9
  89. package/dist/mdx-plugins/codeblock-utils.js.map +1 -0
  90. package/dist/mdx-plugins/index.d.ts +15 -20
  91. package/dist/mdx-plugins/index.js +18 -73
  92. package/dist/mdx-plugins/rehype-code.d.ts +2 -55
  93. package/dist/mdx-plugins/rehype-code.js +5 -15
  94. package/dist/mdx-plugins/rehype-toc.d.ts +2 -14
  95. package/dist/mdx-plugins/rehype-toc.js +3 -7
  96. package/dist/mdx-plugins/remark-admonition.d.ts +2 -20
  97. package/dist/mdx-plugins/remark-admonition.js +74 -8
  98. package/dist/mdx-plugins/remark-admonition.js.map +1 -0
  99. package/dist/mdx-plugins/remark-code-tab.d.ts +2 -30
  100. package/dist/mdx-plugins/remark-code-tab.js +183 -7
  101. package/dist/mdx-plugins/remark-code-tab.js.map +1 -0
  102. package/dist/mdx-plugins/remark-directive-admonition.d.ts +2 -27
  103. package/dist/mdx-plugins/remark-directive-admonition.js +60 -7
  104. package/dist/mdx-plugins/remark-directive-admonition.js.map +1 -0
  105. package/dist/mdx-plugins/remark-gfm.d.ts +2 -1
  106. package/dist/mdx-plugins/remark-gfm.js +3 -7
  107. package/dist/mdx-plugins/remark-heading.d.ts +2 -31
  108. package/dist/mdx-plugins/remark-heading.js +45 -8
  109. package/dist/mdx-plugins/remark-heading.js.map +1 -0
  110. package/dist/mdx-plugins/remark-image.d.ts +2 -57
  111. package/dist/mdx-plugins/remark-image.js +192 -7
  112. package/dist/mdx-plugins/remark-image.js.map +1 -0
  113. package/dist/mdx-plugins/remark-mdx-files.d.ts +2 -40
  114. package/dist/mdx-plugins/remark-mdx-files.js +187 -7
  115. package/dist/mdx-plugins/remark-mdx-files.js.map +1 -0
  116. package/dist/mdx-plugins/remark-mdx-mermaid.d.ts +2 -15
  117. package/dist/mdx-plugins/remark-mdx-mermaid.js +31 -7
  118. package/dist/mdx-plugins/remark-mdx-mermaid.js.map +1 -0
  119. package/dist/mdx-plugins/remark-npm.d.ts +2 -31
  120. package/dist/mdx-plugins/remark-npm.js +68 -8
  121. package/dist/mdx-plugins/remark-npm.js.map +1 -0
  122. package/dist/mdx-plugins/remark-steps.d.ts +2 -23
  123. package/dist/mdx-plugins/remark-steps.js +77 -7
  124. package/dist/mdx-plugins/remark-steps.js.map +1 -0
  125. package/dist/mdx-plugins/remark-structure.d.ts +2 -71
  126. package/dist/mdx-plugins/remark-structure.js +105 -11
  127. package/dist/mdx-plugins/remark-structure.js.map +1 -0
  128. package/dist/mixedbread-DSiQfUnN.js +88 -0
  129. package/dist/mixedbread-DSiQfUnN.js.map +1 -0
  130. package/dist/negotiation/index.d.ts +6 -4
  131. package/dist/negotiation/index.d.ts.map +1 -0
  132. package/dist/negotiation/index.js +41 -11
  133. package/dist/negotiation/index.js.map +1 -0
  134. package/dist/normalize-url-3WQZ_H_j.js +16 -0
  135. package/dist/normalize-url-3WQZ_H_j.js.map +1 -0
  136. package/dist/orama-cloud-BMDBfk05.js +84 -0
  137. package/dist/orama-cloud-BMDBfk05.js.map +1 -0
  138. package/dist/orama-cloud-legacy-CRZzZXWn.js +82 -0
  139. package/dist/orama-cloud-legacy-CRZzZXWn.js.map +1 -0
  140. package/dist/page-tree/index.d.ts +23 -11
  141. package/dist/page-tree/index.d.ts.map +1 -0
  142. package/dist/page-tree/index.js +3 -17
  143. package/dist/path-D6M0ZQvO.js +60 -0
  144. package/dist/path-D6M0ZQvO.js.map +1 -0
  145. package/dist/rehype-code-Bd52chOe.d.ts +58 -0
  146. package/dist/rehype-code-Bd52chOe.d.ts.map +1 -0
  147. package/dist/rehype-code-Dr35mETC.js +241 -0
  148. package/dist/rehype-code-Dr35mETC.js.map +1 -0
  149. package/dist/rehype-toc-BJVsblvp.d.ts +18 -0
  150. package/dist/rehype-toc-BJVsblvp.d.ts.map +1 -0
  151. package/dist/rehype-toc-Dqgey2tW.js +143 -0
  152. package/dist/rehype-toc-Dqgey2tW.js.map +1 -0
  153. package/dist/remark-admonition-Chku_iWO.d.ts +22 -0
  154. package/dist/remark-admonition-Chku_iWO.d.ts.map +1 -0
  155. package/dist/remark-code-tab-C0f6BPcw.d.ts +32 -0
  156. package/dist/remark-code-tab-C0f6BPcw.d.ts.map +1 -0
  157. package/dist/remark-directive-admonition-CBwJdh9z.d.ts +36 -0
  158. package/dist/remark-directive-admonition-CBwJdh9z.d.ts.map +1 -0
  159. package/dist/remark-gfm-B2aZXutO.d.ts +2 -0
  160. package/dist/remark-heading-CUAe4zIu.d.ts +37 -0
  161. package/dist/remark-heading-CUAe4zIu.d.ts.map +1 -0
  162. package/dist/remark-image-DMRnxsRO.d.ts +65 -0
  163. package/dist/remark-image-DMRnxsRO.d.ts.map +1 -0
  164. package/dist/remark-mdx-files-B5KMXnfh.d.ts +56 -0
  165. package/dist/remark-mdx-files-B5KMXnfh.d.ts.map +1 -0
  166. package/dist/remark-mdx-mermaid-C_4W5gfj.d.ts +17 -0
  167. package/dist/remark-mdx-mermaid-C_4W5gfj.d.ts.map +1 -0
  168. package/dist/remark-npm-CykFgJn2.d.ts +36 -0
  169. package/dist/remark-npm-CykFgJn2.d.ts.map +1 -0
  170. package/dist/remark-steps-5-DmLVv3.d.ts +28 -0
  171. package/dist/remark-steps-5-DmLVv3.d.ts.map +1 -0
  172. package/dist/remark-structure-CszwnaMR.d.ts +77 -0
  173. package/dist/remark-structure-CszwnaMR.d.ts.map +1 -0
  174. package/dist/remove-undefined-B7zJF-YS.js +19 -0
  175. package/dist/remove-undefined-B7zJF-YS.js.map +1 -0
  176. package/dist/search/algolia.d.ts +3 -69
  177. package/dist/search/algolia.js +69 -63
  178. package/dist/search/algolia.js.map +1 -0
  179. package/dist/search/client.d.ts +143 -114
  180. package/dist/search/client.d.ts.map +1 -0
  181. package/dist/search/client.js +98 -91
  182. package/dist/search/client.js.map +1 -0
  183. package/dist/search/index.d.ts +20 -18
  184. package/dist/search/index.d.ts.map +1 -0
  185. package/dist/search/index.js +3 -7
  186. package/dist/search/orama-cloud-legacy.d.ts +81 -0
  187. package/dist/search/orama-cloud-legacy.d.ts.map +1 -0
  188. package/dist/search/orama-cloud-legacy.js +50 -0
  189. package/dist/search/orama-cloud-legacy.js.map +1 -0
  190. package/dist/search/orama-cloud.d.ts +72 -70
  191. package/dist/search/orama-cloud.d.ts.map +1 -0
  192. package/dist/search/orama-cloud.js +46 -54
  193. package/dist/search/orama-cloud.js.map +1 -0
  194. package/dist/search/server.d.ts +6 -136
  195. package/dist/search/server.js +292 -369
  196. package/dist/search/server.js.map +1 -0
  197. package/dist/search-DcH54N2x.js +44 -0
  198. package/dist/search-DcH54N2x.js.map +1 -0
  199. package/dist/server-BzFuYBxW.d.ts +133 -0
  200. package/dist/server-BzFuYBxW.d.ts.map +1 -0
  201. package/dist/shiki-Bdk0JGsB.d.ts +33 -0
  202. package/dist/shiki-Bdk0JGsB.d.ts.map +1 -0
  203. package/dist/shiki-DoHr6fEj.js +80 -0
  204. package/dist/shiki-DoHr6fEj.js.map +1 -0
  205. package/dist/source/client/index.d.ts +7 -5
  206. package/dist/source/client/index.d.ts.map +1 -0
  207. package/dist/source/client/index.js +24 -35
  208. package/dist/source/client/index.js.map +1 -0
  209. package/dist/source/index.d.ts +3 -42
  210. package/dist/source/index.js +599 -752
  211. package/dist/source/index.js.map +1 -0
  212. package/dist/source/plugins/lucide-icons.d.ts +7 -7
  213. package/dist/source/plugins/lucide-icons.d.ts.map +1 -0
  214. package/dist/source/plugins/lucide-icons.js +21 -20
  215. package/dist/source/plugins/lucide-icons.js.map +1 -0
  216. package/dist/source/plugins/slugs.d.ts +3 -0
  217. package/dist/source/plugins/slugs.js +65 -0
  218. package/dist/source/plugins/slugs.js.map +1 -0
  219. package/dist/source/schema.d.ts +17 -14
  220. package/dist/source/schema.d.ts.map +1 -0
  221. package/dist/source/schema.js +26 -22
  222. package/dist/source/schema.js.map +1 -0
  223. package/dist/static-DAjBQpus.js +51 -0
  224. package/dist/static-DAjBQpus.js.map +1 -0
  225. package/dist/toc.d.ts +38 -25
  226. package/dist/toc.d.ts.map +1 -0
  227. package/dist/toc.js +123 -136
  228. package/dist/toc.js.map +1 -0
  229. package/dist/util-92szu3Vf.js +10 -0
  230. package/dist/util-92szu3Vf.js.map +1 -0
  231. package/dist/util-ofJFdM-e.d.ts +8 -0
  232. package/dist/util-ofJFdM-e.d.ts.map +1 -0
  233. package/dist/utils/use-effect-event.d.ts +3 -1
  234. package/dist/utils/use-effect-event.d.ts.map +1 -0
  235. package/dist/utils/use-effect-event.js +16 -13
  236. package/dist/utils/use-effect-event.js.map +1 -0
  237. package/dist/utils/use-media-query.d.ts +3 -1
  238. package/dist/utils/use-media-query.d.ts.map +1 -0
  239. package/dist/utils/use-media-query.js +20 -20
  240. package/dist/utils/use-media-query.js.map +1 -0
  241. package/dist/utils/use-on-change.d.ts +3 -1
  242. package/dist/utils/use-on-change.d.ts.map +1 -0
  243. package/dist/utils/use-on-change.js +23 -7
  244. package/dist/utils/use-on-change.js.map +1 -0
  245. package/dist/utils-bAoAH1Rh.js +134 -0
  246. package/dist/utils-bAoAH1Rh.js.map +1 -0
  247. package/package.json +72 -65
  248. package/dist/algolia-IZEDLPHE.js +0 -58
  249. package/dist/chunk-5PMI7QDD.js +0 -220
  250. package/dist/chunk-ADBHPKXG.js +0 -78
  251. package/dist/chunk-APKPSBSB.js +0 -74
  252. package/dist/chunk-CH7YHH7V.js +0 -222
  253. package/dist/chunk-EFVXL2PP.js +0 -144
  254. package/dist/chunk-EMWGTXSW.js +0 -19
  255. package/dist/chunk-FAEPKD7U.js +0 -20
  256. package/dist/chunk-FUUVPEA5.js +0 -29
  257. package/dist/chunk-GINBKBVQ.js +0 -12
  258. package/dist/chunk-GLRQBLGN.js +0 -59
  259. package/dist/chunk-JUF4WZ6G.js +0 -117
  260. package/dist/chunk-K4WNLOVQ.js +0 -75
  261. package/dist/chunk-L4JKQWCM.js +0 -131
  262. package/dist/chunk-MA6O2UUE.js +0 -50
  263. package/dist/chunk-ONG4RVCR.js +0 -8
  264. package/dist/chunk-OTD7MV33.js +0 -53
  265. package/dist/chunk-PFNP6PEB.js +0 -11
  266. package/dist/chunk-SH7BNTG7.js +0 -38
  267. package/dist/chunk-TWIDBWFG.js +0 -84
  268. package/dist/chunk-U67V476Y.js +0 -35
  269. package/dist/chunk-VLSDGCJE.js +0 -47
  270. package/dist/chunk-W6WTLKRA.js +0 -73
  271. package/dist/chunk-X2HFD5QJ.js +0 -275
  272. package/dist/chunk-XJ6ZQNEX.js +0 -91
  273. package/dist/chunk-XN2LKXFZ.js +0 -101
  274. package/dist/chunk-XOFXGHS4.js +0 -93
  275. package/dist/chunk-XZSI7AHE.js +0 -67
  276. package/dist/chunk-YVVDKJ2H.js +0 -34
  277. package/dist/chunk-ZMWYLUDP.js +0 -21
  278. package/dist/definitions-pJ7PybYY.d.ts +0 -60
  279. package/dist/fetch-IBTWQCJR.js +0 -22
  280. package/dist/loader-_E2HOdV0.d.ts +0 -333
  281. package/dist/mixedbread-A3WLENES.js +0 -117
  282. package/dist/orama-cloud-UZAPMPFV.js +0 -93
  283. package/dist/static-A2YJ5TXV.js +0 -62
  284. package/dist/util-bZU2QeJ2.d.ts +0 -6
@@ -1,7 +1,192 @@
1
- import {
2
- remarkImage
3
- } from "../chunk-5PMI7QDD.js";
4
- import "../chunk-U67V476Y.js";
5
- export {
6
- remarkImage
7
- };
1
+ import { visit } from "unist-util-visit";
2
+ import * as path$1 from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ //#region src/mdx-plugins/remark-image.ts
6
+ const VALID_BLUR_EXT = [
7
+ ".jpeg",
8
+ ".png",
9
+ ".webp",
10
+ ".avif",
11
+ ".jpg"
12
+ ];
13
+ const EXTERNAL_URL_REGEX = /^https?:\/\//;
14
+ /**
15
+ * Turn images into Next.js Image compatible usage.
16
+ */
17
+ function remarkImage({ placeholder = "blur", external = true, useImport = true, onError = "error", publicDir = path$1.join(process.cwd(), "public") } = {}) {
18
+ return async (tree, file) => {
19
+ const importsToInject = [];
20
+ const promises = [];
21
+ async function onImage(src, node) {
22
+ const attributes = [{
23
+ type: "mdxJsxAttribute",
24
+ name: "alt",
25
+ value: node.alt ?? "image"
26
+ }];
27
+ if (node.title) attributes.push({
28
+ type: "mdxJsxAttribute",
29
+ name: "title",
30
+ value: node.title
31
+ });
32
+ if (src.type === "file" && useImport) {
33
+ const variableName = `__img${importsToInject.length}`;
34
+ const hasBlur = placeholder === "blur" && VALID_BLUR_EXT.some((ext) => src.file.endsWith(ext));
35
+ if (!file.dirname) throw new Error("When `useImport` is enabled, you must specify `dirname` in the VFile passed to compiler.");
36
+ importsToInject.push({
37
+ variableName,
38
+ importPath: getImportPath(src.file, file.dirname)
39
+ });
40
+ attributes.push({
41
+ type: "mdxJsxAttribute",
42
+ name: "src",
43
+ value: {
44
+ type: "mdxJsxAttributeValueExpression",
45
+ value: variableName,
46
+ data: { estree: {
47
+ body: [{
48
+ type: "ExpressionStatement",
49
+ expression: {
50
+ type: "Identifier",
51
+ name: variableName
52
+ }
53
+ }],
54
+ type: "Program",
55
+ sourceType: "script"
56
+ } }
57
+ }
58
+ });
59
+ const out = {
60
+ children: [],
61
+ type: "mdxJsxFlowElement",
62
+ name: "img",
63
+ attributes
64
+ };
65
+ if (hasBlur) out.attributes.push({
66
+ type: "mdxJsxAttribute",
67
+ name: "placeholder",
68
+ value: "blur"
69
+ });
70
+ return out;
71
+ }
72
+ const size = await getImageSize(src, external).catch((e) => {
73
+ throw new Error(`[Remark Image] Failed obtain image size for ${node.url} (public directory configured as ${publicDir})`, { cause: e });
74
+ });
75
+ if (!size) return;
76
+ attributes.push({
77
+ type: "mdxJsxAttribute",
78
+ name: "src",
79
+ value: src.type === "url" ? src.url.toString() : node.url
80
+ }, {
81
+ type: "mdxJsxAttribute",
82
+ name: "width",
83
+ value: size.width.toString()
84
+ }, {
85
+ type: "mdxJsxAttribute",
86
+ name: "height",
87
+ value: size.height.toString()
88
+ });
89
+ return {
90
+ type: "mdxJsxFlowElement",
91
+ name: "img",
92
+ attributes,
93
+ children: []
94
+ };
95
+ }
96
+ visit(tree, "image", (node) => {
97
+ const src = parseSrc(decodeURI(node.url), publicDir, file.dirname);
98
+ if (!src) return;
99
+ const task = onImage(src, node).catch((e) => {
100
+ if (onError === "ignore" || node.url.endsWith(".svg")) return;
101
+ if (onError === "hide") return {
102
+ type: "mdxJsxFlowElement",
103
+ name: null,
104
+ attributes: [],
105
+ children: []
106
+ };
107
+ if (onError === "error") throw e;
108
+ onError(e);
109
+ }).then((res) => {
110
+ if (res) Object.assign(node, res);
111
+ });
112
+ promises.push(task);
113
+ });
114
+ await Promise.all(promises);
115
+ if (importsToInject.length === 0) return;
116
+ const imports = importsToInject.map(({ variableName, importPath }) => ({
117
+ type: "mdxjsEsm",
118
+ data: { estree: { body: [{
119
+ type: "ImportDeclaration",
120
+ source: {
121
+ type: "Literal",
122
+ value: importPath
123
+ },
124
+ specifiers: [{
125
+ type: "ImportDefaultSpecifier",
126
+ local: {
127
+ type: "Identifier",
128
+ name: variableName
129
+ }
130
+ }]
131
+ }] } }
132
+ }));
133
+ tree.children.unshift(...imports);
134
+ };
135
+ }
136
+ function getImportPath(file, dir) {
137
+ const relative = path$1.relative(dir, file).replaceAll(path$1.sep, "/");
138
+ return relative.startsWith("../") ? relative : `./${relative}`;
139
+ }
140
+ /**
141
+ * @param src - src href
142
+ * @param publicDir - dir/url to resolve absolute paths
143
+ * @param dir - dir to resolve relative paths
144
+ */
145
+ function parseSrc(src, publicDir, dir) {
146
+ if (src.startsWith("file:///")) return {
147
+ type: "file",
148
+ file: fileURLToPath(src)
149
+ };
150
+ if (EXTERNAL_URL_REGEX.test(src)) return {
151
+ type: "url",
152
+ url: new URL(src)
153
+ };
154
+ if (src.startsWith("/")) {
155
+ if (EXTERNAL_URL_REGEX.test(publicDir)) {
156
+ const url = new URL(publicDir);
157
+ url.pathname = `/${[...url.pathname.split("/"), ...src.split("/")].filter((v) => v.length > 0).join("/")}`;
158
+ return {
159
+ type: "url",
160
+ url
161
+ };
162
+ }
163
+ return {
164
+ type: "file",
165
+ file: path$1.join(publicDir, src)
166
+ };
167
+ }
168
+ if (!dir) {
169
+ console.warn(`[Remark Image] found relative path ${src} but missing 'dirname' in VFile, this image will be skipped for now.`);
170
+ return;
171
+ }
172
+ return {
173
+ type: "file",
174
+ file: path$1.join(dir, src)
175
+ };
176
+ }
177
+ async function getImageSize(src, onExternal) {
178
+ if (src.type === "file") {
179
+ const { imageSizeFromFile } = await import("image-size/fromFile");
180
+ return imageSizeFromFile(src.file);
181
+ }
182
+ if (onExternal === false) return;
183
+ const { timeout } = typeof onExternal === "object" ? onExternal : {};
184
+ const res = await fetch(src.url, { signal: typeof timeout === "number" ? AbortSignal.timeout(timeout) : void 0 });
185
+ if (!res.ok) throw new Error(`[Remark Image] Failed to fetch ${src.url} (${res.status}): ${await res.text()}`);
186
+ const { imageSize } = await import("image-size");
187
+ return imageSize(new Uint8Array(await res.arrayBuffer()));
188
+ }
189
+
190
+ //#endregion
191
+ export { remarkImage };
192
+ //# sourceMappingURL=remark-image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remark-image.js","names":["path","importsToInject: { variableName: string; importPath: string }[]","promises: Promise<void>[]","attributes: MdxJsxAttribute[]","out: MdxJsxFlowElement"],"sources":["../../src/mdx-plugins/remark-image.ts"],"sourcesContent":["import * as path from 'node:path';\nimport type { Image, Root } from 'mdast';\nimport type { Transformer } from 'unified';\nimport { visit } from 'unist-util-visit';\nimport type { MdxjsEsm } from 'mdast-util-mdxjs-esm';\nimport type { ISizeCalculationResult } from 'image-size/types/interface';\nimport type { MdxJsxAttribute, MdxJsxFlowElement } from 'mdast-util-mdx-jsx';\nimport { fileURLToPath } from 'node:url';\n\nconst VALID_BLUR_EXT = ['.jpeg', '.png', '.webp', '.avif', '.jpg'];\nconst EXTERNAL_URL_REGEX = /^https?:\\/\\//;\n\ntype ExternalImageOptions =\n | {\n /**\n * timeout for fetching remote images (in milliseconds)\n */\n timeout?: number;\n }\n | boolean;\n\nexport interface RemarkImageOptions {\n /**\n * Directory or base URL to resolve absolute image paths\n */\n publicDir?: string;\n\n /**\n * Preferred placeholder type, only available with `useImport` + local images.\n *\n * @defaultValue 'blur'\n */\n placeholder?: 'blur' | 'none';\n\n /**\n * Define how to handle errors when fetching image size.\n *\n * - `error` (default): throw an error.\n * - `ignore`: do absolutely nothing (Next.js Image component may complain).\n * - `hide`: remove that image element.\n *\n * @defaultValue 'error'\n */\n onError?: 'error' | 'hide' | 'ignore' | ((error: Error) => void);\n\n /**\n * Import images in the file, and let bundlers handle it.\n *\n * ```tsx\n * import MyImage from \"./public/img.png\";\n *\n * <img src={MyImage} />\n * ```\n *\n * When disabled, `placeholder` will be ignored.\n *\n * @defaultValue true\n */\n useImport?: boolean;\n\n /**\n * Fetch image size of external URLs\n *\n * @defaultValue true\n */\n external?: ExternalImageOptions;\n}\n\ntype Source =\n | {\n type: 'url';\n url: URL;\n }\n | {\n type: 'file';\n file: string;\n };\n\n/**\n * Turn images into Next.js Image compatible usage.\n */\nexport function remarkImage({\n placeholder = 'blur',\n external = true,\n useImport = true,\n onError = 'error',\n publicDir = path.join(process.cwd(), 'public'),\n}: RemarkImageOptions = {}): Transformer<Root, Root> {\n return async (tree, file) => {\n const importsToInject: { variableName: string; importPath: string }[] = [];\n const promises: Promise<void>[] = [];\n\n async function onImage(src: Source, node: Image): Promise<MdxJsxFlowElement | undefined> {\n const attributes: MdxJsxAttribute[] = [\n {\n type: 'mdxJsxAttribute',\n name: 'alt',\n value: node.alt ?? 'image',\n },\n ];\n\n if (node.title) {\n attributes.push({\n type: 'mdxJsxAttribute',\n name: 'title',\n value: node.title,\n });\n }\n\n if (src.type === 'file' && useImport) {\n // Unique variable name for the given static image URL\n const variableName = `__img${importsToInject.length}`;\n const hasBlur =\n placeholder === 'blur' && VALID_BLUR_EXT.some((ext) => src.file.endsWith(ext));\n\n if (!file.dirname) {\n throw new Error(\n 'When `useImport` is enabled, you must specify `dirname` in the VFile passed to compiler.',\n );\n }\n\n importsToInject.push({\n variableName,\n importPath: getImportPath(src.file, file.dirname),\n });\n\n attributes.push({\n type: 'mdxJsxAttribute',\n name: 'src',\n value: {\n type: 'mdxJsxAttributeValueExpression',\n value: variableName,\n data: {\n estree: {\n body: [\n {\n type: 'ExpressionStatement',\n expression: { type: 'Identifier', name: variableName },\n },\n ],\n type: 'Program',\n sourceType: 'script',\n },\n },\n },\n });\n\n const out: MdxJsxFlowElement = {\n children: [],\n type: 'mdxJsxFlowElement',\n name: 'img',\n attributes,\n };\n\n if (hasBlur) {\n out.attributes.push({\n type: 'mdxJsxAttribute',\n name: 'placeholder',\n value: 'blur',\n });\n }\n\n return out;\n }\n\n const size = await getImageSize(src, external).catch((e) => {\n throw new Error(\n `[Remark Image] Failed obtain image size for ${node.url} (public directory configured as ${publicDir})`,\n {\n cause: e,\n },\n );\n });\n\n if (!size) return;\n\n attributes.push(\n {\n type: 'mdxJsxAttribute',\n name: 'src',\n // `src` doesn't support file paths, we can use `node.url` for files and let the underlying framework handle it\n value: src.type === 'url' ? src.url.toString() : node.url,\n },\n {\n type: 'mdxJsxAttribute',\n name: 'width',\n value: size.width.toString(),\n },\n {\n type: 'mdxJsxAttribute',\n name: 'height',\n value: size.height.toString(),\n },\n );\n\n return {\n type: 'mdxJsxFlowElement',\n name: 'img',\n attributes,\n children: [],\n };\n }\n\n visit(tree, 'image', (node) => {\n const src = parseSrc(decodeURI(node.url), publicDir, file.dirname);\n if (!src) return;\n\n const task = onImage(src, node)\n .catch((e) => {\n // ignore SVG as it is not always needed\n if (onError === 'ignore' || node.url.endsWith('.svg')) {\n return;\n }\n\n if (onError === 'hide') {\n return {\n type: 'mdxJsxFlowElement',\n name: null,\n attributes: [],\n children: [],\n } satisfies MdxJsxFlowElement;\n }\n\n if (onError === 'error') throw e;\n onError(e);\n })\n .then((res) => {\n if (res) Object.assign(node, res);\n });\n\n promises.push(task);\n });\n\n await Promise.all(promises);\n if (importsToInject.length === 0) return;\n\n const imports = importsToInject.map(\n ({ variableName, importPath }) =>\n ({\n type: 'mdxjsEsm',\n data: {\n estree: {\n body: [\n {\n type: 'ImportDeclaration',\n source: { type: 'Literal', value: importPath },\n specifiers: [\n {\n type: 'ImportDefaultSpecifier',\n local: { type: 'Identifier', name: variableName },\n },\n ],\n },\n ],\n },\n },\n }) as MdxjsEsm,\n );\n\n tree.children.unshift(...imports);\n };\n}\n\nfunction getImportPath(file: string, dir: string): string {\n const relative = path.relative(dir, file).replaceAll(path.sep, '/');\n\n return relative.startsWith('../') ? relative : `./${relative}`;\n}\n\n/**\n * @param src - src href\n * @param publicDir - dir/url to resolve absolute paths\n * @param dir - dir to resolve relative paths\n */\nfunction parseSrc(src: string, publicDir: string, dir?: string): Source | undefined {\n if (src.startsWith('file:///')) return { type: 'file', file: fileURLToPath(src) };\n\n if (EXTERNAL_URL_REGEX.test(src)) {\n return {\n type: 'url',\n url: new URL(src),\n };\n }\n\n if (src.startsWith('/')) {\n if (EXTERNAL_URL_REGEX.test(publicDir)) {\n const url = new URL(publicDir);\n const segs = [...url.pathname.split('/'), ...src.split('/')].filter((v) => v.length > 0);\n\n url.pathname = `/${segs.join('/')}`;\n return { type: 'url', url };\n }\n\n return {\n type: 'file',\n file: path.join(publicDir, src),\n };\n }\n\n if (!dir) {\n console.warn(\n `[Remark Image] found relative path ${src} but missing 'dirname' in VFile, this image will be skipped for now.`,\n );\n return;\n }\n\n return {\n type: 'file',\n file: path.join(dir, src),\n };\n}\n\nasync function getImageSize(\n src: Source,\n onExternal: ExternalImageOptions,\n): Promise<ISizeCalculationResult | undefined> {\n if (src.type === 'file') {\n const { imageSizeFromFile } = await import('image-size/fromFile');\n return imageSizeFromFile(src.file);\n }\n if (onExternal === false) return;\n\n const { timeout } = typeof onExternal === 'object' ? onExternal : {};\n const res = await fetch(src.url, {\n signal: typeof timeout === 'number' ? AbortSignal.timeout(timeout) : undefined,\n });\n if (!res.ok) {\n throw new Error(\n `[Remark Image] Failed to fetch ${src.url} (${res.status}): ${await res.text()}`,\n );\n }\n\n const { imageSize } = await import('image-size');\n return imageSize(new Uint8Array(await res.arrayBuffer()));\n}\n"],"mappings":"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"}
@@ -1,40 +1,2 @@
1
- import { Root } from 'mdast';
2
- import { Transformer } from 'unified';
3
- import { MdxJsxFlowElement } from 'mdast-util-mdx-jsx';
4
-
5
- interface FileNode {
6
- depth: number;
7
- type: 'file';
8
- name: string;
9
- }
10
- interface FolderNode {
11
- depth: number;
12
- type: 'folder';
13
- name: string;
14
- children: Node[];
15
- }
16
- type Node = FileNode | FolderNode;
17
- interface RemarkMdxFilesOptions {
18
- /**
19
- * @defaultValue files
20
- */
21
- lang?: string;
22
- toMdx?: (node: Node) => MdxJsxFlowElement;
23
- }
24
- /**
25
- * Convert codeblocks with `files` as lang, like:
26
- *
27
- * ```files
28
- * project
29
- * ├── src
30
- * │ ├── index.js
31
- * │ └── utils
32
- * │ └── helper.js
33
- * ├── package.json
34
- * ```
35
- *
36
- * into MDX `<Files />` component
37
- */
38
- declare function remarkMdxFiles(options?: RemarkMdxFilesOptions): Transformer<Root, Root>;
39
-
40
- export { type RemarkMdxFilesOptions, remarkMdxFiles };
1
+ import { a as remarkMdxFiles, i as ToMdxOptions, n as FolderNode, r as RemarkMdxFilesOptions, t as FileNode } from "../remark-mdx-files-B5KMXnfh.js";
2
+ export { FileNode, FolderNode, RemarkMdxFilesOptions, ToMdxOptions, remarkMdxFiles };
@@ -1,7 +1,187 @@
1
- import {
2
- remarkMdxFiles
3
- } from "../chunk-ADBHPKXG.js";
4
- import "../chunk-U67V476Y.js";
5
- export {
6
- remarkMdxFiles
7
- };
1
+ import { visit } from "unist-util-visit";
2
+ import path from "node:path";
3
+
4
+ //#region src/mdx-plugins/remark-mdx-files.ts
5
+ function parseFileTree(code) {
6
+ const lines = code.split(/\r?\n/);
7
+ const stack = /* @__PURE__ */ new Map();
8
+ for (const line of lines) {
9
+ let depth = 0;
10
+ let name = line;
11
+ let match;
12
+ while (match = /(?:├──|│|└──)\s*/.exec(name)) {
13
+ name = name.slice(match[0].length);
14
+ depth++;
15
+ }
16
+ if (!name) continue;
17
+ const node = name.endsWith("/") ? {
18
+ type: "folder",
19
+ name,
20
+ children: [],
21
+ depth
22
+ } : {
23
+ type: "file",
24
+ name,
25
+ depth
26
+ };
27
+ let parent;
28
+ for (let i = depth - 1; i >= 0 && !parent; i--) parent = stack.get(i);
29
+ stack.set(depth, node);
30
+ if (!parent) continue;
31
+ if (parent.type === "file") Object.assign(parent, {
32
+ type: "folder",
33
+ children: []
34
+ });
35
+ parent.children.push(node);
36
+ }
37
+ return stack.get(0);
38
+ }
39
+ function defaultToMDX(node, options, depth = 0) {
40
+ if (depth === 0) return {
41
+ type: "mdxJsxFlowElement",
42
+ name: "Files",
43
+ attributes: [],
44
+ children: [defaultToMDX(node, options, depth + 1)]
45
+ };
46
+ const attributes = [{
47
+ type: "mdxJsxAttribute",
48
+ name: "name",
49
+ value: node.name
50
+ }];
51
+ if (node.type === "file") return {
52
+ type: "mdxJsxFlowElement",
53
+ attributes,
54
+ children: [],
55
+ name: "File"
56
+ };
57
+ if (options.defaultOpenAll) attributes.push({
58
+ type: "mdxJsxAttribute",
59
+ name: "defaultOpen",
60
+ value: null
61
+ });
62
+ return {
63
+ type: "mdxJsxFlowElement",
64
+ attributes,
65
+ name: "Folder",
66
+ children: node.children.map((item) => defaultToMDX(item, options, depth + 1))
67
+ };
68
+ }
69
+ /**
70
+ *
71
+ * **Files CodeBlock:**
72
+ *
73
+ * Convert codeblocks with `files` as lang, like:
74
+ *
75
+ * ```files
76
+ * project
77
+ * ├── src
78
+ * │ ├── index.js
79
+ * │ └── utils
80
+ * │ └── helper.js
81
+ * ├── package.json
82
+ * ```
83
+ *
84
+ * into MDX `<Files />` component.
85
+ *
86
+ * **Auto Files:**
87
+ *
88
+ * Generates MDX `<Files />` component from file system.
89
+ *
90
+ * ```mdx
91
+ * <auto-files dir="scripts" pattern="my-dir/*" defaultOpenAll />
92
+ * ```
93
+ */
94
+ function remarkMdxFiles(options = {}) {
95
+ const { lang = "files", toMdx = defaultToMDX } = options;
96
+ async function autoFiles(file, node, { patterns, dir, defaultOpenAll = false }) {
97
+ const { glob } = await import("tinyglobby");
98
+ if (!patterns) file.fail("Missing `pattern` prop in <auto-files>", { place: node.position });
99
+ const baseDir = file.dirname ?? file.cwd;
100
+ const cwd = dir ? path.join(baseDir, dir) : baseDir;
101
+ const files = await glob(patterns, { cwd });
102
+ Object.assign(node, toMdx(buildFileTreeFromGlob(cwd, files), { defaultOpenAll }));
103
+ }
104
+ return async (tree, file) => {
105
+ const queue = [];
106
+ visit(tree, ["code", "mdxJsxFlowElement"], (node) => {
107
+ if (node.type === "code") {
108
+ if (node.lang !== lang || !node.value) return;
109
+ const fileTree = parseFileTree(node.value);
110
+ if (!fileTree) return;
111
+ Object.assign(node, toMdx(fileTree, { defaultOpenAll: true }));
112
+ return "skip";
113
+ }
114
+ if (node.type === "mdxJsxFlowElement") {
115
+ if (node.name !== "auto-files") return;
116
+ const parsed = {};
117
+ for (const attr of node.attributes) {
118
+ if (attr.type !== "mdxJsxAttribute") continue;
119
+ const { name, value } = attr;
120
+ switch (name) {
121
+ case "dir":
122
+ if (typeof value === "string") parsed.dir = value;
123
+ break;
124
+ case "pattern":
125
+ if (typeof value === "string") {
126
+ parsed.patterns ??= [];
127
+ parsed.patterns.push(value);
128
+ }
129
+ break;
130
+ case "defaultOpenAll":
131
+ parsed.defaultOpenAll = true;
132
+ break;
133
+ }
134
+ }
135
+ queue.push(autoFiles(file, node, parsed));
136
+ return "skip";
137
+ }
138
+ });
139
+ await Promise.all(queue);
140
+ };
141
+ }
142
+ function buildFileTreeFromGlob(dir, files) {
143
+ const nodeMap = /* @__PURE__ */ new Map();
144
+ const root = {
145
+ depth: 0,
146
+ type: "folder",
147
+ name: path.basename(dir),
148
+ children: []
149
+ };
150
+ nodeMap.set("", root);
151
+ for (const file of files) {
152
+ const parts = path.normalize(file).split(path.sep).filter((part) => part.length > 0);
153
+ let currentPath = "";
154
+ let current = root;
155
+ for (let i = 0; i < parts.length; i++) {
156
+ const name = parts[i];
157
+ const nextPath = path.join(currentPath, name);
158
+ if (i === parts.length - 1) {
159
+ const fileNode = {
160
+ depth: i + 1,
161
+ type: "file",
162
+ name
163
+ };
164
+ current.children.push(fileNode);
165
+ } else {
166
+ let folder = nodeMap.get(nextPath);
167
+ if (!folder) {
168
+ folder = {
169
+ depth: i + 1,
170
+ type: "folder",
171
+ name,
172
+ children: []
173
+ };
174
+ nodeMap.set(nextPath, folder);
175
+ current.children.push(folder);
176
+ }
177
+ current = folder;
178
+ currentPath = nextPath;
179
+ }
180
+ }
181
+ }
182
+ return root;
183
+ }
184
+
185
+ //#endregion
186
+ export { remarkMdxFiles };
187
+ //# sourceMappingURL=remark-mdx-files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remark-mdx-files.js","names":["match: RegExpMatchArray | null","node: Node","parent: Node | undefined","attributes: MdxJsxAttribute[]","queue: Promise<void>[]","parsed: AutoFilesProps","root: FolderNode","fileNode: FileNode"],"sources":["../../src/mdx-plugins/remark-mdx-files.ts"],"sourcesContent":["import type { Root } from 'mdast';\nimport { visit } from 'unist-util-visit';\nimport type { Transformer } from 'unified';\nimport type { MdxJsxAttribute, MdxJsxFlowElement } from 'mdast-util-mdx-jsx';\nimport type { VFile } from 'vfile';\nimport path from 'node:path';\n\nexport interface FileNode {\n depth: number;\n type: 'file';\n name: string;\n}\n\nexport interface FolderNode {\n depth: number;\n type: 'folder';\n name: string;\n children: Node[];\n}\n\nexport interface ToMdxOptions {\n defaultOpenAll: boolean;\n}\n\ntype Node = FileNode | FolderNode;\n\nexport interface RemarkMdxFilesOptions {\n /**\n * @defaultValue files\n */\n lang?: string;\n toMdx?: (node: Node, options: ToMdxOptions) => MdxJsxFlowElement;\n}\n\ninterface AutoFilesProps extends Partial<ToMdxOptions> {\n dir?: string;\n patterns?: string[];\n}\n\nfunction parseFileTree(code: string) {\n const lines = code.split(/\\r?\\n/);\n const stack = new Map<number, Node>();\n\n for (const line of lines) {\n let depth = 0;\n let name = line;\n let match: RegExpMatchArray | null;\n\n while ((match = /(?:├──|│|└──)\\s*/.exec(name))) {\n name = name.slice(match[0].length);\n depth++;\n }\n\n if (!name) continue;\n const node: Node = name.endsWith('/')\n ? { type: 'folder', name, children: [], depth }\n : { type: 'file', name, depth };\n\n let parent: Node | undefined;\n for (let i = depth - 1; i >= 0 && !parent; i--) {\n parent = stack.get(i);\n }\n\n stack.set(depth, node);\n if (!parent) continue;\n if (parent.type === 'file') {\n Object.assign(parent, {\n type: 'folder',\n children: [],\n });\n }\n\n (parent as FolderNode).children.push(node);\n }\n\n return stack.get(0);\n}\n\nfunction defaultToMDX(node: Node, options: ToMdxOptions, depth = 0): MdxJsxFlowElement {\n if (depth === 0) {\n return {\n type: 'mdxJsxFlowElement',\n name: 'Files',\n attributes: [],\n children: [defaultToMDX(node, options, depth + 1)],\n };\n }\n\n const attributes: MdxJsxAttribute[] = [\n { type: 'mdxJsxAttribute', name: 'name', value: node.name },\n ];\n\n if (node.type === 'file') {\n return {\n type: 'mdxJsxFlowElement',\n attributes,\n children: [],\n name: 'File',\n };\n }\n\n if (options.defaultOpenAll) {\n attributes.push({\n type: 'mdxJsxAttribute',\n name: 'defaultOpen',\n value: null,\n });\n }\n\n return {\n type: 'mdxJsxFlowElement',\n attributes,\n name: 'Folder',\n children: node.children.map((item) => defaultToMDX(item, options, depth + 1)),\n };\n}\n\n/**\n *\n * **Files CodeBlock:**\n *\n * Convert codeblocks with `files` as lang, like:\n *\n * ```files\n * project\n * ├── src\n * │ ├── index.js\n * │ └── utils\n * │ └── helper.js\n * ├── package.json\n * ```\n *\n * into MDX `<Files />` component.\n *\n * **Auto Files:**\n *\n * Generates MDX `<Files />` component from file system.\n *\n * ```mdx\n * <auto-files dir=\"scripts\" pattern=\"my-dir/*\" defaultOpenAll />\n * ```\n */\nexport function remarkMdxFiles(options: RemarkMdxFilesOptions = {}): Transformer<Root, Root> {\n const { lang = 'files', toMdx = defaultToMDX } = options;\n\n async function autoFiles(\n file: VFile,\n node: MdxJsxFlowElement,\n { patterns, dir, defaultOpenAll = false }: AutoFilesProps,\n ) {\n const { glob } = await import('tinyglobby');\n if (!patterns) {\n file.fail('Missing `pattern` prop in <auto-files>', {\n place: node.position,\n });\n }\n\n const baseDir = file.dirname ?? file.cwd;\n const cwd = dir ? path.join(baseDir, dir) : baseDir;\n const files = await glob(patterns, { cwd });\n Object.assign(node, toMdx(buildFileTreeFromGlob(cwd, files), { defaultOpenAll }));\n }\n\n return async (tree, file) => {\n const queue: Promise<void>[] = [];\n\n visit(tree, ['code', 'mdxJsxFlowElement'] as const, (node) => {\n if (node.type === 'code') {\n if (node.lang !== lang || !node.value) return;\n\n const fileTree = parseFileTree(node.value);\n if (!fileTree) return;\n\n Object.assign(\n node,\n toMdx(fileTree, {\n defaultOpenAll: true,\n }),\n );\n return 'skip';\n }\n\n if (node.type === 'mdxJsxFlowElement') {\n if (node.name !== 'auto-files') return;\n const parsed: AutoFilesProps = {};\n for (const attr of node.attributes) {\n if (attr.type !== 'mdxJsxAttribute') continue;\n const { name, value } = attr;\n\n switch (name) {\n case 'dir':\n if (typeof value === 'string') parsed.dir = value;\n break;\n case 'pattern':\n if (typeof value === 'string') {\n parsed.patterns ??= [];\n parsed.patterns.push(value);\n }\n break;\n case 'defaultOpenAll':\n parsed.defaultOpenAll = true;\n break;\n }\n }\n\n queue.push(autoFiles(file, node, parsed));\n return 'skip';\n }\n });\n\n await Promise.all(queue);\n };\n}\n\nfunction buildFileTreeFromGlob(dir: string, files: string[]): Node {\n const nodeMap = new Map<string, FolderNode>();\n const root: FolderNode = {\n depth: 0,\n type: 'folder',\n name: path.basename(dir),\n children: [],\n };\n nodeMap.set('', root);\n\n for (const file of files) {\n const parts = path\n .normalize(file)\n .split(path.sep)\n .filter((part) => part.length > 0);\n let currentPath = '';\n let current = root;\n\n for (let i = 0; i < parts.length; i++) {\n const name = parts[i];\n const nextPath = path.join(currentPath, name);\n\n if (i === parts.length - 1) {\n // Add file node.\n const fileNode: FileNode = { depth: i + 1, type: 'file', name };\n current.children.push(fileNode);\n } else {\n // Add or retrieve folder node using the map.\n let folder = nodeMap.get(nextPath);\n\n if (!folder) {\n folder = { depth: i + 1, type: 'folder', name, children: [] };\n nodeMap.set(nextPath, folder);\n current.children.push(folder);\n }\n\n current = folder;\n currentPath = nextPath;\n }\n }\n }\n\n return root;\n}\n"],"mappings":"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"}
@@ -1,15 +1,2 @@
1
- import { Transformer } from 'unified';
2
- import { Root } from 'mdast';
3
-
4
- interface RemarkMdxMermaidOptions {
5
- /**
6
- * @defaultValue mermaid
7
- */
8
- lang?: string;
9
- }
10
- /**
11
- * Convert `mermaid` codeblocks into `<Mermaid />` MDX component
12
- */
13
- declare function remarkMdxMermaid(options?: RemarkMdxMermaidOptions): Transformer<Root, Root>;
14
-
15
- export { type RemarkMdxMermaidOptions, remarkMdxMermaid };
1
+ import { n as remarkMdxMermaid, t as RemarkMdxMermaidOptions } from "../remark-mdx-mermaid-C_4W5gfj.js";
2
+ export { RemarkMdxMermaidOptions, remarkMdxMermaid };
@@ -1,7 +1,31 @@
1
- import {
2
- remarkMdxMermaid
3
- } from "../chunk-FUUVPEA5.js";
4
- import "../chunk-U67V476Y.js";
5
- export {
6
- remarkMdxMermaid
7
- };
1
+ import { visit } from "unist-util-visit";
2
+
3
+ //#region src/mdx-plugins/remark-mdx-mermaid.ts
4
+ function toMDX(code) {
5
+ return {
6
+ type: "mdxJsxFlowElement",
7
+ name: "Mermaid",
8
+ attributes: [{
9
+ type: "mdxJsxAttribute",
10
+ name: "chart",
11
+ value: code.trim()
12
+ }],
13
+ children: []
14
+ };
15
+ }
16
+ /**
17
+ * Convert `mermaid` codeblocks into `<Mermaid />` MDX component
18
+ */
19
+ function remarkMdxMermaid(options = {}) {
20
+ const { lang = "mermaid" } = options;
21
+ return (tree) => {
22
+ visit(tree, "code", (node) => {
23
+ if (node.lang !== lang || !node.value) return;
24
+ Object.assign(node, toMDX(node.value));
25
+ });
26
+ };
27
+ }
28
+
29
+ //#endregion
30
+ export { remarkMdxMermaid };
31
+ //# sourceMappingURL=remark-mdx-mermaid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remark-mdx-mermaid.js","names":[],"sources":["../../src/mdx-plugins/remark-mdx-mermaid.ts"],"sourcesContent":["import { visit } from 'unist-util-visit';\nimport type { Transformer } from 'unified';\nimport type { Root } from 'mdast';\nimport type { MdxJsxFlowElement } from 'mdast-util-mdx-jsx';\n\nfunction toMDX(code: string): MdxJsxFlowElement {\n return {\n type: 'mdxJsxFlowElement',\n name: 'Mermaid',\n attributes: [\n {\n type: 'mdxJsxAttribute',\n name: 'chart',\n value: code.trim(),\n },\n ],\n children: [],\n };\n}\n\nexport interface RemarkMdxMermaidOptions {\n /**\n * @defaultValue mermaid\n */\n lang?: string;\n}\n\n/**\n * Convert `mermaid` codeblocks into `<Mermaid />` MDX component\n */\nexport function remarkMdxMermaid(options: RemarkMdxMermaidOptions = {}): Transformer<Root, Root> {\n const { lang = 'mermaid' } = options;\n\n return (tree) => {\n visit(tree, 'code', (node) => {\n if (node.lang !== lang || !node.value) return;\n\n Object.assign(node, toMDX(node.value));\n });\n };\n}\n"],"mappings":";;;AAKA,SAAS,MAAM,MAAiC;AAC9C,QAAO;EACL,MAAM;EACN,MAAM;EACN,YAAY,CACV;GACE,MAAM;GACN,MAAM;GACN,OAAO,KAAK,MAAM;GACnB,CACF;EACD,UAAU,EAAE;EACb;;;;;AAaH,SAAgB,iBAAiB,UAAmC,EAAE,EAA2B;CAC/F,MAAM,EAAE,OAAO,cAAc;AAE7B,SAAQ,SAAS;AACf,QAAM,MAAM,SAAS,SAAS;AAC5B,OAAI,KAAK,SAAS,QAAQ,CAAC,KAAK,MAAO;AAEvC,UAAO,OAAO,MAAM,MAAM,KAAK,MAAM,CAAC;IACtC"}
@@ -1,31 +1,2 @@
1
- import { Root } from 'mdast';
2
- import { Transformer } from 'unified';
3
-
4
- interface PackageManager {
5
- name: string;
6
- /**
7
- * Default to `name`
8
- */
9
- value?: string;
10
- /**
11
- * Convert from npm to another package manager
12
- */
13
- command: (command: string) => string | undefined;
14
- }
15
- interface RemarkNpmOptions {
16
- /**
17
- * Persist Tab value (Fumadocs UI only)
18
- *
19
- * @defaultValue false
20
- */
21
- persist?: {
22
- id: string;
23
- } | false;
24
- packageManagers?: PackageManager[];
25
- }
26
- /**
27
- * It generates multiple tabs of codeblocks for different package managers from a npm command codeblock.
28
- */
29
- declare function remarkNpm({ persist, packageManagers, }?: RemarkNpmOptions): Transformer<Root, Root>;
30
-
31
- export { type RemarkNpmOptions, remarkNpm };
1
+ import { n as remarkNpm, t as RemarkNpmOptions } from "../remark-npm-CykFgJn2.js";
2
+ export { RemarkNpmOptions, remarkNpm };
@@ -1,8 +1,68 @@
1
- import {
2
- remarkNpm
3
- } from "../chunk-GLRQBLGN.js";
4
- import "../chunk-TWIDBWFG.js";
5
- import "../chunk-U67V476Y.js";
6
- export {
7
- remarkNpm
8
- };
1
+ import { generateCodeBlockTabs } from "./codeblock-utils.js";
2
+ import { visit } from "unist-util-visit";
3
+ import convert from "npm-to-yarn";
4
+
5
+ //#region src/mdx-plugins/remark-npm.ts
6
+ const aliases = ["npm", "package-install"];
7
+ /**
8
+ * It generates multiple tabs of codeblocks for different package managers from a npm command codeblock.
9
+ */
10
+ function remarkNpm({ persist = false, packageManagers = [
11
+ {
12
+ command: (cmd) => convert(cmd, "npm"),
13
+ name: "npm"
14
+ },
15
+ {
16
+ command: (cmd) => convert(cmd, "pnpm"),
17
+ name: "pnpm"
18
+ },
19
+ {
20
+ command: (cmd) => convert(cmd, "yarn"),
21
+ name: "yarn"
22
+ },
23
+ {
24
+ command: (cmd) => convert(cmd, "bun"),
25
+ name: "bun"
26
+ }
27
+ ] } = {}) {
28
+ return (tree) => {
29
+ visit(tree, "code", (node) => {
30
+ if (!node.lang || !aliases.includes(node.lang)) return;
31
+ let code = node.value;
32
+ if (node.lang === "package-install" && !code.startsWith("npm") && !code.startsWith("npx")) code = `npm install ${code}`;
33
+ const options = {
34
+ persist,
35
+ tabs: [],
36
+ triggers: []
37
+ };
38
+ for (const manager of packageManagers) {
39
+ const value = manager.value ?? manager.name;
40
+ const command = manager.command(code);
41
+ if (!command || command.length === 0) continue;
42
+ options.defaultValue ??= value;
43
+ options.triggers.push({
44
+ value,
45
+ children: [{
46
+ type: "text",
47
+ value: manager.name
48
+ }]
49
+ });
50
+ options.tabs.push({
51
+ value,
52
+ children: [{
53
+ type: "code",
54
+ lang: "bash",
55
+ meta: node.meta,
56
+ value: command
57
+ }]
58
+ });
59
+ }
60
+ Object.assign(node, generateCodeBlockTabs(options));
61
+ return "skip";
62
+ });
63
+ };
64
+ }
65
+
66
+ //#endregion
67
+ export { remarkNpm };
68
+ //# sourceMappingURL=remark-npm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remark-npm.js","names":["options: CodeBlockTabsOptions"],"sources":["../../src/mdx-plugins/remark-npm.ts"],"sourcesContent":["import type { Root } from 'mdast';\nimport type { Transformer } from 'unified';\nimport { visit } from 'unist-util-visit';\nimport convert from 'npm-to-yarn';\nimport { type CodeBlockTabsOptions, generateCodeBlockTabs } from '@/mdx-plugins/codeblock-utils';\n\ninterface PackageManager {\n name: string;\n\n /**\n * Default to `name`\n */\n value?: string;\n\n /**\n * Convert from npm to another package manager\n */\n command: (command: string) => string | undefined;\n}\n\nexport interface RemarkNpmOptions {\n /**\n * Persist Tab value (Fumadocs UI only)\n *\n * @defaultValue false\n */\n persist?:\n | {\n id: string;\n }\n | false;\n\n packageManagers?: PackageManager[];\n}\n\nconst aliases = ['npm', 'package-install'];\n\n/**\n * It generates multiple tabs of codeblocks for different package managers from a npm command codeblock.\n */\nexport function remarkNpm({\n persist = false,\n packageManagers = [\n { command: (cmd) => convert(cmd, 'npm'), name: 'npm' },\n { command: (cmd) => convert(cmd, 'pnpm'), name: 'pnpm' },\n { command: (cmd) => convert(cmd, 'yarn'), name: 'yarn' },\n { command: (cmd) => convert(cmd, 'bun'), name: 'bun' },\n ],\n}: RemarkNpmOptions = {}): Transformer<Root, Root> {\n return (tree) => {\n visit(tree, 'code', (node) => {\n if (!node.lang || !aliases.includes(node.lang)) return;\n let code = node.value;\n\n if (node.lang === 'package-install' && !code.startsWith('npm') && !code.startsWith('npx')) {\n code = `npm install ${code}`;\n }\n const options: CodeBlockTabsOptions = {\n persist,\n tabs: [],\n triggers: [],\n };\n\n for (const manager of packageManagers) {\n const value = manager.value ?? manager.name;\n const command = manager.command(code);\n if (!command || command.length === 0) continue;\n\n options.defaultValue ??= value;\n options.triggers.push({\n value,\n children: [{ type: 'text', value: manager.name }],\n });\n options.tabs.push({\n value,\n children: [\n {\n type: 'code',\n lang: 'bash',\n meta: node.meta,\n value: command,\n },\n ],\n });\n }\n\n Object.assign(node, generateCodeBlockTabs(options));\n return 'skip';\n });\n };\n}\n"],"mappings":";;;;;AAmCA,MAAM,UAAU,CAAC,OAAO,kBAAkB;;;;AAK1C,SAAgB,UAAU,EACxB,UAAU,OACV,kBAAkB;CAChB;EAAE,UAAU,QAAQ,QAAQ,KAAK,MAAM;EAAE,MAAM;EAAO;CACtD;EAAE,UAAU,QAAQ,QAAQ,KAAK,OAAO;EAAE,MAAM;EAAQ;CACxD;EAAE,UAAU,QAAQ,QAAQ,KAAK,OAAO;EAAE,MAAM;EAAQ;CACxD;EAAE,UAAU,QAAQ,QAAQ,KAAK,MAAM;EAAE,MAAM;EAAO;CACvD,KACmB,EAAE,EAA2B;AACjD,SAAQ,SAAS;AACf,QAAM,MAAM,SAAS,SAAS;AAC5B,OAAI,CAAC,KAAK,QAAQ,CAAC,QAAQ,SAAS,KAAK,KAAK,CAAE;GAChD,IAAI,OAAO,KAAK;AAEhB,OAAI,KAAK,SAAS,qBAAqB,CAAC,KAAK,WAAW,MAAM,IAAI,CAAC,KAAK,WAAW,MAAM,CACvF,QAAO,eAAe;GAExB,MAAMA,UAAgC;IACpC;IACA,MAAM,EAAE;IACR,UAAU,EAAE;IACb;AAED,QAAK,MAAM,WAAW,iBAAiB;IACrC,MAAM,QAAQ,QAAQ,SAAS,QAAQ;IACvC,MAAM,UAAU,QAAQ,QAAQ,KAAK;AACrC,QAAI,CAAC,WAAW,QAAQ,WAAW,EAAG;AAEtC,YAAQ,iBAAiB;AACzB,YAAQ,SAAS,KAAK;KACpB;KACA,UAAU,CAAC;MAAE,MAAM;MAAQ,OAAO,QAAQ;MAAM,CAAC;KAClD,CAAC;AACF,YAAQ,KAAK,KAAK;KAChB;KACA,UAAU,CACR;MACE,MAAM;MACN,MAAM;MACN,MAAM,KAAK;MACX,OAAO;MACR,CACF;KACF,CAAC;;AAGJ,UAAO,OAAO,MAAM,sBAAsB,QAAQ,CAAC;AACnD,UAAO;IACP"}