@@ -2175,4 +2175,67 @@ describe('Symbol Serialization', () => {
21752175 expect ( roundtripSymbol ?. component ?. name ) . toBeDefined ( ) ;
21762176 expect ( roundtripSymbol ?. component ?. options ?. symbol ) . toBeDefined ( ) ;
21772177 } ) ;
2178+
2179+ test ( 'Symbol roundtrip: Named symbol converts back to "Symbol" component name' , ( ) => {
2180+ const original = JSON . parse ( symbolWithInputs ) as BuilderContent ;
2181+
2182+ // Step 1: Builder -> Mitosis (named component)
2183+ const mitosisComponent = builderContentToMitosisComponent ( original ) ;
2184+ expect ( mitosisComponent . children [ 0 ] . name ) . toBe ( 'SymbolButtonComponent' ) ;
2185+
2186+ // Step 2: Mitosis -> Builder (should be "Symbol" not "SymbolButtonComponent")
2187+ const backToBuilder = componentToBuilder ( ) ( { component : mitosisComponent } ) ;
2188+ const roundtripSymbol = backToBuilder . data ?. blocks ?. [ 0 ] ;
2189+
2190+ // CRITICAL: Builder Editor requires component.name === "Symbol"
2191+ expect ( roundtripSymbol ?. component ?. name ) . toBe ( 'Symbol' ) ;
2192+
2193+ // Verify symbol metadata is preserved
2194+ expect ( roundtripSymbol ?. component ?. options ?. symbol ) . toBeDefined ( ) ;
2195+ expect ( roundtripSymbol ?. component ?. options ?. symbol ?. entry ) . toBeDefined ( ) ;
2196+
2197+ // Verify the display name is preserved for next roundtrip
2198+ expect ( roundtripSymbol ?. component ?. options ?. symbol ?. name ) . toBe ( 'Button Component' ) ;
2199+
2200+ // Verify inputs are merged back into symbol.data
2201+ expect ( roundtripSymbol ?. component ?. options ?. symbol ?. data ) . toBeDefined ( ) ;
2202+ expect ( roundtripSymbol ?. component ?. options ?. symbol ?. data ?. buttonText ) . toBe ( 'Click me!' ) ;
2203+ } ) ;
2204+
2205+ test ( 'Symbol roundtrip preserves symbol.name for re-conversion to JSX' , ( ) => {
2206+ // Simulate what MCP returns: symbol with name field
2207+ const builderWithSymbolName : BuilderContent = {
2208+ data : {
2209+ blocks : [
2210+ {
2211+ '@type' : '@builder.io/sdk:Element' ,
2212+ '@version' : 2 ,
2213+ id : 'builder-roundtrip-test' ,
2214+ component : {
2215+ name : 'Symbol' ,
2216+ options : {
2217+ symbol : {
2218+ entry : 'test-entry-123' ,
2219+ model : 'symbol' ,
2220+ name : 'Copyright Reserved' , // This should be used for component naming
2221+ data : { } ,
2222+ } ,
2223+ } ,
2224+ } ,
2225+ } ,
2226+ ] ,
2227+ } ,
2228+ } ;
2229+
2230+ // Builder -> Mitosis: should use symbol.name for component name
2231+ const mitosisComponent = builderContentToMitosisComponent ( builderWithSymbolName ) ;
2232+ expect ( mitosisComponent . children [ 0 ] . name ) . toBe ( 'SymbolCopyrightReserved' ) ;
2233+
2234+ // Mitosis -> Builder: should preserve name and use "Symbol" as component name
2235+ const backToBuilder = componentToBuilder ( ) ( { component : mitosisComponent } ) ;
2236+ const symbol = backToBuilder . data ?. blocks ?. [ 0 ] ;
2237+
2238+ expect ( symbol ?. component ?. name ) . toBe ( 'Symbol' ) ;
2239+ expect ( symbol ?. component ?. options ?. symbol ?. name ) . toBe ( 'Copyright Reserved' ) ;
2240+ } ) ;
21782241} ) ;
0 commit comments