refactor: circular deps part 12

This commit is contained in:
Nathan Walker
2025-07-09 12:16:50 -07:00
parent 33d967b5b2
commit ee03774ec0
6 changed files with 74 additions and 45 deletions

View File

@ -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);
});
});

View File

@ -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';

View File

@ -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';

View File

@ -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();
}
}

View File

@ -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);

View File

@ -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;
}