From e92bab6f4fb1251f7bdd7ef0908f1a481947bf22 Mon Sep 17 00:00:00 2001 From: Andrew Quenehen Date: Sat, 1 Aug 2026 05:22:08 -0300 Subject: [PATCH] feat(nx-mods): route chooseMod to inbox rescan on NX Co-authored-by: Cursor --- src/import/RomImporter.lua | 6 ++++++ tests/rom_importer_nx_mods_inbox_test.lua | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/import/RomImporter.lua b/src/import/RomImporter.lua index 6f8e9958..a0bff855 100644 --- a/src/import/RomImporter.lua +++ b/src/import/RomImporter.lua @@ -1202,8 +1202,14 @@ end -- Android mirrors ROM import: scan for a pending .zip in the save dir (USB -- or a fresh SAF drop), else love.system.pickFile("mod") -> picked_mod.zip -- which focus/Choose consumes on return. +-- NX: no HostShell/desktop picker — rescan imports/mods/ inbox instead. function RomImporter:chooseMod() if self.workState == "working" then return end + if self.isNX then + self:ensureModsInboxDir() + self:rescanModsAction() + return + end if self.android then local name = findPendingMod(true, self.pickSkip) if name then diff --git a/tests/rom_importer_nx_mods_inbox_test.lua b/tests/rom_importer_nx_mods_inbox_test.lua index 090ea19a..95000bbe 100644 --- a/tests/rom_importer_nx_mods_inbox_test.lua +++ b/tests/rom_importer_nx_mods_inbox_test.lua @@ -69,6 +69,7 @@ local function freshImporter() scanModsInbox = RomImporter.scanModsInbox, scanInbox = RomImporter.scanInbox, rescanModsAction = RomImporter.rescanModsAction, + chooseMod = RomImporter.chooseMod, _installMod = RomImporter._installMod, _refreshMods = function(self) self._refreshed = (self._refreshed or 0) + 1 @@ -184,11 +185,32 @@ check(not removed["imports/mods/b-good.zip"], "mixed: good zip retained") check(love.filesystem.read("imports/mods/a-bad.zip") ~= nil, "mixed bad still present") check(love.filesystem.read("imports/mods/b-good.zip") ~= nil, "mixed good still present") +-- NXMOD-05: chooseMod on NX routes to inbox rescan; no HostShell/chooseZip +local hostShellCalls = 0 +package.loaded["src.core.HostShell"] = { + run = function() + hostShellCalls = hostShellCalls + 1 + error("HostShell must not run on NX chooseMod") + end, + available = function() return false end, +} +ri = freshImporter() +installCalls = {} +love.filesystem.write("imports/mods/from-choose.zip", "CHOOSE") +installBehavior["imports/mods/from-choose.zip"] = { ok = true, id = "choose-mod" } +ri:chooseMod() +eq(hostShellCalls, 0, "NX chooseMod does not require HostShell") +eq(#installCalls, 1, "NX chooseMod rescans and installs inbox zip") +eq(installCalls[1], "imports/mods/from-choose.zip", + "NX chooseMod installs from imports/mods/") +check(ri.modNotice and ri.modNotice.ok, "NX chooseMod success notice") + -- Cleanup + restore stubs clearModsInbox() love.filesystem.remove("imports/other.zip") love.filesystem.remove("imports/modpack.zip") package.loaded["src.mods.LauncherMods"] = nil +package.loaded["src.core.HostShell"] = nil love.system.getOS = saved.getOS love.filesystem.getSaveDirectory = saved.getSaveDirectory love.filesystem.createDirectory = saved.createDirectory