first commit

This commit is contained in:
2026-03-10 16:18:05 +00:00
commit 11f9c069b5
31635 changed files with 3187747 additions and 0 deletions

View File

@@ -0,0 +1,19 @@
import { Transform, type TransformCallback } from 'stream';
import type { FileHookTransformSource, FileHookTransformFunction } from '../Fingerprint.types';
/**
* A transform stream that allows to hook into file contents and transform them.
*/
export declare class FileHookTransform extends Transform {
private readonly source;
private readonly transformFn;
private readonly debug;
private _isTransformed;
constructor(source: FileHookTransformSource, transformFn: FileHookTransformFunction, debug: boolean | undefined);
/**
* Indicates whether the file content has been transformed.
* @returns boolean value if `debug` is true, otherwise the value would be undefined.
*/
get isTransformed(): boolean | undefined;
_transform(chunk: any, encoding: BufferEncoding, callback: TransformCallback): void;
_flush(callback: TransformCallback): void;
}

View File

@@ -0,0 +1,46 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FileHookTransform = void 0;
const stream_1 = require("stream");
/**
* A transform stream that allows to hook into file contents and transform them.
*/
class FileHookTransform extends stream_1.Transform {
source;
transformFn;
debug;
_isTransformed = undefined;
constructor(source, transformFn, debug) {
super();
this.source = source;
this.transformFn = transformFn;
this.debug = debug;
}
/**
* Indicates whether the file content has been transformed.
* @returns boolean value if `debug` is true, otherwise the value would be undefined.
*/
get isTransformed() {
return this._isTransformed;
}
//#region - Transform implementations
_transform(chunk, encoding, callback) {
const result = this.transformFn(this.source, chunk, false /* isEndOfFile */, encoding);
if (this.debug) {
this._isTransformed ||= chunk !== result;
}
if (result) {
this.push(result);
}
callback();
}
_flush(callback) {
const result = this.transformFn(this.source, null, true /* isEndOfFile */, 'utf8');
if (result) {
this.push(result);
}
callback();
}
}
exports.FileHookTransform = FileHookTransform;
//# sourceMappingURL=FileHookTransform.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"FileHookTransform.js","sourceRoot":"","sources":["../../src/hash/FileHookTransform.ts"],"names":[],"mappings":";;;AAAA,mCAA2D;AAI3D;;GAEG;AACH,MAAa,iBAAkB,SAAQ,kBAAS;IAI3B;IACA;IACA;IALX,cAAc,GAAwB,SAAS,CAAC;IAExD,YACmB,MAA+B,EAC/B,WAAsC,EACtC,KAA0B;QAE3C,KAAK,EAAE,CAAC;QAJS,WAAM,GAAN,MAAM,CAAyB;QAC/B,gBAAW,GAAX,WAAW,CAA2B;QACtC,UAAK,GAAL,KAAK,CAAqB;IAG7C,CAAC;IAED;;;OAGG;IACH,IAAI,aAAa;QACf,OAAO,IAAI,CAAC,cAAc,CAAC;IAC7B,CAAC;IAED,qCAAqC;IAErC,UAAU,CAAC,KAAU,EAAE,QAAwB,EAAE,QAA2B;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,iBAAiB,EAAE,QAAQ,CAAC,CAAC;QACvF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,cAAc,KAAK,KAAK,KAAK,MAAM,CAAC;QAC3C,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;QACD,QAAQ,EAAE,CAAC;IACb,CAAC;IAED,MAAM,CAAC,QAA2B;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;QACnF,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACpB,CAAC;QACD,QAAQ,EAAE,CAAC;IACb,CAAC;CAGF;AAzCD,8CAyCC"}

28
node_modules/@expo/fingerprint/build/hash/Hash.d.ts generated vendored Normal file
View File

@@ -0,0 +1,28 @@
import type { Fingerprint, FingerprintSource, HashResultContents, HashResultDir, HashResultFile, HashSource, HashSourceContents, NormalizedOptions } from '../Fingerprint.types';
import { type Limiter } from '../utils/Concurrency';
/**
* Create a `Fingerprint` from `HashSources` array
*/
export declare function createFingerprintFromSourcesAsync(sources: HashSource[], projectRoot: string, options: NormalizedOptions): Promise<Fingerprint>;
/**
* Create a `FingerprintSource` from a `HashSource`
* This function will get a hash value and merge back to original source
*/
export declare function createFingerprintSourceAsync(source: HashSource, limiter: Limiter, projectRoot: string, options: NormalizedOptions): Promise<FingerprintSource>;
/**
* Create a `HashResult` from a file
*/
export declare function createFileHashResultsAsync(filePath: string, limiter: Limiter, projectRoot: string, options: NormalizedOptions): Promise<HashResultFile | null>;
/**
* Create `HashResult` for a dir.
* If the dir is excluded, returns null rather than a HashResult
*/
export declare function createDirHashResultsAsync(dirPath: string, limiter: Limiter, projectRoot: string, options: NormalizedOptions, depth?: number): Promise<HashResultDir | null>;
/**
* Create `HashResult` for a `HashSourceContents`
*/
export declare function createContentsHashResultsAsync(source: HashSourceContents, options: NormalizedOptions): Promise<HashResultContents>;
/**
* Create id from given source
*/
export declare function createSourceId(source: HashSource): string;

233
node_modules/@expo/fingerprint/build/hash/Hash.js generated vendored Normal file
View File

