UNPKG

7.16 kBSource Map (JSON)View Raw
1{"version":3,"file":"moduleDeduplication.js","sourceRoot":"","sources":["../../moduleDeduplication.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from \"chalk\";\r\nimport { dirname, relative, resolve } from \"path\";\r\nimport semver from \"semver\";\r\n\r\nimport { IConfiguration } from \".\";\r\n\r\nfunction resolvePackage(moduleStr: string, fromDir: string, alreadyResolved: Set<string>) {\r\n try {\r\n const resolved = resolve(\r\n require.resolve(moduleStr + \"/package.json\", {\r\n paths: [fromDir]\r\n })\r\n );\r\n const resolvedEntry = resolve(\r\n require.resolve(moduleStr, {\r\n paths: [fromDir]\r\n })\r\n );\r\n if (alreadyResolved.has(resolved)) {\r\n return null;\r\n }\r\n alreadyResolved.add(resolved);\r\n const directory = dirname(resolved);\r\n\r\n return {\r\n packageFile: resolved,\r\n directory,\r\n entry: resolvedEntry\r\n };\r\n } catch (err) {\r\n return null;\r\n }\r\n}\r\n\r\nexport function attemptModuleDeduplication(\r\n moduleStr: string,\r\n configuration: IConfiguration,\r\n fromPaths: string[]\r\n) {\r\n const resolved = new Set<string>();\r\n const resolvedIn = fromPaths\r\n .map(dir => resolvePackage(moduleStr, dir, resolved))\r\n .filter((el): el is NonNullable<ReturnType<typeof resolvePackage>> => Boolean(el));\r\n\r\n if (resolvedIn.length === 0) {\r\n return null;\r\n }\r\n if (resolvedIn.length === 1) {\r\n return resolvedIn[0].directory;\r\n }\r\n\r\n const packages = resolvedIn.map(data => {\r\n const packageData = require(data.packageFile);\r\n return {\r\n packageData,\r\n version: packageData.version,\r\n ...data\r\n };\r\n });\r\n\r\n packages.sort((a, b) => semver.compare(b.version, a.version));\r\n\r\n for (const { version } of packages.slice(1)) {\r\n const diff = semver.diff(packages[0].version, version);\r\n if (diff === \"major\" || diff === \"premajor\") {\r\n console.log(\r\n chalk.yellow(\r\n ` - WARNING: Cannot deduplicate versions ${version} and ${\r\n packages[0].version\r\n } of package ${chalk.cyanBright(moduleStr)} - ${diff} release differs`\r\n )\r\n );\r\n return null;\r\n }\r\n }\r\n console.log(\r\n chalk.green(\r\n ` - SUCCESS: Deduplicating versions package ${chalk.cyan(moduleStr)} into ${chalk.cyan(\r\n packages[0].version\r\n )} at ${chalk.cyan(relative(configuration.context, packages[0].directory))}`\r\n )\r\n );\r\n for (const { version, directory } of packages.slice(1)) {\r\n console.log(\r\n chalk.gray(` deduped ${version} @ ${relative(configuration.context, directory)}`)\r\n );\r\n }\r\n\r\n return packages[0].directory;\r\n}\r\n\r\nexport function createDeduplicationAliases(\r\n configuration: IConfiguration,\r\n fromPaths: Array<string | null>,\r\n deduplication?: Array<string | null>\r\n) {\r\n const alias: {\r\n [key: string]: string | undefined;\r\n } = {};\r\n\r\n const dedupeModules = new Set([\r\n ...(deduplication || []),\r\n \"lodash\",\r\n \"lodash-es\",\r\n \"iconv-lite\",\r\n \"busboy\",\r\n \"jsonwebtoken\",\r\n \"ms\",\r\n \"raw-body\",\r\n \"send\",\r\n \"statuses\",\r\n \"apollo-utilities\",\r\n \"react-apollo\",\r\n \"apollo-client\",\r\n \"apollo-server\",\r\n \"graphql\",\r\n \"webpack\"\r\n ]);\r\n\r\n const filteredPaths = fromPaths.filter((el): el is string => Boolean(el));\r\n\r\n for (const mod of dedupeModules) {\r\n if (mod == null) {\r\n continue;\r\n }\r\n const dedupedPath = attemptModuleDeduplication(mod, configuration, filteredPaths);\r\n if (dedupedPath != null) {\r\n alias[mod] = dedupedPath;\r\n }\r\n }\r\n\r\n if (alias[\"lodash-es\"] != null) {\r\n alias.lodash = alias[\"lodash-es\"];\r\n }\r\n\r\n return alias;\r\n}\r\n"]}
\No newline at end of file