import type { AssetRef, TTSMod, TTSObject } from '@tts/shared'; import { markParent, traverseMod } from './traverse.js'; /** * Extract every external asset reference from a single object. */ export function extractRefs(o: TTSObject): AssetRef[] { const refs: AssetRef[] = []; const ownerGuid = o.GUID; if (o.CustomPDF?.PDFUrl) { refs.push({ kind: 'pdf', url: o.CustomPDF.PDFUrl, ownerGuid }); } if (o.CustomDeck) { for (const deck of Object.values(o.CustomDeck)) { if (deck.FaceURL) { refs.push({ kind: 'deckFace', url: deck.FaceURL, ownerGuid }); } if (deck.BackURL) { refs.push({ kind: 'deckBack', url: deck.BackURL, ownerGuid }); } } } if (o.CustomImage?.ImageURL) { refs.push({ kind: 'image', url: o.CustomImage.ImageURL, ownerGuid }); } if (o.CustomImage?.ImageSecondaryURL) { refs.push({ kind: 'imageSecondary', url: o.CustomImage.ImageSecondaryURL, ownerGuid, }); } return refs; } /** * Collect all asset references across a whole save, deduped by URL. */ export function collectRefs(mod: TTSMod): AssetRef[] { for (const state of mod.ObjectStates) { markParent(state); } const seen = new Set(); const refs: AssetRef[] = []; for (const o of traverseMod(mod)) { for (const ref of extractRefs(o)) { if (!seen.has(ref.url)) { seen.add(ref.url); refs.push(ref); } } } return refs; } export { markParent, traverseMod } from './traverse.js';