├── index.js ├── src └── index.js ├── .npmignore ├── example ├── .gitignore ├── babel.config.js ├── ios │ ├── Example │ │ ├── Images.xcassets │ │ │ ├── Contents.json │ │ │ └── AppIcon.appiconset │ │ │ │ └── Contents.json │ │ ├── AppDelegate.h │ │ ├── main.m │ │ ├── Info.plist │ │ ├── AppDelegate.m │ │ └── LaunchScreen.storyboard │ ├── Example.xcworkspace │ │ ├── xcshareddata │ │ │ └── IDEWorkspaceChecks.plist │ │ └── contents.xcworkspacedata │ ├── Example.xcodeproj │ │ ├── xcshareddata │ │ │ ├── xcbaselines │ │ │ │ └── B16B925726F4E11A00CD1A96.xcbaseline │ │ │ │ │ ├── 9BCBA4BC-D176-45CD-B1F2-AE00DA95C470.plist │ │ │ │ │ └── Info.plist │ │ │ └── xcschemes │ │ │ │ ├── Smoketests.xcscheme │ │ │ │ ├── Smoketests-Hermes.xcscheme │ │ │ │ ├── Example.xcscheme │ │ │ │ └── Example-Hermes.xcscheme │ │ └── project.pbxproj │ ├── Podfile │ ├── Smoketests │ │ ├── Smoketests.m │ │ └── Info.plist │ ├── Smoketests-Hermes-Info.plist │ ├── Example-Hermes-Info.plist │ └── Podfile.lock ├── app.json ├── android │ ├── app │ │ ├── debug.keystore │ │ ├── src │ │ │ ├── main │ │ │ │ ├── res │ │ │ │ │ ├── values │ │ │ │ │ │ ├── strings.xml │ │ │ │ │ │ └── styles.xml │ │ │ │ │ ├── mipmap-hdpi │ │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ ├── mipmap-mdpi │ │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ ├── mipmap-xhdpi │ │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ ├── mipmap-xxhdpi │ │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ │ └── mipmap-xxxhdpi │ │ │ │ │ │ ├── ic_launcher.png │ │ │ │ │ │ └── ic_launcher_round.png │ │ │ │ ├── java │ │ │ │ │ └── com │ │ │ │ │ │ └── example │ │ │ │ │ │ └── ivanmoskalevreactnativecompressedjsbundle │ │ │ │ │ │ ├── MainActivity.java │ │ │ │ │ │ └── MainApplication.java │ │ │ │ └── AndroidManifest.xml │ │ │ └── debug │ │ │ │ ├── AndroidManifest.xml │ │ │ │ └── java │ │ │ │ └── com │ │ │ │ └── example │ │ │ │ └── ivanmoskalevreactnativecompressedjsbundle │ │ │ │ └── ReactNativeFlipper.java │ │ ├── proguard-rules.pro │ │ └── build.gradle │ ├── gradle │ │ └── wrapper │ │ │ ├── gradle-wrapper.jar │ │ │ └── gradle-wrapper.properties │ ├── settings.gradle │ ├── gradle.properties │ ├── build.gradle │ ├── gradlew.bat │ └── gradlew ├── index.js ├── metro.config.js ├── src │ └── App.tsx └── package.json ├── .gitattributes ├── .gitmodules ├── babel.config.js ├── tool ├── compress-xcode.sh └── compress.js ├── .yarnrc ├── ios ├── IMOReactSource.h ├── IMOCompressedBundleLoader.h ├── IMOReactSource.m ├── TraceUtil.h ├── IMOCompressedBundleLoader.mm ├── BrotliUtil.h └── ReactNativeCompressedJsbundle.xcodeproj │ └── project.pbxproj ├── .editorconfig ├── scripts └── bootstrap.js ├── .gitignore ├── react-native-compressed-jsbundle.podspec ├── .github └── workflows │ ├── tests.yml │ └── npm-publish.yml ├── LICENSE ├── package.json └── README.md /index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | example/ 2 | -------------------------------------------------------------------------------- /example/.gitignore: -------------------------------------------------------------------------------- 1 | ios/Pods 2 | node_modules 3 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | *.pbxproj -text 2 | # specific for windows script files 3 | *.bat text eol=crlf -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "brotli"] 2 | path = brotli 3 | url = https://github.com/google/brotli.git 4 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['module:metro-react-native-babel-preset'], 3 | }; 4 | -------------------------------------------------------------------------------- /example/babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['module:metro-react-native-babel-preset'] 3 | }; 4 | -------------------------------------------------------------------------------- /tool/compress-xcode.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | BASEDIR=$(dirname "$0") 4 | $NODE_BINARY $BASEDIR/compress.js 5 | -------------------------------------------------------------------------------- /.yarnrc: -------------------------------------------------------------------------------- 1 | # Override Yarn command so we can automatically setup the repo on running `yarn` 2 | 3 | yarn-path "scripts/bootstrap.js" 4 | -------------------------------------------------------------------------------- /example/ios/Example/Images.xcassets/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "info" : { 3 | "version" : 1, 4 | "author" : "xcode" 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /example/app.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ReactNativeCompressedJsbundleExample", 3 | "displayName": "ReactNativeCompressedJsbundle Example" 4 | } 5 | -------------------------------------------------------------------------------- /example/android/app/debug.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivanmoskalev/react-native-compressed-jsbundle/HEAD/example/android/app/debug.keystore -------------------------------------------------------------------------------- /example/android/app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | ReactNativeCompressedJsbundle Example 3 | 4 | -------------------------------------------------------------------------------- /example/index.js: -------------------------------------------------------------------------------- 1 | import { AppRegistry } from 'react-native'; 2 | import App from './src/App'; 3 | 4 | AppRegistry.registerComponent('Example', () => App); 5 | -------------------------------------------------------------------------------- /example/android/gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivanmoskalev/react-native-compressed-jsbundle/HEAD/example/android/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivanmoskalev/react-native-compressed-jsbundle/HEAD/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivanmoskalev/react-native-compressed-jsbundle/HEAD/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivanmoskalev/react-native-compressed-jsbundle/HEAD/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivanmoskalev/react-native-compressed-jsbundle/HEAD/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivanmoskalev/react-native-compressed-jsbundle/HEAD/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivanmoskalev/react-native-compressed-jsbundle/HEAD/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivanmoskalev/react-native-compressed-jsbundle/HEAD/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivanmoskalev/react-native-compressed-jsbundle/HEAD/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivanmoskalev/react-native-compressed-jsbundle/HEAD/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ivanmoskalev/react-native-compressed-jsbundle/HEAD/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /ios/IMOReactSource.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface IMOReactSource : RCTSource 5 | 6 | + (instancetype)sourceWithUrl:(NSURL *)url data:(NSData *)data; 7 | 8 | @end 9 | -------------------------------------------------------------------------------- /example/metro.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | transformer: { 3 | getTransformOptions: async () => ({ 4 | transform: { 5 | experimentalImportSupport: false, 6 | inlineRequires: true, 7 | }, 8 | }), 9 | }, 10 | }; 11 | -------------------------------------------------------------------------------- /example/android/gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionBase=GRADLE_USER_HOME 2 | distributionPath=wrapper/dists 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-6.2-all.zip 4 | zipStoreBase=GRADLE_USER_HOME 5 | zipStorePath=wrapper/dists 6 | -------------------------------------------------------------------------------- /example/android/app/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 9 | 10 | -------------------------------------------------------------------------------- /example/ios/Example.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | # EditorConfig helps developers define and maintain consistent 2 | # coding styles between different editors and IDEs 3 | # editorconfig.org 4 | 5 | root = true 6 | 7 | [*] 8 | 9 | indent_style = space 10 | indent_size = 2 11 | 12 | end_of_line = lf 13 | charset = utf-8 14 | trim_trailing_whitespace = true 15 | insert_final_newline = true 16 | -------------------------------------------------------------------------------- /ios/IMOCompressedBundleLoader.h: -------------------------------------------------------------------------------- 1 | #import 2 | #import 3 | 4 | @interface IMOCompressedBundleLoader : NSObject 5 | 6 | + (void)loadSourceForBridge:(RCTBridge *)bridge 7 | bridgeDelegate:(id)delegate 8 | onProgress:(RCTSourceLoadProgressBlock)onProgress 9 | onComplete:(RCTSourceLoadBlock)loadCallback; 10 | 11 | @end 12 | -------------------------------------------------------------------------------- /example/android/settings.gradle: -------------------------------------------------------------------------------- 1 | rootProject.name = 'ReactNativeCompressedJsbundleExample' 2 | apply from: file("../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesSettingsGradle(settings) 3 | include ':app' 4 | 5 | include ':ivanmoskalevreactnativecompressedjsbundle' 6 | project(':ivanmoskalevreactnativecompressedjsbundle').projectDir = new File(rootProject.projectDir, '../../android') 7 | -------------------------------------------------------------------------------- /example/android/app/src/debug/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /example/ios/Example/AppDelegate.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Ivan Moskalev 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | #import 9 | #import 10 | 11 | @interface AppDelegate : UIResponder 12 | 13 | @property (nonatomic, strong) UIWindow *window; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /example/ios/Example/main.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Ivan Moskalev 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | #import 9 | 10 | #import "AppDelegate.h" 11 | 12 | int main(int argc, char * argv[]) { 13 | @autoreleasepool { 14 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /example/ios/Example.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /example/android/app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /usr/local/Cellar/android-sdk/24.3.3/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | -------------------------------------------------------------------------------- /example/android/app/src/main/java/com/example/ivanmoskalevreactnativecompressedjsbundle/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.example.ivanmoskalevreactnativecompressedjsbundle; 2 | 3 | import com.facebook.react.ReactActivity; 4 | 5 | public class MainActivity extends ReactActivity { 6 | 7 | /** 8 | * Returns the name of the main component registered from JavaScript. This is used to schedule 9 | * rendering of the component. 10 | */ 11 | @Override 12 | protected String getMainComponentName() { 13 | return "ReactNativeCompressedJsbundleExample"; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /example/src/App.tsx: -------------------------------------------------------------------------------- 1 | import * as React from 'react' 2 | import {StyleSheet, Text, View} from 'react-native' 3 | import data from './largefile.json' 4 | 5 | export default function App() { 6 | return ( 7 | 8 | Hello from @ivanmoskalev/react-native-compressed-bundle! 9 | Json object contains {data.length} elements. 10 | 11 | ) 12 | } 13 | 14 | const styles = StyleSheet.create({ 15 | container: { 16 | flex: 1, 17 | justifyContent: 'center', 18 | padding: 16, 19 | }, 20 | text: { 21 | textAlign: 'center' 22 | } 23 | }) 24 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-compressed-jsbundle-example", 3 | "description": "Example app for react-native-compressed-jsbundle", 4 | "version": "0.0.1", 5 | "private": true, 6 | "scripts": { 7 | "android": "react-native run-android", 8 | "ios": "react-native run-ios", 9 | "start": "react-native start" 10 | }, 11 | "dependencies": { 12 | "react": "17.0.1", 13 | "react-native": "0.64.2", 14 | "react-native-compressed-jsbundle": "link:../" 15 | }, 16 | "devDependencies": { 17 | "@babel/core": "^7.12.10", 18 | "@babel/runtime": "^7.12.5", 19 | "metro-react-native-babel-preset": "^0.64.0" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /tool/compress.js: -------------------------------------------------------------------------------- 1 | const brotli = require('brotli'); 2 | const fs = require('fs'); 3 | const path = require('path'); 4 | 5 | try { 6 | const jsBundlePath = path.join(process.env.CONFIGURATION_BUILD_DIR, process.env.UNLOCALIZED_RESOURCES_FOLDER_PATH, 'main.jsbundle'); 7 | const jsBundleContent = fs.readFileSync(jsBundlePath); 8 | console.log('[react-native-compressed-jsbundle] Compressing .jsbundle at', jsBundlePath); 9 | fs.writeFileSync(jsBundlePath, brotli.compress(jsBundleContent)); 10 | console.log('[react-native-compressed-jsbundle] Wrote compressed bundle to', jsBundlePath); 11 | } catch (error) { 12 | console.log('[react-native-compressed-jsbundle] Failed to compress jsbundle!', error); 13 | } 14 | -------------------------------------------------------------------------------- /example/ios/Example.xcodeproj/xcshareddata/xcbaselines/B16B925726F4E11A00CD1A96.xcbaseline/9BCBA4BC-D176-45CD-B1F2-AE00DA95C470.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | classNames 6 | 7 | Smoketests 8 | 9 | testLaunchPerformance 10 | 11 | com.apple.dt.XCTMetric_ApplicationLaunch-AppLaunch.duration 12 | 13 | baselineAverage 14 | 1.5698 15 | baselineIntegrationDisplayName 16 | Local Baseline 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /example/ios/Podfile: -------------------------------------------------------------------------------- 1 | require_relative '../node_modules/react-native/scripts/react_native_pods' 2 | require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' 3 | 4 | platform :ios, '11.0' 5 | 6 | target 'Example' do 7 | config = use_native_modules! 8 | use_react_native!(:path => config["reactNativePath"], :hermes_enabled => false) 9 | end 10 | 11 | target 'Example-Hermes' do 12 | config = use_native_modules! 13 | use_react_native!(:path => config["reactNativePath"], :hermes_enabled => true) 14 | end 15 | 16 | post_install do |installer| 17 | installer.pods_project.targets.each do |target| 18 | target.build_configurations.each do |config| 19 | config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '11.0' 20 | end 21 | end 22 | end 23 | -------------------------------------------------------------------------------- /scripts/bootstrap.js: -------------------------------------------------------------------------------- 1 | const path = require('path'); 2 | const child_process = require('child_process'); 3 | 4 | const root = path.resolve(__dirname, '..'); 5 | const args = process.argv.slice(2); 6 | const options = { 7 | cwd: process.cwd(), 8 | env: process.env, 9 | stdio: 'inherit', 10 | encoding: 'utf-8', 11 | }; 12 | 13 | let result; 14 | 15 | if (process.cwd() !== root || args.length) { 16 | // We're not in the root of the project, or additional arguments were passed 17 | // In this case, forward the command to `yarn` 18 | result = child_process.spawnSync('yarn', args, options); 19 | } else { 20 | // If `yarn` is run without arguments, perform bootstrap 21 | result = child_process.spawnSync('yarn', ['bootstrap'], options); 22 | } 23 | 24 | process.exitCode = result.status; 25 | -------------------------------------------------------------------------------- /example/ios/Smoketests/Smoketests.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Ivan Moskalev 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | #import 9 | 10 | @interface Smoketests : XCTestCase 11 | 12 | @end 13 | 14 | @implementation Smoketests 15 | 16 | - (void)setUp { 17 | self.continueAfterFailure = NO; 18 | } 19 | 20 | - (void)tearDown { 21 | } 22 | 23 | - (void)testExampleAppLaunchesAndJsBundleIsValid { 24 | // UI tests must launch the application that they test. 25 | XCUIApplication *app = [[XCUIApplication alloc] init]; 26 | [app launch]; 27 | XCTAssertNotNil(app.staticTexts[@"Hello from @ivanmoskalev/react-native-compressed-bundle! Json object contains 10000 elements."]); 28 | } 29 | 30 | @end 31 | -------------------------------------------------------------------------------- /example/ios/Smoketests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /example/ios/Smoketests-Hermes-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | $(DEVELOPMENT_LANGUAGE) 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE) 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleVersion 20 | 1 21 | 22 | 23 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # OSX 2 | # 3 | .DS_Store 4 | 5 | # XDE 6 | .expo/ 7 | 8 | # VSCode 9 | .vscode/ 10 | jsconfig.json 11 | 12 | # Xcode 13 | # 14 | build/ 15 | *.pbxuser 16 | !default.pbxuser 17 | *.mode1v3 18 | !default.mode1v3 19 | *.mode2v3 20 | !default.mode2v3 21 | *.perspectivev3 22 | !default.perspectivev3 23 | xcuserdata 24 | *.xccheckout 25 | *.moved-aside 26 | DerivedData 27 | *.hmap 28 | *.ipa 29 | *.xcuserstate 30 | project.xcworkspace 31 | 32 | # Android/IJ 33 | # 34 | .idea 35 | .gradle 36 | local.properties 37 | android.iml 38 | 39 | # Cocoapods 40 | # 41 | example/ios/Pods 42 | 43 | # node.js 44 | # 45 | node_modules/ 46 | npm-debug.log 47 | yarn-debug.log 48 | yarn-error.log 49 | 50 | # BUCK 51 | buck-out/ 52 | \.buckd/ 53 | android/app/libs 54 | android/keystores/debug.keystore 55 | 56 | # Expo 57 | .expo/* 58 | 59 | # generated by bob 60 | lib/ 61 | -------------------------------------------------------------------------------- /ios/IMOReactSource.m: -------------------------------------------------------------------------------- 1 | #import "IMOReactSource.h" 2 | 3 | @interface IMOReactSource () { 4 | NSURL *_url; 5 | NSData *_data; 6 | NSUInteger _length; 7 | NSInteger _filesChangedCount; 8 | } 9 | 10 | @end 11 | 12 | @implementation IMOReactSource 13 | 14 | - (NSURL *)url { 15 | return _url; 16 | } 17 | 18 | - (NSData *)data { 19 | return _data; 20 | } 21 | 22 | - (NSUInteger)length { 23 | return _length; 24 | } 25 | 26 | - (NSInteger)filesChangedCount { 27 | return _filesChangedCount; 28 | } 29 | 30 | + (instancetype)sourceWithUrl:(NSURL *)url data:(NSData *)data { 31 | IMOReactSource *source = [IMOReactSource new]; 32 | source->_url = url; 33 | source->_data = data; 34 | source->_length = data.length; 35 | source->_filesChangedCount = RCTSourceFilesChangedCountNotBuiltByBundler; 36 | return source; 37 | } 38 | 39 | @end 40 | -------------------------------------------------------------------------------- /react-native-compressed-jsbundle.podspec: -------------------------------------------------------------------------------- 1 | require "json" 2 | 3 | package = JSON.parse(File.read(File.join(__dir__, "package.json"))) 4 | 5 | Pod::Spec.new do |s| 6 | s.name = "react-native-compressed-jsbundle" 7 | s.version = package["version"] 8 | s.summary = package["description"] 9 | s.homepage = package["homepage"] 10 | s.license = package["license"] 11 | s.authors = package["author"] 12 | 13 | s.platforms = { :ios => "10.0" } 14 | s.source = { :git => "https://github.com/ivanmoskalev/react-native-compressed-jsbundle.git", :tag => "#{s.version}" } 15 | 16 | s.source_files = "ios/**/*.{h,m,mm}", "brotli/c/common/*.{c,h}", "brotli/c/dec/*.{c,h}", "brotli/c/include/**/*.{h}" 17 | 18 | s.pod_target_xcconfig = { 19 | 'HEADER_SEARCH_PATHS' => '$(PODS_TARGET_SRCROOT)/brotli/c/include' 20 | } 21 | 22 | s.dependency "React-Core" 23 | end 24 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: Tests 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | branches: [ master ] 8 | 9 | jobs: 10 | tests-ios: 11 | name: Build and Test on iOS 12 | runs-on: macos-latest 13 | strategy: 14 | matrix: 15 | target: ['Example', 'Example-Hermes'] 16 | 17 | steps: 18 | - name: Checkout 19 | uses: actions/checkout@v2 20 | with: 21 | submodules: 'recursive' 22 | 23 | - name: Build 24 | env: 25 | TEST_SCHEME: ${{ matrix.target }} 26 | TEST_PLATFORM: ${{ 'iOS Simulator' }} 27 | run: | 28 | set -eo pipefail 29 | yarn bootstrap 30 | TEST_DEVICE=`xcrun xctrace list devices 2>&1 | grep -oE 'iPhone.*?[^\(]+' | head -1 | awk '{$1=$1;print}'` 31 | cd example/ios && xcodebuild test -scheme "$TEST_SCHEME" -destination "platform=$TEST_PLATFORM,name=$TEST_DEVICE" -workspace Example.xcworkspace 32 | -------------------------------------------------------------------------------- /example/android/gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true 19 | 20 | android.useAndroidX=true 21 | android.enableJetifier=true 22 | FLIPPER_VERSION=0.54.0 23 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Ivan Moskalev 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /example/ios/Example/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "scale" : "2x", 6 | "size" : "20x20" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "scale" : "3x", 11 | "size" : "20x20" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "scale" : "2x", 16 | "size" : "29x29" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "scale" : "3x", 21 | "size" : "29x29" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "scale" : "2x", 26 | "size" : "40x40" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "scale" : "3x", 31 | "size" : "40x40" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "scale" : "2x", 36 | "size" : "60x60" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "scale" : "3x", 41 | "size" : "60x60" 42 | }, 43 | { 44 | "idiom" : "ios-marketing", 45 | "scale" : "1x", 46 | "size" : "1024x1024" 47 | } 48 | ], 49 | "info" : { 50 | "author" : "xcode", 51 | "version" : 1 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /example/android/build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | 3 | buildscript { 4 | ext { 5 | buildToolsVersion = "29.0.2" 6 | minSdkVersion = 16 7 | compileSdkVersion = 29 8 | targetSdkVersion = 29 9 | } 10 | repositories { 11 | google() 12 | jcenter() 13 | } 14 | dependencies { 15 | classpath("com.android.tools.build:gradle:3.5.3") 16 | 17 | // NOTE: Do not place your application dependencies here; they belong 18 | // in the individual module build.gradle files 19 | } 20 | } 21 | 22 | allprojects { 23 | repositories { 24 | mavenLocal() 25 | maven { 26 | // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm 27 | url("$rootDir/../node_modules/react-native/android") 28 | } 29 | maven { 30 | // Android JSC is installed from npm 31 | url("$rootDir/../node_modules/jsc-android/dist") 32 | } 33 | 34 | google() 35 | jcenter() 36 | maven { url 'https://www.jitpack.io' } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /.github/workflows/npm-publish.yml: -------------------------------------------------------------------------------- 1 | # This workflow will run tests using node and then publish a package to GitHub Packages when a release is created 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages 3 | 4 | name: Node.js Package 5 | 6 | on: 7 | release: 8 | types: [created] 9 | 10 | jobs: 11 | publish-npm: 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v2 15 | - uses: actions/setup-node@v2 16 | with: 17 | node-version: 14 18 | registry-url: https://registry.npmjs.org/ 19 | - run: npm ci 20 | - run: npm publish 21 | env: 22 | NODE_AUTH_TOKEN: ${{secrets.npm_token}} 23 | 24 | publish-gpr: 25 | runs-on: ubuntu-latest 26 | permissions: 27 | contents: read 28 | packages: write 29 | steps: 30 | - uses: actions/checkout@v2 31 | - uses: actions/setup-node@v2 32 | with: 33 | node-version: 14 34 | registry-url: https://npm.pkg.github.com/ 35 | - run: npm ci 36 | - run: npm publish 37 | env: 38 | NODE_AUTH_TOKEN: ${{secrets.GITHUB_TOKEN}} 39 | -------------------------------------------------------------------------------- /example/android/app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 13 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /example/ios/Example.xcodeproj/xcshareddata/xcbaselines/B16B925726F4E11A00CD1A96.xcbaseline/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | runDestinationsByUUID 6 | 7 | 9BCBA4BC-D176-45CD-B1F2-AE00DA95C470 8 | 9 | localComputer 10 | 11 | busSpeedInMHz 12 | 400 13 | cpuCount 14 | 1 15 | cpuKind 16 | 6-Core Intel Core i7 17 | cpuSpeedInMHz 18 | 3200 19 | logicalCPUCoresPerPackage 20 | 12 21 | modelCode 22 | Macmini8,1 23 | physicalCPUCoresPerPackage 24 | 6 25 | platformIdentifier 26 | com.apple.platform.macosx 27 | 28 | targetArchitecture 29 | x86_64 30 | targetDevice 31 | 32 | modelCode 33 | iPhone13,2 34 | platformIdentifier 35 | com.apple.platform.iphonesimulator 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /ios/TraceUtil.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Ivan Moskalev 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | #ifndef TraceHelper_h 9 | #define TraceHelper_h 10 | 11 | #import 12 | 13 | #ifdef TARGET_OS_IPHONE 14 | #import 15 | #endif 16 | 17 | static inline BOOL IMOIsReleaseBuild() { 18 | #ifdef DEBUG 19 | return NO; 20 | #else 21 | return YES; 22 | #endif 23 | } 24 | 25 | static inline NSString* IMODeviceInfoString() { 26 | #ifdef TARGET_OS_IPHONE 27 | UIDevice *device = UIDevice.currentDevice; 28 | return [NSString stringWithFormat:@"Device OS: %@ %@\nDevice model: %@", device.systemName, device.systemVersion, device.model]; 29 | #elif TARGET_OS_SIMULATOR 30 | return @"Device OS: iOS Simulator"; 31 | #else 32 | return @"Device OS: macOS"; 33 | #endif 34 | } 35 | 36 | static inline void IMOTraceDecompressionPerformance(CFTimeInterval startTime, NSUInteger compressedSize, NSUInteger originalSize) { 37 | CFTimeInterval endTime = CACurrentMediaTime(); 38 | NSLog( 39 | @"[react-native-compressed-jsbundle] Decompression time overhead: %g s\nOriginal size: %g KB\nCompressed size: %g KB\nBackend: brotli\nIs release build: %d\n%@", 40 | endTime - startTime, 41 | (double)originalSize / 1024, 42 | (double)compressedSize/ 1024, 43 | IMOIsReleaseBuild(), 44 | IMODeviceInfoString() 45 | ); 46 | } 47 | 48 | #endif /* TraceHelper_h */ 49 | -------------------------------------------------------------------------------- /ios/IMOCompressedBundleLoader.mm: -------------------------------------------------------------------------------- 1 | #import "IMOCompressedBundleLoader.h" 2 | #import "BrotliUtil.h" 3 | #import "TraceUtil.h" 4 | #import "IMOReactSource.h" 5 | 6 | #define FALLBACK_TO_DEFAULT_LOADER() \ 7 | [RCTJavaScriptLoader loadBundleAtURL:sourceUrl \ 8 | onProgress:onProgress \ 9 | onComplete:loadCallback]; 10 | 11 | @implementation IMOCompressedBundleLoader 12 | 13 | + (void)loadSourceForBridge:(RCTBridge *)bridge 14 | bridgeDelegate:(id)delegate 15 | onProgress:(RCTSourceLoadProgressBlock)onProgress 16 | onComplete:(RCTSourceLoadBlock)loadCallback 17 | { 18 | NSURL *sourceUrl = [delegate sourceURLForBridge:bridge]; 19 | 20 | if (!sourceUrl.isFileURL) { 21 | FALLBACK_TO_DEFAULT_LOADER(); 22 | return; 23 | } 24 | 25 | CFTimeInterval startTime = CACurrentMediaTime(); 26 | 27 | NSData *compressedData = [[NSData alloc] initWithContentsOfURL:sourceUrl options:NSDataReadingMappedIfSafe error:nil]; 28 | 29 | if (!compressedData) { 30 | FALLBACK_TO_DEFAULT_LOADER(); 31 | return; 32 | } 33 | 34 | NSData *decompressedData = IMOTryDecompressingBrotli(compressedData); 35 | 36 | if (!decompressedData) { 37 | FALLBACK_TO_DEFAULT_LOADER(); 38 | return; 39 | } 40 | 41 | IMOTraceDecompressionPerformance(startTime, compressedData.length, decompressedData.length); 42 | 43 | RCTSource *source = [IMOReactSource sourceWithUrl:sourceUrl data:decompressedData]; 44 | loadCallback(nil, source); 45 | } 46 | @end 47 | -------------------------------------------------------------------------------- /example/ios/Example/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ReactNativeCompressedJsbundle Example 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSRequiresIPhoneOS 26 | 27 | NSAppTransportSecurity 28 | 29 | NSAllowsArbitraryLoads 30 | 31 | NSExceptionDomains 32 | 33 | localhost 34 | 35 | NSExceptionAllowsInsecureHTTPLoads 36 | 37 | 38 | 39 | 40 | NSLocationWhenInUseUsageDescription 41 | 42 | UILaunchStoryboardName 43 | LaunchScreen 44 | UIRequiredDeviceCapabilities 45 | 46 | armv7 47 | 48 | UISupportedInterfaceOrientations 49 | 50 | UIInterfaceOrientationPortrait 51 | UIInterfaceOrientationLandscapeLeft 52 | UIInterfaceOrientationLandscapeRight 53 | 54 | UIViewControllerBasedStatusBarAppearance 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /example/ios/Example-Hermes-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ReactNativeCompressedJsbundle Example 9 | CFBundleExecutable 10 | $(EXECUTABLE_NAME) 11 | CFBundleIdentifier 12 | $(PRODUCT_BUNDLE_IDENTIFIER) 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | $(PRODUCT_NAME) 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1 25 | LSRequiresIPhoneOS 26 | 27 | NSAppTransportSecurity 28 | 29 | NSAllowsArbitraryLoads 30 | 31 | NSExceptionDomains 32 | 33 | localhost 34 | 35 | NSExceptionAllowsInsecureHTTPLoads 36 | 37 | 38 | 39 | 40 | NSLocationWhenInUseUsageDescription 41 | 42 | UILaunchStoryboardName 43 | LaunchScreen 44 | UIRequiredDeviceCapabilities 45 | 46 | armv7 47 | 48 | UISupportedInterfaceOrientations 49 | 50 | UIInterfaceOrientationPortrait 51 | UIInterfaceOrientationLandscapeLeft 52 | UIInterfaceOrientationLandscapeRight 53 | 54 | UIViewControllerBasedStatusBarAppearance 55 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /example/ios/Example.xcodeproj/xcshareddata/xcschemes/Smoketests.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 14 | 15 | 17 | 23 | 24 | 25 | 26 | 27 | 37 | 38 | 44 | 45 | 47 | 48 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /ios/BrotliUtil.h: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Ivan Moskalev 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | #ifndef BrotliUtil_h 9 | #define BrotliUtil_h 10 | 11 | #include 12 | #include 13 | 14 | static inline NSData *_Nullable IMOTryDecompressingBrotli(NSData *_Nonnull input) { 15 | BrotliDecoderState *state = BrotliDecoderCreateInstance(NULL, NULL, NULL); 16 | 17 | if (!state) { 18 | return nil; 19 | } 20 | 21 | std::vector buffer(input.length); 22 | 23 | // Inputs 24 | size_t availableIn = input.length; 25 | const uint8_t* nextIn = reinterpret_cast(input.bytes); 26 | 27 | // Outputs 28 | size_t availableOut = buffer.size(); 29 | uint8_t* nextOut = reinterpret_cast(buffer.data()); 30 | 31 | BrotliDecoderResult result = BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT; 32 | 33 | while (result != BROTLI_DECODER_RESULT_SUCCESS && result != BROTLI_DECODER_RESULT_ERROR) { 34 | result = BrotliDecoderDecompressStream( 35 | state, &availableIn, &nextIn, &availableOut, &nextOut, nullptr 36 | ); 37 | if (result == BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT) { 38 | const size_t actuallyUsedMemory = buffer.size() - availableOut; 39 | const size_t memoryToAdd = buffer.size(); 40 | availableOut += memoryToAdd; 41 | buffer.resize(buffer.size() + memoryToAdd); 42 | nextOut = reinterpret_cast(buffer.data()) + actuallyUsedMemory; 43 | } else if (result == BROTLI_DECODER_RESULT_SUCCESS) { 44 | const size_t actuallyUsedMemory = buffer.size() - availableOut; 45 | buffer.resize(actuallyUsedMemory); 46 | break; 47 | } else if (result == BROTLI_DECODER_RESULT_ERROR) { 48 | buffer.clear(); 49 | break; 50 | } 51 | } 52 | 53 | BrotliDecoderDestroyInstance(state); 54 | 55 | if (result != BROTLI_DECODER_RESULT_SUCCESS) { 56 | return nil; 57 | } 58 | 59 | return [NSData dataWithBytes:&buffer[0] length:buffer.size()]; 60 | } 61 | 62 | 63 | 64 | #endif /* BrotliUtil_h */ 65 | -------------------------------------------------------------------------------- /example/ios/Example/AppDelegate.m: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Ivan Moskalev 3 | * 4 | * This source code is licensed under the MIT license found in the 5 | * LICENSE file in the root directory of this source tree. 6 | */ 7 | 8 | #import "AppDelegate.h" 9 | 10 | #import 11 | #import 12 | #import 13 | #import 14 | 15 | @implementation AppDelegate 16 | 17 | // ========================================================================================================= 18 | 19 | - (void)loadSourceForBridge:(RCTBridge *)bridge 20 | onProgress:(RCTSourceLoadProgressBlock)onProgress 21 | onComplete:(RCTSourceLoadBlock)loadCallback { 22 | [IMOCompressedBundleLoader loadSourceForBridge:bridge 23 | bridgeDelegate:self 24 | onProgress:onProgress 25 | onComplete:loadCallback]; 26 | } 27 | 28 | // ========================================================================================================= 29 | // ========================================================================================================= 30 | 31 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 32 | { 33 | RCTBridge *bridge = [[RCTBridge alloc] initWithDelegate:self launchOptions:launchOptions]; 34 | RCTRootView *rootView = [[RCTRootView alloc] initWithBridge:bridge 35 | moduleName:@"Example" 36 | initialProperties:nil]; 37 | 38 | rootView.backgroundColor = [[UIColor alloc] initWithRed:1.0f green:1.0f blue:1.0f alpha:1]; 39 | 40 | self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 41 | UIViewController *rootViewController = [UIViewController new]; 42 | rootViewController.view = rootView; 43 | self.window.rootViewController = rootViewController; 44 | [self.window makeKeyAndVisible]; 45 | return YES; 46 | } 47 | 48 | - (NSURL *)sourceURLForBridge:(RCTBridge *)bridge 49 | { 50 | #if DEBUG 51 | return [[RCTBundleURLProvider sharedSettings] jsBundleURLForBundleRoot:@"index" fallbackResource:nil]; 52 | #else 53 | return [[NSBundle mainBundle] URLForResource:@"main" withExtension:@"jsbundle"]; 54 | #endif 55 | } 56 | 57 | @end 58 | -------------------------------------------------------------------------------- /example/ios/Example.xcodeproj/xcshareddata/xcschemes/Smoketests-Hermes.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 14 | 15 | 17 | 23 | 24 | 25 | 26 | 27 | 37 | 38 | 44 | 45 | 46 | 47 | 53 | 54 | 56 | 57 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "react-native-compressed-jsbundle", 3 | "version": "0.1.2", 4 | "description": "Ship Brotli-compressed JS bundles in your React Native apps", 5 | "react-native": "src/index.js", 6 | "source": "src/index.js", 7 | "files": [ 8 | "src", 9 | "ios", 10 | "react-native-compressed-jsbundle.podspec", 11 | "tool/compress.js", 12 | "tool/compress-xcode.sh", 13 | "brotli/c/*", 14 | "brotli/LICENSE" 15 | ], 16 | "scripts": { 17 | "lint": "echo OK", 18 | "example": "yarn --cwd example", 19 | "pods": "cd example && pod-install --quiet", 20 | "bootstrap": "yarn example && yarn && yarn pods" 21 | }, 22 | "keywords": [ 23 | "react-native", 24 | "ios", 25 | "android", 26 | "brotli", 27 | "compression" 28 | ], 29 | "repository": "https://github.com/ivanmoskalev/react-native-compressed-jsbundle", 30 | "author": "Ivan Moskalev (https://github.com/ivanmoskalev)", 31 | "license": "MIT", 32 | "bugs": { 33 | "url": "https://github.com/ivanmoskalev/react-native-compressed-jsbundle/issues" 34 | }, 35 | "homepage": "https://github.com/ivanmoskalev/react-native-compressed-jsbundle#readme", 36 | "publishConfig": { 37 | "registry": "https://registry.npmjs.org/" 38 | }, 39 | "devDependencies": { 40 | "@commitlint/config-conventional": "^11.0.0", 41 | "@react-native-community/eslint-config": "^2.0.0", 42 | "@release-it/conventional-changelog": "^2.0.0", 43 | "commitlint": "^11.0.0", 44 | "husky": "^4.2.5", 45 | "pod-install": "^0.1.0" 46 | }, 47 | "dependencies": { 48 | "brotli": "^1.3.2" 49 | }, 50 | "peerDependencies": { 51 | "react": "*", 52 | "react-native": "*" 53 | }, 54 | "jest": { 55 | "preset": "react-native", 56 | "modulePathIgnorePatterns": [ 57 | "/example/node_modules", 58 | "/lib/" 59 | ] 60 | }, 61 | "husky": { 62 | "hooks": { 63 | "commit-msg": "commitlint -E HUSKY_GIT_PARAMS", 64 | "pre-commit": "yarn lint" 65 | } 66 | }, 67 | "commitlint": { 68 | "extends": [ 69 | "@commitlint/config-conventional" 70 | ] 71 | }, 72 | "release-it": { 73 | "git": { 74 | "commitMessage": "chore: release ${version}", 75 | "tagName": "v${version}" 76 | }, 77 | "npm": { 78 | "publish": true 79 | }, 80 | "github": { 81 | "release": true 82 | }, 83 | "plugins": { 84 | "@release-it/conventional-changelog": { 85 | "preset": "angular" 86 | } 87 | } 88 | } 89 | } 90 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Ship compressed JS bundles 2 | 3 | **Warning: not yet available for Android.** 4 | 5 | Sometimes you need a very small `.app`, for example if you are building 6 | an [App Clip](https://developer.apple.com/app-clips/). (App Clips have to be strictly less than 10 MB in their _ 7 | uncompressed_ form. The limit was increased to 15 MB with iOS 16+) 8 | 9 | When you distribute your React Native app, JavaScript code gets bundled into a `.jsbundle` file. It can get quite large. 10 | 11 | This package allows you to compress your `.jsbundle` when you build the app for distribution. When the app is run, it 12 | automatically uncompresses the `.jsbundle` on the fly. 13 | 14 | ## How does it work? 15 | 16 | `react-native-compressed-jsbundle` provides: 17 | 18 | - A script that automatically compresses your `.jsbundle` using the fast and compact Brotli algorithm; 19 | - a custom `.jsbundle` loader that uncompresses the `.jsbundle` (at ~350MB/s) at app launch. The loader uses standard mechanisms for loading customization that React Native provides. 20 | 21 | ## Installation 22 | 23 | ### iOS 24 | 25 | Add the library a dependency: 26 | 27 | ```shell 28 | $ yarn add react-native-compressed-jsbundle 29 | ``` 30 | 31 | Open your Xcode project and modify the React Native build phase (“Bundle React Native code and images”): 32 | 33 | ```shell 34 | export NODE_BINARY=node 35 | ../node_modules/react-native/packager/react-native-xcode.sh 36 | 37 | # 1. Add this line at the bottom of the script. 38 | ../node_modules/react-native-compressed-jsbundle/tool/compress-xcode.sh 39 | ``` 40 | 41 | Open `AppDelegate.m` and add the following: 42 | 43 | ```objectivec 44 | // 2. Add the new import directive below other imports. 45 | #import 46 | 47 | @implementation AppDelegate 48 | 49 | // Other methods 50 | 51 | // 3. Add the following lines below other methods: 52 | - (void)loadSourceForBridge:(RCTBridge *)bridge onProgress:(RCTSourceLoadProgressBlock)onProgress onComplete:(RCTSourceLoadBlock)loadCallback { 53 | [IMOCompressedBundleLoader loadSourceForBridge:bridge bridgeDelegate:self onProgress:onProgress onComplete:loadCallback]; 54 | } 55 | 56 | @end 57 | ``` 58 | 59 | You are good to go. 60 | 61 | ## Performance 62 | 63 | This libary does add a bit of time to app startup due to the decompression step. However, it is quite small – around **20ms for a 5 MB `.jsbundle`**. 64 | 65 | I have included some simple low-overhead tracing in the library, so you can see for yourself whether the tradeoff is 66 | acceptable. Build your app in Release mode on your device and look into the Xcode console. 67 | 68 | -------------------------------------------------------------------------------- /example/android/app/src/main/java/com/example/ivanmoskalevreactnativecompressedjsbundle/MainApplication.java: -------------------------------------------------------------------------------- 1 | package com.example.ivanmoskalevreactnativecompressedjsbundle; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | import com.facebook.react.PackageList; 6 | import com.facebook.react.ReactApplication; 7 | import com.facebook.react.ReactNativeHost; 8 | import com.facebook.react.ReactPackage; 9 | import com.facebook.react.ReactInstanceManager; 10 | import com.facebook.soloader.SoLoader; 11 | import java.lang.reflect.InvocationTargetException; 12 | import java.util.List; 13 | import com.ivanmoskalevreactnativecompressedjsbundle.ReactNativeCompressedJsbundlePackage; 14 | 15 | public class MainApplication extends Application implements ReactApplication { 16 | 17 | private final ReactNativeHost mReactNativeHost = 18 | new ReactNativeHost(this) { 19 | @Override 20 | public boolean getUseDeveloperSupport() { 21 | return BuildConfig.DEBUG; 22 | } 23 | 24 | @Override 25 | protected List getPackages() { 26 | @SuppressWarnings("UnnecessaryLocalVariable") 27 | List packages = new PackageList(this).getPackages(); 28 | // Packages that cannot be autolinked yet can be added manually here, for ReactNativeCompressedJsbundleExample: 29 | // packages.add(new MyReactNativePackage()); 30 | packages.add(new ReactNativeCompressedJsbundlePackage()); 31 | return packages; 32 | } 33 | 34 | @Override 35 | protected String getJSMainModuleName() { 36 | return "index"; 37 | } 38 | }; 39 | 40 | @Override 41 | public ReactNativeHost getReactNativeHost() { 42 | return mReactNativeHost; 43 | } 44 | 45 | @Override 46 | public void onCreate() { 47 | super.onCreate(); 48 | SoLoader.init(this, /* native exopackage */ false); 49 | initializeFlipper(this, getReactNativeHost().getReactInstanceManager()); // Remove this line if you don't want Flipper enabled 50 | } 51 | 52 | /** 53 | * Loads Flipper in React Native templates. 54 | * 55 | * @param context 56 | */ 57 | private static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { 58 | if (BuildConfig.DEBUG) { 59 | try { 60 | /* 61 | We use reflection here to pick up the class that initializes Flipper, 62 | since Flipper library is not available in release mode 63 | */ 64 | Class aClass = Class.forName("com.ivanmoskalevreactnativecompressedjsbundleExample.ReactNativeFlipper"); 65 | aClass 66 | .getMethod("initializeFlipper", Context.class, ReactInstanceManager.class) 67 | .invoke(null, context, reactInstanceManager); 68 | } catch (ClassNotFoundException e) { 69 | e.printStackTrace(); 70 | } catch (NoSuchMethodException e) { 71 | e.printStackTrace(); 72 | } catch (IllegalAccessException e) { 73 | e.printStackTrace(); 74 | } catch (InvocationTargetException e) { 75 | e.printStackTrace(); 76 | } 77 | } 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /example/android/gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem http://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto init 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto init 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :init 68 | @rem Get command-line arguments, handling Windows variants 69 | 70 | if not "%OS%" == "Windows_NT" goto win9xME_args 71 | 72 | :win9xME_args 73 | @rem Slurp the command line arguments. 74 | set CMD_LINE_ARGS= 75 | set _SKIP=2 76 | 77 | :win9xME_args_slurp 78 | if "x%~1" == "x" goto execute 79 | 80 | set CMD_LINE_ARGS=%* 81 | 82 | :execute 83 | @rem Setup the command line 84 | 85 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 86 | 87 | @rem Execute Gradle 88 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 89 | 90 | :end 91 | @rem End local scope for the variables with windows NT shell 92 | if "%ERRORLEVEL%"=="0" goto mainEnd 93 | 94 | :fail 95 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 96 | rem the _cmd.exe /c_ return code! 97 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 98 | exit /b 1 99 | 100 | :mainEnd 101 | if "%OS%"=="Windows_NT" endlocal 102 | 103 | :omega 104 | -------------------------------------------------------------------------------- /example/android/app/src/debug/java/com/example/ivanmoskalevreactnativecompressedjsbundle/ReactNativeFlipper.java: -------------------------------------------------------------------------------- 1 | /** 2 | * Copyright (c) Facebook, Inc. and its affiliates. 3 | * 4 | *

