@farming-labs/next 0.0.2-beta.8 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/config.mjs CHANGED
@@ -70,6 +70,16 @@ function readDocsEntry(root) {
70
70
  }
71
71
  return "docs";
72
72
  }
73
+ /** Read the OG endpoint from docs.config.ts[x] (returns undefined if not set). */
74
+ function readOgEndpoint(root) {
75
+ for (const ext of FILE_EXTS) {
76
+ const configPath = join(root, `docs.config.${ext}`);
77
+ if (existsSync(configPath)) try {
78
+ const match = readFileSync(configPath, "utf-8").match(/endpoint\s*:\s*["']([^"']+)["']/);
79
+ if (match && match[1]) return match[1];
80
+ } catch {}
81
+ }
82
+ }
73
83
  function withDocs(nextConfig = {}) {
74
84
  const root = process.cwd();
75
85
  if (!hasFile(root, "mdx-components")) writeFileSync(join(root, "mdx-components.tsx"), MDX_COMPONENTS_TEMPLATE);
@@ -84,15 +94,14 @@ function withDocs(nextConfig = {}) {
84
94
  mkdirSync(docsApiRouteDir, { recursive: true });
85
95
  writeFileSync(join(docsApiRouteDir, "route.ts"), DOCS_API_ROUTE_TEMPLATE);
86
96
  }
97
+ const ogEndpoint = readOgEndpoint(root);
98
+ const remarkPlugins = ["remark-gfm", "remark-frontmatter"];
99
+ if (ogEndpoint) remarkPlugins.push(["@farming-labs/next/mdx-plugins/remark-og", { endpoint: ogEndpoint }]);
100
+ remarkPlugins.push(["remark-mdx-frontmatter", { name: "metadata" }], "@farming-labs/next/mdx-plugins/remark-heading");
87
101
  const withMDX = createMDX({
88
102
  extension: /\.mdx?$/,
89
103
  options: {
90
- remarkPlugins: [
91
- "remark-gfm",
92
- "remark-frontmatter",
93
- ["remark-mdx-frontmatter", { name: "metadata" }],
94
- "@farming-labs/next/mdx-plugins/remark-heading"
95
- ],
104
+ remarkPlugins,
96
105
  rehypePlugins: ["@farming-labs/next/mdx-plugins/rehype-toc", ["@farming-labs/next/mdx-plugins/rehype-code", { themes: {
97
106
  dark: "github-dark",
98
107
  light: "github-light"
@@ -0,0 +1,19 @@
1
+ //#region src/mdx-plugins/remark-og.d.ts
2
+ /**
3
+ * Remark plugin that augments frontmatter with Open Graph metadata.
4
+ *
5
+ * Runs between remark-frontmatter and remark-mdx-frontmatter.
6
+ * Reads title/description from the YAML node and appends openGraph + twitter
7
+ * fields so that remark-mdx-frontmatter exports them as part of `metadata`.
8
+ */
9
+ interface RemarkOgOptions {
10
+ endpoint?: string;
11
+ }
12
+ declare function remarkOg(options?: RemarkOgOptions): (tree: {
13
+ children: Array<{
14
+ type: string;
15
+ value: string;
16
+ }>;
17
+ }) => void;
18
+ //#endregion
19
+ export { remarkOg as default };
@@ -0,0 +1,25 @@
1
+ //#region src/mdx-plugins/remark-og.ts
2
+ function extractField(yaml, key) {
3
+ const re = new RegExp(`^${key}:\\s*(?:"([^"]*?)"|'([^']*?)'|(.+?))\\s*$`, "m");
4
+ const m = yaml.match(re);
5
+ return m?.[1] ?? m?.[2] ?? m?.[3];
6
+ }
7
+ function remarkOg(options = {}) {
8
+ const { endpoint = "/api/og" } = options;
9
+ return (tree) => {
10
+ const yamlNode = tree.children.find((n) => n.type === "yaml");
11
+ if (!yamlNode) return;
12
+ const title = extractField(yamlNode.value, "title");
13
+ if (!title) return;
14
+ const description = extractField(yamlNode.value, "description");
15
+ const params = new URLSearchParams({ title });
16
+ if (description) params.set("description", description);
17
+ const ogUrl = `${endpoint}?${params.toString()}`;
18
+ yamlNode.value += `
19
+ openGraph:
20
+ images:\n - url: "${ogUrl}"\n width: 1200\n height: 630\ntwitter:\n card: "summary_large_image"\n images:\n - "${ogUrl}"`;
21
+ };
22
+ }
23
+
24
+ //#endregion
25
+ export { remarkOg as default };
package/package.json CHANGED
@@ -1,7 +1,18 @@
1
1
  {
2
2
  "name": "@farming-labs/next",
3
- "version": "0.0.2-beta.8",
3
+ "version": "0.0.2",
4
4
  "description": "Next.js adapter for @farming-labs/docs — MDX config wrapper",
5
+ "keywords": [
6
+ "docs",
7
+ "documentation",
8
+ "mdx",
9
+ "next"
10
+ ],
11
+ "license": "MIT",
12
+ "author": "Farming Labs",
13
+ "files": [
14
+ "dist"
15
+ ],
5
16
  "type": "module",
6
17
  "main": "./dist/index.mjs",
7
18
  "types": "./dist/index.d.mts",
@@ -30,19 +41,13 @@
30
41
  "types": "./dist/mdx-plugins/rehype-code.d.mts",
31
42
  "import": "./dist/mdx-plugins/rehype-code.mjs",
32
43
  "default": "./dist/mdx-plugins/rehype-code.mjs"
44
+ },
45
+ "./mdx-plugins/remark-og": {
46
+ "types": "./dist/mdx-plugins/remark-og.d.mts",
47
+ "import": "./dist/mdx-plugins/remark-og.mjs",
48
+ "default": "./dist/mdx-plugins/remark-og.mjs"
33
49
  }
34
50
  },
35
- "files": [
36
- "dist"
37
- ],
38
- "keywords": [
39
- "docs",
40
- "next",
41
- "mdx",
42
- "documentation"
43
- ],
44
- "author": "Farming Labs",
45
- "license": "MIT",
46
51
  "dependencies": {
47
52
  "@mdx-js/loader": "^3.1.0",
48
53
  "@mdx-js/react": "^3.1.0",