fastlane-plugin-react_native_release 0.3.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (22) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +120 -41
  3. data/lib/fastlane/plugin/react_native_release/actions/accept_android_sdk_licenses.rb +46 -0
  4. data/lib/fastlane/plugin/react_native_release/actions/add_app_var.rb +107 -0
  5. data/lib/fastlane/plugin/react_native_release/actions/add_fastlane_var.rb +99 -0
  6. data/lib/fastlane/plugin/react_native_release/actions/create_changelog.rb +92 -0
  7. data/lib/fastlane/plugin/react_native_release/actions/create_fastlane_session.rb +75 -0
  8. data/lib/fastlane/plugin/react_native_release/actions/decrypt_android_keystore.rb +131 -0
  9. data/lib/fastlane/plugin/react_native_release/actions/decrypt_app_vars.rb +117 -0
  10. data/lib/fastlane/plugin/react_native_release/actions/decrypt_fastlane_vars.rb +101 -0
  11. data/lib/fastlane/plugin/react_native_release/actions/decrypt_google_play_credentials.rb +62 -0
  12. data/lib/fastlane/plugin/react_native_release/actions/determine_release_from_commits.rb +61 -0
  13. data/lib/fastlane/plugin/react_native_release/actions/encrypt_app_vars.rb +121 -0
  14. data/lib/fastlane/plugin/react_native_release/actions/encrypt_fastlane_vars.rb +76 -0
  15. data/lib/fastlane/plugin/react_native_release/actions/encrypt_google_play_credentials.rb +64 -0
  16. data/lib/fastlane/plugin/react_native_release/actions/generate_android_keystore.rb +137 -0
  17. data/lib/fastlane/plugin/react_native_release/actions/{react_native_release_action.rb → react_native_release.rb} +35 -66
  18. data/lib/fastlane/plugin/react_native_release/actions/read_fastlane_session.rb +55 -0
  19. data/lib/fastlane/plugin/react_native_release/actions/tag_release.rb +65 -0
  20. data/lib/fastlane/plugin/react_native_release/helper/react_native_release_helper.rb +14 -5
  21. data/lib/fastlane/plugin/react_native_release/version.rb +1 -1
  22. metadata +20 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1c6db2dcb8566ef24876fd189f29f38cd3cbecdd59c8ce89e7df399b10e6902c
4
- data.tar.gz: 2626f9f632f1fa7deaa98ec880171692c3c05db8bea3bc1fe70bed115cad312b
3
+ metadata.gz: 3b8d333b98e735533f90b2cb2e443f0565756066be831850f3a981b6c4522228
4
+ data.tar.gz: b5ed1dda7f25ce3804805f150b871db2eaa90178b6c3c0bb1bbb8f812f0d406f
5
5
  SHA512:
6
- metadata.gz: bf7a63f2298aa414a703ad735465802f4268e2d3f0c7e2f5023d96338447c811b88f8bd68ca26d67a8b5a274054ee4c12baa9021d237d9c9b706842951e375fb
7
- data.tar.gz: da7e7e339c2e834d17d829db5f4e5df449c1fb1c52b6d5b5cf0e5c039f7c510efb47550fd326210a76afad6221958fa4022ab605af98edb91dd4e4176d3f9dda
6
+ metadata.gz: c8ee11d162d5ef17168b9d39e882bbc5018036082cf9d4b70b090e66cd568183e620ec1eb7735c01275f9bd1d7a3c35d534dd9472c86fc55d8b4728d355d230c
7
+ data.tar.gz: 84658b6da50fa4f8bd13eb471201a611068874091891bf864106739314338db646d1cde5719fc8d0c8ba36e229b84953d0a097b2fd4b8dd3b8bf2a27582cfc6c
data/README.md CHANGED
@@ -1,80 +1,159 @@
1
- # React Native Release
1
+ # React Native Release
2
2
 
