fix(lib/discord/common)!: split to own submodules + don't restrict everything to init+

This commit is contained in:
PalmDevs 2026-07-31 13:15:01 +07:00
parent 217617a663
commit c49f3eb471
No known key found for this signature in database
GPG key ID: 6FAE8F8677ACA8BA
21 changed files with 147 additions and 102 deletions

View file

@ -9,9 +9,24 @@
"./common": { "./common": {
"default": "./src/common/index.ts" "default": "./src/common/index.ts"
}, },
"./common/app-start-performance": {
"default": "./src/common/app-start-performance.ts"
},
"./common/constants": {
"default": "./src/common/constants.ts"
},
"./common/flux": { "./common/flux": {
"default": "./src/common/flux.ts" "default": "./src/common/flux.ts"
}, },
"./common/import-tracker": {
"default": "./src/common/import-tracker.ts"
},
"./common/logger": {
"default": "./src/common/logger.ts"
},
"./common/tokens": {
"default": "./src/common/tokens.ts"
},
"./common/utils": { "./common/utils": {
"default": "./src/common/utils.ts" "default": "./src/common/utils.ts"
}, },
@ -52,4 +67,4 @@
"default": "./src/modules/settings/_internal.ts" "default": "./src/modules/settings/_internal.ts"
} }
} }
} }

View file

@ -10,8 +10,8 @@ import {
ReactNativeModuleId, ReactNativeModuleId,
} from '@revenge-mod/react' } from '@revenge-mod/react'
import { proxify } from '@revenge-mod/utils/proxy' import { proxify } from '@revenge-mod/utils/proxy'
import { ImportTrackerModuleId } from './common'
import { DispatcherModuleId } from './common/flux' import { DispatcherModuleId } from './common/flux'
import { ImportTrackerModuleId } from './common/import-tracker'
import type { DiscordModules } from './types' import type { DiscordModules } from './types'
const { relative, loose } = withDependencies const { relative, loose } = withDependencies

View file

@ -0,0 +1 @@
export { AppStartPerformance } from '../preinit'

View file

@ -0,0 +1,21 @@
import { lookupModule } from '@revenge-mod/modules/finders'
import {
withDependencies,
withProps,
} from '@revenge-mod/modules/finders/filters'
import type { DiscordModules } from '@revenge-mod/discord/types'
const { loose, relative } = withDependencies
export const [Constants, ConstantsModuleId] = lookupModule(
withProps<DiscordModules.Constants>('ME')
.and(
withDependencies(
loose([
null,
relative.withDependencies(loose([relative(2, true)]), 1),
]),
),
)
.keyAs('revenge.discord.common.Constants'),
)

View file

@ -0,0 +1 @@
export { ImportTrackerModuleId } from '../patches/import-tracker'

View file

@ -1,66 +0,0 @@
import { lookupModule } from '@revenge-mod/modules/finders'
import {
withDependencies,
withName,
withProps,
} from '@revenge-mod/modules/finders/filters'
import { proxify } from '@revenge-mod/utils/proxy'
import type { Metro } from '@revenge-mod/modules/types'
import type { DiscordModules } from '../types'
export { AppStartPerformance } from '../preinit'
export * as flux from './flux'
export * as utils from './utils'
const { loose, relative } = withDependencies
// ../discord_common/js/packages/logger/Logger.tsx
export const [Logger, LoggerModuleId] = lookupModule(
withName<typeof DiscordModules.Logger>('Logger'),
) as [typeof DiscordModules.Logger, Metro.ModuleID]
// ../discord_common/js/packages/tokens/native.tsx
export const [Tokens, TokensModuleId] = lookupModule(withProps('RawColor')) as [
any,
Metro.ModuleID,
]
/**
* If you need to use this ID, unproxify {@link Constants} first.
*
* ```js
* preinit() {
* unproxify(Constants)
* // Module ID will now be set!
* ConstantsModuleId // ...
* }
* ```
*/
export let ConstantsModuleId: Metro.ModuleID | undefined
export let Constants: DiscordModules.Constants = proxify(
() => {
const [module, id] = lookupModule(
withProps<DiscordModules.Constants>('ME')
.and(
withDependencies(
loose([
null,
relative.withDependencies(
loose([relative(2, true)]),
1,
),
]),
),
)
.keyAs('revenge.discord.common.Constants'),
)
if (module) {
ConstantsModuleId = id
return (Constants = module)
}
},
{ hint: {} },
)!
export { ImportTrackerModuleId } from '../patches/import-tracker'

