refactor: circular deps part 9

This commit is contained in:
Nathan Walker
2025-07-09 08:33:52 -07:00
parent 50cfd6fb25
commit d8681cbebd
17 changed files with 65 additions and 58 deletions

View File

@ -0,0 +1,9 @@
// Shared types and interfaces for http and image-source modules.
// Only put platform-agnostic types/interfaces here.
// Example: (add more as needed)
// TODO: look at removing this after circulars are completely resolved.
export interface ImageSourceLike {
toBase64String(format: string, quality?: number): string;
// ... add other shared methods/properties as needed
}

View File

@ -1,4 +1,5 @@
import { ImageSource } from '../image-source'; // import { ImageSource } from '../image-source';
import type { ImageSourceLike } from './http-shared';
import { File } from '../file-system'; import { File } from '../file-system';
/** /**
@ -29,13 +30,13 @@ export function getJSON<T>(options: HttpRequestOptions): Promise<T>;
* Downloads the content from the specified URL and attempts to decode it as an image. * Downloads the content from the specified URL and attempts to decode it as an image.
* @param url The URL to request from. * @param url The URL to request from.
*/ */
export function getImage(url: string): Promise<ImageSource>; export function getImage(url: string): Promise<ImageSourceLike>;
/** /**
* Downloads the content from the specified URL and attempts to decode it as an image. * Downloads the content from the specified URL and attempts to decode it as an image.
* @param options An object that specifies various request options. * @param options An object that specifies various request options.
*/ */
export function getImage(options: HttpRequestOptions): Promise<ImageSource>; export function getImage(options: HttpRequestOptions): Promise<ImageSourceLike>;
/** /**
* Downloads the content from the specified URL and attempts to save it as file. * Downloads the content from the specified URL and attempts to save it as file.
@ -157,7 +158,7 @@ export interface HttpContent {
/** /**
* Gets the response body as ImageSource. * Gets the response body as ImageSource.
*/ */
toImage: () => Promise<ImageSource>; toImage: () => Promise<ImageSourceLike>;
/** /**
* Gets the response body as file. * Gets the response body as file.

View File

@ -1,4 +1,4 @@
import { ImageSource } from '../image-source'; import type { ImageSourceLike } from './http-shared';
import { File } from '../file-system'; import { File } from '../file-system';
import * as httpRequest from './http-request'; import * as httpRequest from './http-request';
export * from './http-request'; export * from './http-request';
@ -91,7 +91,7 @@ export interface HttpContent {
/** /**
* Gets the response body as ImageSource. * Gets the response body as ImageSource.
*/ */
toImage: () => Promise<ImageSource>; toImage: () => Promise<ImageSourceLike>;
/** /**
* Gets the response body as file. * Gets the response body as file.
@ -131,7 +131,7 @@ export function getJSON<T>(arg: any): Promise<T> {
}); });
} }
export function getImage(arg: any): Promise<ImageSource> { export function getImage(arg: any): Promise<ImageSourceLike> {
return new Promise<any>((resolve, reject) => { return new Promise<any>((resolve, reject) => {
httpRequest.request(typeof arg === 'string' ? { url: arg, method: 'GET' } : arg).then( httpRequest.request(typeof arg === 'string' ? { url: arg, method: 'GET' } : arg).then(
(r) => { (r) => {

View File

@ -1,7 +1,7 @@
// Definitions. // Definitions.
import { ImageSource as ImageSourceDefinition, iosSymbolScaleType } from '.'; import { ImageSource as ImageSourceDefinition, iosSymbolScaleType } from '.';
import { ImageAsset } from '../image-asset'; import { ImageAsset } from '../image-asset';
import * as httpModule from '../http'; import * as http from '../http';
// Types. // Types.
import { path as fsPath, knownFolders } from '../file-system'; import { path as fsPath, knownFolders } from '../file-system';
@ -14,13 +14,6 @@ import { getScaledDimensions } from './image-source-common';
export { isFileOrResourcePath }; export { isFileOrResourcePath };
let http: typeof httpModule;
function ensureHttp() {
if (!http) {
http = require('../http');
}
}
let application: android.app.Application; let application: android.app.Application;
let resources: android.content.res.Resources; let resources: android.content.res.Resources;
@ -87,10 +80,8 @@ export class ImageSource implements ImageSourceDefinition {
}); });
} }
static fromUrl(url: string): Promise<ImageSourceDefinition> { static fromUrl(url: string): Promise<ImageSource> {
ensureHttp(); return http.getImage(url) as Promise<ImageSource>;
return http.getImage(url);
} }
static fromResourceSync(name: string): ImageSource { static fromResourceSync(name: string): ImageSource {

View File

@ -2,7 +2,6 @@
import { ImageSource as ImageSourceDefinition, iosSymbolScaleType } from '.'; import { ImageSource as ImageSourceDefinition, iosSymbolScaleType } from '.';
import { ImageAsset } from '../image-asset'; import { ImageAsset } from '../image-asset';
import type { ImageBase } from '../ui/image/image-common'; import type { ImageBase } from '../ui/image/image-common';
import * as httpModule from '../http';
import { Font } from '../ui/styling/font'; import { Font } from '../ui/styling/font';
import { Color } from '../color'; import { Color } from '../color';
import { Trace } from '../trace'; import { Trace } from '../trace';
@ -12,16 +11,10 @@ import { path as fsPath, knownFolders } from '../file-system';
import { isFileOrResourcePath, RESOURCE_PREFIX, layout, releaseNativeObject, SYSTEM_PREFIX } from '../utils'; import { isFileOrResourcePath, RESOURCE_PREFIX, layout, releaseNativeObject, SYSTEM_PREFIX } from '../utils';
import { getScaledDimensions } from './image-source-common'; import { getScaledDimensions } from './image-source-common';
import * as http from '../http';
export { isFileOrResourcePath }; export { isFileOrResourcePath };
let http: typeof httpModule;
function ensureHttp() {
if (!http) {
http = require('../http');
}
}
export class ImageSource implements ImageSourceDefinition { export class ImageSource implements ImageSourceDefinition {
public android: android.graphics.Bitmap; public android: android.graphics.Bitmap;
public ios: UIImage; public ios: UIImage;
@ -69,9 +62,7 @@ export class ImageSource implements ImageSourceDefinition {
} }
static fromUrl(url: string): Promise<ImageSource> { static fromUrl(url: string): Promise<ImageSource> {
ensureHttp(); return http.getImage(url) as Promise<ImageSource>;
return http.getImage(url);
} }
static iosSystemScaleFor(scale: iosSymbolScaleType) { static iosSystemScaleFor(scale: iosSymbolScaleType) {

View File

@ -1,12 +1,11 @@
import { AlignSelf, Flex, FlexFlow, FlexGrow, FlexShrink, FlexWrapBefore, Order } from '../../layouts/flexbox-layout'; import { AlignSelf, Flex, FlexFlow, FlexGrow, FlexShrink, FlexWrapBefore, Order } from '../../layouts/flexbox-layout';
import { Page } from '../../page'; import { Page } from '../../page';
import { CoreTypes } from '../../../core-types'; import { CoreTypes, Trace } from '../../styling/styling-shared';
import { Property, CssProperty, CssAnimationProperty, InheritedProperty, clearInheritedProperties, propagateInheritableProperties, propagateInheritableCssProperties, initNativeView } from '../properties'; import { Property, CssProperty, CssAnimationProperty, InheritedProperty, clearInheritedProperties, propagateInheritableProperties, propagateInheritableCssProperties, initNativeView } from '../properties';
import { CSSUtils } from '../../../css/system-classes'; import { CSSUtils } from '../../../css/system-classes';
import { Source } from '../../../utils/debug-source'; import { Source } from '../../../utils/debug-source';
import { Binding } from '../bindable'; import { Binding } from '../bindable';
import { BindingOptions } from '../bindable/bindable-types'; import { BindingOptions } from '../bindable/bindable-types';
import { Trace } from '../../../trace';
import { Observable, PropertyChangeData, WrappedValue } from '../../../data/observable'; import { Observable, PropertyChangeData, WrappedValue } from '../../../data/observable';
import { Style } from '../../styling/style'; import { Style } from '../../styling/style';
import { paddingTopProperty, paddingRightProperty, paddingBottomProperty, paddingLeftProperty } from '../../styling/style-properties'; import { paddingTopProperty, paddingRightProperty, paddingBottomProperty, paddingLeftProperty } from '../../styling/style-properties';

View File

@ -8,8 +8,6 @@ import { sanitizeModuleName } from '../../../utils/common';
import { Color } from '../../../color'; import { Color } from '../../../color';
import { Property, InheritedProperty } from '../properties'; import { Property, InheritedProperty } from '../properties';
import { EventData } from '../../../data/observable'; import { EventData } from '../../../data/observable';
import { Trace } from '../../../trace';
import { CoreTypes } from '../../../core-types';
import { ViewHelper } from './view-helper'; import { ViewHelper } from './view-helper';
import { setupAccessibleView } from '../../../application'; import { setupAccessibleView } from '../../../application';
@ -31,6 +29,7 @@ import { accessibilityBlurEvent, accessibilityFocusChangedEvent, accessibilityFo
import { ShadowCSSValues } from '../../styling/css-shadow'; import { ShadowCSSValues } from '../../styling/css-shadow';
import { SharedTransition, SharedTransitionInteractiveOptions } from '../../transition/shared-transition'; import { SharedTransition, SharedTransitionInteractiveOptions } from '../../transition/shared-transition';
import { Flex, FlexFlow } from '../../layouts/flexbox-layout'; import { Flex, FlexFlow } from '../../layouts/flexbox-layout';
import { CoreTypes, Trace } from '../../styling/styling-shared';
// helpers (these are okay re-exported here) // helpers (these are okay re-exported here)
export * from './view-helper'; export * from './view-helper';

View File

@ -5,8 +5,8 @@ import type { View } from '..';
// Requires // Requires
import { ViewHelper } from './view-helper-common'; import { ViewHelper } from './view-helper-common';
import { SDK_VERSION } from '../../../../utils/constants'; import { SDK_VERSION } from '../../../../utils/constants';
import { ios as iOSUtils, layout } from '../../../../utils'; import { layout, Trace } from './view-helper-shared';
import { Trace } from '../../../../trace'; import { ios as iOSUtils } from '../../../../utils';
export * from './view-helper-common'; export * from './view-helper-common';
export const AndroidHelper = 0; export const AndroidHelper = 0;

View File

@ -1,10 +1,6 @@
// Types // Types
import { View as ViewDefinition } from '..'; import { View as ViewDefinition } from '..';
import { CoreTypes } from '../../../../core-types'; import { CoreTypes, layout, Trace } from './view-helper-shared';
// Requires
import { layout } from '../../../../utils';
import { Trace } from '../../../../trace';
export class ViewHelper { export class ViewHelper {
public static measureChild(parent: ViewDefinition, child: ViewDefinition, widthMeasureSpec: number, heightMeasureSpec: number): { measuredWidth: number; measuredHeight: number } { public static measureChild(parent: ViewDefinition, child: ViewDefinition, widthMeasureSpec: number, heightMeasureSpec: number): { measuredWidth: number; measuredHeight: number } {

View File

@ -0,0 +1,9 @@
// Shared helpers and types for view-helper, used by both common and platform-specific files.
// Only put platform-agnostic logic here.
import { CoreTypes } from '../../../../core-types';
import { layout } from '../../../../utils';
import { Trace } from '../../../../trace';
export type { CoreTypes };
export { layout, Trace };

View File

@ -1,7 +1,7 @@
import { parse as convertToCSSWhatSelector, Selector as CSSWhatSelector, DataType as CSSWhatDataType } from 'css-what'; import { parse as convertToCSSWhatSelector, Selector as CSSWhatSelector, DataType as CSSWhatDataType } from 'css-what';
import '../../globals'; import '../../globals';
import { isCssVariable } from '../core/properties'; import { isCssVariable } from '../core/properties';
import { Trace } from '../../trace'; import { Trace, CoreTypes } from './styling-shared';
import { isNullOrUndefined } from '../../utils/types'; import { isNullOrUndefined } from '../../utils/types';
import * as ReworkCSS from '../../css'; import * as ReworkCSS from '../../css';

View File

@ -4,10 +4,10 @@ import { unsetValue, _evaluateCssVariableExpression, _evaluateCssCalcExpression,
import * as ReworkCSS from '../../css'; import * as ReworkCSS from '../../css';
import { RuleSet, StyleSheetSelectorScope, SelectorCore, SelectorsMatch, ChangeMap, fromAstNode, Node, MEDIA_QUERY_SEPARATOR, matchMediaQueryString } from './css-selector'; import { RuleSet, StyleSheetSelectorScope, SelectorCore, SelectorsMatch, ChangeMap, fromAstNode, Node, MEDIA_QUERY_SEPARATOR, matchMediaQueryString } from './css-selector';
import { Trace } from '../../trace'; import { Trace, CoreTypes } from './styling-shared';
import { File, knownFolders, path } from '../../file-system'; import { File, knownFolders, path } from '../../file-system';
import { Application, CssChangedEventData, LoadAppCSSEventData } from '../../application'; import { Application, CssChangedEventData, LoadAppCSSEventData } from '../../application';
import { profile } from '../../profiling'; import { profile } from './styling-profile';
import * as kam from '../animation/keyframe-animation'; import * as kam from '../animation/keyframe-animation';
let keyframeAnimationModule: typeof kam; let keyframeAnimationModule: typeof kam;

View File

@ -0,0 +1,4 @@
// This file exists to break cycles caused by importing profiling into style-scope.ts.
// Only put the @profile decorator and related logic here.
export { profile } from '../../profiling';

View File

@ -0,0 +1,7 @@
// Shared helpers and types for styling, used by both styling and view/dialogs/frame modules.
// Only put platform-agnostic logic here.
import { Trace } from '../../trace';
import { CoreTypes } from '../../core-types';
export { Trace, CoreTypes };

View File

@ -101,20 +101,6 @@ export function isDataURI(uri: string): boolean {
return firstSegment && firstSegment.indexOf('data:') === 0 && firstSegment.indexOf('base64') >= 0; return firstSegment && firstSegment.indexOf('data:') === 0 && firstSegment.indexOf('base64') >= 0;
} }
/**
* Get file extension from file path
* @param path file path
* @returns file extension
*/
export function getFileExtension(path: string): string {
const dotIndex = path.lastIndexOf('.');
if (dotIndex && dotIndex >= 0 && dotIndex < path.length) {
return path.substring(dotIndex);
}
return '';
}
export function mergeSort(arr, compareFunc) { export function mergeSort(arr, compareFunc) {
if (arr.length < 2) { if (arr.length < 2) {
return arr; return arr;
@ -292,3 +278,5 @@ export function getDurationWithDampingFromSpring(springSettings?: { tension?: nu
damping, damping,
}; };
} }
export { getFileExtension } from './utils-shared';

View File

@ -4,6 +4,7 @@ import { Color } from '../color';
import { Trace } from '../trace'; import { Trace } from '../trace';
import { CORE_ANIMATION_DEFAULTS, getDurationWithDampingFromSpring } from './common'; import { CORE_ANIMATION_DEFAULTS, getDurationWithDampingFromSpring } from './common';
import { SDK_VERSION } from './constants'; import { SDK_VERSION } from './constants';
import { getFileExtension } from './utils-shared';
export function dataDeserialize(nativeData?: any) { export function dataDeserialize(nativeData?: any) {
if (isNullOrUndefined(nativeData)) { if (isNullOrUndefined(nativeData)) {

View File

@ -0,0 +1,12 @@
// Shared helpers and types for utils, used by both native-helper and common.
// Only put platform-agnostic logic here.
export function getFileExtension(path: string): string {
if (!path) {
return '';
}
const index = path.lastIndexOf('.');
return index !== -1 ? path.substring(index + 1) : '';
}
// Add more shared helpers/types/constants as needed.