@@ -0,0 +1,233 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createFingerprintFromSourcesAsync = createFingerprintFromSourcesAsync;
exports.createFingerprintSourceAsync = createFingerprintSourceAsync;
exports.createFileHashResultsAsync = createFileHashResultsAsync;
exports.createDirHashResultsAsync = createDirHashResultsAsync;
exports.createContentsHashResultsAsync = createContentsHashResultsAsync;
exports.createSourceId = createSourceId;
const crypto_1 = require("crypto");
const fs_1 = require("fs");
const promises_1 = __importDefault(require("fs/promises"));
const path_1 = __importDefault(require("path"));
const stream_1 = require("stream");
const FileHookTransform_1 = require("./FileHookTransform");
const ReactImportsPatcher_1 = require("./ReactImportsPatcher");
const Concurrency_1 = require("../utils/Concurrency");
const Path_1 = require("../utils/Path");
const Predicates_1 = require("../utils/Predicates");
const Profile_1 = require("../utils/Profile");
/**
* Create a `Fingerprint` from `HashSources` array
*/
async function createFingerprintFromSourcesAsync(sources, projectRoot, options) {
const limiter = (0, Concurrency_1.createLimiter)(options.concurrentIoLimit);
const fingerprintSources = await Promise.all(sources.map((source) => createFingerprintSourceAsync(source, limiter, projectRoot, options)));
const hasher = (0, crypto_1.createHash)(options.hashAlgorithm);
for (const source of fingerprintSources) {
if (source.hash != null) {
hasher.update(createSourceId(source));
hasher.update(source.hash);
}
}
const hash = hasher.digest('hex');
return {
sources: fingerprintSources,
hash,
};
}
/**
* Create a `FingerprintSource` from a `HashSource`
* This function will get a hash value and merge back to original source
*/
async function createFingerprintSourceAsync(source, limiter, projectRoot, options) {
let result = null;
switch (source.type) {
case 'contents':
result = await createContentsHashResultsAsync(source, options);
break;
case 'file':
result = await createFileHashResultsAsync(source.filePath, limiter, projectRoot, options);
break;
case 'dir':
result = await (0, Profile_1.profile)(options, createDirHashResultsAsync, `createDirHashResultsAsync(${source.filePath})`)(source.filePath, limiter, projectRoot, options);
break;
default:
throw new Error('Unsupported source type');
}
return {
...source,
hash: result?.hex ?? null,
...(options.debug ? { debugInfo: result?.debugInfo } : undefined),
};
}
/**
* Create a `HashResult` from a file
*/
async function createFileHashResultsAsync(filePath, limiter, projectRoot, options) {
// Backup code for faster hashing
/*
return limiter(async () => {
if (isIgnoredPathWithMatchObjects(filePath, options.ignorePathMatchObjects)) {
return null;
}
const hasher = createHash(options.hashAlgorithm);
const stat = await fs.stat(filePath);
hasher.update(`${stat.size}`);
const buffer = Buffer.alloc(4096);
const fd = await fs.open(filePath, 'r');
await fd.read(buffer, 0, buffer.length, 0);
await fd.close();
hasher.update(buffer);
console.log('stat', filePath, stat.size);
return { id: path.relative(projectRoot, filePath), hex: hasher.digest('hex') };
});
*/
return limiter(() => {
return new Promise((resolve, reject) => {
if ((0, Path_1.isIgnoredPathWithMatchObjects)(filePath, options.ignorePathMatchObjects)) {
return resolve(null);
}
let resolved = false;
const hasher = (0, crypto_1.createHash)(options.hashAlgorithm);
const fileHookTransform = options.fileHookTransform
? new FileHookTransform_1.FileHookTransform({ type: 'file', filePath }, options.fileHookTransform, options.debug)
: null;
let stream = (0, fs_1.createReadStream)(path_1.default.join(projectRoot, filePath), {
highWaterMark: 1024,
});
if (options.enableReactImportsPatcher &&
(filePath.endsWith('.h') || filePath.endsWith('.m') || filePath.endsWith('.mm'))) {
const transform = new ReactImportsPatcher_1.ReactImportsPatchTransform();
stream = (0, stream_1.pipeline)(stream, transform, (err) => {
if (err) {
reject(err);
}
});
}
if (fileHookTransform) {
stream = (0, stream_1.pipeline)(stream, fileHookTransform, (err) => {
if (err) {
reject(err);
}
});
}
stream.on('close', () => {
if (!resolved) {
const hex = hasher.digest('hex');
const isTransformed = fileHookTransform?.isTransformed;
const debugInfo = options.debug
? {
path: filePath,
hash: hex,
...(isTransformed ? { isTransformed } : undefined),
}
: undefined;
resolve({
type: 'file',
id: filePath,
hex,
...(debugInfo ? { debugInfo } : undefined),
});
resolved = true;
}
});
stream.on('error', (e) => {
reject(e);
});
stream.on('data', (chunk) => {
hasher.update(chunk);
});
});
});
}
/**
* Create `HashResult` for a dir.
* If the dir is excluded, returns null rather than a HashResult
*/
async function createDirHashResultsAsync(dirPath, limiter, projectRoot, options, depth = 0) {
// Using `ignoreDirMatchObjects` as an optimization to skip the whole directory
if ((0, Path_1.isIgnoredPathWithMatchObjects)(dirPath, options.ignoreDirMatchObjects)) {
return null;
}
const dirents = (await promises_1.default.readdir(path_1.default.join(projectRoot, dirPath), { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name));
const results = (await Promise.all(dirents.map(async (dirent) => {
if (dirent.isDirectory()) {
const filePath = (0, Path_1.toPosixPath)(path_1.default.join(dirPath, dirent.name));
return await createDirHashResultsAsync(filePath, limiter, projectRoot, options, depth + 1);
}
else if (dirent.isFile()) {
const filePath = (0, Path_1.toPosixPath)(path_1.default.join(dirPath, dirent.name));
return await createFileHashResultsAsync(filePath, limiter, projectRoot, options);
}
return null;
}))).filter(Predicates_1.nonNullish);
if (results.length === 0) {
return null;
}
const hasher = (0, crypto_1.createHash)(options.hashAlgorithm);
const children = [];
for (const result of results) {
hasher.update(result.id);
hasher.update(result.hex);
children.push(result.debugInfo);
}
const hex = hasher.digest('hex');
return {
type: 'dir',
id: dirPath,
hex,
...(options.debug ? { debugInfo: { path: dirPath, children, hash: hex } } : undefined),
};
}
/**
* Create `HashResult` for a `HashSourceContents`
*/
async function createContentsHashResultsAsync(source, options) {
let isTransformed = undefined;
if (options.fileHookTransform) {
const transformedContents = options.fileHookTransform({
type: 'contents',
id: source.id,
}, source.contents, true /* isEndOfFile */, 'utf8') ?? '';
if (options.debug) {
isTransformed = transformedContents !== source.contents;
}
source.contents = transformedContents;
}
const hex = (0, crypto_1.createHash)(options.hashAlgorithm).update(source.contents).digest('hex');
const debugInfo = options.debug
? {
hash: hex,
...(isTransformed ? { isTransformed } : undefined),
}
: undefined;
return {
type: 'contents',
id: source.id,
hex,
...(debugInfo ? { debugInfo } : undefined),
};
}
/**
* Create id from given source
*/
function createSourceId(source) {
switch (source.type) {
case 'contents':
return source.id;
case 'file':
return source.overrideHashKey ?? source.filePath;
case 'dir':
return source.overrideHashKey ?? source.filePath;
default:
throw new Error('Unsupported source type');
}
}
//# sourceMappingURL=Hash.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,31 @@
import { Transform, type TransformCallback } from 'stream';
interface Options {
/**
* Length of the file portion containing headers to transform.
* @default ReactImportsPatchTransform.DEFAULT_LENGTH_OF_FILE_PORTION_CONTAINING_HEADERS_TO_TRANSFORM
*/
lengthOfFilePortionContainingHeadersToTransform?: number;
/**
* A function that transforms a chunk of data. Exposing this for testing purposes.
* @default `patchChunk`
*/
transformFn?: (chunk: string) => string;
}
/**
* A transform stream that patches React import statements in Objective-C files.
*/
export declare class ReactImportsPatchTransform extends Transform {
private readLength;
private readonly lengthOfFilePortionContainingHeadersToTransform;
private readonly transformFn;
private static DEFAULT_LENGTH_OF_FILE_PORTION_CONTAINING_HEADERS_TO_TRANSFORM;
constructor(options?: Options);
_transform(chunk: any, _encoding: BufferEncoding, callback: TransformCallback): void;
}
/**
* Patch imports from a data chunk
* @param headerSet prebuilt React-Core header set
* @param chunk target chunk data
*/
export declare function patchChunk(chunk: string, headerSet?: Set<string>): string;
export {};

View File

@@ -0,0 +1,347 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ReactImportsPatchTransform = void 0;
exports.patchChunk = patchChunk;
const stream_1 = require("stream");
/**
* A transform stream that patches React import statements in Objective-C files.
*/
class ReactImportsPatchTransform extends stream_1.Transform {
readLength = 0;
lengthOfFilePortionContainingHeadersToTransform;
transformFn;
static DEFAULT_LENGTH_OF_FILE_PORTION_CONTAINING_HEADERS_TO_TRANSFORM = 16 * 1024; // 16KB
constructor(options) {
super();
this.lengthOfFilePortionContainingHeadersToTransform =
options?.lengthOfFilePortionContainingHeadersToTransform ??
ReactImportsPatchTransform.DEFAULT_LENGTH_OF_FILE_PORTION_CONTAINING_HEADERS_TO_TRANSFORM;
this.transformFn = options?.transformFn ?? patchChunk;
}
_transform(chunk, _encoding, callback) {
const remainingLength = this.lengthOfFilePortionContainingHeadersToTransform - this.readLength;
let result;
if (remainingLength <= 0) {
result = chunk.toString();
}
else if (remainingLength >= chunk.length) {
result = this.transformFn(chunk.toString());
}
else {
const portionToTransform = chunk.slice(0, remainingLength).toString();
const portionToLeave = chunk.slice(remainingLength).toString();
result = this.transformFn(portionToTransform) + portionToLeave;
}
this.push(result);
this.readLength += chunk.length;
callback();
}
}
exports.ReactImportsPatchTransform = ReactImportsPatchTransform;
/**
* Patch imports from a data chunk
* @param headerSet prebuilt React-Core header set
* @param chunk target chunk data
*/
function patchChunk(chunk, headerSet = HEADER_SET) {
let transformContent = chunk.replace(/(?<=^\s*)#import\s+"(.+)"(?=\s*$)/gm, (match, headerName) => {
// `#import "RCTBridge.h"` -> `#import <React/RCTBridge.h>`
if (headerSet.has(headerName)) {
return `#import <React/${headerName}>`;
}
// `#import "React/RCTBridge.h"` -> `#import <React/RCTBridge.h>`
if (headerName.startsWith('React/')) {
const name = headerName.substring(6);
if (headerSet.has(name)) {
return `#import <React/${name}>`;
}
}
// Otherwise, return original import
return match;
});
transformContent = transformContent.replace(/(?<=^\s*)#(if|elif)\s+__has_include\("(.+)"\)(?=\s*$)/gm, (match, ifPrefix, headerName) => {
// `#if __has_include("RCTBridge.h")` -> `#if __has_include(<React/RCTBridge.h>)`
if (headerSet.has(headerName)) {
return `#${ifPrefix} __has_include(<React/${headerName}>)`;
}
// `#if __has_include("React/RCTBridge.h")` -> `#if __has_include(<React/RCTBridge.h>)`
if (headerName.startsWith('React/')) {
const name = headerName.substring(6);
if (headerSet.has(name)) {
return `#${ifPrefix} __has_include(<React/${name}>)`;
}
}
// Otherwise, return original import
return match;
});
return transformContent;
}
// Fingerprint doesn't run `pod install` so we have a snapshot of the headers in the React-Core module from react-native 0.74.
const HEADER_SET = new Set([
'CoreModulesPlugins.h',
'FBXXHashUtils.h',
'NSTextStorage+FontScaling.h',
'RCTAccessibilityManager+Internal.h',
'RCTAccessibilityManager.h',
'RCTActionSheetManager.h',
'RCTActivityIndicatorView.h',
'RCTActivityIndicatorViewManager.h',
'RCTAdditionAnimatedNode.h',
'RCTAlertController.h',
'RCTAlertManager.h',
'RCTAnimatedImage.h',
'RCTAnimatedNode.h',
'RCTAnimationDriver.h',
'RCTAnimationPlugins.h',
'RCTAnimationType.h',
'RCTAnimationUtils.h',
'RCTAppState.h',
'RCTAppearance.h',
'RCTAssert.h',
'RCTAutoInsetsProtocol.h',
'RCTBackedTextInputDelegate.h',
'RCTBackedTextInputDelegateAdapter.h',
'RCTBackedTextInputViewProtocol.h',
'RCTBaseTextInputShadowView.h',
'RCTBaseTextInputView.h',
'RCTBaseTextInputViewManager.h',
'RCTBaseTextShadowView.h',
'RCTBaseTextViewManager.h',
'RCTBlobManager.h',
'RCTBorderCurve.h',
'RCTBorderDrawing.h',
'RCTBorderStyle.h',
'RCTBridge+Inspector.h',
'RCTBridge+Private.h',
'RCTBridge.h',
'RCTBridgeConstants.h',
'RCTBridgeDelegate.h',
'RCTBridgeMethod.h',
'RCTBridgeModule.h',
'RCTBridgeModuleDecorator.h',
'RCTBridgeProxy+Cxx.h',
'RCTBridgeProxy.h',
'RCTBundleAssetImageLoader.h',
'RCTBundleManager.h',
'RCTBundleURLProvider.h',
'RCTClipboard.h',
'RCTColorAnimatedNode.h',
'RCTComponent.h',
'RCTComponentData.h',
'RCTComponentEvent.h',
'RCTConstants.h',
'RCTConvert+CoreLocation.h',
'RCTConvert+Text.h',
'RCTConvert+Transform.h',
'RCTConvert.h',
'RCTCursor.h',
'RCTCxxConvert.h',
'RCTDataRequestHandler.h',
'RCTDebuggingOverlay.h',
'RCTDebuggingOverlayManager.h',
'RCTDecayAnimation.h',
'RCTDefines.h',
'RCTDevLoadingView.h',
'RCTDevLoadingViewProtocol.h',
'RCTDevLoadingViewSetEnabled.h',
'RCTDevMenu.h',
'RCTDevSettings.h',
'RCTDeviceInfo.h',
'RCTDiffClampAnimatedNode.h',
'RCTDisplayLink.h',
'RCTDisplayWeakRefreshable.h',
'RCTDivisionAnimatedNode.h',
'RCTDynamicTypeRamp.h',
'RCTErrorCustomizer.h',
'RCTErrorInfo.h',
'RCTEventAnimation.h',
'RCTEventDispatcher.h',
'RCTEventDispatcherProtocol.h',
'RCTEventEmitter.h',
'RCTExceptionsManager.h',
'RCTFPSGraph.h',
'RCTFileReaderModule.h',
'RCTFileRequestHandler.h',
'RCTFont.h',
'RCTFrameAnimation.h',
'RCTFrameUpdate.h',
'RCTGIFImageDecoder.h',
'RCTHTTPRequestHandler.h',
'RCTI18nManager.h',
'RCTI18nUtil.h',
'RCTImageBlurUtils.h',
'RCTImageCache.h',
'RCTImageDataDecoder.h',
'RCTImageEditingManager.h',
'RCTImageLoader.h',
'RCTImageLoaderLoggable.h',
'RCTImageLoaderProtocol.h',
'RCTImageLoaderWithAttributionProtocol.h',
'RCTImagePlugins.h',
'RCTImageShadowView.h',
'RCTImageSource.h',
'RCTImageStoreManager.h',
'RCTImageURLLoader.h',
'RCTImageURLLoaderWithAttribution.h',
'RCTImageUtils.h',
'RCTImageView.h',
'RCTImageViewManager.h',
'RCTInitializing.h',
'RCTInputAccessoryShadowView.h',
'RCTInputAccessoryView.h',
'RCTInputAccessoryViewContent.h',
'RCTInputAccessoryViewManager.h',
'RCTInspector.h',
'RCTInspectorDevServerHelper.h',
'RCTInspectorPackagerConnection.h',
'RCTInterpolationAnimatedNode.h',
'RCTInvalidating.h',
'RCTJSStackFrame.h',
'RCTJSThread.h',
'RCTJavaScriptExecutor.h',
'RCTJavaScriptLoader.h',
'RCTKeyCommands.h',
'RCTKeyboardObserver.h',
'RCTLayout.h',
'RCTLayoutAnimation.h',
'RCTLayoutAnimationGroup.h',
'RCTLinkingManager.h',
'RCTLinkingPlugins.h',
'RCTLocalAssetImageLoader.h',
'RCTLocalizedString.h',
'RCTLog.h',
'RCTLogBox.h',
'RCTLogBoxView.h',
'RCTMacros.h',
'RCTManagedPointer.h',
'RCTMockDef.h',
'RCTModalHostView.h',
'RCTModalHostViewController.h',
'RCTModalHostViewManager.h',
'RCTModalManager.h',
'RCTModuleData.h',
'RCTModuleMethod.h',
'RCTModuloAnimatedNode.h',
'RCTMultilineTextInputView.h',
'RCTMultilineTextInputViewManager.h',
'RCTMultipartDataTask.h',
'RCTMultipartStreamReader.h',
'RCTMultiplicationAnimatedNode.h',
'RCTNativeAnimatedModule.h',
'RCTNativeAnimatedNodesManager.h',
'RCTNativeAnimatedTurboModule.h',
'RCTNetworkPlugins.h',
'RCTNetworkTask.h',
'RCTNetworking.h',
'RCTNullability.h',
'RCTObjectAnimatedNode.h',
'RCTPLTag.h',
'RCTPackagerClient.h',
'RCTPackagerConnection.h',
'RCTParserUtils.h',
'RCTPerformanceLogger.h',
'RCTPerformanceLoggerLabels.h',
'RCTPlatform.h',
'RCTPointerEvents.h',
'RCTProfile.h',
'RCTPropsAnimatedNode.h',
'RCTRawTextShadowView.h',
'RCTRawTextViewManager.h',
'RCTReconnectingWebSocket.h',
'RCTRedBox.h',
'RCTRedBoxExtraDataViewController.h',
'RCTRedBoxSetEnabled.h',
'RCTRefreshControl.h',
'RCTRefreshControlManager.h',
'RCTRefreshableProtocol.h',
'RCTReloadCommand.h',
'RCTResizeMode.h',
'RCTRootContentView.h',
'RCTRootShadowView.h',
'RCTRootView.h',
'RCTRootViewDelegate.h',
'RCTRootViewInternal.h',
'RCTRuntimeExecutorModule.h',
'RCTSafeAreaShadowView.h',
'RCTSafeAreaView.h',
'RCTSafeAreaViewLocalData.h',
'RCTSafeAreaViewManager.h',
'RCTScrollContentShadowView.h',
'RCTScrollContentView.h',
'RCTScrollContentViewManager.h',
'RCTScrollEvent.h',
'RCTScrollView.h',
'RCTScrollViewManager.h',
'RCTScrollableProtocol.h',
'RCTSegmentedControl.h',
'RCTSegmentedControlManager.h',
'RCTSettingsManager.h',
'RCTSettingsPlugins.h',
'RCTShadowView+Internal.h',
'RCTShadowView+Layout.h',
'RCTShadowView.h',
'RCTSinglelineTextInputView.h',
'RCTSinglelineTextInputViewManager.h',
'RCTSourceCode.h',
'RCTSpringAnimation.h',
'RCTStatusBarManager.h',
'RCTStyleAnimatedNode.h',
'RCTSubtractionAnimatedNode.h',
'RCTSurface.h',
'RCTSurfaceDelegate.h',
'RCTSurfaceHostingProxyRootView.h',
'RCTSurfaceHostingView.h',
'RCTSurfacePresenterStub.h',
'RCTSurfaceProtocol.h',
'RCTSurfaceRootShadowView.h',
'RCTSurfaceRootShadowViewDelegate.h',
'RCTSurfaceRootView.h',
'RCTSurfaceSizeMeasureMode.h',
'RCTSurfaceStage.h',
'RCTSurfaceView+Internal.h',
'RCTSurfaceView.h',
'RCTSwitch.h',
'RCTSwitchManager.h',
'RCTTextAttributes.h',
'RCTTextDecorationLineType.h',
'RCTTextSelection.h',
'RCTTextShadowView.h',
'RCTTextTransform.h',
'RCTTextView.h',
'RCTTextViewManager.h',
'RCTTiming.h',
'RCTTouchEvent.h',
'RCTTouchHandler.h',
'RCTTrackingAnimatedNode.h',
'RCTTransformAnimatedNode.h',
'RCTTurboModuleRegistry.h',
'RCTUIImageViewAnimated.h',
'RCTUIManager.h',
'RCTUIManagerObserverCoordinator.h',
'RCTUIManagerUtils.h',
'RCTUITextField.h',
'RCTUITextView.h',
'RCTUIUtils.h',
'RCTURLRequestDelegate.h',
'RCTURLRequestHandler.h',
'RCTUtils.h',
'RCTUtilsUIOverride.h',
'RCTValueAnimatedNode.h',
'RCTVersion.h',
'RCTVibration.h',
'RCTVibrationPlugins.h',
'RCTView.h',
'RCTViewManager.h',
'RCTViewUtils.h',
'RCTVirtualTextShadowView.h',
'RCTVirtualTextView.h',
'RCTVirtualTextViewManager.h',
'RCTWebSocketExecutor.h',
'RCTWebSocketModule.h',
'RCTWrapperViewController.h',
'React-Core-umbrella.h',
'React-Core.modulemap',
'UIView+Private.h',
'UIView+React.h',
]);
//# sourceMappingURL=ReactImportsPatcher.js.map

File diff suppressed because one or more lines are too long