safe-mdx 1.3.1 → 1.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/README.md +14 -14
  2. package/dist/assets/HtmlToJsxConverter-Ds0bTjpw.js +24 -0
  3. package/dist/assets/_commonjsHelpers-CqkleIqs.js +1 -0
  4. package/dist/assets/index-B5fPOjPt.css +1 -0
  5. package/dist/assets/index-B7ATSoRE.js +9 -0
  6. package/dist/assets/index-BwZ2FTRd.js +146 -0
  7. package/dist/assets/index-R1UqLMGJ.js +1 -0
  8. package/dist/assets/index-c0qeY2gs.js +9 -0
  9. package/dist/assets/jsx-runtime-BhZZLbvw.js +9 -0
  10. package/dist/assets/jsx-runtime-NArryeSM.js +1 -0
  11. package/dist/assets/react-Ca6JzGpx.js +1 -0
  12. package/dist/assets/react-dom-BYRHYqYl.js +1 -0
  13. package/dist/dynamic-esm-component.d.ts.map +1 -1
  14. package/dist/dynamic-esm-component.js +16 -1
  15. package/dist/dynamic-esm-component.js.map +1 -1
  16. package/dist/html/attributes.d.ts +19 -0
  17. package/dist/html/attributes.d.ts.map +1 -0
  18. package/dist/html/attributes.js +289 -0
  19. package/dist/html/attributes.js.map +1 -0
  20. package/dist/html/convert-attributes.d.ts +6 -0
  21. package/dist/html/convert-attributes.d.ts.map +1 -0
  22. package/dist/html/convert-attributes.js +43 -0
  23. package/dist/html/convert-attributes.js.map +1 -0
  24. package/dist/html/domparser-browser.d.ts +4 -0
  25. package/dist/html/domparser-browser.d.ts.map +1 -0
  26. package/dist/html/domparser-browser.js +7 -0
  27. package/dist/html/domparser-browser.js.map +1 -0
  28. package/dist/html/domparser.d.ts +2 -0
  29. package/dist/html/domparser.d.ts.map +1 -0
  30. package/dist/html/domparser.js +5 -0
  31. package/dist/html/domparser.js.map +1 -0
  32. package/dist/html/html-to-mdx-ast.d.ts +23 -0
  33. package/dist/html/html-to-mdx-ast.d.ts.map +1 -0
  34. package/dist/html/html-to-mdx-ast.js +227 -0
  35. package/dist/html/html-to-mdx-ast.js.map +1 -0
  36. package/dist/html/html-to-mdx-ast.test.d.ts +2 -0
  37. package/dist/html/html-to-mdx-ast.test.d.ts.map +1 -0
  38. package/dist/html/html-to-mdx-ast.test.js +324 -0
  39. package/dist/html/html-to-mdx-ast.test.js.map +1 -0
  40. package/dist/html/remark-mdx-jsx-normalize.d.ts +10 -0
  41. package/dist/html/remark-mdx-jsx-normalize.d.ts.map +1 -0
  42. package/dist/html/remark-mdx-jsx-normalize.js +117 -0
  43. package/dist/html/remark-mdx-jsx-normalize.js.map +1 -0
  44. package/dist/html/valid-html-elements.d.ts +10 -0
  45. package/dist/html/valid-html-elements.d.ts.map +1 -0
  46. package/dist/html/valid-html-elements.js +50 -0
  47. package/dist/html/valid-html-elements.js.map +1 -0
  48. package/dist/index.html +19 -0
  49. package/dist/parse.d.ts +2 -0
  50. package/dist/parse.d.ts.map +1 -1
  51. package/dist/parse.js +2 -0
  52. package/dist/parse.js.map +1 -1
  53. package/dist/safe-mdx.d.ts +2 -2
  54. package/dist/safe-mdx.d.ts.map +1 -1
  55. package/dist/safe-mdx.js +39 -77
  56. package/dist/safe-mdx.js.map +1 -1
  57. package/dist/safe-mdx.test.js +161 -8
  58. package/dist/safe-mdx.test.js.map +1 -1
  59. package/package.json +27 -6
  60. package/src/dynamic-esm-component.tsx +40 -10
  61. package/src/html/README +17 -0
  62. package/src/html/attributes.ts +297 -0
  63. package/src/html/convert-attributes.ts +59 -0
  64. package/src/html/domparser-browser.ts +6 -0
  65. package/src/html/domparser.ts +5 -0
  66. package/src/html/html-to-mdx-ast.test.ts +365 -0
  67. package/src/html/html-to-mdx-ast.ts +304 -0
  68. package/src/html/remark-mdx-jsx-normalize.ts +128 -0
  69. package/src/html/valid-html-elements.ts +65 -0
  70. package/src/parse.ts +3 -0
  71. package/src/safe-mdx.test.tsx +178 -12
  72. package/src/safe-mdx.tsx +61 -93
  73. package/dist/HtmlToJsxConverter.d.ts +0 -10
  74. package/dist/HtmlToJsxConverter.d.ts.map +0 -1
  75. package/dist/HtmlToJsxConverter.js +0 -22
  76. package/dist/HtmlToJsxConverter.js.map +0 -1
  77. package/dist/plugins.d.ts +0 -12
  78. package/dist/plugins.d.ts.map +0 -1
  79. package/dist/plugins.js +0 -68
  80. package/dist/plugins.js.map +0 -1
  81. package/src/HtmlToJsxConverter.tsx +0 -37
