@@ -232,6 +232,110 @@ describe('Entry editable test', () => {
232232            done ( ) 
233233        } ) 
234234
235+         it ( 'Entry with array containing null values should skip null elements' ,  done  =>  { 
236+             const  entryWithNullInArray  =  { 
237+                 "locale" : "en-us" , 
238+                 "uid" : "uid" , 
239+                 "items" : [ 
240+                     null , 
241+                     {  "title" : "valid item"  } , 
242+                     null 
243+                 ] 
244+             } 
245+             
246+             expect ( ( )  =>  addTags ( entryWithNullInArray ,  'content_type' ,  false ) ) . not . toThrow ( ) 
247+             expect ( ( entryWithNullInArray  as  any ) [ 'items' ] [ 1 ] [ '$' ] [ 'title' ] ) . toEqual ( 'data-cslp=content_type.uid.en-us.items.1.title' ) 
248+             
249+             done ( ) 
250+         } ) 
251+ 
252+         it ( 'Entry with array containing undefined values should skip undefined elements' ,  done  =>  { 
253+             const  entryWithUndefinedInArray  =  { 
254+                 "locale" : "en-us" , 
255+                 "uid" : "uid" , 
256+                 "items" : [ 
257+                     undefined , 
258+                     {  "title" : "valid item"  } , 
259+                     undefined 
260+                 ] 
261+             } 
262+             
263+             expect ( ( )  =>  addTags ( entryWithUndefinedInArray ,  'content_type' ,  false ) ) . not . toThrow ( ) 
264+             expect ( ( entryWithUndefinedInArray  as  any ) [ 'items' ] [ 1 ] [ '$' ] [ 'title' ] ) . toEqual ( 'data-cslp=content_type.uid.en-us.items.1.title' ) 
265+             
266+             done ( ) 
267+         } ) 
268+ 
269+         it ( 'Entry with array containing mixed null and undefined values should skip both' ,  done  =>  { 
270+             const  entryWithMixedNullUndefined  =  { 
271+                 "locale" : "en-us" , 
272+                 "uid" : "uid" , 
273+                 "items" : [ 
274+                     null , 
275+                     undefined , 
276+                     {  "title" : "valid item 1"  } , 
277+                     null , 
278+                     {  "title" : "valid item 2"  } , 
279+                     undefined 
280+                 ] 
281+             } 
282+             
283+             expect ( ( )  =>  addTags ( entryWithMixedNullUndefined ,  'content_type' ,  true ) ) . not . toThrow ( ) 
284+             expect ( ( entryWithMixedNullUndefined  as  any ) [ 'items' ] [ 2 ] [ '$' ] [ 'title' ] ) . toEqual ( { 'data-cslp' : 'content_type.uid.en-us.items.2.title' } ) 
285+             expect ( ( entryWithMixedNullUndefined  as  any ) [ 'items' ] [ 4 ] [ '$' ] [ 'title' ] ) . toEqual ( { 'data-cslp' : 'content_type.uid.en-us.items.4.title' } ) 
286+             
287+             done ( ) 
288+         } ) 
289+ 
290+         it ( 'Entry with _embedded_items containing null values should handle gracefully' ,  done  =>  { 
291+             const  entryWithEmbeddedNull : any  =  { 
292+                 "locale" : "en-us" , 
293+                 "uid" : "uid" , 
294+                 "blocks" : [ 
295+                     { 
296+                         "items" : [ 
297+                             {  "heading" : "Item heading"  } 
298+                         ] 
299+                     } 
300+                 ] , 
301+                 "_embedded_items" : { 
302+                     "blocks.items.description" : [ null ] 
303+                 } 
304+             } 
305+             
306+             expect ( ( )  =>  addTags ( entryWithEmbeddedNull ,  'content_type' ,  false ) ) . not . toThrow ( ) 
307+             expect ( ( entryWithEmbeddedNull  as  any ) [ 'blocks' ] [ 0 ] [ 'items' ] [ 0 ] [ '$' ] [ 'heading' ] ) . toEqual ( 'data-cslp=content_type.uid.en-us.blocks.0.items.0.heading' ) 
308+             expect ( ( entryWithEmbeddedNull  as  any ) [ '_embedded_items' ] [ 'blocks.items.description' ] [ 0 ] ) . toBeNull ( ) 
309+             
310+             done ( ) 
311+         } ) 
312+ 
313+         it ( 'Entry with nested arrays containing nulls in complex structure should work' ,  done  =>  { 
314+             const  entryWithComplexNulls : any  =  { 
315+                 "locale" : "en-us" , 
316+                 "uid" : "uid" , 
317+                 "blocks" : [ 
318+                     { 
319+                         "hero" : { 
320+                             "title" : "Hero title" , 
321+                             "items" : [ null ,  {  "name" : "Item name"  } ,  undefined ] 
322+                         } 
323+                     } , 
324+                     null , 
325+                     { 
326+                         "content" : "Content text" 
327+                     } 
328+                 ] 
329+             } 
330+             
331+             expect ( ( )  =>  addTags ( entryWithComplexNulls ,  'content_type' ,  true ) ) . not . toThrow ( ) 
332+             expect ( ( entryWithComplexNulls  as  any ) [ 'blocks' ] [ 0 ] [ 'hero' ] [ '$' ] [ 'title' ] ) . toEqual ( { 'data-cslp' : 'content_type.uid.en-us.blocks.0.hero.title' } ) 
333+             expect ( ( entryWithComplexNulls  as  any ) [ 'blocks' ] [ 0 ] [ 'hero' ] [ 'items' ] [ 1 ] [ '$' ] [ 'name' ] ) . toEqual ( { 'data-cslp' : 'content_type.uid.en-us.blocks.0.hero.items.1.name' } ) 
334+             expect ( ( entryWithComplexNulls  as  any ) [ 'blocks' ] [ 2 ] [ '$' ] [ 'content' ] ) . toEqual ( { 'data-cslp' : 'content_type.uid.en-us.blocks.2.content' } ) 
335+             
336+             done ( ) 
337+         } ) 
338+ 
235339        it ( 'Variant path sorting should work correctly for nested paths' ,  done  =>  { 
236340            const  entryWithComplexVariants  =  { 
237341                "_version" : 10 , 
@@ -268,6 +372,151 @@ describe('Entry editable test', () => {
268372
269373            done ( ) 
270374        } ) 
375+ 
376+         it ( 'Reference fields should not inherit parent variants when they have no applied_variants' ,  done  =>  { 
377+             const  entryWithReferenceAndVariants  =  { 
378+                 "title" : "home" , 
379+                 "url" : "/data/all_test/first" , 
380+                 "single_line" : "ssd" , 
381+                 "tags" : [ "hi" ] , 
382+                 "locale" : "en-us" , 
383+                 "uid" : "blt827e0ad3608248be" , 
384+                 "created_by" : "bltf0d59057590e9b09" , 
385+                 "updated_by" : "bltf0d59057590e9b09" , 
386+                 "created_at" : "2025-08-25T09:43:49.935Z" , 
387+                 "updated_at" : "2025-10-09T11:45:19.967Z" , 
388+                 "ACL" : [ ]  as  any [ ] , 
389+                 "_version" : 40 , 
390+                 "_in_progress" : false , 
391+                 "json_rte" : "<p>hisdassf</p>" , 
392+                 "select" : "1" , 
393+                 "group" : { 
394+                     "single_line" : "" 
395+                 } , 
396+                 "non_single_line_textbox" : "" , 
397+                 "reference" : [ 
398+                     { 
399+                         "title" : "base variant" , 
400+                         "single_line" : "bases" , 
401+                         "tags" : [ ]  as  any [ ] , 
402+                         "locale" : "en-us" , 
403+                         "uid" : "blt07a6c7258ddba844" , 
404+                         "created_by" : "bltf0d59057590e9b09" , 
405+                         "updated_by" : "bltf0d59057590e9b09" , 
406+                         "created_at" : "2025-10-01T03:10:10.701Z" , 
407+                         "updated_at" : "2025-10-09T11:44:44.981Z" , 
408+                         "_content_type_uid" : "all_test_3" , 
409+                         "ACL" : [ ]  as  any [ ] , 
410+                         "_version" : 3 , 
411+                         "_in_progress" : false , 
412+                         "multi_line_reference" : "hii\n" 
413+                         // Note: This reference object has NO _applied_variants 
414+                     } 
415+                 ] , 
416+                 "taxonomies" : [ ]  as  any [ ] , 
417+                 "multi_line" : "woek" , 
418+                 "_applied_variants" : { 
419+                     "single_line" : "csfff653e89df54e8c" , 
420+                     "tags" : "csfff653e89df54e8c" , 
421+                     "multi_line" : "csfff653e89df54e8c" 
422+                 } 
423+             } 
424+             
425+             addTags ( entryWithReferenceAndVariants ,  'all_test' ,  false ) 
426+             
427+             // Parent entry fields with variants should get v2 prefix 
428+             expect ( ( entryWithReferenceAndVariants  as  any ) [ '$' ] [ 'single_line' ] ) . toEqual ( 'data-cslp=v2:all_test.blt827e0ad3608248be_csfff653e89df54e8c.en-us.single_line' ) 
429+             expect ( ( entryWithReferenceAndVariants  as  any ) [ '$' ] [ 'tags' ] ) . toEqual ( 'data-cslp=v2:all_test.blt827e0ad3608248be_csfff653e89df54e8c.en-us.tags' ) 
430+             expect ( ( entryWithReferenceAndVariants  as  any ) [ '$' ] [ 'multi_line' ] ) . toEqual ( 'data-cslp=v2:all_test.blt827e0ad3608248be_csfff653e89df54e8c.en-us.multi_line' ) 
431+             
432+             // Reference fields should NOT get v2 prefix since they have no _applied_variants 
433+             expect ( ( entryWithReferenceAndVariants  as  any ) [ 'reference' ] [ 0 ] [ '$' ] [ 'title' ] ) . toEqual ( 'data-cslp=all_test_3.blt07a6c7258ddba844.en-us.title' ) 
434+             expect ( ( entryWithReferenceAndVariants  as  any ) [ 'reference' ] [ 0 ] [ '$' ] [ 'single_line' ] ) . toEqual ( 'data-cslp=all_test_3.blt07a6c7258ddba844.en-us.single_line' ) 
435+             expect ( ( entryWithReferenceAndVariants  as  any ) [ 'reference' ] [ 0 ] [ '$' ] [ 'tags' ] ) . toEqual ( 'data-cslp=all_test_3.blt07a6c7258ddba844.en-us.tags' ) 
436+             expect ( ( entryWithReferenceAndVariants  as  any ) [ 'reference' ] [ 0 ] [ '$' ] [ 'multi_line_reference' ] ) . toEqual ( 'data-cslp=all_test_3.blt07a6c7258ddba844.en-us.multi_line_reference' ) 
437+             
438+             done ( ) 
439+         } ) 
440+ 
441+         it ( 'Reference fields with their own applied_variants should use their variants' ,  done  =>  { 
442+             const  entryWithReferenceHavingVariants  =  { 
443+                 "title" : "home" , 
444+                 "locale" : "en-us" , 
445+                 "uid" : "blt827e0ad3608248be" , 
446+                 "ACL" : [ ]  as  any [ ] , 
447+                 "_version" : 40 , 
448+                 "_in_progress" : false , 
449+                 "single_line" : "parent field" , 
450+                 "reference" : [ 
451+                     { 
452+                         "title" : "base variant" , 
453+                         "single_line" : "reference field" , 
454+                         "locale" : "en-us" , 
455+                         "uid" : "blt07a6c7258ddba844" , 
456+                         "_content_type_uid" : "all_test_3" , 
457+                         "ACL" : [ ]  as  any [ ] , 
458+                         "_version" : 3 , 
459+                         "_in_progress" : false , 
460+                         "_applied_variants" : { 
461+                             "single_line" : "ref_variant_123" 
462+                         } 
463+                     } 
464+                 ] , 
465+                 "_applied_variants" : { 
466+                     "single_line" : "parent_variant_456" 
467+                 } 
468+             } 
469+             
470+             addTags ( entryWithReferenceHavingVariants ,  'all_test' ,  false ) 
471+             
472+             // Parent entry field should get parent variant 
473+             expect ( ( entryWithReferenceHavingVariants  as  any ) [ '$' ] [ 'single_line' ] ) . toEqual ( 'data-cslp=v2:all_test.blt827e0ad3608248be_parent_variant_456.en-us.single_line' ) 
474+             
475+             // Reference field should get its own variant, not parent variant 
476+             expect ( ( entryWithReferenceHavingVariants  as  any ) [ 'reference' ] [ 0 ] [ '$' ] [ 'title' ] ) . toEqual ( 'data-cslp=all_test_3.blt07a6c7258ddba844.en-us.title' ) 
477+             expect ( ( entryWithReferenceHavingVariants  as  any ) [ 'reference' ] [ 0 ] [ '$' ] [ 'single_line' ] ) . toEqual ( 'data-cslp=v2:all_test_3.blt07a6c7258ddba844_ref_variant_123.en-us.single_line' ) 
478+             
479+             done ( ) 
480+         } ) 
481+ 
482+         it ( 'Reference fields should work correctly with tagsAsObject=true' ,  done  =>  { 
483+             const  entryWithReferenceAndVariants  =  { 
484+                 "title" : "home" , 
485+                 "single_line" : "ssd" , 
486+                 "locale" : "en-us" , 
487+                 "uid" : "blt827e0ad3608248be" , 
488+                 "ACL" : [ ]  as  any [ ] , 
489+                 "_version" : 40 , 
490+                 "_in_progress" : false , 
491+                 "reference" : [ 
492+                     { 
493+                         "title" : "base variant" , 
494+                         "single_line" : "bases" , 
495+                         "locale" : "en-us" , 
496+                         "uid" : "blt07a6c7258ddba844" , 
497+                         "_content_type_uid" : "all_test_3" , 
498+                         "ACL" : [ ]  as  any [ ] , 
499+                         "_version" : 3 , 
500+                         "_in_progress" : false 
501+                         // No _applied_variants 
502+                     } 
503+                 ] , 
504+                 "_applied_variants" : { 
505+                     "single_line" : "csfff653e89df54e8c" 
506+                 } 
507+             } 
508+             
509+             addTags ( entryWithReferenceAndVariants ,  'all_test' ,  true ) 
510+             
511+             // Parent entry field with variant should get v2 prefix as object 
512+             expect ( ( entryWithReferenceAndVariants  as  any ) [ '$' ] [ 'single_line' ] ) . toEqual ( { 'data-cslp' : 'v2:all_test.blt827e0ad3608248be_csfff653e89df54e8c.en-us.single_line' } ) 
513+             
514+             // Reference fields should NOT get v2 prefix as objects 
515+             expect ( ( entryWithReferenceAndVariants  as  any ) [ 'reference' ] [ 0 ] [ '$' ] [ 'title' ] ) . toEqual ( { 'data-cslp' : 'all_test_3.blt07a6c7258ddba844.en-us.title' } ) 
516+             expect ( ( entryWithReferenceAndVariants  as  any ) [ 'reference' ] [ 0 ] [ '$' ] [ 'single_line' ] ) . toEqual ( { 'data-cslp' : 'all_test_3.blt07a6c7258ddba844.en-us.single_line' } ) 
517+             
518+             done ( ) 
519+         } ) 
271520    } ) 
272521
273522} ) 
0 commit comments