@bkm016/calcite 0.0.0-stage → 0.2.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 +21 -0
- package/README.md +416 -2
- package/THIRD_PARTY_NOTICES.md +44 -0
- package/dist/accounts.d.ts +46 -0
- package/dist/accounts.js +194 -0
- package/dist/accounts.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +332 -0
- package/dist/cli.js.map +1 -0
- package/dist/client-core.d.ts +66 -0
- package/dist/client-core.js +530 -0
- package/dist/client-core.js.map +1 -0
- package/dist/client.d.ts +127 -0
- package/dist/client.js +185 -0
- package/dist/client.js.map +1 -0
- package/dist/display.d.ts +23 -0
- package/dist/display.js +164 -0
- package/dist/display.js.map +1 -0
- package/dist/hmc.d.ts +53 -0
- package/dist/hmc.js +168 -0
- package/dist/hmc.js.map +1 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/install.d.ts +48 -0
- package/dist/install.js +119 -0
- package/dist/install.js.map +1 -0
- package/dist/java.d.ts +37 -0
- package/dist/java.js +222 -0
- package/dist/java.js.map +1 -0
- package/dist/loaders.d.ts +41 -0
- package/dist/loaders.js +86 -0
- package/dist/loaders.js.map +1 -0
- package/dist/lock.d.ts +13 -0
- package/dist/lock.js +79 -0
- package/dist/lock.js.map +1 -0
- package/dist/log.d.ts +13 -0
- package/dist/log.js +20 -0
- package/dist/log.js.map +1 -0
- package/dist/manager.d.ts +15 -0
- package/dist/manager.js +65 -0
- package/dist/manager.js.map +1 -0
- package/dist/mcp.d.ts +13 -0
- package/dist/mcp.js +377 -0
- package/dist/mcp.js.map +1 -0
- package/dist/mods.d.ts +21 -0
- package/dist/mods.js +135 -0
- package/dist/mods.js.map +1 -0
- package/dist/mojang.d.ts +54 -0
- package/dist/mojang.js +73 -0
- package/dist/mojang.js.map +1 -0
- package/dist/names.d.ts +53 -0
- package/dist/names.js +267 -0
- package/dist/names.js.map +1 -0
- package/dist/net.d.ts +26 -0
- package/dist/net.js +286 -0
- package/dist/net.js.map +1 -0
- package/dist/options.d.ts +14 -0
- package/dist/options.js +50 -0
- package/dist/options.js.map +1 -0
- package/dist/paths.d.ts +29 -0
- package/dist/paths.js +49 -0
- package/dist/paths.js.map +1 -0
- package/dist/probe-server.d.ts +28 -0
- package/dist/probe-server.js +132 -0
- package/dist/probe-server.js.map +1 -0
- package/dist/types.d.ts +235 -0
- package/dist/types.js +25 -0
- package/dist/types.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +11 -0
- package/dist/version.js.map +1 -0
- package/dist/zip.d.ts +5 -0
- package/dist/zip.js +65 -0
- package/dist/zip.js.map +1 -0
- package/package.json +57 -4
- package/vendor/calcite-probe.jar +0 -0
package/dist/mojang.d.ts
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { CalcitePaths } from './paths.js';
|
|
2
|
+
export declare const MANIFEST_URL = "https://piston-meta.mojang.com/mc/game/version_manifest_v2.json";
|
|
3
|
+
export interface ManifestVersion {
|
|
4
|
+
id: string;
|
|
5
|
+
type: 'release' | 'snapshot' | 'old_beta' | 'old_alpha' | string;
|
|
6
|
+
url: string;
|
|
7
|
+
sha1: string;
|
|
8
|
+
releaseTime: string;
|
|
9
|
+
}
|
|
10
|
+
export interface Manifest {
|
|
11
|
+
latest: {
|
|
12
|
+
release: string;
|
|
13
|
+
snapshot: string;
|
|
14
|
+
};
|
|
15
|
+
versions: ManifestVersion[];
|
|
16
|
+
}
|
|
17
|
+
interface Download {
|
|
18
|
+
url: string;
|
|
19
|
+
sha1: string;
|
|
20
|
+
size: number;
|
|
21
|
+
}
|
|
22
|
+
export interface VersionJson {
|
|
23
|
+
id: string;
|
|
24
|
+
type: string;
|
|
25
|
+
releaseTime: string;
|
|
26
|
+
javaVersion?: {
|
|
27
|
+
majorVersion: number;
|
|
28
|
+
component?: string;
|
|
29
|
+
};
|
|
30
|
+
downloads: {
|
|
31
|
+
client: Download;
|
|
32
|
+
client_mappings?: Download;
|
|
33
|
+
server?: Download;
|
|
34
|
+
};
|
|
35
|
+
arguments?: {
|
|
36
|
+
game?: unknown[];
|
|
37
|
+
jvm?: unknown[];
|
|
38
|
+
};
|
|
39
|
+
minecraftArguments?: string;
|
|
40
|
+
}
|
|
41
|
+
export declare function getManifest(paths: CalcitePaths, { refresh }?: {
|
|
42
|
+
refresh?: boolean | undefined;
|
|
43
|
+
}): Promise<Manifest>;
|
|
44
|
+
/** Resolves "latest"/"release", "snapshot"/"latest-snapshot" or an exact id. */
|
|
45
|
+
export declare function resolveVersion(paths: CalcitePaths, spec: string): Promise<ManifestVersion>;
|
|
46
|
+
/** Version JSON, stored where HeadlessMC expects it (minecraft/versions/<id>/<id>.json). */
|
|
47
|
+
export declare function getVersionJson(paths: CalcitePaths, version: ManifestVersion): Promise<VersionJson>;
|
|
48
|
+
/** Downloads the client jar where HeadlessMC expects it. */
|
|
49
|
+
export declare function ensureClientJar(paths: CalcitePaths, json: VersionJson): Promise<string>;
|
|
50
|
+
/** Java major version required by the game (versions before 1.17 default to 8). */
|
|
51
|
+
export declare function requiredJavaMajor(json: VersionJson): number;
|
|
52
|
+
/** Whether the game understands --quickPlayMultiplayer (1.20+); older versions use --server/--port. */
|
|
53
|
+
export declare function supportsQuickPlay(json: VersionJson): boolean;
|
|
54
|
+
export {};
|
package/dist/mojang.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { mkdir, readFile, stat, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { download, httpJson } from './net.js';
|
|
4
|
+
export const MANIFEST_URL = 'https://piston-meta.mojang.com/mc/game/version_manifest_v2.json';
|
|
5
|
+
const MANIFEST_TTL_MS = 10 * 60_000;
|
|
6
|
+
export async function getManifest(paths, { refresh = false } = {}) {
|
|
7
|
+
const file = join(paths.meta, 'version_manifest_v2.json');
|
|
8
|
+
if (!refresh) {
|
|
9
|
+
try {
|
|
10
|
+
const info = await stat(file);
|
|
11
|
+
if (Date.now() - info.mtimeMs < MANIFEST_TTL_MS) {
|
|
12
|
+
return JSON.parse(await readFile(file, 'utf8'));
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// fetch below
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
try {
|
|
20
|
+
const manifest = await httpJson(MANIFEST_URL);
|
|
21
|
+
await mkdir(paths.meta, { recursive: true });
|
|
22
|
+
await writeFile(file, JSON.stringify(manifest));
|
|
23
|
+
return manifest;
|
|
24
|
+
}
|
|
25
|
+
catch (err) {
|
|
26
|
+
// offline: fall back to a stale cache
|
|
27
|
+
try {
|
|
28
|
+
return JSON.parse(await readFile(file, 'utf8'));
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
throw err;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/** Resolves "latest"/"release", "snapshot"/"latest-snapshot" or an exact id. */
|
|
36
|
+
export async function resolveVersion(paths, spec) {
|
|
37
|
+
const manifest = await getManifest(paths);
|
|
38
|
+
let id = spec;
|
|
39
|
+
if (spec === 'latest' || spec === 'release' || spec === 'latest-release')
|
|
40
|
+
id = manifest.latest.release;
|
|
41
|
+
if (spec === 'snapshot' || spec === 'latest-snapshot')
|
|
42
|
+
id = manifest.latest.snapshot;
|
|
43
|
+
const found = manifest.versions.find((v) => v.id === id);
|
|
44
|
+
if (!found) {
|
|
45
|
+
const refreshed = await getManifest(paths, { refresh: true });
|
|
46
|
+
const again = refreshed.versions.find((v) => v.id === id);
|
|
47
|
+
if (!again)
|
|
48
|
+
throw new Error(`Unknown Minecraft version "${spec}"`);
|
|
49
|
+
return again;
|
|
50
|
+
}
|
|
51
|
+
return found;
|
|
52
|
+
}
|
|
53
|
+
/** Version JSON, stored where HeadlessMC expects it (minecraft/versions/<id>/<id>.json). */
|
|
54
|
+
export async function getVersionJson(paths, version) {
|
|
55
|
+
const file = join(paths.minecraft, 'versions', version.id, `${version.id}.json`);
|
|
56
|
+
await download(version.url, file, { sha1: version.sha1 });
|
|
57
|
+
return JSON.parse(await readFile(file, 'utf8'));
|
|
58
|
+
}
|
|
59
|
+
/** Downloads the client jar where HeadlessMC expects it. */
|
|
60
|
+
export async function ensureClientJar(paths, json) {
|
|
61
|
+
const file = join(paths.minecraft, 'versions', json.id, `${json.id}.jar`);
|
|
62
|
+
await download(json.downloads.client.url, file, { sha1: json.downloads.client.sha1 });
|
|
63
|
+
return file;
|
|
64
|
+
}
|
|
65
|
+
/** Java major version required by the game (versions before 1.17 default to 8). */
|
|
66
|
+
export function requiredJavaMajor(json) {
|
|
67
|
+
return json.javaVersion?.majorVersion ?? 8;
|
|
68
|
+
}
|
|
69
|
+
/** Whether the game understands --quickPlayMultiplayer (1.20+); older versions use --server/--port. */
|
|
70
|
+
export function supportsQuickPlay(json) {
|
|
71
|
+
return JSON.stringify(json.arguments?.game ?? []).includes('quickPlayMultiplayer');
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=mojang.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mojang.js","sourceRoot":"","sources":["../src/mojang.ts"],"names":[],"mappings":"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"}
|
package/dist/names.d.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type InstalledLoader } from './loaders.js';
|
|
2
|
+
import type { VersionJson } from './mojang.js';
|
|
3
|
+
import type { CalcitePaths } from './paths.js';
|
|
4
|
+
/** Probe name candidate meaning "the game runs with official (Mojang) names". */
|
|
5
|
+
export declare const OFFICIAL = "official";
|
|
6
|
+
/**
|
|
7
|
+
* How the probe finds game classes: candidate name tables (mapping files or {@link OFFICIAL}), tried in order by the
|
|
8
|
+
* probe until one matches the running game; or unsupported (no names known for this game).
|
|
9
|
+
*/
|
|
10
|
+
export type NameMode = {
|
|
11
|
+
kind: 'probe';
|
|
12
|
+
candidates: string[];
|
|
13
|
+
} | {
|
|
14
|
+
kind: 'unsupported';
|
|
15
|
+
reason: string;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Name candidates for the probe. Vanilla and loaders running on Mojang names use Mojang's mappings (or official
|
|
19
|
+
* names on unobfuscated releases such as 26.1+); Fabric uses intermediary names and Forge/NeoForge before 1.20.5/6
|
|
20
|
+
* use SRG member names, both composed with Mojang's mappings.
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveNames(paths: CalcitePaths, json: VersionJson, clientJar: string, loader?: InstalledLoader): Promise<NameMode>;
|
|
23
|
+
/** Names of obfuscated members in some namespace, keyed by obfuscated owner (internal name), name and descriptor. */
|
|
24
|
+
export interface TargetNames {
|
|
25
|
+
classes: Map<string, string>;
|
|
26
|
+
/** "owner.name:desc" and "owner.name" */
|
|
27
|
+
fields: Map<string, string>;
|
|
28
|
+
/** "owner.name(desc)" */
|
|
29
|
+
methods: Map<string, string>;
|
|
30
|
+
}
|
|
31
|
+
/** Fabric tiny v1 or v2 mappings, "official" → "intermediary". */
|
|
32
|
+
export declare function parseTiny(text: string): TargetNames;
|
|
33
|
+
/** MCPConfig/NeoForm tsrg (v1) or tsrg2 mappings, obfuscated → SRG. */
|
|
34
|
+
export declare function parseTsrg(text: string): TargetNames;
|
|
35
|
+
interface MojangClass {
|
|
36
|
+
named: string;
|
|
37
|
+
obf: string;
|
|
38
|
+
members: {
|
|
39
|
+
text: string;
|
|
40
|
+
name: string;
|
|
41
|
+
type: string;
|
|
42
|
+
params?: string[];
|
|
43
|
+
obf: string;
|
|
44
|
+
}[];
|
|
45
|
+
}
|
|
46
|
+
export declare function parseMojang(text: string): MojangClass[];
|
|
47
|
+
/**
|
|
48
|
+
* Composes Mojang's mappings (named → obfuscated) with {@code target} (obfuscated → runtime) into a ProGuard style
|
|
49
|
+
* file named → runtime, which the probe reads like Mojang's own. Members the target does not rename keep their
|
|
50
|
+
* name when it is not obfuscated; other unmapped members are left out.
|
|
51
|
+
*/
|
|
52
|
+
export declare function compose(mojang: MojangClass[], target: TargetNames, classRuntime: (cls: MojangClass) => string | undefined): string;
|
|
53
|
+
export {};
|
package/dist/names.js
ADDED
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { loaderGameArg } from './loaders.js';
|
|
4
|
+
import { download } from './net.js';
|
|
5
|
+
import { readZipEntry, zipContains } from './zip.js';
|
|
6
|
+
/** Probe name candidate meaning "the game runs with official (Mojang) names". */
|
|
7
|
+
export const OFFICIAL = 'official';
|
|
8
|
+
/** Bumped when the composed mapping format changes, so cached files are rebuilt. */
|
|
9
|
+
const COMPOSE_FORMAT = 1;
|
|
10
|
+
// releases where the loaders changed the runtime names of Minecraft
|
|
11
|
+
const FORGE_MOJANG_CLASSES = Date.parse('2021-06-08T00:00:00Z'); // 1.17: Mojang class names + SRG members
|
|
12
|
+
const NEOFORGE_MOJMAP = Date.parse('2024-04-23T00:00:00Z'); // 1.20.5: NeoForge runs on Mojang names
|
|
13
|
+
const FORGE_MOJMAP = Date.parse('2024-04-29T00:00:00Z'); // 1.20.6: Forge runs on Mojang names
|
|
14
|
+
/**
|
|
15
|
+
* Name candidates for the probe. Vanilla and loaders running on Mojang names use Mojang's mappings (or official
|
|
16
|
+
* names on unobfuscated releases such as 26.1+); Fabric uses intermediary names and Forge/NeoForge before 1.20.5/6
|
|
17
|
+
* use SRG member names, both composed with Mojang's mappings.
|
|
18
|
+
*/
|
|
19
|
+
export async function resolveNames(paths, json, clientJar, loader) {
|
|
20
|
+
if (!json.downloads.client_mappings) {
|
|
21
|
+
if (await zipContains(clientJar, 'net/minecraft/client/Minecraft.class'))
|
|
22
|
+
return { kind: 'probe', candidates: [OFFICIAL] };
|
|
23
|
+
return { kind: 'unsupported', reason: `Minecraft ${json.id} is obfuscated and Mojang published no mappings for it (needs 1.14.4+)` };
|
|
24
|
+
}
|
|
25
|
+
const mojang = join(paths.mappings, `${json.id}-client.txt`);
|
|
26
|
+
await download(json.downloads.client_mappings.url, mojang, { sha1: json.downloads.client_mappings.sha1 });
|
|
27
|
+
if (!loader)
|
|
28
|
+
return { kind: 'probe', candidates: [mojang] };
|
|
29
|
+
const released = Date.parse(json.releaseTime);
|
|
30
|
+
if (loader.kind === 'fabric') {
|
|
31
|
+
return { kind: 'probe', candidates: [await composeFabric(paths, json.id, mojang, loader)] };
|
|
32
|
+
}
|
|
33
|
+
if ((loader.kind === 'forge' && released >= FORGE_MOJMAP) || (loader.kind === 'neoforge' && released >= NEOFORGE_MOJMAP)) {
|
|
34
|
+
return { kind: 'probe', candidates: [OFFICIAL] };
|
|
35
|
+
}
|
|
36
|
+
if (loader.kind === 'forge' && released < FORGE_MOJANG_CLASSES) {
|
|
37
|
+
return { kind: 'unsupported', reason: `Forge for Minecraft ${json.id} runs on MCP names, which the probe does not support (needs 1.17+)` };
|
|
38
|
+
}
|
|
39
|
+
// the exact switch to Mojang names is not tied to a version number for every build: let the probe check both
|
|
40
|
+
const srg = await composeSrg(paths, json.id, mojang, loader);
|
|
41
|
+
return { kind: 'probe', candidates: srg ? [srg, OFFICIAL] : [OFFICIAL] };
|
|
42
|
+
}
|
|
43
|
+
function emptyTarget() {
|
|
44
|
+
return { classes: new Map(), fields: new Map(), methods: new Map() };
|
|
45
|
+
}
|
|
46
|
+
function addField(t, owner, name, desc, value) {
|
|
47
|
+
if (desc)
|
|
48
|
+
t.fields.set(`${owner}.${name}:${desc}`, value);
|
|
49
|
+
const plain = `${owner}.${name}`;
|
|
50
|
+
// obfuscated field names repeat with different types; a bare key is only usable when unique
|
|
51
|
+
if (t.fields.has(plain) && t.fields.get(plain) !== value)
|
|
52
|
+
t.fields.set(plain, '');
|
|
53
|
+
else
|
|
54
|
+
t.fields.set(plain, value);
|
|
55
|
+
}
|
|
56
|
+
/** Fabric tiny v1 or v2 mappings, "official" → "intermediary". */
|
|
57
|
+
export function parseTiny(text) {
|
|
58
|
+
const t = emptyTarget();
|
|
59
|
+
const lines = text.split(/\r?\n/);
|
|
60
|
+
const header = lines[0]?.split('\t') ?? [];
|
|
61
|
+
if (header[0] === 'v1') {
|
|
62
|
+
const from = header.indexOf('official') - 1;
|
|
63
|
+
const to = header.indexOf('intermediary') - 1;
|
|
64
|
+
if (from < 0 || to < 0)
|
|
65
|
+
throw new Error('tiny v1 mappings without official/intermediary namespaces');
|
|
66
|
+
for (const line of lines.slice(1)) {
|
|
67
|
+
const p = line.split('\t');
|
|
68
|
+
if (p[0] === 'CLASS')
|
|
69
|
+
t.classes.set(p[1 + from], p[1 + to]);
|
|
70
|
+
else if (p[0] === 'FIELD')
|
|
71
|
+
addField(t, p[1], p[3 + from], p[2], p[3 + to]);
|
|
72
|
+
else if (p[0] === 'METHOD')
|
|
73
|
+
t.methods.set(`${p[1]}.${p[3 + from]}${p[2]}`, p[3 + to]);
|
|
74
|
+
}
|
|
75
|
+
return t;
|
|
76
|
+
}
|
|
77
|
+
if (header[0] === 'tiny' && header[1] === '2') {
|
|
78
|
+
const ns = header.slice(3);
|
|
79
|
+
const from = ns.indexOf('official');
|
|
80
|
+
const to = ns.indexOf('intermediary');
|
|
81
|
+
if (from < 0 || to < 0)
|
|
82
|
+
throw new Error('tiny v2 mappings without official/intermediary namespaces');
|
|
83
|
+
let owner = '';
|
|
84
|
+
for (const line of lines.slice(1)) {
|
|
85
|
+
if (line.startsWith('c\t')) {
|
|
86
|
+
const p = line.split('\t').slice(1);
|
|
87
|
+
owner = p[from];
|
|
88
|
+
t.classes.set(owner, p[to]);
|
|
89
|
+
}
|
|
90
|
+
else if (line.startsWith('\tf\t') || line.startsWith('\tm\t')) {
|
|
91
|
+
const p = line.split('\t').slice(2);
|
|
92
|
+
const desc = p[0]; // descriptors use the first namespace
|
|
93
|
+
const names = p.slice(1);
|
|
94
|
+
if (from !== 0)
|
|
95
|
+
continue; // descriptors would need remapping; Fabric's files always start with official
|
|
96
|
+
if (line[1] === 'f')
|
|
97
|
+
addField(t, owner, names[from], desc, names[to]);
|
|
98
|
+
else
|
|
99
|
+
t.methods.set(`${owner}.${names[from]}${desc}`, names[to]);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return t;
|
|
103
|
+
}
|
|
104
|
+
throw new Error(`Unknown tiny mappings header: ${lines[0]}`);
|
|
105
|
+
}
|
|
106
|
+
/** MCPConfig/NeoForm tsrg (v1) or tsrg2 mappings, obfuscated → SRG. */
|
|
107
|
+
export function parseTsrg(text) {
|
|
108
|
+
const t = emptyTarget();
|
|
109
|
+
let owner = '';
|
|
110
|
+
for (const line of text.split(/\r?\n/)) {
|
|
111
|
+
if (!line || line.startsWith('tsrg2 ') || line.startsWith('\t\t'))
|
|
112
|
+
continue;
|
|
113
|
+
const p = line.trim().split(' ');
|
|
114
|
+
if (line[0] !== '\t') {
|
|
115
|
+
owner = p[0];
|
|
116
|
+
t.classes.set(owner, p[1]);
|
|
117
|
+
}
|
|
118
|
+
else if (p[1]?.startsWith('(')) {
|
|
119
|
+
t.methods.set(`${owner}.${p[0]}${p[1]}`, p[2]);
|
|
120
|
+
}
|
|
121
|
+
else if (p.length >= 2) {
|
|
122
|
+
addField(t, owner, p[0], undefined, p[1]);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
return t;
|
|
126
|
+
}
|
|
127
|
+
// ---------------------------------------------------------------- composition
|
|
128
|
+
const PRIMITIVES = { boolean: 'Z', byte: 'B', char: 'C', short: 'S', int: 'I', long: 'J', float: 'F', double: 'D', void: 'V' };
|
|
129
|
+
export function parseMojang(text) {
|
|
130
|
+
const classes = [];
|
|
131
|
+
let current;
|
|
132
|
+
for (const line of text.split(/\r?\n/)) {
|
|
133
|
+
if (!line || line[0] === '#')
|
|
134
|
+
continue;
|
|
135
|
+
if (line[0] !== ' ') {
|
|
136
|
+
const m = /^(\S+) -> (\S+):$/.exec(line);
|
|
137
|
+
current = m ? { named: m[1], obf: m[2], members: [] } : undefined;
|
|
138
|
+
if (current)
|
|
139
|
+
classes.push(current);
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const m = /^\s+(?:\d+:\d+:)?(\S+) ([^\s(]+)(?:\((.*)\))?(?::\d+:\d+)? -> (\S+)$/.exec(line);
|
|
143
|
+
if (!current || !m)
|
|
144
|
+
continue;
|
|
145
|
+
const [, type, name, params, obf] = m;
|
|
146
|
+
current.members.push({
|
|
147
|
+
text: params === undefined ? `${type} ${name}` : `${type} ${name}(${params})`,
|
|
148
|
+
name,
|
|
149
|
+
type,
|
|
150
|
+
params: params === undefined ? undefined : params ? params.split(',') : [],
|
|
151
|
+
obf,
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
return classes;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Composes Mojang's mappings (named → obfuscated) with {@code target} (obfuscated → runtime) into a ProGuard style
|
|
158
|
+
* file named → runtime, which the probe reads like Mojang's own. Members the target does not rename keep their
|
|
159
|
+
* name when it is not obfuscated; other unmapped members are left out.
|
|
160
|
+
*/
|
|
161
|
+
export function compose(mojang, target, classRuntime) {
|
|
162
|
+
const obfOf = new Map(mojang.map((c) => [c.named, c.obf]));
|
|
163
|
+
const desc = (type) => {
|
|
164
|
+
let dims = 0;
|
|
165
|
+
while (type.endsWith('[]')) {
|
|
166
|
+
dims++;
|
|
167
|
+
type = type.slice(0, -2);
|
|
168
|
+
}
|
|
169
|
+
const base = PRIMITIVES[type] ?? `L${(obfOf.get(type) ?? type).replace(/\./g, '/')};`;
|
|
170
|
+
return '['.repeat(dims) + base;
|
|
171
|
+
};
|
|
172
|
+
const out = [];
|
|
173
|
+
for (const cls of mojang) {
|
|
174
|
+
const runtime = classRuntime(cls);
|
|
175
|
+
if (!runtime)
|
|
176
|
+
continue;
|
|
177
|
+
out.push(`${cls.named} -> ${runtime}:`);
|
|
178
|
+
const owner = cls.obf.replace(/\./g, '/');
|
|
179
|
+
for (const m of cls.members) {
|
|
180
|
+
if (m.name === '<init>' || m.name === '<clinit>')
|
|
181
|
+
continue;
|
|
182
|
+
let mapped;
|
|
183
|
+
if (m.params === undefined) {
|
|
184
|
+
mapped = target.fields.get(`${owner}.${m.obf}:${desc(m.type)}`) || target.fields.get(`${owner}.${m.obf}`) || undefined;
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
mapped = target.methods.get(`${owner}.${m.obf}(${m.params.map(desc).join('')})${desc(m.type)}`);
|
|
188
|
+
}
|
|
189
|
+
if (!mapped && m.obf === m.name)
|
|
190
|
+
mapped = m.name;
|
|
191
|
+
if (mapped)
|
|
192
|
+
out.push(` ${m.text} -> ${mapped}`);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
return `${out.join('\n')}\n`;
|
|
196
|
+
}
|
|
197
|
+
async function exists(file) {
|
|
198
|
+
try {
|
|
199
|
+
await stat(file);
|
|
200
|
+
return true;
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
async function writeComposed(file, build) {
|
|
207
|
+
if (await exists(file))
|
|
208
|
+
return file;
|
|
209
|
+
const text = await build();
|
|
210
|
+
await mkdir(join(file, '..'), { recursive: true });
|
|
211
|
+
const tmp = `${file}.${process.pid}.tmp`;
|
|
212
|
+
await writeFile(tmp, text);
|
|
213
|
+
await rename(tmp, file).catch(async (err) => {
|
|
214
|
+
await rm(tmp, { force: true });
|
|
215
|
+
if (!(await exists(file)))
|
|
216
|
+
throw err;
|
|
217
|
+
});
|
|
218
|
+
return file;
|
|
219
|
+
}
|
|
220
|
+
function mavenPath(group, artifact, version, ext = 'jar') {
|
|
221
|
+
return `${group.replace(/\./g, '/')}/${artifact}/${version}/${artifact}-${version}.${ext}`;
|
|
222
|
+
}
|
|
223
|
+
/** A library from the shared libraries directory, downloaded from {@code repo} when HeadlessMC did not fetch it. */
|
|
224
|
+
async function library(paths, repo, relative) {
|
|
225
|
+
const file = join(paths.minecraft, 'libraries', ...relative.split('/'));
|
|
226
|
+
if (!(await exists(file)))
|
|
227
|
+
await download(`${repo}/${relative}`, file);
|
|
228
|
+
return file;
|
|
229
|
+
}
|
|
230
|
+
async function composeFabric(paths, mc, mojangFile, loader) {
|
|
231
|
+
const lib = loader.json.libraries?.find((l) => l.name.startsWith('net.fabricmc:intermediary:'));
|
|
232
|
+
const version = lib?.name.split(':')[2] ?? mc;
|
|
233
|
+
const file = join(paths.mappings, `${mc}-intermediary-${version}-c${COMPOSE_FORMAT}.txt`);
|
|
234
|
+
return writeComposed(file, async () => {
|
|
235
|
+
const jar = await library(paths, 'https://maven.fabricmc.net', mavenPath('net.fabricmc', 'intermediary', version));
|
|
236
|
+
const tiny = await readZipEntry(jar, 'mappings/mappings.tiny');
|
|
237
|
+
if (!tiny)
|
|
238
|
+
throw new Error(`${jar} contains no mappings/mappings.tiny`);
|
|
239
|
+
const target = parseTiny(tiny.toString('utf8'));
|
|
240
|
+
return compose(parseMojang(await readFile(mojangFile, 'utf8')), target, (c) => target.classes.get(c.obf.replace(/\./g, '/'))?.replace(/\//g, '.') ?? (c.obf === c.named ? c.named : undefined));
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
/** Mojang class names with SRG member names (Forge 1.17-1.20.5, NeoForge 1.20.1-1.20.4); null when unknown. */
|
|
244
|
+
async function composeSrg(paths, mc, mojangFile, loader) {
|
|
245
|
+
const mcp = loaderGameArg(loader.json, '--fml.mcpVersion');
|
|
246
|
+
const neoForm = loaderGameArg(loader.json, '--fml.neoFormVersion');
|
|
247
|
+
const source = neoForm
|
|
248
|
+
? { repo: 'https://maven.neoforged.net/releases', path: mavenPath('net.neoforged', 'neoform', `${mc}-${neoForm}`, 'zip'), tag: `neoform-${neoForm}` }
|
|
249
|
+
: mcp
|
|
250
|
+
? { repo: 'https://maven.minecraftforge.net', path: mavenPath('de.oceanlabs.mcp', 'mcp_config', `${mc}-${mcp}`, 'zip'), tag: `mcp-${mcp}` }
|
|
251
|
+
: null;
|
|
252
|
+
if (!source)
|
|
253
|
+
return null;
|
|
254
|
+
const file = join(paths.mappings, `${mc}-srg-${source.tag}-c${COMPOSE_FORMAT}.txt`);
|
|
255
|
+
return writeComposed(file, async () => {
|
|
256
|
+
const zip = await library(paths, source.repo, source.path);
|
|
257
|
+
let entry = 'config/joined.tsrg';
|
|
258
|
+
const config = await readZipEntry(zip, 'config.json');
|
|
259
|
+
if (config)
|
|
260
|
+
entry = JSON.parse(config.toString('utf8')).data?.mappings ?? entry;
|
|
261
|
+
const tsrg = await readZipEntry(zip, entry);
|
|
262
|
+
if (!tsrg)
|
|
263
|
+
throw new Error(`${zip} contains no ${entry}`);
|
|
264
|
+
return compose(parseMojang(await readFile(mojangFile, 'utf8')), parseTsrg(tsrg.toString('utf8')), (c) => c.named);
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=names.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"names.js","sourceRoot":"","sources":["../src/names.ts"],"names":[],"mappings":"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"}
|
package/dist/net.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export declare const USER_AGENT = "calcite (+https://github.com/bkm016/Calcite)";
|
|
2
|
+
export declare class HttpError extends Error {
|
|
3
|
+
readonly url: string;
|
|
4
|
+
readonly status: number;
|
|
5
|
+
constructor(url: string, status: number);
|
|
6
|
+
}
|
|
7
|
+
/** NO_PROXY matching: "*", exact hosts, ".suffix"/"suffix" domains, host:port and IPv4 CIDR. */
|
|
8
|
+
export declare function bypassProxy(target: URL, noProxy?: string): boolean;
|
|
9
|
+
/** The proxy to use for {@code target}, honouring HTTPS_PROXY / HTTP_PROXY / NO_PROXY (any case). */
|
|
10
|
+
export declare function proxyFor(target: URL): URL | undefined;
|
|
11
|
+
/**
|
|
12
|
+
* Java system properties that route a JVM (HeadlessMC, the game) through the HTTPS_PROXY / HTTP_PROXY / NO_PROXY
|
|
13
|
+
* proxies; Java ignores those variables. Proxy credentials are not supported by Java's CONNECT handling.
|
|
14
|
+
*/
|
|
15
|
+
export declare function javaProxyProps(): Record<string, string>;
|
|
16
|
+
export declare function httpText(url: string): Promise<string>;
|
|
17
|
+
export declare function httpJson<T>(url: string): Promise<T>;
|
|
18
|
+
export declare function hashFile(file: string, algorithm: 'sha1' | 'sha256'): Promise<string>;
|
|
19
|
+
export interface DownloadOptions {
|
|
20
|
+
sha1?: string;
|
|
21
|
+
sha256?: string;
|
|
22
|
+
/** Skip the download when the file exists and (if a hash is given) matches. */
|
|
23
|
+
reuse?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/** Downloads to {@code dest} atomically (temp file + rename) and verifies the hash when given. */
|
|
26
|
+
export declare function download(url: string, dest: string, opts?: DownloadOptions): Promise<string>;
|