@dogsbay/format-mdx 0.2.0-beta.0
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/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +117 -0
- package/dist/cli.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/parse.d.ts +28 -0
- package/dist/parse.d.ts.map +1 -0
- package/dist/parse.js +660 -0
- package/dist/parse.js.map +1 -0
- package/package.json +48 -0
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAuB,MAAM,gBAAgB,CAAC;AAmIxE,eAAO,MAAM,MAAM,EAAE,YAQpB,CAAC"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
2
|
+
import { join, relative } from "node:path";
|
|
3
|
+
import YAML from "yaml";
|
|
4
|
+
import { parseMeta } from "@dogsbay/types";
|
|
5
|
+
import { mdxToTree, extractHeadings } from "./parse.js";
|
|
6
|
+
/**
|
|
7
|
+
* Detect a pulled MDX docs directory.
|
|
8
|
+
*
|
|
9
|
+
* Looks for nav.json (written by `dogsbay pull`) + at least one .md file.
|
|
10
|
+
*/
|
|
11
|
+
function detectMdxDir(path) {
|
|
12
|
+
return (existsSync(join(path, "nav.json")) &&
|
|
13
|
+
existsSync(path) &&
|
|
14
|
+
hasMdFiles(path));
|
|
15
|
+
}
|
|
16
|
+
function hasMdFiles(dir) {
|
|
17
|
+
try {
|
|
18
|
+
const entries = readdirSync(dir);
|
|
19
|
+
return entries.some((e) => e.endsWith(".md") && e !== "llms.txt");
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Import a directory of pulled MDX files into ExportPage[] + NavItem[].
|
|
27
|
+
*/
|
|
28
|
+
async function importMdxDir(source, opts) {
|
|
29
|
+
// Read nav.json
|
|
30
|
+
const navPath = join(source, "nav.json");
|
|
31
|
+
const nav = JSON.parse(readFileSync(navPath, "utf-8"));
|
|
32
|
+
// Walk all .md files
|
|
33
|
+
const mdFiles = walkMdFiles(source, source);
|
|
34
|
+
const pages = [];
|
|
35
|
+
// Custom taxonomy names from dogsbay.config.yml's `taxonomies:` block.
|
|
36
|
+
const taxonomyNames = Array.isArray(opts.taxonomyNames)
|
|
37
|
+
? opts.taxonomyNames
|
|
38
|
+
: undefined;
|
|
39
|
+
for (const { filePath, slug } of mdFiles) {
|
|
40
|
+
const content = readFileSync(filePath, "utf-8");
|
|
41
|
+
const frontmatter = extractFrontmatter(content);
|
|
42
|
+
const tree = mdxToTree(content);
|
|
43
|
+
const headings = extractHeadings(tree);
|
|
44
|
+
// Extract title: prefer frontmatter, fall back to first h1
|
|
45
|
+
const titleNode = tree.find((n) => n.type === "heading" && n.props?.level === 1);
|
|
46
|
+
const title = (typeof frontmatter?.title === "string" ? frontmatter.title : undefined) ??
|
|
47
|
+
titleNode?.props?.text ??
|
|
48
|
+
"";
|
|
49
|
+
const meta = parseMeta(frontmatter, { slug, taxonomyNames });
|
|
50
|
+
pages.push({ slug, title, tree, headings, frontmatter, meta });
|
|
51
|
+
}
|
|
52
|
+
// Attach metadata for exporters to consume
|
|
53
|
+
const llmsTxtPath = join(source, "llms.txt");
|
|
54
|
+
if (existsSync(llmsTxtPath)) {
|
|
55
|
+
const llmsContent = readFileSync(llmsTxtPath, "utf-8");
|
|
56
|
+
const titleMatch = llmsContent.match(/^#\s+(.+)$/m);
|
|
57
|
+
if (titleMatch) {
|
|
58
|
+
opts.siteName = opts.siteName || titleMatch[1].trim();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return { pages, nav };
|
|
62
|
+
}
|
|
63
|
+
const FRONTMATTER_RE = /^---\n([\s\S]*?)\n---\n?/;
|
|
64
|
+
/**
|
|
65
|
+
* Lift YAML frontmatter from the raw markdown source. Returns
|
|
66
|
+
* `undefined` when the source has no frontmatter or the YAML doesn't
|
|
67
|
+
* parse to a plain object. Tolerates malformed YAML quietly.
|
|
68
|
+
*/
|
|
69
|
+
function extractFrontmatter(source) {
|
|
70
|
+
const match = FRONTMATTER_RE.exec(source);
|
|
71
|
+
if (!match)
|
|
72
|
+
return undefined;
|
|
73
|
+
const raw = match[1];
|
|
74
|
+
if (raw.trim().length === 0)
|
|
75
|
+
return undefined;
|
|
76
|
+
try {
|
|
77
|
+
const parsed = YAML.parse(raw);
|
|
78
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
79
|
+
return parsed;
|
|
80
|
+
}
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Recursively find all .md files in a directory.
|
|
89
|
+
* Returns slug (relative path without .md) and absolute file path.
|
|
90
|
+
*/
|
|
91
|
+
function walkMdFiles(dir, root) {
|
|
92
|
+
const results = [];
|
|
93
|
+
const entries = readdirSync(dir);
|
|
94
|
+
for (const entry of entries) {
|
|
95
|
+
const fullPath = join(dir, entry);
|
|
96
|
+
const stat = statSync(fullPath);
|
|
97
|
+
if (stat.isDirectory()) {
|
|
98
|
+
results.push(...walkMdFiles(fullPath, root));
|
|
99
|
+
}
|
|
100
|
+
else if (entry.endsWith(".md") && entry !== "llms.txt") {
|
|
101
|
+
const rel = relative(root, fullPath);
|
|
102
|
+
const slug = rel.replace(/\.md$/, "").replace(/\\/g, "/");
|
|
103
|
+
results.push({ filePath: fullPath, slug });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return results;
|
|
107
|
+
}
|
|
108
|
+
export const plugin = {
|
|
109
|
+
name: "mdx",
|
|
110
|
+
canImport: true,
|
|
111
|
+
canExport: false,
|
|
112
|
+
detectSource: detectMdxDir,
|
|
113
|
+
importOptions: [],
|
|
114
|
+
exportOptions: [],
|
|
115
|
+
import: importMdxDir,
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AACxD,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/parse.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MDX parser — parse MDX/markdown with JSX component syntax into TreeNode[].
|
|
3
|
+
*
|
|
4
|
+
* Strategy: line-by-line state machine.
|
|
5
|
+
* 1. Track fenced code blocks (``` or ~~~) — content inside is literal, not parsed.
|
|
6
|
+
* 2. Detect JSX component tags (<Tabs>, <Step>, <Info>, etc.)
|
|
7
|
+
* 3. Collect standard markdown between components.
|
|
8
|
+
* 4. Parse markdown sections with markdown-it for inline formatting.
|
|
9
|
+
* 5. Map components to TreeNode types.
|
|
10
|
+
*
|
|
11
|
+
* The MDX served by Mintlify/Next.js uses well-formed, XML-like JSX tags with
|
|
12
|
+
* string attributes — no complex JSX expressions. This means a simple recursive
|
|
13
|
+
* tag parser works without a full JSX/AST parser.
|
|
14
|
+
*/
|
|
15
|
+
import type { TreeNode } from "@dogsbay/types";
|
|
16
|
+
export declare function mdxToTree(source: string): TreeNode[];
|
|
17
|
+
interface Heading {
|
|
18
|
+
depth: number;
|
|
19
|
+
slug: string;
|
|
20
|
+
text: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Extract headings from a TreeNode[] tree for table of contents.
|
|
24
|
+
* Also ensures each heading node has slug and text props.
|
|
25
|
+
*/
|
|
26
|
+
export declare function extractHeadings(nodes: TreeNode[]): Heading[];
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAc,MAAM,gBAAgB,CAAC;AAmF3D,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAkBpD;AA0nBD,UAAU,OAAO;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CA6B5D"}
|
package/dist/parse.js
ADDED
|
@@ -0,0 +1,660 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MDX parser — parse MDX/markdown with JSX component syntax into TreeNode[].
|
|
3
|
+
*
|
|
4
|
+
* Strategy: line-by-line state machine.
|
|
5
|
+
* 1. Track fenced code blocks (``` or ~~~) — content inside is literal, not parsed.
|
|
6
|
+
* 2. Detect JSX component tags (<Tabs>, <Step>, <Info>, etc.)
|
|
7
|
+
* 3. Collect standard markdown between components.
|
|
8
|
+
* 4. Parse markdown sections with markdown-it for inline formatting.
|
|
9
|
+
* 5. Map components to TreeNode types.
|
|
10
|
+
*
|
|
11
|
+
* The MDX served by Mintlify/Next.js uses well-formed, XML-like JSX tags with
|
|
12
|
+
* string attributes — no complex JSX expressions. This means a simple recursive
|
|
13
|
+
* tag parser works without a full JSX/AST parser.
|
|
14
|
+
*/
|
|
15
|
+
import MarkdownIt from "markdown-it";
|
|
16
|
+
const md = new MarkdownIt({ html: true, linkify: true });
|
|
17
|
+
const COMPONENT_MAP = {
|
|
18
|
+
// Callouts — map to native Obsidian callout syntax
|
|
19
|
+
Info: { type: "callout", container: true, propsFromAttrs: () => ({ variant: "info" }) },
|
|
20
|
+
Tip: { type: "callout", container: true, propsFromAttrs: () => ({ variant: "tip" }) },
|
|
21
|
+
Warning: { type: "callout", container: true, propsFromAttrs: () => ({ variant: "warning" }) },
|
|
22
|
+
Note: { type: "callout", container: true, propsFromAttrs: () => ({ variant: "note" }) },
|
|
23
|
+
Danger: { type: "callout", container: true, propsFromAttrs: () => ({ variant: "danger" }) },
|
|
24
|
+
Callout: {
|
|
25
|
+
type: "callout", container: true,
|
|
26
|
+
propsFromAttrs: (attrs) => ({ variant: attrs.type || "note", title: attrs.title }),
|
|
27
|
+
},
|
|
28
|
+
// Tabs
|
|
29
|
+
Tabs: { type: "tabs", container: true },
|
|
30
|
+
Tab: {
|
|
31
|
+
type: "tab", container: true,
|
|
32
|
+
propsFromAttrs: (attrs) => ({ title: attrs.title || attrs.label || "" }),
|
|
33
|
+
},
|
|
34
|
+
CodeGroup: { type: "tabs", container: true },
|
|
35
|
+
// Steps
|
|
36
|
+
Steps: { type: "steps", container: true },
|
|
37
|
+
Step: {
|
|
38
|
+
type: "step", container: true,
|
|
39
|
+
propsFromAttrs: (attrs) => ({ title: attrs.title || "" }),
|
|
40
|
+
},
|
|
41
|
+
// Accordion
|
|
42
|
+
AccordionGroup: { type: "accordion-group", container: true },
|
|
43
|
+
Accordion: {
|
|
44
|
+
type: "details", container: true,
|
|
45
|
+
propsFromAttrs: (attrs) => ({
|
|
46
|
+
title: attrs.title || "",
|
|
47
|
+
icon: attrs.icon,
|
|
48
|
+
variant: "note",
|
|
49
|
+
}),
|
|
50
|
+
},
|
|
51
|
+
// Cards
|
|
52
|
+
CardGroup: { type: "cards", container: true },
|
|
53
|
+
Card: {
|
|
54
|
+
type: "card", container: true,
|
|
55
|
+
propsFromAttrs: (attrs) => ({
|
|
56
|
+
title: attrs.title || "",
|
|
57
|
+
icon: attrs.icon,
|
|
58
|
+
href: attrs.href,
|
|
59
|
+
}),
|
|
60
|
+
},
|
|
61
|
+
// Frame (image wrapper with optional caption)
|
|
62
|
+
Frame: {
|
|
63
|
+
type: "figure", container: true,
|
|
64
|
+
propsFromAttrs: (attrs) => ({ caption: attrs.caption }),
|
|
65
|
+
},
|
|
66
|
+
// Strip these — LLM-specific preambles or site-specific interactive widgets
|
|
67
|
+
AgentInstructions: { type: "", container: true, strip: true },
|
|
68
|
+
Experiment: { type: "", container: true, strip: true },
|
|
69
|
+
ContactSalesCard: { type: "", container: true, strip: true },
|
|
70
|
+
InstallConfigurator: { type: "", container: true, strip: true },
|
|
71
|
+
};
|
|
72
|
+
// Tags we recognize as self-closing (no children)
|
|
73
|
+
const SELF_CLOSING_TAGS = new Set(["Frame", "ContactSalesCard"]);
|
|
74
|
+
// ── Main parser ──────────────────────────────────────────
|
|
75
|
+
export function mdxToTree(source) {
|
|
76
|
+
// Strip LLM preamble (blockquote at top referencing llms.txt)
|
|
77
|
+
let cleaned = stripPreamble(source);
|
|
78
|
+
// Strip JSX component definitions (export const Foo = () => { ... };)
|
|
79
|
+
// These are React components embedded in MDX that can't be converted
|
|
80
|
+
cleaned = stripJsxExports(cleaned);
|
|
81
|
+
// Parse into a flat list of segments: markdown blocks and component blocks
|
|
82
|
+
const segments = segmentMdx(cleaned);
|
|
83
|
+
// Convert segments to TreeNode[]
|
|
84
|
+
const tree = segmentsToTree(segments);
|
|
85
|
+
// Post-process: rewrite links, fix JSX attributes, handle dark mode images
|
|
86
|
+
postProcess(tree);
|
|
87
|
+
return tree;
|
|
88
|
+
}
|
|
89
|
+
// ── Post-processing ──────────────────────────────────────
|
|
90
|
+
/**
|
|
91
|
+
* Walk the tree and fix HTML content:
|
|
92
|
+
* - Rewrite internal links: /en/foo → /docs/foo
|
|
93
|
+
* - Convert JSX className to HTML class
|
|
94
|
+
* - Handle dark mode images (className="hidden dark:block" → hide by default)
|
|
95
|
+
*/
|
|
96
|
+
function postProcess(nodes) {
|
|
97
|
+
for (const node of nodes) {
|
|
98
|
+
// Fix HTML strings
|
|
99
|
+
if (node.html) {
|
|
100
|
+
node.html = fixHtml(node.html);
|
|
101
|
+
}
|
|
102
|
+
// Fix href props (cards, links, etc.)
|
|
103
|
+
if (node.props?.href && typeof node.props.href === "string") {
|
|
104
|
+
node.props.href = node.props.href.replace(/^\/en\//, "/docs/");
|
|
105
|
+
}
|
|
106
|
+
// Handle figure nodes (from <Frame>) — process children HTML
|
|
107
|
+
if (node.type === "figure" && node.children) {
|
|
108
|
+
// Filter out dark-only images, keep light/default ones
|
|
109
|
+
filterDarkModeImages(node);
|
|
110
|
+
}
|
|
111
|
+
if (node.children)
|
|
112
|
+
postProcess(node.children);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function fixHtml(html) {
|
|
116
|
+
// Rewrite internal links: /en/foo#bar → /docs/foo#bar
|
|
117
|
+
html = html.replace(/href="\/en\//g, 'href="/docs/');
|
|
118
|
+
// Convert JSX className to HTML class
|
|
119
|
+
html = html.replace(/className="/g, 'class="');
|
|
120
|
+
return html;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Handle <Frame> children with light/dark image variants.
|
|
124
|
+
* Keep only the light variant (class="dark:hidden") or default.
|
|
125
|
+
* Strip the dark-only variant (class="hidden dark:block").
|
|
126
|
+
*/
|
|
127
|
+
function filterDarkModeImages(node) {
|
|
128
|
+
if (!node.children)
|
|
129
|
+
return;
|
|
130
|
+
node.children = node.children.filter((child) => {
|
|
131
|
+
if (child.html) {
|
|
132
|
+
// Fix className first
|
|
133
|
+
child.html = fixHtml(child.html);
|
|
134
|
+
// Drop images that are hidden by default (dark-only variants)
|
|
135
|
+
if (child.html.includes('class="hidden dark:block"')) {
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
// Remove the "dark:hidden" class from light variants (just show them always)
|
|
139
|
+
child.html = child.html.replace(' class="dark:hidden"', '');
|
|
140
|
+
}
|
|
141
|
+
return true;
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
// ── Preamble stripping ───────────────────────────────────
|
|
145
|
+
function stripPreamble(source) {
|
|
146
|
+
const lines = source.split("\n");
|
|
147
|
+
let start = 0;
|
|
148
|
+
// Strip YAML frontmatter (--- ... ---)
|
|
149
|
+
if (lines[start]?.trim() === "---") {
|
|
150
|
+
start++;
|
|
151
|
+
while (start < lines.length && lines[start]?.trim() !== "---") {
|
|
152
|
+
start++;
|
|
153
|
+
}
|
|
154
|
+
if (start < lines.length)
|
|
155
|
+
start++; // skip closing ---
|
|
156
|
+
while (start < lines.length && lines[start]?.trim() === "") {
|
|
157
|
+
start++;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Skip leading blockquote lines (the llms.txt reference / Mintlify preamble)
|
|
161
|
+
while (start < lines.length && lines[start].startsWith(">")) {
|
|
162
|
+
start++;
|
|
163
|
+
}
|
|
164
|
+
// Skip blank line after blockquote
|
|
165
|
+
while (start < lines.length && lines[start].trim() === "") {
|
|
166
|
+
start++;
|
|
167
|
+
}
|
|
168
|
+
let content = lines.slice(start).join("\n");
|
|
169
|
+
// Strip Cloudflare/Starlight preamble: navigation links, feedback, edit links
|
|
170
|
+
content = content.replace(/^\[Skip to content\]\([^)]*\)\s*\n*/m, "");
|
|
171
|
+
content = content.replace(/^Was this helpful\?\s*\n*/m, "");
|
|
172
|
+
content = content.replace(/^YesNo\s*\n*/m, "");
|
|
173
|
+
content = content.replace(/^\[\s*Edit page\s*\]\([^)]*\)\s*\[\s*Report issue\s*\]\([^)]*\)\s*\n*/m, "");
|
|
174
|
+
content = content.replace(/^Copy page\s*\n*/m, "");
|
|
175
|
+
// Strip trailing JSON-LD breadcrumb (Schema.org)
|
|
176
|
+
content = content.replace(/\n```json\n\{"@context":"https:\/\/schema\.org"[\s\S]*$/, "");
|
|
177
|
+
return content.trim();
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Strip `export const Foo = () => { ... };` blocks from MDX source.
|
|
181
|
+
*
|
|
182
|
+
* These are React component definitions embedded in MDX that can't be
|
|
183
|
+
* converted to static markup. They appear as bare JavaScript in the
|
|
184
|
+
* markdown and would otherwise render as visible source code.
|
|
185
|
+
*
|
|
186
|
+
* Uses brace-depth tracking to find the end of each export block.
|
|
187
|
+
*/
|
|
188
|
+
function stripJsxExports(source) {
|
|
189
|
+
const lines = source.split("\n");
|
|
190
|
+
const result = [];
|
|
191
|
+
let i = 0;
|
|
192
|
+
while (i < lines.length) {
|
|
193
|
+
const line = lines[i];
|
|
194
|
+
// Detect export const ... = () => { or export const ... = ({ ... }) => {
|
|
195
|
+
if (line.match(/^export\s+const\s+\w+\s*=/)) {
|
|
196
|
+
// Skip this entire block by tracking brace depth
|
|
197
|
+
let depth = 0;
|
|
198
|
+
let started = false;
|
|
199
|
+
while (i < lines.length) {
|
|
200
|
+
for (const ch of lines[i]) {
|
|
201
|
+
if (ch === "{") {
|
|
202
|
+
depth++;
|
|
203
|
+
started = true;
|
|
204
|
+
}
|
|
205
|
+
if (ch === "}")
|
|
206
|
+
depth--;
|
|
207
|
+
}
|
|
208
|
+
i++;
|
|
209
|
+
// End when we've seen at least one { and depth returns to 0
|
|
210
|
+
if (started && depth <= 0)
|
|
211
|
+
break;
|
|
212
|
+
}
|
|
213
|
+
// Also skip trailing semicolons or blank lines
|
|
214
|
+
while (i < lines.length && (lines[i].trim() === ";" || lines[i].trim() === "")) {
|
|
215
|
+
i++;
|
|
216
|
+
}
|
|
217
|
+
continue;
|
|
218
|
+
}
|
|
219
|
+
result.push(line);
|
|
220
|
+
i++;
|
|
221
|
+
}
|
|
222
|
+
return result.join("\n");
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Split MDX source into alternating markdown and component segments.
|
|
226
|
+
* Handles nested components, fenced code blocks, and self-closing tags.
|
|
227
|
+
*/
|
|
228
|
+
function segmentMdx(source) {
|
|
229
|
+
const segments = [];
|
|
230
|
+
const lines = source.split("\n");
|
|
231
|
+
let i = 0;
|
|
232
|
+
let markdownBuffer = [];
|
|
233
|
+
function flushMarkdown() {
|
|
234
|
+
const content = markdownBuffer.join("\n").trim();
|
|
235
|
+
if (content) {
|
|
236
|
+
segments.push({ kind: "markdown", content });
|
|
237
|
+
}
|
|
238
|
+
markdownBuffer = [];
|
|
239
|
+
}
|
|
240
|
+
while (i < lines.length) {
|
|
241
|
+
const line = lines[i];
|
|
242
|
+
const trimmed = line.trim();
|
|
243
|
+
// Check for single-line component: <Tag>content</Tag> on one line
|
|
244
|
+
const singleLineMatch = trimmed.match(/^<([A-Z]\w*)(\s[^>]*)?>(.+)<\/\1>$/);
|
|
245
|
+
if (singleLineMatch && COMPONENT_MAP[singleLineMatch[1]]) {
|
|
246
|
+
flushMarkdown();
|
|
247
|
+
const tag = singleLineMatch[1];
|
|
248
|
+
const attrStr = singleLineMatch[2] || "";
|
|
249
|
+
const children = singleLineMatch[3];
|
|
250
|
+
segments.push({
|
|
251
|
+
kind: "component",
|
|
252
|
+
tag,
|
|
253
|
+
attrs: parseAttrs(attrStr),
|
|
254
|
+
children,
|
|
255
|
+
selfClosing: false,
|
|
256
|
+
});
|
|
257
|
+
i++;
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
// Check for component opening tag at the start of a line
|
|
261
|
+
const openMatch = trimmed.match(/^<([A-Z]\w*)(\s[^>]*)?\s*\/?>$/);
|
|
262
|
+
if (openMatch) {
|
|
263
|
+
const tag = openMatch[1];
|
|
264
|
+
const attrStr = openMatch[2] || "";
|
|
265
|
+
const isSelfClose = trimmed.endsWith("/>");
|
|
266
|
+
if (COMPONENT_MAP[tag]) {
|
|
267
|
+
flushMarkdown();
|
|
268
|
+
if (isSelfClose) {
|
|
269
|
+
segments.push({
|
|
270
|
+
kind: "component",
|
|
271
|
+
tag,
|
|
272
|
+
attrs: parseAttrs(attrStr),
|
|
273
|
+
children: "",
|
|
274
|
+
selfClosing: true,
|
|
275
|
+
});
|
|
276
|
+
i++;
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
// Collect children until closing tag
|
|
280
|
+
const { content, endLine } = collectUntilClose(lines, i + 1, tag);
|
|
281
|
+
segments.push({
|
|
282
|
+
kind: "component",
|
|
283
|
+
tag,
|
|
284
|
+
attrs: parseAttrs(attrStr),
|
|
285
|
+
children: content,
|
|
286
|
+
selfClosing: false,
|
|
287
|
+
});
|
|
288
|
+
i = endLine + 1;
|
|
289
|
+
continue;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
// Also check for opening tags that aren't on their own line (with content after)
|
|
293
|
+
const inlineOpenMatch = trimmed.match(/^<([A-Z]\w*)(\s[^>]*)?>$/);
|
|
294
|
+
if (inlineOpenMatch && !openMatch) {
|
|
295
|
+
const tag = inlineOpenMatch[1];
|
|
296
|
+
const attrStr = inlineOpenMatch[2] || "";
|
|
297
|
+
if (COMPONENT_MAP[tag]) {
|
|
298
|
+
flushMarkdown();
|
|
299
|
+
const { content, endLine } = collectUntilClose(lines, i + 1, tag);
|
|
300
|
+
segments.push({
|
|
301
|
+
kind: "component",
|
|
302
|
+
tag,
|
|
303
|
+
attrs: parseAttrs(attrStr),
|
|
304
|
+
children: content,
|
|
305
|
+
selfClosing: false,
|
|
306
|
+
});
|
|
307
|
+
i = endLine + 1;
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
markdownBuffer.push(line);
|
|
312
|
+
i++;
|
|
313
|
+
}
|
|
314
|
+
flushMarkdown();
|
|
315
|
+
return segments;
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Collect lines until the matching closing tag, handling nesting.
|
|
319
|
+
* Respects fenced code blocks (content inside is literal).
|
|
320
|
+
*/
|
|
321
|
+
function collectUntilClose(lines, startLine, tag) {
|
|
322
|
+
let depth = 1;
|
|
323
|
+
let i = startLine;
|
|
324
|
+
const collected = [];
|
|
325
|
+
let inFence = false;
|
|
326
|
+
let fenceChar = "";
|
|
327
|
+
while (i < lines.length) {
|
|
328
|
+
const line = lines[i];
|
|
329
|
+
const trimmed = line.trim();
|
|
330
|
+
// Track fenced code blocks — don't parse tags inside them
|
|
331
|
+
if (!inFence) {
|
|
332
|
+
const fenceMatch = trimmed.match(/^(`{3,}|~{3,})/);
|
|
333
|
+
if (fenceMatch) {
|
|
334
|
+
inFence = true;
|
|
335
|
+
fenceChar = fenceMatch[1][0];
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
else {
|
|
339
|
+
if (trimmed.match(new RegExp(`^${fenceChar.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}{3,}$`))) {
|
|
340
|
+
inFence = false;
|
|
341
|
+
}
|
|
342
|
+
collected.push(line);
|
|
343
|
+
i++;
|
|
344
|
+
continue;
|
|
345
|
+
}
|
|
346
|
+
// Check for nested opening/closing of the same tag
|
|
347
|
+
const closeMatch = trimmed.match(new RegExp(`^</${tag}\\s*>$`));
|
|
348
|
+
if (closeMatch) {
|
|
349
|
+
depth--;
|
|
350
|
+
if (depth === 0) {
|
|
351
|
+
return { content: dedent(collected.join("\n")), endLine: i };
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
const openMatch = trimmed.match(new RegExp(`^<${tag}(\\s[^>]*)?>$`));
|
|
355
|
+
if (openMatch && !trimmed.endsWith("/>")) {
|
|
356
|
+
depth++;
|
|
357
|
+
}
|
|
358
|
+
collected.push(line);
|
|
359
|
+
i++;
|
|
360
|
+
}
|
|
361
|
+
// If we never found the closing tag, return everything
|
|
362
|
+
return { content: dedent(collected.join("\n")), endLine: lines.length - 1 };
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Remove common leading whitespace from all lines.
|
|
366
|
+
* MDX component children are typically indented to match the tag nesting.
|
|
367
|
+
* This indentation must be removed before parsing as markdown, otherwise
|
|
368
|
+
* 4-space indented lines are treated as code blocks (CommonMark spec).
|
|
369
|
+
*/
|
|
370
|
+
function dedent(text) {
|
|
371
|
+
const lines = text.split("\n");
|
|
372
|
+
// Find minimum indentation of non-empty lines
|
|
373
|
+
let minIndent = Infinity;
|
|
374
|
+
for (const line of lines) {
|
|
375
|
+
if (line.trim() === "")
|
|
376
|
+
continue;
|
|
377
|
+
const indent = line.match(/^(\s*)/)?.[1].length ?? 0;
|
|
378
|
+
if (indent < minIndent)
|
|
379
|
+
minIndent = indent;
|
|
380
|
+
}
|
|
381
|
+
if (minIndent === 0 || minIndent === Infinity)
|
|
382
|
+
return text;
|
|
383
|
+
return lines.map((line) => line.slice(minIndent)).join("\n");
|
|
384
|
+
}
|
|
385
|
+
// ── Attribute parsing ────────────────────────────────────
|
|
386
|
+
function parseAttrs(attrStr) {
|
|
387
|
+
const attrs = {};
|
|
388
|
+
// Match: key="value" or key={value} or key='value'
|
|
389
|
+
const re = /(\w+)\s*=\s*(?:"([^"]*)"|'([^']*)'|\{([^}]*)\})/g;
|
|
390
|
+
let match;
|
|
391
|
+
while ((match = re.exec(attrStr))) {
|
|
392
|
+
attrs[match[1]] = match[2] ?? match[3] ?? match[4] ?? "";
|
|
393
|
+
}
|
|
394
|
+
return attrs;
|
|
395
|
+
}
|
|
396
|
+
// ── Segments → TreeNode[] ────────────────────────────────
|
|
397
|
+
function segmentsToTree(segments) {
|
|
398
|
+
const nodes = [];
|
|
399
|
+
for (const seg of segments) {
|
|
400
|
+
if (seg.kind === "markdown") {
|
|
401
|
+
nodes.push(...markdownToNodes(seg.content));
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
const mapping = COMPONENT_MAP[seg.tag];
|
|
405
|
+
if (!mapping || mapping.strip)
|
|
406
|
+
continue;
|
|
407
|
+
const node = componentToNode(seg, mapping);
|
|
408
|
+
if (node)
|
|
409
|
+
nodes.push(node);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
return nodes;
|
|
413
|
+
}
|
|
414
|
+
function componentToNode(seg, mapping) {
|
|
415
|
+
const props = mapping.propsFromAttrs
|
|
416
|
+
? mapping.propsFromAttrs(seg.attrs)
|
|
417
|
+
: {};
|
|
418
|
+
// Special handling for tabs container
|
|
419
|
+
if (mapping.type === "tabs") {
|
|
420
|
+
return tabsToNode(seg);
|
|
421
|
+
}
|
|
422
|
+
// Special handling for steps container
|
|
423
|
+
if (mapping.type === "steps") {
|
|
424
|
+
return stepsToNode(seg);
|
|
425
|
+
}
|
|
426
|
+
// Special handling for accordion-group
|
|
427
|
+
if (mapping.type === "accordion-group") {
|
|
428
|
+
// Parse children as segments, extract accordion items
|
|
429
|
+
const childSegments = segmentMdx(seg.children);
|
|
430
|
+
const children = segmentsToTree(childSegments);
|
|
431
|
+
return { type: "accordion-group", children };
|
|
432
|
+
}
|
|
433
|
+
// Special handling for cards container
|
|
434
|
+
if (mapping.type === "cards") {
|
|
435
|
+
const childSegments = segmentMdx(seg.children);
|
|
436
|
+
const children = segmentsToTree(childSegments);
|
|
437
|
+
return { type: "cards", children };
|
|
438
|
+
}
|
|
439
|
+
// For callouts, details, card — parse children as content
|
|
440
|
+
const children = seg.selfClosing ? [] : mdxToTree(seg.children);
|
|
441
|
+
const node = { type: mapping.type };
|
|
442
|
+
if (Object.keys(props).length > 0)
|
|
443
|
+
node.props = props;
|
|
444
|
+
if (children.length > 0)
|
|
445
|
+
node.children = children;
|
|
446
|
+
// For callout types, if there's a title prop, set it
|
|
447
|
+
if (mapping.type === "callout" && props.title) {
|
|
448
|
+
node.props = { ...props };
|
|
449
|
+
}
|
|
450
|
+
return node;
|
|
451
|
+
}
|
|
452
|
+
// ── Tabs handling ────────────────────────────────────────
|
|
453
|
+
function tabsToNode(seg) {
|
|
454
|
+
// Parse children to find <Tab> segments
|
|
455
|
+
const childSegments = segmentMdx(seg.children);
|
|
456
|
+
const tabs = [];
|
|
457
|
+
for (const child of childSegments) {
|
|
458
|
+
if (child.kind === "component" && child.tag === "Tab") {
|
|
459
|
+
const title = child.attrs.title || child.attrs.label || "";
|
|
460
|
+
const content = mdxToTree(child.children);
|
|
461
|
+
tabs.push({
|
|
462
|
+
type: "tab",
|
|
463
|
+
props: { title },
|
|
464
|
+
children: content,
|
|
465
|
+
});
|
|
466
|
+
}
|
|
467
|
+
// Ignore non-Tab children inside Tabs
|
|
468
|
+
}
|
|
469
|
+
return { type: "tabs", children: tabs };
|
|
470
|
+
}
|
|
471
|
+
// ── Steps handling ───────────────────────────────────────
|
|
472
|
+
function stepsToNode(seg) {
|
|
473
|
+
const childSegments = segmentMdx(seg.children);
|
|
474
|
+
const steps = [];
|
|
475
|
+
for (const child of childSegments) {
|
|
476
|
+
if (child.kind === "component" && child.tag === "Step") {
|
|
477
|
+
const title = child.attrs.title || "";
|
|
478
|
+
const content = mdxToTree(child.children);
|
|
479
|
+
// Prepend title as bold text if present
|
|
480
|
+
const children = [];
|
|
481
|
+
if (title) {
|
|
482
|
+
children.push({ type: "prose", html: `<strong>${title}</strong>` });
|
|
483
|
+
}
|
|
484
|
+
children.push(...content);
|
|
485
|
+
steps.push({
|
|
486
|
+
type: "step",
|
|
487
|
+
props: { title },
|
|
488
|
+
children,
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
return { type: "steps", children: steps };
|
|
493
|
+
}
|
|
494
|
+
// ── Markdown → TreeNode[] ────────────────────────────────
|
|
495
|
+
/**
|
|
496
|
+
* Parse a block of standard markdown (no component tags) into TreeNode[].
|
|
497
|
+
*
|
|
498
|
+
* Uses markdown-it for tokenization, then walks tokens to build TreeNode[].
|
|
499
|
+
*/
|
|
500
|
+
function markdownToNodes(content) {
|
|
501
|
+
const tokens = md.parse(content, {});
|
|
502
|
+
return tokensToTree(tokens);
|
|
503
|
+
}
|
|
504
|
+
function tokensToTree(tokens) {
|
|
505
|
+
const nodes = [];
|
|
506
|
+
let i = 0;
|
|
507
|
+
while (i < tokens.length) {
|
|
508
|
+
const token = tokens[i];
|
|
509
|
+
// Handle open/close container tokens generically
|
|
510
|
+
if (token.nesting === 1) {
|
|
511
|
+
const closeTag = token.type.replace("_open", "_close");
|
|
512
|
+
const children = [];
|
|
513
|
+
i++;
|
|
514
|
+
let depth = 1;
|
|
515
|
+
while (i < tokens.length && depth > 0) {
|
|
516
|
+
if (tokens[i].type === token.type)
|
|
517
|
+
depth++;
|
|
518
|
+
if (tokens[i].type === closeTag) {
|
|
519
|
+
depth--;
|
|
520
|
+
if (depth === 0)
|
|
521
|
+
break;
|
|
522
|
+
}
|
|
523
|
+
children.push(tokens[i]);
|
|
524
|
+
i++;
|
|
525
|
+
}
|
|
526
|
+
i++; // skip close token
|
|
527
|
+
const node = openTokenToNode(token, children);
|
|
528
|
+
if (node)
|
|
529
|
+
nodes.push(node);
|
|
530
|
+
continue;
|
|
531
|
+
}
|
|
532
|
+
// Handle flat (self-closing) tokens
|
|
533
|
+
switch (token.type) {
|
|
534
|
+
case "fence": {
|
|
535
|
+
const lang = token.info?.split(/\s+/)[0] || "";
|
|
536
|
+
const code = token.content.replace(/\n$/, "");
|
|
537
|
+
nodes.push({
|
|
538
|
+
type: "code",
|
|
539
|
+
props: { lang: lang || null, code },
|
|
540
|
+
});
|
|
541
|
+
i++;
|
|
542
|
+
break;
|
|
543
|
+
}
|
|
544
|
+
case "inline": {
|
|
545
|
+
// Standalone inline (e.g., inside a heading or paragraph container)
|
|
546
|
+
const html = md.renderInline(token.content);
|
|
547
|
+
nodes.push({ type: "prose", html });
|
|
548
|
+
i++;
|
|
549
|
+
break;
|
|
550
|
+
}
|
|
551
|
+
case "hr": {
|
|
552
|
+
nodes.push({ type: "hr" });
|
|
553
|
+
i++;
|
|
554
|
+
break;
|
|
555
|
+
}
|
|
556
|
+
case "html_block": {
|
|
557
|
+
const trimmed = token.content.trim();
|
|
558
|
+
if (!trimmed.match(/^<[A-Z]/)) {
|
|
559
|
+
nodes.push({ type: "html", html: token.content });
|
|
560
|
+
}
|
|
561
|
+
i++;
|
|
562
|
+
break;
|
|
563
|
+
}
|
|
564
|
+
default:
|
|
565
|
+
i++;
|
|
566
|
+
break;
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
return nodes;
|
|
570
|
+
}
|
|
571
|
+
/**
|
|
572
|
+
* Map an opening token (nesting=1) + its collected children to a TreeNode.
|
|
573
|
+
*/
|
|
574
|
+
function openTokenToNode(token, childTokens) {
|
|
575
|
+
const children = tokensToTree(childTokens);
|
|
576
|
+
switch (token.type) {
|
|
577
|
+
case "heading_open": {
|
|
578
|
+
const level = parseInt(token.tag.slice(1), 10);
|
|
579
|
+
// Children should be a single "inline" token → prose node
|
|
580
|
+
const textHtml = children[0]?.html ?? "";
|
|
581
|
+
const text = textHtml.replace(/<[^>]+>/g, "").trim();
|
|
582
|
+
const slug = slugify(text);
|
|
583
|
+
return {
|
|
584
|
+
type: "heading",
|
|
585
|
+
props: { level, slug, text },
|
|
586
|
+
children,
|
|
587
|
+
};
|
|
588
|
+
}
|
|
589
|
+
case "paragraph_open":
|
|
590
|
+
return { type: "paragraph", children };
|
|
591
|
+
case "blockquote_open":
|
|
592
|
+
return { type: "blockquote", children };
|
|
593
|
+
case "ordered_list_open":
|
|
594
|
+
return { type: "ordered-list", children };
|
|
595
|
+
case "bullet_list_open":
|
|
596
|
+
return { type: "unordered-list", children };
|
|
597
|
+
case "list_item_open":
|
|
598
|
+
return { type: "list-item", children };
|
|
599
|
+
case "table_open":
|
|
600
|
+
return { type: "table", children };
|
|
601
|
+
case "thead_open":
|
|
602
|
+
return { type: "thead", children };
|
|
603
|
+
case "tbody_open":
|
|
604
|
+
return { type: "tbody", children };
|
|
605
|
+
case "tr_open":
|
|
606
|
+
return { type: "tr", children };
|
|
607
|
+
case "th_open":
|
|
608
|
+
return { type: "th", children };
|
|
609
|
+
case "td_open":
|
|
610
|
+
return { type: "td", children };
|
|
611
|
+
default:
|
|
612
|
+
// Unknown container — wrap children
|
|
613
|
+
if (children.length > 0) {
|
|
614
|
+
return { type: "html-container", children };
|
|
615
|
+
}
|
|
616
|
+
return null;
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
// ── Heading utilities ────────────────────────────────────
|
|
620
|
+
function slugify(text) {
|
|
621
|
+
return text
|
|
622
|
+
.toLowerCase()
|
|
623
|
+
.replace(/[^\w\s-]/g, "")
|
|
624
|
+
.replace(/\s+/g, "-")
|
|
625
|
+
.replace(/-+/g, "-")
|
|
626
|
+
.replace(/^-|-$/g, "");
|
|
627
|
+
}
|
|
628
|
+
/**
|
|
629
|
+
* Extract headings from a TreeNode[] tree for table of contents.
|
|
630
|
+
* Also ensures each heading node has slug and text props.
|
|
631
|
+
*/
|
|
632
|
+
export function extractHeadings(nodes) {
|
|
633
|
+
const headings = [];
|
|
634
|
+
const seen = new Map();
|
|
635
|
+
function walk(nodeList) {
|
|
636
|
+
for (const node of nodeList) {
|
|
637
|
+
if (node.type === "heading") {
|
|
638
|
+
const level = node.props?.level ?? 1;
|
|
639
|
+
const text = node.props?.text ?? "";
|
|
640
|
+
let slug = node.props?.slug ?? slugify(text);
|
|
641
|
+
// Deduplicate slugs
|
|
642
|
+
const count = seen.get(slug) ?? 0;
|
|
643
|
+
if (count > 0)
|
|
644
|
+
slug = `${slug}-${count}`;
|
|
645
|
+
seen.set(slug.replace(/-\d+$/, ""), count + 1);
|
|
646
|
+
// Update the node props
|
|
647
|
+
if (!node.props)
|
|
648
|
+
node.props = {};
|
|
649
|
+
node.props.slug = slug;
|
|
650
|
+
node.props.text = text;
|
|
651
|
+
headings.push({ depth: level, slug, text });
|
|
652
|
+
}
|
|
653
|
+
if (node.children)
|
|
654
|
+
walk(node.children);
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
walk(nodes);
|
|
658
|
+
return headings;
|
|
659
|
+
}
|
|
660
|
+
//# sourceMappingURL=parse.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@dogsbay/format-mdx",
|
|
3
|
+
"version": "0.2.0-beta.0",
|
|
4
|
+
"description": "MDX format plugin for Dogsbay — import MDX/markdown with component syntax via TreeNode[]",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./cli": {
|
|
14
|
+
"types": "./dist/cli.d.ts",
|
|
15
|
+
"import": "./dist/cli.js"
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"README.md"
|
|
21
|
+
],
|
|
22
|
+
"devDependencies": {
|
|
23
|
+
"@types/markdown-it": "^14.1.2",
|
|
24
|
+
"@types/node": "^25.5.0",
|
|
25
|
+
"typescript": "^5.7.0",
|
|
26
|
+
"vitest": "^3.0.0"
|
|
27
|
+
},
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"markdown-it": "^14.1.0",
|
|
31
|
+
"yaml": "^2.8.3",
|
|
32
|
+
"@dogsbay/types": "0.2.0-beta.0"
|
|
33
|
+
},
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "https://github.com/dogsbay/dogsbay.git",
|
|
37
|
+
"directory": "packages/format-mdx"
|
|
38
|
+
},
|
|
39
|
+
"homepage": "https://github.com/dogsbay/dogsbay/tree/main/packages/format-mdx",
|
|
40
|
+
"bugs": {
|
|
41
|
+
"url": "https://github.com/dogsbay/dogsbay/issues"
|
|
42
|
+
},
|
|
43
|
+
"scripts": {
|
|
44
|
+
"build": "tsc",
|
|
45
|
+
"test": "vitest run --passWithNoTests",
|
|
46
|
+
"test:watch": "vitest"
|
|
47
|
+
}
|
|
48
|
+
}
|