@@ -0,0 +1,227 @@
1
+ import { convertAttributeNameToJSX } from './convert-attributes.js';
2
+ import { parseHTML } from './domparser.js';
3
+ // Re-export the normalize plugin
4
+ export { default as remarkMdxJsxNormalize } from './remark-mdx-jsx-normalize.js';
5
+ // Type guard functions for DOM nodes
6
+ function isCommentNode(node) {
7
+ return node.nodeType === 8; // Node.COMMENT_NODE
8
+ }
9
+ function isTextNode(node) {
10
+ return node.nodeType === 3; // Node.TEXT_NODE
11
+ }
12
+ function isElementNode(node) {
13
+ return node.nodeType === 1; // Node.ELEMENT_NODE
14
+ }
15
+ // Default tag name converter (no transformation)
16
+ function defaultConvertTagName({ tagName }) {
17
+ return tagName.toLowerCase();
18
+ }
19
+ // Default attribute value converter (no transformation)
20
+ function defaultConvertAttributeValue({ value, }) {
21
+ return value;
22
+ }
23
+ // Convert HTML attribute to MDX JSX attribute
24
+ function convertAttribute(attr, tagName, options) {
25
+ let jsxName = convertAttributeNameToJSX(attr.name);
26
+ // Apply attribute value transformation
27
+ const convertAttrValue = options?.convertAttributeValue || defaultConvertAttributeValue;
28
+ let value = convertAttrValue({
29
+ name: attr.name,
30
+ value: attr.value,
31
+ tagName,
32
+ });
33
+ // Handle boolean attributes
34
+ if (value === '' || value === attr.name) {
35
+ return {
36
+ type: 'mdxJsxAttribute',
37
+ name: jsxName,
38
+ value: null, // boolean true
39
+ };
40
+ }
41
+ // Handle special number attributes
42
+ const numberAttrs = [
43
+ 'tabIndex',
44
+ 'cols',
45
+ 'rows',
46
+ 'size',
47
+ 'span',
48
+ 'colSpan',
49
+ 'rowSpan',
50
+ 'border',
51
+ ];
52
+ if (numberAttrs.includes(jsxName) && value && !isNaN(Number(value))) {
53
+ return {
54
+ type: 'mdxJsxAttribute',
55
+ name: jsxName,
56
+ value: {
57
+ type: 'mdxJsxAttributeValueExpression',
58
+ value: value,
59
+ data: {
60
+ estree: {
61
+ type: 'Program',
62
+ sourceType: 'module',
63
+ body: [
64
+ {
65
+ type: 'ExpressionStatement',
66
+ expression: {
67
+ type: 'Literal',
68
+ value: Number(value),
69
+ },
70
+ },
71
+ ],
72
+ },
73
+ },
74
+ },
75
+ };
76
+ }
77
+ // Handle style attribute - for now keep as string
78
+ // if (jsxName === 'style' && value.includes(':')) {
79
+ // // Could enhance to parse CSS to object
80
+ // return {
81
+ // type: 'mdxJsxAttribute',
82
+ // name: jsxName,
83
+ // value: {
84
+ // type: 'mdxJsxAttributeValueExpression',
85
+ // value: `{${JSON.stringify(parseStyleString(value))}}`,
86
+ // data: {
87
+ // estree: parseExpression(JSON.stringify(parseStyleString(value))),
88
+ // },
89
+ // },
90
+ // }
91
+ // }
92
+ // String value
93
+ return {
94
+ type: 'mdxJsxAttribute',
95
+ name: jsxName,
96
+ value: value,
97
+ };
98
+ }
99
+ // Convert DOM node to MDX AST nodes
100
+ function htmlNodeToMdxAst(node, options) {
101
+ if (isCommentNode(node)) {
102
+ // Convert comments to MDX JSX expression with comment
103
+ // For now, return as HTML node
104
+ // return {
105
+ // type: 'html',
106
+ // value: `<!-- ${node.data} -->`
107
+ // } as Html
108
+ return [];
109
+ }
110
+ if (isTextNode(node)) {
111
+ const textValue = node.textContent || '';
112
+ // If we have a textToMdast converter, use it
113
+ if (options?.textToMdast) {
114
+ try {
115
+ const result = options.textToMdast({ text: textValue });
116
+ return result;
117
+ }
118
+ catch (error) {
119
+ // Call onError callback if provided, otherwise log
120
+ if (options.onError) {
121
+ options.onError(error, textValue);
122
+ }
123
+ else {
124
+ console.error('Failed to convert text to mdast:', error);
125
+ console.error('Text content:', textValue);
126
+ }
127
+ // Fallback to simple text node
128
+ return {
129
+ type: 'text',
130
+ value: textValue,
131
+ };
132
+ }
133
+ }
134
+ // Default: return simple text node
135
+ return {
136
+ type: 'text',
137
+ value: textValue,
138
+ };
139
+ }
140
+ if (!isElementNode(node)) {
141
+ return [];
142
+ }
143
+ const convertTagNameFn = options?.convertTagName || defaultConvertTagName;
144
+ // Use localName which is always lowercase in both browser and linkedom
145
+ const componentName = convertTagNameFn({ tagName: node.localName });
146
+ // If convertTagName returns empty string, skip this element and only return its children
147
+ if (componentName === '') {
148
+ // Process children but skip the element wrapper
149
+ const children = [];
150
+ for (const child of Array.from(node.childNodes)) {
151
+ const result = htmlNodeToMdxAst(child, options);
152
+ if (Array.isArray(result)) {
153
+ children.push(...result);
154
+ }
155
+ else {
156
+ children.push(result);
157
+ }
158
+ }
159
+ return children;
160
+ }
161
+ // Convert attributes
162
+ const attributes = [];
163
+ for (const attr of Array.from(node.attributes)) {
164
+ attributes.push(convertAttribute(attr, node.tagName, options));
165
+ }
166
+ // Process children
167
+ const children = [];
168
+ for (const child of Array.from(node.childNodes)) {
169
+ const result = htmlNodeToMdxAst(child, options);
170
+ if (Array.isArray(result)) {
171
+ children.push(...result);
172
+ }
173
+ else {
174
+ children.push(result);
175
+ }
176
+ }
177
+ // Always create MdxJsxTextElement initially
178
+ // The conversion to MdxJsxFlowElement will be handled by a separate plugin
179
+ const element = {
180
+ type: 'mdxJsxTextElement',
181
+ name: componentName,
182
+ attributes,
183
+ children: children,
184
+ };
185
+ return element;
186
+ }
187
+ // Main function to parse HTML and return MDX AST
188
+ export function htmlToMdxAst(options) {
189
+ // Parse HTML with linkedom
190
+ const { document } = parseHTML(options.html.trim());
191
+ // linkedom behavior:
192
+ // - If input is a fragment (like "<div>Hello</div>"), the content becomes direct children of document
193
+ // - If input has body tag, it creates proper body element
194
+ // - We need to handle both cases
195
+ // linkedom behavior:
196
+ // - When parsing fragments, content becomes direct children of document
197
+ // - Accessing document.body on fragments auto-creates HEAD and BODY as children
198
+ // - We must avoid accessing document.body to prevent this
199
+ // Just use document's direct children and filter for relevant nodes
200
+ const childNodes = Array.from(document.childNodes).filter((node) => node.nodeType === 1 || // Element nodes
201
+ node.nodeType === 3 || // Text nodes
202
+ node.nodeType === 8);
203
+ if (childNodes.length === 0) {
204
+ return [];
205
+ }
206
+ if (childNodes.length === 1) {
207
+ return htmlNodeToMdxAst(childNodes[0], options);
208
+ }
209
+ // Multiple nodes - return as array
210
+ const results = [];
211
+ for (const node of childNodes) {
212
+ const result = htmlNodeToMdxAst(node, options);
213
+ if (Array.isArray(result)) {
214
+ results.push(...result);
215
+ }
216
+ else {
217
+ results.push(result);
218
+ }
219
+ }
220
+ return results;
221
+ }
222
+ // Export a wrapper that always returns an array for consistency
223
+ export function parseHtmlToMdxAst(options) {
224
+ const result = htmlToMdxAst(options);
225
+ return Array.isArray(result) ? result : [result];
226
+ }
227
+ //# sourceMappingURL=html-to-mdx-ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-to-mdx-ast.js","sourceRoot":"","sources":["../../src/html/html-to-mdx-ast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=html-to-mdx-ast.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-to-mdx-ast.test.d.ts","sourceRoot":"","sources":["../../src/html/html-to-mdx-ast.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,324 @@
1
+ import { test, expect, describe } from 'vitest';
2
+ import React from 'react';
3
+ import { renderToStaticMarkup } from 'react-dom/server';
4
+ import { parseHtmlToMdxAst, } from './html-to-mdx-ast.js';
5
+ import { unified } from 'unified';
6
+ import remarkMdx from 'remark-mdx';
7
+ import remarkStringify from 'remark-stringify';
8
+ import remarkParse from 'remark-parse';
9
+ import { mdxParse } from '../parse.js';
10
+ import { MdastToJsx } from '../safe-mdx.js';
11
+ // Default components for testing
12
+ const components = {
13
+ Heading({ level, children, ...props }) {
14
+ return React.createElement('h1', props, children);
15
+ },
16
+ Cards({ level, children, ...props }) {
17
+ return React.createElement('div', props, children);
18
+ },
19
+ };
20
+ // Helper to convert HTML to MDX string and rendered HTML
21
+ async function htmlToMdxString({ html, withProcessor = false, onError, convertTagName, convertAttributeValue, }) {
22
+ // If withProcessor is true, create a textToMdast that parses markdown
23
+ const textToMdast = withProcessor
24
+ ? ({ text }) => {
25
+ const markdownProcessor = unified()
26
+ .use(remarkParse)
27
+ .use(remarkMdx);
28
+ const mdast = markdownProcessor.parse(text);
29
+ markdownProcessor.runSync(mdast);
30
+ // Return the children of the root node
31
+ return mdast.children || [];
32
+ }
33
+ : undefined;
34
+ const mdxAst = parseHtmlToMdxAst({
35
+ html,
36
+ textToMdast,
37
+ onError,
38
+ convertTagName,
39
+ convertAttributeValue,
40
+ });
41
+ // Generate MDX string
42
+ const processor = unified().use(remarkMdx).use(remarkStringify, {
43
+ // bullet: '-',
44
+ // fence: '`',
45
+ // fences: true
46
+ });
47
+ // Create a root node with the content
48
+ const root = {
49
+ type: 'root',
50
+ children: mdxAst,
51
+ };
52
+ const mdx = processor.stringify(root);
53
+ // Generate HTML using MdastToJsx like in safe-mdx.test.tsx
54
+ // First parse the MDX to get the full AST
55
+ const mdast = mdxParse(mdx);
56
+ const visitor = new MdastToJsx({ markdown: mdx, mdast, components });
57
+ const jsx = visitor.run();
58
+ const renderedHtml = renderToStaticMarkup(jsx);
59
+ return { mdx, html: renderedHtml };
60
+ }
61
+ describe('parseHtmlToMdxAst', () => {
62
+ test('parses simple HTML element', () => {
63
+ const result = parseHtmlToMdxAst({ html: '<div>Hello</div>' });
64
+ expect(result).toMatchInlineSnapshot(`
65
+ [
66
+ {
67
+ "attributes": [],
68
+ "children": [
69
+ {
70
+ "type": "text",
71
+ "value": "Hello",
72
+ },
73
+ ],
74
+ "name": "div",
75
+ "type": "mdxJsxTextElement",
76
+ },
77
+ ]
78
+ `);
79
+ });
80
+ test('filters out non-HTML elements when convertTagName returns empty string', () => {
81
+ const result = parseHtmlToMdxAst({
82
+ html: '<custom-element>Hello <span>world</span></custom-element>',
83
+ convertTagName: ({ tagName }) => {
84
+ // Only keep span, filter out custom-element
85
+ if (tagName === 'span')
86
+ return 'span';
87
+ return tagName;
88
+ },
89
+ });
90
+ expect(result).toMatchInlineSnapshot(`
91
+ [
92
+ {
93
+ "attributes": [],
94
+ "children": [
95
+ {
96
+ "type": "text",
97
+ "value": "Hello ",
98
+ },
99
+ {
100
+ "attributes": [],
101
+ "children": [
102
+ {
103
+ "type": "text",
104
+ "value": "world",
105
+ },
106
+ ],
107
+ "name": "span",
108
+ "type": "mdxJsxTextElement",
109
+ },
110
+ ],
111
+ "name": "custom-element",
112
+ "type": "mdxJsxTextElement",
113
+ },
114
+ ]
115
+ `);
116
+ });
117
+ test('handles self-closing tags', () => {
118
+ const result = parseHtmlToMdxAst({
119
+ html: '<img src="https://example.com/img.jpg" />',
120
+ });
121
+ expect(result).toMatchInlineSnapshot(`
122
+ [
123
+ {
124
+ "attributes": [
125
+ {
126
+ "name": "src",
127
+ "type": "mdxJsxAttribute",
128
+ "value": "https://example.com/img.jpg",
129
+ },
130
+ ],
131
+ "children": [],
132
+ "name": "img",
133
+ "type": "mdxJsxTextElement",
134
+ },
135
+ ]
136
+ `);
137
+ });
138
+ test('handles span with attributes', () => {
139
+ const result = parseHtmlToMdxAst({
140
+ html: '<span color="blue">colored text</span>',
141
+ });
142
+ expect(result).toMatchInlineSnapshot(`
143
+ [
144
+ {
145
+ "attributes": [
146
+ {
147
+ "name": "color",
148
+ "type": "mdxJsxAttribute",
149
+ "value": "blue",
150
+ },
151
+ ],
152
+ "children": [
153
+ {
154
+ "type": "text",
155
+ "value": "colored text",
156
+ },
157
+ ],
158
+ "name": "span",
159
+ "type": "mdxJsxTextElement",
160
+ },
161
+ ]
162
+ `);
163
+ });
164
+ test('handles mixed content', () => {
165
+ const result = parseHtmlToMdxAst({
166
+ html: 'Some text <strong>bold</strong> more text',
167
+ });
168
+ expect(result).toMatchInlineSnapshot(`
169
+ [
170
+ {
171
+ "type": "text",
172
+ "value": "Some text ",
173
+ },
174
+ {
175
+ "attributes": [],
176
+ "children": [
177
+ {
178
+ "type": "text",
179
+ "value": "bold",
180
+ },
181
+ ],
182
+ "name": "strong",
183
+ "type": "mdxJsxTextElement",
184
+ },
185
+ {
186
+ "type": "text",
187
+ "value": " more text",
188
+ },
189
+ ]
190
+ `);
191
+ });
192
+ test('handles comments', () => {
193
+ const result = parseHtmlToMdxAst({ html: '<!-- This is a comment -->' });
194
+ expect(result).toMatchInlineSnapshot(`[]`);
195
+ });
196
+ test('handles table with attributes', () => {
197
+ const result = parseHtmlToMdxAst({
198
+ html: '<table class="data-table"><tr><td>Cell</td></tr></table>',
199
+ });
200
+ expect(result).toMatchInlineSnapshot(`
201
+ [
202
+ {
203
+ "attributes": [
204
+ {
205
+ "name": "className",
206
+ "type": "mdxJsxAttribute",
207
+ "value": "data-table",
208
+ },
209
+ ],
210
+ "children": [
211
+ {
212
+ "attributes": [],
213
+ "children": [
214
+ {
215
+ "attributes": [],
216
+ "children": [
217
+ {
218
+ "type": "text",
219
+ "value": "Cell",
220
+ },
221
+ ],
222
+ "name": "td",
223
+ "type": "mdxJsxTextElement",
224
+ },
225
+ ],
226
+ "name": "tr",
227
+ "type": "mdxJsxTextElement",
228
+ },
229
+ ],
230
+ "name": "table",
231
+ "type": "mdxJsxTextElement",
232
+ },
233
+ ]
234
+ `);
235
+ });
236
+ });
237
+ describe('parseHtmlToMdxAst with markdown processor', () => {
238
+ test('parses markdown inside HTML tags', async () => {
239
+ const htmlToConvert = '<div>This is **bold** text</div>';
240
+ const result = await htmlToMdxString({
241
+ html: htmlToConvert,
242
+ withProcessor: true,
243
+ onError: (e) => {
244
+ throw e;
245
+ },
246
+ });
247
+ expect(result).toMatchInlineSnapshot(`
248
+ {
249
+ "html": "<div>This is <strong>bold</strong> text</div>",
250
+ "mdx": "<div>This is **bold** text</div>
251
+ ",
252
+ }
253
+ `);
254
+ });
255
+ test('handles mixed markdown and HTML inside tags', async () => {
256
+ const htmlToConvert = '<div>**Bold text:** <a href="#">link</a></div>';
257
+ const result = await htmlToMdxString({
258
+ html: htmlToConvert,
259
+ withProcessor: true,
260
+ onError: (e) => {
261
+ throw e;
262
+ },
263
+ });
264
+ expect(result).toMatchInlineSnapshot(`
265
+ {
266
+ "html": "<div><strong>Bold text:</strong><a href="#">link</a></div>",
267
+ "mdx": "<div>**Bold text:**<a href="#">link</a></div>
268
+ ",
269
+ }
270
+ `);
271
+ });
272
+ test('handles markdown inside table cells', async () => {
273
+ const htmlToConvert = '<table><tr><td>**Bold** text and [link](http://example.com)</td></tr></table>';
274
+ const result = await htmlToMdxString({
275
+ html: htmlToConvert,
276
+ withProcessor: true,
277
+ onError: (e) => {
278
+ throw e;
279
+ },
280
+ });
281
+ expect(result).toMatchInlineSnapshot(`
282
+ {
283
+ "html": "<table><tr><td><strong>Bold</strong> text and <a href="http://example.com" title="">link</a></td></tr></table>",
284
+ "mdx": "<table><tr><td>**Bold** text and [link](http://example.com)</td></tr></table>
285
+ ",
286
+ }
287
+ `);
288
+ });
289
+ test('preserves plain text when no markdown', async () => {
290
+ const htmlToConvert = '<div>Plain text without markdown</div>';
291
+ const result = await htmlToMdxString({
292
+ html: htmlToConvert,
293
+ withProcessor: true,
294
+ onError: (e) => {
295
+ throw e;
296
+ },
297
+ });
298
+ expect(result).toMatchInlineSnapshot(`
299
+ {
300
+ "html": "<div>Plain text without markdown</div>",
301
+ "mdx": "<div>Plain text without markdown</div>
302
+ ",
303
+ }
304
+ `);
305
+ });
306
+ test('handles nested HTML tags with markdown', async () => {
307
+ const htmlToConvert = '<div><span>**Bold** and <a href="#">link</a></span></div>';
308
+ const result = await htmlToMdxString({
309
+ html: htmlToConvert,
310
+ withProcessor: true,
311
+ onError: (e) => {
312
+ throw e;
313
+ },
314
+ });
315
+ expect(result).toMatchInlineSnapshot(`
316
+ {
317
+ "html": "<div><span><strong>Bold</strong> and<a href="#">link</a></span></div>",
318
+ "mdx": "<div><span>**Bold** and<a href="#">link</a></span></div>
319
+ ",
320
+ }
321
+ `);
322
+ });
323
+ });
324
+ //# sourceMappingURL=html-to-mdx-ast.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html-to-mdx-ast.test.js","sourceRoot":"","sources":["../../src/html/html-to-mdx-ast.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AACvD,OAAO,EACH,iBAAiB,GAGpB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AACjC,OAAO,SAAS,MAAM,YAAY,CAAA;AAClC,OAAO,eAAe,MAAM,kBAAkB,CAAA;AAC9C,OAAO,WAAW,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAE3C,iCAAiC;AACjC,MAAM,UAAU,GAAG;IACf,OAAO,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE;QACjC,OAAO,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;IACrD,CAAC;IACD,KAAK,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,EAAE;QAC/B,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;IACtD,CAAC;CACJ,CAAA;AAED,yDAAyD;AACzD,KAAK,UAAU,eAAe,CAAC,EAC3B,IAAI,EACJ,aAAa,GAAG,KAAK,EACrB,OAAO,EACP,cAAc,EACd,qBAAqB,GAWxB;IACG,sEAAsE;IACtE,MAAM,WAAW,GAAG,aAAa;QAC7B,CAAC,CAAC,CAAC,EAAE,IAAI,EAAoB,EAAE,EAAE;YAC3B,MAAM,iBAAiB,GAAG,OAAO,EAAE;iBAC9B,GAAG,CAAC,WAAW,CAAC;iBAChB,GAAG,CAAC,SAAS,CAAC,CAAA;YACnB,MAAM,KAAK,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAQ,CAAA;YAClD,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YAChC,uCAAuC;YACvC,OAAO,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAA;QAC/B,CAAC;QACH,CAAC,CAAC,SAAS,CAAA;IAEf,MAAM,MAAM,GAAG,iBAAiB,CAAC;QAC7B,IAAI;QACJ,WAAW;QACX,OAAO;QACP,cAAc;QACd,qBAAqB;KACxB,CAAC,CAAA;IAEF,sBAAsB;IACtB,MAAM,SAAS,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,eAAe,EAAE;IAC5D,eAAe;IACf,cAAc;IACd,eAAe;KAClB,CAAC,CAAA;IAEF,sCAAsC;IACtC,MAAM,IAAI,GAAG;QACT,IAAI,EAAE,MAAM;QACZ,QAAQ,EAAE,MAAM;KACnB,CAAA;IAED,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,CAAC,IAAW,CAAC,CAAA;IAE5C,2DAA2D;IAC3D,0CAA0C;IAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAA;IAC3B,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;IACpE,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAA;IACzB,MAAM,YAAY,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAA;IAE9C,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,YAAY,EAAE,CAAA;AACtC,CAAC;AAED,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC/B,IAAI,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAA;QAC9D,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;SAcpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,MAAM,GAAG,iBAAiB,CAAC;YAC7B,IAAI,EAAE,2DAA2D;YACjE,cAAc,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE;gBAC5B,4CAA4C;gBAC5C,IAAI,OAAO,KAAK,MAAM;oBAAE,OAAO,MAAM,CAAA;gBACrC,OAAO,OAAO,CAAA;YAClB,CAAC;SACJ,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;SAyBpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,MAAM,GAAG,iBAAiB,CAAC;YAC7B,IAAI,EAAE,2CAA2C;SACpD,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;SAepC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,iBAAiB,CAAC;YAC7B,IAAI,EAAE,wCAAwC;SACjD,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;SAoBpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,MAAM,GAAG,iBAAiB,CAAC;YAC7B,IAAI,EAAE,2CAA2C;SACpD,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;SAsBpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,IAAI,EAAE,4BAA4B,EAAE,CAAC,CAAA;QACxE,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,MAAM,GAAG,iBAAiB,CAAC;YAC7B,IAAI,EAAE,0DAA0D;SACnE,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAkCpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,2CAA2C,EAAE,GAAG,EAAE;IACvD,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,aAAa,GAAG,kCAAkC,CAAA;QACxD,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACjC,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACX,MAAM,CAAC,CAAA;YACX,CAAC;SACJ,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;SAMpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,aAAa,GAAG,gDAAgD,CAAA;QACtE,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACjC,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACX,MAAM,CAAC,CAAA;YACX,CAAC;SACJ,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;SAMpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,aAAa,GACf,+EAA+E,CAAA;QACnF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACjC,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACX,MAAM,CAAC,CAAA;YACX,CAAC;SACJ,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;SAMpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,uCAAuC,EAAE,KAAK,IAAI,EAAE;QACrD,MAAM,aAAa,GAAG,wCAAwC,CAAA;QAC9D,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACjC,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACX,MAAM,CAAC,CAAA;YACX,CAAC;SACJ,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;SAMpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,aAAa,GACf,2DAA2D,CAAA;QAC/D,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACjC,IAAI,EAAE,aAAa;YACnB,aAAa,EAAE,IAAI;YACnB,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;gBACX,MAAM,CAAC,CAAA;YACX,CAAC;SACJ,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,qBAAqB,CAAC;;;;;;SAMpC,CAAC,CAAA;IACN,CAAC,CAAC,CAAA;AACN,CAAC,CAAC,CAAA"}
@@ -0,0 +1,10 @@
1
+ import type { Root } from 'mdast';
2
+ /**
3
+ * remark plugin: make mdxJsx* element kinds match their context.
4
+ * - Inside phrasing parents → mdxJsxTextElement
5
+ * - Inside flow parents → mdxJsxFlowElement
6
+ * - Elements with block-level tag names → mdxJsxFlowElement
7
+ * - Elements containing non-phrasing children → mdxJsxFlowElement
8
+ */
9
+ export default function remarkMdxJsxNormalize(): (tree: Root) => void;
10
+ //# sourceMappingURL=remark-mdx-jsx-normalize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remark-mdx-jsx-normalize.d.ts","sourceRoot":"","sources":["../../src/html/remark-mdx-jsx-normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAgC,MAAM,OAAO,CAAA;AA8E/D;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,UAAU,qBAAqB,WACT,IAAI,UAoCvC"}