110 lines
3.1 KiB
TypeScript
110 lines
3.1 KiB
TypeScript
import { Remotes } from './models';
|
|
import { extname } from 'path';
|
|
|
|
/**
|
|
* Map remote names to a format that can be understood and used by Module
|
|
* Federation.
|
|
*
|
|
* @param remotes - The remotes to map
|
|
* @param remoteEntryExt - The file extension of the remoteEntry file
|
|
* @param determineRemoteUrl - The function used to lookup the URL of the served remote
|
|
*/
|
|
export function mapRemotes(
|
|
remotes: Remotes,
|
|
remoteEntryExt: 'js' | 'mjs',
|
|
determineRemoteUrl: (remote: string) => string,
|
|
isRemoteGlobal = false
|
|
): Record<string, string> {
|
|
const mappedRemotes = {};
|
|
|
|
for (const remote of remotes) {
|
|
if (Array.isArray(remote)) {
|
|
mappedRemotes[remote[0]] = handleArrayRemote(
|
|
remote,
|
|
remoteEntryExt,
|
|
isRemoteGlobal
|
|
);
|
|
} else if (typeof remote === 'string') {
|
|
mappedRemotes[remote] = handleStringRemote(
|
|
remote,
|
|
determineRemoteUrl,
|
|
isRemoteGlobal
|
|
);
|
|
}
|
|
}
|
|
|
|
return mappedRemotes;
|
|
}
|
|
|
|
// Helper function to deal with remotes that are arrays
|
|
function handleArrayRemote(
|
|
remote: [string, string],
|
|
remoteEntryExt: 'js' | 'mjs',
|
|
isRemoteGlobal: boolean
|
|
): string {
|
|
const [remoteName, remoteLocation] = remote;
|
|
const remoteLocationExt = extname(remoteLocation);
|
|
|
|
// If remote location already has .js or .mjs extension
|
|
if (['.js', '.mjs'].includes(remoteLocationExt)) {
|
|
return remoteLocation;
|
|
}
|
|
|
|
const baseRemote = remoteLocation.endsWith('/')
|
|
? remoteLocation.slice(0, -1)
|
|
: remoteLocation;
|
|
|
|
const globalPrefix = isRemoteGlobal
|
|
? `${remoteName.replace(/-/g, '_')}@`
|
|
: '';
|
|
|
|
return `${globalPrefix}${baseRemote}/remoteEntry.${remoteEntryExt}`;
|
|
}
|
|
|
|
// Helper function to deal with remotes that are strings
|
|
function handleStringRemote(
|
|
remote: string,
|
|
determineRemoteUrl: (remote: string) => string,
|
|
isRemoteGlobal: boolean
|
|
): string {
|
|
const globalPrefix = isRemoteGlobal ? `${remote.replace(/-/g, '_')}@` : '';
|
|
|
|
return `${globalPrefix}${determineRemoteUrl(remote)}`;
|
|
}
|
|
|
|
/**
|
|
* Map remote names to a format that can be understood and used by Module
|
|
* Federation.
|
|
*
|
|
* @param remotes - The remotes to map
|
|
* @param remoteEntryExt - The file extension of the remoteEntry file
|
|
* @param determineRemoteUrl - The function used to lookup the URL of the served remote
|
|
*/
|
|
export function mapRemotesForSSR(
|
|
remotes: Remotes,
|
|
remoteEntryExt: 'js' | 'mjs',
|
|
determineRemoteUrl: (remote: string) => string
|
|
): Record<string, string> {
|
|
const mappedRemotes = {};
|
|
|
|
for (const remote of remotes) {
|
|
if (Array.isArray(remote)) {
|
|
const [remoteName, remoteLocation] = remote;
|
|
const remoteLocationExt = extname(remoteLocation);
|
|
mappedRemotes[remoteName] = `${remoteName}@${
|
|
['.js', '.mjs'].includes(remoteLocationExt)
|
|
? remoteLocation
|
|
: `${
|
|
remoteLocation.endsWith('/')
|
|
? remoteLocation.slice(0, -1)
|
|
: remoteLocation
|
|
}/remoteEntry.${remoteEntryExt}`
|
|
}`;
|
|
} else if (typeof remote === 'string') {
|
|
mappedRemotes[remote] = `${remote}@${determineRemoteUrl(remote)}`;
|
|
}
|
|
}
|
|
|
|
return mappedRemotes;
|
|
}
|