fumadocs-mdx 14.2.3 → 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.
Files changed (116) hide show
  1. package/dist/adapter-DG-viEbG.js +144 -0
  2. package/dist/adapter-DG-viEbG.js.map +1 -0
  3. package/dist/bin.d.ts +1 -1
  4. package/dist/bin.js +21 -12
  5. package/dist/bin.js.map +1 -0
  6. package/dist/build-BTTNEFmV.js +100 -0
  7. package/dist/build-BTTNEFmV.js.map +1 -0
  8. package/dist/build-mdx-10MrLupc.d.ts +53 -0
  9. package/dist/build-mdx-10MrLupc.d.ts.map +1 -0
  10. package/dist/build-mdx-BVeBo4jT.js +153 -0
  11. package/dist/build-mdx-BVeBo4jT.js.map +1 -0
  12. package/dist/build-mdx-ChjP7zAn.js +5 -0
  13. package/dist/bun/index.d.ts +10 -21
  14. package/dist/bun/index.d.ts.map +1 -0
  15. package/dist/bun/index.js +30 -49
  16. package/dist/bun/index.js.map +1 -0
  17. package/dist/codegen-DleOVLNr.js +101 -0
  18. package/dist/codegen-DleOVLNr.js.map +1 -0
  19. package/dist/config/index.d.ts +2 -18
  20. package/dist/config/index.js +50 -53
  21. package/dist/config/index.js.map +1 -0
  22. package/dist/core-DG43f_AU.d.ts +364 -0
  23. package/dist/core-DG43f_AU.d.ts.map +1 -0
  24. package/dist/core-DjldE3H9.js +212 -0
  25. package/dist/core-DjldE3H9.js.map +1 -0
  26. package/dist/fuma-matter-CHgJa_-B.js +27 -0
  27. package/dist/fuma-matter-CHgJa_-B.js.map +1 -0
  28. package/dist/index-Bc_4I1HE.d.ts +12 -0
  29. package/dist/index-Bc_4I1HE.d.ts.map +1 -0
  30. package/dist/index-file-D9HsrWU_.js +264 -0
  31. package/dist/index-file-D9HsrWU_.js.map +1 -0
  32. package/dist/index.d.ts +3 -61
  33. package/dist/index.js +1 -0
  34. package/dist/load-from-file-B7Rswy9i.js +5 -0
  35. package/dist/load-from-file-Doc98oEB.js +38 -0
  36. package/dist/load-from-file-Doc98oEB.js.map +1 -0
  37. package/dist/loaders-BVwYfelL.js +7 -0
  38. package/dist/loaders-BVwYfelL.js.map +1 -0
  39. package/dist/mdx-DMZ9tsAa.js +91 -0
  40. package/dist/mdx-DMZ9tsAa.js.map +1 -0
  41. package/dist/meta-DyieTM4Z.js +81 -0
  42. package/dist/meta-DyieTM4Z.js.map +1 -0
  43. package/dist/next/index.cjs +863 -1076
  44. package/dist/next/index.d.ts +17 -28
  45. package/dist/next/index.d.ts.map +1 -0
  46. package/dist/next/index.js +141 -170
  47. package/dist/next/index.js.map +1 -0
  48. package/dist/node/loader.d.ts +4 -2
  49. package/dist/node/loader.d.ts.map +1 -0
  50. package/dist/node/loader.js +26 -38
  51. package/dist/node/loader.js.map +1 -0
  52. package/dist/plugins/index-file.d.ts +2 -14
  53. package/dist/plugins/index-file.js +5 -8
  54. package/dist/plugins/json-schema.d.ts +14 -23
  55. package/dist/plugins/json-schema.d.ts.map +1 -0
  56. package/dist/plugins/json-schema.js +70 -78
  57. package/dist/plugins/json-schema.js.map +1 -0
  58. package/dist/plugins/last-modified.d.ts +21 -32
  59. package/dist/plugins/last-modified.d.ts.map +1 -0
  60. package/dist/plugins/last-modified.js +70 -78
  61. package/dist/plugins/last-modified.js.map +1 -0
  62. package/dist/preset-gmDZnBcg.js +61 -0
  63. package/dist/preset-gmDZnBcg.js.map +1 -0
  64. package/dist/remark-include-D3G3mAnv.js +247 -0
  65. package/dist/remark-include-D3G3mAnv.js.map +1 -0
  66. package/dist/runtime/browser.d.ts +32 -41
  67. package/dist/runtime/browser.d.ts.map +1 -0
  68. package/dist/runtime/browser.js +56 -63
  69. package/dist/runtime/browser.js.map +1 -0
  70. package/dist/runtime/dynamic.d.ts +13 -21
  71. package/dist/runtime/dynamic.d.ts.map +1 -0
  72. package/dist/runtime/dynamic.js +64 -76
  73. package/dist/runtime/dynamic.js.map +1 -0
  74. package/dist/runtime/server.d.ts +2 -14
  75. package/dist/runtime/server.js +111 -8
  76. package/dist/runtime/server.js.map +1 -0
  77. package/dist/runtime/types.d.ts +2 -61
  78. package/dist/runtime/types.js +1 -0
  79. package/dist/types-B6myALSk.d.ts +63 -0
  80. package/dist/types-B6myALSk.d.ts.map +1 -0
  81. package/dist/vite/index.d.ts +28 -39
  82. package/dist/vite/index.d.ts.map +1 -0
  83. package/dist/vite/index.js +79 -122
  84. package/dist/vite/index.js.map +1 -0
  85. package/dist/webpack/mdx.d.ts +6 -3
  86. package/dist/webpack/mdx.d.ts.map +1 -0
  87. package/dist/webpack/mdx.js +21 -34
  88. package/dist/webpack/mdx.js.map +1 -0
  89. package/dist/webpack/meta.d.ts +6 -3
  90. package/dist/webpack/meta.d.ts.map +1 -0
  91. package/dist/webpack/meta.js +23 -37
  92. package/dist/webpack/meta.js.map +1 -0
  93. package/dist/webpack--VSEE6Zp.js +15 -0
  94. package/dist/webpack--VSEE6Zp.js.map +1 -0
  95. package/loader-mdx.cjs +1 -3
  96. package/loader-meta.cjs +1 -3
  97. package/package.json +35 -35
  98. package/dist/build-mdx-5XLFMP5P.js +0 -8
  99. package/dist/chunk-257RZJEQ.js +0 -17
  100. package/dist/chunk-2PY3JUIC.js +0 -126
  101. package/dist/chunk-4EUH5CD2.js +0 -173
  102. package/dist/chunk-4JSFLXXT.js +0 -8
  103. package/dist/chunk-5OBUOALK.js +0 -141
  104. package/dist/chunk-DTFUANSF.js +0 -40
  105. package/dist/chunk-KWSETXYC.js +0 -274
  106. package/dist/chunk-OLD35ARB.js +0 -116
  107. package/dist/chunk-RSASAHLX.js +0 -91
  108. package/dist/chunk-S7KOJHHO.js +0 -89
  109. package/dist/chunk-STLEUNK7.js +0 -335
  110. package/dist/chunk-USQZ5OLE.js +0 -116
  111. package/dist/chunk-VWJKRQZR.js +0 -19
  112. package/dist/chunk-WFDF56IJ.js +0 -290
  113. package/dist/chunk-XYVVDDIF.js +0 -180
  114. package/dist/core-X5ggQtBM.d.ts +0 -350
  115. package/dist/index-BqkSNsGO.d.ts +0 -8
  116. 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
