File Merging

File merging occurs when multiple modules attempt to export files to the same target path. ModularMC provides several conflict resolution strategies to handle these situations gracefully.

When File Merging Happens

File conflicts occur when:

  • Multiple modules export to the same target path

  • A module exports to a path that already exists from a previous module

// Module A
export const MAP = [
    {
        source: "zombie_sounds.json",
        target: "RP/sounds/sound_definitions.json"
    }
];

// Module B  
export const MAP = [
    {
        source: "skeleton_sounds.json", 
        target: "RP/sounds/sound_definitions.json"  // Conflict!
    }
];

Conflict Resolution Strategies

Configure how conflicts are handled using the onConflict property:

stop (Default)

Stops processing and reports an error when a conflict is detected.

{
    source: "sounds.json",
    target: "RP/sounds/sound_definitions.json",
    onConflict: "stop"  // Default behavior
}

skip

Skips the conflicting entry and continues processing other files.

{
    source: "backup_sounds.json",
    target: "RP/sounds/sound_definitions.json", 
    onConflict: "skip"  // Skip if file already exists
}

overwrite

Overwrites the existing file with the new one.

{
    source: "final_sounds.json",
    target: "RP/sounds/sound_definitions.json",
    onConflict: "overwrite"  // Replace existing file
}

merge

Intelligently merges JSON and material files by combining their structure.

{
    source: "additional_sounds.json",
    target: "RP/sounds/sound_definitions.json",
    onConflict: "merge"  // Merge with existing JSON content
}

appendStart

Prepends the source file content to the beginning of the existing file (text files only).

{
    source: "header.mcfunction",
    target: "BP/functions/setup.mcfunction",
    onConflict: "appendStart"  // Add to beginning of existing file
}

appendEnd

Appends the source file content to the end of the existing file (text files only).

{
    source: "footer.mcfunction", 
    target: "BP/functions/setup.mcfunction",
    onConflict: "appendEnd"  // Add to end of existing file
}

JSON Merging

The merge strategy works only with JSON files and uses deep merging:

Objects are merged by combining their properties:

// File A
{
    "sound_definitions": {
        "zombie.hurt": {
            "category": "hostile",
            "sounds": ["sounds/mob/zombie/hurt1"]
        }
    }
}

// File B
{
    "sound_definitions": {
        "skeleton.hurt": {
            "category": "hostile", 
            "sounds": ["sounds/mob/skeleton/hurt1"]
        }
    }
}

// Merged Result
{
    "sound_definitions": {
        "zombie.hurt": {
            "category": "hostile",
            "sounds": ["sounds/mob/zombie/hurt1"]
        },
        "skeleton.hurt": {
            "category": "hostile",
            "sounds": ["sounds/mob/skeleton/hurt1"]
        }
    }
}

Arrays are merged by appending elements:

// File A
{
    "tags": ["undead", "hostile"]
}

// File B  
{
    "tags": ["mob", "spawnable"]
}

// Merged Result
{
    "tags": ["undead", "hostile", "mob", "spawnable"]
}