UNPKG

3.35 kBJavaScriptView Raw
1import chalk from "chalk";
2import { dirname, relative, resolve } from "path";
3import semver from "semver";
4function resolvePackage(moduleStr, fromDir, alreadyResolved) {
5 try {
6 const resolved = resolve(require.resolve(moduleStr + "/package.json", {
7 paths: [fromDir]
8 }));
9 const resolvedEntry = resolve(require.resolve(moduleStr, {
10 paths: [fromDir]
11 }));
12 if (alreadyResolved.has(resolved)) {
13 return null;
14 }
15 alreadyResolved.add(resolved);
16 const directory = dirname(resolved);
17 return {
18 packageFile: resolved,
19 directory,
20 entry: resolvedEntry
21 };
22 }
23 catch (err) {
24 return null;
25 }
26}
27export function attemptModuleDeduplication(moduleStr, configuration, fromPaths) {
28 const resolved = new Set();
29 const resolvedIn = fromPaths
30 .map(dir => resolvePackage(moduleStr, dir, resolved))
31 .filter((el) => Boolean(el));
32 if (resolvedIn.length === 0) {
33 return null;
34 }
35 if (resolvedIn.length === 1) {
36 return resolvedIn[0].directory;
37 }
38 const packages = resolvedIn.map(data => {
39 const packageData = require(data.packageFile);
40 return {
41 packageData,
42 version: packageData.version,
43 ...data
44 };
45 });
46 packages.sort((a, b) => semver.compare(b.version, a.version));
47 for (const { version } of packages.slice(1)) {
48 const diff = semver.diff(packages[0].version, version);
49 if (diff === "major" || diff === "premajor") {
50 console.log(chalk.yellow(` - WARNING: Cannot deduplicate versions ${version} and ${packages[0].version} of package ${chalk.cyanBright(moduleStr)} - ${diff} release differs`));
51 return null;
52 }
53 }
54 console.log(chalk.green(` - SUCCESS: Deduplicating versions package ${chalk.cyan(moduleStr)} into ${chalk.cyan(packages[0].version)} at ${chalk.cyan(relative(configuration.context, packages[0].directory))}`));
55 for (const { version, directory } of packages.slice(1)) {
56 console.log(chalk.gray(` deduped ${version} @ ${relative(configuration.context, directory)}`));
57 }
58 return packages[0].directory;
59}
60export function createDeduplicationAliases(configuration, fromPaths, deduplication) {
61 const alias = {};
62 const dedupeModules = new Set([
63 ...(deduplication || []),
64 "lodash",
65 "lodash-es",
66 "iconv-lite",
67 "busboy",
68 "jsonwebtoken",
69 "ms",
70 "raw-body",
71 "send",
72 "statuses",
73 "apollo-utilities",
74 "react-apollo",
75 "apollo-client",
76 "apollo-server",
77 "graphql",
78 "webpack"
79 ]);
80 const filteredPaths = fromPaths.filter((el) => Boolean(el));
81 for (const mod of dedupeModules) {
82 if (mod == null) {
83 continue;
84 }
85 const dedupedPath = attemptModuleDeduplication(mod, configuration, filteredPaths);
86 if (dedupedPath != null) {
87 alias[mod] = dedupedPath;
88 }
89 }
90 if (alias["lodash-es"] != null) {
91 alias.lodash = alias["lodash-es"];
92 }
93 return alias;
94}
95//# sourceMappingURL=moduleDeduplication.js.map
\No newline at end of file