react-native-bootsplash 4.0.0-beta.1 β 4.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +65 -54
- package/{ReactNativeBootsplash.res β RNBootsplash.res} +2 -2
- package/android/src/main/java/com/zoontek/rnbootsplash/RNBootSplashModule.java +15 -17
- package/bsconfig.json +0 -1
- package/dist/commonjs/generate.js +12 -2
- package/dist/commonjs/generate.js.map +1 -1
- package/dist/module/generate.js +12 -2
- package/dist/module/generate.js.map +1 -1
- package/ios/RNBootSplash.m +10 -13
- package/package.json +4 -4
- package/react-native.config.js +1 -1
- package/src/generate.ts +21 -2
package/README.md
CHANGED
|
@@ -4,18 +4,18 @@
|
|
|
4
4
|
<img align="right" width="160" alt="This library helped you? Consider sponsoring!" src=".github/funding-octocat.svg">
|
|
5
5
|
</a>
|
|
6
6
|
|
|
7
|
-
Show a bootsplash during app startup. Hide it when you are ready
|
|
7
|
+
Show a bootsplash during app startup. Hide it when you are ready.<br>
|
|
8
|
+
**For migration from the v3, check the [`MIGRATION.md` guide](https://github.com/zoontek/react-native-bootsplash/blob/master/MIGRATION.md).**
|
|
8
9
|
|
|
9
10
|
[](https://www.npmjs.org/package/react-native-bootsplash)
|
|
10
11
|
[](https://www.npmjs.org/package/react-native-bootsplash)
|
|
11
12
|
[](https://opensource.org/licenses/MIT)
|
|
12
|
-
<br>
|
|
13
13
|
[](https://www.android.com)
|
|
14
14
|
[](https://developer.apple.com/ios)
|
|
15
15
|
|
|
16
16
|
<p>
|
|
17
17
|
<img height="520" src="https://raw.githubusercontent.com/zoontek/react-native-bootsplash/HEAD/docs/ios_demo.gif?raw=true" alt="iOS demo"></img>
|
|
18
|
-
<img
|
|
18
|
+
<img height="500" src="https://raw.githubusercontent.com/zoontek/react-native-bootsplash/HEAD/docs/android_demo.gif?raw=true" alt="android demo"></img>
|
|
19
19
|
</p>
|
|
20
20
|
|
|
21
21
|
## Support
|
|
@@ -37,7 +37,7 @@ Don't forget going into the `ios` directory to execute a `pod install`.
|
|
|
37
37
|
|
|
38
38
|
## π Manual linking
|
|
39
39
|
|
|
40
|
-
Because this package targets React Native 0.65.0+, you
|
|
40
|
+
Because this package targets React Native 0.65.0+, you probably don't need to link it manually. But if you have a special case, follow these additional instructions:
|
|
41
41
|
|
|
42
42
|
<details>
|
|
43
43
|
<summary><b>π See manual linking instructions</b></summary>
|
|
@@ -110,13 +110,13 @@ $ yarn react-native generate-bootsplash --help
|
|
|
110
110
|
The command can take multiple arguments:
|
|
111
111
|
|
|
112
112
|
```bash
|
|
113
|
-
react-native generate-bootsplash <logoPath>
|
|
113
|
+
yarn react-native generate-bootsplash <logoPath>
|
|
114
114
|
|
|
115
115
|
Generate a launch screen using an original logo file
|
|
116
116
|
|
|
117
117
|
Options:
|
|
118
118
|
--background-color <color> color used as launch screen background (in hexadecimal format) (default: "#fff")
|
|
119
|
-
--logo-width <width> logo width at @1x (in dp - we
|
|
119
|
+
--logo-width <width> logo width at @1x (in dp - we recommend approximately ~100) (default: 100)
|
|
120
120
|
--assets-path [path] path to your static assets directory (useful to require the logo file in JS)
|
|
121
121
|
--flavor <flavor> [android only] flavor build variant (outputs in an android resource directory other than "main")
|
|
122
122
|
-h, --help output usage information
|
|
@@ -137,6 +137,13 @@ yarn react-native generate-bootsplash assets/bootsplash_logo_original.png \
|
|
|
137
137
|
This tool relies on the naming conventions that are used in the `/example` project and will therefore create the following files:
|
|
138
138
|
|
|
139
139
|
```bash
|
|
140
|
+
# Only if --assets-path was specified
|
|
141
|
+
assets/bootsplash_logo.png
|
|
142
|
+
assets/bootsplash_logo@1,5x.png
|
|
143
|
+
assets/bootsplash_logo@2x.png
|
|
144
|
+
assets/bootsplash_logo@3x.png
|
|
145
|
+
assets/bootsplash_logo@4x.png
|
|
146
|
+
|
|
140
147
|
android/app/src/main/res/values/colors.xml (creation and edition)
|
|
141
148
|
android/app/src/main/res/mipmap-hdpi/bootsplash_logo.png
|
|
142
149
|
android/app/src/main/res/mipmap-mdpi/bootsplash_logo.png
|
|
@@ -148,13 +155,6 @@ ios/YourProjectName/BootSplash.storyboard
|
|
|
148
155
|
ios/YourProjectName/Images.xcassets/BootSplashLogo.imageset/bootsplash_logo.png
|
|
149
156
|
ios/YourProjectName/Images.xcassets/BootSplashLogo.imageset/bootsplash_logo@2x.png
|
|
150
157
|
ios/YourProjectName/Images.xcassets/BootSplashLogo.imageset/bootsplash_logo@3x.png
|
|
151
|
-
|
|
152
|
-
# Only if --assets-path was specified
|
|
153
|
-
assets/bootsplash_logo.png
|
|
154
|
-
assets/bootsplash_logo@1,5x.png
|
|
155
|
-
assets/bootsplash_logo@2x.png
|
|
156
|
-
assets/bootsplash_logo@3x.png
|
|
157
|
-
assets/bootsplash_logo@4x.png
|
|
158
158
|
```
|
|
159
159
|
|
|
160
160
|
### iOS
|
|
@@ -201,65 +201,78 @@ Set the `BootSplash.storyboard` as launch screen file:
|
|
|
201
201
|
buildscript {
|
|
202
202
|
ext {
|
|
203
203
|
buildToolsVersion = "30.0.2"
|
|
204
|
-
minSdkVersion = 23 // <-
|
|
204
|
+
minSdkVersion = 23 // <- AndroidX splashscreen has basic support for 21 (only the background color), so 23 is best
|
|
205
205
|
compileSdkVersion = 31 // <- set at least 31
|
|
206
206
|
targetSdkVersion = 31 // <- set at least 31
|
|
207
207
|
|
|
208
208
|
// β¦
|
|
209
209
|
```
|
|
210
210
|
|
|
211
|
-
2.
|
|
211
|
+
2. Then edit your `android/app/build.gradle` file:
|
|
212
|
+
|
|
213
|
+
```gradle
|
|
214
|
+
dependencies {
|
|
215
|
+
implementation fileTree(dir: "libs", include: ["*.jar"])
|
|
216
|
+
//noinspection GradleDynamicVersion
|
|
217
|
+
implementation "com.facebook.react:react-native:+" // From node_modules
|
|
218
|
+
|
|
219
|
+
implementation "androidx.core:core-splashscreen:1.0.0-alpha02" // Add this line
|
|
220
|
+
|
|
221
|
+
// β¦
|
|
222
|
+
```
|
|
223
|
+
|
|
224
|
+
3. Edit your `android/app/src/main/res/values/styles.xml` file:
|
|
212
225
|
|
|
213
226
|
```xml
|
|
214
227
|
<resources>
|
|
215
228
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
229
|
+
<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
|
|
230
|
+
<!-- Your base theme customization -->
|
|
231
|
+
</style>
|
|
219
232
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
233
|
+
<!-- BootTheme should inherit from Theme.SplashScreen -->
|
|
234
|
+
<style name="BootTheme" parent="Theme.SplashScreen">
|
|
235
|
+
<item name="windowSplashScreenBackground">@color/bootsplash_background</item>
|
|
236
|
+
<item name="windowSplashScreenAnimatedIcon">@mipmap/bootsplash_logo</item>
|
|
237
|
+
<item name="postSplashScreenTheme">@style/AppTheme</item>
|
|
238
|
+
</style>
|
|
226
239
|
|
|
227
240
|
</resources>
|
|
228
241
|
```
|
|
229
242
|
|
|
230
|
-
|
|
243
|
+
4. Edit your `android/app/src/main/AndroidManifest.xml` file:
|
|
231
244
|
|
|
232
245
|
```xml
|
|
233
246
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
|
234
247
|
package="com.rnbootsplashexample">
|
|
235
248
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
249
|
+
<!-- β¦ -->
|
|
250
|
+
|
|
251
|
+
<application
|
|
252
|
+
android:name=".MainApplication"
|
|
253
|
+
android:label="@string/app_name"
|
|
254
|
+
android:icon="@mipmap/ic_launcher"
|
|
255
|
+
android:roundIcon="@mipmap/ic_launcher_round"
|
|
256
|
+
android:allowBackup="false"
|
|
257
|
+
android:theme="@style/BootTheme"> <!-- Replace @style/AppTheme with @style/BootTheme -->
|
|
258
|
+
<activity
|
|
259
|
+
android:name=".MainActivity"
|
|
260
|
+
android:label="@string/app_name"
|
|
261
|
+
android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"
|
|
262
|
+
android:launchMode="singleTask"
|
|
263
|
+
android:windowSoftInputMode="adjustResize"
|
|
264
|
+
android:exported="true"> <!-- Add android:exported="true" -->
|
|
265
|
+
<intent-filter>
|
|
266
|
+
<action android:name="android.intent.action.MAIN" />
|
|
267
|
+
<category android:name="android.intent.category.LAUNCHER" />
|
|
268
|
+
</intent-filter>
|
|
269
|
+
</activity>
|
|
270
|
+
</application>
|
|
258
271
|
</manifest>
|
|
259
272
|
|
|
260
273
|
```
|
|
261
274
|
|
|
262
|
-
|
|
275
|
+
5. Finally edit your `android/app/src/main/java/com/yourprojectname/MainActivity.java` file:
|
|
263
276
|
|
|
264
277
|
```java
|
|
265
278
|
import com.facebook.react.ReactActivity;
|
|
@@ -276,7 +289,7 @@ public class MainActivity extends ReactActivity {
|
|
|
276
289
|
|
|
277
290
|
@Override
|
|
278
291
|
protected void loadApp(String appKey) {
|
|
279
|
-
RNBootSplash.init(
|
|
292
|
+
RNBootSplash.init(MainActivity.this); // <- initialize the splash screen
|
|
280
293
|
super.loadApp(appKey);
|
|
281
294
|
}
|
|
282
295
|
};
|
|
@@ -349,7 +362,7 @@ function App() {
|
|
|
349
362
|
|
|
350
363
|
### Testing with Jest
|
|
351
364
|
|
|
352
|
-
Testing code which uses this library
|
|
365
|
+
Testing code which uses this library requires some setup since we need to mock the native methods.
|
|
353
366
|
|
|
354
367
|
To add the mocks, create a file _jest/setup.js_ (or any other file name) containing the following code:
|
|
355
368
|
|
|
@@ -390,8 +403,6 @@ function App() {
|
|
|
390
403
|
|
|
391
404
|
## π΅οΈββοΈ Comparison with [react-native-splash-screen](https://github.com/crazycodeboy/react-native-splash-screen)
|
|
392
405
|
|
|
393
|
-
- If `react-native-splash-screen` encourages you to display an image over your application, `react-native-bootsplash` way-to-go is to design your launch screen using platforms tools
|
|
394
|
-
|
|
406
|
+
- If `react-native-splash-screen` encourages you to display an image over your application, `react-native-bootsplash` way-to-go is to design your launch screen using platforms tools.
|
|
395
407
|
- It should not prevent you from seeing red screen errors.
|
|
396
|
-
|
|
397
|
-
- Hiding the launch screen is configurable: fade it out or hide it without any animation at all (no fade needed if you want to animate it out!).
|
|
408
|
+
- Hiding the launch screen is configurable: fade it out or hide it without any animation.
|
|
@@ -12,13 +12,13 @@ external getVisibilityStatus: unit => Js.Promise.t<visibilityStatus> = "getVisib
|
|
|
12
12
|
## Usage
|
|
13
13
|
|
|
14
14
|
```rescript
|
|
15
|
-
|
|
15
|
+
RNBootsplash.hide({fade: true})->ignore
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
Or
|
|
19
19
|
|
|
20
20
|
```rescript
|
|
21
|
-
|
|
21
|
+
RNBootsplash.hide({fade: true})->Js.Promise.then_(() => {
|
|
22
22
|
Js.log("RN BootSplash: fading is over")
|
|
23
23
|
Js.Promise.resolve()
|
|
24
24
|
}, _)->Js.Promise.catch(error => {
|
|
@@ -21,7 +21,7 @@ import com.facebook.react.bridge.UiThreadUtil;
|
|
|
21
21
|
import com.facebook.react.common.ReactConstants;
|
|
22
22
|
import com.facebook.react.module.annotations.ReactModule;
|
|
23
23
|
|
|
24
|
-
import java.util.
|
|
24
|
+
import java.util.Stack;
|
|
25
25
|
import java.util.Timer;
|
|
26
26
|
import java.util.TimerTask;
|
|
27
27
|
|
|
@@ -40,9 +40,9 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
|
|
|
40
40
|
@Nullable
|
|
41
41
|
private static SplashScreen mSplashScreen = null;
|
|
42
42
|
|
|
43
|
-
private static final
|
|
43
|
+
private static final Stack<RNBootSplashTask> mTaskStack = new Stack<>();
|
|
44
44
|
private static Status mStatus = Status.HIDDEN;
|
|
45
|
-
private static boolean
|
|
45
|
+
private static boolean mIsAppInForeground = true;
|
|
46
46
|
private static boolean mShouldFade = false;
|
|
47
47
|
private static boolean mShouldKeepOnScreen = true;
|
|
48
48
|
|
|
@@ -76,7 +76,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
|
|
|
76
76
|
|
|
77
77
|
mSplashScreen.setOnExitAnimationListener(new SplashScreen.OnExitAnimationListener() {
|
|
78
78
|
@Override
|
|
79
|
-
public void onSplashScreenExit(@NonNull SplashScreenViewProvider splashScreenViewProvider) {
|
|
79
|
+
public void onSplashScreenExit(@NonNull final SplashScreenViewProvider splashScreenViewProvider) {
|
|
80
80
|
View splashScreenView = splashScreenViewProvider.getView();
|
|
81
81
|
|
|
82
82
|
splashScreenView
|
|
@@ -99,29 +99,27 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
|
|
|
99
99
|
|
|
100
100
|
@Override
|
|
101
101
|
public void onHostDestroy() {
|
|
102
|
-
|
|
102
|
+
mIsAppInForeground = false;
|
|
103
103
|
}
|
|
104
104
|
|
|
105
105
|
@Override
|
|
106
106
|
public void onHostPause() {
|
|
107
|
-
|
|
107
|
+
mIsAppInForeground = false;
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
@Override
|
|
111
111
|
public void onHostResume() {
|
|
112
|
-
|
|
112
|
+
mIsAppInForeground = true;
|
|
113
113
|
shiftNextTask();
|
|
114
114
|
}
|
|
115
115
|
|
|
116
116
|
private void shiftNextTask() {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
RNBootSplashTask task = mTaskQueue.remove(0);
|
|
124
|
-
hideWithTask(task);
|
|
117
|
+
if (mStatus != Status.TRANSITIONING &&
|
|
118
|
+
mIsAppInForeground &&
|
|
119
|
+
mTaskStack.size() > 0) {
|
|
120
|
+
RNBootSplashTask task = mTaskStack.pop();
|
|
121
|
+
hideWithTask(task);
|
|
122
|
+
}
|
|
125
123
|
}
|
|
126
124
|
|
|
127
125
|
private void waitAndRetry() {
|
|
@@ -170,8 +168,8 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
|
|
|
170
168
|
@Override
|
|
171
169
|
public void run() {
|
|
172
170
|
mStatus = Status.HIDDEN;
|
|
173
|
-
promise.resolve(true);
|
|
174
171
|
timer.cancel();
|
|
172
|
+
promise.resolve(true);
|
|
175
173
|
shiftNextTask();
|
|
176
174
|
}
|
|
177
175
|
}, ANIMATION_DURATION);
|
|
@@ -184,7 +182,7 @@ public class RNBootSplashModule extends ReactContextBaseJavaModule implements Li
|
|
|
184
182
|
if (mSplashScreen == null || mStatus == Status.HIDDEN) {
|
|
185
183
|
promise.resolve(true);
|
|
186
184
|
} else {
|
|
187
|
-
|
|
185
|
+
mTaskStack.push(new RNBootSplashTask(fade, promise));
|
|
188
186
|
shiftNextTask();
|
|
189
187
|
}
|
|
190
188
|
}
|
package/bsconfig.json
CHANGED
|
@@ -137,9 +137,10 @@ const generate = async _ref2 => {
|
|
|
137
137
|
|
|
138
138
|
const getHeight = size => Math.ceil(size * (image.bitmap.height / image.bitmap.width));
|
|
139
139
|
|
|
140
|
-
const logWrite = (emoji, filePath, dimensions) => log(`${emoji} ${_path.default.relative(workingPath, filePath)}` + (dimensions != null ? ` (${dimensions.width}x${dimensions.height})` : "")
|
|
140
|
+
const logWrite = (emoji, filePath, dimensions) => log(`${emoji} ${_path.default.relative(workingPath, filePath)}` + (dimensions != null ? ` (${dimensions.width}x${dimensions.height})` : ""));
|
|
141
141
|
|
|
142
142
|
if (assetsPath && _fsExtra.default.existsSync(assetsPath)) {
|
|
143
|
+
log(`\n ${_chalk.default.underline("Assets")}`);
|
|
143
144
|
await Promise.all([{
|
|
144
145
|
ratio: 1,
|
|
145
146
|
suffix: ""
|
|
@@ -176,6 +177,7 @@ const generate = async _ref2 => {
|
|
|
176
177
|
}
|
|
177
178
|
|
|
178
179
|
if (android) {
|
|
180
|
+
log(`\n ${_chalk.default.underline("Android")}`);
|
|
179
181
|
const appPath = android.appName ? _path.default.resolve(android.sourceDir, android.appName) : _path.default.resolve(android.sourceDir); // @react-native-community/cli 2.x & 3.x support
|
|
180
182
|
|
|
181
183
|
const resPath = _path.default.resolve(appPath, "src", flavor, "res");
|
|
@@ -246,6 +248,7 @@ const generate = async _ref2 => {
|
|
|
246
248
|
}
|
|
247
249
|
|
|
248
250
|
if (ios) {
|
|
251
|
+
log(`\n ${_chalk.default.underline("iOS")}`);
|
|
249
252
|
const projectPath = ios.projectPath.replace(/.xcodeproj$/, "");
|
|
250
253
|
|
|
251
254
|
const imagesPath = _path.default.resolve(projectPath, "Images.xcassets");
|
|
@@ -259,7 +262,7 @@ const generate = async _ref2 => {
|
|
|
259
262
|
backgroundColor: backgroundColorHex
|
|
260
263
|
}), "utf-8");
|
|
261
264
|
|
|
262
|
-
|
|
265
|
+
logWrite("β¨", storyboardPath);
|
|
263
266
|
} else {
|
|
264
267
|
log(`No "${projectPath}" directory found. Skipping iOS storyboard generationβ¦`);
|
|
265
268
|
}
|
|
@@ -303,6 +306,13 @@ const generate = async _ref2 => {
|
|
|
303
306
|
}
|
|
304
307
|
}
|
|
305
308
|
|
|
309
|
+
log(`
|
|
310
|
+
${_chalk.default.blue("βββββββββββββββββββββββββββββββββββββββββββββββββ")}
|
|
311
|
+
${_chalk.default.blue("β")} π ${_chalk.default.bold("Love this library? Consider sponsoring!")} ${_chalk.default.blue("β")}
|
|
312
|
+
${_chalk.default.blue("β")} One-time amounts are available. ${_chalk.default.blue("β")}
|
|
313
|
+
${_chalk.default.blue("β")} ${_chalk.default.underline("https://github.com/sponsors/zoontek")} ${_chalk.default.blue("β")}
|
|
314
|
+
${_chalk.default.blue("βββββββββββββββββββββββββββββββββββββββββββββββββ")}
|
|
315
|
+
`);
|
|
306
316
|
log(`β
Done! Thanks for using ${_chalk.default.underline("react-native-bootsplash")}.`);
|
|
307
317
|
};
|
|
308
318
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["generate.ts"],"names":["logoFileName","xcassetName","splashScreenIconSizeNoBackground","androidColorName","androidColorRegex","ContentsJson","getStoryboard","height","width","backgroundColor","hex","r","parseInt","toPrecision","g","b","log","text","dim","console","chalk","isValidHexadecimal","value","test","toFullHexadecimal","prefixed","up","toUpperCase","length","generate","android","ios","workingPath","logoPath","logoWidth","flavor","assetsPath","Error","image","Jimp","read","backgroundColorHex","getHeight","size","Math","ceil","bitmap","logWrite","emoji","filePath","dimensions","path","relative","fs","existsSync","Promise","all","ratio","suffix","map","fileName","resolve","clone","resize","quality","writeAsync","then","appPath","appName","sourceDir","resPath","valuesPath","ensureDirSync","colorsXmlPath","colorsXmlEntry","colorsXml","readFileSync","match","writeFileSync","replace","directory","canvasSize","canvas","logo","x","y","blit","projectPath","imagesPath","storyboardPath","imageSetPath","underline"],"mappings":"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","sourcesContent":["import chalk from \"chalk\";\nimport fs from \"fs-extra\";\nimport Jimp from \"jimp\";\nimport path from \"path\";\n\nconst logoFileName = \"bootsplash_logo\";\nconst xcassetName = \"BootSplashLogo\";\n// https://github.com/androidx/androidx/blob/androidx-main/core/core-splashscreen/src/main/res/values/dimens.xml#L22\nconst splashScreenIconSizeNoBackground = 288;\nconst androidColorName = \"bootsplash_background\";\nconst androidColorRegex = /<color name=\"bootsplash_background\">#\\w+<\\/color>/g;\n\nconst ContentsJson = `{\n \"images\": [\n {\n \"idiom\": \"universal\",\n \"filename\": \"${logoFileName}.png\",\n \"scale\": \"1x\"\n },\n {\n \"idiom\": \"universal\",\n \"filename\": \"${logoFileName}@2x.png\",\n \"scale\": \"2x\"\n },\n {\n \"idiom\": \"universal\",\n \"filename\": \"${logoFileName}@3x.png\",\n \"scale\": \"3x\"\n }\n ],\n \"info\": {\n \"version\": 1,\n \"author\": \"xcode\"\n }\n}\n`;\n\nconst getStoryboard = ({\n height,\n width,\n backgroundColor: hex,\n}: {\n height: number;\n width: number;\n backgroundColor: string;\n}) => {\n const r = (parseInt(hex[1] + hex[2], 16) / 255).toPrecision(15);\n const g = (parseInt(hex[3] + hex[4], 16) / 255).toPrecision(15);\n const b = (parseInt(hex[5] + hex[6], 16) / 255).toPrecision(15);\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"17147\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n <device id=\"retina4_7\" orientation=\"portrait\" appearance=\"light\"/>\n <dependencies>\n <deployment identifier=\"iOS\"/>\n <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"17120\"/>\n <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n </dependencies>\n <scenes>\n <!--View Controller-->\n <scene sceneID=\"EHf-IW-A2E\">\n <objects>\n <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n <view key=\"view\" autoresizesSubviews=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n <autoresizingMask key=\"autoresizingMask\"/>\n <subviews>\n <imageView autoresizesSubviews=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" image=\"BootSplashLogo\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3lX-Ut-9ad\">\n <rect key=\"frame\" x=\"${(375 - width) / 2}\" y=\"${\n (667 - height) / 2\n }\" width=\"${width}\" height=\"${height}\"/>\n <accessibility key=\"accessibilityConfiguration\">\n <accessibilityTraits key=\"traits\" image=\"YES\" notEnabled=\"YES\"/>\n </accessibility>\n </imageView>\n </subviews>\n <viewLayoutGuide key=\"safeArea\" id=\"Bcu-3y-fUS\"/>\n <color key=\"backgroundColor\" red=\"${r}\" green=\"${g}\" blue=\"${b}\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n <accessibility key=\"accessibilityConfiguration\">\n <accessibilityTraits key=\"traits\" notEnabled=\"YES\"/>\n </accessibility>\n <constraints>\n <constraint firstItem=\"3lX-Ut-9ad\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"Fh9-Fy-1nT\"/>\n <constraint firstItem=\"3lX-Ut-9ad\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"nvB-Ic-PnI\"/>\n </constraints>\n </view>\n </viewController>\n <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n </objects>\n <point key=\"canvasLocation\" x=\"0.0\" y=\"0.0\"/>\n </scene>\n </scenes>\n <resources>\n <image name=\"${xcassetName}\" width=\"${width}\" height=\"${height}\"/>\n </resources>\n</document>\n`;\n};\n\nconst log = (text: string, dim = false) => {\n console.log(dim ? chalk.dim(text) : text);\n};\n\nconst isValidHexadecimal = (value: string) =>\n /^#?([0-9A-F]{3}){1,2}$/i.test(value);\n\nconst toFullHexadecimal = (hex: string) => {\n const prefixed = hex[0] === \"#\" ? hex : `#${hex}`;\n const up = prefixed.toUpperCase();\n\n return up.length === 4\n ? \"#\" + up[1] + up[1] + up[2] + up[2] + up[3] + up[3]\n : up;\n};\n\nexport const generate = async ({\n android,\n ios,\n\n workingPath,\n logoPath,\n backgroundColor,\n logoWidth,\n flavor,\n assetsPath,\n}: {\n android: {\n sourceDir: string;\n appName: string;\n } | null;\n ios: {\n projectPath: string;\n } | null;\n\n workingPath: string;\n logoPath: string;\n assetsPath?: string;\n\n backgroundColor: string;\n flavor: string;\n logoWidth: number;\n}) => {\n if (!isValidHexadecimal(backgroundColor)) {\n throw new Error(\n \"--background-color value is not a valid hexadecimal color.\",\n );\n }\n\n const image = await Jimp.read(logoPath);\n const backgroundColorHex = toFullHexadecimal(backgroundColor);\n\n const getHeight = (size: number) =>\n Math.ceil(size * (image.bitmap.height / image.bitmap.width));\n\n const logWrite = (\n emoji: string,\n filePath: string,\n dimensions?: { width: number; height: number },\n ) =>\n log(\n `${emoji} ${path.relative(workingPath, filePath)}` +\n (dimensions != null\n ? ` (${dimensions.width}x${dimensions.height})`\n : \"\"),\n true,\n );\n\n if (assetsPath && fs.existsSync(assetsPath)) {\n await Promise.all(\n [\n { ratio: 1, suffix: \"\" },\n { ratio: 1.5, suffix: \"@1,5x\" },\n { ratio: 2, suffix: \"@2x\" },\n { ratio: 3, suffix: \"@3x\" },\n { ratio: 4, suffix: \"@4x\" },\n ].map(({ ratio, suffix }) => {\n const fileName = `${logoFileName}${suffix}.png`;\n const filePath = path.resolve(assetsPath, fileName);\n const width = logoWidth * ratio;\n const height = getHeight(width);\n\n return image\n .clone()\n .resize(width, height)\n .quality(100)\n .writeAsync(filePath)\n .then(() => {\n logWrite(\"β¨\", filePath, { width, height });\n });\n }),\n );\n }\n\n if (android) {\n const appPath = android.appName\n ? path.resolve(android.sourceDir, android.appName)\n : path.resolve(android.sourceDir); // @react-native-community/cli 2.x & 3.x support\n\n const resPath = path.resolve(appPath, \"src\", flavor, \"res\");\n const valuesPath = path.resolve(resPath, \"values\");\n\n fs.ensureDirSync(valuesPath);\n\n const colorsXmlPath = path.resolve(valuesPath, \"colors.xml\");\n const colorsXmlEntry = `<color name=\"${androidColorName}\">${backgroundColorHex}</color>`;\n\n if (fs.existsSync(colorsXmlPath)) {\n const colorsXml = fs.readFileSync(colorsXmlPath, \"utf-8\");\n\n if (colorsXml.match(androidColorRegex)) {\n fs.writeFileSync(\n colorsXmlPath,\n colorsXml.replace(androidColorRegex, colorsXmlEntry),\n \"utf-8\",\n );\n } else {\n fs.writeFileSync(\n colorsXmlPath,\n colorsXml.replace(\n /<\\/resources>/g,\n ` ${colorsXmlEntry}\\n</resources>`,\n ),\n \"utf-8\",\n );\n }\n\n logWrite(\"βοΈ \", colorsXmlPath);\n } else {\n fs.writeFileSync(\n colorsXmlPath,\n `<resources>\\n ${colorsXmlEntry}\\n</resources>\\n`,\n \"utf-8\",\n );\n\n logWrite(\"β¨\", colorsXmlPath);\n }\n\n await Promise.all(\n [\n { ratio: 1, directory: \"mipmap-mdpi\" },\n { ratio: 1.5, directory: \"mipmap-hdpi\" },\n { ratio: 2, directory: \"mipmap-xhdpi\" },\n { ratio: 3, directory: \"mipmap-xxhdpi\" },\n { ratio: 4, directory: \"mipmap-xxxhdpi\" },\n ].map(({ ratio, directory }) => {\n const fileName = `${logoFileName}.png`;\n const filePath = path.resolve(resPath, directory, fileName);\n const width = logoWidth * ratio;\n const height = getHeight(width);\n\n const canvasSize = splashScreenIconSizeNoBackground * ratio;\n\n // https://github.com/oliver-moran/jimp/tree/master/packages/jimp#creating-new-images\n const canvas = new Jimp(canvasSize, canvasSize, 0xffffff00);\n const logo = image.clone().resize(width, height);\n\n const x = (canvasSize - width) / 2;\n const y = (canvasSize - height) / 2;\n\n return canvas\n .blit(logo, x, y)\n .quality(100)\n .writeAsync(filePath)\n .then(() => {\n logWrite(\"β¨\", filePath, { width: canvasSize, height: canvasSize });\n });\n }),\n );\n }\n\n if (ios) {\n const projectPath = ios.projectPath.replace(/.xcodeproj$/, \"\");\n const imagesPath = path.resolve(projectPath, \"Images.xcassets\");\n\n if (fs.existsSync(projectPath)) {\n const storyboardPath = path.resolve(projectPath, \"BootSplash.storyboard\");\n\n fs.writeFileSync(\n storyboardPath,\n getStoryboard({\n height: getHeight(logoWidth),\n width: logoWidth,\n backgroundColor: backgroundColorHex,\n }),\n \"utf-8\",\n );\n\n log(`β¨ ${path.relative(workingPath, storyboardPath)}`, true);\n } else {\n log(\n `No \"${projectPath}\" directory found. Skipping iOS storyboard generationβ¦`,\n );\n }\n\n if (fs.existsSync(imagesPath)) {\n const imageSetPath = path.resolve(imagesPath, xcassetName + \".imageset\");\n fs.ensureDirSync(imageSetPath);\n\n fs.writeFileSync(\n path.resolve(imageSetPath, \"Contents.json\"),\n ContentsJson,\n \"utf-8\",\n );\n\n await Promise.all(\n [\n { ratio: 1, suffix: \"\" },\n { ratio: 2, suffix: \"@2x\" },\n { ratio: 3, suffix: \"@3x\" },\n ].map(({ ratio, suffix }) => {\n const fileName = `${logoFileName}${suffix}.png`;\n const filePath = path.resolve(imageSetPath, fileName);\n const width = logoWidth * ratio;\n const height = getHeight(width);\n\n return image\n .clone()\n .resize(width, height)\n .quality(100)\n .writeAsync(filePath)\n .then(() => {\n logWrite(\"β¨\", filePath, { width, height });\n });\n }),\n );\n } else {\n log(\n `No \"${imagesPath}\" directory found. Skipping iOS images generationβ¦`,\n );\n }\n }\n\n log(\n `β
Done! Thanks for using ${chalk.underline(\"react-native-bootsplash\")}.`,\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["generate.ts"],"names":["logoFileName","xcassetName","splashScreenIconSizeNoBackground","androidColorName","androidColorRegex","ContentsJson","getStoryboard","height","width","backgroundColor","hex","r","parseInt","toPrecision","g","b","log","text","dim","console","chalk","isValidHexadecimal","value","test","toFullHexadecimal","prefixed","up","toUpperCase","length","generate","android","ios","workingPath","logoPath","logoWidth","flavor","assetsPath","Error","image","Jimp","read","backgroundColorHex","getHeight","size","Math","ceil","bitmap","logWrite","emoji","filePath","dimensions","path","relative","fs","existsSync","underline","Promise","all","ratio","suffix","map","fileName","resolve","clone","resize","quality","writeAsync","then","appPath","appName","sourceDir","resPath","valuesPath","ensureDirSync","colorsXmlPath","colorsXmlEntry","colorsXml","readFileSync","match","writeFileSync","replace","directory","canvasSize","canvas","logo","x","y","blit","projectPath","imagesPath","storyboardPath","imageSetPath","blue","bold"],"mappings":"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","sourcesContent":["import chalk from \"chalk\";\nimport fs from \"fs-extra\";\nimport Jimp from \"jimp\";\nimport path from \"path\";\n\nconst logoFileName = \"bootsplash_logo\";\nconst xcassetName = \"BootSplashLogo\";\n// https://github.com/androidx/androidx/blob/androidx-main/core/core-splashscreen/src/main/res/values/dimens.xml#L22\nconst splashScreenIconSizeNoBackground = 288;\nconst androidColorName = \"bootsplash_background\";\nconst androidColorRegex = /<color name=\"bootsplash_background\">#\\w+<\\/color>/g;\n\nconst ContentsJson = `{\n \"images\": [\n {\n \"idiom\": \"universal\",\n \"filename\": \"${logoFileName}.png\",\n \"scale\": \"1x\"\n },\n {\n \"idiom\": \"universal\",\n \"filename\": \"${logoFileName}@2x.png\",\n \"scale\": \"2x\"\n },\n {\n \"idiom\": \"universal\",\n \"filename\": \"${logoFileName}@3x.png\",\n \"scale\": \"3x\"\n }\n ],\n \"info\": {\n \"version\": 1,\n \"author\": \"xcode\"\n }\n}\n`;\n\nconst getStoryboard = ({\n height,\n width,\n backgroundColor: hex,\n}: {\n height: number;\n width: number;\n backgroundColor: string;\n}) => {\n const r = (parseInt(hex[1] + hex[2], 16) / 255).toPrecision(15);\n const g = (parseInt(hex[3] + hex[4], 16) / 255).toPrecision(15);\n const b = (parseInt(hex[5] + hex[6], 16) / 255).toPrecision(15);\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"17147\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n <device id=\"retina4_7\" orientation=\"portrait\" appearance=\"light\"/>\n <dependencies>\n <deployment identifier=\"iOS\"/>\n <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"17120\"/>\n <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n </dependencies>\n <scenes>\n <!--View Controller-->\n <scene sceneID=\"EHf-IW-A2E\">\n <objects>\n <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n <view key=\"view\" autoresizesSubviews=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n <autoresizingMask key=\"autoresizingMask\"/>\n <subviews>\n <imageView autoresizesSubviews=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" image=\"BootSplashLogo\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3lX-Ut-9ad\">\n <rect key=\"frame\" x=\"${(375 - width) / 2}\" y=\"${\n (667 - height) / 2\n }\" width=\"${width}\" height=\"${height}\"/>\n <accessibility key=\"accessibilityConfiguration\">\n <accessibilityTraits key=\"traits\" image=\"YES\" notEnabled=\"YES\"/>\n </accessibility>\n </imageView>\n </subviews>\n <viewLayoutGuide key=\"safeArea\" id=\"Bcu-3y-fUS\"/>\n <color key=\"backgroundColor\" red=\"${r}\" green=\"${g}\" blue=\"${b}\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n <accessibility key=\"accessibilityConfiguration\">\n <accessibilityTraits key=\"traits\" notEnabled=\"YES\"/>\n </accessibility>\n <constraints>\n <constraint firstItem=\"3lX-Ut-9ad\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"Fh9-Fy-1nT\"/>\n <constraint firstItem=\"3lX-Ut-9ad\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"nvB-Ic-PnI\"/>\n </constraints>\n </view>\n </viewController>\n <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n </objects>\n <point key=\"canvasLocation\" x=\"0.0\" y=\"0.0\"/>\n </scene>\n </scenes>\n <resources>\n <image name=\"${xcassetName}\" width=\"${width}\" height=\"${height}\"/>\n </resources>\n</document>\n`;\n};\n\nconst log = (text: string, dim = false) => {\n console.log(dim ? chalk.dim(text) : text);\n};\n\nconst isValidHexadecimal = (value: string) =>\n /^#?([0-9A-F]{3}){1,2}$/i.test(value);\n\nconst toFullHexadecimal = (hex: string) => {\n const prefixed = hex[0] === \"#\" ? hex : `#${hex}`;\n const up = prefixed.toUpperCase();\n\n return up.length === 4\n ? \"#\" + up[1] + up[1] + up[2] + up[2] + up[3] + up[3]\n : up;\n};\n\nexport const generate = async ({\n android,\n ios,\n\n workingPath,\n logoPath,\n backgroundColor,\n logoWidth,\n flavor,\n assetsPath,\n}: {\n android: {\n sourceDir: string;\n appName: string;\n } | null;\n ios: {\n projectPath: string;\n } | null;\n\n workingPath: string;\n logoPath: string;\n assetsPath?: string;\n\n backgroundColor: string;\n flavor: string;\n logoWidth: number;\n}) => {\n if (!isValidHexadecimal(backgroundColor)) {\n throw new Error(\n \"--background-color value is not a valid hexadecimal color.\",\n );\n }\n\n const image = await Jimp.read(logoPath);\n const backgroundColorHex = toFullHexadecimal(backgroundColor);\n\n const getHeight = (size: number) =>\n Math.ceil(size * (image.bitmap.height / image.bitmap.width));\n\n const logWrite = (\n emoji: string,\n filePath: string,\n dimensions?: { width: number; height: number },\n ) =>\n log(\n `${emoji} ${path.relative(workingPath, filePath)}` +\n (dimensions != null\n ? ` (${dimensions.width}x${dimensions.height})`\n : \"\"),\n );\n\n if (assetsPath && fs.existsSync(assetsPath)) {\n log(`\\n ${chalk.underline(\"Assets\")}`);\n\n await Promise.all(\n [\n { ratio: 1, suffix: \"\" },\n { ratio: 1.5, suffix: \"@1,5x\" },\n { ratio: 2, suffix: \"@2x\" },\n { ratio: 3, suffix: \"@3x\" },\n { ratio: 4, suffix: \"@4x\" },\n ].map(({ ratio, suffix }) => {\n const fileName = `${logoFileName}${suffix}.png`;\n const filePath = path.resolve(assetsPath, fileName);\n const width = logoWidth * ratio;\n const height = getHeight(width);\n\n return image\n .clone()\n .resize(width, height)\n .quality(100)\n .writeAsync(filePath)\n .then(() => {\n logWrite(\"β¨\", filePath, { width, height });\n });\n }),\n );\n }\n\n if (android) {\n log(`\\n ${chalk.underline(\"Android\")}`);\n\n const appPath = android.appName\n ? path.resolve(android.sourceDir, android.appName)\n : path.resolve(android.sourceDir); // @react-native-community/cli 2.x & 3.x support\n\n const resPath = path.resolve(appPath, \"src\", flavor, \"res\");\n const valuesPath = path.resolve(resPath, \"values\");\n\n fs.ensureDirSync(valuesPath);\n\n const colorsXmlPath = path.resolve(valuesPath, \"colors.xml\");\n const colorsXmlEntry = `<color name=\"${androidColorName}\">${backgroundColorHex}</color>`;\n\n if (fs.existsSync(colorsXmlPath)) {\n const colorsXml = fs.readFileSync(colorsXmlPath, \"utf-8\");\n\n if (colorsXml.match(androidColorRegex)) {\n fs.writeFileSync(\n colorsXmlPath,\n colorsXml.replace(androidColorRegex, colorsXmlEntry),\n \"utf-8\",\n );\n } else {\n fs.writeFileSync(\n colorsXmlPath,\n colorsXml.replace(\n /<\\/resources>/g,\n ` ${colorsXmlEntry}\\n</resources>`,\n ),\n \"utf-8\",\n );\n }\n\n logWrite(\"βοΈ \", colorsXmlPath);\n } else {\n fs.writeFileSync(\n colorsXmlPath,\n `<resources>\\n ${colorsXmlEntry}\\n</resources>\\n`,\n \"utf-8\",\n );\n\n logWrite(\"β¨\", colorsXmlPath);\n }\n\n await Promise.all(\n [\n { ratio: 1, directory: \"mipmap-mdpi\" },\n { ratio: 1.5, directory: \"mipmap-hdpi\" },\n { ratio: 2, directory: \"mipmap-xhdpi\" },\n { ratio: 3, directory: \"mipmap-xxhdpi\" },\n { ratio: 4, directory: \"mipmap-xxxhdpi\" },\n ].map(({ ratio, directory }) => {\n const fileName = `${logoFileName}.png`;\n const filePath = path.resolve(resPath, directory, fileName);\n const width = logoWidth * ratio;\n const height = getHeight(width);\n\n const canvasSize = splashScreenIconSizeNoBackground * ratio;\n\n // https://github.com/oliver-moran/jimp/tree/master/packages/jimp#creating-new-images\n const canvas = new Jimp(canvasSize, canvasSize, 0xffffff00);\n const logo = image.clone().resize(width, height);\n\n const x = (canvasSize - width) / 2;\n const y = (canvasSize - height) / 2;\n\n return canvas\n .blit(logo, x, y)\n .quality(100)\n .writeAsync(filePath)\n .then(() => {\n logWrite(\"β¨\", filePath, { width: canvasSize, height: canvasSize });\n });\n }),\n );\n }\n\n if (ios) {\n log(`\\n ${chalk.underline(\"iOS\")}`);\n\n const projectPath = ios.projectPath.replace(/.xcodeproj$/, \"\");\n const imagesPath = path.resolve(projectPath, \"Images.xcassets\");\n\n if (fs.existsSync(projectPath)) {\n const storyboardPath = path.resolve(projectPath, \"BootSplash.storyboard\");\n\n fs.writeFileSync(\n storyboardPath,\n getStoryboard({\n height: getHeight(logoWidth),\n width: logoWidth,\n backgroundColor: backgroundColorHex,\n }),\n \"utf-8\",\n );\n\n logWrite(\"β¨\", storyboardPath);\n } else {\n log(\n `No \"${projectPath}\" directory found. Skipping iOS storyboard generationβ¦`,\n );\n }\n\n if (fs.existsSync(imagesPath)) {\n const imageSetPath = path.resolve(imagesPath, xcassetName + \".imageset\");\n fs.ensureDirSync(imageSetPath);\n\n fs.writeFileSync(\n path.resolve(imageSetPath, \"Contents.json\"),\n ContentsJson,\n \"utf-8\",\n );\n\n await Promise.all(\n [\n { ratio: 1, suffix: \"\" },\n { ratio: 2, suffix: \"@2x\" },\n { ratio: 3, suffix: \"@3x\" },\n ].map(({ ratio, suffix }) => {\n const fileName = `${logoFileName}${suffix}.png`;\n const filePath = path.resolve(imageSetPath, fileName);\n const width = logoWidth * ratio;\n const height = getHeight(width);\n\n return image\n .clone()\n .resize(width, height)\n .quality(100)\n .writeAsync(filePath)\n .then(() => {\n logWrite(\"β¨\", filePath, { width, height });\n });\n }),\n );\n } else {\n log(\n `No \"${imagesPath}\" directory found. Skipping iOS images generationβ¦`,\n );\n }\n }\n\n log(`\n ${chalk.blue(\"βββββββββββββββββββββββββββββββββββββββββββββββββ\")}\n ${chalk.blue(\"β\")} π ${chalk.bold(\n \"Love this library? Consider sponsoring!\",\n )} ${chalk.blue(\"β\")}\n ${chalk.blue(\"β\")} One-time amounts are available. ${chalk.blue(\n \"β\",\n )}\n ${chalk.blue(\"β\")} ${chalk.underline(\n \"https://github.com/sponsors/zoontek\",\n )} ${chalk.blue(\"β\")}\n ${chalk.blue(\"βββββββββββββββββββββββββββββββββββββββββββββββββ\")}\n`);\n\n log(\n `β
Done! Thanks for using ${chalk.underline(\"react-native-bootsplash\")}.`,\n );\n};\n"]}
|
package/dist/module/generate.js
CHANGED
|
@@ -124,9 +124,10 @@ export const generate = async _ref2 => {
|
|
|
124
124
|
|
|
125
125
|
const getHeight = size => Math.ceil(size * (image.bitmap.height / image.bitmap.width));
|
|
126
126
|
|
|
127
|
-
const logWrite = (emoji, filePath, dimensions) => log(`${emoji} ${path.relative(workingPath, filePath)}` + (dimensions != null ? ` (${dimensions.width}x${dimensions.height})` : "")
|
|
127
|
+
const logWrite = (emoji, filePath, dimensions) => log(`${emoji} ${path.relative(workingPath, filePath)}` + (dimensions != null ? ` (${dimensions.width}x${dimensions.height})` : ""));
|
|
128
128
|
|
|
129
129
|
if (assetsPath && fs.existsSync(assetsPath)) {
|
|
130
|
+
log(`\n ${chalk.underline("Assets")}`);
|
|
130
131
|
await Promise.all([{
|
|
131
132
|
ratio: 1,
|
|
132
133
|
suffix: ""
|
|
@@ -161,6 +162,7 @@ export const generate = async _ref2 => {
|
|
|
161
162
|
}
|
|
162
163
|
|
|
163
164
|
if (android) {
|
|
165
|
+
log(`\n ${chalk.underline("Android")}`);
|
|
164
166
|
const appPath = android.appName ? path.resolve(android.sourceDir, android.appName) : path.resolve(android.sourceDir); // @react-native-community/cli 2.x & 3.x support
|
|
165
167
|
|
|
166
168
|
const resPath = path.resolve(appPath, "src", flavor, "res");
|
|
@@ -224,6 +226,7 @@ export const generate = async _ref2 => {
|
|
|
224
226
|
}
|
|
225
227
|
|
|
226
228
|
if (ios) {
|
|
229
|
+
log(`\n ${chalk.underline("iOS")}`);
|
|
227
230
|
const projectPath = ios.projectPath.replace(/.xcodeproj$/, "");
|
|
228
231
|
const imagesPath = path.resolve(projectPath, "Images.xcassets");
|
|
229
232
|
|
|
@@ -234,7 +237,7 @@ export const generate = async _ref2 => {
|
|
|
234
237
|
width: logoWidth,
|
|
235
238
|
backgroundColor: backgroundColorHex
|
|
236
239
|
}), "utf-8");
|
|
237
|
-
|
|
240
|
+
logWrite("β¨", storyboardPath);
|
|
238
241
|
} else {
|
|
239
242
|
log(`No "${projectPath}" directory found. Skipping iOS storyboard generationβ¦`);
|
|
240
243
|
}
|
|
@@ -273,6 +276,13 @@ export const generate = async _ref2 => {
|
|
|
273
276
|
}
|
|
274
277
|
}
|
|
275
278
|
|
|
279
|
+
log(`
|
|
280
|
+
${chalk.blue("βββββββββββββββββββββββββββββββββββββββββββββββββ")}
|
|
281
|
+
${chalk.blue("β")} π ${chalk.bold("Love this library? Consider sponsoring!")} ${chalk.blue("β")}
|
|
282
|
+
${chalk.blue("β")} One-time amounts are available. ${chalk.blue("β")}
|
|
283
|
+
${chalk.blue("β")} ${chalk.underline("https://github.com/sponsors/zoontek")} ${chalk.blue("β")}
|
|
284
|
+
${chalk.blue("βββββββββββββββββββββββββββββββββββββββββββββββββ")}
|
|
285
|
+
`);
|
|
276
286
|
log(`β
Done! Thanks for using ${chalk.underline("react-native-bootsplash")}.`);
|
|
277
287
|
};
|
|
278
288
|
//# sourceMappingURL=generate.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["generate.ts"],"names":["chalk","fs","Jimp","path","logoFileName","xcassetName","splashScreenIconSizeNoBackground","androidColorName","androidColorRegex","ContentsJson","getStoryboard","height","width","backgroundColor","hex","r","parseInt","toPrecision","g","b","log","text","dim","console","isValidHexadecimal","value","test","toFullHexadecimal","prefixed","up","toUpperCase","length","generate","android","ios","workingPath","logoPath","logoWidth","flavor","assetsPath","Error","image","read","backgroundColorHex","getHeight","size","Math","ceil","bitmap","logWrite","emoji","filePath","dimensions","relative","existsSync","Promise","all","ratio","suffix","map","fileName","resolve","clone","resize","quality","writeAsync","then","appPath","appName","sourceDir","resPath","valuesPath","ensureDirSync","colorsXmlPath","colorsXmlEntry","colorsXml","readFileSync","match","writeFileSync","replace","directory","canvasSize","canvas","logo","x","y","blit","projectPath","imagesPath","storyboardPath","imageSetPath","underline"],"mappings":"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","sourcesContent":["import chalk from \"chalk\";\nimport fs from \"fs-extra\";\nimport Jimp from \"jimp\";\nimport path from \"path\";\n\nconst logoFileName = \"bootsplash_logo\";\nconst xcassetName = \"BootSplashLogo\";\n// https://github.com/androidx/androidx/blob/androidx-main/core/core-splashscreen/src/main/res/values/dimens.xml#L22\nconst splashScreenIconSizeNoBackground = 288;\nconst androidColorName = \"bootsplash_background\";\nconst androidColorRegex = /<color name=\"bootsplash_background\">#\\w+<\\/color>/g;\n\nconst ContentsJson = `{\n \"images\": [\n {\n \"idiom\": \"universal\",\n \"filename\": \"${logoFileName}.png\",\n \"scale\": \"1x\"\n },\n {\n \"idiom\": \"universal\",\n \"filename\": \"${logoFileName}@2x.png\",\n \"scale\": \"2x\"\n },\n {\n \"idiom\": \"universal\",\n \"filename\": \"${logoFileName}@3x.png\",\n \"scale\": \"3x\"\n }\n ],\n \"info\": {\n \"version\": 1,\n \"author\": \"xcode\"\n }\n}\n`;\n\nconst getStoryboard = ({\n height,\n width,\n backgroundColor: hex,\n}: {\n height: number;\n width: number;\n backgroundColor: string;\n}) => {\n const r = (parseInt(hex[1] + hex[2], 16) / 255).toPrecision(15);\n const g = (parseInt(hex[3] + hex[4], 16) / 255).toPrecision(15);\n const b = (parseInt(hex[5] + hex[6], 16) / 255).toPrecision(15);\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"17147\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n <device id=\"retina4_7\" orientation=\"portrait\" appearance=\"light\"/>\n <dependencies>\n <deployment identifier=\"iOS\"/>\n <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"17120\"/>\n <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n </dependencies>\n <scenes>\n <!--View Controller-->\n <scene sceneID=\"EHf-IW-A2E\">\n <objects>\n <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n <view key=\"view\" autoresizesSubviews=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n <autoresizingMask key=\"autoresizingMask\"/>\n <subviews>\n <imageView autoresizesSubviews=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" image=\"BootSplashLogo\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3lX-Ut-9ad\">\n <rect key=\"frame\" x=\"${(375 - width) / 2}\" y=\"${\n (667 - height) / 2\n }\" width=\"${width}\" height=\"${height}\"/>\n <accessibility key=\"accessibilityConfiguration\">\n <accessibilityTraits key=\"traits\" image=\"YES\" notEnabled=\"YES\"/>\n </accessibility>\n </imageView>\n </subviews>\n <viewLayoutGuide key=\"safeArea\" id=\"Bcu-3y-fUS\"/>\n <color key=\"backgroundColor\" red=\"${r}\" green=\"${g}\" blue=\"${b}\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n <accessibility key=\"accessibilityConfiguration\">\n <accessibilityTraits key=\"traits\" notEnabled=\"YES\"/>\n </accessibility>\n <constraints>\n <constraint firstItem=\"3lX-Ut-9ad\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"Fh9-Fy-1nT\"/>\n <constraint firstItem=\"3lX-Ut-9ad\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"nvB-Ic-PnI\"/>\n </constraints>\n </view>\n </viewController>\n <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n </objects>\n <point key=\"canvasLocation\" x=\"0.0\" y=\"0.0\"/>\n </scene>\n </scenes>\n <resources>\n <image name=\"${xcassetName}\" width=\"${width}\" height=\"${height}\"/>\n </resources>\n</document>\n`;\n};\n\nconst log = (text: string, dim = false) => {\n console.log(dim ? chalk.dim(text) : text);\n};\n\nconst isValidHexadecimal = (value: string) =>\n /^#?([0-9A-F]{3}){1,2}$/i.test(value);\n\nconst toFullHexadecimal = (hex: string) => {\n const prefixed = hex[0] === \"#\" ? hex : `#${hex}`;\n const up = prefixed.toUpperCase();\n\n return up.length === 4\n ? \"#\" + up[1] + up[1] + up[2] + up[2] + up[3] + up[3]\n : up;\n};\n\nexport const generate = async ({\n android,\n ios,\n\n workingPath,\n logoPath,\n backgroundColor,\n logoWidth,\n flavor,\n assetsPath,\n}: {\n android: {\n sourceDir: string;\n appName: string;\n } | null;\n ios: {\n projectPath: string;\n } | null;\n\n workingPath: string;\n logoPath: string;\n assetsPath?: string;\n\n backgroundColor: string;\n flavor: string;\n logoWidth: number;\n}) => {\n if (!isValidHexadecimal(backgroundColor)) {\n throw new Error(\n \"--background-color value is not a valid hexadecimal color.\",\n );\n }\n\n const image = await Jimp.read(logoPath);\n const backgroundColorHex = toFullHexadecimal(backgroundColor);\n\n const getHeight = (size: number) =>\n Math.ceil(size * (image.bitmap.height / image.bitmap.width));\n\n const logWrite = (\n emoji: string,\n filePath: string,\n dimensions?: { width: number; height: number },\n ) =>\n log(\n `${emoji} ${path.relative(workingPath, filePath)}` +\n (dimensions != null\n ? ` (${dimensions.width}x${dimensions.height})`\n : \"\"),\n true,\n );\n\n if (assetsPath && fs.existsSync(assetsPath)) {\n await Promise.all(\n [\n { ratio: 1, suffix: \"\" },\n { ratio: 1.5, suffix: \"@1,5x\" },\n { ratio: 2, suffix: \"@2x\" },\n { ratio: 3, suffix: \"@3x\" },\n { ratio: 4, suffix: \"@4x\" },\n ].map(({ ratio, suffix }) => {\n const fileName = `${logoFileName}${suffix}.png`;\n const filePath = path.resolve(assetsPath, fileName);\n const width = logoWidth * ratio;\n const height = getHeight(width);\n\n return image\n .clone()\n .resize(width, height)\n .quality(100)\n .writeAsync(filePath)\n .then(() => {\n logWrite(\"β¨\", filePath, { width, height });\n });\n }),\n );\n }\n\n if (android) {\n const appPath = android.appName\n ? path.resolve(android.sourceDir, android.appName)\n : path.resolve(android.sourceDir); // @react-native-community/cli 2.x & 3.x support\n\n const resPath = path.resolve(appPath, \"src\", flavor, \"res\");\n const valuesPath = path.resolve(resPath, \"values\");\n\n fs.ensureDirSync(valuesPath);\n\n const colorsXmlPath = path.resolve(valuesPath, \"colors.xml\");\n const colorsXmlEntry = `<color name=\"${androidColorName}\">${backgroundColorHex}</color>`;\n\n if (fs.existsSync(colorsXmlPath)) {\n const colorsXml = fs.readFileSync(colorsXmlPath, \"utf-8\");\n\n if (colorsXml.match(androidColorRegex)) {\n fs.writeFileSync(\n colorsXmlPath,\n colorsXml.replace(androidColorRegex, colorsXmlEntry),\n \"utf-8\",\n );\n } else {\n fs.writeFileSync(\n colorsXmlPath,\n colorsXml.replace(\n /<\\/resources>/g,\n ` ${colorsXmlEntry}\\n</resources>`,\n ),\n \"utf-8\",\n );\n }\n\n logWrite(\"βοΈ \", colorsXmlPath);\n } else {\n fs.writeFileSync(\n colorsXmlPath,\n `<resources>\\n ${colorsXmlEntry}\\n</resources>\\n`,\n \"utf-8\",\n );\n\n logWrite(\"β¨\", colorsXmlPath);\n }\n\n await Promise.all(\n [\n { ratio: 1, directory: \"mipmap-mdpi\" },\n { ratio: 1.5, directory: \"mipmap-hdpi\" },\n { ratio: 2, directory: \"mipmap-xhdpi\" },\n { ratio: 3, directory: \"mipmap-xxhdpi\" },\n { ratio: 4, directory: \"mipmap-xxxhdpi\" },\n ].map(({ ratio, directory }) => {\n const fileName = `${logoFileName}.png`;\n const filePath = path.resolve(resPath, directory, fileName);\n const width = logoWidth * ratio;\n const height = getHeight(width);\n\n const canvasSize = splashScreenIconSizeNoBackground * ratio;\n\n // https://github.com/oliver-moran/jimp/tree/master/packages/jimp#creating-new-images\n const canvas = new Jimp(canvasSize, canvasSize, 0xffffff00);\n const logo = image.clone().resize(width, height);\n\n const x = (canvasSize - width) / 2;\n const y = (canvasSize - height) / 2;\n\n return canvas\n .blit(logo, x, y)\n .quality(100)\n .writeAsync(filePath)\n .then(() => {\n logWrite(\"β¨\", filePath, { width: canvasSize, height: canvasSize });\n });\n }),\n );\n }\n\n if (ios) {\n const projectPath = ios.projectPath.replace(/.xcodeproj$/, \"\");\n const imagesPath = path.resolve(projectPath, \"Images.xcassets\");\n\n if (fs.existsSync(projectPath)) {\n const storyboardPath = path.resolve(projectPath, \"BootSplash.storyboard\");\n\n fs.writeFileSync(\n storyboardPath,\n getStoryboard({\n height: getHeight(logoWidth),\n width: logoWidth,\n backgroundColor: backgroundColorHex,\n }),\n \"utf-8\",\n );\n\n log(`β¨ ${path.relative(workingPath, storyboardPath)}`, true);\n } else {\n log(\n `No \"${projectPath}\" directory found. Skipping iOS storyboard generationβ¦`,\n );\n }\n\n if (fs.existsSync(imagesPath)) {\n const imageSetPath = path.resolve(imagesPath, xcassetName + \".imageset\");\n fs.ensureDirSync(imageSetPath);\n\n fs.writeFileSync(\n path.resolve(imageSetPath, \"Contents.json\"),\n ContentsJson,\n \"utf-8\",\n );\n\n await Promise.all(\n [\n { ratio: 1, suffix: \"\" },\n { ratio: 2, suffix: \"@2x\" },\n { ratio: 3, suffix: \"@3x\" },\n ].map(({ ratio, suffix }) => {\n const fileName = `${logoFileName}${suffix}.png`;\n const filePath = path.resolve(imageSetPath, fileName);\n const width = logoWidth * ratio;\n const height = getHeight(width);\n\n return image\n .clone()\n .resize(width, height)\n .quality(100)\n .writeAsync(filePath)\n .then(() => {\n logWrite(\"β¨\", filePath, { width, height });\n });\n }),\n );\n } else {\n log(\n `No \"${imagesPath}\" directory found. Skipping iOS images generationβ¦`,\n );\n }\n }\n\n log(\n `β
Done! Thanks for using ${chalk.underline(\"react-native-bootsplash\")}.`,\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["generate.ts"],"names":["chalk","fs","Jimp","path","logoFileName","xcassetName","splashScreenIconSizeNoBackground","androidColorName","androidColorRegex","ContentsJson","getStoryboard","height","width","backgroundColor","hex","r","parseInt","toPrecision","g","b","log","text","dim","console","isValidHexadecimal","value","test","toFullHexadecimal","prefixed","up","toUpperCase","length","generate","android","ios","workingPath","logoPath","logoWidth","flavor","assetsPath","Error","image","read","backgroundColorHex","getHeight","size","Math","ceil","bitmap","logWrite","emoji","filePath","dimensions","relative","existsSync","underline","Promise","all","ratio","suffix","map","fileName","resolve","clone","resize","quality","writeAsync","then","appPath","appName","sourceDir","resPath","valuesPath","ensureDirSync","colorsXmlPath","colorsXmlEntry","colorsXml","readFileSync","match","writeFileSync","replace","directory","canvasSize","canvas","logo","x","y","blit","projectPath","imagesPath","storyboardPath","imageSetPath","blue","bold"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,OAAOC,EAAP,MAAe,UAAf;AACA,OAAOC,IAAP,MAAiB,MAAjB;AACA,OAAOC,IAAP,MAAiB,MAAjB;AAEA,MAAMC,YAAY,GAAG,iBAArB;AACA,MAAMC,WAAW,GAAG,gBAApB,C,CACA;;AACA,MAAMC,gCAAgC,GAAG,GAAzC;AACA,MAAMC,gBAAgB,GAAG,uBAAzB;AACA,MAAMC,iBAAiB,GAAG,oDAA1B;AAEA,MAAMC,YAAY,GAAI;AACtB;AACA;AACA;AACA,qBAAqBL,YAAa;AAClC;AACA;AACA;AACA;AACA,qBAAqBA,YAAa;AAClC;AACA;AACA;AACA;AACA,qBAAqBA,YAAa;AAClC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAvBA;;AAyBA,MAAMM,aAAa,GAAG,QAQhB;AAAA,MARiB;AACrBC,IAAAA,MADqB;AAErBC,IAAAA,KAFqB;AAGrBC,IAAAA,eAAe,EAAEC;AAHI,GAQjB;AACJ,QAAMC,CAAC,GAAG,CAACC,QAAQ,CAACF,GAAG,CAAC,CAAD,CAAH,GAASA,GAAG,CAAC,CAAD,CAAb,EAAkB,EAAlB,CAAR,GAAgC,GAAjC,EAAsCG,WAAtC,CAAkD,EAAlD,CAAV;AACA,QAAMC,CAAC,GAAG,CAACF,QAAQ,CAACF,GAAG,CAAC,CAAD,CAAH,GAASA,GAAG,CAAC,CAAD,CAAb,EAAkB,EAAlB,CAAR,GAAgC,GAAjC,EAAsCG,WAAtC,CAAkD,EAAlD,CAAV;AACA,QAAME,CAAC,GAAG,CAACH,QAAQ,CAACF,GAAG,CAAC,CAAD,CAAH,GAASA,GAAG,CAAC,CAAD,CAAb,EAAkB,EAAlB,CAAR,GAAgC,GAAjC,EAAsCG,WAAtC,CAAkD,EAAlD,CAAV;AAEA,SAAQ;AACV;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uDAAuD,CAAC,MAAML,KAAP,IAAgB,CAAE,QACrE,CAAC,MAAMD,MAAP,IAAiB,CAClB,YAAWC,KAAM,aAAYD,MAAO;AACvC;AACA;AACA;AACA;AACA;AACA;AACA,4DAA4DI,CAAE,YAAWG,CAAE,WAAUC,CAAE;AACvF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,uBAAuBd,WAAY,YAAWO,KAAM,aAAYD,MAAO;AACvE;AACA;AACA,CA/CE;AAgDD,CA7DD;;AA+DA,MAAMS,GAAG,GAAG,UAACC,IAAD,EAA+B;AAAA,MAAhBC,GAAgB,uEAAV,KAAU;AACzCC,EAAAA,OAAO,CAACH,GAAR,CAAYE,GAAG,GAAGtB,KAAK,CAACsB,GAAN,CAAUD,IAAV,CAAH,GAAqBA,IAApC;AACD,CAFD;;AAIA,MAAMG,kBAAkB,GAAIC,KAAD,IACzB,0BAA0BC,IAA1B,CAA+BD,KAA/B,CADF;;AAGA,MAAME,iBAAiB,GAAIb,GAAD,IAAiB;AACzC,QAAMc,QAAQ,GAAGd,GAAG,CAAC,CAAD,CAAH,KAAW,GAAX,GAAiBA,GAAjB,GAAwB,IAAGA,GAAI,EAAhD;AACA,QAAMe,EAAE,GAAGD,QAAQ,CAACE,WAAT,EAAX;AAEA,SAAOD,EAAE,CAACE,MAAH,KAAc,CAAd,GACH,MAAMF,EAAE,CAAC,CAAD,CAAR,GAAcA,EAAE,CAAC,CAAD,CAAhB,GAAsBA,EAAE,CAAC,CAAD,CAAxB,GAA8BA,EAAE,CAAC,CAAD,CAAhC,GAAsCA,EAAE,CAAC,CAAD,CAAxC,GAA8CA,EAAE,CAAC,CAAD,CAD7C,GAEHA,EAFJ;AAGD,CAPD;;AASA,OAAO,MAAMG,QAAQ,GAAG,eA0BlB;AAAA,MA1ByB;AAC7BC,IAAAA,OAD6B;AAE7BC,IAAAA,GAF6B;AAI7BC,IAAAA,WAJ6B;AAK7BC,IAAAA,QAL6B;AAM7BvB,IAAAA,eAN6B;AAO7BwB,IAAAA,SAP6B;AAQ7BC,IAAAA,MAR6B;AAS7BC,IAAAA;AAT6B,GA0BzB;;AACJ,MAAI,CAACf,kBAAkB,CAACX,eAAD,CAAvB,EAA0C;AACxC,UAAM,IAAI2B,KAAJ,CACJ,4DADI,CAAN;AAGD;;AAED,QAAMC,KAAK,GAAG,MAAMvC,IAAI,CAACwC,IAAL,CAAUN,QAAV,CAApB;AACA,QAAMO,kBAAkB,GAAGhB,iBAAiB,CAACd,eAAD,CAA5C;;AAEA,QAAM+B,SAAS,GAAIC,IAAD,IAChBC,IAAI,CAACC,IAAL,CAAUF,IAAI,IAAIJ,KAAK,CAACO,MAAN,CAAarC,MAAb,GAAsB8B,KAAK,CAACO,MAAN,CAAapC,KAAvC,CAAd,CADF;;AAGA,QAAMqC,QAAQ,GAAG,CACfC,KADe,EAEfC,QAFe,EAGfC,UAHe,KAKfhC,GAAG,CACA,GAAE8B,KAAM,KAAI/C,IAAI,CAACkD,QAAL,CAAclB,WAAd,EAA2BgB,QAA3B,CAAqC,EAAlD,IACGC,UAAU,IAAI,IAAd,GACI,KAAIA,UAAU,CAACxC,KAAM,IAAGwC,UAAU,CAACzC,MAAO,GAD9C,GAEG,EAHN,CADC,CALL;;AAYA,MAAI4B,UAAU,IAAItC,EAAE,CAACqD,UAAH,CAAcf,UAAd,CAAlB,EAA6C;AAC3CnB,IAAAA,GAAG,CAAE,SAAQpB,KAAK,CAACuD,SAAN,CAAgB,QAAhB,CAA0B,EAApC,CAAH;AAEA,UAAMC,OAAO,CAACC,GAAR,CACJ,CACE;AAAEC,MAAAA,KAAK,EAAE,CAAT;AAAYC,MAAAA,MAAM,EAAE;AAApB,KADF,EAEE;AAAED,MAAAA,KAAK,EAAE,GAAT;AAAcC,MAAAA,MAAM,EAAE;AAAtB,KAFF,EAGE;AAAED,MAAAA,KAAK,EAAE,CAAT;AAAYC,MAAAA,MAAM,EAAE;AAApB,KAHF,EAIE;AAAED,MAAAA,KAAK,EAAE,CAAT;AAAYC,MAAAA,MAAM,EAAE;AAApB,KAJF,EAKE;AAAED,MAAAA,KAAK,EAAE,CAAT;AAAYC,MAAAA,MAAM,EAAE;AAApB,KALF,EAMEC,GANF,CAMM,SAAuB;AAAA,UAAtB;AAAEF,QAAAA,KAAF;AAASC,QAAAA;AAAT,OAAsB;AAC3B,YAAME,QAAQ,GAAI,GAAEzD,YAAa,GAAEuD,MAAO,MAA1C;AACA,YAAMR,QAAQ,GAAGhD,IAAI,CAAC2D,OAAL,CAAavB,UAAb,EAAyBsB,QAAzB,CAAjB;AACA,YAAMjD,KAAK,GAAGyB,SAAS,GAAGqB,KAA1B;AACA,YAAM/C,MAAM,GAAGiC,SAAS,CAAChC,KAAD,CAAxB;AAEA,aAAO6B,KAAK,CACTsB,KADI,GAEJC,MAFI,CAEGpD,KAFH,EAEUD,MAFV,EAGJsD,OAHI,CAGI,GAHJ,EAIJC,UAJI,CAIOf,QAJP,EAKJgB,IALI,CAKC,MAAM;AACVlB,QAAAA,QAAQ,CAAC,GAAD,EAAME,QAAN,EAAgB;AAAEvC,UAAAA,KAAF;AAASD,UAAAA;AAAT,SAAhB,CAAR;AACD,OAPI,CAAP;AAQD,KApBD,CADI,CAAN;AAuBD;;AAED,MAAIsB,OAAJ,EAAa;AACXb,IAAAA,GAAG,CAAE,SAAQpB,KAAK,CAACuD,SAAN,CAAgB,SAAhB,CAA2B,EAArC,CAAH;AAEA,UAAMa,OAAO,GAAGnC,OAAO,CAACoC,OAAR,GACZlE,IAAI,CAAC2D,OAAL,CAAa7B,OAAO,CAACqC,SAArB,EAAgCrC,OAAO,CAACoC,OAAxC,CADY,GAEZlE,IAAI,CAAC2D,OAAL,CAAa7B,OAAO,CAACqC,SAArB,CAFJ,CAHW,CAK0B;;AAErC,UAAMC,OAAO,GAAGpE,IAAI,CAAC2D,OAAL,CAAaM,OAAb,EAAsB,KAAtB,EAA6B9B,MAA7B,EAAqC,KAArC,CAAhB;AACA,UAAMkC,UAAU,GAAGrE,IAAI,CAAC2D,OAAL,CAAaS,OAAb,EAAsB,QAAtB,CAAnB;AAEAtE,IAAAA,EAAE,CAACwE,aAAH,CAAiBD,UAAjB;AAEA,UAAME,aAAa,GAAGvE,IAAI,CAAC2D,OAAL,CAAaU,UAAb,EAAyB,YAAzB,CAAtB;AACA,UAAMG,cAAc,GAAI,gBAAepE,gBAAiB,KAAIoC,kBAAmB,UAA/E;;AAEA,QAAI1C,EAAE,CAACqD,UAAH,CAAcoB,aAAd,CAAJ,EAAkC;AAChC,YAAME,SAAS,GAAG3E,EAAE,CAAC4E,YAAH,CAAgBH,aAAhB,EAA+B,OAA/B,CAAlB;;AAEA,UAAIE,SAAS,CAACE,KAAV,CAAgBtE,iBAAhB,CAAJ,EAAwC;AACtCP,QAAAA,EAAE,CAAC8E,aAAH,CACEL,aADF,EAEEE,SAAS,CAACI,OAAV,CAAkBxE,iBAAlB,EAAqCmE,cAArC,CAFF,EAGE,OAHF;AAKD,OAND,MAMO;AACL1E,QAAAA,EAAE,CAAC8E,aAAH,CACEL,aADF,EAEEE,SAAS,CAACI,OAAV,CACE,gBADF,EAEG,OAAML,cAAe,gBAFxB,CAFF,EAME,OANF;AAQD;;AAED1B,MAAAA,QAAQ,CAAC,KAAD,EAAQyB,aAAR,CAAR;AACD,KArBD,MAqBO;AACLzE,MAAAA,EAAE,CAAC8E,aAAH,CACEL,aADF,EAEG,oBAAmBC,cAAe,kBAFrC,EAGE,OAHF;AAMA1B,MAAAA,QAAQ,CAAC,GAAD,EAAMyB,aAAN,CAAR;AACD;;AAED,UAAMlB,OAAO,CAACC,GAAR,CACJ,CACE;AAAEC,MAAAA,KAAK,EAAE,CAAT;AAAYuB,MAAAA,SAAS,EAAE;AAAvB,KADF,EAEE;AAAEvB,MAAAA,KAAK,EAAE,GAAT;AAAcuB,MAAAA,SAAS,EAAE;AAAzB,KAFF,EAGE;AAAEvB,MAAAA,KAAK,EAAE,CAAT;AAAYuB,MAAAA,SAAS,EAAE;AAAvB,KAHF,EAIE;AAAEvB,MAAAA,KAAK,EAAE,CAAT;AAAYuB,MAAAA,SAAS,EAAE;AAAvB,KAJF,EAKE;AAAEvB,MAAAA,KAAK,EAAE,CAAT;AAAYuB,MAAAA,SAAS,EAAE;AAAvB,KALF,EAMErB,GANF,CAMM,SAA0B;AAAA,UAAzB;AAAEF,QAAAA,KAAF;AAASuB,QAAAA;AAAT,OAAyB;AAC9B,YAAMpB,QAAQ,GAAI,GAAEzD,YAAa,MAAjC;AACA,YAAM+C,QAAQ,GAAGhD,IAAI,CAAC2D,OAAL,CAAaS,OAAb,EAAsBU,SAAtB,EAAiCpB,QAAjC,CAAjB;AACA,YAAMjD,KAAK,GAAGyB,SAAS,GAAGqB,KAA1B;AACA,YAAM/C,MAAM,GAAGiC,SAAS,CAAChC,KAAD,CAAxB;AAEA,YAAMsE,UAAU,GAAG5E,gCAAgC,GAAGoD,KAAtD,CAN8B,CAQ9B;;AACA,YAAMyB,MAAM,GAAG,IAAIjF,IAAJ,CAASgF,UAAT,EAAqBA,UAArB,EAAiC,UAAjC,CAAf;AACA,YAAME,IAAI,GAAG3C,KAAK,CAACsB,KAAN,GAAcC,MAAd,CAAqBpD,KAArB,EAA4BD,MAA5B,CAAb;AAEA,YAAM0E,CAAC,GAAG,CAACH,UAAU,GAAGtE,KAAd,IAAuB,CAAjC;AACA,YAAM0E,CAAC,GAAG,CAACJ,UAAU,GAAGvE,MAAd,IAAwB,CAAlC;AAEA,aAAOwE,MAAM,CACVI,IADI,CACCH,IADD,EACOC,CADP,EACUC,CADV,EAEJrB,OAFI,CAEI,GAFJ,EAGJC,UAHI,CAGOf,QAHP,EAIJgB,IAJI,CAIC,MAAM;AACVlB,QAAAA,QAAQ,CAAC,GAAD,EAAME,QAAN,EAAgB;AAAEvC,UAAAA,KAAK,EAAEsE,UAAT;AAAqBvE,UAAAA,MAAM,EAAEuE;AAA7B,SAAhB,CAAR;AACD,OANI,CAAP;AAOD,KA5BD,CADI,CAAN;AA+BD;;AAED,MAAIhD,GAAJ,EAAS;AACPd,IAAAA,GAAG,CAAE,SAAQpB,KAAK,CAACuD,SAAN,CAAgB,KAAhB,CAAuB,EAAjC,CAAH;AAEA,UAAMiC,WAAW,GAAGtD,GAAG,CAACsD,WAAJ,CAAgBR,OAAhB,CAAwB,aAAxB,EAAuC,EAAvC,CAApB;AACA,UAAMS,UAAU,GAAGtF,IAAI,CAAC2D,OAAL,CAAa0B,WAAb,EAA0B,iBAA1B,CAAnB;;AAEA,QAAIvF,EAAE,CAACqD,UAAH,CAAckC,WAAd,CAAJ,EAAgC;AAC9B,YAAME,cAAc,GAAGvF,IAAI,CAAC2D,OAAL,CAAa0B,WAAb,EAA0B,uBAA1B,CAAvB;AAEAvF,MAAAA,EAAE,CAAC8E,aAAH,CACEW,cADF,EAEEhF,aAAa,CAAC;AACZC,QAAAA,MAAM,EAAEiC,SAAS,CAACP,SAAD,CADL;AAEZzB,QAAAA,KAAK,EAAEyB,SAFK;AAGZxB,QAAAA,eAAe,EAAE8B;AAHL,OAAD,CAFf,EAOE,OAPF;AAUAM,MAAAA,QAAQ,CAAC,GAAD,EAAMyC,cAAN,CAAR;AACD,KAdD,MAcO;AACLtE,MAAAA,GAAG,CACA,OAAMoE,WAAY,wDADlB,CAAH;AAGD;;AAED,QAAIvF,EAAE,CAACqD,UAAH,CAAcmC,UAAd,CAAJ,EAA+B;AAC7B,YAAME,YAAY,GAAGxF,IAAI,CAAC2D,OAAL,CAAa2B,UAAb,EAAyBpF,WAAW,GAAG,WAAvC,CAArB;AACAJ,MAAAA,EAAE,CAACwE,aAAH,CAAiBkB,YAAjB;AAEA1F,MAAAA,EAAE,CAAC8E,aAAH,CACE5E,IAAI,CAAC2D,OAAL,CAAa6B,YAAb,EAA2B,eAA3B,CADF,EAEElF,YAFF,EAGE,OAHF;AAMA,YAAM+C,OAAO,CAACC,GAAR,CACJ,CACE;AAAEC,QAAAA,KAAK,EAAE,CAAT;AAAYC,QAAAA,MAAM,EAAE;AAApB,OADF,EAEE;AAAED,QAAAA,KAAK,EAAE,CAAT;AAAYC,QAAAA,MAAM,EAAE;AAApB,OAFF,EAGE;AAAED,QAAAA,KAAK,EAAE,CAAT;AAAYC,QAAAA,MAAM,EAAE;AAApB,OAHF,EAIEC,GAJF,CAIM,SAAuB;AAAA,YAAtB;AAAEF,UAAAA,KAAF;AAASC,UAAAA;AAAT,SAAsB;AAC3B,cAAME,QAAQ,GAAI,GAAEzD,YAAa,GAAEuD,MAAO,MAA1C;AACA,cAAMR,QAAQ,GAAGhD,IAAI,CAAC2D,OAAL,CAAa6B,YAAb,EAA2B9B,QAA3B,CAAjB;AACA,cAAMjD,KAAK,GAAGyB,SAAS,GAAGqB,KAA1B;AACA,cAAM/C,MAAM,GAAGiC,SAAS,CAAChC,KAAD,CAAxB;AAEA,eAAO6B,KAAK,CACTsB,KADI,GAEJC,MAFI,CAEGpD,KAFH,EAEUD,MAFV,EAGJsD,OAHI,CAGI,GAHJ,EAIJC,UAJI,CAIOf,QAJP,EAKJgB,IALI,CAKC,MAAM;AACVlB,UAAAA,QAAQ,CAAC,GAAD,EAAME,QAAN,EAAgB;AAAEvC,YAAAA,KAAF;AAASD,YAAAA;AAAT,WAAhB,CAAR;AACD,SAPI,CAAP;AAQD,OAlBD,CADI,CAAN;AAqBD,KA/BD,MA+BO;AACLS,MAAAA,GAAG,CACA,OAAMqE,UAAW,oDADjB,CAAH;AAGD;AACF;;AAEDrE,EAAAA,GAAG,CAAE;AACP,GAAGpB,KAAK,CAAC4F,IAAN,CAAW,mDAAX,CAAgE;AACnE,GAAG5F,KAAK,CAAC4F,IAAN,CAAW,GAAX,CAAgB,SAAQ5F,KAAK,CAAC6F,IAAN,CACvB,yCADuB,CAEvB,KAAI7F,KAAK,CAAC4F,IAAN,CAAW,GAAX,CAAgB;AACxB,GAAG5F,KAAK,CAAC4F,IAAN,CAAW,GAAX,CAAgB,kDAAiD5F,KAAK,CAAC4F,IAAN,CAChE,GADgE,CAEhE;AACJ,GAAG5F,KAAK,CAAC4F,IAAN,CAAW,GAAX,CAAgB,KAAI5F,KAAK,CAACuD,SAAN,CACnB,qCADmB,CAEnB,aAAYvD,KAAK,CAAC4F,IAAN,CAAW,GAAX,CAAgB;AAChC,GAAG5F,KAAK,CAAC4F,IAAN,CAAW,mDAAX,CAAgE;AACnE,CAZK,CAAH;AAcAxE,EAAAA,GAAG,CACA,6BAA4BpB,KAAK,CAACuD,SAAN,CAAgB,yBAAhB,CAA2C,GADvE,CAAH;AAGD,CA/OM","sourcesContent":["import chalk from \"chalk\";\nimport fs from \"fs-extra\";\nimport Jimp from \"jimp\";\nimport path from \"path\";\n\nconst logoFileName = \"bootsplash_logo\";\nconst xcassetName = \"BootSplashLogo\";\n// https://github.com/androidx/androidx/blob/androidx-main/core/core-splashscreen/src/main/res/values/dimens.xml#L22\nconst splashScreenIconSizeNoBackground = 288;\nconst androidColorName = \"bootsplash_background\";\nconst androidColorRegex = /<color name=\"bootsplash_background\">#\\w+<\\/color>/g;\n\nconst ContentsJson = `{\n \"images\": [\n {\n \"idiom\": \"universal\",\n \"filename\": \"${logoFileName}.png\",\n \"scale\": \"1x\"\n },\n {\n \"idiom\": \"universal\",\n \"filename\": \"${logoFileName}@2x.png\",\n \"scale\": \"2x\"\n },\n {\n \"idiom\": \"universal\",\n \"filename\": \"${logoFileName}@3x.png\",\n \"scale\": \"3x\"\n }\n ],\n \"info\": {\n \"version\": 1,\n \"author\": \"xcode\"\n }\n}\n`;\n\nconst getStoryboard = ({\n height,\n width,\n backgroundColor: hex,\n}: {\n height: number;\n width: number;\n backgroundColor: string;\n}) => {\n const r = (parseInt(hex[1] + hex[2], 16) / 255).toPrecision(15);\n const g = (parseInt(hex[3] + hex[4], 16) / 255).toPrecision(15);\n const b = (parseInt(hex[5] + hex[6], 16) / 255).toPrecision(15);\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<document type=\"com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB\" version=\"3.0\" toolsVersion=\"17147\" targetRuntime=\"iOS.CocoaTouch\" propertyAccessControl=\"none\" useAutolayout=\"YES\" launchScreen=\"YES\" useTraitCollections=\"YES\" useSafeAreas=\"YES\" colorMatched=\"YES\" initialViewController=\"01J-lp-oVM\">\n <device id=\"retina4_7\" orientation=\"portrait\" appearance=\"light\"/>\n <dependencies>\n <deployment identifier=\"iOS\"/>\n <plugIn identifier=\"com.apple.InterfaceBuilder.IBCocoaTouchPlugin\" version=\"17120\"/>\n <capability name=\"Safe area layout guides\" minToolsVersion=\"9.0\"/>\n <capability name=\"documents saved in the Xcode 8 format\" minToolsVersion=\"8.0\"/>\n </dependencies>\n <scenes>\n <!--View Controller-->\n <scene sceneID=\"EHf-IW-A2E\">\n <objects>\n <viewController id=\"01J-lp-oVM\" sceneMemberID=\"viewController\">\n <view key=\"view\" autoresizesSubviews=\"NO\" userInteractionEnabled=\"NO\" contentMode=\"scaleToFill\" id=\"Ze5-6b-2t3\">\n <rect key=\"frame\" x=\"0.0\" y=\"0.0\" width=\"375\" height=\"667\"/>\n <autoresizingMask key=\"autoresizingMask\"/>\n <subviews>\n <imageView autoresizesSubviews=\"NO\" clipsSubviews=\"YES\" userInteractionEnabled=\"NO\" contentMode=\"scaleAspectFit\" image=\"BootSplashLogo\" translatesAutoresizingMaskIntoConstraints=\"NO\" id=\"3lX-Ut-9ad\">\n <rect key=\"frame\" x=\"${(375 - width) / 2}\" y=\"${\n (667 - height) / 2\n }\" width=\"${width}\" height=\"${height}\"/>\n <accessibility key=\"accessibilityConfiguration\">\n <accessibilityTraits key=\"traits\" image=\"YES\" notEnabled=\"YES\"/>\n </accessibility>\n </imageView>\n </subviews>\n <viewLayoutGuide key=\"safeArea\" id=\"Bcu-3y-fUS\"/>\n <color key=\"backgroundColor\" red=\"${r}\" green=\"${g}\" blue=\"${b}\" alpha=\"1\" colorSpace=\"custom\" customColorSpace=\"sRGB\"/>\n <accessibility key=\"accessibilityConfiguration\">\n <accessibilityTraits key=\"traits\" notEnabled=\"YES\"/>\n </accessibility>\n <constraints>\n <constraint firstItem=\"3lX-Ut-9ad\" firstAttribute=\"centerX\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerX\" id=\"Fh9-Fy-1nT\"/>\n <constraint firstItem=\"3lX-Ut-9ad\" firstAttribute=\"centerY\" secondItem=\"Ze5-6b-2t3\" secondAttribute=\"centerY\" id=\"nvB-Ic-PnI\"/>\n </constraints>\n </view>\n </viewController>\n <placeholder placeholderIdentifier=\"IBFirstResponder\" id=\"iYj-Kq-Ea1\" userLabel=\"First Responder\" sceneMemberID=\"firstResponder\"/>\n </objects>\n <point key=\"canvasLocation\" x=\"0.0\" y=\"0.0\"/>\n </scene>\n </scenes>\n <resources>\n <image name=\"${xcassetName}\" width=\"${width}\" height=\"${height}\"/>\n </resources>\n</document>\n`;\n};\n\nconst log = (text: string, dim = false) => {\n console.log(dim ? chalk.dim(text) : text);\n};\n\nconst isValidHexadecimal = (value: string) =>\n /^#?([0-9A-F]{3}){1,2}$/i.test(value);\n\nconst toFullHexadecimal = (hex: string) => {\n const prefixed = hex[0] === \"#\" ? hex : `#${hex}`;\n const up = prefixed.toUpperCase();\n\n return up.length === 4\n ? \"#\" + up[1] + up[1] + up[2] + up[2] + up[3] + up[3]\n : up;\n};\n\nexport const generate = async ({\n android,\n ios,\n\n workingPath,\n logoPath,\n backgroundColor,\n logoWidth,\n flavor,\n assetsPath,\n}: {\n android: {\n sourceDir: string;\n appName: string;\n } | null;\n ios: {\n projectPath: string;\n } | null;\n\n workingPath: string;\n logoPath: string;\n assetsPath?: string;\n\n backgroundColor: string;\n flavor: string;\n logoWidth: number;\n}) => {\n if (!isValidHexadecimal(backgroundColor)) {\n throw new Error(\n \"--background-color value is not a valid hexadecimal color.\",\n );\n }\n\n const image = await Jimp.read(logoPath);\n const backgroundColorHex = toFullHexadecimal(backgroundColor);\n\n const getHeight = (size: number) =>\n Math.ceil(size * (image.bitmap.height / image.bitmap.width));\n\n const logWrite = (\n emoji: string,\n filePath: string,\n dimensions?: { width: number; height: number },\n ) =>\n log(\n `${emoji} ${path.relative(workingPath, filePath)}` +\n (dimensions != null\n ? ` (${dimensions.width}x${dimensions.height})`\n : \"\"),\n );\n\n if (assetsPath && fs.existsSync(assetsPath)) {\n log(`\\n ${chalk.underline(\"Assets\")}`);\n\n await Promise.all(\n [\n { ratio: 1, suffix: \"\" },\n { ratio: 1.5, suffix: \"@1,5x\" },\n { ratio: 2, suffix: \"@2x\" },\n { ratio: 3, suffix: \"@3x\" },\n { ratio: 4, suffix: \"@4x\" },\n ].map(({ ratio, suffix }) => {\n const fileName = `${logoFileName}${suffix}.png`;\n const filePath = path.resolve(assetsPath, fileName);\n const width = logoWidth * ratio;\n const height = getHeight(width);\n\n return image\n .clone()\n .resize(width, height)\n .quality(100)\n .writeAsync(filePath)\n .then(() => {\n logWrite(\"β¨\", filePath, { width, height });\n });\n }),\n );\n }\n\n if (android) {\n log(`\\n ${chalk.underline(\"Android\")}`);\n\n const appPath = android.appName\n ? path.resolve(android.sourceDir, android.appName)\n : path.resolve(android.sourceDir); // @react-native-community/cli 2.x & 3.x support\n\n const resPath = path.resolve(appPath, \"src\", flavor, \"res\");\n const valuesPath = path.resolve(resPath, \"values\");\n\n fs.ensureDirSync(valuesPath);\n\n const colorsXmlPath = path.resolve(valuesPath, \"colors.xml\");\n const colorsXmlEntry = `<color name=\"${androidColorName}\">${backgroundColorHex}</color>`;\n\n if (fs.existsSync(colorsXmlPath)) {\n const colorsXml = fs.readFileSync(colorsXmlPath, \"utf-8\");\n\n if (colorsXml.match(androidColorRegex)) {\n fs.writeFileSync(\n colorsXmlPath,\n colorsXml.replace(androidColorRegex, colorsXmlEntry),\n \"utf-8\",\n );\n } else {\n fs.writeFileSync(\n colorsXmlPath,\n colorsXml.replace(\n /<\\/resources>/g,\n ` ${colorsXmlEntry}\\n</resources>`,\n ),\n \"utf-8\",\n );\n }\n\n logWrite(\"βοΈ \", colorsXmlPath);\n } else {\n fs.writeFileSync(\n colorsXmlPath,\n `<resources>\\n ${colorsXmlEntry}\\n</resources>\\n`,\n \"utf-8\",\n );\n\n logWrite(\"β¨\", colorsXmlPath);\n }\n\n await Promise.all(\n [\n { ratio: 1, directory: \"mipmap-mdpi\" },\n { ratio: 1.5, directory: \"mipmap-hdpi\" },\n { ratio: 2, directory: \"mipmap-xhdpi\" },\n { ratio: 3, directory: \"mipmap-xxhdpi\" },\n { ratio: 4, directory: \"mipmap-xxxhdpi\" },\n ].map(({ ratio, directory }) => {\n const fileName = `${logoFileName}.png`;\n const filePath = path.resolve(resPath, directory, fileName);\n const width = logoWidth * ratio;\n const height = getHeight(width);\n\n const canvasSize = splashScreenIconSizeNoBackground * ratio;\n\n // https://github.com/oliver-moran/jimp/tree/master/packages/jimp#creating-new-images\n const canvas = new Jimp(canvasSize, canvasSize, 0xffffff00);\n const logo = image.clone().resize(width, height);\n\n const x = (canvasSize - width) / 2;\n const y = (canvasSize - height) / 2;\n\n return canvas\n .blit(logo, x, y)\n .quality(100)\n .writeAsync(filePath)\n .then(() => {\n logWrite(\"β¨\", filePath, { width: canvasSize, height: canvasSize });\n });\n }),\n );\n }\n\n if (ios) {\n log(`\\n ${chalk.underline(\"iOS\")}`);\n\n const projectPath = ios.projectPath.replace(/.xcodeproj$/, \"\");\n const imagesPath = path.resolve(projectPath, \"Images.xcassets\");\n\n if (fs.existsSync(projectPath)) {\n const storyboardPath = path.resolve(projectPath, \"BootSplash.storyboard\");\n\n fs.writeFileSync(\n storyboardPath,\n getStoryboard({\n height: getHeight(logoWidth),\n width: logoWidth,\n backgroundColor: backgroundColorHex,\n }),\n \"utf-8\",\n );\n\n logWrite(\"β¨\", storyboardPath);\n } else {\n log(\n `No \"${projectPath}\" directory found. Skipping iOS storyboard generationβ¦`,\n );\n }\n\n if (fs.existsSync(imagesPath)) {\n const imageSetPath = path.resolve(imagesPath, xcassetName + \".imageset\");\n fs.ensureDirSync(imageSetPath);\n\n fs.writeFileSync(\n path.resolve(imageSetPath, \"Contents.json\"),\n ContentsJson,\n \"utf-8\",\n );\n\n await Promise.all(\n [\n { ratio: 1, suffix: \"\" },\n { ratio: 2, suffix: \"@2x\" },\n { ratio: 3, suffix: \"@3x\" },\n ].map(({ ratio, suffix }) => {\n const fileName = `${logoFileName}${suffix}.png`;\n const filePath = path.resolve(imageSetPath, fileName);\n const width = logoWidth * ratio;\n const height = getHeight(width);\n\n return image\n .clone()\n .resize(width, height)\n .quality(100)\n .writeAsync(filePath)\n .then(() => {\n logWrite(\"β¨\", filePath, { width, height });\n });\n }),\n );\n } else {\n log(\n `No \"${imagesPath}\" directory found. Skipping iOS images generationβ¦`,\n );\n }\n }\n\n log(`\n ${chalk.blue(\"βββββββββββββββββββββββββββββββββββββββββββββββββ\")}\n ${chalk.blue(\"β\")} π ${chalk.bold(\n \"Love this library? Consider sponsoring!\",\n )} ${chalk.blue(\"β\")}\n ${chalk.blue(\"β\")} One-time amounts are available. ${chalk.blue(\n \"β\",\n )}\n ${chalk.blue(\"β\")} ${chalk.underline(\n \"https://github.com/sponsors/zoontek\",\n )} ${chalk.blue(\"β\")}\n ${chalk.blue(\"βββββββββββββββββββββββββββββββββββββββββββββββββ\")}\n`);\n\n log(\n `β
Done! Thanks for using ${chalk.underline(\"react-native-bootsplash\")}.`,\n );\n};\n"]}
|
package/ios/RNBootSplash.m
CHANGED
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
#import "RNBootSplash.h"
|
|
2
2
|
|
|
3
3
|
#import <React/RCTBridge.h>
|
|
4
|
-
#import <React/RCTLog.h>
|
|
5
4
|
#import <React/RCTUtils.h>
|
|
6
5
|
|
|
7
|
-
static NSMutableArray<RNBootSplashTask *> *
|
|
6
|
+
static NSMutableArray<RNBootSplashTask *> *_taskStack = nil;
|
|
8
7
|
static RCTRootView *_rootView = nil;
|
|
9
8
|
static RNBootSplashStatus _status = RNBootSplashStatusHidden;
|
|
10
9
|
|
|
@@ -38,7 +37,7 @@ RCT_EXPORT_MODULE();
|
|
|
38
37
|
rootView:(RCTRootView * _Nonnull)rootView {
|
|
39
38
|
_rootView = rootView;
|
|
40
39
|
_status = RNBootSplashStatusVisible;
|
|
41
|
-
|
|
40
|
+
_taskStack = [[NSMutableArray alloc] init];
|
|
42
41
|
|
|
43
42
|
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle:nil];
|
|
44
43
|
[_rootView setLoadingView:[[storyboard instantiateInitialViewController] view]];
|
|
@@ -86,16 +85,14 @@ RCT_EXPORT_MODULE();
|
|
|
86
85
|
}
|
|
87
86
|
|
|
88
87
|
+ (void)shiftNextTask {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
88
|
+
if (_status != RNBootSplashStatusTransitioning &&
|
|
89
|
+
[_taskStack count] > 0 &&
|
|
90
|
+
[[UIApplication sharedApplication] applicationState] != UIApplicationStateBackground) {
|
|
91
|
+
RNBootSplashTask *task = [_taskStack objectAtIndex:0];
|
|
92
|
+
[_taskStack removeObjectAtIndex:0];
|
|
92
93
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
RNBootSplashTask *task = [_taskQueue objectAtIndex:0];
|
|
96
|
-
[_taskQueue removeObjectAtIndex:0];
|
|
97
|
-
|
|
98
|
-
return [self hideWithTask:task];
|
|
94
|
+
[self hideWithTask:task];
|
|
95
|
+
}
|
|
99
96
|
}
|
|
100
97
|
|
|
101
98
|
+ (void)hideWithTask:(RNBootSplashTask *)task {
|
|
@@ -144,7 +141,7 @@ RCT_REMAP_METHOD(hide,
|
|
|
144
141
|
RNBootSplashTask *task = [[RNBootSplashTask alloc] initWithFade:fade
|
|
145
142
|
resolver:resolve];
|
|
146
143
|
|
|
147
|
-
[
|
|
144
|
+
[_taskStack addObject:task];
|
|
148
145
|
[RNBootSplash shiftNextTask];
|
|
149
146
|
}
|
|
150
147
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-bootsplash",
|
|
3
|
-
"version": "4.0.
|
|
3
|
+
"version": "4.0.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "Display a bootsplash on your app starts. Hide it when you want.",
|
|
6
6
|
"author": "Mathieu Acthernoene <zoontek@gmail.com>",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"/ios",
|
|
15
15
|
"/src",
|
|
16
16
|
"RNBootSplash.podspec",
|
|
17
|
-
"
|
|
17
|
+
"RNBootSplash.res",
|
|
18
18
|
"bsconfig.json",
|
|
19
19
|
"package.json",
|
|
20
20
|
"react-native.config.js"
|
|
@@ -66,13 +66,13 @@
|
|
|
66
66
|
"devDependencies": {
|
|
67
67
|
"@types/fs-extra": "^9.0.13",
|
|
68
68
|
"@types/react-native": "^0.66.4",
|
|
69
|
-
"
|
|
70
|
-
"lint-staged": "^11.2.6",
|
|
69
|
+
"lint-staged": "^12.0.2",
|
|
71
70
|
"prettier": "^2.4.1",
|
|
72
71
|
"prettier-plugin-organize-imports": "^2.3.4",
|
|
73
72
|
"react": "^17.0.2",
|
|
74
73
|
"react-native": "^0.66.3",
|
|
75
74
|
"react-native-builder-bob": "^0.18.2",
|
|
75
|
+
"rescript": "^9.1.4",
|
|
76
76
|
"typescript": "^4.4.4"
|
|
77
77
|
}
|
|
78
78
|
}
|
package/react-native.config.js
CHANGED
|
@@ -16,7 +16,7 @@ module.exports = {
|
|
|
16
16
|
{
|
|
17
17
|
name: "--logo-width <width>",
|
|
18
18
|
description:
|
|
19
|
-
"logo width at @1x (in dp - we
|
|
19
|
+
"logo width at @1x (in dp - we recommend approximately ~100)",
|
|
20
20
|
default: 100,
|
|
21
21
|
parse: (value) => parseInt(value, 10),
|
|
22
22
|
},
|
package/src/generate.ts
CHANGED
|
@@ -163,10 +163,11 @@ export const generate = async ({
|
|
|
163
163
|
(dimensions != null
|
|
164
164
|
? ` (${dimensions.width}x${dimensions.height})`
|
|
165
165
|
: ""),
|
|
166
|
-
true,
|
|
167
166
|
);
|
|
168
167
|
|
|
169
168
|
if (assetsPath && fs.existsSync(assetsPath)) {
|
|
169
|
+
log(`\n ${chalk.underline("Assets")}`);
|
|
170
|
+
|
|
170
171
|
await Promise.all(
|
|
171
172
|
[
|
|
172
173
|
{ ratio: 1, suffix: "" },
|
|
@@ -193,6 +194,8 @@ export const generate = async ({
|
|
|
193
194
|
}
|
|
194
195
|
|
|
195
196
|
if (android) {
|
|
197
|
+
log(`\n ${chalk.underline("Android")}`);
|
|
198
|
+
|
|
196
199
|
const appPath = android.appName
|
|
197
200
|
? path.resolve(android.sourceDir, android.appName)
|
|
198
201
|
: path.resolve(android.sourceDir); // @react-native-community/cli 2.x & 3.x support
|
|
@@ -270,6 +273,8 @@ export const generate = async ({
|
|
|
270
273
|
}
|
|
271
274
|
|
|
272
275
|
if (ios) {
|
|
276
|
+
log(`\n ${chalk.underline("iOS")}`);
|
|
277
|
+
|
|
273
278
|
const projectPath = ios.projectPath.replace(/.xcodeproj$/, "");
|
|
274
279
|
const imagesPath = path.resolve(projectPath, "Images.xcassets");
|
|
275
280
|
|
|
@@ -286,7 +291,7 @@ export const generate = async ({
|
|
|
286
291
|
"utf-8",
|
|
287
292
|
);
|
|
288
293
|
|
|
289
|
-
|
|
294
|
+
logWrite("β¨", storyboardPath);
|
|
290
295
|
} else {
|
|
291
296
|
log(
|
|
292
297
|
`No "${projectPath}" directory found. Skipping iOS storyboard generationβ¦`,
|
|
@@ -331,6 +336,20 @@ export const generate = async ({
|
|
|
331
336
|
}
|
|
332
337
|
}
|
|
333
338
|
|
|
339
|
+
log(`
|
|
340
|
+
${chalk.blue("βββββββββββββββββββββββββββββββββββββββββββββββββ")}
|
|
341
|
+
${chalk.blue("β")} π ${chalk.bold(
|
|
342
|
+
"Love this library? Consider sponsoring!",
|
|
343
|
+
)} ${chalk.blue("β")}
|
|
344
|
+
${chalk.blue("β")} One-time amounts are available. ${chalk.blue(
|
|
345
|
+
"β",
|
|
346
|
+
)}
|
|
347
|
+
${chalk.blue("β")} ${chalk.underline(
|
|
348
|
+
"https://github.com/sponsors/zoontek",
|
|
349
|
+
)} ${chalk.blue("β")}
|
|
350
|
+
${chalk.blue("βββββββββββββββββββββββββββββββββββββββββββββββββ")}
|
|
351
|
+
`);
|
|
352
|
+
|
|
334
353
|
log(
|
|
335
354
|
`β
Done! Thanks for using ${chalk.underline("react-native-bootsplash")}.`,
|
|
336
355
|
);
|