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.
- package/LICENSE +77 -0
- package/README.md +365 -0
- package/dist/callgraph/index.d.ts +14 -0
- package/dist/callgraph/index.d.ts.map +1 -0
- package/dist/callgraph/index.js +201 -0
- package/dist/callgraph/index.js.map +1 -0
- package/dist/callgraph/query.d.ts +20 -0
- package/dist/callgraph/query.d.ts.map +1 -0
- package/dist/callgraph/query.js +95 -0
- package/dist/callgraph/query.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +318 -0
- package/dist/cli.js.map +1 -0
- package/dist/decompiler/download.d.ts +31 -0
- package/dist/decompiler/download.d.ts.map +1 -0
- package/dist/decompiler/download.js +145 -0
- package/dist/decompiler/download.js.map +1 -0
- package/dist/decompiler/downloader.d.ts +7 -0
- package/dist/decompiler/downloader.d.ts.map +1 -0
- package/dist/decompiler/downloader.js +4 -0
- package/dist/decompiler/downloader.js.map +1 -0
- package/dist/decompiler/index.d.ts +16 -0
- package/dist/decompiler/index.d.ts.map +1 -0
- package/dist/decompiler/index.js +74 -0
- package/dist/decompiler/index.js.map +1 -0
- package/dist/decompiler/remapper.d.ts +9 -0
- package/dist/decompiler/remapper.d.ts.map +1 -0
- package/dist/decompiler/remapper.js +174 -0
- package/dist/decompiler/remapper.js.map +1 -0
- package/dist/decompiler/tools.d.ts +3 -0
- package/dist/decompiler/tools.d.ts.map +1 -0
- package/dist/decompiler/tools.js +79 -0
- package/dist/decompiler/tools.js.map +1 -0
- package/dist/decompiler/vineflower.d.ts +3 -0
- package/dist/decompiler/vineflower.d.ts.map +1 -0
- package/dist/decompiler/vineflower.js +37 -0
- package/dist/decompiler/vineflower.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/indexer/index.d.ts +17 -0
- package/dist/indexer/index.d.ts.map +1 -0
- package/dist/indexer/index.js +134 -0
- package/dist/indexer/index.js.map +1 -0
- package/dist/indexer/parser.d.ts +11 -0
- package/dist/indexer/parser.d.ts.map +1 -0
- package/dist/indexer/parser.js +188 -0
- package/dist/indexer/parser.js.map +1 -0
- package/dist/indexer/types.d.ts +14 -0
- package/dist/indexer/types.d.ts.map +1 -0
- package/dist/indexer/types.js +2 -0
- package/dist/indexer/types.js.map +1 -0
- package/dist/storage/index.d.ts +2 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +2 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/source-store.d.ts +43 -0
- package/dist/storage/source-store.d.ts.map +1 -0
- package/dist/storage/source-store.js +279 -0
- package/dist/storage/source-store.js.map +1 -0
- package/dist/tools/index.d.ts +503 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +535 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/utils/config.d.ts +13 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +12 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/paths.d.ts +30 -0
- package/dist/utils/paths.d.ts.map +1 -0
- package/dist/utils/paths.js +131 -0
- package/dist/utils/paths.js.map +1 -0
- package/dist/utils/types.d.ts +79 -0
- package/dist/utils/types.d.ts.map +1 -0
- package/dist/utils/types.js +2 -0
- package/dist/utils/types.js.map +1 -0
- package/dist/utils/version-manifest.d.ts +10 -0
- package/dist/utils/version-manifest.d.ts.map +1 -0
- package/dist/utils/version-manifest.js +64 -0
- package/dist/utils/version-manifest.js.map +1 -0
- package/dist/version-manager.d.ts +11 -0
- package/dist/version-manager.d.ts.map +1 -0
- package/dist/version-manager.js +29 -0
- package/dist/version-manager.js.map +1 -0
- 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 @@
|
|
|
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 @@
|
|
|
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":"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"}
|
|
@@ -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":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAIjF,MAAM,qBAAqB,GAAG,QAAQ,CAAC;AACvC,MAAM,iBAAiB,GAAG,yDAAyD,qBAAqB,kBAAkB,qBAAqB,UAAU,CAAC;AAE1J,MAAM,UAAU,mBAAmB;IACjC,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,uBAAuB,CAAC,CAAC;AAC3D,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,OAAO,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,sBAAsB,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,iDAAiD;IACjD,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACjD,wCAAwC;IACxC,IAAI,kBAAkB,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,kCAAkC;IAClC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,UAA6B;IACpE,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,IAAI,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAEzC,IAAI,UAAU;QAAE,UAAU,CAAC,eAAe,EAAE,CAAC,EAAE,8BAA8B,CAAC,CAAC;IAC/E,MAAM,YAAY,CAAC,iBAAiB,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC,CAAC;IAC3E,IAAI,UAAU;QAAE,UAAU,CAAC,eAAe,EAAE,GAAG,EAAE,2BAA2B,CAAC,CAAC;IAE9E,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,YAAoB,EAAE,QAAgB;IAC1E,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO;IAEpC,MAAM,eAAe,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC/D,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE1C,gDAAgD;IAChD,MAAM,aAAa,GAAG,IAAI,GAAG,EAA0C,CAAC;IACxE,2DAA2D;IAC3D,MAAM,aAAa,GAAG,IAAI,GAAG,EAAqE,CAAC;IACnG,4DAA4D;IAC5D,MAAM,cAAc,GAAG,IAAI,GAAG,EAAqE,CAAC;IAEpG,IAAI,YAAY,GAAkB,IAAI,CAAC;IACvC,IAAI,eAAe,GAAkB,IAAI,CAAC;IAE1C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAEnD,gDAAgD;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC1D,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAChD,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC1B,YAAY,GAAG,KAAK,CAAC;YACrB,eAAe,GAAG,GAAG,CAAC;YACtB,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;YACvC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YACrC,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YACpC,SAAS;QACX,CAAC;QAED,IAAI,CAAC,YAAY,IAAI,CAAC,eAAe;YAAE,SAAS;QAEhD,8CAA8C;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC3E,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,IAAI,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC5B,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC1B,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAClE,SAAS;QACX,CAAC;QAED,kEAAkE;QAClE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,uEAAuE,CAAC,CAAC;QACxG,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,UAAU,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;gBAC3B,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1E,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,IAAI,GAAG,IAAI,MAAM,IAAI,UAAU,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;YAC3B,2CAA2C;YAC3C,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,MAAM,SAAS,GAAa,CAAC,wBAAwB,CAAC,CAAC;IAEvD,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,aAAa,EAAE,CAAC;QAC7C,SAAS,CAAC,IAAI,CAAC,MAAM,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;QAEtC,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,WAAW,EAAE,CAAC;YAChB,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC;gBACxE,SAAS,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;QAED,MAAM,YAAY,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/C,IAAI,YAAY,EAAE,CAAC;YACjB,KAAK,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,IAAI,YAAY,EAAE,CAAC;gBACzE,SAAS,CAAC,IAAI,CAAC,QAAQ,KAAK,KAAK,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAClC,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IACnB,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,OAAO,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,UAAU,GAA2B;QACzC,MAAM,EAAE,GAAG;QACX,SAAS,EAAE,GAAG;QACd,MAAM,EAAE,GAAG;QACX,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,GAAG;QACZ,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,GAAG;QACX,OAAO,EAAE,GAAG;QACZ,QAAQ,EAAE,GAAG;KACd,CAAC;IACF,IAAI,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC9C,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC;AACzC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAgB,EAChB,YAAoB,EACpB,SAAiB,EACjB,UAA6B;IAE7B,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,SAAS,CAAC;IAE/C,MAAM,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACrC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,UAAU;QAAE,UAAU,CAAC,OAAO,EAAE,CAAC,EAAE,yCAAyC,CAAC,CAAC;IAClF,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;IAEnC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,IAAI,GAAG;YACX,QAAQ;YACR,MAAM,EAAE,MAAM;YACd,QAAQ;YACR,SAAS;YACT,YAAY;YACZ,KAAK;YACL,OAAO;YACP,mBAAmB;SACpB,CAAC;QAEF,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,EAAE;YAC/B,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;SAClC,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzE,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,IAAI,UAAU;oBAAE,UAAU,CAAC,OAAO,EAAE,GAAG,EAAE,4BAA4B,CAAC,CAAC;gBACvE,OAAO,CAAC,SAAS,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,kCAAkC,IAAI,KAAK,MAAM,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC;YACnF,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACnE,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -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 @@
|
|
|
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"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|