1*eeffdb10STomasz Sapetaimport { TransformPipeline } from '.'; 2*eeffdb10STomasz Sapeta 3*eeffdb10STomasz Sapeta/** 4*eeffdb10STomasz Sapeta * These modification will be run against `ios/Exponent/kernel` directory. 5*eeffdb10STomasz Sapeta * If you need to modify other files from the `ios` directory then find 6*eeffdb10STomasz Sapeta * a better place for it or refactor the function that depends on this list. 7*eeffdb10STomasz Sapeta * The nature of these changes is that they're not permanent and at one point 8*eeffdb10STomasz Sapeta * of time (SDK drop) these should be rollbacked. 9*eeffdb10STomasz Sapeta * @param versionName e.g. 21.0.0, 37.0.0, etc. 10*eeffdb10STomasz Sapeta * @param rollback This flag indicates whether the change should be rollbacked. 11*eeffdb10STomasz Sapeta */ 12*eeffdb10STomasz Sapetaexport function kernelFilesTransforms( 13*eeffdb10STomasz Sapeta versionName: string, 14*eeffdb10STomasz Sapeta rollback: boolean = false 15*eeffdb10STomasz Sapeta): TransformPipeline { 16*eeffdb10STomasz Sapeta return { 17*eeffdb10STomasz Sapeta transforms: [ 18*eeffdb10STomasz Sapeta { 19*eeffdb10STomasz Sapeta paths: ['EXAppViewController.m'], 20*eeffdb10STomasz Sapeta ...withRollback(rollback, { 21*eeffdb10STomasz Sapeta replace: /(?<=#import <React\/RCTAppearance\.h>)/, 22*eeffdb10STomasz Sapeta with: `\n#if __has_include(<${versionName}React/${versionName}RCTAppearance.h>)\n#import <${versionName}React/${versionName}RCTAppearance.h>\n#endif`, 23*eeffdb10STomasz Sapeta }), 24*eeffdb10STomasz Sapeta }, 25*eeffdb10STomasz Sapeta { 26*eeffdb10STomasz Sapeta paths: ['EXAppViewController.m'], 27*eeffdb10STomasz Sapeta ...withRollback(rollback, { 28*eeffdb10STomasz Sapeta replace: /(?<=\sRCTOverrideAppearancePreference\(appearancePreference\);)/, 29*eeffdb10STomasz Sapeta with: `\n#if __has_include(<${versionName}React/${versionName}RCTAppearance.h>)\n ${versionName}RCTOverrideAppearancePreference(appearancePreference);\n#endif`, 30*eeffdb10STomasz Sapeta }), 31*eeffdb10STomasz Sapeta }, 32*eeffdb10STomasz Sapeta ], 33*eeffdb10STomasz Sapeta }; 34*eeffdb10STomasz Sapeta} 35*eeffdb10STomasz Sapeta 36*eeffdb10STomasz Sapetatype Replacement = { 37*eeffdb10STomasz Sapeta replace: RegExp | string; 38*eeffdb10STomasz Sapeta with: string; 39*eeffdb10STomasz Sapeta}; 40*eeffdb10STomasz Sapeta 41*eeffdb10STomasz Sapeta/** 42*eeffdb10STomasz Sapeta * If `rollback = true` then this function either return `rollbackReplacement` 43*eeffdb10STomasz Sapeta * or if it's not provided it used `replace` from `replacement` argument. 44*eeffdb10STomasz Sapeta * For the latter case, ensure you're not constructing `replacement.with` field with 45*eeffdb10STomasz Sapeta * any capture group from `replacement.replace` part, because it will be inlined directly 46*eeffdb10STomasz Sapeta * and additionally ensure if you don't want to escape some characters . 47*eeffdb10STomasz Sapeta */ 48*eeffdb10STomasz Sapetafunction withRollback( 49*eeffdb10STomasz Sapeta rollback: boolean, 50*eeffdb10STomasz Sapeta replacement: Replacement, 51*eeffdb10STomasz Sapeta rollbackReplacement?: Replacement 52*eeffdb10STomasz Sapeta): Replacement { 53*eeffdb10STomasz Sapeta return rollback ? rollbackReplacement ?? { replace: replacement.with, with: '' } : replacement; 54*eeffdb10STomasz Sapeta} 55