@creeperhost/modlens-mcp 1.6.0 → 1.6.4

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 (135) hide show
  1. package/README.md +950 -938
  2. package/dist/cli.js +267 -267
  3. package/dist/db-backend.d.ts +14 -1
  4. package/dist/db-backend.d.ts.map +1 -1
  5. package/dist/db-backend.js +13 -0
  6. package/dist/db-backend.js.map +1 -1
  7. package/dist/generated/sqlite/internal/class.d.ts.map +1 -1
  8. package/dist/generated/sqlite/internal/class.js +5 -4
  9. package/dist/generated/sqlite/internal/class.js.map +1 -1
  10. package/dist/launcher.js +4 -1
  11. package/dist/launcher.js.map +1 -1
  12. package/dist/platform.d.ts.map +1 -1
  13. package/dist/platform.js +6 -2
  14. package/dist/platform.js.map +1 -1
  15. package/dist/repositories/embeddings-sqlite.js +21 -21
  16. package/dist/repositories/embeddings.js +28 -28
  17. package/dist/repositories/mod.d.ts +7 -0
  18. package/dist/repositories/mod.d.ts.map +1 -1
  19. package/dist/repositories/mod.js +56 -15
  20. package/dist/repositories/mod.js.map +1 -1
  21. package/dist/search-adapter.js +51 -51
  22. package/dist/security.d.ts +9 -0
  23. package/dist/security.d.ts.map +1 -1
  24. package/dist/security.js +19 -0
  25. package/dist/security.js.map +1 -1
  26. package/dist/server.js +1248 -1217
  27. package/dist/server.js.map +1 -1
  28. package/dist/tools/compat-check.js +9 -9
  29. package/dist/tools/docs.d.ts.map +1 -1
  30. package/dist/tools/docs.js +4 -3
  31. package/dist/tools/docs.js.map +1 -1
  32. package/dist/tools/embed-registry.js +9 -9
  33. package/dist/tools/graphify.js +14 -14
  34. package/dist/tools/ingest.d.ts.map +1 -1
  35. package/dist/tools/ingest.js +4 -3
  36. package/dist/tools/ingest.js.map +1 -1
  37. package/dist/tools/kubejs.d.ts.map +1 -1
  38. package/dist/tools/kubejs.js +2 -0
  39. package/dist/tools/kubejs.js.map +1 -1
  40. package/dist/tools/mappings.d.ts.map +1 -1
  41. package/dist/tools/mappings.js +2 -1
  42. package/dist/tools/mappings.js.map +1 -1
  43. package/dist/tools/mc-fts.js +2 -2
  44. package/dist/tools/mcmeta.js +2 -2
  45. package/dist/tools/mcmeta.js.map +1 -1
  46. package/dist/tools/mixin-scan.d.ts +1 -1
  47. package/dist/tools/mixin-scan.d.ts.map +1 -1
  48. package/dist/tools/mixin-scan.js +29 -35
  49. package/dist/tools/mixin-scan.js.map +1 -1
  50. package/dist/tools/mod-data.js +2 -2
  51. package/dist/tools/mod-data.js.map +1 -1
  52. package/dist/tools/modpacks-ch.js +2 -2
  53. package/dist/tools/modpacks-ch.js.map +1 -1
  54. package/dist/tools/packtools.js +4 -4
  55. package/dist/tools/packtools.js.map +1 -1
  56. package/dist/tools/primers.d.ts.map +1 -1
  57. package/dist/tools/primers.js +4 -3
  58. package/dist/tools/primers.js.map +1 -1
  59. package/dist/tools/reports.d.ts.map +1 -1
  60. package/dist/tools/reports.js +8 -4
  61. package/dist/tools/reports.js.map +1 -1
  62. package/dist/tools/vanilla-data.js +2 -2
  63. package/dist/tools/vanilla-data.js.map +1 -1
  64. package/dist/tools/version-diff.js +3 -3
  65. package/package.json +70 -62
  66. package/prisma/backends/schema.sqlite.prisma +215 -215
  67. package/prisma/schema.prisma +303 -303
  68. package/scripts/backup.mjs +151 -151
  69. package/scripts/check-atm10.mjs +27 -27
  70. package/scripts/check-sync.mjs +13 -13
  71. package/scripts/create-fts-index.mjs +50 -50
  72. package/scripts/enable-pgvector.mjs +90 -90
  73. package/scripts/enable-sqlite-vec.mjs +158 -158
  74. package/scripts/migrate-backend.mjs +188 -188
  75. package/scripts/migrate-embed-provenance.mjs +80 -80
  76. package/scripts/migrate-metadata-source.mjs +62 -62
  77. package/scripts/migrate-mod-source-files.mjs +67 -67
  78. package/scripts/post-update.mjs +77 -77
  79. package/scripts/verify-atm10.mjs +63 -63
  80. package/dist/access-flags.test.d.ts +0 -2
  81. package/dist/access-flags.test.d.ts.map +0 -1
  82. package/dist/access-flags.test.js +0 -189
  83. package/dist/access-flags.test.js.map +0 -1
  84. package/dist/fetch-utils.test.d.ts +0 -2
  85. package/dist/fetch-utils.test.d.ts.map +0 -1
  86. package/dist/fetch-utils.test.js +0 -133
  87. package/dist/fetch-utils.test.js.map +0 -1
  88. package/dist/mappings.test.d.ts +0 -2
  89. package/dist/mappings.test.d.ts.map +0 -1
  90. package/dist/mappings.test.js +0 -161
  91. package/dist/mappings.test.js.map +0 -1
  92. package/dist/processor.test.d.ts +0 -2
  93. package/dist/processor.test.d.ts.map +0 -1
  94. package/dist/processor.test.js +0 -629
  95. package/dist/processor.test.js.map +0 -1
  96. package/dist/search.test.d.ts +0 -2
  97. package/dist/search.test.d.ts.map +0 -1
  98. package/dist/search.test.js +0 -71
  99. package/dist/search.test.js.map +0 -1
  100. package/dist/security.test.d.ts +0 -2
  101. package/dist/security.test.d.ts.map +0 -1
  102. package/dist/security.test.js +0 -687
  103. package/dist/security.test.js.map +0 -1
  104. package/dist/tools/compat-check.test.d.ts +0 -2
  105. package/dist/tools/compat-check.test.d.ts.map +0 -1
  106. package/dist/tools/compat-check.test.js +0 -179
  107. package/dist/tools/compat-check.test.js.map +0 -1
  108. package/dist/tools/diagnostics.test.d.ts +0 -2
  109. package/dist/tools/diagnostics.test.d.ts.map +0 -1
  110. package/dist/tools/diagnostics.test.js +0 -168
  111. package/dist/tools/diagnostics.test.js.map +0 -1
  112. package/dist/tools/graphify.test.d.ts +0 -2
  113. package/dist/tools/graphify.test.d.ts.map +0 -1
  114. package/dist/tools/graphify.test.js +0 -39
  115. package/dist/tools/graphify.test.js.map +0 -1
  116. package/dist/tools/ingest.test.d.ts +0 -2
  117. package/dist/tools/ingest.test.d.ts.map +0 -1
  118. package/dist/tools/ingest.test.js +0 -340
  119. package/dist/tools/ingest.test.js.map +0 -1
  120. package/dist/tools/mod-tags.test.d.ts +0 -2
  121. package/dist/tools/mod-tags.test.d.ts.map +0 -1
  122. package/dist/tools/mod-tags.test.js +0 -75
  123. package/dist/tools/mod-tags.test.js.map +0 -1
  124. package/dist/tools/packtools.test.d.ts +0 -2
  125. package/dist/tools/packtools.test.d.ts.map +0 -1
  126. package/dist/tools/packtools.test.js +0 -99
  127. package/dist/tools/packtools.test.js.map +0 -1
  128. package/dist/tools/version-diff.test.d.ts +0 -2
  129. package/dist/tools/version-diff.test.d.ts.map +0 -1
  130. package/dist/tools/version-diff.test.js +0 -102
  131. package/dist/tools/version-diff.test.js.map +0 -1
  132. package/dist/validate.test.d.ts +0 -2
  133. package/dist/validate.test.d.ts.map +0 -1
  134. package/dist/validate.test.js +0 -73
  135. package/dist/validate.test.js.map +0 -1
