feat(lib/modules/metro): switch to proper objects for storage
This commit is contained in:
parent
59375836a6
commit
00638ed845
4 changed files with 33 additions and 43 deletions
|
|
@ -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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -72,14 +72,14 @@ export namespace Metro {
|
|||
}
|
||||
|
||||
export namespace RevengeMetro {
|
||||
export type ModuleDefinition<Initialized = boolean> = [
|
||||
flags: number,
|
||||
module: Metro.Module,
|
||||
factory: If<Initialized, undefined, () => void>,
|
||||
importedDefault?: Metro.ModuleExports,
|
||||
importedAll?: Metro.ModuleExports,
|
||||
error?: If<Initialized, undefined, any>,
|
||||
]
|
||||
export type ModuleDefinition<Initialized = boolean> = {
|
||||
flags: number
|
||||
module: Metro.Module
|
||||
factory: If<Initialized, undefined, () => void>
|
||||
importedDefault?: Metro.ModuleExports
|
||||
importedAll?: Metro.ModuleExports
|
||||
error?: If<Initialized, undefined, any>
|
||||
}
|
||||
|
||||
export type ModuleList = Map<Metro.ModuleID, ModuleDefinition>
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue