@kirz/react-native-toolkit
Version:
Toolkit to speed up React Native development
496 lines (479 loc) • 15.2 kB
JavaScript
const {
addLines,
updatePlist,
deleteLines,
setGradleMinSdkVersion,
} = require('./utils');
const placeholders = {
android: {
gradle: {
'buildscript/ext': 'buildscript/ext',
'buildscript/dependencies': 'buildscript/dependencies',
},
appGradle: {
applyPlugin: 'apply-plugin',
defaultConfig: 'defaultConfig',
},
res: {
strings: 'strings',
},
manifest: {
'meta-data': 'meta-data',
'uses-permission': 'uses-permission',
},
},
ios: {
info: {
BundleURLSchemes: 'BundleURLSchemes',
dict: 'dict',
},
appDelegate: {
import: 'import',
continueUserActivity: 'continueUserActivity',
didFinishLaunchingWithOptions: {
start: 'didFinishLaunchingWithOptions/start',
},
openURL: 'openURL',
},
},
};
module.exports = {
SentryPlugin: {
dependencies: ['@sentry/integrations', '@sentry/react-native'],
},
FirebasePlugin: {
dependencies: [
'@react-native-firebase/app',
'@react-native-firebase/analytics',
'@react-native-firebase/remote-config',
],
add(appName) {
// Android
addLines(
'android/build.gradle',
placeholders.android.gradle['buildscript/dependencies'],
' classpath("com.google.gms:google-services:4.3.14")',
);
addLines(
'android/app/build.gradle',
placeholders.android.appGradle.applyPlugin,
`apply plugin: 'com.google.gms.google-services'`,
);
// iOS
addLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.import,
`#import <Firebase.h>`,
);
addLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.didFinishLaunchingWithOptions.start,
` [FIRApp configure];`,
);
},
delete(appName) {
// Android
deleteLines(
'android/build.gradle',
placeholders.android.gradle['buildscript/dependencies'],
' classpath("com.google.gms:google-services:4.3.14")',
);
deleteLines(
'android/app/build.gradle',
placeholders.android.appGradle.applyPlugin,
`apply plugin: 'com.google.gms.google-services'`,
);
// iOS
deleteLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.import,
`#import <Firebase.h>`,
);
deleteLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.didFinishLaunchingWithOptions.start,
` [FIRApp configure];`,
);
},
env: [
{ name: 'FIREBASE_API_KEY' },
{ name: 'FIREBASE_GCM_SENDER_ID' },
{ name: 'FIREBASE_PROJECT_ID' },
{ name: 'FIREBASE_GOOGLE_APP_ID' },
],
},
FacebookPlugin: {
dependencies: ['react-native-fbsdk-next'],
add(appName) {
// Android
addLines(
'android/app/src/main/AndroidManifest.xml',
placeholders.android.manifest['meta-data'],
` <meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/FACEBOOK_APP_ID"/>\n <meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/FACEBOOK_CLIENT_TOKEN"/>`,
'xml',
);
// iOS
updatePlist(`ios/${appName}/Info.plist`, [
{
key: 'FacebookAppID',
value: '$(FACEBOOK_APP_ID)',
},
{
key: 'FacebookClientToken',
value: '$(FACEBOOK_CLIENT_TOKEN)',
},
{
key: 'FacebookDisplayName',
value: '$(APP_DISPLAY_NAME)',
},
{
key: 'url-scheme-add',
value: 'fb$(FACEBOOK_APP_ID)',
},
]);
addLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.import,
`#import <FBSDKCoreKit/FBSDKCoreKit-Swift.h>`,
);
addLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.didFinishLaunchingWithOptions.start,
` [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];\n [FBSDKApplicationDelegate.sharedInstance initializeSDK];`,
);
},
delete(appName) {
// Android
deleteLines(
'android/app/src/main/AndroidManifest.xml',
placeholders.android.manifest['meta-data'],
[
`<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/FACEBOOK_APP_ID"/>`,
`<meta-data android:name="com.facebook.sdk.ClientToken" android:value="@string/FACEBOOK_CLIENT_TOKEN"/>`,
],
'xml',
);
// iOS
updatePlist(`ios/${appName}/Info.plist`, [
{
key: 'FacebookAppID',
},
{
key: 'FacebookClientToken',
},
{
key: 'FacebookDisplayName',
},
{
key: 'url-scheme-delete',
value: 'fb$(FACEBOOK_APP_ID)',
},
]);
deleteLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.import,
`#import <FBSDKCoreKit/FBSDKCoreKit-Swift.h>`,
);
deleteLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.didFinishLaunchingWithOptions.start,
[
`[[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];`,
`[FBSDKApplicationDelegate.sharedInstance initializeSDK];`,
],
);
},
env: [{ name: 'FACEBOOK_APP_ID' }, { name: 'FACEBOOK_CLIENT_TOKEN' }],
},
AppsFlyerPlugin: {
dependencies: ['react-native-appsflyer'],
add(appName) {
// Android
// iOS
addLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.import,
`#import <RNAppsFlyer.h>`,
);
addLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.continueUserActivity,
` [[AppsFlyerAttribution shared] continueUserActivity:userActivity restorationHandler:restorationHandler];`,
);
},
delete(appName) {
// Android
// iOS
deleteLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.import,
`#import <RNAppsFlyer.h>`,
);
deleteLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.continueUserActivity,
[
`[[AppsFlyerAttribution shared] continueUserActivity:userActivity restorationHandler:restorationHandler];`,
],
);
},
},
NetworkPlugin: {
dependencies: [],
},
RevenueCatPlugin: {
dependencies: ['react-native-purchases'],
add(appName) {
// Android
addLines(
'android/app/src/main/AndroidManifest.xml',
placeholders.android.manifest['uses-permission'],
' <uses-permission android:name="com.android.vending.BILLING" />',
'xml',
);
// iOS
// In-App Purchase capability enabled in a @kirz/react-native-template by default
},
delete(appName) {
// Android
deleteLines(
'android/app/src/main/AndroidManifest.xml',
placeholders.android.manifest['uses-permission'],
' <uses-permission android:name="com.android.vending.BILLING" />',
'xml',
);
},
},
InAppPurchasePlugin: {
dependencies: ['react-native-iap'],
add(appName) {
// Android
setGradleMinSdkVersion(24);
addLines(
'android/build.gradle',
placeholders.android.gradle['buildscript/ext'],
' androidXAnnotation = "1.1.0"\n androidXBrowser = "1.0.0"\n kotlinVersion = "1.7.0"',
);
addLines(
'android/build.gradle',
placeholders.android.gradle['buildscript/dependencies'],
' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"',
);
addLines(
'android/app/build.gradle',
placeholders.android.appGradle.defaultConfig,
` missingDimensionStrategy ('store', 'play')`,
);
},
delete(appName) {
// Android
deleteLines(
'android/build.gradle',
placeholders.android.gradle['buildscript/ext'],
[
'androidXAnnotation = "1.1.0"',
'androidXBrowser = "1.0.0"',
'kotlinVersion = "1.7.0"',
],
);
deleteLines(
'android/build.gradle',
placeholders.android.gradle['buildscript/dependencies'],
'classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion"',
);
deleteLines(
'android/app/build.gradle',
placeholders.android.appGradle.defaultConfig,
`missingDimensionStrategy ('store', 'play')`,
);
},
},
ApphudPlugin: {
dependencies: ['@kirz/react-native-apphud'],
},
AdaptyPlugin: {
dependencies: ['react-native-adapty'],
},
IdfaPlugin: {
dependencies: ['@sparkfabrik/react-native-idfa-aaid'],
add(appName) {
// iOS
updatePlist(`ios/${appName}/Info.plist`, [
{
key: 'NSUserTrackingUsageDescription',
value:
'This identifier will be used to deliver personalized ads to you.',
},
]);
},
delete(appName) {
// iOS
updatePlist(`ios/${appName}/Info.plist`, [
{
key: 'NSUserTrackingUsageDescription',
},
]);
},
},
AppMetricaPlugin: {
dependencies: ['@kirz/react-native-appmetrica'],
add(appName) {},
delete(appName) {},
},
AmplitudePlugin: {
dependencies: ['@amplitude/analytics-react-native'],
add(appName) {},
delete(appName) {},
},
BranchPlugin: {
dependencies: ['react-native-branch'],
add(appName) {
const links = [
`$(BRANCH_SUBDOMAIN).app.link`,
`$(BRANCH_SUBDOMAIN)-alternate.app.link`,
`$(BRANCH_SUBDOMAIN).test-app.link`,
`$(BRANCH_SUBDOMAIN)-alternate.test-app.link`,
];
// iOS
addLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.import,
`#import <RNBranch/RNBranch.h>`,
);
addLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.didFinishLaunchingWithOptions.start,
`#ifdef DEBUG // BranchPlugin\n [RNBranch useTestInstance];\n#endif // BranchPlugin\n if (@available(iOS 16.0, *)) { } else if (@available(iOS 15.0, *)) { [[Branch getInstance] checkPasteboardOnInstall]; }\n [RNBranch initSessionWithLaunchOptions:launchOptions isReferrable:YES];`,
);
addLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.continueUserActivity,
` [RNBranch continueUserActivity:userActivity];`,
);
addLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.openURL,
` [RNBranch application:app openURL:url options:options];`,
);
updatePlist(`ios/${appName}/Info.plist`, [
{
key: 'branch_universal_link_domains',
value: links,
},
{
key: 'branch_key',
value: {
test: `$(BRANCH_TEST_KEY)`,
live: `$(BRANCH_LIVE_KEY)`,
},
},
]);
updatePlist(`ios/${appName}/${appName}.entitlements`, (plist) => {
plist['com.apple.developer.associated-domains'] =
plist['com.apple.developer.associated-domains'] || [];
links.forEach((link) => {
if (
!plist['com.apple.developer.associated-domains'].includes(
`applinks:${link}`,
)
) {
plist['com.apple.developer.associated-domains'].push(
`applinks:${link}`,
);
}
});
});
},
delete(appName) {
const links = [
`$(BRANCH_SUBDOMAIN).app.link`,
`$(BRANCH_SUBDOMAIN)-alternate.app.link`,
`$(BRANCH_SUBDOMAIN).test-app.link`,
`$(BRANCH_SUBDOMAIN)-alternate.test-app.link`,
];
// iOS
deleteLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.import,
`#import <RNBranch/RNBranch.h>`,
);
deleteLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.didFinishLaunchingWithOptions.start,
[
`#ifdef DEBUG // BranchPlugin`,
`[RNBranch useTestInstance];`,
`#endif // BranchPlugin`,
'if (@available(iOS 16.0, *)) { } else if (@available(iOS 15.0, *)) { [[Branch getInstance] checkPasteboardOnInstall]; }',
'[RNBranch initSessionWithLaunchOptions:launchOptions isReferrable:YES];',
],
);
deleteLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.continueUserActivity,
[`[RNBranch continueUserActivity:userActivity];`],
);
deleteLines(
`ios/${appName}/AppDelegate.mm`,
placeholders.ios.appDelegate.openURL,
[`[RNBranch application:app openURL:url options:options];`],
);
updatePlist(`ios/${appName}/Info.plist`, [
{
key: 'branch_universal_link_domains',
},
{
key: 'branch_key',
},
]);
updatePlist(`ios/${appName}/${appName}.entitlements`, (plist) => {
plist['com.apple.developer.associated-domains'] =
plist['com.apple.developer.associated-domains'] || [];
links.forEach((link) => {
plist['com.apple.developer.associated-domains'] = plist[
'com.apple.developer.associated-domains'
].filter((link) => !links.includes(link.replace('applinks:', '')));
});
if (!plist['com.apple.developer.associated-domains'].length) {
delete plist['com.apple.developer.associated-domains'];
}
});
},
env: [
{ name: 'BRANCH_TEST_KEY' },
{ name: 'BRANCH_LIVE_KEY' },
{ name: 'BRANCH_SUBDOMAIN' },
],
},
OneSignalPlugin: {
dependencies: ['react-native-onesignal'],
add(appName) {
// iOS
updatePlist(`ios/${appName}/${appName}.entitlements`, (plist) => {
plist['aps-environment'] = 'development';
});
updatePlist(`ios/${appName}/Info.plist`, (plist) => {
plist['UIBackgroundModes'] = plist['UIBackgroundModes'] || [];
if (!plist['UIBackgroundModes'].includes('remote-notification')) {
plist['UIBackgroundModes'].push('remote-notification');
}
});
},
delete(appName) {
// iOS
updatePlist(`ios/${appName}/${appName}.entitlements`, (plist) => {
delete plist['aps-environment'];
});
updatePlist(`ios/${appName}/Info.plist`, (plist) => {
plist['UIBackgroundModes'] = plist['UIBackgroundModes'] || [];
plist['UIBackgroundModes'] = plist['UIBackgroundModes'].filter(
(x) => x !== 'remote-notification',
);
if (!plist['UIBackgroundModes'].length) {
delete plist['UIBackgroundModes'];
}
});
},
env: [{ name: 'ONESIGNAL_APP_ID' }],
},
};