@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.
Files changed (66) hide show
  1. package/README.md +131 -0
  2. package/dist/commands/build.d.ts +3 -0
  3. package/dist/commands/build.d.ts.map +1 -0
  4. package/dist/commands/build.js +74 -0
  5. package/dist/commands/build.js.map +1 -0
  6. package/dist/commands/dev.d.ts +3 -0
  7. package/dist/commands/dev.d.ts.map +1 -0
  8. package/dist/commands/dev.js +179 -0
  9. package/dist/commands/dev.js.map +1 -0
  10. package/dist/commands/init.d.ts +3 -0
  11. package/dist/commands/init.d.ts.map +1 -0
  12. package/dist/commands/init.js +269 -0
  13. package/dist/commands/init.js.map +1 -0
  14. package/dist/commands/setup.d.ts +3 -0
  15. package/dist/commands/setup.d.ts.map +1 -0
  16. package/dist/commands/setup.js +164 -0
  17. package/dist/commands/setup.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +20 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/utils/config.d.ts +11 -0
  23. package/dist/utils/config.d.ts.map +1 -0
  24. package/dist/utils/config.js +39 -0
  25. package/dist/utils/config.js.map +1 -0
  26. package/dist/utils/download.d.ts +9 -0
  27. package/dist/utils/download.d.ts.map +1 -0
  28. package/dist/utils/download.js +89 -0
  29. package/dist/utils/download.js.map +1 -0
  30. package/dist/utils/errors.d.ts +13 -0
  31. package/dist/utils/errors.d.ts.map +1 -0
  32. package/dist/utils/errors.js +25 -0
  33. package/dist/utils/errors.js.map +1 -0
  34. package/dist/utils/gradle.d.ts +7 -0
  35. package/dist/utils/gradle.d.ts.map +1 -0
  36. package/dist/utils/gradle.js +50 -0
  37. package/dist/utils/gradle.js.map +1 -0
  38. package/dist/utils/hytale.d.ts +5 -0
  39. package/dist/utils/hytale.d.ts.map +1 -0
  40. package/dist/utils/hytale.js +84 -0
  41. package/dist/utils/hytale.js.map +1 -0
  42. package/dist/utils/java.d.ts +7 -0
  43. package/dist/utils/java.d.ts.map +1 -0
  44. package/dist/utils/java.js +53 -0
  45. package/dist/utils/java.js.map +1 -0
  46. package/dist/utils/javaDownload.d.ts +9 -0
  47. package/dist/utils/javaDownload.d.ts.map +1 -0
  48. package/dist/utils/javaDownload.js +185 -0
  49. package/dist/utils/javaDownload.js.map +1 -0
  50. package/dist/utils/paths.d.ts +9 -0
  51. package/dist/utils/paths.d.ts.map +1 -0
  52. package/dist/utils/paths.js +19 -0
  53. package/dist/utils/paths.js.map +1 -0
  54. package/dist/utils/server.d.ts +16 -0
  55. package/dist/utils/server.d.ts.map +1 -0
  56. package/dist/utils/server.js +70 -0
  57. package/dist/utils/server.js.map +1 -0
  58. package/dist/utils/ui.d.ts +12 -0
  59. package/dist/utils/ui.d.ts.map +1 -0
  60. package/dist/utils/ui.js +22 -0
  61. package/dist/utils/ui.js.map +1 -0
  62. package/dist/utils/watcher.d.ts +10 -0
  63. package/dist/utils/watcher.d.ts.map +1 -0
  64. package/dist/utils/watcher.js +45 -0
  65. package/dist/utils/watcher.js.map +1 -0
  66. 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":"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"}
@@ -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"}