peachsim 0.1.2189 → 0.1.2190

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/cli/commands/daemon.ts +13 -1
  2. package/cli/commands/package.ts +1 -1
  3. package/cli/commands/setup.ts +4 -2
  4. package/cli/commands/shell-url.ts +1 -1
  5. package/cli/main.ts +2 -0
  6. package/dist-lib/agent-daemon-client.cjs +1 -1
  7. package/dist-lib/agent-events.cjs +1 -1
  8. package/dist-lib/attached-projects.cjs +1 -1
  9. package/dist-lib/auth/shared-session.cjs +1 -1
  10. package/dist-lib/backend-origin.cjs +1 -1
  11. package/dist-lib/beta.cjs +1 -1
  12. package/dist-lib/beta.mjs +1 -1
  13. package/dist-lib/bridge-constants.cjs +1 -1
  14. package/dist-lib/bridge-contract-input.cjs +1 -1
  15. package/dist-lib/bridge-contract-input.mjs +1 -1
  16. package/dist-lib/bridge-contract.cjs +1 -1
  17. package/dist-lib/bridge-contract.mjs +1 -1
  18. package/dist-lib/bundle-channel.cjs +24 -7
  19. package/dist-lib/capture-contract.cjs +1 -1
  20. package/dist-lib/capture-contract.mjs +1 -1
  21. package/dist-lib/cloud-contract.cjs +1 -1
  22. package/dist-lib/cloud-contract.mjs +1 -1
  23. package/dist-lib/cloud-test-args.cjs +1 -1
  24. package/dist-lib/cloud-test-args.mjs +1 -1
  25. package/dist-lib/cloud.cjs +1 -1
  26. package/dist-lib/cloud.mjs +1 -1
  27. package/dist-lib/config.cjs +1 -1
  28. package/dist-lib/config.mjs +1 -1
  29. package/dist-lib/detox/index.cjs +1 -1
  30. package/dist-lib/dev-bundle-resolution.cjs +1 -1
  31. package/dist-lib/expo-swift-bundle.cjs +4 -4
  32. package/dist-lib/expo-swift-metadata.cjs +1 -1
  33. package/dist-lib/expo-swift-metadata.mjs +1 -1
  34. package/dist-lib/home-paths.cjs +1 -1
  35. package/dist-lib/host/bridge-host.cjs +24 -7
  36. package/dist-lib/host/fetch-proxy-handler.cjs +2 -2
  37. package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
  38. package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
  39. package/dist-lib/host/replacement-module-handler.cjs +1 -1
  40. package/dist-lib/host/websocket-proxy.cjs +1 -1
  41. package/dist-lib/index.cjs +2 -2
  42. package/dist-lib/jump-to-source-babel.cjs +1 -1
  43. package/dist-lib/jump-to-source-native.cjs +1 -1
  44. package/dist-lib/kotlin-host.cjs +1 -1
  45. package/dist-lib/menu.cjs +1 -1
  46. package/dist-lib/menu.mjs +1 -1
  47. package/dist-lib/metro-fingerprint-registry.cjs +1 -1
  48. package/dist-lib/metro-fingerprint-registry.mjs +1 -1
  49. package/dist-lib/metro-production-bundle.cjs +1 -1
  50. package/dist-lib/metro-production-bundle.mjs +1 -1
  51. package/dist-lib/metro.cjs +2 -2
  52. package/dist-lib/native-app-identity-project.cjs +2 -2
  53. package/dist-lib/native-app-identity-project.mjs +2 -2
  54. package/dist-lib/native-app-identity.cjs +1 -1
  55. package/dist-lib/native-app-identity.mjs +1 -1
  56. package/dist-lib/native-firebase-metadata.cjs +1 -1
  57. package/dist-lib/native-firebase-metadata.mjs +1 -1
  58. package/dist-lib/pdfium-raster.cjs +1 -1
  59. package/dist-lib/pdfium-raster.mjs +1 -1
  60. package/dist-lib/plist.cjs +1 -1
  61. package/dist-lib/plist.mjs +1 -1
  62. package/dist-lib/profiles.cjs +1 -1
  63. package/dist-lib/public-brand.cjs +1 -1
  64. package/dist-lib/public-origins-lib-esm.json +24 -24
  65. package/dist-lib/public-origins-lib.json +53 -53
  66. package/dist-lib/react-native-host-modules.cjs +1 -1
  67. package/dist-lib/react-native-host-modules.mjs +1 -1
  68. package/dist-lib/reap-browser.cjs +1 -1
  69. package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
  70. package/dist-lib/sdk.cjs +1 -1
  71. package/dist-lib/sdk.mjs +1 -1
  72. package/dist-lib/skills.cjs +44 -11
  73. package/dist-lib/swift-compile.cjs +2 -2
  74. package/dist-lib/swift-compile.mjs +2 -2
  75. package/dist-lib/swift-package.cjs +1 -1
  76. package/dist-lib/swift-package.mjs +1 -1
  77. package/dist-lib/swift-submit.cjs +1 -1
  78. package/dist-lib/swift-submit.mjs +1 -1
  79. package/dist-lib/swift-toolchain.cjs +1 -1
  80. package/dist-lib/swift.cjs +1 -1
  81. package/dist-lib/vite-swift.cjs +2 -2
  82. package/dist-lib/vite.cjs +2 -2
  83. package/dist-lib/worklet-executable.cjs +1 -1
  84. package/dist-lib/worklet-executable.mjs +1 -1
  85. package/dist-types/packages/peach-engine/src/engine/computed-padding.d.ts +40 -0
  86. package/dist-types/packages/peach-engine/src/engine/layout-engine.d.ts +3 -0
  87. package/dist-types/packages/peach-engine/src/engine/yoga-layout.d.ts +60 -0
  88. package/dist-types/packages/peach-engine/src/render-worker/shell-tree-wire.d.ts +2 -0
  89. package/dist-types/packages/peach-engine/src/settings/device-spec-bus.d.ts +10 -0
  90. package/package.json +1 -1
  91. package/sdk/ios/System/Library/Frameworks/UIKit.framework/Headers/UIFindSession.h +2 -12
  92. package/sdk/ios/System/Library/Frameworks/UIKitTypes.framework/Headers/UIKitTypes.h +12 -0
  93. package/src/podspec-sources.ts +21 -2
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2189 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2190 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/swift-compile.ts
4
4
  import {
@@ -12457,7 +12457,7 @@ var darwinRecordsRegion = (quoted) => quoted.length ? ["-Wl,--start-lib", ...quo
12457
12457
  var REACTOR_FLAG = '"-Xclang-linker", "-mexec-model=reactor",\n';
12458
12458
  var MULTI_MANIFEST_VERSION = 68;
12459
12459
  var SWIFT_HEADER_PRODUCTS_TARGET = "PeachHeaderProducts";
12460
- var compilerSourceDigest = true ? "2a1da81ab7798d1b1b2f07ce1f9d3314f5461acfea19548a6c5065edb1133762" : swiftCompilerSourceDigest(import.meta.dirname);
12460
+ var compilerSourceDigest = true ? "382ff03994dc241ff825d788eb5f8eb92462420da0b20538d9fcc1ff79e096c6" : swiftCompilerSourceDigest(import.meta.dirname);
12461
12461
  function swiftArtifactHash(input, release, moduleRoot) {
12462
12462
  const hash = createHash13("sha256");
12463
12463
  hash.update(`swift-compile
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2189 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2190 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = '', __sootsim_import_meta_filename = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; __sootsim_import_meta_filename = __filename; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2189 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2190 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/swift-package.ts
4
4
  function swiftManifestSettings(target) {
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2189 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2190 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = '', __sootsim_import_meta_filename = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; __sootsim_import_meta_filename = __filename; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2189 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2190 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/is-record.ts
4
4
  function isRecord(value) {
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2189 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2190 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = '', __sootsim_import_meta_filename = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; __sootsim_import_meta_filename = __filename; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2189 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2190 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = '', __sootsim_import_meta_filename = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; __sootsim_import_meta_filename = __filename; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2189 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2190 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = '', __sootsim_import_meta_filename = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; __sootsim_import_meta_filename = __filename; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -17272,7 +17272,7 @@ var darwinRecordsRegion = (quoted) => quoted.length ? ["-Wl,--start-lib", ...quo
17272
17272
  var REACTOR_FLAG = '"-Xclang-linker", "-mexec-model=reactor",\n';
17273
17273
  var MULTI_MANIFEST_VERSION = 68;
17274
17274
  var SWIFT_HEADER_PRODUCTS_TARGET = "PeachHeaderProducts";
17275
- var compilerSourceDigest = true ? "2a1da81ab7798d1b1b2f07ce1f9d3314f5461acfea19548a6c5065edb1133762" : swiftCompilerSourceDigest(__sootsim_import_meta_dirname);
17275
+ var compilerSourceDigest = true ? "382ff03994dc241ff825d788eb5f8eb92462420da0b20538d9fcc1ff79e096c6" : swiftCompilerSourceDigest(__sootsim_import_meta_dirname);
17276
17276
  function swiftArtifactHash(input, release, moduleRoot) {
17277
17277
  const hash = (0, import_node_crypto13.createHash)("sha256");
17278
17278
  hash.update(`swift-compile
package/dist-lib/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2189 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2190 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = '', __sootsim_import_meta_filename = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; __sootsim_import_meta_filename = __filename; } catch {}
3
3
  "use strict";
4
4
  var __create = Object.create;
@@ -5391,7 +5391,7 @@ var FOUNDATION_IMPLICIT_MODULES = [
5391
5391
  var FOUNDATION_IMPLICIT_FLAGS = FOUNDATION_IMPLICIT_MODULES.map(
5392
5392
  (module2) => `, "-Xfrontend", "-import-module", "-Xfrontend", "${module2}"`
5393
5393
  ).join("");
5394
- var compilerSourceDigest = true ? "2a1da81ab7798d1b1b2f07ce1f9d3314f5461acfea19548a6c5065edb1133762" : swiftCompilerSourceDigest2(__sootsim_import_meta_dirname);
5394
+ var compilerSourceDigest = true ? "382ff03994dc241ff825d788eb5f8eb92462420da0b20538d9fcc1ff79e096c6" : swiftCompilerSourceDigest2(__sootsim_import_meta_dirname);
5395
5395
  var CORE_FOUNDATION_HANDLE_IMPORTS = [
5396
5396
  "CFAllocator",
5397
5397
  "CFArray",
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2189 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2190 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
  let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = '', __sootsim_import_meta_filename = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; __sootsim_import_meta_filename = __filename; } catch {}
3
3
  "use strict";
4
4
  var __defProp = Object.defineProperty;
@@ -1,4 +1,4 @@
1
- /*! peach v0.1.2189 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
1
+ /*! peach v0.1.2190 | (c) 2026 Tamagui LLC | Proprietary; see LICENSE */
2
2
 
3
3
  // src/worklet-executable.ts
4
4
  import { parse } from "acorn";
@@ -0,0 +1,40 @@
1
+ import type { SootSimNode } from './node.d.ts';
2
+ import type { SootSimStyle } from './types.d.ts';
3
+ type EdgeStyle = Readonly<Partial<Record<keyof SootSimStyle, unknown>>>;
4
+ export declare function resolveStylePadding(style: SootSimStyle): {
5
+ left: number;
6
+ top: number;
7
+ right: number;
8
+ bottom: number;
9
+ };
10
+ export declare function resolveStyleMargin(style: SootSimStyle): {
11
+ left: number;
12
+ top: number;
13
+ right: number;
14
+ bottom: number;
15
+ };
16
+ export declare function getComputedPadding(node: SootSimNode): {
17
+ left: number;
18
+ top: number;
19
+ right: number;
20
+ bottom: number;
21
+ };
22
+ export declare function resolveStyleBorderWidth(style: EdgeStyle): {
23
+ left: number;
24
+ top: number;
25
+ right: number;
26
+ bottom: number;
27
+ };
28
+ export declare function getComputedBorderWidth(node: SootSimNode): {
29
+ left: number;
30
+ top: number;
31
+ right: number;
32
+ bottom: number;
33
+ };
34
+ export declare function getTextContentInset(node: SootSimNode): {
35
+ left: number;
36
+ top: number;
37
+ right: number;
38
+ bottom: number;
39
+ };
40
+ export {};
@@ -0,0 +1,3 @@
1
+ export { getComputedPadding, getTextContentInset, resolveStylePadding, } from './computed-padding.d.ts';
2
+ export { computeLayout, laidOutRightToLeft, resolvesRightToLeft, layoutDirection, layoutRecordTakesAnimatedStyle, measureText, nativeLayoutFrameRoot, } from './yoga-layout.d.ts';
3
+ export { setLayoutAnimRenderCallback, layoutAnimComplete, getLayoutAnimStats, invalidateAllTextMeasurements, invalidateLazyFontWaiters, publishUnwrappedTextMeasurements, seedUnwrappedTextMeasurements, takeUnwrappedTextMeasurements, type UnwrappedTextMeasurement, } from './yoga-layout.d.ts';
@@ -0,0 +1,60 @@
1
+ import { type LayoutHookPlacement, SootSimNode } from './node.d.ts';
2
+ import { type TextGuides } from './text-first-baseline.d.ts';
3
+ import type { SootSimStyle, SootSimLayout, SootSimTextLayoutLine, MeasureContext } from './types.d.ts';
4
+ export declare function setLayoutEventDispatcher(dispatcher: ((callback: () => void) => void) | null): void;
5
+ export interface TextInkBox {
6
+ left: number;
7
+ top: number;
8
+ right: number;
9
+ bottom: number;
10
+ }
11
+ export interface MeasuredTextResult {
12
+ textLayoutKey: string;
13
+ measuredWidth: number;
14
+ unroundedWidth: number;
15
+ unroundedHeight: number;
16
+ measuredHeight: number;
17
+ fontScale: number | null;
18
+ textLayoutLines: SootSimTextLayoutLine[] | null;
19
+ textGuides: TextGuides | null;
20
+ ink: TextInkBox | null;
21
+ }
22
+ export interface UnwrappedTextMeasurement {
23
+ key: string;
24
+ intrinsicWidth: number;
25
+ measured: MeasuredTextResult;
26
+ }
27
+ export declare function publishUnwrappedTextMeasurements(): void;
28
+ export declare function takeUnwrappedTextMeasurements(): UnwrappedTextMeasurement[] | undefined;
29
+ export declare function seedUnwrappedTextMeasurements(entries: readonly UnwrappedTextMeasurement[]): void;
30
+ export declare function setLayoutBoundNodeCollector(begin: ((node: SootSimNode) => void) | null, end: ((node: SootSimNode, retainEmpty?: boolean) => void) | null): void;
31
+ export { roundToLayoutGrid } from '../settings/device-spec-bus.d.ts';
32
+ export declare function invalidateYogaTextMeasure(node: SootSimNode): void;
33
+ export declare function invalidateAllTextMeasurements(): void;
34
+ export declare function invalidateLazyFontWaiters(nodes: readonly SootSimNode[]): void;
35
+ export declare function shouldApplyMeasuredTextStretchWidth(node: SootSimNode): boolean;
36
+ export declare function setLayoutAnimRenderCallback(cb: (() => void) | null): void;
37
+ export declare function layoutAnimComplete(node: SootSimNode): void;
38
+ export declare function getLayoutAnimStats(): {
39
+ layoutAnimNodeCount: number;
40
+ layoutAnimTickCount: number;
41
+ hasLayoutAnimRafScheduled: boolean;
42
+ };
43
+ export declare function laidOutRightToLeft(node: SootSimNode): boolean;
44
+ export declare function resolvesRightToLeft(node: SootSimNode): boolean;
45
+ export declare function layoutDirection(): number;
46
+ export declare function queuePendingRootLayoutMeasure(nodeOrRoot: unknown, key: object, callback: () => void): (() => void) | undefined;
47
+ export interface LayoutWatch {
48
+ moving(nodes: readonly SootSimNode[], resized?: boolean): void;
49
+ scrollSynced(node: SootSimNode): void;
50
+ }
51
+ export declare function layoutRecordTakesAnimatedStyle(node: SootSimNode, keys: readonly string[]): boolean;
52
+ export declare function computeLayout(root: SootSimNode, width: number, height: number, ctx: MeasureContext, watch?: LayoutWatch | null, preserveRootOrigin?: boolean): boolean;
53
+ export declare function nativeLayoutFrameRoot(root: SootSimNode, width: number, height: number, ctx: MeasureContext): number;
54
+ export declare function setLayoutHook(target: unknown, hook: ((view: SootSimNode) => void) | null): void;
55
+ export declare function placeFromLayoutHook(target: unknown, placement: LayoutHookPlacement | null): void;
56
+ export declare function layoutHookFrame(target: unknown): SootSimLayout | null;
57
+ export declare function releaseYogaRoot(root: SootSimNode): void;
58
+ export declare function parkYogaRoot(root: SootSimNode): void;
59
+ export declare function freeYogaTree(node: SootSimNode, seen?: Set<SootSimNode>): void;
60
+ export declare function measureText(text: string, sourceStyle: SootSimStyle, maxWidth: number, ctx: MeasureContext, props?: Record<string, any>, node?: SootSimNode, includeInk?: boolean): MeasuredTextResult;
@@ -1,6 +1,7 @@
1
1
  import { type AnimatedDrivenStyleLease, type AnimatedDrivenStyleRetirement } from '../engine/animated-driven-style.d.ts';
2
2
  import { type LayoutSlotRead } from '../engine/layout-sab.d.ts';
3
3
  import { SootSimNode, SootSimTextNode, type LayoutHookPlacement } from '../engine/node.d.ts';
4
+ import type { UnwrappedTextMeasurement } from '../engine/layout-engine.d.ts';
4
5
  import type { SootSimNodeType } from '../engine/types.d.ts';
5
6
  import type { LayoutAnimationConfig } from '../react-native/layout-animation.d.ts';
6
7
  import type { GraphPresentation } from './graph-linked-value.d.ts';
@@ -64,6 +65,7 @@ export type WireSurfaceUpdate = WireDelta & {
64
65
  graphPresentations?: GraphPresentation[];
65
66
  graphPresentationEnds?: number[];
66
67
  inlineSources?: WireInlineSources;
68
+ unwrappedMeasurements?: UnwrappedTextMeasurement[];
67
69
  };
68
70
  export declare function sanitizeProps(props: Record<string, unknown>, nodeType?: SootSimNodeType): Record<string, unknown>;
69
71
  export declare function sanitizeStyle(style: Record<string, unknown>): Record<string, unknown>;
@@ -0,0 +1,10 @@
1
+ import type { DeviceSpec } from '../../../../../src/device-catalog.ts';
2
+ type Listener = () => void;
3
+ export declare const ANDROID_EMULATOR_MODEL = "sdk_gphone64_arm64";
4
+ export declare function getDeviceSpec(): DeviceSpec;
5
+ export declare function peekDeviceSpec(): DeviceSpec | undefined;
6
+ export declare function getDevicePixelScale(): number;
7
+ export declare function roundToLayoutGrid(value: number): number;
8
+ export declare function publishDeviceSpec(spec: DeviceSpec): void;
9
+ export declare function onDeviceSpecChange(listener: Listener): () => void;
10
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "peachsim",
3
- "version": "0.1.2189",
3
+ "version": "0.1.2190",
4
4
  "description": "Vite and Metro plugins, testing drivers, and SDK exports for peach.",
5
5
  "author": "Tamagui LLC",
6
6
  "license": "SEE LICENSE IN LICENSE",
@@ -15,20 +15,10 @@ NS_HEADER_AUDIT_BEGIN(nullability, sendability)
15
15
 
16
16
 
17
17
 
18
- API_AVAILABLE(ios(16.0)) API_UNAVAILABLE(watchos, tvos)
19
- typedef NS_ENUM(NSInteger, UITextSearchMatchMethod) {
20
- /// Word contains search string.
21
- UITextSearchMatchMethodContains,
22
-
23
- /// Word contains the search string as a prefix.
24
- UITextSearchMatchMethodStartsWith,
25
-
26
- /// Word is an exact match for the search string.
27
- UITextSearchMatchMethodFullWord,
28
- } NS_SWIFT_NAME(UITextSearchOptions.WordMatchMethod) API_UNAVAILABLE(watchos);
18
+
29
19
 
30
20
  UIKIT_EXTERN API_AVAILABLE(ios(16.0)) API_UNAVAILABLE(watchos, tvos) NS_SWIFT_UI_ACTOR
31
- @interface UITextSearchOptions : NSObject
21
+ PEACH_SWIFT_CLASS(UIKitCore) @interface UITextSearchOptions : NSObject
32
22
  /// See UITextSearchMatchMethod above.
33
23
  @property (nonatomic, readonly) UITextSearchMatchMethod wordMatchMethod;
34
24
 
@@ -2389,6 +2389,18 @@ typedef NS_ENUM(NSInteger, UIScrollViewContentInsetAdjustmentBehavior) {
2389
2389
  UIScrollViewContentInsetAdjustmentNever, // contentInset is not adjusted
2390
2390
  UIScrollViewContentInsetAdjustmentAlways, // contentInset is always adjusted by the scroll view's safeAreaInsets
2391
2391
  } API_AVAILABLE(ios(11.0), tvos(11.0)) API_UNAVAILABLE(watchos);
2392
+
2393
+ API_AVAILABLE(ios(16.0)) API_UNAVAILABLE(watchos, tvos)
2394
+ typedef NS_ENUM(NSInteger, UITextSearchMatchMethod) {
2395
+ /// Word contains search string.
2396
+ UITextSearchMatchMethodContains,
2397
+
2398
+ /// Word contains the search string as a prefix.
2399
+ UITextSearchMatchMethodStartsWith,
2400
+
2401
+ /// Word is an exact match for the search string.
2402
+ UITextSearchMatchMethodFullWord,
2403
+ } API_UNAVAILABLE(watchos);
2392
2404
  PEACH_SWIFT_CLASS(UIKitCore) @interface UIColor : NSObject <NSSecureCoding, NSCopying>
2393
2405
  @end
2394
2406
 
@@ -595,7 +595,8 @@ class ExprParser {
595
595
 
596
596
  or = (): Node => this.binary(['||'], this.and)
597
597
  and = (): Node => this.binary(['&&'], this.eq)
598
- eq = (): Node => this.binary(['==', '!='], this.shift)
598
+ eq = (): Node => this.binary(['==', '!='], this.compare)
599
+ compare = (): Node => this.binary(['<', '>', '<=', '>='], this.shift)
599
600
  shift = (): Node => this.binary(['<<'], this.add)
600
601
  add = (): Node => this.binary(['+', '-'], this.unary)
601
602
 
@@ -768,6 +769,9 @@ class ExprParser {
768
769
  return { k: 'hash', pairs }
769
770
  }
770
771
  if (tok.v === '::') return this.fail('top-level constant')
772
+ // a global is whatever the Podfile assigned before evaluating the pod
773
+ if (tok.v === '$' && this.toks[this.i]?.t === 'id')
774
+ return { k: 'fail', why: `global $${this.toks[this.i++]!.v}` }
771
775
  return this.fail(`unexpected ${tok.v}`)
772
776
  }
773
777
  }
@@ -1054,7 +1058,16 @@ class Evaluator {
1054
1058
  }
1055
1059
  case 'bin': {
1056
1060
  if (node.op === '||' || node.op === '&&') {
1057
- const l = this.ev(scope, node.l)
1061
+ let l: Value
1062
+ try {
1063
+ l = this.ev(scope, node.l)
1064
+ } catch (error) {
1065
+ // an unestablished operand cannot change `x && falsy` or `x || truthy`
1066
+ if (!recoverable(error)) throw error
1067
+ const r = this.ev(scope, node.r)
1068
+ if (truthy(r) === (node.op === '||')) return r
1069
+ throw error
1070
+ }
1058
1071
  return truthy(l) === (node.op === '||') ? l : this.ev(scope, node.r)
1059
1072
  }
1060
1073
  const l = this.ev(scope, node.l)
@@ -1083,6 +1096,12 @@ class Evaluator {
1083
1096
  l.push(r)
1084
1097
  return l
1085
1098
  }
1099
+ if (typeof l === 'number' && typeof r === 'number') {
1100
+ if (node.op === '<') return l < r
1101
+ if (node.op === '>') return l > r
1102
+ if (node.op === '<=') return l <= r
1103
+ if (node.op === '>=') return l >= r
1104
+ }
1086
1105
  return this.fail(`operator ${node.op}`)
1087
1106
  }
1088
1107
  case 'method': {