@iyexin/mio-android-tools 0.1.2 → 0.1.4

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.
@@ -1,3 +1,4 @@
1
+ export type ToolSource = "env-bundle" | "android-sdk";
1
2
  export interface AndroidTools {
2
3
  /** Java executable. Absolute path when known, otherwise "java" from PATH. */
3
4
  java: string;
@@ -8,7 +9,7 @@ export interface AndroidTools {
8
9
  /** keytool executable, when available. */
9
10
  keytool?: string;
10
11
  /** Where the tools came from. */
11
- source: "env-bundle" | "android-sdk";
12
+ source: ToolSource;
12
13
  /** build-tools version, when source is android-sdk. */
13
14
  buildToolsVersion?: string;
14
15
  /** Android SDK root, when source is android-sdk. */
@@ -16,18 +17,43 @@ export interface AndroidTools {
16
17
  /** JRE home, when the tools bundle contains one. */
17
18
  jreHome?: string;
18
19
  }
20
+ /** What a machine currently has; every field is optional. */
21
+ export interface AndroidToolStatus {
22
+ java?: string;
23
+ jreHome?: string;
24
+ keytool?: string;
25
+ apksignerJar?: string;
26
+ zipalign?: string;
27
+ sdkRoot?: string;
28
+ buildToolsVersion?: string;
29
+ toolsSource?: ToolSource;
30
+ }
31
+ export declare function statusComplete(status: AndroidToolStatus): status is Required<Pick<AndroidToolStatus, "java" | "apksignerJar" | "zipalign">> & AndroidToolStatus;
32
+ export declare function toolsFromStatus(status: AndroidToolStatus): AndroidTools;
33
+ export declare function describeMissing(status: AndroidToolStatus): string;
19
34
  export interface DiscoverOptions {
20
35
  /** Override for tests; defaults to process.env. */
21
36
  env?: NodeJS.ProcessEnv;
22
37
  /** Override for tests; defaults to process.platform. */
23
38
  platform?: NodeJS.Platform;
24
39
  }
40
+ /**
41
+ * Inspect what the machine has without throwing.
42
+ *
43
+ * Tools come from `MIO_ANDROID_TOOLS_DIR` first (a Mio bundle) and then the
44
+ * Android SDK build-tools; Java from the bundle's `jre/`, `MIO_JAVA_HOME`,
45
+ * `JAVA_HOME`, or `PATH`. A partial result is normal: a machine may have Java
46
+ * but no build-tools, or the other way round.
47
+ */
48
+ export declare function inspectAndroidTools(options?: DiscoverOptions): Promise<AndroidToolStatus>;
25
49
  /**
26
50
  * Find a usable Android signing toolchain.
27
51
  *
28
52
  * Priority:
29
53
  * 1. MIO_ANDROID_TOOLS_DIR (a downloaded/bundled toolchain)
30
54
  * 2. ANDROID_HOME / ANDROID_SDK_ROOT / default SDK locations
55
+ *
56
+ * Throws with a message that says exactly what is missing.
31
57
  */
32
58
  export declare function discoverAndroidTools(options?: DiscoverOptions): Promise<AndroidTools>;
33
59
  export declare function describeAndroidTools(tools: AndroidTools): string;
package/dist/discover.js CHANGED
@@ -4,6 +4,36 @@ import { homedir } from "node:os";
4
4
  import { dirname, join } from "node:path";
5
5
  import { MioToolError } from "./errors.js";
6
6
  import { run } from "./exec.js";
7
+ export function statusComplete(status) {
8
+ return Boolean(status.java && status.apksignerJar && status.zipalign);
9
+ }
10
+ export function toolsFromStatus(status) {
11
+ if (!statusComplete(status)) {
12
+ throw new MioToolError("ANDROID_TOOLS_NOT_FOUND", "Android build tools are incomplete", { details: describeMissing(status) });
13
+ }
14
+ return {
15
+ java: status.java,
16
+ apksignerJar: status.apksignerJar,
17
+ zipalign: status.zipalign,
18
+ keytool: status.keytool,
19
+ source: status.toolsSource ?? "android-sdk",
20
+ buildToolsVersion: status.buildToolsVersion,
21
+ sdkRoot: status.sdkRoot,
22
+ jreHome: status.jreHome,
23
+ };
24
+ }
25
+ export function describeMissing(status) {
26
+ const missing = [];
27
+ if (!status.java)
28
+ missing.push("java");
29
+ if (!status.apksignerJar)
30
+ missing.push("apksigner.jar");
31
+ if (!status.zipalign)
32
+ missing.push("zipalign");
33
+ return missing.length === 0
34
+ ? "nothing missing"
35
+ : `missing: ${missing.join(", ")}`;
36
+ }
7
37
  const isWindows = (platform) => platform === "win32";
8
38
  const javaName = (platform) => isWindows(platform) ? "java.exe" : "java";
9
39
  const keytoolName = (platform) => isWindows(platform) ? "keytool.exe" : "keytool";
@@ -71,26 +101,20 @@ async function findJavaFromPath(platform) {
71
101
  }
72
102
  return undefined;
73
103
  }
74
- async function resolveJava(env, platform, preferredHome) {
104
+ async function tryResolveJava(env, platform, preferredHome) {
75
105
  const fromBundle = await findJavaInHome(preferredHome, platform);
76
- if (fromBundle) {
106
+ if (fromBundle)
77
107
  return { java: fromBundle, jreHome: preferredHome };
78
- }
79
108
  const fromMioHome = await findJavaInHome(env.MIO_JAVA_HOME, platform);
80
- if (fromMioHome) {
109
+ if (fromMioHome)
81
110
  return { java: fromMioHome, jreHome: env.MIO_JAVA_HOME };
82
- }
83
111
  const fromJavaHome = await findJavaInHome(env.JAVA_HOME, platform);
84
- if (fromJavaHome) {
112
+ if (fromJavaHome)
85
113
  return { java: fromJavaHome, jreHome: env.JAVA_HOME };
86
- }
87
114
  const fromPath = await findJavaFromPath(platform);
88
- if (fromPath) {
115
+ if (fromPath)
89
116
  return { java: fromPath };
90
- }
91
- throw new MioToolError("JAVA_NOT_FOUND", "Java was not found. Install a JDK/JRE 17+ or place a JRE at <tools>/jre.", {
92
- details: "Set MIO_JAVA_HOME/JAVA_HOME, put java on PATH, or point MIO_ANDROID_TOOLS_DIR at a tools bundle containing jre/.",
93
- });
117
+ return undefined;
94
118
  }
95
119
  async function resolveKeytool(java, platform) {
96
120
  if (java === "java") {
@@ -107,37 +131,6 @@ async function resolveKeytool(java, platform) {
107
131
  const candidate = join(dirname(java), keytoolName(platform));
108
132
  return (await exists(candidate)) ? candidate : undefined;
109
133
  }
110
- async function fromToolsDir(dir, env, platform) {
111
- const apksignerCandidates = [
112
- join(dir, "apksigner.jar"),
113
- join(dir, "lib", "apksigner.jar"),
114
- ];
115
- const zipalignCandidates = [
116
- join(dir, zipalignName(platform)),
117
- join(dir, "bin", zipalignName(platform)),
118
- ];
119
- const apksignerJar = await firstExisting(apksignerCandidates);
120
- const zipalign = await firstExisting(zipalignCandidates);
121
- if (!apksignerJar || !zipalign) {
122
- throw new MioToolError("INVALID_TOOLS_DIR", `MIO_ANDROID_TOOLS_DIR does not look like an Android tools bundle: ${dir}`, {
123
- details: "Expected apksigner.jar (or lib/apksigner.jar), zipalign, and optionally jre/.",
124
- });
125
- }
126
- const jreHomeCandidate = join(dir, "jre");
127
- const jreHome = (await exists(join(jreHomeCandidate, "bin", javaName(platform))))
128
- ? jreHomeCandidate
129
- : undefined;
130
- const { java, jreHome: resolvedJreHome } = await resolveJava(env, platform, jreHome);
131
- const keytool = await resolveKeytool(java, platform);
132
- return {
133
- java,
134
- apksignerJar,
135
- zipalign,
136
- keytool,
137
- source: "env-bundle",
138
- jreHome: resolvedJreHome,
139
- };
140
- }
141
134
  async function firstExisting(candidates) {
142
135
  for (const candidate of candidates) {
143
136
  if (await exists(candidate))
@@ -174,40 +167,65 @@ async function findBuildTools(sdkRoot, platform) {
174
167
  }
175
168
  return undefined;
176
169
  }
177
- async function fromAndroidSdk(env, platform) {
178
- const roots = candidateSdkRoots(env, platform);
179
- for (const sdkRoot of roots) {
180
- if (!(await exists(sdkRoot)))
181
- continue;
182
- const match = await findBuildTools(sdkRoot, platform);
183
- if (!match)
184
- continue;
185
- const apksignerJar = await firstExisting([
186
- join(match.dir, "lib", "apksigner.jar"),
187
- join(match.dir, "apksigner.jar"),
170
+ /**
171
+ * Inspect what the machine has without throwing.
172
+ *
173
+ * Tools come from `MIO_ANDROID_TOOLS_DIR` first (a Mio bundle) and then the
174
+ * Android SDK build-tools; Java from the bundle's `jre/`, `MIO_JAVA_HOME`,
175
+ * `JAVA_HOME`, or `PATH`. A partial result is normal: a machine may have Java
176
+ * but no build-tools, or the other way round.
177
+ */
178
+ export async function inspectAndroidTools(options = {}) {
179
+ const env = options.env ?? process.env;
180
+ const platform = options.platform ?? process.platform;
181
+ const status = {};
182
+ const toolsDir = env.MIO_ANDROID_TOOLS_DIR;
183
+ if (toolsDir) {
184
+ status.apksignerJar = await firstExisting([
185
+ join(toolsDir, "apksigner.jar"),
186
+ join(toolsDir, "lib", "apksigner.jar"),
188
187
  ]);
189
- const zipalign = await firstExisting([
190
- join(match.dir, zipalignName(platform)),
191
- join(match.dir, "bin", zipalignName(platform)),
188
+ status.zipalign = await firstExisting([
189
+ join(toolsDir, zipalignName(platform)),
190
+ join(toolsDir, "bin", zipalignName(platform)),
192
191
  ]);
193
- if (!apksignerJar || !zipalign)
194
- continue;
195
- const { java, jreHome } = await resolveJava(env, platform);
196
- const keytool = await resolveKeytool(java, platform);
197
- return {
198
- java,
199
- apksignerJar,
200
- zipalign,
201
- keytool,
202
- source: "android-sdk",
203
- buildToolsVersion: match.version,
204
- sdkRoot,
205
- jreHome,
206
- };
207
- }
208
- throw new MioToolError("ANDROID_TOOLS_NOT_FOUND", "Android build-tools (apksigner + zipalign) were not found.", {
209
- details: "Set ANDROID_HOME (or MIO_ANDROID_SDK), install Android build-tools 35+, or point MIO_ANDROID_TOOLS_DIR at a Mio tools bundle.",
210
- });
192
+ if (status.apksignerJar && status.zipalign)
193
+ status.toolsSource = "env-bundle";
194
+ const jreHome = join(toolsDir, "jre");
195
+ if (await exists(join(jreHome, "bin", javaName(platform)))) {
196
+ status.jreHome = jreHome;
197
+ }
198
+ }
199
+ if (!status.apksignerJar || !status.zipalign) {
200
+ for (const root of candidateSdkRoots(env, platform)) {
201
+ if (!(await exists(root)))
202
+ continue;
203
+ const match = await findBuildTools(root, platform);
204
+ if (!match)
205
+ continue;
206
+ status.apksignerJar = await firstExisting([
207
+ join(match.dir, "lib", "apksigner.jar"),
208
+ join(match.dir, "apksigner.jar"),
209
+ ]);
210
+ status.zipalign = await firstExisting([
211
+ join(match.dir, zipalignName(platform)),
212
+ join(match.dir, "bin", zipalignName(platform)),
213
+ ]);
214
+ if (status.apksignerJar && status.zipalign) {
215
+ status.toolsSource = "android-sdk";
216
+ status.sdkRoot = root;
217
+ status.buildToolsVersion = match.version;
218
+ break;
219
+ }
220
+ }
221
+ }
222
+ const java = await tryResolveJava(env, platform, status.jreHome);
223
+ if (java) {
224
+ status.java = java.java;
225
+ status.jreHome = java.jreHome ?? status.jreHome;
226
+ status.keytool = await resolveKeytool(java.java, platform);
227
+ }
228
+ return status;
211
229
  }
212
230
  /**
213
231
  * Find a usable Android signing toolchain.
@@ -215,14 +233,22 @@ async function fromAndroidSdk(env, platform) {
215
233
  * Priority:
216
234
  * 1. MIO_ANDROID_TOOLS_DIR (a downloaded/bundled toolchain)
217
235
  * 2. ANDROID_HOME / ANDROID_SDK_ROOT / default SDK locations
236
+ *
237
+ * Throws with a message that says exactly what is missing.
218
238
  */
219
239
  export async function discoverAndroidTools(options = {}) {
220
- const env = options.env ?? process.env;
221
- const platform = options.platform ?? process.platform;
222
- if (env.MIO_ANDROID_TOOLS_DIR) {
223
- return await fromToolsDir(env.MIO_ANDROID_TOOLS_DIR, env, platform);
240
+ const status = await inspectAndroidTools(options);
241
+ if (!status.java) {
242
+ throw new MioToolError("JAVA_NOT_FOUND", "Java was not found. Install a JDK/JRE 17+ or let Mio download one.", {
243
+ details: "Set MIO_JAVA_HOME/JAVA_HOME, put java on PATH, or set MIO_ANDROID_TOOLS_DIR to a tools bundle containing jre/.",
244
+ });
245
+ }
246
+ if (!status.apksignerJar || !status.zipalign) {
247
+ throw new MioToolError("ANDROID_TOOLS_NOT_FOUND", "Android build-tools (apksigner + zipalign) were not found.", {
248
+ details: "Set ANDROID_HOME (or MIO_ANDROID_SDK), install Android build-tools 35+, or point MIO_ANDROID_TOOLS_DIR at a Mio tools bundle.",
249
+ });
224
250
  }
225
- return await fromAndroidSdk(env, platform);
251
+ return toolsFromStatus(status);
226
252
  }
227
253
  export function describeAndroidTools(tools) {
228
254
  const source = tools.source === "android-sdk"
@@ -1 +1 @@
1
- {"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"discover.js","sourceRoot":"","sources":["../src/discover.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type AndroidTools } from "./discover.js";
2
+ import { type ToolBundleManifest, type ToolComponent } from "./tool-bundle.js";
3
+ export interface EnsureAndroidToolsOptions {
4
+ /** Manifest object, local path, or URL. Required when something is missing. */
5
+ manifest: ToolBundleManifest | string;
6
+ /** Defaults to ~/.mio/tools/android. */
7
+ cacheDir?: string;
8
+ proxy?: string;
9
+ /** Re-download every requested component even when cached. */
10
+ force?: boolean;
11
+ /** Set false to fail instead of downloading (offline builds, tests). */
12
+ allowDownload?: boolean;
13
+ log?: (message: string) => void;
14
+ }
15
+ export interface EnsureAndroidToolsResult {
16
+ tools: AndroidTools;
17
+ /** Components fetched in this call; empty when the machine had everything. */
18
+ installed: ToolComponent[];
19
+ downloaded: boolean;
20
+ }
21
+ /**
22
+ * Resolve a complete Android toolchain, downloading only what is missing.
23
+ *
24
+ * Existing Java or build-tools are reused: a machine with a JDK but no SDK only
25
+ * fetches `tools` (~1.5 MB), one with build-tools but no Java only fetches
26
+ * `jre` (~18 MB).
27
+ */
28
+ export declare function ensureAndroidTools(options: EnsureAndroidToolsOptions): Promise<EnsureAndroidToolsResult>;
package/dist/ensure.js ADDED
@@ -0,0 +1,45 @@
1
+ import { MioToolError } from "./errors.js";
2
+ import { describeMissing, inspectAndroidTools, statusComplete, toolsFromStatus, } from "./discover.js";
3
+ import { installToolBundle, } from "./tool-bundle.js";
4
+ /**
5
+ * Resolve a complete Android toolchain, downloading only what is missing.
6
+ *
7
+ * Existing Java or build-tools are reused: a machine with a JDK but no SDK only
8
+ * fetches `tools` (~1.5 MB), one with build-tools but no Java only fetches
9
+ * `jre` (~18 MB).
10
+ */
11
+ export async function ensureAndroidTools(options) {
12
+ const log = options.log ?? (() => { });
13
+ let status = await inspectAndroidTools();
14
+ if (statusComplete(status) && !options.force) {
15
+ return { tools: toolsFromStatus(status), installed: [], downloaded: false };
16
+ }
17
+ if (options.allowDownload === false) {
18
+ throw new MioToolError("ANDROID_TOOLS_NOT_FOUND", `Android build tools are incomplete (${describeMissing(status)})`, { details: "Downloading is disabled (MIO_NO_TOOL_DOWNLOAD); install them or allow downloads." });
19
+ }
20
+ const needed = [];
21
+ if (!status.apksignerJar || !status.zipalign)
22
+ needed.push("tools");
23
+ if (!status.java)
24
+ needed.push("jre");
25
+ // A forced refresh reinstalls everything, even when the machine looks ready.
26
+ if (needed.length === 0)
27
+ needed.push("tools", "jre");
28
+ log(`${describeMissing(status)}; fetching ${needed.join(" + ")}`);
29
+ const bundle = await installToolBundle({
30
+ manifest: options.manifest,
31
+ components: needed,
32
+ cacheDir: options.cacheDir,
33
+ proxy: options.proxy,
34
+ force: options.force,
35
+ log,
36
+ });
37
+ status = await inspectAndroidTools({
38
+ env: { ...process.env, MIO_ANDROID_TOOLS_DIR: bundle.dir },
39
+ });
40
+ if (!statusComplete(status)) {
41
+ throw new MioToolError("ANDROID_TOOLS_NOT_FOUND", `Android build tools are still incomplete after installing the bundle (${describeMissing(status)})`, { details: `bundle: ${bundle.dir}` });
42
+ }
43
+ return { tools: toolsFromStatus(status), installed: bundle.installed, downloaded: true };
44
+ }
45
+ //# sourceMappingURL=ensure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensure.js","sourceRoot":"","sources":["../src/ensure.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,cAAc,EACd,eAAe,GAEhB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,iBAAiB,GAGlB,MAAM,kBAAkB,CAAC;AAsB1B;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAkC;IAElC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACtC,IAAI,MAAM,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACzC,IAAI,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC7C,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAC9E,CAAC;IAED,IAAI,OAAO,CAAC,aAAa,KAAK,KAAK,EAAE,CAAC;QACpC,MAAM,IAAI,YAAY,CACpB,yBAAyB,EACzB,uCAAuC,eAAe,CAAC,MAAM,CAAC,GAAG,EACjE,EAAE,OAAO,EAAE,kFAAkF,EAAE,CAChG,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAoB,EAAE,CAAC;IACnC,IAAI,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,MAAM,CAAC,QAAQ;QAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM,CAAC,IAAI;QAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrC,6EAA6E;IAC7E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAErD,GAAG,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,cAAc,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAElE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;QACrC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU,EAAE,MAAM;QAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,GAAG;KACJ,CAAC,CAAC;IAEH,MAAM,GAAG,MAAM,mBAAmB,CAAC;QACjC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,qBAAqB,EAAE,MAAM,CAAC,GAAG,EAAE;KAC3D,CAAC,CAAC;IAEH,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,YAAY,CACpB,yBAAyB,EACzB,yEAAyE,eAAe,CAAC,MAAM,CAAC,GAAG,EACnG,EAAE,OAAO,EAAE,WAAW,MAAM,CAAC,GAAG,EAAE,EAAE,CACrC,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAC3F,CAAC"}
package/dist/errors.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type MioToolErrorCode = "JAVA_NOT_FOUND" | "ANDROID_TOOLS_NOT_FOUND" | "INVALID_TOOLS_DIR" | "MISSING_FILE" | "INVALID_ARGUMENT" | "SPAWN_FAILED" | "TIMEOUT" | "APKSIGNER_SIGN_FAILED" | "APKSIGNER_VERIFY_FAILED" | "ZIPALIGN_FAILED" | "KEYSTORE_NOT_FOUND" | "KEYTOOL_NOT_FOUND" | "KEYTOOL_FAILED" | "BUNDLE_DOWNLOAD_FAILED" | "BUNDLE_CHECKSUM_FAILED" | "BUNDLE_EXTRACT_FAILED";
1
+ export type MioToolErrorCode = "JAVA_NOT_FOUND" | "ANDROID_TOOLS_NOT_FOUND" | "INVALID_TOOLS_DIR" | "MISSING_FILE" | "INVALID_ARGUMENT" | "SPAWN_FAILED" | "TIMEOUT" | "APKSIGNER_SIGN_FAILED" | "APKSIGNER_VERIFY_FAILED" | "ZIPALIGN_FAILED" | "KEYSTORE_NOT_FOUND" | "KEYTOOL_NOT_FOUND" | "KEYTOOL_FAILED" | "KEYSTORE_EXISTS" | "BUNDLE_DOWNLOAD_FAILED" | "BUNDLE_CHECKSUM_FAILED" | "BUNDLE_EXTRACT_FAILED";
2
2
  export interface MioToolErrorOptions {
3
3
  cause?: unknown;
4
4
  stdout?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAyBA,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAmB;IACvB,MAAM,CAAU;IAChB,MAAM,CAAU;IAChB,OAAO,CAAU;IAE1B,YAAY,IAAsB,EAAE,OAAe,EAAE,UAA+B,EAAE;QACpF,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AA0BA,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAmB;IACvB,MAAM,CAAU;IAChB,MAAM,CAAU;IAChB,OAAO,CAAU;IAE1B,YAAY,IAAsB,EAAE,OAAe,EAAE,UAA+B,EAAE;QACpF,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;CACF"}
package/dist/index.d.ts CHANGED
@@ -1,13 +1,14 @@
1
1
  export { MioToolError } from "./errors.js";
2
2
  export type { MioToolErrorCode, MioToolErrorOptions } from "./errors.js";
3
- export { discoverAndroidTools, describeAndroidTools, type AndroidTools, type DiscoverOptions, } from "./discover.js";
3
+ export { discoverAndroidTools, describeAndroidTools, inspectAndroidTools, statusComplete, toolsFromStatus, describeMissing, type AndroidToolStatus, type AndroidTools, type DiscoverOptions, } from "./discover.js";
4
+ export { ensureAndroidTools, type EnsureAndroidToolsOptions, type EnsureAndroidToolsResult, } from "./ensure.js";
4
5
  export { alignApk, checkAlignment, type AlignOptions, type AlignmentCheck, type PageSize, } from "./zipalign.js";
5
6
  export { signApkWithApksigner, verifyApkWithApksigner, buildSignArgs, parseVerifyOutput, type SignApkWithApksignerOptions, type VerifyApkOptions, type VerifyResult, type SignerCertificate, } from "./apksigner.js";
6
- export { ensureDebugKeystore, type DebugKeystoreOptions } from "./keystore.js";
7
+ export { ensureDebugKeystore, generateKeystore, type DebugKeystoreOptions, type KeystoreOptions, } from "./keystore.js";
7
8
  export { parseAxml, patchManifestAxml, type AxmlAttribute, type AxmlDocument, type AxmlElement, type ManifestPatch, } from "./axml.js";
8
9
  export { injectApk, type InjectApkOptions, type InjectApkResult, } from "./apk.js";
9
10
  export { injectWindowsExe, type InjectWindowsExeOptions, type InjectWindowsExeResult, } from "./windows.js";
10
11
  export { signApk, verifyApk, type SignApkOptions, type SignResult, } from "./signing.js";
11
- export { installToolBundle, platformKeyOf, type InstallToolBundleOptions, type InstalledToolBundle, type ToolBundleManifest, type ToolBundlePlatform, } from "./tool-bundle.js";
12
+ export { installToolBundle, platformKeyOf, type InstallToolBundleOptions, type InstalledToolBundle, type ToolBundleComponent, type ToolBundleManifest, type ToolBundlePlatform, type ToolComponent, } from "./tool-bundle.js";
12
13
  export { run, type ExecOptions, type ExecResult } from "./exec.js";
13
14
  export { listZipEntries, extractZip, readZipEntry } from "./zip.js";
package/dist/index.js CHANGED
@@ -1,8 +1,9 @@
1
1
  export { MioToolError } from "./errors.js";
2
- export { discoverAndroidTools, describeAndroidTools, } from "./discover.js";
2
+ export { discoverAndroidTools, describeAndroidTools, inspectAndroidTools, statusComplete, toolsFromStatus, describeMissing, } from "./discover.js";
3
+ export { ensureAndroidTools, } from "./ensure.js";
3
4
  export { alignApk, checkAlignment, } from "./zipalign.js";
4
5
  export { signApkWithApksigner, verifyApkWithApksigner, buildSignArgs, parseVerifyOutput, } from "./apksigner.js";
5
- export { ensureDebugKeystore } from "./keystore.js";
6
+ export { ensureDebugKeystore, generateKeystore, } from "./keystore.js";
6
7
  export { parseAxml, patchManifestAxml, } from "./axml.js";
7
8
  export { injectApk, } from "./apk.js";
8
9
  export { injectWindowsExe, } from "./windows.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GAGrB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,QAAQ,EACR,cAAc,GAIf,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,aAAa,EACb,iBAAiB,GAKlB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,mBAAmB,EAA6B,MAAM,eAAe,CAAC;AAE/E,OAAO,EACL,SAAS,EACT,iBAAiB,GAKlB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,SAAS,GAGV,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,gBAAgB,GAGjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,OAAO,EACP,SAAS,GAGV,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,aAAa,GAKd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,GAAG,EAAqC,MAAM,WAAW,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,eAAe,GAIhB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,kBAAkB,GAGnB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,QAAQ,EACR,cAAc,GAIf,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,aAAa,EACb,iBAAiB,GAKlB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,mBAAmB,EACnB,gBAAgB,GAGjB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,SAAS,EACT,iBAAiB,GAKlB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,SAAS,GAGV,MAAM,UAAU,CAAC;AAElB,OAAO,EACL,gBAAgB,GAGjB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,OAAO,EACP,SAAS,GAGV,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,aAAa,GAOd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,GAAG,EAAqC,MAAM,WAAW,CAAC;AAEnE,OAAO,EAAE,cAAc,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
@@ -1,4 +1,49 @@
1
1
  import type { AndroidTools } from "./discover.js";
2
+ export interface KeystoreOptions {
3
+ /** Where to write the keystore. */
4
+ path: string;
5
+ /** Keystore alias. Defaults to "release". */
6
+ alias?: string;
7
+ /** Keystore password. */
8
+ password?: string;
9
+ /**
10
+ * Read the password from this environment variable instead of passing it on
11
+ * the keytool command line.
12
+ */
13
+ passwordEnv?: string;
14
+ /** Key password when it differs from the store password (PKCS12 ignores it). */
15
+ keyPassword?: string;
16
+ /** Defaults to "CN=Mio, O=Mio, C=CN". */
17
+ distinguishedName?: string;
18
+ /** Valid days. Defaults to 10000 (~27 years). */
19
+ validityDays?: number;
20
+ /** RSA key size. Defaults to 2048. */
21
+ keySize?: number;
22
+ /** Overwrite an existing file. */
23
+ force?: boolean;
24
+ }
25
+ export interface KeytoolArgs {
26
+ alias: string;
27
+ password: string;
28
+ /** When set, the password is read from this environment variable instead of argv. */
29
+ passwordEnv?: string;
30
+ keyPassword?: string;
31
+ distinguishedName?: string;
32
+ validityDays?: number;
33
+ keySize?: number;
34
+ }
35
+ /**
36
+ * Generate a fresh signing keystore with keytool.
37
+ *
38
+ * This is the same keytool that ships inside the Mio tool bundle, so a machine
39
+ * with no JDK can still create its own release key.
40
+ */
41
+ export declare function generateKeystore(tools: AndroidTools, options: KeystoreOptions): Promise<{
42
+ path: string;
43
+ alias: string;
44
+ storetype: "PKCS12";
45
+ created: boolean;
46
+ }>;
2
47
  export interface DebugKeystoreOptions {
3
48
  /** Where to create the keystore. */
4
49
  path: string;
@@ -12,8 +57,8 @@ export interface DebugKeystoreOptions {
12
57
  /**
13
58
  * Create a debug keystore if it does not exist yet.
14
59
  *
15
- * Never use this key for release artifacts. Release keys are supplied by the
16
- * developer and must not be generated or stored by Mio.
60
+ * Debug keys are fine for local installs; releases should use a key the
61
+ * developer owns (see `generateKeystore`).
17
62
  */
18
63
  export declare function ensureDebugKeystore(tools: AndroidTools, options: DebugKeystoreOptions): Promise<{
19
64
  path: string;
package/dist/keystore.js CHANGED
@@ -1,8 +1,32 @@
1
- import { access, mkdir } from "node:fs/promises";
1
+ import { access, mkdir, rm } from "node:fs/promises";
2
2
  import { constants } from "node:fs";
3
3
  import { dirname } from "node:path";
4
4
  import { MioToolError } from "./errors.js";
5
5
  import { run } from "./exec.js";
6
+ function keytoolArgs(options, path, storetype) {
7
+ const credentials = options.passwordEnv
8
+ ? ["-storepass:env", options.passwordEnv, "-keypass:env", options.passwordEnv]
9
+ : ["-storepass", options.password, "-keypass", options.keyPassword ?? options.password];
10
+ return [
11
+ "-genkeypair",
12
+ "-keystore",
13
+ path,
14
+ "-storetype",
15
+ storetype,
16
+ "-alias",
17
+ options.alias,
18
+ "-keyalg",
19
+ "RSA",
20
+ "-keysize",
21
+ String(options.keySize ?? 2048),
22
+ "-validity",
23
+ String(options.validityDays ?? 10000),
24
+ ...credentials,
25
+ "-dname",
26
+ options.distinguishedName ?? "CN=Mio, O=Mio, C=CN",
27
+ "-noprompt",
28
+ ];
29
+ }
6
30
  async function exists(path) {
7
31
  try {
8
32
  await access(path, constants.F_OK);
@@ -12,11 +36,55 @@ async function exists(path) {
12
36
  return false;
13
37
  }
14
38
  }
39
+ async function runKeytool(tools, args) {
40
+ if (!tools.keytool) {
41
+ throw new MioToolError("KEYTOOL_NOT_FOUND", "keytool is required to generate a keystore but was not found.", {
42
+ details: "Mio's tool bundle includes keytool; run an Android build once to download it, or use a JDK that ships keytool.",
43
+ });
44
+ }
45
+ const result = await run(tools.keytool, args, { timeoutMs: 120_000 });
46
+ if (result.code !== 0) {
47
+ throw new MioToolError("KEYTOOL_FAILED", "keytool failed to create the keystore", {
48
+ stdout: result.stdout,
49
+ stderr: result.stderr,
50
+ details: `exit code ${result.code}`,
51
+ });
52
+ }
53
+ }
54
+ /**
55
+ * Generate a fresh signing keystore with keytool.
56
+ *
57
+ * This is the same keytool that ships inside the Mio tool bundle, so a machine
58
+ * with no JDK can still create its own release key.
59
+ */
60
+ export async function generateKeystore(tools, options) {
61
+ const alias = options.alias ?? "release";
62
+ if (await exists(options.path)) {
63
+ if (!options.force) {
64
+ throw new MioToolError("KEYSTORE_EXISTS", `Keystore already exists: ${options.path}`, {
65
+ details: "Pass --force to overwrite it.",
66
+ });
67
+ }
68
+ await rm(options.path, { force: true });
69
+ }
70
+ await mkdir(dirname(options.path), { recursive: true });
71
+ const password = options.password ?? "changeit";
72
+ await runKeytool(tools, keytoolArgs({
73
+ alias,
74
+ password,
75
+ passwordEnv: options.passwordEnv,
76
+ keyPassword: options.keyPassword,
77
+ distinguishedName: options.distinguishedName,
78
+ validityDays: options.validityDays,
79
+ keySize: options.keySize,
80
+ }, options.path, "PKCS12"));
81
+ return { path: options.path, alias, storetype: "PKCS12", created: true };
82
+ }
15
83
  /**
16
84
  * Create a debug keystore if it does not exist yet.
17
85
  *
18
- * Never use this key for release artifacts. Release keys are supplied by the
19
- * developer and must not be generated or stored by Mio.
86
+ * Debug keys are fine for local installs; releases should use a key the
87
+ * developer owns (see `generateKeystore`).
20
88
  */
21
89
  export async function ensureDebugKeystore(tools, options) {
22
90
  const password = options.password ?? "android";
@@ -24,42 +92,13 @@ export async function ensureDebugKeystore(tools, options) {
24
92
  if (await exists(options.path)) {
25
93
  return { path: options.path, alias, password };
26
94
  }
27
- if (!tools.keytool) {
28
- throw new MioToolError("KEYTOOL_NOT_FOUND", "keytool is required to generate a debug keystore but was not found.", {
29
- details: "Use a JDK/JRE that includes keytool, or provide an existing debug keystore.",
30
- });
31
- }
32
95
  await mkdir(dirname(options.path), { recursive: true });
33
- const args = [
34
- "-genkeypair",
35
- "-keystore",
36
- options.path,
37
- "-storetype",
38
- "PKCS12",
39
- "-alias",
96
+ await runKeytool(tools, keytoolArgs({
40
97
  alias,
41
- "-keyalg",
42
- "RSA",
43
- "-keysize",
44
- "2048",
45
- "-validity",
46
- "10000",
47
- "-storepass",
48
98
  password,
49
- "-keypass",
50
- password,
51
- "-dname",
52
- options.distinguishedName ?? "CN=Mio Debug, O=Mio, C=CN",
53
- "-noprompt",
54
- ];
55
- const result = await run(tools.keytool, args, { timeoutMs: 120_000 });
56
- if (result.code !== 0) {
57
- throw new MioToolError("KEYTOOL_FAILED", "keytool failed to create the debug keystore", {
58
- stdout: result.stdout,
59
- stderr: result.stderr,
60
- details: `exit code ${result.code}`,
61
- });
62
- }
99
+ distinguishedName: options.distinguishedName ?? "CN=Mio Debug, O=Mio, C=CN",
100
+ validityDays: 10000,
101
+ }, options.path, "PKCS12"));
63
102
  return { path: options.path, alias, password };
64
103
  }
65
104
  //# sourceMappingURL=keystore.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"keystore.js","sourceRoot":"","sources":["../src/keystore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAchC,KAAK,UAAU,MAAM,CAAC,IAAY;IAChC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAAmB,EACnB,OAA6B;IAE7B,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,SAAS,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,WAAW,CAAC;IAE3C,IAAI,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IACjD,CAAC;IAED,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,IAAI,YAAY,CACpB,mBAAmB,EACnB,qEAAqE,EACrE;YACE,OAAO,EAAE,6EAA6E;SACvF,CACF,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExD,MAAM,IAAI,GAAG;QACX,aAAa;QACb,WAAW;QACX,OAAO,CAAC,IAAI;QACZ,YAAY;QACZ,QAAQ;QACR,QAAQ;QACR,KAAK;QACL,SAAS;QACT,KAAK;QACL,UAAU;QACV,MAAM;QACN,WAAW;QACX,OAAO;QACP,YAAY;QACZ,QAAQ;QACR,UAAU;QACV,QAAQ;QACR,QAAQ;QACR,OAAO,CAAC,iBAAiB,IAAI,2BAA2B;QACxD,WAAW;KACZ,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IACtE,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,YAAY,CAAC,gBAAgB,EAAE,6CAA6C,EAAE;YACtF,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,aAAa,MAAM,CAAC,IAAI,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AACjD,CAAC"}
1
+ {"version":3,"file":"keystore.js","sourceRoot":"","sources":["../src/keystore.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,14 @@
1
- import { type AndroidTools } from "./discover.js";
2
- export interface ToolBundlePlatform {
1
+ /**
2
+ * A tool bundle ships two independently downloadable components:
3
+ *
4
+ * - `tools`: apksigner.jar + zipalign[.exe] (~1.5 MB)
5
+ * - `jre`: a jlink-trimmed Java runtime with java.base + java.logging (~18 MB)
6
+ *
7
+ * A machine that already has Java only needs `tools`, and one that has the
8
+ * Android build-tools only needs `jre`. The installer never re-downloads a
9
+ * component whose digest still matches.
10
+ */
11
+ export interface ToolBundleComponent {
3
12
  /** Archive URL (http:, https:, or file:). */
4
13
  url: string;
5
14
  /** SHA-256 of the archive. */
@@ -9,13 +18,18 @@ export interface ToolBundlePlatform {
9
18
  /** Number of leading path segments to strip during extraction. Default: 1. */
10
19
  strip?: number;
11
20
  }
21
+ export interface ToolBundlePlatform {
22
+ tools?: ToolBundleComponent;
23
+ jre?: ToolBundleComponent;
24
+ }
12
25
  export interface ToolBundleManifest {
13
- schemaVersion: 1;
26
+ schemaVersion: 2;
14
27
  latest: string;
15
28
  bundles: Record<string, {
16
29
  platforms: Record<string, ToolBundlePlatform>;
17
30
  }>;
18
31
  }
32
+ export type ToolComponent = "tools" | "jre";
19
33
  export interface InstallToolBundleOptions {
20
34
  /** Manifest object, local path, or http(s)/file URL. */
21
35
  manifest: ToolBundleManifest | string;
@@ -29,19 +43,21 @@ export interface InstallToolBundleOptions {
29
43
  proxy?: string;
30
44
  /** Re-download even if a cached bundle exists. */
31
45
  force?: boolean;
46
+ /** Which components to install. Defaults to both. */
47
+ components?: ToolComponent[];
48
+ log?: (message: string) => void;
32
49
  }
33
50
  export interface InstalledToolBundle {
34
- tools: AndroidTools;
35
51
  dir: string;
36
52
  version: string;
37
53
  platform: string;
54
+ installed: ToolComponent[];
38
55
  }
39
- declare function platformKeyOf(platform: NodeJS.Platform, arch: string): string;
56
+ export declare function platformKeyOf(platform: NodeJS.Platform, arch: string): string;
40
57
  /**
41
- * Download, verify, extract, and cache a Mio Android tools bundle.
58
+ * Download, verify and cache the requested components of a tool bundle.
42
59
  *
43
- * The bundle is a .tar.gz containing apksigner.jar, zipalign[.exe], and
44
- * optionally jre/. The archive is authenticated by SHA-256 before extraction.
60
+ * Components whose cached digest still matches are kept; only the missing ones
61
+ * are fetched. Pass `force` to reinstall everything.
45
62
  */
46
63
  export declare function installToolBundle(options: InstallToolBundleOptions): Promise<InstalledToolBundle>;
47
- export { platformKeyOf };
@@ -6,10 +6,9 @@ import { dirname, join } from "node:path";
6
6
  import { fileURLToPath } from "node:url";
7
7
  import * as tar from "tar";
8
8
  import { ProxyAgent, fetch as undiciFetch } from "undici";
9
- import { discoverAndroidTools } from "./discover.js";
10
9
  import { MioToolError } from "./errors.js";
11
- const MANIFEST_FILE = ".mio-tools.json";
12
- function platformKeyOf(platform, arch) {
10
+ const MARKER_FILE = ".mio-tools.json";
11
+ export function platformKeyOf(platform, arch) {
13
12
  return `${platform}-${arch}`;
14
13
  }
15
14
  function defaultCacheDir() {
@@ -40,9 +39,8 @@ async function fetchBuffer(url, proxy) {
40
39
  return await readFile(fileURLToPath(url));
41
40
  }
42
41
  const init = {};
43
- if (proxy) {
42
+ if (proxy)
44
43
  init.dispatcher = new ProxyAgent(proxy);
45
- }
46
44
  let response;
47
45
  try {
48
46
  response = await undiciFetch(url, init);
@@ -74,12 +72,12 @@ async function loadManifest(source, proxy) {
74
72
  });
75
73
  }
76
74
  const manifest = parsed;
77
- if (manifest.schemaVersion !== 1 || typeof manifest.latest !== "string" || !manifest.bundles) {
75
+ if (manifest.schemaVersion !== 2 || typeof manifest.latest !== "string" || !manifest.bundles) {
78
76
  throw new MioToolError("BUNDLE_DOWNLOAD_FAILED", "Unsupported tool bundle manifest");
79
77
  }
80
78
  return manifest;
81
79
  }
82
- function selectBundle(manifest, version, platform) {
80
+ function selectPlatform(manifest, version, platform) {
83
81
  const bundle = manifest.bundles[version];
84
82
  if (!bundle) {
85
83
  throw new MioToolError("BUNDLE_DOWNLOAD_FAILED", `Unknown tool bundle version: ${version}`);
@@ -93,15 +91,12 @@ function selectBundle(manifest, version, platform) {
93
91
  async function readMarker(path) {
94
92
  try {
95
93
  const parsed = JSON.parse(await readFile(path, "utf8"));
96
- if (typeof parsed.version !== "string" ||
97
- typeof parsed.platform !== "string" ||
98
- typeof parsed.sha256 !== "string") {
94
+ if (typeof parsed.version !== "string" || typeof parsed.platform !== "string")
99
95
  return undefined;
100
- }
101
96
  return {
102
97
  version: parsed.version,
103
98
  platform: parsed.platform,
104
- sha256: parsed.sha256,
99
+ components: parsed.components ?? {},
105
100
  installedAt: parsed.installedAt ?? "",
106
101
  };
107
102
  }
@@ -109,59 +104,27 @@ async function readMarker(path) {
109
104
  return undefined;
110
105
  }
111
106
  }
112
- async function validateBundleLayout(dir) {
113
- const apksigner = [join(dir, "apksigner.jar"), join(dir, "lib", "apksigner.jar")];
114
- const zipalign = process.platform === "win32"
115
- ? [join(dir, "zipalign.exe"), join(dir, "bin", "zipalign.exe")]
116
- : [join(dir, "zipalign"), join(dir, "bin", "zipalign")];
117
- for (const candidate of apksigner) {
118
- if (await exists(candidate))
119
- break;
120
- if (candidate === apksigner[apksigner.length - 1]) {
121
- throw new MioToolError("BUNDLE_EXTRACT_FAILED", "Tool bundle is missing apksigner.jar");
122
- }
123
- }
124
- for (const candidate of zipalign) {
125
- if (await exists(candidate))
126
- break;
127
- if (candidate === zipalign[zipalign.length - 1]) {
128
- throw new MioToolError("BUNDLE_EXTRACT_FAILED", "Tool bundle is missing zipalign");
129
- }
130
- }
107
+ async function componentPresent(dir, component) {
108
+ if (component === "tools") {
109
+ const jar = [join(dir, "apksigner.jar"), join(dir, "lib", "apksigner.jar")];
110
+ const align = process.platform === "win32"
111
+ ? [join(dir, "zipalign.exe"), join(dir, "bin", "zipalign.exe")]
112
+ : [join(dir, "zipalign"), join(dir, "bin", "zipalign")];
113
+ return (await anyExists(jar)) && (await anyExists(align));
114
+ }
115
+ const java = process.platform === "win32" ? "java.exe" : "java";
116
+ return await exists(join(dir, "jre", "bin", java));
131
117
  }
132
- /**
133
- * Download, verify, extract, and cache a Mio Android tools bundle.
134
- *
135
- * The bundle is a .tar.gz containing apksigner.jar, zipalign[.exe], and
136
- * optionally jre/. The archive is authenticated by SHA-256 before extraction.
137
- */
138
- export async function installToolBundle(options) {
139
- const proxy = options.proxy ?? defaultProxy();
140
- const manifest = await loadManifest(options.manifest, proxy);
141
- const version = options.version ?? manifest.latest;
142
- const platform = options.platform ?? platformKeyOf(process.platform, process.arch);
143
- const entry = selectBundle(manifest, version, platform);
144
- const cacheDir = options.cacheDir ?? defaultCacheDir();
145
- const dest = join(cacheDir, version, platform);
146
- const markerPath = join(dest, MANIFEST_FILE);
147
- await mkdir(cacheDir, { recursive: true });
148
- if (!options.force) {
149
- const marker = await readMarker(markerPath);
150
- if (marker?.sha256 === entry.sha256 && (await exists(dest))) {
151
- try {
152
- const tools = await discoverAndroidTools({
153
- env: { ...process.env, MIO_ANDROID_TOOLS_DIR: dest },
154
- });
155
- return { tools, dir: dest, version, platform };
156
- }
157
- catch {
158
- // Cached bundle is incomplete or corrupt; fall through and reinstall.
159
- await rm(dest, { recursive: true, force: true });
160
- }
161
- }
118
+ async function anyExists(paths) {
119
+ for (const path of paths) {
120
+ if (await exists(path))
121
+ return true;
162
122
  }
163
- const tempRoot = await mkdtemp(join(cacheDir, ".download-"));
164
- const archivePath = join(tempRoot, "tools.tar.gz");
123
+ return false;
124
+ }
125
+ async function extractComponent(entry, proxy, target) {
126
+ const tempRoot = await mkdtemp(join(target, "..", ".download-"));
127
+ const archivePath = join(tempRoot, "component.tar.gz");
165
128
  const extractDir = join(tempRoot, "extracted");
166
129
  try {
167
130
  await mkdir(extractDir, { recursive: true });
@@ -181,24 +144,74 @@ export async function installToolBundle(options) {
181
144
  strict: true,
182
145
  preservePaths: false,
183
146
  });
184
- await validateBundleLayout(extractDir);
185
- await rm(dest, { recursive: true, force: true });
186
- await mkdir(dirname(dest), { recursive: true });
187
- await rename(extractDir, dest);
188
- await writeFile(markerPath, JSON.stringify({
189
- version,
190
- platform,
191
- sha256: entry.sha256,
192
- installedAt: new Date().toISOString(),
193
- }, null, 2));
194
- const tools = await discoverAndroidTools({
195
- env: { ...process.env, MIO_ANDROID_TOOLS_DIR: dest },
196
- });
197
- return { tools, dir: dest, version, platform };
147
+ await rm(target, { recursive: true, force: true });
148
+ await mkdir(dirname(target), { recursive: true });
149
+ await rename(extractDir, target);
198
150
  }
199
151
  finally {
200
152
  await rm(tempRoot, { recursive: true, force: true });
201
153
  }
202
154
  }
203
- export { platformKeyOf };
155
+ /**
156
+ * Download, verify and cache the requested components of a tool bundle.
157
+ *
158
+ * Components whose cached digest still matches are kept; only the missing ones
159
+ * are fetched. Pass `force` to reinstall everything.
160
+ */
161
+ export async function installToolBundle(options) {
162
+ const log = options.log ?? (() => { });
163
+ const proxy = options.proxy ?? defaultProxy();
164
+ const manifest = await loadManifest(options.manifest, proxy);
165
+ const version = options.version ?? manifest.latest;
166
+ const platform = options.platform ?? platformKeyOf(process.platform, process.arch);
167
+ const entry = selectPlatform(manifest, version, platform);
168
+ const cacheDir = options.cacheDir ?? defaultCacheDir();
169
+ const dest = join(cacheDir, version, platform);
170
+ const requested = options.components ?? ["tools", "jre"];
171
+ await mkdir(dest, { recursive: true });
172
+ const markerPath = join(dest, MARKER_FILE);
173
+ const marker = options.force ? undefined : await readMarker(markerPath);
174
+ const components = {};
175
+ const installed = [];
176
+ for (const component of requested) {
177
+ const source = entry[component];
178
+ if (!source) {
179
+ throw new MioToolError("BUNDLE_DOWNLOAD_FAILED", `Tool bundle ${version} has no "${component}" component for ${platform}`);
180
+ }
181
+ const cachedDigest = marker?.components[component];
182
+ const present = await componentPresent(dest, component);
183
+ if (!options.force &&
184
+ cachedDigest === source.sha256.toLowerCase() &&
185
+ present) {
186
+ components[component] = cachedDigest;
187
+ log(`${component}: cached`);
188
+ continue;
189
+ }
190
+ const target = component === "tools" ? join(dest, "tools-root") : join(dest, "jre");
191
+ log(`downloading ${component} (${source.url})`);
192
+ await extractComponent(source, proxy, target);
193
+ if (component === "tools") {
194
+ // Move the flat tools archive into the bundle root.
195
+ for (const name of ["apksigner.jar", "zipalign", "zipalign.exe"]) {
196
+ const from = join(target, name);
197
+ if (await exists(from))
198
+ await rename(from, join(dest, name));
199
+ }
200
+ await rm(target, { recursive: true, force: true });
201
+ }
202
+ if (!(await componentPresent(dest, component))) {
203
+ throw new MioToolError("BUNDLE_EXTRACT_FAILED", `Tool bundle is missing files for "${component}"`);
204
+ }
205
+ components[component] = source.sha256.toLowerCase();
206
+ installed.push(component);
207
+ }
208
+ const now = new Date().toISOString();
209
+ await writeFile(markerPath, JSON.stringify({
210
+ version,
211
+ platform,
212
+ components: { ...(marker?.components ?? {}), ...components },
213
+ installedAt: now,
214
+ }, null, 2));
215
+ return { dir: dest, version, platform, installed };
216
+ }
204
217
  //# sourceMappingURL=tool-bundle.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-bundle.js","sourceRoot":"","sources":["../src/tool-bundle.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool-bundle.js","sourceRoot":"","sources":["../src/tool-bundle.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iyexin/mio-android-tools",
3
- "version": "0.1.2",
3
+ "version": "0.1.4",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Android APK alignment, signing and verification for Mio",