fumadocs-core 16.4.0 → 16.4.2
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.
- package/dist/advanced-BRT5Ij43.js +80 -0
- package/dist/advanced-BRT5Ij43.js.map +1 -0
- package/dist/algolia-CBBN8R6-.d.ts +68 -0
- package/dist/algolia-CBBN8R6-.d.ts.map +1 -0
- package/dist/algolia-CQPXCnjV.js +49 -0
- package/dist/algolia-CQPXCnjV.js.map +1 -0
- package/dist/breadcrumb.d.ts +29 -27
- package/dist/breadcrumb.d.ts.map +1 -0
- package/dist/breadcrumb.js +55 -72
- package/dist/breadcrumb.js.map +1 -0
- package/dist/chunk-B-ezknvj.js +42 -0
- package/dist/codeblock-utils-lld8UiQo.d.ts +37 -0
- package/dist/codeblock-utils-lld8UiQo.d.ts.map +1 -0
- package/dist/content/github.d.ts +43 -32
- package/dist/content/github.d.ts.map +1 -0
- package/dist/content/github.js +29 -43
- package/dist/content/github.js.map +1 -0
- package/dist/content/index.d.ts +20 -13
- package/dist/content/index.d.ts.map +1 -0
- package/dist/content/index.js +17 -23
- package/dist/content/index.js.map +1 -0
- package/dist/content/mdx/preset-bundler.d.ts +22 -24
- package/dist/content/mdx/preset-bundler.d.ts.map +1 -0
- package/dist/content/mdx/preset-bundler.js +38 -69
- package/dist/content/mdx/preset-bundler.js.map +1 -0
- package/dist/content/mdx/preset-runtime.d.ts +22 -24
- package/dist/content/mdx/preset-runtime.d.ts.map +1 -0
- package/dist/content/mdx/preset-runtime.js +36 -68
- package/dist/content/mdx/preset-runtime.js.map +1 -0
- package/dist/content/toc.d.ts +7 -6
- package/dist/content/toc.d.ts.map +1 -0
- package/dist/content/toc.js +15 -19
- package/dist/content/toc.js.map +1 -0
- package/dist/definitions-DuxDer_c.d.ts +62 -0
- package/dist/definitions-DuxDer_c.d.ts.map +1 -0
- package/dist/dynamic-link.d.ts +7 -5
- package/dist/dynamic-link.d.ts.map +1 -0
- package/dist/dynamic-link.js +29 -27
- package/dist/dynamic-link.js.map +1 -0
- package/dist/fetch-B5e9CFfN.js +20 -0
- package/dist/fetch-B5e9CFfN.js.map +1 -0
- package/dist/framework/index.d.ts +38 -29
- package/dist/framework/index.d.ts.map +1 -0
- package/dist/framework/index.js +68 -17
- package/dist/framework/index.js.map +1 -0
- package/dist/framework/next.d.ts +15 -10
- package/dist/framework/next.d.ts.map +1 -0
- package/dist/framework/next.js +18 -26
- package/dist/framework/next.js.map +1 -0
- package/dist/framework/react-router.d.ts +15 -10
- package/dist/framework/react-router.d.ts.map +1 -0
- package/dist/framework/react-router.js +42 -55
- package/dist/framework/react-router.js.map +1 -0
- package/dist/framework/tanstack.d.ts +15 -10
- package/dist/framework/tanstack.d.ts.map +1 -0
- package/dist/framework/tanstack.js +54 -69
- package/dist/framework/tanstack.js.map +1 -0
- package/dist/framework/waku.d.ts +15 -10
- package/dist/framework/waku.d.ts.map +1 -0
- package/dist/framework/waku.js +47 -58
- package/dist/framework/waku.js.map +1 -0
- package/dist/highlight/client.d.ts +6 -7
- package/dist/highlight/client.d.ts.map +1 -0
- package/dist/highlight/client.js +22 -14
- package/dist/highlight/client.js.map +1 -0
- package/dist/highlight/index.d.ts +2 -30
- package/dist/highlight/index.js +3 -13
- package/dist/i18n/index.d.ts +2 -39
- package/dist/i18n/index.js +6 -7
- package/dist/i18n/index.js.map +1 -0
- package/dist/i18n/middleware.d.ts +36 -28
- package/dist/i18n/middleware.d.ts.map +1 -0
- package/dist/i18n/middleware.js +55 -73
- package/dist/i18n/middleware.js.map +1 -0
- package/dist/icon-Dt7IObrc.js +19 -0
- package/dist/icon-Dt7IObrc.js.map +1 -0
- package/dist/index-2U6Tl4--.d.ts +379 -0
- package/dist/index-2U6Tl4--.d.ts.map +1 -0
- package/dist/index-Bw-DCOra.d.ts +41 -0
- package/dist/index-Bw-DCOra.d.ts.map +1 -0
- package/dist/link.d.ts +17 -15
- package/dist/link.d.ts.map +1 -0
- package/dist/link.js +29 -9
- package/dist/link.js.map +1 -0
- package/dist/mdast-utils-mc9-X-PK.js +40 -0
- package/dist/mdast-utils-mc9-X-PK.js.map +1 -0
- package/dist/mdx-plugins/codeblock-utils.d.ts +2 -29
- package/dist/mdx-plugins/codeblock-utils.js +71 -9
- package/dist/mdx-plugins/codeblock-utils.js.map +1 -0
- package/dist/mdx-plugins/index.d.ts +15 -20
- package/dist/mdx-plugins/index.js +18 -73
- package/dist/mdx-plugins/rehype-code.d.ts +2 -55
- package/dist/mdx-plugins/rehype-code.js +5 -15
- package/dist/mdx-plugins/rehype-toc.d.ts +2 -14
- package/dist/mdx-plugins/rehype-toc.js +3 -7
- package/dist/mdx-plugins/remark-admonition.d.ts +2 -20
- package/dist/mdx-plugins/remark-admonition.js +74 -8
- package/dist/mdx-plugins/remark-admonition.js.map +1 -0
- package/dist/mdx-plugins/remark-code-tab.d.ts +2 -30
- package/dist/mdx-plugins/remark-code-tab.js +183 -7
- package/dist/mdx-plugins/remark-code-tab.js.map +1 -0
- package/dist/mdx-plugins/remark-directive-admonition.d.ts +2 -27
- package/dist/mdx-plugins/remark-directive-admonition.js +60 -7
- package/dist/mdx-plugins/remark-directive-admonition.js.map +1 -0
- package/dist/mdx-plugins/remark-gfm.d.ts +2 -1
- package/dist/mdx-plugins/remark-gfm.js +3 -7
- package/dist/mdx-plugins/remark-heading.d.ts +2 -31
- package/dist/mdx-plugins/remark-heading.js +45 -8
- package/dist/mdx-plugins/remark-heading.js.map +1 -0
- package/dist/mdx-plugins/remark-image.d.ts +2 -57
- package/dist/mdx-plugins/remark-image.js +192 -7
- package/dist/mdx-plugins/remark-image.js.map +1 -0
- package/dist/mdx-plugins/remark-mdx-files.d.ts +2 -40
- package/dist/mdx-plugins/remark-mdx-files.js +187 -7
- package/dist/mdx-plugins/remark-mdx-files.js.map +1 -0
- package/dist/mdx-plugins/remark-mdx-mermaid.d.ts +2 -15
- package/dist/mdx-plugins/remark-mdx-mermaid.js +31 -7
- package/dist/mdx-plugins/remark-mdx-mermaid.js.map +1 -0
- package/dist/mdx-plugins/remark-npm.d.ts +2 -31
- package/dist/mdx-plugins/remark-npm.js +68 -8
- package/dist/mdx-plugins/remark-npm.js.map +1 -0
- package/dist/mdx-plugins/remark-steps.d.ts +2 -23
- package/dist/mdx-plugins/remark-steps.js +77 -7
- package/dist/mdx-plugins/remark-steps.js.map +1 -0
- package/dist/mdx-plugins/remark-structure.d.ts +2 -71
- package/dist/mdx-plugins/remark-structure.js +105 -11
- package/dist/mdx-plugins/remark-structure.js.map +1 -0
- package/dist/mixedbread-DlByNYSd.js +88 -0
- package/dist/mixedbread-DlByNYSd.js.map +1 -0
- package/dist/negotiation/index.d.ts +6 -4
- package/dist/negotiation/index.d.ts.map +1 -0
- package/dist/negotiation/index.js +41 -11
- package/dist/negotiation/index.js.map +1 -0
- package/dist/normalize-url-DP9-1I-S.js +16 -0
- package/dist/normalize-url-DP9-1I-S.js.map +1 -0
- package/dist/orama-cloud-DH3g37zc.js +84 -0
- package/dist/orama-cloud-DH3g37zc.js.map +1 -0
- package/dist/page-tree/index.d.ts +23 -11
- package/dist/page-tree/index.d.ts.map +1 -0
- package/dist/page-tree/index.js +3 -17
- package/dist/path-DHIjrDBP.js +60 -0
- package/dist/path-DHIjrDBP.js.map +1 -0
- package/dist/rehype-code-CdiZ1Y6P.js +241 -0
- package/dist/rehype-code-CdiZ1Y6P.js.map +1 -0
- package/dist/rehype-code-vVWG4-ej.d.ts +58 -0
- package/dist/rehype-code-vVWG4-ej.d.ts.map +1 -0
- package/dist/rehype-toc-DJvSyE0o.d.ts +18 -0
- package/dist/rehype-toc-DJvSyE0o.d.ts.map +1 -0
- package/dist/rehype-toc-DVwJcwvA.js +143 -0
- package/dist/rehype-toc-DVwJcwvA.js.map +1 -0
- package/dist/remark-admonition-DOwBWzsH.d.ts +22 -0
- package/dist/remark-admonition-DOwBWzsH.d.ts.map +1 -0
- package/dist/remark-code-tab-CXsYlims.d.ts +32 -0
- package/dist/remark-code-tab-CXsYlims.d.ts.map +1 -0
- package/dist/remark-directive-admonition-BCm_yiU9.d.ts +36 -0
- package/dist/remark-directive-admonition-BCm_yiU9.d.ts.map +1 -0
- package/dist/remark-gfm-CeWpMwyk.d.ts +2 -0
- package/dist/remark-heading-CXvCY0go.d.ts +37 -0
- package/dist/remark-heading-CXvCY0go.d.ts.map +1 -0
- package/dist/remark-image-CvUis4R1.d.ts +65 -0
- package/dist/remark-image-CvUis4R1.d.ts.map +1 -0
- package/dist/remark-mdx-files-B31xFFG4.d.ts +56 -0
- package/dist/remark-mdx-files-B31xFFG4.d.ts.map +1 -0
- package/dist/remark-mdx-mermaid-BdSUUiCG.d.ts +17 -0
- package/dist/remark-mdx-mermaid-BdSUUiCG.d.ts.map +1 -0
- package/dist/remark-npm-BIvIEKT2.d.ts +36 -0
- package/dist/remark-npm-BIvIEKT2.d.ts.map +1 -0
- package/dist/remark-steps-CHJN-rtm.d.ts +28 -0
- package/dist/remark-steps-CHJN-rtm.d.ts.map +1 -0
- package/dist/remark-structure-RZD2gGKp.d.ts +77 -0
- package/dist/remark-structure-RZD2gGKp.d.ts.map +1 -0
- package/dist/remove-undefined-Cfs4o_mM.js +19 -0
- package/dist/remove-undefined-Cfs4o_mM.js.map +1 -0
- package/dist/search/algolia.d.ts +3 -69
- package/dist/search/algolia.js +69 -63
- package/dist/search/algolia.js.map +1 -0
- package/dist/search/client.d.ts +120 -114
- package/dist/search/client.d.ts.map +1 -0
- package/dist/search/client.js +92 -91
- package/dist/search/client.js.map +1 -0
- package/dist/search/index.d.ts +20 -18
- package/dist/search/index.d.ts.map +1 -0
- package/dist/search/index.js +3 -7
- package/dist/search/orama-cloud.d.ts +70 -68
- package/dist/search/orama-cloud.d.ts.map +1 -0
- package/dist/search/orama-cloud.js +46 -54
- package/dist/search/orama-cloud.js.map +1 -0
- package/dist/search/server.d.ts +6 -136
- package/dist/search/server.js +292 -369
- package/dist/search/server.js.map +1 -0
- package/dist/search-D6ChCLhY.js +44 -0
- package/dist/search-D6ChCLhY.js.map +1 -0
- package/dist/server-CPR_fgkH.d.ts +133 -0
- package/dist/server-CPR_fgkH.d.ts.map +1 -0
- package/dist/shiki-4oMYwHED.js +80 -0
- package/dist/shiki-4oMYwHED.js.map +1 -0
- package/dist/shiki-CIBQys54.d.ts +33 -0
- package/dist/shiki-CIBQys54.d.ts.map +1 -0
- package/dist/source/client/index.d.ts +7 -5
- package/dist/source/client/index.d.ts.map +1 -0
- package/dist/source/client/index.js +24 -35
- package/dist/source/client/index.js.map +1 -0
- package/dist/source/index.d.ts +3 -42
- package/dist/source/index.js +599 -752
- package/dist/source/index.js.map +1 -0
- package/dist/source/plugins/lucide-icons.d.ts +7 -7
- package/dist/source/plugins/lucide-icons.d.ts.map +1 -0
- package/dist/source/plugins/lucide-icons.js +21 -20
- package/dist/source/plugins/lucide-icons.js.map +1 -0
- package/dist/source/plugins/slugs.d.ts +3 -0
- package/dist/source/plugins/slugs.js +65 -0
- package/dist/source/plugins/slugs.js.map +1 -0
- package/dist/source/schema.d.ts +17 -14
- package/dist/source/schema.d.ts.map +1 -0
- package/dist/source/schema.js +26 -22
- package/dist/source/schema.js.map +1 -0
- package/dist/static-Dq8pA8Ay.js +51 -0
- package/dist/static-Dq8pA8Ay.js.map +1 -0
- package/dist/toc.d.ts +38 -25
- package/dist/toc.d.ts.map +1 -0
- package/dist/toc.js +123 -136
- package/dist/toc.js.map +1 -0
- package/dist/util-CK2ykiif.d.ts +8 -0
- package/dist/util-CK2ykiif.d.ts.map +1 -0
- package/dist/util-s9piKHsk.js +10 -0
- package/dist/util-s9piKHsk.js.map +1 -0
- package/dist/utils/use-effect-event.d.ts +3 -1
- package/dist/utils/use-effect-event.d.ts.map +1 -0
- package/dist/utils/use-effect-event.js +16 -13
- package/dist/utils/use-effect-event.js.map +1 -0
- package/dist/utils/use-media-query.d.ts +3 -1
- package/dist/utils/use-media-query.d.ts.map +1 -0
- package/dist/utils/use-media-query.js +20 -20
- package/dist/utils/use-media-query.js.map +1 -0
- package/dist/utils/use-on-change.d.ts +3 -1
- package/dist/utils/use-on-change.d.ts.map +1 -0
- package/dist/utils/use-on-change.js +23 -7
- package/dist/utils/use-on-change.js.map +1 -0
- package/dist/utils-DUvi2WkD.js +134 -0
- package/dist/utils-DUvi2WkD.js.map +1 -0
- package/package.json +60 -58
- package/dist/algolia-IZEDLPHE.js +0 -58
- package/dist/chunk-5PMI7QDD.js +0 -220
- package/dist/chunk-ADBHPKXG.js +0 -78
- package/dist/chunk-APKPSBSB.js +0 -74
- package/dist/chunk-CH7YHH7V.js +0 -222
- package/dist/chunk-EFVXL2PP.js +0 -144
- package/dist/chunk-EMWGTXSW.js +0 -19
- package/dist/chunk-FAEPKD7U.js +0 -20
- package/dist/chunk-FUUVPEA5.js +0 -29
- package/dist/chunk-GINBKBVQ.js +0 -12
- package/dist/chunk-GLRQBLGN.js +0 -59
- package/dist/chunk-JUF4WZ6G.js +0 -117
- package/dist/chunk-K4WNLOVQ.js +0 -75
- package/dist/chunk-L4JKQWCM.js +0 -131
- package/dist/chunk-MA6O2UUE.js +0 -50
- package/dist/chunk-ONG4RVCR.js +0 -8
- package/dist/chunk-OTD7MV33.js +0 -53
- package/dist/chunk-PFNP6PEB.js +0 -11
- package/dist/chunk-SH7BNTG7.js +0 -38
- package/dist/chunk-TWIDBWFG.js +0 -84
- package/dist/chunk-U67V476Y.js +0 -35
- package/dist/chunk-VLSDGCJE.js +0 -47
- package/dist/chunk-W6WTLKRA.js +0 -73
- package/dist/chunk-X2HFD5QJ.js +0 -275
- package/dist/chunk-XJ6ZQNEX.js +0 -91
- package/dist/chunk-XN2LKXFZ.js +0 -101
- package/dist/chunk-XOFXGHS4.js +0 -93
- package/dist/chunk-XZSI7AHE.js +0 -67
- package/dist/chunk-YVVDKJ2H.js +0 -34
- package/dist/chunk-ZMWYLUDP.js +0 -21
- package/dist/definitions-pJ7PybYY.d.ts +0 -60
- package/dist/fetch-IBTWQCJR.js +0 -22
- package/dist/loader-_E2HOdV0.d.ts +0 -333
- package/dist/mixedbread-A3WLENES.js +0 -117
- package/dist/orama-cloud-UZAPMPFV.js +0 -93
- package/dist/static-A2YJ5TXV.js +0 -62
- package/dist/util-bZU2QeJ2.d.ts +0 -6
|
@@ -1,7 +1,192 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
} from "
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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 {
|
|
2
|
-
|
|
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-B31xFFG4.js";
|
|
2
|
+
export { FileNode, FolderNode, RemarkMdxFilesOptions, ToMdxOptions, remarkMdxFiles };
|
|
@@ -1,7 +1,187 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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 {
|
|
2
|
-
|
|
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-BdSUUiCG.js";
|
|
2
|
+
export { RemarkMdxMermaidOptions, remarkMdxMermaid };
|
|
@@ -1,7 +1,31 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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 {
|
|
2
|
-
|
|
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-BIvIEKT2.js";
|
|
2
|
+
export { RemarkNpmOptions, remarkNpm };
|
|
@@ -1,8 +1,68 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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"}
|