@@ -1,629 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import AdmZip from "adm-zip";
3
- import { unlink } from "fs/promises";
4
- import { tmpdir } from "os";
5
- import { join } from "path";
6
- import { parseJar, parseAtEntries, parseAwEntries, computeMurmur2, parseClassForModAnnotation } from "./processor.js";
7
- // ── AT / AW entry parsing ──────────────────────────────────────────────────
8
- describe("parseAtEntries", () => {
9
- it("returns empty array for empty string", () => {
10
- expect(parseAtEntries("")).toEqual([]);
11
- });
12
- it("strips comment lines starting with #", () => {
13
- const input = "# This is a comment\naccessible field net/minecraft/world/World field_1234 I";
14
- expect(parseAtEntries(input)).toEqual([
15
- "accessible field net/minecraft/world/World field_1234 I",
16
- ]);
17
- });
18
- it("strips blank lines", () => {
19
- const input = "\n\naccessible method net/minecraft/A foo ()V\n\n";
20
- expect(parseAtEntries(input)).toEqual([
21
- "accessible method net/minecraft/A foo ()V",
22
- ]);
23
- });
24
- it("preserves multiple valid entries", () => {
25
- const input = [
26
- "# comment",
27
- "accessible class net/minecraft/world/World",
28
- "accessible field net/minecraft/world/World field_1234 I",
29
- "accessible method net/minecraft/world/World func_1234 ()V",
30
- ].join("\n");
31
- expect(parseAtEntries(input)).toHaveLength(3);
32
- expect(parseAtEntries(input)[0]).toBe("accessible class net/minecraft/world/World");
33
- });
34
- });
35
- describe("parseAwEntries", () => {
36
- it("returns empty array for empty string", () => {
37
- expect(parseAwEntries("")).toEqual([]);
38
- });
39
- it("strips the accessWidener header line", () => {
40
- const input = "accessWidener v2 named\naccessible class net/minecraft/world/World";
41
- expect(parseAwEntries(input)).toEqual([
42
- "accessible class net/minecraft/world/World",
43
- ]);
44
- });
45
- it("strips comment lines starting with #", () => {
46
- const input = "# comment\naccessible field net/minecraft/A field I";
47
- expect(parseAwEntries(input)).toEqual([
48
- "accessible field net/minecraft/A field I",
49
- ]);
50
- });
51
- it("strips blank lines", () => {
52
- const input = "\naccessible method net/minecraft/A foo ()V\n\n";
53
- expect(parseAwEntries(input)).toEqual([
54
- "accessible method net/minecraft/A foo ()V",
55
- ]);
56
- });
57
- });
58
- // ── Helpers ────────────────────────────────────────────────────────────────
59
- async function makeFabricJar(fabricJson, extras = {}) {
60
- const zip = new AdmZip();
61
- zip.addFile("fabric.mod.json", Buffer.from(JSON.stringify(fabricJson), "utf8"));
62
- for (const [name, content] of Object.entries(extras)) {
63
- zip.addFile(name, Buffer.from(content, "utf8"));
64
- }
65
- const dest = join(tmpdir(), `test-fabric-${Date.now()}.jar`);
66
- zip.writeZip(dest);
67
- return dest;
68
- }
69
- async function makeNeoForgeJar(toml, extras = {}) {
70
- const zip = new AdmZip();
71
- zip.addFile("META-INF/neoforge.mods.toml", Buffer.from(toml, "utf8"));
72
- for (const [name, content] of Object.entries(extras)) {
73
- zip.addFile(name, Buffer.from(content, "utf8"));
74
- }
75
- const dest = join(tmpdir(), `test-neoforge-${Date.now()}.jar`);
76
- zip.writeZip(dest);
77
- return dest;
78
- }
79
- // ── Fabric manifest parsing ────────────────────────────────────────────────
80
- describe("parseJar — Fabric", () => {
81
- it("parses modId, displayName, version from fabric.mod.json", async () => {
82
- const jarPath = await makeFabricJar({
83
- id: "mymod",
84
- name: "My Mod",
85
- version: "1.2.3",
86
- depends: { minecraft: "1.21.1" },
87
- });
88
- try {
89
- const m = await parseJar(jarPath);
90
- expect(m.modId).toBe("mymod");
91
- expect(m.displayName).toBe("My Mod");
92
- expect(m.version).toBe("1.2.3");
93
- expect(m.loader).toBe("fabric");
94
- expect(m.mcVersion).toBe("1.21.1");
95
- expect(m.metadataSource).toBe("fabric.mod.json");
96
- }
97
- finally {
98
- await unlink(jarPath);
99
- }
100
- });
101
- it("detects mixin configs from JAR entries", async () => {
102
- const jarPath = await makeFabricJar({ id: "mymod", version: "1.0.0", depends: {} }, { "mymod.mixins.json": JSON.stringify({ package: "com.example", mixins: ["MyMixin"] }) });
103
- try {
104
- const m = await parseJar(jarPath);
105
- expect(m.hasMixins).toBe(true);
106
- expect(m.mixinConfigs).toContain("mymod.mixins.json");
107
- expect(m.mixinTargets).toContain("com.example.MyMixin");
108
- }
109
- finally {
110
- await unlink(jarPath);
111
- }
112
- });
113
- it("extracts sourceUrl from contact.sources", async () => {
114
- const jarPath = await makeFabricJar({
115
- id: "mymod",
116
- version: "1.0.0",
117
- depends: {},
118
- contact: { sources: "https://github.com/example/mymod" },
119
- });
120
- try {
121
- const m = await parseJar(jarPath);
122
- expect(m.sourceUrl).toBe("https://github.com/example/mymod");
123
- }
124
- finally {
125
- await unlink(jarPath);
126
- }
127
- });
128
- it("detects access widener", async () => {
129
- const jarPath = await makeFabricJar({ id: "mymod", version: "1.0.0", depends: {} }, { "mymod.accesswidener": "accessWidener v2 named\naccessible class net/minecraft/world/World" });
130
- try {
131
- const m = await parseJar(jarPath);
132
- expect(m.hasAw).toBe(true);
133
- expect(m.awEntries).toContain("accessible class net/minecraft/world/World");
134
- }
135
- finally {
136
- await unlink(jarPath);
137
- }
138
- });
139
- });
140
- // ── NeoForge manifest parsing ──────────────────────────────────────────────
141
- describe("parseJar — NeoForge", () => {
142
- it("parses modId, version, displayName from TOML", async () => {
143
- const toml = `
144
- [[mods]]
145
- modId = "examplemod"
146
- version = "2.0.0"
147
- displayName = "Example Mod"
148
- description = "A test mod"
149
-
150
- [[dependencies.examplemod]]
151
- modId = "minecraft"
152
- versionRange = "[26.1.2,)"
153
- mandatory = true
154
- `;
155
- const jarPath = await makeNeoForgeJar(toml);
156
- try {
157
- const m = await parseJar(jarPath);
158
- expect(m.modId).toBe("examplemod");
159
- expect(m.version).toBe("2.0.0");
160
- expect(m.displayName).toBe("Example Mod");
161
- expect(m.loader).toBe("neoforge");
162
- expect(m.mcVersion).toBe("[26.1.2,)");
163
- expect(m.metadataSource).toBe("mods.toml");
164
- }
165
- finally {
166
- await unlink(jarPath);
167
- }
168
- });
169
- it("extracts non-minecraft, non-neoforge dependencies", async () => {
170
- const toml = `
171
- [[mods]]
172
- modId = "mymod"
173
- version = "1.0.0"
174
-
175
- [[dependencies.mymod]]
176
- modId = "minecraft"
177
- versionRange = "[26.1.2,)"
178
- mandatory = true
179
-
180
- [[dependencies.mymod]]
181
- modId = "jei"
182
- versionRange = "[19.0,)"
183
- mandatory = false
184
- `;
185
- const jarPath = await makeNeoForgeJar(toml);
186
- try {
187
- const m = await parseJar(jarPath);
188
- expect(m.dependencies).toHaveLength(1);
189
- expect(m.dependencies[0].id).toBe("jei");
190
- expect(m.dependencies[0].required).toBe(false);
191
- }
192
- finally {
193
- await unlink(jarPath);
194
- }
195
- });
196
- it("detects AT from META-INF/accesstransformer.cfg presence", async () => {
197
- const toml = `[[mods]]\nmodId = "mymod"\nversion = "1.0.0"\n`;
198
- const jarPath = await makeNeoForgeJar(toml, {
199
- "META-INF/accesstransformer.cfg": "# comment\naccessible field net/minecraft/A f I",
200
- });
201
- try {
202
- const m = await parseJar(jarPath);
203
- expect(m.hasAt).toBe(true);
204
- expect(m.atEntries).toContain("accessible field net/minecraft/A f I");
205
- }
206
- finally {
207
- await unlink(jarPath);
208
- }
209
- });
210
- });
211
- // ── Murmur2 hash ───────────────────────────────────────────────────────────
212
- // ── mcmod.info (legacy Forge) parsing ──────────────────────────────────────
213
- describe("parseJar — mcmod.info (legacy Forge)", () => {
214
- it("parses modId, name, version, mcversion from array format", async () => {
215
- const zip = new AdmZip();
216
- const mcmodInfo = JSON.stringify([{
217
- modid: "StevesCarts",
218
- name: "Steve's Carts 2",
219
- version: "2.0.0.b18",
220
- mcversion: "1.7.10",
221
- description: "A carttastic mod",
222
- authorList: ["Vswe"],
223
- dependencies: [],
224
- }]);
225
- zip.addFile("mcmod.info", Buffer.from(mcmodInfo, "utf8"));
226
- const tmpPath = join(tmpdir(), `test-mcmod-array-${Date.now()}.jar`);
227
- zip.writeZip(tmpPath);
228
- try {
229
- const m = await parseJar(tmpPath);
230
- expect(m.modId).toBe("StevesCarts");
231
- expect(m.displayName).toBe("Steve's Carts 2");
232
- expect(m.version).toBe("2.0.0.b18");
233
- expect(m.mcVersion).toBe("1.7.10");
234
- expect(m.loader).toBe("forge");
235
- expect(m.description).toBe("A carttastic mod");
236
- expect(m.metadataSource).toBe("mcmod.info");
237
- }
238
- finally {
239
- await unlink(tmpPath);
240
- }
241
- });
242
- it("parses mcmod.info modList wrapper format", async () => {
243
- const zip = new AdmZip();
244
- const mcmodInfo = JSON.stringify({ modList: [{
245
- modid: "TestMod",
246
- name: "Test Mod",
247
- version: "1.0.0",
248
- mcversion: "1.12.2",
249
- }] });
250
- zip.addFile("mcmod.info", Buffer.from(mcmodInfo, "utf8"));
251
- const tmpPath = join(tmpdir(), `test-mcmod-modlist-${Date.now()}.jar`);
252
- zip.writeZip(tmpPath);
253
- try {
254
- const m = await parseJar(tmpPath);
255
- expect(m.modId).toBe("TestMod");
256
- expect(m.displayName).toBe("Test Mod");
257
- expect(m.version).toBe("1.0.0");
258
- expect(m.mcVersion).toBe("1.12.2");
259
- expect(m.loader).toBe("forge");
260
- }
261
- finally {
262
- await unlink(tmpPath);
263
- }
264
- });
265
- it("falls through to unknownMod when mcmod.info is malformed", async () => {
266
- const zip = new AdmZip();
267
- zip.addFile("mcmod.info", Buffer.from("not json at all", "utf8"));
268
- const tmpPath = join(tmpdir(), `test-mcmod-bad-${Date.now()}.jar`);
269
- zip.writeZip(tmpPath);
270
- try {
271
- const m = await parseJar(tmpPath);
272
- expect(m.loader).toBe("unknown");
273
- }
274
- finally {
275
- await unlink(tmpPath);
276
- }
277
- });
278
- it("filters out Forge/FML pseudo-dependencies", async () => {
279
- const zip = new AdmZip();
280
- const mcmodInfo = JSON.stringify([{
281
- modid: "mymod",
282
- name: "My Mod",
283
- version: "1.0.0",
284
- mcversion: "1.7.10",
285
- dependencies: ["Forge", "FML", "SomeMod"],
286
- }]);
287
- zip.addFile("mcmod.info", Buffer.from(mcmodInfo, "utf8"));
288
- const tmpPath = join(tmpdir(), `test-mcmod-deps-${Date.now()}.jar`);
289
- zip.writeZip(tmpPath);
290
- try {
291
- const m = await parseJar(tmpPath);
292
- expect(m.dependencies).toHaveLength(1);
293
- expect(m.dependencies[0].id).toBe("SomeMod");
294
- }
295
- finally {
296
- await unlink(tmpPath);
297
- }
298
- });
299
- it("detects AT from META-INF/accesstransformer.cfg in legacy jar", async () => {
300
- const zip = new AdmZip();
301
- zip.addFile("mcmod.info", Buffer.from(JSON.stringify([{ modid: "mymod", version: "1.0" }]), "utf8"));
302
- zip.addFile("META-INF/accesstransformer.cfg", Buffer.from("# at\naccessible field net/minecraft/A f I", "utf8"));
303
- const tmpPath = join(tmpdir(), `test-mcmod-at-${Date.now()}.jar`);
304
- zip.writeZip(tmpPath);
305
- try {
306
- const m = await parseJar(tmpPath);
307
- expect(m.hasAt).toBe(true);
308
- expect(m.atEntries).toContain("accessible field net/minecraft/A f I");
309
- }
310
- finally {
311
- await unlink(tmpPath);
312
- }
313
- });
314
- });
315
- describe("parseJar — metadataSource fallback", () => {
316
- it("sets metadataSource to 'filename' when no metadata is found", async () => {
317
- const zip = new AdmZip();
318
- zip.addFile("com/example/Util.class", Buffer.from("not a real class"));
319
- const tmpPath = join(tmpdir(), `my-cool-mod-${Date.now()}.jar`);
320
- zip.writeZip(tmpPath);
321
- try {
322
- const m = await parseJar(tmpPath);
323
- expect(m.metadataSource).toBe("filename");
324
- expect(m.loader).toBe("unknown");
325
- }
326
- finally {
327
- await unlink(tmpPath);
328
- }
329
- });
330
- });
331
- // ── @Mod annotation bytecode extraction ────────────────────────────────────
332
- /**
333
- * Build a minimal valid .class file with a Forge @Mod annotation.
334
- * The class file has a proper constant pool and RuntimeVisibleAnnotations attribute.
335
- */
336
- function buildForgeModClassFile(opts) {
337
- const cpEntries = [];
338
- function addUtf8(str) {
339
- const bytes = Buffer.from(str, "utf8");
340
- const entry = Buffer.alloc(3 + bytes.length);
341
- entry[0] = 1;
342
- entry.writeUInt16BE(bytes.length, 1);
343
- bytes.copy(entry, 3);
344
- cpEntries.push(entry);
345
- return cpEntries.length; // 1-based
346
- }
347
- function addClass(nameIdx) {
348
- const entry = Buffer.alloc(3);
349
- entry[0] = 7;
350
- entry.writeUInt16BE(nameIdx, 1);
351
- cpEntries.push(entry);
352
- return cpEntries.length;
353
- }
354
- const thisNameIdx = addUtf8("com/example/TestMod");
355
- const thisClassIdx = addClass(thisNameIdx);
356
- const superNameIdx = addUtf8("java/lang/Object");
357
- const superClassIdx = addClass(superNameIdx);
358
- const descriptorIdx = addUtf8(opts.descriptor);
359
- const rvaNameIdx = addUtf8("RuntimeVisibleAnnotations");
360
- // Build annotation element-value pairs
361
- const pairs = [];
362
- const idLabel = opts.elementNameForId ?? "modid";
363
- pairs.push({ nameIdx: addUtf8(idLabel), valueIdx: addUtf8(opts.modId) });
364
- if (opts.name)
365
- pairs.push({ nameIdx: addUtf8("name"), valueIdx: addUtf8(opts.name) });
366
- if (opts.version)
367
- pairs.push({ nameIdx: addUtf8("version"), valueIdx: addUtf8(opts.version) });
368
- // Annotation data: num_annotations(2) + type_index(2) + num_pairs(2) + pairs*(name(2)+tag(1)+value(2))
369
- const annotLen = 2 + 2 + 2 + pairs.length * 5;
370
- const annotData = Buffer.alloc(annotLen);
371
- let ao = 0;
372
- annotData.writeUInt16BE(1, ao);
373
- ao += 2;
374
- annotData.writeUInt16BE(descriptorIdx, ao);
375
- ao += 2;
376
- annotData.writeUInt16BE(pairs.length, ao);
377
- ao += 2;
378
- for (const p of pairs) {
379
- annotData.writeUInt16BE(p.nameIdx, ao);
380
- ao += 2;
381
- annotData[ao++] = 0x73; // 's' tag
382
- annotData.writeUInt16BE(p.valueIdx, ao);
383
- ao += 2;
384
- }
385
- // Header: magic(4) + minor(2) + major(2) + cp_count(2) = 10
386
- const header = Buffer.alloc(10);
387
- header.writeUInt32BE(0xCAFEBABE, 0);
388
- header.writeUInt16BE(0, 4);
389
- header.writeUInt16BE(52, 6); // Java 8
390
- header.writeUInt16BE(cpEntries.length + 1, 8);
391
- // Class body: access(2) + this(2) + super(2) + ifaces_count(2) + fields_count(2) + methods_count(2) + attrs_count(2)
392
- const bodyHeader = Buffer.alloc(14);
393
- let bo = 0;
394
- bodyHeader.writeUInt16BE(0x0021, bo);
395
- bo += 2; // public + super
396
- bodyHeader.writeUInt16BE(thisClassIdx, bo);
397
- bo += 2;
398
- bodyHeader.writeUInt16BE(superClassIdx, bo);
399
- bo += 2;
400
- bodyHeader.writeUInt16BE(0, bo);
401
- bo += 2; // interfaces
402
- bodyHeader.writeUInt16BE(0, bo);
403
- bo += 2; // fields
404
- bodyHeader.writeUInt16BE(0, bo);
405
- bo += 2; // methods
406
- bodyHeader.writeUInt16BE(1, bo);
407
- bo += 2; // 1 attribute
408
- // Attribute header: name_index(2) + length(4)
409
- const attrHeader = Buffer.alloc(6);
410
- attrHeader.writeUInt16BE(rvaNameIdx, 0);
411
- attrHeader.writeUInt32BE(annotLen, 2);
412
- return Buffer.concat([header, ...cpEntries, bodyHeader, attrHeader, annotData]);
413
- }
414
- describe("parseClassForModAnnotation", () => {
415
- it("extracts modid from cpw.mods.fml.common.Mod (1.7.10 descriptor)", () => {
416
- const classFile = buildForgeModClassFile({
417
- descriptor: "Lcpw/mods/fml/common/Mod;",
418
- modId: "StevesCarts",
419
- name: "Steve's Carts 2",
420
- version: "2.0.0.b18",
421
- });
422
- const result = parseClassForModAnnotation(classFile);
423
- expect(result).not.toBeNull();
424
- expect(result.modId).toBe("StevesCarts");
425
- expect(result.name).toBe("Steve's Carts 2");
426
- expect(result.version).toBe("2.0.0.b18");
427
- });
428
- it("extracts modid from net.minecraftforge.fml.common.Mod (1.8+ descriptor)", () => {
429
- const classFile = buildForgeModClassFile({
430
- descriptor: "Lnet/minecraftforge/fml/common/Mod;",
431
- modId: "jei",
432
- name: "Just Enough Items",
433
- version: "4.15.0",
434
- });
435
- const result = parseClassForModAnnotation(classFile);
436
- expect(result).not.toBeNull();
437
- expect(result.modId).toBe("jei");
438
- expect(result.name).toBe("Just Enough Items");
439
- });
440
- it("handles 'value' element name as alternate for modid", () => {
441
- const classFile = buildForgeModClassFile({
442
- descriptor: "Lcpw/mods/fml/common/Mod;",
443
- modId: "nei",
444
- elementNameForId: "value",
445
- });
446
- const result = parseClassForModAnnotation(classFile);
447
- expect(result).not.toBeNull();
448
- expect(result.modId).toBe("nei");
449
- });
450
- it("returns null for class files without @Mod annotation", () => {
451
- // Build a class with no annotation — just a bare class
452
- const buf = Buffer.alloc(34);
453
- let off = 0;
454
- buf.writeUInt32BE(0xCAFEBABE, off);
455
- off += 4; // magic
456
- buf.writeUInt16BE(0, off);
457
- off += 2; // minor
458
- buf.writeUInt16BE(52, off);
459
- off += 2; // major
460
- buf.writeUInt16BE(4, off);
461
- off += 2; // cp_count = 4 (entries #1-#3)
462
- // #1: Utf8 "TestClass"
463
- buf[off++] = 1;
464
- buf.writeUInt16BE(9, off);
465
- off += 2;
466
- Buffer.from("TestClass").copy(buf, off);
467
- off += 9;
468
- // #2: Class -> #1
469
- buf[off++] = 7;
470
- buf.writeUInt16BE(1, off);
471
- off += 2;
472
- // #3: ditto for super
473
- // ... truncated — just enough to not match
474
- expect(parseClassForModAnnotation(buf)).toBeNull();
475
- });
476
- it("returns null for non-class-file buffers", () => {
477
- expect(parseClassForModAnnotation(Buffer.from("not a class file"))).toBeNull();
478
- expect(parseClassForModAnnotation(Buffer.alloc(4))).toBeNull();
479
- });
480
- });
481
- describe("parseJar — @Mod annotation fallback", () => {
482
- it("extracts mod metadata from @Mod annotation when no other metadata exists", async () => {
483
- const classFile = buildForgeModClassFile({
484
- descriptor: "Lcpw/mods/fml/common/Mod;",
485
- modId: "oldmod",
486
- name: "Old Mod",
487
- version: "1.0.0",
488
- });
489
- const zip = new AdmZip();
490
- zip.addFile("com/example/OldMod.class", classFile);
491
- const tmpPath = join(tmpdir(), `test-forge-annotation-${Date.now()}.jar`);
492
- zip.writeZip(tmpPath);
493
- try {
494
- const m = await parseJar(tmpPath);
495
- expect(m.modId).toBe("oldmod");
496
- expect(m.displayName).toBe("Old Mod");
497
- expect(m.version).toBe("1.0.0");
498
- expect(m.loader).toBe("forge");
499
- expect(m.metadataSource).toBe("@Mod annotation");
500
- }
501
- finally {
502
- await unlink(tmpPath);
503
- }
504
- });
505
- it("prefers mcmod.info over @Mod annotation when both exist", async () => {
506
- const classFile = buildForgeModClassFile({
507
- descriptor: "Lcpw/mods/fml/common/Mod;",
508
- modId: "annotation_id",
509
- });
510
- const zip = new AdmZip();
511
- zip.addFile("com/example/Mod.class", classFile);
512
- zip.addFile("mcmod.info", Buffer.from(JSON.stringify([{
513
- modid: "mcmodinfo_id",
514
- name: "Correct Name",
515
- version: "2.0.0",
516
- mcversion: "1.7.10",
517
- }]), "utf8"));
518
- const tmpPath = join(tmpdir(), `test-prefer-mcmod-${Date.now()}.jar`);
519
- zip.writeZip(tmpPath);
520
- try {
521
- const m = await parseJar(tmpPath);
522
- expect(m.modId).toBe("mcmodinfo_id");
523
- expect(m.displayName).toBe("Correct Name");
524
- expect(m.metadataSource).toBe("mcmod.info");
525
- }
526
- finally {
527
- await unlink(tmpPath);
528
- }
529
- });
530
- });
531
- // ── mcmod.info format variants ────────────────────────────────────────────
532
- describe("parseJar — mcmod.info format variants", () => {
533
- it("handles bare object format (not array, not modList wrapper)", async () => {
534
- const zip = new AdmZip();
535
- zip.addFile("mcmod.info", Buffer.from(JSON.stringify({
536
- modid: "baremod",
537
- name: "Bare Mod",
538
- version: "1.0.0",
539
- mcversion: "1.6.4",
540
- }), "utf8"));
541
- const tmpPath = join(tmpdir(), `test-mcmod-bare-${Date.now()}.jar`);
542
- zip.writeZip(tmpPath);
543
- try {
544
- const m = await parseJar(tmpPath);
545
- expect(m.modId).toBe("baremod");
546
- expect(m.displayName).toBe("Bare Mod");
547
- expect(m.mcVersion).toBe("1.6.4");
548
- expect(m.loader).toBe("forge");
549
- }
550
- finally {
551
- await unlink(tmpPath);
552
- }
553
- });
554
- it("handles modId (camelCase) alternative to modid", async () => {
555
- const zip = new AdmZip();
556
- zip.addFile("mcmod.info", Buffer.from(JSON.stringify({
557
- modId: "camelmod",
558
- name: "Camel Mod",
559
- version: "1.0.0",
560
- }), "utf8"));
561
- const tmpPath = join(tmpdir(), `test-mcmod-camel-${Date.now()}.jar`);
562
- zip.writeZip(tmpPath);
563
- try {
564
- const m = await parseJar(tmpPath);
565
- expect(m.modId).toBe("camelmod");
566
- }
567
- finally {
568
- await unlink(tmpPath);
569
- }
570
- });
571
- it("handles requiredMods array as dependency source", async () => {
572
- const zip = new AdmZip();
573
- zip.addFile("mcmod.info", Buffer.from(JSON.stringify([{
574
- modid: "depmod",
575
- version: "1.0.0",
576
- requiredMods: ["LibraryMod", "Forge"],
577
- }]), "utf8"));
578
- const tmpPath = join(tmpdir(), `test-mcmod-required-${Date.now()}.jar`);
579
- zip.writeZip(tmpPath);
580
- try {
581
- const m = await parseJar(tmpPath);
582
- expect(m.dependencies).toHaveLength(1);
583
- expect(m.dependencies[0].id).toBe("LibraryMod");
584
- }
585
- finally {
586
- await unlink(tmpPath);
587
- }
588
- });
589
- it("parses Forge dependency string format 'required-after:ModId@[1.0,)'", async () => {
590
- const zip = new AdmZip();
591
- zip.addFile("mcmod.info", Buffer.from(JSON.stringify([{
592
- modid: "depmod",
593
- version: "1.0.0",
594
- dependencies: ["required-after:SomeLib@[1.0,)", "after:OptionalLib", "Forge"],
595
- }]), "utf8"));
596
- const tmpPath = join(tmpdir(), `test-mcmod-depstring-${Date.now()}.jar`);
597
- zip.writeZip(tmpPath);
598
- try {
599
- const m = await parseJar(tmpPath);
600
- expect(m.dependencies.map(d => d.id)).toContain("SomeLib");
601
- expect(m.dependencies.map(d => d.id)).toContain("OptionalLib");
602
- expect(m.dependencies.map(d => d.id)).not.toContain("Forge");
603
- }
604
- finally {
605
- await unlink(tmpPath);
606
- }
607
- });
608
- });
609
- describe("computeMurmur2", () => {
610
- it("returns a number and does not throw for empty buffer", () => {
611
- const result = computeMurmur2(Buffer.alloc(0));
612
- expect(typeof result).toBe("number");
613
- });
614
- it("filters whitespace bytes (9, 10, 13, 32) before hashing", () => {
615
- const withWhitespace = Buffer.from([0x61, 0x20, 0x62, 0x0a, 0x63]); // a ' ' b '\n' c
616
- const withoutWhitespace = Buffer.from([0x61, 0x62, 0x63]); // abc
617
- expect(computeMurmur2(withWhitespace)).toBe(computeMurmur2(withoutWhitespace));
618
- });
619
- it("returns different hashes for different byte content", () => {
620
- const a = Buffer.from([0x01, 0x02, 0x03, 0x04]);
621
- const b = Buffer.from([0x04, 0x03, 0x02, 0x01]);
622
- expect(computeMurmur2(a)).not.toBe(computeMurmur2(b));
623
- });
624
- it("is deterministic — same input always gives same output", () => {
625
- const buf = Buffer.from("hello world modlens test", "utf8");
626
- expect(computeMurmur2(buf)).toBe(computeMurmur2(buf));
627
- });
628
- });
629
- //# sourceMappingURL=processor.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"processor.test.js","sourceRoot":"","sources":["../src/processor.test.ts"],"names":[],"mappings":"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"}