@expo/fingerprint
Version:
A library to generate a fingerprint from a React Native project
216 lines • 8.94 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getBareAndroidSourcesAsync = getBareAndroidSourcesAsync;
exports.getBareIosSourcesAsync = getBareIosSourcesAsync;
exports.getPackageJsonScriptSourcesAsync = getPackageJsonScriptSourcesAsync;
exports.getGitIgnoreSourcesAsync = getGitIgnoreSourcesAsync;
exports.getCoreAutolinkingSourcesFromRncCliAsync = getCoreAutolinkingSourcesFromRncCliAsync;
exports.getCoreAutolinkingSourcesFromExpoAndroid = getCoreAutolinkingSourcesFromExpoAndroid;
exports.getCoreAutolinkingSourcesFromExpoIos = getCoreAutolinkingSourcesFromExpoIos;
const spawn_async_1 = __importDefault(require("@expo/spawn-async"));
const assert_1 = __importDefault(require("assert"));
const chalk_1 = __importDefault(require("chalk"));
const node_process_1 = __importDefault(require("node:process"));
const path_1 = __importDefault(require("path"));
const resolve_from_1 = __importDefault(require("resolve-from"));
const ExpoResolver_1 = require("../ExpoResolver");
const SourceSkips_1 = require("./SourceSkips");
const Utils_1 = require("./Utils");
const Path_1 = require("../utils/Path");
const debug = require('debug')('expo:fingerprint:sourcer:Bare');
async function getBareAndroidSourcesAsync(projectRoot, options) {
if (options.platforms.includes('android')) {
const result = await (0, Utils_1.getFileBasedHashSourceAsync)(projectRoot, 'android', 'bareNativeDir');
if (result != null) {
debug(`Adding bare native dir - ${chalk_1.default.dim('android')}`);
return [result];
}
}
return [];
}
async function getBareIosSourcesAsync(projectRoot, options) {
if (options.platforms.includes('ios')) {
const result = await (0, Utils_1.getFileBasedHashSourceAsync)(projectRoot, 'ios', 'bareNativeDir');
if (result != null) {
debug(`Adding bare native dir - ${chalk_1.default.dim('ios')}`);
return [result];
}
}
return [];
}
async function getPackageJsonScriptSourcesAsync(projectRoot, options) {
if (options.sourceSkips & SourceSkips_1.SourceSkips.PackageJsonScriptsAll) {
return [];
}
let packageJson;
try {
packageJson = require((0, resolve_from_1.default)(path_1.default.resolve(projectRoot), './package.json'));
}
catch (e) {
debug(`Unable to read package.json from ${path_1.default.resolve(projectRoot)}/package.json: ` + e);
return [];
}
const results = [];
if (packageJson.scripts) {
debug(`Adding package.json contents - ${chalk_1.default.dim('scripts')}`);
const id = 'packageJson:scripts';
results.push({
type: 'contents',
id,
contents: normalizePackageJsonScriptSources(packageJson.scripts, options),
reasons: [id],
});
}
return results;
}
async function getGitIgnoreSourcesAsync(projectRoot, options) {
if (options.sourceSkips & SourceSkips_1.SourceSkips.GitIgnore) {
return [];
}
const result = await (0, Utils_1.getFileBasedHashSourceAsync)(projectRoot, '.gitignore', 'bareGitIgnore');
if (result != null) {
debug(`Adding file - ${chalk_1.default.dim('.gitignore')}`);
return [result];
}
return [];
}
async function getCoreAutolinkingSourcesFromRncCliAsync(projectRoot, options, useRNCoreAutolinkingFromExpo) {
if (useRNCoreAutolinkingFromExpo === true) {
return [];
}
try {
const { stdout } = await (0, spawn_async_1.default)('npx', ['react-native', 'config'], { cwd: projectRoot });
const config = JSON.parse(stdout);
const results = await parseCoreAutolinkingSourcesAsync({
config,
contentsId: 'rncoreAutolinkingConfig',
reasons: ['rncoreAutolinking'],
});
return results;
}
catch (e) {
debug(chalk_1.default.red(`Error adding react-native core autolinking sources.\n${e}`));
return [];
}
}
async function getCoreAutolinkingSourcesFromExpoAndroid(projectRoot, options, useRNCoreAutolinkingFromExpo) {
if (useRNCoreAutolinkingFromExpo === false || !options.platforms.includes('android')) {
return [];
}
const args = [
(0, ExpoResolver_1.resolveExpoAutolinkingCliPath)(projectRoot),
'react-native-config',
'--json',
'--platform',
'android',
];
try {
const { stdout } = await (0, spawn_async_1.default)('node', args, { cwd: projectRoot });
const config = JSON.parse(stdout);
const results = await parseCoreAutolinkingSourcesAsync({
config,
contentsId: 'rncoreAutolinkingConfig:android',
reasons: ['rncoreAutolinkingAndroid'],
platform: 'android',
});
return results;
}
catch (e) {
debug(chalk_1.default.red(`Error adding react-native core autolinking sources for android.\n${e}`));
return [];
}
}
async function getCoreAutolinkingSourcesFromExpoIos(projectRoot, options, useRNCoreAutolinkingFromExpo) {
if (useRNCoreAutolinkingFromExpo === false || !options.platforms.includes('ios')) {
return [];
}
try {
const { stdout } = await (0, spawn_async_1.default)('node', [
(0, ExpoResolver_1.resolveExpoAutolinkingCliPath)(projectRoot),
'react-native-config',
'--json',
'--platform',
'ios',
], { cwd: projectRoot });
const config = JSON.parse(stdout);
const results = await parseCoreAutolinkingSourcesAsync({
config,
contentsId: 'rncoreAutolinkingConfig:ios',
reasons: ['rncoreAutolinkingIos'],
platform: 'ios',
});
return results;
}
catch (e) {
debug(chalk_1.default.red(`Error adding react-native core autolinking sources for ios.\n${e}`));
return [];
}
}
async function parseCoreAutolinkingSourcesAsync({ config, reasons, contentsId, platform, }) {
const logTag = platform
? `react-native core autolinking dir for ${platform}`
: 'react-native core autolinking dir';
const results = [];
const { root } = config;
const autolinkingConfig = {};
for (const [depName, depData] of Object.entries(config.dependencies)) {
try {
stripRncoreAutolinkingAbsolutePaths(depData, root);
const filePath = (0, Path_1.toPosixPath)(depData.root);
debug(`Adding ${logTag} - ${chalk_1.default.dim(filePath)}`);
results.push({ type: 'dir', filePath, reasons });
autolinkingConfig[depName] = depData;
}
catch (e) {
debug(chalk_1.default.red(`Error adding ${logTag} - ${depName}.\n${e}`));
}
}
results.push({
type: 'contents',
id: contentsId,
contents: JSON.stringify(autolinkingConfig),
reasons,
});
return results;
}
function stripRncoreAutolinkingAbsolutePaths(dependency, root) {
(0, assert_1.default)(dependency.root);
const dependencyRoot = dependency.root;
const cmakeDepRoot = node_process_1.default.platform === 'win32' ? dependencyRoot.replace(/\\/g, '/') : dependencyRoot;
dependency.root = (0, Path_1.toPosixPath)(path_1.default.relative(root, dependencyRoot));
for (const platformData of Object.values(dependency.platforms)) {
for (const [key, value] of Object.entries(platformData ?? {})) {
let newValue;
if (node_process_1.default.platform === 'win32' &&
['cmakeListsPath', 'cxxModuleCMakeListsPath'].includes(key)) {
// CMake paths on Windows are serving in slashes,
// we have to check startsWith with the same slashes.
newValue = value?.startsWith?.(cmakeDepRoot)
? (0, Path_1.toPosixPath)(path_1.default.relative(root, value))
: value;
}
else {
newValue = value?.startsWith?.(dependencyRoot)
? (0, Path_1.toPosixPath)(path_1.default.relative(root, value))
: value;
}
platformData[key] = newValue;
}
}
}
function normalizePackageJsonScriptSources(scripts, options) {
if (options.sourceSkips & SourceSkips_1.SourceSkips.PackageJsonAndroidAndIosScriptsIfNotContainRun) {
// Replicate the behavior of `expo prebuild`
if (!scripts.android?.includes('run') || scripts.android === 'expo run:android') {
delete scripts.android;
}
if (!scripts.ios?.includes('run') || scripts.ios === 'expo run:ios') {
delete scripts.ios;
}
}
return JSON.stringify(scripts);
}
//# sourceMappingURL=Bare.js.map