From 00638ed8457da068065c13b085a3f5be87a5b8fa Mon Sep 17 00:00:00 2001 From: PalmDevs Date: Fri, 18 Jul 2025 23:36:04 +0700 Subject: [PATCH] feat(lib/modules/metro): switch to proper objects for storage --- lib/modules/src/metro/custom.ts | 38 ++++++++++++-------------------- lib/modules/src/metro/patches.ts | 16 +++++++------- lib/modules/src/metro/utils.ts | 6 ++--- lib/modules/src/types.ts | 16 +++++++------- 4 files changed, 33 insertions(+), 43 deletions(-) diff --git a/lib/modules/src/metro/custom.ts b/lib/modules/src/metro/custom.ts index 35f0b4f..0d0d5fb 100644 --- a/lib/modules/src/metro/custom.ts +++ b/lib/modules/src/metro/custom.ts @@ -13,44 +13,34 @@ const HasImportedAll = 1 << 3 const Initializing = 1 << 4 const InitializedOrInitializing = Initialized | Initializing - const NotInitializedOrInitializingMask = ~InitializedOrInitializing -export const FlagKey = 0 -export const ModuleObjectKey = 1 -const FactoryKey = 2 -const ImportedDefaultKey = 3 -const ImportedAllKey = 4 -const ErrorKey = 5 - export const global = globalThis export const metroRequire = (moduleId => { - const module = mList.get(moduleId)! - const flags = module[FlagKey] - const moduleObject = module[ModuleObjectKey] + const mod = mList.get(moduleId)! + const { flags, module: moduleObject } = mod if (flags & InitializedOrInitializing) return moduleObject.exports - if (flags & HasError) throw module[ErrorKey] + if (flags & HasError) throw mod.error - module[FlagKey] |= Initializing + mod.flags |= Initializing moduleObject.id = moduleId try { - const factory = module[FactoryKey] - module[FactoryKey] = undefined + const { factory } = mod + mod.factory = undefined factory!() - module[FlagKey] = - (flags & NotInitializedOrInitializingMask) | Initialized + mod.flags = (flags & NotInitializedOrInitializingMask) | Initialized return moduleObject.exports } catch (e) { - module[FlagKey] = (flags & NotInitializedOrInitializingMask) | HasError - module[ErrorKey] = e + mod.flags = (flags & NotInitializedOrInitializingMask) | HasError + mod.error = e // @ts-expect-error: We never access this key again - module[ModuleObjectKey] = undefined + mod.module = undefined // @ts-expect-error: Not documented, but used by React Native if (global.ErrorUtils) global.ErrorUtils.reportFatalError(e) @@ -62,20 +52,20 @@ global.__r = metroRequire export const metroImportDefault: Metro.RequireFn = moduleId => { const mod = mList.get(moduleId)! - if (mod[FlagKey] & HasImportedDefault) return mod[ImportedDefaultKey] + if (mod.flags & HasImportedDefault) return mod.importedDefault const exports = metroRequire(moduleId) - return (mod[ImportedDefaultKey] = exports?.__esModule + return (mod.importedDefault = exports?.__esModule ? exports.default : exports) } export const metroImportAll: Metro.RequireFn = moduleId => { const mod = mList.get(moduleId)! - if (mod[FlagKey] & HasImportedAll) return mod[ImportedAllKey] + if (mod.flags & HasImportedAll) return mod.importedAll const exports = metroRequire(moduleId) if (!exports?.__esModule) exports.default = exports - return (mod[ImportedAllKey] = exports) + return (mod.importedAll = exports) } diff --git a/lib/modules/src/metro/patches.ts b/lib/modules/src/metro/patches.ts index ab72261..42c167e 100644 --- a/lib/modules/src/metro/patches.ts +++ b/lib/modules/src/metro/patches.ts @@ -38,16 +38,16 @@ const metroDefine = ( const moduleObject = { exports: {} } - mList.set(id, [ - 0, - moduleObject, - () => { + mList.set(id, { + flags: 0, + module: moduleObject, + factory: () => { handleFactoryCall(factory, moduleObject) }, - undefined, // Imported default - undefined, // Imported all - undefined, // Error - ]) + importedDefault: undefined, + importedAll: undefined, + error: undefined, + }) } /** diff --git a/lib/modules/src/metro/utils.ts b/lib/modules/src/metro/utils.ts index 0d01bb8..72f0f84 100644 --- a/lib/modules/src/metro/utils.ts +++ b/lib/modules/src/metro/utils.ts @@ -1,5 +1,5 @@ import { isProxy } from '@revenge-mod/utils/proxy' -import { FlagKey, Initialized, ModuleObjectKey } from './custom' +import { Initialized } from './custom' import { mDeps, mList } from './patches' import type { Metro } from '../types' @@ -20,7 +20,7 @@ export function getModuleDependencies( * @returns Non-zero number if the module is initialized, `0` if it is not initialized or does not exist. */ export function isModuleInitialized(id: Metro.ModuleID): number | undefined { - return mList.get(id)?.[FlagKey]! & Initialized + return mList.get(id)?.flags! & Initialized } /** @@ -34,7 +34,7 @@ export function isModuleInitialized(id: Metro.ModuleID): number | undefined { export function getInitializedModuleExports( id: Metro.ModuleID, ): Metro.ModuleExports | undefined { - return mList.get(id)?.[ModuleObjectKey]?.exports + return mList.get(id)?.module?.exports } /** diff --git a/lib/modules/src/types.ts b/lib/modules/src/types.ts index f9d6961..13c7d27 100644 --- a/lib/modules/src/types.ts +++ b/lib/modules/src/types.ts @@ -72,14 +72,14 @@ export namespace Metro { } export namespace RevengeMetro { - export type ModuleDefinition = [ - flags: number, - module: Metro.Module, - factory: If void>, - importedDefault?: Metro.ModuleExports, - importedAll?: Metro.ModuleExports, - error?: If, - ] + export type ModuleDefinition = { + flags: number + module: Metro.Module + factory: If void> + importedDefault?: Metro.ModuleExports + importedAll?: Metro.ModuleExports + error?: If + } export type ModuleList = Map }