From 9bd47d28a414681390b7c6d781d939dba1bd1bb6 Mon Sep 17 00:00:00 2001 From: amsyarasyiq <82711525+amsyarasyiq@users.noreply.github.com> Date: Sat, 25 May 2024 20:05:42 +0800 Subject: [PATCH] fix(metro/polyfill): correctly polyfill --- src/metro/caches.ts | 26 +++++++------------------- src/metro/modules.ts | 6 +++--- src/metro/polyfills/redesign.ts | 6 ++++++ 3 files changed, 16 insertions(+), 22 deletions(-) diff --git a/src/metro/caches.ts b/src/metro/caches.ts index f10fc93..af646a8 100644 --- a/src/metro/caches.ts +++ b/src/metro/caches.ts @@ -1,15 +1,12 @@ import { ClientInfoManager, MMKVManager } from "@lib/api/native/modules"; import { throttle } from "@lib/utils/throttle"; -const CACHE_VERSION = 19; +const CACHE_VERSION = 24; const BUNNY_METRO_CACHE_KEY = `__bunny_metro_cache_key_v${CACHE_VERSION}__`; export enum ExportsFlags { EXISTS = 1 << 0, - ES_MODULE = 1 << 1, - BLACKLISTED = 1 << 2, - FUNCTION = 1 << 3, - PRIMITIVE = 1 << 4, + BLACKLISTED = 1 << 1 } type ModulesMap = { @@ -25,7 +22,7 @@ function buildInitCache() { const cache = { _v: CACHE_VERSION, _buildNumber: ClientInfoManager.Build as number, - exportsIndex: {} as Record, + exportsIndex: {} as Record, findIndex: {} as Record, polyfillIndex: {} as Record, assetsIndex: {} as Record @@ -65,28 +62,19 @@ const saveCache = throttle(() => { function extractExportsFlags(moduleExports: any) { if (!moduleExports) return 0; - let bit = ExportsFlags.EXISTS; - bit |= moduleExports.__esModule ? ExportsFlags.ES_MODULE : 0; - bit |= typeof moduleExports === "function" ? ExportsFlags.FUNCTION : 0; - if (typeof moduleExports === "string" || typeof moduleExports === "number") { - bit |= ExportsFlags.PRIMITIVE; - } - + const bit = ExportsFlags.EXISTS; return bit; } export function indexExportsFlags(moduleId: number, moduleExports: any) { - const flags: [number, number] = moduleExports.default && moduleExports.__esModule - ? [extractExportsFlags(moduleExports), extractExportsFlags(moduleExports.default)] - : [extractExportsFlags(moduleExports), 0]; - - if (flags[0] !== ExportsFlags.EXISTS && flags[1] !== ExportsFlags.EXISTS) { + const flags = extractExportsFlags(moduleExports); + if (flags !== ExportsFlags.EXISTS) { _metroCache.exportsIndex[moduleId] = flags; } } export function indexBlacklistFlag(id: number) { - _metroCache.exportsIndex[id] ??= [ExportsFlags.BLACKLISTED, 0]; + _metroCache.exportsIndex[id] |= ExportsFlags.BLACKLISTED; } export function getCacherForUniq(uniq: string, allFind: boolean) { diff --git a/src/metro/modules.ts b/src/metro/modules.ts index 3ee31dd..8f71990 100644 --- a/src/metro/modules.ts +++ b/src/metro/modules.ts @@ -20,7 +20,7 @@ for (const key in metroModules) { const metroModule = metroModules[id]; const cache = getMetroCache().exportsIndex[id]; - if (cache?.[0] & ExportsFlags.BLACKLISTED) { + if (cache & ExportsFlags.BLACKLISTED) { blacklistModule(id); continue; } @@ -166,7 +166,7 @@ export function requireModule(id: Metro.ModuleID) { if (!metroModules[0]?.isInitialized) metroRequire(0); if (blacklistedIds.has(id)) return undefined; - if (Number(id) === -1) return require("@metro/polyfills/redesign"); + if (Number(id) === -1) return require("@metro/polyfills/redesign").default; if (metroModules[id]?.isInitialized && !metroModules[id]?.hasError) { return metroRequire(id); @@ -191,7 +191,7 @@ export function requireModule(id: Metro.ModuleID) { } export function* getModules(uniq: string, all = false) { - yield [-1, require("@metro/polyfills/redesign")]; + yield [-1, require("@metro/polyfills/redesign").default]; let cache = getMetroCache().findIndex[uniq]; if (all && !cache?._) cache = undefined; diff --git a/src/metro/polyfills/redesign.ts b/src/metro/polyfills/redesign.ts index 69ffcd8..a2ca6fd 100644 --- a/src/metro/polyfills/redesign.ts +++ b/src/metro/polyfills/redesign.ts @@ -138,4 +138,10 @@ export default new Proxy({}, { return _cache[prop] = bestCandidate[prop]; }, + ownKeys() { + redesignProps.forEach(prop => { + this.get!({}, prop, {}); + }); + return Reflect.ownKeys(_cache); + } });