From 7d7d6a4358f61eacf51d43bf1bc5c19480d62e3b Mon Sep 17 00:00:00 2001 From: PalmDevs Date: Sun, 27 Jul 2025 16:33:33 +0700 Subject: [PATCH] feat(lib): small performance improvements --- lib/assets/src/index.ts | 29 ++++++++++------------- lib/discord/src/modules/settings/index.ts | 2 +- lib/modules/src/finders/filters.ts | 11 ++------- lib/modules/src/finders/lookup.ts | 6 ++--- lib/modules/src/metro/patches.ts | 2 +- lib/utils/src/discord.ts | 11 ++------- lib/utils/src/object.ts | 14 ++++++----- 7 files changed, 28 insertions(+), 47 deletions(-) diff --git a/lib/assets/src/index.ts b/lib/assets/src/index.ts index 641a889..bd6cd12 100644 --- a/lib/assets/src/index.ts +++ b/lib/assets/src/index.ts @@ -45,11 +45,9 @@ export function* getCustomAssets(): Generator { * Yields all registered packager assets, including ones with same name but different types. */ export function* getPackagerAssets(): Generator { - for (const name in cache) { - const reg = cache[name] - for (const type in reg) - yield AssetsRegistry.getAssetByID(__r(reg[type])) - } + for (const reg of Object.values(cache)) + for (const moduleId of Object.values(reg)) + yield AssetsRegistry.getAssetByID(__r(moduleId)) } /** @@ -90,7 +88,11 @@ export function getAssetsByName( /** * Get an asset ID by its name. - * If more than one asset is registered with the same name, this will return the one with the preferred type, or the first registered one. + * + * If more than one asset is registered with the same name, this will return the one with the preferred type. + * + * Unless **explicitly** calling with a preferred type, + * another asset with type mismatching the {@link setPreferredAssetType current preferred type} may be returned as a fallback. * * @param name The asset name. * @param type The preferred asset type, defaults to the current preferred type. @@ -102,22 +104,15 @@ export function getAssetIdByName( const reg = cache[name] if (!reg) return - if (type) { + if (type !== undefined) { const mid = reg[type] - if (mid === undefined) return - return __r(mid) + return mid && __r(mid) } let mid = reg[_preferredType] - if (mid === undefined) - for (const t in reg) { - mid = reg[t] - break - } + mid ??= Object.values(reg)[0] - if (mid === undefined) return - - return __r(mid) + return mid && __r(mid) } /** diff --git a/lib/discord/src/modules/settings/index.ts b/lib/discord/src/modules/settings/index.ts index 0d0f0ba..365cad1 100644 --- a/lib/discord/src/modules/settings/index.ts +++ b/lib/discord/src/modules/settings/index.ts @@ -75,7 +75,7 @@ export function registerSettingsItem(key: string, item: SettingsItem) { export function registerSettingsItems(record: Record) { Object.assign(sConfig, record) return () => { - for (const key in record) delete sConfig[key] + for (const key of Object.keys(record)) delete sConfig[key] } } diff --git a/lib/modules/src/finders/filters.ts b/lib/modules/src/finders/filters.ts index ee4bcb1..a3a1546 100644 --- a/lib/modules/src/finders/filters.ts +++ b/lib/modules/src/finders/filters.ts @@ -154,15 +154,8 @@ export type BySingleProp = FilterGenerator< */ export const bySingleProp = createFilterGenerator>( ([prop], _, exports) => { - if (typeof exports === 'object' && prop in exports) { - let hasMultipleProperties = false - for (const _ in exports) { - if (hasMultipleProperties) return false - hasMultipleProperties = true - } - - return true - } + if (typeof exports === 'object' && prop in exports) + return Object.keys(exports).length === 1 return false }, diff --git a/lib/modules/src/finders/lookup.ts b/lib/modules/src/finders/lookup.ts index 6c4e6d3..2e55282 100644 --- a/lib/modules/src/finders/lookup.ts +++ b/lib/modules/src/finders/lookup.ts @@ -170,8 +170,7 @@ export function* lookupModules(filter: Filter, options?: LookupModulesOptions) { if (reg) { cached = new Set() - for (const sId in reg) { - const flag = reg[sId] + for (const [sId, flag] of Object.entries(reg)) { const id = Number(sId) let exports: Metro.ModuleExports | undefined @@ -297,8 +296,7 @@ export function lookupModule(filter: Filter, options?: LookupModulesOptions) { if (reg === null) return NotFoundResult if (reg) - for (const sId in reg) { - const flag = reg[sId] + for (const [sId, flag] of Object.entries(reg)) { const id = Number(sId) let exports: Metro.ModuleExports diff --git a/lib/modules/src/metro/patches.ts b/lib/modules/src/metro/patches.ts index eeed3d1..17638f1 100644 --- a/lib/modules/src/metro/patches.ts +++ b/lib/modules/src/metro/patches.ts @@ -124,7 +124,7 @@ function handleFactoryCall( // @ts-expect-error: Intentional // biome-ignore lint/suspicious/noFallthroughSwitchClause: Intentional case 'object': { - if (Reflect.ownKeys(exports).length) { + if (Object.keys(exports).length) { mInitialized.add(mInitializingId) break } diff --git a/lib/utils/src/discord.ts b/lib/utils/src/discord.ts index 0fe85ac..9e276e9 100644 --- a/lib/utils/src/discord.ts +++ b/lib/utils/src/discord.ts @@ -83,15 +83,8 @@ export const byGeneratedIconComponent = createFilterGenerator< >( (names, id, exports) => { if (typeof exports === 'object') { - if (typeof exports[names[0]] === 'function') { - let hasMultipleProps = false - for (const _ in exports) { - if (hasMultipleProps) return false - hasMultipleProps = true - } - - return true - } + if (typeof exports[names[0]] === 'function') + return Object.keys(exports).length === 1 } else { let filter = IconComponentFilter diff --git a/lib/utils/src/object.ts b/lib/utils/src/object.ts index fd6b0c4..42c59cc 100644 --- a/lib/utils/src/object.ts +++ b/lib/utils/src/object.ts @@ -19,11 +19,11 @@ export function isObject(val: any): val is AnyObject { */ export function mergeDeep(target: AnyObject, source: AnyObject) { if (isObject(target) && isObject(source)) - for (const key in source) - if (isObject(source[key])) { + for (const [key, value] of Object.entries(source)) + if (isObject(value)) { if (!target[key]) Object.assign(target, { [key]: {} }) - mergeDeep(target[key], source[key]) - } else Object.assign(target, { [key]: source[key] }) + mergeDeep(target[key], value) + } else Object.assign(target, { [key]: value }) return target } @@ -61,8 +61,10 @@ export function defineLazyProperties( ) { const descs: PropertyDescriptorMap = {} - for (const key in loaders) - descs[key] = lazyPropDesc(key, loaders[key]!) + for (const [key, loader] of Object.entries(loaders) as Array< + [keyof T, (typeof loaders)[keyof T]] + >) + descs[key] = lazyPropDesc(key, loader!) return Object.defineProperties(target, descs) }