mcdev-mcp 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 (87) hide show
  1. package/LICENSE +77 -0
  2. package/README.md +365 -0
  3. package/dist/callgraph/index.d.ts +14 -0
  4. package/dist/callgraph/index.d.ts.map +1 -0
  5. package/dist/callgraph/index.js +201 -0
  6. package/dist/callgraph/index.js.map +1 -0
  7. package/dist/callgraph/query.d.ts +20 -0
  8. package/dist/callgraph/query.d.ts.map +1 -0
  9. package/dist/callgraph/query.js +95 -0
  10. package/dist/callgraph/query.js.map +1 -0
  11. package/dist/cli.d.ts +3 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +318 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/decompiler/download.d.ts +31 -0
  16. package/dist/decompiler/download.d.ts.map +1 -0
  17. package/dist/decompiler/download.js +145 -0
  18. package/dist/decompiler/download.js.map +1 -0
  19. package/dist/decompiler/downloader.d.ts +7 -0
  20. package/dist/decompiler/downloader.d.ts.map +1 -0
  21. package/dist/decompiler/downloader.js +4 -0
  22. package/dist/decompiler/downloader.js.map +1 -0
  23. package/dist/decompiler/index.d.ts +16 -0
  24. package/dist/decompiler/index.d.ts.map +1 -0
  25. package/dist/decompiler/index.js +74 -0
  26. package/dist/decompiler/index.js.map +1 -0
  27. package/dist/decompiler/remapper.d.ts +9 -0
  28. package/dist/decompiler/remapper.d.ts.map +1 -0
  29. package/dist/decompiler/remapper.js +174 -0
  30. package/dist/decompiler/remapper.js.map +1 -0
  31. package/dist/decompiler/tools.d.ts +3 -0
  32. package/dist/decompiler/tools.d.ts.map +1 -0
  33. package/dist/decompiler/tools.js +79 -0
  34. package/dist/decompiler/tools.js.map +1 -0
  35. package/dist/decompiler/vineflower.d.ts +3 -0
  36. package/dist/decompiler/vineflower.d.ts.map +1 -0
  37. package/dist/decompiler/vineflower.js +37 -0
  38. package/dist/decompiler/vineflower.js.map +1 -0
  39. package/dist/index.d.ts +3 -0
  40. package/dist/index.d.ts.map +1 -0
  41. package/dist/index.js +63 -0
  42. package/dist/index.js.map +1 -0
  43. package/dist/indexer/index.d.ts +17 -0
  44. package/dist/indexer/index.d.ts.map +1 -0
  45. package/dist/indexer/index.js +134 -0
  46. package/dist/indexer/index.js.map +1 -0
  47. package/dist/indexer/parser.d.ts +11 -0
  48. package/dist/indexer/parser.d.ts.map +1 -0
  49. package/dist/indexer/parser.js +188 -0
  50. package/dist/indexer/parser.js.map +1 -0
  51. package/dist/indexer/types.d.ts +14 -0
  52. package/dist/indexer/types.d.ts.map +1 -0
  53. package/dist/indexer/types.js +2 -0
  54. package/dist/indexer/types.js.map +1 -0
  55. package/dist/storage/index.d.ts +2 -0
  56. package/dist/storage/index.d.ts.map +1 -0
  57. package/dist/storage/index.js +2 -0
  58. package/dist/storage/index.js.map +1 -0
  59. package/dist/storage/source-store.d.ts +43 -0
  60. package/dist/storage/source-store.d.ts.map +1 -0
  61. package/dist/storage/source-store.js +279 -0
  62. package/dist/storage/source-store.js.map +1 -0
  63. package/dist/tools/index.d.ts +503 -0
  64. package/dist/tools/index.d.ts.map +1 -0
  65. package/dist/tools/index.js +535 -0
  66. package/dist/tools/index.js.map +1 -0
  67. package/dist/utils/config.d.ts +13 -0
  68. package/dist/utils/config.d.ts.map +1 -0
  69. package/dist/utils/config.js +12 -0
  70. package/dist/utils/config.js.map +1 -0
  71. package/dist/utils/paths.d.ts +30 -0
  72. package/dist/utils/paths.d.ts.map +1 -0
  73. package/dist/utils/paths.js +131 -0
  74. package/dist/utils/paths.js.map +1 -0
  75. package/dist/utils/types.d.ts +79 -0
  76. package/dist/utils/types.d.ts.map +1 -0
  77. package/dist/utils/types.js +2 -0
  78. package/dist/utils/types.js.map +1 -0
  79. package/dist/utils/version-manifest.d.ts +10 -0
  80. package/dist/utils/version-manifest.d.ts.map +1 -0
  81. package/dist/utils/version-manifest.js +64 -0
  82. package/dist/utils/version-manifest.js.map +1 -0
  83. package/dist/version-manager.d.ts +11 -0
  84. package/dist/version-manager.d.ts.map +1 -0
  85. package/dist/version-manager.js +29 -0
  86. package/dist/version-manager.js.map +1 -0
  87. package/package.json +64 -0
