@expo/fingerprint
Version:
A library to generate a fingerprint from a React Native project
127 lines • 5.7 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DEFAULT_SOURCE_SKIPS = exports.DEFAULT_IGNORE_PATHS = exports.FINGERPRINT_IGNORE_FILENAME = void 0;
exports.normalizeOptionsAsync = normalizeOptionsAsync;
const promises_1 = __importDefault(require("fs/promises"));
const os_1 = __importDefault(require("os"));
const path_1 = __importDefault(require("path"));
const Config_1 = require("./Config");
const ExpoResolver_1 = require("./ExpoResolver");
const ProjectWorkflow_1 = require("./ProjectWorkflow");
const SourceSkips_1 = require("./sourcer/SourceSkips");
const Path_1 = require("./utils/Path");
exports.FINGERPRINT_IGNORE_FILENAME = '.fingerprintignore';
exports.DEFAULT_IGNORE_PATHS = [
exports.FINGERPRINT_IGNORE_FILENAME,
// Android
'**/android/build/**/*',
'**/android/.cxx/**/*',
'**/android/.gradle/**/*',
'**/android/app/build/**/*',
'**/android/app/.cxx/**/*',
'**/android/app/.gradle/**/*',
'**/android-annotation/build/**/*',
'**/android-annotation/.cxx/**/*',
'**/android-annotation/.gradle/**/*',
'**/android-annotation-processor/build/**/*',
'**/android-annotation-processor/.cxx/**/*',
'**/android-annotation-processor/.gradle/**/*',
// Often has different line endings, thus we have to ignore it
'**/android/gradlew.bat',
// Android gradle plugins
'**/*-gradle-plugin/build/**/*',
'**/*-gradle-plugin/.cxx/**/*',
'**/*-gradle-plugin/.gradle/**/*',
// iOS
'**/ios/Pods/**/*',
'**/ios/build/**/*',
'**/ios/.xcode.env.local',
'**/ios/**/project.xcworkspace',
'**/ios/*.xcworkspace/xcuserdata/**/*',
// System files that differ from machine to machine
'**/.DS_Store',
// Ignore all expo configs because we will read expo config in a HashSourceContents already
'app.config.ts',
'app.config.js',
'app.config.json',
'app.json',
// Ignore CocoaPods generated files
// https://github.com/expo/expo/blob/d0e39858ead9a194d90990f89903e773b9d33582/packages/expo-sqlite/ios/ExpoSQLite.podspec#L25-L36
// https://github.com/expo/expo/blob/d0e39858ead9a194d90990f89903e773b9d33582/packages/expo-updates/ios/EXUpdates.podspec#L51-L58
'**/node_modules/expo-sqlite/ios/sqlite3.[ch]',
'**/node_modules/expo-updates/ios/EXUpdates/BSPatch/bspatch.c',
// Ignore nested node_modules
'**/node_modules/**/node_modules/**',
// Ignore node binaries that might be platform dependent
'**/node_modules/**/*.node',
'**/node_modules/@img/sharp-*/**/*',
'**/node_modules/sharp/{build,vendor}/**/*',
];
exports.DEFAULT_SOURCE_SKIPS = SourceSkips_1.SourceSkips.PackageJsonAndroidAndIosScriptsIfNotContainRun;
async function normalizeOptionsAsync(projectRoot, options) {
const config = await (0, Config_1.loadConfigAsync)(projectRoot, options?.silent ?? false);
const ignorePathMatchObjects = await collectIgnorePathsAsync(projectRoot, config?.ignorePaths, options);
const useCNGForPlatforms = await resolveUseCNGAsync(projectRoot, options, ignorePathMatchObjects);
if (useCNGForPlatforms.android) {
(0, Path_1.appendIgnorePath)(ignorePathMatchObjects, 'android/**/*');
}
if (useCNGForPlatforms.ios) {
(0, Path_1.appendIgnorePath)(ignorePathMatchObjects, 'ios/**/*');
}
return {
// Defaults
platforms: ['android', 'ios'],
concurrentIoLimit: os_1.default.cpus().length,
hashAlgorithm: 'sha1',
sourceSkips: exports.DEFAULT_SOURCE_SKIPS,
// Options from config
...config,
// Explicit options
...Object.fromEntries(Object.entries(options ?? {}).filter(([_, v]) => v != null)),
// These options are computed by both default and explicit options, so we put them last.
enableReactImportsPatcher: options?.enableReactImportsPatcher ??
config?.enableReactImportsPatcher ??
(0, ExpoResolver_1.satisfyExpoVersion)(projectRoot, '<52.0.0') ??
false,
ignorePathMatchObjects,
ignoreDirMatchObjects: (0, Path_1.buildDirMatchObjects)(ignorePathMatchObjects),
useCNGForPlatforms,
};
}
async function collectIgnorePathsAsync(projectRoot, pathsFromConfig, options) {
const ignorePaths = [
...exports.DEFAULT_IGNORE_PATHS,
...(pathsFromConfig ?? []),
...(options?.ignorePaths ?? []),
...(options?.dirExcludes?.map((dirExclude) => `${dirExclude}/**/*`) ?? []),
];
const fingerprintIgnorePath = path_1.default.join(projectRoot, exports.FINGERPRINT_IGNORE_FILENAME);
try {
const fingerprintIgnore = await promises_1.default.readFile(fingerprintIgnorePath, 'utf8');
const fingerprintIgnoreLines = fingerprintIgnore.split('\n');
for (const line of fingerprintIgnoreLines) {
const trimmedLine = line.trim();
if (trimmedLine) {
ignorePaths.push(trimmedLine);
}
}
}
catch { }
return (0, Path_1.buildPathMatchObjects)(ignorePaths);
}
async function resolveUseCNGAsync(projectRoot, options, ignorePathMatchObjects) {
const results = {
android: false,
ios: false,
};
const platforms = options?.platforms ?? ['android', 'ios'];
for (const platform of platforms) {
const projectWorkflow = await (0, ProjectWorkflow_1.resolveProjectWorkflowAsync)(projectRoot, platform, ignorePathMatchObjects);
results[platform] = projectWorkflow === 'managed';
}
return results;
}
//# sourceMappingURL=Options.js.map