@esmx/core 3.0.0-rc.60 → 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.mjs";
2
+ import {
3
+ buildImportsMap,
4
+ buildScopesMap,
5
+ fixNestedScopesResolution,
6
+ getImportMap
7
+ } from "./import-map.mjs";
3
8
  describe("buildImportsMap", () => {
4
9
  test("should return empty object for empty manifests", () => {
5
10
  const result = buildImportsMap([], (name, file) => `${name}/${file}`);
@@ -439,6 +444,577 @@ describe("buildImportsMap", () => {
439
444
  });
440
445
  });
441
446
  });
447
+ describe("fixNestedScopesResolution", () => {
448
+ test("should return unchanged import map for empty scopes", () => {
449
+ const importMap = {
450
+ imports: {
451
+ "shared-modules/vue": "/shared-modules/vue.620a1e89.final.mjs"
452
+ },
453
+ scopes: {}
454
+ };
455
+ const result = fixNestedScopesResolution(importMap);
456
+ assert.deepEqual(result, importMap);
457
+ });
458
+ test("should return unchanged import map for shallow scopes only", () => {
459
+ const importMap = {
460
+ imports: {
461
+ "shared-modules/vue": "/shared-modules/vue.620a1e89.final.mjs"
462
+ },
463
+ scopes: {
464
+ "/shared-modules/": {
465
+ vue: "/shared-modules/vue.620a1e89.final.mjs"
466
+ }
467
+ }
468
+ };
469
+ const result = fixNestedScopesResolution(importMap);
470
+ assert.deepEqual(result, importMap);
471
+ });
472
+ test("should create file-level scopes for nested scopes", () => {
473
+ const importMap = {
474
+ imports: {
475
+ "shared-modules/vue2": "/shared-modules/vue2.a1b2c3d4.final.mjs",
476
+ "shared-modules/vue2/@esmx/router-vue": "/shared-modules/vue2/@esmx/router-vue.e5f6g7h8.final.mjs",
477
+ "shared-modules/vue2/index": "/shared-modules/vue2/index.i9j0k1l2.final.mjs",
478
+ "shared-modules/vue": "/shared-modules/vue.m3n4o5p6.final.mjs"
479
+ },
480
+ scopes: {
481
+ "/shared-modules/": {
482
+ vue: "/shared-modules/vue.m3n4o5p6.final.mjs"
483
+ },
484
+ "/shared-modules/vue2/": {
485
+ vue: "/shared-modules/vue2.a1b2c3d4.final.mjs"
486
+ }
487
+ }
488
+ };
489
+ const expected = {
490
+ imports: {
491
+ "shared-modules/vue2": "/shared-modules/vue2.a1b2c3d4.final.mjs",
492
+ "shared-modules/vue2/@esmx/router-vue": "/shared-modules/vue2/@esmx/router-vue.e5f6g7h8.final.mjs",
493
+ "shared-modules/vue2/index": "/shared-modules/vue2/index.i9j0k1l2.final.mjs",
494
+ "shared-modules/vue": "/shared-modules/vue.m3n4o5p6.final.mjs"
495
+ },
496
+ scopes: {
497
+ "/shared-modules/vue.m3n4o5p6.final.mjs": {
498
+ vue: "/shared-modules/vue.m3n4o5p6.final.mjs"
499
+ },
500
+ "/shared-modules/vue2.a1b2c3d4.final.mjs": {
501
+ vue: "/shared-modules/vue.m3n4o5p6.final.mjs"
502
+ },
503
+ "/shared-modules/vue2/@esmx/router-vue.e5f6g7h8.final.mjs": {
504
+ vue: "/shared-modules/vue2.a1b2c3d4.final.mjs"
505
+ },
506
+ "/shared-modules/vue2/index.i9j0k1l2.final.mjs": {
507
+ vue: "/shared-modules/vue2.a1b2c3d4.final.mjs"
508
+ }
509
+ }
510
+ };
511
+ const result = fixNestedScopesResolution(importMap);
512
+ assert.deepEqual(result, expected);
513
+ });
514
+ test("should handle multiple nested scopes correctly", () => {
515
+ const importMap = {
516
+ imports: {
517
+ "shared-modules/vue2": "/shared-modules/vue2.q7r8s9t0.final.mjs",
518
+ "shared-modules/vue2/component": "/shared-modules/vue2/component.u1v2w3x4.final.mjs",
519
+ "shared-modules/vue3": "/shared-modules/vue3.y5z6a7b8.final.mjs",
520
+ "shared-modules/vue3/component": "/shared-modules/vue3/component.c9d0e1f2.final.mjs",
521
+ "shared-modules/vue": "/shared-modules/vue.g3h4i5j6.final.mjs"
522
+ },
523
+ scopes: {
524
+ "/shared-modules/": {
525
+ vue: "/shared-modules/vue.g3h4i5j6.final.mjs"
526
+ },
527
+ "/shared-modules/vue2/": {
528
+ vue: "/shared-modules/vue2.q7r8s9t0.final.mjs"
529
+ },
530
+ "/shared-modules/vue3/": {
531
+ vue: "/shared-modules/vue3.y5z6a7b8.final.mjs"
532
+ }
533
+ }
534
+ };
535
+ const expected = {
536
+ imports: {
537
+ "shared-modules/vue2": "/shared-modules/vue2.q7r8s9t0.final.mjs",
538
+ "shared-modules/vue2/component": "/shared-modules/vue2/component.u1v2w3x4.final.mjs",
539
+ "shared-modules/vue3": "/shared-modules/vue3.y5z6a7b8.final.mjs",
540
+ "shared-modules/vue3/component": "/shared-modules/vue3/component.c9d0e1f2.final.mjs",
541
+ "shared-modules/vue": "/shared-modules/vue.g3h4i5j6.final.mjs"
542
+ },
543
+ scopes: {
544
+ "/shared-modules/vue.g3h4i5j6.final.mjs": {
545
+ vue: "/shared-modules/vue.g3h4i5j6.final.mjs"
546
+ },
547
+ "/shared-modules/vue2.q7r8s9t0.final.mjs": {
548
+ vue: "/shared-modules/vue.g3h4i5j6.final.mjs"
549
+ },
550
+ "/shared-modules/vue2/component.u1v2w3x4.final.mjs": {
551
+ vue: "/shared-modules/vue2.q7r8s9t0.final.mjs"
552
+ },
553
+ "/shared-modules/vue3.y5z6a7b8.final.mjs": {
554
+ vue: "/shared-modules/vue.g3h4i5j6.final.mjs"
555
+ },
556
+ "/shared-modules/vue3/component.c9d0e1f2.final.mjs": {
557
+ vue: "/shared-modules/vue3.y5z6a7b8.final.mjs"
558
+ }
559
+ }
560
+ };
561
+ const result = fixNestedScopesResolution(importMap);
562
+ assert.deepEqual(result, expected);
563
+ });
564
+ test("should handle deeply nested scopes", () => {
565
+ const importMap = {
566
+ imports: {
567
+ "shared-modules/vue2/components/button": "/shared-modules/vue2/components/button.k7l8m9n0.final.mjs",
568
+ "shared-modules/vue2/components/input": "/shared-modules/vue2/components/input.o1p2q3r4.final.mjs"
569
+ },
570
+ scopes: {
571
+ "/shared-modules/vue2/components/": {
572
+ vue: "/shared-modules/vue2.s5t6u7v8.final.mjs"
573
+ }
574
+ }
575
+ };
576
+ const expected = {
577
+ imports: {
578
+ "shared-modules/vue2/components/button": "/shared-modules/vue2/components/button.k7l8m9n0.final.mjs",
579
+ "shared-modules/vue2/components/input": "/shared-modules/vue2/components/input.o1p2q3r4.final.mjs"
580
+ },
581
+ scopes: {
582
+ "/shared-modules/vue2/components/button.k7l8m9n0.final.mjs": {
583
+ vue: "/shared-modules/vue2.s5t6u7v8.final.mjs"
584
+ },
585
+ "/shared-modules/vue2/components/input.o1p2q3r4.final.mjs": {
586
+ vue: "/shared-modules/vue2.s5t6u7v8.final.mjs"
587
+ }
588
+ }
589
+ };
590
+ const result = fixNestedScopesResolution(importMap);
591
+ assert.deepEqual(result, expected);
592
+ });
593
+ test("should not create file-level scopes for imports not matching nested scope", () => {
594
+ const importMap = {
595
+ imports: {
596
+ "shared-modules/vue": "/shared-modules/vue.w9x0y1z2.final.mjs",
597
+ "shared-modules/vue2/component": "/shared-modules/vue2/component.a3b4c5d6.final.mjs",
598
+ "other-modules/component": "/other-modules/component.e7f8g9h0.final.mjs"
599
+ },
600
+ scopes: {
601
+ "/shared-modules/vue2/": {
602
+ vue: "/shared-modules/vue2.i1j2k3l4.final.mjs"
603
+ }
604
+ }
605
+ };
606
+ const expected = {
607
+ imports: importMap.imports,
608
+ scopes: {
609
+ "/shared-modules/vue2/component.a3b4c5d6.final.mjs": {
610
+ vue: "/shared-modules/vue2.i1j2k3l4.final.mjs"
611
+ }
612
+ }
613
+ };
614
+ const result = fixNestedScopesResolution(importMap);
615
+ assert.deepEqual(result, expected);
616
+ });
617
+ test("should handle empty imports", () => {
618
+ const importMap = {
619
+ imports: {},
620
+ scopes: {
621
+ "/shared-modules/vue2/": {
622
+ vue: "/shared-modules/vue2.m5n6o7p8.final.mjs"
623
+ }
624
+ }
625
+ };
626
+ const expected = {
627
+ imports: {},
628
+ scopes: {}
629
+ };
630
+ const result = fixNestedScopesResolution(importMap);
631
+ assert.deepEqual(result, expected);
632
+ });
633
+ test("should preserve original import map structure", () => {
634
+ const importMap = {
635
+ imports: {
636
+ "shared-modules/vue2": "/shared-modules/vue2.q9r8s7t6.final.mjs",
637
+ "shared-modules/vue2/component": "/shared-modules/vue2/component.u5v4w3x2.final.mjs"
638
+ },
639
+ scopes: {
640
+ "/shared-modules/vue2/": {
641
+ vue: "/shared-modules/vue2.q9r8s7t6.final.mjs",
642
+ "vue-router": "/shared-modules/vue2/router.y1z0a9b8.final.mjs"
643
+ }
644
+ }
645
+ };
646
+ const result = fixNestedScopesResolution(importMap);
647
+ assert.deepEqual(result.imports, importMap.imports);
648
+ assert.deepEqual(
649
+ result.scopes["/shared-modules/vue2/"],
650
+ importMap.scopes["/shared-modules/vue2/"]
651
+ );
652
+ assert.deepEqual(
653
+ result.scopes["/shared-modules/vue2/component.u5v4w3x2.final.mjs"],
654
+ {
655
+ vue: "/shared-modules/vue2.q9r8s7t6.final.mjs",
656
+ "vue-router": "/shared-modules/vue2/router.y1z0a9b8.final.mjs"
657
+ }
658
+ );
659
+ });
660
+ test("should handle complex priority scenarios with multiple nested levels", () => {
661
+ const importMap = {
662
+ imports: {
663
+ "shared-modules/vue2": "/shared-modules/vue2.c7d8e9f0.final.mjs",
664
+ "shared-modules/vue2/test": "/shared-modules/vue2/test.a1b2c3d4.final.mjs",
665
+ "shared-modules/vue2/test/component": "/shared-modules/vue2/test/component.e5f6g7h8.final.mjs",
666
+ "shared-modules/vue": "/shared-modules/vue.i9j0k1l2.final.mjs"
667
+ },
668
+ scopes: {
669
+ "/shared-modules/": {
670
+ vue: "/shared-modules/vue.i9j0k1l2.final.mjs",
671
+ "vue-router": "/shared-modules/@esmx/router.m3n4o5p6.final.mjs"
672
+ },
673
+ "/shared-modules/vue2/": {
674
+ vue: "/shared-modules/vue2.c7d8e9f0.final.mjs",
675
+ "vue-router": "/shared-modules/vue2/@esmx/router-vue.q7r8s9t0.final.mjs"
676
+ },
677
+ "/shared-modules/vue2/test/": {
678
+ vue: "/shared-modules/vue2.c7d8e9f0.final.mjs",
679
+ "test-utils": "/shared-modules/vue2/test/utils.u1v2w3x4.final.mjs"
680
+ }
681
+ }
682
+ };
683
+ const expected = {
684
+ imports: {
685
+ "shared-modules/vue2": "/shared-modules/vue2.c7d8e9f0.final.mjs",
686
+ "shared-modules/vue2/test": "/shared-modules/vue2/test.a1b2c3d4.final.mjs",
687
+ "shared-modules/vue2/test/component": "/shared-modules/vue2/test/component.e5f6g7h8.final.mjs",
688
+ "shared-modules/vue": "/shared-modules/vue.i9j0k1l2.final.mjs"
689
+ },
690
+ scopes: {
691
+ "/shared-modules/vue.i9j0k1l2.final.mjs": {
692
+ vue: "/shared-modules/vue.i9j0k1l2.final.mjs",
693
+ "vue-router": "/shared-modules/@esmx/router.m3n4o5p6.final.mjs"
694
+ },
695
+ "/shared-modules/vue2.c7d8e9f0.final.mjs": {
696
+ vue: "/shared-modules/vue.i9j0k1l2.final.mjs",
697
+ "vue-router": "/shared-modules/@esmx/router.m3n4o5p6.final.mjs"
698
+ },
699
+ "/shared-modules/vue2/test.a1b2c3d4.final.mjs": {
700
+ vue: "/shared-modules/vue2.c7d8e9f0.final.mjs",
701
+ "vue-router": "/shared-modules/vue2/@esmx/router-vue.q7r8s9t0.final.mjs"
702
+ },
703
+ "/shared-modules/vue2/test/component.e5f6g7h8.final.mjs": {
704
+ vue: "/shared-modules/vue2.c7d8e9f0.final.mjs",
705
+ "test-utils": "/shared-modules/vue2/test/utils.u1v2w3x4.final.mjs",
706
+ "vue-router": "/shared-modules/vue2/@esmx/router-vue.q7r8s9t0.final.mjs"
707
+ }
708
+ }
709
+ };
710
+ const result = fixNestedScopesResolution(importMap);
711
+ assert.deepEqual(result, expected);
712
+ });
713
+ test("should handle priority with overlapping nested scopes", () => {
714
+ const importMap = {
715
+ imports: {
716
+ "shared-modules/vue2": "/shared-modules/vue2.n3o4p5q6.final.mjs",
717
+ "shared-modules/vue2/components": "/shared-modules/vue2/components.r7s8t9u0.final.mjs",
718
+ "shared-modules/vue2/components/button": "/shared-modules/vue2/components/button.v1w2x3y4.final.mjs",
719
+ "shared-modules/vue2/components/input": "/shared-modules/vue2/components/input.z5a6b7c8.final.mjs"
720
+ },
721
+ scopes: {
722
+ "/shared-modules/vue2/": {
723
+ vue: "/shared-modules/vue2.n3o4p5q6.final.mjs",
724
+ "vue-router": "/shared-modules/vue2/@esmx/router-vue.d9e0f1g2.final.mjs"
725
+ },
726
+ "/shared-modules/vue2/components/": {
727
+ vue: "/shared-modules/vue2.n3o4p5q6.final.mjs",
728
+ "component-utils": "/shared-modules/vue2/components/utils.h3i4j5k6.final.mjs"
729
+ }
730
+ }
731
+ };
732
+ const expected = {
733
+ imports: {
734
+ "shared-modules/vue2": "/shared-modules/vue2.n3o4p5q6.final.mjs",
735
+ "shared-modules/vue2/components": "/shared-modules/vue2/components.r7s8t9u0.final.mjs",
736
+ "shared-modules/vue2/components/button": "/shared-modules/vue2/components/button.v1w2x3y4.final.mjs",
737
+ "shared-modules/vue2/components/input": "/shared-modules/vue2/components/input.z5a6b7c8.final.mjs"
738
+ },
739
+ scopes: {
740
+ "/shared-modules/vue2/components.r7s8t9u0.final.mjs": {
741
+ vue: "/shared-modules/vue2.n3o4p5q6.final.mjs",
742
+ "vue-router": "/shared-modules/vue2/@esmx/router-vue.d9e0f1g2.final.mjs"
743
+ },
744
+ "/shared-modules/vue2/components/button.v1w2x3y4.final.mjs": {
745
+ "component-utils": "/shared-modules/vue2/components/utils.h3i4j5k6.final.mjs",
746
+ vue: "/shared-modules/vue2.n3o4p5q6.final.mjs",
747
+ "vue-router": "/shared-modules/vue2/@esmx/router-vue.d9e0f1g2.final.mjs"
748
+ },
749
+ "/shared-modules/vue2/components/input.z5a6b7c8.final.mjs": {
750
+ "component-utils": "/shared-modules/vue2/components/utils.h3i4j5k6.final.mjs",
751
+ vue: "/shared-modules/vue2.n3o4p5q6.final.mjs",
752
+ "vue-router": "/shared-modules/vue2/@esmx/router-vue.d9e0f1g2.final.mjs"
753
+ }
754
+ }
755
+ };
756
+ const result = fixNestedScopesResolution(importMap);
757
+ assert.deepEqual(result, expected);
758
+ });
759
+ test("should handle very deeply nested scope priority scenarios", () => {
760
+ const importMap = {
761
+ imports: {
762
+ "shared-modules/vue2": "/shared-modules/vue2.l7m8n9o0.final.mjs",
763
+ "shared-modules/vue2/test": "/shared-modules/vue2/test.p1q2r3s4.final.mjs",
764
+ "shared-modules/vue2/test/unit": "/shared-modules/vue2/test/unit.t5u6v7w8.final.mjs",
765
+ "shared-modules/vue2/test/unit/component": "/shared-modules/vue2/test/unit/component.x9y0z1a2.final.mjs"
766
+ },
767
+ scopes: {
768
+ "/shared-modules/": {
769
+ vue: "/shared-modules/vue.b3c4d5e6.final.mjs"
770
+ },
771
+ "/shared-modules/vue2/": {
772
+ vue: "/shared-modules/vue2.l7m8n9o0.final.mjs"
773
+ },
774
+ "/shared-modules/vue2/test/": {
775
+ vue: "/shared-modules/vue2.l7m8n9o0.final.mjs",
776
+ "test-utils": "/shared-modules/vue2/test/utils.f7g8h9i0.final.mjs"
777
+ },
778
+ "/shared-modules/vue2/test/unit/": {
779
+ vue: "/shared-modules/vue2.l7m8n9o0.final.mjs",
780
+ "test-utils": "/shared-modules/vue2/test/utils.f7g8h9i0.final.mjs"
781
+ }
782
+ }
783
+ };
784
+ const expected = {
785
+ imports: {
786
+ "shared-modules/vue2": "/shared-modules/vue2.l7m8n9o0.final.mjs",
787
+ "shared-modules/vue2/test": "/shared-modules/vue2/test.p1q2r3s4.final.mjs",
788
+ "shared-modules/vue2/test/unit": "/shared-modules/vue2/test/unit.t5u6v7w8.final.mjs",
789
+ "shared-modules/vue2/test/unit/component": "/shared-modules/vue2/test/unit/component.x9y0z1a2.final.mjs"
790
+ },
791
+ scopes: {
792
+ "/shared-modules/vue2.l7m8n9o0.final.mjs": {
793
+ vue: "/shared-modules/vue.b3c4d5e6.final.mjs"
794
+ },
795
+ "/shared-modules/vue2/test.p1q2r3s4.final.mjs": {
796
+ vue: "/shared-modules/vue2.l7m8n9o0.final.mjs"
797
+ },
798
+ "/shared-modules/vue2/test/unit.t5u6v7w8.final.mjs": {
799
+ vue: "/shared-modules/vue2.l7m8n9o0.final.mjs",
800
+ "test-utils": "/shared-modules/vue2/test/utils.f7g8h9i0.final.mjs"
801
+ },
802
+ "/shared-modules/vue2/test/unit/component.x9y0z1a2.final.mjs": {
803
+ vue: "/shared-modules/vue2.l7m8n9o0.final.mjs",
804
+ "test-utils": "/shared-modules/vue2/test/utils.f7g8h9i0.final.mjs"
805
+ }
806
+ }
807
+ };
808
+ const result = fixNestedScopesResolution(importMap);
809
+ assert.deepEqual(result, expected);
810
+ });
811
+ test("should ensure different directory levels have distinct values for proper testing", () => {
812
+ const importMap = {
813
+ imports: {
814
+ "shared-modules/level1": "/shared-modules/level1.a1b2c3d4.final.mjs",
815
+ "shared-modules/level1/level2": "/shared-modules/level1/level2.e5f6g7h8.final.mjs",
816
+ "shared-modules/level1/level2/level3": "/shared-modules/level1/level2/level3.i9j0k1l2.final.mjs"
817
+ },
818
+ scopes: {
819
+ "/shared-modules/level1/": {
820
+ vue: "/shared-modules/level1.a1b2c3d4.final.mjs"
821
+ },
822
+ "/shared-modules/level1/level2/": {
823
+ vue: "/shared-modules/level1/level2.e5f6g7h8.final.mjs"
824
+ }
825
+ }
826
+ };
827
+ const expected = {
828
+ imports: {
829
+ "shared-modules/level1": "/shared-modules/level1.a1b2c3d4.final.mjs",
830
+ "shared-modules/level1/level2": "/shared-modules/level1/level2.e5f6g7h8.final.mjs",
831
+ "shared-modules/level1/level2/level3": "/shared-modules/level1/level2/level3.i9j0k1l2.final.mjs"
832
+ },
833
+ scopes: {
834
+ "/shared-modules/level1/level2.e5f6g7h8.final.mjs": {
835
+ vue: "/shared-modules/level1.a1b2c3d4.final.mjs"
836
+ },
837
+ "/shared-modules/level1/level2/level3.i9j0k1l2.final.mjs": {
838
+ vue: "/shared-modules/level1/level2.e5f6g7h8.final.mjs"
839
+ }
840
+ }
841
+ };
842
+ const result = fixNestedScopesResolution(importMap);
843
+ assert.deepEqual(result, expected);
844
+ assert.equal(
845
+ result.scopes["/shared-modules/level1/level2.e5f6g7h8.final.mjs"].vue,
846
+ "/shared-modules/level1.a1b2c3d4.final.mjs"
847
+ );
848
+ assert.equal(
849
+ result.scopes["/shared-modules/level1/level2/level3.i9j0k1l2.final.mjs"].vue,
850
+ "/shared-modules/level1/level2.e5f6g7h8.final.mjs"
851
+ );
852
+ });
853
+ test("should successfully delete properties using Reflect.deleteProperty", () => {
854
+ const importMap = {
855
+ imports: {
856
+ "shared/modules/vue2": "/shared/modules/vue2.a1b2c3d4.final.mjs"
857
+ },
858
+ scopes: {
859
+ "/shared/modules/vue2/": {
860
+ vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
861
+ }
862
+ }
863
+ };
864
+ const result = fixNestedScopesResolution(importMap);
865
+ assert.deepEqual(result.imports, importMap.imports);
866
+ assert.isUndefined(result.scopes["/shared/modules/vue2/"]);
867
+ assert.doesNotThrow(() => {
868
+ fixNestedScopesResolution(importMap);
869
+ });
870
+ });
871
+ describe("scope path processing logic", () => {
872
+ test("should process all scope paths regardless of format", () => {
873
+ const importMap = {
874
+ imports: {
875
+ "shared/modules/vue2": "/shared/modules/vue2.a1b2c3d4.final.mjs",
876
+ "shared/vue": "/shared/vue.e5f6g7h8.final.mjs"
877
+ },
878
+ scopes: {
879
+ "shared/modules/vue2/": {
880
+ vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
881
+ },
882
+ "/shared/modules/vue2": {
883
+ vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
884
+ },
885
+ "/shared/": {
886
+ vue: "/shared/vue.e5f6g7h8.final.mjs"
887
+ },
888
+ "/shared/modules/vue2/": {
889
+ vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
890
+ }
891
+ }
892
+ };
893
+ const expected = {
894
+ imports: {
895
+ "shared/modules/vue2": "/shared/modules/vue2.a1b2c3d4.final.mjs",
896
+ "shared/vue": "/shared/vue.e5f6g7h8.final.mjs"
897
+ },
898
+ scopes: {
899
+ "/shared/modules/vue2.a1b2c3d4.final.mjs": {
900
+ vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
901
+ },
902
+ "/shared/vue.e5f6g7h8.final.mjs": {
903
+ vue: "/shared/vue.e5f6g7h8.final.mjs"
904
+ }
905
+ }
906
+ };
907
+ const result = fixNestedScopesResolution(importMap);
908
+ assert.deepEqual(result, expected);
909
+ });
910
+ test("should handle scope paths with any depth", () => {
911
+ const importMap = {
912
+ imports: {
913
+ "a/b/c": "/a/b/c.a1b2c3d4.final.mjs"
914
+ },
915
+ scopes: {
916
+ "/a/b/c/": {
917
+ vue: "/a/b/c.a1b2c3d4.final.mjs"
918
+ }
919
+ }
920
+ };
921
+ const expected = {
922
+ imports: {
923
+ "a/b/c": "/a/b/c.a1b2c3d4.final.mjs"
924
+ },
925
+ scopes: {}
926
+ };
927
+ const result = fixNestedScopesResolution(importMap);
928
+ assert.deepEqual(result, expected);
929
+ });
930
+ test("should handle very deep nested scope paths", () => {
931
+ const importMap = {
932
+ imports: {
933
+ "a/b/c/d/e/f": "/a/b/c/d/e/f.a1b2c3d4.final.mjs"
934
+ },
935
+ scopes: {
936
+ "/a/b/c/d/e/f/": {
937
+ vue: "/a/b/c/d/e/f.a1b2c3d4.final.mjs"
938
+ }
939
+ }
940
+ };
941
+ const expected = {
942
+ imports: {
943
+ "a/b/c/d/e/f": "/a/b/c/d/e/f.a1b2c3d4.final.mjs"
944
+ },
945
+ scopes: {}
946
+ };
947
+ const result = fixNestedScopesResolution(importMap);
948
+ assert.deepEqual(result, expected);
949
+ });
950
+ test("should create file-level scopes for all scope paths", () => {
951
+ const importMap = {
952
+ imports: {
953
+ "modules/vue": "/modules/vue.a1b2c3d4.final.mjs",
954
+ "shared/vue": "/shared/vue.e5f6g7h8.final.mjs"
955
+ },
956
+ scopes: {
957
+ "/modules/": {
958
+ vue: "/modules/vue.a1b2c3d4.final.mjs"
959
+ },
960
+ "/shared/": {
961
+ vue: "/shared/vue.e5f6g7h8.final.mjs"
962
+ }
963
+ }
964
+ };
965
+ const expected = {
966
+ imports: {
967
+ "modules/vue": "/modules/vue.a1b2c3d4.final.mjs",
968
+ "shared/vue": "/shared/vue.e5f6g7h8.final.mjs"
969
+ },
970
+ scopes: {
971
+ "/modules/vue.a1b2c3d4.final.mjs": {
972
+ vue: "/modules/vue.a1b2c3d4.final.mjs"
973
+ },
974
+ "/shared/vue.e5f6g7h8.final.mjs": {
975
+ vue: "/shared/vue.e5f6g7h8.final.mjs"
976
+ }
977
+ }
978
+ };
979
+ const result = fixNestedScopesResolution(importMap);
980
+ assert.deepEqual(result, expected);
981
+ });
982
+ test("should process multiple scope paths in correct order by depth", () => {
983
+ const importMap = {
984
+ imports: {
985
+ "shared/modules/vue2": "/shared/modules/vue2.a1b2c3d4.final.mjs",
986
+ "shared/modules/vue2/component": "/shared/modules/vue2/component.e5f6g7h8.final.mjs",
987
+ "shared/modules/vue2/utils": "/shared/modules/vue2/utils.i9j0k1l2.final.mjs"
988
+ },
989
+ scopes: {
990
+ "/shared/modules/vue2/": {
991
+ vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
992
+ },
993
+ "/shared/modules/vue2/utils/": {
994
+ "test-utils": "/shared/modules/vue2/utils.i9j0k1l2.final.mjs"
995
+ }
996
+ }
997
+ };
998
+ const expected = {
999
+ imports: {
1000
+ "shared/modules/vue2": "/shared/modules/vue2.a1b2c3d4.final.mjs",
1001
+ "shared/modules/vue2/component": "/shared/modules/vue2/component.e5f6g7h8.final.mjs",
1002
+ "shared/modules/vue2/utils": "/shared/modules/vue2/utils.i9j0k1l2.final.mjs"
1003
+ },
1004
+ scopes: {
1005
+ "/shared/modules/vue2/component.e5f6g7h8.final.mjs": {
1006
+ vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
1007
+ },
1008
+ "/shared/modules/vue2/utils.i9j0k1l2.final.mjs": {
1009
+ vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
1010
+ }
1011
+ }
1012
+ };
1013
+ const result = fixNestedScopesResolution(importMap);
1014
+ assert.deepEqual(result, expected);
1015
+ });
1016
+ });
1017
+ });
442
1018
  describe("buildScopesMap", () => {
443
1019
  test("should return empty object for empty manifests", () => {
444
1020
  const imports = {};
@@ -1,18 +1,18 @@
1
1
  import type { IncomingMessage, ServerResponse } from 'node:http';
2
2
  import type { Esmx } from '../core';
3
3
  /**
4
- * 中间件函数类型定义
4
+ * Middleware function type definition
5
5
  *
6
6
  * @description
7
- * 中间件是一个函数,用于处理 HTTP 请求。它接收请求对象、响应对象和下一个中间件函数作为参数。
8
- * 中间件可以执行以下操作:
9
- * - 修改请求和响应对象
10
- * - 结束请求-响应循环
11
- * - 调用下一个中间件
7
+ * Middleware is a function used to handle HTTP requests. It receives the request object, response object, and the next middleware function as parameters.
8
+ * Middleware can perform the following operations:
9
+ * - Modify request and response objects
10
+ * - End the request-response cycle
11
+ * - Call the next middleware
12
12
  *
13
13
  * @example
14
14
  * ```ts
15
- * // 创建一个简单的日志中间件
15
+ * // Create a simple logging middleware
16
16
  * const loggerMiddleware: Middleware = (req, res, next) => {
17
17
  * console.log(`${req.method} ${req.url}`);
18
18
  * next();
@@ -21,21 +21,21 @@ import type { Esmx } from '../core';
21
21
  */
22
22
  export type Middleware = (req: IncomingMessage, res: ServerResponse, next: Function) => void;
23
23
  /**
24
- * 判断文件路径是否是一个符合 esmx 规范的不可变文件
25
- * @param path 文件路径
24
+ * Determine if a file path is an immutable file that complies with esmx specifications
25
+ * @param path File path
26
26
  */
27
27
  export declare function isImmutableFile(filename: string): boolean;
28
28
  /**
29
- * 创建 Esmx 应用的中间件
29
+ * Create middleware for Esmx application
30
30
  *
31
- * @param esmx - Esmx 实例
32
- * @returns 返回一个处理静态资源的中间件
31
+ * @param esmx - Esmx instance
32
+ * @returns Returns a middleware that handles static resources
33
33
  *
34
34
  * @description
35
- * 该函数创建一个中间件,用于处理模块的静态资源请求。它会:
36
- * - 根据模块配置创建对应的静态资源中间件
37
- * - 处理资源的缓存控制
38
- * - 支持不可变文件的长期缓存
35
+ * This function creates a middleware to handle static resource requests for modules. It will:
36
+ * - Create corresponding static resource middleware based on module configuration
37
+ * - Handle cache control for resources
38
+ * - Support long-term caching for immutable files
39
39
  *
40
40
  * @example
41
41
  * ```ts
@@ -44,14 +44,14 @@ export declare function isImmutableFile(filename: string): boolean;
44
44
  * const esmx = new Esmx();
45
45
  * const middleware = createMiddleware(esmx);
46
46
  *
47
- * // HTTP 服务器中使用
47
+ * // Use in HTTP server
48
48
  * server.use(middleware);
49
49
  * ```
50
50
  */
51
51
  export declare function createMiddleware(esmx: Esmx): Middleware;
52
52
  /**
53
- * 将多个中间件,合并成一个中间件执行
54
- * @param middlewares 中间件列表
53
+ * Merge multiple middlewares into one middleware execution
54
+ * @param middlewares List of middlewares
55
55
  * @returns
56
56
  */
57
57
  export declare function mergeMiddlewares(middlewares: Middleware[]): Middleware;