From c6d1067dbe4faeb18246a27988d9b4c334565551 Mon Sep 17 00:00:00 2001 From: Petyo Ivanov Date: Tue, 5 Nov 2024 10:49:12 +0200 Subject: [PATCH] feat: support fallback descriptors for JSX --- src/exportMarkdownFromLexical.ts | 4 +++- src/plugins/jsx/LexicalJsxNode.tsx | 5 ++++- src/plugins/jsx/MdastMdxJsxElementVisitor.ts | 4 +++- src/plugins/jsx/index.ts | 3 ++- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/exportMarkdownFromLexical.ts b/src/exportMarkdownFromLexical.ts index db796b77..10a2cc7a 100644 --- a/src/exportMarkdownFromLexical.ts +++ b/src/exportMarkdownFromLexical.ts @@ -194,7 +194,9 @@ export function exportLexicalTreeToMdast({ const defaultImportsMap = new Map() for (const componentName of referredComponents) { - const descriptor = jsxComponentDescriptors.find((descriptor) => descriptor.name === componentName) + const descriptor = + jsxComponentDescriptors.find((descriptor) => descriptor.name === componentName) ?? + jsxComponentDescriptors.find((descriptor) => descriptor.name === '*') if (!descriptor) { throw new Error(`Component ${componentName} is used but not imported`) } diff --git a/src/plugins/jsx/LexicalJsxNode.tsx b/src/plugins/jsx/LexicalJsxNode.tsx index 73adf898..94cfcb40 100644 --- a/src/plugins/jsx/LexicalJsxNode.tsx +++ b/src/plugins/jsx/LexicalJsxNode.tsx @@ -105,7 +105,10 @@ export function JsxEditorContainer(props: { }) { const { mdastNode } = props const jsxComponentDescriptors = useCellValue(jsxComponentDescriptors$) - const descriptor = jsxComponentDescriptors.find((descriptor) => descriptor.name === mdastNode.name) + const descriptor = + jsxComponentDescriptors.find((descriptor) => descriptor.name === mdastNode.name) ?? + jsxComponentDescriptors.find((descriptor) => descriptor.name === '*') + if (!descriptor) { throw new Error(`No JSX descriptor found for ${mdastNode.name}`) } diff --git a/src/plugins/jsx/MdastMdxJsxElementVisitor.ts b/src/plugins/jsx/MdastMdxJsxElementVisitor.ts index 6f0f8fad..21a34c07 100644 --- a/src/plugins/jsx/MdastMdxJsxElementVisitor.ts +++ b/src/plugins/jsx/MdastMdxJsxElementVisitor.ts @@ -6,7 +6,9 @@ import { MdastImportVisitor } from '../../importMarkdownToLexical' export const MdastMdxJsxElementVisitor: MdastImportVisitor = { testNode: (node, { jsxComponentDescriptors }) => { if (node.type === 'mdxJsxTextElement' || node.type === 'mdxJsxFlowElement') { - const descriptor = jsxComponentDescriptors.find((descriptor) => descriptor.name === node.name) + const descriptor = + jsxComponentDescriptors.find((descriptor) => descriptor.name === node.name) ?? + jsxComponentDescriptors.find((descriptor) => descriptor.name === '*') return descriptor !== undefined } return false diff --git a/src/plugins/jsx/index.ts b/src/plugins/jsx/index.ts index 5410cc81..b5ba1156 100644 --- a/src/plugins/jsx/index.ts +++ b/src/plugins/jsx/index.ts @@ -56,8 +56,9 @@ export interface JsxPropertyDescriptor { */ export interface JsxComponentDescriptor { /** - * The tag name. For example: 'div', 'span', 'MyComponent'. + * The tag name. For example: 'div', 'span', 'MyComponent'. Use '*' for any tag. * Note: For fragments, use null. + * */ name: string | null /**