@esmx/core
Version:
A high-performance microfrontend framework supporting Vue, React, Preact, Solid, and Svelte with SSR and Module Federation capabilities.
1,243 lines (1,175 loc) • 39.8 kB
text/typescript
import { assert, describe, test } from 'vitest';
import { buildImportsMap, buildScopesMap, getImportMap } from './import-map';
import type { GetImportMapOptions, ImportMapManifest } from './import-map';
describe('buildImportsMap', () => {
test('should return empty object for empty manifests', () => {
const result = buildImportsMap([], (name, file) => `${name}/${file}`);
assert.deepEqual(result, {});
});
test('should process all exports including package exports', () => {
const manifests: ImportMapManifest[] = [
{
name: 'test-module',
imports: {},
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 = buildImportsMap(
manifests,
(name, file) => `${name}/${file}`
);
assert.deepEqual(result, {
'test-module/component': 'test-module/component.js',
'test-module/vue': 'test-module/vue.js'
});
});
test('should handle user imports with existing identifiers', () => {
const manifests: ImportMapManifest[] = [
{
name: 'test-module',
imports: {
'custom-name': 'test-module/component'
},
exports: {
component: {
name: 'component',
pkg: false,
file: 'component.js',
identifier: 'test-module/component'
}
},
scopes: {}
}
];
const result = buildImportsMap(
manifests,
(name, file) => `${name}/${file}`
);
assert.deepEqual(result, {
'test-module/component': 'test-module/component.js',
'test-module/custom-name': 'test-module/component.js'
});
});
test('should handle user imports with non existing identifiers', () => {
const manifests: ImportMapManifest[] = [
{
name: 'test-module',
imports: {
external: 'https://cdn.com/lib.js'
},
exports: {
component: {
name: 'component',
pkg: false,
file: 'component.js',
identifier: 'test-module/component'
}
},
scopes: {}
}
];
const result = buildImportsMap(
manifests,
(name, file) => `${name}/${file}`
);
assert.deepEqual(result, {
'test-module/component': 'test-module/component.js',
'test-module/external': 'https://cdn.com/lib.js'
});
});
test('should create aliases for index suffixes', () => {
const manifests: ImportMapManifest[] = [
{
name: 'test-module',
imports: {},
exports: {
'src/index': {
name: 'src/index',
pkg: false,
file: 'src/index.js',
identifier: 'test-module/src/index'
}
},
scopes: {}
}
];
const result = buildImportsMap(
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: ImportMapManifest[] = [
{
name: 'module-a',
imports: {},
exports: {
utils: {
name: 'utils',
pkg: false,
file: 'utils.js',
identifier: 'module-a/utils'
}
},
scopes: {}
},
{
name: 'module-b',
imports: {
shared: 'module-a/utils'
},
exports: {},
scopes: {}
}
];
const result = buildImportsMap(
manifests,
(name, file) => `${name}/${file}`
);
assert.deepEqual(result, {
'module-a/utils': 'module-a/utils.js',
'module-b/shared': 'module-a/utils.js'
});
});
test('should prioritize user imports', () => {
const manifests: ImportMapManifest[] = [
{
name: 'test-module',
imports: {
react: 'preact',
vue: './custom/vue.js'
},
exports: {
react: {
name: 'react',
pkg: false,
file: 'react.js',
identifier: 'test-module/react'
},
vue: {
name: 'vue',
pkg: false,
file: 'vue.js',
identifier: 'test-module/vue'
}
},
scopes: {}
}
];
const result = buildImportsMap(
manifests,
(name, file) => `${name}/${file}`
);
assert.deepEqual(result, {
'test-module/react': 'preact',
'test-module/vue': './custom/vue.js'
});
});
test('should handle mixed user import types', () => {
const manifests: ImportMapManifest[] = [
{
name: 'test-module',
imports: {
'url-import': 'https://example.com/lib.js',
'relative-import': './local/file.js',
'identifier-import': 'test-module/component'
},
exports: {
component: {
name: 'component',
pkg: false,
file: 'component.js',
identifier: 'test-module/component'
}
},
scopes: {}
}
];
const result = buildImportsMap(
manifests,
(name, file) => `${name}/${file}`
);
assert.deepEqual(result, {
'test-module/component': 'test-module/component.js',
'test-module/url-import': 'https://example.com/lib.js',
'test-module/relative-import': './local/file.js',
'test-module/identifier-import': 'test-module/component.js'
});
});
test('should handle empty exports', () => {
const manifests: ImportMapManifest[] = [
{
name: 'test-module',
imports: {
external: 'https://cdn.com/lib.js'
},
exports: {},
scopes: {}
}
];
const result = buildImportsMap(
manifests,
(name, file) => `${name}/${file}`
);
assert.deepEqual(result, {
'test-module/external': 'https://cdn.com/lib.js'
});
});
test('should handle empty imports', () => {
const manifests: ImportMapManifest[] = [
{
name: 'test-module',
imports: {},
exports: {
component: {
name: 'component',
pkg: false,
file: 'component.js',
identifier: 'test-module/component'
}
},
scopes: {}
}
];
const result = buildImportsMap(
manifests,
(name, file) => `${name}/${file}`
);
assert.deepEqual(result, {
'test-module/component': 'test-module/component.js'
});
});
test('should handle duplicate alias creation', () => {
const manifests: ImportMapManifest[] = [
{
name: 'test-module',
imports: {},
exports: {
'src/components/index': {
name: 'src/components/index',
pkg: false,
file: 'src/components/index.js',
identifier: 'test-module/src/components/index'
}
},
scopes: {}
}
];
const result = buildImportsMap(
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 cross-module references', () => {
const manifests: ImportMapManifest[] = [
{
name: 'module-a',
imports: {},
exports: {
utils: {
name: 'utils',
pkg: false,
file: 'utils.js',
identifier: 'module-a/utils'
}
},
scopes: {}
},
{
name: 'module-b',
imports: {
shared: 'module-a/utils'
},
exports: {},
scopes: {}
}
];
const result = buildImportsMap(
manifests,
(name, file) => `${name}/${file}`
);
assert.deepEqual(result, {
'module-a/utils': 'module-a/utils.js',
'module-b/shared': 'module-a/utils.js'
});
});
test('should handle cross-module non-existent references', () => {
const manifests: ImportMapManifest[] = [
{
name: 'module-a',
imports: {},
exports: {
utils: {
name: 'utils',
pkg: false,
file: 'utils.js',
identifier: 'module-a/utils'
}
},
scopes: {}
},
{
name: 'module-b',
imports: {
external: 'module-a/non-existent'
},
exports: {},
scopes: {}
}
];
const result = buildImportsMap(
manifests,
(name, file) => `${name}/${file}`
);
assert.deepEqual(result, {
'module-a/utils': 'module-a/utils.js',
'module-b/external': 'module-a/non-existent'
});
});
test('should handle identifier conflicts across modules', () => {
const manifests: ImportMapManifest[] = [
{
name: 'module-a',
imports: {},
exports: {
utils: {
name: 'utils',
pkg: false,
file: 'utils-a.js',
identifier: 'module-a/utils'
}
},
scopes: {}
},
{
name: 'module-b',
imports: {},
exports: {
utils: {
name: 'utils',
pkg: false,
file: 'utils-b.js',
identifier: 'module-b/utils'
}
},
scopes: {}
}
];
const result = buildImportsMap(
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 user imports referencing aliased identifiers', () => {
const manifests: ImportMapManifest[] = [
{
name: 'test-module',
imports: {
'alias-test': 'test-module/src/index'
},
exports: {
'src/index': {
name: 'src/index',
pkg: false,
file: 'src/index.js',
identifier: 'test-module/src/index'
}
},
scopes: {}
}
];
const result = buildImportsMap(
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-module/alias-test': 'test-module/src/index.js'
});
});
test('should handle nested index aliases', () => {
const manifests: ImportMapManifest[] = [
{
name: 'test-module',
imports: {},
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 = buildImportsMap(
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('buildScopesMap', () => {
test('should return empty object for empty manifests', () => {
const imports = {};
const manifests: ImportMapManifest[] = [];
const result = buildScopesMap(
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: ImportMapManifest[] = [
{
name: 'test-module',
imports: {},
exports: {
component: {
name: 'component',
pkg: false,
file: 'component.js',
identifier: 'test-module/component'
}
},
scopes: {}
}
];
const result = buildScopesMap(
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: ImportMapManifest[] = [
{
name: 'test-module',
imports: {},
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 = buildScopesMap(
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: ImportMapManifest[] = [
{
name: 'test-module',
imports: {},
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 = buildScopesMap(
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: ImportMapManifest[] = [
{
name: 'test-module',
imports: {},
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 = buildScopesMap(
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: ImportMapManifest[] = [
{
name: 'test-module',
imports: {},
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 = buildScopesMap(
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: ImportMapManifest[] = [
{
name: 'test-module',
imports: {},
exports: {
component: {
name: 'component',
pkg: false,
file: 'component.js',
identifier: 'test-module/component'
}
},
scopes: {
node_modules: {
react: 'test-module/component'
}
}
}
];
const result = buildScopesMap(
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: ImportMapManifest[] = [
{
name: 'test-module',
imports: {},
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 = buildScopesMap(
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: ImportMapManifest[] = [
{
name: 'module-a',
imports: {},
exports: {
component: {
name: 'component',
pkg: false,
file: 'component.js',
identifier: 'module-a/component'
}
},
scopes: {
node_modules: {
react: 'module-a/component'
}
}
},
{
name: 'module-b',
imports: {},
exports: {
utils: {
name: 'utils',
pkg: false,
file: 'utils.js',
identifier: 'module-b/utils'
}
},
scopes: {
vendor: {
lodash: 'module-b/utils'
}
}
}
];
const result = buildScopesMap(
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: ImportMapManifest[] = [
{
name: 'test-module',
imports: {},
exports: {
component: {
name: 'component',
pkg: false,
file: 'component.js',
identifier: 'test-module/component'
}
},
scopes: {
'./node_modules': {}
}
}
];
const result = buildScopesMap(
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: ImportMapManifest[] = [
{
name: 'test-module',
imports: {},
exports: {
component: {
name: 'component',
pkg: false,
file: 'component.js',
identifier: 'test-module/component'
}
},
scopes: undefined as any
}
];
const result = buildScopesMap(
imports,
manifests,
(name, scope) => `${name}/${scope}`
);
assert.deepEqual(result, {});
});
});
describe('getImportMap', () => {
test('should return empty import map for empty manifests', () => {
const options: GetImportMapOptions = {
manifests: [],
getFile: (name, file) => `${name}/${file}`,
getScope: (name, scope) => `${name}/${scope}`
};
const result = getImportMap(options);
assert.deepEqual(result, {
imports: {},
scopes: {}
});
});
test('should build complete import map with imports and scopes', () => {
const options: GetImportMapOptions = {
manifests: [
{
name: 'test-module',
imports: {
'custom-react': 'test-module/component'
},
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 = getImportMap(options);
assert.deepEqual(result, {
imports: {
'test-module/component': 'test-module/component.js',
'test-module/utils': 'test-module/utils.js',
'test-module/custom-react': 'test-module/component.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: GetImportMapOptions = {
manifests: [
{
name: 'module-a',
imports: {},
exports: {
utils: {
name: 'utils',
pkg: false,
file: 'utils.js',
identifier: 'module-a/utils'
}
},
scopes: {
node_modules: {
react: 'module-a/utils'
}
}
},
{
name: 'module-b',
imports: {
shared: 'module-a/utils'
},
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 = getImportMap(options);
assert.deepEqual(result, {
imports: {
'module-a/utils': 'module-a/utils.js',
'module-b/component': 'module-b/component.js',
'module-b/shared': 'module-a/utils.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: GetImportMapOptions = {
manifests: [
{
name: 'test-module',
imports: {},
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 = getImportMap(options);
assert.deepEqual(result, {
imports: {
'test-module/component': 'test-module/component.js'
},
scopes: {}
});
});
test('should handle manifests with only imports', () => {
const options: GetImportMapOptions = {
manifests: [
{
name: 'test-module',
imports: {
external: 'https://cdn.com/lib.js'
},
exports: {},
scopes: {}
}
],
getFile: (name, file) => `${name}/${file}`,
getScope: (name, scope) => `${name}/${scope}`
};
const result = getImportMap(options);
assert.deepEqual(result, {
imports: {
'test-module/external': 'https://cdn.com/lib.js'
},
scopes: {}
});
});
test('should handle manifests with only scopes', () => {
const options: GetImportMapOptions = {
manifests: [
{
name: 'test-module',
imports: {},
exports: {},
scopes: {
node_modules: {
react: 'https://cdn.com/react.js'
}
}
}
],
getFile: (name, file) => `${name}/${file}`,
getScope: (name, scope) => `${name}/${scope}`
};
const result = getImportMap(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: GetImportMapOptions = {
manifests: [
{
name: 'test-module',
imports: {},
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 = getImportMap(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: GetImportMapOptions = {
manifests: [
{
name: 'test-module',
imports: {},
exports: {
component: {
name: 'component',
pkg: false,
file: 'component.js',
identifier: 'test-module/component'
}
},
scopes: undefined as any
}
],
getFile: (name, file) => `${name}/${file}`,
getScope: (name, scope) => `${name}/${scope}`
};
const result = getImportMap(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: GetImportMapOptions = {
manifests: [
{
name: 'test-module',
imports: {
'external-react': 'https://cdn.com/react.js',
'local-alias': 'test-module/component'
},
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 = getImportMap(options);
assert.deepEqual(result, {
imports: {
'test-module/component': 'test-module/component.js',
'test-module/external-react': 'https://cdn.com/react.js',
'test-module/local-alias': '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: GetImportMapOptions = {
manifests: [
{
name: 'test-module',
imports: {},
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 = getImportMap(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'
}
}
});
});
});