66 lines
1.7 KiB
TypeScript
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 };
|
|
}
|