@esmx/core 3.0.0-rc.62 → 3.0.0-rc.63

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.
@@ -1,5 +1,10 @@
1
1
  import { assert, describe, test } from 'vitest';
2
- import { buildImportsMap, buildScopesMap, getImportMap } from './import-map';
2
+ import {
3
+ buildImportsMap,
4
+ buildScopesMap,
5
+ fixNestedScopesResolution,
6
+ getImportMap
7
+ } from './import-map';
3
8
  import type { GetImportMapOptions, ImportMapManifest } from './import-map';
4
9
 
5
10
  describe('buildImportsMap', () => {
@@ -490,6 +495,713 @@ describe('buildImportsMap', () => {
490
495
  });
491
496
  });
492
497
 
498
+ describe('fixNestedScopesResolution', () => {
499
+ test('should return unchanged import map for empty scopes', () => {
500
+ const importMap = {
501
+ imports: {
502
+ 'shared-modules/vue': '/shared-modules/vue.620a1e89.final.mjs'
503
+ },
504
+ scopes: {}
505
+ };
506
+
507
+ const result = fixNestedScopesResolution(importMap);
508
+ assert.deepEqual(result, importMap);
509
+ });
510
+
511
+ test('should return unchanged import map for shallow scopes only', () => {
512
+ const importMap = {
513
+ imports: {
514
+ 'shared-modules/vue': '/shared-modules/vue.620a1e89.final.mjs'
515
+ },
516
+ scopes: {
517
+ '/shared-modules/': {
518
+ vue: '/shared-modules/vue.620a1e89.final.mjs'
519
+ }
520
+ }
521
+ };
522
+
523
+ const result = fixNestedScopesResolution(importMap);
524
+ assert.deepEqual(result, importMap);
525
+ });
526
+
527
+ test('should create file-level scopes for nested scopes', () => {
528
+ const importMap = {
529
+ imports: {
530
+ 'shared-modules/vue2':
531
+ '/shared-modules/vue2.a1b2c3d4.final.mjs',
532
+ 'shared-modules/vue2/@esmx/router-vue':
533
+ '/shared-modules/vue2/@esmx/router-vue.e5f6g7h8.final.mjs',
534
+ 'shared-modules/vue2/index':
535
+ '/shared-modules/vue2/index.i9j0k1l2.final.mjs',
536
+ 'shared-modules/vue': '/shared-modules/vue.m3n4o5p6.final.mjs'
537
+ },
538
+ scopes: {
539
+ '/shared-modules/': {
540
+ vue: '/shared-modules/vue.m3n4o5p6.final.mjs'
541
+ },
542
+ '/shared-modules/vue2/': {
543
+ vue: '/shared-modules/vue2.a1b2c3d4.final.mjs'
544
+ }
545
+ }
546
+ };
547
+
548
+ const expected = {
549
+ imports: {
550
+ 'shared-modules/vue2':
551
+ '/shared-modules/vue2.a1b2c3d4.final.mjs',
552
+ 'shared-modules/vue2/@esmx/router-vue':
553
+ '/shared-modules/vue2/@esmx/router-vue.e5f6g7h8.final.mjs',
554
+ 'shared-modules/vue2/index':
555
+ '/shared-modules/vue2/index.i9j0k1l2.final.mjs',
556
+ 'shared-modules/vue': '/shared-modules/vue.m3n4o5p6.final.mjs'
557
+ },
558
+ scopes: {
559
+ '/shared-modules/vue.m3n4o5p6.final.mjs': {
560
+ vue: '/shared-modules/vue.m3n4o5p6.final.mjs'
561
+ },
562
+ '/shared-modules/vue2.a1b2c3d4.final.mjs': {
563
+ vue: '/shared-modules/vue.m3n4o5p6.final.mjs'
564
+ },
565
+ '/shared-modules/vue2/@esmx/router-vue.e5f6g7h8.final.mjs': {
566
+ vue: '/shared-modules/vue2.a1b2c3d4.final.mjs'
567
+ },
568
+ '/shared-modules/vue2/index.i9j0k1l2.final.mjs': {
569
+ vue: '/shared-modules/vue2.a1b2c3d4.final.mjs'
570
+ }
571
+ }
572
+ };
573
+
574
+ const result = fixNestedScopesResolution(importMap);
575
+ assert.deepEqual(result, expected);
576
+ });
577
+
578
+ test('should handle multiple nested scopes correctly', () => {
579
+ const importMap = {
580
+ imports: {
581
+ 'shared-modules/vue2':
582
+ '/shared-modules/vue2.q7r8s9t0.final.mjs',
583
+ 'shared-modules/vue2/component':
584
+ '/shared-modules/vue2/component.u1v2w3x4.final.mjs',
585
+ 'shared-modules/vue3':
586
+ '/shared-modules/vue3.y5z6a7b8.final.mjs',
587
+ 'shared-modules/vue3/component':
588
+ '/shared-modules/vue3/component.c9d0e1f2.final.mjs',
589
+ 'shared-modules/vue': '/shared-modules/vue.g3h4i5j6.final.mjs'
590
+ },
591
+ scopes: {
592
+ '/shared-modules/': {
593
+ vue: '/shared-modules/vue.g3h4i5j6.final.mjs'
594
+ },
595
+ '/shared-modules/vue2/': {
596
+ vue: '/shared-modules/vue2.q7r8s9t0.final.mjs'
597
+ },
598
+ '/shared-modules/vue3/': {
599
+ vue: '/shared-modules/vue3.y5z6a7b8.final.mjs'
600
+ }
601
+ }
602
+ };
603
+
604
+ const expected = {
605
+ imports: {
606
+ 'shared-modules/vue2':
607
+ '/shared-modules/vue2.q7r8s9t0.final.mjs',
608
+ 'shared-modules/vue2/component':
609
+ '/shared-modules/vue2/component.u1v2w3x4.final.mjs',
610
+ 'shared-modules/vue3':
611
+ '/shared-modules/vue3.y5z6a7b8.final.mjs',
612
+ 'shared-modules/vue3/component':
613
+ '/shared-modules/vue3/component.c9d0e1f2.final.mjs',
614
+ 'shared-modules/vue': '/shared-modules/vue.g3h4i5j6.final.mjs'
615
+ },
616
+ scopes: {
617
+ '/shared-modules/vue.g3h4i5j6.final.mjs': {
618
+ vue: '/shared-modules/vue.g3h4i5j6.final.mjs'
619
+ },
620
+ '/shared-modules/vue2.q7r8s9t0.final.mjs': {
621
+ vue: '/shared-modules/vue.g3h4i5j6.final.mjs'
622
+ },
623
+ '/shared-modules/vue2/component.u1v2w3x4.final.mjs': {
624
+ vue: '/shared-modules/vue2.q7r8s9t0.final.mjs'
625
+ },
626
+ '/shared-modules/vue3.y5z6a7b8.final.mjs': {
627
+ vue: '/shared-modules/vue.g3h4i5j6.final.mjs'
628
+ },
629
+ '/shared-modules/vue3/component.c9d0e1f2.final.mjs': {
630
+ vue: '/shared-modules/vue3.y5z6a7b8.final.mjs'
631
+ }
632
+ }
633
+ };
634
+
635
+ const result = fixNestedScopesResolution(importMap);
636
+ assert.deepEqual(result, expected);
637
+ });
638
+
639
+ test('should handle deeply nested scopes', () => {
640
+ const importMap = {
641
+ imports: {
642
+ 'shared-modules/vue2/components/button':
643
+ '/shared-modules/vue2/components/button.k7l8m9n0.final.mjs',
644
+ 'shared-modules/vue2/components/input':
645
+ '/shared-modules/vue2/components/input.o1p2q3r4.final.mjs'
646
+ },
647
+ scopes: {
648
+ '/shared-modules/vue2/components/': {
649
+ vue: '/shared-modules/vue2.s5t6u7v8.final.mjs'
650
+ }
651
+ }
652
+ };
653
+
654
+ const expected = {
655
+ imports: {
656
+ 'shared-modules/vue2/components/button':
657
+ '/shared-modules/vue2/components/button.k7l8m9n0.final.mjs',
658
+ 'shared-modules/vue2/components/input':
659
+ '/shared-modules/vue2/components/input.o1p2q3r4.final.mjs'
660
+ },
661
+ scopes: {
662
+ '/shared-modules/vue2/components/button.k7l8m9n0.final.mjs': {
663
+ vue: '/shared-modules/vue2.s5t6u7v8.final.mjs'
664
+ },
665
+ '/shared-modules/vue2/components/input.o1p2q3r4.final.mjs': {
666
+ vue: '/shared-modules/vue2.s5t6u7v8.final.mjs'
667
+ }
668
+ }
669
+ };
670
+
671
+ const result = fixNestedScopesResolution(importMap);
672
+ assert.deepEqual(result, expected);
673
+ });
674
+
675
+ test('should not create file-level scopes for imports not matching nested scope', () => {
676
+ const importMap = {
677
+ imports: {
678
+ 'shared-modules/vue': '/shared-modules/vue.w9x0y1z2.final.mjs',
679
+ 'shared-modules/vue2/component':
680
+ '/shared-modules/vue2/component.a3b4c5d6.final.mjs',
681
+ 'other-modules/component':
682
+ '/other-modules/component.e7f8g9h0.final.mjs'
683
+ },
684
+ scopes: {
685
+ '/shared-modules/vue2/': {
686
+ vue: '/shared-modules/vue2.i1j2k3l4.final.mjs'
687
+ }
688
+ }
689
+ };
690
+
691
+ const expected = {
692
+ imports: importMap.imports,
693
+ scopes: {
694
+ '/shared-modules/vue2/component.a3b4c5d6.final.mjs': {
695
+ vue: '/shared-modules/vue2.i1j2k3l4.final.mjs'
696
+ }
697
+ }
698
+ };
699
+
700
+ const result = fixNestedScopesResolution(importMap);
701
+ assert.deepEqual(result, expected);
702
+ });
703
+
704
+ test('should handle empty imports', () => {
705
+ const importMap = {
706
+ imports: {},
707
+ scopes: {
708
+ '/shared-modules/vue2/': {
709
+ vue: '/shared-modules/vue2.m5n6o7p8.final.mjs'
710
+ }
711
+ }
712
+ };
713
+
714
+ const expected = {
715
+ imports: {},
716
+ scopes: {}
717
+ };
718
+
719
+ const result = fixNestedScopesResolution(importMap);
720
+ assert.deepEqual(result, expected);
721
+ });
722
+
723
+ test('should preserve original import map structure', () => {
724
+ const importMap = {
725
+ imports: {
726
+ 'shared-modules/vue2':
727
+ '/shared-modules/vue2.q9r8s7t6.final.mjs',
728
+ 'shared-modules/vue2/component':
729
+ '/shared-modules/vue2/component.u5v4w3x2.final.mjs'
730
+ },
731
+ scopes: {
732
+ '/shared-modules/vue2/': {
733
+ vue: '/shared-modules/vue2.q9r8s7t6.final.mjs',
734
+ 'vue-router':
735
+ '/shared-modules/vue2/router.y1z0a9b8.final.mjs'
736
+ }
737
+ }
738
+ };
739
+
740
+ const result = fixNestedScopesResolution(importMap);
741
+
742
+ assert.deepEqual(result.imports, importMap.imports);
743
+ assert.deepEqual(
744
+ result.scopes['/shared-modules/vue2/'],
745
+ importMap.scopes['/shared-modules/vue2/']
746
+ );
747
+
748
+ assert.deepEqual(
749
+ result.scopes['/shared-modules/vue2/component.u5v4w3x2.final.mjs'],
750
+ {
751
+ vue: '/shared-modules/vue2.q9r8s7t6.final.mjs',
752
+ 'vue-router': '/shared-modules/vue2/router.y1z0a9b8.final.mjs'
753
+ }
754
+ );
755
+ });
756
+
757
+ test('should handle complex priority scenarios with multiple nested levels', () => {
758
+ const importMap = {
759
+ imports: {
760
+ 'shared-modules/vue2':
761
+ '/shared-modules/vue2.c7d8e9f0.final.mjs',
762
+ 'shared-modules/vue2/test':
763
+ '/shared-modules/vue2/test.a1b2c3d4.final.mjs',
764
+ 'shared-modules/vue2/test/component':
765
+ '/shared-modules/vue2/test/component.e5f6g7h8.final.mjs',
766
+ 'shared-modules/vue': '/shared-modules/vue.i9j0k1l2.final.mjs'
767
+ },
768
+ scopes: {
769
+ '/shared-modules/': {
770
+ vue: '/shared-modules/vue.i9j0k1l2.final.mjs',
771
+ 'vue-router':
772
+ '/shared-modules/@esmx/router.m3n4o5p6.final.mjs'
773
+ },
774
+ '/shared-modules/vue2/': {
775
+ vue: '/shared-modules/vue2.c7d8e9f0.final.mjs',
776
+ 'vue-router':
777
+ '/shared-modules/vue2/@esmx/router-vue.q7r8s9t0.final.mjs'
778
+ },
779
+ '/shared-modules/vue2/test/': {
780
+ vue: '/shared-modules/vue2.c7d8e9f0.final.mjs',
781
+ 'test-utils':
782
+ '/shared-modules/vue2/test/utils.u1v2w3x4.final.mjs'
783
+ }
784
+ }
785
+ };
786
+
787
+ const expected = {
788
+ imports: {
789
+ 'shared-modules/vue2':
790
+ '/shared-modules/vue2.c7d8e9f0.final.mjs',
791
+ 'shared-modules/vue2/test':
792
+ '/shared-modules/vue2/test.a1b2c3d4.final.mjs',
793
+ 'shared-modules/vue2/test/component':
794
+ '/shared-modules/vue2/test/component.e5f6g7h8.final.mjs',
795
+ 'shared-modules/vue': '/shared-modules/vue.i9j0k1l2.final.mjs'
796
+ },
797
+ scopes: {
798
+ '/shared-modules/vue.i9j0k1l2.final.mjs': {
799
+ vue: '/shared-modules/vue.i9j0k1l2.final.mjs',
800
+ 'vue-router':
801
+ '/shared-modules/@esmx/router.m3n4o5p6.final.mjs'
802
+ },
803
+ '/shared-modules/vue2.c7d8e9f0.final.mjs': {
804
+ vue: '/shared-modules/vue.i9j0k1l2.final.mjs',
805
+ 'vue-router':
806
+ '/shared-modules/@esmx/router.m3n4o5p6.final.mjs'
807
+ },
808
+ '/shared-modules/vue2/test.a1b2c3d4.final.mjs': {
809
+ vue: '/shared-modules/vue2.c7d8e9f0.final.mjs',
810
+ 'vue-router':
811
+ '/shared-modules/vue2/@esmx/router-vue.q7r8s9t0.final.mjs'
812
+ },
813
+ '/shared-modules/vue2/test/component.e5f6g7h8.final.mjs': {
814
+ vue: '/shared-modules/vue2.c7d8e9f0.final.mjs',
815
+ 'test-utils':
816
+ '/shared-modules/vue2/test/utils.u1v2w3x4.final.mjs',
817
+ 'vue-router':
818
+ '/shared-modules/vue2/@esmx/router-vue.q7r8s9t0.final.mjs'
819
+ }
820
+ }
821
+ };
822
+
823
+ const result = fixNestedScopesResolution(importMap);
824
+ assert.deepEqual(result, expected);
825
+ });
826
+
827
+ test('should handle priority with overlapping nested scopes', () => {
828
+ const importMap = {
829
+ imports: {
830
+ 'shared-modules/vue2':
831
+ '/shared-modules/vue2.n3o4p5q6.final.mjs',
832
+ 'shared-modules/vue2/components':
833
+ '/shared-modules/vue2/components.r7s8t9u0.final.mjs',
834
+ 'shared-modules/vue2/components/button':
835
+ '/shared-modules/vue2/components/button.v1w2x3y4.final.mjs',
836
+ 'shared-modules/vue2/components/input':
837
+ '/shared-modules/vue2/components/input.z5a6b7c8.final.mjs'
838
+ },
839
+ scopes: {
840
+ '/shared-modules/vue2/': {
841
+ vue: '/shared-modules/vue2.n3o4p5q6.final.mjs',
842
+ 'vue-router':
843
+ '/shared-modules/vue2/@esmx/router-vue.d9e0f1g2.final.mjs'
844
+ },
845
+ '/shared-modules/vue2/components/': {
846
+ vue: '/shared-modules/vue2.n3o4p5q6.final.mjs',
847
+ 'component-utils':
848
+ '/shared-modules/vue2/components/utils.h3i4j5k6.final.mjs'
849
+ }
850
+ }
851
+ };
852
+
853
+ const expected = {
854
+ imports: {
855
+ 'shared-modules/vue2':
856
+ '/shared-modules/vue2.n3o4p5q6.final.mjs',
857
+ 'shared-modules/vue2/components':
858
+ '/shared-modules/vue2/components.r7s8t9u0.final.mjs',
859
+ 'shared-modules/vue2/components/button':
860
+ '/shared-modules/vue2/components/button.v1w2x3y4.final.mjs',
861
+ 'shared-modules/vue2/components/input':
862
+ '/shared-modules/vue2/components/input.z5a6b7c8.final.mjs'
863
+ },
864
+ scopes: {
865
+ '/shared-modules/vue2/components.r7s8t9u0.final.mjs': {
866
+ vue: '/shared-modules/vue2.n3o4p5q6.final.mjs',
867
+ 'vue-router':
868
+ '/shared-modules/vue2/@esmx/router-vue.d9e0f1g2.final.mjs'
869
+ },
870
+ '/shared-modules/vue2/components/button.v1w2x3y4.final.mjs': {
871
+ 'component-utils':
872
+ '/shared-modules/vue2/components/utils.h3i4j5k6.final.mjs',
873
+ vue: '/shared-modules/vue2.n3o4p5q6.final.mjs',
874
+ 'vue-router':
875
+ '/shared-modules/vue2/@esmx/router-vue.d9e0f1g2.final.mjs'
876
+ },
877
+ '/shared-modules/vue2/components/input.z5a6b7c8.final.mjs': {
878
+ 'component-utils':
879
+ '/shared-modules/vue2/components/utils.h3i4j5k6.final.mjs',
880
+ vue: '/shared-modules/vue2.n3o4p5q6.final.mjs',
881
+ 'vue-router':
882
+ '/shared-modules/vue2/@esmx/router-vue.d9e0f1g2.final.mjs'
883
+ }
884
+ }
885
+ };
886
+
887
+ const result = fixNestedScopesResolution(importMap);
888
+ assert.deepEqual(result, expected);
889
+ });
890
+
891
+ test('should handle very deeply nested scope priority scenarios', () => {
892
+ const importMap = {
893
+ imports: {
894
+ 'shared-modules/vue2':
895
+ '/shared-modules/vue2.l7m8n9o0.final.mjs',
896
+ 'shared-modules/vue2/test':
897
+ '/shared-modules/vue2/test.p1q2r3s4.final.mjs',
898
+ 'shared-modules/vue2/test/unit':
899
+ '/shared-modules/vue2/test/unit.t5u6v7w8.final.mjs',
900
+ 'shared-modules/vue2/test/unit/component':
901
+ '/shared-modules/vue2/test/unit/component.x9y0z1a2.final.mjs'
902
+ },
903
+ scopes: {
904
+ '/shared-modules/': {
905
+ vue: '/shared-modules/vue.b3c4d5e6.final.mjs'
906
+ },
907
+ '/shared-modules/vue2/': {
908
+ vue: '/shared-modules/vue2.l7m8n9o0.final.mjs'
909
+ },
910
+ '/shared-modules/vue2/test/': {
911
+ vue: '/shared-modules/vue2.l7m8n9o0.final.mjs',
912
+ 'test-utils':
913
+ '/shared-modules/vue2/test/utils.f7g8h9i0.final.mjs'
914
+ },
915
+ '/shared-modules/vue2/test/unit/': {
916
+ vue: '/shared-modules/vue2.l7m8n9o0.final.mjs',
917
+ 'test-utils':
918
+ '/shared-modules/vue2/test/utils.f7g8h9i0.final.mjs'
919
+ }
920
+ }
921
+ };
922
+
923
+ const expected = {
924
+ imports: {
925
+ 'shared-modules/vue2':
926
+ '/shared-modules/vue2.l7m8n9o0.final.mjs',
927
+ 'shared-modules/vue2/test':
928
+ '/shared-modules/vue2/test.p1q2r3s4.final.mjs',
929
+ 'shared-modules/vue2/test/unit':
930
+ '/shared-modules/vue2/test/unit.t5u6v7w8.final.mjs',
931
+ 'shared-modules/vue2/test/unit/component':
932
+ '/shared-modules/vue2/test/unit/component.x9y0z1a2.final.mjs'
933
+ },
934
+ scopes: {
935
+ '/shared-modules/vue2.l7m8n9o0.final.mjs': {
936
+ vue: '/shared-modules/vue.b3c4d5e6.final.mjs'
937
+ },
938
+ '/shared-modules/vue2/test.p1q2r3s4.final.mjs': {
939
+ vue: '/shared-modules/vue2.l7m8n9o0.final.mjs'
940
+ },
941
+ '/shared-modules/vue2/test/unit.t5u6v7w8.final.mjs': {
942
+ vue: '/shared-modules/vue2.l7m8n9o0.final.mjs',
943
+ 'test-utils':
944
+ '/shared-modules/vue2/test/utils.f7g8h9i0.final.mjs'
945
+ },
946
+ '/shared-modules/vue2/test/unit/component.x9y0z1a2.final.mjs': {
947
+ vue: '/shared-modules/vue2.l7m8n9o0.final.mjs',
948
+ 'test-utils':
949
+ '/shared-modules/vue2/test/utils.f7g8h9i0.final.mjs'
950
+ }
951
+ }
952
+ };
953
+
954
+ const result = fixNestedScopesResolution(importMap);
955
+ assert.deepEqual(result, expected);
956
+ });
957
+
958
+ test('should ensure different directory levels have distinct values for proper testing', () => {
959
+ const importMap = {
960
+ imports: {
961
+ 'shared-modules/level1':
962
+ '/shared-modules/level1.a1b2c3d4.final.mjs',
963
+ 'shared-modules/level1/level2':
964
+ '/shared-modules/level1/level2.e5f6g7h8.final.mjs',
965
+ 'shared-modules/level1/level2/level3':
966
+ '/shared-modules/level1/level2/level3.i9j0k1l2.final.mjs'
967
+ },
968
+ scopes: {
969
+ '/shared-modules/level1/': {
970
+ vue: '/shared-modules/level1.a1b2c3d4.final.mjs'
971
+ },
972
+ '/shared-modules/level1/level2/': {
973
+ vue: '/shared-modules/level1/level2.e5f6g7h8.final.mjs'
974
+ }
975
+ }
976
+ };
977
+
978
+ const expected = {
979
+ imports: {
980
+ 'shared-modules/level1':
981
+ '/shared-modules/level1.a1b2c3d4.final.mjs',
982
+ 'shared-modules/level1/level2':
983
+ '/shared-modules/level1/level2.e5f6g7h8.final.mjs',
984
+ 'shared-modules/level1/level2/level3':
985
+ '/shared-modules/level1/level2/level3.i9j0k1l2.final.mjs'
986
+ },
987
+ scopes: {
988
+ '/shared-modules/level1/level2.e5f6g7h8.final.mjs': {
989
+ vue: '/shared-modules/level1.a1b2c3d4.final.mjs'
990
+ },
991
+ '/shared-modules/level1/level2/level3.i9j0k1l2.final.mjs': {
992
+ vue: '/shared-modules/level1/level2.e5f6g7h8.final.mjs'
993
+ }
994
+ }
995
+ };
996
+
997
+ const result = fixNestedScopesResolution(importMap);
998
+ assert.deepEqual(result, expected);
999
+
1000
+ assert.equal(
1001
+ result.scopes['/shared-modules/level1/level2.e5f6g7h8.final.mjs']
1002
+ .vue,
1003
+ '/shared-modules/level1.a1b2c3d4.final.mjs'
1004
+ );
1005
+
1006
+ assert.equal(
1007
+ result.scopes[
1008
+ '/shared-modules/level1/level2/level3.i9j0k1l2.final.mjs'
1009
+ ].vue,
1010
+ '/shared-modules/level1/level2.e5f6g7h8.final.mjs'
1011
+ );
1012
+ });
1013
+
1014
+ test('should successfully delete properties using Reflect.deleteProperty', () => {
1015
+ const importMap = {
1016
+ imports: {
1017
+ 'shared/modules/vue2': '/shared/modules/vue2.a1b2c3d4.final.mjs'
1018
+ },
1019
+ scopes: {
1020
+ '/shared/modules/vue2/': {
1021
+ vue: '/shared/modules/vue2.a1b2c3d4.final.mjs'
1022
+ }
1023
+ }
1024
+ };
1025
+
1026
+ const result = fixNestedScopesResolution(importMap);
1027
+ assert.deepEqual(result.imports, importMap.imports);
1028
+ assert.isUndefined(result.scopes['/shared/modules/vue2/']);
1029
+ assert.doesNotThrow(() => {
1030
+ fixNestedScopesResolution(importMap);
1031
+ });
1032
+ });
1033
+
1034
+ describe('scope path processing logic', () => {
1035
+ test('should process all scope paths regardless of format', () => {
1036
+ const importMap = {
1037
+ imports: {
1038
+ 'shared/modules/vue2':
1039
+ '/shared/modules/vue2.a1b2c3d4.final.mjs',
1040
+ 'shared/vue': '/shared/vue.e5f6g7h8.final.mjs'
1041
+ },
1042
+ scopes: {
1043
+ 'shared/modules/vue2/': {
1044
+ vue: '/shared/modules/vue2.a1b2c3d4.final.mjs'
1045
+ },
1046
+ '/shared/modules/vue2': {
1047
+ vue: '/shared/modules/vue2.a1b2c3d4.final.mjs'
1048
+ },
1049
+ '/shared/': {
1050
+ vue: '/shared/vue.e5f6g7h8.final.mjs'
1051
+ },
1052
+ '/shared/modules/vue2/': {
1053
+ vue: '/shared/modules/vue2.a1b2c3d4.final.mjs'
1054
+ }
1055
+ }
1056
+ };
1057
+
1058
+ const expected = {
1059
+ imports: {
1060
+ 'shared/modules/vue2':
1061
+ '/shared/modules/vue2.a1b2c3d4.final.mjs',
1062
+ 'shared/vue': '/shared/vue.e5f6g7h8.final.mjs'
1063
+ },
1064
+ scopes: {
1065
+ '/shared/modules/vue2.a1b2c3d4.final.mjs': {
1066
+ vue: '/shared/modules/vue2.a1b2c3d4.final.mjs'
1067
+ },
1068
+ '/shared/vue.e5f6g7h8.final.mjs': {
1069
+ vue: '/shared/vue.e5f6g7h8.final.mjs'
1070
+ }
1071
+ }
1072
+ };
1073
+
1074
+ const result = fixNestedScopesResolution(importMap);
1075
+ assert.deepEqual(result, expected);
1076
+ });
1077
+
1078
+ test('should handle scope paths with any depth', () => {
1079
+ const importMap = {
1080
+ imports: {
1081
+ 'a/b/c': '/a/b/c.a1b2c3d4.final.mjs'
1082
+ },
1083
+ scopes: {
1084
+ '/a/b/c/': {
1085
+ vue: '/a/b/c.a1b2c3d4.final.mjs'
1086
+ }
1087
+ }
1088
+ };
1089
+
1090
+ const expected = {
1091
+ imports: {
1092
+ 'a/b/c': '/a/b/c.a1b2c3d4.final.mjs'
1093
+ },
1094
+ scopes: {}
1095
+ };
1096
+
1097
+ const result = fixNestedScopesResolution(importMap);
1098
+ assert.deepEqual(result, expected);
1099
+ });
1100
+
1101
+ test('should handle very deep nested scope paths', () => {
1102
+ const importMap = {
1103
+ imports: {
1104
+ 'a/b/c/d/e/f': '/a/b/c/d/e/f.a1b2c3d4.final.mjs'
1105
+ },
1106
+ scopes: {
1107
+ '/a/b/c/d/e/f/': {
1108
+ vue: '/a/b/c/d/e/f.a1b2c3d4.final.mjs'
1109
+ }
1110
+ }
1111
+ };
1112
+
1113
+ const expected = {
1114
+ imports: {
1115
+ 'a/b/c/d/e/f': '/a/b/c/d/e/f.a1b2c3d4.final.mjs'
1116
+ },
1117
+ scopes: {}
1118
+ };
1119
+
1120
+ const result = fixNestedScopesResolution(importMap);
1121
+ assert.deepEqual(result, expected);
1122
+ });
1123
+
1124
+ test('should create file-level scopes for all scope paths', () => {
1125
+ const importMap = {
1126
+ imports: {
1127
+ 'modules/vue': '/modules/vue.a1b2c3d4.final.mjs',
1128
+ 'shared/vue': '/shared/vue.e5f6g7h8.final.mjs'
1129
+ },
1130
+ scopes: {
1131
+ '/modules/': {
1132
+ vue: '/modules/vue.a1b2c3d4.final.mjs'
1133
+ },
1134
+ '/shared/': {
1135
+ vue: '/shared/vue.e5f6g7h8.final.mjs'
1136
+ }
1137
+ }
1138
+ };
1139
+
1140
+ const expected = {
1141
+ imports: {
1142
+ 'modules/vue': '/modules/vue.a1b2c3d4.final.mjs',
1143
+ 'shared/vue': '/shared/vue.e5f6g7h8.final.mjs'
1144
+ },
1145
+ scopes: {
1146
+ '/modules/vue.a1b2c3d4.final.mjs': {
1147
+ vue: '/modules/vue.a1b2c3d4.final.mjs'
1148
+ },
1149
+ '/shared/vue.e5f6g7h8.final.mjs': {
1150
+ vue: '/shared/vue.e5f6g7h8.final.mjs'
1151
+ }
1152
+ }
1153
+ };
1154
+
1155
+ const result = fixNestedScopesResolution(importMap);
1156
+ assert.deepEqual(result, expected);
1157
+ });
1158
+
1159
+ test('should process multiple scope paths in correct order by depth', () => {
1160
+ const importMap = {
1161
+ imports: {
1162
+ 'shared/modules/vue2':
1163
+ '/shared/modules/vue2.a1b2c3d4.final.mjs',
1164
+ 'shared/modules/vue2/component':
1165
+ '/shared/modules/vue2/component.e5f6g7h8.final.mjs',
1166
+ 'shared/modules/vue2/utils':
1167
+ '/shared/modules/vue2/utils.i9j0k1l2.final.mjs'
1168
+ },
1169
+ scopes: {
1170
+ '/shared/modules/vue2/': {
1171
+ vue: '/shared/modules/vue2.a1b2c3d4.final.mjs'
1172
+ },
1173
+ '/shared/modules/vue2/utils/': {
1174
+ 'test-utils':
1175
+ '/shared/modules/vue2/utils.i9j0k1l2.final.mjs'
1176
+ }
1177
+ }
1178
+ };
1179
+
1180
+ const expected = {
1181
+ imports: {
1182
+ 'shared/modules/vue2':
1183
+ '/shared/modules/vue2.a1b2c3d4.final.mjs',
1184
+ 'shared/modules/vue2/component':
1185
+ '/shared/modules/vue2/component.e5f6g7h8.final.mjs',
1186
+ 'shared/modules/vue2/utils':
1187
+ '/shared/modules/vue2/utils.i9j0k1l2.final.mjs'
1188
+ },
1189
+ scopes: {
1190
+ '/shared/modules/vue2/component.e5f6g7h8.final.mjs': {
1191
+ vue: '/shared/modules/vue2.a1b2c3d4.final.mjs'
1192
+ },
1193
+ '/shared/modules/vue2/utils.i9j0k1l2.final.mjs': {
1194
+ vue: '/shared/modules/vue2.a1b2c3d4.final.mjs'
1195
+ }
1196
+ }
1197
+ };
1198
+
1199
+ const result = fixNestedScopesResolution(importMap);
1200
+ assert.deepEqual(result, expected);
1201
+ });
1202
+ });
1203
+ });
1204
+
493
1205
  describe('buildScopesMap', () => {
494
1206
  test('should return empty object for empty manifests', () => {
495
1207
  const imports = {};