@@ -362,6 +362,69 @@ console.log("hello");
362362 } ) ;
363363} ) ;
364364
365+ describe ( "md2json mark sanitization" , ( ) => {
366+ const schema = getSchema ( getExtensions ( ) ) ;
367+
368+ function validateJsonContent ( json : JSONContent ) : {
369+ valid : boolean ;
370+ error ?: string ;
371+ } {
372+ try {
373+ schema . nodeFromJSON ( json ) ;
374+ return { valid : true } ;
375+ } catch ( error ) {
376+ return {
377+ valid : false ,
378+ error : error instanceof Error ? error . message : String ( error ) ,
379+ } ;
380+ }
381+ }
382+
383+ test ( "bold wrapping code produces valid schema (no bold+code)" , ( ) => {
384+ const json = md2json ( "**`code`**" ) ;
385+ const validation = validateJsonContent ( json ) ;
386+ expect ( validation . valid ) . toBe ( true ) ;
387+ if ( ! validation . valid ) {
388+ throw new Error ( `Schema validation failed: ${ validation . error } ` ) ;
389+ }
390+ } ) ;
391+
392+ test ( "italic wrapping code produces valid schema" , ( ) => {
393+ const json = md2json ( "*`code`*" ) ;
394+ const validation = validateJsonContent ( json ) ;
395+ expect ( validation . valid ) . toBe ( true ) ;
396+ } ) ;
397+
398+ test ( "strikethrough wrapping code produces valid schema" , ( ) => {
399+ const json = md2json ( "~~`code`~~" ) ;
400+ const validation = validateJsonContent ( json ) ;
401+ expect ( validation . valid ) . toBe ( true ) ;
402+ } ) ;
403+
404+ test ( "bold+code keeps only code mark" , ( ) => {
405+ const json = md2json ( "**`code`**" ) ;
406+ const findTextNode = ( node : JSONContent ) : JSONContent | null => {
407+ if ( node . type === "text" ) return node ;
408+ for ( const child of node . content || [ ] ) {
409+ const found = findTextNode ( child ) ;
410+ if ( found ) return found ;
411+ }
412+ return null ;
413+ } ;
414+ const textNode = findTextNode ( json ) ;
415+ expect ( textNode ) . toBeDefined ( ) ;
416+ expect ( textNode ! . marks ) . toBeDefined ( ) ;
417+ expect ( textNode ! . marks ! . length ) . toBe ( 1 ) ;
418+ expect ( textNode ! . marks ! [ 0 ] . type ) . toBe ( "code" ) ;
419+ } ) ;
420+
421+ test ( "mixed bold and code in same paragraph produces valid schema" , ( ) => {
422+ const json = md2json ( "**bold** and **`code`** and more" ) ;
423+ const validation = validateJsonContent ( json ) ;
424+ expect ( validation . valid ) . toBe ( true ) ;
425+ } ) ;
426+ } ) ;
427+
365428describe ( "schema validation" , ( ) => {
366429 const schema = getSchema ( getExtensions ( ) ) ;
367430
0 commit comments