fumadocs-mdx 14.2.3 → 14.2.5
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/adapter-DI4cexsC.js +145 -0
- package/dist/adapter-DI4cexsC.js.map +1 -0
- package/dist/bin.d.ts +1 -1
- package/dist/bin.js +21 -12
- package/dist/bin.js.map +1 -0
- package/dist/build-BTTNEFmV.js +100 -0
- package/dist/build-BTTNEFmV.js.map +1 -0
- package/dist/build-mdx-10MrLupc.d.ts +53 -0
- package/dist/build-mdx-10MrLupc.d.ts.map +1 -0
- package/dist/build-mdx-BVeBo4jT.js +153 -0
- package/dist/build-mdx-BVeBo4jT.js.map +1 -0
- package/dist/build-mdx-ChjP7zAn.js +5 -0
- package/dist/bun/index.d.ts +10 -21
- package/dist/bun/index.d.ts.map +1 -0
- package/dist/bun/index.js +30 -49
- package/dist/bun/index.js.map +1 -0
- package/dist/codegen-DleOVLNr.js +101 -0
- package/dist/codegen-DleOVLNr.js.map +1 -0
- package/dist/config/index.d.ts +2 -18
- package/dist/config/index.js +50 -53
- package/dist/config/index.js.map +1 -0
- package/dist/core-DG43f_AU.d.ts +364 -0
- package/dist/core-DG43f_AU.d.ts.map +1 -0
- package/dist/core-DjldE3H9.js +212 -0
- package/dist/core-DjldE3H9.js.map +1 -0
- package/dist/fuma-matter-CHgJa_-B.js +27 -0
- package/dist/fuma-matter-CHgJa_-B.js.map +1 -0
- package/dist/index-Bc_4I1HE.d.ts +12 -0
- package/dist/index-Bc_4I1HE.d.ts.map +1 -0
- package/dist/index-file-D9HsrWU_.js +264 -0
- package/dist/index-file-D9HsrWU_.js.map +1 -0
- package/dist/index.d.ts +3 -61
- package/dist/index.js +1 -0
- package/dist/load-from-file-B7Rswy9i.js +5 -0
- package/dist/load-from-file-Doc98oEB.js +38 -0
- package/dist/load-from-file-Doc98oEB.js.map +1 -0
- package/dist/loaders-BVwYfelL.js +7 -0
- package/dist/loaders-BVwYfelL.js.map +1 -0
- package/dist/mdx-CRT-jSh5.js +91 -0
- package/dist/mdx-CRT-jSh5.js.map +1 -0
- package/dist/meta-BKBx8Gab.js +81 -0
- package/dist/meta-BKBx8Gab.js.map +1 -0
- package/dist/next/index.cjs +863 -1076
- package/dist/next/index.d.ts +17 -28
- package/dist/next/index.d.ts.map +1 -0
- package/dist/next/index.js +141 -170
- package/dist/next/index.js.map +1 -0
- package/dist/node/loader.d.ts +4 -2
- package/dist/node/loader.d.ts.map +1 -0
- package/dist/node/loader.js +26 -38
- package/dist/node/loader.js.map +1 -0
- package/dist/plugins/index-file.d.ts +2 -14
- package/dist/plugins/index-file.js +5 -8
- package/dist/plugins/json-schema.d.ts +14 -23
- package/dist/plugins/json-schema.d.ts.map +1 -0
- package/dist/plugins/json-schema.js +70 -78
- package/dist/plugins/json-schema.js.map +1 -0
- package/dist/plugins/last-modified.d.ts +21 -32
- package/dist/plugins/last-modified.d.ts.map +1 -0
- package/dist/plugins/last-modified.js +70 -78
- package/dist/plugins/last-modified.js.map +1 -0
- package/dist/preset-gmDZnBcg.js +61 -0
- package/dist/preset-gmDZnBcg.js.map +1 -0
- package/dist/remark-include-D3G3mAnv.js +247 -0
- package/dist/remark-include-D3G3mAnv.js.map +1 -0
- package/dist/runtime/browser.d.ts +33 -42
- package/dist/runtime/browser.d.ts.map +1 -0
- package/dist/runtime/browser.js +54 -63
- package/dist/runtime/browser.js.map +1 -0
- package/dist/runtime/dynamic.d.ts +13 -21
- package/dist/runtime/dynamic.d.ts.map +1 -0
- package/dist/runtime/dynamic.js +64 -76
- package/dist/runtime/dynamic.js.map +1 -0
- package/dist/runtime/server.d.ts +2 -14
- package/dist/runtime/server.js +111 -8
- package/dist/runtime/server.js.map +1 -0
- package/dist/runtime/types.d.ts +2 -61
- package/dist/runtime/types.js +1 -0
- package/dist/types-B6myALSk.d.ts +63 -0
- package/dist/types-B6myALSk.d.ts.map +1 -0
- package/dist/vite/index.d.ts +28 -39
- package/dist/vite/index.d.ts.map +1 -0
- package/dist/vite/index.js +79 -122
- package/dist/vite/index.js.map +1 -0
- package/dist/webpack/mdx.d.ts +6 -3
- package/dist/webpack/mdx.d.ts.map +1 -0
- package/dist/webpack/mdx.js +21 -34
- package/dist/webpack/mdx.js.map +1 -0
- package/dist/webpack/meta.d.ts +6 -3
- package/dist/webpack/meta.d.ts.map +1 -0
- package/dist/webpack/meta.js +23 -37
- package/dist/webpack/meta.js.map +1 -0
- package/dist/webpack--VSEE6Zp.js +15 -0
- package/dist/webpack--VSEE6Zp.js.map +1 -0
- package/loader-mdx.cjs +1 -3
- package/loader-meta.cjs +1 -3
- package/package.json +40 -40
- package/dist/build-mdx-5XLFMP5P.js +0 -8
- package/dist/chunk-257RZJEQ.js +0 -17
- package/dist/chunk-2PY3JUIC.js +0 -126
- package/dist/chunk-4EUH5CD2.js +0 -173
- package/dist/chunk-4JSFLXXT.js +0 -8
- package/dist/chunk-5OBUOALK.js +0 -141
- package/dist/chunk-DTFUANSF.js +0 -40
- package/dist/chunk-KWSETXYC.js +0 -274
- package/dist/chunk-OLD35ARB.js +0 -116
- package/dist/chunk-RSASAHLX.js +0 -91
- package/dist/chunk-S7KOJHHO.js +0 -89
- package/dist/chunk-STLEUNK7.js +0 -335
- package/dist/chunk-USQZ5OLE.js +0 -116
- package/dist/chunk-VWJKRQZR.js +0 -19
- package/dist/chunk-WFDF56IJ.js +0 -290
- package/dist/chunk-XYVVDDIF.js +0 -180
- package/dist/core-X5ggQtBM.d.ts +0 -350
- package/dist/index-BqkSNsGO.d.ts +0 -8
- package/dist/load-from-file-FHW724YY.js +0 -8
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import { t as fumaMatter } from "./fuma-matter-CHgJa_-B.js";
|
|
2
|
+
import * as fs$1 from "node:fs/promises";
|
|
3
|
+
import * as path$1 from "node:path";
|
|
4
|
+
import { unified } from "unified";
|
|
5
|
+
import { visit } from "unist-util-visit";
|
|
6
|
+
import { remarkHeading } from "fumadocs-core/mdx-plugins";
|
|
7
|
+
import { VFile } from "vfile";
|
|
8
|
+
|
|
9
|
+
//#region src/loaders/mdx/remark-unravel.ts
|
|
10
|
+
function remarkMarkAndUnravel() {
|
|
11
|
+
return (tree) => {
|
|
12
|
+
visit(tree, function(node, index, parent) {
|
|
13
|
+
let offset = -1;
|
|
14
|
+
let all = true;
|
|
15
|
+
let oneOrMore = false;
|
|
16
|
+
if (parent && typeof index === "number" && node.type === "paragraph") {
|
|
17
|
+
const children = node.children;
|
|
18
|
+
while (++offset < children.length) {
|
|
19
|
+
const child = children[offset];
|
|
20
|
+
if (child.type === "mdxJsxTextElement" || child.type === "mdxTextExpression") oneOrMore = true;
|
|
21
|
+
else if (child.type === "text" && child.value.trim().length === 0) {} else {
|
|
22
|
+
all = false;
|
|
23
|
+
break;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
if (all && oneOrMore) {
|
|
27
|
+
offset = -1;
|
|
28
|
+
const newChildren = [];
|
|
29
|
+
while (++offset < children.length) {
|
|
30
|
+
const child = children[offset];
|
|
31
|
+
if (child.type === "mdxJsxTextElement") child.type = "mdxJsxFlowElement";
|
|
32
|
+
if (child.type === "mdxTextExpression") child.type = "mdxFlowExpression";
|
|
33
|
+
if (child.type === "text" && /^[\t\r\n ]+$/.test(String(child.value))) {} else newChildren.push(child);
|
|
34
|
+
}
|
|
35
|
+
parent.children.splice(index, 1, ...newChildren);
|
|
36
|
+
return index;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
//#endregion
|
|
44
|
+
//#region src/loaders/mdx/mdast-utils.ts
|
|
45
|
+
function flattenNode(node) {
|
|
46
|
+
if ("children" in node) return node.children.map((child) => flattenNode(child)).join("");
|
|
47
|
+
if ("value" in node) return node.value;
|
|
48
|
+
return "";
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
//#endregion
|
|
52
|
+
//#region src/loaders/mdx/remark-include.ts
|
|
53
|
+
/**
|
|
54
|
+
* VS Code–style region extraction
|
|
55
|
+
* Adapted from VitePress:
|
|
56
|
+
* https://github.com/vuejs/vitepress/blob/main/src/node/markdown/plugins/snippet.ts
|
|
57
|
+
*/
|
|
58
|
+
const REGION_MARKERS = [
|
|
59
|
+
{
|
|
60
|
+
start: /^\s*\/\/\s*#?region\b\s*(.*?)\s*$/,
|
|
61
|
+
end: /^\s*\/\/\s*#?endregion\b\s*(.*?)\s*$/
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
start: /^\s*<!--\s*#?region\b\s*(.*?)\s*-->/,
|
|
65
|
+
end: /^\s*<!--\s*#?endregion\b\s*(.*?)\s*-->/
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
start: /^\s*\/\*\s*#region\b\s*(.*?)\s*\*\//,
|
|
69
|
+
end: /^\s*\/\*\s*#endregion\b\s*(.*?)\s*\*\//
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
start: /^\s*#[rR]egion\b\s*(.*?)\s*$/,
|
|
73
|
+
end: /^\s*#[eE]nd ?[rR]egion\b\s*(.*?)\s*$/
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
start: /^\s*#\s*#?region\b\s*(.*?)\s*$/,
|
|
77
|
+
end: /^\s*#\s*#?endregion\b\s*(.*?)\s*$/
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
start: /^\s*(?:--|::|@?REM)\s*#region\b\s*(.*?)\s*$/,
|
|
81
|
+
end: /^\s*(?:--|::|@?REM)\s*#endregion\b\s*(.*?)\s*$/
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
start: /^\s*#pragma\s+region\b\s*(.*?)\s*$/,
|
|
85
|
+
end: /^\s*#pragma\s+endregion\b\s*(.*?)\s*$/
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
start: /^\s*\(\*\s*#region\b\s*(.*?)\s*\*\)/,
|
|
89
|
+
end: /^\s*\(\*\s*#endregion\b\s*(.*?)\s*\*\)/
|
|
90
|
+
}
|
|
91
|
+
];
|
|
92
|
+
function dedent(lines) {
|
|
93
|
+
const minIndent = lines.reduce((min, line) => {
|
|
94
|
+
const match = line.match(/^(\s*)\S/);
|
|
95
|
+
return match ? Math.min(min, match[1].length) : min;
|
|
96
|
+
}, Infinity);
|
|
97
|
+
return minIndent === Infinity ? lines.join("\n") : lines.map((l) => l.slice(minIndent)).join("\n");
|
|
98
|
+
}
|
|
99
|
+
function extractCodeRegion(content, regionName) {
|
|
100
|
+
const lines = content.split("\n");
|
|
101
|
+
for (let i = 0; i < lines.length; i++) for (const re of REGION_MARKERS) {
|
|
102
|
+
let match = re.start.exec(lines[i]);
|
|
103
|
+
if (match?.[1] !== regionName) continue;
|
|
104
|
+
let depth = 1;
|
|
105
|
+
const extractedLines = [];
|
|
106
|
+
for (let j = i + 1; j < lines.length; j++) {
|
|
107
|
+
match = re.start.exec(lines[j]);
|
|
108
|
+
if (match) {
|
|
109
|
+
depth++;
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
match = re.end.exec(lines[j]);
|
|
113
|
+
if (match) {
|
|
114
|
+
if (match[1] === regionName) depth = 0;
|
|
115
|
+
else if (match[1] === "") depth--;
|
|
116
|
+
else continue;
|
|
117
|
+
if (depth > 0) continue;
|
|
118
|
+
return dedent(extractedLines);
|
|
119
|
+
} else extractedLines.push(lines[j]);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
throw new Error(`Region "${regionName}" not found`);
|
|
123
|
+
}
|
|
124
|
+
const ElementLikeTypes = [
|
|
125
|
+
"mdxJsxFlowElement",
|
|
126
|
+
"mdxJsxTextElement",
|
|
127
|
+
"containerDirective",
|
|
128
|
+
"textDirective",
|
|
129
|
+
"leafDirective"
|
|
130
|
+
];
|
|
131
|
+
function isElementLike(node) {
|
|
132
|
+
return ElementLikeTypes.includes(node.type);
|
|
133
|
+
}
|
|
134
|
+
function parseElementAttributes(element) {
|
|
135
|
+
if (Array.isArray(element.attributes)) {
|
|
136
|
+
const attributes = {};
|
|
137
|
+
for (const attr of element.attributes) if (attr.type === "mdxJsxAttribute" && (typeof attr.value === "string" || attr.value === null)) attributes[attr.name] = attr.value;
|
|
138
|
+
return attributes;
|
|
139
|
+
}
|
|
140
|
+
return element.attributes ?? {};
|
|
141
|
+
}
|
|
142
|
+
function parseSpecifier(specifier) {
|
|
143
|
+
const idx = specifier.lastIndexOf("#");
|
|
144
|
+
if (idx === -1) return { file: specifier };
|
|
145
|
+
return {
|
|
146
|
+
file: specifier.slice(0, idx),
|
|
147
|
+
section: specifier.slice(idx + 1)
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
function extractSection(root, section) {
|
|
151
|
+
let nodes;
|
|
152
|
+
let capturingHeadingContent = false;
|
|
153
|
+
visit(root, (node) => {
|
|
154
|
+
if (node.type === "heading") {
|
|
155
|
+
if (capturingHeadingContent) return false;
|
|
156
|
+
if (node.data?.hProperties?.id === section) {
|
|
157
|
+
capturingHeadingContent = true;
|
|
158
|
+
nodes = [node];
|
|
159
|
+
return "skip";
|
|
160
|
+
}
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
if (capturingHeadingContent) {
|
|
164
|
+
nodes?.push(node);
|
|
165
|
+
return "skip";
|
|
166
|
+
}
|
|
167
|
+
if (isElementLike(node) && node.name === "section") {
|
|
168
|
+
if (parseElementAttributes(node).id === section) {
|
|
169
|
+
nodes = node.children;
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
});
|
|
174
|
+
if (nodes) return {
|
|
175
|
+
type: "root",
|
|
176
|
+
children: nodes
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
function remarkInclude() {
|
|
180
|
+
const TagName = "include";
|
|
181
|
+
const embedContent = async (targetPath, heading, params, parent) => {
|
|
182
|
+
const { _getProcessor = () => this, _compiler } = parent.data;
|
|
183
|
+
let content;
|
|
184
|
+
try {
|
|
185
|
+
content = (await fs$1.readFile(targetPath)).toString();
|
|
186
|
+
} catch (e) {
|
|
187
|
+
throw new Error(`failed to read file ${targetPath}\n${e instanceof Error ? e.message : String(e)}`, { cause: e });
|
|
188
|
+
}
|
|
189
|
+
const ext = path$1.extname(targetPath);
|
|
190
|
+
_compiler?.addDependency(targetPath);
|
|
191
|
+
if (params.lang || ext !== ".md" && ext !== ".mdx") {
|
|
192
|
+
const lang = params.lang ?? ext.slice(1);
|
|
193
|
+
let value = content;
|
|
194
|
+
if (heading) value = extractCodeRegion(content, heading.trim());
|
|
195
|
+
return {
|
|
196
|
+
type: "code",
|
|
197
|
+
lang,
|
|
198
|
+
meta: params.meta,
|
|
199
|
+
value,
|
|
200
|
+
data: {}
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
const parser = _getProcessor(ext === ".mdx" ? "mdx" : "md");
|
|
204
|
+
const parsed = fumaMatter(content);
|
|
205
|
+
const targetFile = new VFile({
|
|
206
|
+
path: targetPath,
|
|
207
|
+
value: parsed.content,
|
|
208
|
+
data: {
|
|
209
|
+
...parent.data,
|
|
210
|
+
frontmatter: parsed.data
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
let mdast = parser.parse(targetFile);
|
|
214
|
+
const baseProcessor = unified().use(remarkMarkAndUnravel);
|
|
215
|
+
if (heading) {
|
|
216
|
+
const extracted = extractSection(await baseProcessor.use(remarkHeading).run(mdast), heading);
|
|
217
|
+
if (!extracted) throw new Error(`Cannot find section ${heading} in ${targetPath}, make sure you have encapsulated the section in a <section id="${heading}"> tag, or a :::section directive with remark-directive configured.`);
|
|
218
|
+
mdast = extracted;
|
|
219
|
+
} else mdast = await baseProcessor.run(mdast);
|
|
220
|
+
await update(mdast, targetFile);
|
|
221
|
+
return mdast;
|
|
222
|
+
};
|
|
223
|
+
async function update(tree, file) {
|
|
224
|
+
const queue = [];
|
|
225
|
+
visit(tree, ElementLikeTypes, (_node, _, parent) => {
|
|
226
|
+
const node = _node;
|
|
227
|
+
if (node.name !== TagName) return;
|
|
228
|
+
const specifier = flattenNode(node);
|
|
229
|
+
if (specifier.length === 0) return "skip";
|
|
230
|
+
const attributes = parseElementAttributes(node);
|
|
231
|
+
const { file: relativePath, section } = parseSpecifier(specifier);
|
|
232
|
+
const targetPath = path$1.resolve("cwd" in attributes ? file.cwd : file.dirname, relativePath);
|
|
233
|
+
queue.push(embedContent(targetPath, section, attributes, file).then((replace) => {
|
|
234
|
+
Object.assign(parent && parent.type === "paragraph" ? parent : node, replace);
|
|
235
|
+
}));
|
|
236
|
+
return "skip";
|
|
237
|
+
});
|
|
238
|
+
await Promise.all(queue);
|
|
239
|
+
}
|
|
240
|
+
return async (tree, file) => {
|
|
241
|
+
await update(tree, file);
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
//#endregion
|
|
246
|
+
export { flattenNode as n, remarkInclude as t };
|
|
247
|
+
//# sourceMappingURL=remark-include-D3G3mAnv.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remark-include-D3G3mAnv.js","names":["fs","path"],"sources":["../src/loaders/mdx/remark-unravel.ts","../src/loaders/mdx/mdast-utils.ts","../src/loaders/mdx/remark-include.ts"],"sourcesContent":["// from internal remark plugins in https://github.com/mdx-js/mdx/blob/main/packages/mdx/lib/plugin/remark-mark-and-unravel.js\n// we need to ensure consistency with MDX.js when parsing embed content in `remark-include`\nimport { visit } from 'unist-util-visit';\nimport type { Transformer } from 'unified';\nimport type { Root, RootContent } from 'mdast';\n\nexport function remarkMarkAndUnravel(): Transformer<Root, Root> {\n return (tree) => {\n visit(tree, function (node, index, parent) {\n let offset = -1;\n let all = true;\n let oneOrMore = false;\n\n if (parent && typeof index === 'number' && node.type === 'paragraph') {\n const children = node.children;\n\n while (++offset < children.length) {\n const child = children[offset];\n\n if (child.type === 'mdxJsxTextElement' || child.type === 'mdxTextExpression') {\n oneOrMore = true;\n } else if (child.type === 'text' && child.value.trim().length === 0) {\n // Empty.\n } else {\n all = false;\n break;\n }\n }\n\n if (all && oneOrMore) {\n offset = -1;\n const newChildren: RootContent[] = [];\n\n while (++offset < children.length) {\n const child = children[offset];\n\n if (child.type === 'mdxJsxTextElement') {\n // @ts-expect-error: mutate because it is faster; content model is fine.\n child.type = 'mdxJsxFlowElement';\n }\n\n if (child.type === 'mdxTextExpression') {\n // @ts-expect-error: mutate because it is faster; content model is fine.\n child.type = 'mdxFlowExpression';\n }\n\n if (child.type === 'text' && /^[\\t\\r\\n ]+$/.test(String(child.value))) {\n // Empty.\n } else {\n newChildren.push(child);\n }\n }\n\n parent.children.splice(index, 1, ...newChildren);\n return index;\n }\n }\n });\n };\n}\n","import type { RootContent } from 'mdast';\n\nexport function flattenNode(node: RootContent): string {\n if ('children' in node) return node.children.map((child) => flattenNode(child)).join('');\n\n if ('value' in node) return node.value;\n\n return '';\n}\n","import { type Processor, type Transformer, unified } from 'unified';\nimport { visit } from 'unist-util-visit';\nimport type { Code, Node, Root, RootContent } from 'mdast';\nimport * as path from 'node:path';\nimport * as fs from 'node:fs/promises';\nimport { fumaMatter } from '@/utils/fuma-matter';\nimport type { MdxJsxFlowElement, MdxJsxTextElement } from 'mdast-util-mdx-jsx';\nimport { remarkHeading } from 'fumadocs-core/mdx-plugins';\nimport { VFile } from 'vfile';\nimport type { Directives } from 'mdast-util-directive';\nimport { remarkMarkAndUnravel } from '@/loaders/mdx/remark-unravel';\nimport { flattenNode } from './mdast-utils';\n\n/**\n * VS Code–style region extraction\n * Adapted from VitePress:\n * https://github.com/vuejs/vitepress/blob/main/src/node/markdown/plugins/snippet.ts\n */\n\n// region marker regexes\nconst REGION_MARKERS = [\n {\n start: /^\\s*\\/\\/\\s*#?region\\b\\s*(.*?)\\s*$/,\n end: /^\\s*\\/\\/\\s*#?endregion\\b\\s*(.*?)\\s*$/,\n },\n {\n start: /^\\s*<!--\\s*#?region\\b\\s*(.*?)\\s*-->/,\n end: /^\\s*<!--\\s*#?endregion\\b\\s*(.*?)\\s*-->/,\n },\n {\n start: /^\\s*\\/\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\//,\n end: /^\\s*\\/\\*\\s*#endregion\\b\\s*(.*?)\\s*\\*\\//,\n },\n {\n start: /^\\s*#[rR]egion\\b\\s*(.*?)\\s*$/,\n end: /^\\s*#[eE]nd ?[rR]egion\\b\\s*(.*?)\\s*$/,\n },\n {\n start: /^\\s*#\\s*#?region\\b\\s*(.*?)\\s*$/,\n end: /^\\s*#\\s*#?endregion\\b\\s*(.*?)\\s*$/,\n },\n {\n start: /^\\s*(?:--|::|@?REM)\\s*#region\\b\\s*(.*?)\\s*$/,\n end: /^\\s*(?:--|::|@?REM)\\s*#endregion\\b\\s*(.*?)\\s*$/,\n },\n {\n start: /^\\s*#pragma\\s+region\\b\\s*(.*?)\\s*$/,\n end: /^\\s*#pragma\\s+endregion\\b\\s*(.*?)\\s*$/,\n },\n {\n start: /^\\s*\\(\\*\\s*#region\\b\\s*(.*?)\\s*\\*\\)/,\n end: /^\\s*\\(\\*\\s*#endregion\\b\\s*(.*?)\\s*\\*\\)/,\n },\n];\n\nfunction dedent(lines: string[]): string {\n const minIndent = lines.reduce((min, line) => {\n const match = line.match(/^(\\s*)\\S/);\n return match ? Math.min(min, match[1].length) : min;\n }, Infinity);\n\n return minIndent === Infinity\n ? lines.join('\\n')\n : lines.map((l) => l.slice(minIndent)).join('\\n');\n}\n\nfunction extractCodeRegion(content: string, regionName: string): string {\n const lines = content.split('\\n');\n\n for (let i = 0; i < lines.length; i++) {\n for (const re of REGION_MARKERS) {\n let match = re.start.exec(lines[i]);\n if (match?.[1] !== regionName) continue;\n\n let depth = 1;\n const extractedLines: string[] = [];\n for (let j = i + 1; j < lines.length; j++) {\n match = re.start.exec(lines[j]);\n if (match) {\n depth++;\n continue;\n }\n\n match = re.end.exec(lines[j]);\n if (match) {\n if (match[1] === regionName) depth = 0;\n else if (match[1] === '') depth--;\n else continue;\n\n if (depth > 0) continue;\n return dedent(extractedLines);\n } else {\n extractedLines.push(lines[j]);\n }\n }\n }\n }\n throw new Error(`Region \"${regionName}\" not found`);\n}\n\nexport interface Params {\n lang?: string;\n meta?: string;\n}\n\nconst ElementLikeTypes: ElementLikeContent['type'][] = [\n 'mdxJsxFlowElement',\n 'mdxJsxTextElement',\n 'containerDirective',\n 'textDirective',\n 'leafDirective',\n];\ntype ElementLikeContent = MdxJsxFlowElement | MdxJsxTextElement | Directives;\n\nfunction isElementLike(node: Node): node is ElementLikeContent {\n return ElementLikeTypes.includes(node.type as ElementLikeContent['type']);\n}\n\nfunction parseElementAttributes(\n element: ElementLikeContent,\n): Record<string, string | null | undefined> {\n if (Array.isArray(element.attributes)) {\n const attributes: Record<string, string | null> = {};\n\n for (const attr of element.attributes) {\n if (\n attr.type === 'mdxJsxAttribute' &&\n (typeof attr.value === 'string' || attr.value === null)\n ) {\n attributes[attr.name] = attr.value;\n }\n }\n\n return attributes;\n }\n\n return element.attributes ?? {};\n}\n\nfunction parseSpecifier(specifier: string): {\n file: string;\n section?: string;\n} {\n const idx = specifier.lastIndexOf('#');\n if (idx === -1) return { file: specifier };\n\n return {\n file: specifier.slice(0, idx),\n section: specifier.slice(idx + 1),\n };\n}\n\nfunction extractSection(root: Root, section: string): Root | undefined {\n let nodes: RootContent[] | undefined;\n let capturingHeadingContent = false;\n\n visit(root, (node) => {\n if (node.type === 'heading') {\n if (capturingHeadingContent) {\n return false;\n }\n\n if (node.data?.hProperties?.id === section) {\n capturingHeadingContent = true;\n nodes = [node];\n return 'skip';\n }\n\n return;\n }\n\n if (capturingHeadingContent) {\n nodes?.push(node as RootContent);\n return 'skip';\n }\n\n if (isElementLike(node) && node.name === 'section') {\n const attributes = parseElementAttributes(node);\n\n if (attributes.id === section) {\n nodes = node.children;\n return false;\n }\n }\n });\n\n if (nodes)\n return {\n type: 'root',\n children: nodes,\n };\n}\n\nexport function remarkInclude(this: Processor): Transformer<Root, Root> {\n const TagName = 'include';\n\n const embedContent = async (\n targetPath: string,\n heading: string | undefined,\n params: Params,\n parent: VFile,\n ) => {\n const { _getProcessor = () => this, _compiler } = parent.data;\n let content: string;\n try {\n content = (await fs.readFile(targetPath)).toString();\n } catch (e) {\n throw new Error(\n `failed to read file ${targetPath}\\n${e instanceof Error ? e.message : String(e)}`,\n { cause: e },\n );\n }\n\n const ext = path.extname(targetPath);\n _compiler?.addDependency(targetPath);\n // For non-Markdown files, support VS Code–style region extraction\n if (params.lang || (ext !== '.md' && ext !== '.mdx')) {\n const lang = params.lang ?? ext.slice(1);\n let value = content;\n if (heading) {\n value = extractCodeRegion(content, heading.trim());\n }\n return {\n type: 'code',\n lang,\n meta: params.meta,\n value,\n data: {},\n } satisfies Code;\n }\n\n const parser = _getProcessor(ext === '.mdx' ? 'mdx' : 'md');\n const parsed = fumaMatter(content);\n const targetFile = new VFile({\n path: targetPath,\n value: parsed.content,\n data: {\n ...parent.data,\n frontmatter: parsed.data as Record<string, unknown>,\n },\n });\n let mdast = parser.parse(targetFile) as Root;\n const baseProcessor = unified().use(remarkMarkAndUnravel);\n\n if (heading) {\n // parse headings before extraction\n const extracted = extractSection(await baseProcessor.use(remarkHeading).run(mdast), heading);\n if (!extracted)\n throw new Error(\n `Cannot find section ${heading} in ${targetPath}, make sure you have encapsulated the section in a <section id=\"${heading}\"> tag, or a :::section directive with remark-directive configured.`,\n );\n\n mdast = extracted;\n } else {\n mdast = await baseProcessor.run(mdast);\n }\n\n await update(mdast, targetFile);\n return mdast;\n };\n\n async function update(tree: Root, file: VFile) {\n const queue: Promise<void>[] = [];\n\n visit(tree, ElementLikeTypes, (_node, _, parent) => {\n const node = _node as ElementLikeContent;\n if (node.name !== TagName) return;\n\n const specifier = flattenNode(node);\n if (specifier.length === 0) return 'skip';\n\n const attributes = parseElementAttributes(node);\n const { file: relativePath, section } = parseSpecifier(specifier);\n const targetPath = path.resolve('cwd' in attributes ? file.cwd : file.dirname!, relativePath);\n\n queue.push(\n embedContent(targetPath, section, attributes, file).then((replace) => {\n Object.assign(parent && parent.type === 'paragraph' ? parent : node, replace);\n }),\n );\n\n return 'skip';\n });\n\n await Promise.all(queue);\n }\n\n return async (tree, file) => {\n await update(tree, file);\n };\n}\n"],"mappings":"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"}
|
|
@@ -1,53 +1,44 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import '@mdx-js/mdx';
|
|
7
|
-
import 'unified';
|
|
8
|
-
import 'fumadocs-core/mdx-plugins';
|
|
9
|
-
import 'fumadocs-core/source/schema';
|
|
10
|
-
import 'chokidar';
|
|
11
|
-
import 'vfile';
|
|
12
|
-
import 'fumadocs-core/source';
|
|
13
|
-
import 'fumadocs-core/toc';
|
|
14
|
-
import 'mdx/types';
|
|
15
|
-
import 'fumadocs-core/mdx-plugins/remark-structure';
|
|
16
|
-
import 'mdast';
|
|
1
|
+
import { M as DocCollection, N as DocsCollection } from "../core-DG43f_AU.js";
|
|
2
|
+
import { i as InternalTypeConfig } from "../types-B6myALSk.js";
|
|
3
|
+
import { t as CompiledMDXProperties } from "../build-mdx-10MrLupc.js";
|
|
4
|
+
import { FC, ReactNode } from "react";
|
|
5
|
+
import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
17
6
|
|
|
7
|
+
//#region src/runtime/browser.d.ts
|
|
18
8
|
type CompiledMDXFile<Name extends string, Frontmatter, TC extends InternalTypeConfig> = CompiledMDXProperties<Frontmatter> & TC['DocData'][Name] & Record<string, unknown>;
|
|
19
9
|
interface ClientLoaderOptions<Doc, Props> {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Loader ID (usually your collection name)
|
|
12
|
+
*
|
|
13
|
+
* The code splitting strategy of frameworks like Tanstack Start may duplicate `createClientLoader()` into different chunks.
|
|
14
|
+
*
|
|
15
|
+
* We use loader ID to share cache between multiple instances of client loader.
|
|
16
|
+
*
|
|
17
|
+
* @defaultValue ''
|
|
18
|
+
*/
|
|
19
|
+
id?: string;
|
|
20
|
+
component: (loaded: Doc, props: Props) => ReactNode;
|
|
31
21
|
}
|
|
32
22
|
interface ClientLoader<Doc, Props> {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
23
|
+
preload: (path: string) => Promise<Doc>;
|
|
24
|
+
/**
|
|
25
|
+
* Get a component that renders content with `use()`.
|
|
26
|
+
*/
|
|
27
|
+
getComponent: (path: string) => FC<Props>;
|
|
28
|
+
/**
|
|
29
|
+
* Get react nodes that renders content, wraps `<Suspense>` by default.
|
|
30
|
+
*/
|
|
31
|
+
useContent: undefined extends Props ? (path: string, props?: Props) => ReactNode : (path: string, props: Props) => ReactNode;
|
|
42
32
|
}
|
|
43
33
|
type BrowserCreate<Config, TC extends InternalTypeConfig> = ReturnType<typeof browser<Config, TC>>;
|
|
44
34
|
interface DocCollectionEntry<Name extends string = string, Frontmatter = unknown, TC extends InternalTypeConfig = InternalTypeConfig> {
|
|
45
|
-
|
|
46
|
-
|
|
35
|
+
raw: Record<string, () => Promise<CompiledMDXFile<Name, Frontmatter, TC>>>;
|
|
36
|
+
createClientLoader: <Props extends object | undefined = undefined>(options: ClientLoaderOptions<CompiledMDXFile<Name, Frontmatter, TC>, Props>) => ClientLoader<CompiledMDXFile<Name, Frontmatter, TC>, Props>;
|
|
47
37
|
}
|
|
48
38
|
declare function browser<Config, TC extends InternalTypeConfig>(): {
|
|
49
|
-
|
|
39
|
+
doc<Name extends keyof Config & string>(_name: Name, glob: Record<string, () => Promise<unknown>>): Config[Name] extends DocCollection<infer Schema> | DocsCollection<infer Schema> ? DocCollectionEntry<Name, StandardSchemaV1.InferOutput<Schema>, TC> : never;
|
|
50
40
|
};
|
|
51
|
-
declare function createClientLoader<Doc = CompiledMDXProperties, Props extends object =
|
|
52
|
-
|
|
53
|
-
export {
|
|
41
|
+
declare function createClientLoader<Doc = CompiledMDXProperties, Props extends object | undefined = undefined>(globEntries: Record<string, () => Promise<Doc>>, options: ClientLoaderOptions<Doc, Props>): ClientLoader<Doc, Props>;
|
|
42
|
+
//#endregion
|
|
43
|
+
export { BrowserCreate, ClientLoader, ClientLoaderOptions, DocCollectionEntry, browser, createClientLoader };
|
|
44
|
+
//# sourceMappingURL=browser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.d.ts","names":[],"sources":["../../src/runtime/browser.tsx"],"sourcesContent":[],"mappings":";;;;;;;KAMK,6DAGQ,sBACT,sBAAsB,eAAe,cAAc,QAAQ;UAE9C;EANZ;;;;;;;;AAML;EAYsB,EAAA,CAAA,EAAA,MAAA;EAAY,SAAA,EAAA,CAAA,MAAA,EAAZ,GAAY,EAAA,KAAA,EAAA,KAAA,EAAA,GAAU,SAAV;;AAAmB,UAGpC,YAHoC,CAAA,GAAA,EAAA,KAAA,CAAA,CAAA;EAGpC,OAAA,EAAA,CAAA,IAAA,EAAY,MAAA,EAAA,GACA,OADA,CACQ,GADR,CAAA;EACQ;;;EAIH,YAAA,EAAA,CAAA,IAAA,EAAA,MAAA,EAAA,GAAA,EAAA,CAAG,KAAH,CAAA;EAIF;;;EAEJ,UAAA,EAAA,SAAA,SAFI,KAEJ,GAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EADC,KACD,EAAA,GADW,SACX,GAAA,CAAA,IAAA,EAAA,MAAA,EAAA,KAAA,EAAA,KAAA,EAAA,GAAU,SAAV;;AAAmB,KAGnC,aAHmC,CAAA,MAAA,EAAA,WAGF,kBAHE,CAAA,GAGoB,UAHpB,CAAA,OAItC,OAJsC,CAI9B,MAJ8B,EAItB,EAJsB,CAAA,CAAA;AAGnC,UAIK,kBAJQ,CAAA,aAAA,MAAA,GAAA,MAAA,EAAA,cAAA,OAAA,EAAA,WAOZ,kBAPY,GAOS,kBAPT,CAAA,CAAA;EAAoB,GAAA,EAStC,MATsC,CAAA,MAAA,EAAA,GAAA,GASjB,OATiB,CAST,eATS,CASO,IATP,EASa,WATb,EAS0B,EAT1B,CAAA,CAAA,CAAA;EAC5B,kBAAA,EAAA,CAAA,cAAA,MAAA,GAAA,SAAA,GAAA,SAAA,CAAA,CAAA,OAAA,EAWJ,mBAXI,CAWgB,eAXhB,CAWgC,IAXhC,EAWsC,WAXtC,EAWmD,EAXnD,CAAA,EAWwD,KAXxD,CAAA,EAAA,GAYV,YAZU,CAYG,eAZH,CAYmB,IAZnB,EAYyB,WAZzB,EAYsC,EAZtC,CAAA,EAY2C,KAZ3C,CAAA;;AAAR,iBAeO,OAfP,CAAA,MAAA,EAAA,WAekC,kBAflC,CAAA,CAAA,CAAA,EAAA;EAD0D,GAAA,CAAA,aAAA,MAkBxC,MAlBwC,GAAA,MAAA,CAAA,CAAA,KAAA,EAmBtD,IAnBsD,EAAA,IAAA,EAoBvD,MApBuD,CAAA,MAAA,EAAA,GAAA,GAoBlC,OApBkC,CAAA,OAAA,CAAA,CAAA,CAAA,EA6B/C,MA7B+C,CA6BxC,IA7BwC,CAAA,SA6B1B,aA7B0B,CAAA,KAAA,OAAA,CAAA,GA6BI,cA7BJ,CAAA,KAAA,OAAA,CAAA,GA8BzD,kBA9ByD,CA8BtC,IA9BsC,EA8BhC,gBAAA,CAAiB,WA9Be,CA8BH,MA9BG,CAAA,EA8BM,EA9BN,CAAA,GAAA,KAAA;CAAU;AAI5D,iBAuCD,kBAvCmB,CAAA,MAwC3B,qBAxC2B,EAAA,cAAA,MAAA,GAAA,SAAA,GAAA,SAAA,CAAA,CAAA,WAAA,EA2CpB,MA3CoB,CAAA,MAAA,EAAA,GAAA,GA2CC,OA3CD,CA2CS,GA3CT,CAAA,CAAA,EAAA,OAAA,EA4CxB,mBA5CwB,CA4CJ,GA5CI,EA4CC,KA5CD,CAAA,CAAA,EA6ChC,YA7CgC,CA6CnB,GA7CmB,EA6Cd,KA7Cc,CAAA"}
|
package/dist/runtime/browser.js
CHANGED
|
@@ -1,67 +1,58 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
1
|
+
import { use } from "react";
|
|
2
|
+
import { jsx } from "react/jsx-runtime";
|
|
3
|
+
|
|
4
|
+
//#region src/runtime/browser.tsx
|
|
3
5
|
function browser() {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
6
|
+
return { doc(_name, glob) {
|
|
7
|
+
return {
|
|
8
|
+
raw: glob,
|
|
9
|
+
createClientLoader({ id = _name, ...options }) {
|
|
10
|
+
return createClientLoader(this.raw, {
|
|
11
|
+
id,
|
|
12
|
+
...options
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
} };
|
|
15
17
|
}
|
|
16
|
-
|
|
18
|
+
const loaderStore = /* @__PURE__ */ new Map();
|
|
17
19
|
function createClientLoader(globEntries, options) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
store.preloaded.set(path, loaded);
|
|
53
|
-
return loaded;
|
|
54
|
-
},
|
|
55
|
-
getComponent(path) {
|
|
56
|
-
return getRenderer(path);
|
|
57
|
-
},
|
|
58
|
-
useContent(path, props) {
|
|
59
|
-
const Comp = this.getComponent(path);
|
|
60
|
-
return createElement(Comp, props);
|
|
61
|
-
}
|
|
62
|
-
};
|
|
20
|
+
const { id = "", component: useRenderer } = options;
|
|
21
|
+
const renderers = {};
|
|
22
|
+
const loaders = /* @__PURE__ */ new Map();
|
|
23
|
+
const store = loaderStore.get(id) ?? { preloaded: /* @__PURE__ */ new Map() };
|
|
24
|
+
loaderStore.set(id, store);
|
|
25
|
+
for (const k in globEntries) loaders.set(k.startsWith("./") ? k.slice(2) : k, globEntries[k]);
|
|
26
|
+
function getLoader(path) {
|
|
27
|
+
const loader = loaders.get(path);
|
|
28
|
+
if (!loader) throw new Error(`[createClientLoader] ${path} does not exist in available entries`);
|
|
29
|
+
return loader;
|
|
30
|
+
}
|
|
31
|
+
function getRenderer(path) {
|
|
32
|
+
if (path in renderers) return renderers[path];
|
|
33
|
+
let promise;
|
|
34
|
+
function Renderer(props) {
|
|
35
|
+
let doc = store.preloaded.get(path);
|
|
36
|
+
doc ??= use(promise ??= getLoader(path)());
|
|
37
|
+
return useRenderer(doc, props);
|
|
38
|
+
}
|
|
39
|
+
return renderers[path] = Renderer;
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
async preload(path) {
|
|
43
|
+
const loaded = await getLoader(path)();
|
|
44
|
+
store.preloaded.set(path, loaded);
|
|
45
|
+
return loaded;
|
|
46
|
+
},
|
|
47
|
+
getComponent(path) {
|
|
48
|
+
return getRenderer(path);
|
|
49
|
+
},
|
|
50
|
+
useContent(path, props) {
|
|
51
|
+
return /* @__PURE__ */ jsx(getRenderer(path), { ...props });
|
|
52
|
+
}
|
|
53
|
+
};
|
|
63
54
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
55
|
+
|
|
56
|
+
//#endregion
|
|
57
|
+
export { browser, createClientLoader };
|
|
58
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","names":[],"sources":["../../src/runtime/browser.tsx"],"sourcesContent":["import { type ReactNode, type FC, use } from 'react';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\nimport type { DocCollection, DocsCollection } from '@/config/define';\nimport type { CompiledMDXProperties } from '@/loaders/mdx/build-mdx';\nimport type { InternalTypeConfig } from './types';\n\ntype CompiledMDXFile<\n Name extends string,\n Frontmatter,\n TC extends InternalTypeConfig,\n> = CompiledMDXProperties<Frontmatter> & TC['DocData'][Name] & Record<string, unknown>;\n\nexport interface ClientLoaderOptions<Doc, Props> {\n /**\n * Loader ID (usually your collection name)\n *\n * The code splitting strategy of frameworks like Tanstack Start may duplicate `createClientLoader()` into different chunks.\n *\n * We use loader ID to share cache between multiple instances of client loader.\n *\n * @defaultValue ''\n */\n id?: string;\n\n component: (loaded: Doc, props: Props) => ReactNode;\n}\n\nexport interface ClientLoader<Doc, Props> {\n preload: (path: string) => Promise<Doc>;\n /**\n * Get a component that renders content with `use()`.\n */\n getComponent: (path: string) => FC<Props>;\n /**\n * Get react nodes that renders content, wraps `<Suspense>` by default.\n */\n useContent: undefined extends Props\n ? (path: string, props?: Props) => ReactNode\n : (path: string, props: Props) => ReactNode;\n}\n\nexport type BrowserCreate<Config, TC extends InternalTypeConfig> = ReturnType<\n typeof browser<Config, TC>\n>;\n\nexport interface DocCollectionEntry<\n Name extends string = string,\n Frontmatter = unknown,\n TC extends InternalTypeConfig = InternalTypeConfig,\n> {\n raw: Record<string, () => Promise<CompiledMDXFile<Name, Frontmatter, TC>>>;\n\n createClientLoader: <Props extends object | undefined = undefined>(\n options: ClientLoaderOptions<CompiledMDXFile<Name, Frontmatter, TC>, Props>,\n ) => ClientLoader<CompiledMDXFile<Name, Frontmatter, TC>, Props>;\n}\n\nexport function browser<Config, TC extends InternalTypeConfig>() {\n return {\n doc<Name extends keyof Config & string>(\n _name: Name,\n glob: Record<string, () => Promise<unknown>>,\n ) {\n const out: DocCollectionEntry = {\n raw: glob as DocCollectionEntry['raw'],\n createClientLoader({ id = _name as string, ...options }) {\n return createClientLoader(this.raw, { id, ...options });\n },\n };\n\n return out as Config[Name] extends DocCollection<infer Schema> | DocsCollection<infer Schema>\n ? DocCollectionEntry<Name, StandardSchemaV1.InferOutput<Schema>, TC>\n : never;\n },\n };\n}\n\nconst loaderStore = new Map<\n string,\n {\n preloaded: Map<string, CompiledMDXProperties>;\n }\n>();\n\nexport function createClientLoader<\n Doc = CompiledMDXProperties,\n Props extends object | undefined = undefined,\n>(\n globEntries: Record<string, () => Promise<Doc>>,\n options: ClientLoaderOptions<Doc, Props>,\n): ClientLoader<Doc, Props> {\n const { id = '', component: useRenderer } = options;\n const renderers: Record<string, FC<Props>> = {};\n const loaders = new Map<string, () => Promise<Doc>>();\n const store = loaderStore.get(id) ?? {\n preloaded: new Map(),\n };\n loaderStore.set(id, store);\n\n for (const k in globEntries) {\n loaders.set(k.startsWith('./') ? k.slice(2) : k, globEntries[k]);\n }\n\n function getLoader(path: string) {\n const loader = loaders.get(path);\n if (!loader)\n throw new Error(`[createClientLoader] ${path} does not exist in available entries`);\n return loader;\n }\n\n function getRenderer(path: string): FC<Props> {\n if (path in renderers) return renderers[path];\n\n let promise: Promise<Doc> | undefined;\n function Renderer(props: Props) {\n let doc = store.preloaded.get(path);\n doc ??= use((promise ??= getLoader(path)()));\n\n return useRenderer(doc, props);\n }\n\n return (renderers[path] = Renderer);\n }\n\n return {\n async preload(path) {\n const loaded = await getLoader(path)();\n store.preloaded.set(path, loaded);\n return loaded;\n },\n getComponent(path) {\n return getRenderer(path);\n },\n useContent(path: string, props: Props & object) {\n const Comp = getRenderer(path);\n return <Comp {...props} />;\n },\n } as ClientLoader<Doc, Props>;\n}\n"],"mappings":";;;;AAyDA,SAAgB,UAAiD;AAC/D,QAAO,EACL,IACE,OACA,MACA;AAQA,SAPgC;GAC9B,KAAK;GACL,mBAAmB,EAAE,KAAK,OAAiB,GAAG,WAAW;AACvD,WAAO,mBAAmB,KAAK,KAAK;KAAE;KAAI,GAAG;KAAS,CAAC;;GAE1D;IAMJ;;AAGH,MAAM,8BAAc,IAAI,KAKrB;AAEH,SAAgB,mBAId,aACA,SAC0B;CAC1B,MAAM,EAAE,KAAK,IAAI,WAAW,gBAAgB;CAC5C,MAAM,YAAuC,EAAE;CAC/C,MAAM,0BAAU,IAAI,KAAiC;CACrD,MAAM,QAAQ,YAAY,IAAI,GAAG,IAAI,EACnC,2BAAW,IAAI,KAAK,EACrB;AACD,aAAY,IAAI,IAAI,MAAM;AAE1B,MAAK,MAAM,KAAK,YACd,SAAQ,IAAI,EAAE,WAAW,KAAK,GAAG,EAAE,MAAM,EAAE,GAAG,GAAG,YAAY,GAAG;CAGlE,SAAS,UAAU,MAAc;EAC/B,MAAM,SAAS,QAAQ,IAAI,KAAK;AAChC,MAAI,CAAC,OACH,OAAM,IAAI,MAAM,wBAAwB,KAAK,sCAAsC;AACrF,SAAO;;CAGT,SAAS,YAAY,MAAyB;AAC5C,MAAI,QAAQ,UAAW,QAAO,UAAU;EAExC,IAAI;EACJ,SAAS,SAAS,OAAc;GAC9B,IAAI,MAAM,MAAM,UAAU,IAAI,KAAK;AACnC,WAAQ,IAAK,YAAY,UAAU,KAAK,EAAE,CAAE;AAE5C,UAAO,YAAY,KAAK,MAAM;;AAGhC,SAAQ,UAAU,QAAQ;;AAG5B,QAAO;EACL,MAAM,QAAQ,MAAM;GAClB,MAAM,SAAS,MAAM,UAAU,KAAK,EAAE;AACtC,SAAM,UAAU,IAAI,MAAM,OAAO;AACjC,UAAO;;EAET,aAAa,MAAM;AACjB,UAAO,YAAY,KAAK;;EAE1B,WAAW,MAAc,OAAuB;AAE9C,UAAO,oBADM,YAAY,KAAK,IACjB,GAAI,QAAS;;EAE7B"}
|
|
@@ -1,27 +1,19 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import * as
|
|
4
|
-
import
|
|
5
|
-
import '@mdx-js/mdx';
|
|
6
|
-
import 'unified';
|
|
7
|
-
import 'fumadocs-core/mdx-plugins';
|
|
8
|
-
import 'fumadocs-core/source/schema';
|
|
9
|
-
import 'chokidar';
|
|
10
|
-
import 'vfile';
|
|
11
|
-
import 'fumadocs-core/mdx-plugins/remark-structure';
|
|
12
|
-
import 'fumadocs-core/toc';
|
|
13
|
-
import 'mdast';
|
|
14
|
-
import 'mdx/types';
|
|
1
|
+
import { C as ServerOptions, M as DocCollection, N as DocsCollection, _ as AsyncDocCollectionEntry, r as CoreOptions, v as AsyncDocsCollectionEntry } from "../core-DG43f_AU.js";
|
|
2
|
+
import { i as InternalTypeConfig, r as FileInfo } from "../types-B6myALSk.js";
|
|
3
|
+
import * as _standard_schema_spec0 from "@standard-schema/spec";
|
|
4
|
+
import * as fumadocs_core_source0 from "fumadocs-core/source";
|
|
15
5
|
|
|
6
|
+
//#region src/runtime/dynamic.d.ts
|
|
16
7
|
interface LazyEntry<Data = unknown> {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
8
|
+
info: FileInfo;
|
|
9
|
+
data: Data;
|
|
10
|
+
hash?: string;
|
|
20
11
|
}
|
|
21
12
|
type CreateDynamic<Config, TC extends InternalTypeConfig = InternalTypeConfig> = ReturnType<typeof dynamic<Config, TC>>;
|
|
22
13
|
declare function dynamic<Config, TC extends InternalTypeConfig>(configExports: Config, coreOptions: CoreOptions, serverOptions?: ServerOptions): Promise<{
|
|
23
|
-
|
|
24
|
-
|
|
14
|
+
doc<Name extends keyof Config & string>(name: Name, base: string, entries: LazyEntry<unknown>[]): Promise<Config[Name] extends DocCollection<infer Schema extends _standard_schema_spec0.StandardSchemaV1<unknown, unknown>> | DocsCollection<infer Schema extends _standard_schema_spec0.StandardSchemaV1<unknown, unknown>, _standard_schema_spec0.StandardSchemaV1<unknown, unknown>> ? AsyncDocCollectionEntry<Name, _standard_schema_spec0.StandardSchemaV1.InferOutput<Schema>, TC>[] : never>;
|
|
15
|
+
docs<Name extends keyof Config & string>(name: Name, base: string, meta: Record<string, unknown>, entries: LazyEntry<unknown>[]): Promise<Config[Name] extends DocsCollection<infer Page extends _standard_schema_spec0.StandardSchemaV1<unknown, unknown>, infer Meta extends _standard_schema_spec0.StandardSchemaV1<unknown, unknown>> ? _standard_schema_spec0.StandardSchemaV1.InferOutput<Page> extends fumadocs_core_source0.PageData ? _standard_schema_spec0.StandardSchemaV1.InferOutput<Meta> extends fumadocs_core_source0.MetaData ? AsyncDocsCollectionEntry<Name, _standard_schema_spec0.StandardSchemaV1.InferOutput<Page>, _standard_schema_spec0.StandardSchemaV1.InferOutput<Meta>, TC> : never : never : never>;
|
|
25
16
|
}>;
|
|
26
|
-
|
|
27
|
-
export {
|
|
17
|
+
//#endregion
|
|
18
|
+
export { CreateDynamic, LazyEntry, dynamic };
|
|
19
|
+
//# sourceMappingURL=dynamic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dynamic.d.ts","names":[],"sources":["../../src/runtime/dynamic.ts"],"sourcesContent":[],"mappings":";;;;;;UAUiB;QACT;QACA;EAFS,IAAA,CAAA,EAAA,MAAS;AAO1B;AAA6C,KAAjC,aAAiC,CAAA,MAAA,EAAA,WAAA,kBAAA,GAAqB,kBAArB,CAAA,GAA2C,UAA3C,CAAA,OACpC,OADoC,CAC5B,MAD4B,EACpB,EADoB,CAAA,CAAA;AAAqB,iBAI5C,OAJ4C,CAAA,MAAA,EAAA,WAIjB,kBAJiB,CAAA,CAAA,aAAA,EAKjD,MALiD,EAAA,WAAA,EAMnD,WANmD,EAAA,aAAA,CAAA,EAOhD,aAPgD,CAAA,EAOnC,OAPmC,CAAA;EACjD,GAAA,CAAA,aAAA,MAsDgB,MAtDhB,GAAA,MAAA,CAAA,CAAA,IAAA,EAuDL,IAvDK,EAAA,IAAA,EAAA,MAAA,EAAA,OAAA,EAyDF,SAzDE,CAAA,OAAA,CAAA,EAAA,CAAA,EAyDkB,OAzDlB,CAyDkB,MAzDlB,CAyDkB,IAzDlB,CAAA,SAyDkB,aAzDlB,CAAA,KAAA,gBAyDkB,sBAAA,CAAA,gBAzDlB,CAAA,OAAA,EAAA,OAAA,CAAA,CAAA,GAyDkB,cAzDlB,CAAA,KAAA,gBAyDkB,sBAAA,CAAA,gBAzDlB,CAAA,OAAA,EAAA,OAAA,CAAA,EAyDkB,sBAAA,CAAA,gBAzDlB,CAAA,OAAA,EAAA,OAAA,CAAA,CAAA,GAyDkB,uBAzDlB,CAyDkB,IAzDlB,EAyDkB,sBAAA,CAAA,gBAAA,CAAA,WAzDlB,CAyDkB,MAzDlB,CAAA,EAyDkB,EAzDlB,CAAA,EAAA,GAAA,KAAA,CAAA;EAAQ,IAAA,CAAA,aAAA,MAkES,MAlET,GAAA,MAAA,CAAA,CAAA,IAAA,EAmEb,IAnEa,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAqEb,MArEa,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAsEV,SAtEU,CAAA,OAAA,CAAA,EAAA,CAAA,EAsEU,OAtEV,CAsEU,MAtEV,CAsEU,IAtEV,CAAA,SAsEU,cAtEV,CAAA,KAAA,cAsEU,sBAAA,CAAA,gBAtEV,CAAA,OAAA,EAAA,OAAA,CAAA,EAAA,KAAA,cAsEU,sBAAA,CAAA,gBAtEV,CAAA,OAAA,EAAA,OAAA,CAAA,CAAA,GAsEU,sBAAA,CAAA,gBAAA,CAAA,WAtEV,CAsEU,IAtEV,CAAA,SAsEU,qBAAA,CAAA,QAAA,GAAA,sBAAA,CAAA,gBAAA,CAAA,WAtEV,CAsEU,IAtEV,CAAA,SAsEU,qBAAA,CAAA,QAAA,GAAA,wBAtEV,CAsEU,IAtEV,EAsEU,sBAAA,CAAA,gBAAA,CAAA,WAtEV,CAsEU,IAtEV,CAAA,EAsEU,sBAAA,CAAA,gBAAA,CAAA,WAtEV,CAsEU,IAtEV,CAAA,EAsEU,EAtEV,CAAA,GAAA,KAAA,GAAA,KAAA,GAAA,KAAA,CAAA;CAAhB,CAAA"}
|