@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,340 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
- // ── Module mocks (must be declared before SUT import) ─────────────────────
3
- vi.mock("../repositories/mod.js", () => ({
4
- findModByJarPath: vi.fn(),
5
- findModByDupKey: vi.fn(),
6
- findModBySha512: vi.fn(),
7
- createMod: vi.fn(),
8
- updateMod: vi.fn(),
9
- findModById: vi.fn(),
10
- listAllMods: vi.fn(),
11
- countModClasses: vi.fn(),
12
- createModClasses: vi.fn(),
13
- }));
14
- vi.mock("../processor.js", () => ({
15
- parseJar: vi.fn(),
16
- computeHashes: vi.fn(),
17
- METADATA_QUALITY: {
18
- "filename": 0,
19
- "@Mod annotation": 1,
20
- "mcmod.info": 2,
21
- "mods.toml": 3,
22
- "quilt.mod.json": 3,
23
- "fabric.mod.json": 3,
24
- },
25
- }));
26
- vi.mock("../modrinth.js", () => ({
27
- lookupBySha512: vi.fn(),
28
- getProject: vi.fn(),
29
- modrinthPlatformAdapter: { name: "modrinth", lookup: vi.fn().mockResolvedValue(null) },
30
- }));
31
- vi.mock("../curseforge.js", () => ({
32
- lookupByFingerprint: vi.fn(),
33
- curseforgePlatformAdapter: { name: "curseforge", lookup: vi.fn().mockResolvedValue(null) },
34
- }));
35
- vi.mock("../java-tools.js", () => ({
36
- decompileJar: vi.fn(),
37
- isDecompileDone: vi.fn(),
38
- indexJar: vi.fn().mockResolvedValue({ classes: {} }),
39
- }));
40
- vi.mock("../cache.js", () => ({
41
- paths: { decompiled: "/tmp/decompiled", source: "/tmp/source", jars: "/tmp/jars" },
42
- ensureDir: vi.fn(),
43
- }));
44
- vi.mock("../db.js", () => ({
45
- getDb: vi.fn(),
46
- }));
47
- vi.mock("fs/promises", async (importOriginal) => {
48
- const actual = await importOriginal();
49
- return { ...actual, readdir: vi.fn().mockResolvedValue([]) };
50
- });
51
- // ── Import SUT after mocks ─────────────────────────────────────────────────
52
- const { ingestMod, reindexClasses, batchIngest, refreshDegradedMetadata } = await import("./ingest.js");
53
- const fsPromises = await import("fs/promises");
54
- const repo = await import("../repositories/mod.js");
55
- const proc = await import("../processor.js");
56
- const dbMod = await import("../db.js");
57
- const mr = await import("../modrinth.js");
58
- const cf = await import("../curseforge.js");
59
- const jt = await import("../java-tools.js");
60
- // ── Fixture data ───────────────────────────────────────────────────────────
61
- const FAKE_MANIFEST = {
62
- modId: "testmod", displayName: "Test Mod", version: "1.0.0",
63
- mcVersion: "1.21.1", loader: "fabric", description: "",
64
- sourceUrl: null, dependencies: [], mixinConfigs: [],
65
- hasMixins: false, hasAt: false, hasAw: false,
66
- atEntries: [], awEntries: [], mixinTargets: [],
67
- metadataSource: "fabric.mod.json",
68
- };
69
- const FAKE_HASHES = { sha256: "aaa", sha512: "bbb", murmur2: "12345" };
70
- const FAKE_DB_MOD = {
71
- id: 1, jarPath: "/mods/testmod.jar", modId: "testmod",
72
- displayName: "Test Mod", version: "1.0.0", mcVersion: "1.21.1",
73
- loader: "fabric", description: "", metadata: {},
74
- sha256: "aaa", sha512: "bbb", murmur2: "12345",
75
- hasMixins: false, hasAt: false, hasAw: false,
76
- mixinConfigs: [], mixinTargets: [], atEntries: [], awEntries: [],
77
- dependencies: [], createdAt: new Date(),
78
- metadataSource: "fabric.mod.json",
79
- };
80
- // ── Default mock setup (happy path) ───────────────────────────────────────
81
- beforeEach(() => {
82
- vi.resetAllMocks();
83
- vi.mocked(repo.findModByJarPath).mockResolvedValue(null);
84
- vi.mocked(repo.findModByDupKey).mockResolvedValue(null);
85
- vi.mocked(repo.findModBySha512).mockResolvedValue(null);
86
- vi.mocked(repo.createMod).mockResolvedValue(FAKE_DB_MOD);
87
- vi.mocked(repo.updateMod).mockResolvedValue(FAKE_DB_MOD);
88
- vi.mocked(repo.findModById).mockResolvedValue(FAKE_DB_MOD);
89
- vi.mocked(repo.countModClasses).mockResolvedValue(0);
90
- vi.mocked(repo.createModClasses).mockResolvedValue(undefined);
91
- vi.mocked(proc.parseJar).mockResolvedValue(FAKE_MANIFEST);
92
- vi.mocked(proc.computeHashes).mockResolvedValue(FAKE_HASHES);
93
- vi.mocked(mr.lookupBySha512).mockResolvedValue(null);
94
- vi.mocked(mr.getProject).mockResolvedValue(null);
95
- vi.mocked(cf.lookupByFingerprint).mockResolvedValue(null);
96
- vi.mocked(mr.modrinthPlatformAdapter.lookup).mockResolvedValue(null);
97
- vi.mocked(cf.curseforgePlatformAdapter.lookup).mockResolvedValue(null);
98
- vi.mocked(jt.indexJar).mockResolvedValue({ classes: {} });
99
- });
100
- // ── already_ingested ───────────────────────────────────────────────────────
101
- describe("ingestMod — already_ingested", () => {
102
- it("returns already_ingested when JAR path already exists in DB", async () => {
103
- vi.mocked(repo.findModByJarPath).mockResolvedValue(FAKE_DB_MOD);
104
- const result = await ingestMod("/mods/testmod.jar");
105
- expect(result.status).toBe("already_ingested");
106
- expect(proc.parseJar).not.toHaveBeenCalled();
107
- expect(repo.createMod).not.toHaveBeenCalled();
108
- });
109
- it("refreshes metadata when re-parse yields higher quality source", async () => {
110
- const degradedMod = { ...FAKE_DB_MOD, metadataSource: "filename" };
111
- vi.mocked(repo.findModByJarPath).mockResolvedValue(degradedMod);
112
- vi.mocked(proc.parseJar).mockResolvedValue({ ...FAKE_MANIFEST, metadataSource: "fabric.mod.json" });
113
- const updatedMod = { ...FAKE_DB_MOD, metadataSource: "fabric.mod.json" };
114
- vi.mocked(repo.updateMod).mockResolvedValue(updatedMod);
115
- const result = await ingestMod("/mods/testmod.jar");
116
- expect(result.status).toBe("metadata_refreshed");
117
- expect(result.previousSource).toBe("filename");
118
- expect(repo.updateMod).toHaveBeenCalledWith(1, expect.objectContaining({ metadataSource: "fabric.mod.json" }));
119
- });
120
- it("keeps already_ingested when re-parse yields same or lower quality", async () => {
121
- const annotationMod = { ...FAKE_DB_MOD, metadataSource: "@Mod annotation" };
122
- vi.mocked(repo.findModByJarPath).mockResolvedValue(annotationMod);
123
- vi.mocked(proc.parseJar).mockResolvedValue({ ...FAKE_MANIFEST, metadataSource: "filename" });
124
- const result = await ingestMod("/mods/testmod.jar");
125
- expect(result.status).toBe("already_ingested");
126
- expect(repo.updateMod).not.toHaveBeenCalled();
127
- });
128
- });
129
- // ── duplicate_version ──────────────────────────────────────────────────────
130
- describe("ingestMod — duplicate_version", () => {
131
- it("returns duplicate_version when same modId+version+loader exists at different path", async () => {
132
- const existingMod = { ...FAKE_DB_MOD, id: 99, jarPath: "/other/path/testmod.jar" };
133
- vi.mocked(repo.findModByDupKey).mockResolvedValue(existingMod);
134
- const result = await ingestMod("/mods/testmod-copy.jar");
135
- expect(result.status).toBe("duplicate_version");
136
- if (result.status !== "duplicate_version")
137
- throw new Error("unreachable");
138
- expect(result.existingJarPath).toBe("/other/path/testmod.jar");
139
- expect(result.existingDbId).toBe(99);
140
- expect(result.message).toContain("testmod");
141
- expect(repo.createMod).not.toHaveBeenCalled();
142
- });
143
- });
144
- // ── duplicate_hash ─────────────────────────────────────────────────────────
145
- describe("ingestMod — duplicate_hash", () => {
146
- it("returns duplicate_hash when SHA-512 matches existing mod", async () => {
147
- const existingMod = { ...FAKE_DB_MOD, id: 42, jarPath: "/original/testmod.jar" };
148
- vi.mocked(repo.findModBySha512).mockResolvedValue(existingMod);
149
- const result = await ingestMod("/mods/testmod-renamed.jar");
150
- expect(result.status).toBe("duplicate_hash");
151
- if (result.status !== "duplicate_hash")
152
- throw new Error("unreachable");
153
- expect(result.existingDbId).toBe(42);
154
- expect(result.existingJarPath).toBe("/original/testmod.jar");
155
- expect(repo.createMod).not.toHaveBeenCalled();
156
- });
157
- });
158
- // ── ingested (happy path) ─────────────────────────────────────────────────
159
- describe("ingestMod — ingested (happy path)", () => {
160
- it("creates mod record and returns ingested status", async () => {
161
- const result = await ingestMod("/mods/testmod.jar");
162
- expect(result.status).toBe("ingested");
163
- expect(repo.createMod).toHaveBeenCalledOnce();
164
- expect(repo.findModById).toHaveBeenCalled();
165
- if (result.status !== "ingested")
166
- throw new Error("unreachable");
167
- expect(result.mod).toEqual(FAKE_DB_MOD);
168
- });
169
- it("calls parseJar and computeHashes on the provided path", async () => {
170
- await ingestMod("/mods/testmod.jar");
171
- expect(proc.parseJar).toHaveBeenCalledWith("/mods/testmod.jar");
172
- expect(proc.computeHashes).toHaveBeenCalledWith("/mods/testmod.jar");
173
- });
174
- });
175
- // ── platform lookups ───────────────────────────────────────────────────────
176
- describe("ingestMod — platform lookups", () => {
177
- it("calls updateMod with modrinthId when Modrinth returns a match", async () => {
178
- vi.mocked(mr.modrinthPlatformAdapter.lookup).mockResolvedValue({
179
- platform: "modrinth",
180
- projectId: "mr-abc-123",
181
- slug: "test-mod",
182
- sourceUrl: "https://github.com/example/testmod",
183
- });
184
- await ingestMod("/mods/testmod.jar");
185
- expect(repo.updateMod).toHaveBeenCalledWith(FAKE_DB_MOD.id, expect.objectContaining({ modrinthId: "mr-abc-123" }));
186
- });
187
- it("calls updateMod with curseforgeId when CurseForge returns a match", async () => {
188
- vi.mocked(cf.curseforgePlatformAdapter.lookup).mockResolvedValue({
189
- platform: "curseforge",
190
- projectId: 99999,
191
- slug: "testmod",
192
- sourceUrl: "https://github.com/example/testmod",
193
- });
194
- await ingestMod("/mods/testmod.jar");
195
- expect(repo.updateMod).toHaveBeenCalledWith(FAKE_DB_MOD.id, expect.objectContaining({ curseforgeId: 99999 }));
196
- });
197
- it("skipSource=true skips all platform lookups", async () => {
198
- await ingestMod("/mods/testmod.jar", /* skipSource= */ true);
199
- expect(mr.modrinthPlatformAdapter.lookup).not.toHaveBeenCalled();
200
- expect(cf.curseforgePlatformAdapter.lookup).not.toHaveBeenCalled();
201
- });
202
- it("continues ingesting even if both platform lookups fail", async () => {
203
- vi.mocked(mr.modrinthPlatformAdapter.lookup).mockRejectedValue(new Error("Modrinth down"));
204
- vi.mocked(cf.curseforgePlatformAdapter.lookup).mockRejectedValue(new Error("CurseForge down"));
205
- const result = await ingestMod("/mods/testmod.jar");
206
- expect(result.status).toBe("ingested");
207
- expect(repo.createMod).toHaveBeenCalledOnce();
208
- });
209
- });
210
- // ── reindexClasses — single mod ───────────────────────────────────────────────
211
- describe("reindexClasses — single mod", () => {
212
- it("indexes classes when mod has none yet", async () => {
213
- vi.mocked(jt.indexJar).mockResolvedValue({
214
- classes: {
215
- "com/example/A": { name: "com/example/A", superName: "java/lang/Object", interfaces: [], accessFlags: 1 },
216
- },
217
- });
218
- const result = await reindexClasses(FAKE_DB_MOD.id);
219
- expect(result.indexed).toBe(1);
220
- expect(result.skipped).toBe(0);
221
- expect(result.failed).toBe(0);
222
- expect(repo.createModClasses).toHaveBeenCalledOnce();
223
- });
224
- it("skips a mod that already has classes indexed", async () => {
225
- vi.mocked(repo.countModClasses).mockResolvedValue(42);
226
- const result = await reindexClasses(FAKE_DB_MOD.id);
227
- expect(result.skipped).toBe(1);
228
- expect(result.indexed).toBe(0);
229
- expect(jt.indexJar).not.toHaveBeenCalled();
230
- expect(repo.createModClasses).not.toHaveBeenCalled();
231
- });
232
- it("returns failed=1 when indexJar throws", async () => {
233
- vi.mocked(jt.indexJar).mockRejectedValue(new Error("JAR not found"));
234
- const result = await reindexClasses(FAKE_DB_MOD.id);
235
- expect(result.failed).toBe(1);
236
- expect(result.indexed).toBe(0);
237
- expect(repo.createModClasses).not.toHaveBeenCalled();
238
- });
239
- it("returns skipped=1 when indexJar returns no classes", async () => {
240
- vi.mocked(jt.indexJar).mockResolvedValue({ classes: {} });
241
- const result = await reindexClasses(FAKE_DB_MOD.id);
242
- expect(result.skipped).toBe(1);
243
- expect(repo.createModClasses).not.toHaveBeenCalled();
244
- });
245
- });
246
- // ── reindexClasses — all mods ─────────────────────────────────────────────────
247
- describe("reindexClasses — all mods (no dbId)", () => {
248
- it("processes all mods returned by listAllMods", async () => {
249
- const mod2 = { ...FAKE_DB_MOD, id: 2, jarPath: "/mods/other.jar" };
250
- vi.mocked(repo.listAllMods).mockResolvedValue([FAKE_DB_MOD, mod2]);
251
- vi.mocked(jt.indexJar).mockResolvedValue({
252
- classes: {
253
- "com/example/A": { name: "com/example/A", superName: "java/lang/Object", interfaces: [], accessFlags: 1 },
254
- },
255
- });
256
- const result = await reindexClasses();
257
- expect(result.indexed).toBe(2);
258
- expect(repo.createModClasses).toHaveBeenCalledTimes(2);
259
- });
260
- });
261
- // ── batchIngest — empty directory ─────────────────────────────────────────────
262
- describe("batchIngest — empty directory", () => {
263
- it("returns zero totals when directory has no JARs", async () => {
264
- vi.mocked(fsPromises.readdir).mockResolvedValue([]);
265
- const result = await batchIngest("/mods");
266
- expect(result.total).toBe(0);
267
- expect(result.ingested).toBe(0);
268
- expect(result.failed).toBe(0);
269
- expect(result.skipped).toBe(0);
270
- });
271
- });
272
- // ── batchIngest — with JARs ───────────────────────────────────────────────────
273
- describe("batchIngest — with JARs", () => {
274
- beforeEach(() => {
275
- vi.mocked(fsPromises.readdir).mockResolvedValue(["alpha.jar", "beta.jar", "readme.txt"]);
276
- });
277
- it("processes only .jar files, ignores others", async () => {
278
- const result = await batchIngest("/mods", true);
279
- expect(result.total).toBe(2);
280
- });
281
- it("counts ingested status correctly when all JARs are new", async () => {
282
- const result = await batchIngest("/mods", true);
283
- expect(result.ingested).toBe(2);
284
- expect(result.skipped).toBe(0);
285
- expect(result.failed).toBe(0);
286
- });
287
- it("counts skipped when ingestMod returns already_ingested", async () => {
288
- vi.mocked(repo.findModByJarPath).mockResolvedValue(FAKE_DB_MOD);
289
- const result = await batchIngest("/mods", true);
290
- expect(result.skipped).toBe(2);
291
- expect(result.ingested).toBe(0);
292
- });
293
- it("counts failed when ingestMod throws", async () => {
294
- vi.mocked(proc.parseJar).mockRejectedValue(new Error("Corrupt JAR"));
295
- const result = await batchIngest("/mods", true);
296
- expect(result.failed).toBe(2);
297
- expect(result.ingested).toBe(0);
298
- expect(result.results.every((r) => r.status.startsWith("error:"))).toBe(true);
299
- });
300
- it("includes modId and version in results for ingested JARs", async () => {
301
- const result = await batchIngest("/mods", true);
302
- for (const r of result.results) {
303
- if (r.status === "ingested") {
304
- expect(r.modId).toBe(FAKE_DB_MOD.modId);
305
- expect(r.version).toBe(FAKE_DB_MOD.version);
306
- }
307
- }
308
- });
309
- });
310
- // ── refreshDegradedMetadata ───────────────────────────────────────────────
311
- describe("refreshDegradedMetadata", () => {
312
- it("upgrades filename-sourced mods when re-parse finds a manifest", async () => {
313
- const degradedMod = { ...FAKE_DB_MOD, metadataSource: "filename", modId: "mystery" };
314
- vi.mocked(dbMod.getDb).mockResolvedValue({
315
- mod: { findMany: vi.fn().mockResolvedValue([degradedMod]) },
316
- });
317
- vi.mocked(proc.parseJar).mockResolvedValue({ ...FAKE_MANIFEST, metadataSource: "fabric.mod.json" });
318
- vi.mocked(repo.updateMod).mockResolvedValue({ ...degradedMod, metadataSource: "fabric.mod.json" });
319
- const result = await refreshDegradedMetadata();
320
- expect(result.total).toBe(1);
321
- expect(result.refreshed).toBe(1);
322
- expect(result.unchanged).toBe(0);
323
- expect(result.results[0].status).toBe("refreshed");
324
- expect(result.results[0].previousSource).toBe("filename");
325
- expect(result.results[0].newSource).toBe("fabric.mod.json");
326
- expect(repo.updateMod).toHaveBeenCalledWith(degradedMod.id, expect.objectContaining({ metadataSource: "fabric.mod.json" }));
327
- });
328
- it("leaves mods unchanged when re-parse yields same quality", async () => {
329
- const annotationMod = { ...FAKE_DB_MOD, metadataSource: "@Mod annotation" };
330
- vi.mocked(dbMod.getDb).mockResolvedValue({
331
- mod: { findMany: vi.fn().mockResolvedValue([annotationMod]) },
332
- });
333
- vi.mocked(proc.parseJar).mockResolvedValue({ ...FAKE_MANIFEST, metadataSource: "filename" });
334
- const result = await refreshDegradedMetadata();
335
- expect(result.unchanged).toBe(1);
336
- expect(result.refreshed).toBe(0);
337
- expect(repo.updateMod).not.toHaveBeenCalled();
338
- });
339
- });
340
- //# sourceMappingURL=ingest.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ingest.test.js","sourceRoot":"","sources":["../../src/tools/ingest.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=mod-tags.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mod-tags.test.d.ts","sourceRoot":"","sources":["../../src/tools/mod-tags.test.ts"],"names":[],"mappings":""}
@@ -1,75 +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 { scanTagsFromJar } from "./mod-tags.js";
7
- async function makeTagJar(entries = {}) {
8
- const zip = new AdmZip();
9
- for (const [name, content] of Object.entries(entries)) {
10
- if (content === null) {
11
- zip.addFile(name, Buffer.alloc(0));
12
- }
13
- else {
14
- zip.addFile(name, Buffer.from(content, "utf8"));
15
- }
16
- }
17
- const dest = join(tmpdir(), `test-tags-${Date.now()}.jar`);
18
- zip.writeZip(dest);
19
- return dest;
20
- }
21
- describe("scanTagsFromJar — null safety", () => {
22
- it("returns empty array for a JAR with no tag files", async () => {
23
- const jarPath = await makeTagJar({});
24
- try {
25
- const tags = scanTagsFromJar(jarPath);
26
- expect(tags).toEqual([]);
27
- }
28
- finally {
29
- await unlink(jarPath);
30
- }
31
- });
32
- it("does not throw when a tag-path entry has zero-byte content", async () => {
33
- const jarPath = await makeTagJar({
34
- "data/mod/tags/blocks/stone.json": "",
35
- });
36
- try {
37
- const tags = scanTagsFromJar(jarPath);
38
- expect(tags).toEqual([]);
39
- }
40
- finally {
41
- await unlink(jarPath);
42
- }
43
- });
44
- it("parses valid tag entries correctly", async () => {
45
- const content = JSON.stringify({ values: ["minecraft:stone", "minecraft:granite"], replace: false });
46
- const jarPath = await makeTagJar({
47
- "data/mymod/tags/blocks/stone_group.json": content,
48
- });
49
- try {
50
- const tags = scanTagsFromJar(jarPath);
51
- expect(tags).toHaveLength(1);
52
- expect(tags[0].registry).toBe("blocks");
53
- expect(tags[0].namespace).toBe("mymod");
54
- expect(tags[0].entries).toContain("minecraft:stone");
55
- expect(tags[0].replace).toBe(false);
56
- }
57
- finally {
58
- await unlink(jarPath);
59
- }
60
- });
61
- it("handles replace:true flag", async () => {
62
- const content = JSON.stringify({ values: ["minecraft:stone"], replace: true });
63
- const jarPath = await makeTagJar({
64
- "data/mymod/tags/items/iron_ores.json": content,
65
- });
66
- try {
67
- const tags = scanTagsFromJar(jarPath);
68
- expect(tags[0].replace).toBe(true);
69
- }
70
- finally {
71
- await unlink(jarPath);
72
- }
73
- });
74
- });
75
- //# sourceMappingURL=mod-tags.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mod-tags.test.js","sourceRoot":"","sources":["../../src/tools/mod-tags.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=packtools.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"packtools.test.d.ts","sourceRoot":"","sources":["../../src/tools/packtools.test.ts"],"names":[],"mappings":""}
@@ -1,99 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
- import { findDataConflicts } from "./packtools.js";
3
- vi.mock("../repositories/mod.js", () => ({
4
- listModsSlim: vi.fn(),
5
- listMods: vi.fn(),
6
- findModsByIds: vi.fn(),
7
- resolveModRef: vi.fn(),
8
- }));
9
- vi.mock("../jar.js", () => ({
10
- listEntries: vi.fn(),
11
- }));
12
- vi.mock("../java-tools.js", () => ({
13
- indexJar: vi.fn(),
14
- }));
15
- import { listModsSlim } from "../repositories/mod.js";
16
- import { listEntries } from "../jar.js";
17
- const MOD_A = { id: 1, modId: "mod_a", displayName: "Mod A", version: "1.0", jarPath: "/a.jar", loader: "neoforge", mcVersion: "1.21" };
18
- const MOD_B = { id: 2, modId: "mod_b", displayName: "Mod B", version: "1.0", jarPath: "/b.jar", loader: "neoforge", mcVersion: "1.21" };
19
- describe("findDataConflicts", () => {
20
- beforeEach(() => vi.resetAllMocks());
21
- it("detects vanilla override conflict across two mods", async () => {
22
- vi.mocked(listModsSlim).mockResolvedValue([MOD_A, MOD_B]);
23
- vi.mocked(listEntries)
24
- .mockReturnValueOnce([
25
- "data/minecraft/recipe/oak_planks.json",
26
- "data/mymod/recipe/copper_thing.json",
27
- ])
28
- .mockReturnValueOnce([
29
- "data/minecraft/recipe/oak_planks.json",
30
- ]);
31
- const result = await findDataConflicts();
32
- expect(result.totalConflicts).toBe(1);
33
- expect(result.modsScanned).toBe(2);
34
- expect(result.conflicts).toHaveLength(1);
35
- expect(result.conflicts[0].path).toBe("data/minecraft/recipe/oak_planks.json");
36
- expect(result.conflicts[0].isVanillaOverride).toBe(true);
37
- expect(result.conflicts[0].modCount).toBe(2);
38
- expect(result.vanillaOverrideConflicts).toBe(1);
39
- });
40
- it("filters by dataType", async () => {
41
- vi.mocked(listModsSlim).mockResolvedValue([MOD_A, MOD_B]);
42
- vi.mocked(listEntries)
43
- .mockReturnValueOnce([
44
- "data/minecraft/recipe/oak_planks.json",
45
- "data/minecraft/loot_tables/blocks/stone.json",
46
- ])
47
- .mockReturnValueOnce([
48
- "data/minecraft/recipe/oak_planks.json",
49
- "data/minecraft/loot_tables/blocks/stone.json",
50
- ]);
51
- const result = await findDataConflicts("recipe");
52
- expect(result.totalConflicts).toBe(1);
53
- expect(result.conflicts[0].path).toContain("/recipe/");
54
- });
55
- it("returns no conflicts when all paths are unique", async () => {
56
- vi.mocked(listModsSlim).mockResolvedValue([MOD_A]);
57
- vi.mocked(listEntries).mockReturnValueOnce(["data/mymod/recipe/thing.json"]);
58
- const result = await findDataConflicts();
59
- expect(result.totalConflicts).toBe(0);
60
- expect(result.conflicts).toHaveLength(0);
61
- });
62
- it("skips directory entries (trailing slash)", async () => {
63
- vi.mocked(listModsSlim).mockResolvedValue([MOD_A, MOD_B]);
64
- vi.mocked(listEntries)
65
- .mockReturnValueOnce(["data/minecraft/recipe/", "data/minecraft/recipe/wood.json"])
66
- .mockReturnValueOnce(["data/minecraft/recipe/", "data/minecraft/recipe/wood.json"]);
67
- const result = await findDataConflicts();
68
- // Directory entry should not count; only the .json file
69
- expect(result.totalConflicts).toBe(1);
70
- expect(result.conflicts[0].path.endsWith("/")).toBe(false);
71
- });
72
- it("builds byType breakdown correctly", async () => {
73
- vi.mocked(listModsSlim).mockResolvedValue([MOD_A, MOD_B]);
74
- vi.mocked(listEntries)
75
- .mockReturnValueOnce([
76
- "data/minecraft/recipe/wood.json",
77
- "data/minecraft/loot_tables/stone.json",
78
- ])
79
- .mockReturnValueOnce([
80
- "data/minecraft/recipe/wood.json",
81
- "data/minecraft/loot_tables/stone.json",
82
- ]);
83
- const result = await findDataConflicts();
84
- expect(result.byType.recipe).toBe(1);
85
- expect(result.byType.loot_tables).toBe(1);
86
- });
87
- it("caps results at limit", async () => {
88
- vi.mocked(listModsSlim).mockResolvedValue([MOD_A, MOD_B]);
89
- // Generate 5 shared paths
90
- const paths = Array.from({ length: 5 }, (_, i) => `data/minecraft/recipe/item_${i}.json`);
91
- vi.mocked(listEntries)
92
- .mockReturnValueOnce(paths)
93
- .mockReturnValueOnce(paths);
94
- const result = await findDataConflicts("all", undefined, undefined, 3);
95
- expect(result.conflicts).toHaveLength(3);
96
- expect(result.capped).toBe(true);
97
- });
98
- });
99
- //# sourceMappingURL=packtools.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"packtools.test.js","sourceRoot":"","sources":["../../src/tools/packtools.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,EAAE,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,EAAE,CAAC,CAAC;IACrC,YAAY,EAAE,EAAE,CAAC,EAAE,EAAE;IACrB,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;IACjB,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;IACtB,aAAa,EAAE,EAAE,CAAC,EAAE,EAAE;CACzB,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IACxB,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE;CACvB,CAAC,CAAC,CAAC;AACJ,EAAE,CAAC,IAAI,CAAC,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/B,QAAQ,EAAE,EAAE,CAAC,EAAE,EAAE;CACpB,CAAC,CAAC,CAAC;AAEJ,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,KAAK,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AACxI,MAAM,KAAK,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AAExI,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IAC/B,UAAU,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;IAErC,EAAE,CAAC,mDAAmD,EAAE,KAAK,IAAI,EAAE;QAC/D,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,KAAK,CAAQ,CAAC,CAAC;QACjE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC;aACjB,mBAAmB,CAAC;YACjB,uCAAuC;YACvC,qCAAqC;SACxC,CAAC;aACD,mBAAmB,CAAC;YACjB,uCAAuC;SAC1C,CAAC,CAAC;QAEP,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAS,CAAC;QAEhD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qBAAqB,EAAE,KAAK,IAAI,EAAE;QACjC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,KAAK,CAAQ,CAAC,CAAC;QACjE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC;aACjB,mBAAmB,CAAC;YACjB,uCAAuC;YACvC,8CAA8C;SACjD,CAAC;aACD,mBAAmB,CAAC;YACjB,uCAAuC;YACvC,8CAA8C;SACjD,CAAC,CAAC;QAEP,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAQ,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC5D,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC,CAAC,KAAK,CAAQ,CAAC,CAAC;QAC1D,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,mBAAmB,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC;QAE7E,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAS,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACtD,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,KAAK,CAAQ,CAAC,CAAC;QACjE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC;aACjB,mBAAmB,CAAC,CAAC,wBAAwB,EAAE,iCAAiC,CAAC,CAAC;aAClF,mBAAmB,CAAC,CAAC,wBAAwB,EAAE,iCAAiC,CAAC,CAAC,CAAC;QAExF,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAS,CAAC;QAChD,wDAAwD;QACxD,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QAC/C,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,KAAK,CAAQ,CAAC,CAAC;QACjE,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC;aACjB,mBAAmB,CAAC;YACjB,iCAAiC;YACjC,uCAAuC;SAC1C,CAAC;aACD,mBAAmB,CAAC;YACjB,iCAAiC;YACjC,uCAAuC;SAC1C,CAAC,CAAC;QAEP,MAAM,MAAM,GAAG,MAAM,iBAAiB,EAAS,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACnC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,iBAAiB,CAAC,CAAC,KAAK,EAAE,KAAK,CAAQ,CAAC,CAAC;QACjE,0BAA0B;QAC1B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,8BAA8B,CAAC,OAAO,CAAC,CAAC;QAC1F,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC;aACjB,mBAAmB,CAAC,KAAK,CAAC;aAC1B,mBAAmB,CAAC,KAAK,CAAC,CAAC;QAEhC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAQ,CAAC;QAC9E,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=version-diff.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"version-diff.test.d.ts","sourceRoot":"","sources":["../../src/tools/version-diff.test.ts"],"names":[],"mappings":""}