From ee03774ec0412eb6479116b9546b3ec67a8f7efa Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Wed, 9 Jul 2025 12:16:50 -0700 Subject: [PATCH] refactor: circular deps part 12 --- .../core/application/application-common.ts | 8 ++++ packages/core/index.d.ts | 6 ++- packages/core/index.ts | 6 ++- packages/core/module-name-resolver/helpers.ts | 39 +++++++++++++++ packages/core/module-name-resolver/index.d.ts | 13 +---- packages/core/module-name-resolver/index.ts | 47 +++++++------------ 6 files changed, 74 insertions(+), 45 deletions(-) create mode 100644 packages/core/module-name-resolver/helpers.ts diff --git a/packages/core/application/application-common.ts b/packages/core/application/application-common.ts index 6537e4279..53e2dc892 100644 --- a/packages/core/application/application-common.ts +++ b/packages/core/application/application-common.ts @@ -3,6 +3,7 @@ import { CSSUtils } from '../css/system-classes'; import { Device, Screen } from '../platform'; import { profile } from '../profiling'; import { Trace } from '../trace'; +import { clearResolverCache, prepareAppForModuleResolver, _setResolver } from '../module-name-resolver/helpers'; import { Builder } from '../ui/builder'; import * as bindableResources from '../ui/core/bindable/bindable-resources'; import type { View } from '../ui/core/view'; @@ -629,3 +630,10 @@ export class ApplicationCommon { return this.ios; } } + +prepareAppForModuleResolver(() => { + ApplicationCommon.on('livesync', (args) => clearResolverCache()); + ApplicationCommon.on('orientationChanged', (args) => { + _setResolver(undefined); + }); +}); diff --git a/packages/core/index.d.ts b/packages/core/index.d.ts index 9a7987b49..a074b5329 100644 --- a/packages/core/index.d.ts +++ b/packages/core/index.d.ts @@ -40,8 +40,10 @@ export * as Http from './http'; export { ImageAsset } from './image-asset'; export type { ImageAssetOptions } from './image-asset'; export { ImageSource } from './image-source'; -export { ModuleNameResolver, _setResolver } from './module-name-resolver'; -export type { ModuleListProvider, PlatformContext } from './module-name-resolver'; +export { ModuleNameResolver } from './module-name-resolver'; +export { _setResolver } from './module-name-resolver/helpers'; +export type { PlatformContext } from './module-name-resolver'; +export type { ModuleListProvider } from './module-name-resolver/helpers'; export { isAndroid, isIOS, isVisionOS, isApple, Screen, Device, platformNames } from './platform'; export type { IDevice } from './platform'; export { profile, enable as profilingEnable, disable as profilingDisable, time as profilingTime, uptime as profilingUptime, start as profilingStart, stop as profilingStop, isRunning as profilingIsRunning, dumpProfiles as profilingDumpProfiles, resetProfiles as profilingResetProfiles, startCPUProfile as profilingStartCPU, stopCPUProfile as profilingStopCPU } from './profiling'; diff --git a/packages/core/index.ts b/packages/core/index.ts index ef39e0734..7195ef56b 100644 --- a/packages/core/index.ts +++ b/packages/core/index.ts @@ -31,8 +31,10 @@ export * as Http from './http'; export { ImageAsset } from './image-asset'; export type { ImageAssetOptions } from './image-asset'; export { ImageSource } from './image-source'; -export { ModuleNameResolver, _setResolver } from './module-name-resolver'; -export type { ModuleListProvider, PlatformContext } from './module-name-resolver'; +export { ModuleNameResolver } from './module-name-resolver'; +export { _setResolver } from './module-name-resolver/helpers'; +export type { PlatformContext } from './module-name-resolver'; +export type { ModuleListProvider } from './module-name-resolver/helpers'; export { isAndroid, isIOS, isVisionOS, isApple, Screen, Device, platformNames } from './platform'; export type { IDevice } from './platform'; diff --git a/packages/core/module-name-resolver/helpers.ts b/packages/core/module-name-resolver/helpers.ts new file mode 100644 index 000000000..e66fbd029 --- /dev/null +++ b/packages/core/module-name-resolver/helpers.ts @@ -0,0 +1,39 @@ +export type ModuleListProvider = () => string[]; + +let appForModuleResolverCallback: () => void; +export function prepareAppForModuleResolver(callback: () => void) { + appForModuleResolverCallback = callback; +} + +export function initAppForModuleResolver() { + console.log('initAppForModuleResolver has callback?', appForModuleResolverCallback); + if (appForModuleResolverCallback) { + appForModuleResolverCallback(); + appForModuleResolverCallback = undefined; + } +} + +export interface ModuleNameResolverType { + resolveModuleName(path: string, ext: string): string; + clearCache(): void; +} + +let resolverInstance: ModuleNameResolverType; + +export function getResolveInstance() { + return resolverInstance; +} + +/** + * Used to set a global singular instance of ModuleNameResolver + * @param resolver instance + */ +export function _setResolver(resolver: ModuleNameResolverType) { + resolverInstance = resolver; +} + +export function clearResolverCache() { + if (resolverInstance) { + resolverInstance.clearCache(); + } +} diff --git a/packages/core/module-name-resolver/index.d.ts b/packages/core/module-name-resolver/index.d.ts index 584706f76..812a580fa 100644 --- a/packages/core/module-name-resolver/index.d.ts +++ b/packages/core/module-name-resolver/index.d.ts @@ -2,12 +2,10 @@ * Provides ModuleNameResolver class used for loading files based on device capabilities. */ /** */ -import { PlatformContext } from './qualifier-matcher'; - +import type { PlatformContext } from './qualifier-matcher'; +import type { ModuleListProvider } from './helpers'; export { PlatformContext } from './qualifier-matcher'; -export type ModuleListProvider = () => string[]; - export class ModuleNameResolver { constructor(context: PlatformContext, moduleListProvider?: ModuleListProvider); resolveModuleName(path: string, ext: string): string; @@ -15,10 +13,3 @@ export class ModuleNameResolver { } export function resolveModuleName(path: string, ext: string): string; -export function clearCache(): void; - -/** - * Used to set a global singular instance of ModuleNameResolver - * @param resolver instance - */ -export function _setResolver(resolver: ModuleNameResolver); diff --git a/packages/core/module-name-resolver/index.ts b/packages/core/module-name-resolver/index.ts index 74b77dacd..aa78e17eb 100644 --- a/packages/core/module-name-resolver/index.ts +++ b/packages/core/module-name-resolver/index.ts @@ -1,21 +1,18 @@ import { Screen, Device } from '../platform'; import { PlatformContext, findMatch, stripQualifiers } from './qualifier-matcher'; -import { registerModulesFromFileSystem } from './non-bundle-workflow-compat'; import { Trace } from '../trace'; -import { Application } from '../application'; +import { ModuleNameResolverType, ModuleListProvider, initAppForModuleResolver, getResolveInstance, _setResolver } from './helpers'; export type { PlatformContext } from './qualifier-matcher'; -export type ModuleListProvider = () => string[]; - -export class ModuleNameResolver { +export class ModuleNameResolver implements ModuleNameResolverType { private _cache = {}; - constructor(private context: PlatformContext, private moduleListProvider: ModuleListProvider = global.getRegisteredModules) { - Application.on('livesync', (args) => clearCache()); - Application.on('orientationChanged', (args) => { - resolverInstance = undefined; - }); + constructor( + private context: PlatformContext, + private moduleListProvider: ModuleListProvider = global.getRegisteredModules, + ) { + initAppForModuleResolver(); } public resolveModuleName(path: string, ext: string): string { @@ -57,23 +54,23 @@ export class ModuleNameResolver { } } -let resolverInstance: ModuleNameResolver; - export function resolveModuleName(path: string, ext: string): string { if (global.__snapshot) { return resolveModuleSnapshot(path, ext); } - if (!resolverInstance) { - resolverInstance = new ModuleNameResolver({ - width: Screen.mainScreen.widthDIPs, - height: Screen.mainScreen.heightDIPs, - os: Device.os, - deviceType: Device.deviceType, - }); + if (!getResolveInstance()) { + _setResolver( + new ModuleNameResolver({ + width: Screen.mainScreen.widthDIPs, + height: Screen.mainScreen.heightDIPs, + os: Device.os, + deviceType: Device.deviceType, + }), + ); } - return resolverInstance.resolveModuleName(path, ext); + return getResolveInstance().resolveModuleName(path, ext); } function resolveModuleSnapshot(path, ext) { @@ -89,13 +86,3 @@ function resolveModuleSnapshot(path, ext) { deviceType: 'Phone', }).resolveModuleName(path, ext); } - -export function clearCache() { - if (resolverInstance) { - resolverInstance.clearCache(); - } -} - -export function _setResolver(resolver: ModuleNameResolver) { - resolverInstance = resolver; -}