View file

@ -0,0 +1,9 @@
import { lookupModule } from '@revenge-mod/modules/finders'
import { withName } from '@revenge-mod/modules/finders/filters'
import type { DiscordModules } from '@revenge-mod/discord/types'
import type { Metro } from '@revenge-mod/modules/types'
// ../discord_common/js/packages/logger/Logger.tsx
export const [Logger, LoggerModuleId] = lookupModule(
withName<typeof DiscordModules.Logger>('Logger'),
) as [typeof DiscordModules.Logger, Metro.ModuleID]

View file

@ -0,0 +1,9 @@
import { lookupModule } from '@revenge-mod/modules/finders'
import { withProps } from '@revenge-mod/modules/finders/filters'
import type { Metro } from '@revenge-mod/modules/types'
// ../discord_common/js/packages/tokens/native.tsx
export const [Tokens, TokensModuleId] = lookupModule(withProps('RawColor')) as [
any,
Metro.ModuleID,
]

View file

@ -10,7 +10,7 @@ import {
ReactNativeModuleId, ReactNativeModuleId,
} from '@revenge-mod/react' } from '@revenge-mod/react'
import { proxify } from '@revenge-mod/utils/proxy' import { proxify } from '@revenge-mod/utils/proxy'
import { ImportTrackerModuleId } from './common' import { ImportTrackerModuleId } from './common/import-tracker'
import type { DiscordModules } from './types' import type { DiscordModules } from './types'
const { loose } = withDependencies const { loose } = withDependencies

View file

@ -4,7 +4,7 @@ import {
withProps, withProps,
} from '@revenge-mod/modules/finders/filters' } from '@revenge-mod/modules/finders/filters'
import { proxify } from '@revenge-mod/utils/proxy' import { proxify } from '@revenge-mod/utils/proxy'
import { ImportTrackerModuleId } from '../common' import { ImportTrackerModuleId } from '../common/import-tracker'
import type { NavigationContainerRef } from '@react-navigation/core' import type { NavigationContainerRef } from '@react-navigation/core'
const { loose, relative } = withDependencies const { loose, relative } = withDependencies

View file

