Skip to content

Commit

Permalink
fix: able to build something
Browse files Browse the repository at this point in the history
  • Loading branch information
MadaraUchiha-314 committed Dec 2, 2023
1 parent 48fc60d commit fc7491a
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 42 deletions.
2 changes: 1 addition & 1 deletion packages/examples/project-a/federation.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export const federationconfig = {
remotes: {
'project-b': {
external: 'project-b@https://example.com/my-remote-entry.js',
}
},
},
shared: {
react: {
Expand Down
4 changes: 2 additions & 2 deletions packages/examples/project-a/src/index.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import React, { Component, useMemo } from 'react';
import { v4 as uuidv4 } from 'uuid';
/* eslint-disable-next-line import/no-unresolved */
import Button from 'project-b/Button';
import { ABC } from './abc.js';

export { createStore, compose } from 'redux';
export { applyMiddleware as kindlyApplyMiddleware } from 'redux';

import Button from 'project-b/Button';

/* eslint-disable no-console */

export async function doSomething() {
Expand Down
111 changes: 75 additions & 36 deletions packages/rollup-plugin-module-federation/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
getFileNameFromChunkName,
getSharedConfig,
getExposesConfig,
getRemotesConfig
getRemotesConfig,
} from './utils.js';
import { PACKAGE_JSON } from './constants.js';

Expand All @@ -39,26 +39,40 @@ interface ModuleVersionInfo {
eager: Nullable<boolean>;
}

type FederatedModuleType = 'exposed' | 'shared' | 'remote';
enum FederatedModuleType {
REMOTE = 'remote',
EXPOSED = 'exposed',
SHARED = 'shared',
}

interface ModuleInfo {
interface BaseModuleInfo {
name: string;
moduleNameOrPath: string;
sanitizedModuleNameOrPath: string;
sanitizedModuleNameOrPath: string | null;
type: FederatedModuleType;
}

interface RemoteModuleInfo extends BaseModuleInfo {
type: FederatedModuleType.REMOTE;
}

interface SharedOrExposedModuleInfo extends BaseModuleInfo {
chunkPath: string;
versionInfo: ModuleVersionInfo;
type: FederatedModuleType.SHARED | FederatedModuleType.EXPOSED;
}

type FederatedModuleInfo = SharedOrExposedModuleInfo | RemoteModuleInfo;

interface ModuleMapEntry {
name: string;
moduleNameOrPath: string;
chunkPath: string;
chunkPath: string | null;
type: FederatedModuleType;
version: string;
requiredVersion: string;
singleton: boolean;
strictVersion: boolean;
version: string | null;
requiredVersion: string | null;
singleton: boolean | null;
strictVersion: boolean | null;
}

interface FederatedModule {
Expand Down Expand Up @@ -229,7 +243,7 @@ export default function federation(
/**
* Created a mapping between resolvedId.id of the module to the module name (shared, exposed)
*/
const sharedOrExposedModuleInfo: Record<string, ModuleInfo> = {};
const federatedModuleInfo: Record<string, FederatedModuleInfo> = {};
/**
* Module Map cache
*/
Expand Down Expand Up @@ -283,23 +297,31 @@ export default function federation(
* @returns
*/
const getVersionForModule = (moduleNameOrPath: string) =>
Object.values(sharedOrExposedModuleInfo).find(
(moduleInfo) => moduleInfo.moduleNameOrPath === moduleNameOrPath,
)?.versionInfo?.version ?? null;
(
Object.values(federatedModuleInfo).find(
(moduleInfo) => moduleInfo.moduleNameOrPath === moduleNameOrPath,
) as SharedOrExposedModuleInfo
).versionInfo.version ?? null;

/**
* Get the module map
*/
const getModuleMap: () => ModuleMap = () =>
Object.values(sharedOrExposedModuleInfo).reduce(
Object.values(federatedModuleInfo).reduce(
(currentModuleMap, moduleInfo) => {
const {
chunkPath,
name: moduleName,
moduleNameOrPath,
type,
versionInfo,
} = moduleInfo;
const { name: moduleName, moduleNameOrPath, type } = moduleInfo;
if (type === FederatedModuleType.REMOTE) {
return {
...currentModuleMap,
[moduleName]: {
name: moduleName,
moduleNameOrPath,
type,
},
};
}
const { chunkPath, versionInfo } =
moduleInfo as SharedOrExposedModuleInfo;
const { version, requiredVersion, singleton, strictVersion } =
versionInfo;
return {
Expand Down Expand Up @@ -340,7 +362,7 @@ export default function federation(
moduleNameOrPath: sharedModuleHints?.import
? sharedModuleHints.import
: sharedModuleName,
type: 'shared',
type: FederatedModuleType.SHARED,
}),
),
);
Expand All @@ -355,7 +377,7 @@ export default function federation(
* TODO: We don't current support that import be an array. What does that even mean ? Need further clarification.
*/
moduleNameOrPath: exposedModulePath.import as string,
type: 'exposed',
type: FederatedModuleType.EXPOSED,
}),
),
);
Expand All @@ -367,8 +389,9 @@ export default function federation(
([remoteName, remoteEntity]): FederatedModule => ({
name: remoteName,
moduleNameOrPath: remoteEntity.external as string,
type: 'remote'
}))
type: FederatedModuleType.REMOTE,
}),
),
);
/* eslint-disable-next-line no-restricted-syntax */
for (const {
Expand All @@ -379,6 +402,15 @@ export default function federation(
/**
* Rollup might use its own or other registered resolvers (like @rollup/plugin-node-resolve) to resolve this.
*/
if (type === FederatedModuleType.REMOTE) {
federatedModuleInfo[moduleName] = {
name: moduleName,
moduleNameOrPath,
sanitizedModuleNameOrPath: null,
type,
};
continue;
}
/* eslint-disable-next-line no-await-in-loop */
const resolvedId = await this.resolve(moduleNameOrPath);
const resolvedModulePath = getModulePathFromResolvedId(
Expand All @@ -399,11 +431,11 @@ export default function federation(
);
if (
!Object.prototype.hasOwnProperty.call(
sharedOrExposedModuleInfo,
federatedModuleInfo,
resolvedModulePath,
)
) {
sharedOrExposedModuleInfo[resolvedModulePath] = {
federatedModuleInfo[resolvedModulePath] = {
name: moduleName,
moduleNameOrPath,
sanitizedModuleNameOrPath,
Expand Down Expand Up @@ -455,7 +487,7 @@ export default function federation(
* For remote modules, we just resolve it to the whatever the import was.
*/
for (const remoteName in remotes) {
if (source.startsWith(`${remoteName}@`)) {
if (source.startsWith(`${remoteName}/`)) {
return {
id: source,
external: true,
Expand Down Expand Up @@ -601,13 +633,16 @@ export default function federation(
);
if (
Object.prototype.hasOwnProperty.call(
sharedOrExposedModuleInfo,
federatedModuleInfo,
resolvedModulePath,
)
) {
chunkHasFederatedImports = true;
const chunkName =
sharedOrExposedModuleInfo[resolvedModulePath].chunkPath;
const chunkName = (
federatedModuleInfo[
resolvedModulePath
] as SharedOrExposedModuleInfo
).chunkPath;
const moduleSpecifier = `${FEDERATED_IMPORT_EXPR}('${chunkName}')`;
const federatedImportStmsStr =
getFederatedImportStatementForNode(
Expand Down Expand Up @@ -661,7 +696,7 @@ export default function federation(
const resolvedModulePath = getModulePathFromResolvedId(id);
if (
Object.prototype.hasOwnProperty.call(
sharedOrExposedModuleInfo,
federatedModuleInfo,
resolvedModulePath,
)
) {
Expand All @@ -671,12 +706,16 @@ export default function federation(
* NOTE: Providing the chunk name the same as the remote entry name doesn't work as it ends up creating multiple chunks.
* TODO: Raise this bug with rollup.
*/
if (sharedOrExposedModuleInfo[resolvedModulePath].versionInfo.eager) {
if (
(
federatedModuleInfo[
resolvedModulePath
] as SharedOrExposedModuleInfo
).versionInfo.eager
) {
return null;
}
return getChunkNameForModule(
sharedOrExposedModuleInfo[resolvedModulePath],
);
return getChunkNameForModule(federatedModuleInfo[resolvedModulePath]);
}
return null;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,4 +20,3 @@ export declare interface ExposesObject {
export declare interface RemotesObject {
[index: string]: RemotesConfig;
}

4 changes: 2 additions & 2 deletions packages/rollup-plugin-module-federation/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ export function getChunkNameForModule({
sanitizedModuleNameOrPath,
type,
}: {
sanitizedModuleNameOrPath: string;
sanitizedModuleNameOrPath: string | null;
type: 'shared' | 'exposed' | 'remote';
}) {
return `__federated__${type}__${sanitizedModuleNameOrPath}`;
Expand Down Expand Up @@ -203,4 +203,4 @@ export function getRemotesConfig(remotes: Remotes): RemotesObject {
{},
);
}
}
}

0 comments on commit fc7491a

Please sign in to comment.