@@ -0,0 +1,145 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import https from 'https';
4
+ import { MOJANG_VERSION_MANIFEST_URL } from '../utils/config.js';
5
+ import { ensureDir } from '../utils/paths.js';
6
+ const UNOBFUSCATED_JARS = {
7
+ '1.21.11': 'https://piston-data.mojang.com/v1/objects/4509ee9b65f226be61142d37bf05f8d28b03417b/client.jar',
8
+ };
9
+ export function hasUnobfuscatedJar(version) {
10
+ return version in UNOBFUSCATED_JARS;
11
+ }
12
+ async function fetchJson(url) {
13
+ return new Promise((resolve, reject) => {
14
+ https.get(url, { timeout: 30000 }, (response) => {
15
+ if (response.statusCode === 301 || response.statusCode === 302) {
16
+ const redirectUrl = response.headers.location;
17
+ if (redirectUrl) {
18
+ fetchJson(redirectUrl).then(resolve).catch(reject);
19
+ return;
20
+ }
21
+ }
22
+ if (response.statusCode !== 200) {
23
+ reject(new Error(`HTTP ${response.statusCode}: ${url}`));
24
+ return;
25
+ }
26
+ let data = '';
27
+ response.setEncoding('utf8');
28
+ response.on('data', (chunk) => { data += chunk; });
29
+ response.on('end', () => {
30
+ try {
31
+ resolve(JSON.parse(data));
32
+ }
33
+ catch (e) {
34
+ reject(new Error(`Failed to parse JSON: ${e}`));
35
+ }
36
+ });
37
+ }).on('error', reject);
38
+ });
39
+ }
40
+ export async function fetchVersionManifest() {
41
+ return fetchJson(MOJANG_VERSION_MANIFEST_URL);
42
+ }
43
+ export async function fetchVersionInfo(version) {
44
+ const manifest = await fetchVersionManifest();
45
+ const versionEntry = manifest.versions.find(v => v.id === version);
46
+ if (!versionEntry) {
47
+ throw new Error(`Version ${version} not found in manifest`);
48
+ }
49
+ return fetchJson(versionEntry.url);
50
+ }
51
+ export async function downloadFile(url, dest, progressCb, stage = 'download') {
52
+ ensureDir(path.dirname(dest));
53
+ return new Promise((resolve, reject) => {
54
+ const file = fs.createWriteStream(dest);
55
+ let downloaded = 0;
56
+ let total = 0;
57
+ const request = (url) => {
58
+ https.get(url, { timeout: 60000 }, (response) => {
59
+ if (response.statusCode === 301 || response.statusCode === 302) {
60
+ const redirectUrl = response.headers.location;
61
+ if (redirectUrl) {
62
+ file.close();
63
+ fs.unlinkSync(dest);
64
+ request(redirectUrl);
65
+ return;
66
+ }
67
+ }
68
+ if (response.statusCode !== 200) {
69
+ file.close();
70
+ if (fs.existsSync(dest))
71
+ fs.unlinkSync(dest);
72
+ reject(new Error(`HTTP ${response.statusCode}: ${url}`));
73
+ return;
74
+ }
75
+ total = parseInt(response.headers['content-length'] || '0', 10);
76
+ downloaded = 0;
77
+ let lastPercent = 0;
78
+ response.on('data', (chunk) => {
79
+ downloaded += chunk.length;
80
+ if (total > 0 && progressCb) {
81
+ const percent = Math.round((downloaded / total) * 100);
82
+ if (percent >= lastPercent + 5 || percent === 100) {
83
+ lastPercent = percent;
84
+ const mb = (downloaded / 1024 / 1024).toFixed(1);
85
+ const totalMb = (total / 1024 / 1024).toFixed(1);
86
+ progressCb(stage, percent, `Downloading... ${mb}/${totalMb} MB`);
87
+ }
88
+ }
89
+ });
90
+ response.pipe(file);
91
+ file.on('finish', () => {
92
+ file.close();
93
+ resolve();
94
+ });
95
+ }).on('error', (err) => {
96
+ file.close();
97
+ if (fs.existsSync(dest))
98
+ fs.unlinkSync(dest);
99
+ reject(err);
100
+ }).on('timeout', () => {
101
+ file.close();
102
+ if (fs.existsSync(dest))
103
+ fs.unlinkSync(dest);
104
+ reject(new Error('Download timeout'));
105
+ });
106
+ };
107
+ request(url);
108
+ });
109
+ }
110
+ export async function downloadClientJar(version, dest, progressCb) {
111
+ if (progressCb) {
112
+ progressCb('download', 0, 'Downloading client JAR...');
113
+ }
114
+ const unobfuscatedUrl = UNOBFUSCATED_JARS[version];
115
+ if (unobfuscatedUrl) {
116
+ await downloadFile(unobfuscatedUrl, dest, progressCb, 'download');
117
+ if (progressCb) {
118
+ progressCb('download', 100, 'Unobfuscated JAR downloaded.');
119
+ }
120
+ return;
121
+ }
122
+ const versionInfo = await fetchVersionInfo(version);
123
+ await downloadFile(versionInfo.downloads.client.url, dest, progressCb, 'download');
124
+ if (progressCb) {
125
+ progressCb('download', 100, 'Client JAR downloaded.');
126
+ }
127
+ }
128
+ export async function downloadMappings(versionInfo, destDir, progressCb) {
129
+ if (!versionInfo.downloads.client_mappings) {
130
+ if (progressCb) {
131
+ progressCb('download', 100, 'No mappings available (dev snapshot).');
132
+ }
133
+ return false;
134
+ }
135
+ const dest = path.join(destDir, 'client.txt');
136
+ if (progressCb) {
137
+ progressCb('download', 0, 'Downloading ProGuard mappings...');
138
+ }
139
+ await downloadFile(versionInfo.downloads.client_mappings.url, dest, progressCb, 'download');
140
+ if (progressCb) {
141
+ progressCb('download', 100, 'Mappings downloaded.');
142
+ }
143
+ return true;
144
+ }
145
+ //# sourceMappingURL=download.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"download.js","sourceRoot":"","sources":["../../src/decompiler/download.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface DownloadProgress {
2
+ stage: string;
3
+ progress: number;
4
+ message: string;
5
+ }
6
+ export type ProgressCallback = (progress: DownloadProgress) => void;
7
+ //# sourceMappingURL=downloader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downloader.d.ts","sourceRoot":"","sources":["../../src/decompiler/downloader.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,CAAC"}
@@ -0,0 +1,4 @@
1
+ // Placeholder for future Fabric API support
2
+ // Currently not used - DecompilerMC handles everything
3
+ export {};
4
+ //# sourceMappingURL=downloader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"downloader.js","sourceRoot":"","sources":["../../src/decompiler/downloader.ts"],"names":[],"mappings":"AAAA,4CAA4C;AAC5C,uDAAuD"}
@@ -0,0 +1,16 @@
1
+ import { type ProgressCallback } from './tools.js';
2
+ export interface DecompilerStatus {
3
+ hasMinecraftSources: boolean;
4
+ hasFabricApiSources: boolean;
5
+ hasIndex: boolean;
6
+ minecraftVersion: string | null;
7
+ fabricApiVersion: string | null;
8
+ }
9
+ export declare function isDecompiled(version: string): boolean;
10
+ export declare function ensureDecompiled(version: string, progressCb?: ProgressCallback): Promise<{
11
+ minecraftDir: string;
12
+ fabricDir: string | null;
13
+ fabricVersion: string | null;
14
+ }>;
15
+ export declare function getStatus(): DecompilerStatus;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/decompiler/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoB,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAoBrE,MAAM,WAAW,gBAAgB;IAC/B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,mBAAmB,EAAE,OAAO,CAAC;IAC7B,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAMrD;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,MAAM,EACf,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAwC3F;AAED,wBAAgB,SAAS,IAAI,gBAAgB,CA0B5C"}
@@ -0,0 +1,74 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { ensureVineflower } from './tools.js';
4
+ import { downloadClientJar, fetchVersionInfo, downloadMappings } from './download.js';
5
+ import { decompile } from './vineflower.js';
6
+ import { needsRemapping, ensureTinyRemapper, convertProguardToTiny, remapJar, getMappingsPath, getTinyMappingsPath, } from './remapper.js';
7
+ import { getMinecraftSourceDir, getMinecraftJarPath, getObfuscatedJarPath, getIndexDir, ensureHomeDirs, ensureDir, } from '../utils/paths.js';
8
+ export function isDecompiled(version) {
9
+ const sourceDir = getMinecraftSourceDir(version);
10
+ if (!fs.existsSync(sourceDir))
11
+ return false;
12
+ const files = fs.readdirSync(sourceDir, { recursive: true });
13
+ const javaFiles = files.filter(f => f.endsWith('.java'));
14
+ return javaFiles.length > 100;
15
+ }
16
+ export async function ensureDecompiled(version, progressCb) {
17
+ ensureHomeDirs();
18
+ const minecraftDir = getMinecraftSourceDir(version);
19
+ if (!isDecompiled(version)) {
20
+ const vineflowerJar = await ensureVineflower(progressCb);
21
+ const finalJarPath = getMinecraftJarPath(version);
22
+ ensureDir(path.dirname(finalJarPath));
23
+ if (needsRemapping(version)) {
24
+ // Obfuscated version: download, remap, then decompile
25
+ const obfuscatedJarPath = getObfuscatedJarPath(version);
26
+ if (!fs.existsSync(finalJarPath)) {
27
+ await downloadClientJar(version, obfuscatedJarPath, progressCb);
28
+ const versionInfo = await fetchVersionInfo(version);
29
+ const mappingsPath = getMappingsPath(version);
30
+ await downloadMappings(versionInfo, path.dirname(mappingsPath), progressCb);
31
+ await ensureTinyRemapper(progressCb);
32
+ const tinyPath = getTinyMappingsPath(version);
33
+ if (progressCb)
34
+ progressCb('convert', 0, 'Converting ProGuard mappings to Tiny format...');
35
+ convertProguardToTiny(mappingsPath, tinyPath);
36
+ if (progressCb)
37
+ progressCb('convert', 100, 'Mappings converted.');
38
+ await remapJar(obfuscatedJarPath, tinyPath, finalJarPath, progressCb);
39
+ }
40
+ await decompile(vineflowerJar, finalJarPath, minecraftDir, progressCb);
41
+ }
42
+ else {
43
+ // Unobfuscated version: download directly and decompile
44
+ await downloadClientJar(version, finalJarPath, progressCb);
45
+ await decompile(vineflowerJar, finalJarPath, minecraftDir, progressCb);
46
+ }
47
+ }
48
+ return { minecraftDir, fabricDir: null, fabricVersion: null };
49
+ }
50
+ export function getStatus() {
51
+ ensureHomeDirs();
52
+ const indexManifestPath = path.join(getIndexDir(), 'manifest.json');
53
+ let minecraftVersion = null;
54
+ let fabricApiVersion = null;
55
+ if (fs.existsSync(indexManifestPath)) {
56
+ try {
57
+ const manifest = JSON.parse(fs.readFileSync(indexManifestPath, 'utf-8'));
58
+ minecraftVersion = manifest.minecraftVersion;
59
+ fabricApiVersion = manifest.fabricApiVersion;
60
+ }
61
+ catch {
62
+ // Ignore parse errors
63
+ }
64
+ }
65
+ const hasMinecraftSources = minecraftVersion ? isDecompiled(minecraftVersion) : false;
66
+ return {
67
+ hasMinecraftSources,
68
+ hasFabricApiSources: false,
69
+ hasIndex: fs.existsSync(indexManifestPath),
70
+ minecraftVersion,
71
+ fabricApiVersion,
72
+ };
73
+ }
74
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decompiler/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,gBAAgB,EAAyB,MAAM,YAAY,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,QAAQ,EACR,eAAe,EACf,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,qBAAqB,EACrB,mBAAmB,EACnB,oBAAoB,EACpB,WAAW,EACX,cAAc,EACd,SAAS,GACV,MAAM,mBAAmB,CAAC;AAU3B,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,MAAM,SAAS,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAa,CAAC;IACzE,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IACzD,OAAO,SAAS,CAAC,MAAM,GAAG,GAAG,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAe,EACf,UAA6B;IAE7B,cAAc,EAAE,CAAC;IAEjB,MAAM,YAAY,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;IAEpD,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,aAAa,GAAG,MAAM,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,YAAY,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAClD,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QAEtC,IAAI,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,sDAAsD;YACtD,MAAM,iBAAiB,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAExD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;gBACjC,MAAM,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,EAAE,UAAU,CAAC,CAAC;gBAEhE,MAAM,WAAW,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;gBACpD,MAAM,YAAY,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;gBAC9C,MAAM,gBAAgB,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,CAAC;gBAE5E,MAAM,kBAAkB,CAAC,UAAU,CAAC,CAAC;gBAErC,MAAM,QAAQ,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;gBAC9C,IAAI,UAAU;oBAAE,UAAU,CAAC,SAAS,EAAE,CAAC,EAAE,gDAAgD,CAAC,CAAC;gBAC3F,qBAAqB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;gBAC9C,IAAI,UAAU;oBAAE,UAAU,CAAC,SAAS,EAAE,GAAG,EAAE,qBAAqB,CAAC,CAAC;gBAElE,MAAM,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;YACxE,CAAC;YAED,MAAM,SAAS,CAAC,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACN,wDAAwD;YACxD,MAAM,iBAAiB,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;YAC3D,MAAM,SAAS,CAAC,aAAa,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,cAAc,EAAE,CAAC;IAEjB,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,eAAe,CAAC,CAAC;IACpE,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAC3C,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAE3C,IAAI,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACrC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC;YACzE,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,CAAC;YAC7C,gBAAgB,GAAG,QAAQ,CAAC,gBAAgB,CAAC;QAC/C,CAAC;QAAC,MAAM,CAAC;YACP,sBAAsB;QACxB,CAAC;IACH,CAAC;IAED,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAEtF,OAAO;QACL,mBAAmB;QACnB,mBAAmB,EAAE,KAAK;QAC1B,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC;QAC1C,gBAAgB;QAChB,gBAAgB;KACjB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ export type ProgressCallback = (stage: string, progress: number, message: string) => void;
2
+ export declare function getTinyRemapperPath(): string;
3
+ export declare function getMappingsPath(version: string): string;
4
+ export declare function getTinyMappingsPath(version: string): string;
5
+ export declare function needsRemapping(version: string): boolean;
6
+ export declare function ensureTinyRemapper(progressCb?: ProgressCallback): Promise<string>;
7
+ export declare function convertProguardToTiny(proguardPath: string, tinyPath: string): void;
8
+ export declare function remapJar(inputJar: string, tinyMappings: string, outputJar: string, progressCb?: ProgressCallback): Promise<string>;
9
+ //# sourceMappingURL=remapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remapper.d.ts","sourceRoot":"","sources":["../../src/decompiler/remapper.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAK1F,wBAAgB,mBAAmB,IAAI,MAAM,CAE5C;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAOvD;AAED,wBAAsB,kBAAkB,CAAC,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CASvF;AAED,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAkFlF;AAsBD,wBAAsB,QAAQ,CAC5B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,MAAM,CAAC,CA6CjB"}
@@ -0,0 +1,174 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { spawn } from 'child_process';
4
+ import { downloadFile, hasUnobfuscatedJar } from './download.js';
5
+ import { ensureDir, getToolsDir, getMinecraftCacheDir } from '../utils/paths.js';
6
+ const TINY_REMAPPER_VERSION = '0.10.4';
7
+ const TINY_REMAPPER_URL = `https://maven.fabricmc.net/net/fabricmc/tiny-remapper/${TINY_REMAPPER_VERSION}/tiny-remapper-${TINY_REMAPPER_VERSION}-fat.jar`;
8
+ export function getTinyRemapperPath() {
9
+ return path.join(getToolsDir(), 'tiny-remapper-fat.jar');
10
+ }
11
+ export function getMappingsPath(version) {
12
+ return path.join(getMinecraftCacheDir(version), 'jars', 'client.txt');
13
+ }
14
+ export function getTinyMappingsPath(version) {
15
+ return path.join(getMinecraftCacheDir(version), 'jars', 'client_mappings.tiny');
16
+ }
17
+ export function needsRemapping(version) {
18
+ // Dev snapshots (26.x+) are already unobfuscated
19
+ if (/^[2-9][0-9]*\./.test(version))
20
+ return false;
21
+ // Versions with known unobfuscated JARs
22
+ if (hasUnobfuscatedJar(version))
23
+ return false;
24
+ // Everything else needs remapping
25
+ return true;
26
+ }
27
+ export async function ensureTinyRemapper(progressCb) {
28
+ const trPath = getTinyRemapperPath();
29
+ if (fs.existsSync(trPath))
30
+ return trPath;
31
+ if (progressCb)
32
+ progressCb('tiny-remapper', 0, 'Downloading Tiny Remapper...');
33
+ await downloadFile(TINY_REMAPPER_URL, trPath, progressCb, 'tiny-remapper');
34
+ if (progressCb)
35
+ progressCb('tiny-remapper', 100, 'Tiny Remapper downloaded.');
36
+ return trPath;
37
+ }
38
+ export function convertProguardToTiny(proguardPath, tinyPath) {
39
+ if (fs.existsSync(tinyPath))
40
+ return;
41
+ const proguardContent = fs.readFileSync(proguardPath, 'utf-8');
42
+ const lines = proguardContent.split('\n');
43
+ // Maps: obfuscated class name -> { obf, named }
44
+ const classMappings = new Map();
45
+ // Maps: named class -> Map<fieldKey, { obf, named, desc }>
46
+ const fieldMappings = new Map();
47
+ // Maps: named class -> Map<methodKey, { obf, named, desc }>
48
+ const methodMappings = new Map();
49
+ let currentClass = null;
50
+ let currentClassObf = null;
51
+ for (const line of lines) {
52
+ if (line.startsWith('#') || !line.trim())
53
+ continue;
54
+ // Class line: "net.minecraft.Foo$Bar -> abc$a:"
55
+ const classMatch = line.match(/^([\w.$]+) -> ([\w$]+):$/);
56
+ if (classMatch) {
57
+ const named = classMatch[1].replace(/\./g, '/');
58
+ const obf = classMatch[2];
59
+ currentClass = named;
60
+ currentClassObf = obf;
61
+ classMappings.set(obf, { obf, named });
62
+ methodMappings.set(named, new Map());
63
+ fieldMappings.set(named, new Map());
64
+ continue;
65
+ }
66
+ if (!currentClass || !currentClassObf)
67
+ continue;
68
+ // Field line: " boolean isClientSide -> f"
69
+ const fieldMatch = line.match(/^\s+([\w.$<>\[\]]+) ([\w$]+) -> ([\w$]+)$/);
70
+ if (fieldMatch) {
71
+ const desc = convertTypeToDesc(fieldMatch[1]);
72
+ const named = fieldMatch[2];
73
+ const obf = fieldMatch[3];
74
+ fieldMappings.get(currentClass)?.set(named, { obf, named, desc });
75
+ continue;
76
+ }
77
+ // Method line: " 1:1:void <init>(net.minecraft.Foo) -> <init>"
78
+ const methodMatch = line.match(/^\s+(?:\d+:\d+:)?([\w.$<>\[\]]+) ([\w$<>]+)\(([^)]*)\) -> ([\w$<>]+)$/);
79
+ if (methodMatch) {
80
+ const returnType = convertTypeToDesc(methodMatch[1]);
81
+ const named = methodMatch[2];
82
+ const params = methodMatch[3]
83
+ ? methodMatch[3].split(',').map(t => convertTypeToDesc(t.trim())).join('')
84
+ : '';
85
+ const desc = `(${params})${returnType}`;
86
+ const obf = methodMatch[4];
87
+ // Use name+desc as key to handle overloads
88
+ methodMappings.get(currentClass)?.set(`${named}${desc}`, { obf, named, desc });
89
+ }
90
+ }
91
+ // Write Tiny v2 format
92
+ const tinyLines = ['tiny\t2\t0\tobf\tnamed'];
93
+ for (const [obf, { named }] of classMappings) {
94
+ tinyLines.push(`c\t${obf}\t${named}`);
95
+ const classFields = fieldMappings.get(named);
96
+ if (classFields) {
97
+ for (const [, { obf: fObf, named: fNamed, desc: fDesc }] of classFields) {
98
+ tinyLines.push(`\tf\t${fDesc}\t${fObf}\t${fNamed}`);
99
+ }
100
+ }
101
+ const classMethods = methodMappings.get(named);
102
+ if (classMethods) {
103
+ for (const [, { obf: mObf, named: mNamed, desc: mDesc }] of classMethods) {
104
+ tinyLines.push(`\tm\t${mDesc}\t${mObf}\t${mNamed}`);
105
+ }
106
+ }
107
+ }
108
+ ensureDir(path.dirname(tinyPath));
109
+ fs.writeFileSync(tinyPath, tinyLines.join('\n'));
110
+ }
111
+ function convertTypeToDesc(type) {
112
+ type = type.trim();
113
+ if (type.endsWith('[]')) {
114
+ return '[' + convertTypeToDesc(type.slice(0, -2));
115
+ }
116
+ const primitives = {
117
+ 'void': 'V',
118
+ 'boolean': 'Z',
119
+ 'byte': 'B',
120
+ 'char': 'C',
121
+ 'short': 'S',
122
+ 'int': 'I',
123
+ 'long': 'J',
124
+ 'float': 'F',
125
+ 'double': 'D',
126
+ };
127
+ if (primitives[type])
128
+ return primitives[type];
129
+ return `L${type.replace(/\./g, '/')};`;
130
+ }
131
+ export async function remapJar(inputJar, tinyMappings, outputJar, progressCb) {
132
+ if (fs.existsSync(outputJar))
133
+ return outputJar;
134
+ const trPath = getTinyRemapperPath();
135
+ if (!fs.existsSync(trPath)) {
136
+ throw new Error('Tiny Remapper not found. Call ensureTinyRemapper() first.');
137
+ }
138
+ if (progressCb)
139
+ progressCb('remap', 0, 'Remapping jar with official mappings...');
140
+ ensureDir(path.dirname(outputJar));
141
+ return new Promise((resolve, reject) => {
142
+ const args = [
143
+ '-Xmx4g',
144
+ '-jar', trPath,
145
+ inputJar,
146
+ outputJar,
147
+ tinyMappings,
148
+ 'obf',
149
+ 'named',
150
+ '--ignoreConflicts',
151
+ ];
152
+ const proc = spawn('java', args, {
153
+ stdio: ['ignore', 'pipe', 'pipe'],
154
+ });
155
+ let stderr = '';
156
+ let stdout = '';
157
+ proc.stdout.on('data', (data) => { stdout += data.toString(); });
158
+ proc.stderr.on('data', (data) => { stderr += data.toString(); });
159
+ proc.on('close', (code) => {
160
+ if (code === 0) {
161
+ if (progressCb)
162
+ progressCb('remap', 100, 'Jar remapped successfully.');
163
+ resolve(outputJar);
164
+ }
165
+ else {
166
+ reject(new Error(`Tiny Remapper failed with code ${code}: ${stderr || stdout}`));
167
+ }
168
+ });
169
+ proc.on('error', (err) => {
170
+ reject(new Error(`Failed to run Tiny Remapper: ${err.message}`));
171
+ });
172
+ });
173
+ }
174
+ //# sourceMappingURL=remapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remapper.js","sourceRoot":"","sources":["../../src/decompiler/remapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export type ProgressCallback = (stage: string, progress: number, message: string) => void;
2
+ export declare function ensureVineflower(progressCb?: ProgressCallback): Promise<string>;
3
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/decompiler/tools.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAmE1F,wBAAsB,gBAAgB,CAAC,UAAU,CAAC,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBrF"}
@@ -0,0 +1,79 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import https from 'https';
4
+ import { getVineflowerPath, ensureDir } from '../utils/paths.js';
5
+ import { VINEFLOWER_URL } from '../utils/config.js';
6
+ async function downloadFile(url, dest, progressCb, stage = 'download') {
7
+ ensureDir(path.dirname(dest));
8
+ return new Promise((resolve, reject) => {
9
+ let downloaded = 0;
10
+ let total = 0;
11
+ const request = (url, file) => {
12
+ https.get(url, { timeout: 60000 }, (response) => {
13
+ if (response.statusCode === 301 || response.statusCode === 302) {
14
+ const redirectUrl = response.headers.location;
15
+ if (redirectUrl) {
16
+ file.close();
17
+ fs.unlinkSync(dest);
18
+ const newFile = fs.createWriteStream(dest);
19
+ request(redirectUrl, newFile);
20
+ return;
21
+ }
22
+ }
23
+ if (response.statusCode !== 200) {
24
+ file.close();
25
+ if (fs.existsSync(dest))
26
+ fs.unlinkSync(dest);
27
+ reject(new Error(`HTTP ${response.statusCode}: ${url}`));
28
+ return;
29
+ }
30
+ total = parseInt(response.headers['content-length'] || '0', 10);
31
+ downloaded = 0;
32
+ let lastPercent = 0;
33
+ response.on('data', (chunk) => {
34
+ downloaded += chunk.length;
35
+ if (total > 0 && progressCb) {
36
+ const percent = Math.round((downloaded / total) * 100);
37
+ if (percent >= lastPercent + 5 || percent === 100) {
38
+ lastPercent = percent;
39
+ const mb = (downloaded / 1024 / 1024).toFixed(1);
40
+ const totalMb = (total / 1024 / 1024).toFixed(1);
41
+ progressCb(stage, percent, `Downloading... ${mb}/${totalMb} MB`);
42
+ }
43
+ }
44
+ });
45
+ response.pipe(file);
46
+ file.on('finish', () => {
47
+ file.close();
48
+ resolve();
49
+ });
50
+ }).on('error', (err) => {
51
+ file.close();
52
+ if (fs.existsSync(dest))
53
+ fs.unlinkSync(dest);
54
+ reject(err);
55
+ }).on('timeout', () => {
56
+ file.close();
57
+ if (fs.existsSync(dest))
58
+ fs.unlinkSync(dest);
59
+ reject(new Error('Download timeout'));
60
+ });
61
+ };
62
+ request(url, fs.createWriteStream(dest));
63
+ });
64
+ }
65
+ export async function ensureVineflower(progressCb) {
66
+ const vineflowerPath = getVineflowerPath();
67
+ if (fs.existsSync(vineflowerPath)) {
68
+ return vineflowerPath;
69
+ }
70
+ if (progressCb) {
71
+ progressCb('tools', 0, 'Downloading Vineflower...');
72
+ }
73
+ await downloadFile(VINEFLOWER_URL, vineflowerPath, progressCb, 'tools');
74
+ if (progressCb) {
75
+ progressCb('tools', 100, 'Vineflower downloaded.');
76
+ }
77
+ return vineflowerPath;
78
+ }
79
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/decompiler/tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAIpD,KAAK,UAAU,YAAY,CAAC,GAAW,EAAE,IAAY,EAAE,UAA6B,EAAE,QAAgB,UAAU;IAC9G,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAE9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,KAAK,GAAG,CAAC,CAAC;QAEd,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,IAAoB,EAAE,EAAE;YACpD,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC9C,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAC/D,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;oBAC9C,IAAI,WAAW,EAAE,CAAC;wBAChB,IAAI,CAAC,KAAK,EAAE,CAAC;wBACb,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;wBACpB,MAAM,OAAO,GAAG,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;wBAC3C,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;wBAC9B,OAAO;oBACT,CAAC;gBACH,CAAC;gBAED,IAAI,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAChC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACb,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;wBAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;oBAC7C,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC;oBACzD,OAAO;gBACT,CAAC;gBAED,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;gBAChE,UAAU,GAAG,CAAC,CAAC;gBAEf,IAAI,WAAW,GAAG,CAAC,CAAC;gBACpB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;oBAC5B,UAAU,IAAI,KAAK,CAAC,MAAM,CAAC;oBAC3B,IAAI,KAAK,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;wBAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC;wBACvD,IAAI,OAAO,IAAI,WAAW,GAAG,CAAC,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;4BAClD,WAAW,GAAG,OAAO,CAAC;4BACtB,MAAM,EAAE,GAAG,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;4BACjD,MAAM,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;4BACjD,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,OAAO,KAAK,CAAC,CAAC;wBACnE,CAAC;oBACH,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEpB,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;oBACrB,IAAI,CAAC,KAAK,EAAE,CAAC;oBACb,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACrB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACb,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC7C,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBACpB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACb,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;oBAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC7C,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAA6B;IAClE,MAAM,cAAc,GAAG,iBAAiB,EAAE,CAAC;IAE3C,IAAI,EAAE,CAAC,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC;QAClC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,2BAA2B,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,YAAY,CAAC,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAExE,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,wBAAwB,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ProgressCallback } from './tools.js';
2
+ export declare function decompile(vineflowerJar: string, inputJar: string, outputDir: string, progressCb?: ProgressCallback): Promise<void>;
3
+ //# sourceMappingURL=vineflower.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vineflower.d.ts","sourceRoot":"","sources":["../../src/decompiler/vineflower.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnD,wBAAsB,SAAS,CAC7B,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,gBAAgB,GAC5B,OAAO,CAAC,IAAI,CAAC,CAoCf"}
@@ -0,0 +1,37 @@
1
+ import { spawn } from 'child_process';
2
+ import { ensureDir } from '../utils/paths.js';
3
+ export async function decompile(vineflowerJar, inputJar, outputDir, progressCb) {
4
+ ensureDir(outputDir);
5
+ if (progressCb) {
6
+ progressCb('decompile', 0, 'Decompiling with Vineflower (8 threads)...');
7
+ }
8
+ return new Promise((resolve, reject) => {
9
+ const args = [
10
+ '-jar', vineflowerJar,
11
+ '-j=8',
12
+ '--decompile-generics=1',
13
+ '--bytecode-source-mapping=1',
14
+ '--remove-synthetic=1',
15
+ '--log-level=error',
16
+ inputJar,
17
+ outputDir
18
+ ];
19
+ const proc = spawn('java', args, {
20
+ stdio: ['inherit', 'ignore', 'ignore'],
21
+ });
22
+ proc.on('close', (code) => {
23
+ if (code === 0) {
24
+ if (progressCb)
25
+ progressCb('decompile', 100, 'Decompilation complete.');
26
+ resolve();
27
+ }
28
+ else {
29
+ reject(new Error(`Vineflower failed (exit code ${code})`));
30
+ }
31
+ });
32
+ proc.on('error', (err) => {
33
+ reject(new Error(`Failed to run Vineflower: ${err.message}`));
34
+ });
35
+ });
36
+ }
37
+ //# sourceMappingURL=vineflower.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vineflower.js","sourceRoot":"","sources":["../../src/decompiler/vineflower.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,aAAqB,EACrB,QAAgB,EAChB,SAAiB,EACjB,UAA6B;IAE7B,SAAS,CAAC,SAAS,CAAC,CAAC;IAErB,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,WAAW,EAAE,CAAC,EAAE,4CAA4C,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG;YACX,MAAM,EAAE,aAAa;YACrB,MAAM;YACN,wBAAwB;YACxB,6BAA6B;YAC7B,sBAAsB;YACtB,mBAAmB;YACnB,QAAQ;YACR,SAAS;SACV,CAAC;QAEF,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE;YAC/B,KAAK,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC;SACvC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,IAAI,UAAU;oBAAE,UAAU,CAAC,WAAW,EAAE,GAAG,EAAE,yBAAyB,CAAC,CAAC;gBACxE,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC7D,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare function startServer(): Promise<void>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAWA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAuDjD"}