@hot-updater/android-helper 0.25.9 → 0.25.10

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/dist/index.cjs CHANGED
@@ -35,8 +35,8 @@ let node_os = require("node:os");
35
35
  node_os = __toESM(node_os);
36
36
 
37
37
  //#region src/utils/createGradleLogger.ts
38
- const createGradleLogger = () => new __hot_updater_cli_tools.BuildLogger({
39
- failurePatterns: ["BUILD FAILED"],
38
+ const createGradleLogger = ({ logPrefix }) => new __hot_updater_cli_tools.BuildLogger({
39
+ logPrefix,
40
40
  importantLogPatterns: [
41
41
  "error:",
42
42
  "Error:",
@@ -55,49 +55,95 @@ const createGradleLogger = () => new __hot_updater_cli_tools.BuildLogger({
55
55
  "Android resource compilation failed",
56
56
  "Duplicate class",
57
57
  "Program type already present",
58
- "actionable tasks:"
58
+ "actionable tasks:",
59
+ "Deprecated Gradle features were used",
60
+ ":app:configureCMake",
61
+ ":app:buildCMake",
62
+ ":app:compileDebugKotlin",
63
+ ":app:compileReleaseKotlin",
64
+ ":app:compileDebugJavaWithJavac",
65
+ ":app:compileReleaseJavaWithJavac",
66
+ ":app:mergeDebugResources",
67
+ ":app:mergeReleaseResources",
68
+ ":app:processDebugResources",
69
+ ":app:processReleaseResources",
70
+ ":app:packageDebug",
71
+ ":app:packageRelease",
72
+ ":app:assembleDebug",
73
+ ":app:assembleRelease"
59
74
  ],
60
- progressMapping: [
61
- [[
75
+ progressStages: [
76
+ [
62
77
  "buildKotlinToolingMetadata",
63
78
  "generateAutolinkingNewArchitectureFiles",
64
- "generateCodegenSchemaFromJavaScript"
65
- ], 5],
66
- [[
79
+ "generateAutolinkingPackageList",
80
+ "generateCodegenSchemaFromJavaScript",
81
+ "generateCodegenArtifactsFromSchema",
82
+ "generateReactNativeEntryPoint"
83
+ ],
84
+ [
67
85
  "createBundleReleaseJsAndAssets",
68
86
  "bundleReleaseJsAndAssets",
69
87
  "bundleDebugJsAndAssets"
70
- ], 15],
71
- [[
88
+ ],
89
+ [
72
90
  "generateReleaseResValues",
91
+ "generateDebugResValues",
73
92
  "generateReleaseResources",
74
- "mergeReleaseResources"
75
- ], 25],
76
- [[
93
+ "generateDebugResources",
94
+ "mergeReleaseResources",
95
+ "mergeDebugResources"
96
+ ],
97
+ [
77
98
  "processReleaseResources",
99
+ "processDebugResources",
78
100
  "processReleaseManifest",
79
- "parseReleaseLocalResources"
80
- ], 35],
81
- [["compileReleaseKotlin", "compileDebugKotlin"], 50],
82
- [["compileReleaseJavaWithJavac", "compileDebugJavaWithJavac"], 60],
83
- [[
101
+ "processDebugManifest",
102
+ "processDebugMainManifest",
103
+ "parseReleaseLocalResources",
104
+ "parseDebugLocalResources"
105
+ ],
106
+ ["compileReleaseKotlin", "compileDebugKotlin"],
107
+ ["compileReleaseJavaWithJavac", "compileDebugJavaWithJavac"],
108
+ [
109
+ /configureCMake\w+\[/,
110
+ /buildCMake\w+\[/,
111
+ "mergeReleaseJniLibFolders",
112
+ "mergeDebugJniLibFolders",
113
+ "mergeReleaseNativeLibs",
114
+ "mergeDebugNativeLibs"
115
+ ],
116
+ [
117
+ "desugarReleaseFileDependencies",
118
+ "desugarDebugFileDependencies",
84
119
  "dexBuilderRelease",
120
+ "dexBuilderDebug",
85
121
  "mergeDexRelease",
122
+ "mergeExtDexRelease",
123
+ "mergeExtDexDebug",
124
+ "mergeProjectDexRelease",
125
+ "mergeProjectDexDebug",
126
+ "mergeLibDexRelease",
127
+ "mergeLibDexDebug",
128
+ "mergeDebugGlobalSynthetics",
129
+ "mergeReleaseGlobalSynthetics",
86
130
  "transformClassesWithDex"
87
- ], 75],
88
- [[
131
+ ],
132
+ [
89
133
  "compressReleaseAssets",
134
+ "compressDebugAssets",
90
135
  "optimizeReleaseResources",
91
- "mergeReleaseAssets"
92
- ], 85],
93
- [[
136
+ "mergeReleaseAssets",
137
+ "mergeDebugAssets"
138
+ ],
139
+ [
94
140
  "packageRelease",
95
141
  "packageDebug",
96
142
  "assembleRelease",
97
143
  "assembleDebug"
98
- ], 90],
99
- [["bundleRelease", "bundleDebug"], 95],
100
- [[/\d+ actionable tasks:/], 100]
144
+ ],
145
+ ["bundleRelease", "bundleDebug"],
146
+ ["BUILD SUCCESSFUL", /\d+ actionable tasks:/]
101
147
  ]
102
148
  });
103
149
 
@@ -132,7 +178,7 @@ const getGradleWrapper = () => process.platform.startsWith("win") ? "gradlew.bat
132
178
  /**
133
179
  * Run gradle build with specified tasks and arguments
134
180
  */
135
- async function runGradle({ tasks, args, androidProjectPath, appModuleName }) {
181
+ async function runGradle({ tasks, logPrefix, args, androidProjectPath, appModuleName }) {
136
182
  const gradleArgs = getTaskNames(appModuleName, tasks);
137
183
  gradleArgs.push("-x", "lint");
138
184
  if (args.extraParams) gradleArgs.push(...args.extraParams);
@@ -143,17 +189,25 @@ Tasks ${tasks.join(", ")}
143
189
  Args ${gradleArgs.join(" ")}
144
190
  `);
145
191
  if ("port" in args && args.port != null) gradleArgs.push(`-PreactNativeDevServerPort=${args.port}`);
146
- const logger = createGradleLogger();
147
- logger.start(`${appModuleName}`);
192
+ const logger = createGradleLogger({ logPrefix });
193
+ await logger.start();
148
194
  try {
149
- const process$1 = (0, execa.execa)(getGradleWrapper(), gradleArgs, { cwd: androidProjectPath });
150
- for await (const line of process$1) if (line) logger.processLine(line);
195
+ const process$1 = (0, execa.execa)(getGradleWrapper(), gradleArgs, {
196
+ cwd: androidProjectPath,
197
+ all: true
198
+ });
199
+ const outputStream = process$1.all ?? process$1.stdout;
200
+ if (outputStream) await logger.processStream(outputStream);
201
+ await process$1;
151
202
  logger.stop();
152
203
  } catch (e) {
204
+ logger.writeError(e);
153
205
  logger.stop("Build failed", false);
154
206
  if (e instanceof execa.ExecaError) __hot_updater_cli_tools.p.log.error(getCleanedErrorMessage(e));
155
207
  else if (e instanceof Error) __hot_updater_cli_tools.p.log.error(e.message);
156
208
  throw new Error("Failed to build the app. See the error above for details from Gradle.");
209
+ } finally {
210
+ await logger.close();
157
211
  }
158
212
  return findBuildDirectory({
159
213
  androidProjectPath,
@@ -194,28 +248,15 @@ async function getBuildOutputFilePath({ aab, appModuleName, buildDirectory, vari
194
248
  process.exit(1);
195
249
  }
196
250
 
197
- //#endregion
198
- //#region src/utils/enrichNativeBuildAndroidScheme.ts
199
- const enrichNativeBuildAndroidScheme = async ({ schemeConfig }) => {
200
- return {
201
- aab: true,
202
- variant: "Release",
203
- appModuleName: "app",
204
- applicationId: schemeConfig.packageName,
205
- ...schemeConfig
206
- };
207
- };
208
-
209
251
  //#endregion
210
252
  //#region src/buildAndroid.ts
211
- const buildAndroid = async ({ schemeConfig: _schemeConfig }) => {
253
+ const buildAndroid = async ({ schemeConfig }) => {
212
254
  const androidProjectPath = path.default.join((0, __hot_updater_cli_tools.getCwd)(), "android");
213
- const minBundleId = (0, __hot_updater_plugin_core.generateMinBundleId)();
214
- const schemeConfig = await enrichNativeBuildAndroidScheme({ schemeConfig: _schemeConfig });
215
255
  return runGradle({
216
- args: { extraParams: [`-PMIN_BUNDLE_ID=${minBundleId}`] },
256
+ args: { extraParams: [`-PMIN_BUNDLE_ID=${(0, __hot_updater_plugin_core.generateMinBundleId)()}`] },
217
257
  appModuleName: schemeConfig.appModuleName,
218
258
  tasks: schemeConfig.aab ? [`bundle${schemeConfig.variant}`] : [`assemble${schemeConfig.variant}`],
259
+ logPrefix: `android-${schemeConfig.hotUpdaterSchemeName}-build`,
219
260
  androidProjectPath
220
261
  });
221
262
  };
@@ -406,19 +447,19 @@ const getAvailableDevicePort = async (startPort = defaultPort) => {
406
447
  */
407
448
  const tryLaunchEmulator = async (name) => {
408
449
  const port = await getAvailableDevicePort();
409
- const loader = __hot_updater_cli_tools.p.spinner();
410
- loader.start("Looking for available emulators");
450
+ const spinner = __hot_updater_cli_tools.p.spinner();
451
+ spinner.start("Looking for available emulators");
411
452
  const emulators = await getEmulatorNames();
412
453
  const emulatorName = name ?? emulators[0];
413
454
  let deviceId;
414
455
  if (emulators.length > 0) try {
415
- loader.message(`Launching emulator "${emulatorName}"`);
416
- deviceId = await launchEmulator(emulatorName, port, loader);
417
- loader.stop(`Launched ${emulatorName} emulator.`);
456
+ spinner.message(`Launching emulator "${emulatorName}"`);
457
+ deviceId = await launchEmulator(emulatorName, port, spinner);
458
+ spinner.stop(`Launched ${emulatorName} emulator.`);
418
459
  } catch (error) {
419
- loader.stop(`Failed to launch ${emulatorName} emulator. ${error.message}`, 1);
460
+ spinner.error(`Failed to launch ${emulatorName} emulator. ${error.message}`);
420
461
  }
421
- else loader.stop("No emulators found as an output of `emulator -list-avds`. Please launch an emulator manually or connect a device", 1);
462
+ else spinner.error("No emulators found as an output of `emulator -list-avds`. Please launch an emulator manually or connect a device");
422
463
  return deviceId;
423
464
  };
424
465
  /**
@@ -522,15 +563,15 @@ const tryInstallAppOnDevice = async ({ device, apkPath }) => {
522
563
  ];
523
564
  adbArgs.push(apkPath);
524
565
  const adbPath = Device.getAdbPath();
525
- const loader = __hot_updater_cli_tools.p.spinner();
526
- loader.start(`Installing the app on ${device.readableName} (id: ${deviceId})`);
566
+ const spinner = __hot_updater_cli_tools.p.spinner();
567
+ spinner.start(`Installing the app on ${device.readableName} (id: ${deviceId})`);
527
568
  try {
528
569
  await (0, execa.execa)(adbPath, adbArgs);
529
- loader.stop(`Installed the app on ${device.readableName} (id: ${deviceId}).`);
570
+ spinner.stop(`Installed the app on ${device.readableName} (id: ${deviceId}).`);
530
571
  } catch (error) {
531
572
  const errorMessage = error.stdout || error.stderr || "Unknown error";
532
- if (typeof errorMessage === "string" && errorMessage.includes("INSTALL_FAILED_INSUFFICIENT_STORAGE")) loader.message("Installation failed due to insufficient storage");
533
- loader.stop(`Failed: Installing the app on ${device.readableName} (id: ${deviceId})`, 1);
573
+ if (typeof errorMessage === "string" && errorMessage.includes("INSTALL_FAILED_INSUFFICIENT_STORAGE")) spinner.message("Installation failed due to insufficient storage");
574
+ spinner.error(`Failed: Installing the app on ${device.readableName} (id: ${deviceId})`);
534
575
  throw new Error(typeof errorMessage === "string" ? errorMessage : "Installation failed");
535
576
  }
536
577
  };
@@ -562,23 +603,22 @@ async function tryLaunchAppOnDevice({ device, port, mainActivity, applicationId,
562
603
  adbArgs.unshift("-s", deviceId);
563
604
  const adbPath = Device.getAdbPath();
564
605
  console.debug(`Running ${adbPath} ${adbArgs.join(" ")}.`);
565
- const loader = __hot_updater_cli_tools.p.spinner();
566
- loader.start(`Launching the app on ${device.readableName} (id: ${deviceId})`);
606
+ const spinner = __hot_updater_cli_tools.p.spinner();
607
+ spinner.start(`Launching the app on ${device.readableName} (id: ${deviceId})`);
567
608
  try {
568
609
  await (0, execa.execa)(adbPath, adbArgs);
569
- loader.stop(`Launched the app on ${device.readableName} (id: ${deviceId}) and listening on port ${port}.`);
610
+ spinner.stop(`Launched the app on ${device.readableName} (id: ${deviceId}) and listening on port ${port}.`);
570
611
  } catch (_error) {
571
- loader.stop("Failed to launch the app.", 1);
612
+ spinner.error("Failed to launch the app.");
572
613
  throw new Error(`Failed to launch the app on ${device.readableName}`);
573
614
  }
574
615
  }
575
616
 
576
617
  //#endregion
577
618
  //#region src/runAndroid.ts
578
- const runAndroid = async ({ schemeConfig: _schemeConfig, runOption }) => {
619
+ const runAndroid = async ({ schemeConfig, runOption }) => {
579
620
  const { interactive, device: deviceOption } = runOption;
580
621
  const androidProjectPath = path.default.join((0, __hot_updater_cli_tools.getCwd)(), "android");
581
- const schemeConfig = await enrichNativeBuildAndroidScheme({ schemeConfig: _schemeConfig });
582
622
  if (schemeConfig.aab) {
583
623
  __hot_updater_cli_tools.p.log.error("aab scheme can't not be run");
584
624
  process.exit(1);
@@ -600,6 +640,7 @@ const runAndroid = async ({ schemeConfig: _schemeConfig, runOption }) => {
600
640
  const result = await runGradle({
601
641
  args: { extraParams: [`-PMIN_BUNDLE_ID=${(0, __hot_updater_plugin_core.generateMinBundleId)()}`] },
602
642
  appModuleName: schemeConfig.appModuleName,
643
+ logPrefix: `android-${schemeConfig.hotUpdaterSchemeName}-run`,
603
644
  tasks: [task],
604
645
  androidProjectPath
605
646
  });
@@ -621,6 +662,20 @@ const runAndroid = async ({ schemeConfig: _schemeConfig, runOption }) => {
621
662
  return result;
622
663
  };
623
664
 
665
+ //#endregion
666
+ //#region src/utils/enrichNativeBuildAndroidScheme.ts
667
+ const enrichNativeBuildAndroidScheme = async ({ schemeConfig, hotUpdaterSchemeName }) => {
668
+ return {
669
+ aab: true,
670
+ variant: "Release",
671
+ appModuleName: "app",
672
+ applicationId: schemeConfig.packageName,
673
+ ...schemeConfig,
674
+ hotUpdaterSchemeName
675
+ };
676
+ };
677
+
624
678
  //#endregion
625
679
  exports.buildAndroid = buildAndroid;
680
+ exports.enrichNativeBuildAndroidScheme = enrichNativeBuildAndroidScheme;
626
681
  exports.runAndroid = runAndroid;
package/dist/index.d.cts CHANGED
@@ -1,10 +1,26 @@
1
1
  import { NativeBuildAndroidScheme, NativeBuildOptions } from "@hot-updater/plugin-core";
2
2
 
3
+ //#region src/utils/enrichNativeBuildAndroidScheme.d.ts
4
+
5
+ /**
6
+ * Validated scheme filled nullish values with default values.
7
+ */
8
+ type EnrichedNativeBuildAndroidScheme = Required<NativeBuildAndroidScheme> & {
9
+ hotUpdaterSchemeName: string;
10
+ };
11
+ declare const enrichNativeBuildAndroidScheme: ({
12
+ schemeConfig,
13
+ hotUpdaterSchemeName
14
+ }: {
15
+ schemeConfig: NativeBuildAndroidScheme;
16
+ hotUpdaterSchemeName: string;
17
+ }) => Promise<EnrichedNativeBuildAndroidScheme>;
18
+ //#endregion
3
19
  //#region src/buildAndroid.d.ts
4
20
  declare const buildAndroid: ({
5
- schemeConfig: _schemeConfig
21
+ schemeConfig
6
22
  }: {
7
- schemeConfig: NativeBuildAndroidScheme;
23
+ schemeConfig: EnrichedNativeBuildAndroidScheme;
8
24
  }) => Promise<{
9
25
  buildDirectory: string;
10
26
  buildArtifactPath: string;
@@ -20,14 +36,14 @@ interface AndroidNativeRunOptions extends NativeBuildOptions {
20
36
  //#endregion
21
37
  //#region src/runAndroid.d.ts
22
38
  declare const runAndroid: ({
23
- schemeConfig: _schemeConfig,
39
+ schemeConfig,
24
40
  runOption
25
41
  }: {
26
- schemeConfig: NativeBuildAndroidScheme;
42
+ schemeConfig: EnrichedNativeBuildAndroidScheme;
27
43
  runOption: AndroidNativeRunOptions;
28
44
  }) => Promise<{
29
45
  buildDirectory: string;
30
46
  buildArtifactPath: string;
31
47
  }>;
32
48
  //#endregion
33
- export { type AndroidNativeRunOptions, buildAndroid, runAndroid };
49
+ export { type AndroidNativeRunOptions, type EnrichedNativeBuildAndroidScheme, buildAndroid, enrichNativeBuildAndroidScheme, runAndroid };
package/dist/index.d.ts CHANGED
@@ -1,10 +1,26 @@
1
1
  import { NativeBuildAndroidScheme, NativeBuildOptions } from "@hot-updater/plugin-core";
2
2
 
3
+ //#region src/utils/enrichNativeBuildAndroidScheme.d.ts
4
+
5
+ /**
6
+ * Validated scheme filled nullish values with default values.
7
+ */
8
+ type EnrichedNativeBuildAndroidScheme = Required<NativeBuildAndroidScheme> & {
9
+ hotUpdaterSchemeName: string;
10
+ };
11
+ declare const enrichNativeBuildAndroidScheme: ({
12
+ schemeConfig,
13
+ hotUpdaterSchemeName
14
+ }: {
15
+ schemeConfig: NativeBuildAndroidScheme;
16
+ hotUpdaterSchemeName: string;
17
+ }) => Promise<EnrichedNativeBuildAndroidScheme>;
18
+ //#endregion
3
19
  //#region src/buildAndroid.d.ts
4
20
  declare const buildAndroid: ({
5
- schemeConfig: _schemeConfig
21
+ schemeConfig
6
22
  }: {
7
- schemeConfig: NativeBuildAndroidScheme;
23
+ schemeConfig: EnrichedNativeBuildAndroidScheme;
8
24
  }) => Promise<{
9
25
  buildDirectory: string;
10
26
  buildArtifactPath: string;
@@ -20,14 +36,14 @@ interface AndroidNativeRunOptions extends NativeBuildOptions {
20
36
  //#endregion
21
37
  //#region src/runAndroid.d.ts
22
38
  declare const runAndroid: ({
23
- schemeConfig: _schemeConfig,
39
+ schemeConfig,
24
40
  runOption
25
41
  }: {
26
- schemeConfig: NativeBuildAndroidScheme;
42
+ schemeConfig: EnrichedNativeBuildAndroidScheme;
27
43
  runOption: AndroidNativeRunOptions;
28
44
  }) => Promise<{
29
45
  buildDirectory: string;
30
46
  buildArtifactPath: string;
31
47
  }>;
32
48
  //#endregion
33
- export { type AndroidNativeRunOptions, buildAndroid, runAndroid };
49
+ export { type AndroidNativeRunOptions, type EnrichedNativeBuildAndroidScheme, buildAndroid, enrichNativeBuildAndroidScheme, runAndroid };
package/dist/index.js CHANGED
@@ -6,8 +6,8 @@ import fs from "fs";
6
6
  import os from "node:os";
7
7
 
8
8
  //#region src/utils/createGradleLogger.ts
9
- const createGradleLogger = () => new BuildLogger({
10
- failurePatterns: ["BUILD FAILED"],
9
+ const createGradleLogger = ({ logPrefix }) => new BuildLogger({
10
+ logPrefix,
11
11
  importantLogPatterns: [
12
12
  "error:",
13
13
  "Error:",
@@ -26,49 +26,95 @@ const createGradleLogger = () => new BuildLogger({
26
26
  "Android resource compilation failed",
27
27
  "Duplicate class",
28
28
  "Program type already present",
29
- "actionable tasks:"
29
+ "actionable tasks:",
30
+ "Deprecated Gradle features were used",
31
+ ":app:configureCMake",
32
+ ":app:buildCMake",
33
+ ":app:compileDebugKotlin",
34
+ ":app:compileReleaseKotlin",
35
+ ":app:compileDebugJavaWithJavac",
36
+ ":app:compileReleaseJavaWithJavac",
37
+ ":app:mergeDebugResources",
38
+ ":app:mergeReleaseResources",
39
+ ":app:processDebugResources",
40
+ ":app:processReleaseResources",
41
+ ":app:packageDebug",
42
+ ":app:packageRelease",
43
+ ":app:assembleDebug",
44
+ ":app:assembleRelease"
30
45
  ],
31
- progressMapping: [
32
- [[
46
+ progressStages: [
47
+ [
33
48
  "buildKotlinToolingMetadata",
34
49
  "generateAutolinkingNewArchitectureFiles",
35
- "generateCodegenSchemaFromJavaScript"
36
- ], 5],
37
- [[
50
+ "generateAutolinkingPackageList",
51
+ "generateCodegenSchemaFromJavaScript",
52
+ "generateCodegenArtifactsFromSchema",
53
+ "generateReactNativeEntryPoint"
54
+ ],
55
+ [
38
56
  "createBundleReleaseJsAndAssets",
39
57
  "bundleReleaseJsAndAssets",
40
58
  "bundleDebugJsAndAssets"
41
- ], 15],
42
- [[
59
+ ],
60
+ [
43
61
  "generateReleaseResValues",
62
+ "generateDebugResValues",
44
63
  "generateReleaseResources",
45
- "mergeReleaseResources"
46
- ], 25],
47
- [[
64
+ "generateDebugResources",
65
+ "mergeReleaseResources",
66
+ "mergeDebugResources"
67
+ ],
68
+ [
48
69
  "processReleaseResources",
70
+ "processDebugResources",
49
71
  "processReleaseManifest",
50
- "parseReleaseLocalResources"
51
- ], 35],
52
- [["compileReleaseKotlin", "compileDebugKotlin"], 50],
53
- [["compileReleaseJavaWithJavac", "compileDebugJavaWithJavac"], 60],
54
- [[
72
+ "processDebugManifest",
73
+ "processDebugMainManifest",
74
+ "parseReleaseLocalResources",
75
+ "parseDebugLocalResources"
76
+ ],
77
+ ["compileReleaseKotlin", "compileDebugKotlin"],
78
+ ["compileReleaseJavaWithJavac", "compileDebugJavaWithJavac"],
79
+ [
80
+ /configureCMake\w+\[/,
81
+ /buildCMake\w+\[/,
82
+ "mergeReleaseJniLibFolders",
83
+ "mergeDebugJniLibFolders",
84
+ "mergeReleaseNativeLibs",
85
+ "mergeDebugNativeLibs"
86
+ ],
87
+ [
88
+ "desugarReleaseFileDependencies",
89
+ "desugarDebugFileDependencies",
55
90
  "dexBuilderRelease",
91
+ "dexBuilderDebug",
56
92
  "mergeDexRelease",
93
+ "mergeExtDexRelease",
94
+ "mergeExtDexDebug",
95
+ "mergeProjectDexRelease",
96
+ "mergeProjectDexDebug",
97
+ "mergeLibDexRelease",
98
+ "mergeLibDexDebug",
99
+ "mergeDebugGlobalSynthetics",
100
+ "mergeReleaseGlobalSynthetics",
57
101
  "transformClassesWithDex"
58
- ], 75],
59
- [[
102
+ ],
103
+ [
60
104
  "compressReleaseAssets",
105
+ "compressDebugAssets",
61
106
  "optimizeReleaseResources",
62
- "mergeReleaseAssets"
63
- ], 85],
64
- [[
107
+ "mergeReleaseAssets",
108
+ "mergeDebugAssets"
109
+ ],
110
+ [
65
111
  "packageRelease",
66
112
  "packageDebug",
67
113
  "assembleRelease",
68
114
  "assembleDebug"
69
- ], 90],
70
- [["bundleRelease", "bundleDebug"], 95],
71
- [[/\d+ actionable tasks:/], 100]
115
+ ],
116
+ ["bundleRelease", "bundleDebug"],
117
+ ["BUILD SUCCESSFUL", /\d+ actionable tasks:/]
72
118
  ]
73
119
  });
74
120
 
@@ -103,7 +149,7 @@ const getGradleWrapper = () => process.platform.startsWith("win") ? "gradlew.bat
103
149
  /**
104
150
  * Run gradle build with specified tasks and arguments
105
151
  */
106
- async function runGradle({ tasks, args, androidProjectPath, appModuleName }) {
152
+ async function runGradle({ tasks, logPrefix, args, androidProjectPath, appModuleName }) {
107
153
  const gradleArgs = getTaskNames(appModuleName, tasks);
108
154
  gradleArgs.push("-x", "lint");
109
155
  if (args.extraParams) gradleArgs.push(...args.extraParams);
@@ -114,17 +160,25 @@ Tasks ${tasks.join(", ")}
114
160
  Args ${gradleArgs.join(" ")}
115
161
  `);
116
162
  if ("port" in args && args.port != null) gradleArgs.push(`-PreactNativeDevServerPort=${args.port}`);
117
- const logger = createGradleLogger();
118
- logger.start(`${appModuleName}`);
163
+ const logger = createGradleLogger({ logPrefix });
164
+ await logger.start();
119
165
  try {
120
- const process$1 = execa(getGradleWrapper(), gradleArgs, { cwd: androidProjectPath });
121
- for await (const line of process$1) if (line) logger.processLine(line);
166
+ const process$1 = execa(getGradleWrapper(), gradleArgs, {
167
+ cwd: androidProjectPath,
168
+ all: true
169
+ });
170
+ const outputStream = process$1.all ?? process$1.stdout;
171
+ if (outputStream) await logger.processStream(outputStream);
172
+ await process$1;
122
173
  logger.stop();
123
174
  } catch (e) {
175
+ logger.writeError(e);
124
176
  logger.stop("Build failed", false);
125
177
  if (e instanceof ExecaError) p.log.error(getCleanedErrorMessage(e));
126
178
  else if (e instanceof Error) p.log.error(e.message);
127
179
  throw new Error("Failed to build the app. See the error above for details from Gradle.");
180
+ } finally {
181
+ await logger.close();
128
182
  }
129
183
  return findBuildDirectory({
130
184
  androidProjectPath,
@@ -165,28 +219,15 @@ async function getBuildOutputFilePath({ aab, appModuleName, buildDirectory, vari
165
219
  process.exit(1);
166
220
  }
167
221
 
168
- //#endregion
169
- //#region src/utils/enrichNativeBuildAndroidScheme.ts
170
- const enrichNativeBuildAndroidScheme = async ({ schemeConfig }) => {
171
- return {
172
- aab: true,
173
- variant: "Release",
174
- appModuleName: "app",
175
- applicationId: schemeConfig.packageName,
176
- ...schemeConfig
177
- };
178
- };
179
-
180
222
  //#endregion
181
223
  //#region src/buildAndroid.ts
182
- const buildAndroid = async ({ schemeConfig: _schemeConfig }) => {
224
+ const buildAndroid = async ({ schemeConfig }) => {
183
225
  const androidProjectPath = path.join(getCwd(), "android");
184
- const minBundleId = generateMinBundleId();
185
- const schemeConfig = await enrichNativeBuildAndroidScheme({ schemeConfig: _schemeConfig });
186
226
  return runGradle({
187
- args: { extraParams: [`-PMIN_BUNDLE_ID=${minBundleId}`] },
227
+ args: { extraParams: [`-PMIN_BUNDLE_ID=${generateMinBundleId()}`] },
188
228
  appModuleName: schemeConfig.appModuleName,
189
229
  tasks: schemeConfig.aab ? [`bundle${schemeConfig.variant}`] : [`assemble${schemeConfig.variant}`],
230
+ logPrefix: `android-${schemeConfig.hotUpdaterSchemeName}-build`,
190
231
  androidProjectPath
191
232
  });
192
233
  };
@@ -377,19 +418,19 @@ const getAvailableDevicePort = async (startPort = defaultPort) => {
377
418
  */
378
419
  const tryLaunchEmulator = async (name) => {
379
420
  const port = await getAvailableDevicePort();
380
- const loader = p.spinner();
381
- loader.start("Looking for available emulators");
421
+ const spinner = p.spinner();
422
+ spinner.start("Looking for available emulators");
382
423
  const emulators = await getEmulatorNames();
383
424
  const emulatorName = name ?? emulators[0];
384
425
  let deviceId;
385
426
  if (emulators.length > 0) try {
386
- loader.message(`Launching emulator "${emulatorName}"`);
387
- deviceId = await launchEmulator(emulatorName, port, loader);
388
- loader.stop(`Launched ${emulatorName} emulator.`);
427
+ spinner.message(`Launching emulator "${emulatorName}"`);
428
+ deviceId = await launchEmulator(emulatorName, port, spinner);
429
+ spinner.stop(`Launched ${emulatorName} emulator.`);
389
430
  } catch (error) {
390
- loader.stop(`Failed to launch ${emulatorName} emulator. ${error.message}`, 1);
431
+ spinner.error(`Failed to launch ${emulatorName} emulator. ${error.message}`);
391
432
  }
392
- else loader.stop("No emulators found as an output of `emulator -list-avds`. Please launch an emulator manually or connect a device", 1);
433
+ else spinner.error("No emulators found as an output of `emulator -list-avds`. Please launch an emulator manually or connect a device");
393
434
  return deviceId;
394
435
  };
395
436
  /**
@@ -493,15 +534,15 @@ const tryInstallAppOnDevice = async ({ device, apkPath }) => {
493
534
  ];
494
535
  adbArgs.push(apkPath);
495
536
  const adbPath = Device.getAdbPath();
496
- const loader = p.spinner();
497
- loader.start(`Installing the app on ${device.readableName} (id: ${deviceId})`);
537
+ const spinner = p.spinner();
538
+ spinner.start(`Installing the app on ${device.readableName} (id: ${deviceId})`);
498
539
  try {
499
540
  await execa(adbPath, adbArgs);
500
- loader.stop(`Installed the app on ${device.readableName} (id: ${deviceId}).`);
541
+ spinner.stop(`Installed the app on ${device.readableName} (id: ${deviceId}).`);
501
542
  } catch (error) {
502
543
  const errorMessage = error.stdout || error.stderr || "Unknown error";
503
- if (typeof errorMessage === "string" && errorMessage.includes("INSTALL_FAILED_INSUFFICIENT_STORAGE")) loader.message("Installation failed due to insufficient storage");
504
- loader.stop(`Failed: Installing the app on ${device.readableName} (id: ${deviceId})`, 1);
544
+ if (typeof errorMessage === "string" && errorMessage.includes("INSTALL_FAILED_INSUFFICIENT_STORAGE")) spinner.message("Installation failed due to insufficient storage");
545
+ spinner.error(`Failed: Installing the app on ${device.readableName} (id: ${deviceId})`);
505
546
  throw new Error(typeof errorMessage === "string" ? errorMessage : "Installation failed");
506
547
  }
507
548
  };
@@ -533,23 +574,22 @@ async function tryLaunchAppOnDevice({ device, port, mainActivity, applicationId,
533
574
  adbArgs.unshift("-s", deviceId);
534
575
  const adbPath = Device.getAdbPath();
535
576
  console.debug(`Running ${adbPath} ${adbArgs.join(" ")}.`);
536
- const loader = p.spinner();
537
- loader.start(`Launching the app on ${device.readableName} (id: ${deviceId})`);
577
+ const spinner = p.spinner();
578
+ spinner.start(`Launching the app on ${device.readableName} (id: ${deviceId})`);
538
579
  try {
539
580
  await execa(adbPath, adbArgs);
540
- loader.stop(`Launched the app on ${device.readableName} (id: ${deviceId}) and listening on port ${port}.`);
581
+ spinner.stop(`Launched the app on ${device.readableName} (id: ${deviceId}) and listening on port ${port}.`);
541
582
  } catch (_error) {
542
- loader.stop("Failed to launch the app.", 1);
583
+ spinner.error("Failed to launch the app.");
543
584
  throw new Error(`Failed to launch the app on ${device.readableName}`);
544
585
  }
545
586
  }
546
587
 
547
588
  //#endregion
548
589
  //#region src/runAndroid.ts
549
- const runAndroid = async ({ schemeConfig: _schemeConfig, runOption }) => {
590
+ const runAndroid = async ({ schemeConfig, runOption }) => {
550
591
  const { interactive, device: deviceOption } = runOption;
551
592
  const androidProjectPath = path.join(getCwd(), "android");
552
- const schemeConfig = await enrichNativeBuildAndroidScheme({ schemeConfig: _schemeConfig });
553
593
  if (schemeConfig.aab) {
554
594
  p.log.error("aab scheme can't not be run");
555
595
  process.exit(1);
@@ -571,6 +611,7 @@ const runAndroid = async ({ schemeConfig: _schemeConfig, runOption }) => {
571
611
  const result = await runGradle({
572
612
  args: { extraParams: [`-PMIN_BUNDLE_ID=${generateMinBundleId()}`] },
573
613
  appModuleName: schemeConfig.appModuleName,
614
+ logPrefix: `android-${schemeConfig.hotUpdaterSchemeName}-run`,
574
615
  tasks: [task],
575
616
  androidProjectPath
576
617
  });
@@ -593,4 +634,17 @@ const runAndroid = async ({ schemeConfig: _schemeConfig, runOption }) => {
593
634
  };
594
635
 
595
636
  //#endregion
596
- export { buildAndroid, runAndroid };
637
+ //#region src/utils/enrichNativeBuildAndroidScheme.ts
638
+ const enrichNativeBuildAndroidScheme = async ({ schemeConfig, hotUpdaterSchemeName }) => {
639
+ return {
640
+ aab: true,
641
+ variant: "Release",
642
+ appModuleName: "app",
643
+ applicationId: schemeConfig.packageName,
644
+ ...schemeConfig,
645
+ hotUpdaterSchemeName
646
+ };
647
+ };
648
+
649
+ //#endregion
650
+ export { buildAndroid, enrichNativeBuildAndroidScheme, runAndroid };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hot-updater/android-helper",
3
- "version": "0.25.9",
3
+ "version": "0.25.10",
4
4
  "type": "module",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.js",
@@ -25,9 +25,9 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "execa": "9.5.2",
28
- "@hot-updater/cli-tools": "0.25.9",
29
- "@hot-updater/plugin-core": "0.25.9",
30
- "@hot-updater/core": "0.25.9"
28
+ "@hot-updater/cli-tools": "0.25.10",
29
+ "@hot-updater/plugin-core": "0.25.10",
30
+ "@hot-updater/core": "0.25.10"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "^20"