@dogsbay/format-mdx 0.2.0-beta.12 → 0.2.0-beta.121
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.d.ts +159 -0
- package/dist/adapter.d.ts.map +1 -0
- package/dist/adapter.js +95 -0
- package/dist/adapter.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +269 -19
- package/dist/cli.js.map +1 -1
- package/dist/extract.d.ts +32 -0
- package/dist/extract.d.ts.map +1 -0
- package/dist/extract.js +152 -0
- package/dist/extract.js.map +1 -0
- package/dist/fumadocs.d.ts +48 -0
- package/dist/fumadocs.d.ts.map +1 -0
- package/dist/fumadocs.js +472 -0
- package/dist/fumadocs.js.map +1 -0
- package/dist/index.d.ts +11 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -1
- package/dist/index.js.map +1 -1
- package/dist/js-scan.d.ts +35 -0
- package/dist/js-scan.d.ts.map +1 -0
- package/dist/js-scan.js +124 -0
- package/dist/js-scan.js.map +1 -0
- package/dist/meta-nav.d.ts +29 -0
- package/dist/meta-nav.d.ts.map +1 -0
- package/dist/meta-nav.js +194 -0
- package/dist/meta-nav.js.map +1 -0
- package/dist/mintlify-nav.d.ts +31 -0
- package/dist/mintlify-nav.d.ts.map +1 -0
- package/dist/mintlify-nav.js +418 -0
- package/dist/mintlify-nav.js.map +1 -0
- package/dist/mintlify-openapi.d.ts +109 -0
- package/dist/mintlify-openapi.d.ts.map +1 -0
- package/dist/mintlify-openapi.js +363 -0
- package/dist/mintlify-openapi.js.map +1 -0
- package/dist/mintlify.d.ts +3 -0
- package/dist/mintlify.d.ts.map +1 -0
- package/dist/mintlify.js +196 -0
- package/dist/mintlify.js.map +1 -0
- package/dist/nav-extract.d.ts +43 -0
- package/dist/nav-extract.d.ts.map +1 -0
- package/dist/nav-extract.js +135 -0
- package/dist/nav-extract.js.map +1 -0
- package/dist/parse.d.ts +100 -4
- package/dist/parse.d.ts.map +1 -1
- package/dist/parse.js +1231 -150
- package/dist/parse.js.map +1 -1
- package/dist/ts-type-block.d.ts +43 -0
- package/dist/ts-type-block.d.ts.map +1 -0
- package/dist/ts-type-block.js +164 -0
- package/dist/ts-type-block.js.map +1 -0
- package/package.json +10 -8
package/dist/js-scan.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared quote/bracket-aware scanning helpers for statically reading JS/TSX
|
|
3
|
+
* data literals — no execution, ever.
|
|
4
|
+
*
|
|
5
|
+
* The one subtlety: apostrophes and quotes inside JSX TEXT content are not
|
|
6
|
+
* string delimiters (`<p>';--</p>` — better-auth's actual SQL-joke icon —
|
|
7
|
+
* breaks a naive tracker). A quote only OPENS a string in a value position:
|
|
8
|
+
* when the previous non-whitespace character is one that can precede a JS
|
|
9
|
+
* expression (`= ( [ { , : ? & | ! ;` or a `=>` arrow) or at the start of
|
|
10
|
+
* the scanned span. A bare `>` (JSX tag close) is NOT a value position —
|
|
11
|
+
* that is exactly where JSX text apostrophes live.
|
|
12
|
+
*/
|
|
13
|
+
const VALUE_POSITION_CHARS = new Set([
|
|
14
|
+
"=", "(", "[", "{", ",", ":", "?", "&", "|", "!", ";", "+", "-", "*", "%",
|
|
15
|
+
]);
|
|
16
|
+
/** Is src[i] a quote that starts a string (value position)? */
|
|
17
|
+
export function isQuoteStart(src, i, spanStart) {
|
|
18
|
+
const ch = src[i];
|
|
19
|
+
if (ch !== '"' && ch !== "'" && ch !== "`")
|
|
20
|
+
return false;
|
|
21
|
+
for (let k = i - 1; k >= spanStart; k--) {
|
|
22
|
+
const prev = src[k];
|
|
23
|
+
if (prev === " " || prev === "\t" || prev === "\n" || prev === "\r")
|
|
24
|
+
continue;
|
|
25
|
+
if (prev === ">")
|
|
26
|
+
return src[k - 1] === "="; // `=>` arrow body, not JSX close
|
|
27
|
+
return VALUE_POSITION_CHARS.has(prev);
|
|
28
|
+
}
|
|
29
|
+
return true; // start of span
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Scan a balanced literal starting at src[start] (which must be at or
|
|
33
|
+
* before the opening `{`/`[`/`(`). Returns the end index (exclusive, past
|
|
34
|
+
* the closing bracket) or -1 when the span never balances.
|
|
35
|
+
*/
|
|
36
|
+
export function scanBalancedLiteral(src, start) {
|
|
37
|
+
let depth = 0;
|
|
38
|
+
let started = false;
|
|
39
|
+
let quote = null;
|
|
40
|
+
for (let i = start; i < src.length; i++) {
|
|
41
|
+
const ch = src[i];
|
|
42
|
+
if (quote) {
|
|
43
|
+
if (ch === quote && src[i - 1] !== "\\")
|
|
44
|
+
quote = null;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
if (isQuoteStart(src, i, start)) {
|
|
48
|
+
quote = ch;
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (ch === "{" || ch === "[" || ch === "(") {
|
|
52
|
+
depth++;
|
|
53
|
+
started = true;
|
|
54
|
+
}
|
|
55
|
+
else if (ch === "}" || ch === "]" || ch === ")") {
|
|
56
|
+
depth--;
|
|
57
|
+
if (started && depth === 0)
|
|
58
|
+
return i + 1;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return -1;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Capture the right-hand-side literal of a `const NAME = …` /
|
|
65
|
+
* `export const NAME = …` declaration (type annotations tolerated).
|
|
66
|
+
* Returns the raw literal text or null.
|
|
67
|
+
*/
|
|
68
|
+
export function captureConstLiteral(source, name) {
|
|
69
|
+
const re = new RegExp(`(?:^|\\n)\\s*(?:export\\s+)?const\\s+${name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")}\\s*(?::[^=]*?)?=\\s*`);
|
|
70
|
+
const m = re.exec(source);
|
|
71
|
+
if (!m)
|
|
72
|
+
return null;
|
|
73
|
+
const start = m.index + m[0].length;
|
|
74
|
+
const end = scanBalancedLiteral(source, start);
|
|
75
|
+
if (end === -1)
|
|
76
|
+
return null;
|
|
77
|
+
return source.slice(start, end).trim();
|
|
78
|
+
}
|
|
79
|
+
/** Unquote a raw JS value for display; non-literals pass through as source. */
|
|
80
|
+
export function displayJsValue(raw) {
|
|
81
|
+
const t = raw.trim();
|
|
82
|
+
const m = t.match(/^(["'`])([\s\S]*)\1$/);
|
|
83
|
+
return m ? m[2] : t;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Split the top level of a balanced span into comma-separated pieces.
|
|
87
|
+
* `src` must already be the INNER text (without the outer brackets).
|
|
88
|
+
* Returns null when the span doesn't scan.
|
|
89
|
+
*/
|
|
90
|
+
export function splitTopLevel(src) {
|
|
91
|
+
const pieces = [];
|
|
92
|
+
let depth = 0;
|
|
93
|
+
let quote = null;
|
|
94
|
+
let start = 0;
|
|
95
|
+
for (let i = 0; i < src.length; i++) {
|
|
96
|
+
const ch = src[i];
|
|
97
|
+
if (quote) {
|
|
98
|
+
if (ch === quote && src[i - 1] !== "\\")
|
|
99
|
+
quote = null;
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (isQuoteStart(src, i, start)) {
|
|
103
|
+
quote = ch;
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
if (ch === "{" || ch === "[" || ch === "(")
|
|
107
|
+
depth++;
|
|
108
|
+
else if (ch === "}" || ch === "]" || ch === ")")
|
|
109
|
+
depth--;
|
|
110
|
+
else if (ch === "," && depth === 0) {
|
|
111
|
+
const piece = src.slice(start, i).trim();
|
|
112
|
+
if (piece)
|
|
113
|
+
pieces.push(piece);
|
|
114
|
+
start = i + 1;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (quote || depth !== 0)
|
|
118
|
+
return null;
|
|
119
|
+
const last = src.slice(start).trim();
|
|
120
|
+
if (last)
|
|
121
|
+
pieces.push(last);
|
|
122
|
+
return pieces;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=js-scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"js-scan.js","sourceRoot":"","sources":["../src/js-scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fumadocs `meta.json` → NavItem[] builder.
|
|
3
|
+
*
|
|
4
|
+
* Fumadocs organizes navigation with per-folder `meta.json` files:
|
|
5
|
+
*
|
|
6
|
+
* { "title": "Guide", "root": true, "pages": ["introduction", "...",
|
|
7
|
+
* "email-password/sign-in-and-sign-up", "[GitHub](https://…)"] }
|
|
8
|
+
*
|
|
9
|
+
* Supported `pages` entry forms:
|
|
10
|
+
* - "name" — file (name.mdx / name.md) or folder
|
|
11
|
+
* - "nested/path" — page inside a subfolder
|
|
12
|
+
* - "..." — rest expansion (unlisted items, alphabetical)
|
|
13
|
+
* - "z...a" — rest expansion, reverse alphabetical
|
|
14
|
+
* - "!name" — exclude from rest expansion
|
|
15
|
+
* - "[Label](https://…)" — external link
|
|
16
|
+
* - "---Label---" — separator (skipped: NavItem has no separator)
|
|
17
|
+
*
|
|
18
|
+
* Folders with `root: true` are Fumadocs "root folders" (tab-like separate
|
|
19
|
+
* trees); they are rendered as ordinary top-level groups here.
|
|
20
|
+
*/
|
|
21
|
+
import type { NavItem } from "@dogsbay/types";
|
|
22
|
+
export interface FumadocsNavOptions {
|
|
23
|
+
/** Prefix for hrefs (e.g. "/docs"). */
|
|
24
|
+
hrefPrefix?: string;
|
|
25
|
+
}
|
|
26
|
+
/** Detect a Fumadocs content directory: meta.json + .md/.mdx pages. */
|
|
27
|
+
export declare function detectFumadocsDir(path: string): boolean;
|
|
28
|
+
export declare function buildFumadocsNav(rootDir: string, opts?: FumadocsNavOptions): NavItem[];
|
|
29
|
+
//# sourceMappingURL=meta-nav.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta-nav.d.ts","sourceRoot":"","sources":["../src/meta-nav.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAS9C,MAAM,WAAW,kBAAkB;IACjC,uCAAuC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,uEAAuE;AACvE,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOvD;AAED,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,kBAAuB,GAC5B,OAAO,EAAE,CAGX"}
|
package/dist/meta-nav.js
ADDED
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fumadocs `meta.json` → NavItem[] builder.
|
|
3
|
+
*
|
|
4
|
+
* Fumadocs organizes navigation with per-folder `meta.json` files:
|
|
5
|
+
*
|
|
6
|
+
* { "title": "Guide", "root": true, "pages": ["introduction", "...",
|
|
7
|
+
* "email-password/sign-in-and-sign-up", "[GitHub](https://…)"] }
|
|
8
|
+
*
|
|
9
|
+
* Supported `pages` entry forms:
|
|
10
|
+
* - "name" — file (name.mdx / name.md) or folder
|
|
11
|
+
* - "nested/path" — page inside a subfolder
|
|
12
|
+
* - "..." — rest expansion (unlisted items, alphabetical)
|
|
13
|
+
* - "z...a" — rest expansion, reverse alphabetical
|
|
14
|
+
* - "!name" — exclude from rest expansion
|
|
15
|
+
* - "[Label](https://…)" — external link
|
|
16
|
+
* - "---Label---" — separator (skipped: NavItem has no separator)
|
|
17
|
+
*
|
|
18
|
+
* Folders with `root: true` are Fumadocs "root folders" (tab-like separate
|
|
19
|
+
* trees); they are rendered as ordinary top-level groups here.
|
|
20
|
+
*/
|
|
21
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
22
|
+
import { join } from "node:path";
|
|
23
|
+
import YAML from "yaml";
|
|
24
|
+
/** Detect a Fumadocs content directory: meta.json + .md/.mdx pages. */
|
|
25
|
+
export function detectFumadocsDir(path) {
|
|
26
|
+
try {
|
|
27
|
+
if (!existsSync(join(path, "meta.json")))
|
|
28
|
+
return false;
|
|
29
|
+
return readdirSync(path).some((e) => e.endsWith(".mdx") || e.endsWith(".md"));
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
export function buildFumadocsNav(rootDir, opts = {}) {
|
|
36
|
+
const prefix = (opts.hrefPrefix ?? "").replace(/\/$/, "");
|
|
37
|
+
return walkDir(rootDir, rootDir, prefix);
|
|
38
|
+
}
|
|
39
|
+
function readMeta(dir) {
|
|
40
|
+
const metaPath = join(dir, "meta.json");
|
|
41
|
+
if (!existsSync(metaPath))
|
|
42
|
+
return undefined;
|
|
43
|
+
try {
|
|
44
|
+
const parsed = JSON.parse(readFileSync(metaPath, "utf-8"));
|
|
45
|
+
return parsed && typeof parsed === "object" ? parsed : undefined;
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
function pageTitle(filePath, fallback) {
|
|
52
|
+
try {
|
|
53
|
+
const source = readFileSync(filePath, "utf-8");
|
|
54
|
+
const match = /^---\n([\s\S]*?)\n---/.exec(source);
|
|
55
|
+
if (match) {
|
|
56
|
+
const fm = YAML.parse(match[1]);
|
|
57
|
+
if (fm && typeof fm.title === "string")
|
|
58
|
+
return fm.title;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
// fall through to the filename
|
|
63
|
+
}
|
|
64
|
+
return fallback;
|
|
65
|
+
}
|
|
66
|
+
function humanize(name) {
|
|
67
|
+
return name
|
|
68
|
+
.replace(/[-_]/g, " ")
|
|
69
|
+
.replace(/\b\w/g, (c) => c.toUpperCase());
|
|
70
|
+
}
|
|
71
|
+
function resolvePageFile(dir, name) {
|
|
72
|
+
for (const ext of [".mdx", ".md"]) {
|
|
73
|
+
const p = join(dir, name + ext);
|
|
74
|
+
if (existsSync(p))
|
|
75
|
+
return p;
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
function slugFor(root, dir, name) {
|
|
80
|
+
const rel = join(dir, name).slice(root.length).replace(/\\/g, "/").replace(/^\//, "");
|
|
81
|
+
return rel;
|
|
82
|
+
}
|
|
83
|
+
/** One nav item for a file entry, or null when the file doesn't exist. */
|
|
84
|
+
function fileItem(root, dir, name, prefix) {
|
|
85
|
+
const filePath = resolvePageFile(dir, name);
|
|
86
|
+
if (!filePath)
|
|
87
|
+
return null;
|
|
88
|
+
const slug = slugFor(root, dir, name);
|
|
89
|
+
// Root index → "/"; a subfolder's index → the folder path itself.
|
|
90
|
+
const href = slug === "index" ? `${prefix}/` : `${prefix}/${slug.replace(/\/index$/, "")}`;
|
|
91
|
+
return { label: pageTitle(filePath, humanize(name)), href };
|
|
92
|
+
}
|
|
93
|
+
const EXTERNAL_LINK_RE = /^\[(.*)\]\((.*)\)$/;
|
|
94
|
+
const SEPARATOR_RE = /^---.*---$/;
|
|
95
|
+
function walkDir(root, dir, prefix) {
|
|
96
|
+
const meta = readMeta(dir);
|
|
97
|
+
// Inventory of this folder's files and subfolders.
|
|
98
|
+
const files = new Set();
|
|
99
|
+
const folders = new Set();
|
|
100
|
+
for (const entry of readdirSync(dir)) {
|
|
101
|
+
const full = join(dir, entry);
|
|
102
|
+
if (statSync(full).isDirectory()) {
|
|
103
|
+
folders.add(entry);
|
|
104
|
+
}
|
|
105
|
+
else if ((entry.endsWith(".mdx") || entry.endsWith(".md")) &&
|
|
106
|
+
entry !== "llms.txt") {
|
|
107
|
+
files.add(entry.replace(/\.(mdx|md)$/, ""));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const restItems = (excluded, reverse) => {
|
|
111
|
+
const names = [...new Set([...files, ...folders])]
|
|
112
|
+
.filter((n) => !excluded.has(n))
|
|
113
|
+
.sort();
|
|
114
|
+
if (reverse)
|
|
115
|
+
names.reverse();
|
|
116
|
+
return names.flatMap((n) => itemFor(n));
|
|
117
|
+
};
|
|
118
|
+
const itemFor = (name) => {
|
|
119
|
+
if (folders.has(name)) {
|
|
120
|
+
const childDir = join(dir, name);
|
|
121
|
+
const childMeta = readMeta(childDir);
|
|
122
|
+
const children = walkDir(root, childDir, prefix);
|
|
123
|
+
if (children.length === 0)
|
|
124
|
+
return [];
|
|
125
|
+
return [{ label: childMeta?.title ?? humanize(name), children }];
|
|
126
|
+
}
|
|
127
|
+
const item = fileItem(root, dir, name, prefix);
|
|
128
|
+
return item ? [item] : [];
|
|
129
|
+
};
|
|
130
|
+
if (!meta?.pages) {
|
|
131
|
+
// No meta.json ordering — alphabetical, index first.
|
|
132
|
+
const excluded = new Set();
|
|
133
|
+
const items = [];
|
|
134
|
+
if (files.has("index")) {
|
|
135
|
+
const idx = fileItem(root, dir, "index", prefix);
|
|
136
|
+
if (idx)
|
|
137
|
+
items.push(idx);
|
|
138
|
+
excluded.add("index");
|
|
139
|
+
}
|
|
140
|
+
items.push(...restItems(excluded, false));
|
|
141
|
+
return items;
|
|
142
|
+
}
|
|
143
|
+
const consumed = new Set();
|
|
144
|
+
const excluded = new Set();
|
|
145
|
+
// Pre-scan exclusions so "..." earlier in the list still honors them.
|
|
146
|
+
for (const entry of meta.pages) {
|
|
147
|
+
if (entry.startsWith("!"))
|
|
148
|
+
excluded.add(entry.slice(1));
|
|
149
|
+
}
|
|
150
|
+
const hasRest = meta.pages.some((e) => e === "..." || e === "z...a");
|
|
151
|
+
const items = [];
|
|
152
|
+
for (const entry of meta.pages) {
|
|
153
|
+
if (entry.startsWith("!"))
|
|
154
|
+
continue;
|
|
155
|
+
if (SEPARATOR_RE.test(entry))
|
|
156
|
+
continue;
|
|
157
|
+
const linkMatch = EXTERNAL_LINK_RE.exec(entry);
|
|
158
|
+
if (linkMatch) {
|
|
159
|
+
items.push({ label: linkMatch[1], href: linkMatch[2] });
|
|
160
|
+
continue;
|
|
161
|
+
}
|
|
162
|
+
if (entry === "..." || entry === "z...a") {
|
|
163
|
+
items.push(...restItems(new Set([...consumed, ...excluded]), entry === "z...a"));
|
|
164
|
+
// Everything is consumed after a rest expansion.
|
|
165
|
+
for (const n of [...files, ...folders])
|
|
166
|
+
consumed.add(n);
|
|
167
|
+
continue;
|
|
168
|
+
}
|
|
169
|
+
if (entry.includes("/")) {
|
|
170
|
+
// Page inside a subfolder (e.g. "email-password/sign-in-and-sign-up")
|
|
171
|
+
const parts = entry.split("/");
|
|
172
|
+
const name = parts.pop();
|
|
173
|
+
const subDir = join(dir, ...parts);
|
|
174
|
+
const item = fileItem(root, subDir, name, prefix);
|
|
175
|
+
if (item)
|
|
176
|
+
items.push(item);
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
consumed.add(entry);
|
|
180
|
+
items.push(...itemFor(entry));
|
|
181
|
+
}
|
|
182
|
+
// Implicit rest expansion: when the meta has no explicit "...",
|
|
183
|
+
// unlisted files and folders are appended alphabetically instead of
|
|
184
|
+
// being hidden. Strict Fumadocs hides them — but sites with heavily
|
|
185
|
+
// customized sidebars (a hand-written page tree overriding meta.json)
|
|
186
|
+
// often leave meta.json stale, and an IMPORT that silently drops most
|
|
187
|
+
// pages from the nav loses real structure. Never-drop applies to
|
|
188
|
+
// navigation too; `!name` exclusions are still honored.
|
|
189
|
+
if (!hasRest) {
|
|
190
|
+
items.push(...restItems(new Set([...consumed, ...excluded]), false));
|
|
191
|
+
}
|
|
192
|
+
return items;
|
|
193
|
+
}
|
|
194
|
+
//# sourceMappingURL=meta-nav.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"meta-nav.js","sourceRoot":"","sources":["../src/meta-nav.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { NavItem } from "@dogsbay/types";
|
|
2
|
+
export interface MintlifyNavOptions {
|
|
3
|
+
/** Prefixed onto every internal href (e.g. a base path). */
|
|
4
|
+
hrefPrefix?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* True when `dir` looks like a Mintlify docs source: a `docs.json`/`mint.json`
|
|
8
|
+
* that actually reads as a Mintlify config, plus md/mdx pages. The config sniff
|
|
9
|
+
* (a `navigation` key or a `mintlify` `$schema`) keeps an unrelated `docs.json`
|
|
10
|
+
* — e.g. TypeDoc's output — from being claimed by the mdx importer.
|
|
11
|
+
*/
|
|
12
|
+
export declare function detectMintlifyDir(dir: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Build NavItem[] from a Mintlify config, or null when no config is present or
|
|
15
|
+
* it declares no navigation.
|
|
16
|
+
*/
|
|
17
|
+
export declare function buildMintlifyNav(source: string, opts?: MintlifyNavOptions): NavItem[] | null;
|
|
18
|
+
/**
|
|
19
|
+
* Mintlify `redirects` as a source → destination map, `$ref` resolved.
|
|
20
|
+
*
|
|
21
|
+
* A docs site accumulates these as pages move, and its OWN pages then link to
|
|
22
|
+
* the old paths — Mintlify serves the redirect, so the link works and nobody
|
|
23
|
+
* notices it is stale. On import the redirect does not exist, so those links
|
|
24
|
+
* 404: measured on Mintlify's own docs, 16 internal links point at a redirect
|
|
25
|
+
* source, including `/installation` on the front page (→ `/cli/install`).
|
|
26
|
+
*
|
|
27
|
+
* `redirects` is itself commonly a `$ref` to a sibling file (121 entries in
|
|
28
|
+
* `redirects.json` here), so it is resolved the same way as navigation.
|
|
29
|
+
*/
|
|
30
|
+
export declare function mintlifyRedirects(source: string): Record<string, string>;
|
|
31
|
+
//# sourceMappingURL=mintlify-nav.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mintlify-nav.d.ts","sourceRoot":"","sources":["../src/mintlify-nav.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAG9C,MAAM,WAAW,kBAAkB;IACjC,4DAA4D;IAC5D,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAStD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,kBAAuB,GAC5B,OAAO,EAAE,GAAG,IAAI,CAelB;AAyPD;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAsBxE"}
|