This source code is licensed under the MIT license found in the LICENSE file in the root 5 | * directory of this source tree. 6 | */ 7 | package com.example.ivanmoskalevreactnativecompressedjsbundle; 8 | 9 | import android.content.Context; 10 | import com.facebook.flipper.android.AndroidFlipperClient; 11 | import com.facebook.flipper.android.utils.FlipperUtils; 12 | import com.facebook.flipper.core.FlipperClient; 13 | import com.facebook.flipper.plugins.crashreporter.CrashReporterPlugin; 14 | import com.facebook.flipper.plugins.databases.DatabasesFlipperPlugin; 15 | import com.facebook.flipper.plugins.fresco.FrescoFlipperPlugin; 16 | import com.facebook.flipper.plugins.inspector.DescriptorMapping; 17 | import com.facebook.flipper.plugins.inspector.InspectorFlipperPlugin; 18 | import com.facebook.flipper.plugins.network.FlipperOkhttpInterceptor; 19 | import com.facebook.flipper.plugins.network.NetworkFlipperPlugin; 20 | import com.facebook.flipper.plugins.react.ReactFlipperPlugin; 21 | import com.facebook.flipper.plugins.sharedpreferences.SharedPreferencesFlipperPlugin; 22 | import com.facebook.react.ReactInstanceManager; 23 | import com.facebook.react.bridge.ReactContext; 24 | import com.facebook.react.modules.network.NetworkingModule; 25 | import okhttp3.OkHttpClient; 26 | 27 | public class ReactNativeFlipper { 28 | public static void initializeFlipper(Context context, ReactInstanceManager reactInstanceManager) { 29 | if (FlipperUtils.shouldEnableFlipper(context)) { 30 | final FlipperClient client = AndroidFlipperClient.getInstance(context); 31 | client.addPlugin(new InspectorFlipperPlugin(context, DescriptorMapping.withDefaults())); 32 | client.addPlugin(new ReactFlipperPlugin()); 33 | client.addPlugin(new DatabasesFlipperPlugin(context)); 34 | client.addPlugin(new SharedPreferencesFlipperPlugin(context)); 35 | client.addPlugin(CrashReporterPlugin.getInstance()); 36 | NetworkFlipperPlugin networkFlipperPlugin = new NetworkFlipperPlugin(); 37 | NetworkingModule.setCustomClientBuilder( 38 | new NetworkingModule.CustomClientBuilder() { 39 | @Override 40 | public void apply(OkHttpClient.Builder builder) { 41 | builder.addNetworkInterceptor(new FlipperOkhttpInterceptor(networkFlipperPlugin)); 42 | } 43 | }); 44 | client.addPlugin(networkFlipperPlugin); 45 | client.start(); 46 | // Fresco Plugin needs to ensure that ImagePipelineFactory is initialized 47 | // Hence we run if after all native modules have been initialized 48 | ReactContext reactContext = reactInstanceManager.getCurrentReactContext(); 49 | if (reactContext == null) { 50 | reactInstanceManager.addReactInstanceEventListener( 51 | new ReactInstanceManager.ReactInstanceEventListener() { 52 | @Override 53 | public void onReactContextInitialized(ReactContext reactContext) { 54 | reactInstanceManager.removeReactInstanceEventListener(this); 55 | reactContext.runOnNativeModulesQueueThread( 56 | new Runnable() { 57 | @Override 58 | public void run() { 59 | client.addPlugin(new FrescoFlipperPlugin()); 60 | } 61 | }); 62 | } 63 | }); 64 | } else { 65 | client.addPlugin(new FrescoFlipperPlugin()); 66 | } 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /example/ios/Example.xcodeproj/xcshareddata/xcschemes/Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 53 | 55 | 61 | 62 | 63 | 64 | 70 | 72 | 78 | 79 | 80 | 81 | 83 | 84 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /example/ios/Example.xcodeproj/xcshareddata/xcschemes/Example-Hermes.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 33 | 39 | 40 | 41 | 42 | 43 | 53 | 55 | 61 | 62 | 63 | 64 | 70 | 72 | 78 | 79 | 80 | 81 | 83 | 84 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /example/ios/Example/LaunchScreen.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 25 | 31 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /example/android/gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | # Determine the Java command to use to start the JVM. 86 | if [ -n "$JAVA_HOME" ] ; then 87 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 88 | # IBM's JDK on AIX uses strange locations for the executables 89 | JAVACMD="$JAVA_HOME/jre/sh/java" 90 | else 91 | JAVACMD="$JAVA_HOME/bin/java" 92 | fi 93 | if [ ! -x "$JAVACMD" ] ; then 94 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 95 | 96 | Please set the JAVA_HOME variable in your environment to match the 97 | location of your Java installation." 98 | fi 99 | else 100 | JAVACMD="java" 101 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 102 | 103 | Please set the JAVA_HOME variable in your environment to match the 104 | location of your Java installation." 105 | fi 106 | 107 | # Increase the maximum file descriptors if we can. 108 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 109 | MAX_FD_LIMIT=`ulimit -H -n` 110 | if [ $? -eq 0 ] ; then 111 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 112 | MAX_FD="$MAX_FD_LIMIT" 113 | fi 114 | ulimit -n $MAX_FD 115 | if [ $? -ne 0 ] ; then 116 | warn "Could not set maximum file descriptor limit: $MAX_FD" 117 | fi 118 | else 119 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 120 | fi 121 | fi 122 | 123 | # For Darwin, add options to specify how the application appears in the dock 124 | if $darwin; then 125 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 126 | fi 127 | 128 | # For Cygwin or MSYS, switch paths to Windows format before running java 129 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 130 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 131 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 132 | JAVACMD=`cygpath --unix "$JAVACMD"` 133 | 134 | # We build the pattern for arguments to be converted via cygpath 135 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 136 | SEP="" 137 | for dir in $ROOTDIRSRAW ; do 138 | ROOTDIRS="$ROOTDIRS$SEP$dir" 139 | SEP="|" 140 | done 141 | OURCYGPATTERN="(^($ROOTDIRS))" 142 | # Add a user-defined pattern to the cygpath arguments 143 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 144 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 145 | fi 146 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 147 | i=0 148 | for arg in "$@" ; do 149 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 150 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 151 | 152 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 153 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 154 | else 155 | eval `echo args$i`="\"$arg\"" 156 | fi 157 | i=`expr $i + 1` 158 | done 159 | case $i in 160 | 0) set -- ;; 161 | 1) set -- "$args0" ;; 162 | 2) set -- "$args0" "$args1" ;; 163 | 3) set -- "$args0" "$args1" "$args2" ;; 164 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 165 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 166 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 167 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 168 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 169 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 170 | esac 171 | fi 172 | 173 | # Escape application args 174 | save () { 175 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 176 | echo " " 177 | } 178 | APP_ARGS=`save "$@"` 179 | 180 | # Collect all arguments for the java command, following the shell quoting and substitution rules 181 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 182 | 183 | exec "$JAVACMD" "$@" 184 | -------------------------------------------------------------------------------- /example/android/app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: "com.android.application" 2 | 3 | import com.android.build.OutputFile 4 | 5 | /** 6 | * The react.gradle file registers a task for each build variant (e.g. bundleDebugJsAndAssets 7 | * and bundleReleaseJsAndAssets). 8 | * These basically call `react-native bundle` with the correct arguments during the Android build 9 | * cycle. By default, bundleDebugJsAndAssets is skipped, as in debug/dev mode we prefer to load the 10 | * bundle directly from the development server. Below you can see all the possible configurations 11 | * and their defaults. If you decide to add a configuration block, make sure to add it before the 12 | * `apply from: "../../node_modules/react-native/react.gradle"` line. 13 | * 14 | * project.ext.react = [ 15 | * // the name of the generated asset file containing your JS bundle 16 | * bundleAssetName: "index.android.bundle", 17 | * 18 | * // the entry file for bundle generation 19 | * entryFile: "index.android.js", 20 | * 21 | * // https://reactnative.dev/docs/performance#enable-the-ram-format 22 | * bundleCommand: "ram-bundle", 23 | * 24 | * // whether to bundle JS and assets in debug mode 25 | * bundleInDebug: false, 26 | * 27 | * // whether to bundle JS and assets in release mode 28 | * bundleInRelease: true, 29 | * 30 | * // whether to bundle JS and assets in another build variant (if configured). 31 | * // See http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants 32 | * // The configuration property can be in the following formats 33 | * // 'bundleIn${productFlavor}${buildType}' 34 | * // 'bundleIn${buildType}' 35 | * // bundleInFreeDebug: true, 36 | * // bundleInPaidRelease: true, 37 | * // bundleInBeta: true, 38 | * 39 | * // whether to disable dev mode in custom build variants (by default only disabled in release) 40 | * // for ReactNativeCompressedJsbundleExample: to disable dev mode in the staging build type (if configured) 41 | * devDisabledInStaging: true, 42 | * // The configuration property can be in the following formats 43 | * // 'devDisabledIn${productFlavor}${buildType}' 44 | * // 'devDisabledIn${buildType}' 45 | * 46 | * // the root of your project, i.e. where "package.json" lives 47 | * root: "../../", 48 | * 49 | * // where to put the JS bundle asset in debug mode 50 | * jsBundleDirDebug: "$buildDir/intermediates/assets/debug", 51 | * 52 | * // where to put the JS bundle asset in release mode 53 | * jsBundleDirRelease: "$buildDir/intermediates/assets/release", 54 | * 55 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 56 | * // require('./image.png')), in debug mode 57 | * resourcesDirDebug: "$buildDir/intermediates/res/merged/debug", 58 | * 59 | * // where to put drawable resources / React Native assets, e.g. the ones you use via 60 | * // require('./image.png')), in release mode 61 | * resourcesDirRelease: "$buildDir/intermediates/res/merged/release", 62 | * 63 | * // by default the gradle tasks are skipped if none of the JS files or assets change; this means 64 | * // that we don't look at files in android/ or ios/ to determine whether the tasks are up to 65 | * // date; if you have any other folders that you want to ignore for performance reasons (gradle 66 | * // indexes the entire tree), add them here. Alternatively, if you have JS files in android/ 67 | * // for ReactNativeCompressedJsbundleExample, you might want to remove it from here. 68 | * inputExcludes: ["android/**", "ios/**"], 69 | * 70 | * // override which node gets called and with what additional arguments 71 | * nodeExecutableAndArgs: ["node"], 72 | * 73 | * // supply additional arguments to the packager 74 | * extraPackagerArgs: [] 75 | * ] 76 | */ 77 | 78 | project.ext.react = [ 79 | enableHermes: false, // clean and rebuild if changing 80 | entryFile: "index.js", 81 | ] 82 | 83 | apply from: "../../node_modules/react-native/react.gradle" 84 | 85 | /** 86 | * Set this to true to create two separate APKs instead of one: 87 | * - An APK that only works on ARM devices 88 | * - An APK that only works on x86 devices 89 | * The advantage is the size of the APK is reduced by about 4MB. 90 | * Upload all the APKs to the Play Store and people will download 91 | * the correct one based on the CPU architecture of their device. 92 | */ 93 | def enableSeparateBuildPerCPUArchitecture = false 94 | 95 | /** 96 | * Run Proguard to shrink the Java bytecode in release builds. 97 | */ 98 | def enableProguardInReleaseBuilds = false 99 | 100 | /** 101 | * The preferred build flavor of JavaScriptCore. 102 | * 103 | * For ReactNativeCompressedJsbundleExample, to use the international variant, you can use: 104 | * `def jscFlavor = 'org.webkit:android-jsc-intl:+'` 105 | * 106 | * The international variant includes ICU i18n library and necessary data 107 | * allowing to use e.g. `Date.toLocaleString` and `String.localeCompare` that 108 | * give correct results when using with locales other than en-US. Note that 109 | * this variant is about 6MiB larger per architecture than default. 110 | */ 111 | def jscFlavor = 'org.webkit:android-jsc:+' 112 | 113 | /** 114 | * Whether to enable the Hermes VM. 115 | * 116 | * This should be set on project.ext.react and mirrored here. If it is not set 117 | * on project.ext.react, JavaScript will not be compiled to Hermes Bytecode 118 | * and the benefits of using Hermes will therefore be sharply reduced. 119 | */ 120 | def enableHermes = project.ext.react.get("enableHermes", false); 121 | 122 | android { 123 | compileSdkVersion rootProject.ext.compileSdkVersion 124 | 125 | compileOptions { 126 | sourceCompatibility JavaVersion.VERSION_1_8 127 | targetCompatibility JavaVersion.VERSION_1_8 128 | } 129 | 130 | defaultConfig { 131 | applicationId "com.example.ivanmoskalevreactnativecompressedjsbundle" 132 | minSdkVersion rootProject.ext.minSdkVersion 133 | targetSdkVersion rootProject.ext.targetSdkVersion 134 | versionCode 1 135 | versionName "1.0" 136 | } 137 | splits { 138 | abi { 139 | reset() 140 | enable enableSeparateBuildPerCPUArchitecture 141 | universalApk false // If true, also generate a universal APK 142 | include "armeabi-v7a", "x86", "arm64-v8a", "x86_64" 143 | } 144 | } 145 | signingConfigs { 146 | debug { 147 | storeFile file('debug.keystore') 148 | storePassword 'android' 149 | keyAlias 'androiddebugkey' 150 | keyPassword 'android' 151 | } 152 | } 153 | buildTypes { 154 | debug { 155 | signingConfig signingConfigs.debug 156 | } 157 | release { 158 | // Caution! In production, you need to generate your own keystore file. 159 | // see https://reactnative.dev/docs/signed-apk-android. 160 | signingConfig signingConfigs.debug 161 | minifyEnabled enableProguardInReleaseBuilds 162 | proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro" 163 | } 164 | } 165 | // applicationVariants are e.g. debug, release 166 | applicationVariants.all { variant -> 167 | variant.outputs.each { output -> 168 | // For each separate APK per architecture, set a unique version code as described here: 169 | // https://developer.android.com/studio/build/configure-apk-splits.html 170 | def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4] 171 | def abi = output.getFilter(OutputFile.ABI) 172 | if (abi != null) { // null for the universal-debug, universal-release variants 173 | output.versionCodeOverride = 174 | versionCodes.get(abi) * 1048576 + defaultConfig.versionCode 175 | } 176 | 177 | } 178 | } 179 | } 180 | 181 | dependencies { 182 | implementation fileTree(dir: "libs", include: ["*.jar"]) 183 | //noinspection GradleDynamicVersion 184 | implementation "com.facebook.react:react-native:+" // From node_modules 185 | 186 | 187 | implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0" 188 | debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") { 189 | exclude group:'com.facebook.fbjni' 190 | } 191 | debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") { 192 | exclude group:'com.facebook.flipper' 193 | exclude group:'com.squareup.okhttp3', module:'okhttp' 194 | } 195 | debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") { 196 | exclude group:'com.facebook.flipper' 197 | } 198 | 199 | if (enableHermes) { 200 | def hermesPath = "../../node_modules/hermes-engine/android/"; 201 | debugImplementation files(hermesPath + "hermes-debug.aar") 202 | releaseImplementation files(hermesPath + "hermes-release.aar") 203 | } else { 204 | implementation jscFlavor 205 | } 206 | 207 | implementation project(':ivanmoskalevreactnativecompressedjsbundle') 208 | } 209 | 210 | // Run this once to be able to run the application with BUCK 211 | // puts all compile dependencies into folder libs for BUCK to use 212 | task copyDownloadableDepsToLibs(type: Copy) { 213 | from configurations.compile 214 | into 'libs' 215 | } 216 | 217 | apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project) 218 | -------------------------------------------------------------------------------- /ios/ReactNativeCompressedJsbundle.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXCopyFilesBuildPhase section */ 10 | 58B511D91A9E6C8500147676 /* CopyFiles */ = { 11 | isa = PBXCopyFilesBuildPhase; 12 | buildActionMask = 2147483647; 13 | dstPath = "include/$(PRODUCT_NAME)"; 14 | dstSubfolderSpec = 16; 15 | files = ( 16 | ); 17 | runOnlyForDeploymentPostprocessing = 0; 18 | }; 19 | /* End PBXCopyFilesBuildPhase section */ 20 | 21 | /* Begin PBXFileReference section */ 22 | 134814201AA4EA6300B7C361 /* libReactNativeCompressedJsbundle.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libReactNativeCompressedJsbundle.a; sourceTree = BUILT_PRODUCTS_DIR; }; 23 | B3E7B5881CC2AC0600A0062D /* IMOCompressedBundleLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IMOCompressedBundleLoader.h; sourceTree = ""; }; 24 | B3E7B5891CC2AC0600A0062D /* IMOCompressedBundleLoader.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = IMOCompressedBundleLoader.m; sourceTree = ""; }; 25 | /* End PBXFileReference section */ 26 | 27 | /* Begin PBXFrameworksBuildPhase section */ 28 | 58B511D81A9E6C8500147676 /* Frameworks */ = { 29 | isa = PBXFrameworksBuildPhase; 30 | buildActionMask = 2147483647; 31 | files = ( 32 | ); 33 | runOnlyForDeploymentPostprocessing = 0; 34 | }; 35 | /* End PBXFrameworksBuildPhase section */ 36 | 37 | /* Begin PBXGroup section */ 38 | 134814211AA4EA7D00B7C361 /* Products */ = { 39 | isa = PBXGroup; 40 | children = ( 41 | 134814201AA4EA6300B7C361 /* libReactNativeCompressedJsbundle.a */, 42 | ); 43 | name = Products; 44 | sourceTree = ""; 45 | }; 46 | 58B511D21A9E6C8500147676 = { 47 | isa = PBXGroup; 48 | children = ( 49 | B3E7B5881CC2AC0600A0062D /* IMOCompressedBundleLoader.h */, 50 | B3E7B5891CC2AC0600A0062D /* IMOCompressedBundleLoader.m */, 51 | 134814211AA4EA7D00B7C361 /* Products */, 52 | ); 53 | sourceTree = ""; 54 | }; 55 | /* End PBXGroup section */ 56 | 57 | /* Begin PBXNativeTarget section */ 58 | 58B511DA1A9E6C8500147676 /* ReactNativeCompressedJsbundle */ = { 59 | isa = PBXNativeTarget; 60 | buildConfigurationList = 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "ReactNativeCompressedJsbundle" */; 61 | buildPhases = ( 62 | 58B511D71A9E6C8500147676 /* Sources */, 63 | 58B511D81A9E6C8500147676 /* Frameworks */, 64 | 58B511D91A9E6C8500147676 /* CopyFiles */, 65 | ); 66 | buildRules = ( 67 | ); 68 | dependencies = ( 69 | ); 70 | name = ReactNativeCompressedJsbundle; 71 | productName = RCTDataManager; 72 | productReference = 134814201AA4EA6300B7C361 /* libReactNativeCompressedJsbundle.a */; 73 | productType = "com.apple.product-type.library.static"; 74 | }; 75 | /* End PBXNativeTarget section */ 76 | 77 | /* Begin PBXProject section */ 78 | 58B511D31A9E6C8500147676 /* Project object */ = { 79 | isa = PBXProject; 80 | attributes = { 81 | LastUpgradeCheck = 0920; 82 | ORGANIZATIONNAME = Facebook; 83 | TargetAttributes = { 84 | 58B511DA1A9E6C8500147676 = { 85 | CreatedOnToolsVersion = 6.1.1; 86 | }; 87 | }; 88 | }; 89 | buildConfigurationList = 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "ReactNativeCompressedJsbundle" */; 90 | compatibilityVersion = "Xcode 3.2"; 91 | developmentRegion = English; 92 | hasScannedForEncodings = 0; 93 | knownRegions = ( 94 | English, 95 | en, 96 | ); 97 | mainGroup = 58B511D21A9E6C8500147676; 98 | productRefGroup = 58B511D21A9E6C8500147676; 99 | projectDirPath = ""; 100 | projectRoot = ""; 101 | targets = ( 102 | 58B511DA1A9E6C8500147676 /* ReactNativeCompressedJsbundle */, 103 | ); 104 | }; 105 | /* End PBXProject section */ 106 | 107 | /* Begin PBXSourcesBuildPhase section */ 108 | 58B511D71A9E6C8500147676 /* Sources */ = { 109 | isa = PBXSourcesBuildPhase; 110 | buildActionMask = 2147483647; 111 | files = ( 112 | ); 113 | runOnlyForDeploymentPostprocessing = 0; 114 | }; 115 | /* End PBXSourcesBuildPhase section */ 116 | 117 | /* Begin XCBuildConfiguration section */ 118 | 58B511ED1A9E6C8500147676 /* Debug */ = { 119 | isa = XCBuildConfiguration; 120 | buildSettings = { 121 | ALWAYS_SEARCH_USER_PATHS = NO; 122 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 123 | CLANG_CXX_LIBRARY = "libc++"; 124 | CLANG_ENABLE_MODULES = YES; 125 | CLANG_ENABLE_OBJC_ARC = YES; 126 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 127 | CLANG_WARN_BOOL_CONVERSION = YES; 128 | CLANG_WARN_COMMA = YES; 129 | CLANG_WARN_CONSTANT_CONVERSION = YES; 130 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 131 | CLANG_WARN_EMPTY_BODY = YES; 132 | CLANG_WARN_ENUM_CONVERSION = YES; 133 | CLANG_WARN_INFINITE_RECURSION = YES; 134 | CLANG_WARN_INT_CONVERSION = YES; 135 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 136 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 137 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 138 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 139 | CLANG_WARN_STRICT_PROTOTYPES = YES; 140 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 141 | CLANG_WARN_UNREACHABLE_CODE = YES; 142 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 143 | COPY_PHASE_STRIP = NO; 144 | ENABLE_STRICT_OBJC_MSGSEND = YES; 145 | ENABLE_TESTABILITY = YES; 146 | GCC_C_LANGUAGE_STANDARD = gnu99; 147 | GCC_DYNAMIC_NO_PIC = NO; 148 | GCC_NO_COMMON_BLOCKS = YES; 149 | GCC_OPTIMIZATION_LEVEL = 0; 150 | GCC_PREPROCESSOR_DEFINITIONS = ( 151 | "DEBUG=1", 152 | "$(inherited)", 153 | ); 154 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 155 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 156 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 157 | GCC_WARN_UNDECLARED_SELECTOR = YES; 158 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 159 | GCC_WARN_UNUSED_FUNCTION = YES; 160 | GCC_WARN_UNUSED_VARIABLE = YES; 161 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 162 | MTL_ENABLE_DEBUG_INFO = YES; 163 | ONLY_ACTIVE_ARCH = YES; 164 | SDKROOT = iphoneos; 165 | }; 166 | name = Debug; 167 | }; 168 | 58B511EE1A9E6C8500147676 /* Release */ = { 169 | isa = XCBuildConfiguration; 170 | buildSettings = { 171 | ALWAYS_SEARCH_USER_PATHS = NO; 172 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 173 | CLANG_CXX_LIBRARY = "libc++"; 174 | CLANG_ENABLE_MODULES = YES; 175 | CLANG_ENABLE_OBJC_ARC = YES; 176 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 177 | CLANG_WARN_BOOL_CONVERSION = YES; 178 | CLANG_WARN_COMMA = YES; 179 | CLANG_WARN_CONSTANT_CONVERSION = YES; 180 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 181 | CLANG_WARN_EMPTY_BODY = YES; 182 | CLANG_WARN_ENUM_CONVERSION = YES; 183 | CLANG_WARN_INFINITE_RECURSION = YES; 184 | CLANG_WARN_INT_CONVERSION = YES; 185 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 186 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 187 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 188 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 189 | CLANG_WARN_STRICT_PROTOTYPES = YES; 190 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 191 | CLANG_WARN_UNREACHABLE_CODE = YES; 192 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 193 | COPY_PHASE_STRIP = YES; 194 | ENABLE_NS_ASSERTIONS = NO; 195 | ENABLE_STRICT_OBJC_MSGSEND = YES; 196 | GCC_C_LANGUAGE_STANDARD = gnu99; 197 | GCC_NO_COMMON_BLOCKS = YES; 198 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 199 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 200 | GCC_WARN_UNDECLARED_SELECTOR = YES; 201 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 202 | GCC_WARN_UNUSED_FUNCTION = YES; 203 | GCC_WARN_UNUSED_VARIABLE = YES; 204 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 205 | MTL_ENABLE_DEBUG_INFO = NO; 206 | SDKROOT = iphoneos; 207 | VALIDATE_PRODUCT = YES; 208 | }; 209 | name = Release; 210 | }; 211 | 58B511F01A9E6C8500147676 /* Debug */ = { 212 | isa = XCBuildConfiguration; 213 | buildSettings = { 214 | HEADER_SEARCH_PATHS = ( 215 | "$(inherited)", 216 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 217 | "$(SRCROOT)/../../../React/**", 218 | "$(SRCROOT)/../../react-native/React/**", 219 | ); 220 | LIBRARY_SEARCH_PATHS = "$(inherited)"; 221 | OTHER_LDFLAGS = "-ObjC"; 222 | PRODUCT_NAME = ReactNativeCompressedJsbundle; 223 | SKIP_INSTALL = YES; 224 | }; 225 | name = Debug; 226 | }; 227 | 58B511F11A9E6C8500147676 /* Release */ = { 228 | isa = XCBuildConfiguration; 229 | buildSettings = { 230 | HEADER_SEARCH_PATHS = ( 231 | "$(inherited)", 232 | /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include, 233 | "$(SRCROOT)/../../../React/**", 234 | "$(SRCROOT)/../../react-native/React/**", 235 | ); 236 | LIBRARY_SEARCH_PATHS = "$(inherited)"; 237 | OTHER_LDFLAGS = "-ObjC"; 238 | PRODUCT_NAME = ReactNativeCompressedJsbundle; 239 | SKIP_INSTALL = YES; 240 | }; 241 | name = Release; 242 | }; 243 | /* End XCBuildConfiguration section */ 244 | 245 | /* Begin XCConfigurationList section */ 246 | 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "ReactNativeCompressedJsbundle" */ = { 247 | isa = XCConfigurationList; 248 | buildConfigurations = ( 249 | 58B511ED1A9E6C8500147676 /* Debug */, 250 | 58B511EE1A9E6C8500147676 /* Release */, 251 | ); 252 | defaultConfigurationIsVisible = 0; 253 | defaultConfigurationName = Release; 254 | }; 255 | 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "ReactNativeCompressedJsbundle" */ = { 256 | isa = XCConfigurationList; 257 | buildConfigurations = ( 258 | 58B511F01A9E6C8500147676 /* Debug */, 259 | 58B511F11A9E6C8500147676 /* Release */, 260 | ); 261 | defaultConfigurationIsVisible = 0; 262 | defaultConfigurationName = Release; 263 | }; 264 | /* End XCConfigurationList section */ 265 | }; 266 | rootObject = 58B511D31A9E6C8500147676 /* Project object */; 267 | } 268 | -------------------------------------------------------------------------------- /example/ios/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - boost-for-react-native (1.63.0) 3 | - DoubleConversion (1.1.6) 4 | - FBLazyVector (0.64.2) 5 | - FBReactNativeSpec (0.64.2): 6 | - RCT-Folly (= 2020.01.13.00) 7 | - RCTRequired (= 0.64.2) 8 | - RCTTypeSafety (= 0.64.2) 9 | - React-Core (= 0.64.2) 10 | - React-jsi (= 0.64.2) 11 | - ReactCommon/turbomodule/core (= 0.64.2) 12 | - glog (0.3.5) 13 | - hermes-engine (0.7.2) 14 | - libevent (2.1.12) 15 | - RCT-Folly (2020.01.13.00): 16 | - boost-for-react-native 17 | - DoubleConversion 18 | - glog 19 | - RCT-Folly/Default (= 2020.01.13.00) 20 | - RCT-Folly/Default (2020.01.13.00): 21 | - boost-for-react-native 22 | - DoubleConversion 23 | - glog 24 | - RCT-Folly/Futures (2020.01.13.00): 25 | - boost-for-react-native 26 | - DoubleConversion 27 | - glog 28 | - libevent 29 | - RCTRequired (0.64.2) 30 | - RCTTypeSafety (0.64.2): 31 | - FBLazyVector (= 0.64.2) 32 | - RCT-Folly (= 2020.01.13.00) 33 | - RCTRequired (= 0.64.2) 34 | - React-Core (= 0.64.2) 35 | - React (0.64.2): 36 | - React-Core (= 0.64.2) 37 | - React-Core/DevSupport (= 0.64.2) 38 | - React-Core/RCTWebSocket (= 0.64.2) 39 | - React-RCTActionSheet (= 0.64.2) 40 | - React-RCTAnimation (= 0.64.2) 41 | - React-RCTBlob (= 0.64.2) 42 | - React-RCTImage (= 0.64.2) 43 | - React-RCTLinking (= 0.64.2) 44 | - React-RCTNetwork (= 0.64.2) 45 | - React-RCTSettings (= 0.64.2) 46 | - React-RCTText (= 0.64.2) 47 | - React-RCTVibration (= 0.64.2) 48 | - React-callinvoker (0.64.2) 49 | - React-Core (0.64.2): 50 | - glog 51 | - RCT-Folly (= 2020.01.13.00) 52 | - React-Core/Default (= 0.64.2) 53 | - React-cxxreact (= 0.64.2) 54 | - React-jsi (= 0.64.2) 55 | - React-jsiexecutor (= 0.64.2) 56 | - React-perflogger (= 0.64.2) 57 | - Yoga 58 | - React-Core/CoreModulesHeaders (0.64.2): 59 | - glog 60 | - RCT-Folly (= 2020.01.13.00) 61 | - React-Core/Default 62 | - React-cxxreact (= 0.64.2) 63 | - React-jsi (= 0.64.2) 64 | - React-jsiexecutor (= 0.64.2) 65 | - React-perflogger (= 0.64.2) 66 | - Yoga 67 | - React-Core/Default (0.64.2): 68 | - glog 69 | - RCT-Folly (= 2020.01.13.00) 70 | - React-cxxreact (= 0.64.2) 71 | - React-jsi (= 0.64.2) 72 | - React-jsiexecutor (= 0.64.2) 73 | - React-perflogger (= 0.64.2) 74 | - Yoga 75 | - React-Core/DevSupport (0.64.2): 76 | - glog 77 | - RCT-Folly (= 2020.01.13.00) 78 | - React-Core/Default (= 0.64.2) 79 | - React-Core/RCTWebSocket (= 0.64.2) 80 | - React-cxxreact (= 0.64.2) 81 | - React-jsi (= 0.64.2) 82 | - React-jsiexecutor (= 0.64.2) 83 | - React-jsinspector (= 0.64.2) 84 | - React-perflogger (= 0.64.2) 85 | - Yoga 86 | - React-Core/Hermes (0.64.2): 87 | - glog 88 | - hermes-engine 89 | - RCT-Folly (= 2020.01.13.00) 90 | - RCT-Folly/Futures 91 | - React-cxxreact (= 0.64.2) 92 | - React-jsi (= 0.64.2) 93 | - React-jsiexecutor (= 0.64.2) 94 | - React-perflogger (= 0.64.2) 95 | - Yoga 96 | - React-Core/RCTActionSheetHeaders (0.64.2): 97 | - glog 98 | - RCT-Folly (= 2020.01.13.00) 99 | - React-Core/Default 100 | - React-cxxreact (= 0.64.2) 101 | - React-jsi (= 0.64.2) 102 | - React-jsiexecutor (= 0.64.2) 103 | - React-perflogger (= 0.64.2) 104 | - Yoga 105 | - React-Core/RCTAnimationHeaders (0.64.2): 106 | - glog 107 | - RCT-Folly (= 2020.01.13.00) 108 | - React-Core/Default 109 | - React-cxxreact (= 0.64.2) 110 | - React-jsi (= 0.64.2) 111 | - React-jsiexecutor (= 0.64.2) 112 | - React-perflogger (= 0.64.2) 113 | - Yoga 114 | - React-Core/RCTBlobHeaders (0.64.2): 115 | - glog 116 | - RCT-Folly (= 2020.01.13.00) 117 | - React-Core/Default 118 | - React-cxxreact (= 0.64.2) 119 | - React-jsi (= 0.64.2) 120 | - React-jsiexecutor (= 0.64.2) 121 | - React-perflogger (= 0.64.2) 122 | - Yoga 123 | - React-Core/RCTImageHeaders (0.64.2): 124 | - glog 125 | - RCT-Folly (= 2020.01.13.00) 126 | - React-Core/Default 127 | - React-cxxreact (= 0.64.2) 128 | - React-jsi (= 0.64.2) 129 | - React-jsiexecutor (= 0.64.2) 130 | - React-perflogger (= 0.64.2) 131 | - Yoga 132 | - React-Core/RCTLinkingHeaders (0.64.2): 133 | - glog 134 | - RCT-Folly (= 2020.01.13.00) 135 | - React-Core/Default 136 | - React-cxxreact (= 0.64.2) 137 | - React-jsi (= 0.64.2) 138 | - React-jsiexecutor (= 0.64.2) 139 | - React-perflogger (= 0.64.2) 140 | - Yoga 141 | - React-Core/RCTNetworkHeaders (0.64.2): 142 | - glog 143 | - RCT-Folly (= 2020.01.13.00) 144 | - React-Core/Default 145 | - React-cxxreact (= 0.64.2) 146 | - React-jsi (= 0.64.2) 147 | - React-jsiexecutor (= 0.64.2) 148 | - React-perflogger (= 0.64.2) 149 | - Yoga 150 | - React-Core/RCTSettingsHeaders (0.64.2): 151 | - glog 152 | - RCT-Folly (= 2020.01.13.00) 153 | - React-Core/Default 154 | - React-cxxreact (= 0.64.2) 155 | - React-jsi (= 0.64.2) 156 | - React-jsiexecutor (= 0.64.2) 157 | - React-perflogger (= 0.64.2) 158 | - Yoga 159 | - React-Core/RCTTextHeaders (0.64.2): 160 | - glog 161 | - RCT-Folly (= 2020.01.13.00) 162 | - React-Core/Default 163 | - React-cxxreact (= 0.64.2) 164 | - React-jsi (= 0.64.2) 165 | - React-jsiexecutor (= 0.64.2) 166 | - React-perflogger (= 0.64.2) 167 | - Yoga 168 | - React-Core/RCTVibrationHeaders (0.64.2): 169 | - glog 170 | - RCT-Folly (= 2020.01.13.00) 171 | - React-Core/Default 172 | - React-cxxreact (= 0.64.2) 173 | - React-jsi (= 0.64.2) 174 | - React-jsiexecutor (= 0.64.2) 175 | - React-perflogger (= 0.64.2) 176 | - Yoga 177 | - React-Core/RCTWebSocket (0.64.2): 178 | - glog 179 | - RCT-Folly (= 2020.01.13.00) 180 | - React-Core/Default (= 0.64.2) 181 | - React-cxxreact (= 0.64.2) 182 | - React-jsi (= 0.64.2) 183 | - React-jsiexecutor (= 0.64.2) 184 | - React-perflogger (= 0.64.2) 185 | - Yoga 186 | - React-CoreModules (0.64.2): 187 | - FBReactNativeSpec (= 0.64.2) 188 | - RCT-Folly (= 2020.01.13.00) 189 | - RCTTypeSafety (= 0.64.2) 190 | - React-Core/CoreModulesHeaders (= 0.64.2) 191 | - React-jsi (= 0.64.2) 192 | - React-RCTImage (= 0.64.2) 193 | - ReactCommon/turbomodule/core (= 0.64.2) 194 | - React-cxxreact (0.64.2): 195 | - boost-for-react-native (= 1.63.0) 196 | - DoubleConversion 197 | - glog 198 | - RCT-Folly (= 2020.01.13.00) 199 | - React-callinvoker (= 0.64.2) 200 | - React-jsi (= 0.64.2) 201 | - React-jsinspector (= 0.64.2) 202 | - React-perflogger (= 0.64.2) 203 | - React-runtimeexecutor (= 0.64.2) 204 | - React-jsi (0.64.2): 205 | - boost-for-react-native (= 1.63.0) 206 | - DoubleConversion 207 | - glog 208 | - RCT-Folly (= 2020.01.13.00) 209 | - React-jsi/Default (= 0.64.2) 210 | - React-jsi/Default (0.64.2): 211 | - boost-for-react-native (= 1.63.0) 212 | - DoubleConversion 213 | - glog 214 | - RCT-Folly (= 2020.01.13.00) 215 | - React-jsiexecutor (0.64.2): 216 | - DoubleConversion 217 | - glog 218 | - RCT-Folly (= 2020.01.13.00) 219 | - React-cxxreact (= 0.64.2) 220 | - React-jsi (= 0.64.2) 221 | - React-perflogger (= 0.64.2) 222 | - React-jsinspector (0.64.2) 223 | - react-native-compressed-jsbundle (0.1.2): 224 | - React-Core 225 | - React-perflogger (0.64.2) 226 | - React-RCTActionSheet (0.64.2): 227 | - React-Core/RCTActionSheetHeaders (= 0.64.2) 228 | - React-RCTAnimation (0.64.2): 229 | - FBReactNativeSpec (= 0.64.2) 230 | - RCT-Folly (= 2020.01.13.00) 231 | - RCTTypeSafety (= 0.64.2) 232 | - React-Core/RCTAnimationHeaders (= 0.64.2) 233 | - React-jsi (= 0.64.2) 234 | - ReactCommon/turbomodule/core (= 0.64.2) 235 | - React-RCTBlob (0.64.2): 236 | - FBReactNativeSpec (= 0.64.2) 237 | - RCT-Folly (= 2020.01.13.00) 238 | - React-Core/RCTBlobHeaders (= 0.64.2) 239 | - React-Core/RCTWebSocket (= 0.64.2) 240 | - React-jsi (= 0.64.2) 241 | - React-RCTNetwork (= 0.64.2) 242 | - ReactCommon/turbomodule/core (= 0.64.2) 243 | - React-RCTImage (0.64.2): 244 | - FBReactNativeSpec (= 0.64.2) 245 | - RCT-Folly (= 2020.01.13.00) 246 | - RCTTypeSafety (= 0.64.2) 247 | - React-Core/RCTImageHeaders (= 0.64.2) 248 | - React-jsi (= 0.64.2) 249 | - React-RCTNetwork (= 0.64.2) 250 | - ReactCommon/turbomodule/core (= 0.64.2) 251 | - React-RCTLinking (0.64.2): 252 | - FBReactNativeSpec (= 0.64.2) 253 | - React-Core/RCTLinkingHeaders (= 0.64.2) 254 | - React-jsi (= 0.64.2) 255 | - ReactCommon/turbomodule/core (= 0.64.2) 256 | - React-RCTNetwork (0.64.2): 257 | - FBReactNativeSpec (= 0.64.2) 258 | - RCT-Folly (= 2020.01.13.00) 259 | - RCTTypeSafety (= 0.64.2) 260 | - React-Core/RCTNetworkHeaders (= 0.64.2) 261 | - React-jsi (= 0.64.2) 262 | - ReactCommon/turbomodule/core (= 0.64.2) 263 | - React-RCTSettings (0.64.2): 264 | - FBReactNativeSpec (= 0.64.2) 265 | - RCT-Folly (= 2020.01.13.00) 266 | - RCTTypeSafety (= 0.64.2) 267 | - React-Core/RCTSettingsHeaders (= 0.64.2) 268 | - React-jsi (= 0.64.2) 269 | - ReactCommon/turbomodule/core (= 0.64.2) 270 | - React-RCTText (0.64.2): 271 | - React-Core/RCTTextHeaders (= 0.64.2) 272 | - React-RCTVibration (0.64.2): 273 | - FBReactNativeSpec (= 0.64.2) 274 | - RCT-Folly (= 2020.01.13.00) 275 | - React-Core/RCTVibrationHeaders (= 0.64.2) 276 | - React-jsi (= 0.64.2) 277 | - ReactCommon/turbomodule/core (= 0.64.2) 278 | - React-runtimeexecutor (0.64.2): 279 | - React-jsi (= 0.64.2) 280 | - ReactCommon/turbomodule/core (0.64.2): 281 | - DoubleConversion 282 | - glog 283 | - RCT-Folly (= 2020.01.13.00) 284 | - React-callinvoker (= 0.64.2) 285 | - React-Core (= 0.64.2) 286 | - React-cxxreact (= 0.64.2) 287 | - React-jsi (= 0.64.2) 288 | - React-perflogger (= 0.64.2) 289 | - Yoga (1.14.0) 290 | 291 | DEPENDENCIES: 292 | - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) 293 | - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) 294 | - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) 295 | - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) 296 | - hermes-engine (~> 0.7.2) 297 | - libevent (~> 2.1.12) 298 | - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) 299 | - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) 300 | - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) 301 | - React (from `../node_modules/react-native/`) 302 | - React-callinvoker (from `../node_modules/react-native/ReactCommon/callinvoker`) 303 | - React-Core (from `../node_modules/react-native/`) 304 | - React-Core/DevSupport (from `../node_modules/react-native/`) 305 | - React-Core/Hermes (from `../node_modules/react-native/`) 306 | - React-Core/RCTWebSocket (from `../node_modules/react-native/`) 307 | - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) 308 | - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) 309 | - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) 310 | - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) 311 | - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) 312 | - react-native-compressed-jsbundle (from `../..`) 313 | - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) 314 | - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) 315 | - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) 316 | - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) 317 | - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) 318 | - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) 319 | - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) 320 | - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) 321 | - React-RCTText (from `../node_modules/react-native/Libraries/Text`) 322 | - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) 323 | - React-runtimeexecutor (from `../node_modules/react-native/ReactCommon/runtimeexecutor`) 324 | - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) 325 | - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) 326 | 327 | SPEC REPOS: 328 | trunk: 329 | - boost-for-react-native 330 | - hermes-engine 331 | - libevent 332 | 333 | EXTERNAL SOURCES: 334 | DoubleConversion: 335 | :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" 336 | FBLazyVector: 337 | :path: "../node_modules/react-native/Libraries/FBLazyVector" 338 | FBReactNativeSpec: 339 | :path: "../node_modules/react-native/React/FBReactNativeSpec" 340 | glog: 341 | :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" 342 | RCT-Folly: 343 | :podspec: "../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec" 344 | RCTRequired: 345 | :path: "../node_modules/react-native/Libraries/RCTRequired" 346 | RCTTypeSafety: 347 | :path: "../node_modules/react-native/Libraries/TypeSafety" 348 | React: 349 | :path: "../node_modules/react-native/" 350 | React-callinvoker: 351 | :path: "../node_modules/react-native/ReactCommon/callinvoker" 352 | React-Core: 353 | :path: "../node_modules/react-native/" 354 | React-CoreModules: 355 | :path: "../node_modules/react-native/React/CoreModules" 356 | React-cxxreact: 357 | :path: "../node_modules/react-native/ReactCommon/cxxreact" 358 | React-jsi: 359 | :path: "../node_modules/react-native/ReactCommon/jsi" 360 | React-jsiexecutor: 361 | :path: "../node_modules/react-native/ReactCommon/jsiexecutor" 362 | React-jsinspector: 363 | :path: "../node_modules/react-native/ReactCommon/jsinspector" 364 | react-native-compressed-jsbundle: 365 | :path: "../.." 366 | React-perflogger: 367 | :path: "../node_modules/react-native/ReactCommon/reactperflogger" 368 | React-RCTActionSheet: 369 | :path: "../node_modules/react-native/Libraries/ActionSheetIOS" 370 | React-RCTAnimation: 371 | :path: "../node_modules/react-native/Libraries/NativeAnimation" 372 | React-RCTBlob: 373 | :path: "../node_modules/react-native/Libraries/Blob" 374 | React-RCTImage: 375 | :path: "../node_modules/react-native/Libraries/Image" 376 | React-RCTLinking: 377 | :path: "../node_modules/react-native/Libraries/LinkingIOS" 378 | React-RCTNetwork: 379 | :path: "../node_modules/react-native/Libraries/Network" 380 | React-RCTSettings: 381 | :path: "../node_modules/react-native/Libraries/Settings" 382 | React-RCTText: 383 | :path: "../node_modules/react-native/Libraries/Text" 384 | React-RCTVibration: 385 | :path: "../node_modules/react-native/Libraries/Vibration" 386 | React-runtimeexecutor: 387 | :path: "../node_modules/react-native/ReactCommon/runtimeexecutor" 388 | ReactCommon: 389 | :path: "../node_modules/react-native/ReactCommon" 390 | Yoga: 391 | :path: "../node_modules/react-native/ReactCommon/yoga" 392 | 393 | SPEC CHECKSUMS: 394 | boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c 395 | DoubleConversion: cf9b38bf0b2d048436d9a82ad2abe1404f11e7de 396 | FBLazyVector: e686045572151edef46010a6f819ade377dfeb4b 397 | FBReactNativeSpec: 347df4ffe3f2f8cd5a5892fab7d8303a9c92efad 398 | glog: 73c2498ac6884b13ede40eda8228cb1eee9d9d62 399 | hermes-engine: 7d97ba46a1e29bacf3e3c61ecb2804a5ddd02d4f 400 | libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 401 | RCT-Folly: ec7a233ccc97cc556cf7237f0db1ff65b986f27c 402 | RCTRequired: 6d3e854f0e7260a648badd0d44fc364bc9da9728 403 | RCTTypeSafety: c1f31d19349c6b53085766359caac425926fafaa 404 | React: bda6b6d7ae912de97d7a61aa5c160db24aa2ad69 405 | React-callinvoker: 9840ea7e8e88ed73d438edb725574820b29b5baa 406 | React-Core: b5e385da7ce5f16a220fc60fd0749eae2c6120f0 407 | React-CoreModules: 17071a4e2c5239b01585f4aa8070141168ab298f 408 | React-cxxreact: 9be7b6340ed9f7c53e53deca7779f07cd66525ba 409 | React-jsi: 67747b9722f6dab2ffe15b011bcf6b3f2c3f1427 410 | React-jsiexecutor: 80c46bd381fd06e418e0d4f53672dc1d1945c4c3 411 | React-jsinspector: cc614ec18a9ca96fd275100c16d74d62ee11f0ae 412 | react-native-compressed-jsbundle: 8a6e92ecce4e40ecceee9dbd89eda083d4a4a027 413 | React-perflogger: 25373e382fed75ce768a443822f07098a15ab737 414 | React-RCTActionSheet: af7796ba49ffe4ca92e7277a5d992d37203f7da5 415 | React-RCTAnimation: 6a2e76ab50c6f25b428d81b76a5a45351c4d77aa 416 | React-RCTBlob: 02a2887023e0eed99391b6445b2e23a2a6f9226d 417 | React-RCTImage: ce5bf8e7438f2286d9b646a05d6ab11f38b0323d 418 | React-RCTLinking: ccd20742de14e020cb5f99d5c7e0bf0383aefbd9 419 | React-RCTNetwork: dfb9d089ab0753e5e5f55fc4b1210858f7245647 420 | React-RCTSettings: b14aef2d83699e48b410fb7c3ba5b66cd3291ae2 421 | React-RCTText: 41a2e952dd9adc5caf6fb68ed46b275194d5da5f 422 | React-RCTVibration: 24600e3b1aaa77126989bc58b6747509a1ba14f3 423 | React-runtimeexecutor: a9904c6d0218fb9f8b19d6dd88607225927668f9 424 | ReactCommon: 149906e01aa51142707a10665185db879898e966 425 | Yoga: 575c581c63e0d35c9a83f4b46d01d63abc1100ac 426 | 427 | PODFILE CHECKSUM: 37e8e83d9496b9c85ebf7c021295adc3976998c5 428 | 429 | COCOAPODS: 1.11.2 430 | -------------------------------------------------------------------------------- /example/ios/Example.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 52; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 20ECAEA422EE7FAE8143FC44 /* libPods-Example-Hermes.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 2C29018F5A18D7FA9CE39695 /* libPods-Example-Hermes.a */; }; 11 | AAE1998F8217D79547251D46 /* libPods-Example.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C347A399DDF3880A871882FC /* libPods-Example.a */; }; 12 | B16B91B626F4CE0000CD1A96 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B182E10C26ECB12E00F1BE00 /* AppDelegate.m */; }; 13 | B16B91B726F4CE0000CD1A96 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = B182E10A26ECB12E00F1BE00 /* main.m */; }; 14 | B16B91BB26F4CE0000CD1A96 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B182E10826ECB12E00F1BE00 /* LaunchScreen.storyboard */; }; 15 | B16B91BC26F4CE0000CD1A96 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B182E10B26ECB12E00F1BE00 /* Images.xcassets */; }; 16 | B16B924226F4DE0100CD1A96 /* Smoketests.m in Sources */ = {isa = PBXBuildFile; fileRef = B16B924126F4DE0100CD1A96 /* Smoketests.m */; }; 17 | B16B925D26F4E11A00CD1A96 /* Smoketests.m in Sources */ = {isa = PBXBuildFile; fileRef = B16B924126F4DE0100CD1A96 /* Smoketests.m */; }; 18 | B182E10E26ECB12E00F1BE00 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = B182E10826ECB12E00F1BE00 /* LaunchScreen.storyboard */; }; 19 | B182E10F26ECB12E00F1BE00 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = B182E10A26ECB12E00F1BE00 /* main.m */; }; 20 | B182E11026ECB12E00F1BE00 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = B182E10B26ECB12E00F1BE00 /* Images.xcassets */; }; 21 | B182E11126ECB12E00F1BE00 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = B182E10C26ECB12E00F1BE00 /* AppDelegate.m */; }; 22 | /* End PBXBuildFile section */ 23 | 24 | /* Begin PBXContainerItemProxy section */ 25 | B16B925226F4E11500CD1A96 /* PBXContainerItemProxy */ = { 26 | isa = PBXContainerItemProxy; 27 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; 28 | proxyType = 1; 29 | remoteGlobalIDString = 13B07F861A680F5B00A75B9A; 30 | remoteInfo = Example; 31 | }; 32 | B16B925926F4E11A00CD1A96 /* PBXContainerItemProxy */ = { 33 | isa = PBXContainerItemProxy; 34 | containerPortal = 83CBB9F71A601CBA00E9B192 /* Project object */; 35 | proxyType = 1; 36 | remoteGlobalIDString = B16B91B226F4CE0000CD1A96; 37 | remoteInfo = "Example-Hermes"; 38 | }; 39 | /* End PBXContainerItemProxy section */ 40 | 41 | /* Begin PBXFileReference section */ 42 | 13B07F961A680F5B00A75B9A /* Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | 2C29018F5A18D7FA9CE39695 /* libPods-Example-Hermes.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Example-Hermes.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 44 | 3113BFA25090EBFF6CA438D5 /* Pods-Example-Hermes.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example-Hermes.release.xcconfig"; path = "Target Support Files/Pods-Example-Hermes/Pods-Example-Hermes.release.xcconfig"; sourceTree = ""; }; 45 | 67DF98A7D1310276269B23B0 /* Pods-Example-Hermes.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example-Hermes.debug.xcconfig"; path = "Target Support Files/Pods-Example-Hermes/Pods-Example-Hermes.debug.xcconfig"; sourceTree = ""; }; 46 | AD975EFB4D07DB5A1D3A40B3 /* Pods-Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.release.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.release.xcconfig"; sourceTree = ""; }; 47 | B16B91C226F4CE0000CD1A96 /* Example-Hermes.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Example-Hermes.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 48 | B16B91C326F4CE0000CD1A96 /* Example-Hermes-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Example-Hermes-Info.plist"; path = "/Users/imo/Documents/code/ivanmoskalev/react-native-compressed-jsbundle/example/ios/Example-Hermes-Info.plist"; sourceTree = ""; }; 49 | B16B923F26F4DE0100CD1A96 /* Smoketests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Smoketests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 50 | B16B924126F4DE0100CD1A96 /* Smoketests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = Smoketests.m; sourceTree = ""; }; 51 | B16B924326F4DE0100CD1A96 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 52 | B16B926326F4E11A00CD1A96 /* Smoketests-Hermes.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "Smoketests-Hermes.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; 53 | B16B926426F4E11A00CD1A96 /* Smoketests-Hermes-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "Smoketests-Hermes-Info.plist"; path = "/Users/imo/Documents/code/ivanmoskalev/react-native-compressed-jsbundle/example/ios/Smoketests-Hermes-Info.plist"; sourceTree = ""; }; 54 | B182E10826ECB12E00F1BE00 /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = LaunchScreen.storyboard; sourceTree = ""; }; 55 | B182E10926ECB12E00F1BE00 /* AppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 56 | B182E10A26ECB12E00F1BE00 /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 57 | B182E10B26ECB12E00F1BE00 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 58 | B182E10C26ECB12E00F1BE00 /* AppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 59 | B182E10D26ECB12E00F1BE00 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 60 | C347A399DDF3880A871882FC /* libPods-Example.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-Example.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 61 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = System/Library/Frameworks/JavaScriptCore.framework; sourceTree = SDKROOT; }; 62 | ED2971642150620600B7C4FE /* JavaScriptCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = JavaScriptCore.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS12.0.sdk/System/Library/Frameworks/JavaScriptCore.framework; sourceTree = DEVELOPER_DIR; }; 63 | F6E0998B7E3DC13416846B22 /* Pods-Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Example.debug.xcconfig"; path = "Target Support Files/Pods-Example/Pods-Example.debug.xcconfig"; sourceTree = ""; }; 64 | /* End PBXFileReference section */ 65 | 66 | /* Begin PBXFrameworksBuildPhase section */ 67 | 13B07F8C1A680F5B00A75B9A /* Frameworks */ = { 68 | isa = PBXFrameworksBuildPhase; 69 | buildActionMask = 2147483647; 70 | files = ( 71 | AAE1998F8217D79547251D46 /* libPods-Example.a in Frameworks */, 72 | ); 73 | runOnlyForDeploymentPostprocessing = 0; 74 | }; 75 | B16B91B826F4CE0000CD1A96 /* Frameworks */ = { 76 | isa = PBXFrameworksBuildPhase; 77 | buildActionMask = 2147483647; 78 | files = ( 79 | 20ECAEA422EE7FAE8143FC44 /* libPods-Example-Hermes.a in Frameworks */, 80 | ); 81 | runOnlyForDeploymentPostprocessing = 0; 82 | }; 83 | B16B923C26F4DE0100CD1A96 /* Frameworks */ = { 84 | isa = PBXFrameworksBuildPhase; 85 | buildActionMask = 2147483647; 86 | files = ( 87 | ); 88 | runOnlyForDeploymentPostprocessing = 0; 89 | }; 90 | B16B925E26F4E11A00CD1A96 /* Frameworks */ = { 91 | isa = PBXFrameworksBuildPhase; 92 | buildActionMask = 2147483647; 93 | files = ( 94 | ); 95 | runOnlyForDeploymentPostprocessing = 0; 96 | }; 97 | /* End PBXFrameworksBuildPhase section */ 98 | 99 | /* Begin PBXGroup section */ 100 | 2D16E6871FA4F8E400B85C8A /* Frameworks */ = { 101 | isa = PBXGroup; 102 | children = ( 103 | ED297162215061F000B7C4FE /* JavaScriptCore.framework */, 104 | ED2971642150620600B7C4FE /* JavaScriptCore.framework */, 105 | C347A399DDF3880A871882FC /* libPods-Example.a */, 106 | 2C29018F5A18D7FA9CE39695 /* libPods-Example-Hermes.a */, 107 | ); 108 | name = Frameworks; 109 | sourceTree = ""; 110 | }; 111 | 6B9684456A2045ADE5A6E47E /* Pods */ = { 112 | isa = PBXGroup; 113 | children = ( 114 | F6E0998B7E3DC13416846B22 /* Pods-Example.debug.xcconfig */, 115 | AD975EFB4D07DB5A1D3A40B3 /* Pods-Example.release.xcconfig */, 116 | 67DF98A7D1310276269B23B0 /* Pods-Example-Hermes.debug.xcconfig */, 117 | 3113BFA25090EBFF6CA438D5 /* Pods-Example-Hermes.release.xcconfig */, 118 | ); 119 | path = Pods; 120 | sourceTree = ""; 121 | }; 122 | 832341AE1AAA6A7D00B99B32 /* Libraries */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | ); 126 | name = Libraries; 127 | sourceTree = ""; 128 | }; 129 | 83CBB9F61A601CBA00E9B192 = { 130 | isa = PBXGroup; 131 | children = ( 132 | B182E10726ECB12E00F1BE00 /* Example */, 133 | 832341AE1AAA6A7D00B99B32 /* Libraries */, 134 | B16B924026F4DE0100CD1A96 /* Smoketests */, 135 | 83CBBA001A601CBA00E9B192 /* Products */, 136 | 2D16E6871FA4F8E400B85C8A /* Frameworks */, 137 | 6B9684456A2045ADE5A6E47E /* Pods */, 138 | B16B91C326F4CE0000CD1A96 /* Example-Hermes-Info.plist */, 139 | B16B926426F4E11A00CD1A96 /* Smoketests-Hermes-Info.plist */, 140 | ); 141 | indentWidth = 2; 142 | sourceTree = ""; 143 | tabWidth = 2; 144 | usesTabs = 0; 145 | }; 146 | 83CBBA001A601CBA00E9B192 /* Products */ = { 147 | isa = PBXGroup; 148 | children = ( 149 | 13B07F961A680F5B00A75B9A /* Example.app */, 150 | B16B91C226F4CE0000CD1A96 /* Example-Hermes.app */, 151 | B16B923F26F4DE0100CD1A96 /* Smoketests.xctest */, 152 | B16B926326F4E11A00CD1A96 /* Smoketests-Hermes.xctest */, 153 | ); 154 | name = Products; 155 | sourceTree = ""; 156 | }; 157 | B16B924026F4DE0100CD1A96 /* Smoketests */ = { 158 | isa = PBXGroup; 159 | children = ( 160 | B16B924126F4DE0100CD1A96 /* Smoketests.m */, 161 | B16B924326F4DE0100CD1A96 /* Info.plist */, 162 | ); 163 | path = Smoketests; 164 | sourceTree = ""; 165 | }; 166 | B182E10726ECB12E00F1BE00 /* Example */ = { 167 | isa = PBXGroup; 168 | children = ( 169 | B182E10826ECB12E00F1BE00 /* LaunchScreen.storyboard */, 170 | B182E10926ECB12E00F1BE00 /* AppDelegate.h */, 171 | B182E10C26ECB12E00F1BE00 /* AppDelegate.m */, 172 | B182E10A26ECB12E00F1BE00 /* main.m */, 173 | B182E10B26ECB12E00F1BE00 /* Images.xcassets */, 174 | B182E10D26ECB12E00F1BE00 /* Info.plist */, 175 | ); 176 | path = Example; 177 | sourceTree = ""; 178 | }; 179 | /* End PBXGroup section */ 180 | 181 | /* Begin PBXNativeTarget section */ 182 | 13B07F861A680F5B00A75B9A /* Example */ = { 183 | isa = PBXNativeTarget; 184 | buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Example" */; 185 | buildPhases = ( 186 | 121D152E2B3E537BF1D0E41E /* [CP] Check Pods Manifest.lock */, 187 | 13B07F871A680F5B00A75B9A /* Sources */, 188 | 13B07F8C1A680F5B00A75B9A /* Frameworks */, 189 | 13B07F8E1A680F5B00A75B9A /* Resources */, 190 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, 191 | 8D9D924791838F4FE1D97F63 /* [CP] Copy Pods Resources */, 192 | ); 193 | buildRules = ( 194 | ); 195 | dependencies = ( 196 | ); 197 | name = Example; 198 | productName = ReactNativeCompressedJsbundleExample; 199 | productReference = 13B07F961A680F5B00A75B9A /* Example.app */; 200 | productType = "com.apple.product-type.application"; 201 | }; 202 | B16B91B226F4CE0000CD1A96 /* Example-Hermes */ = { 203 | isa = PBXNativeTarget; 204 | buildConfigurationList = B16B91BF26F4CE0000CD1A96 /* Build configuration list for PBXNativeTarget "Example-Hermes" */; 205 | buildPhases = ( 206 | 9807412D5D17F47EB2D42FD8 /* [CP] Check Pods Manifest.lock */, 207 | B16B91B526F4CE0000CD1A96 /* Sources */, 208 | B16B91B826F4CE0000CD1A96 /* Frameworks */, 209 | B16B91BA26F4CE0000CD1A96 /* Resources */, 210 | B16B91BD26F4CE0000CD1A96 /* Bundle React Native code and images */, 211 | B0D0EDBF460EF78256E951D6 /* [CP] Embed Pods Frameworks */, 212 | 8AABDBE646CE23A7C0348A21 /* [CP] Copy Pods Resources */, 213 | ); 214 | buildRules = ( 215 | ); 216 | dependencies = ( 217 | ); 218 | name = "Example-Hermes"; 219 | productName = ReactNativeCompressedJsbundleExample; 220 | productReference = B16B91C226F4CE0000CD1A96 /* Example-Hermes.app */; 221 | productType = "com.apple.product-type.application"; 222 | }; 223 | B16B923E26F4DE0100CD1A96 /* Smoketests */ = { 224 | isa = PBXNativeTarget; 225 | buildConfigurationList = B16B924626F4DE0100CD1A96 /* Build configuration list for PBXNativeTarget "Smoketests" */; 226 | buildPhases = ( 227 | B16B923B26F4DE0100CD1A96 /* Sources */, 228 | B16B923C26F4DE0100CD1A96 /* Frameworks */, 229 | B16B923D26F4DE0100CD1A96 /* Resources */, 230 | ); 231 | buildRules = ( 232 | ); 233 | dependencies = ( 234 | B16B925326F4E11500CD1A96 /* PBXTargetDependency */, 235 | ); 236 | name = Smoketests; 237 | productName = Smoketests; 238 | productReference = B16B923F26F4DE0100CD1A96 /* Smoketests.xctest */; 239 | productType = "com.apple.product-type.bundle.ui-testing"; 240 | }; 241 | B16B925726F4E11A00CD1A96 /* Smoketests-Hermes */ = { 242 | isa = PBXNativeTarget; 243 | buildConfigurationList = B16B926026F4E11A00CD1A96 /* Build configuration list for PBXNativeTarget "Smoketests-Hermes" */; 244 | buildPhases = ( 245 | B16B925C26F4E11A00CD1A96 /* Sources */, 246 | B16B925E26F4E11A00CD1A96 /* Frameworks */, 247 | B16B925F26F4E11A00CD1A96 /* Resources */, 248 | ); 249 | buildRules = ( 250 | ); 251 | dependencies = ( 252 | B16B925826F4E11A00CD1A96 /* PBXTargetDependency */, 253 | ); 254 | name = "Smoketests-Hermes"; 255 | productName = Smoketests; 256 | productReference = B16B926326F4E11A00CD1A96 /* Smoketests-Hermes.xctest */; 257 | productType = "com.apple.product-type.bundle.ui-testing"; 258 | }; 259 | /* End PBXNativeTarget section */ 260 | 261 | /* Begin PBXProject section */ 262 | 83CBB9F71A601CBA00E9B192 /* Project object */ = { 263 | isa = PBXProject; 264 | attributes = { 265 | LastUpgradeCheck = 1130; 266 | TargetAttributes = { 267 | 13B07F861A680F5B00A75B9A = { 268 | LastSwiftMigration = 1120; 269 | }; 270 | B16B923E26F4DE0100CD1A96 = { 271 | CreatedOnToolsVersion = 12.4; 272 | TestTargetID = 13B07F861A680F5B00A75B9A; 273 | }; 274 | B16B925726F4E11A00CD1A96 = { 275 | TestTargetID = B16B91B226F4CE0000CD1A96; 276 | }; 277 | }; 278 | }; 279 | buildConfigurationList = 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Example" */; 280 | compatibilityVersion = "Xcode 3.2"; 281 | developmentRegion = en; 282 | hasScannedForEncodings = 0; 283 | knownRegions = ( 284 | en, 285 | Base, 286 | ); 287 | mainGroup = 83CBB9F61A601CBA00E9B192; 288 | productRefGroup = 83CBBA001A601CBA00E9B192 /* Products */; 289 | projectDirPath = ""; 290 | projectRoot = ""; 291 | targets = ( 292 | 13B07F861A680F5B00A75B9A /* Example */, 293 | B16B91B226F4CE0000CD1A96 /* Example-Hermes */, 294 | B16B923E26F4DE0100CD1A96 /* Smoketests */, 295 | B16B925726F4E11A00CD1A96 /* Smoketests-Hermes */, 296 | ); 297 | }; 298 | /* End PBXProject section */ 299 | 300 | /* Begin PBXResourcesBuildPhase section */ 301 | 13B07F8E1A680F5B00A75B9A /* Resources */ = { 302 | isa = PBXResourcesBuildPhase; 303 | buildActionMask = 2147483647; 304 | files = ( 305 | B182E10E26ECB12E00F1BE00 /* LaunchScreen.storyboard in Resources */, 306 | B182E11026ECB12E00F1BE00 /* Images.xcassets in Resources */, 307 | ); 308 | runOnlyForDeploymentPostprocessing = 0; 309 | }; 310 | B16B91BA26F4CE0000CD1A96 /* Resources */ = { 311 | isa = PBXResourcesBuildPhase; 312 | buildActionMask = 2147483647; 313 | files = ( 314 | B16B91BB26F4CE0000CD1A96 /* LaunchScreen.storyboard in Resources */, 315 | B16B91BC26F4CE0000CD1A96 /* Images.xcassets in Resources */, 316 | ); 317 | runOnlyForDeploymentPostprocessing = 0; 318 | }; 319 | B16B923D26F4DE0100CD1A96 /* Resources */ = { 320 | isa = PBXResourcesBuildPhase; 321 | buildActionMask = 2147483647; 322 | files = ( 323 | ); 324 | runOnlyForDeploymentPostprocessing = 0; 325 | }; 326 | B16B925F26F4E11A00CD1A96 /* Resources */ = { 327 | isa = PBXResourcesBuildPhase; 328 | buildActionMask = 2147483647; 329 | files = ( 330 | ); 331 | runOnlyForDeploymentPostprocessing = 0; 332 | }; 333 | /* End PBXResourcesBuildPhase section */ 334 | 335 | /* Begin PBXShellScriptBuildPhase section */ 336 | 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */ = { 337 | isa = PBXShellScriptBuildPhase; 338 | buildActionMask = 2147483647; 339 | files = ( 340 | ); 341 | inputPaths = ( 342 | ); 343 | name = "Bundle React Native code and images"; 344 | outputPaths = ( 345 | ); 346 | runOnlyForDeploymentPostprocessing = 0; 347 | shellPath = /bin/sh; 348 | shellScript = "export NODE_BINARY=node\nexport FORCE_BUNDLING=true\n\n../node_modules/react-native/scripts/react-native-xcode.sh\n../node_modules/react-native-compressed-jsbundle/tool/compress-xcode.sh\n"; 349 | }; 350 | 121D152E2B3E537BF1D0E41E /* [CP] Check Pods Manifest.lock */ = { 351 | isa = PBXShellScriptBuildPhase; 352 | buildActionMask = 2147483647; 353 | files = ( 354 | ); 355 | inputFileListPaths = ( 356 | ); 357 | inputPaths = ( 358 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 359 | "${PODS_ROOT}/Manifest.lock", 360 | ); 361 | name = "[CP] Check Pods Manifest.lock"; 362 | outputFileListPaths = ( 363 | ); 364 | outputPaths = ( 365 | "$(DERIVED_FILE_DIR)/Pods-Example-checkManifestLockResult.txt", 366 | ); 367 | runOnlyForDeploymentPostprocessing = 0; 368 | shellPath = /bin/sh; 369 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 370 | showEnvVarsInLog = 0; 371 | }; 372 | 8AABDBE646CE23A7C0348A21 /* [CP] Copy Pods Resources */ = { 373 | isa = PBXShellScriptBuildPhase; 374 | buildActionMask = 2147483647; 375 | files = ( 376 | ); 377 | inputPaths = ( 378 | "${PODS_ROOT}/Target Support Files/Pods-Example-Hermes/Pods-Example-Hermes-resources.sh", 379 | "${PODS_CONFIGURATION_BUILD_DIR}/React-Core.common-Hermes/AccessibilityResources.bundle", 380 | ); 381 | name = "[CP] Copy Pods Resources"; 382 | outputPaths = ( 383 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", 384 | ); 385 | runOnlyForDeploymentPostprocessing = 0; 386 | shellPath = /bin/sh; 387 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Example-Hermes/Pods-Example-Hermes-resources.sh\"\n"; 388 | showEnvVarsInLog = 0; 389 | }; 390 | 8D9D924791838F4FE1D97F63 /* [CP] Copy Pods Resources */ = { 391 | isa = PBXShellScriptBuildPhase; 392 | buildActionMask = 2147483647; 393 | files = ( 394 | ); 395 | inputPaths = ( 396 | "${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-resources.sh", 397 | "${PODS_CONFIGURATION_BUILD_DIR}/React-Core.common/AccessibilityResources.bundle", 398 | ); 399 | name = "[CP] Copy Pods Resources"; 400 | outputPaths = ( 401 | "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/AccessibilityResources.bundle", 402 | ); 403 | runOnlyForDeploymentPostprocessing = 0; 404 | shellPath = /bin/sh; 405 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Example/Pods-Example-resources.sh\"\n"; 406 | showEnvVarsInLog = 0; 407 | }; 408 | 9807412D5D17F47EB2D42FD8 /* [CP] Check Pods Manifest.lock */ = { 409 | isa = PBXShellScriptBuildPhase; 410 | buildActionMask = 2147483647; 411 | files = ( 412 | ); 413 | inputFileListPaths = ( 414 | ); 415 | inputPaths = ( 416 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 417 | "${PODS_ROOT}/Manifest.lock", 418 | ); 419 | name = "[CP] Check Pods Manifest.lock"; 420 | outputFileListPaths = ( 421 | ); 422 | outputPaths = ( 423 | "$(DERIVED_FILE_DIR)/Pods-Example-Hermes-checkManifestLockResult.txt", 424 | ); 425 | runOnlyForDeploymentPostprocessing = 0; 426 | shellPath = /bin/sh; 427 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 428 | showEnvVarsInLog = 0; 429 | }; 430 | B0D0EDBF460EF78256E951D6 /* [CP] Embed Pods Frameworks */ = { 431 | isa = PBXShellScriptBuildPhase; 432 | buildActionMask = 2147483647; 433 | files = ( 434 | ); 435 | inputPaths = ( 436 | "${PODS_ROOT}/Target Support Files/Pods-Example-Hermes/Pods-Example-Hermes-frameworks.sh", 437 | "${PODS_ROOT}/hermes-engine/destroot/Library/Frameworks/iphoneos/hermes.framework", 438 | ); 439 | name = "[CP] Embed Pods Frameworks"; 440 | outputPaths = ( 441 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/hermes.framework", 442 | ); 443 | runOnlyForDeploymentPostprocessing = 0; 444 | shellPath = /bin/sh; 445 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Example-Hermes/Pods-Example-Hermes-frameworks.sh\"\n"; 446 | showEnvVarsInLog = 0; 447 | }; 448 | B16B91BD26F4CE0000CD1A96 /* Bundle React Native code and images */ = { 449 | isa = PBXShellScriptBuildPhase; 450 | buildActionMask = 2147483647; 451 | files = ( 452 | ); 453 | inputPaths = ( 454 | ); 455 | name = "Bundle React Native code and images"; 456 | outputPaths = ( 457 | ); 458 | runOnlyForDeploymentPostprocessing = 0; 459 | shellPath = /bin/sh; 460 | shellScript = "export NODE_BINARY=node\nexport FORCE_BUNDLING=true\n\n../node_modules/react-native/scripts/react-native-xcode.sh\n../node_modules/react-native-compressed-jsbundle/tool/compress-xcode.sh\n"; 461 | }; 462 | /* End PBXShellScriptBuildPhase section */ 463 | 464 | /* Begin PBXSourcesBuildPhase section */ 465 | 13B07F871A680F5B00A75B9A /* Sources */ = { 466 | isa = PBXSourcesBuildPhase; 467 | buildActionMask = 2147483647; 468 | files = ( 469 | B182E11126ECB12E00F1BE00 /* AppDelegate.m in Sources */, 470 | B182E10F26ECB12E00F1BE00 /* main.m in Sources */, 471 | ); 472 | runOnlyForDeploymentPostprocessing = 0; 473 | }; 474 | B16B91B526F4CE0000CD1A96 /* Sources */ = { 475 | isa = PBXSourcesBuildPhase; 476 | buildActionMask = 2147483647; 477 | files = ( 478 | B16B91B626F4CE0000CD1A96 /* AppDelegate.m in Sources */, 479 | B16B91B726F4CE0000CD1A96 /* main.m in Sources */, 480 | ); 481 | runOnlyForDeploymentPostprocessing = 0; 482 | }; 483 | B16B923B26F4DE0100CD1A96 /* Sources */ = { 484 | isa = PBXSourcesBuildPhase; 485 | buildActionMask = 2147483647; 486 | files = ( 487 | B16B924226F4DE0100CD1A96 /* Smoketests.m in Sources */, 488 | ); 489 | runOnlyForDeploymentPostprocessing = 0; 490 | }; 491 | B16B925C26F4E11A00CD1A96 /* Sources */ = { 492 | isa = PBXSourcesBuildPhase; 493 | buildActionMask = 2147483647; 494 | files = ( 495 | B16B925D26F4E11A00CD1A96 /* Smoketests.m in Sources */, 496 | ); 497 | runOnlyForDeploymentPostprocessing = 0; 498 | }; 499 | /* End PBXSourcesBuildPhase section */ 500 | 501 | /* Begin PBXTargetDependency section */ 502 | B16B925326F4E11500CD1A96 /* PBXTargetDependency */ = { 503 | isa = PBXTargetDependency; 504 | platformFilter = ios; 505 | target = 13B07F861A680F5B00A75B9A /* Example */; 506 | targetProxy = B16B925226F4E11500CD1A96 /* PBXContainerItemProxy */; 507 | }; 508 | B16B925826F4E11A00CD1A96 /* PBXTargetDependency */ = { 509 | isa = PBXTargetDependency; 510 | platformFilter = ios; 511 | target = B16B91B226F4CE0000CD1A96 /* Example-Hermes */; 512 | targetProxy = B16B925926F4E11A00CD1A96 /* PBXContainerItemProxy */; 513 | }; 514 | /* End PBXTargetDependency section */ 515 | 516 | /* Begin XCBuildConfiguration section */ 517 | 13B07F941A680F5B00A75B9A /* Debug */ = { 518 | isa = XCBuildConfiguration; 519 | baseConfigurationReference = F6E0998B7E3DC13416846B22 /* Pods-Example.debug.xcconfig */; 520 | buildSettings = { 521 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 522 | CLANG_ENABLE_MODULES = YES; 523 | CURRENT_PROJECT_VERSION = 1; 524 | ENABLE_BITCODE = NO; 525 | INFOPLIST_FILE = Example/Info.plist; 526 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 527 | LD_RUNPATH_SEARCH_PATHS = ( 528 | "$(inherited)", 529 | "@executable_path/Frameworks", 530 | ); 531 | OTHER_LDFLAGS = ( 532 | "$(inherited)", 533 | "-ObjC", 534 | "-lc++", 535 | ); 536 | PRODUCT_BUNDLE_IDENTIFIER = "com.ivanmoskalev.oss.react-native-compressed-jsbundle.example"; 537 | PRODUCT_NAME = Example; 538 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 539 | SWIFT_VERSION = 5.0; 540 | VERSIONING_SYSTEM = "apple-generic"; 541 | }; 542 | name = Debug; 543 | }; 544 | 13B07F951A680F5B00A75B9A /* Release */ = { 545 | isa = XCBuildConfiguration; 546 | baseConfigurationReference = AD975EFB4D07DB5A1D3A40B3 /* Pods-Example.release.xcconfig */; 547 | buildSettings = { 548 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 549 | CLANG_ENABLE_MODULES = YES; 550 | CURRENT_PROJECT_VERSION = 1; 551 | INFOPLIST_FILE = Example/Info.plist; 552 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 553 | LD_RUNPATH_SEARCH_PATHS = ( 554 | "$(inherited)", 555 | "@executable_path/Frameworks", 556 | ); 557 | OTHER_LDFLAGS = ( 558 | "$(inherited)", 559 | "-ObjC", 560 | "-lc++", 561 | ); 562 | PRODUCT_BUNDLE_IDENTIFIER = "com.ivanmoskalev.oss.react-native-compressed-jsbundle.example"; 563 | PRODUCT_NAME = Example; 564 | SWIFT_VERSION = 5.0; 565 | VERSIONING_SYSTEM = "apple-generic"; 566 | }; 567 | name = Release; 568 | }; 569 | 83CBBA201A601CBA00E9B192 /* Debug */ = { 570 | isa = XCBuildConfiguration; 571 | buildSettings = { 572 | ALWAYS_SEARCH_USER_PATHS = NO; 573 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 574 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 575 | CLANG_CXX_LIBRARY = "libc++"; 576 | CLANG_ENABLE_MODULES = YES; 577 | CLANG_ENABLE_OBJC_ARC = YES; 578 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 579 | CLANG_WARN_BOOL_CONVERSION = YES; 580 | CLANG_WARN_COMMA = YES; 581 | CLANG_WARN_CONSTANT_CONVERSION = YES; 582 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 583 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 584 | CLANG_WARN_EMPTY_BODY = YES; 585 | CLANG_WARN_ENUM_CONVERSION = YES; 586 | CLANG_WARN_INFINITE_RECURSION = YES; 587 | CLANG_WARN_INT_CONVERSION = YES; 588 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 589 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 590 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 591 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 592 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 593 | CLANG_WARN_STRICT_PROTOTYPES = YES; 594 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 595 | CLANG_WARN_UNREACHABLE_CODE = YES; 596 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 597 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 598 | COPY_PHASE_STRIP = NO; 599 | ENABLE_STRICT_OBJC_MSGSEND = YES; 600 | ENABLE_TESTABILITY = YES; 601 | GCC_C_LANGUAGE_STANDARD = gnu99; 602 | GCC_DYNAMIC_NO_PIC = NO; 603 | GCC_NO_COMMON_BLOCKS = YES; 604 | GCC_OPTIMIZATION_LEVEL = 0; 605 | GCC_PREPROCESSOR_DEFINITIONS = ( 606 | "DEBUG=1", 607 | "$(inherited)", 608 | ); 609 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 610 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 611 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 612 | GCC_WARN_UNDECLARED_SELECTOR = YES; 613 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 614 | GCC_WARN_UNUSED_FUNCTION = YES; 615 | GCC_WARN_UNUSED_VARIABLE = YES; 616 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 617 | LD_RUNPATH_SEARCH_PATHS = ( 618 | /usr/lib/swift, 619 | "$(inherited)", 620 | ); 621 | LIBRARY_SEARCH_PATHS = ( 622 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", 623 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"", 624 | "\"$(inherited)\"", 625 | ); 626 | MTL_ENABLE_DEBUG_INFO = YES; 627 | ONLY_ACTIVE_ARCH = YES; 628 | SDKROOT = iphoneos; 629 | }; 630 | name = Debug; 631 | }; 632 | 83CBBA211A601CBA00E9B192 /* Release */ = { 633 | isa = XCBuildConfiguration; 634 | buildSettings = { 635 | ALWAYS_SEARCH_USER_PATHS = NO; 636 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 637 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 638 | CLANG_CXX_LIBRARY = "libc++"; 639 | CLANG_ENABLE_MODULES = YES; 640 | CLANG_ENABLE_OBJC_ARC = YES; 641 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 642 | CLANG_WARN_BOOL_CONVERSION = YES; 643 | CLANG_WARN_COMMA = YES; 644 | CLANG_WARN_CONSTANT_CONVERSION = YES; 645 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 646 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 647 | CLANG_WARN_EMPTY_BODY = YES; 648 | CLANG_WARN_ENUM_CONVERSION = YES; 649 | CLANG_WARN_INFINITE_RECURSION = YES; 650 | CLANG_WARN_INT_CONVERSION = YES; 651 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 652 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 653 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 654 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 655 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 656 | CLANG_WARN_STRICT_PROTOTYPES = YES; 657 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 658 | CLANG_WARN_UNREACHABLE_CODE = YES; 659 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 660 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 661 | COPY_PHASE_STRIP = YES; 662 | ENABLE_NS_ASSERTIONS = NO; 663 | ENABLE_STRICT_OBJC_MSGSEND = YES; 664 | GCC_C_LANGUAGE_STANDARD = gnu99; 665 | GCC_NO_COMMON_BLOCKS = YES; 666 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 667 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 668 | GCC_WARN_UNDECLARED_SELECTOR = YES; 669 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 670 | GCC_WARN_UNUSED_FUNCTION = YES; 671 | GCC_WARN_UNUSED_VARIABLE = YES; 672 | IPHONEOS_DEPLOYMENT_TARGET = 10.0; 673 | LD_RUNPATH_SEARCH_PATHS = ( 674 | /usr/lib/swift, 675 | "$(inherited)", 676 | ); 677 | LIBRARY_SEARCH_PATHS = ( 678 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", 679 | "\"$(TOOLCHAIN_DIR)/usr/lib/swift-5.0/$(PLATFORM_NAME)\"", 680 | "\"$(inherited)\"", 681 | ); 682 | MTL_ENABLE_DEBUG_INFO = NO; 683 | SDKROOT = iphoneos; 684 | VALIDATE_PRODUCT = YES; 685 | }; 686 | name = Release; 687 | }; 688 | B16B91C026F4CE0000CD1A96 /* Debug */ = { 689 | isa = XCBuildConfiguration; 690 | baseConfigurationReference = 67DF98A7D1310276269B23B0 /* Pods-Example-Hermes.debug.xcconfig */; 691 | buildSettings = { 692 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 693 | CLANG_ENABLE_MODULES = YES; 694 | CURRENT_PROJECT_VERSION = 1; 695 | ENABLE_BITCODE = NO; 696 | INFOPLIST_FILE = "Example-Hermes-Info.plist"; 697 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 698 | LD_RUNPATH_SEARCH_PATHS = ( 699 | "$(inherited)", 700 | "@executable_path/Frameworks", 701 | ); 702 | OTHER_LDFLAGS = ( 703 | "$(inherited)", 704 | "-ObjC", 705 | "-lc++", 706 | ); 707 | PRODUCT_BUNDLE_IDENTIFIER = "com.ivanmoskalev.oss.react-native-compressed-jsbundle.example-hermes"; 708 | PRODUCT_NAME = "$(TARGET_NAME)"; 709 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 710 | SWIFT_VERSION = 5.0; 711 | VERSIONING_SYSTEM = "apple-generic"; 712 | }; 713 | name = Debug; 714 | }; 715 | B16B91C126F4CE0000CD1A96 /* Release */ = { 716 | isa = XCBuildConfiguration; 717 | baseConfigurationReference = 3113BFA25090EBFF6CA438D5 /* Pods-Example-Hermes.release.xcconfig */; 718 | buildSettings = { 719 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 720 | CLANG_ENABLE_MODULES = YES; 721 | CURRENT_PROJECT_VERSION = 1; 722 | INFOPLIST_FILE = "Example-Hermes-Info.plist"; 723 | IPHONEOS_DEPLOYMENT_TARGET = 11.0; 724 | LD_RUNPATH_SEARCH_PATHS = ( 725 | "$(inherited)", 726 | "@executable_path/Frameworks", 727 | ); 728 | OTHER_LDFLAGS = ( 729 | "$(inherited)", 730 | "-ObjC", 731 | "-lc++", 732 | ); 733 | PRODUCT_BUNDLE_IDENTIFIER = "com.ivanmoskalev.oss.react-native-compressed-jsbundle.example-hermes"; 734 | PRODUCT_NAME = "$(TARGET_NAME)"; 735 | SWIFT_VERSION = 5.0; 736 | VERSIONING_SYSTEM = "apple-generic"; 737 | }; 738 | name = Release; 739 | }; 740 | B16B924426F4DE0100CD1A96 /* Debug */ = { 741 | isa = XCBuildConfiguration; 742 | buildSettings = { 743 | CLANG_ANALYZER_NONNULL = YES; 744 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 745 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 746 | CLANG_ENABLE_OBJC_WEAK = YES; 747 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 748 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 749 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 750 | CODE_SIGN_STYLE = Automatic; 751 | DEBUG_INFORMATION_FORMAT = dwarf; 752 | DEVELOPMENT_TEAM = 55XJC24EES; 753 | GCC_C_LANGUAGE_STANDARD = gnu11; 754 | INFOPLIST_FILE = Smoketests/Info.plist; 755 | IPHONEOS_DEPLOYMENT_TARGET = 14.4; 756 | LD_RUNPATH_SEARCH_PATHS = ( 757 | "$(inherited)", 758 | "@executable_path/Frameworks", 759 | "@loader_path/Frameworks", 760 | ); 761 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 762 | MTL_FAST_MATH = YES; 763 | PRODUCT_BUNDLE_IDENTIFIER = "com.ivanmoskalev.react-native-compressed-jsbundle.Smoketests"; 764 | PRODUCT_NAME = "$(TARGET_NAME)"; 765 | PROVISIONING_PROFILE = ""; 766 | TARGETED_DEVICE_FAMILY = "1,2"; 767 | TEST_TARGET_NAME = Example; 768 | }; 769 | name = Debug; 770 | }; 771 | B16B924526F4DE0100CD1A96 /* Release */ = { 772 | isa = XCBuildConfiguration; 773 | buildSettings = { 774 | CLANG_ANALYZER_NONNULL = YES; 775 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 776 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 777 | CLANG_ENABLE_OBJC_WEAK = YES; 778 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 779 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 780 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 781 | CODE_SIGN_STYLE = Automatic; 782 | COPY_PHASE_STRIP = NO; 783 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 784 | DEVELOPMENT_TEAM = 55XJC24EES; 785 | GCC_C_LANGUAGE_STANDARD = gnu11; 786 | INFOPLIST_FILE = Smoketests/Info.plist; 787 | IPHONEOS_DEPLOYMENT_TARGET = 14.4; 788 | LD_RUNPATH_SEARCH_PATHS = ( 789 | "$(inherited)", 790 | "@executable_path/Frameworks", 791 | "@loader_path/Frameworks", 792 | ); 793 | MTL_FAST_MATH = YES; 794 | PRODUCT_BUNDLE_IDENTIFIER = "com.ivanmoskalev.react-native-compressed-jsbundle.Smoketests"; 795 | PRODUCT_NAME = "$(TARGET_NAME)"; 796 | PROVISIONING_PROFILE = ""; 797 | TARGETED_DEVICE_FAMILY = "1,2"; 798 | TEST_TARGET_NAME = Example; 799 | }; 800 | name = Release; 801 | }; 802 | B16B926126F4E11A00CD1A96 /* Debug */ = { 803 | isa = XCBuildConfiguration; 804 | buildSettings = { 805 | CLANG_ANALYZER_NONNULL = YES; 806 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 807 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 808 | CLANG_ENABLE_OBJC_WEAK = YES; 809 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 810 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 811 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 812 | CODE_SIGN_STYLE = Automatic; 813 | DEBUG_INFORMATION_FORMAT = dwarf; 814 | DEVELOPMENT_TEAM = 55XJC24EES; 815 | GCC_C_LANGUAGE_STANDARD = gnu11; 816 | INFOPLIST_FILE = "Smoketests-Hermes-Info.plist"; 817 | IPHONEOS_DEPLOYMENT_TARGET = 14.4; 818 | LD_RUNPATH_SEARCH_PATHS = ( 819 | "$(inherited)", 820 | "@executable_path/Frameworks", 821 | "@loader_path/Frameworks", 822 | ); 823 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 824 | MTL_FAST_MATH = YES; 825 | PRODUCT_BUNDLE_IDENTIFIER = "com.ivanmoskalev.react-native-compressed-jsbundle.Smoketests"; 826 | PRODUCT_NAME = "$(TARGET_NAME)"; 827 | PROVISIONING_PROFILE = ""; 828 | TARGETED_DEVICE_FAMILY = "1,2"; 829 | TEST_TARGET_NAME = "Example-Hermes"; 830 | }; 831 | name = Debug; 832 | }; 833 | B16B926226F4E11A00CD1A96 /* Release */ = { 834 | isa = XCBuildConfiguration; 835 | buildSettings = { 836 | CLANG_ANALYZER_NONNULL = YES; 837 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 838 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 839 | CLANG_ENABLE_OBJC_WEAK = YES; 840 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 841 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; 842 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 843 | CODE_SIGN_STYLE = Automatic; 844 | COPY_PHASE_STRIP = NO; 845 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 846 | DEVELOPMENT_TEAM = 55XJC24EES; 847 | GCC_C_LANGUAGE_STANDARD = gnu11; 848 | INFOPLIST_FILE = "Smoketests-Hermes-Info.plist"; 849 | IPHONEOS_DEPLOYMENT_TARGET = 14.4; 850 | LD_RUNPATH_SEARCH_PATHS = ( 851 | "$(inherited)", 852 | "@executable_path/Frameworks", 853 | "@loader_path/Frameworks", 854 | ); 855 | MTL_FAST_MATH = YES; 856 | PRODUCT_BUNDLE_IDENTIFIER = "com.ivanmoskalev.react-native-compressed-jsbundle.Smoketests"; 857 | PRODUCT_NAME = "$(TARGET_NAME)"; 858 | PROVISIONING_PROFILE = ""; 859 | TARGETED_DEVICE_FAMILY = "1,2"; 860 | TEST_TARGET_NAME = "Example-Hermes"; 861 | }; 862 | name = Release; 863 | }; 864 | /* End XCBuildConfiguration section */ 865 | 866 | /* Begin XCConfigurationList section */ 867 | 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "Example" */ = { 868 | isa = XCConfigurationList; 869 | buildConfigurations = ( 870 | 13B07F941A680F5B00A75B9A /* Debug */, 871 | 13B07F951A680F5B00A75B9A /* Release */, 872 | ); 873 | defaultConfigurationIsVisible = 0; 874 | defaultConfigurationName = Release; 875 | }; 876 | 83CBB9FA1A601CBA00E9B192 /* Build configuration list for PBXProject "Example" */ = { 877 | isa = XCConfigurationList; 878 | buildConfigurations = ( 879 | 83CBBA201A601CBA00E9B192 /* Debug */, 880 | 83CBBA211A601CBA00E9B192 /* Release */, 881 | ); 882 | defaultConfigurationIsVisible = 0; 883 | defaultConfigurationName = Release; 884 | }; 885 | B16B91BF26F4CE0000CD1A96 /* Build configuration list for PBXNativeTarget "Example-Hermes" */ = { 886 | isa = XCConfigurationList; 887 | buildConfigurations = ( 888 | B16B91C026F4CE0000CD1A96 /* Debug */, 889 | B16B91C126F4CE0000CD1A96 /* Release */, 890 | ); 891 | defaultConfigurationIsVisible = 0; 892 | defaultConfigurationName = Release; 893 | }; 894 | B16B924626F4DE0100CD1A96 /* Build configuration list for PBXNativeTarget "Smoketests" */ = { 895 | isa = XCConfigurationList; 896 | buildConfigurations = ( 897 | B16B924426F4DE0100CD1A96 /* Debug */, 898 | B16B924526F4DE0100CD1A96 /* Release */, 899 | ); 900 | defaultConfigurationIsVisible = 0; 901 | defaultConfigurationName = Release; 902 | }; 903 | B16B926026F4E11A00CD1A96 /* Build configuration list for PBXNativeTarget "Smoketests-Hermes" */ = { 904 | isa = XCConfigurationList; 905 | buildConfigurations = ( 906 | B16B926126F4E11A00CD1A96 /* Debug */, 907 | B16B926226F4E11A00CD1A96 /* Release */, 908 | ); 909 | defaultConfigurationIsVisible = 0; 910 | defaultConfigurationName = Release; 911 | }; 912 | /* End XCConfigurationList section */ 913 | }; 914 | rootObject = 83CBB9F71A601CBA00E9B192 /* Project object */; 915 | } 916 | --------------------------------------------------------------------------------