@esmx/core
Version:
A high-performance microfrontend framework supporting Vue, React, Preact, Solid, and Svelte with SSR and Module Linking capabilities.
1,587 lines (1,586 loc) • 48.8 kB
JavaScript
import { assert, describe, test } from "vitest";
import {
compressImportMap,
createImportMap,
createImportsMap,
createScopesMap,
fixImportMapNestedScopes
} from "./import-map.mjs";
describe("createImportsMap", () => {
test("should return empty object for empty manifests", () => {
const result = createImportsMap([], (name, file) => `${name}/${file}`);
assert.deepEqual(result, {});
});
test("should process all exports including package exports", () => {
const manifests = [
{
name: "test-module",
exports: {
component: {
name: "component",
pkg: false,
file: "component.js",
identifier: "test-module/component"
},
vue: {
name: "vue",
pkg: true,
file: "vue.js",
identifier: "test-module/vue"
}
},
scopes: {}
}
];
const result = createImportsMap(
manifests,
(name, file) => `${name}/${file}`
);
assert.deepEqual(result, {
"test-module/component": "test-module/component.js",
"test-module/vue": "test-module/vue.js"
});
});
test("should create aliases for index suffixes", () => {
const manifests = [
{
name: "test-module",
exports: {
"src/index": {
name: "src/index",
pkg: false,
file: "src/index.js",
identifier: "test-module/src/index"
}
},
scopes: {}
}
];
const result = createImportsMap(
manifests,
(name, file) => `${name}/${file}`
);
assert.deepEqual(result, {
"test-module/src/index": "test-module/src/index.js",
"test-module/src": "test-module/src/index.js"
});
});
test("should handle multiple manifests", () => {
const manifests = [
{
name: "module-a",
exports: {
utils: {
name: "utils",
pkg: false,
file: "utils.js",
identifier: "module-a/utils"
}
},
scopes: {}
},
{
name: "module-b",
exports: {},
scopes: {}
}
];
const result = createImportsMap(
manifests,
(name, file) => `${name}/${file}`
);
assert.deepEqual(result, {
"module-a/utils": "module-a/utils.js"
});
});
test("should handle empty exports", () => {
const manifests = [
{
name: "test-module",
exports: {},
scopes: {}
}
];
const result = createImportsMap(
manifests,
(name, file) => `${name}/${file}`
);
assert.deepEqual(result, {});
});
test("should handle duplicate alias creation", () => {
const manifests = [
{
name: "test-module",
exports: {
"src/components/index": {
name: "src/components/index",
pkg: false,
file: "src/components/index.js",
identifier: "test-module/src/components/index"
}
},
scopes: {}
}
];
const result = createImportsMap(
manifests,
(name, file) => `${name}/${file}`
);
assert.deepEqual(result, {
"test-module/src/components/index": "test-module/src/components/index.js",
"test-module/src/components": "test-module/src/components/index.js"
});
});
test("should handle identifier conflicts across modules", () => {
const manifests = [
{
name: "module-a",
exports: {
utils: {
name: "utils",
pkg: false,
file: "utils-a.js",
identifier: "module-a/utils"
}
},
scopes: {}
},
{
name: "module-b",
exports: {
utils: {
name: "utils",
pkg: false,
file: "utils-b.js",
identifier: "module-b/utils"
}
},
scopes: {}
}
];
const result = createImportsMap(
manifests,
(name, file) => `${name}/${file}`
);
assert.deepEqual(result, {
"module-a/utils": "module-a/utils-a.js",
"module-b/utils": "module-b/utils-b.js"
});
});
test("should handle nested index aliases", () => {
const manifests = [
{
name: "test-module",
exports: {
"src/components/utils/index": {
name: "src/components/utils/index",
pkg: false,
file: "src/components/utils/index.js",
identifier: "test-module/src/components/utils/index"
}
},
scopes: {}
}
];
const result = createImportsMap(
manifests,
(name, file) => `${name}/${file}`
);
assert.deepEqual(result, {
"test-module/src/components/utils/index": "test-module/src/components/utils/index.js",
"test-module/src/components/utils": "test-module/src/components/utils/index.js"
});
});
});
describe("fixImportMapNestedScopes", () => {
test("should return unchanged import map for empty scopes", () => {
const importMap = {
imports: {
"shared-modules/vue": "/shared-modules/vue.620a1e89.final.mjs"
},
scopes: {}
};
const result = fixImportMapNestedScopes(importMap);
assert.deepEqual(result, importMap);
});
test("should return unchanged import map for shallow scopes only", () => {
const importMap = {
imports: {
"shared-modules/vue": "/shared-modules/vue.620a1e89.final.mjs"
},
scopes: {
"/shared-modules/": {
vue: "/shared-modules/vue.620a1e89.final.mjs"
}
}
};
const result = fixImportMapNestedScopes(importMap);
assert.deepEqual(result, importMap);
});
test("should create file-level scopes for nested scopes", () => {
const importMap = {
imports: {
"shared-modules/vue2": "/shared-modules/vue2.a1b2c3d4.final.mjs",
"shared-modules/vue2/@esmx/router-vue": "/shared-modules/vue2/@esmx/router-vue.e5f6g7h8.final.mjs",
"shared-modules/vue2/index": "/shared-modules/vue2/index.i9j0k1l2.final.mjs",
"shared-modules/vue": "/shared-modules/vue.m3n4o5p6.final.mjs"
},
scopes: {
"/shared-modules/": {
vue: "/shared-modules/vue.m3n4o5p6.final.mjs"
},
"/shared-modules/vue2/": {
vue: "/shared-modules/vue2.a1b2c3d4.final.mjs"
}
}
};
const expected = {
imports: {
"shared-modules/vue2": "/shared-modules/vue2.a1b2c3d4.final.mjs",
"shared-modules/vue2/@esmx/router-vue": "/shared-modules/vue2/@esmx/router-vue.e5f6g7h8.final.mjs",
"shared-modules/vue2/index": "/shared-modules/vue2/index.i9j0k1l2.final.mjs",
"shared-modules/vue": "/shared-modules/vue.m3n4o5p6.final.mjs"
},
scopes: {
"/shared-modules/vue.m3n4o5p6.final.mjs": {
vue: "/shared-modules/vue.m3n4o5p6.final.mjs"
},
"/shared-modules/vue2.a1b2c3d4.final.mjs": {
vue: "/shared-modules/vue.m3n4o5p6.final.mjs"
},
"/shared-modules/vue2/@esmx/router-vue.e5f6g7h8.final.mjs": {
vue: "/shared-modules/vue2.a1b2c3d4.final.mjs"
},
"/shared-modules/vue2/index.i9j0k1l2.final.mjs": {
vue: "/shared-modules/vue2.a1b2c3d4.final.mjs"
}
}
};
const result = fixImportMapNestedScopes(importMap);
assert.deepEqual(result, expected);
});
test("should handle multiple nested scopes correctly", () => {
const importMap = {
imports: {
"shared-modules/vue2": "/shared-modules/vue2.q7r8s9t0.final.mjs",
"shared-modules/vue2/component": "/shared-modules/vue2/component.u1v2w3x4.final.mjs",
"shared-modules/vue3": "/shared-modules/vue3.y5z6a7b8.final.mjs",
"shared-modules/vue3/component": "/shared-modules/vue3/component.c9d0e1f2.final.mjs",
"shared-modules/vue": "/shared-modules/vue.g3h4i5j6.final.mjs"
},
scopes: {
"/shared-modules/": {
vue: "/shared-modules/vue.g3h4i5j6.final.mjs"
},
"/shared-modules/vue2/": {
vue: "/shared-modules/vue2.q7r8s9t0.final.mjs"
},
"/shared-modules/vue3/": {
vue: "/shared-modules/vue3.y5z6a7b8.final.mjs"
}
}
};
const expected = {
imports: {
"shared-modules/vue2": "/shared-modules/vue2.q7r8s9t0.final.mjs",
"shared-modules/vue2/component": "/shared-modules/vue2/component.u1v2w3x4.final.mjs",
"shared-modules/vue3": "/shared-modules/vue3.y5z6a7b8.final.mjs",
"shared-modules/vue3/component": "/shared-modules/vue3/component.c9d0e1f2.final.mjs",
"shared-modules/vue": "/shared-modules/vue.g3h4i5j6.final.mjs"
},
scopes: {
"/shared-modules/vue.g3h4i5j6.final.mjs": {
vue: "/shared-modules/vue.g3h4i5j6.final.mjs"
},
"/shared-modules/vue2.q7r8s9t0.final.mjs": {
vue: "/shared-modules/vue.g3h4i5j6.final.mjs"
},
"/shared-modules/vue2/component.u1v2w3x4.final.mjs": {
vue: "/shared-modules/vue2.q7r8s9t0.final.mjs"
},
"/shared-modules/vue3.y5z6a7b8.final.mjs": {
vue: "/shared-modules/vue.g3h4i5j6.final.mjs"
},
"/shared-modules/vue3/component.c9d0e1f2.final.mjs": {
vue: "/shared-modules/vue3.y5z6a7b8.final.mjs"
}
}
};
const result = fixImportMapNestedScopes(importMap);
assert.deepEqual(result, expected);
});
test("should handle deeply nested scopes", () => {
const importMap = {
imports: {
"shared-modules/vue2/components/button": "/shared-modules/vue2/components/button.k7l8m9n0.final.mjs",
"shared-modules/vue2/components/input": "/shared-modules/vue2/components/input.o1p2q3r4.final.mjs"
},
scopes: {
"/shared-modules/vue2/components/": {
vue: "/shared-modules/vue2.s5t6u7v8.final.mjs"
}
}
};
const expected = {
imports: {
"shared-modules/vue2/components/button": "/shared-modules/vue2/components/button.k7l8m9n0.final.mjs",
"shared-modules/vue2/components/input": "/shared-modules/vue2/components/input.o1p2q3r4.final.mjs"
},
scopes: {
"/shared-modules/vue2/components/button.k7l8m9n0.final.mjs": {
vue: "/shared-modules/vue2.s5t6u7v8.final.mjs"
},
"/shared-modules/vue2/components/input.o1p2q3r4.final.mjs": {
vue: "/shared-modules/vue2.s5t6u7v8.final.mjs"
}
}
};
const result = fixImportMapNestedScopes(importMap);
assert.deepEqual(result, expected);
});
test("should not create file-level scopes for imports not matching nested scope", () => {
const importMap = {
imports: {
"shared-modules/vue": "/shared-modules/vue.w9x0y1z2.final.mjs",
"shared-modules/vue2/component": "/shared-modules/vue2/component.a3b4c5d6.final.mjs",
"other-modules/component": "/other-modules/component.e7f8g9h0.final.mjs"
},
scopes: {
"/shared-modules/vue2/": {
vue: "/shared-modules/vue2.i1j2k3l4.final.mjs"
}
}
};
const expected = {
imports: importMap.imports,
scopes: {
"/shared-modules/vue2/component.a3b4c5d6.final.mjs": {
vue: "/shared-modules/vue2.i1j2k3l4.final.mjs"
}
}
};
const result = fixImportMapNestedScopes(importMap);
assert.deepEqual(result, expected);
});
test("should handle empty imports", () => {
const importMap = {
imports: {},
scopes: {
"/shared-modules/vue2/": {
vue: "/shared-modules/vue2.m5n6o7p8.final.mjs"
}
}
};
const expected = {
imports: {},
scopes: {}
};
const result = fixImportMapNestedScopes(importMap);
assert.deepEqual(result, expected);
});
test("should preserve original import map structure", () => {
const importMap = {
imports: {
"shared-modules/vue2": "/shared-modules/vue2.q9r8s7t6.final.mjs",
"shared-modules/vue2/component": "/shared-modules/vue2/component.u5v4w3x2.final.mjs"
},
scopes: {
"/shared-modules/vue2/": {
vue: "/shared-modules/vue2.q9r8s7t6.final.mjs",
"vue-router": "/shared-modules/vue2/router.y1z0a9b8.final.mjs"
}
}
};
const result = fixImportMapNestedScopes(importMap);
const expected = {
imports: importMap.imports,
scopes: {
"/shared-modules/vue2/component.u5v4w3x2.final.mjs": {
vue: "/shared-modules/vue2.q9r8s7t6.final.mjs",
"vue-router": "/shared-modules/vue2/router.y1z0a9b8.final.mjs"
}
}
};
assert.deepEqual(result, expected);
});
test("should handle complex priority scenarios with multiple nested levels", () => {
const importMap = {
imports: {
"shared-modules/vue2": "/shared-modules/vue2.c7d8e9f0.final.mjs",
"shared-modules/vue2/test": "/shared-modules/vue2/test.a1b2c3d4.final.mjs",
"shared-modules/vue2/test/component": "/shared-modules/vue2/test/component.e5f6g7h8.final.mjs",
"shared-modules/vue": "/shared-modules/vue.i9j0k1l2.final.mjs"
},
scopes: {
"/shared-modules/": {
vue: "/shared-modules/vue.i9j0k1l2.final.mjs",
"vue-router": "/shared-modules/@esmx/router.m3n4o5p6.final.mjs"
},
"/shared-modules/vue2/": {
vue: "/shared-modules/vue2.c7d8e9f0.final.mjs",
"vue-router": "/shared-modules/vue2/@esmx/router-vue.q7r8s9t0.final.mjs"
},
"/shared-modules/vue2/test/": {
vue: "/shared-modules/vue2.c7d8e9f0.final.mjs",
"test-utils": "/shared-modules/vue2/test/utils.u1v2w3x4.final.mjs"
}
}
};
const expected = {
imports: {
"shared-modules/vue2": "/shared-modules/vue2.c7d8e9f0.final.mjs",
"shared-modules/vue2/test": "/shared-modules/vue2/test.a1b2c3d4.final.mjs",
"shared-modules/vue2/test/component": "/shared-modules/vue2/test/component.e5f6g7h8.final.mjs",
"shared-modules/vue": "/shared-modules/vue.i9j0k1l2.final.mjs"
},
scopes: {
"/shared-modules/vue.i9j0k1l2.final.mjs": {
vue: "/shared-modules/vue.i9j0k1l2.final.mjs",
"vue-router": "/shared-modules/@esmx/router.m3n4o5p6.final.mjs"
},
"/shared-modules/vue2.c7d8e9f0.final.mjs": {
vue: "/shared-modules/vue.i9j0k1l2.final.mjs",
"vue-router": "/shared-modules/@esmx/router.m3n4o5p6.final.mjs"
},
"/shared-modules/vue2/test.a1b2c3d4.final.mjs": {
vue: "/shared-modules/vue2.c7d8e9f0.final.mjs",
"vue-router": "/shared-modules/vue2/@esmx/router-vue.q7r8s9t0.final.mjs"
},
"/shared-modules/vue2/test/component.e5f6g7h8.final.mjs": {
vue: "/shared-modules/vue2.c7d8e9f0.final.mjs",
"test-utils": "/shared-modules/vue2/test/utils.u1v2w3x4.final.mjs",
"vue-router": "/shared-modules/vue2/@esmx/router-vue.q7r8s9t0.final.mjs"
}
}
};
const result = fixImportMapNestedScopes(importMap);
assert.deepEqual(result, expected);
});
test("should handle priority with overlapping nested scopes", () => {
const importMap = {
imports: {
"shared-modules/vue2": "/shared-modules/vue2.n3o4p5q6.final.mjs",
"shared-modules/vue2/components": "/shared-modules/vue2/components.r7s8t9u0.final.mjs",
"shared-modules/vue2/components/button": "/shared-modules/vue2/components/button.v1w2x3y4.final.mjs",
"shared-modules/vue2/components/input": "/shared-modules/vue2/components/input.z5a6b7c8.final.mjs"
},
scopes: {
"/shared-modules/vue2/": {
vue: "/shared-modules/vue2.n3o4p5q6.final.mjs",
"vue-router": "/shared-modules/vue2/@esmx/router-vue.d9e0f1g2.final.mjs"
},
"/shared-modules/vue2/components/": {
vue: "/shared-modules/vue2.n3o4p5q6.final.mjs",
"component-utils": "/shared-modules/vue2/components/utils.h3i4j5k6.final.mjs"
}
}
};
const expected = {
imports: {
"shared-modules/vue2": "/shared-modules/vue2.n3o4p5q6.final.mjs",
"shared-modules/vue2/components": "/shared-modules/vue2/components.r7s8t9u0.final.mjs",
"shared-modules/vue2/components/button": "/shared-modules/vue2/components/button.v1w2x3y4.final.mjs",
"shared-modules/vue2/components/input": "/shared-modules/vue2/components/input.z5a6b7c8.final.mjs"
},
scopes: {
"/shared-modules/vue2/components.r7s8t9u0.final.mjs": {
vue: "/shared-modules/vue2.n3o4p5q6.final.mjs",
"vue-router": "/shared-modules/vue2/@esmx/router-vue.d9e0f1g2.final.mjs"
},
"/shared-modules/vue2/components/button.v1w2x3y4.final.mjs": {
"component-utils": "/shared-modules/vue2/components/utils.h3i4j5k6.final.mjs",
vue: "/shared-modules/vue2.n3o4p5q6.final.mjs",
"vue-router": "/shared-modules/vue2/@esmx/router-vue.d9e0f1g2.final.mjs"
},
"/shared-modules/vue2/components/input.z5a6b7c8.final.mjs": {
"component-utils": "/shared-modules/vue2/components/utils.h3i4j5k6.final.mjs",
vue: "/shared-modules/vue2.n3o4p5q6.final.mjs",
"vue-router": "/shared-modules/vue2/@esmx/router-vue.d9e0f1g2.final.mjs"
}
}
};
const result = fixImportMapNestedScopes(importMap);
assert.deepEqual(result, expected);
});
test("should handle very deeply nested scope priority scenarios", () => {
const importMap = {
imports: {
"shared-modules/vue2": "/shared-modules/vue2.l7m8n9o0.final.mjs",
"shared-modules/vue2/test": "/shared-modules/vue2/test.p1q2r3s4.final.mjs",
"shared-modules/vue2/test/unit": "/shared-modules/vue2/test/unit.t5u6v7w8.final.mjs",
"shared-modules/vue2/test/unit/component": "/shared-modules/vue2/test/unit/component.x9y0z1a2.final.mjs"
},
scopes: {
"/shared-modules/": {
vue: "/shared-modules/vue.b3c4d5e6.final.mjs"
},
"/shared-modules/vue2/": {
vue: "/shared-modules/vue2.l7m8n9o0.final.mjs"
},
"/shared-modules/vue2/test/": {
vue: "/shared-modules/vue2.l7m8n9o0.final.mjs",
"test-utils": "/shared-modules/vue2/test/utils.f7g8h9i0.final.mjs"
},
"/shared-modules/vue2/test/unit/": {
vue: "/shared-modules/vue2.l7m8n9o0.final.mjs",
"test-utils": "/shared-modules/vue2/test/utils.f7g8h9i0.final.mjs"
}
}
};
const expected = {
imports: {
"shared-modules/vue2": "/shared-modules/vue2.l7m8n9o0.final.mjs",
"shared-modules/vue2/test": "/shared-modules/vue2/test.p1q2r3s4.final.mjs",
"shared-modules/vue2/test/unit": "/shared-modules/vue2/test/unit.t5u6v7w8.final.mjs",
"shared-modules/vue2/test/unit/component": "/shared-modules/vue2/test/unit/component.x9y0z1a2.final.mjs"
},
scopes: {
"/shared-modules/vue2.l7m8n9o0.final.mjs": {
vue: "/shared-modules/vue.b3c4d5e6.final.mjs"
},
"/shared-modules/vue2/test.p1q2r3s4.final.mjs": {
vue: "/shared-modules/vue2.l7m8n9o0.final.mjs"
},
"/shared-modules/vue2/test/unit.t5u6v7w8.final.mjs": {
vue: "/shared-modules/vue2.l7m8n9o0.final.mjs",
"test-utils": "/shared-modules/vue2/test/utils.f7g8h9i0.final.mjs"
},
"/shared-modules/vue2/test/unit/component.x9y0z1a2.final.mjs": {
vue: "/shared-modules/vue2.l7m8n9o0.final.mjs",
"test-utils": "/shared-modules/vue2/test/utils.f7g8h9i0.final.mjs"
}
}
};
const result = fixImportMapNestedScopes(importMap);
assert.deepEqual(result, expected);
});
test("should ensure different directory levels have distinct values for proper testing", () => {
const importMap = {
imports: {
"shared-modules/level1": "/shared-modules/level1.a1b2c3d4.final.mjs",
"shared-modules/level1/level2": "/shared-modules/level1/level2.e5f6g7h8.final.mjs",
"shared-modules/level1/level2/level3": "/shared-modules/level1/level2/level3.i9j0k1l2.final.mjs"
},
scopes: {
"/shared-modules/level1/": {
vue: "/shared-modules/level1.a1b2c3d4.final.mjs"
},
"/shared-modules/level1/level2/": {
vue: "/shared-modules/level1/level2.e5f6g7h8.final.mjs"
}
}
};
const expected = {
imports: {
"shared-modules/level1": "/shared-modules/level1.a1b2c3d4.final.mjs",
"shared-modules/level1/level2": "/shared-modules/level1/level2.e5f6g7h8.final.mjs",
"shared-modules/level1/level2/level3": "/shared-modules/level1/level2/level3.i9j0k1l2.final.mjs"
},
scopes: {
"/shared-modules/level1/level2.e5f6g7h8.final.mjs": {
vue: "/shared-modules/level1.a1b2c3d4.final.mjs"
},
"/shared-modules/level1/level2/level3.i9j0k1l2.final.mjs": {
vue: "/shared-modules/level1/level2.e5f6g7h8.final.mjs"
}
}
};
const result = fixImportMapNestedScopes(importMap);
assert.deepEqual(result, expected);
assert.equal(
result.scopes["/shared-modules/level1/level2.e5f6g7h8.final.mjs"].vue,
"/shared-modules/level1.a1b2c3d4.final.mjs"
);
assert.equal(
result.scopes["/shared-modules/level1/level2/level3.i9j0k1l2.final.mjs"].vue,
"/shared-modules/level1/level2.e5f6g7h8.final.mjs"
);
});
test("should successfully delete properties using Reflect.deleteProperty", () => {
const importMap = {
imports: {
"shared/modules/vue2": "/shared/modules/vue2.a1b2c3d4.final.mjs"
},
scopes: {
"/shared/modules/vue2/": {
vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
}
}
};
const result = fixImportMapNestedScopes(importMap);
const expected = {
imports: importMap.imports,
scopes: {}
};
assert.deepEqual(result, expected);
assert.doesNotThrow(() => {
fixImportMapNestedScopes(importMap);
});
});
describe("scope path processing logic", () => {
test("should process all scope paths regardless of format", () => {
const importMap = {
imports: {
"shared/modules/vue2": "/shared/modules/vue2.a1b2c3d4.final.mjs",
"shared/vue": "/shared/vue.e5f6g7h8.final.mjs"
},
scopes: {
"shared/modules/vue2/": {
vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
},
"/shared/modules/vue2": {
vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
},
"/shared/": {
vue: "/shared/vue.e5f6g7h8.final.mjs"
},
"/shared/modules/vue2/": {
vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
}
}
};
const expected = {
imports: {
"shared/modules/vue2": "/shared/modules/vue2.a1b2c3d4.final.mjs",
"shared/vue": "/shared/vue.e5f6g7h8.final.mjs"
},
scopes: {
"/shared/modules/vue2.a1b2c3d4.final.mjs": {
vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
},
"/shared/vue.e5f6g7h8.final.mjs": {
vue: "/shared/vue.e5f6g7h8.final.mjs"
}
}
};
const result = fixImportMapNestedScopes(importMap);
assert.deepEqual(result, expected);
});
test("should handle scope paths with any depth", () => {
const importMap = {
imports: {
"a/b/c": "/a/b/c.a1b2c3d4.final.mjs"
},
scopes: {
"/a/b/c/": {
vue: "/a/b/c.a1b2c3d4.final.mjs"
}
}
};
const expected = {
imports: {
"a/b/c": "/a/b/c.a1b2c3d4.final.mjs"
},
scopes: {}
};
const result = fixImportMapNestedScopes(importMap);
assert.deepEqual(result, expected);
});
test("should handle very deep nested scope paths", () => {
const importMap = {
imports: {
"a/b/c/d/e/f": "/a/b/c/d/e/f.a1b2c3d4.final.mjs"
},
scopes: {
"/a/b/c/d/e/f/": {
vue: "/a/b/c/d/e/f.a1b2c3d4.final.mjs"
}
}
};
const expected = {
imports: {
"a/b/c/d/e/f": "/a/b/c/d/e/f.a1b2c3d4.final.mjs"
},
scopes: {}
};
const result = fixImportMapNestedScopes(importMap);
assert.deepEqual(result, expected);
});
test("should create file-level scopes for all scope paths", () => {
const importMap = {
imports: {
"modules/vue": "/modules/vue.a1b2c3d4.final.mjs",
"shared/vue": "/shared/vue.e5f6g7h8.final.mjs"
},
scopes: {
"/modules/": {
vue: "/modules/vue.a1b2c3d4.final.mjs"
},
"/shared/": {
vue: "/shared/vue.e5f6g7h8.final.mjs"
}
}
};
const expected = {
imports: {
"modules/vue": "/modules/vue.a1b2c3d4.final.mjs",
"shared/vue": "/shared/vue.e5f6g7h8.final.mjs"
},
scopes: {
"/modules/vue.a1b2c3d4.final.mjs": {
vue: "/modules/vue.a1b2c3d4.final.mjs"
},
"/shared/vue.e5f6g7h8.final.mjs": {
vue: "/shared/vue.e5f6g7h8.final.mjs"
}
}
};
const result = fixImportMapNestedScopes(importMap);
assert.deepEqual(result, expected);
});
test("should process multiple scope paths in correct order by depth", () => {
const importMap = {
imports: {
"shared/modules/vue2": "/shared/modules/vue2.a1b2c3d4.final.mjs",
"shared/modules/vue2/component": "/shared/modules/vue2/component.e5f6g7h8.final.mjs",
"shared/modules/vue2/utils": "/shared/modules/vue2/utils.i9j0k1l2.final.mjs"
},
scopes: {
"/shared/modules/vue2/": {
vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
},
"/shared/modules/vue2/utils/": {
"test-utils": "/shared/modules/vue2/utils.i9j0k1l2.final.mjs"
}
}
};
const expected = {
imports: {
"shared/modules/vue2": "/shared/modules/vue2.a1b2c3d4.final.mjs",
"shared/modules/vue2/component": "/shared/modules/vue2/component.e5f6g7h8.final.mjs",
"shared/modules/vue2/utils": "/shared/modules/vue2/utils.i9j0k1l2.final.mjs"
},
scopes: {
"/shared/modules/vue2/component.e5f6g7h8.final.mjs": {
vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
},
"/shared/modules/vue2/utils.i9j0k1l2.final.mjs": {
vue: "/shared/modules/vue2.a1b2c3d4.final.mjs"
}
}
};
const result = fixImportMapNestedScopes(importMap);
assert.deepEqual(result, expected);
});
});
});
describe("createScopesMap", () => {
test("should return empty object for empty manifests", () => {
const imports = {};
const manifests = [];
const result = createScopesMap(
imports,
manifests,
(name, scope) => `${name}/${scope}`
);
assert.deepEqual(result, {});
});
test("should return empty object when manifests have no scopes", () => {
const imports = {
"test-module/component": "test-module/component.js"
};
const manifests = [
{
name: "test-module",
exports: {
component: {
name: "component",
pkg: false,
file: "component.js",
identifier: "test-module/component"
}
},
scopes: {}
}
];
const result = createScopesMap(
imports,
manifests,
(name, scope) => `${name}/${scope}`
);
assert.deepEqual(result, {});
});
test("should build scopes map with basic scope configuration", () => {
const imports = {
"test-module/component": "test-module/component.js",
"test-module/utils": "test-module/utils.js"
};
const manifests = [
{
name: "test-module",
exports: {
component: {
name: "component",
pkg: false,
file: "component.js",
identifier: "test-module/component"
},
utils: {
name: "utils",
pkg: false,
file: "utils.js",
identifier: "test-module/utils"
}
},
scopes: {
node_modules: {
react: "test-module/component",
lodash: "test-module/utils"
}
}
}
];
const result = createScopesMap(
imports,
manifests,
(name, scope) => `${name}/${scope}`
);
assert.deepEqual(result, {
"test-module//node_modules": {
react: "test-module/component.js",
lodash: "test-module/utils.js"
}
});
});
test("should handle scope with non-existent identifiers", () => {
const imports = {
"test-module/component": "test-module/component.js"
};
const manifests = [
{
name: "test-module",
exports: {
component: {
name: "component",
pkg: false,
file: "component.js",
identifier: "test-module/component"
}
},
scopes: {
node_modules: {
react: "test-module/component",
"non-existent": "test-module/non-existent"
}
}
}
];
const result = createScopesMap(
imports,
manifests,
(name, scope) => `${name}/${scope}`
);
assert.deepEqual(result, {
"test-module//node_modules": {
react: "test-module/component.js",
"non-existent": "test-module/non-existent"
}
});
});
test("should handle scope with external URLs", () => {
const imports = {
"test-module/component": "test-module/component.js"
};
const manifests = [
{
name: "test-module",
exports: {
component: {
name: "component",
pkg: false,
file: "component.js",
identifier: "test-module/component"
}
},
scopes: {
node_modules: {
react: "https://cdn.com/react.js",
"local-component": "test-module/component"
}
}
}
];
const result = createScopesMap(
imports,
manifests,
(name, scope) => `${name}/${scope}`
);
assert.deepEqual(result, {
"test-module//node_modules": {
react: "https://cdn.com/react.js",
"local-component": "test-module/component.js"
}
});
});
test("should use scope path from imports when available", () => {
const imports = {
"test-module/node_modules": "test-module/node_modules/index.js",
"test-module/component": "test-module/component.js"
};
const manifests = [
{
name: "test-module",
exports: {
node_modules: {
name: "node_modules",
pkg: false,
file: "node_modules/index.js",
identifier: "test-module/node_modules"
},
component: {
name: "component",
pkg: false,
file: "component.js",
identifier: "test-module/component"
}
},
scopes: {
node_modules: {
react: "test-module/component"
}
}
}
];
const result = createScopesMap(
imports,
manifests,
(name, scope) => `${name}/${scope}`
);
assert.deepEqual(result, {
"test-module/test-module/node_modules/index.js": {
react: "test-module/component.js"
}
});
});
test("should fall back to scope path when not found in imports", () => {
const imports = {
"test-module/component": "test-module/component.js"
};
const manifests = [
{
name: "test-module",
exports: {
component: {
name: "component",
pkg: false,
file: "component.js",
identifier: "test-module/component"
}
},
scopes: {
node_modules: {
react: "test-module/component"
}
}
}
];
const result = createScopesMap(
imports,
manifests,
(name, scope) => `${name}/${scope}`
);
assert.deepEqual(result, {
"test-module//node_modules": {
react: "test-module/component.js"
}
});
});
test("should handle multiple scopes in single manifest", () => {
const imports = {
"test-module/component": "test-module/component.js",
"test-module/utils": "test-module/utils.js"
};
const manifests = [
{
name: "test-module",
exports: {
component: {
name: "component",
pkg: false,
file: "component.js",
identifier: "test-module/component"
},
utils: {
name: "utils",
pkg: false,
file: "utils.js",
identifier: "test-module/utils"
}
},
scopes: {
node_modules: {
react: "test-module/component"
},
vendor: {
lodash: "test-module/utils"
}
}
}
];
const result = createScopesMap(
imports,
manifests,
(name, scope) => `${name}/${scope}`
);
assert.deepEqual(result, {
"test-module//node_modules": {
react: "test-module/component.js"
},
"test-module//vendor": {
lodash: "test-module/utils.js"
}
});
});
test("should handle multiple manifests with scopes", () => {
const imports = {
"module-a/component": "module-a/component.js",
"module-b/utils": "module-b/utils.js"
};
const manifests = [
{
name: "module-a",
exports: {
component: {
name: "component",
pkg: false,
file: "component.js",
identifier: "module-a/component"
}
},
scopes: {
node_modules: {
react: "module-a/component"
}
}
},
{
name: "module-b",
exports: {
utils: {
name: "utils",
pkg: false,
file: "utils.js",
identifier: "module-b/utils"
}
},
scopes: {
vendor: {
lodash: "module-b/utils"
}
}
}
];
const result = createScopesMap(
imports,
manifests,
(name, scope) => `${name}/${scope}`
);
assert.deepEqual(result, {
"module-a//node_modules": {
react: "module-a/component.js"
},
"module-b//vendor": {
lodash: "module-b/utils.js"
}
});
});
test("should handle empty scope specifier map", () => {
const imports = {
"test-module/component": "test-module/component.js"
};
const manifests = [
{
name: "test-module",
exports: {
component: {
name: "component",
pkg: false,
file: "component.js",
identifier: "test-module/component"
}
},
scopes: {
"./node_modules": {}
}
}
];
const result = createScopesMap(
imports,
manifests,
(name, scope) => `${name}/${scope}`
);
assert.deepEqual(result, {
"test-module//./node_modules": {}
});
});
test("should handle undefined scopes property", () => {
const imports = {
"test-module/component": "test-module/component.js"
};
const manifests = [
{
name: "test-module",
exports: {
component: {
name: "component",
pkg: false,
file: "component.js",
identifier: "test-module/component"
}
},
scopes: void 0
}
];
const result = createScopesMap(
imports,
manifests,
(name, scope) => `${name}/${scope}`
);
assert.deepEqual(result, {});
});
});
describe("createImportMap", () => {
test("should return empty import map for empty manifests", () => {
const options = {
manifests: [],
getFile: (name, file) => `${name}/${file}`,
getScope: (name, scope) => `${name}/${scope}`
};
const result = createImportMap(options);
assert.deepEqual(result, {
imports: {},
scopes: {}
});
});
test("should build complete import map with exports and scopes", () => {
const options = {
manifests: [
{
name: "test-module",
exports: {
component: {
name: "component",
pkg: false,
file: "component.js",
identifier: "test-module/component"
},
utils: {
name: "utils",
pkg: false,
file: "utils.js",
identifier: "test-module/utils"
}
},
scopes: {
node_modules: {
react: "test-module/component",
lodash: "test-module/utils"
}
}
}
],
getFile: (name, file) => `${name}/${file}`,
getScope: (name, scope) => `${name}/${scope}`
};
const result = createImportMap(options);
assert.deepEqual(result, {
imports: {
"test-module/component": "test-module/component.js",
"test-module/utils": "test-module/utils.js"
},
scopes: {
"test-module//node_modules": {
react: "test-module/component.js",
lodash: "test-module/utils.js"
}
}
});
});
test("should handle complex multi-module scenario", () => {
const options = {
manifests: [
{
name: "module-a",
exports: {
utils: {
name: "utils",
pkg: false,
file: "utils.js",
identifier: "module-a/utils"
}
},
scopes: {
node_modules: {
react: "module-a/utils"
}
}
},
{
name: "module-b",
exports: {
component: {
name: "component",
pkg: false,
file: "component.js",
identifier: "module-b/component"
}
},
scopes: {
vendor: {
lodash: "module-a/utils"
}
}
}
],
getFile: (name, file) => `${name}/${file}`,
getScope: (name, scope) => `${name}/${scope}`
};
const result = createImportMap(options);
assert.deepEqual(result, {
imports: {
"module-a/utils": "module-a/utils.js",
"module-b/component": "module-b/component.js"
},
scopes: {
"module-a//node_modules": {
react: "module-a/utils.js"
},
"module-b//vendor": {
lodash: "module-a/utils.js"
}
}
});
});
test("should handle manifests with only exports", () => {
const options = {
manifests: [
{
name: "test-module",
exports: {
component: {
name: "component",
pkg: false,
file: "component.js",
identifier: "test-module/component"
}
},
scopes: {}
}
],
getFile: (name, file) => `${name}/${file}`,
getScope: (name, scope) => `${name}/${scope}`
};
const result = createImportMap(options);
assert.deepEqual(result, {
imports: {
"test-module/component": "test-module/component.js"
},
scopes: {}
});
});
test("should handle manifests with only scopes", () => {
const options = {
manifests: [
{
name: "test-module",
exports: {},
scopes: {
node_modules: {
react: "https://cdn.com/react.js"
}
}
}
],
getFile: (name, file) => `${name}/${file}`,
getScope: (name, scope) => `${name}/${scope}`
};
const result = createImportMap(options);
assert.deepEqual(result, {
imports: {},
scopes: {
"test-module//node_modules": {
react: "https://cdn.com/react.js"
}
}
});
});
test("should handle custom getFile and getScope functions", () => {
const options = {
manifests: [
{
name: "test-module",
exports: {
component: {
name: "component",
pkg: false,
file: "component.js",
identifier: "test-module/component"
}
},
scopes: {
node_modules: {
react: "test-module/component"
}
}
}
],
getFile: (name, file) => `/custom/path/${name}/${file}`,
getScope: (name, scope) => `custom-scope-${name}-${scope}`
};
const result = createImportMap(options);
assert.deepEqual(result, {
imports: {
"test-module/component": "/custom/path/test-module/component.js"
},
scopes: {
"custom-scope-test-module-/node_modules": {
react: "/custom/path/test-module/component.js"
}
}
});
});
test("should handle edge case with undefined scopes in manifests", () => {
const options = {
manifests: [
{
name: "test-module",
exports: {
component: {
name: "component",
pkg: false,
file: "component.js",
identifier: "test-module/component"
}
},
scopes: void 0
}
],
getFile: (name, file) => `${name}/${file}`,
getScope: (name, scope) => `${name}/${scope}`
};
const result = createImportMap(options);
assert.deepEqual(result, {
imports: {
"test-module/component": "test-module/component.js"
},
scopes: {}
});
});
test("should handle mixed scenarios with external URLs and local modules", () => {
const options = {
manifests: [
{
name: "test-module",
exports: {
component: {
name: "component",
pkg: false,
file: "component.js",
identifier: "test-module/component"
}
},
scopes: {
node_modules: {
"external-lib": "https://cdn.com/lodash.js",
"local-lib": "test-module/component"
}
}
}
],
getFile: (name, file) => `${name}/${file}`,
getScope: (name, scope) => `${name}/${scope}`
};
const result = createImportMap(options);
assert.deepEqual(result, {
imports: {
"test-module/component": "test-module/component.js"
},
scopes: {
"test-module//node_modules": {
"external-lib": "https://cdn.com/lodash.js",
"local-lib": "test-module/component.js"
}
}
});
});
test("should handle index path aliases in complete import map", () => {
const options = {
manifests: [
{
name: "test-module",
exports: {
"src/index": {
name: "src/index",
pkg: false,
file: "src/index.js",
identifier: "test-module/src/index"
}
},
scopes: {
src: {
main: "test-module/src/index"
}
}
}
],
getFile: (name, file) => `${name}/${file}`,
getScope: (name, scope) => `${name}/${scope}`
};
const result = createImportMap(options);
assert.deepEqual(result, {
imports: {
"test-module/src/index": "test-module/src/index.js",
"test-module/src": "test-module/src/index.js"
},
scopes: {
"test-module/test-module/src/index.js": {
main: "test-module/src/index.js"
}
}
});
});
});
describe("compressImportMap", () => {
test("does not promote when no global exists; keeps scopes intact", () => {
const importMap = {
imports: {},
scopes: {
"/a/": {
vue: "/a/vue.final.mjs"
},
"/b/": {
vue: "/a/vue.final.mjs"
}
}
};
const result = compressImportMap(importMap);
assert.deepEqual(result, {
imports: { vue: "/a/vue.final.mjs" }
});
});
test("does not promote when scoped mappings conflict across scopes", () => {
const importMap = {
imports: {},
scopes: {
"/a/": { vue: "/a/vue.final.mjs" },
"/b/": { vue: "/b/vue.final.mjs" }
}
};
const result = compressImportMap(importMap);
assert.deepEqual(result, importMap);
});
test("removes scoped entries that equal global mapping", () => {
const importMap = {
imports: { vue: "/shared/vue.final.mjs" },
scopes: {
"/a/": {
vue: "/shared/vue.final.mjs",
lodash: "/a/lodash.final.mjs"
}
}
};
const result = compressImportMap(importMap);
const expected = {
imports: {
vue: "/shared/vue.final.mjs",
lodash: "/a/lodash.final.mjs"
}
};
assert.deepEqual(result, expected);
});
test("promotes to global when global matches single unique target across scopes", () => {
const importMap = {
imports: { vue: "/shared/vue.final.mjs" },
scopes: {
"/a/": { vue: "/shared/vue.final.mjs" },
"/b/": { vue: "/shared/vue.final.mjs" }
}
};
const result = compressImportMap(importMap);
assert.deepEqual(result, {
imports: { vue: "/shared/vue.final.mjs" }
});
});
test("promotes to global when no global exists and targets are consistent across scopes (promote mode)", () => {
const importMap = {
imports: {},
scopes: {
"/a/": { vue: "/x/vue.final.mjs" },
"/b/": { vue: "/x/vue.final.mjs" }
}
};
const result = compressImportMap(importMap);
assert.deepEqual(result, {
imports: { vue: "/x/vue.final.mjs" }
});
});
test("promotes dominant target and keeps exceptions in scopes (promote mode)", () => {
const importMap = {
imports: {},
scopes: {
"/a/": { vue: "/x/vue.final.mjs" },
"/b/": { vue: "/x/vue.final.mjs" },
"/c/": { vue: "/y/vue2.final.mjs" }
}
};
const result = compressImportMap(importMap);
assert.deepEqual(result, {
imports: { vue: "/x/vue.final.mjs" },
scopes: {
"/c/": { vue: "/y/vue2.final.mjs" }
}
});
});
test("does not promote when no global exists; keeps scopes intact", () => {
const importMap = {
imports: {},
scopes: {
"/a/": { vue: "/shared/vue.final.mjs" },
"/b/": { vue: "/shared/vue.final.mjs" },
"/c/": { vue: "/c/vue2.final.mjs" }
}
};
const result = compressImportMap(importMap);
assert.deepEqual(result, {
imports: { vue: "/shared/vue.final.mjs" },
scopes: { "/c/": { vue: "/c/vue2.final.mjs" } }
});
});
test("aggressive default does not override different existing global", () => {
const importMap = {
imports: { vue: "/global/vue.final.mjs" },
scopes: {
"/a/": { vue: "/shared/vue.final.mjs" },
"/b/": { vue: "/shared/vue.final.mjs" }
}
};
const result = compressImportMap(importMap);
assert.deepEqual(result, {
imports: { vue: "/global/vue.final.mjs" },
scopes: {
"/a/": { vue: "/shared/vue.final.mjs" },
"/b/": { vue: "/shared/vue.final.mjs" }
}
});
});
test("returns new object and keeps input unchanged", () => {
const original = {
imports: {},
scopes: {
"/a/": { vue: "/x/vue.final.mjs" },
"/b/": { vue: "/x/vue.final.mjs" },
"/c/": { vue: "/y/vue2.final.mjs" }
}
};
const importMap = JSON.parse(JSON.stringify(original));
const result = compressImportMap(importMap);
assert.notStrictEqual(result, importMap);
assert.notStrictEqual(result.imports, importMap.imports);
assert.notStrictEqual(result.scopes, importMap.scopes);
assert.deepEqual(importMap, original);
assert.deepEqual(result, {
imports: { vue: "/x/vue.final.mjs" },
scopes: { "/c/": { vue: "/y/vue2.final.mjs" } }
});
});
});