From d8d85cfab16bcd2d77351c4c9bc78efe8d860aec Mon Sep 17 00:00:00 2001 From: PalmDevs Date: Tue, 19 Aug 2025 22:12:36 +0700 Subject: [PATCH] fix(lib/modules/metro/runtime): add flag once `importedAll` or `importedDefault` exports cached --- lib/modules/src/finders/_internal.ts | 2 +- lib/modules/src/finders/lookup.ts | 2 +- lib/modules/src/metro/patches.ts | 2 +- lib/modules/src/metro/{custom.ts => runtime.ts} | 11 ++++++++++- lib/modules/src/metro/utils.ts | 2 +- 5 files changed, 14 insertions(+), 5 deletions(-) rename lib/modules/src/metro/{custom.ts => runtime.ts} (80%) diff --git a/lib/modules/src/finders/_internal.ts b/lib/modules/src/finders/_internal.ts index 700d124..365e424 100644 --- a/lib/modules/src/finders/_internal.ts +++ b/lib/modules/src/finders/_internal.ts @@ -1,7 +1,7 @@ import { getCurrentStack } from '@revenge-mod/utils/error' import { cacheFilterResultForId } from '../caches' -import { metroRequire } from '../metro/custom' import { mInitialized } from '../metro/patches' +import { metroRequire } from '../metro/runtime' import { isModuleExportBad } from '../metro/utils' import { FilterFlag } from './filters' import type { If } from '@revenge-mod/utils/types' diff --git a/lib/modules/src/finders/lookup.ts b/lib/modules/src/finders/lookup.ts index 11ba5a7..03ed9ce 100644 --- a/lib/modules/src/finders/lookup.ts +++ b/lib/modules/src/finders/lookup.ts @@ -1,13 +1,13 @@ import { getCurrentStack } from '@revenge-mod/utils/error' import { proxify } from '@revenge-mod/utils/proxy' import { cacheFilterNotFound, getFilterMatches } from '../caches' -import { metroRequire } from '../metro/custom' import { mImportedPaths, mInitialized, mList, mUninitialized, } from '../metro/patches' +import { metroRequire } from '../metro/runtime' import { getInitializedModuleExports, isModuleInitialized, diff --git a/lib/modules/src/metro/patches.ts b/lib/modules/src/metro/patches.ts index bcc3cac..736e158 100644 --- a/lib/modules/src/metro/patches.ts +++ b/lib/modules/src/metro/patches.ts @@ -4,7 +4,7 @@ import { metroImportAll, metroImportDefault, metroRequire, -} from './custom' +} from './runtime' import { onModuleInitialized } from './subscriptions' import { executeImportedPathSubscriptions, diff --git a/lib/modules/src/metro/custom.ts b/lib/modules/src/metro/runtime.ts similarity index 80% rename from lib/modules/src/metro/custom.ts rename to lib/modules/src/metro/runtime.ts index 8f98e49..b838d53 100644 --- a/lib/modules/src/metro/custom.ts +++ b/lib/modules/src/metro/runtime.ts @@ -1,6 +1,8 @@ /** - * A more performant implementation of Metro's core functions. + * A minimal implementation of Metro's runtime with little overhead. * Making initialization faster and use less resources. + * + * Also avoids cloning exports, allowing for patches to be applied directly without checking for clones. */ import { mList } from './patches' @@ -58,6 +60,9 @@ export const metroImportDefault: Metro.RequireFn = moduleId => { if (mod.flags & HasImportedDefault) return mod.importedDefault const exports = metroRequire(moduleId) + + mod.flags |= HasImportedDefault + return (mod.importedDefault = exports?.__esModule ? exports.default : exports) @@ -68,7 +73,11 @@ export const metroImportAll: Metro.RequireFn = moduleId => { if (mod.flags & HasImportedAll) return mod.importedAll const exports = metroRequire(moduleId) + // Our implementation doesn't match Metro's because we modify the exports directly instead of cloning + // But this is why ours is superior, it allows patching the exports without needing to do it more than a single time if (!exports?.__esModule) exports.default = exports + mod.flags |= HasImportedAll + return (mod.importedAll = exports) } diff --git a/lib/modules/src/metro/utils.ts b/lib/modules/src/metro/utils.ts index 91abd31..66c7501 100644 --- a/lib/modules/src/metro/utils.ts +++ b/lib/modules/src/metro/utils.ts @@ -1,6 +1,6 @@ import { isProxy } from '@revenge-mod/utils/proxy' -import { Initialized } from './custom' import { mDeps, mList } from './patches' +import { Initialized } from './runtime' import type { Metro } from '../types' /**