UNPKG

@expo/fingerprint

Version:

A library to generate a fingerprint from a React Native project

82 lines 3.13 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.dedupSources = dedupSources; exports.mergeSourceWithReasons = mergeSourceWithReasons; const assert_1 = __importDefault(require("assert")); const path_1 = __importDefault(require("path")); const debug = require('debug')('expo:fingerprint:Dedup'); /** * Strip duplicated sources, mainly for duplicated file or dir */ function dedupSources(sources, projectRoot) { const newSources = []; for (const source of sources) { const [duplicatedItemIndex, shouldSwapSource] = findDuplicatedSourceIndex(newSources, source, projectRoot); if (duplicatedItemIndex >= 0) { const duplicatedItem = newSources[duplicatedItemIndex]; debug(`Skipping duplicated source: ${JSON.stringify(source)}`); if (shouldSwapSource) { newSources[duplicatedItemIndex] = { ...source, reasons: [...source.reasons, ...duplicatedItem.reasons], }; } else { duplicatedItem.reasons = [...duplicatedItem.reasons, ...source.reasons]; } } else { newSources.push(source); } } return newSources; } /** * When two sources are duplicated, merge `src`'s reasons into `dst` */ function mergeSourceWithReasons(dst, src) { return dst; } /** * Find the duplicated `source` in `newSources` * @return tuple of [duplicatedItemIndexInNewSources, shouldSwapSource] */ function findDuplicatedSourceIndex(newSources, source, projectRoot) { let shouldSwapSource = false; if (source.type === 'contents') { return [ newSources.findIndex((item) => item.type === source.type && item.id === source.id) ?? null, shouldSwapSource, ]; } for (const [index, existingSource] of newSources.entries()) { if (existingSource.type === 'contents') { continue; } if (isDescendant(source, existingSource, projectRoot)) { return [index, shouldSwapSource]; } // If the new source is ancestor of existing source, replace swap the existing source with the new source if (isDescendant(existingSource, source, projectRoot)) { shouldSwapSource = true; return [index, shouldSwapSource]; } } return [-1, shouldSwapSource]; } function isDescendant(from, to, projectRoot) { if (from === to) { return true; } const fromPath = path_1.default.join(projectRoot, from.filePath); const toPath = path_1.default.join(projectRoot, to.filePath); const result = path_1.default.relative(fromPath, toPath).match(/^[./\\/]*$/) != null; if (result) { (0, assert_1.default)(!(to.type === 'file' && from.type === 'dir'), `Unexpected case which a dir is a descendant of a file - from[${fromPath}] to[${toPath}]`); } return result; } //# sourceMappingURL=Dedup.js.map