UNPKG

@sanpjs/bundler-webpack

Version:

@sanpjs/bundler-webpack

65 lines 2.74 kB
"use strict"; 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