@sanpjs/bundler-webpack
Version:
@sanpjs/bundler-webpack
65 lines • 2.74 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
/**
* @file 检查重复引入的第三方库
* Reference: https://github.com/ecomfe/reskript/blob/master/packages/cli-build/src/inspect/duplicatePackages.ts
*/
const lodash_uniqBy_1 = __importDefault(require("lodash.uniqBy"));
const lodash_compact_1 = __importDefault(require("lodash.compact"));
const inspect_1 = require("../utils/inspect");
const extractUniqueModules = (compilations) => {
const modules = compilations.reduce((res, { modules = [] }) => [...res, ...modules], []);
const names = modules.map((m) => m && m.nameForCondition);
// @ts-ignore
return (0, lodash_uniqBy_1.default)((0, lodash_compact_1.default)(names));
};
const parseName = (name) => {
const lastIndex = name.lastIndexOf('node_modules/');
if (lastIndex < 0) {
return null;
}
const pathPrefix = name.slice(0, lastIndex + 'node_modules/'.length);
const segments = name.slice(pathPrefix.length).split('/');
const packageName = segments[0].startsWith('@') ? `${segments[0]}/${segments[1]}` : segments[0];
return {
name: packageName,
path: pathPrefix + packageName
};
};
exports.default = (compilations, dupPkgConfig, context) => {
const processor = {
config: dupPkgConfig,
defaultValue: {},
check: async ({ includes, excludes }, { report }) => {
const names = extractUniqueModules(compilations);
const occurences = names.reduce((occurences, current) => {
const info = parseName(current);
if (!info) {
return occurences;
}
if (occurences.has(info.name)) {
occurences.get(info.name).add(info.path);
}
else {
occurences.set(info.name, new Set([info.path]));
}
return occurences;
}, new Map());
for (const [name, paths] of occurences.entries()) {
if (paths.size > 1 && (0, inspect_1.isIncluded)(name, includes, excludes)) {
const locations = await Promise.all([...paths].map(async (location) => {
const version = context.pkg.version;
return ` at ${location} (v${version})`;
}));
report(`DupPkg: Found duplicate package ${name}\n${locations.join('\n')}`);
}
}
return true;
}
};
return processor;
};
//# sourceMappingURL=dupPkg.js.map