From c49f3eb471c0c19e85aef24fbbd15e1095e6d467 Mon Sep 17 00:00:00 2001 From: PalmDevs Date: Fri, 31 Jul 2026 13:15:01 +0700 Subject: [PATCH] fix(lib/discord/common)!: split to own submodules + don't restrict everything to init+ --- lib/discord/package.json | 17 +++- lib/discord/src/actions.ts | 2 +- .../src/common/app-start-performance.ts | 1 + lib/discord/src/common/constants.ts | 21 +++++ lib/discord/src/common/import-tracker.ts | 1 + lib/discord/src/common/index.ts | 66 ------------- lib/discord/src/common/logger.ts | 9 ++ lib/discord/src/common/tokens.ts | 9 ++ lib/discord/src/design.ts | 2 +- lib/discord/src/modules/main_tabs_v2.ts | 2 +- lib/externals/src/shopify.ts | 2 +- lib/plugins/src/apis/discord.ts | 93 ++++++++++++++----- lib/plugins/src/apis/index.ts | 2 +- lib/plugins/src/types.ts | 2 +- lib/utils/src/discord.ts | 2 +- scripts/types.ts | 6 +- src/plugins/preinit/api.discord/index.ts | 4 +- .../components/ErrorBoundaryScreen.tsx | 2 +- .../components/NavigatorHeaderWithIcon.tsx | 2 +- .../components/PluginIcon.tsx | 2 +- src/plugins/start/user-badges/styles.ts | 2 +- 21 files changed, 147 insertions(+), 102 deletions(-) create mode 100644 lib/discord/src/common/app-start-performance.ts create mode 100644 lib/discord/src/common/constants.ts create mode 100644 lib/discord/src/common/import-tracker.ts delete mode 100644 lib/discord/src/common/index.ts create mode 100644 lib/discord/src/common/logger.ts create mode 100644 lib/discord/src/common/tokens.ts diff --git a/lib/discord/package.json b/lib/discord/package.json index 132e12b..f6d5076 100644 --- a/lib/discord/package.json +++ b/lib/discord/package.json @@ -9,9 +9,24 @@ "./common": { "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": { "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": { "default": "./src/common/utils.ts" }, @@ -52,4 +67,4 @@ "default": "./src/modules/settings/_internal.ts" } } -} +} \ No newline at end of file diff --git a/lib/discord/src/actions.ts b/lib/discord/src/actions.ts index 8c9b51f..8ca7be6 100644 --- a/lib/discord/src/actions.ts +++ b/lib/discord/src/actions.ts @@ -10,8 +10,8 @@ import { ReactNativeModuleId, } from '@revenge-mod/react' import { proxify } from '@revenge-mod/utils/proxy' -import { ImportTrackerModuleId } from './common' import { DispatcherModuleId } from './common/flux' +import { ImportTrackerModuleId } from './common/import-tracker' import type { DiscordModules } from './types' const { relative, loose } = withDependencies diff --git a/lib/discord/src/common/app-start-performance.ts b/lib/discord/src/common/app-start-performance.ts new file mode 100644 index 0000000..beb5f9a --- /dev/null +++ b/lib/discord/src/common/app-start-performance.ts @@ -0,0 +1 @@ +export { AppStartPerformance } from '../preinit' diff --git a/lib/discord/src/common/constants.ts b/lib/discord/src/common/constants.ts new file mode 100644 index 0000000..b33c4f6 --- /dev/null +++ b/lib/discord/src/common/constants.ts @@ -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('ME') + .and( + withDependencies( + loose([ + null, + relative.withDependencies(loose([relative(2, true)]), 1), + ]), + ), + ) + .keyAs('revenge.discord.common.Constants'), +) diff --git a/lib/discord/src/common/import-tracker.ts b/lib/discord/src/common/import-tracker.ts new file mode 100644 index 0000000..31a1ac6 --- /dev/null +++ b/lib/discord/src/common/import-tracker.ts @@ -0,0 +1 @@ +export { ImportTrackerModuleId } from '../patches/import-tracker' diff --git a/lib/discord/src/common/index.ts b/lib/discord/src/common/index.ts deleted file mode 100644 index cbc0875..0000000 --- a/lib/discord/src/common/index.ts +++ /dev/null @@ -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('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('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' diff --git a/lib/discord/src/common/logger.ts b/lib/discord/src/common/logger.ts new file mode 100644 index 0000000..8bc22dc --- /dev/null +++ b/lib/discord/src/common/logger.ts @@ -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('Logger'), +) as [typeof DiscordModules.Logger, Metro.ModuleID] diff --git a/lib/discord/src/common/tokens.ts b/lib/discord/src/common/tokens.ts new file mode 100644 index 0000000..34312cf --- /dev/null +++ b/lib/discord/src/common/tokens.ts @@ -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, +] diff --git a/lib/discord/src/design.ts b/lib/discord/src/design.ts index e2c5624..a52e6eb 100644 --- a/lib/discord/src/design.ts +++ b/lib/discord/src/design.ts @@ -10,7 +10,7 @@ import { ReactNativeModuleId, } from '@revenge-mod/react' import { proxify } from '@revenge-mod/utils/proxy' -import { ImportTrackerModuleId } from './common' +import { ImportTrackerModuleId } from './common/import-tracker' import type { DiscordModules } from './types' const { loose } = withDependencies diff --git a/lib/discord/src/modules/main_tabs_v2.ts b/lib/discord/src/modules/main_tabs_v2.ts index e623268..510f5ce 100644 --- a/lib/discord/src/modules/main_tabs_v2.ts +++ b/lib/discord/src/modules/main_tabs_v2.ts @@ -4,7 +4,7 @@ import { withProps, } from '@revenge-mod/modules/finders/filters' import { proxify } from '@revenge-mod/utils/proxy' -import { ImportTrackerModuleId } from '../common' +import { ImportTrackerModuleId } from '../common/import-tracker' import type { NavigationContainerRef } from '@react-navigation/core' const { loose, relative } = withDependencies diff --git a/lib/externals/src/shopify.ts b/lib/externals/src/shopify.ts index 07ff3fd..4df4865 100644 --- a/lib/externals/src/shopify.ts +++ b/lib/externals/src/shopify.ts @@ -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 { withDependencies, diff --git a/lib/plugins/src/apis/discord.ts b/lib/plugins/src/apis/discord.ts index 0f02aa4..6867a17 100644 --- a/lib/plugins/src/apis/discord.ts +++ b/lib/plugins/src/apis/discord.ts @@ -1,5 +1,8 @@ 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 DiscordFlux from '@revenge-mod/discord/flux' 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 '.' export interface PreInitPluginApiDiscord { - actions: PreInitPluginApiDiscord.Actions - /** This API is not available in the `preInit` phase. */ - common: unknown - design: PreInitPluginApiDiscord.Design - flux: PreInitPluginApiDiscord.Flux - modules: PreInitPluginApiDiscord.Modules - native: PreInitPluginApiDiscord.Native - utils: PreInitPluginApiDiscord.Utils + actions: PluginApiDiscord.Actions + common: PreInitPluginApiDiscordCommon + design: PluginApiDiscord.Design + flux: PluginApiDiscord.Flux + modules: PluginApiDiscord.Modules + native: PluginApiDiscord.Native + utils: PluginApiDiscord.Utils } 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 Common = typeof import('@revenge-mod/discord/common') + export type Common = + | PreInitPluginApiDiscordCommon + | InitPluginApiDiscordCommon export type Design = typeof import('@revenge-mod/discord/design') export type Flux = typeof import('@revenge-mod/discord/flux') export type Native = typeof import('@revenge-mod/discord/native') @@ -40,23 +67,49 @@ export namespace PreInitPluginApiDiscord { export interface Modules { mainTabsV2: typeof import('@revenge-mod/discord/modules/main_tabs_v2') - settings: typeof import('@revenge-mod/discord/modules/settings') & - typeof import('@revenge-mod/discord/modules/settings/renderer') + settings: typeof import('@revenge-mod/discord/modules/settings') & { + renderer: typeof import('@revenge-mod/discord/modules/settings/renderer') + } } } 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: () => { return DiscordModulesMainTabsV2 }, 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: () => { return DiscordUtilsFinders }, @@ -64,15 +117,11 @@ export const discord = defineLazyProperties( subscriptions: DiscordUtilsMetroSubscriptions, }), }), - } as PreInitPluginApiDiscord, + } as PluginApiDiscord, { actions: () => { return DiscordActions }, - common: () => { - guardIndexInitialized('Discord.common') - return DiscordCommon - }, flux: () => { return DiscordFlux }, diff --git a/lib/plugins/src/apis/index.ts b/lib/plugins/src/apis/index.ts index 6f8d097..f76ed31 100644 --- a/lib/plugins/src/apis/index.ts +++ b/lib/plugins/src/apis/index.ts @@ -43,7 +43,7 @@ defineLazyProperties(pUnscopedApi, { export function guardIndexInitialized(name: string) { if (!isModuleInitialized(0)) 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.`, ) } diff --git a/lib/plugins/src/types.ts b/lib/plugins/src/types.ts index 8c520b8..68f6f40 100644 --- a/lib/plugins/src/types.ts +++ b/lib/plugins/src/types.ts @@ -26,7 +26,7 @@ export interface UnscopedPreInitPluginApi< react: PluginApiReact assets: typeof import('@revenge-mod/assets') externals: PluginApiExternals - /** This API is not available in the `preInit` phase. */ + /** This API is available in and after the `init` phase. */ components: unknown discord: PreInitPluginApiDiscord } diff --git a/lib/utils/src/discord.ts b/lib/utils/src/discord.ts index 719fc56..8c01fc4 100644 --- a/lib/utils/src/discord.ts +++ b/lib/utils/src/discord.ts @@ -1,5 +1,5 @@ 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 { createFilterGenerator, diff --git a/scripts/types.ts b/scripts/types.ts index 62b4149..a1948e4 100644 --- a/scripts/types.ts +++ b/scripts/types.ts @@ -246,8 +246,12 @@ function getLibraries() { ]), library(discord, [ 'actions', - 'common', + 'common/app-start-performance', + 'common/constants', 'common/flux', + 'common/import-tracker', + 'common/logger', + 'common/tokens', 'common/utils', 'design', 'flux', diff --git a/src/plugins/preinit/api.discord/index.ts b/src/plugins/preinit/api.discord/index.ts index 69d9c2c..1838090 100644 --- a/src/plugins/preinit/api.discord/index.ts +++ b/src/plugins/preinit/api.discord/index.ts @@ -18,7 +18,9 @@ registerInternalPlugin( decorate, unscoped: { discord: { - common: { Logger }, + common: { + logger: { Logger }, + }, }, }, }) { diff --git a/src/plugins/start/error-boundary/components/ErrorBoundaryScreen.tsx b/src/plugins/start/error-boundary/components/ErrorBoundaryScreen.tsx index 2745ba6..794ea21 100644 --- a/src/plugins/start/error-boundary/components/ErrorBoundaryScreen.tsx +++ b/src/plugins/start/error-boundary/components/ErrorBoundaryScreen.tsx @@ -1,5 +1,5 @@ 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 { ClientInfoModule } from '@revenge-mod/discord/native' import { Clipboard } from '@revenge-mod/externals/react-native-clipboard' diff --git a/src/plugins/start/settings.plugins/components/NavigatorHeaderWithIcon.tsx b/src/plugins/start/settings.plugins/components/NavigatorHeaderWithIcon.tsx index 3f74fb5..42b1df4 100644 --- a/src/plugins/start/settings.plugins/components/NavigatorHeaderWithIcon.tsx +++ b/src/plugins/start/settings.plugins/components/NavigatorHeaderWithIcon.tsx @@ -1,5 +1,5 @@ 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 { Image } from 'react-native' diff --git a/src/plugins/start/settings.plugins/components/PluginIcon.tsx b/src/plugins/start/settings.plugins/components/PluginIcon.tsx index e908b0a..98e69ba 100644 --- a/src/plugins/start/settings.plugins/components/PluginIcon.tsx +++ b/src/plugins/start/settings.plugins/components/PluginIcon.tsx @@ -1,5 +1,5 @@ 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 { Image } from 'react-native' diff --git a/src/plugins/start/user-badges/styles.ts b/src/plugins/start/user-badges/styles.ts index 1749c24..052d5d3 100644 --- a/src/plugins/start/user-badges/styles.ts +++ b/src/plugins/start/user-badges/styles.ts @@ -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 { StyleSheet } from 'react-native'