- function jsonSchema({
6
- insert = false
7
- } = {}) {
8
- function getSchemaPath(name) {
9
- return `json-schema/${name}.json`;
10
- }
11
- return {
12
- configureServer(server) {
13
- const { outDir } = this.core.getOptions();
14
- if (!server.watcher || !insert) return;
15
- server.watcher.on("add", async (file) => {
16
- let parent;
17
- let match;
18
- for (const collection of this.core.getCollections()) {
19
- if (collection.type === "meta" && collection.hasFile(file)) {
20
- match = collection;
21
- break;
22
- }
23
- if (collection.type === "docs" && collection.meta.hasFile(file)) {
24
- parent = collection;
25
- match = collection.meta;
26
- break;
27
- }
28
- }
29
- if (!match) return;
30
- let obj;
31
- try {
32
- const content = (await fs.readFile(file)).toString();
33
- obj = content.length > 0 ? JSON.parse(content) : {};
34
- } catch {
35
- return;
36
- }
37
- if ("$schema" in obj) return;
38
- const schemaPath = path.join(
39
- outDir,
40
- getSchemaPath(parent ? `${parent.name}.meta` : match.name)
41
- );
42
- const updated = {
43
- $schema: path.relative(path.dirname(file), schemaPath),
44
- ...obj
45
- };
46
- await fs.writeFile(file, JSON.stringify(updated, null, 2));
47
- });
48
- },
49
- emit() {
50
- const files = [];
51
- function onSchema(name, schema) {
52
- files.push({
53
- path: getSchemaPath(name),
54
- content: JSON.stringify(
55
- z.toJSONSchema(schema, {
56
- io: "input",
57
- unrepresentable: "any"
58
- })
59
- )
60
- });
61
- }
62
- for (const collection of this.core.getCollections()) {
63
- if (collection.type === "docs") {
64
- if (collection.meta.schema instanceof z.ZodType) {
65
- onSchema(`${collection.name}.meta`, collection.meta.schema);
66
- }
67
- if (collection.docs.schema instanceof z.ZodType) {
68
- onSchema(`${collection.name}.docs`, collection.docs.schema);
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
- export {
79
- jsonSchema as default
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 { i as Plugin } from '../core-X5ggQtBM.js';
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
- * Version control to obtain the last modified time.
20
- *
21
- * - `git`: Requires `git` to be installed.
22
- *
23
- * If you are using Vercel, please set `VERCEL_DEEP_CLONE` environment variable to `true`.
24
- *
25
- * - A function: return the last modified time for given file path.
26
- *
27
- * @defaultValue 'git'
28
- */
29
- versionControl?: 'git' | VersionControlFn;
30
- /**
31
- * Filter the collections to include by names
32
- */
33
- filter?: (collection: string) => boolean;
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 { type LastModifiedPluginOptions, lastModified as default };
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
- ident
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
- var cache = /* @__PURE__ */ new Map();
9
- var ExtendTypes = `{
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
- const { versionControl = "git", filter = () => true } = options;
18
- let fn;
19
- return {
20
- name: "last-modified",
21
- "index-file": {
22
- generateTypeConfig() {
23
- const lines = [];
24
- lines.push("{");
25
- lines.push(" DocData: {");
26
- for (const collection of this.core.getCollections()) {
27
- if (filter(collection.name)) {
28
- lines.push(ident(`${collection.name}: ${ExtendTypes},`, 2));
29
- }
30
- }
31
- lines.push(" }");
32
- lines.push("}");
33
- return lines.join("\n");
34
- },
35
- serverOptions(options2) {
36
- options2.doc ??= {};
37
- options2.doc.passthroughs ??= [];
38
- options2.doc.passthroughs.push("lastModified");
39
- }
40
- },
41
- config() {
42
- const { workspace } = this.core.getOptions();
43
- const cwd = workspace ? path.resolve(workspace.dir) : process.cwd();
44
- switch (versionControl) {
45
- case "git":
46
- fn = (v) => getGitTimestamp(v, cwd);
47
- break;
48
- default:
49
- fn = versionControl;
50
- }
51
- },
52
- doc: {
53
- async vfile(file) {
54
- if (!filter(this.collection.name)) return;
55
- const timestamp = await fn(this.filePath);
56
- if (timestamp) {
57
- file.data["mdx-export"] ??= [];
58
- file.data["mdx-export"].push({
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
- const cached = cache.get(file);
69
- if (cached) return cached;
70
- const timePromise = (async () => {
71
- const out = await x(
72
- "git",
73
- ["log", "-1", '--pretty="%ai"', path.relative(cwd, file)],
74
- {
75
- nodeOptions: {
76
- cwd
77
- }
78
- }
79
- );
80
- if (out.exitCode !== 0) return null;
81
- const date = new Date(out.stdout);
82
- return isNaN(date.getTime()) ? null : date;
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
- export {
88
- lastModified as default
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"}