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
|
@@ -1,80 +1,72 @@
|
|
|
1
|
-
// src/plugins/json-schema.ts
|
|
2
1
|
import { z } from "zod";
|
|
3
|
-
import fs from "fs/promises";
|
|
4
|
-
import path from "path";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
}
|
|
70
|
-
} else if (collection.schema instanceof z.ZodType) {
|
|
71
|
-
onSchema(collection.name, collection.schema);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
return files;
|
|
75
|
-
}
|
|
76
|
-
};
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import path from "node:path";
|
|
4
|
+
|
|
5
|
+
//#region src/plugins/json-schema.ts
|
|
6
|
+
/**
|
|
7
|
+
* Generate JSON schemas locally for collection schemas
|
|
8
|
+
*
|
|
9
|
+
* note: **it only works with Zod**
|
|
10
|
+
*/
|
|
11
|
+
function jsonSchema({ insert = false } = {}) {
|
|
12
|
+
function getSchemaPath(name) {
|
|
13
|
+
return `json-schema/${name}.json`;
|
|
14
|
+
}
|
|
15
|
+
return {
|
|
16
|
+
configureServer(server) {
|
|
17
|
+
const { outDir } = this.core.getOptions();
|
|
18
|
+
if (!server.watcher || !insert) return;
|
|
19
|
+
server.watcher.on("add", async (file) => {
|
|
20
|
+
let parent;
|
|
21
|
+
let match;
|
|
22
|
+
for (const collection of this.core.getCollections()) {
|
|
23
|
+
if (collection.type === "meta" && collection.hasFile(file)) {
|
|
24
|
+
match = collection;
|
|
25
|
+
break;
|
|
26
|
+
}
|
|
27
|
+
if (collection.type === "docs" && collection.meta.hasFile(file)) {
|
|
28
|
+
parent = collection;
|
|
29
|
+
match = collection.meta;
|
|
30
|
+
break;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (!match) return;
|
|
34
|
+
let obj;
|
|
35
|
+
try {
|
|
36
|
+
const content = (await fs.readFile(file)).toString();
|
|
37
|
+
obj = content.length > 0 ? JSON.parse(content) : {};
|
|
38
|
+
} catch {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
if ("$schema" in obj) return;
|
|
42
|
+
const schemaPath = path.join(outDir, getSchemaPath(parent ? `${parent.name}.meta` : match.name));
|
|
43
|
+
const updated = {
|
|
44
|
+
$schema: path.relative(path.dirname(file), schemaPath),
|
|
45
|
+
...obj
|
|
46
|
+
};
|
|
47
|
+
await fs.writeFile(file, JSON.stringify(updated, null, 2));
|
|
48
|
+
});
|
|
49
|
+
},
|
|
50
|
+
emit() {
|
|
51
|
+
const files = [];
|
|
52
|
+
function onSchema(name, schema) {
|
|
53
|
+
files.push({
|
|
54
|
+
path: getSchemaPath(name),
|
|
55
|
+
content: JSON.stringify(z.toJSONSchema(schema, {
|
|
56
|
+
io: "input",
|
|
57
|
+
unrepresentable: "any"
|
|
58
|
+
}))
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
for (const collection of this.core.getCollections()) if (collection.type === "docs") {
|
|
62
|
+
if (collection.meta.schema instanceof z.ZodType) onSchema(`${collection.name}.meta`, collection.meta.schema);
|
|
63
|
+
if (collection.docs.schema instanceof z.ZodType) onSchema(`${collection.name}.docs`, collection.docs.schema);
|
|
64
|
+
} else if (collection.schema instanceof z.ZodType) onSchema(collection.name, collection.schema);
|
|
65
|
+
return files;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
77
68
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
};
|
|
69
|
+
|
|
70
|
+
//#endregion
|
|
71
|
+
export { jsonSchema as default };
|
|
72
|
+
//# sourceMappingURL=json-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-schema.js","names":["parent: DocsCollectionItem | undefined","match: MetaCollectionItem | undefined","obj: object","files: EmitEntry[]"],"sources":["../../src/plugins/json-schema.ts"],"sourcesContent":["import type { EmitEntry, Plugin } from '@/core';\nimport type { DocsCollectionItem, MetaCollectionItem } from '@/config/build';\nimport { z } from 'zod';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\n\nexport interface JSONSchemaOptions {\n /**\n * insert `$schema` field to JSON files on creation.\n *\n * @defaultValue false\n */\n insert?: boolean;\n}\n\n/**\n * Generate JSON schemas locally for collection schemas\n *\n * note: **it only works with Zod**\n */\nexport default function jsonSchema({ insert = false }: JSONSchemaOptions = {}): Plugin {\n function getSchemaPath(name: string) {\n return `json-schema/${name}.json`;\n }\n\n return {\n configureServer(server) {\n const { outDir } = this.core.getOptions();\n if (!server.watcher || !insert) return;\n\n server.watcher.on('add', async (file) => {\n let parent: DocsCollectionItem | undefined;\n let match: MetaCollectionItem | undefined;\n for (const collection of this.core.getCollections()) {\n if (collection.type === 'meta' && collection.hasFile(file)) {\n match = collection;\n break;\n }\n if (collection.type === 'docs' && collection.meta.hasFile(file)) {\n parent = collection;\n match = collection.meta;\n break;\n }\n }\n\n if (!match) return;\n let obj: object;\n try {\n const content = (await fs.readFile(file)).toString();\n obj = content.length > 0 ? JSON.parse(content) : {};\n } catch {\n return;\n }\n\n if ('$schema' in obj) return;\n const schemaPath = path.join(\n outDir,\n getSchemaPath(parent ? `${parent.name}.meta` : match.name),\n );\n const updated = {\n $schema: path.relative(path.dirname(file), schemaPath),\n ...obj,\n };\n\n await fs.writeFile(file, JSON.stringify(updated, null, 2));\n });\n },\n emit() {\n const files: EmitEntry[] = [];\n\n function onSchema(name: string, schema: z.ZodSchema) {\n files.push({\n path: getSchemaPath(name),\n content: JSON.stringify(\n z.toJSONSchema(schema, {\n io: 'input',\n unrepresentable: 'any',\n }),\n ),\n });\n }\n\n for (const collection of this.core.getCollections()) {\n if (collection.type === 'docs') {\n if (collection.meta.schema instanceof z.ZodType) {\n onSchema(`${collection.name}.meta`, collection.meta.schema);\n }\n\n if (collection.docs.schema instanceof z.ZodType) {\n onSchema(`${collection.name}.docs`, collection.docs.schema);\n }\n } else if (collection.schema instanceof z.ZodType) {\n onSchema(collection.name, collection.schema);\n }\n }\n\n return files;\n },\n };\n}\n"],"mappings":";;;;;;;;;;AAoBA,SAAwB,WAAW,EAAE,SAAS,UAA6B,EAAE,EAAU;CACrF,SAAS,cAAc,MAAc;AACnC,SAAO,eAAe,KAAK;;AAG7B,QAAO;EACL,gBAAgB,QAAQ;GACtB,MAAM,EAAE,WAAW,KAAK,KAAK,YAAY;AACzC,OAAI,CAAC,OAAO,WAAW,CAAC,OAAQ;AAEhC,UAAO,QAAQ,GAAG,OAAO,OAAO,SAAS;IACvC,IAAIA;IACJ,IAAIC;AACJ,SAAK,MAAM,cAAc,KAAK,KAAK,gBAAgB,EAAE;AACnD,SAAI,WAAW,SAAS,UAAU,WAAW,QAAQ,KAAK,EAAE;AAC1D,cAAQ;AACR;;AAEF,SAAI,WAAW,SAAS,UAAU,WAAW,KAAK,QAAQ,KAAK,EAAE;AAC/D,eAAS;AACT,cAAQ,WAAW;AACnB;;;AAIJ,QAAI,CAAC,MAAO;IACZ,IAAIC;AACJ,QAAI;KACF,MAAM,WAAW,MAAM,GAAG,SAAS,KAAK,EAAE,UAAU;AACpD,WAAM,QAAQ,SAAS,IAAI,KAAK,MAAM,QAAQ,GAAG,EAAE;YAC7C;AACN;;AAGF,QAAI,aAAa,IAAK;IACtB,MAAM,aAAa,KAAK,KACtB,QACA,cAAc,SAAS,GAAG,OAAO,KAAK,SAAS,MAAM,KAAK,CAC3D;IACD,MAAM,UAAU;KACd,SAAS,KAAK,SAAS,KAAK,QAAQ,KAAK,EAAE,WAAW;KACtD,GAAG;KACJ;AAED,UAAM,GAAG,UAAU,MAAM,KAAK,UAAU,SAAS,MAAM,EAAE,CAAC;KAC1D;;EAEJ,OAAO;GACL,MAAMC,QAAqB,EAAE;GAE7B,SAAS,SAAS,MAAc,QAAqB;AACnD,UAAM,KAAK;KACT,MAAM,cAAc,KAAK;KACzB,SAAS,KAAK,UACZ,EAAE,aAAa,QAAQ;MACrB,IAAI;MACJ,iBAAiB;MAClB,CAAC,CACH;KACF,CAAC;;AAGJ,QAAK,MAAM,cAAc,KAAK,KAAK,gBAAgB,CACjD,KAAI,WAAW,SAAS,QAAQ;AAC9B,QAAI,WAAW,KAAK,kBAAkB,EAAE,QACtC,UAAS,GAAG,WAAW,KAAK,QAAQ,WAAW,KAAK,OAAO;AAG7D,QAAI,WAAW,KAAK,kBAAkB,EAAE,QACtC,UAAS,GAAG,WAAW,KAAK,QAAQ,WAAW,KAAK,OAAO;cAEpD,WAAW,kBAAkB,EAAE,QACxC,UAAS,WAAW,MAAM,WAAW,OAAO;AAIhD,UAAO;;EAEV"}
|
|
@@ -1,40 +1,29 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import '@mdx-js/mdx';
|
|
3
|
-
import '@standard-schema/spec';
|
|
4
|
-
import 'unified';
|
|
5
|
-
import 'fumadocs-core/mdx-plugins';
|
|
6
|
-
import 'fumadocs-core/source/schema';
|
|
7
|
-
import 'chokidar';
|
|
8
|
-
import 'vfile';
|
|
9
|
-
import 'fumadocs-core/source';
|
|
10
|
-
import '../runtime/types.js';
|
|
11
|
-
import 'fumadocs-core/mdx-plugins/remark-structure';
|
|
12
|
-
import 'fumadocs-core/toc';
|
|
13
|
-
import 'mdast';
|
|
14
|
-
import 'mdx/types';
|
|
1
|
+
import { s as Plugin } from "../core-DG43f_AU.js";
|
|
15
2
|
|
|
3
|
+
//#region src/plugins/last-modified.d.ts
|
|
16
4
|
type VersionControlFn = (filePath: string) => Promise<Date | null | undefined>;
|
|
17
5
|
interface LastModifiedPluginOptions {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Version control to obtain the last modified time.
|
|
8
|
+
*
|
|
9
|
+
* - `git`: Requires `git` to be installed.
|
|
10
|
+
*
|
|
11
|
+
* If you are using Vercel, please set `VERCEL_DEEP_CLONE` environment variable to `true`.
|
|
12
|
+
*
|
|
13
|
+
* - A function: return the last modified time for given file path.
|
|
14
|
+
*
|
|
15
|
+
* @defaultValue 'git'
|
|
16
|
+
*/
|
|
17
|
+
versionControl?: 'git' | VersionControlFn;
|
|
18
|
+
/**
|
|
19
|
+
* Filter the collections to include by names
|
|
20
|
+
*/
|
|
21
|
+
filter?: (collection: string) => boolean;
|
|
34
22
|
}
|
|
35
23
|
/**
|
|
36
24
|
* Injects `lastModified` property to page exports.
|
|
37
25
|
*/
|
|
38
26
|
declare function lastModified(options?: LastModifiedPluginOptions): Plugin;
|
|
39
|
-
|
|
40
|
-
export {
|
|
27
|
+
//#endregion
|
|
28
|
+
export { LastModifiedPluginOptions, lastModified as default };
|
|
29
|
+
//# sourceMappingURL=last-modified.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"last-modified.d.ts","names":[],"sources":["../../src/plugins/last-modified.ts"],"sourcesContent":[],"mappings":";;;KAMK,gBAAA,yBAAyC,QAAQ;UAErC,yBAAA;EAFZ;AAEL;AAkBC;;;;;;;;;2BAN0B;;;;;;;;;iBAmBH,YAAA,WAAsB,4BAAiC"}
|
|
@@ -1,89 +1,81 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
} from "../chunk-2PY3JUIC.js";
|
|
4
|
-
|
|
5
|
-
// src/plugins/last-modified.ts
|
|
6
|
-
import path from "path";
|
|
1
|
+
import { n as ident } from "../codegen-DleOVLNr.js";
|
|
2
|
+
import path from "node:path";
|
|
7
3
|
import { x } from "tinyexec";
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
|
|
5
|
+
//#region src/plugins/last-modified.ts
|
|
6
|
+
const cache = /* @__PURE__ */ new Map();
|
|
7
|
+
const ExtendTypes = `{
|
|
10
8
|
/**
|
|
11
9
|
* Last modified date of document file, obtained from version control.
|
|
12
10
|
*
|
|
13
11
|
*/
|
|
14
12
|
lastModified?: Date;
|
|
15
13
|
}`;
|
|
14
|
+
/**
|
|
15
|
+
* Injects `lastModified` property to page exports.
|
|
16
|
+
*/
|
|
16
17
|
function lastModified(options = {}) {
|
|
17
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
name: "lastModified",
|
|
60
|
-
value: timestamp
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
};
|
|
18
|
+
const { versionControl = "git", filter = () => true } = options;
|
|
19
|
+
let fn;
|
|
20
|
+
return {
|
|
21
|
+
name: "last-modified",
|
|
22
|
+
"index-file": {
|
|
23
|
+
generateTypeConfig() {
|
|
24
|
+
const lines = [];
|
|
25
|
+
lines.push("{");
|
|
26
|
+
lines.push(" DocData: {");
|
|
27
|
+
for (const collection of this.core.getCollections()) if (filter(collection.name)) lines.push(ident(`${collection.name}: ${ExtendTypes},`, 2));
|
|
28
|
+
lines.push(" }");
|
|
29
|
+
lines.push("}");
|
|
30
|
+
return lines.join("\n");
|
|
31
|
+
},
|
|
32
|
+
serverOptions(options$1) {
|
|
33
|
+
options$1.doc ??= {};
|
|
34
|
+
options$1.doc.passthroughs ??= [];
|
|
35
|
+
options$1.doc.passthroughs.push("lastModified");
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
config() {
|
|
39
|
+
const { workspace } = this.core.getOptions();
|
|
40
|
+
const cwd = workspace ? path.resolve(workspace.dir) : process.cwd();
|
|
41
|
+
switch (versionControl) {
|
|
42
|
+
case "git":
|
|
43
|
+
fn = (v) => getGitTimestamp(v, cwd);
|
|
44
|
+
break;
|
|
45
|
+
default: fn = versionControl;
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
doc: { async vfile(file) {
|
|
49
|
+
if (!filter(this.collection.name)) return;
|
|
50
|
+
const timestamp = await fn(this.filePath);
|
|
51
|
+
if (timestamp) {
|
|
52
|
+
file.data["mdx-export"] ??= [];
|
|
53
|
+
file.data["mdx-export"].push({
|
|
54
|
+
name: "lastModified",
|
|
55
|
+
value: timestamp
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
} }
|
|
59
|
+
};
|
|
66
60
|
}
|
|
67
61
|
async function getGitTimestamp(file, cwd) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
})();
|
|
84
|
-
cache.set(file, timePromise);
|
|
85
|
-
return timePromise;
|
|
62
|
+
const cached = cache.get(file);
|
|
63
|
+
if (cached) return cached;
|
|
64
|
+
const timePromise = (async () => {
|
|
65
|
+
const out = await x("git", [
|
|
66
|
+
"log",
|
|
67
|
+
"-1",
|
|
68
|
+
"--pretty=\"%ai\"",
|
|
69
|
+
path.relative(cwd, file)
|
|
70
|
+
], { nodeOptions: { cwd } });
|
|
71
|
+
if (out.exitCode !== 0) return null;
|
|
72
|
+
const date = new Date(out.stdout);
|
|
73
|
+
return isNaN(date.getTime()) ? null : date;
|
|
74
|
+
})();
|
|
75
|
+
cache.set(file, timePromise);
|
|
76
|
+
return timePromise;
|
|
86
77
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
};
|
|
78
|
+
|
|
79
|
+
//#endregion
|
|
80
|
+
export { lastModified as default };
|
|
81
|
+
//# sourceMappingURL=last-modified.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"last-modified.js","names":["fn: VersionControlFn","lines: string[]"],"sources":["../../src/plugins/last-modified.ts"],"sourcesContent":["import path from 'node:path';\nimport { x } from 'tinyexec';\nimport type { Plugin } from '@/core';\nimport { ident } from '@/utils/codegen';\n\nconst cache = new Map<string, Promise<Date | null>>();\ntype VersionControlFn = (filePath: string) => Promise<Date | null | undefined>;\n\nexport interface LastModifiedPluginOptions {\n /**\n * Version control to obtain the last modified time.\n *\n * - `git`: Requires `git` to be installed.\n *\n * If you are using Vercel, please set `VERCEL_DEEP_CLONE` environment variable to `true`.\n *\n * - A function: return the last modified time for given file path.\n *\n * @defaultValue 'git'\n */\n versionControl?: 'git' | VersionControlFn;\n\n /**\n * Filter the collections to include by names\n */\n filter?: (collection: string) => boolean;\n}\n\nconst ExtendTypes = `{\n /**\n * Last modified date of document file, obtained from version control.\n *\n */\n lastModified?: Date;\n}`;\n\n/**\n * Injects `lastModified` property to page exports.\n */\nexport default function lastModified(options: LastModifiedPluginOptions = {}): Plugin {\n const { versionControl = 'git', filter = () => true } = options;\n let fn: VersionControlFn;\n\n return {\n name: 'last-modified',\n 'index-file': {\n generateTypeConfig() {\n const lines: string[] = [];\n lines.push('{');\n lines.push(' DocData: {');\n for (const collection of this.core.getCollections()) {\n if (filter(collection.name)) {\n lines.push(ident(`${collection.name}: ${ExtendTypes},`, 2));\n }\n }\n lines.push(' }');\n lines.push('}');\n return lines.join('\\n');\n },\n serverOptions(options) {\n options.doc ??= {};\n options.doc.passthroughs ??= [];\n options.doc.passthroughs.push('lastModified');\n },\n },\n config() {\n const { workspace } = this.core.getOptions();\n const cwd = workspace ? path.resolve(workspace.dir) : process.cwd();\n\n switch (versionControl) {\n case 'git':\n fn = (v) => getGitTimestamp(v, cwd);\n break;\n default:\n fn = versionControl;\n }\n },\n doc: {\n async vfile(file) {\n if (!filter(this.collection.name)) return;\n\n const timestamp = await fn(this.filePath);\n if (timestamp) {\n file.data['mdx-export'] ??= [];\n file.data['mdx-export'].push({\n name: 'lastModified',\n value: timestamp,\n });\n }\n },\n },\n };\n}\n\nasync function getGitTimestamp(file: string, cwd: string): Promise<Date | null> {\n const cached = cache.get(file);\n if (cached) return cached;\n\n const timePromise = (async () => {\n const out = await x('git', ['log', '-1', '--pretty=\"%ai\"', path.relative(cwd, file)], {\n nodeOptions: {\n cwd,\n },\n });\n\n if (out.exitCode !== 0) return null;\n const date = new Date(out.stdout);\n return isNaN(date.getTime()) ? null : date;\n })();\n\n cache.set(file, timePromise);\n return timePromise;\n}\n"],"mappings":";;;;;AAKA,MAAM,wBAAQ,IAAI,KAAmC;AAuBrD,MAAM,cAAc;;;;;;;;;;AAWpB,SAAwB,aAAa,UAAqC,EAAE,EAAU;CACpF,MAAM,EAAE,iBAAiB,OAAO,eAAe,SAAS;CACxD,IAAIA;AAEJ,QAAO;EACL,MAAM;EACN,cAAc;GACZ,qBAAqB;IACnB,MAAMC,QAAkB,EAAE;AAC1B,UAAM,KAAK,IAAI;AACf,UAAM,KAAK,eAAe;AAC1B,SAAK,MAAM,cAAc,KAAK,KAAK,gBAAgB,CACjD,KAAI,OAAO,WAAW,KAAK,CACzB,OAAM,KAAK,MAAM,GAAG,WAAW,KAAK,IAAI,YAAY,IAAI,EAAE,CAAC;AAG/D,UAAM,KAAK,MAAM;AACjB,UAAM,KAAK,IAAI;AACf,WAAO,MAAM,KAAK,KAAK;;GAEzB,cAAc,WAAS;AACrB,cAAQ,QAAQ,EAAE;AAClB,cAAQ,IAAI,iBAAiB,EAAE;AAC/B,cAAQ,IAAI,aAAa,KAAK,eAAe;;GAEhD;EACD,SAAS;GACP,MAAM,EAAE,cAAc,KAAK,KAAK,YAAY;GAC5C,MAAM,MAAM,YAAY,KAAK,QAAQ,UAAU,IAAI,GAAG,QAAQ,KAAK;AAEnE,WAAQ,gBAAR;IACE,KAAK;AACH,WAAM,MAAM,gBAAgB,GAAG,IAAI;AACnC;IACF,QACE,MAAK;;;EAGX,KAAK,EACH,MAAM,MAAM,MAAM;AAChB,OAAI,CAAC,OAAO,KAAK,WAAW,KAAK,CAAE;GAEnC,MAAM,YAAY,MAAM,GAAG,KAAK,SAAS;AACzC,OAAI,WAAW;AACb,SAAK,KAAK,kBAAkB,EAAE;AAC9B,SAAK,KAAK,cAAc,KAAK;KAC3B,MAAM;KACN,OAAO;KACR,CAAC;;KAGP;EACF;;AAGH,eAAe,gBAAgB,MAAc,KAAmC;CAC9E,MAAM,SAAS,MAAM,IAAI,KAAK;AAC9B,KAAI,OAAQ,QAAO;CAEnB,MAAM,eAAe,YAAY;EAC/B,MAAM,MAAM,MAAM,EAAE,OAAO;GAAC;GAAO;GAAM;GAAkB,KAAK,SAAS,KAAK,KAAK;GAAC,EAAE,EACpF,aAAa,EACX,KACD,EACF,CAAC;AAEF,MAAI,IAAI,aAAa,EAAG,QAAO;EAC/B,MAAM,OAAO,IAAI,KAAK,IAAI,OAAO;AACjC,SAAO,MAAM,KAAK,SAAS,CAAC,GAAG,OAAO;KACpC;AAEJ,OAAM,IAAI,MAAM,YAAY;AAC5B,QAAO"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
//#region src/config/preset.ts
|
|
2
|
+
function pluginOption(def, options = []) {
|
|
3
|
+
const list = def(Array.isArray(options) ? options : []).filter(Boolean);
|
|
4
|
+
if (typeof options === "function") return options(list);
|
|
5
|
+
return list;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* apply MDX processor presets
|
|
9
|
+
*/
|
|
10
|
+
function applyMdxPreset(options = {}) {
|
|
11
|
+
return async (environment = "bundler") => {
|
|
12
|
+
if (options.preset === "minimal") return options;
|
|
13
|
+
const plugins = await import("fumadocs-core/mdx-plugins");
|
|
14
|
+
const { valueToExport = [], rehypeCodeOptions, remarkImageOptions, remarkHeadingOptions, remarkStructureOptions, remarkCodeTabOptions, remarkNpmOptions, ...mdxOptions } = options;
|
|
15
|
+
const remarkPlugins = pluginOption((v) => [
|
|
16
|
+
plugins.remarkGfm,
|
|
17
|
+
[plugins.remarkHeading, {
|
|
18
|
+
generateToc: false,
|
|
19
|
+
...remarkHeadingOptions
|
|
20
|
+
}],
|
|
21
|
+
remarkImageOptions !== false && [plugins.remarkImage, {
|
|
22
|
+
...remarkImageOptions,
|
|
23
|
+
useImport: remarkImageOptions?.useImport ?? environment === "bundler"
|
|
24
|
+
}],
|
|
25
|
+
"remarkCodeTab" in plugins && remarkCodeTabOptions !== false && [plugins.remarkCodeTab, remarkCodeTabOptions],
|
|
26
|
+
"remarkNpm" in plugins && remarkNpmOptions !== false && [plugins.remarkNpm, remarkNpmOptions],
|
|
27
|
+
...v,
|
|
28
|
+
remarkStructureOptions !== false && [plugins.remarkStructure, {
|
|
29
|
+
exportAs: "structuredData",
|
|
30
|
+
...remarkStructureOptions
|
|
31
|
+
}],
|
|
32
|
+
valueToExport.length > 0 && (() => {
|
|
33
|
+
return (_, file) => {
|
|
34
|
+
file.data["mdx-export"] ??= [];
|
|
35
|
+
for (const name of valueToExport) {
|
|
36
|
+
if (!(name in file.data)) continue;
|
|
37
|
+
file.data["mdx-export"].push({
|
|
38
|
+
name,
|
|
39
|
+
value: file.data[name]
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
})
|
|
44
|
+
], mdxOptions.remarkPlugins);
|
|
45
|
+
const rehypePlugins = pluginOption((v) => [
|
|
46
|
+
rehypeCodeOptions !== false && [plugins.rehypeCode, rehypeCodeOptions],
|
|
47
|
+
...v,
|
|
48
|
+
plugins.rehypeToc
|
|
49
|
+
], mdxOptions.rehypePlugins);
|
|
50
|
+
return {
|
|
51
|
+
...mdxOptions,
|
|
52
|
+
outputFormat: environment === "runtime" ? "function-body" : mdxOptions.outputFormat,
|
|
53
|
+
remarkPlugins,
|
|
54
|
+
rehypePlugins
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
//#endregion
|
|
60
|
+
export { applyMdxPreset as t };
|
|
61
|
+
//# sourceMappingURL=preset-gmDZnBcg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"preset-gmDZnBcg.js","names":[],"sources":["../src/config/preset.ts"],"sourcesContent":["import type { ProcessorOptions } from '@mdx-js/mdx';\nimport type { Pluggable } from 'unified';\nimport type * as Plugins from 'fumadocs-core/mdx-plugins';\nimport type { BuildEnvironment } from './build';\n\ntype ResolvePlugins = Pluggable[] | ((v: Pluggable[]) => Pluggable[]);\n\nexport type DefaultMDXOptions = Omit<\n NonNullable<ProcessorOptions>,\n 'rehypePlugins' | 'remarkPlugins' | '_ctx'\n> & {\n rehypePlugins?: ResolvePlugins;\n remarkPlugins?: ResolvePlugins;\n\n /**\n * Properties to export from `vfile.data`\n */\n valueToExport?: string[];\n\n remarkStructureOptions?: Plugins.StructureOptions | false;\n remarkHeadingOptions?: Plugins.RemarkHeadingOptions;\n remarkImageOptions?: Plugins.RemarkImageOptions | false;\n remarkCodeTabOptions?: Plugins.RemarkCodeTabOptions | false;\n remarkNpmOptions?: Plugins.RemarkNpmOptions | false;\n rehypeCodeOptions?: Plugins.RehypeCodeOptions | false;\n};\n\nfunction pluginOption(\n def: (v: Pluggable[]) => (Pluggable | false)[],\n options: ResolvePlugins = [],\n): Pluggable[] {\n const list = def(Array.isArray(options) ? options : []).filter(Boolean) as Pluggable[];\n\n if (typeof options === 'function') {\n return options(list);\n }\n\n return list;\n}\n\nexport type MDXPresetOptions =\n | ({ preset?: 'fumadocs' } & DefaultMDXOptions)\n | ({\n preset: 'minimal';\n } & ProcessorOptions);\n\n/**\n * apply MDX processor presets\n */\nexport function applyMdxPreset(\n options: MDXPresetOptions = {},\n): (environment: BuildEnvironment) => Promise<ProcessorOptions> {\n return async (environment = 'bundler') => {\n if (options.preset === 'minimal') return options;\n\n const plugins = await import('fumadocs-core/mdx-plugins');\n const {\n valueToExport = [],\n rehypeCodeOptions,\n remarkImageOptions,\n remarkHeadingOptions,\n remarkStructureOptions,\n remarkCodeTabOptions,\n remarkNpmOptions,\n ...mdxOptions\n } = options;\n\n const remarkPlugins = pluginOption(\n (v) => [\n plugins.remarkGfm,\n [\n plugins.remarkHeading,\n {\n generateToc: false,\n ...remarkHeadingOptions,\n },\n ],\n remarkImageOptions !== false && [\n plugins.remarkImage,\n {\n ...remarkImageOptions,\n useImport: remarkImageOptions?.useImport ?? environment === 'bundler',\n },\n ],\n 'remarkCodeTab' in plugins &&\n remarkCodeTabOptions !== false && [plugins.remarkCodeTab, remarkCodeTabOptions],\n 'remarkNpm' in plugins &&\n remarkNpmOptions !== false && [plugins.remarkNpm, remarkNpmOptions],\n ...v,\n remarkStructureOptions !== false && [\n plugins.remarkStructure,\n {\n exportAs: 'structuredData',\n ...remarkStructureOptions,\n } satisfies Plugins.StructureOptions,\n ],\n valueToExport.length > 0 &&\n (() => {\n return (_, file) => {\n file.data['mdx-export'] ??= [];\n\n for (const name of valueToExport) {\n if (!(name in file.data)) continue;\n\n file.data['mdx-export'].push({\n name,\n value: file.data[name],\n });\n }\n };\n }),\n ],\n mdxOptions.remarkPlugins,\n );\n\n const rehypePlugins = pluginOption(\n (v) => [\n rehypeCodeOptions !== false && [plugins.rehypeCode, rehypeCodeOptions],\n ...v,\n plugins.rehypeToc,\n ],\n mdxOptions.rehypePlugins,\n );\n\n return {\n ...mdxOptions,\n outputFormat: environment === 'runtime' ? 'function-body' : mdxOptions.outputFormat,\n remarkPlugins,\n rehypePlugins,\n };\n };\n}\n"],"mappings":";AA2BA,SAAS,aACP,KACA,UAA0B,EAAE,EACf;CACb,MAAM,OAAO,IAAI,MAAM,QAAQ,QAAQ,GAAG,UAAU,EAAE,CAAC,CAAC,OAAO,QAAQ;AAEvE,KAAI,OAAO,YAAY,WACrB,QAAO,QAAQ,KAAK;AAGtB,QAAO;;;;;AAYT,SAAgB,eACd,UAA4B,EAAE,EACgC;AAC9D,QAAO,OAAO,cAAc,cAAc;AACxC,MAAI,QAAQ,WAAW,UAAW,QAAO;EAEzC,MAAM,UAAU,MAAM,OAAO;EAC7B,MAAM,EACJ,gBAAgB,EAAE,EAClB,mBACA,oBACA,sBACA,wBACA,sBACA,kBACA,GAAG,eACD;EAEJ,MAAM,gBAAgB,cACnB,MAAM;GACL,QAAQ;GACR,CACE,QAAQ,eACR;IACE,aAAa;IACb,GAAG;IACJ,CACF;GACD,uBAAuB,SAAS,CAC9B,QAAQ,aACR;IACE,GAAG;IACH,WAAW,oBAAoB,aAAa,gBAAgB;IAC7D,CACF;GACD,mBAAmB,WACjB,yBAAyB,SAAS,CAAC,QAAQ,eAAe,qBAAqB;GACjF,eAAe,WACb,qBAAqB,SAAS,CAAC,QAAQ,WAAW,iBAAiB;GACrE,GAAG;GACH,2BAA2B,SAAS,CAClC,QAAQ,iBACR;IACE,UAAU;IACV,GAAG;IACJ,CACF;GACD,cAAc,SAAS,YACd;AACL,YAAQ,GAAG,SAAS;AAClB,UAAK,KAAK,kBAAkB,EAAE;AAE9B,UAAK,MAAM,QAAQ,eAAe;AAChC,UAAI,EAAE,QAAQ,KAAK,MAAO;AAE1B,WAAK,KAAK,cAAc,KAAK;OAC3B;OACA,OAAO,KAAK,KAAK;OAClB,CAAC;;;;GAIX,EACD,WAAW,cACZ;EAED,MAAM,gBAAgB,cACnB,MAAM;GACL,sBAAsB,SAAS,CAAC,QAAQ,YAAY,kBAAkB;GACtE,GAAG;GACH,QAAQ;GACT,EACD,WAAW,cACZ;AAED,SAAO;GACL,GAAG;GACH,cAAc,gBAAgB,YAAY,kBAAkB,WAAW;GACvE;GACA;GACD"}
|