@jetstart/cli 1.6.0 → 2.0.0
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 +133 -41
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +11 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/android-emulator.d.ts.map +1 -0
- package/dist/commands/android-emulator.js.map +1 -0
- package/dist/commands/build.d.ts +13 -1
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +279 -29
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/clean.d.ts +23 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +191 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +41 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +51 -9
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/install-audit.d.ts.map +1 -0
- package/dist/commands/install-audit.js.map +1 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/android-sdk.d.ts.map +1 -0
- package/dist/utils/android-sdk.js +2 -2
- package/dist/utils/android-sdk.js.map +1 -0
- package/dist/utils/downloader.d.ts.map +1 -0
- package/dist/utils/downloader.js.map +1 -0
- package/dist/utils/emulator-deployer.d.ts.map +1 -0
- package/dist/utils/emulator-deployer.js.map +1 -0
- package/dist/utils/emulator.d.ts.map +1 -0
- package/dist/utils/emulator.js +5 -4
- package/dist/utils/emulator.js.map +1 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/java.d.ts.map +1 -0
- package/dist/utils/java.js +5 -5
- package/dist/utils/java.js.map +1 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/open.d.ts.map +1 -0
- package/dist/utils/open.js.map +1 -0
- package/dist/utils/prompt.d.ts.map +1 -0
- package/dist/utils/prompt.js.map +1 -0
- package/dist/utils/spinner.d.ts.map +1 -0
- package/dist/utils/spinner.js.map +1 -0
- package/dist/utils/system-tools.d.ts.map +1 -0
- package/dist/utils/system-tools.js.map +1 -0
- package/dist/utils/template.d.ts +13 -1
- package/dist/utils/template.d.ts.map +1 -0
- package/dist/utils/template.js +133 -1003
- package/dist/utils/template.js.map +1 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/1.0.0/com.jetstart.hot-reload.gradle.plugin-1.0.0.pom +15 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/1.0.0/com.jetstart.hot-reload.gradle.plugin-1.0.0.pom.md5 +1 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/1.0.0/com.jetstart.hot-reload.gradle.plugin-1.0.0.pom.sha1 +1 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/1.0.0/com.jetstart.hot-reload.gradle.plugin-1.0.0.pom.sha256 +1 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/1.0.0/com.jetstart.hot-reload.gradle.plugin-1.0.0.pom.sha512 +1 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/maven-metadata.xml +13 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/maven-metadata.xml.md5 +1 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/maven-metadata.xml.sha1 +1 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/maven-metadata.xml.sha256 +1 -0
- package/maven-repo/com/jetstart/hot-reload/com.jetstart.hot-reload.gradle.plugin/maven-metadata.xml.sha512 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0-sources.jar +0 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0-sources.jar.md5 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0-sources.jar.sha1 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0-sources.jar.sha256 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0-sources.jar.sha512 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.aar +0 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.aar.md5 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.aar.sha1 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.aar.sha256 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.aar.sha512 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.module +124 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.module.md5 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.module.sha1 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.module.sha256 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.module.sha512 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.pom +46 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.pom.md5 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.pom.sha1 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.pom.sha256 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/1.0.0/hot-reload-runtime-1.0.0.pom.sha512 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/maven-metadata.xml +13 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/maven-metadata.xml.md5 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/maven-metadata.xml.sha1 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/maven-metadata.xml.sha256 +1 -0
- package/maven-repo/com/jetstart/hot-reload-runtime/maven-metadata.xml.sha512 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.jar +0 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.jar.md5 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.jar.sha1 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.jar.sha256 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.jar.sha512 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.module +103 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.module.md5 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.module.sha1 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.module.sha256 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.module.sha512 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.pom +38 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.pom.md5 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.pom.sha1 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.pom.sha256 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/1.0.0/jetstart-gradle-plugin-1.0.0.pom.sha512 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/maven-metadata.xml +13 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/maven-metadata.xml.md5 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/maven-metadata.xml.sha1 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/maven-metadata.xml.sha256 +1 -0
- package/maven-repo/com/jetstart/jetstart-gradle-plugin/maven-metadata.xml.sha512 +1 -0
- package/package.json +13 -5
- package/scripts/build-java.js +30 -0
- package/.eslintrc.json +0 -6
- package/src/cli.ts +0 -99
- package/src/commands/android-emulator.ts +0 -304
- package/src/commands/build.ts +0 -60
- package/src/commands/create.ts +0 -232
- package/src/commands/dev.ts +0 -198
- package/src/commands/index.ts +0 -10
- package/src/commands/install-audit.ts +0 -227
- package/src/commands/logs.ts +0 -117
- package/src/index.ts +0 -17
- package/src/types/index.ts +0 -53
- package/src/utils/android-sdk.ts +0 -512
- package/src/utils/downloader.ts +0 -201
- package/src/utils/emulator-deployer.ts +0 -210
- package/src/utils/emulator.ts +0 -463
- package/src/utils/index.ts +0 -8
- package/src/utils/java.ts +0 -369
- package/src/utils/logger.ts +0 -42
- package/src/utils/open.ts +0 -36
- package/src/utils/prompt.ts +0 -56
- package/src/utils/spinner.ts +0 -25
- package/src/utils/system-tools.ts +0 -648
- package/src/utils/template.ts +0 -1217
- package/tests/create.test.ts +0 -33
- package/tests/utils.test.ts +0 -17
- package/tsconfig.json +0 -25
package/README.md
CHANGED
|
@@ -1,92 +1,184 @@
|
|
|
1
|
-
# @jetstart/cli
|
|
1
|
+
# @jetstart/cli
|
|
2
2
|
|
|
3
|
-
Command-line interface for JetStart
|
|
3
|
+
Command-line interface for JetStart — instant hot reload for Android Jetpack Compose.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
|
+
|
|
6
7
|
```bash
|
|
7
8
|
npm install -g @jetstart/cli
|
|
8
9
|
```
|
|
9
10
|
|
|
11
|
+
Or use without installing:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npx jetstart <command>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
10
19
|
## Commands
|
|
11
20
|
|
|
12
|
-
### `jetstart create <
|
|
21
|
+
### `jetstart create <n>`
|
|
22
|
+
|
|
23
|
+
Scaffolds a new Android/Compose project. Checks for Java 17+ and Android SDK and installs them interactively if missing.
|
|
13
24
|
|
|
14
|
-
Create a new JetStart project.
|
|
15
25
|
```bash
|
|
16
|
-
jetstart create
|
|
17
|
-
jetstart create
|
|
18
|
-
jetstart create
|
|
26
|
+
jetstart create my-app
|
|
27
|
+
jetstart create my-app --package com.example.myapp
|
|
28
|
+
jetstart create my-app --skip-install
|
|
29
|
+
jetstart create my-app --full-install # Non-interactive, installs all deps automatically
|
|
19
30
|
```
|
|
20
31
|
|
|
21
32
|
**Options:**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
33
|
+
|
|
34
|
+
| Flag | Description |
|
|
35
|
+
|---|---|
|
|
36
|
+
| `-p, --package <n>` | Android package name (e.g. `com.example.app`) |
|
|
37
|
+
| `-t, --template <n>` | Template to use (default: `default`) |
|
|
38
|
+
| `--skip-install` | Skip dependency check |
|
|
39
|
+
| `--full-install` | Non-interactive: auto-install Java + Android SDK |
|
|
40
|
+
|
|
41
|
+
---
|
|
25
42
|
|
|
26
43
|
### `jetstart dev`
|
|
27
44
|
|
|
28
|
-
|
|
45
|
+
Starts the JetStart development server. Watches for Kotlin file changes, compiles them to DEX, and pushes hot reload patches to connected devices over WebSocket.
|
|
46
|
+
|
|
29
47
|
```bash
|
|
30
48
|
jetstart dev
|
|
31
|
-
jetstart dev --port
|
|
32
|
-
jetstart dev --
|
|
49
|
+
jetstart dev --port 9000
|
|
50
|
+
jetstart dev --emulator # Deploy to a running AVD then switch to hot reload
|
|
51
|
+
jetstart dev --emulator --avd Pixel7 # Target a specific AVD by name
|
|
52
|
+
jetstart dev --web # Auto-open the browser web emulator
|
|
53
|
+
jetstart dev --no-qr # Skip printing the QR code
|
|
33
54
|
```
|
|
34
55
|
|
|
35
56
|
**Options:**
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
57
|
+
|
|
58
|
+
| Flag | Description |
|
|
59
|
+
|---|---|
|
|
60
|
+
| `-p, --port <port>` | HTTP port (default: `8765`) |
|
|
61
|
+
| `-H, --host <host>` | Host override (default: auto-detected LAN IP) |
|
|
62
|
+
| `--emulator` | Deploy APK to a running AVD via ADB on first build, then use hot reload |
|
|
63
|
+
| `--avd <n>` | Target AVD name when using `--emulator` |
|
|
64
|
+
| `--web` | Open the web emulator in a browser on start |
|
|
65
|
+
| `--no-qr` | Do not print the QR code |
|
|
66
|
+
|
|
67
|
+
**Ports used:**
|
|
68
|
+
|
|
69
|
+
| Port | Service |
|
|
70
|
+
|---|---|
|
|
71
|
+
| `8765` | HTTP server (REST API, APK download, web emulator redirect) |
|
|
72
|
+
| `8766` | WebSocket server (device/browser to core comms) |
|
|
73
|
+
| `8767` | Logs server (device log aggregation) |
|
|
74
|
+
|
|
75
|
+
The QR code encodes `host|port|wsPort|sessionId|token|projectName`. Each `jetstart dev` session generates a fresh `sessionId` and `token`; devices built against an older session are rejected with WebSocket close code `4001` or `4002`.
|
|
76
|
+
|
|
77
|
+
The host detection logic skips virtual network interfaces (Hyper-V, WSL, Docker, VMware) and prefers real Wi-Fi/Ethernet addresses in the `192.168.*`, `10.*`, or `172.*` ranges.
|
|
78
|
+
|
|
79
|
+
---
|
|
40
80
|
|
|
41
81
|
### `jetstart build`
|
|
42
82
|
|
|
43
|
-
|
|
83
|
+
Builds an APK (or AAB) via Gradle. Release builds automatically strip the dev-server URL and session token from `BuildConfig` and set `debuggable=false`, then restore `build.gradle` to its original state even if the build fails.
|
|
84
|
+
|
|
44
85
|
```bash
|
|
45
|
-
jetstart build
|
|
46
|
-
jetstart build --release
|
|
47
|
-
jetstart build --
|
|
86
|
+
jetstart build # Debug APK
|
|
87
|
+
jetstart build --release # Unsigned release APK
|
|
88
|
+
jetstart build --release --sign # Signed release APK (requires keystore.properties)
|
|
89
|
+
jetstart build --release --self-sign # Auto-generate a test keystore and sign
|
|
90
|
+
jetstart build --bundle # Build AAB (Android App Bundle)
|
|
91
|
+
jetstart build --release --bundle # Signed release AAB
|
|
92
|
+
jetstart build --output ./dist # Custom output directory
|
|
93
|
+
jetstart build --flavor staging # Build a specific product flavor
|
|
48
94
|
```
|
|
49
95
|
|
|
50
96
|
**Options:**
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
97
|
+
|
|
98
|
+
| Flag | Description |
|
|
99
|
+
|---|---|
|
|
100
|
+
| `-o, --output <path>` | Output directory (default: `./build`) |
|
|
101
|
+
| `-r, --release` | Release build — R8 enabled, `debuggable=false`, dev credentials stripped |
|
|
102
|
+
| `--sign` | Sign with `keystore.properties` in the project root |
|
|
103
|
+
| `--self-sign` | Auto-generate a test keystore via `keytool` and sign (not for Play Store) |
|
|
104
|
+
| `--bundle` | Produce an AAB instead of an APK |
|
|
105
|
+
| `--flavor <n>` | Build a specific product flavor |
|
|
106
|
+
|
|
107
|
+
**`keystore.properties` format (required for `--sign`):**
|
|
108
|
+
|
|
109
|
+
```properties
|
|
110
|
+
storeFile=path/to/release.jks
|
|
111
|
+
storePassword=your-store-password
|
|
112
|
+
keyAlias=your-key-alias
|
|
113
|
+
keyPassword=your-key-password
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
Generate a keystore:
|
|
117
|
+
|
|
118
|
+
```bash
|
|
119
|
+
keytool -genkey -v -keystore release.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
54
123
|
|
|
55
124
|
### `jetstart logs`
|
|
56
125
|
|
|
57
|
-
|
|
126
|
+
Connects to the JetStart logs server (`port 8767`) and streams live device logs to the terminal.
|
|
127
|
+
|
|
58
128
|
```bash
|
|
59
129
|
jetstart logs
|
|
60
130
|
jetstart logs --level error
|
|
61
131
|
jetstart logs --source build
|
|
132
|
+
jetstart logs --lines 200
|
|
62
133
|
```
|
|
63
134
|
|
|
64
135
|
**Options:**
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
136
|
+
|
|
137
|
+
| Flag | Description |
|
|
138
|
+
|---|---|
|
|
139
|
+
| `-f, --follow` | Follow log output in real time (default: `true`) |
|
|
140
|
+
| `-l, --level <level>` | Filter by level: `verbose`, `debug`, `info`, `warn`, `error`, `fatal` |
|
|
141
|
+
| `-s, --source <source>` | Filter by source: `cli`, `core`, `client`, `build`, `network`, `system` |
|
|
142
|
+
| `-n, --lines <n>` | Number of historical lines to replay on connect (default: `100`) |
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
### `jetstart clean`
|
|
147
|
+
|
|
148
|
+
Removes build artifacts and caches.
|
|
149
|
+
|
|
150
|
+
```bash
|
|
151
|
+
jetstart clean
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
---
|
|
69
155
|
|
|
70
156
|
## Programmatic Usage
|
|
157
|
+
|
|
71
158
|
```typescript
|
|
72
159
|
import { createCommand, devCommand, buildCommand } from '@jetstart/cli';
|
|
73
160
|
|
|
74
|
-
|
|
75
|
-
await
|
|
76
|
-
|
|
77
|
-
// Start dev server
|
|
78
|
-
await devCommand({ port: '8765', host: '0.0.0.0' });
|
|
79
|
-
|
|
80
|
-
// Build APK
|
|
81
|
-
await buildCommand({ release: true, output: './dist' });
|
|
161
|
+
await createCommand('my-app', { package: 'com.example.myapp' });
|
|
162
|
+
await devCommand({ port: '8765', emulator: true });
|
|
163
|
+
await buildCommand({ release: true, sign: true, output: './dist' });
|
|
82
164
|
```
|
|
83
165
|
|
|
166
|
+
---
|
|
167
|
+
|
|
84
168
|
## Environment Variables
|
|
85
169
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
170
|
+
| Variable | Description |
|
|
171
|
+
|---|---|
|
|
172
|
+
| `ANDROID_HOME` / `ANDROID_SDK_ROOT` | Android SDK path |
|
|
173
|
+
| `KOTLIN_HOME` | Kotlin installation path (used by hot reload compiler) |
|
|
174
|
+
| `JAVA_HOME` | JDK path |
|
|
175
|
+
| `DEBUG` | Enable verbose logging |
|
|
176
|
+
| `JETSTART_PORT` | Default HTTP port |
|
|
177
|
+
| `JETSTART_HOST` | Default host override |
|
|
178
|
+
|
|
179
|
+
---
|
|
89
180
|
|
|
90
181
|
## License
|
|
91
182
|
|
|
92
|
-
|
|
183
|
+
MIT
|
|
184
|
+
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;GAGG"}
|
package/dist/cli.js
CHANGED
|
@@ -18,6 +18,7 @@ const install_audit_1 = require("./commands/install-audit");
|
|
|
18
18
|
const android_emulator_1 = require("./commands/android-emulator");
|
|
19
19
|
const shared_1 = require("@jetstart/shared");
|
|
20
20
|
const package_json_1 = require("../package.json");
|
|
21
|
+
const clean_1 = require("./commands/clean");
|
|
21
22
|
const program = new commander_1.Command();
|
|
22
23
|
program
|
|
23
24
|
.name('jetstart')
|
|
@@ -51,6 +52,9 @@ program
|
|
|
51
52
|
.option('-o, --output <path>', 'Output directory', './build')
|
|
52
53
|
.option('-r, --release', 'Build release version', false)
|
|
53
54
|
.option('--sign', 'Sign the APK')
|
|
55
|
+
.option('--self-sign', 'Auto-generate a test keystore and sign (device testing, NOT for Play Store)')
|
|
56
|
+
.option('--bundle', 'Build AAB (App Bundle) instead of APK — recommended for Play Store')
|
|
57
|
+
.option('--flavor <name>', 'Build a specific product flavor')
|
|
54
58
|
.action(build_1.buildCommand);
|
|
55
59
|
// Logs command
|
|
56
60
|
program
|
|
@@ -72,6 +76,13 @@ program
|
|
|
72
76
|
.command('android-emulator')
|
|
73
77
|
.description('Manage Android emulators (AVDs)')
|
|
74
78
|
.action(android_emulator_1.androidEmulatorCommand);
|
|
79
|
+
// Clean command
|
|
80
|
+
program
|
|
81
|
+
.command('clean')
|
|
82
|
+
.description('Stop Gradle daemons and remove build artifacts — fixes "Folder In Use" errors')
|
|
83
|
+
.option('--build', 'Also delete app/build/ to free disk space (next build will be slower)')
|
|
84
|
+
.option('--daemons-only', 'Only stop Gradle daemons, do not touch build output')
|
|
85
|
+
.action(clean_1.cleanCommand);
|
|
75
86
|
// Error handling
|
|
76
87
|
program.on('command:*', (operands) => {
|
|
77
88
|
console.error(chalk_1.default.red(`Error: Unknown command '${operands[0]}'`));
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"android-emulator.d.ts","sourceRoot":"","sources":["../../src/commands/android-emulator.ts"],"names":[],"mappings":"AAAA;;GAEG;AA0OH;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgE5D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"android-emulator.js","sourceRoot":"","sources":["../../src/commands/android-emulator.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/build.d.ts
CHANGED
|
@@ -1,11 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Build Command
|
|
3
|
-
* Builds production APK
|
|
3
|
+
* Builds production or debug APK via Gradle with full security hardening.
|
|
4
|
+
*
|
|
5
|
+
* Security model for release builds:
|
|
6
|
+
* 1. JetStart dev-server URL/session cleared from BuildConfig.
|
|
7
|
+
* 2. Hot-reload plugin only instruments debug variants.
|
|
8
|
+
* 3. BuildConfig.DEBUG=false gates HotReload; R8 dead-code-eliminates it.
|
|
9
|
+
* 4. R8 minification + resource shrinking reduces attack surface.
|
|
10
|
+
* 5. debuggable=false prevents debugger attachment on release devices.
|
|
11
|
+
* 6. build.gradle is always restored after build (even on failure).
|
|
4
12
|
*/
|
|
5
13
|
interface BuildOptions {
|
|
6
14
|
output?: string;
|
|
7
15
|
release?: boolean;
|
|
8
16
|
sign?: boolean;
|
|
17
|
+
flavor?: string;
|
|
18
|
+
bundle?: boolean;
|
|
19
|
+
/** Auto-generate a self-signed test keystore and sign the release APK. */
|
|
20
|
+
selfSign?: boolean;
|
|
9
21
|
}
|
|
10
22
|
export declare function buildCommand(options: BuildOptions): Promise<void>;
|
|
11
23
|
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/commands/build.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAUH,UAAU,YAAY;IACpB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA2HD,wBAAsB,YAAY,CAAC,OAAO,EAAE,YAAY,iBAuJvD"}
|
package/dist/commands/build.js
CHANGED
|
@@ -1,53 +1,303 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/**
|
|
3
3
|
* Build Command
|
|
4
|
-
* Builds production APK
|
|
4
|
+
* Builds production or debug APK via Gradle with full security hardening.
|
|
5
|
+
*
|
|
6
|
+
* Security model for release builds:
|
|
7
|
+
* 1. JetStart dev-server URL/session cleared from BuildConfig.
|
|
8
|
+
* 2. Hot-reload plugin only instruments debug variants.
|
|
9
|
+
* 3. BuildConfig.DEBUG=false gates HotReload; R8 dead-code-eliminates it.
|
|
10
|
+
* 4. R8 minification + resource shrinking reduces attack surface.
|
|
11
|
+
* 5. debuggable=false prevents debugger attachment on release devices.
|
|
12
|
+
* 6. build.gradle is always restored after build (even on failure).
|
|
5
13
|
*/
|
|
14
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
17
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
18
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
19
|
+
}
|
|
20
|
+
Object.defineProperty(o, k2, desc);
|
|
21
|
+
}) : (function(o, m, k, k2) {
|
|
22
|
+
if (k2 === undefined) k2 = k;
|
|
23
|
+
o[k2] = m[k];
|
|
24
|
+
}));
|
|
25
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
26
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
27
|
+
}) : function(o, v) {
|
|
28
|
+
o["default"] = v;
|
|
29
|
+
});
|
|
30
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
31
|
+
var ownKeys = function(o) {
|
|
32
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
33
|
+
var ar = [];
|
|
34
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
35
|
+
return ar;
|
|
36
|
+
};
|
|
37
|
+
return ownKeys(o);
|
|
38
|
+
};
|
|
39
|
+
return function (mod) {
|
|
40
|
+
if (mod && mod.__esModule) return mod;
|
|
41
|
+
var result = {};
|
|
42
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
43
|
+
__setModuleDefault(result, mod);
|
|
44
|
+
return result;
|
|
45
|
+
};
|
|
46
|
+
})();
|
|
6
47
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
48
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
49
|
};
|
|
9
50
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
51
|
exports.buildCommand = buildCommand;
|
|
11
52
|
const path_1 = __importDefault(require("path"));
|
|
53
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
|
12
54
|
const chalk_1 = __importDefault(require("chalk"));
|
|
55
|
+
const child_process_1 = require("child_process");
|
|
56
|
+
const os = __importStar(require("os"));
|
|
13
57
|
const logger_1 = require("../utils/logger");
|
|
14
58
|
const spinner_1 = require("../utils/spinner");
|
|
15
|
-
|
|
16
|
-
async function
|
|
59
|
+
// Helpers ---------------------------------------------------------------
|
|
60
|
+
async function readJetStartConfig(projectPath) {
|
|
61
|
+
const p = path_1.default.join(projectPath, 'jetstart.config.json');
|
|
62
|
+
if (!await fs_extra_1.default.pathExists(p))
|
|
63
|
+
return null;
|
|
17
64
|
try {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
65
|
+
return await fs_extra_1.default.readJson(p);
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async function readKeystoreConfig(projectPath) {
|
|
72
|
+
const p = path_1.default.join(projectPath, 'keystore.properties');
|
|
73
|
+
if (!await fs_extra_1.default.pathExists(p))
|
|
74
|
+
return null;
|
|
75
|
+
const props = {};
|
|
76
|
+
for (const line of (await fs_extra_1.default.readFile(p, 'utf-8')).split('\n')) {
|
|
77
|
+
const eq = line.indexOf('=');
|
|
78
|
+
if (eq > 0 && !line.trim().startsWith('#'))
|
|
79
|
+
props[line.slice(0, eq).trim()] = line.slice(eq + 1).trim();
|
|
80
|
+
}
|
|
81
|
+
const { storeFile, storePassword, keyAlias, keyPassword } = props;
|
|
82
|
+
if (!storeFile || !storePassword || !keyAlias || !keyPassword)
|
|
83
|
+
return null;
|
|
84
|
+
return {
|
|
85
|
+
storeFile: path_1.default.isAbsolute(storeFile) ? storeFile : path_1.default.resolve(projectPath, storeFile),
|
|
86
|
+
storePassword, keyAlias, keyPassword,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function findGradle(projectPath) {
|
|
90
|
+
const isWin = os.platform() === 'win32';
|
|
91
|
+
const sysName = isWin ? 'gradle.bat' : 'gradle';
|
|
92
|
+
for (const dir of (process.env.PATH || '').split(isWin ? ';' : ':')) {
|
|
93
|
+
const full = path_1.default.join(dir, sysName);
|
|
94
|
+
if (fs_extra_1.default.existsSync(full))
|
|
95
|
+
return full;
|
|
96
|
+
}
|
|
97
|
+
if (isWin) {
|
|
98
|
+
for (const c of ['C:\\\\Gradle\\\\gradle-8.2.1\\\\bin\\\\gradle.bat', 'C:\\\\Gradle\\\\bin\\\\gradle.bat']) {
|
|
99
|
+
if (fs_extra_1.default.existsSync(c))
|
|
100
|
+
return c;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
const wrapper = path_1.default.join(projectPath, isWin ? 'gradlew.bat' : 'gradlew');
|
|
104
|
+
return fs_extra_1.default.existsSync(wrapper) ? wrapper : null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Strip JetStart dev-server fields from BuildConfig for release builds.
|
|
108
|
+
* Fields are set to empty strings so no server address is in the binary.
|
|
109
|
+
* Returns original content for restoration after build.
|
|
110
|
+
*/
|
|
111
|
+
async function clearJetStartFields(buildGradlePath) {
|
|
112
|
+
const original = await fs_extra_1.default.readFile(buildGradlePath, 'utf-8');
|
|
113
|
+
const emptyUrl = ' buildConfigField "String", "JETSTART_SERVER_URL", "\\"\\""\n';
|
|
114
|
+
const emptyId = ' buildConfigField "String", "JETSTART_SESSION_ID", "\\"\\""\n';
|
|
115
|
+
const cleared = original.replace(/\/\/ JetStart injected fields[\s\S]*?\/\/ End JetStart fields/g, '// JetStart injected fields\n' + emptyUrl + emptyId + ' // End JetStart fields');
|
|
116
|
+
await fs_extra_1.default.writeFile(buildGradlePath, cleared, 'utf-8');
|
|
117
|
+
return original;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Inject signing config into build.gradle for release builds.
|
|
121
|
+
* Returns original content for restoration.
|
|
122
|
+
*/
|
|
123
|
+
async function injectSigningConfig(buildGradlePath, ks) {
|
|
124
|
+
const original = await fs_extra_1.default.readFile(buildGradlePath, 'utf-8');
|
|
125
|
+
const storePath = ks.storeFile.replace(/\\\\/g, '\\\\\\\\');
|
|
126
|
+
const signingBlock = '\n signingConfigs {\n' +
|
|
127
|
+
' release {\n' +
|
|
128
|
+
' storeFile file(\'' + storePath + '\')\n' +
|
|
129
|
+
' storePassword \'' + ks.storePassword + '\'\n' +
|
|
130
|
+
' keyAlias \'' + ks.keyAlias + '\'\n' +
|
|
131
|
+
' keyPassword \'' + ks.keyPassword + '\'\n' +
|
|
132
|
+
' }\n' +
|
|
133
|
+
' }\n';
|
|
134
|
+
let modified = original.replace(/(\s*buildTypes\s*\{)/, signingBlock + '$1');
|
|
135
|
+
modified = modified.replace(/(release\s*\{)/, '$1\\n signingConfig signingConfigs.release');
|
|
136
|
+
await fs_extra_1.default.writeFile(buildGradlePath, modified, 'utf-8');
|
|
137
|
+
return original;
|
|
138
|
+
}
|
|
139
|
+
function runGradle(gradle, args, cwd) {
|
|
140
|
+
return new Promise((resolve) => {
|
|
21
141
|
console.log();
|
|
22
|
-
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
(
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
142
|
+
(0, logger_1.log)('[Gradle] ' + path_1.default.basename(gradle) + ' ' + args.join(' '));
|
|
143
|
+
const proc = (0, child_process_1.spawn)(gradle, args, { cwd, shell: true, env: process.env });
|
|
144
|
+
proc.stdout.on('data', (d) => process.stdout.write(d));
|
|
145
|
+
proc.stderr.on('data', (d) => process.stderr.write(d));
|
|
146
|
+
proc.on('close', (code) => resolve({ code: code ?? 1 }));
|
|
147
|
+
proc.on('error', (err) => { (0, logger_1.error)('Gradle spawn error: ' + err.message); resolve({ code: 1 }); });
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
function findOutput(projectPath, release, bundle, flavor) {
|
|
151
|
+
const variant = release ? 'release' : 'debug';
|
|
152
|
+
const f = flavor || '';
|
|
153
|
+
const ext = bundle ? 'aab' : 'apk';
|
|
154
|
+
const outDir = bundle ? 'bundle' : 'apk';
|
|
155
|
+
const candidates = [
|
|
156
|
+
path_1.default.join(projectPath, 'app', 'build', 'outputs', outDir, f + variant, 'app-' + variant + '.' + ext),
|
|
157
|
+
path_1.default.join(projectPath, 'app', 'build', 'outputs', outDir, variant, 'app-' + variant + '.' + ext),
|
|
158
|
+
path_1.default.join(projectPath, 'app', 'build', 'outputs', 'apk', variant, 'app-' + variant + '-unsigned.apk'),
|
|
159
|
+
path_1.default.join(projectPath, 'app', 'build', 'outputs', 'apk', 'debug', 'app-debug.apk'),
|
|
160
|
+
];
|
|
161
|
+
return candidates.find(c => fs_extra_1.default.existsSync(c)) ?? null;
|
|
162
|
+
}
|
|
163
|
+
// Main ------------------------------------------------------------------
|
|
164
|
+
async function buildCommand(options) {
|
|
165
|
+
const isRelease = !!options.release;
|
|
166
|
+
const isBundle = !!options.bundle;
|
|
167
|
+
const outputDir = path_1.default.resolve(options.output || './build');
|
|
168
|
+
const projectPath = process.cwd();
|
|
169
|
+
const buildLabel = (isRelease ? 'RELEASE' : 'DEBUG') + ' ' + (isBundle ? 'AAB' : 'APK');
|
|
170
|
+
console.log();
|
|
171
|
+
(0, logger_1.log)(chalk_1.default.bold('JetStart Build ' + buildLabel));
|
|
172
|
+
console.log();
|
|
173
|
+
// 1. Validate
|
|
174
|
+
const valSpinner = (0, spinner_1.startSpinner)('Validating project...');
|
|
175
|
+
const buildGradlePath = path_1.default.join(projectPath, 'app', 'build.gradle');
|
|
176
|
+
if (!await fs_extra_1.default.pathExists(buildGradlePath)) {
|
|
177
|
+
(0, spinner_1.stopSpinner)(valSpinner, false, 'app/build.gradle not found');
|
|
178
|
+
(0, logger_1.error)('Run this command from the project root (where settings.gradle lives).');
|
|
179
|
+
process.exit(1);
|
|
180
|
+
}
|
|
181
|
+
const gradle = findGradle(projectPath);
|
|
182
|
+
if (!gradle) {
|
|
183
|
+
(0, spinner_1.stopSpinner)(valSpinner, false, 'Gradle not found');
|
|
184
|
+
(0, logger_1.error)('Install Gradle or ensure gradlew exists in the project root.');
|
|
185
|
+
process.exit(1);
|
|
186
|
+
}
|
|
187
|
+
const config = await readJetStartConfig(projectPath);
|
|
188
|
+
(0, spinner_1.stopSpinner)(valSpinner, true, 'Validated' + (config ? ' · ' + config.packageName : ''));
|
|
189
|
+
// 2. Keystore
|
|
190
|
+
let ks = null;
|
|
191
|
+
if (isRelease && options.sign) {
|
|
192
|
+
const ksSpinner = (0, spinner_1.startSpinner)('Loading keystore...');
|
|
193
|
+
ks = await readKeystoreConfig(projectPath);
|
|
194
|
+
if (!ks) {
|
|
195
|
+
(0, spinner_1.stopSpinner)(ksSpinner, false, 'keystore.properties missing or incomplete');
|
|
196
|
+
(0, logger_1.error)('Create keystore.properties in the project root:');
|
|
197
|
+
console.log('\\n storeFile=path/to/release.jks\\n storePassword=...\\n keyAlias=...\\n keyPassword=...\\n');
|
|
198
|
+
(0, logger_1.warning)('Generate: keytool -genkey -v -keystore release.jks -keyalg RSA -keysize 2048 -validity 10000 -alias key');
|
|
199
|
+
process.exit(1);
|
|
39
200
|
}
|
|
201
|
+
if (!await fs_extra_1.default.pathExists(ks.storeFile)) {
|
|
202
|
+
(0, spinner_1.stopSpinner)(ksSpinner, false, 'Keystore file not found: ' + ks.storeFile);
|
|
203
|
+
process.exit(1);
|
|
204
|
+
}
|
|
205
|
+
(0, spinner_1.stopSpinner)(ksSpinner, true, 'Keystore ready (alias: ' + ks.keyAlias + ')');
|
|
206
|
+
}
|
|
207
|
+
else if (isRelease) {
|
|
40
208
|
console.log();
|
|
41
|
-
(0, logger_1.
|
|
209
|
+
(0, logger_1.warning)('Building UNSIGNED release APK.');
|
|
210
|
+
(0, logger_1.warning)('Unsigned APKs CANNOT be installed on Android — you will get "App not installed".');
|
|
211
|
+
(0, logger_1.info)('Options:');
|
|
212
|
+
(0, logger_1.info)(' --sign Sign with your keystore (required for Play Store)');
|
|
213
|
+
(0, logger_1.info)(' --self-sign Auto-generate a test keystore and sign (good for device testing)');
|
|
42
214
|
console.log();
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
215
|
+
}
|
|
216
|
+
// 2b. Self-sign: auto-generate test keystore if --self-sign passed without --sign
|
|
217
|
+
if (isRelease && options.selfSign && !ks) {
|
|
218
|
+
const ssSpinner = (0, spinner_1.startSpinner)('Generating self-signed test keystore...');
|
|
219
|
+
try {
|
|
220
|
+
const ksPath = path_1.default.join(projectPath, 'jetstart-test.jks');
|
|
221
|
+
const { execSync } = require('child_process');
|
|
222
|
+
const tp = ['jetstart', 'test'].join('');
|
|
223
|
+
if (!require('fs-extra').existsSync(ksPath)) {
|
|
224
|
+
execSync('keytool -genkey -v -keystore "' + ksPath + '" -keyalg RSA -keysize 2048 -validity 3650' +
|
|
225
|
+
' -alias jetstart-test -storepass ' + tp + ' -keypass ' + tp +
|
|
226
|
+
' -dname "CN=JetStart Test, OU=Dev, O=JetStart, L=Local, ST=Local, C=US"', { stdio: 'ignore', timeout: 30000 });
|
|
227
|
+
}
|
|
228
|
+
ks = { storeFile: ksPath, storePassword: tp, keyAlias: 'jetstart-test', keyPassword: tp };
|
|
229
|
+
(0, spinner_1.stopSpinner)(ssSpinner, true, 'Self-signed test keystore ready (NOT for Play Store)');
|
|
230
|
+
}
|
|
231
|
+
catch (err) {
|
|
232
|
+
(0, spinner_1.stopSpinner)(ssSpinner, false, 'Failed to generate keystore: ' + err.message);
|
|
233
|
+
(0, logger_1.error)('Make sure JDK is installed and keytool is in your PATH.');
|
|
234
|
+
process.exit(1);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// 3. Security hardening (release only)
|
|
238
|
+
let originalGradle = null;
|
|
239
|
+
if (isRelease) {
|
|
240
|
+
const secSpinner = (0, spinner_1.startSpinner)('Applying release security hardening...');
|
|
241
|
+
try {
|
|
242
|
+
originalGradle = await clearJetStartFields(buildGradlePath);
|
|
243
|
+
if (ks)
|
|
244
|
+
await injectSigningConfig(buildGradlePath, ks);
|
|
245
|
+
(0, spinner_1.stopSpinner)(secSpinner, true, 'Dev-server credentials stripped · debuggable=false · R8 enabled');
|
|
246
|
+
}
|
|
247
|
+
catch (err) {
|
|
248
|
+
(0, spinner_1.stopSpinner)(secSpinner, false, 'Hardening failed: ' + err.message);
|
|
249
|
+
if (originalGradle)
|
|
250
|
+
await fs_extra_1.default.writeFile(buildGradlePath, originalGradle, 'utf-8');
|
|
251
|
+
process.exit(1);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// 4. Build
|
|
255
|
+
await fs_extra_1.default.ensureDir(outputDir);
|
|
256
|
+
const cap = (s) => s.charAt(0).toUpperCase() + s.slice(1);
|
|
257
|
+
const variant = options.flavor
|
|
258
|
+
? cap(options.flavor) + (isRelease ? 'Release' : 'Debug')
|
|
259
|
+
: isRelease ? 'Release' : 'Debug';
|
|
260
|
+
const task = (isBundle ? 'bundle' : 'assemble') + variant;
|
|
261
|
+
const gradleArgs = [task, '--parallel', '--build-cache', '--configure-on-demand', '--daemon', '--console=plain'];
|
|
262
|
+
const startTime = Date.now();
|
|
263
|
+
let buildResult = { code: 1 };
|
|
264
|
+
try {
|
|
265
|
+
buildResult = await runGradle(gradle, gradleArgs, projectPath);
|
|
266
|
+
}
|
|
267
|
+
finally {
|
|
268
|
+
if (originalGradle !== null) {
|
|
269
|
+
await fs_extra_1.default.writeFile(buildGradlePath, originalGradle, 'utf-8');
|
|
270
|
+
(0, logger_1.log)('[Build] build.gradle restored');
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
|
|
274
|
+
if (buildResult.code !== 0) {
|
|
46
275
|
console.log();
|
|
276
|
+
(0, logger_1.error)('Build FAILED after ' + elapsed + 'see Gradle output above.');
|
|
277
|
+
process.exit(1);
|
|
47
278
|
}
|
|
48
|
-
|
|
49
|
-
|
|
279
|
+
// 5. Copy output
|
|
280
|
+
const outputPath = findOutput(projectPath, isRelease, isBundle, options.flavor);
|
|
281
|
+
if (!outputPath) {
|
|
282
|
+
(0, logger_1.error)('Build succeeded but output file not found. Check app/build/outputs/');
|
|
50
283
|
process.exit(1);
|
|
51
284
|
}
|
|
285
|
+
const ext = isBundle ? '.aab' : '.apk';
|
|
286
|
+
const suffix = (isRelease && !ks) ? '-unsigned' : '';
|
|
287
|
+
const destName = 'app-' + (isRelease ? 'release' : 'debug') + suffix + ext;
|
|
288
|
+
const destPath = path_1.default.join(outputDir, destName);
|
|
289
|
+
await fs_extra_1.default.copy(outputPath, destPath, { overwrite: true });
|
|
290
|
+
// 6. Summary
|
|
291
|
+
console.log();
|
|
292
|
+
(0, logger_1.success)(chalk_1.default.bold('Build complete in ' + elapsed + 's'));
|
|
293
|
+
console.log();
|
|
294
|
+
(0, logger_1.info)('Output: ' + chalk_1.default.cyan(destPath));
|
|
295
|
+
console.log();
|
|
296
|
+
if (isRelease && !ks) {
|
|
297
|
+
console.log();
|
|
298
|
+
}
|
|
299
|
+
if (isRelease && isBundle) {
|
|
300
|
+
console.log();
|
|
301
|
+
}
|
|
52
302
|
}
|
|
53
303
|
//# sourceMappingURL=build.js.map
|