66 lines
1.7 KiB
TypeScript

import {
applyAdditionalShared,
applySharedFunction,
createProjectGraphAsync,
getDependentPackagesForProject,
mapRemotes,
mapRemotesForSSR,
ModuleFederationConfig,
ProjectConfiguration,
ProjectGraph,
readCachedProjectGraph,
sharePackages,
shareWorkspaceLibraries,
} from '@nrwl/devkit';
export async function getModuleFederationConfig(
mfConfig: ModuleFederationConfig,
determineRemoteUrl: (remote: string) => string,
options: { isServer: boolean } = { isServer: false }
) {
let projectGraph: ProjectGraph<ProjectConfiguration>;
try {
projectGraph = readCachedProjectGraph();
} catch (e) {
projectGraph = await createProjectGraphAsync();
}
const project = projectGraph.nodes[mfConfig.name]?.data;
if (!project) {
throw Error(
`Cannot find project "${mfConfig.name}". Check that the name is correct in module-federation.config.js`
);
}
const dependencies = getDependentPackagesForProject(
projectGraph,
mfConfig.name
);
const sharedLibraries = shareWorkspaceLibraries(
dependencies.workspaceLibraries
);
const npmPackages = sharePackages(dependencies.npmPackages);
const sharedDependencies = {
...sharedLibraries.getLibraries(),
...npmPackages,
};
applySharedFunction(sharedDependencies, mfConfig.shared);
applyAdditionalShared(
sharedDependencies,
mfConfig.additionalShared,
projectGraph
);
const mapRemotesFunction = options.isServer ? mapRemotesForSSR : mapRemotes;
const mappedRemotes =
!mfConfig.remotes || mfConfig.remotes.length === 0
? {}
: mapRemotesFunction(mfConfig.remotes, 'js', determineRemoteUrl);
return { sharedLibraries, sharedDependencies, mappedRemotes };
}