@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.
- package/README.md +938 -0
- package/dist/access-flags.d.ts +58 -0
- package/dist/access-flags.d.ts.map +1 -0
- package/dist/access-flags.js +79 -0
- package/dist/access-flags.js.map +1 -0
- package/dist/access-flags.test.d.ts +2 -0
- package/dist/access-flags.test.d.ts.map +1 -0
- package/dist/access-flags.test.js +189 -0
- package/dist/access-flags.test.js.map +1 -0
- package/dist/batch-ingest.d.ts +2 -0
- package/dist/batch-ingest.d.ts.map +1 -0
- package/dist/batch-ingest.js +54 -0
- package/dist/batch-ingest.js.map +1 -0
- package/dist/batch-resolve-mixins.d.ts +2 -0
- package/dist/batch-resolve-mixins.d.ts.map +1 -0
- package/dist/batch-resolve-mixins.js +36 -0
- package/dist/batch-resolve-mixins.js.map +1 -0
- package/dist/cache.d.ts +16 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +36 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1318 -0
- package/dist/cli.js.map +1 -0
- package/dist/curseforge.d.ts +53 -0
- package/dist/curseforge.d.ts.map +1 -0
- package/dist/curseforge.js +104 -0
- package/dist/curseforge.js.map +1 -0
- package/dist/db-backend.d.ts +17 -0
- package/dist/db-backend.d.ts.map +1 -0
- package/dist/db-backend.js +40 -0
- package/dist/db-backend.js.map +1 -0
- package/dist/db.d.ts +11 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +55 -0
- package/dist/db.js.map +1 -0
- package/dist/embed-queue.d.ts +12 -0
- package/dist/embed-queue.d.ts.map +1 -0
- package/dist/embed-queue.js +103 -0
- package/dist/embed-queue.js.map +1 -0
- package/dist/embeddings.d.ts +21 -0
- package/dist/embeddings.d.ts.map +1 -0
- package/dist/embeddings.js +55 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/env-path.d.ts +19 -0
- package/dist/env-path.d.ts.map +1 -0
- package/dist/env-path.js +40 -0
- package/dist/env-path.js.map +1 -0
- package/dist/fetch-utils.d.ts +24 -0
- package/dist/fetch-utils.d.ts.map +1 -0
- package/dist/fetch-utils.js +73 -0
- package/dist/fetch-utils.js.map +1 -0
- package/dist/fetch-utils.test.d.ts +2 -0
- package/dist/fetch-utils.test.d.ts.map +1 -0
- package/dist/fetch-utils.test.js +133 -0
- package/dist/fetch-utils.test.js.map +1 -0
- package/dist/generated/sqlite/browser.d.ts +55 -0
- package/dist/generated/sqlite/browser.d.ts.map +1 -0
- package/dist/generated/sqlite/browser.js +18 -0
- package/dist/generated/sqlite/browser.js.map +1 -0
- package/dist/generated/sqlite/client.d.ts +72 -0
- package/dist/generated/sqlite/client.d.ts.map +1 -0
- package/dist/generated/sqlite/client.js +33 -0
- package/dist/generated/sqlite/client.js.map +1 -0
- package/dist/generated/sqlite/commonInputTypes.d.ts +387 -0
- package/dist/generated/sqlite/commonInputTypes.d.ts.map +1 -0
- package/dist/generated/sqlite/commonInputTypes.js +11 -0
- package/dist/generated/sqlite/commonInputTypes.js.map +1 -0
- package/dist/generated/sqlite/enums.d.ts +2 -0
- package/dist/generated/sqlite/enums.d.ts.map +1 -0
- package/dist/generated/sqlite/enums.js +11 -0
- package/dist/generated/sqlite/enums.js.map +1 -0
- package/dist/generated/sqlite/internal/class.d.ts +226 -0
- package/dist/generated/sqlite/internal/class.d.ts.map +1 -0
- package/dist/generated/sqlite/internal/class.js +84 -0
- package/dist/generated/sqlite/internal/class.js.map +1 -0
- package/dist/generated/sqlite/internal/prismaNamespace.d.ts +1344 -0
- package/dist/generated/sqlite/internal/prismaNamespace.d.ts.map +1 -0
- package/dist/generated/sqlite/internal/prismaNamespace.js +220 -0
- package/dist/generated/sqlite/internal/prismaNamespace.js.map +1 -0
- package/dist/generated/sqlite/internal/prismaNamespaceBrowser.d.ts +204 -0
- package/dist/generated/sqlite/internal/prismaNamespaceBrowser.d.ts.map +1 -0
- package/dist/generated/sqlite/internal/prismaNamespaceBrowser.js +191 -0
- package/dist/generated/sqlite/internal/prismaNamespaceBrowser.js.map +1 -0
- package/dist/generated/sqlite/models/DocEntry.d.ts +1223 -0
- package/dist/generated/sqlite/models/DocEntry.d.ts.map +1 -0
- package/dist/generated/sqlite/models/DocEntry.js +2 -0
- package/dist/generated/sqlite/models/DocEntry.js.map +1 -0
- package/dist/generated/sqlite/models/McSourceFile.d.ts +1289 -0
- package/dist/generated/sqlite/models/McSourceFile.d.ts.map +1 -0
- package/dist/generated/sqlite/models/McSourceFile.js +2 -0
- package/dist/generated/sqlite/models/McSourceFile.js.map +1 -0
- package/dist/generated/sqlite/models/McVersion.d.ts +1315 -0
- package/dist/generated/sqlite/models/McVersion.d.ts.map +1 -0
- package/dist/generated/sqlite/models/McVersion.js +2 -0
- package/dist/generated/sqlite/models/McVersion.js.map +1 -0
- package/dist/generated/sqlite/models/McVersionDiff.d.ts +1061 -0
- package/dist/generated/sqlite/models/McVersionDiff.d.ts.map +1 -0
- package/dist/generated/sqlite/models/McVersionDiff.js +2 -0
- package/dist/generated/sqlite/models/McVersionDiff.js.map +1 -0
- package/dist/generated/sqlite/models/Mod.d.ts +2396 -0
- package/dist/generated/sqlite/models/Mod.d.ts.map +1 -0
- package/dist/generated/sqlite/models/Mod.js +2 -0
- package/dist/generated/sqlite/models/Mod.js.map +1 -0
- package/dist/generated/sqlite/models/ModClass.d.ts +1254 -0
- package/dist/generated/sqlite/models/ModClass.d.ts.map +1 -0
- package/dist/generated/sqlite/models/ModClass.js +2 -0
- package/dist/generated/sqlite/models/ModClass.js.map +1 -0
- package/dist/generated/sqlite/models/ModSourceFile.d.ts +1283 -0
- package/dist/generated/sqlite/models/ModSourceFile.d.ts.map +1 -0
- package/dist/generated/sqlite/models/ModSourceFile.js +2 -0
- package/dist/generated/sqlite/models/ModSourceFile.js.map +1 -0
- package/dist/generated/sqlite/models/ModTag.d.ts +1278 -0
- package/dist/generated/sqlite/models/ModTag.d.ts.map +1 -0
- package/dist/generated/sqlite/models/ModTag.js +2 -0
- package/dist/generated/sqlite/models/ModTag.js.map +1 -0
- package/dist/generated/sqlite/models/ModVersionDiff.d.ts +1073 -0
- package/dist/generated/sqlite/models/ModVersionDiff.d.ts.map +1 -0
- package/dist/generated/sqlite/models/ModVersionDiff.js +2 -0
- package/dist/generated/sqlite/models/ModVersionDiff.js.map +1 -0
- package/dist/generated/sqlite/models/Primer.d.ts +1319 -0
- package/dist/generated/sqlite/models/Primer.d.ts.map +1 -0
- package/dist/generated/sqlite/models/Primer.js +2 -0
- package/dist/generated/sqlite/models/Primer.js.map +1 -0
- package/dist/generated/sqlite/models.d.ts +12 -0
- package/dist/generated/sqlite/models.d.ts.map +1 -0
- package/dist/generated/sqlite/models.js +2 -0
- package/dist/generated/sqlite/models.js.map +1 -0
- package/dist/jar.d.ts +7 -0
- package/dist/jar.d.ts.map +1 -0
- package/dist/jar.js +52 -0
- package/dist/jar.js.map +1 -0
- package/dist/java-tools.d.ts +46 -0
- package/dist/java-tools.d.ts.map +1 -0
- package/dist/java-tools.js +263 -0
- package/dist/java-tools.js.map +1 -0
- package/dist/launcher.d.ts +3 -0
- package/dist/launcher.d.ts.map +1 -0
- package/dist/launcher.js +105 -0
- package/dist/launcher.js.map +1 -0
- package/dist/mappings.d.ts +95 -0
- package/dist/mappings.d.ts.map +1 -0
- package/dist/mappings.js +1094 -0
- package/dist/mappings.js.map +1 -0
- package/dist/mappings.test.d.ts +2 -0
- package/dist/mappings.test.d.ts.map +1 -0
- package/dist/mappings.test.js +161 -0
- package/dist/mappings.test.js.map +1 -0
- package/dist/minecraft.d.ts +21 -0
- package/dist/minecraft.d.ts.map +1 -0
- package/dist/minecraft.js +70 -0
- package/dist/minecraft.js.map +1 -0
- package/dist/modpacks-ch.d.ts +224 -0
- package/dist/modpacks-ch.d.ts.map +1 -0
- package/dist/modpacks-ch.js +146 -0
- package/dist/modpacks-ch.js.map +1 -0
- package/dist/modrinth.d.ts +67 -0
- package/dist/modrinth.d.ts.map +1 -0
- package/dist/modrinth.js +88 -0
- package/dist/modrinth.js.map +1 -0
- package/dist/platform-adapter.d.ts +23 -0
- package/dist/platform-adapter.d.ts.map +1 -0
- package/dist/platform-adapter.js +2 -0
- package/dist/platform-adapter.js.map +1 -0
- package/dist/platform.d.ts +47 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +175 -0
- package/dist/platform.js.map +1 -0
- package/dist/processor.d.ts +51 -0
- package/dist/processor.d.ts.map +1 -0
- package/dist/processor.js +655 -0
- package/dist/processor.js.map +1 -0
- package/dist/processor.test.d.ts +2 -0
- package/dist/processor.test.d.ts.map +1 -0
- package/dist/processor.test.js +629 -0
- package/dist/processor.test.js.map +1 -0
- package/dist/repositories/embeddings-sqlite.d.ts +38 -0
- package/dist/repositories/embeddings-sqlite.d.ts.map +1 -0
- package/dist/repositories/embeddings-sqlite.js +208 -0
- package/dist/repositories/embeddings-sqlite.js.map +1 -0
- package/dist/repositories/embeddings.d.ts +40 -0
- package/dist/repositories/embeddings.d.ts.map +1 -0
- package/dist/repositories/embeddings.js +136 -0
- package/dist/repositories/embeddings.js.map +1 -0
- package/dist/repositories/index.d.ts +2 -0
- package/dist/repositories/index.d.ts.map +1 -0
- package/dist/repositories/index.js +15 -0
- package/dist/repositories/index.js.map +1 -0
- package/dist/repositories/mcVersion.d.ts +16 -0
- package/dist/repositories/mcVersion.d.ts.map +1 -0
- package/dist/repositories/mcVersion.js +52 -0
- package/dist/repositories/mcVersion.js.map +1 -0
- package/dist/repositories/mod.d.ts +241 -0
- package/dist/repositories/mod.d.ts.map +1 -0
- package/dist/repositories/mod.js +342 -0
- package/dist/repositories/mod.js.map +1 -0
- package/dist/repositories/packs.d.ts +44 -0
- package/dist/repositories/packs.d.ts.map +1 -0
- package/dist/repositories/packs.js +138 -0
- package/dist/repositories/packs.js.map +1 -0
- package/dist/search-adapter.d.ts +34 -0
- package/dist/search-adapter.d.ts.map +1 -0
- package/dist/search-adapter.js +195 -0
- package/dist/search-adapter.js.map +1 -0
- package/dist/search.d.ts +6 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +54 -0
- package/dist/search.js.map +1 -0
- package/dist/search.test.d.ts +2 -0
- package/dist/search.test.d.ts.map +1 -0
- package/dist/search.test.js +71 -0
- package/dist/search.test.js.map +1 -0
- package/dist/security.d.ts +98 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +446 -0
- package/dist/security.js.map +1 -0
- package/dist/security.test.d.ts +2 -0
- package/dist/security.test.d.ts.map +1 -0
- package/dist/security.test.js +687 -0
- package/dist/security.test.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1465 -0
- package/dist/server.js.map +1 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +1113 -0
- package/dist/setup.js.map +1 -0
- package/dist/tools/bytecode.d.ts +129 -0
- package/dist/tools/bytecode.d.ts.map +1 -0
- package/dist/tools/bytecode.js +679 -0
- package/dist/tools/bytecode.js.map +1 -0
- package/dist/tools/catalog.d.ts +54 -0
- package/dist/tools/catalog.d.ts.map +1 -0
- package/dist/tools/catalog.js +249 -0
- package/dist/tools/catalog.js.map +1 -0
- package/dist/tools/compat-check.d.ts +23 -0
- package/dist/tools/compat-check.d.ts.map +1 -0
- package/dist/tools/compat-check.js +250 -0
- package/dist/tools/compat-check.js.map +1 -0
- package/dist/tools/compat-check.test.d.ts +2 -0
- package/dist/tools/compat-check.test.d.ts.map +1 -0
- package/dist/tools/compat-check.test.js +179 -0
- package/dist/tools/compat-check.test.js.map +1 -0
- package/dist/tools/diagnostics.d.ts +10 -0
- package/dist/tools/diagnostics.d.ts.map +1 -0
- package/dist/tools/diagnostics.js +133 -0
- package/dist/tools/diagnostics.js.map +1 -0
- package/dist/tools/diagnostics.test.d.ts +2 -0
- package/dist/tools/diagnostics.test.d.ts.map +1 -0
- package/dist/tools/diagnostics.test.js +168 -0
- package/dist/tools/diagnostics.test.js.map +1 -0
- package/dist/tools/docs.d.ts +19 -0
- package/dist/tools/docs.d.ts.map +1 -0
- package/dist/tools/docs.js +230 -0
- package/dist/tools/docs.js.map +1 -0
- package/dist/tools/embed-registry.d.ts +125 -0
- package/dist/tools/embed-registry.d.ts.map +1 -0
- package/dist/tools/embed-registry.js +560 -0
- package/dist/tools/embed-registry.js.map +1 -0
- package/dist/tools/gradle.d.ts +16 -0
- package/dist/tools/gradle.d.ts.map +1 -0
- package/dist/tools/gradle.js +182 -0
- package/dist/tools/gradle.js.map +1 -0
- package/dist/tools/graphify.d.ts +144 -0
- package/dist/tools/graphify.d.ts.map +1 -0
- package/dist/tools/graphify.js +798 -0
- package/dist/tools/graphify.js.map +1 -0
- package/dist/tools/graphify.test.d.ts +2 -0
- package/dist/tools/graphify.test.d.ts.map +1 -0
- package/dist/tools/graphify.test.js +39 -0
- package/dist/tools/graphify.test.js.map +1 -0
- package/dist/tools/ingest.d.ts +85 -0
- package/dist/tools/ingest.d.ts.map +1 -0
- package/dist/tools/ingest.js +477 -0
- package/dist/tools/ingest.js.map +1 -0
- package/dist/tools/ingest.test.d.ts +2 -0
- package/dist/tools/ingest.test.d.ts.map +1 -0
- package/dist/tools/ingest.test.js +340 -0
- package/dist/tools/ingest.test.js.map +1 -0
- package/dist/tools/kubejs.d.ts +37 -0
- package/dist/tools/kubejs.d.ts.map +1 -0
- package/dist/tools/kubejs.js +245 -0
- package/dist/tools/kubejs.js.map +1 -0
- package/dist/tools/mappings.d.ts +17 -0
- package/dist/tools/mappings.d.ts.map +1 -0
- package/dist/tools/mappings.js +85 -0
- package/dist/tools/mappings.js.map +1 -0
- package/dist/tools/mc-fts.d.ts +101 -0
- package/dist/tools/mc-fts.d.ts.map +1 -0
- package/dist/tools/mc-fts.js +279 -0
- package/dist/tools/mc-fts.js.map +1 -0
- package/dist/tools/mcmeta.d.ts +41 -0
- package/dist/tools/mcmeta.d.ts.map +1 -0
- package/dist/tools/mcmeta.js +365 -0
- package/dist/tools/mcmeta.js.map +1 -0
- package/dist/tools/mixin-scan.d.ts +113 -0
- package/dist/tools/mixin-scan.d.ts.map +1 -0
- package/dist/tools/mixin-scan.js +433 -0
- package/dist/tools/mixin-scan.js.map +1 -0
- package/dist/tools/mod-data.d.ts +83 -0
- package/dist/tools/mod-data.d.ts.map +1 -0
- package/dist/tools/mod-data.js +630 -0
- package/dist/tools/mod-data.js.map +1 -0
- package/dist/tools/mod-tags.d.ts +59 -0
- package/dist/tools/mod-tags.d.ts.map +1 -0
- package/dist/tools/mod-tags.js +279 -0
- package/dist/tools/mod-tags.js.map +1 -0
- package/dist/tools/mod-tags.test.d.ts +2 -0
- package/dist/tools/mod-tags.test.d.ts.map +1 -0
- package/dist/tools/mod-tags.test.js +75 -0
- package/dist/tools/mod-tags.test.js.map +1 -0
- package/dist/tools/modpacks-ch.d.ts +257 -0
- package/dist/tools/modpacks-ch.d.ts.map +1 -0
- package/dist/tools/modpacks-ch.js +516 -0
- package/dist/tools/modpacks-ch.js.map +1 -0
- package/dist/tools/packtools.d.ts +113 -0
- package/dist/tools/packtools.d.ts.map +1 -0
- package/dist/tools/packtools.js +809 -0
- package/dist/tools/packtools.js.map +1 -0
- package/dist/tools/packtools.test.d.ts +2 -0
- package/dist/tools/packtools.test.d.ts.map +1 -0
- package/dist/tools/packtools.test.js +99 -0
- package/dist/tools/packtools.test.js.map +1 -0
- package/dist/tools/platform.d.ts +68 -0
- package/dist/tools/platform.d.ts.map +1 -0
- package/dist/tools/platform.js +452 -0
- package/dist/tools/platform.js.map +1 -0
- package/dist/tools/primers.d.ts +36 -0
- package/dist/tools/primers.d.ts.map +1 -0
- package/dist/tools/primers.js +451 -0
- package/dist/tools/primers.js.map +1 -0
- package/dist/tools/reports.d.ts +19 -0
- package/dist/tools/reports.d.ts.map +1 -0
- package/dist/tools/reports.js +573 -0
- package/dist/tools/reports.js.map +1 -0
- package/dist/tools/source.d.ts +10 -0
- package/dist/tools/source.d.ts.map +1 -0
- package/dist/tools/source.js +101 -0
- package/dist/tools/source.js.map +1 -0
- package/dist/tools/vanilla-data.d.ts +127 -0
- package/dist/tools/vanilla-data.d.ts.map +1 -0
- package/dist/tools/vanilla-data.js +824 -0
- package/dist/tools/vanilla-data.js.map +1 -0
- package/dist/tools/vanilla.d.ts +171 -0
- package/dist/tools/vanilla.d.ts.map +1 -0
- package/dist/tools/vanilla.js +612 -0
- package/dist/tools/vanilla.js.map +1 -0
- package/dist/tools/version-diff.d.ts +113 -0
- package/dist/tools/version-diff.d.ts.map +1 -0
- package/dist/tools/version-diff.js +519 -0
- package/dist/tools/version-diff.js.map +1 -0
- package/dist/tools/version-diff.test.d.ts +2 -0
- package/dist/tools/version-diff.test.d.ts.map +1 -0
- package/dist/tools/version-diff.test.js +102 -0
- package/dist/tools/version-diff.test.js.map +1 -0
- package/dist/validate.d.ts +19 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +54 -0
- package/dist/validate.js.map +1 -0
- package/dist/validate.test.d.ts +2 -0
- package/dist/validate.test.d.ts.map +1 -0
- package/dist/validate.test.js +73 -0
- package/dist/validate.test.js.map +1 -0
- package/package.json +62 -0
- package/prisma/backends/schema.sqlite.prisma +215 -0
- package/prisma/backends/template.db +0 -0
- package/prisma/schema.prisma +303 -0
- package/scripts/backup.mjs +151 -0
- package/scripts/build-template-db.mjs +38 -0
- package/scripts/check-atm10.mjs +27 -0
- package/scripts/check-sync.mjs +13 -0
- package/scripts/create-fts-index.mjs +50 -0
- package/scripts/enable-pgvector.mjs +90 -0
- package/scripts/enable-sqlite-vec.mjs +158 -0
- package/scripts/migrate-backend.mjs +188 -0
- package/scripts/migrate-embed-provenance.mjs +80 -0
- package/scripts/migrate-metadata-source.mjs +62 -0
- package/scripts/migrate-mod-source-files.mjs +67 -0
- package/scripts/post-update.mjs +77 -0
- package/scripts/verify-atm10.mjs +63 -0
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cross-mod mixin scanner.
|
|
3
|
+
*
|
|
4
|
+
* Tools for seeing the full mixin picture across all ingested mods:
|
|
5
|
+
* - List every mod that has mixins (without having to call getMixinTargets per mod)
|
|
6
|
+
* - Full conflict matrix: for each class, every mod that mixes into it
|
|
7
|
+
* - Summary: most-contested classes, mods with the most mixins, etc.
|
|
8
|
+
*/
|
|
9
|
+
import { listModsForMixinScan, findModsByIds, findModById, findModByModId, updateMod, listMods } from "../repositories/mod.js";
|
|
10
|
+
import { getDb } from "../db.js";
|
|
11
|
+
import { getBytecode } from "../java-tools.js";
|
|
12
|
+
import { assertJarPath } from "../security.js";
|
|
13
|
+
import AdmZip from "adm-zip";
|
|
14
|
+
// ── Private helpers ───────────────────────────────────────────────────────────
|
|
15
|
+
async function mixinConflictRaw(loader, mcVersion, minConflicts = 2) {
|
|
16
|
+
const params = [minConflicts];
|
|
17
|
+
const whereClauses = ["has_mixins = true"];
|
|
18
|
+
if (loader) {
|
|
19
|
+
params.push(loader);
|
|
20
|
+
whereClauses.push(`loader = $${params.length}`);
|
|
21
|
+
}
|
|
22
|
+
if (mcVersion) {
|
|
23
|
+
params.push(mcVersion);
|
|
24
|
+
whereClauses.push(`mc_version = $${params.length}`);
|
|
25
|
+
}
|
|
26
|
+
const whereSQL = whereClauses.join(" AND ");
|
|
27
|
+
const db = await getDb();
|
|
28
|
+
const rows = await db.$queryRawUnsafe(`
|
|
29
|
+
WITH deduped AS (
|
|
30
|
+
SELECT DISTINCT ON (mod_id) id, mod_id, mixin_targets
|
|
31
|
+
FROM "mods"
|
|
32
|
+
WHERE ${whereSQL}
|
|
33
|
+
ORDER BY mod_id, id DESC
|
|
34
|
+
)
|
|
35
|
+
SELECT
|
|
36
|
+
t.class_name,
|
|
37
|
+
COUNT(DISTINCT d.mod_id)::int AS mod_count,
|
|
38
|
+
ARRAY_AGG(DISTINCT d.id) AS mod_ids
|
|
39
|
+
FROM deduped d
|
|
40
|
+
CROSS JOIN LATERAL jsonb_array_elements_text(d.mixin_targets::jsonb) AS t(class_name)
|
|
41
|
+
GROUP BY t.class_name
|
|
42
|
+
HAVING COUNT(DISTINCT d.mod_id) >= $1
|
|
43
|
+
ORDER BY mod_count DESC
|
|
44
|
+
`, ...params);
|
|
45
|
+
return rows.map((r) => ({
|
|
46
|
+
className: r.class_name,
|
|
47
|
+
modCount: Number(r.mod_count),
|
|
48
|
+
modIds: r.mod_ids,
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
51
|
+
// ── Public tools ──────────────────────────────────────────────────────────────
|
|
52
|
+
/**
|
|
53
|
+
* List all ingested mods that have mixins, with their target classes.
|
|
54
|
+
* Does NOT scan JARs — reads resolved mixinTargets from DB (populated by resolve_mixin_targets).
|
|
55
|
+
*/
|
|
56
|
+
export async function listModsWithMixins(loader, mcVersion) {
|
|
57
|
+
const mods = (await listModsForMixinScan({ hasMixins: true, loader, mcVersion }));
|
|
58
|
+
return {
|
|
59
|
+
count: mods.length,
|
|
60
|
+
mods: mods.map((m) => {
|
|
61
|
+
const targets = m.mixinTargets ?? [];
|
|
62
|
+
return {
|
|
63
|
+
dbId: m.id,
|
|
64
|
+
modId: m.modId,
|
|
65
|
+
display: m.displayName,
|
|
66
|
+
version: m.version,
|
|
67
|
+
mcVersion: m.mcVersion,
|
|
68
|
+
loader: m.loader,
|
|
69
|
+
mixinConfigs: m.mixinConfigs,
|
|
70
|
+
targetCount: targets.length,
|
|
71
|
+
targets: targets,
|
|
72
|
+
};
|
|
73
|
+
}),
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Full cross-mod mixin conflict matrix.
|
|
78
|
+
*
|
|
79
|
+
* Returns every class that is targeted by 2+ mods, with all mods listed.
|
|
80
|
+
* Uses resolved mixinTargets from the DB.
|
|
81
|
+
*/
|
|
82
|
+
export async function getMixinConflictMatrix(loader, mcVersion, minConflicts = 2) {
|
|
83
|
+
const conflictRows = await mixinConflictRaw(loader, mcVersion, minConflicts);
|
|
84
|
+
// Collect all unique mod IDs referenced across all conflict rows
|
|
85
|
+
const allModIds = [...new Set(conflictRows.flatMap((r) => r.modIds))];
|
|
86
|
+
const modList = allModIds.length ? await findModsByIds(allModIds) : [];
|
|
87
|
+
const modById = new Map(modList.map((m) => [m.id, m]));
|
|
88
|
+
const conflicts = conflictRows.map(({ className, modCount, modIds }) => ({
|
|
89
|
+
class: className,
|
|
90
|
+
mixedByCount: modCount,
|
|
91
|
+
mods: modIds
|
|
92
|
+
.map((id) => {
|
|
93
|
+
const m = modById.get(id);
|
|
94
|
+
return m ? { modId: m.modId, display: m.displayName, version: m.version } : null;
|
|
95
|
+
})
|
|
96
|
+
.filter(Boolean),
|
|
97
|
+
}));
|
|
98
|
+
// Summary stats
|
|
99
|
+
const modConflictCounts = {};
|
|
100
|
+
for (const { mods } of conflicts) {
|
|
101
|
+
for (const m of mods) {
|
|
102
|
+
modConflictCounts[m.modId] = (modConflictCounts[m.modId] ?? 0) + 1;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
const mostConflicted = Object.entries(modConflictCounts)
|
|
106
|
+
.sort((a, b) => b[1] - a[1])
|
|
107
|
+
.slice(0, 10)
|
|
108
|
+
.map(([modId, count]) => ({ modId, conflictingClasses: count }));
|
|
109
|
+
return {
|
|
110
|
+
totalMixinMods: allModIds.length,
|
|
111
|
+
totalTargetClasses: conflictRows.length,
|
|
112
|
+
conflictingClasses: conflicts.length,
|
|
113
|
+
mostConflictedMods: mostConflicted,
|
|
114
|
+
conflicts,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* For a single class, show every mod that mixes into it — same as getMixinConflicts
|
|
119
|
+
* in mixins.ts but includes richer context.
|
|
120
|
+
*/
|
|
121
|
+
export async function getMixinClassDetail(targetClass) {
|
|
122
|
+
// Normalise separators
|
|
123
|
+
const normalClass = targetClass.replace(/\./g, "/");
|
|
124
|
+
const all = await listModsForMixinScan({ hasMixins: true });
|
|
125
|
+
const mods = all.filter((m) => m.mixinTargets?.includes(normalClass));
|
|
126
|
+
return {
|
|
127
|
+
targetClass: normalClass,
|
|
128
|
+
modCount: mods.length,
|
|
129
|
+
isConflicted: mods.length > 1,
|
|
130
|
+
mods: mods.map((m) => ({
|
|
131
|
+
dbId: m.id,
|
|
132
|
+
modId: m.modId,
|
|
133
|
+
display: m.displayName,
|
|
134
|
+
version: m.version,
|
|
135
|
+
mcVersion: m.mcVersion,
|
|
136
|
+
loader: m.loader,
|
|
137
|
+
mixinConfigs: m.mixinConfigs,
|
|
138
|
+
})),
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Top-N most contested classes by number of mods targeting them.
|
|
143
|
+
*/
|
|
144
|
+
export async function getMixinHotspots(top = 20, loader) {
|
|
145
|
+
const mods = await listModsForMixinScan({ hasMixins: true, loader });
|
|
146
|
+
const counts = {};
|
|
147
|
+
for (const mod of mods) {
|
|
148
|
+
for (const cls of mod.mixinTargets ?? []) {
|
|
149
|
+
counts[cls] = (counts[cls] ?? 0) + 1;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const hotspots = Object.entries(counts)
|
|
153
|
+
.sort((a, b) => b[1] - a[1])
|
|
154
|
+
.slice(0, top)
|
|
155
|
+
.map(([cls, count]) => ({ class: cls, modCount: count }));
|
|
156
|
+
return { top, totalClasses: Object.keys(counts).length, hotspots };
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Resolve @Mixin targets for every hasMixins=true mod in the DB.
|
|
160
|
+
* Reads bytecode annotations and updates mixinTargets column.
|
|
161
|
+
* Returns a per-mod summary plus totals.
|
|
162
|
+
*/
|
|
163
|
+
export async function batchResolveMixins(loader, mcVersion) {
|
|
164
|
+
const mods = await listModsForMixinScan({ hasMixins: true, loader, mcVersion });
|
|
165
|
+
let resolved = 0, noneFound = 0, failed = 0;
|
|
166
|
+
const results = [];
|
|
167
|
+
for (const mod of mods) {
|
|
168
|
+
try {
|
|
169
|
+
const r = await resolveMixinTargets(mod.id);
|
|
170
|
+
if (r.targets.length === 0) {
|
|
171
|
+
noneFound++;
|
|
172
|
+
results.push({ dbId: mod.id, modId: mod.modId, version: mod.version, status: "none", targets: 0 });
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
resolved++;
|
|
176
|
+
results.push({ dbId: mod.id, modId: mod.modId, version: mod.version, status: "ok", targets: r.targets.length });
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (e) {
|
|
180
|
+
failed++;
|
|
181
|
+
const msg = e instanceof Error ? e.message : String(e);
|
|
182
|
+
results.push({ dbId: mod.id, modId: mod.modId, version: mod.version, status: `error: ${msg.slice(0, 80)}`, targets: 0 });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
return {
|
|
186
|
+
total: mods.length,
|
|
187
|
+
resolved,
|
|
188
|
+
noneFound,
|
|
189
|
+
failed,
|
|
190
|
+
results,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
// ── Mixin target resolution (from bytecode) ───────────────────────────────────
|
|
194
|
+
function parseMixinTargetsFromJavap(output) {
|
|
195
|
+
const targets = [];
|
|
196
|
+
// Locate the @Mixin annotation block in javap -verbose output
|
|
197
|
+
const annotationIdx = output.indexOf("org.spongepowered.asm.mixin.Mixin(");
|
|
198
|
+
if (annotationIdx === -1)
|
|
199
|
+
return targets;
|
|
200
|
+
// Grab a reasonable chunk after the annotation name
|
|
201
|
+
const block = output.slice(annotationIdx, annotationIdx + 2000);
|
|
202
|
+
/** Normalise a raw class token to internal slash-separated form, stripping
|
|
203
|
+
* bytecode descriptor prefix/suffix (e.g. "Lnet/minecraft/X;" → "net/minecraft/X"). */
|
|
204
|
+
function normalise(raw) {
|
|
205
|
+
let s = raw;
|
|
206
|
+
// Strip leading 'L' and trailing ';' (bytecode descriptor)
|
|
207
|
+
if (s.startsWith("L") && s.endsWith(";"))
|
|
208
|
+
s = s.slice(1, -1);
|
|
209
|
+
else if (s.startsWith("L") && s.includes("/"))
|
|
210
|
+
s = s.slice(1);
|
|
211
|
+
// Dot-notation → slash-notation
|
|
212
|
+
if (!s.includes("/"))
|
|
213
|
+
s = s.replace(/\./g, "/");
|
|
214
|
+
return s;
|
|
215
|
+
}
|
|
216
|
+
// value=[class net.minecraft.X] or value=[class net/minecraft/X] or value=[class Lnet/minecraft/X;]
|
|
217
|
+
// Allow slashes and semicolons in addition to word chars and dots
|
|
218
|
+
for (const m of block.matchAll(/class\s+([\w.$\\/;]+)/g)) {
|
|
219
|
+
const cls = normalise(m[1]);
|
|
220
|
+
if (cls.includes("/") && !targets.includes(cls))
|
|
221
|
+
targets.push(cls);
|
|
222
|
+
}
|
|
223
|
+
// targets=["net/minecraft/X"] or targets={"net/minecraft/X"} (slash-separated strings)
|
|
224
|
+
for (const m of block.matchAll(/"([\w/$]+)"/g)) {
|
|
225
|
+
const cls = m[1];
|
|
226
|
+
if (cls.includes("/") && !targets.includes(cls))
|
|
227
|
+
targets.push(cls);
|
|
228
|
+
}
|
|
229
|
+
return targets;
|
|
230
|
+
}
|
|
231
|
+
/** Read mixin class names fresh from the JAR's mixin config JSON files. */
|
|
232
|
+
function readMixinClassesFromJar(jarPath, mixinConfigs) {
|
|
233
|
+
const zip = new AdmZip(jarPath);
|
|
234
|
+
const classes = [];
|
|
235
|
+
for (const cfg of mixinConfigs) {
|
|
236
|
+
const entry = zip.getEntry(cfg);
|
|
237
|
+
if (!entry)
|
|
238
|
+
continue;
|
|
239
|
+
try {
|
|
240
|
+
const json = JSON.parse(zip.readFile(entry).toString("utf8"));
|
|
241
|
+
const pkg = json.package ? json.package + "." : "";
|
|
242
|
+
const all = [...(json.mixins ?? []), ...(json.client ?? []), ...(json.server ?? [])];
|
|
243
|
+
classes.push(...all.map((c) => pkg + c));
|
|
244
|
+
}
|
|
245
|
+
catch { /* malformed — skip */ }
|
|
246
|
+
}
|
|
247
|
+
return classes;
|
|
248
|
+
}
|
|
249
|
+
export async function resolveMixinTargets(dbId) {
|
|
250
|
+
const mod = await findModById(dbId);
|
|
251
|
+
if (!mod)
|
|
252
|
+
throw new Error(`Mod #${dbId} not found`);
|
|
253
|
+
assertJarPath(mod.jarPath);
|
|
254
|
+
// Always re-read mixin class names from the JAR — never from DB mixinTargets
|
|
255
|
+
// (DB value may already be resolved or stale)
|
|
256
|
+
const mixinClasses = readMixinClassesFromJar(mod.jarPath, mod.mixinConfigs);
|
|
257
|
+
if (!mixinClasses.length)
|
|
258
|
+
return { resolved: 0, failed: 0, skipped: 0, targets: [] };
|
|
259
|
+
const allTargets = new Set();
|
|
260
|
+
let resolved = 0, failed = 0, skipped = 0;
|
|
261
|
+
for (const mixinClass of mixinClasses) {
|
|
262
|
+
const className = mixinClass.replace(/\./g, "/");
|
|
263
|
+
try {
|
|
264
|
+
const bytecode = await getBytecode(mod.jarPath, className);
|
|
265
|
+
const targets = parseMixinTargetsFromJavap(bytecode);
|
|
266
|
+
if (targets.length === 0) {
|
|
267
|
+
skipped++;
|
|
268
|
+
continue;
|
|
269
|
+
}
|
|
270
|
+
targets.forEach((t) => allTargets.add(t));
|
|
271
|
+
resolved++;
|
|
272
|
+
}
|
|
273
|
+
catch {
|
|
274
|
+
failed++;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
const targetArray = [...allTargets];
|
|
278
|
+
await updateMod(dbId, { mixinTargets: targetArray });
|
|
279
|
+
return { resolved, failed, skipped, targets: targetArray };
|
|
280
|
+
}
|
|
281
|
+
export async function getMixinTargets(modId) {
|
|
282
|
+
let mod;
|
|
283
|
+
if (typeof modId === "number" || !isNaN(parseInt(String(modId), 10))) {
|
|
284
|
+
mod = await findModById(Number(modId));
|
|
285
|
+
}
|
|
286
|
+
if (!mod)
|
|
287
|
+
mod = await findModByModId(String(modId));
|
|
288
|
+
if (!mod)
|
|
289
|
+
throw new Error(`Mod not found: ${modId}`);
|
|
290
|
+
return {
|
|
291
|
+
modId: mod.modId,
|
|
292
|
+
displayName: mod.displayName,
|
|
293
|
+
mixinConfigs: mod.mixinConfigs,
|
|
294
|
+
mixinTargets: mod.mixinTargets,
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
export async function getMixinConflicts(targetClass) {
|
|
298
|
+
const all = await listMods({ hasMixins: true, limit: 9999 });
|
|
299
|
+
const mods = all.filter((m) => m.mixinTargets?.includes(targetClass));
|
|
300
|
+
return {
|
|
301
|
+
targetClass,
|
|
302
|
+
conflictingMods: mods,
|
|
303
|
+
count: mods.length,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
export async function getAtEntries(dbId) {
|
|
307
|
+
const mod = await findModById(dbId);
|
|
308
|
+
if (!mod)
|
|
309
|
+
throw new Error(`Mod #${dbId} not found`);
|
|
310
|
+
return {
|
|
311
|
+
modId: mod.modId,
|
|
312
|
+
hasAt: mod.hasAt,
|
|
313
|
+
atEntries: mod.atEntries,
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
export async function getAwEntries(dbId) {
|
|
317
|
+
const mod = await findModById(dbId);
|
|
318
|
+
if (!mod)
|
|
319
|
+
throw new Error(`Mod #${dbId} not found`);
|
|
320
|
+
return {
|
|
321
|
+
modId: mod.modId,
|
|
322
|
+
hasAw: mod.hasAw,
|
|
323
|
+
awEntries: mod.awEntries,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Find all mods whose mixinTargets contain a class in the given package (or subpackage).
|
|
328
|
+
* packagePrefix: slash-separated, e.g. "net/minecraft/world/level" or "net/minecraft/world/entity"
|
|
329
|
+
* mcVersion: optional filter
|
|
330
|
+
*/
|
|
331
|
+
export async function getMixinsTargetingPackage(packagePrefix, mcVersion) {
|
|
332
|
+
const prefix = packagePrefix.replace(/\./g, "/").replace(/\/$/, "");
|
|
333
|
+
const mods = await listMods({
|
|
334
|
+
hasMixins: true,
|
|
335
|
+
mcVersion,
|
|
336
|
+
});
|
|
337
|
+
const results = [];
|
|
338
|
+
for (const mod of mods) {
|
|
339
|
+
const targets = mod.mixinTargets;
|
|
340
|
+
const matching = targets.filter(t => t === prefix || t.startsWith(prefix + "/"));
|
|
341
|
+
if (matching.length > 0) {
|
|
342
|
+
results.push({
|
|
343
|
+
modId: mod.modId,
|
|
344
|
+
displayName: mod.displayName,
|
|
345
|
+
version: mod.version,
|
|
346
|
+
mcVersion: mod.mcVersion,
|
|
347
|
+
loader: mod.loader,
|
|
348
|
+
matchingTargets: matching,
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
return {
|
|
353
|
+
packagePrefix: prefix,
|
|
354
|
+
mcVersion: mcVersion ?? "(all)",
|
|
355
|
+
totalMods: results.length,
|
|
356
|
+
totalTargets: results.reduce((n, r) => n + r.matchingTargets.length, 0),
|
|
357
|
+
mods: results,
|
|
358
|
+
};
|
|
359
|
+
}
|
|
360
|
+
// ── AT/AW conflict detection ───────────────────────────────────────────────────
|
|
361
|
+
/**
|
|
362
|
+
* Find Access Transformer / Access Widener entries where two or more mods
|
|
363
|
+
* target the same class member. Returns entries grouped by target signature so
|
|
364
|
+
* you can see at a glance who's AT-ing what.
|
|
365
|
+
*
|
|
366
|
+
* mcVersion: optional filter
|
|
367
|
+
* loader: optional filter ("neoforge" | "forge" | "fabric" | "quilt")
|
|
368
|
+
*/
|
|
369
|
+
export async function findAtAwConflicts(mcVersion, loader) {
|
|
370
|
+
const mods = await listMods({
|
|
371
|
+
...(mcVersion ? { mcVersion } : {}),
|
|
372
|
+
...(loader ? { loader } : {}),
|
|
373
|
+
});
|
|
374
|
+
// Deduplicate by modId — keep highest DB id (most recently ingested version)
|
|
375
|
+
const dedupedMods = [...mods
|
|
376
|
+
.sort((a, b) => b.id - a.id)
|
|
377
|
+
.reduce((m, mod) => { if (!m.has(mod.modId))
|
|
378
|
+
m.set(mod.modId, mod); return m; }, new Map())
|
|
379
|
+
.values()];
|
|
380
|
+
// Map: canonical target signature → [{mod, access}]
|
|
381
|
+
const atMap = new Map();
|
|
382
|
+
for (const mod of dedupedMods) {
|
|
383
|
+
const addEntry = (sig, access) => {
|
|
384
|
+
if (!atMap.has(sig))
|
|
385
|
+
atMap.set(sig, []);
|
|
386
|
+
atMap.get(sig).push({ mod: mod.modId, display: mod.displayName, version: mod.version, loader: mod.loader, access });
|
|
387
|
+
};
|
|
388
|
+
// AT entries: "accessible method net/minecraft/Foo bar (I)V"
|
|
389
|
+
for (const entry of mod.atEntries ?? []) {
|
|
390
|
+
const clean = (typeof entry === "string" ? entry : JSON.stringify(entry)).trim();
|
|
391
|
+
// Canonical signature = everything after the access modifier word
|
|
392
|
+
const parts = clean.split(/\s+/);
|
|
393
|
+
if (parts.length >= 2) {
|
|
394
|
+
const sig = parts.slice(1).join(" ");
|
|
395
|
+
addEntry(`AT:${sig}`, parts[0]);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
// AW entries: "accessible class net/minecraft/Foo" or "accessible method net/minecraft/Foo bar (I)V"
|
|
399
|
+
for (const entry of mod.awEntries ?? []) {
|
|
400
|
+
const clean = (typeof entry === "string" ? entry : JSON.stringify(entry)).trim();
|
|
401
|
+
const parts = clean.split(/\s+/);
|
|
402
|
+
if (parts.length >= 2) {
|
|
403
|
+
const sig = parts.slice(1).join(" ");
|
|
404
|
+
addEntry(`AW:${sig}`, parts[0]);
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
const conflicts = [...atMap.entries()]
|
|
409
|
+
.filter(([, users]) => users.length >= 2)
|
|
410
|
+
.map(([sig, users]) => {
|
|
411
|
+
const accessValues = new Set(users.map(u => u.access));
|
|
412
|
+
return { target: sig, modCount: users.length, accessConflict: accessValues.size > 1, users };
|
|
413
|
+
})
|
|
414
|
+
.sort((a, b) => b.modCount - a.modCount);
|
|
415
|
+
const accessConflicts = conflicts.filter(c => c.accessConflict);
|
|
416
|
+
const sharedTargets = conflicts.filter(c => !c.accessConflict);
|
|
417
|
+
return {
|
|
418
|
+
mcVersion: mcVersion ?? "(all)",
|
|
419
|
+
loader: loader ?? "(all)",
|
|
420
|
+
totalModsWithAt: dedupedMods.filter(m => m.hasAt).length,
|
|
421
|
+
totalModsWithAw: dedupedMods.filter(m => m.hasAw).length,
|
|
422
|
+
summary: {
|
|
423
|
+
sharedTargets: sharedTargets.length,
|
|
424
|
+
accessConflicts: accessConflicts.length,
|
|
425
|
+
},
|
|
426
|
+
note: accessConflicts.length > 0
|
|
427
|
+
? "accessConflict=true means mods target the same member but request different access levels — last-loaded wins."
|
|
428
|
+
: "No access-level conflicts found; all shared targets request the same access.",
|
|
429
|
+
accessConflicts,
|
|
430
|
+
sharedTargets,
|
|
431
|
+
};
|
|
432
|
+
}
|
|
433
|
+
//# sourceMappingURL=mixin-scan.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mixin-scan.js","sourceRoot":"","sources":["../../src/tools/mixin-scan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tools for reading data/asset files directly from mod JARs.
|
|
3
|
+
*
|
|
4
|
+
* Provides feature parity with the vanilla data tools (recipes, loot tables,
|
|
5
|
+
* advancements, blockstates, models, biomes, sounds, lang, structures) but
|
|
6
|
+
* for any mod in the DB.
|
|
7
|
+
*
|
|
8
|
+
* All functions resolve the mod's JAR path from the DB then use
|
|
9
|
+
* extractEntry / listEntries from jar.ts to read the ZIP/JAR contents.
|
|
10
|
+
* No decompilation is required.
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* List all entries of a registered data type in a mod JAR.
|
|
14
|
+
* type: one of the keys in DATA_TYPES (recipe, loot_table, advancement, blockstate, model, biome, structure, particle, damage_type, enchantment)
|
|
15
|
+
*/
|
|
16
|
+
export declare function listModData(modId: string | number, type: string, opts?: {
|
|
17
|
+
namespace?: string;
|
|
18
|
+
filter?: string;
|
|
19
|
+
}): Promise<object>;
|
|
20
|
+
/**
|
|
21
|
+
* Get a single data entry by resource location from a mod JAR.
|
|
22
|
+
* type: one of the keys in DATA_TYPES
|
|
23
|
+
* id: resource location string, e.g. "mymod:iron_sword" or "iron_sword"
|
|
24
|
+
*/
|
|
25
|
+
export declare function getModData(modId: string | number, type: string, id: string, opts?: {
|
|
26
|
+
namespace?: string;
|
|
27
|
+
}): Promise<object>;
|
|
28
|
+
/**
|
|
29
|
+
* List all files inside a mod JAR under an optional path prefix.
|
|
30
|
+
* prefix: e.g. "data/mymod/recipe/", "assets/mymod/blockstates/"
|
|
31
|
+
*/
|
|
32
|
+
export declare function listModJarFiles(modId: string | number, prefix?: string): Promise<object>;
|
|
33
|
+
/**
|
|
34
|
+
* Read any file from a mod JAR by its internal path.
|
|
35
|
+
* Returns parsed JSON for .json files, cached file path for binary files, raw text for others.
|
|
36
|
+
* path: e.g. "data/mymod/recipe/iron_sword.json", "assets/mymod/sounds.json"
|
|
37
|
+
*/
|
|
38
|
+
export declare function getModJarFile(modId: string | number, path: string): Promise<object>;
|
|
39
|
+
export declare function getModModel(modId: string | number, modelPath: string, namespace?: string): Promise<object>;
|
|
40
|
+
export declare function getModLang(modId: string | number, filter?: string, limit?: number): Promise<object>;
|
|
41
|
+
export declare function getModSounds(modId: string | number, namespace?: string): Promise<object>;
|
|
42
|
+
export declare function listModDataTags(modId: string | number, registry?: string, namespace?: string, filter?: string): Promise<object>;
|
|
43
|
+
export declare function getModDataTag(modId: string | number, registry: string, id: string, namespace?: string): Promise<object>;
|
|
44
|
+
export declare function getModAtlas(modId: string | number, atlas?: string, namespace?: string): Promise<object>;
|
|
45
|
+
/**
|
|
46
|
+
* Maps mod_data type names → list of candidate subdirectory paths under data/<ns>/.
|
|
47
|
+
* Some types have alternate folder names for compatibility across MC versions.
|
|
48
|
+
*/
|
|
49
|
+
export declare const GENERIC_DATA_DIRS: Record<string, string[]>;
|
|
50
|
+
export declare function listModGenericDataType(modId: string | number, typeKey: string, namespace?: string, filter?: string): Promise<object>;
|
|
51
|
+
export declare function getModGenericDataType(modId: string | number, typeKey: string, id: string, namespace?: string): Promise<object>;
|
|
52
|
+
/**
|
|
53
|
+
* Read and parse the mod's loader manifest file:
|
|
54
|
+
* NeoForge/Forge → META-INF/neoforge.mods.toml or META-INF/mods.toml
|
|
55
|
+
* Fabric → fabric.mod.json
|
|
56
|
+
* Quilt → quilt.mod.json
|
|
57
|
+
*
|
|
58
|
+
* Returns raw text (TOML) or parsed JSON depending on format.
|
|
59
|
+
*/
|
|
60
|
+
export declare function getModManifest(modId: string | number): Promise<object>;
|
|
61
|
+
/**
|
|
62
|
+
* List default config files shipped inside the JAR under defaultconfigs/ or config/.
|
|
63
|
+
* These are the starter configs a mod ships; they get copied to the instance config dir on first run.
|
|
64
|
+
*/
|
|
65
|
+
export declare function listModConfigs(modId: string | number): Promise<object>;
|
|
66
|
+
export declare function getModConfig(modId: string | number, path: string): Promise<object>;
|
|
67
|
+
/**
|
|
68
|
+
* Compare data files between two mod versions (by DB id).
|
|
69
|
+
* Returns: files only in A (removed), only in B (added), and files in both whose
|
|
70
|
+
* JSON content changed. Use type filter to scope to a specific category.
|
|
71
|
+
*/
|
|
72
|
+
export declare function diffModData(dbIdA: number, dbIdB: number, dataType?: string): Promise<object>;
|
|
73
|
+
/**
|
|
74
|
+
* Trace the full crafting dependency tree for an item.
|
|
75
|
+
* Recursively resolves all recipes that produce it across all mods in the DB,
|
|
76
|
+
* and for each ingredient finds its recipes too.
|
|
77
|
+
*
|
|
78
|
+
* itemId: resource id of the target item, e.g. "mekanism:steel_ingot"
|
|
79
|
+
* maxDepth: recursion guard (default 6)
|
|
80
|
+
* Returns a tree structure with recipes and their ingredients' sub-trees.
|
|
81
|
+
*/
|
|
82
|
+
export declare function traceRecipeChain(itemId: string, maxDepth?: number): Promise<object>;
|
|
83
|
+
//# sourceMappingURL=mod-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod-data.d.ts","sourceRoot":"","sources":["../../src/tools/mod-data.ts"],"names":[],"mappings":"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"}
|