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