safe-mdx 1.3.10 → 1.4.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/esm-parser.test.js +176 -1
- package/dist/esm-parser.test.js.map +1 -1
- package/dist/parse.d.ts +44 -0
- package/dist/parse.d.ts.map +1 -1
- package/dist/parse.js +127 -0
- package/dist/parse.js.map +1 -1
- package/dist/safe-mdx.d.ts +19 -1
- package/dist/safe-mdx.d.ts.map +1 -1
- package/dist/safe-mdx.js +54 -3
- package/dist/safe-mdx.js.map +1 -1
- package/dist/safe-mdx.test.js +105 -0
- package/dist/safe-mdx.test.js.map +1 -1
- package/package.json +1 -1
- package/src/esm-parser.test.ts +189 -1
- package/src/parse.ts +165 -0
- package/src/safe-mdx.test.tsx +114 -1
- package/src/safe-mdx.tsx +65 -1
package/dist/esm-parser.test.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { expect, test, describe } from 'vitest';
|
|
2
2
|
import { parseEsmImports, extractComponentInfo } from './esm-parser.js';
|
|
3
|
-
import { mdxParse } from './parse.js';
|
|
3
|
+
import { mdxParse, extractImports, resolveModulePath } from './parse.js';
|
|
4
4
|
describe('parseEsmImports', () => {
|
|
5
5
|
test('parses default imports from HTTPS URLs', () => {
|
|
6
6
|
const code = `import MyComponent from 'https://esm.sh/some-component'`;
|
|
@@ -101,6 +101,181 @@ import Component3 from './relative/path'
|
|
|
101
101
|
expect(errors).toMatchInlineSnapshot(`[]`);
|
|
102
102
|
});
|
|
103
103
|
});
|
|
104
|
+
describe('extractImports', () => {
|
|
105
|
+
test('extracts named, default, and namespace imports', () => {
|
|
106
|
+
const code = `import { Card } from './components/card'
|
|
107
|
+
import MyButton from '../ui/button'
|
|
108
|
+
import * as Utils from './utils'
|
|
109
|
+
|
|
110
|
+
# Hello
|
|
111
|
+
`;
|
|
112
|
+
const ast = mdxParse(code);
|
|
113
|
+
const imports = extractImports(ast);
|
|
114
|
+
expect(imports).toMatchInlineSnapshot(`
|
|
115
|
+
[
|
|
116
|
+
{
|
|
117
|
+
"source": "./components/card",
|
|
118
|
+
"specifiers": [
|
|
119
|
+
{
|
|
120
|
+
"imported": "Card",
|
|
121
|
+
"local": "Card",
|
|
122
|
+
"type": "named",
|
|
123
|
+
},
|
|
124
|
+
],
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"source": "../ui/button",
|
|
128
|
+
"specifiers": [
|
|
129
|
+
{
|
|
130
|
+
"imported": "default",
|
|
131
|
+
"local": "MyButton",
|
|
132
|
+
"type": "default",
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
"source": "./utils",
|
|
138
|
+
"specifiers": [
|
|
139
|
+
{
|
|
140
|
+
"imported": "*",
|
|
141
|
+
"local": "Utils",
|
|
142
|
+
"type": "namespace",
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
},
|
|
146
|
+
]
|
|
147
|
+
`);
|
|
148
|
+
});
|
|
149
|
+
test('extracts npm package imports', () => {
|
|
150
|
+
const code = `import { Button } from 'some-ui-lib'
|
|
151
|
+
import React from 'react'
|
|
152
|
+
`;
|
|
153
|
+
const ast = mdxParse(code);
|
|
154
|
+
const imports = extractImports(ast);
|
|
155
|
+
expect(imports).toMatchInlineSnapshot(`
|
|
156
|
+
[
|
|
157
|
+
{
|
|
158
|
+
"source": "some-ui-lib",
|
|
159
|
+
"specifiers": [
|
|
160
|
+
{
|
|
161
|
+
"imported": "Button",
|
|
162
|
+
"local": "Button",
|
|
163
|
+
"type": "named",
|
|
164
|
+
},
|
|
165
|
+
],
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"source": "react",
|
|
169
|
+
"specifiers": [
|
|
170
|
+
{
|
|
171
|
+
"imported": "default",
|
|
172
|
+
"local": "React",
|
|
173
|
+
"type": "default",
|
|
174
|
+
},
|
|
175
|
+
],
|
|
176
|
+
},
|
|
177
|
+
]
|
|
178
|
+
`);
|
|
179
|
+
});
|
|
180
|
+
test('extracts absolute path imports (Mintlify style)', () => {
|
|
181
|
+
const code = `import Greeting from "/snippets/greeting.mdx"
|
|
182
|
+
import { Badge } from "/components/badge"
|
|
183
|
+
`;
|
|
184
|
+
const ast = mdxParse(code);
|
|
185
|
+
const imports = extractImports(ast);
|
|
186
|
+
expect(imports).toMatchInlineSnapshot(`
|
|
187
|
+
[
|
|
188
|
+
{
|
|
189
|
+
"source": "/snippets/greeting.mdx",
|
|
190
|
+
"specifiers": [
|
|
191
|
+
{
|
|
192
|
+
"imported": "default",
|
|
193
|
+
"local": "Greeting",
|
|
194
|
+
"type": "default",
|
|
195
|
+
},
|
|
196
|
+
],
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"source": "/components/badge",
|
|
200
|
+
"specifiers": [
|
|
201
|
+
{
|
|
202
|
+
"imported": "Badge",
|
|
203
|
+
"local": "Badge",
|
|
204
|
+
"type": "named",
|
|
205
|
+
},
|
|
206
|
+
],
|
|
207
|
+
},
|
|
208
|
+
]
|
|
209
|
+
`);
|
|
210
|
+
});
|
|
211
|
+
test('returns empty array when no imports', () => {
|
|
212
|
+
const code = `# Just a heading\n\nSome text.`;
|
|
213
|
+
const ast = mdxParse(code);
|
|
214
|
+
expect(extractImports(ast)).toMatchInlineSnapshot(`[]`);
|
|
215
|
+
});
|
|
216
|
+
test('handles aliased imports', () => {
|
|
217
|
+
const code = `import { Card as MyCard, Badge as B } from './ui'`;
|
|
218
|
+
const ast = mdxParse(code);
|
|
219
|
+
const imports = extractImports(ast);
|
|
220
|
+
expect(imports).toMatchInlineSnapshot(`
|
|
221
|
+
[
|
|
222
|
+
{
|
|
223
|
+
"source": "./ui",
|
|
224
|
+
"specifiers": [
|
|
225
|
+
{
|
|
226
|
+
"imported": "Card",
|
|
227
|
+
"local": "MyCard",
|
|
228
|
+
"type": "named",
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
"imported": "Badge",
|
|
232
|
+
"local": "B",
|
|
233
|
+
"type": "named",
|
|
234
|
+
},
|
|
235
|
+
],
|
|
236
|
+
},
|
|
237
|
+
]
|
|
238
|
+
`);
|
|
239
|
+
});
|
|
240
|
+
});
|
|
241
|
+
describe('resolveModulePath', () => {
|
|
242
|
+
const keys = [
|
|
243
|
+
'./snippets/card.tsx',
|
|
244
|
+
'./snippets/badge.ts',
|
|
245
|
+
'./components/ui/index.tsx',
|
|
246
|
+
'./pages/api/helpers.ts',
|
|
247
|
+
'./pages/card.tsx',
|
|
248
|
+
'./snippets/greeting.mdx',
|
|
249
|
+
];
|
|
250
|
+
test('resolves absolute import /snippets/card', () => {
|
|
251
|
+
expect(resolveModulePath('/snippets/card', './pages/', keys))
|
|
252
|
+
.toMatchInlineSnapshot(`"./snippets/card.tsx"`);
|
|
253
|
+
});
|
|
254
|
+
test('resolves relative import ./card from ./pages/', () => {
|
|
255
|
+
expect(resolveModulePath('./card', './pages/', keys))
|
|
256
|
+
.toMatchInlineSnapshot(`"./pages/card.tsx"`);
|
|
257
|
+
});
|
|
258
|
+
test('resolves index.tsx', () => {
|
|
259
|
+
expect(resolveModulePath('/components/ui', './pages/', keys))
|
|
260
|
+
.toMatchInlineSnapshot(`"./components/ui/index.tsx"`);
|
|
261
|
+
});
|
|
262
|
+
test('resolves relative ../ path', () => {
|
|
263
|
+
expect(resolveModulePath('../snippets/greeting', './pages/api/', keys))
|
|
264
|
+
.toMatchInlineSnapshot(`undefined`);
|
|
265
|
+
});
|
|
266
|
+
test('resolves ../../ to reach project root', () => {
|
|
267
|
+
expect(resolveModulePath('../../snippets/greeting', './pages/api/', keys))
|
|
268
|
+
.toMatchInlineSnapshot(`"./snippets/greeting.mdx"`);
|
|
269
|
+
});
|
|
270
|
+
test('returns undefined for bare specifiers', () => {
|
|
271
|
+
expect(resolveModulePath('react', './pages/', keys))
|
|
272
|
+
.toMatchInlineSnapshot(`undefined`);
|
|
273
|
+
});
|
|
274
|
+
test('returns undefined for missing files', () => {
|
|
275
|
+
expect(resolveModulePath('./nonexistent', './pages/', keys))
|
|
276
|
+
.toMatchInlineSnapshot(`undefined`);
|
|
277
|
+
});
|
|
278
|
+
});
|
|
104
279
|
describe('extractComponentInfo', () => {
|
|
105
280
|
test('extracts default import info', () => {
|
|
106
281
|
const result = extractComponentInfo('https://esm.sh/component');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esm-parser.test.js","sourceRoot":"","sources":["../src/esm-parser.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACvE,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;
|
|
1
|
+
{"version":3,"file":"esm-parser.test.js","sourceRoot":"","sources":["../src/esm-parser.test.ts"],"names":[],"mappings":"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"}
|
package/dist/parse.d.ts
CHANGED
|
@@ -1,6 +1,23 @@
|
|
|
1
1
|
import { Root } from 'mdast';
|
|
2
2
|
import { parseHtmlToMdxAst, remarkMdxJsxNormalize } from './html/html-to-mdx-ast.js';
|
|
3
3
|
export { parseHtmlToMdxAst, remarkMdxJsxNormalize };
|
|
4
|
+
export type MdxImportSpecifier = {
|
|
5
|
+
/** Name used in MDX (e.g. `Card`, `MyButton`, `Utils`) */
|
|
6
|
+
local: string;
|
|
7
|
+
/** Original export name. `'default'` for default imports, local name for named, `'*'` for namespace */
|
|
8
|
+
imported: string;
|
|
9
|
+
type: 'named' | 'default' | 'namespace';
|
|
10
|
+
};
|
|
11
|
+
export type MdxImport = {
|
|
12
|
+
/** Raw source string as written: `'./card'`, `'/snippets/ui'`, `'some-pkg'` */
|
|
13
|
+
source: string;
|
|
14
|
+
specifiers: MdxImportSpecifier[];
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Extract all import declarations from a parsed mdast tree.
|
|
18
|
+
* Unlike `parseEsmImports`, this accepts ANY source (not just HTTPS URLs).
|
|
19
|
+
*/
|
|
20
|
+
export declare function extractImports(ast: Root): MdxImport[];
|
|
4
21
|
export declare function mdxParse(code: string): Root;
|
|
5
22
|
/**
|
|
6
23
|
* https://github.com/mdx-js/mdx/blob/b3351fadcb6f78833a72757b7135dcfb8ab646fe/packages/mdx/lib/plugin/remark-mark-and-unravel.js
|
|
@@ -12,4 +29,31 @@ export declare function mdxParse(code: string): Root;
|
|
|
12
29
|
*
|
|
13
30
|
*/
|
|
14
31
|
export declare function remarkMarkAndUnravel(): (tree: Root) => void;
|
|
32
|
+
/**
|
|
33
|
+
* Given an import source and a baseUrl, resolve the source to a key
|
|
34
|
+
* that exists in `moduleKeys`. Handles:
|
|
35
|
+
* - Relative imports (`./card`) resolved from `baseUrl`
|
|
36
|
+
* - Absolute imports (`/snippets/card`) normalized to `./snippets/card`
|
|
37
|
+
* - Extension resolution (tries .tsx, .ts, .jsx, .js, .mdx, .md, /index.*)
|
|
38
|
+
*/
|
|
39
|
+
export declare function resolveModulePath(source: string, baseUrl: string, moduleKeys: string[]): string | undefined;
|
|
40
|
+
export type LazyGlob = Record<string, () => Promise<Record<string, any>>>;
|
|
41
|
+
export type EagerModules = Record<string, Record<string, any>>;
|
|
42
|
+
/**
|
|
43
|
+
* Given a lazy Vite glob and a parsed mdast, resolve only the imported
|
|
44
|
+
* modules eagerly. Returns the exact shape `SafeMdxRenderer.modules` expects.
|
|
45
|
+
*
|
|
46
|
+
* Usage:
|
|
47
|
+
* ```ts
|
|
48
|
+
* const lazyGlob = import.meta.glob('./snippets/*.tsx')
|
|
49
|
+
* const mdast = mdxParse(mdxString)
|
|
50
|
+
* const modules = await resolveModules({ glob: lazyGlob, mdast, baseUrl: './pages/' })
|
|
51
|
+
* <SafeMdxRenderer modules={modules} baseUrl="./pages/" ... />
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
export declare function resolveModules({ glob, mdast, baseUrl, }: {
|
|
55
|
+
glob: LazyGlob;
|
|
56
|
+
mdast: Root;
|
|
57
|
+
baseUrl: string;
|
|
58
|
+
}): Promise<EagerModules>;
|
|
15
59
|
//# sourceMappingURL=parse.d.ts.map
|
package/dist/parse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAe,MAAM,OAAO,CAAA;AAIzC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAEpF,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,IAAI,EAAe,MAAM,OAAO,CAAA;AAIzC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAEpF,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,CAAA;AAInD,MAAM,MAAM,kBAAkB,GAAG;IAC7B,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAA;IACb,uGAAuG;IACvG,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,WAAW,CAAA;CAC1C,CAAA;AAED,MAAM,MAAM,SAAS,GAAG;IACpB,+EAA+E;IAC/E,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,kBAAkB,EAAE,CAAA;CACnC,CAAA;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,IAAI,GAAG,SAAS,EAAE,CAkCrD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAET,IAAI,CAC/B;AAED;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,KACf,MAAM,IAAI,UAqE9B;AAUD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC7B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAAE,GACrB,MAAM,GAAG,SAAS,CAyBpB;AAsBD,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAA;AACzE,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAA;AAE9D;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,EACjC,IAAI,EACJ,KAAK,EACL,OAAO,GACV,EAAE;IACC,IAAI,EAAE,QAAQ,CAAA;IACd,KAAK,EAAE,IAAI,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;CAClB,GAAG,OAAO,CAAC,YAAY,CAAC,CAkBxB"}
|
package/dist/parse.js
CHANGED
|
@@ -6,6 +6,46 @@ import remarkGfm from 'remark-gfm';
|
|
|
6
6
|
import remarkMdx from 'remark-mdx';
|
|
7
7
|
import { parseHtmlToMdxAst, remarkMdxJsxNormalize } from './html/html-to-mdx-ast.js';
|
|
8
8
|
export { parseHtmlToMdxAst, remarkMdxJsxNormalize };
|
|
9
|
+
/**
|
|
10
|
+
* Extract all import declarations from a parsed mdast tree.
|
|
11
|
+
* Unlike `parseEsmImports`, this accepts ANY source (not just HTTPS URLs).
|
|
12
|
+
*/
|
|
13
|
+
export function extractImports(ast) {
|
|
14
|
+
const imports = [];
|
|
15
|
+
for (const node of ast.children) {
|
|
16
|
+
if (node.type !== 'mdxjsEsm')
|
|
17
|
+
continue;
|
|
18
|
+
const estree = node.data?.estree;
|
|
19
|
+
if (!estree)
|
|
20
|
+
continue;
|
|
21
|
+
for (const statement of estree.body) {
|
|
22
|
+
if (statement.type !== 'ImportDeclaration')
|
|
23
|
+
continue;
|
|
24
|
+
const source = statement.source?.value;
|
|
25
|
+
if (typeof source !== 'string')
|
|
26
|
+
continue;
|
|
27
|
+
const specifiers = [];
|
|
28
|
+
for (const spec of statement.specifiers ?? []) {
|
|
29
|
+
if (spec.type === 'ImportDefaultSpecifier') {
|
|
30
|
+
specifiers.push({ local: spec.local.name, imported: 'default', type: 'default' });
|
|
31
|
+
}
|
|
32
|
+
else if (spec.type === 'ImportSpecifier') {
|
|
33
|
+
const importedName = spec.imported.type === 'Identifier'
|
|
34
|
+
? spec.imported.name
|
|
35
|
+
: String(spec.imported.value);
|
|
36
|
+
specifiers.push({ local: spec.local.name, imported: importedName, type: 'named' });
|
|
37
|
+
}
|
|
38
|
+
else if (spec.type === 'ImportNamespaceSpecifier') {
|
|
39
|
+
specifiers.push({ local: spec.local.name, imported: '*', type: 'namespace' });
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (specifiers.length > 0) {
|
|
43
|
+
imports.push({ source, specifiers });
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return imports;
|
|
48
|
+
}
|
|
9
49
|
export function mdxParse(code) {
|
|
10
50
|
const file = mdxProcessor.processSync(code);
|
|
11
51
|
return file.data.ast;
|
|
@@ -75,6 +115,93 @@ export function remarkMarkAndUnravel() {
|
|
|
75
115
|
});
|
|
76
116
|
};
|
|
77
117
|
}
|
|
118
|
+
/* ── Module resolution ───────────────────────────────────────────────── */
|
|
119
|
+
/** Extensions tried when resolving a bare import against glob keys */
|
|
120
|
+
const RESOLVE_EXTENSIONS = [
|
|
121
|
+
'', '.tsx', '.ts', '.jsx', '.js', '.mdx', '.md',
|
|
122
|
+
'/index.tsx', '/index.ts', '/index.jsx', '/index.js',
|
|
123
|
+
];
|
|
124
|
+
/**
|
|
125
|
+
* Given an import source and a baseUrl, resolve the source to a key
|
|
126
|
+
* that exists in `moduleKeys`. Handles:
|
|
127
|
+
* - Relative imports (`./card`) resolved from `baseUrl`
|
|
128
|
+
* - Absolute imports (`/snippets/card`) normalized to `./snippets/card`
|
|
129
|
+
* - Extension resolution (tries .tsx, .ts, .jsx, .js, .mdx, .md, /index.*)
|
|
130
|
+
*/
|
|
131
|
+
export function resolveModulePath(source, baseUrl, moduleKeys) {
|
|
132
|
+
let normalized;
|
|
133
|
+
if (source.startsWith('/')) {
|
|
134
|
+
// Absolute import from project root: /snippets/card → ./snippets/card
|
|
135
|
+
normalized = '.' + source;
|
|
136
|
+
}
|
|
137
|
+
else if (source.startsWith('./') || source.startsWith('../')) {
|
|
138
|
+
// Relative import: resolve from baseUrl
|
|
139
|
+
const joined = joinPaths(baseUrl, source);
|
|
140
|
+
if (!joined)
|
|
141
|
+
return undefined; // .. escaped above root
|
|
142
|
+
normalized = joined;
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
// Bare specifier (npm package etc.) — not resolvable from glob
|
|
146
|
+
return undefined;
|
|
147
|
+
}
|
|
148
|
+
// Try each extension
|
|
149
|
+
for (const ext of RESOLVE_EXTENSIONS) {
|
|
150
|
+
const candidate = normalized + ext;
|
|
151
|
+
if (moduleKeys.includes(candidate)) {
|
|
152
|
+
return candidate;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
/** Simple path join that normalizes `./a/b/../c` segments.
|
|
158
|
+
* Both inputs and output use `./` prefix (matching Vite glob key format).
|
|
159
|
+
* Returns `undefined` if `..` escapes above the project root. */
|
|
160
|
+
function joinPaths(base, relative) {
|
|
161
|
+
// Strip ./ prefix and trailing /
|
|
162
|
+
const baseParts = base.replace(/^\.\//, '').replace(/\/$/, '').split('/').filter(Boolean);
|
|
163
|
+
const relParts = relative.replace(/^\.\//, '').split('/').filter(Boolean);
|
|
164
|
+
for (const part of relParts) {
|
|
165
|
+
if (part === '..') {
|
|
166
|
+
if (baseParts.length === 0)
|
|
167
|
+
return undefined; // escaped above root
|
|
168
|
+
baseParts.pop();
|
|
169
|
+
}
|
|
170
|
+
else if (part !== '.') {
|
|
171
|
+
baseParts.push(part);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return './' + baseParts.join('/');
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Given a lazy Vite glob and a parsed mdast, resolve only the imported
|
|
178
|
+
* modules eagerly. Returns the exact shape `SafeMdxRenderer.modules` expects.
|
|
179
|
+
*
|
|
180
|
+
* Usage:
|
|
181
|
+
* ```ts
|
|
182
|
+
* const lazyGlob = import.meta.glob('./snippets/*.tsx')
|
|
183
|
+
* const mdast = mdxParse(mdxString)
|
|
184
|
+
* const modules = await resolveModules({ glob: lazyGlob, mdast, baseUrl: './pages/' })
|
|
185
|
+
* <SafeMdxRenderer modules={modules} baseUrl="./pages/" ... />
|
|
186
|
+
* ```
|
|
187
|
+
*/
|
|
188
|
+
export async function resolveModules({ glob, mdast, baseUrl, }) {
|
|
189
|
+
const imports = extractImports(mdast);
|
|
190
|
+
if (imports.length === 0)
|
|
191
|
+
return {};
|
|
192
|
+
const keys = Object.keys(glob);
|
|
193
|
+
const result = {};
|
|
194
|
+
await Promise.all(imports.map(async (imp) => {
|
|
195
|
+
const resolved = resolveModulePath(imp.source, baseUrl, keys);
|
|
196
|
+
if (!resolved || !glob[resolved])
|
|
197
|
+
return;
|
|
198
|
+
// Avoid loading the same module twice
|
|
199
|
+
if (result[resolved])
|
|
200
|
+
return;
|
|
201
|
+
result[resolved] = await glob[resolved]();
|
|
202
|
+
}));
|
|
203
|
+
return result;
|
|
204
|
+
}
|
|
78
205
|
const mdxProcessor = remark()
|
|
79
206
|
.use(remarkMdx)
|
|
80
207
|
.use(remarkFrontmatter, ['yaml', 'toml'])
|
package/dist/parse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAExC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,SAAS,MAAM,YAAY,CAAA;AAClC,OAAO,SAAS,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAEpF,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,CAAA;
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,OAAO,iBAAiB,MAAM,oBAAoB,CAAA;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAExC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAC/B,OAAO,SAAS,MAAM,YAAY,CAAA;AAClC,OAAO,SAAS,MAAM,YAAY,CAAA;AAClC,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAA;AAEpF,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,CAAA;AAkBnD;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,GAAS;IACpC,MAAM,OAAO,GAAgB,EAAE,CAAA;IAE/B,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;YAAE,SAAQ;QACtC,MAAM,MAAM,GAAI,IAAY,CAAC,IAAI,EAAE,MAAM,CAAA;QACzC,IAAI,CAAC,MAAM;YAAE,SAAQ;QAErB,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;YAClC,IAAI,SAAS,CAAC,IAAI,KAAK,mBAAmB;gBAAE,SAAQ;YACpD,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,CAAA;YACtC,IAAI,OAAO,MAAM,KAAK,QAAQ;gBAAE,SAAQ;YAExC,MAAM,UAAU,GAAyB,EAAE,CAAA;YAC3C,KAAK,MAAM,IAAI,IAAI,SAAS,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;gBAC5C,IAAI,IAAI,CAAC,IAAI,KAAK,wBAAwB,EAAE,CAAC;oBACzC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,CAAA;gBACrF,CAAC;qBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;oBACzC,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,YAAY;wBACpD,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI;wBACpB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;oBACjC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;gBACtF,CAAC;qBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,0BAA0B,EAAE,CAAC;oBAClD,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;gBACjF,CAAC;YACL,CAAC;YAED,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAA;YACxC,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAA;AAClB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACjC,MAAM,IAAI,GAAG,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,GAAW,CAAA;AAChC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,oBAAoB;IAChC,OAAO,UAAU,IAAU;QACvB,KAAK,CAAC,IAAI,EAAE,UAAU,IAAI,EAAE,KAAK,EAAE,MAAM;YACrC,IAAI,MAAM,GAAG,CAAC,CAAC,CAAA;YACf,IAAI,GAAG,GAAG,IAAI,CAAA;YACd,IAAI,SAAS,GAAG,KAAK,CAAA;YAErB,IACI,MAAM;gBACN,OAAO,KAAK,KAAK,QAAQ;gBACzB,IAAI,CAAC,IAAI,KAAK,WAAW,EAC3B,CAAC;gBACC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;gBAE9B,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;oBAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;oBAE9B,IACI,KAAK,CAAC,IAAI,KAAK,mBAAmB;wBAClC,KAAK,CAAC,IAAI,KAAK,mBAAmB,EACpC,CAAC;wBACC,SAAS,GAAG,IAAI,CAAA;oBACpB,CAAC;yBAAM,IACH,KAAK,CAAC,IAAI,KAAK,MAAM;wBACrB,kBAAkB,CAAC,KAAK,CAAC,KAAK,EAAE;4BAC5B,KAAK,EAAE,MAAM;4BACb,IAAI,EAAE,IAAI;yBACb,CAAC,KAAK,EAAE,EACX,CAAC;wBACC,SAAS;oBACb,CAAC;yBAAM,CAAC;wBACJ,GAAG,GAAG,KAAK,CAAA;wBACX,MAAK;oBACT,CAAC;gBACL,CAAC;gBAED,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;oBACnB,MAAM,GAAG,CAAC,CAAC,CAAA;oBAEX,MAAM,WAAW,GAAkB,EAAE,CAAA;oBAErC,OAAO,EAAE,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC;wBAChC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAA;wBAE9B,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;4BACrC,wEAAwE;4BACxE,KAAK,CAAC,IAAI,GAAG,mBAAmB,CAAA;wBACpC,CAAC;wBAED,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;4BACrC,wEAAwE;4BACxE,KAAK,CAAC,IAAI,GAAG,mBAAmB,CAAA;wBACpC,CAAC;wBAED,IACI,KAAK,CAAC,IAAI,KAAK,MAAM;4BACrB,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAC1C,CAAC;4BACC,SAAS;wBACb,CAAC;6BAAM,CAAC;4BACJ,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;wBAC3B,CAAC;oBACL,CAAC;oBAED,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,WAAW,CAAC,CAAA;oBAChD,OAAO,KAAK,CAAA;gBAChB,CAAC;YACL,CAAC;QACL,CAAC,CAAC,CAAA;IACN,CAAC,CAAA;AACL,CAAC;AAED,4EAA4E;AAE5E,sEAAsE;AACtE,MAAM,kBAAkB,GAAG;IACvB,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK;IAC/C,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW;CACvD,CAAA;AAED;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC7B,MAAc,EACd,OAAe,EACf,UAAoB;IAEpB,IAAI,UAAkB,CAAA;IAEtB,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,sEAAsE;QACtE,UAAU,GAAG,GAAG,GAAG,MAAM,CAAA;IAC7B,CAAC;SAAM,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC7D,wCAAwC;QACxC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACzC,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAA,CAAC,wBAAwB;QACtD,UAAU,GAAG,MAAM,CAAA;IACvB,CAAC;SAAM,CAAC;QACJ,+DAA+D;QAC/D,OAAO,SAAS,CAAA;IACpB,CAAC;IAED,qBAAqB;IACrB,KAAK,MAAM,GAAG,IAAI,kBAAkB,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,UAAU,GAAG,GAAG,CAAA;QAClC,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YACjC,OAAO,SAAS,CAAA;QACpB,CAAC;IACL,CAAC;IAED,OAAO,SAAS,CAAA;AACpB,CAAC;AAED;;kEAEkE;AAClE,SAAS,SAAS,CAAC,IAAY,EAAE,QAAgB;IAC7C,iCAAiC;IACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IACzF,MAAM,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;IAEzE,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC1B,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAChB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAA,CAAC,qBAAqB;YAClE,SAAS,CAAC,GAAG,EAAE,CAAA;QACnB,CAAC;aAAM,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACtB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACxB,CAAC;IACL,CAAC;IAED,OAAO,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;AACrC,CAAC;AAKD;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,EACjC,IAAI,EACJ,KAAK,EACL,OAAO,GAKV;IACG,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;IACrC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEnC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC9B,MAAM,MAAM,GAAiB,EAAE,CAAA;IAE/B,MAAM,OAAO,CAAC,GAAG,CACb,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;QAC7D,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,OAAM;QACxC,sCAAsC;QACtC,IAAI,MAAM,CAAC,QAAQ,CAAC;YAAE,OAAM;QAC5B,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAA;IAC7C,CAAC,CAAC,CACL,CAAA;IAED,OAAO,MAAM,CAAA;AACjB,CAAC;AAED,MAAM,YAAY,GAAG,MAAM,EAAE;KACxB,GAAG,CAAC,SAAS,CAAC;KACd,GAAG,CAAC,iBAAiB,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;KACxC,GAAG,CAAC,SAAS,CAAC;KACd,GAAG,CAAC,oBAAoB,CAAC;KACzB,GAAG,CAAC,GAAG,EAAE;IACN,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;QAClB,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,IAAI,CAAA;IACxB,CAAC,CAAA;AACL,CAAC,CAAC,CAAA"}
|
package/dist/safe-mdx.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import type { JSXElement } from 'estree-jsx';
|
|
|
4
4
|
import type { Node, Parent, Root, RootContent } from 'mdast';
|
|
5
5
|
import type { MdxJsxFlowElement, MdxJsxTextElement } from 'mdast-util-mdx-jsx';
|
|
6
6
|
import { ReactNode } from 'react';
|
|
7
|
+
import { type EagerModules } from './parse.js';
|
|
7
8
|
import { nativeTags } from './html/valid-html-elements.js';
|
|
8
9
|
export type MyRootContent = RootContent | Root;
|
|
9
10
|
declare module 'mdast' {
|
|
@@ -31,6 +32,13 @@ export declare const SafeMdxRenderer: React.NamedExoticComponent<{
|
|
|
31
32
|
createElement?: CreateElementFunction;
|
|
32
33
|
allowClientEsmImports?: boolean;
|
|
33
34
|
addMarkdownLineNumbers?: boolean;
|
|
35
|
+
/** Pre-resolved modules keyed by file path (e.g. from `import.meta.glob`).
|
|
36
|
+
* When MDX contains `import { Card } from './card'`, the import source is
|
|
37
|
+
* resolved against these keys using `baseUrl` for relative paths. */
|
|
38
|
+
modules?: EagerModules;
|
|
39
|
+
/** Directory of the current MDX file, used to resolve relative import
|
|
40
|
+
* sources against `modules` keys. E.g. `'./pages/getting-started/'` */
|
|
41
|
+
baseUrl?: string;
|
|
34
42
|
}>;
|
|
35
43
|
export declare class MdastToJsx {
|
|
36
44
|
mdast: MyRootContent;
|
|
@@ -44,7 +52,9 @@ export declare class MdastToJsx {
|
|
|
44
52
|
esmImports: Map<string, string>;
|
|
45
53
|
allowClientEsmImports: boolean;
|
|
46
54
|
addMarkdownLineNumbers: boolean;
|
|
47
|
-
|
|
55
|
+
modules?: EagerModules;
|
|
56
|
+
baseUrl?: string;
|
|
57
|
+
constructor({ markdown: code, mdast, components, renderNode, componentPropsSchema, createElement, allowClientEsmImports, addMarkdownLineNumbers, modules, baseUrl, }: {
|
|
48
58
|
markdown?: string;
|
|
49
59
|
mdast: MyRootContent;
|
|
50
60
|
components?: ComponentsMap;
|
|
@@ -53,7 +63,15 @@ export declare class MdastToJsx {
|
|
|
53
63
|
createElement?: CreateElementFunction;
|
|
54
64
|
allowClientEsmImports?: boolean;
|
|
55
65
|
addMarkdownLineNumbers?: boolean;
|
|
66
|
+
modules?: EagerModules;
|
|
67
|
+
baseUrl?: string;
|
|
56
68
|
});
|
|
69
|
+
/**
|
|
70
|
+
* Resolve import declarations from an mdxjsEsm node against `this.modules`.
|
|
71
|
+
* Resolved components are added directly to `this.c` (the component map)
|
|
72
|
+
* so the existing `accessWithDot` lookup finds them.
|
|
73
|
+
*/
|
|
74
|
+
resolveImportsFromModules(node: MyRootContent): void;
|
|
57
75
|
addLineNumberToProps(props: Record<string, any> | undefined, node: MyRootContent): Record<string, any>;
|
|
58
76
|
validateComponentProps(componentName: string, props: Record<string, any>, line?: number): void;
|
|
59
77
|
mapMdastChildren(node: any): any;
|
package/dist/safe-mdx.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-mdx.d.ts","sourceRoot":"","sources":["../src/safe-mdx.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuB,MAAM,OAAO,CAAA;AAE3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAE9E,OAAO,EAAY,SAAS,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"safe-mdx.d.ts","sourceRoot":"","sources":["../src/safe-mdx.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuB,MAAM,OAAO,CAAA;AAE3C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAE5C,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,OAAO,CAAA;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAE9E,OAAO,EAAY,SAAS,EAAE,MAAM,OAAO,CAAA;AAG3C,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,YAAY,CAAA;AAEjE,OAAO,EAAqB,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAE7E,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,IAAI,CAAA;AAE9C,OAAO,QAAQ,OAAO,CAAC;IACnB,UAAiB,WAAW;QACxB,EAAE,CAAC,EAAE,MAAM,CAAA;KACd;IACD,UAAiB,IAAI;QACjB,WAAW,CAAC,EAAE,WAAW,CAAA;KAC5B;CACJ;AAED,MAAM,MAAM,UAAU,GAAG,CACrB,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,SAAS,KAC5C,SAAS,GAAG,SAAS,CAAA;AAE1B,MAAM,WAAW,YAAY;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,UAAU,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAA;AAEnE,MAAM,MAAM,qBAAqB,GAAG,CAChC,IAAI,EAAE,GAAG,EACT,KAAK,CAAC,EAAE,GAAG,EACX,GAAG,QAAQ,EAAE,SAAS,EAAE,KACvB,SAAS,CAAA;AAEd,eAAO,MAAM,eAAe;iBAYX,aAAa;eACf,MAAM;YACT,aAAa;iBACR,UAAU;2BACA,oBAAoB;oBAC3B,qBAAqB;4BACb,OAAO;6BACN,OAAO;IAChC;;0EAEsE;cAC5D,YAAY;IACtB;4EACwE;cAC9D,MAAM;EAgBlB,CAAA;AAEF,qBAAa,UAAU;IACnB,KAAK,EAAE,aAAa,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAK;IACnB,CAAC,EAAE,aAAa,CAAA;IAChB,MAAM,EAAE,YAAY,EAAE,CAAK;IAC3B,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;IAC3C,aAAa,EAAE,qBAAqB,CAAA;IACpC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAY;IAC3C,qBAAqB,EAAE,OAAO,CAAA;IAC9B,sBAAsB,EAAE,OAAO,CAAA;IAC/B,OAAO,CAAC,EAAE,YAAY,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;gBAEJ,EACR,QAAQ,EAAE,IAAS,EACnB,KAAK,EACL,UAAgC,EAChC,UAAU,EACV,oBAAoB,EACpB,aAAmC,EACnC,qBAA6B,EAC7B,sBAA8B,EAC9B,OAAO,EACP,OAAO,GACV,EAAE;QACC,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,KAAK,EAAE,aAAa,CAAA;QACpB,UAAU,CAAC,EAAE,aAAa,CAAA;QAC1B,UAAU,CAAC,EAAE,CACT,IAAI,EAAE,aAAa,EACnB,SAAS,EAAE,CAAC,IAAI,EAAE,aAAa,KAAK,SAAS,KAC5C,SAAS,GAAG,SAAS,CAAA;QAC1B,oBAAoB,CAAC,EAAE,oBAAoB,CAAA;QAC3C,aAAa,CAAC,EAAE,qBAAqB,CAAA;QACrC,qBAAqB,CAAC,EAAE,OAAO,CAAA;QAC/B,sBAAsB,CAAC,EAAE,OAAO,CAAA;QAChC,OAAO,CAAC,EAAE,YAAY,CAAA;QACtB,OAAO,CAAC,EAAE,MAAM,CAAA;KACnB;IA6BD;;;;OAIG;IACH,yBAAyB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAiCpD,oBAAoB,CAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,SAAS,EACtC,IAAI,EAAE,aAAa,GACpB,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAetB,sBAAsB,CAClB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,IAAI,CAAC,EAAE,MAAM,GACd,IAAI;IA4BP,gBAAgB,CAAC,IAAI,EAAE,GAAG;IAiB1B,cAAc,CAAC,IAAI,EAAE,GAAG;IAiBxB,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS;IAyE9C,mBAAmB,CACf,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,EACrC,IAAI,CAAC,EAAE,MAAM,GACd,SAAS;IA6GZ,WAAW,CACP,IAAI,EAAE,iBAAiB,GAAG,iBAAiB,EAC3C,OAAO,GAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAoB;IA4JxD,GAAG;IAQH,gBAAgB,CAAC,IAAI,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,GAAG,SAAS;CA4YvE;AAcD,wBAAgB,QAAQ,CACpB,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,EAAE,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,KAAK,GAAG,SAiBpC;AAUD,KAAK,aAAa,GAAG;KAAG,CAAC,IAAI,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG;CAAE,GAAG;IAChE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;CACrB,CAAA"}
|
package/dist/safe-mdx.js
CHANGED
|
@@ -3,9 +3,10 @@ import Evaluate from 'eval-estree-expression';
|
|
|
3
3
|
import { Fragment } from 'react';
|
|
4
4
|
import { DynamicEsmComponent } from 'safe-mdx/client';
|
|
5
5
|
import { extractComponentInfo, parseEsmImports } from './esm-parser.js';
|
|
6
|
+
import { resolveModulePath } from './parse.js';
|
|
6
7
|
import { htmlToMdxAst } from './html/html-to-mdx-ast.js';
|
|
7
8
|
import { validHtmlElements, nativeTags } from './html/valid-html-elements.js';
|
|
8
|
-
export const SafeMdxRenderer = React.memo(function SafeMdxRenderer({ components, markdown = '', mdast = null, renderNode, componentPropsSchema, createElement, allowClientEsmImports = false, addMarkdownLineNumbers = false, }) {
|
|
9
|
+
export const SafeMdxRenderer = React.memo(function SafeMdxRenderer({ components, markdown = '', mdast = null, renderNode, componentPropsSchema, createElement, allowClientEsmImports = false, addMarkdownLineNumbers = false, modules, baseUrl, }) {
|
|
9
10
|
const visitor = new MdastToJsx({
|
|
10
11
|
markdown,
|
|
11
12
|
mdast,
|
|
@@ -15,6 +16,8 @@ export const SafeMdxRenderer = React.memo(function SafeMdxRenderer({ components,
|
|
|
15
16
|
createElement,
|
|
16
17
|
allowClientEsmImports,
|
|
17
18
|
addMarkdownLineNumbers,
|
|
19
|
+
modules,
|
|
20
|
+
baseUrl,
|
|
18
21
|
});
|
|
19
22
|
const result = visitor.run();
|
|
20
23
|
return result;
|
|
@@ -31,7 +34,9 @@ export class MdastToJsx {
|
|
|
31
34
|
esmImports = new Map();
|
|
32
35
|
allowClientEsmImports;
|
|
33
36
|
addMarkdownLineNumbers;
|
|
34
|
-
|
|
37
|
+
modules;
|
|
38
|
+
baseUrl;
|
|
39
|
+
constructor({ markdown: code = '', mdast, components = {}, renderNode, componentPropsSchema, createElement = React.createElement, allowClientEsmImports = false, addMarkdownLineNumbers = false, modules, baseUrl, }) {
|
|
35
40
|
this.str = code;
|
|
36
41
|
this.mdast = mdast;
|
|
37
42
|
this.renderNode = renderNode;
|
|
@@ -39,6 +44,8 @@ export class MdastToJsx {
|
|
|
39
44
|
this.createElement = createElement;
|
|
40
45
|
this.allowClientEsmImports = allowClientEsmImports;
|
|
41
46
|
this.addMarkdownLineNumbers = addMarkdownLineNumbers;
|
|
47
|
+
this.modules = modules;
|
|
48
|
+
this.baseUrl = baseUrl;
|
|
42
49
|
this.c = {
|
|
43
50
|
...Object.fromEntries(nativeTags.map((tag) => {
|
|
44
51
|
return [tag, tag];
|
|
@@ -46,6 +53,46 @@ export class MdastToJsx {
|
|
|
46
53
|
...components,
|
|
47
54
|
};
|
|
48
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Resolve import declarations from an mdxjsEsm node against `this.modules`.
|
|
58
|
+
* Resolved components are added directly to `this.c` (the component map)
|
|
59
|
+
* so the existing `accessWithDot` lookup finds them.
|
|
60
|
+
*/
|
|
61
|
+
resolveImportsFromModules(node) {
|
|
62
|
+
const estree = node.data?.estree;
|
|
63
|
+
if (!estree)
|
|
64
|
+
return;
|
|
65
|
+
const moduleKeys = Object.keys(this.modules);
|
|
66
|
+
for (const statement of estree.body) {
|
|
67
|
+
if (statement.type !== 'ImportDeclaration')
|
|
68
|
+
continue;
|
|
69
|
+
const source = statement.source?.value;
|
|
70
|
+
if (typeof source !== 'string')
|
|
71
|
+
continue;
|
|
72
|
+
const resolved = resolveModulePath(source, this.baseUrl || './', moduleKeys);
|
|
73
|
+
if (!resolved)
|
|
74
|
+
continue;
|
|
75
|
+
const mod = this.modules[resolved];
|
|
76
|
+
if (!mod)
|
|
77
|
+
continue;
|
|
78
|
+
for (const spec of statement.specifiers ?? []) {
|
|
79
|
+
if (spec.type === 'ImportDefaultSpecifier') {
|
|
80
|
+
this.c[spec.local.name] = mod.default ?? mod;
|
|
81
|
+
}
|
|
82
|
+
else if (spec.type === 'ImportSpecifier') {
|
|
83
|
+
const importedName = spec.imported.type === 'Identifier'
|
|
84
|
+
? spec.imported.name
|
|
85
|
+
: String(spec.imported.value);
|
|
86
|
+
this.c[spec.local.name] = mod[importedName];
|
|
87
|
+
}
|
|
88
|
+
else if (spec.type === 'ImportNamespaceSpecifier') {
|
|
89
|
+
// Namespace import: import * as UI from '...'
|
|
90
|
+
// Supports <UI.Card> via accessWithDot
|
|
91
|
+
this.c[spec.local.name] = mod;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
49
96
|
addLineNumberToProps(props, node) {
|
|
50
97
|
if (!this.addMarkdownLineNumbers) {
|
|
51
98
|
return props || {};
|
|
@@ -410,7 +457,11 @@ export class MdastToJsx {
|
|
|
410
457
|
}
|
|
411
458
|
switch (node.type) {
|
|
412
459
|
case 'mdxjsEsm': {
|
|
413
|
-
//
|
|
460
|
+
// Resolve imports from pre-loaded modules (server-side)
|
|
461
|
+
if (this.modules) {
|
|
462
|
+
this.resolveImportsFromModules(node);
|
|
463
|
+
}
|
|
464
|
+
// Parse ESM imports for client-side dynamic loading (only if allowed)
|
|
414
465
|
if (this.allowClientEsmImports) {
|
|
415
466
|
const parsedImports = parseEsmImports(node, (err) => this.errors.push(err));
|
|
416
467
|
parsedImports.forEach((value, key) => {
|