1eeffdb10STomasz Sapetaimport chalk from 'chalk';
2eeffdb10STomasz Sapeta
3eeffdb10STomasz Sapetaimport { TransformPipeline } from '.';
4eeffdb10STomasz Sapeta
5eeffdb10STomasz Sapetaexport function postTransforms(versionName: string): TransformPipeline {
6eeffdb10STomasz Sapeta  return {
7eeffdb10STomasz Sapeta    logHeader(filePath: string) {
8eeffdb10STomasz Sapeta      console.log(`Post-transforming ${chalk.magenta(filePath)}:`);
9eeffdb10STomasz Sapeta    },
10eeffdb10STomasz Sapeta    transforms: [
11eeffdb10STomasz Sapeta      // react-native
12eeffdb10STomasz Sapeta      {
13eeffdb10STomasz Sapeta        paths: ['RCTRedBox.m', 'RCTLog.mm'],
14eeffdb10STomasz Sapeta        replace: /#if (ABI\d+_\d+_\d+)RCT_DEBUG/g,
15eeffdb10STomasz Sapeta        with: '#if $1RCT_DEV',
16eeffdb10STomasz Sapeta      },
17eeffdb10STomasz Sapeta      {
18eeffdb10STomasz Sapeta        paths: ['NSTextStorage+FontScaling.h', 'NSTextStorage+FontScaling.m'],
19eeffdb10STomasz Sapeta        replace: /NSTextStorage \(FontScaling\)/,
20eeffdb10STomasz Sapeta        with: `NSTextStorage (${versionName}FontScaling)`,
21eeffdb10STomasz Sapeta      },
22eeffdb10STomasz Sapeta      {
23eeffdb10STomasz Sapeta        paths: [
24eeffdb10STomasz Sapeta          'NSTextStorage+FontScaling.h',
25eeffdb10STomasz Sapeta          'NSTextStorage+FontScaling.m',
26eeffdb10STomasz Sapeta          'RCTTextShadowView.m',
27eeffdb10STomasz Sapeta        ],
28eeffdb10STomasz Sapeta        replace: /\b(scaleFontSizeToFitSize|scaleFontSizeWithRatio|compareToSize)\b/g,
29eeffdb10STomasz Sapeta        with: `${versionName.toLowerCase()}_rct_$1`,
30eeffdb10STomasz Sapeta      },
31eeffdb10STomasz Sapeta      {
32eeffdb10STomasz Sapeta        paths: 'RCTWebView.m',
33eeffdb10STomasz Sapeta        replace: /@"ABI\d+_\d+_\d+React-js-navigation"/,
34eeffdb10STomasz Sapeta        with: '@"react-js-navigation"',
35eeffdb10STomasz Sapeta      },
36eeffdb10STomasz Sapeta      {
37eeffdb10STomasz Sapeta        replace: new RegExp(`FB${versionName}ReactNativeSpec`, 'g'),
38eeffdb10STomasz Sapeta        with: 'FBReactNativeSpec',
39eeffdb10STomasz Sapeta      },
40eeffdb10STomasz Sapeta      {
41eeffdb10STomasz Sapeta        replace: new RegExp('\\b(Native\\w+Spec)\\b', 'g'),
42eeffdb10STomasz Sapeta        with: `${versionName}$1`,
43eeffdb10STomasz Sapeta      },
44eeffdb10STomasz Sapeta      {
45eeffdb10STomasz Sapeta        paths: 'RCTInspectorPackagerConnection.m',
46eeffdb10STomasz Sapeta        replace: /\b(RECONNECT_DELAY_MS)\b/g,
47eeffdb10STomasz Sapeta        with: `${versionName}$1`,
48eeffdb10STomasz Sapeta      },
49eeffdb10STomasz Sapeta      {
50eeffdb10STomasz Sapeta        paths: 'RCTView.m',
51eeffdb10STomasz Sapeta        replace: /\b(SwitchAccessibilityTrait)\b/g,
52eeffdb10STomasz Sapeta        with: `${versionName}$1`,
53eeffdb10STomasz Sapeta      },
54eeffdb10STomasz Sapeta      {
55eeffdb10STomasz Sapeta        paths: 'RCTSpringAnimation.m',
56eeffdb10STomasz Sapeta        replace: /\b(MAX_DELTA_TIME)\b/g,
57eeffdb10STomasz Sapeta        with: `${versionName}$1`,
58eeffdb10STomasz Sapeta      },
59eeffdb10STomasz Sapeta      {
60eeffdb10STomasz Sapeta        paths: 'ModuleRegistry.cpp',
61eeffdb10STomasz Sapeta        replace: /(std::string normalizeName\(std::string name\) \{)/,
62eeffdb10STomasz Sapeta        with: `$1\n  if (name.compare(0, ${versionName.length}, "${versionName}") == 0) {\n    name = name.substr(${versionName.length});\n  }\n`,
63eeffdb10STomasz Sapeta      },
64eeffdb10STomasz Sapeta      {
65eeffdb10STomasz Sapeta        paths: 'ModuleRegistry.cpp',
66eeffdb10STomasz Sapeta        replace: /(\(name\.compare\(\d+, \d+, ")([^"]+)(RCT"\))/,
67eeffdb10STomasz Sapeta        with: '$1$3',
68eeffdb10STomasz Sapeta      },
692239438eSTomasz Sapeta      {
702239438eSTomasz Sapeta        paths: ['RCTSRWebSocket.h', 'UIView+Private.h'],
712239438eSTomasz Sapeta        replace: /@interface (\w+) \((CertificateAdditions|Private)\)/g,
72a272999eSBartosz Kaszubowski        with: `@interface $1 (${versionName}$2)`,
732239438eSTomasz Sapeta      },
740e34784dSTomasz Sapeta      {
750e34784dSTomasz Sapeta        // Fix prefixing imports from React-bridging
760e34784dSTomasz Sapeta        paths: 'ReactCommon',
770e34784dSTomasz Sapeta        replace: new RegExp(`(React)\\/${versionName}(bridging)\\/`, 'g'),
780e34784dSTomasz Sapeta        with: `$1/$2/${versionName}`,
790e34784dSTomasz Sapeta      },
8006b29f12STomasz Sapeta      {
81*453643feSKudo Chien        // Files inside fabric directory used to have nested import paths and we transformed it wrong.
82*453643feSKudo Chien        // This rules are here to fix it.
83*453643feSKudo Chien        // e.g. `#include <react/debug/react_native_assert.h>`
84*453643feSKudo Chien        //   -> `#include <ABI49_0_0React/ABI49_0_0debug/ABI49_0_0React_native_assert.h>`
85*453643feSKudo Chien        //   -> `#include <ABI49_0_0React/debug/ABI49_0_0React_native_assert.h>`
86*453643feSKudo Chien        paths: ['ReactCommon/react/', 'React/'],
87*453643feSKudo Chien        replace: new RegExp(
88*453643feSKudo Chien          `(^(#include|#import) <${versionName}React)/${versionName}([^/\\n]+?)/(${versionName})?([^/\\n]+?\\.h>$)`,
89*453643feSKudo Chien          'gm'
90*453643feSKudo Chien        ),
91*453643feSKudo Chien        with: `$1/$3/${versionName}$5`,
92*453643feSKudo Chien      },
93*453643feSKudo Chien      {
94*453643feSKudo Chien        // Same as above but for difference nested level.
95*453643feSKudo Chien        paths: ['Libraries/AppDelegate/', 'ReactCommon/react/', 'React/'],
96*453643feSKudo Chien        replace: new RegExp(
97*453643feSKudo Chien          `(^(#include|#import) <${versionName}React)/${versionName}([^/\\n]+?)\\/([^/\\n]+?)\\/(${versionName})?([^/\\n]+?\\.h>$)`,
98*453643feSKudo Chien          'gm'
99*453643feSKudo Chien        ),
100*453643feSKudo Chien        with: `$1/$3/$4/${versionName}$6`,
101*453643feSKudo Chien      },
102*453643feSKudo Chien      {
10306b29f12STomasz Sapeta        // Codegen adds methods to `RCTCxxConvert` that start with `JS_`, which refer to `JS::`
10406b29f12STomasz Sapeta        // C++ namespace that we prefix, so these methods must be prefixed as well.
10506b29f12STomasz Sapeta        paths: ['FBReactNativeSpec.h', 'FBReactNativeSpec-generated.mm'],
10606b29f12STomasz Sapeta        replace: /(RCTManagedPointer \*\))(JS_)/g,
10706b29f12STomasz Sapeta        with: `$1${versionName}$2`,
10806b29f12STomasz Sapeta      },
109eeffdb10STomasz Sapeta
110eeffdb10STomasz Sapeta      // Universal modules
111eeffdb10STomasz Sapeta      {
112eeffdb10STomasz Sapeta        paths: `UniversalModules/${versionName}EXScoped`,
113eeffdb10STomasz Sapeta        replace: /(EXScopedABI\d+_\d+_\d+ReactNative)/g,
114eeffdb10STomasz Sapeta        with: 'EXScopedReactNative',
115eeffdb10STomasz Sapeta      },
116eeffdb10STomasz Sapeta      {
117eeffdb10STomasz Sapeta        paths: `${versionName}EXFileSystem`,
118eeffdb10STomasz Sapeta        replace: new RegExp(`NSData\\+${versionName}EXFileSystem\\.h`, 'g'),
119eeffdb10STomasz Sapeta        with: `${versionName}NSData+EXFileSystem.h`,
120eeffdb10STomasz Sapeta      },
121eeffdb10STomasz Sapeta      {
12250661f5cSWill Schurman        paths: [
12350661f5cSWill Schurman          `${versionName}EXNotifications`,
12450661f5cSWill Schurman          `${versionName}EXUpdates`,
1250dfbbd2aSWill Schurman          `${versionName}EXJSONUtils`,
12650661f5cSWill Schurman        ],
1274e322e7cSTomasz Sapeta        replace: new RegExp(
1280dfbbd2aSWill Schurman          `NSDictionary\\+${versionName}(EXNotificationsVerifyingClass|EXJSONUtils)\\.h`,
1294e322e7cSTomasz Sapeta          'g'
1304e322e7cSTomasz Sapeta        ),
1314e322e7cSTomasz Sapeta        with: `${versionName}NSDictionary+$1.h`,
132eeffdb10STomasz Sapeta      },
133941f41afSTomasz Sapeta      {
1340e34784dSTomasz Sapeta        paths: [
1350e34784dSTomasz Sapeta          `${versionName}EXNotifications`,
1360e34784dSTomasz Sapeta          `${versionName}EXAppState`,
1370e34784dSTomasz Sapeta          `${versionName}EXVersionManager`,
1380e34784dSTomasz Sapeta        ],
139941f41afSTomasz Sapeta        replace: new RegExp(`EXModuleRegistryHolder${versionName}React`, 'g'),
140941f41afSTomasz Sapeta        with: 'EXModuleRegistryHolderReact',
141941f41afSTomasz Sapeta      },
142941f41afSTomasz Sapeta      {
143941f41afSTomasz Sapeta        // Versioned ExpoKit has to use versioned modules provider
144941f41afSTomasz Sapeta        paths: 'EXVersionManager.mm',
145941f41afSTomasz Sapeta        replace: /@"(ExpoModulesProvider)"/,
146941f41afSTomasz Sapeta        with: `@"${versionName}$1"`,
147941f41afSTomasz Sapeta      },
1489eae8a6aSKudo Chien      {
1499eae8a6aSKudo Chien        paths: `${versionName}EXVersionManager.mm`,
1509eae8a6aSKudo Chien        replace: `#import <${versionName}Reacthermes/HermesExecutorFactory.h>`,
1519eae8a6aSKudo Chien        with: `#import <${versionName}reacthermes/${versionName}HermesExecutorFactory.h>`,
1529eae8a6aSKudo Chien      },
153eeffdb10STomasz Sapeta
154eeffdb10STomasz Sapeta      // react-native-maps
155eeffdb10STomasz Sapeta      {
156eeffdb10STomasz Sapeta        paths: 'AIRMapWMSTile',
157eeffdb10STomasz Sapeta        replace: /\b(TileOverlay)\b/g,
158eeffdb10STomasz Sapeta        with: `${versionName}$1`,
159eeffdb10STomasz Sapeta      },
160eeffdb10STomasz Sapeta      {
161eeffdb10STomasz Sapeta        paths: 'AIRGoogleMapWMSTile',
162eeffdb10STomasz Sapeta        replace: /\b(WMSTileOverlay)\b/g,
163eeffdb10STomasz Sapeta        with: `${versionName}$1`,
164eeffdb10STomasz Sapeta      },
165*453643feSKudo Chien      {
166*453643feSKudo Chien        paths: 'AIRGoogleMap',
167*453643feSKudo Chien        replace: new RegExp(`^#import "${versionName}(GMU.+?\\.h)"`, 'gm'),
168*453643feSKudo Chien        with: `#import <Google-Maps-iOS-Utils/$1>`,
169*453643feSKudo Chien      },
170eeffdb10STomasz Sapeta
171eeffdb10STomasz Sapeta      // react-native-webview
172eeffdb10STomasz Sapeta      {
1738523eba6SEric Samelson        paths: 'RNCWebView.m',
1748523eba6SEric Samelson        replace: new RegExp(`#import "objc/${versionName}runtime\\.h"`, ''),
1758523eba6SEric Samelson        with: '#import "objc/runtime.h"',
1768523eba6SEric Samelson      },
1778523eba6SEric Samelson      {
1788523eba6SEric Samelson        paths: 'RNCWebView.m',
1798523eba6SEric Samelson        replace: /\b(_SwizzleHelperWK)\b/g,
1808523eba6SEric Samelson        with: `${versionName}$1`,
1818523eba6SEric Samelson      },
1828523eba6SEric Samelson      {
1838523eba6SEric Samelson        // see issue: https://github.com/expo/expo/issues/4463
1848523eba6SEric Samelson        paths: 'RNCWebView.m',
1858523eba6SEric Samelson        replace: /MessageHandlerName = @"ABI\d+_\d+_\d+ReactNativeWebView";/,
1868523eba6SEric Samelson        with: `MessageHandlerName = @"ReactNativeWebView";`,
187eeffdb10STomasz Sapeta      },
188b5228228STomasz Sapeta      {
189b5228228STomasz Sapeta        paths: 'EXVersionManager.mm',
190b5228228STomasz Sapeta        replace: /\[(RNCWebView)/,
191b5228228STomasz Sapeta        with: `[${versionName}$1`,
192b5228228STomasz Sapeta      },
193eeffdb10STomasz Sapeta
194eeffdb10STomasz Sapeta      // react-native-reanimated
195eeffdb10STomasz Sapeta      {
196eeffdb10STomasz Sapeta        paths: 'EXVersionManager.mm',
197eeffdb10STomasz Sapeta        replace: /(_bridge_reanimated)/g,
198eeffdb10STomasz Sapeta        with: `${versionName}$1`,
199eeffdb10STomasz Sapeta      },
200eeffdb10STomasz Sapeta      {
201b5228228STomasz Sapeta        paths: 'EXVersionManager.mm',
202b5228228STomasz Sapeta        replace: /\b(REA)/g,
203b5228228STomasz Sapeta        with: `${versionName}$1`,
204b5228228STomasz Sapeta      },
205b5228228STomasz Sapeta      {
206eeffdb10STomasz Sapeta        paths: 'NativeProxy.mm',
207eeffdb10STomasz Sapeta        replace: /@"ABI\d+_\d+_\d+RCTView"/g,
208eeffdb10STomasz Sapeta        with: `@"RCTView"`,
209eeffdb10STomasz Sapeta      },
210eeffdb10STomasz Sapeta
211eeffdb10STomasz Sapeta      // react-native-shared-element
212eeffdb10STomasz Sapeta      {
213eeffdb10STomasz Sapeta        paths: 'RNSharedElementNode.m',
214eeffdb10STomasz Sapeta        replace: /\b(NSArray\s*\*\s*_imageResolvers)\b/,
215eeffdb10STomasz Sapeta        with: 'static $1',
216eeffdb10STomasz Sapeta      },
217eeffdb10STomasz Sapeta
218eeffdb10STomasz Sapeta      // react-native-safe-area-context
219eeffdb10STomasz Sapeta      {
220eeffdb10STomasz Sapeta        paths: [
2211967a7daSKudo Chien          'RNCSafeAreaUtils.h',
2221967a7daSKudo Chien          'RNCSafeAreaUtils.m',
223eeffdb10STomasz Sapeta          'RNCSafeAreaProvider.m',
224eeffdb10STomasz Sapeta          'RNCSafeAreaView.m',
225eeffdb10STomasz Sapeta        ],
226eeffdb10STomasz Sapeta        replace: /\b(UIEdgeInsetsEqualToEdgeInsetsWithThreshold)\b/g,
227eeffdb10STomasz Sapeta        with: `${versionName}$1`,
228eeffdb10STomasz Sapeta      },
229eeffdb10STomasz Sapeta    ],
230eeffdb10STomasz Sapeta  };
231eeffdb10STomasz Sapeta}
232