@ -1,4 +1,4 @@
import { ImportTrackerModuleId } from '@revenge-mod/discord/common' import { ImportTrackerModuleId } from '@revenge-mod/discord/common/import-tracker'
import { lookupModule } from '@revenge-mod/modules/finders' import { lookupModule } from '@revenge-mod/modules/finders'
import { import {
withDependencies, withDependencies,

View file

@ -1,5 +1,8 @@
import defer * as DiscordActions from '@revenge-mod/discord/actions' import defer * as DiscordActions from '@revenge-mod/discord/actions'
import defer * as DiscordCommon from '@revenge-mod/discord/common' import defer * as DiscordCommonConstants from '@revenge-mod/discord/common/constants'
import defer * as DiscordCommonFlux from '@revenge-mod/discord/common/flux'
import defer * as DiscordCommonLogger from '@revenge-mod/discord/common/logger'
import defer * as DiscordCommonTokens from '@revenge-mod/discord/common/tokens'
import defer * as DiscordDesign from '@revenge-mod/discord/design' import defer * as DiscordDesign from '@revenge-mod/discord/design'
import defer * as DiscordFlux from '@revenge-mod/discord/flux' import defer * as DiscordFlux from '@revenge-mod/discord/flux'
import defer * as DiscordModulesMainTabsV2 from '@revenge-mod/discord/modules/main_tabs_v2' import defer * as DiscordModulesMainTabsV2 from '@revenge-mod/discord/modules/main_tabs_v2'
@ -10,23 +13,47 @@ import { defineLazyProperties } from '@revenge-mod/utils/object'
import { guardIndexInitialized } from '.' import { guardIndexInitialized } from '.'
export interface PreInitPluginApiDiscord { export interface PreInitPluginApiDiscord {
actions: PreInitPluginApiDiscord.Actions actions: PluginApiDiscord.Actions
/** This API is not available in the `preInit` phase. */ common: PreInitPluginApiDiscordCommon
common: unknown design: PluginApiDiscord.Design
design: PreInitPluginApiDiscord.Design flux: PluginApiDiscord.Flux
flux: PreInitPluginApiDiscord.Flux modules: PluginApiDiscord.Modules
modules: PreInitPluginApiDiscord.Modules native: PluginApiDiscord.Native
native: PreInitPluginApiDiscord.Native utils: PluginApiDiscord.Utils
utils: PreInitPluginApiDiscord.Utils
} }
export interface InitPluginApiDiscord extends PreInitPluginApiDiscord { export interface InitPluginApiDiscord extends PreInitPluginApiDiscord {
common: PreInitPluginApiDiscord.Common common: InitPluginApiDiscordCommon
} }
export namespace PreInitPluginApiDiscord { interface PreInitPluginApiDiscordCommon {
appStartPerformance: typeof import('@revenge-mod/discord/common/app-start-performance')
importTracker: typeof import('@revenge-mod/discord/common/import-tracker')
utils: typeof import('@revenge-mod/discord/common/utils')
/** This API is available in and after the `init` phase. */
constants: unknown
/** This API is available in and after the `init` phase. */
flux: unknown
/** This API is available in and after the `init` phase. */
logger: unknown
/** This API is available in and after the `init` phase. */
tokens: unknown
}
interface InitPluginApiDiscordCommon extends PreInitPluginApiDiscordCommon {
constants: typeof import('@revenge-mod/discord/common/constants')
flux: typeof import('@revenge-mod/discord/common/flux')
logger: typeof import('@revenge-mod/discord/common/logger')
tokens: typeof import('@revenge-mod/discord/common/tokens')
}
export type PluginApiDiscord = PreInitPluginApiDiscord | InitPluginApiDiscord
export namespace PluginApiDiscord {
export type Actions = typeof import('@revenge-mod/discord/actions') export type Actions = typeof import('@revenge-mod/discord/actions')
export type Common = typeof import('@revenge-mod/discord/common') export type Common =
| PreInitPluginApiDiscordCommon
| InitPluginApiDiscordCommon
export type Design = typeof import('@revenge-mod/discord/design') export type Design = typeof import('@revenge-mod/discord/design')
export type Flux = typeof import('@revenge-mod/discord/flux') export type Flux = typeof import('@revenge-mod/discord/flux')
export type Native = typeof import('@revenge-mod/discord/native') export type Native = typeof import('@revenge-mod/discord/native')
@ -40,23 +67,49 @@ export namespace PreInitPluginApiDiscord {
export interface Modules { export interface Modules {
mainTabsV2: typeof import('@revenge-mod/discord/modules/main_tabs_v2') mainTabsV2: typeof import('@revenge-mod/discord/modules/main_tabs_v2')
settings: typeof import('@revenge-mod/discord/modules/settings') & settings: typeof import('@revenge-mod/discord/modules/settings') & {
typeof import('@revenge-mod/discord/modules/settings/renderer') renderer: typeof import('@revenge-mod/discord/modules/settings/renderer')
}
} }
} }
export const discord = defineLazyProperties( export const discord = defineLazyProperties(
{ {
modules: defineLazyProperties({} as PreInitPluginApiDiscord.Modules, { common: defineLazyProperties(
{
appStartPerformance: require('@revenge-mod/discord/common/app-start-performance'),
importTracker: require('@revenge-mod/discord/common/import-tracker'),
utils: require('@revenge-mod/discord/common/utils'),
} as InitPluginApiDiscordCommon,
{
constants: () => {
guardIndexInitialized('Discord.common.constants')
return DiscordCommonConstants
},
flux: () => {
guardIndexInitialized('Discord.common.flux')
return DiscordCommonFlux
},
logger: () => {
guardIndexInitialized('Discord.common.logger')
return DiscordCommonLogger
},
tokens: () => {
guardIndexInitialized('Discord.common.tokens')
return DiscordCommonTokens
},
},
),
modules: defineLazyProperties({} as PluginApiDiscord.Modules, {
mainTabsV2: () => { mainTabsV2: () => {
return DiscordModulesMainTabsV2 return DiscordModulesMainTabsV2
}, },
settings: () => ({ settings: () => ({
...require('@revenge-mod/discord/modules/settings'), ...require('@revenge-mod/discord/modules/settings'),
...require('@revenge-mod/discord/modules/settings/renderer'), renderer: require('@revenge-mod/discord/modules/settings/renderer'),
}), }),
}), }),
utils: defineLazyProperties({} as PreInitPluginApiDiscord.Utils, { utils: defineLazyProperties({} as PluginApiDiscord.Utils, {
finders: () => { finders: () => {
return DiscordUtilsFinders return DiscordUtilsFinders
}, },
@ -64,15 +117,11 @@ export const discord = defineLazyProperties(
subscriptions: DiscordUtilsMetroSubscriptions, subscriptions: DiscordUtilsMetroSubscriptions,
}), }),
}), }),
} as PreInitPluginApiDiscord, } as PluginApiDiscord,
{ {
actions: () => { actions: () => {
return DiscordActions return DiscordActions
}, },
common: () => {
guardIndexInitialized('Discord.common')
return DiscordCommon
},
flux: () => { flux: () => {
return DiscordFlux return DiscordFlux
}, },

View file

@ -43,7 +43,7 @@ defineLazyProperties(pUnscopedApi, {
export function guardIndexInitialized(name: string) { export function guardIndexInitialized(name: string) {
if (!isModuleInitialized(0)) if (!isModuleInitialized(0))
throw new Error( throw new Error(
`Cannot access ${name} API before index module (ID 0) is initialized`, `Cannot access ${name} API before the init phase: Index module (ID 0) must be initialized first.`,
) )
} }

View file

@ -26,7 +26,7 @@ export interface UnscopedPreInitPluginApi<
react: PluginApiReact react: PluginApiReact
assets: typeof import('@revenge-mod/assets') assets: typeof import('@revenge-mod/assets')
externals: PluginApiExternals externals: PluginApiExternals
/** This API is not available in the `preInit` phase. */ /** This API is available in and after the `init` phase. */
components: unknown components: unknown
discord: PreInitPluginApiDiscord discord: PreInitPluginApiDiscord
} }

View file

@ -1,5 +1,5 @@
import { getAssetByName } from '@revenge-mod/assets' import { getAssetByName } from '@revenge-mod/assets'
import { TokensModuleId } from '@revenge-mod/discord/common' import { TokensModuleId } from '@revenge-mod/discord/common/tokens'
import { lookupModule } from '@revenge-mod/modules/finders' import { lookupModule } from '@revenge-mod/modules/finders'
import { import {
createFilterGenerator, createFilterGenerator,

View file

@ -246,8 +246,12 @@ function getLibraries() {
]), ]),
library(discord, [ library(discord, [
'actions', 'actions',
'common', 'common/app-start-performance',
'common/constants',
'common/flux', 'common/flux',
'common/import-tracker',
'common/logger',
'common/tokens',
'common/utils', 'common/utils',
'design', 'design',
'flux', 'flux',

View file

@ -18,7 +18,9 @@ registerInternalPlugin(
decorate, decorate,
unscoped: { unscoped: {
discord: { discord: {
common: { Logger }, common: {
logger: { Logger },
},
}, },
}, },
}) { }) {

View file

@ -1,5 +1,5 @@
import { styles } from '@revenge-mod/components/_' import { styles } from '@revenge-mod/components/_'
import { Tokens } from '@revenge-mod/discord/common' import { Tokens } from '@revenge-mod/discord/common/tokens'
import { Design } from '@revenge-mod/discord/design' import { Design } from '@revenge-mod/discord/design'
import { ClientInfoModule } from '@revenge-mod/discord/native' import { ClientInfoModule } from '@revenge-mod/discord/native'
import { Clipboard } from '@revenge-mod/externals/react-native-clipboard' import { Clipboard } from '@revenge-mod/externals/react-native-clipboard'

View file

@ -1,5 +1,5 @@
import { getAssetIdByName } from '@revenge-mod/assets' import { getAssetIdByName } from '@revenge-mod/assets'
import { Tokens } from '@revenge-mod/discord/common' import { Tokens } from '@revenge-mod/discord/common/tokens'
import { Design } from '@revenge-mod/discord/design' import { Design } from '@revenge-mod/discord/design'
import { Image } from 'react-native' import { Image } from 'react-native'

View file

@ -1,5 +1,5 @@
import { getAssetIdByName } from '@revenge-mod/assets' import { getAssetIdByName } from '@revenge-mod/assets'
import { Tokens } from '@revenge-mod/discord/common' import { Tokens } from '@revenge-mod/discord/common/tokens'
import { Design } from '@revenge-mod/discord/design' import { Design } from '@revenge-mod/discord/design'
import { Image } from 'react-native' import { Image } from 'react-native'

View file

@ -1,4 +1,4 @@
import { Tokens } from '@revenge-mod/discord/common' import { Tokens } from '@revenge-mod/discord/common/tokens'
import { Design } from '@revenge-mod/discord/design' import { Design } from '@revenge-mod/discord/design'
import { StyleSheet } from 'react-native' import { StyleSheet } from 'react-native'