@lunnos/hyt 1.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 +131 -0
- package/dist/commands/build.d.ts +3 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +74 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/dev.d.ts +3 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +179 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +269 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/setup.d.ts +3 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +164 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/config.d.ts +11 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +39 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/download.d.ts +9 -0
- package/dist/utils/download.d.ts.map +1 -0
- package/dist/utils/download.js +89 -0
- package/dist/utils/download.js.map +1 -0
- package/dist/utils/errors.d.ts +13 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +25 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/gradle.d.ts +7 -0
- package/dist/utils/gradle.d.ts.map +1 -0
- package/dist/utils/gradle.js +50 -0
- package/dist/utils/gradle.js.map +1 -0
- package/dist/utils/hytale.d.ts +5 -0
- package/dist/utils/hytale.d.ts.map +1 -0
- package/dist/utils/hytale.js +84 -0
- package/dist/utils/hytale.js.map +1 -0
- package/dist/utils/java.d.ts +7 -0
- package/dist/utils/java.d.ts.map +1 -0
- package/dist/utils/java.js +53 -0
- package/dist/utils/java.js.map +1 -0
- package/dist/utils/javaDownload.d.ts +9 -0
- package/dist/utils/javaDownload.d.ts.map +1 -0
- package/dist/utils/javaDownload.js +185 -0
- package/dist/utils/javaDownload.js.map +1 -0
- package/dist/utils/paths.d.ts +9 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +19 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/server.d.ts +16 -0
- package/dist/utils/server.d.ts.map +1 -0
- package/dist/utils/server.js +70 -0
- package/dist/utils/server.js.map +1 -0
- package/dist/utils/ui.d.ts +12 -0
- package/dist/utils/ui.d.ts.map +1 -0
- package/dist/utils/ui.js +22 -0
- package/dist/utils/ui.js.map +1 -0
- package/dist/utils/watcher.d.ts +10 -0
- package/dist/utils/watcher.d.ts.map +1 -0
- package/dist/utils/watcher.js +45 -0
- package/dist/utils/watcher.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import https from 'https';
|
|
2
|
+
import http from 'http';
|
|
3
|
+
import fs from 'fs/promises';
|
|
4
|
+
import { createWriteStream } from 'fs';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
import cliProgress from 'cli-progress';
|
|
7
|
+
const TEMPLATE_URL = 'https://github.com/hytale-france/example-mod/archive/refs/tags/0.0.1.zip';
|
|
8
|
+
const CFR_URL = 'https://www.benf.org/other/cfr/cfr-0.152.jar';
|
|
9
|
+
/** Download a file from URL to destination with progress bar */
|
|
10
|
+
export async function downloadFile(url, destPath, maxRedirects = 10) {
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
if (maxRedirects === 0) {
|
|
13
|
+
reject(new Error('Too many redirects'));
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const protocol = url.startsWith('https') ? https : http;
|
|
17
|
+
const request = protocol.get(url, (response) => {
|
|
18
|
+
// Handle redirects (301, 302, 307, 308)
|
|
19
|
+
if (response.statusCode && response.statusCode >= 300 && response.statusCode < 400) {
|
|
20
|
+
const redirectUrl = response.headers.location;
|
|
21
|
+
if (redirectUrl) {
|
|
22
|
+
// Resolve relative URLs
|
|
23
|
+
const resolvedUrl = redirectUrl.startsWith('http')
|
|
24
|
+
? redirectUrl
|
|
25
|
+
: new URL(redirectUrl, url).toString();
|
|
26
|
+
downloadFile(resolvedUrl, destPath, maxRedirects - 1).then(resolve).catch(reject);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (response.statusCode !== 200) {
|
|
31
|
+
reject(new Error(`Download failed with status ${response.statusCode}`));
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const contentLength = parseInt(response.headers['content-length'] || '0', 10);
|
|
35
|
+
// Create progress bar
|
|
36
|
+
const progressBar = new cliProgress.SingleBar({
|
|
37
|
+
format: '{filename} |{bar}| {percentage}% || {value}/{total} bytes || ETA: {eta}s',
|
|
38
|
+
barCompleteChar: '\u2588',
|
|
39
|
+
barIncompleteChar: '\u2591',
|
|
40
|
+
hideCursor: true,
|
|
41
|
+
etaBuffer: 10,
|
|
42
|
+
});
|
|
43
|
+
if (contentLength > 0) {
|
|
44
|
+
progressBar.start(contentLength, 0, {
|
|
45
|
+
filename: path.basename(destPath),
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const fileStream = createWriteStream(destPath);
|
|
49
|
+
let downloadedBytes = 0;
|
|
50
|
+
response.on('data', (chunk) => {
|
|
51
|
+
downloadedBytes += chunk.length;
|
|
52
|
+
if (contentLength > 0) {
|
|
53
|
+
progressBar.update(downloadedBytes);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
response.pipe(fileStream);
|
|
57
|
+
fileStream.on('finish', () => {
|
|
58
|
+
if (contentLength > 0) {
|
|
59
|
+
progressBar.stop();
|
|
60
|
+
}
|
|
61
|
+
fileStream.close();
|
|
62
|
+
resolve();
|
|
63
|
+
});
|
|
64
|
+
fileStream.on('error', (err) => {
|
|
65
|
+
if (contentLength > 0) {
|
|
66
|
+
progressBar.stop();
|
|
67
|
+
}
|
|
68
|
+
fs.unlink(destPath).catch(() => { }); // Clean up partial file
|
|
69
|
+
reject(err);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
request.on('error', reject);
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/** Download the example plugin template */
|
|
76
|
+
export async function downloadTemplate(destPath) {
|
|
77
|
+
await downloadFile(TEMPLATE_URL, destPath);
|
|
78
|
+
}
|
|
79
|
+
/** Download CFR decompiler */
|
|
80
|
+
export async function downloadCfr(destPath) {
|
|
81
|
+
await downloadFile(CFR_URL, destPath);
|
|
82
|
+
}
|
|
83
|
+
export function getTemplateUrl() {
|
|
84
|
+
return TEMPLATE_URL;
|
|
85
|
+
}
|
|
86
|
+
export function getCfrUrl() {
|
|
87
|
+
return CFR_URL;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=download.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/utils/download.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,IAAI,CAAC;AACvC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,WAAW,MAAM,cAAc,CAAC;AAEvC,MAAM,YAAY,GAAG,0EAA0E,CAAC;AAChG,MAAM,OAAO,GAAG,8CAA8C,CAAC;AAE/D,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,QAAgB,EAAE,YAAY,GAAG,EAAE;IACjF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QAExD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,EAAE;YAC7C,wCAAwC;YACxC,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,IAAI,GAAG,IAAI,QAAQ,CAAC,UAAU,GAAG,GAAG,EAAE,CAAC;gBACnF,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAC9C,IAAI,WAAW,EAAE,CAAC;oBAChB,wBAAwB;oBACxB,MAAM,WAAW,GAAG,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC;wBAChD,CAAC,CAAC,WAAW;wBACb,CAAC,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;oBAEzC,YAAY,CAAC,WAAW,EAAE,QAAQ,EAAE,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAClF,OAAO;gBACT,CAAC;YACH,CAAC;YAED,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;gBAChC,MAAM,CAAC,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;gBACxE,OAAO;YACT,CAAC;YAED,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;YAE9E,sBAAsB;YACtB,MAAM,WAAW,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC;gBAC5C,MAAM,EAAE,0EAA0E;gBAClF,eAAe,EAAE,QAAQ;gBACzB,iBAAiB,EAAE,QAAQ;gBAC3B,UAAU,EAAE,IAAI;gBAChB,SAAS,EAAE,EAAE;aACP,CAAC,CAAC;YAEV,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;gBACtB,WAAW,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,EAAE;oBAClC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;iBAClC,CAAC,CAAC;YACL,CAAC;YAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAC/C,IAAI,eAAe,GAAG,CAAC,CAAC;YAExB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;gBAC5B,eAAe,IAAI,KAAK,CAAC,MAAM,CAAC;gBAChC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;oBACtB,WAAW,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAE1B,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;gBAC3B,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;oBACtB,WAAW,CAAC,IAAI,EAAE,CAAC;gBACrB,CAAC;gBACD,UAAU,CAAC,KAAK,EAAE,CAAC;gBACnB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;YAEH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC7B,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;oBACtB,WAAW,CAAC,IAAI,EAAE,CAAC;gBACrB,CAAC;gBACD,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC,CAAC,wBAAwB;gBAC7D,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,2CAA2C;AAC3C,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAgB;IACrD,MAAM,YAAY,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AAC7C,CAAC;AAED,8BAA8B;AAC9B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAAgB;IAChD,MAAM,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class JavaError extends Error {
|
|
2
|
+
constructor(message: string);
|
|
3
|
+
}
|
|
4
|
+
export declare class GradleError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
export declare class HytaleError extends Error {
|
|
8
|
+
constructor(message: string);
|
|
9
|
+
}
|
|
10
|
+
export declare class ConfigError extends Error {
|
|
11
|
+
constructor(message: string);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAU,SAAQ,KAAK;gBACtB,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,WAAY,SAAQ,KAAK;gBACxB,OAAO,EAAE,MAAM;CAI5B"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export class JavaError extends Error {
|
|
2
|
+
constructor(message) {
|
|
3
|
+
super(message);
|
|
4
|
+
this.name = 'JavaError';
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export class GradleError extends Error {
|
|
8
|
+
constructor(message) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.name = 'GradleError';
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
export class HytaleError extends Error {
|
|
14
|
+
constructor(message) {
|
|
15
|
+
super(message);
|
|
16
|
+
this.name = 'HytaleError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export class ConfigError extends Error {
|
|
20
|
+
constructor(message) {
|
|
21
|
+
super(message);
|
|
22
|
+
this.name = 'ConfigError';
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF;AAED,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;IAC5B,CAAC;CACF"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Run Gradle build in the specified project directory */
|
|
2
|
+
export declare function runGradleBuild(projectDir: string): Promise<void>;
|
|
3
|
+
/** Run any Gradle task in the specified project directory */
|
|
4
|
+
export declare function runGradleTask(projectDir: string, task: string): Promise<void>;
|
|
5
|
+
/** Check if Gradle wrapper exists in directory */
|
|
6
|
+
export declare function hasGradleWrapper(projectDir: string): Promise<boolean>;
|
|
7
|
+
//# sourceMappingURL=gradle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradle.d.ts","sourceRoot":"","sources":["../../src/utils/gradle.ts"],"names":[],"mappings":"AAIA,0DAA0D;AAC1D,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBtE;AAED,6DAA6D;AAC7D,wBAAsB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBnF;AAED,kDAAkD;AAClD,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAY3E"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { execa } from 'execa';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { GradleError } from './errors.js';
|
|
4
|
+
/** Run Gradle build in the specified project directory */
|
|
5
|
+
export async function runGradleBuild(projectDir) {
|
|
6
|
+
const isWindows = process.platform === 'win32';
|
|
7
|
+
const gradleWrapper = isWindows ? 'gradlew.bat' : './gradlew';
|
|
8
|
+
const gradlePath = path.join(projectDir, gradleWrapper);
|
|
9
|
+
try {
|
|
10
|
+
await execa(gradlePath, ['build'], {
|
|
11
|
+
cwd: projectDir,
|
|
12
|
+
stdio: 'inherit', // Stream output directly to terminal
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
const execaErr = error;
|
|
17
|
+
throw new GradleError(`Gradle build failed with exit code ${execaErr.exitCode || 'unknown'}. Check the output above for details.`);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/** Run any Gradle task in the specified project directory */
|
|
21
|
+
export async function runGradleTask(projectDir, task) {
|
|
22
|
+
const isWindows = process.platform === 'win32';
|
|
23
|
+
const gradleWrapper = isWindows ? 'gradlew.bat' : './gradlew';
|
|
24
|
+
const gradlePath = path.join(projectDir, gradleWrapper);
|
|
25
|
+
try {
|
|
26
|
+
await execa(gradlePath, [task], {
|
|
27
|
+
cwd: projectDir,
|
|
28
|
+
stdio: 'inherit',
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
const execaErr = error;
|
|
33
|
+
throw new GradleError(`Gradle task '${task}' failed with exit code ${execaErr.exitCode || 'unknown'}.`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** Check if Gradle wrapper exists in directory */
|
|
37
|
+
export async function hasGradleWrapper(projectDir) {
|
|
38
|
+
const isWindows = process.platform === 'win32';
|
|
39
|
+
const gradleWrapper = isWindows ? 'gradlew.bat' : 'gradlew';
|
|
40
|
+
const gradlePath = path.join(projectDir, gradleWrapper);
|
|
41
|
+
try {
|
|
42
|
+
const fs = await import('fs/promises');
|
|
43
|
+
await fs.access(gradlePath);
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=gradle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradle.js","sourceRoot":"","sources":["../../src/utils/gradle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,MAAM,OAAO,CAAC;AAC1C,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,0DAA0D;AAC1D,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB;IACrD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC/C,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAExD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC,OAAO,CAAC,EAAE;YACjC,GAAG,EAAE,UAAU;YACf,KAAK,EAAE,SAAS,EAAE,qCAAqC;SACxD,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,KAAmB,CAAC;QACrC,MAAM,IAAI,WAAW,CACnB,sCAAsC,QAAQ,CAAC,QAAQ,IAAI,SAAS,uCAAuC,CAC5G,CAAC;IACJ,CAAC;AACH,CAAC;AAED,6DAA6D;AAC7D,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAkB,EAAE,IAAY;IAClE,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC/C,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC;IAC9D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAExD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,EAAE;YAC9B,GAAG,EAAE,UAAU;YACf,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,QAAQ,GAAG,KAAmB,CAAC;QACrC,MAAM,IAAI,WAAW,CACnB,gBAAgB,IAAI,2BAA2B,QAAQ,CAAC,QAAQ,IAAI,SAAS,GAAG,CACjF,CAAC;IACJ,CAAC;AACH,CAAC;AAED,kDAAkD;AAClD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAkB;IACvD,MAAM,SAAS,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC;IAC/C,MAAM,aAAa,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;IAExD,IAAI,CAAC;QACH,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACvC,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/** Find Hytale installation directory */
|
|
2
|
+
export declare function findHytaleInstall(): Promise<string | null>;
|
|
3
|
+
/** Verify Hytale installation path is valid */
|
|
4
|
+
export declare function verifyHytaleInstall(hytaleInstallPath: string): Promise<boolean>;
|
|
5
|
+
//# sourceMappingURL=hytale.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hytale.d.ts","sourceRoot":"","sources":["../../src/utils/hytale.ts"],"names":[],"mappings":"AAmCA,yCAAyC;AACzC,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAsBhE;AAoBD,+CAA+C;AAC/C,wBAAsB,mBAAmB,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOrF"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
/** Common Hytale installation locations by platform */
|
|
5
|
+
function getHytaleSearchPaths() {
|
|
6
|
+
const platform = os.platform();
|
|
7
|
+
if (platform === 'win32') {
|
|
8
|
+
return [
|
|
9
|
+
// Primary location: %APPDATA%\Hytale (user's Roaming directory)
|
|
10
|
+
path.join(process.env.APPDATA || '', 'Hytale'),
|
|
11
|
+
// Full path to game files
|
|
12
|
+
path.join(process.env.APPDATA || '', 'Hytale', 'install', 'release', 'package', 'game', 'latest'),
|
|
13
|
+
// Fallback locations
|
|
14
|
+
path.join(process.env.PROGRAMFILES || 'C:\\Program Files', 'Hytale'),
|
|
15
|
+
path.join(process.env['PROGRAMFILES(X86)'] || 'C:\\Program Files (x86)', 'Hytale'),
|
|
16
|
+
path.join(process.env.LOCALAPPDATA || '', 'Hytale'),
|
|
17
|
+
];
|
|
18
|
+
}
|
|
19
|
+
else if (platform === 'darwin') {
|
|
20
|
+
return [
|
|
21
|
+
'/Applications/Hytale.app',
|
|
22
|
+
path.join(os.homedir(), 'Applications', 'Hytale.app'),
|
|
23
|
+
];
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
// Linux
|
|
27
|
+
return [
|
|
28
|
+
'/opt/hytale',
|
|
29
|
+
path.join(os.homedir(), '.hytale'),
|
|
30
|
+
path.join(os.homedir(), 'hytale'),
|
|
31
|
+
];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** Find Hytale installation directory */
|
|
35
|
+
export async function findHytaleInstall() {
|
|
36
|
+
const searchPaths = getHytaleSearchPaths();
|
|
37
|
+
for (const searchPath of searchPaths) {
|
|
38
|
+
try {
|
|
39
|
+
const stats = await fs.stat(searchPath);
|
|
40
|
+
if (stats.isDirectory()) {
|
|
41
|
+
// Verify this directory contains Server/ and Assets.zip
|
|
42
|
+
const hasServer = await directoryExists(path.join(searchPath, 'Server'));
|
|
43
|
+
const hasAssets = await fileExists(path.join(searchPath, 'Assets.zip'));
|
|
44
|
+
if (hasServer && hasAssets) {
|
|
45
|
+
return searchPath;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// Path doesn't exist, continue searching
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
async function directoryExists(dirPath) {
|
|
57
|
+
try {
|
|
58
|
+
const stats = await fs.stat(dirPath);
|
|
59
|
+
return stats.isDirectory();
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
async function fileExists(filePath) {
|
|
66
|
+
try {
|
|
67
|
+
const stats = await fs.stat(filePath);
|
|
68
|
+
return stats.isFile();
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
/** Verify Hytale installation path is valid */
|
|
75
|
+
export async function verifyHytaleInstall(hytaleInstallPath) {
|
|
76
|
+
try {
|
|
77
|
+
const stats = await fs.stat(hytaleInstallPath);
|
|
78
|
+
return stats.isDirectory();
|
|
79
|
+
}
|
|
80
|
+
catch {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=hytale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hytale.js","sourceRoot":"","sources":["../../src/utils/hytale.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** Detect Java installation on the system */
|
|
2
|
+
export declare function detectJava(): Promise<string | null>;
|
|
3
|
+
/** Validate Java version meets requirements */
|
|
4
|
+
export declare function validateJavaVersion(javaPath: string): Promise<boolean>;
|
|
5
|
+
/** Verify Java path exists and is executable */
|
|
6
|
+
export declare function verifyJavaPath(javaPath: string): Promise<boolean>;
|
|
7
|
+
//# sourceMappingURL=java.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"java.d.ts","sourceRoot":"","sources":["../../src/utils/java.ts"],"names":[],"mappings":"AAOA,6CAA6C;AAC7C,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAezD;AAED,+CAA+C;AAC/C,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAyB5E;AAED,gDAAgD;AAChD,wBAAsB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOvE"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { execa } from 'execa';
|
|
2
|
+
import { JavaError } from './errors.js';
|
|
3
|
+
import fs from 'fs/promises';
|
|
4
|
+
const REQUIRED_JAVA_VERSION = 25;
|
|
5
|
+
/** Detect Java installation on the system */
|
|
6
|
+
export async function detectJava() {
|
|
7
|
+
try {
|
|
8
|
+
// Try 'java' command first
|
|
9
|
+
const { stdout } = await execa('java', ['-version']);
|
|
10
|
+
// If successful, get the full path
|
|
11
|
+
const whichResult = process.platform === 'win32'
|
|
12
|
+
? await execa('where', ['java'])
|
|
13
|
+
: await execa('which', ['java']);
|
|
14
|
+
return whichResult.stdout.split('\n')[0].trim();
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
// Java not found in PATH
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
/** Validate Java version meets requirements */
|
|
22
|
+
export async function validateJavaVersion(javaPath) {
|
|
23
|
+
try {
|
|
24
|
+
const { stderr } = await execa(javaPath, ['-version']);
|
|
25
|
+
// Java version output is in stderr
|
|
26
|
+
const versionMatch = stderr.match(/version "(\d+)/);
|
|
27
|
+
if (!versionMatch) {
|
|
28
|
+
throw new JavaError('Could not parse Java version');
|
|
29
|
+
}
|
|
30
|
+
const majorVersion = parseInt(versionMatch[1], 10);
|
|
31
|
+
if (majorVersion < REQUIRED_JAVA_VERSION) {
|
|
32
|
+
throw new JavaError(`Java ${REQUIRED_JAVA_VERSION} or higher is required. Found version ${majorVersion}.`);
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
if (error instanceof JavaError) {
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
throw new JavaError(`Failed to validate Java version: ${error.message}`);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** Verify Java path exists and is executable */
|
|
44
|
+
export async function verifyJavaPath(javaPath) {
|
|
45
|
+
try {
|
|
46
|
+
await fs.access(javaPath, fs.constants.X_OK);
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=java.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"java.js","sourceRoot":"","sources":["../../src/utils/java.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,MAAM,aAAa,CAAC;AAG7B,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAEjC,6CAA6C;AAC7C,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,IAAI,CAAC;QACH,2BAA2B;QAC3B,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAErD,mCAAmC;QACnC,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC9C,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;YAChC,CAAC,CAAC,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAEnC,OAAO,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,yBAAyB;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,+CAA+C;AAC/C,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACxD,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;QAEvD,mCAAmC;QACnC,MAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACpD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,SAAS,CAAC,8BAA8B,CAAC,CAAC;QACtD,CAAC;QAED,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAEnD,IAAI,YAAY,GAAG,qBAAqB,EAAE,CAAC;YACzC,MAAM,IAAI,SAAS,CACjB,QAAQ,qBAAqB,yCAAyC,YAAY,GAAG,CACtF,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;YAC/B,MAAM,KAAK,CAAC;QACd,CAAC;QACD,MAAM,IAAI,SAAS,CAAC,oCAAqC,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,gDAAgD;AAChD,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Get the HYT Java installation directory */
|
|
2
|
+
export declare function getJavaInstallDir(): string;
|
|
3
|
+
/** Get the Java executable path, searching versioned subdirectories if needed */
|
|
4
|
+
export declare function getJavaExecutablePathAsync(): Promise<string>;
|
|
5
|
+
/** Download and install Java 25 to ~/.hyt/java25 */
|
|
6
|
+
export declare function downloadAndInstallJava(): Promise<string>;
|
|
7
|
+
/** Check if Java is already installed in HYT directory */
|
|
8
|
+
export declare function hasInstalledJava(): Promise<boolean>;
|
|
9
|
+
//# sourceMappingURL=javaDownload.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"javaDownload.d.ts","sourceRoot":"","sources":["../../src/utils/javaDownload.ts"],"names":[],"mappings":"AAwBA,8CAA8C;AAC9C,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,iFAAiF;AACjF,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,MAAM,CAAC,CA8ClE;AAmBD,oDAAoD;AACpD,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CA2B9D;AA0ED,0DAA0D;AAC1D,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,OAAO,CAAC,CAQzD"}
|
|
@@ -0,0 +1,185 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import os from 'os';
|
|
4
|
+
import { execa } from 'execa';
|
|
5
|
+
import { downloadFile } from './download.js';
|
|
6
|
+
import { JavaError } from './errors.js';
|
|
7
|
+
const JAVA_VERSION = '25';
|
|
8
|
+
// Eclipse Temurin (Adoptium) download URLs
|
|
9
|
+
const DOWNLOAD_URLS = {
|
|
10
|
+
win32: {
|
|
11
|
+
x64: `https://api.adoptium.net/v3/binary/latest/${JAVA_VERSION}/ga/windows/x64/jdk/hotspot/normal/eclipse`,
|
|
12
|
+
},
|
|
13
|
+
darwin: {
|
|
14
|
+
x64: `https://api.adoptium.net/v3/binary/latest/${JAVA_VERSION}/ga/mac/x64/jdk/hotspot/normal/eclipse`,
|
|
15
|
+
arm64: `https://api.adoptium.net/v3/binary/latest/${JAVA_VERSION}/ga/mac/aarch64/jdk/hotspot/normal/eclipse`,
|
|
16
|
+
},
|
|
17
|
+
linux: {
|
|
18
|
+
x64: `https://api.adoptium.net/v3/binary/latest/${JAVA_VERSION}/ga/linux/x64/jdk/hotspot/normal/eclipse`,
|
|
19
|
+
arm64: `https://api.adoptium.net/v3/binary/latest/${JAVA_VERSION}/ga/linux/aarch64/jdk/hotspot/normal/eclipse`,
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
/** Get the HYT Java installation directory */
|
|
23
|
+
export function getJavaInstallDir() {
|
|
24
|
+
return path.join(os.homedir(), '.hyt', 'java25');
|
|
25
|
+
}
|
|
26
|
+
/** Get the Java executable path, searching versioned subdirectories if needed */
|
|
27
|
+
export async function getJavaExecutablePathAsync() {
|
|
28
|
+
const javaDir = getJavaInstallDir();
|
|
29
|
+
const platform = os.platform();
|
|
30
|
+
let directPath;
|
|
31
|
+
if (platform === 'win32') {
|
|
32
|
+
directPath = path.join(javaDir, 'bin', 'java.exe');
|
|
33
|
+
}
|
|
34
|
+
else if (platform === 'darwin') {
|
|
35
|
+
directPath = path.join(javaDir, 'Contents', 'Home', 'bin', 'java');
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
directPath = path.join(javaDir, 'bin', 'java');
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
await fs.access(directPath, fs.constants.X_OK);
|
|
42
|
+
return directPath;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
try {
|
|
46
|
+
const entries = await fs.readdir(javaDir, { withFileTypes: true });
|
|
47
|
+
for (const entry of entries) {
|
|
48
|
+
if (entry.isDirectory() && entry.name.startsWith('jdk-')) {
|
|
49
|
+
let javaExePath;
|
|
50
|
+
if (platform === 'win32') {
|
|
51
|
+
javaExePath = path.join(javaDir, entry.name, 'bin', 'java.exe');
|
|
52
|
+
}
|
|
53
|
+
else if (platform === 'darwin') {
|
|
54
|
+
javaExePath = path.join(javaDir, entry.name, 'Contents', 'Home', 'bin', 'java');
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
javaExePath = path.join(javaDir, entry.name, 'bin', 'java');
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
await fs.access(javaExePath, fs.constants.X_OK);
|
|
61
|
+
return javaExePath;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// Directory doesn't exist or can't read
|
|
71
|
+
}
|
|
72
|
+
return directPath;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function getDownloadUrl() {
|
|
76
|
+
const platform = os.platform();
|
|
77
|
+
const arch = os.arch();
|
|
78
|
+
const platformUrls = DOWNLOAD_URLS[platform];
|
|
79
|
+
if (!platformUrls) {
|
|
80
|
+
throw new JavaError(`Unsupported platform: ${platform}`);
|
|
81
|
+
}
|
|
82
|
+
const archUrl = platformUrls[arch];
|
|
83
|
+
if (!archUrl) {
|
|
84
|
+
throw new JavaError(`Unsupported architecture: ${arch} on ${platform}`);
|
|
85
|
+
}
|
|
86
|
+
return archUrl;
|
|
87
|
+
}
|
|
88
|
+
/** Download and install Java 25 to ~/.hyt/java25 */
|
|
89
|
+
export async function downloadAndInstallJava() {
|
|
90
|
+
const javaDir = getJavaInstallDir();
|
|
91
|
+
const platform = os.platform();
|
|
92
|
+
// Create installation directory
|
|
93
|
+
await fs.mkdir(javaDir, { recursive: true });
|
|
94
|
+
// Download Java
|
|
95
|
+
const downloadUrl = getDownloadUrl();
|
|
96
|
+
const ext = platform === 'win32' ? '.zip' : '.tar.gz';
|
|
97
|
+
const downloadPath = path.join(javaDir, `java25${ext}`);
|
|
98
|
+
await downloadFile(downloadUrl, downloadPath);
|
|
99
|
+
// Extract archive
|
|
100
|
+
await extractJavaArchive(downloadPath, javaDir);
|
|
101
|
+
// Clean up archive
|
|
102
|
+
await fs.unlink(downloadPath);
|
|
103
|
+
// Find and return Java executable path
|
|
104
|
+
const javaExe = await findJavaExecutable(javaDir);
|
|
105
|
+
if (!javaExe) {
|
|
106
|
+
throw new JavaError('Java installation completed but java executable not found');
|
|
107
|
+
}
|
|
108
|
+
return javaExe;
|
|
109
|
+
}
|
|
110
|
+
async function extractJavaArchive(archivePath, destDir) {
|
|
111
|
+
const platform = os.platform();
|
|
112
|
+
if (platform === 'win32') {
|
|
113
|
+
const tempDir = path.join(destDir, 'temp_extract');
|
|
114
|
+
await execa('powershell', [
|
|
115
|
+
'-Command',
|
|
116
|
+
`Expand-Archive -Path "${archivePath}" -DestinationPath "${tempDir}" -Force`
|
|
117
|
+
]);
|
|
118
|
+
const entries = await fs.readdir(tempDir, { withFileTypes: true });
|
|
119
|
+
const jdkFolder = entries.find(e => e.isDirectory() && e.name.startsWith('jdk-'));
|
|
120
|
+
if (jdkFolder) {
|
|
121
|
+
const jdkPath = path.join(tempDir, jdkFolder.name);
|
|
122
|
+
// Move contents up to destDir
|
|
123
|
+
const jdkContents = await fs.readdir(jdkPath);
|
|
124
|
+
for (const item of jdkContents) {
|
|
125
|
+
await fs.rename(path.join(jdkPath, item), path.join(destDir, item));
|
|
126
|
+
}
|
|
127
|
+
await fs.rm(tempDir, { recursive: true, force: true });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// Use tar for Unix systems with strip-components to remove version folder
|
|
132
|
+
await execa('tar', ['-xzf', archivePath, '-C', destDir, '--strip-components=1']);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
async function findJavaExecutable(dir) {
|
|
136
|
+
const platform = os.platform();
|
|
137
|
+
const standardPath = await getJavaExecutablePathAsync();
|
|
138
|
+
try {
|
|
139
|
+
await fs.access(standardPath, fs.constants.X_OK);
|
|
140
|
+
return standardPath;
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Not in standard location, search recursively
|
|
144
|
+
}
|
|
145
|
+
const javaExeName = platform === 'win32' ? 'java.exe' : 'java';
|
|
146
|
+
return await findFileRecursive(dir, javaExeName);
|
|
147
|
+
}
|
|
148
|
+
async function findFileRecursive(dir, fileName) {
|
|
149
|
+
try {
|
|
150
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
151
|
+
for (const entry of entries) {
|
|
152
|
+
const fullPath = path.join(dir, entry.name);
|
|
153
|
+
if (entry.isDirectory()) {
|
|
154
|
+
const found = await findFileRecursive(fullPath, fileName);
|
|
155
|
+
if (found)
|
|
156
|
+
return found;
|
|
157
|
+
}
|
|
158
|
+
else if (entry.name === fileName) {
|
|
159
|
+
try {
|
|
160
|
+
await fs.access(fullPath, fs.constants.X_OK);
|
|
161
|
+
return fullPath;
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
continue;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// Directory not accessible, skip
|
|
171
|
+
}
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
/** Check if Java is already installed in HYT directory */
|
|
175
|
+
export async function hasInstalledJava() {
|
|
176
|
+
try {
|
|
177
|
+
const javaExe = await getJavaExecutablePathAsync();
|
|
178
|
+
await fs.access(javaExe, fs.constants.X_OK);
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return false;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
//# sourceMappingURL=javaDownload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"javaDownload.js","sourceRoot":"","sources":["../../src/utils/javaDownload.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Get HYT config directory (~/.hyt/) */
|
|
2
|
+
export declare function getConfigDir(): string;
|
|
3
|
+
/** Get HYT config file path (~/.hyt/config.json) */
|
|
4
|
+
export declare function getConfigPath(): string;
|
|
5
|
+
/** Resolve project paths consistently */
|
|
6
|
+
export declare function resolveProjectPath(projectDir: string, ...pathSegments: string[]): string;
|
|
7
|
+
/** Get Gradle build output directory */
|
|
8
|
+
export declare function getBuildOutputDir(projectDir: string): string;
|
|
9
|
+
//# sourceMappingURL=paths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAGA,yCAAyC;AACzC,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,oDAAoD;AACpD,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED,yCAAyC;AACzC,wBAAgB,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,MAAM,EAAE,GAAG,MAAM,CAExF;AAED,wCAAwC;AACxC,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAE5D"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import os from 'os';
|
|
3
|
+
/** Get HYT config directory (~/.hyt/) */
|
|
4
|
+
export function getConfigDir() {
|
|
5
|
+
return path.join(os.homedir(), '.hyt');
|
|
6
|
+
}
|
|
7
|
+
/** Get HYT config file path (~/.hyt/config.json) */
|
|
8
|
+
export function getConfigPath() {
|
|
9
|
+
return path.join(getConfigDir(), 'config.json');
|
|
10
|
+
}
|
|
11
|
+
/** Resolve project paths consistently */
|
|
12
|
+
export function resolveProjectPath(projectDir, ...pathSegments) {
|
|
13
|
+
return path.join(projectDir, ...pathSegments);
|
|
14
|
+
}
|
|
15
|
+
/** Get Gradle build output directory */
|
|
16
|
+
export function getBuildOutputDir(projectDir) {
|
|
17
|
+
return path.join(projectDir, 'build', 'libs');
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=paths.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/utils/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AAEpB,yCAAyC;AACzC,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,aAAa;IAC3B,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,aAAa,CAAC,CAAC;AAClD,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,kBAAkB,CAAC,UAAkB,EAAE,GAAG,YAAsB;IAC9E,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,YAAY,CAAC,CAAC;AAChD,CAAC;AAED,wCAAwC;AACxC,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAChD,CAAC"}
|