@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.
- package/README.md +4 -4
- package/README.zh-CN.md +4 -4
- package/dist/app.d.ts +27 -27
- package/dist/core.d.ts +274 -272
- package/dist/core.mjs +235 -232
- package/dist/pack-config.d.ts +92 -92
- package/dist/render-context.d.ts +465 -465
- package/dist/render-context.mjs +338 -338
- package/dist/utils/cache.d.ts +15 -15
- package/dist/utils/import-map.d.ts +31 -1
- package/dist/utils/import-map.mjs +18 -0
- package/dist/utils/import-map.test.mjs +577 -1
- package/dist/utils/middleware.d.ts +19 -19
- package/dist/utils/static-import-lexer.d.ts +12 -12
- package/dist/utils/static-import-lexer.mjs +1 -1
- package/package.json +3 -3
- package/src/app.ts +34 -34
- package/src/core.ts +320 -317
- package/src/pack-config.ts +92 -92
- package/src/render-context.ts +465 -465
- package/src/utils/cache.ts +15 -15
- package/src/utils/import-map.test.ts +713 -1
- package/src/utils/import-map.ts +53 -1
- package/src/utils/middleware.ts +19 -19
- package/src/utils/static-import-lexer.ts +18 -18
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { assert, describe, test } from "vitest";
|
|
2
|
-
import {
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
* //
|
|
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;
|