fumadocs-mdx 14.2.2 → 14.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter-DG-viEbG.js +144 -0
- package/dist/adapter-DG-viEbG.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-DMZ9tsAa.js +91 -0
- package/dist/mdx-DMZ9tsAa.js.map +1 -0
- package/dist/meta-DyieTM4Z.js +81 -0
- package/dist/meta-DyieTM4Z.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 +32 -41
- package/dist/runtime/browser.d.ts.map +1 -0
- package/dist/runtime/browser.js +56 -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 +38 -38
- 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-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-WSQ23PNV.js +0 -179
- package/dist/chunk-ZAYZWFWP.js +0 -89
- 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,12 @@
|
|
|
1
|
+
import "vfile";
|
|
2
|
+
|
|
3
|
+
//#region src/webpack/index.d.ts
|
|
4
|
+
interface WebpackLoaderOptions {
|
|
5
|
+
absoluteCompiledConfigPath: string;
|
|
6
|
+
configPath: string;
|
|
7
|
+
outDir: string;
|
|
8
|
+
isDev: boolean;
|
|
9
|
+
}
|
|
10
|
+
//#endregion
|
|
11
|
+
export { WebpackLoaderOptions as t };
|
|
12
|
+
//# sourceMappingURL=index-Bc_4I1HE.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-Bc_4I1HE.d.ts","names":[],"sources":["../src/webpack/index.ts"],"sourcesContent":[],"mappings":";;;UAEiB,oBAAA;;;EAAA,MAAA,EAAA,MAAA"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { t as fumaMatter } from "./fuma-matter-CHgJa_-B.js";
|
|
2
|
+
import { n as ident, r as slash, t as createCodegen } from "./codegen-DleOVLNr.js";
|
|
3
|
+
import fs from "node:fs/promises";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { glob } from "tinyglobby";
|
|
6
|
+
import path$1 from "path";
|
|
7
|
+
import { createHash } from "crypto";
|
|
8
|
+
|
|
9
|
+
//#region src/utils/fs-cache.ts
|
|
10
|
+
const map = /* @__PURE__ */ new Map();
|
|
11
|
+
function createFSCache() {
|
|
12
|
+
return {
|
|
13
|
+
read(file) {
|
|
14
|
+
const fullPath = toFullPath(file);
|
|
15
|
+
const cached = map.get(fullPath);
|
|
16
|
+
if (cached) return cached;
|
|
17
|
+
const read = fs.readFile(fullPath).then((s) => s.toString());
|
|
18
|
+
map.set(fullPath, read);
|
|
19
|
+
return read;
|
|
20
|
+
},
|
|
21
|
+
delete(file) {
|
|
22
|
+
map.delete(toFullPath(file));
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* make file paths relative to cwd
|
|
28
|
+
*/
|
|
29
|
+
function toFullPath(file) {
|
|
30
|
+
if (path.isAbsolute(file)) return path.relative(process.cwd(), file);
|
|
31
|
+
return file;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
//#endregion
|
|
35
|
+
//#region src/plugins/index-file.ts
|
|
36
|
+
const indexFileCache = createFSCache();
|
|
37
|
+
function indexFile(options = {}) {
|
|
38
|
+
const { target = "default", addJsExtension, browser = true, dynamic = true } = options;
|
|
39
|
+
let dynamicCollections;
|
|
40
|
+
function isDynamic(collection) {
|
|
41
|
+
return collection.type === "docs" && collection.docs.dynamic || collection.type === "doc" && collection.dynamic;
|
|
42
|
+
}
|
|
43
|
+
function generateConfigs(core) {
|
|
44
|
+
const serverOptions = {};
|
|
45
|
+
const typeConfigs = ["import(\"fumadocs-mdx/runtime/types\").InternalTypeConfig"];
|
|
46
|
+
const ctx = core.getPluginContext();
|
|
47
|
+
for (const plugin of core.getPlugins()) {
|
|
48
|
+
const indexFilePlugin = plugin["index-file"];
|
|
49
|
+
if (!indexFilePlugin) continue;
|
|
50
|
+
indexFilePlugin.serverOptions?.call(ctx, serverOptions);
|
|
51
|
+
const config = indexFilePlugin.generateTypeConfig?.call(ctx);
|
|
52
|
+
if (config) typeConfigs.push(config);
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
serverOptions,
|
|
56
|
+
tc: typeConfigs.join(" & ")
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
return {
|
|
60
|
+
name: "index-file",
|
|
61
|
+
config() {
|
|
62
|
+
dynamicCollections = this.core.getCollections().filter(isDynamic);
|
|
63
|
+
},
|
|
64
|
+
configureServer(server) {
|
|
65
|
+
if (!server.watcher) return;
|
|
66
|
+
server.watcher.on("all", async (event, file) => {
|
|
67
|
+
indexFileCache.delete(file);
|
|
68
|
+
if (dynamicCollections.length === 0) {
|
|
69
|
+
if (target === "vite") return;
|
|
70
|
+
if (target === "default" && event === "change") return;
|
|
71
|
+
}
|
|
72
|
+
const updatedCollection = this.core.getCollections().find((collection) => collection.hasFile(file));
|
|
73
|
+
if (!updatedCollection) return;
|
|
74
|
+
if (!isDynamic(updatedCollection)) {
|
|
75
|
+
if (target === "vite") return;
|
|
76
|
+
if (target === "default" && event === "change") return;
|
|
77
|
+
}
|
|
78
|
+
await this.core.emit({
|
|
79
|
+
filterPlugin: (plugin) => plugin.name === "index-file",
|
|
80
|
+
filterWorkspace: () => false,
|
|
81
|
+
write: true
|
|
82
|
+
});
|
|
83
|
+
});
|
|
84
|
+
},
|
|
85
|
+
async emit() {
|
|
86
|
+
const globCache = /* @__PURE__ */ new Map();
|
|
87
|
+
const { workspace, outDir } = this.core.getOptions();
|
|
88
|
+
const { serverOptions, tc } = generateConfigs(this.core);
|
|
89
|
+
const toEmitEntry = async (path$2, content) => {
|
|
90
|
+
const codegen = createCodegen({
|
|
91
|
+
target,
|
|
92
|
+
outDir,
|
|
93
|
+
jsExtension: addJsExtension,
|
|
94
|
+
globCache
|
|
95
|
+
});
|
|
96
|
+
await content({
|
|
97
|
+
core: this.core,
|
|
98
|
+
codegen,
|
|
99
|
+
serverOptions,
|
|
100
|
+
tc,
|
|
101
|
+
workspace: workspace?.name
|
|
102
|
+
});
|
|
103
|
+
return {
|
|
104
|
+
path: path$2,
|
|
105
|
+
content: codegen.toString()
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
const out = [toEmitEntry("server.ts", generateServerIndexFile)];
|
|
109
|
+
if (dynamic) out.push(toEmitEntry("dynamic.ts", generateDynamicIndexFile));
|
|
110
|
+
if (browser) out.push(toEmitEntry("browser.ts", generateBrowserIndexFile));
|
|
111
|
+
return await Promise.all(out);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
async function generateServerIndexFile(ctx) {
|
|
116
|
+
const { core, codegen, serverOptions, tc } = ctx;
|
|
117
|
+
codegen.lines.push(`import { server } from 'fumadocs-mdx/runtime/server';`, `import type * as Config from '${codegen.formatImportPath(core.getOptions().configPath)}';`, "", `const create = server<typeof Config, ${tc}>(${JSON.stringify(serverOptions)});`);
|
|
118
|
+
async function generateCollectionObject(collection) {
|
|
119
|
+
const base = getBase(collection);
|
|
120
|
+
switch (collection.type) {
|
|
121
|
+
case "docs": {
|
|
122
|
+
if (collection.docs.dynamic) return;
|
|
123
|
+
if (collection.docs.async) {
|
|
124
|
+
const [metaGlob$1, headGlob, bodyGlob] = await Promise.all([
|
|
125
|
+
generateMetaCollectionGlob(ctx, collection.meta, true),
|
|
126
|
+
generateDocCollectionFrontmatterGlob(ctx, collection.docs, true),
|
|
127
|
+
generateDocCollectionGlob(ctx, collection.docs)
|
|
128
|
+
]);
|
|
129
|
+
return `await create.docsLazy("${collection.name}", "${base}", ${metaGlob$1}, ${headGlob}, ${bodyGlob})`;
|
|
130
|
+
}
|
|
131
|
+
const [metaGlob, docGlob] = await Promise.all([generateMetaCollectionGlob(ctx, collection.meta, true), generateDocCollectionGlob(ctx, collection.docs, true)]);
|
|
132
|
+
return `await create.docs("${collection.name}", "${base}", ${metaGlob}, ${docGlob})`;
|
|
133
|
+
}
|
|
134
|
+
case "doc":
|
|
135
|
+
if (collection.dynamic) return;
|
|
136
|
+
if (collection.async) {
|
|
137
|
+
const [headGlob, bodyGlob] = await Promise.all([generateDocCollectionFrontmatterGlob(ctx, collection, true), generateDocCollectionGlob(ctx, collection)]);
|
|
138
|
+
return `await create.docLazy("${collection.name}", "${base}", ${headGlob}, ${bodyGlob})`;
|
|
139
|
+
}
|
|
140
|
+
return `await create.doc("${collection.name}", "${base}", ${await generateDocCollectionGlob(ctx, collection, true)})`;
|
|
141
|
+
case "meta": return `await create.meta("${collection.name}", "${base}", ${await generateMetaCollectionGlob(ctx, collection, true)})`;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
await codegen.pushAsync(core.getCollections().map(async (collection) => {
|
|
145
|
+
const obj = await generateCollectionObject(collection);
|
|
146
|
+
if (!obj) return;
|
|
147
|
+
return `\nexport const ${collection.name} = ${obj};`;
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
async function generateDynamicIndexFile(ctx) {
|
|
151
|
+
const { core, codegen, serverOptions, tc } = ctx;
|
|
152
|
+
const { configPath, environment, outDir } = core.getOptions();
|
|
153
|
+
const partialOptions = {
|
|
154
|
+
configPath,
|
|
155
|
+
environment,
|
|
156
|
+
outDir
|
|
157
|
+
};
|
|
158
|
+
codegen.lines.push(`import { dynamic } from 'fumadocs-mdx/runtime/dynamic';`, `import * as Config from '${codegen.formatImportPath(configPath)}';`, "", `const create = await dynamic<typeof Config, ${tc}>(Config, ${JSON.stringify(partialOptions)}, ${JSON.stringify(serverOptions)});`);
|
|
159
|
+
async function generateCollectionObjectEntry(collection, absolutePath) {
|
|
160
|
+
const fullPath = path$1.relative(process.cwd(), absolutePath);
|
|
161
|
+
const content = await indexFileCache.read(fullPath).catch(() => "");
|
|
162
|
+
const parsed = fumaMatter(content);
|
|
163
|
+
const data = await core.transformFrontmatter({
|
|
164
|
+
collection,
|
|
165
|
+
filePath: fullPath,
|
|
166
|
+
source: content
|
|
167
|
+
}, parsed.data);
|
|
168
|
+
const hash = createHash("md5").update(content).digest("hex");
|
|
169
|
+
const infoStr = [`absolutePath: path.resolve(${JSON.stringify(fullPath)})`];
|
|
170
|
+
for (const [k, v] of Object.entries({
|
|
171
|
+
info: {
|
|
172
|
+
fullPath,
|
|
173
|
+
path: path$1.relative(collection.dir, absolutePath)
|
|
174
|
+
},
|
|
175
|
+
data,
|
|
176
|
+
hash
|
|
177
|
+
})) infoStr.push(`${k}: ${JSON.stringify(v)}`);
|
|
178
|
+
return `{ ${infoStr.join(", ")} }`;
|
|
179
|
+
}
|
|
180
|
+
async function generateCollectionObject(parent) {
|
|
181
|
+
let collection;
|
|
182
|
+
if (parent.type === "doc") collection = parent;
|
|
183
|
+
else if (parent.type === "docs") collection = parent.docs;
|
|
184
|
+
if (!collection || !collection.dynamic) return;
|
|
185
|
+
const files = await glob(collection.patterns, {
|
|
186
|
+
cwd: collection.dir,
|
|
187
|
+
absolute: true
|
|
188
|
+
});
|
|
189
|
+
const entries = await Promise.all(files.map((file) => generateCollectionObjectEntry(collection, file)));
|
|
190
|
+
switch (parent.type) {
|
|
191
|
+
case "docs": {
|
|
192
|
+
const metaGlob = await generateMetaCollectionGlob(ctx, parent.meta, true);
|
|
193
|
+
return `await create.docs("${parent.name}", "${getBase(parent)}", ${metaGlob}, ${entries.join(", ")})`;
|
|
194
|
+
}
|
|
195
|
+
case "doc": return `await create.doc("${collection.name}", "${getBase(collection)}", ${entries.join(", ")})`;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
await codegen.pushAsync(core.getCollections().map(async (collection) => {
|
|
199
|
+
const obj = await generateCollectionObject(collection);
|
|
200
|
+
if (!obj) return;
|
|
201
|
+
return `\nexport const ${collection.name} = ${obj};`;
|
|
202
|
+
}));
|
|
203
|
+
}
|
|
204
|
+
async function generateBrowserIndexFile(ctx) {
|
|
205
|
+
const { core, codegen, tc } = ctx;
|
|
206
|
+
codegen.lines.push(`import { browser } from 'fumadocs-mdx/runtime/browser';`, `import type * as Config from '${codegen.formatImportPath(core.getOptions().configPath)}';`, "", `const create = browser<typeof Config, ${tc}>();`);
|
|
207
|
+
async function generateCollectionObject(collection) {
|
|
208
|
+
switch (collection.type) {
|
|
209
|
+
case "docs":
|
|
210
|
+
if (collection.docs.dynamic) return;
|
|
211
|
+
return generateCollectionObject(collection.docs);
|
|
212
|
+
case "doc":
|
|
213
|
+
if (collection.dynamic) return;
|
|
214
|
+
return `create.doc("${collection.name}", ${await generateDocCollectionGlob(ctx, collection)})`;
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
codegen.lines.push("const browserCollections = {");
|
|
218
|
+
await codegen.pushAsync(core.getCollections().map(async (collection) => {
|
|
219
|
+
const obj = await generateCollectionObject(collection);
|
|
220
|
+
if (!obj) return;
|
|
221
|
+
return ident(`${collection.name}: ${obj},`);
|
|
222
|
+
}));
|
|
223
|
+
codegen.lines.push("};", "export default browserCollections;");
|
|
224
|
+
}
|
|
225
|
+
function getBase(collection) {
|
|
226
|
+
return slash(path$1.relative(process.cwd(), collection.dir));
|
|
227
|
+
}
|
|
228
|
+
function generateDocCollectionFrontmatterGlob({ codegen, workspace }, collection, eager = false) {
|
|
229
|
+
return codegen.generateGlobImport(collection.patterns, {
|
|
230
|
+
query: {
|
|
231
|
+
collection: collection.name,
|
|
232
|
+
only: "frontmatter",
|
|
233
|
+
workspace
|
|
234
|
+
},
|
|
235
|
+
import: "frontmatter",
|
|
236
|
+
base: collection.dir,
|
|
237
|
+
eager
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
function generateDocCollectionGlob({ codegen, workspace }, collection, eager = false) {
|
|
241
|
+
return codegen.generateGlobImport(collection.patterns, {
|
|
242
|
+
query: {
|
|
243
|
+
collection: collection.name,
|
|
244
|
+
workspace
|
|
245
|
+
},
|
|
246
|
+
base: collection.dir,
|
|
247
|
+
eager
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
function generateMetaCollectionGlob({ codegen, workspace }, collection, eager = false) {
|
|
251
|
+
return codegen.generateGlobImport(collection.patterns, {
|
|
252
|
+
query: {
|
|
253
|
+
collection: collection.name,
|
|
254
|
+
workspace
|
|
255
|
+
},
|
|
256
|
+
import: "default",
|
|
257
|
+
base: collection.dir,
|
|
258
|
+
eager
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
//#endregion
|
|
263
|
+
export { indexFile as t };
|
|
264
|
+
//# sourceMappingURL=index-file-D9HsrWU_.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-file-D9HsrWU_.js","names":["dynamicCollections: CollectionItem[]","serverOptions: ServerOptions","typeConfigs: string[]","out: Promise<EmitEntry>[]","metaGlob","partialOptions: CoreOptions","path","infoStr: string[]","collection: DocCollectionItem | undefined"],"sources":["../src/utils/fs-cache.ts","../src/plugins/index-file.ts"],"sourcesContent":["import fs from 'node:fs/promises';\nimport path from 'node:path';\n\nconst map = new Map<string, Promise<string>>();\n\nexport function createFSCache() {\n return {\n read(file: string): Promise<string> {\n const fullPath = toFullPath(file);\n const cached = map.get(fullPath);\n if (cached) return cached;\n\n const read = fs.readFile(fullPath).then((s) => s.toString());\n map.set(fullPath, read);\n return read;\n },\n\n delete(file: string) {\n map.delete(toFullPath(file));\n },\n };\n}\n\n/**\n * make file paths relative to cwd\n */\nfunction toFullPath(file: string) {\n if (path.isAbsolute(file)) {\n return path.relative(process.cwd(), file);\n }\n\n return file;\n}\n","import type { Core, CoreOptions, Plugin, PluginContext } from '@/core';\nimport type { CollectionItem, DocCollectionItem, MetaCollectionItem } from '@/config/build';\nimport path from 'path';\nimport { type CodeGen, createCodegen, ident, slash } from '@/utils/codegen';\nimport { glob } from 'tinyglobby';\nimport { createFSCache } from '@/utils/fs-cache';\nimport { createHash } from 'crypto';\nimport type { LazyEntry } from '@/runtime/dynamic';\nimport type { EmitEntry } from '@/core';\nimport { fumaMatter } from '@/utils/fuma-matter';\nimport type { ServerOptions } from '@/runtime/server';\n\nexport interface IndexFilePluginOptions {\n target?: 'default' | 'vite';\n\n /**\n * add `.js` extensions to imports, needed for ESM without bundler resolution\n */\n addJsExtension?: boolean;\n\n /**\n * Generate entry point for browser\n * @defaultValue true\n */\n browser?: boolean;\n\n /**\n * Generate entry point for dynamic compilation\n * @defaultValue true\n */\n dynamic?: boolean;\n}\n\nexport interface IndexFilePlugin {\n ['index-file']?: {\n generateTypeConfig?: (this: PluginContext) => string | void;\n serverOptions?: (this: PluginContext, options: ServerOptions) => void;\n };\n}\n\ninterface FileGenContext {\n core: Core;\n workspace?: string;\n codegen: CodeGen;\n serverOptions: ServerOptions;\n tc: string;\n}\n\nconst indexFileCache = createFSCache();\n\nexport default function indexFile(options: IndexFilePluginOptions = {}): Plugin {\n const { target = 'default', addJsExtension, browser = true, dynamic = true } = options;\n let dynamicCollections: CollectionItem[];\n\n function isDynamic(collection: CollectionItem) {\n return (\n (collection.type === 'docs' && collection.docs.dynamic) ||\n (collection.type === 'doc' && collection.dynamic)\n );\n }\n\n function generateConfigs(core: Core): {\n serverOptions: ServerOptions;\n tc: string;\n } {\n const serverOptions: ServerOptions = {};\n const typeConfigs: string[] = ['import(\"fumadocs-mdx/runtime/types\").InternalTypeConfig'];\n const ctx = core.getPluginContext();\n\n for (const plugin of core.getPlugins()) {\n const indexFilePlugin = plugin['index-file'];\n if (!indexFilePlugin) continue;\n\n indexFilePlugin.serverOptions?.call(ctx, serverOptions);\n const config = indexFilePlugin.generateTypeConfig?.call(ctx);\n if (config) typeConfigs.push(config);\n }\n\n return {\n serverOptions,\n tc: typeConfigs.join(' & '),\n };\n }\n\n return {\n name: 'index-file',\n config() {\n dynamicCollections = this.core.getCollections().filter(isDynamic);\n },\n configureServer(server) {\n if (!server.watcher) return;\n\n server.watcher.on('all', async (event, file) => {\n indexFileCache.delete(file);\n\n // dynamic collections always require re-generation on change\n if (dynamicCollections.length === 0) {\n // vite uses `import.meta.glob`, no need to re-generate\n if (target === 'vite') return;\n // only re-generate when adding/deleting entries\n if (target === 'default' && event === 'change') return;\n }\n\n const updatedCollection = this.core\n .getCollections()\n .find((collection) => collection.hasFile(file));\n\n if (!updatedCollection) return;\n if (!isDynamic(updatedCollection)) {\n if (target === 'vite') return;\n if (target === 'default' && event === 'change') return;\n }\n\n await this.core.emit({\n filterPlugin: (plugin) => plugin.name === 'index-file',\n filterWorkspace: () => false,\n write: true,\n });\n });\n },\n async emit() {\n const globCache = new Map<string, Promise<string[]>>();\n const { workspace, outDir } = this.core.getOptions();\n const { serverOptions, tc } = generateConfigs(this.core);\n const toEmitEntry = async (\n path: string,\n content: (ctx: FileGenContext) => Promise<void>,\n ): Promise<EmitEntry> => {\n const codegen = createCodegen({\n target,\n outDir: outDir,\n jsExtension: addJsExtension,\n globCache,\n });\n await content({\n core: this.core,\n codegen,\n serverOptions,\n tc,\n workspace: workspace?.name,\n });\n return {\n path,\n content: codegen.toString(),\n };\n };\n\n const out: Promise<EmitEntry>[] = [toEmitEntry('server.ts', generateServerIndexFile)];\n\n if (dynamic) out.push(toEmitEntry('dynamic.ts', generateDynamicIndexFile));\n\n if (browser) out.push(toEmitEntry('browser.ts', generateBrowserIndexFile));\n\n return await Promise.all(out);\n },\n };\n}\n\nasync function generateServerIndexFile(ctx: FileGenContext) {\n const { core, codegen, serverOptions, tc } = ctx;\n codegen.lines.push(\n `import { server } from 'fumadocs-mdx/runtime/server';`,\n `import type * as Config from '${codegen.formatImportPath(core.getOptions().configPath)}';`,\n '',\n `const create = server<typeof Config, ${tc}>(${JSON.stringify(serverOptions)});`,\n );\n\n async function generateCollectionObject(collection: CollectionItem): Promise<string | undefined> {\n const base = getBase(collection);\n\n switch (collection.type) {\n case 'docs': {\n if (collection.docs.dynamic) return;\n\n if (collection.docs.async) {\n const [metaGlob, headGlob, bodyGlob] = await Promise.all([\n generateMetaCollectionGlob(ctx, collection.meta, true),\n generateDocCollectionFrontmatterGlob(ctx, collection.docs, true),\n generateDocCollectionGlob(ctx, collection.docs),\n ]);\n\n return `await create.docsLazy(\"${collection.name}\", \"${base}\", ${metaGlob}, ${headGlob}, ${bodyGlob})`;\n }\n\n const [metaGlob, docGlob] = await Promise.all([\n generateMetaCollectionGlob(ctx, collection.meta, true),\n generateDocCollectionGlob(ctx, collection.docs, true),\n ]);\n\n return `await create.docs(\"${collection.name}\", \"${base}\", ${metaGlob}, ${docGlob})`;\n }\n case 'doc':\n if (collection.dynamic) return;\n\n if (collection.async) {\n const [headGlob, bodyGlob] = await Promise.all([\n generateDocCollectionFrontmatterGlob(ctx, collection, true),\n generateDocCollectionGlob(ctx, collection),\n ]);\n\n return `await create.docLazy(\"${collection.name}\", \"${base}\", ${headGlob}, ${bodyGlob})`;\n }\n\n return `await create.doc(\"${collection.name}\", \"${base}\", ${await generateDocCollectionGlob(\n ctx,\n collection,\n true,\n )})`;\n case 'meta':\n return `await create.meta(\"${collection.name}\", \"${base}\", ${await generateMetaCollectionGlob(\n ctx,\n collection,\n true,\n )})`;\n }\n }\n\n await codegen.pushAsync(\n core.getCollections().map(async (collection) => {\n const obj = await generateCollectionObject(collection);\n if (!obj) return;\n\n return `\\nexport const ${collection.name} = ${obj};`;\n }),\n );\n}\n\nasync function generateDynamicIndexFile(ctx: FileGenContext) {\n const { core, codegen, serverOptions, tc } = ctx;\n const { configPath, environment, outDir } = core.getOptions();\n // serializable config options\n const partialOptions: CoreOptions = {\n configPath,\n environment,\n outDir,\n };\n codegen.lines.push(\n `import { dynamic } from 'fumadocs-mdx/runtime/dynamic';`,\n `import * as Config from '${codegen.formatImportPath(configPath)}';`,\n '',\n `const create = await dynamic<typeof Config, ${tc}>(Config, ${JSON.stringify(partialOptions)}, ${JSON.stringify(serverOptions)});`,\n );\n\n async function generateCollectionObjectEntry(\n collection: DocCollectionItem,\n absolutePath: string,\n ) {\n const fullPath = path.relative(process.cwd(), absolutePath);\n const content = await indexFileCache.read(fullPath).catch(() => '');\n const parsed = fumaMatter(content);\n const data = await core.transformFrontmatter(\n {\n collection,\n filePath: fullPath,\n source: content,\n },\n parsed.data as Record<string, unknown>,\n );\n\n const hash = createHash('md5').update(content).digest('hex');\n const infoStr: string[] = [\n // make sure it's included in vercel/nft\n `absolutePath: path.resolve(${JSON.stringify(fullPath)})`,\n ];\n for (const [k, v] of Object.entries({\n info: {\n fullPath,\n path: path.relative(collection.dir, absolutePath),\n },\n data,\n hash,\n } satisfies LazyEntry)) {\n infoStr.push(`${k}: ${JSON.stringify(v)}`);\n }\n\n return `{ ${infoStr.join(', ')} }`;\n }\n\n async function generateCollectionObject(parent: CollectionItem): Promise<string | undefined> {\n let collection: DocCollectionItem | undefined;\n if (parent.type === 'doc') collection = parent;\n else if (parent.type === 'docs') collection = parent.docs;\n\n if (!collection || !collection.dynamic) return;\n\n const files = await glob(collection.patterns, {\n cwd: collection.dir,\n absolute: true,\n });\n const entries = await Promise.all(\n files.map((file) => generateCollectionObjectEntry(collection, file)),\n );\n\n switch (parent.type) {\n case 'docs': {\n const metaGlob = await generateMetaCollectionGlob(ctx, parent.meta, true);\n\n return `await create.docs(\"${parent.name}\", \"${getBase(parent)}\", ${metaGlob}, ${entries.join(', ')})`;\n }\n case 'doc':\n return `await create.doc(\"${collection.name}\", \"${getBase(collection)}\", ${entries.join(', ')})`;\n }\n }\n\n await codegen.pushAsync(\n core.getCollections().map(async (collection) => {\n const obj = await generateCollectionObject(collection);\n if (!obj) return;\n\n return `\\nexport const ${collection.name} = ${obj};`;\n }),\n );\n}\n\nasync function generateBrowserIndexFile(ctx: FileGenContext) {\n const { core, codegen, tc } = ctx;\n codegen.lines.push(\n `import { browser } from 'fumadocs-mdx/runtime/browser';`,\n `import type * as Config from '${codegen.formatImportPath(core.getOptions().configPath)}';`,\n '',\n `const create = browser<typeof Config, ${tc}>();`,\n );\n\n async function generateCollectionObject(collection: CollectionItem): Promise<string | undefined> {\n switch (collection.type) {\n case 'docs': {\n if (collection.docs.dynamic) return;\n\n return generateCollectionObject(collection.docs);\n }\n case 'doc':\n if (collection.dynamic) return;\n\n return `create.doc(\"${collection.name}\", ${await generateDocCollectionGlob(ctx, collection)})`;\n }\n }\n\n codegen.lines.push('const browserCollections = {');\n\n await codegen.pushAsync(\n core.getCollections().map(async (collection) => {\n const obj = await generateCollectionObject(collection);\n if (!obj) return;\n\n return ident(`${collection.name}: ${obj},`);\n }),\n );\n\n codegen.lines.push('};', 'export default browserCollections;');\n}\n\nfunction getBase(collection: CollectionItem) {\n return slash(path.relative(process.cwd(), collection.dir));\n}\n\nfunction generateDocCollectionFrontmatterGlob(\n { codegen, workspace }: FileGenContext,\n collection: DocCollectionItem,\n eager = false,\n) {\n return codegen.generateGlobImport(collection.patterns, {\n query: {\n collection: collection.name,\n only: 'frontmatter',\n workspace,\n },\n import: 'frontmatter',\n base: collection.dir,\n eager,\n });\n}\n\nfunction generateDocCollectionGlob(\n { codegen, workspace }: FileGenContext,\n collection: DocCollectionItem,\n eager = false,\n) {\n return codegen.generateGlobImport(collection.patterns, {\n query: {\n collection: collection.name,\n workspace,\n },\n base: collection.dir,\n eager,\n });\n}\n\nfunction generateMetaCollectionGlob(\n { codegen, workspace }: FileGenContext,\n collection: MetaCollectionItem,\n eager = false,\n) {\n return codegen.generateGlobImport(collection.patterns, {\n query: {\n collection: collection.name,\n workspace,\n },\n import: 'default',\n base: collection.dir,\n eager,\n });\n}\n"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,61 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
import { TOCItemType } from 'fumadocs-core/toc';
|
|
5
|
-
import { FC } from 'react';
|
|
6
|
-
import { MDXProps } from 'mdx/types';
|
|
7
|
-
import '@standard-schema/spec';
|
|
8
|
-
import 'unified';
|
|
9
|
-
import 'fumadocs-core/source/schema';
|
|
10
|
-
import 'chokidar';
|
|
11
|
-
import 'vfile';
|
|
12
|
-
import 'fumadocs-core/source';
|
|
13
|
-
import './runtime/types.js';
|
|
14
|
-
import 'fumadocs-core/mdx-plugins/remark-structure';
|
|
15
|
-
import 'mdast';
|
|
16
|
-
|
|
17
|
-
type Processor = ReturnType<typeof createProcessor>;
|
|
18
|
-
interface CompilerOptions {
|
|
19
|
-
addDependency: (file: string) => void;
|
|
20
|
-
}
|
|
21
|
-
interface CompiledMDXProperties<Frontmatter = Record<string, unknown>> {
|
|
22
|
-
frontmatter: Frontmatter;
|
|
23
|
-
structuredData: StructuredData;
|
|
24
|
-
toc: TOCItemType[];
|
|
25
|
-
default: FC<MDXProps>;
|
|
26
|
-
/**
|
|
27
|
-
* Enable from `postprocess` option.
|
|
28
|
-
*/
|
|
29
|
-
_markdown?: string;
|
|
30
|
-
/**
|
|
31
|
-
* Enable from `postprocess` option.
|
|
32
|
-
*/
|
|
33
|
-
_mdast?: string;
|
|
34
|
-
}
|
|
35
|
-
interface FumadocsDataMap {
|
|
36
|
-
/**
|
|
37
|
-
* [Fumadocs MDX] raw frontmatter, you can modify it
|
|
38
|
-
*/
|
|
39
|
-
frontmatter?: Record<string, unknown>;
|
|
40
|
-
/**
|
|
41
|
-
* [Fumadocs MDX] additional ESM exports to write
|
|
42
|
-
*/
|
|
43
|
-
'mdx-export'?: {
|
|
44
|
-
name: string;
|
|
45
|
-
value: unknown;
|
|
46
|
-
}[];
|
|
47
|
-
/**
|
|
48
|
-
* [Fumadocs MDX] The compiler object from loader
|
|
49
|
-
*/
|
|
50
|
-
_compiler?: CompilerOptions;
|
|
51
|
-
/**
|
|
52
|
-
* [Fumadocs MDX] get internal processor, do not use this on user land.
|
|
53
|
-
*/
|
|
54
|
-
_getProcessor?: (format: 'md' | 'mdx') => Processor;
|
|
55
|
-
}
|
|
56
|
-
declare module 'vfile' {
|
|
57
|
-
interface DataMap extends FumadocsDataMap {
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
export type { CompiledMDXProperties };
|
|
1
|
+
import { a as EmitOptions, c as PluginContext, d as TransformOptions, f as _Defaults, i as EmitEntry, l as PluginOption, n as Core, o as EmitOutput, p as createCore, r as CoreOptions, s as Plugin, t as CompilationContext, u as ServerContext, z as ExtractedReference } from "./core-DG43f_AU.js";
|
|
2
|
+
import { t as CompiledMDXProperties } from "./build-mdx-10MrLupc.js";
|
|
3
|
+
export { CompilationContext, type CompiledMDXProperties, Core, CoreOptions, EmitEntry, EmitOptions, EmitOutput, type ExtractedReference, Plugin, PluginContext, PluginOption, ServerContext, TransformOptions, _Defaults, createCore };
|
package/dist/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { };
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { t as buildConfig } from "./build-BTTNEFmV.js";
|
|
2
|
+
import { pathToFileURL } from "node:url";
|
|
3
|
+
|
|
4
|
+
//#region src/config/load-from-file.ts
|
|
5
|
+
async function compileConfig(core) {
|
|
6
|
+
const { build } = await import("esbuild");
|
|
7
|
+
const { configPath, outDir } = core.getOptions();
|
|
8
|
+
if ((await build({
|
|
9
|
+
entryPoints: [{
|
|
10
|
+
in: configPath,
|
|
11
|
+
out: "source.config"
|
|
12
|
+
}],
|
|
13
|
+
bundle: true,
|
|
14
|
+
outdir: outDir,
|
|
15
|
+
target: "node20",
|
|
16
|
+
write: true,
|
|
17
|
+
platform: "node",
|
|
18
|
+
format: "esm",
|
|
19
|
+
packages: "external",
|
|
20
|
+
outExtension: { ".js": ".mjs" },
|
|
21
|
+
allowOverwrite: true
|
|
22
|
+
})).errors.length > 0) throw new Error("failed to compile configuration file");
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Load config
|
|
26
|
+
*
|
|
27
|
+
* @param build - By default, it assumes the config file has been compiled. Set this `true` to compile the config first.
|
|
28
|
+
*/
|
|
29
|
+
async function loadConfig(core, build = false) {
|
|
30
|
+
if (build) await compileConfig(core);
|
|
31
|
+
const url = pathToFileURL(core.getCompiledConfigPath());
|
|
32
|
+
url.searchParams.set("hash", Date.now().toString());
|
|
33
|
+
return await import(url.href).then((loaded) => buildConfig(loaded));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
//#endregion
|
|
37
|
+
export { loadConfig as t };
|
|
38
|
+
//# sourceMappingURL=load-from-file-Doc98oEB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-from-file-Doc98oEB.js","names":[],"sources":["../src/config/load-from-file.ts"],"sourcesContent":["import { pathToFileURL } from 'node:url';\nimport type { LoadedConfig } from '@/config/build';\nimport { buildConfig } from '@/config/build';\nimport type { Core } from '@/core';\n\nasync function compileConfig(core: Core) {\n const { build } = await import('esbuild');\n const { configPath, outDir } = core.getOptions();\n\n const transformed = await build({\n entryPoints: [{ in: configPath, out: 'source.config' }],\n bundle: true,\n outdir: outDir,\n target: 'node20',\n write: true,\n platform: 'node',\n format: 'esm',\n packages: 'external',\n outExtension: {\n '.js': '.mjs',\n },\n allowOverwrite: true,\n });\n\n if (transformed.errors.length > 0) {\n throw new Error('failed to compile configuration file');\n }\n}\n\n/**\n * Load config\n *\n * @param build - By default, it assumes the config file has been compiled. Set this `true` to compile the config first.\n */\nexport async function loadConfig(core: Core, build = false): Promise<LoadedConfig> {\n if (build) await compileConfig(core);\n\n const url = pathToFileURL(core.getCompiledConfigPath());\n // always return a new config\n url.searchParams.set('hash', Date.now().toString());\n\n const config = import(url.href).then((loaded) => buildConfig(loaded as Record<string, unknown>));\n\n return await config;\n}\n"],"mappings":";;;;AAKA,eAAe,cAAc,MAAY;CACvC,MAAM,EAAE,UAAU,MAAM,OAAO;CAC/B,MAAM,EAAE,YAAY,WAAW,KAAK,YAAY;AAiBhD,MAfoB,MAAM,MAAM;EAC9B,aAAa,CAAC;GAAE,IAAI;GAAY,KAAK;GAAiB,CAAC;EACvD,QAAQ;EACR,QAAQ;EACR,QAAQ;EACR,OAAO;EACP,UAAU;EACV,QAAQ;EACR,UAAU;EACV,cAAc,EACZ,OAAO,QACR;EACD,gBAAgB;EACjB,CAAC,EAEc,OAAO,SAAS,EAC9B,OAAM,IAAI,MAAM,uCAAuC;;;;;;;AAS3D,eAAsB,WAAW,MAAY,QAAQ,OAA8B;AACjF,KAAI,MAAO,OAAM,cAAc,KAAK;CAEpC,MAAM,MAAM,cAAc,KAAK,uBAAuB,CAAC;AAEvD,KAAI,aAAa,IAAI,QAAQ,KAAK,KAAK,CAAC,UAAU,CAAC;AAInD,QAAO,MAFQ,OAAO,IAAI,MAAM,MAAM,WAAW,YAAY,OAAkC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loaders-BVwYfelL.js","names":[],"sources":["../src/loaders/index.ts"],"sourcesContent":["export const metaLoaderGlob = /\\.(json|yaml)(\\?.+?)?$/;\nexport const mdxLoaderGlob = /\\.mdx?(\\?.+?)?$/;\n"],"mappings":";AAAA,MAAa,iBAAiB;AAC9B,MAAa,gBAAgB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { t as fumaMatter } from "./fuma-matter-CHgJa_-B.js";
|
|
2
|
+
import { t as mdxLoaderGlob } from "./loaders-BVwYfelL.js";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
import fs from "node:fs/promises";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { createHash } from "node:crypto";
|
|
7
|
+
|
|
8
|
+
//#region src/loaders/mdx/index.ts
|
|
9
|
+
const querySchema = z.object({
|
|
10
|
+
only: z.literal(["frontmatter", "all"]).default("all"),
|
|
11
|
+
collection: z.string().optional(),
|
|
12
|
+
workspace: z.string().optional()
|
|
13
|
+
}).loose();
|
|
14
|
+
const cacheEntry = z.object({
|
|
15
|
+
code: z.string(),
|
|
16
|
+
map: z.any().optional(),
|
|
17
|
+
hash: z.string().optional()
|
|
18
|
+
});
|
|
19
|
+
function createMdxLoader({ getCore }) {
|
|
20
|
+
return {
|
|
21
|
+
test: mdxLoaderGlob,
|
|
22
|
+
async load({ getSource, development: isDevelopment, query, compiler, filePath }) {
|
|
23
|
+
let core = await getCore();
|
|
24
|
+
const value = await getSource();
|
|
25
|
+
const matter = fumaMatter(value);
|
|
26
|
+
const { collection: collectionName, workspace, only } = querySchema.parse(query);
|
|
27
|
+
if (workspace) core = core.getWorkspaces().get(workspace) ?? core;
|
|
28
|
+
let after;
|
|
29
|
+
const { experimentalBuildCache = false } = core.getConfig().global;
|
|
30
|
+
if (!isDevelopment && experimentalBuildCache) {
|
|
31
|
+
const cacheDir = experimentalBuildCache;
|
|
32
|
+
const cacheKey = `${collectionName ?? "global"}_${generateCacheHash(filePath)}`;
|
|
33
|
+
const cached = await fs.readFile(path.join(cacheDir, cacheKey)).then((content) => cacheEntry.parse(JSON.parse(content.toString()))).catch(() => null);
|
|
34
|
+
if (cached && cached.hash === generateCacheHash(value)) return cached;
|
|
35
|
+
after = async () => {
|
|
36
|
+
await fs.mkdir(cacheDir, { recursive: true });
|
|
37
|
+
await fs.writeFile(path.join(cacheDir, cacheKey), JSON.stringify({
|
|
38
|
+
...out,
|
|
39
|
+
hash: generateCacheHash(value)
|
|
40
|
+
}));
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const collection = collectionName ? core.getCollection(collectionName) : void 0;
|
|
44
|
+
let docCollection;
|
|
45
|
+
switch (collection?.type) {
|
|
46
|
+
case "doc":
|
|
47
|
+
docCollection = collection;
|
|
48
|
+
break;
|
|
49
|
+
case "docs":
|
|
50
|
+
docCollection = collection.docs;
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
if (docCollection) matter.data = await core.transformFrontmatter({
|
|
54
|
+
collection: docCollection,
|
|
55
|
+
filePath,
|
|
56
|
+
source: value
|
|
57
|
+
}, matter.data);
|
|
58
|
+
if (only === "frontmatter") return {
|
|
59
|
+
code: `export const frontmatter = ${JSON.stringify(matter.data)}`,
|
|
60
|
+
map: null
|
|
61
|
+
};
|
|
62
|
+
const { buildMDX } = await import("./build-mdx-ChjP7zAn.js");
|
|
63
|
+
const compiled = await buildMDX(core, docCollection, {
|
|
64
|
+
isDevelopment,
|
|
65
|
+
source: "\n".repeat(countLines(matter.matter)) + matter.content,
|
|
66
|
+
filePath,
|
|
67
|
+
frontmatter: matter.data,
|
|
68
|
+
_compiler: compiler,
|
|
69
|
+
environment: "bundler"
|
|
70
|
+
});
|
|
71
|
+
const out = {
|
|
72
|
+
code: String(compiled.value),
|
|
73
|
+
map: compiled.map
|
|
74
|
+
};
|
|
75
|
+
await after?.();
|
|
76
|
+
return out;
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function generateCacheHash(input) {
|
|
81
|
+
return createHash("md5").update(input).digest("hex");
|
|
82
|
+
}
|
|
83
|
+
function countLines(s) {
|
|
84
|
+
let num = 0;
|
|
85
|
+
for (const c of s) if (c === "\n") num++;
|
|
86
|
+
return num;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
//#endregion
|
|
90
|
+
export { createMdxLoader as t };
|
|
91
|
+
//# sourceMappingURL=mdx-DMZ9tsAa.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mdx-DMZ9tsAa.js","names":["after: (() => Promise<void>) | undefined","docCollection: DocCollectionItem | undefined"],"sources":["../src/loaders/mdx/index.ts"],"sourcesContent":["import { fumaMatter } from '@/utils/fuma-matter';\nimport type { SourceMap } from 'rollup';\nimport type { Loader } from '@/loaders/adapter';\nimport { z } from 'zod';\nimport type { DocCollectionItem } from '@/config/build';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport { createHash } from 'node:crypto';\nimport type { ConfigLoader } from '@/loaders/config';\nimport { mdxLoaderGlob } from '..';\n\nconst querySchema = z\n .object({\n only: z.literal(['frontmatter', 'all']).default('all'),\n collection: z.string().optional(),\n workspace: z.string().optional(),\n })\n .loose();\n\nconst cacheEntry = z.object({\n code: z.string(),\n map: z.any().optional(),\n hash: z.string().optional(),\n});\n\ntype CacheEntry = z.infer<typeof cacheEntry>;\n\nexport function createMdxLoader({ getCore }: ConfigLoader): Loader {\n return {\n test: mdxLoaderGlob,\n async load({ getSource, development: isDevelopment, query, compiler, filePath }) {\n let core = await getCore();\n const value = await getSource();\n const matter = fumaMatter(value);\n const { collection: collectionName, workspace, only } = querySchema.parse(query);\n if (workspace) {\n core = core.getWorkspaces().get(workspace) ?? core;\n }\n\n let after: (() => Promise<void>) | undefined;\n\n const { experimentalBuildCache = false } = core.getConfig().global;\n if (!isDevelopment && experimentalBuildCache) {\n const cacheDir = experimentalBuildCache;\n const cacheKey = `${collectionName ?? 'global'}_${generateCacheHash(filePath)}`;\n\n const cached = await fs\n .readFile(path.join(cacheDir, cacheKey))\n .then((content) => cacheEntry.parse(JSON.parse(content.toString())))\n .catch(() => null);\n\n if (cached && cached.hash === generateCacheHash(value)) return cached;\n after = async () => {\n await fs.mkdir(cacheDir, { recursive: true });\n await fs.writeFile(\n path.join(cacheDir, cacheKey),\n JSON.stringify({\n ...out,\n hash: generateCacheHash(value),\n } satisfies CacheEntry),\n );\n };\n }\n\n const collection = collectionName ? core.getCollection(collectionName) : undefined;\n\n let docCollection: DocCollectionItem | undefined;\n switch (collection?.type) {\n case 'doc':\n docCollection = collection;\n break;\n case 'docs':\n docCollection = collection.docs;\n break;\n }\n\n if (docCollection) {\n matter.data = await core.transformFrontmatter(\n { collection: docCollection, filePath, source: value },\n matter.data as Record<string, unknown>,\n );\n }\n\n if (only === 'frontmatter') {\n return {\n code: `export const frontmatter = ${JSON.stringify(matter.data)}`,\n map: null,\n };\n }\n\n const { buildMDX } = await import('@/loaders/mdx/build-mdx');\n const compiled = await buildMDX(core, docCollection, {\n isDevelopment,\n // ensure the line number is correct in errors\n source: '\\n'.repeat(countLines(matter.matter)) + matter.content,\n filePath,\n frontmatter: matter.data as Record<string, unknown>,\n _compiler: compiler,\n environment: 'bundler',\n });\n\n const out = {\n code: String(compiled.value),\n map: compiled.map as SourceMap,\n };\n\n await after?.();\n return out;\n },\n };\n}\n\nfunction generateCacheHash(input: string): string {\n return createHash('md5').update(input).digest('hex');\n}\n\nfunction countLines(s: string) {\n let num = 0;\n\n for (const c of s) {\n if (c === '\\n') num++;\n }\n\n return num;\n}\n"],"mappings":";;;;;;;;AAWA,MAAM,cAAc,EACjB,OAAO;CACN,MAAM,EAAE,QAAQ,CAAC,eAAe,MAAM,CAAC,CAAC,QAAQ,MAAM;CACtD,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,WAAW,EAAE,QAAQ,CAAC,UAAU;CACjC,CAAC,CACD,OAAO;AAEV,MAAM,aAAa,EAAE,OAAO;CAC1B,MAAM,EAAE,QAAQ;CAChB,KAAK,EAAE,KAAK,CAAC,UAAU;CACvB,MAAM,EAAE,QAAQ,CAAC,UAAU;CAC5B,CAAC;AAIF,SAAgB,gBAAgB,EAAE,WAAiC;AACjE,QAAO;EACL,MAAM;EACN,MAAM,KAAK,EAAE,WAAW,aAAa,eAAe,OAAO,UAAU,YAAY;GAC/E,IAAI,OAAO,MAAM,SAAS;GAC1B,MAAM,QAAQ,MAAM,WAAW;GAC/B,MAAM,SAAS,WAAW,MAAM;GAChC,MAAM,EAAE,YAAY,gBAAgB,WAAW,SAAS,YAAY,MAAM,MAAM;AAChF,OAAI,UACF,QAAO,KAAK,eAAe,CAAC,IAAI,UAAU,IAAI;GAGhD,IAAIA;GAEJ,MAAM,EAAE,yBAAyB,UAAU,KAAK,WAAW,CAAC;AAC5D,OAAI,CAAC,iBAAiB,wBAAwB;IAC5C,MAAM,WAAW;IACjB,MAAM,WAAW,GAAG,kBAAkB,SAAS,GAAG,kBAAkB,SAAS;IAE7E,MAAM,SAAS,MAAM,GAClB,SAAS,KAAK,KAAK,UAAU,SAAS,CAAC,CACvC,MAAM,YAAY,WAAW,MAAM,KAAK,MAAM,QAAQ,UAAU,CAAC,CAAC,CAAC,CACnE,YAAY,KAAK;AAEpB,QAAI,UAAU,OAAO,SAAS,kBAAkB,MAAM,CAAE,QAAO;AAC/D,YAAQ,YAAY;AAClB,WAAM,GAAG,MAAM,UAAU,EAAE,WAAW,MAAM,CAAC;AAC7C,WAAM,GAAG,UACP,KAAK,KAAK,UAAU,SAAS,EAC7B,KAAK,UAAU;MACb,GAAG;MACH,MAAM,kBAAkB,MAAM;MAC/B,CAAsB,CACxB;;;GAIL,MAAM,aAAa,iBAAiB,KAAK,cAAc,eAAe,GAAG;GAEzE,IAAIC;AACJ,WAAQ,YAAY,MAApB;IACE,KAAK;AACH,qBAAgB;AAChB;IACF,KAAK;AACH,qBAAgB,WAAW;AAC3B;;AAGJ,OAAI,cACF,QAAO,OAAO,MAAM,KAAK,qBACvB;IAAE,YAAY;IAAe;IAAU,QAAQ;IAAO,EACtD,OAAO,KACR;AAGH,OAAI,SAAS,cACX,QAAO;IACL,MAAM,8BAA8B,KAAK,UAAU,OAAO,KAAK;IAC/D,KAAK;IACN;GAGH,MAAM,EAAE,aAAa,MAAM,OAAO;GAClC,MAAM,WAAW,MAAM,SAAS,MAAM,eAAe;IACnD;IAEA,QAAQ,KAAK,OAAO,WAAW,OAAO,OAAO,CAAC,GAAG,OAAO;IACxD;IACA,aAAa,OAAO;IACpB,WAAW;IACX,aAAa;IACd,CAAC;GAEF,MAAM,MAAM;IACV,MAAM,OAAO,SAAS,MAAM;IAC5B,KAAK,SAAS;IACf;AAED,SAAM,SAAS;AACf,UAAO;;EAEV;;AAGH,SAAS,kBAAkB,OAAuB;AAChD,QAAO,WAAW,MAAM,CAAC,OAAO,MAAM,CAAC,OAAO,MAAM;;AAGtD,SAAS,WAAW,GAAW;CAC7B,IAAI,MAAM;AAEV,MAAK,MAAM,KAAK,EACd,KAAI,MAAM,KAAM;AAGlB,QAAO"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { n as metaLoaderGlob } from "./loaders-BVwYfelL.js";
|
|
2
|
+
import { load } from "js-yaml";
|
|
3
|
+
import { z } from "zod";
|
|
4
|
+
|
|
5
|
+
//#region src/loaders/meta.ts
|
|
6
|
+
const querySchema = z.object({
|
|
7
|
+
collection: z.string().optional(),
|
|
8
|
+
workspace: z.string().optional()
|
|
9
|
+
}).loose();
|
|
10
|
+
/**
|
|
11
|
+
* load meta files, fallback to bundler's built-in plugins when ?collection is unspecified.
|
|
12
|
+
*/
|
|
13
|
+
function createMetaLoader({ getCore }, resolve = {}) {
|
|
14
|
+
const { json: resolveJson = "js" } = resolve;
|
|
15
|
+
function parse(filePath, source) {
|
|
16
|
+
try {
|
|
17
|
+
if (filePath.endsWith(".json")) return JSON.parse(source);
|
|
18
|
+
if (filePath.endsWith(".yaml")) return load(source);
|
|
19
|
+
} catch (e) {
|
|
20
|
+
throw new Error(`invalid data in ${filePath}`, { cause: e });
|
|
21
|
+
}
|
|
22
|
+
throw new Error("Unknown file type " + filePath);
|
|
23
|
+
}
|
|
24
|
+
function onMeta(source, { filePath, query }) {
|
|
25
|
+
const parsed = querySchema.safeParse(query);
|
|
26
|
+
if (!parsed.success || !parsed.data.collection) return null;
|
|
27
|
+
const { collection: collectionName, workspace } = parsed.data;
|
|
28
|
+
return async () => {
|
|
29
|
+
let core = await getCore();
|
|
30
|
+
if (workspace) core = core.getWorkspaces().get(workspace) ?? core;
|
|
31
|
+
const collection = core.getCollection(collectionName);
|
|
32
|
+
let metaCollection;
|
|
33
|
+
switch (collection?.type) {
|
|
34
|
+
case "meta":
|
|
35
|
+
metaCollection = collection;
|
|
36
|
+
break;
|
|
37
|
+
case "docs":
|
|
38
|
+
metaCollection = collection.meta;
|
|
39
|
+
break;
|
|
40
|
+
}
|
|
41
|
+
const data = parse(filePath, source);
|
|
42
|
+
if (!metaCollection) return data;
|
|
43
|
+
return core.transformMeta({
|
|
44
|
+
collection: metaCollection,
|
|
45
|
+
filePath,
|
|
46
|
+
source
|
|
47
|
+
}, data);
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
return {
|
|
51
|
+
test: metaLoaderGlob,
|
|
52
|
+
async load(input) {
|
|
53
|
+
const result = onMeta(await input.getSource(), input);
|
|
54
|
+
if (result === null) return null;
|
|
55
|
+
const data = await result();
|
|
56
|
+
if (input.filePath.endsWith(".json")) return {
|
|
57
|
+
moduleType: resolveJson,
|
|
58
|
+
code: resolveJson === "json" ? JSON.stringify(data) : `export default ${JSON.stringify(data)}`
|
|
59
|
+
};
|
|
60
|
+
else return {
|
|
61
|
+
moduleType: "js",
|
|
62
|
+
code: `export default ${JSON.stringify(data)}`
|
|
63
|
+
};
|
|
64
|
+
},
|
|
65
|
+
bun: { load(source, input) {
|
|
66
|
+
const result = onMeta(source, input);
|
|
67
|
+
if (result === null) return {
|
|
68
|
+
loader: "object",
|
|
69
|
+
exports: parse(input.filePath, source)
|
|
70
|
+
};
|
|
71
|
+
return result().then((data) => ({
|
|
72
|
+
loader: "object",
|
|
73
|
+
exports: { default: data }
|
|
74
|
+
}));
|
|
75
|
+
} }
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
//#endregion
|
|
80
|
+
export { createMetaLoader as t };
|
|
81
|
+
//# sourceMappingURL=meta-DyieTM4Z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta-DyieTM4Z.js","names":["metaCollection: MetaCollectionItem | undefined"],"sources":["../src/loaders/meta.ts"],"sourcesContent":["import type { Loader, LoaderInput } from '@/loaders/adapter';\nimport type { ConfigLoader } from '@/loaders/config';\nimport { load } from 'js-yaml';\nimport { z } from 'zod';\nimport { metaLoaderGlob } from '.';\nimport type { MetaCollectionItem } from '@/config/build';\n\nconst querySchema = z\n .object({\n collection: z.string().optional(),\n workspace: z.string().optional(),\n })\n .loose();\n\n/**\n * load meta files, fallback to bundler's built-in plugins when ?collection is unspecified.\n */\nexport function createMetaLoader(\n { getCore }: ConfigLoader,\n resolve: {\n json?: 'json' | 'js';\n yaml?: 'js';\n } = {},\n): Loader {\n const { json: resolveJson = 'js' } = resolve;\n\n function parse(filePath: string, source: string) {\n try {\n if (filePath.endsWith('.json')) return JSON.parse(source);\n if (filePath.endsWith('.yaml')) return load(source);\n } catch (e) {\n throw new Error(`invalid data in ${filePath}`, { cause: e });\n }\n\n throw new Error('Unknown file type ' + filePath);\n }\n\n function onMeta(source: string, { filePath, query }: LoaderInput) {\n const parsed = querySchema.safeParse(query);\n if (!parsed.success || !parsed.data.collection) return null;\n const { collection: collectionName, workspace } = parsed.data;\n\n return async (): Promise<unknown> => {\n let core = await getCore();\n if (workspace) {\n core = core.getWorkspaces().get(workspace) ?? core;\n }\n\n const collection = core.getCollection(collectionName);\n let metaCollection: MetaCollectionItem | undefined;\n\n switch (collection?.type) {\n case 'meta':\n metaCollection = collection;\n break;\n case 'docs':\n metaCollection = collection.meta;\n break;\n }\n\n const data = parse(filePath, source);\n\n if (!metaCollection) return data;\n return core.transformMeta(\n {\n collection: metaCollection,\n filePath,\n source,\n },\n data,\n );\n };\n }\n\n return {\n test: metaLoaderGlob,\n async load(input) {\n const result = onMeta(await input.getSource(), input);\n if (result === null) return null;\n const data = await result();\n\n if (input.filePath.endsWith('.json')) {\n return {\n moduleType: resolveJson,\n code:\n resolveJson === 'json'\n ? JSON.stringify(data)\n : `export default ${JSON.stringify(data)}`,\n };\n } else {\n return {\n moduleType: 'js',\n code: `export default ${JSON.stringify(data)}`,\n };\n }\n },\n bun: {\n load(source, input) {\n const result = onMeta(source, input);\n if (result === null)\n return {\n loader: 'object',\n exports: parse(input.filePath, source),\n };\n\n return result().then((data) => ({\n loader: 'object',\n exports: { default: data },\n }));\n },\n },\n };\n}\n"],"mappings":";;;;;AAOA,MAAM,cAAc,EACjB,OAAO;CACN,YAAY,EAAE,QAAQ,CAAC,UAAU;CACjC,WAAW,EAAE,QAAQ,CAAC,UAAU;CACjC,CAAC,CACD,OAAO;;;;AAKV,SAAgB,iBACd,EAAE,WACF,UAGI,EAAE,EACE;CACR,MAAM,EAAE,MAAM,cAAc,SAAS;CAErC,SAAS,MAAM,UAAkB,QAAgB;AAC/C,MAAI;AACF,OAAI,SAAS,SAAS,QAAQ,CAAE,QAAO,KAAK,MAAM,OAAO;AACzD,OAAI,SAAS,SAAS,QAAQ,CAAE,QAAO,KAAK,OAAO;WAC5C,GAAG;AACV,SAAM,IAAI,MAAM,mBAAmB,YAAY,EAAE,OAAO,GAAG,CAAC;;AAG9D,QAAM,IAAI,MAAM,uBAAuB,SAAS;;CAGlD,SAAS,OAAO,QAAgB,EAAE,UAAU,SAAsB;EAChE,MAAM,SAAS,YAAY,UAAU,MAAM;AAC3C,MAAI,CAAC,OAAO,WAAW,CAAC,OAAO,KAAK,WAAY,QAAO;EACvD,MAAM,EAAE,YAAY,gBAAgB,cAAc,OAAO;AAEzD,SAAO,YAA8B;GACnC,IAAI,OAAO,MAAM,SAAS;AAC1B,OAAI,UACF,QAAO,KAAK,eAAe,CAAC,IAAI,UAAU,IAAI;GAGhD,MAAM,aAAa,KAAK,cAAc,eAAe;GACrD,IAAIA;AAEJ,WAAQ,YAAY,MAApB;IACE,KAAK;AACH,sBAAiB;AACjB;IACF,KAAK;AACH,sBAAiB,WAAW;AAC5B;;GAGJ,MAAM,OAAO,MAAM,UAAU,OAAO;AAEpC,OAAI,CAAC,eAAgB,QAAO;AAC5B,UAAO,KAAK,cACV;IACE,YAAY;IACZ;IACA;IACD,EACD,KACD;;;AAIL,QAAO;EACL,MAAM;EACN,MAAM,KAAK,OAAO;GAChB,MAAM,SAAS,OAAO,MAAM,MAAM,WAAW,EAAE,MAAM;AACrD,OAAI,WAAW,KAAM,QAAO;GAC5B,MAAM,OAAO,MAAM,QAAQ;AAE3B,OAAI,MAAM,SAAS,SAAS,QAAQ,CAClC,QAAO;IACL,YAAY;IACZ,MACE,gBAAgB,SACZ,KAAK,UAAU,KAAK,GACpB,kBAAkB,KAAK,UAAU,KAAK;IAC7C;OAED,QAAO;IACL,YAAY;IACZ,MAAM,kBAAkB,KAAK,UAAU,KAAK;IAC7C;;EAGL,KAAK,EACH,KAAK,QAAQ,OAAO;GAClB,MAAM,SAAS,OAAO,QAAQ,MAAM;AACpC,OAAI,WAAW,KACb,QAAO;IACL,QAAQ;IACR,SAAS,MAAM,MAAM,UAAU,OAAO;IACvC;AAEH,UAAO,QAAQ,CAAC,MAAM,UAAU;IAC9B,QAAQ;IACR,SAAS,EAAE,SAAS,MAAM;IAC3B,EAAE;KAEN;EACF"}
|