From a1db6381d33d61461a8ad40f58bdf3115003749a Mon Sep 17 00:00:00 2001 From: Vio Date: Wed, 28 Feb 2024 13:35:59 +0100 Subject: [PATCH] fix(utils): Extract package - skip module federation modules --- .../extract/__tests__/modules-packages.ts | 13 ++ .../src/webpack/extract/modules-packages.ts | 135 ++++++++++-------- 2 files changed, 87 insertions(+), 61 deletions(-) diff --git a/packages/utils/src/webpack/extract/__tests__/modules-packages.ts b/packages/utils/src/webpack/extract/__tests__/modules-packages.ts index 1174f36681..360fd4f0ef 100644 --- a/packages/utils/src/webpack/extract/__tests__/modules-packages.ts +++ b/packages/utils/src/webpack/extract/__tests__/modules-packages.ts @@ -174,6 +174,19 @@ describe('Webpack/extract', () => { path: './node_modules/.pnpm/github.com+org-a+repo-a@abcd1234/node_modules/repo-a', }); }); + + test('should skip module federation module paths', () => { + expect( + getPackageMetaFromModulePath( + 'provide shared module (default) react@17.0.2 = ../node_modules/react/index.js', + ), + ).toEqual(null); + expect( + getPackageMetaFromModulePath( + 'consume shared module (default) react@^17.0.2 (singleton) (fallback: ../node_modules/react/index.js) (eager)', + ), + ).toEqual(null); + }); }); }); diff --git a/packages/utils/src/webpack/extract/modules-packages.ts b/packages/utils/src/webpack/extract/modules-packages.ts index fd1ad6177f..89f411368b 100644 --- a/packages/utils/src/webpack/extract/modules-packages.ts +++ b/packages/utils/src/webpack/extract/modules-packages.ts @@ -22,6 +22,11 @@ const uniqLast = (data: Array) => { * Heuristics to extract package id, name, and path from a module path */ export const getPackageMetaFromModulePath = (modulePath: string) => { + // Skip module federation entries + if (modulePath.match(/^(provide|consume) shared module/)) { + return null; + } + const paths = modulePath.match(MODULE_PATH_PACKAGES); // No package paths found, skip @@ -41,7 +46,11 @@ export const getPackageMetaFromModulePath = (modulePath: string) => { return []; } - return [...found].flat().slice(1).filter(Boolean).map((name) => name.replace(/\+/g, '/')); + return [...found] + .flat() + .slice(1) + .filter(Boolean) + .map((name) => name.replace(/\+/g, '/')); }) .flat(), ); @@ -71,74 +80,78 @@ export const extractModulesPackages = ( ): MetricsPackages => { const modules = Object.entries(currentExtractedData?.metrics?.modules || {}); - const packages = modules.reduce((agg, [modulePath, { value }]) => { - const packageMeta = getPackageMetaFromModulePath(modulePath); - - if (!packageMeta) { - return agg; - } - - const existingPackageData = agg[packageMeta.id]; + const packages = modules.reduce( + (agg, [modulePath, { value }]) => { + const packageMeta = getPackageMetaFromModulePath(modulePath); + + if (!packageMeta) { + return agg; + } + + const existingPackageData = agg[packageMeta.id]; + + // New package data + if (!existingPackageData) { + return { + ...agg, + [packageMeta.id]: { + name: packageMeta.name, + path: packageMeta.path, + value, + }, + }; + } + + // Existing package info + if (existingPackageData.path === packageMeta.path) { + return { + ...agg, + [packageMeta.id]: { + ...existingPackageData, + value: existingPackageData.value + value, + }, + }; + } + + // Same package name, but different paths (eg: symlinks) + const existingPackageWithEqualPath = Object.entries(agg).find( + ([__, packageData]) => packageData.path === packageMeta.path, + ); + + if (existingPackageWithEqualPath) { + const [name, data] = existingPackageWithEqualPath; + + return { + ...agg, + [name]: { + ...data, + value: data.value + value, + }, + }; + } + + // New package name & data + const lastIndex = + max( + Object.keys(agg) + .map((id) => id.split('~')) + .filter(([id]) => id === packageMeta.id) + .map(([__, index]) => parseInt(index, 10)), + ) || 0; + + const packageName = [packageMeta.id, lastIndex + 1].join(PACKAGE_ID_SEPARATOR); - // New package data - if (!existingPackageData) { return { ...agg, - [packageMeta.id]: { + [packageName]: { name: packageMeta.name, path: packageMeta.path, value, }, }; - } - - // Existing package info - if (existingPackageData.path === packageMeta.path) { - return { - ...agg, - [packageMeta.id]: { - ...existingPackageData, - value: existingPackageData.value + value, - }, - }; - } - - // Same package name, but different paths (eg: symlinks) - const existingPackageWithEqualPath = Object.entries(agg).find( - ([__, packageData]) => packageData.path === packageMeta.path, - ); - - if (existingPackageWithEqualPath) { - const [name, data] = existingPackageWithEqualPath; - - return { - ...agg, - [name]: { - ...data, - value: data.value + value, - }, - }; - } - - // New package name & data - const lastIndex = max( - Object.keys(agg) - .map((id) => id.split('~')) - .filter(([id]) => id === packageMeta.id) - .map(([__, index]) => parseInt(index, 10)), - ) || 0; - - const packageName = [packageMeta.id, lastIndex + 1].join(PACKAGE_ID_SEPARATOR); - - return { - ...agg, - [packageName]: { - name: packageMeta.name, - path: packageMeta.path, - value, - }, - }; - }, {} as Record); + }, + {} as Record, + ); return { metrics: { packages } }; };