@creeperhost/modlens-mcp 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (382) hide show
  1. package/README.md +938 -0
  2. package/dist/access-flags.d.ts +58 -0
  3. package/dist/access-flags.d.ts.map +1 -0
  4. package/dist/access-flags.js +79 -0
  5. package/dist/access-flags.js.map +1 -0
  6. package/dist/access-flags.test.d.ts +2 -0
  7. package/dist/access-flags.test.d.ts.map +1 -0
  8. package/dist/access-flags.test.js +189 -0
  9. package/dist/access-flags.test.js.map +1 -0
  10. package/dist/batch-ingest.d.ts +2 -0
  11. package/dist/batch-ingest.d.ts.map +1 -0
  12. package/dist/batch-ingest.js +54 -0
  13. package/dist/batch-ingest.js.map +1 -0
  14. package/dist/batch-resolve-mixins.d.ts +2 -0
  15. package/dist/batch-resolve-mixins.d.ts.map +1 -0
  16. package/dist/batch-resolve-mixins.js +36 -0
  17. package/dist/batch-resolve-mixins.js.map +1 -0
  18. package/dist/cache.d.ts +16 -0
  19. package/dist/cache.d.ts.map +1 -0
  20. package/dist/cache.js +36 -0
  21. package/dist/cache.js.map +1 -0
  22. package/dist/cli.d.ts +2 -0
  23. package/dist/cli.d.ts.map +1 -0
  24. package/dist/cli.js +1318 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/curseforge.d.ts +53 -0
  27. package/dist/curseforge.d.ts.map +1 -0
  28. package/dist/curseforge.js +104 -0
  29. package/dist/curseforge.js.map +1 -0
  30. package/dist/db-backend.d.ts +17 -0
  31. package/dist/db-backend.d.ts.map +1 -0
  32. package/dist/db-backend.js +40 -0
  33. package/dist/db-backend.js.map +1 -0
  34. package/dist/db.d.ts +11 -0
  35. package/dist/db.d.ts.map +1 -0
  36. package/dist/db.js +55 -0
  37. package/dist/db.js.map +1 -0
  38. package/dist/embed-queue.d.ts +12 -0
  39. package/dist/embed-queue.d.ts.map +1 -0
  40. package/dist/embed-queue.js +103 -0
  41. package/dist/embed-queue.js.map +1 -0
  42. package/dist/embeddings.d.ts +21 -0
  43. package/dist/embeddings.d.ts.map +1 -0
  44. package/dist/embeddings.js +55 -0
  45. package/dist/embeddings.js.map +1 -0
  46. package/dist/env-path.d.ts +19 -0
  47. package/dist/env-path.d.ts.map +1 -0
  48. package/dist/env-path.js +40 -0
  49. package/dist/env-path.js.map +1 -0
  50. package/dist/fetch-utils.d.ts +24 -0
  51. package/dist/fetch-utils.d.ts.map +1 -0
  52. package/dist/fetch-utils.js +73 -0
  53. package/dist/fetch-utils.js.map +1 -0
  54. package/dist/fetch-utils.test.d.ts +2 -0
  55. package/dist/fetch-utils.test.d.ts.map +1 -0
  56. package/dist/fetch-utils.test.js +133 -0
  57. package/dist/fetch-utils.test.js.map +1 -0
  58. package/dist/generated/sqlite/browser.d.ts +55 -0
  59. package/dist/generated/sqlite/browser.d.ts.map +1 -0
  60. package/dist/generated/sqlite/browser.js +18 -0
  61. package/dist/generated/sqlite/browser.js.map +1 -0
  62. package/dist/generated/sqlite/client.d.ts +72 -0
  63. package/dist/generated/sqlite/client.d.ts.map +1 -0
  64. package/dist/generated/sqlite/client.js +33 -0
  65. package/dist/generated/sqlite/client.js.map +1 -0
  66. package/dist/generated/sqlite/commonInputTypes.d.ts +387 -0
  67. package/dist/generated/sqlite/commonInputTypes.d.ts.map +1 -0
  68. package/dist/generated/sqlite/commonInputTypes.js +11 -0
  69. package/dist/generated/sqlite/commonInputTypes.js.map +1 -0
  70. package/dist/generated/sqlite/enums.d.ts +2 -0
  71. package/dist/generated/sqlite/enums.d.ts.map +1 -0
  72. package/dist/generated/sqlite/enums.js +11 -0
  73. package/dist/generated/sqlite/enums.js.map +1 -0
  74. package/dist/generated/sqlite/internal/class.d.ts +226 -0
  75. package/dist/generated/sqlite/internal/class.d.ts.map +1 -0
  76. package/dist/generated/sqlite/internal/class.js +84 -0
  77. package/dist/generated/sqlite/internal/class.js.map +1 -0
  78. package/dist/generated/sqlite/internal/prismaNamespace.d.ts +1344 -0
  79. package/dist/generated/sqlite/internal/prismaNamespace.d.ts.map +1 -0
  80. package/dist/generated/sqlite/internal/prismaNamespace.js +220 -0
  81. package/dist/generated/sqlite/internal/prismaNamespace.js.map +1 -0
  82. package/dist/generated/sqlite/internal/prismaNamespaceBrowser.d.ts +204 -0
  83. package/dist/generated/sqlite/internal/prismaNamespaceBrowser.d.ts.map +1 -0
  84. package/dist/generated/sqlite/internal/prismaNamespaceBrowser.js +191 -0
  85. package/dist/generated/sqlite/internal/prismaNamespaceBrowser.js.map +1 -0
  86. package/dist/generated/sqlite/models/DocEntry.d.ts +1223 -0
  87. package/dist/generated/sqlite/models/DocEntry.d.ts.map +1 -0
  88. package/dist/generated/sqlite/models/DocEntry.js +2 -0
  89. package/dist/generated/sqlite/models/DocEntry.js.map +1 -0
  90. package/dist/generated/sqlite/models/McSourceFile.d.ts +1289 -0
  91. package/dist/generated/sqlite/models/McSourceFile.d.ts.map +1 -0
  92. package/dist/generated/sqlite/models/McSourceFile.js +2 -0
  93. package/dist/generated/sqlite/models/McSourceFile.js.map +1 -0
  94. package/dist/generated/sqlite/models/McVersion.d.ts +1315 -0
  95. package/dist/generated/sqlite/models/McVersion.d.ts.map +1 -0
  96. package/dist/generated/sqlite/models/McVersion.js +2 -0
  97. package/dist/generated/sqlite/models/McVersion.js.map +1 -0
  98. package/dist/generated/sqlite/models/McVersionDiff.d.ts +1061 -0
  99. package/dist/generated/sqlite/models/McVersionDiff.d.ts.map +1 -0
  100. package/dist/generated/sqlite/models/McVersionDiff.js +2 -0
  101. package/dist/generated/sqlite/models/McVersionDiff.js.map +1 -0
  102. package/dist/generated/sqlite/models/Mod.d.ts +2396 -0
  103. package/dist/generated/sqlite/models/Mod.d.ts.map +1 -0
  104. package/dist/generated/sqlite/models/Mod.js +2 -0
  105. package/dist/generated/sqlite/models/Mod.js.map +1 -0
  106. package/dist/generated/sqlite/models/ModClass.d.ts +1254 -0
  107. package/dist/generated/sqlite/models/ModClass.d.ts.map +1 -0
  108. package/dist/generated/sqlite/models/ModClass.js +2 -0
  109. package/dist/generated/sqlite/models/ModClass.js.map +1 -0
  110. package/dist/generated/sqlite/models/ModSourceFile.d.ts +1283 -0
  111. package/dist/generated/sqlite/models/ModSourceFile.d.ts.map +1 -0
  112. package/dist/generated/sqlite/models/ModSourceFile.js +2 -0
  113. package/dist/generated/sqlite/models/ModSourceFile.js.map +1 -0
  114. package/dist/generated/sqlite/models/ModTag.d.ts +1278 -0
  115. package/dist/generated/sqlite/models/ModTag.d.ts.map +1 -0
  116. package/dist/generated/sqlite/models/ModTag.js +2 -0
  117. package/dist/generated/sqlite/models/ModTag.js.map +1 -0
  118. package/dist/generated/sqlite/models/ModVersionDiff.d.ts +1073 -0
  119. package/dist/generated/sqlite/models/ModVersionDiff.d.ts.map +1 -0
  120. package/dist/generated/sqlite/models/ModVersionDiff.js +2 -0
  121. package/dist/generated/sqlite/models/ModVersionDiff.js.map +1 -0
  122. package/dist/generated/sqlite/models/Primer.d.ts +1319 -0
  123. package/dist/generated/sqlite/models/Primer.d.ts.map +1 -0
  124. package/dist/generated/sqlite/models/Primer.js +2 -0
  125. package/dist/generated/sqlite/models/Primer.js.map +1 -0
  126. package/dist/generated/sqlite/models.d.ts +12 -0
  127. package/dist/generated/sqlite/models.d.ts.map +1 -0
  128. package/dist/generated/sqlite/models.js +2 -0
  129. package/dist/generated/sqlite/models.js.map +1 -0
  130. package/dist/jar.d.ts +7 -0
  131. package/dist/jar.d.ts.map +1 -0
  132. package/dist/jar.js +52 -0
  133. package/dist/jar.js.map +1 -0
  134. package/dist/java-tools.d.ts +46 -0
  135. package/dist/java-tools.d.ts.map +1 -0
  136. package/dist/java-tools.js +263 -0
  137. package/dist/java-tools.js.map +1 -0
  138. package/dist/launcher.d.ts +3 -0
  139. package/dist/launcher.d.ts.map +1 -0
  140. package/dist/launcher.js +105 -0
  141. package/dist/launcher.js.map +1 -0
  142. package/dist/mappings.d.ts +95 -0
  143. package/dist/mappings.d.ts.map +1 -0
  144. package/dist/mappings.js +1094 -0
  145. package/dist/mappings.js.map +1 -0
  146. package/dist/mappings.test.d.ts +2 -0
  147. package/dist/mappings.test.d.ts.map +1 -0
  148. package/dist/mappings.test.js +161 -0
  149. package/dist/mappings.test.js.map +1 -0
  150. package/dist/minecraft.d.ts +21 -0
  151. package/dist/minecraft.d.ts.map +1 -0
  152. package/dist/minecraft.js +70 -0
  153. package/dist/minecraft.js.map +1 -0
  154. package/dist/modpacks-ch.d.ts +224 -0
  155. package/dist/modpacks-ch.d.ts.map +1 -0
  156. package/dist/modpacks-ch.js +146 -0
  157. package/dist/modpacks-ch.js.map +1 -0
  158. package/dist/modrinth.d.ts +67 -0
  159. package/dist/modrinth.d.ts.map +1 -0
  160. package/dist/modrinth.js +88 -0
  161. package/dist/modrinth.js.map +1 -0
  162. package/dist/platform-adapter.d.ts +23 -0
  163. package/dist/platform-adapter.d.ts.map +1 -0
  164. package/dist/platform-adapter.js +2 -0
  165. package/dist/platform-adapter.js.map +1 -0
  166. package/dist/platform.d.ts +47 -0
  167. package/dist/platform.d.ts.map +1 -0
  168. package/dist/platform.js +175 -0
  169. package/dist/platform.js.map +1 -0
  170. package/dist/processor.d.ts +51 -0
  171. package/dist/processor.d.ts.map +1 -0
  172. package/dist/processor.js +655 -0
  173. package/dist/processor.js.map +1 -0
  174. package/dist/processor.test.d.ts +2 -0
  175. package/dist/processor.test.d.ts.map +1 -0
  176. package/dist/processor.test.js +629 -0
  177. package/dist/processor.test.js.map +1 -0
  178. package/dist/repositories/embeddings-sqlite.d.ts +38 -0
  179. package/dist/repositories/embeddings-sqlite.d.ts.map +1 -0
  180. package/dist/repositories/embeddings-sqlite.js +208 -0
  181. package/dist/repositories/embeddings-sqlite.js.map +1 -0
  182. package/dist/repositories/embeddings.d.ts +40 -0
  183. package/dist/repositories/embeddings.d.ts.map +1 -0
  184. package/dist/repositories/embeddings.js +136 -0
  185. package/dist/repositories/embeddings.js.map +1 -0
  186. package/dist/repositories/index.d.ts +2 -0
  187. package/dist/repositories/index.d.ts.map +1 -0
  188. package/dist/repositories/index.js +15 -0
  189. package/dist/repositories/index.js.map +1 -0
  190. package/dist/repositories/mcVersion.d.ts +16 -0
  191. package/dist/repositories/mcVersion.d.ts.map +1 -0
  192. package/dist/repositories/mcVersion.js +52 -0
  193. package/dist/repositories/mcVersion.js.map +1 -0
  194. package/dist/repositories/mod.d.ts +241 -0
  195. package/dist/repositories/mod.d.ts.map +1 -0
  196. package/dist/repositories/mod.js +342 -0
  197. package/dist/repositories/mod.js.map +1 -0
  198. package/dist/repositories/packs.d.ts +44 -0
  199. package/dist/repositories/packs.d.ts.map +1 -0
  200. package/dist/repositories/packs.js +138 -0
  201. package/dist/repositories/packs.js.map +1 -0
  202. package/dist/search-adapter.d.ts +34 -0
  203. package/dist/search-adapter.d.ts.map +1 -0
  204. package/dist/search-adapter.js +195 -0
  205. package/dist/search-adapter.js.map +1 -0
  206. package/dist/search.d.ts +6 -0
  207. package/dist/search.d.ts.map +1 -0
  208. package/dist/search.js +54 -0
  209. package/dist/search.js.map +1 -0
  210. package/dist/search.test.d.ts +2 -0
  211. package/dist/search.test.d.ts.map +1 -0
  212. package/dist/search.test.js +71 -0
  213. package/dist/search.test.js.map +1 -0
  214. package/dist/security.d.ts +98 -0
  215. package/dist/security.d.ts.map +1 -0
  216. package/dist/security.js +446 -0
  217. package/dist/security.js.map +1 -0
  218. package/dist/security.test.d.ts +2 -0
  219. package/dist/security.test.d.ts.map +1 -0
  220. package/dist/security.test.js +687 -0
  221. package/dist/security.test.js.map +1 -0
  222. package/dist/server.d.ts +2 -0
  223. package/dist/server.d.ts.map +1 -0
  224. package/dist/server.js +1465 -0
  225. package/dist/server.js.map +1 -0
  226. package/dist/setup.d.ts +2 -0
  227. package/dist/setup.d.ts.map +1 -0
  228. package/dist/setup.js +1113 -0
  229. package/dist/setup.js.map +1 -0
  230. package/dist/tools/bytecode.d.ts +129 -0
  231. package/dist/tools/bytecode.d.ts.map +1 -0
  232. package/dist/tools/bytecode.js +679 -0
  233. package/dist/tools/bytecode.js.map +1 -0
  234. package/dist/tools/catalog.d.ts +54 -0
  235. package/dist/tools/catalog.d.ts.map +1 -0
  236. package/dist/tools/catalog.js +249 -0
  237. package/dist/tools/catalog.js.map +1 -0
  238. package/dist/tools/compat-check.d.ts +23 -0
  239. package/dist/tools/compat-check.d.ts.map +1 -0
  240. package/dist/tools/compat-check.js +250 -0
  241. package/dist/tools/compat-check.js.map +1 -0
  242. package/dist/tools/compat-check.test.d.ts +2 -0
  243. package/dist/tools/compat-check.test.d.ts.map +1 -0
  244. package/dist/tools/compat-check.test.js +179 -0
  245. package/dist/tools/compat-check.test.js.map +1 -0
  246. package/dist/tools/diagnostics.d.ts +10 -0
  247. package/dist/tools/diagnostics.d.ts.map +1 -0
  248. package/dist/tools/diagnostics.js +133 -0
  249. package/dist/tools/diagnostics.js.map +1 -0
  250. package/dist/tools/diagnostics.test.d.ts +2 -0
  251. package/dist/tools/diagnostics.test.d.ts.map +1 -0
  252. package/dist/tools/diagnostics.test.js +168 -0
  253. package/dist/tools/diagnostics.test.js.map +1 -0
  254. package/dist/tools/docs.d.ts +19 -0
  255. package/dist/tools/docs.d.ts.map +1 -0
  256. package/dist/tools/docs.js +230 -0
  257. package/dist/tools/docs.js.map +1 -0
  258. package/dist/tools/embed-registry.d.ts +125 -0
  259. package/dist/tools/embed-registry.d.ts.map +1 -0
  260. package/dist/tools/embed-registry.js +560 -0
  261. package/dist/tools/embed-registry.js.map +1 -0
  262. package/dist/tools/gradle.d.ts +16 -0
  263. package/dist/tools/gradle.d.ts.map +1 -0
  264. package/dist/tools/gradle.js +182 -0
  265. package/dist/tools/gradle.js.map +1 -0
  266. package/dist/tools/graphify.d.ts +144 -0
  267. package/dist/tools/graphify.d.ts.map +1 -0
  268. package/dist/tools/graphify.js +798 -0
  269. package/dist/tools/graphify.js.map +1 -0
  270. package/dist/tools/graphify.test.d.ts +2 -0
  271. package/dist/tools/graphify.test.d.ts.map +1 -0
  272. package/dist/tools/graphify.test.js +39 -0
  273. package/dist/tools/graphify.test.js.map +1 -0
  274. package/dist/tools/ingest.d.ts +85 -0
  275. package/dist/tools/ingest.d.ts.map +1 -0
  276. package/dist/tools/ingest.js +477 -0
  277. package/dist/tools/ingest.js.map +1 -0
  278. package/dist/tools/ingest.test.d.ts +2 -0
  279. package/dist/tools/ingest.test.d.ts.map +1 -0
  280. package/dist/tools/ingest.test.js +340 -0
  281. package/dist/tools/ingest.test.js.map +1 -0
  282. package/dist/tools/kubejs.d.ts +37 -0
  283. package/dist/tools/kubejs.d.ts.map +1 -0
  284. package/dist/tools/kubejs.js +245 -0
  285. package/dist/tools/kubejs.js.map +1 -0
  286. package/dist/tools/mappings.d.ts +17 -0
  287. package/dist/tools/mappings.d.ts.map +1 -0
  288. package/dist/tools/mappings.js +85 -0
  289. package/dist/tools/mappings.js.map +1 -0
  290. package/dist/tools/mc-fts.d.ts +101 -0
  291. package/dist/tools/mc-fts.d.ts.map +1 -0
  292. package/dist/tools/mc-fts.js +279 -0
  293. package/dist/tools/mc-fts.js.map +1 -0
  294. package/dist/tools/mcmeta.d.ts +41 -0
  295. package/dist/tools/mcmeta.d.ts.map +1 -0
  296. package/dist/tools/mcmeta.js +365 -0
  297. package/dist/tools/mcmeta.js.map +1 -0
  298. package/dist/tools/mixin-scan.d.ts +113 -0
  299. package/dist/tools/mixin-scan.d.ts.map +1 -0
  300. package/dist/tools/mixin-scan.js +433 -0
  301. package/dist/tools/mixin-scan.js.map +1 -0
  302. package/dist/tools/mod-data.d.ts +83 -0
  303. package/dist/tools/mod-data.d.ts.map +1 -0
  304. package/dist/tools/mod-data.js +630 -0
  305. package/dist/tools/mod-data.js.map +1 -0
  306. package/dist/tools/mod-tags.d.ts +59 -0
  307. package/dist/tools/mod-tags.d.ts.map +1 -0
  308. package/dist/tools/mod-tags.js +279 -0
  309. package/dist/tools/mod-tags.js.map +1 -0
  310. package/dist/tools/mod-tags.test.d.ts +2 -0
  311. package/dist/tools/mod-tags.test.d.ts.map +1 -0
  312. package/dist/tools/mod-tags.test.js +75 -0
  313. package/dist/tools/mod-tags.test.js.map +1 -0
  314. package/dist/tools/modpacks-ch.d.ts +257 -0
  315. package/dist/tools/modpacks-ch.d.ts.map +1 -0
  316. package/dist/tools/modpacks-ch.js +516 -0
  317. package/dist/tools/modpacks-ch.js.map +1 -0
  318. package/dist/tools/packtools.d.ts +113 -0
  319. package/dist/tools/packtools.d.ts.map +1 -0
  320. package/dist/tools/packtools.js +809 -0
  321. package/dist/tools/packtools.js.map +1 -0
  322. package/dist/tools/packtools.test.d.ts +2 -0
  323. package/dist/tools/packtools.test.d.ts.map +1 -0
  324. package/dist/tools/packtools.test.js +99 -0
  325. package/dist/tools/packtools.test.js.map +1 -0
  326. package/dist/tools/platform.d.ts +68 -0
  327. package/dist/tools/platform.d.ts.map +1 -0
  328. package/dist/tools/platform.js +452 -0
  329. package/dist/tools/platform.js.map +1 -0
  330. package/dist/tools/primers.d.ts +36 -0
  331. package/dist/tools/primers.d.ts.map +1 -0
  332. package/dist/tools/primers.js +451 -0
  333. package/dist/tools/primers.js.map +1 -0
  334. package/dist/tools/reports.d.ts +19 -0
  335. package/dist/tools/reports.d.ts.map +1 -0
  336. package/dist/tools/reports.js +573 -0
  337. package/dist/tools/reports.js.map +1 -0
  338. package/dist/tools/source.d.ts +10 -0
  339. package/dist/tools/source.d.ts.map +1 -0
  340. package/dist/tools/source.js +101 -0
  341. package/dist/tools/source.js.map +1 -0
  342. package/dist/tools/vanilla-data.d.ts +127 -0
  343. package/dist/tools/vanilla-data.d.ts.map +1 -0
  344. package/dist/tools/vanilla-data.js +824 -0
  345. package/dist/tools/vanilla-data.js.map +1 -0
  346. package/dist/tools/vanilla.d.ts +171 -0
  347. package/dist/tools/vanilla.d.ts.map +1 -0
  348. package/dist/tools/vanilla.js +612 -0
  349. package/dist/tools/vanilla.js.map +1 -0
  350. package/dist/tools/version-diff.d.ts +113 -0
  351. package/dist/tools/version-diff.d.ts.map +1 -0
  352. package/dist/tools/version-diff.js +519 -0
  353. package/dist/tools/version-diff.js.map +1 -0
  354. package/dist/tools/version-diff.test.d.ts +2 -0
  355. package/dist/tools/version-diff.test.d.ts.map +1 -0
  356. package/dist/tools/version-diff.test.js +102 -0
  357. package/dist/tools/version-diff.test.js.map +1 -0
  358. package/dist/validate.d.ts +19 -0
  359. package/dist/validate.d.ts.map +1 -0
  360. package/dist/validate.js +54 -0
  361. package/dist/validate.js.map +1 -0
  362. package/dist/validate.test.d.ts +2 -0
  363. package/dist/validate.test.d.ts.map +1 -0
  364. package/dist/validate.test.js +73 -0
  365. package/dist/validate.test.js.map +1 -0
  366. package/package.json +62 -0
  367. package/prisma/backends/schema.sqlite.prisma +215 -0
  368. package/prisma/backends/template.db +0 -0
  369. package/prisma/schema.prisma +303 -0
  370. package/scripts/backup.mjs +151 -0
  371. package/scripts/build-template-db.mjs +38 -0
  372. package/scripts/check-atm10.mjs +27 -0
  373. package/scripts/check-sync.mjs +13 -0
  374. package/scripts/create-fts-index.mjs +50 -0
  375. package/scripts/enable-pgvector.mjs +90 -0
  376. package/scripts/enable-sqlite-vec.mjs +158 -0
  377. package/scripts/migrate-backend.mjs +188 -0
  378. package/scripts/migrate-embed-provenance.mjs +80 -0
  379. package/scripts/migrate-metadata-source.mjs +62 -0
  380. package/scripts/migrate-mod-source-files.mjs +67 -0
  381. package/scripts/post-update.mjs +77 -0
  382. package/scripts/verify-atm10.mjs +63 -0
@@ -0,0 +1,629 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processor.test.js","sourceRoot":"","sources":["../src/processor.test.ts"],"names":[],"mappings":"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"}