3
3
  [![fastlane Plugin Badge](https://rawcdn.githack.com/fastlane/fastlane/master/fastlane/assets/plugin-badge.svg)](https://rubygems.org/gems/fastlane-plugin-react_native_release)
4
4
 
5
- ## Getting Started
5
+ Simplify releases for your React Native apps. This plugin contains many actions to help you with your release workflow.
6
6
 
7
- This project is a [_fastlane_](https://github.com/fastlane/fastlane) plugin. To get started with `fastlane-plugin-react_native_release`, add it to your project by running:
7
+ It helps cut a new `beta` or `release` version of your app:
8
8
 
9
- ```bash
10
- fastlane add_plugin react_native_release
11
- ```
9
+ - Authenticates and stores an encrypted App Store Connect session that is later used for TestFlight and App Store operations
10
+ - Prompts the user for a `major/minor/patch` version bump
11
+ - Bumps the version of the iOS and Android app appropriately
12
+ - Creates a tag
13
+ - Handles hotfix releases
14
+ - Handles merging version bumps and hotfixes back to the appropriate branches
15
+
16
+ It encrypts, and on CI, decrypts values from a standalone "context" git repository:
17
+
18
+ - Android keystore file (including helping you generate one)
19
+ - Google Play Credentials to upload to the Play Store
20
+ - Fastlane config ENV variables
21
+ - App ENV variables (API_URL, feature flags, etc)
22
+
23
+ ### Philosophies
24
+
25
+ **Use Fastlane Match**
26
+
27
+ Certificates and provisioning profiles should be created and managed by Fastlane Match
28
+
29
+ **Builds Run on CI**
30
+
31
+ We support local builds for projects, but they should only be used in emergency situations.
32
+
33
+ **CI uses a machine user**
34
+
35
+ This is a best practice.
36
+
37
+ **ENV vars are managed through React Native Release**
38
+
39
+ We do this for portability and ease of configuration. Outside of the ENV vars to configure CRYPTEX, you shouldn't have to add ENV vars to CI.
40
+
41
+ For App ENV vars, we provide some additional functionality via namespaces. Valid namespaces are `alpha`, `beta`, `release`, and empty (root). Root ENV vars are "global". Namespaced variables are merged into the Root ENV vars at build time via the `decrypt_app_vars` action. This allows you to easily overwrite ENV vars for specific types of builds, all without configuring separate targets and schemes in XCode.
42
+
43
+ The main branch and tagging flow looks like this (note this may be out of date. Revisit after workflow updates):
44
+
45
+ ![Branch / Tag Flow](https://monosnap.com/image/Tn71leeWdCwwjSdwjYKHK4pnyjG1v4.png)
46
+
47
+ If a hotfix is required the flow looks like this (note this may be out of date. Revisit after workflow updates):
48
+
49
+ ![Hotfix Flow](https://monosnap.com/image/ctwlef0A3TbLbRk1xJrlVroNB8F9ot.png)
50
+
51
+ Here's what it looks like in action:
52
+ ![Releasing a beta](https://api.monosnap.com/image/download?id=IEISpG4vgMeGPl31it8GxPbiTror2i)
53
+ (this example uses `"release": "bundle exec fastlane run react_native_release"` as a yarn script)e
54
+
55
+ ## Prerequisites
12
56
 
13
57
  ### Ensure your project confirms to Semantic Versioning
58
+
14
59
  Projects using React Native Release should use Semantic Versioning. At the very least, you need major, minor, and patch numbers in your version.
15
60
 
16
61
  **iOS**
17
62
  Use `agvtool` to get and set a version across your project. From the `ios` directory, do the following:
18
- * `agvtool what-marketing-version` to see your current version
19
- * `agvtool new-marketing-version 0.1.0` to set a new version
63
+
64
+ - `agvtool what-marketing-version` to see your current version
65
+ - `agvtool new-marketing-version 0.1.0` to set a new version
20
66
 
21
67
  **Android**
22
- * Set `versionName` in `app/build.gradle`. (`versionName "0.1.0"`)
68
+
69
+ - Set `versionName` in `app/build.gradle`. (`versionName "0.1.0"`)
23
70
 
24
71
  :exclamation: If you don't complete these steps, releases will fail. :exclamation:
25
72
 
26
- ### Configuring builds to TestFlight and AppStore Connect on CI
73
+ ## Installation
74
+
75
+ This project is a [_fastlane_](https://github.com/fastlane/fastlane) plugin. Since React Native projects contain both `iOS` and `Android` apps, we need to install the plugin in multiple places:
76
+
77
+ ### Install plugin into fastlane folders
78
+
79
+ 1. In the root of your project. This is used to run release commands over the entire project.
80
+
81
+ ```bash
82
+ fastlane add_plugin react_native_release
83
+ ```
84
+
85
+ 2. In `./android/fastlane`
86
+
87
+ ```bash
88
+ fastlane add_plugin react_native_release
89
+ ```
27
90
 
28
- To upload builds to TestFlight or AppStore Connect, your CI will need a session cookie that was generated with a 2FA code. React Native Release generates and stores this code securely in Github, when the local release script runs, and CI consumes the cookie during the IOS build upload step for jobs uploading to TestFlight or AppStore Connect.
91
+ 3. In `./ios/fastlane`
92
+
93
+ ```bash
94
+ fastlane add_plugin react_native_release
95
+ ```
29
96
 
30
- To enable the fastlane session add an `.env` file at `<root>/fastlane/.env` with the following configuration.
97
+ ### Add or update .env files
31
98
 
32
- | KEY | TYPE | DESCRIPTION |
33
- |-----|------|-------------|
34
- | FASTLANE_ENV_GIT_URL | String | The repository where the hashed session token will be stored. **Ensure this repository before running the release script!** (Must be a separate repository solely for securely storing the session token). |
35
- | FASTLANE_ENV_USERNAME | String | The Apple Developer Account email to authenticate with 2FA and generate a session token for. |
99
+ We leverage `.env` files in a number of different places.
36
100
 
37
- Note: Apple requires 2FA on all accounts now and the IOS build steps will fail if you attempt to upload to TestFlight or AppStore Connect without a session token.
101
+ `<root>/fastlane/.env`:
38
102
 
39
- #### Important!
103
+ | KEY | TYPE | DESCRIPTION |
104
+ | ----------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
105
+ | CRYPTEX_GIT_URL | String | The repository where the hashed session token will be stored. **Ensure this repository before running the release script!** (You can leverage the same repository you use for Fastlane Match) |
106
+ | CRYPTEX_PASSWORD | String | The secret key used to encrypt/decrypt the `FASTLANE_SESSION` value. |
107
+ | CRYPTEX_SKIP_DOCS | Boolean | Force the underlying encryption plugin to skip README generation. |
40
108
 
41
- Before running the release script, we will need to authenticate locally and generate an initial token to store credentials in the keychain to be used in the release script.
109
+ `<root>/android/fastlane/.env`:
42
110
 
43
- 1. Using the same *Apple Developer Account* (`FASTLANE_ENV_USERNAME`) in the `<root>/fastlane/.env` authenticate on [AppStore Connect](https://appstoreconnect.apple.com/login).
111
+ | KEY | TYPE | DESCRIPTION |
112
+ | -------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
113
+ | ANDROID_KEY_PASSWORD | String | The password generated from `generate_android_keystore` or a manual keystore command.` |
114
+ | ANDROID_KEY_ALIAS | String | The alias for the keystore |
115
+ | CRYPTEX_GIT_URL | String | The repository where the hashed session token will be stored. **Ensure this repository before running the release script!** (You can leverage the same repository you use for Fastlane Match) |
116
+ | CRYPTEX_PASSWORD | String | The secret key used to encrypt/decrypt the `FASTLANE_SESSION` value. |
117
+ | CRYPTEX_SKIP_DOCS | Boolean | Force the underlying encryption plugin to skip README generation. |
44
118
 
45
- 2. Then run `fastlane spaceauth -u {YOUR FASTLANE_ENV_USERNAME}`, enter your Apple Developer Account password and complete the 2FA code if prompted.
119
+ `<root>/ios/fastlane/.env`:
46
120
 
47
- These steps are required for every machine, otherwise the release script will fail.
121
+ | KEY | TYPE | DESCRIPTION |
122
+ | ----------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
123
+ | MATCH_GIT_URL | String | The repository used for Fastlane match. Typically the same as CRYPTEX_GIT_URL |
124
+ | MATCH_PASSWORD | String | The password used to encrypt / decrypt Fastlane Match certs and profiles |
125
+ | GYM_WORKSPACE | String | The name of the workspace file (Myproject.xcworkspace) |
126
+ | GYM_SCHEME | String | The scheme to build within the workspace (Myproject) |
127
+ | GYM_OUTPUT_NAME | String | The name of the `.ipa` file to output (Myproject) |
128
+ | CRYPTEX_GIT_URL | String | The repository where the hashed session token will be stored. **Ensure this repository before running the release script!** (You can leverage the same repository you use for Fastlane Match) |
129
+ | CRYPTEX_PASSWORD | String | The secret key used to encrypt/decrypt the `FASTLANE_SESSION` value. |
130
+ | CRYPTEX_SKIP_DOCS | Boolean | Force the underlying encryption plugin to skip README generation. |
48
131
 
132
+ **Note: In followup releases, we will add a `react-native-release init` script to generate these for you.**
49
133
 
50
- ## About React Native Release
134
+ ### Setup CI
51
135
 
52
- Simplify releases for React Native apps.
136
+ Step 1. If you've already setup Fastlane Match, skip this section. Each provider is different, but conceptually you'll want to:
53
137
 
54
- This plugin:
138
+ - Create a machine user account on your source code provider (GitHub or BitBucket) and invite that account to both the mobile and certs repo.
139
+ - Enable CI on the main mobile repository by pressing "Follow" or "Build"
140
+ - In an Incognito tab, log into your CI provider with the machine user account.
141
+ - Add a user key instead of the default deploy key. This will allow CI to auth as the machine user and gain access to _both_ the mobile repo and the context repo.
55
142
 
56
- - cuts a new `beta` or `production` release
57
- - prompts the user for a `major/minor/patch` version bump
58
- - bumps the version of the iOS and Android app appropriately
59
- - tags a release based on the iOS and Android version
60
- - handles hotfix releases
61
- - handles merging version bumps and hotfixes back to the appropriate branches
143
+ Step 2. Add the following to your CI environment variables:
62
144
 
63
- The main branch and tagging flow looks like this:
64
- ![Branch / Tag Flow](https://monosnap.com/image/Tn71leeWdCwwjSdwjYKHK4pnyjG1v4.png)
145
+ - CRYPTEX_GIT_URL=(your context repo ssh git url)
146
+ - CRYPTEX_PASSWORD=(your context repo password)
147
+ - CRYPTEX_VERBOSE=true
148
+ - CRYPTEX_DIGEST=sha256 (note: if you have a pre-existing setup, you should set this to md5 - see https://github.com/hjanuschka/fastlane-plugin-cryptex/pull/10)
65
149
 
66
- If a hotfix is required the flow looks like this:
67
- ![Hotfix Flow](https://monosnap.com/image/ctwlef0A3TbLbRk1xJrlVroNB8F9ot.png)
150
+ ### Configuring builds to upload to TestFlight and AppStore Connect on CI
68
151
 
69
- Here's what it looks like in action:
70
- ![Releasing a beta](https://api.monosnap.com/image/download?id=IEISpG4vgMeGPl31it8GxPbiTror2i)
71
- (this example uses `"release": "bundle exec fastlane run react_native_release"` as a yarn script)
152
+ To upload builds to TestFlight or AppStore Connect, CI will need to restore a previously generated session. While possible to use an Application Specific Password to upload builds, it will not have the additional permissions required for other TestFlight / App Store operations. As such, we require generating a session.
72
153
 
73
154
  ## Example
74
155
 
75
- Check out the [example `Fastfile`](fastlane/Fastfile) to see how to use this plugin. Try it by cloning the repo, running `fastlane install_plugins` and `bundle exec fastlane test`.
76
-
77
- **Note to author:** Please set up a sample project to make it easy for users to explore what your plugin does. Provide everything that is necessary to try out the plugin in this project (including a sample Xcode/Android project if necessary)
156
+ See /example to see how to use the plugin. (TODO)
78
157
 
79
158
  ## Run tests for this plugin
80
159
 
@@ -0,0 +1,46 @@
1
+ require 'fastlane/action'
2
+ require 'fastlane/plugin/cryptex'
3
+
4
+ module Fastlane
5
+ module Actions
6
+ class AcceptAndroidSdkLicensesAction < Action
7
+ def self.run(params)
8
+ sh("yes | $ANDROID_HOME/tools/bin/sdkmanager --licenses || if [ $? -ne '141' ]; then exit $?; fi;")
9
+ end
10
+
11
+ #####################################################
12
+ # @!group Documentation
13
+ #####################################################
14
+
15
+ def self.description
16
+ "Accepts Android sdk licenses"
17
+ end
18
+
19
+ def self.details
20
+ # Optional:
21
+ # this is your chance to provide a more detailed description of this action
22
+ end
23
+
24
+ def self.available_options
25
+ []
26
+ end
27
+
28
+ def self.return_value
29
+ # If your method provides a return value, you can describe here what it does
30
+ end
31
+
32
+ def self.details
33
+ # "Saves the current vars in android/fastlane/.env and ios/fastlane/.env"
34
+ end
35
+
36
+ def self.authors
37
+ # So no one will ever forget your contribution to fastlane :) You are awesome btw!
38
+ ["cball", "isaiahgrey93"]
39
+ end
40
+
41
+ def self.is_supported?(platform)
42
+ [:ios, :android].include?(platform)
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,107 @@
1
+ require 'fastlane/action'
2
+ require 'fastlane/plugin/cryptex'
3
+
4
+ module Fastlane
5
+ module Actions
6
+ class AddAppVarAction < Action
7
+ def self.run(params)
8
+ is_ci = ENV['CI'] === 'true'
9
+ namespace = params[:namespace]
10
+ key = params[:key]
11
+ value = params[:value]
12
+ skip_confirmation= params[:skip_confirmation]
13
+ cryptex_app_key = app_key_for(namespace)
14
+ existing_app_vars = {}
15
+
16
+ if !is_ci && !skip_confirmation && !UI.confirm("This will add #{key}=#{value} to the #{cryptex_app_key} namespace in the encrypted context repo. Proceed?")
17
+ UI.abort_with_message!("Stepping away...")
18
+ end
19
+
20
+ begin
21
+ existing_app_vars = other_action.cryptex(
22
+ type: 'export_env',
23
+ key: cryptex_app_key,
24
+ )
25
+ rescue => ex
26
+ # If key doesn't exist cryptex will error
27
+ end
28
+
29
+ other_action.cryptex(
30
+ type: "import_env",
31
+ key: cryptex_app_key,
32
+ hash: existing_app_vars.merge({ key => value })
33
+ )
34
+
35
+ UI.success('Encrypted app ENV vars')
36
+ end
37
+
38
+ #####################################################
39
+ # @!group Documentation
40
+ #####################################################
41
+
42
+ def self.description
43
+ "Adds a single ENV var to the encrypted repository"
44
+ end
45
+
46
+ def self.details
47
+ # Optional:
48
+ # this is your chance to provide a more detailed description of this action
49
+ end
50
+
51
+ def self.available_options
52
+ [
53
+ FastlaneCore::ConfigItem.new(key: :namespace,
54
+ env_name: "FL_ADD_APP_VAR_NAMESPACE",
55
+ description: "What namespace should we use? (alpha, beta, release, ENTER = root)", # a short description of this parameter
56
+ type: String,
57
+ verify_block: lambda do |value|
58
+ unless Helper::ReactNativeReleaseHelper::VALID_NAMESPACES.include?(value)
59
+ UI.user_error!("Invalid namespace #{value}. Valid targets are #{Helper::ReactNativeReleaseHelper::VALID_NAMESPACES.join(', ')}")
60
+ next
61
+ end
62
+ end),
63
+ FastlaneCore::ConfigItem.new(key: :key,
64
+ env_name: "FL_ADD_APP_VAR_KEY",
65
+ description: "Enter the ENV name",
66
+ type: String),
67
+ FastlaneCore::ConfigItem.new(key: :value,
68
+ env_name: "FL_ADD_APP_VAR_VALUE",
69
+ description: "Enter the ENV value",
70
+ type: String),
71
+ FastlaneCore::ConfigItem.new(key: :skip_confirmation,
72
+ env_name: "FL_ENCRYPT_APP_VARS_SKIP_CONFIRMATION", # The name of the environment variable
73
+ description: "Allows commands to be run from within CLI and skip the UI.message confirmation dialog", # a short description of this parameter
74
+ type: Boolean,
75
+ short_option:'s',
76
+ default_value: false,
77
+ optional: true),
78
+ ]
79
+ end
80
+
81
+ def self.return_value
82
+ # If your method provides a return value, you can describe here what it does
83
+ end
84
+
85
+ def self.details
86
+ # "Saves the current vars in android/fastlane/.env and ios/fastlane/.env"
87
+ end
88
+
89
+ def self.authors
90
+ # So no one will ever forget your contribution to fastlane :) You are awesome btw!
91
+ ["cball", "isaiahgrey93","cmejet"]
92
+ end
93
+
94
+ def self.is_supported?(platform)
95
+ [:ios, :android].include?(platform)
96
+ end
97
+
98
+ # Returns the app key for cryptex. optionally namespaced
99
+ def self.app_key_for(namespace)
100
+ default_app_key = Helper::ReactNativeReleaseHelper::APP_CRYPTEX_KEY
101
+ return default_app_key if namespace.strip.empty?
102
+
103
+ "#{namespace}_#{default_app_key}"
104
+ end
105
+ end
106
+ end
107
+ end
@@ -0,0 +1,99 @@
1
+ require 'fastlane/action'
2
+ require 'fastlane/plugin/cryptex'
3
+
4
+ module Fastlane
5
+ module Actions
6
+ class AddFastlaneVarAction < Action
7
+ def self.run(params)
8
+ is_ci = ENV['CI'] === 'true'
9
+ cryptex_key = Helper::ReactNativeReleaseHelper::FASTLANE_CRYPTEX_KEY
10
+
11
+ key = params[:key]
12
+ value = params[:value]
13
+ existing_app_vars = {}
14
+
15
+ if !is_ci && !UI.confirm("This will add #{key}=#{value} to the #{cryptex_key} namespace in the encrypted context repo. Proceed?")
16
+ UI.abort_with_message!("Stepping away...")
17
+ end
18
+
19
+ begin
20
+ existing_vars = other_action.cryptex(
21
+ type: 'export_env',
22
+ key: cryptex_key
23
+ )
24
+ rescue => ex
25
+ # If key doesn't exist cryptex will error
26
+ end
27
+
28
+ other_action.cryptex(
29
+ type: "import_env",
30
+ key: cryptex_key,
31
+ hash: existing_vars.merge({ key => value })
32
+ )
33
+
34
+ UI.success('Encrypted fastlane ENV vars')
35
+ end
36
+
37
+ #####################################################
38
+ # @!group Documentation
39
+ #####################################################
40
+
41
+ def self.description
42
+ "Adds a single ENV var for fastlane to the encrypted repository"
43
+ end
44
+
45
+ def self.details
46
+ # Optional:
47
+ # this is your chance to provide a more detailed description of this action
48
+ end
49
+
50
+ def self.available_options
51
+ [
52
+ FastlaneCore::ConfigItem.new(key: :key,
53
+ env_name: "FL_ADD_APP_VAR_KEY",
54
+ description: "Enter the ENV name",
55
+ type: String),
56
+ FastlaneCore::ConfigItem.new(key: :value,
57
+ env_name: "FL_ADD_APP_VAR_VALUE",
58
+ description: "Enter the ENV value",
59
+ type: String),
60
+ ]
61
+ end
62
+
63
+ def self.return_value
64
+ # If your method provides a return value, you can describe here what it does
65
+ end
66
+
67
+ def self.details
68
+ # "Saves the current vars in android/fastlane/.env and ios/fastlane/.env"
69
+ end
70
+
71
+ def self.authors
72
+ # So no one will ever forget your contribution to fastlane :) You are awesome btw!
73
+ ["cball", "isaiahgrey93"]
74
+ end
75
+
76
+ def self.is_supported?(platform)
77
+ [:ios, :android].include?(platform)
78
+ end
79
+
80
+ # Returns a path for an env var. optionally namespaced
81
+ def self.env_path_for(namespace)
82
+ return default_env_path if namespace.strip.empty?
83
+ "#{default_env_path}.#{namespace}"
84
+ end
85
+
86
+ # Returns the app key for cryptex. optionally namespaced
87
+ def self.app_key_for(namespace)
88
+ default_app_key = Helper::ReactNativeReleaseHelper::APP_CRYPTEX_KEY
89
+ return default_app_key if namespace.strip.empty?
90
+
91
+ "#{namespace}_#{default_app_key}"
92
+ end
93
+
94
+ def self.default_env_path
95
+ Helper::ReactNativeReleaseHelper::APP_ENV_PATH
96
+ end
97
+ end
98
+ end
99
+ end