rnxsim 0.1.456 → 0.1.457
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.
- package/cli/commands/inspect/actions.ts +63 -14
- package/cli/commands/inspect.ts +66 -5
- package/cli/ws-bridge.ts +3 -0
- package/dist-lib/agent-daemon-client.cjs +1 -1
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/agent-identity.cjs +1 -1
- package/dist-lib/agent-sessions.cjs +1 -1
- package/dist-lib/attached-projects.cjs +1 -1
- package/dist-lib/auth/shared-session.cjs +1 -1
- package/dist-lib/backend-origin.cjs +1 -1
- package/dist-lib/beta.cjs +1 -1
- package/dist-lib/beta.mjs +1 -1
- package/dist-lib/bridge-constants.cjs +1 -1
- package/dist-lib/bridge-contract-input.cjs +1 -1
- package/dist-lib/bridge-contract-input.mjs +1 -1
- package/dist-lib/bridge-contract.cjs +1 -1
- package/dist-lib/bridge-contract.mjs +1 -1
- package/dist-lib/capture-contract.cjs +1 -1
- package/dist-lib/capture-contract.mjs +1 -1
- package/dist-lib/cli-constants.cjs +1 -1
- package/dist-lib/cloud-contract.cjs +1 -1
- package/dist-lib/cloud-contract.mjs +1 -1
- package/dist-lib/cloud.cjs +1 -1
- package/dist-lib/cloud.mjs +1 -1
- package/dist-lib/config.cjs +1 -1
- package/dist-lib/detox/index.cjs +1 -1
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/home-paths.cjs +1 -1
- package/dist-lib/host/bridge-host.cjs +1 -1
- package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
- package/dist-lib/host/replacement-module-handler.cjs +1 -1
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +43 -15
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/jump-to-source-native.cjs +1 -1
- package/dist-lib/menu.cjs +1 -1
- package/dist-lib/menu.mjs +1 -1
- package/dist-lib/metro-fingerprint-registry.cjs +1 -1
- package/dist-lib/metro-fingerprint-registry.mjs +1 -1
- package/dist-lib/metro-production-bundle.cjs +1 -1
- package/dist-lib/metro-production-bundle.mjs +1 -1
- package/dist-lib/metro.cjs +1 -1
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/public-brand.cjs +1 -1
- package/dist-lib/react-native-host-modules.cjs +1 -1
- package/dist-lib/react-native-host-modules.mjs +1 -1
- package/dist-lib/render-mode.cjs +1 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
- package/dist-lib/sdk.cjs +43 -15
- package/dist-lib/sdk.mjs +43 -15
- package/dist-lib/skills.cjs +755 -51
- package/dist-lib/vite.cjs +1 -1
- package/package.json +1 -1
- package/src/sim-client.ts +4 -0
package/dist-lib/skills.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.457 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -587,6 +587,61 @@ function aggregateCompatibilityOutcomes(contributions) {
|
|
|
587
587
|
function formatCompatibilityPercent(percent) {
|
|
588
588
|
return percent > 0 && percent < 0.1 ? "<0.1" : String(Number(percent.toFixed(1)));
|
|
589
589
|
}
|
|
590
|
+
function calculateFeatureCompatibility(features) {
|
|
591
|
+
const contributions = [];
|
|
592
|
+
const ids = /* @__PURE__ */ new Set();
|
|
593
|
+
function visit(siblings, parentWeight, parentEqualWeight) {
|
|
594
|
+
if (siblings.length === 0) throw new Error("feature assessment must not be empty");
|
|
595
|
+
let total = 0;
|
|
596
|
+
for (const feature of siblings) {
|
|
597
|
+
for (const rating of [feature.usage, feature.importance]) {
|
|
598
|
+
if (!Number.isInteger(rating) || rating < 1 || rating > 3) {
|
|
599
|
+
throw new Error(`feature ${feature.id} ratings must be integers from 1 to 3`);
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
total += feature.usage * feature.importance;
|
|
603
|
+
}
|
|
604
|
+
let estimatedMass = 0;
|
|
605
|
+
let equalEstimatedMass = 0;
|
|
606
|
+
for (const feature of siblings) {
|
|
607
|
+
const featureId = feature.id;
|
|
608
|
+
if (!feature.id.trim() || ids.has(feature.id)) {
|
|
609
|
+
throw new Error(`feature identity is empty or duplicated: ${feature.id}`);
|
|
610
|
+
}
|
|
611
|
+
ids.add(feature.id);
|
|
612
|
+
if (!feature.rationale.trim())
|
|
613
|
+
throw new Error(`feature ${feature.id} needs a rationale`);
|
|
614
|
+
const weight = parentWeight * feature.usage * feature.importance / total;
|
|
615
|
+
const equalWeight = parentEqualWeight / siblings.length;
|
|
616
|
+
if (feature.children !== void 0) {
|
|
617
|
+
if (feature.estimate !== void 0) {
|
|
618
|
+
throw new Error(`feature ${featureId} cannot have children and an estimate`);
|
|
619
|
+
}
|
|
620
|
+
const child = visit(feature.children, weight, equalWeight);
|
|
621
|
+
estimatedMass += feature.usage * feature.importance * child.estimate;
|
|
622
|
+
equalEstimatedMass += child.equalEstimate;
|
|
623
|
+
} else {
|
|
624
|
+
if (!Number.isFinite(feature.estimate) || feature.estimate < 0 || feature.estimate > 1) {
|
|
625
|
+
throw new Error(`feature ${feature.id} estimate must be between 0 and 1`);
|
|
626
|
+
}
|
|
627
|
+
estimatedMass += feature.usage * feature.importance * feature.estimate;
|
|
628
|
+
equalEstimatedMass += feature.estimate;
|
|
629
|
+
contributions.push({
|
|
630
|
+
id: feature.id,
|
|
631
|
+
weight,
|
|
632
|
+
equalWeight,
|
|
633
|
+
estimate: feature.estimate,
|
|
634
|
+
rationale: feature.rationale
|
|
635
|
+
});
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
return {
|
|
639
|
+
estimate: estimatedMass / total,
|
|
640
|
+
equalEstimate: equalEstimatedMass / siblings.length
|
|
641
|
+
};
|
|
642
|
+
}
|
|
643
|
+
return { features: contributions, ...visit(features, 1, 1) };
|
|
644
|
+
}
|
|
590
645
|
var init_capability_outcomes = __esm({
|
|
591
646
|
"../compat/src/capability-outcomes.ts"() {
|
|
592
647
|
"use strict";
|
|
@@ -2804,7 +2859,53 @@ var init_capability_outcomes2 = __esm({
|
|
|
2804
2859
|
"react-native": {
|
|
2805
2860
|
exactTestedVersion: "0.86.2",
|
|
2806
2861
|
supportedVersionRange: "0.86.x",
|
|
2807
|
-
lastMeasured:
|
|
2862
|
+
lastMeasured: {
|
|
2863
|
+
byWeighting: {
|
|
2864
|
+
strict: {
|
|
2865
|
+
android: {
|
|
2866
|
+
passedWeight: 0,
|
|
2867
|
+
failedWeight: 0,
|
|
2868
|
+
unassessedWeight: 1196,
|
|
2869
|
+
totalWeight: 1196,
|
|
2870
|
+
assessedWeight: 0,
|
|
2871
|
+
compatibility: null,
|
|
2872
|
+
assessed: 0
|
|
2873
|
+
},
|
|
2874
|
+
ios: {
|
|
2875
|
+
passedWeight: 180,
|
|
2876
|
+
failedWeight: 0,
|
|
2877
|
+
unassessedWeight: 1025,
|
|
2878
|
+
totalWeight: 1205,
|
|
2879
|
+
assessedWeight: 180,
|
|
2880
|
+
compatibility: 1,
|
|
2881
|
+
assessed: 0.14937759336099585
|
|
2882
|
+
}
|
|
2883
|
+
},
|
|
2884
|
+
usage: {
|
|
2885
|
+
android: {
|
|
2886
|
+
passedWeight: 0,
|
|
2887
|
+
failedWeight: 0,
|
|
2888
|
+
unassessedWeight: 32399,
|
|
2889
|
+
totalWeight: 32399,
|
|
2890
|
+
assessedWeight: 0,
|
|
2891
|
+
compatibility: null,
|
|
2892
|
+
assessed: 0
|
|
2893
|
+
},
|
|
2894
|
+
ios: {
|
|
2895
|
+
passedWeight: 8422,
|
|
2896
|
+
failedWeight: 0,
|
|
2897
|
+
unassessedWeight: 24028,
|
|
2898
|
+
totalWeight: 32450,
|
|
2899
|
+
assessedWeight: 8422,
|
|
2900
|
+
compatibility: 1,
|
|
2901
|
+
assessed: 0.259537750385208
|
|
2902
|
+
}
|
|
2903
|
+
}
|
|
2904
|
+
},
|
|
2905
|
+
capturedAt: "2026-09-08T13:03:18.937Z",
|
|
2906
|
+
receipts: ["core-paired-capture.2026-09-08T13:03:18.937Z.json"],
|
|
2907
|
+
sourceCommit: "85cd28ced01db6f009d412d8208f365ababa43b8"
|
|
2908
|
+
},
|
|
2808
2909
|
unmatchedReferenceCount: 7112,
|
|
2809
2910
|
byPlatform: {
|
|
2810
2911
|
android: {
|
|
@@ -2817,13 +2918,13 @@ var init_capability_outcomes2 = __esm({
|
|
|
2817
2918
|
assessed: 0
|
|
2818
2919
|
},
|
|
2819
2920
|
ios: {
|
|
2820
|
-
passedWeight:
|
|
2921
|
+
passedWeight: 0,
|
|
2821
2922
|
failedWeight: 0,
|
|
2822
|
-
unassessedWeight:
|
|
2923
|
+
unassessedWeight: 32450,
|
|
2823
2924
|
totalWeight: 32450,
|
|
2824
|
-
assessedWeight:
|
|
2825
|
-
compatibility:
|
|
2826
|
-
assessed: 0
|
|
2925
|
+
assessedWeight: 0,
|
|
2926
|
+
compatibility: null,
|
|
2927
|
+
assessed: 0
|
|
2827
2928
|
}
|
|
2828
2929
|
},
|
|
2829
2930
|
byWeighting: {
|
|
@@ -2838,13 +2939,13 @@ var init_capability_outcomes2 = __esm({
|
|
|
2838
2939
|
assessed: 0
|
|
2839
2940
|
},
|
|
2840
2941
|
ios: {
|
|
2841
|
-
passedWeight:
|
|
2942
|
+
passedWeight: 0,
|
|
2842
2943
|
failedWeight: 0,
|
|
2843
|
-
unassessedWeight:
|
|
2944
|
+
unassessedWeight: 1205,
|
|
2844
2945
|
totalWeight: 1205,
|
|
2845
|
-
assessedWeight:
|
|
2846
|
-
compatibility:
|
|
2847
|
-
assessed: 0
|
|
2946
|
+
assessedWeight: 0,
|
|
2947
|
+
compatibility: null,
|
|
2948
|
+
assessed: 0
|
|
2848
2949
|
}
|
|
2849
2950
|
},
|
|
2850
2951
|
usage: {
|
|
@@ -2858,13 +2959,13 @@ var init_capability_outcomes2 = __esm({
|
|
|
2858
2959
|
assessed: 0
|
|
2859
2960
|
},
|
|
2860
2961
|
ios: {
|
|
2861
|
-
passedWeight:
|
|
2962
|
+
passedWeight: 0,
|
|
2862
2963
|
failedWeight: 0,
|
|
2863
|
-
unassessedWeight:
|
|
2964
|
+
unassessedWeight: 32450,
|
|
2864
2965
|
totalWeight: 32450,
|
|
2865
|
-
assessedWeight:
|
|
2866
|
-
compatibility:
|
|
2867
|
-
assessed: 0
|
|
2966
|
+
assessedWeight: 0,
|
|
2967
|
+
compatibility: null,
|
|
2968
|
+
assessed: 0
|
|
2868
2969
|
}
|
|
2869
2970
|
}
|
|
2870
2971
|
}
|
|
@@ -3719,21 +3820,19 @@ var init_capability_outcomes2 = __esm({
|
|
|
3719
3820
|
});
|
|
3720
3821
|
|
|
3721
3822
|
// ../compat/src/generated/react-native-root-export-coverage.ts
|
|
3722
|
-
var
|
|
3823
|
+
var REACT_NATIVE_ROOT_EXPORT_STRICT_COVERAGE;
|
|
3723
3824
|
var init_react_native_root_export_coverage = __esm({
|
|
3724
3825
|
"../compat/src/generated/react-native-root-export-coverage.ts"() {
|
|
3725
3826
|
"use strict";
|
|
3726
|
-
REACT_NATIVE_ROOT_EXPORT_WILL_IT_WORK_COVERAGE = 0.99;
|
|
3727
3827
|
REACT_NATIVE_ROOT_EXPORT_STRICT_COVERAGE = 0.765;
|
|
3728
3828
|
}
|
|
3729
3829
|
});
|
|
3730
3830
|
|
|
3731
3831
|
// ../compat/src/generated/react-native-webview-coverage.ts
|
|
3732
|
-
var
|
|
3832
|
+
var REACT_NATIVE_WEBVIEW_STRICT_COVERAGE;
|
|
3733
3833
|
var init_react_native_webview_coverage = __esm({
|
|
3734
3834
|
"../compat/src/generated/react-native-webview-coverage.ts"() {
|
|
3735
3835
|
"use strict";
|
|
3736
|
-
REACT_NATIVE_WEBVIEW_WILL_IT_WORK_COVERAGE = 0.74;
|
|
3737
3836
|
REACT_NATIVE_WEBVIEW_STRICT_COVERAGE = 0.223;
|
|
3738
3837
|
}
|
|
3739
3838
|
});
|
|
@@ -3796,8 +3895,6 @@ var init_supported_native_packages = __esm({
|
|
|
3796
3895
|
// coverage
|
|
3797
3896
|
"@react-native-community/masked-view",
|
|
3798
3897
|
// coverage
|
|
3799
|
-
"@react-native-community/netinfo",
|
|
3800
|
-
// coverage
|
|
3801
3898
|
"@react-native-community/slider",
|
|
3802
3899
|
// coverage
|
|
3803
3900
|
"@react-native-documents/picker",
|
|
@@ -4073,7 +4170,7 @@ var init_supported_native_packages = __esm({
|
|
|
4073
4170
|
"react-native-key-command",
|
|
4074
4171
|
// coverage
|
|
4075
4172
|
"react-native-keyboard-controller",
|
|
4076
|
-
// preset+visual-proof
|
|
4173
|
+
// preset+visual-proof+coverage
|
|
4077
4174
|
"react-native-keychain",
|
|
4078
4175
|
// coverage
|
|
4079
4176
|
"react-native-keys",
|
|
@@ -4253,10 +4350,11 @@ function scoredCoverage(packageName, estimate) {
|
|
|
4253
4350
|
outcomes
|
|
4254
4351
|
};
|
|
4255
4352
|
}
|
|
4256
|
-
var COMPAT_CATEGORIES, POLYFILL_REGISTRY;
|
|
4353
|
+
var COMPAT_CATEGORIES, POLYFILL_REGISTRY_INPUT, POLYFILL_REGISTRY;
|
|
4257
4354
|
var init_registry = __esm({
|
|
4258
4355
|
"../compat/src/registry.ts"() {
|
|
4259
4356
|
"use strict";
|
|
4357
|
+
init_capability_outcomes();
|
|
4260
4358
|
init_capability_inventory_coverage();
|
|
4261
4359
|
init_capability_outcomes2();
|
|
4262
4360
|
init_react_native_root_export_coverage();
|
|
@@ -4285,7 +4383,7 @@ var init_registry = __esm({
|
|
|
4285
4383
|
"Analytics",
|
|
4286
4384
|
"Internationalization"
|
|
4287
4385
|
];
|
|
4288
|
-
|
|
4386
|
+
POLYFILL_REGISTRY_INPUT = {
|
|
4289
4387
|
"react-native": {
|
|
4290
4388
|
category: "Essentials",
|
|
4291
4389
|
stubType: "native",
|
|
@@ -4295,7 +4393,108 @@ var init_registry = __esm({
|
|
|
4295
4393
|
range: ">=0.86.0 <0.87.0",
|
|
4296
4394
|
// outcomes measure declared scenarios; strictCoverage remains an
|
|
4297
4395
|
// independent equal-export implementation estimate.
|
|
4298
|
-
...scoredCoverage("react-native"
|
|
4396
|
+
...scoredCoverage("react-native"),
|
|
4397
|
+
// initial iOS desk assessment; ratings are judgments, not measured corpus counts.
|
|
4398
|
+
features: [
|
|
4399
|
+
{
|
|
4400
|
+
id: "layout",
|
|
4401
|
+
usage: 3,
|
|
4402
|
+
importance: 3,
|
|
4403
|
+
estimate: 0.99,
|
|
4404
|
+
rationale: "Broad layout support; allow for fine geometry and shared styling differences."
|
|
4405
|
+
},
|
|
4406
|
+
{
|
|
4407
|
+
id: "text",
|
|
4408
|
+
usage: 3,
|
|
4409
|
+
importance: 3,
|
|
4410
|
+
estimate: 0.98,
|
|
4411
|
+
rationale: "Text shaping and wrapping work; uncommon typography and layout details remain estimated."
|
|
4412
|
+
},
|
|
4413
|
+
{
|
|
4414
|
+
id: "text-input",
|
|
4415
|
+
usage: 3,
|
|
4416
|
+
importance: 3,
|
|
4417
|
+
estimate: 0.98,
|
|
4418
|
+
rationale: "Ordinary editing and focus work; advanced selection, composition and autofill remain estimated."
|
|
4419
|
+
},
|
|
4420
|
+
{
|
|
4421
|
+
id: "scroll",
|
|
4422
|
+
usage: 3,
|
|
4423
|
+
importance: 3,
|
|
4424
|
+
estimate: 0.98,
|
|
4425
|
+
rationale: "Ordinary scrolling works; automatic insets and nested-scroll edges remain estimated."
|
|
4426
|
+
},
|
|
4427
|
+
{
|
|
4428
|
+
id: "lists",
|
|
4429
|
+
usage: 3,
|
|
4430
|
+
importance: 3,
|
|
4431
|
+
estimate: 0.99,
|
|
4432
|
+
rationale: "Windowed lists and list variants work; uncommon visibility and mutation sequences remain estimated."
|
|
4433
|
+
},
|
|
4434
|
+
{
|
|
4435
|
+
id: "press",
|
|
4436
|
+
usage: 3,
|
|
4437
|
+
importance: 3,
|
|
4438
|
+
estimate: 0.99,
|
|
4439
|
+
rationale: "Press and responder routing work; uncommon nested interaction sequences remain estimated."
|
|
4440
|
+
},
|
|
4441
|
+
{
|
|
4442
|
+
id: "images",
|
|
4443
|
+
usage: 3,
|
|
4444
|
+
importance: 2,
|
|
4445
|
+
estimate: 0.99,
|
|
4446
|
+
rationale: "Image loading and resize modes work; uncommon source and paint details remain estimated."
|
|
4447
|
+
},
|
|
4448
|
+
{
|
|
4449
|
+
id: "animation",
|
|
4450
|
+
usage: 2,
|
|
4451
|
+
importance: 3,
|
|
4452
|
+
estimate: 0.97,
|
|
4453
|
+
rationale: "Common animation graphs work; interruption and layout-animation edges remain estimated."
|
|
4454
|
+
},
|
|
4455
|
+
{
|
|
4456
|
+
id: "controls",
|
|
4457
|
+
usage: 2,
|
|
4458
|
+
importance: 3,
|
|
4459
|
+
estimate: 0.98,
|
|
4460
|
+
rationale: "Modals, alerts and controls work; uncommon native presentation details remain estimated."
|
|
4461
|
+
},
|
|
4462
|
+
{
|
|
4463
|
+
id: "keyboard",
|
|
4464
|
+
usage: 2,
|
|
4465
|
+
importance: 3,
|
|
4466
|
+
estimate: 0.97,
|
|
4467
|
+
rationale: "Keyboard presentation and avoidance work; accessory and inset edge behavior remain estimated."
|
|
4468
|
+
},
|
|
4469
|
+
{
|
|
4470
|
+
id: "environment",
|
|
4471
|
+
usage: 2,
|
|
4472
|
+
importance: 2,
|
|
4473
|
+
estimate: 0.99,
|
|
4474
|
+
rationale: "Platform, dimensions and appearance work; uncommon lifecycle transitions remain estimated."
|
|
4475
|
+
},
|
|
4476
|
+
{
|
|
4477
|
+
id: "accessibility",
|
|
4478
|
+
usage: 1,
|
|
4479
|
+
importance: 2,
|
|
4480
|
+
estimate: 0.85,
|
|
4481
|
+
rationale: "Focus and announcements have implementations; several accessibility preferences return fixed values."
|
|
4482
|
+
},
|
|
4483
|
+
{
|
|
4484
|
+
id: "system",
|
|
4485
|
+
usage: 1,
|
|
4486
|
+
importance: 2,
|
|
4487
|
+
estimate: 0.9,
|
|
4488
|
+
rationale: "Small system APIs depend on browser facilities; physical device behavior is not universally available."
|
|
4489
|
+
},
|
|
4490
|
+
{
|
|
4491
|
+
id: "native-integration",
|
|
4492
|
+
usage: 1,
|
|
4493
|
+
importance: 2,
|
|
4494
|
+
estimate: 0.95,
|
|
4495
|
+
rationale: "Core module lookup works; arbitrary app-specific native modules and uncommon system methods remain outside the implemented surface."
|
|
4496
|
+
}
|
|
4497
|
+
],
|
|
4299
4498
|
strictCoverage: REACT_NATIVE_ROOT_EXPORT_STRICT_COVERAGE,
|
|
4300
4499
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["react-native"],
|
|
4301
4500
|
note: "React Native 0.86 root surface with useful core rendering, input, scrolling, animation, list, platform, and native-module behavior",
|
|
@@ -4317,7 +4516,51 @@ var init_registry = __esm({
|
|
|
4317
4516
|
},
|
|
4318
4517
|
{
|
|
4319
4518
|
range: ">=4.0.0 <5.0.0",
|
|
4320
|
-
...scoredCoverage("react-native-reanimated"
|
|
4519
|
+
...scoredCoverage("react-native-reanimated"),
|
|
4520
|
+
features: [
|
|
4521
|
+
{
|
|
4522
|
+
id: "animation-primitives",
|
|
4523
|
+
usage: 3,
|
|
4524
|
+
importance: 3,
|
|
4525
|
+
estimate: 1,
|
|
4526
|
+
rationale: "Shared values, timing, spring, decay, sequencing, repetition, interpolation, and easing drive the common animation workflow. The installed upstream JavaScript runs against the SootSim worklet seam, and no app-facing primitive is missing in the inspected path."
|
|
4527
|
+
},
|
|
4528
|
+
{
|
|
4529
|
+
id: "animated-components-and-props",
|
|
4530
|
+
usage: 3,
|
|
4531
|
+
importance: 3,
|
|
4532
|
+
estimate: 1,
|
|
4533
|
+
rationale: "Animated View, Text, Image, ScrollView, FlatList, animated styles, animated props, and animated refs cover the primary rendered workflow. The React 19.2.3 bridge receives refs as ordinary props and the adapter preserves them, with no observed app-facing wrapper gap."
|
|
4534
|
+
},
|
|
4535
|
+
{
|
|
4536
|
+
id: "scroll-and-event-workflows",
|
|
4537
|
+
usage: 3,
|
|
4538
|
+
importance: 3,
|
|
4539
|
+
estimate: 1,
|
|
4540
|
+
rationale: "Scroll handlers, offsets, frame callbacks, scheduling, gesture state, scrollTo and measure use the implemented engine paths. No separate scheduling defect is established."
|
|
4541
|
+
},
|
|
4542
|
+
{
|
|
4543
|
+
id: "layout-transitions",
|
|
4544
|
+
usage: 2,
|
|
4545
|
+
importance: 3,
|
|
4546
|
+
estimate: 1,
|
|
4547
|
+
rationale: "Upstream layout builders and the engine layout owner implement entering, exiting and layout transitions."
|
|
4548
|
+
},
|
|
4549
|
+
{
|
|
4550
|
+
id: "css-animations",
|
|
4551
|
+
usage: 1,
|
|
4552
|
+
importance: 2,
|
|
4553
|
+
estimate: 0.8,
|
|
4554
|
+
rationale: "Common opacity, transform and processed-color CSS animations work. The 20% allowance estimates the remaining layout, border metrics, shadows, filters and complex-value animation workflows."
|
|
4555
|
+
},
|
|
4556
|
+
{
|
|
4557
|
+
id: "device-and-native-integration",
|
|
4558
|
+
usage: 1,
|
|
4559
|
+
importance: 2,
|
|
4560
|
+
estimate: 1,
|
|
4561
|
+
rationale: "Native property reads and writes, commands, reduced motion, keyboard frames and sensor registration use engine paths; unavailable physical facilities follow the browser-hosted contract."
|
|
4562
|
+
}
|
|
4563
|
+
],
|
|
4321
4564
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["react-native-reanimated"],
|
|
4322
4565
|
note: "core animations, gestures, scroll, layout transitions, common CSS opacity, transform, and processed-color transitions and keyframes, keyboard, sensors, reduced motion, native view property reads, and direct static style snapshots",
|
|
4323
4566
|
working: "useSharedValue, useAnimatedStyle/Props/Reaction, useDerivedValue, useAnimatedScrollHandler, useScrollViewOffset, useFrameCallback, useAnimatedRef, useAnimatedKeyboard, useAnimatedSensor, useReducedMotion, entering/exiting/layout transitions, css/createCSSAnimatedComponent with cubicBezier/linear/steps timing for common opacity and transform transitions, opacity and transform keyframes with retained forwards fill, withTiming/Spring/Decay/Delay/Sequence/Repeat/Clamp, interpolate, interpolateColor, runOnJS/UI, measure, scrollTo, getViewProp (layout, opacity, zIndex, backgroundColor, boxShadow), direct setViewStyle snapshots, Easing, createAnimatedComponent, Animated.View/Text/Image/ScrollView/FlatList",
|
|
@@ -4333,7 +4576,37 @@ var init_registry = __esm({
|
|
|
4333
4576
|
{ range: ">=2.0.0 <2.30.0", coverage: 0.7, note: "tap, pan, long press" },
|
|
4334
4577
|
{
|
|
4335
4578
|
range: ">=2.30.0 <3.0.0",
|
|
4336
|
-
...scoredCoverage("react-native-gesture-handler"
|
|
4579
|
+
...scoredCoverage("react-native-gesture-handler"),
|
|
4580
|
+
features: [
|
|
4581
|
+
{
|
|
4582
|
+
id: "gesture-recognition-and-composition",
|
|
4583
|
+
usage: 3,
|
|
4584
|
+
importance: 3,
|
|
4585
|
+
estimate: 1,
|
|
4586
|
+
rationale: "GestureDetector, gesture factories, discrete and continuous recognizers, and composed relationships use the recognition seam. ForceTouch reports unavailable hardware, as expected in the simulator."
|
|
4587
|
+
},
|
|
4588
|
+
{
|
|
4589
|
+
id: "native-wrappers-and-touchables",
|
|
4590
|
+
usage: 3,
|
|
4591
|
+
importance: 2,
|
|
4592
|
+
estimate: 1,
|
|
4593
|
+
rationale: "ScrollView, FlatList, Switch, Pressable, TextInput, RefreshControl, Text, and touchable/button wrappers preserve normal React Native controls while attaching gesture behavior where requested. The inspected wrapper path has no app-facing behavior gap."
|
|
4594
|
+
},
|
|
4595
|
+
{
|
|
4596
|
+
id: "root-and-native-interop",
|
|
4597
|
+
usage: 2,
|
|
4598
|
+
importance: 2,
|
|
4599
|
+
estimate: 1,
|
|
4600
|
+
rationale: "GestureHandlerRootView, root HOC, native wrappers, refs, and the registered recognition seam make the package usable inside ordinary app trees. The inspected root and registration path has no app-facing behavior gap."
|
|
4601
|
+
},
|
|
4602
|
+
{
|
|
4603
|
+
id: "drawers-and-swipeables",
|
|
4604
|
+
usage: 1,
|
|
4605
|
+
importance: 2,
|
|
4606
|
+
estimate: 1,
|
|
4607
|
+
rationale: "Swipeable, ReanimatedSwipeable and the upstream DrawerLayout use the implemented gesture and drawer paths for drag, open, close and lifecycle callbacks."
|
|
4608
|
+
}
|
|
4609
|
+
],
|
|
4337
4610
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["react-native-gesture-handler"],
|
|
4338
4611
|
note: "tap, pan, pinch, rotation, fling, long press, race, manual, simultaneous, force touch unavailable-hardware parity",
|
|
4339
4612
|
working: "GestureDetector, Gesture.Tap/Pan/Pinch/Rotation/Fling/LongPress/ForceTouch/Manual/Race/Simultaneous/Exclusive/Hover, ForceTouchGestureHandler unavailable-hardware fallback (children render, forceTouchAvailable false, no force events), simultaneousWithExternalGesture/requireExternalGestureToFail/blocksExternalGesture, ScrollView/FlatList, Switch/RefreshControl, Pressable/Text, Touchables, BaseButton/RawButton/RectButton/BorderlessButton/PureNativeButton, Swipeable, ReanimatedSwipeable, DrawerLayout (the upstream component running on this seam: renderNavigationView, drawerPosition/drawerType/drawerWidth/edgeWidth, openDrawer/closeDrawer, edge-swipe drag, onDrawerOpen/onDrawerClose/onDrawerStateChanged), GestureHandlerRootView, createNativeWrapper, gestureHandlerRootHOC, PointerType/MouseButton/HoverEffect exports, velocity tracking, activeOffsets, multi-tap"
|
|
@@ -4348,7 +4621,44 @@ var init_registry = __esm({
|
|
|
4348
4621
|
{ range: ">=3.0.0 <4.0.0", coverage: 0.6, note: "basic screen container" },
|
|
4349
4622
|
{
|
|
4350
4623
|
range: ">=4.0.0",
|
|
4351
|
-
...scoredCoverage("react-native-screens"
|
|
4624
|
+
...scoredCoverage("react-native-screens"),
|
|
4625
|
+
features: [
|
|
4626
|
+
{
|
|
4627
|
+
id: "screen-containers-and-lifecycle",
|
|
4628
|
+
usage: 3,
|
|
4629
|
+
importance: 3,
|
|
4630
|
+
estimate: 1,
|
|
4631
|
+
rationale: "Screen, ScreenContainer, ScreenStack, ScreenStackItem, activity state, lifecycle callbacks, and enableScreens cover the primary navigation container workflow. The inspected container and lifecycle path has no app-facing behavior gap."
|
|
4632
|
+
},
|
|
4633
|
+
{
|
|
4634
|
+
id: "stack-presentations-and-transitions",
|
|
4635
|
+
usage: 3,
|
|
4636
|
+
importance: 3,
|
|
4637
|
+
estimate: 1,
|
|
4638
|
+
rationale: "Push, modal, transparent, page-sheet, form-sheet, replace, fade, zoom, slide, parallax, and interactive edge-swipe transitions determine the visible navigation workflow. The inspected stack transition path has no app-facing behavior gap outside the separate detent interaction feature."
|
|
4639
|
+
},
|
|
4640
|
+
{
|
|
4641
|
+
id: "headers-and-search",
|
|
4642
|
+
usage: 2,
|
|
4643
|
+
importance: 2,
|
|
4644
|
+
estimate: 1,
|
|
4645
|
+
rationale: "Header configuration, native buttons and menus, back and title presentation, custom subviews, search bars, large-title collapse, and iOS toolbar search placements cover common stack chrome. The inspected header and search path has no app-facing behavior gap."
|
|
4646
|
+
},
|
|
4647
|
+
{
|
|
4648
|
+
id: "sheets-and-modal-geometry",
|
|
4649
|
+
usage: 2,
|
|
4650
|
+
importance: 2,
|
|
4651
|
+
estimate: 0.75,
|
|
4652
|
+
rationale: "Initial detents, sheet geometry, corner radius, grabber, undimmed range and dismissal work. Interactive movement between form-sheet detents is absent, estimated as 25% of this sheet workflow."
|
|
4653
|
+
},
|
|
4654
|
+
{
|
|
4655
|
+
id: "tabs-freeze-and-overlay",
|
|
4656
|
+
usage: 1,
|
|
4657
|
+
importance: 1,
|
|
4658
|
+
estimate: 1,
|
|
4659
|
+
rationale: "Tabs.Host and Tabs.Screen, FullWindowOverlay, transition progress, and opt-in React freeze behavior remain available. The inspected tab, overlay, and freeze path has no app-facing behavior gap."
|
|
4660
|
+
}
|
|
4661
|
+
],
|
|
4352
4662
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["react-native-screens"],
|
|
4353
4663
|
note: "screen container, stack, header config, search bar, navigation props",
|
|
4354
4664
|
working: "Screen, ScreenContainer, ScreenStack, enableFreeze/freezeEnabled with delayed React freeze, Android modal/pageSheet push fallback, Android statusBarHidden/statusBarStyle/navigationBarHidden traits, push/pop slide, replaceAnimation push/pop direction, zoom/fade/fade_from_bottom transitions, edge swipe-back, parallax behind-screen, large title collapse, header (back button, inline/large title, custom left/center/right/search bar subviews, native header bar buttons/menus/badges, crossfade), formSheet custom initial detents/corner radius/grabber/undimmed range and stacked sheets, useHeaderHeight, useTransitionProgress, FullWindowOverlay, SearchBar with stacked and iOS 26 automatic/inline/integrated/integratedCentered/integratedButton toolbar placement, Tabs.Host/Screen, lifecycle callbacks (onAppear/onDisappear/onWillAppear/onWillDisappear), onDismissed",
|
|
@@ -4363,11 +4673,41 @@ var init_registry = __esm({
|
|
|
4363
4673
|
versions: [
|
|
4364
4674
|
{
|
|
4365
4675
|
range: ">=4.0.0",
|
|
4366
|
-
...scoredCoverage("react-native-safe-area-context"
|
|
4676
|
+
...scoredCoverage("react-native-safe-area-context"),
|
|
4677
|
+
features: [
|
|
4678
|
+
{
|
|
4679
|
+
id: "provider-and-window-metrics",
|
|
4680
|
+
usage: 3,
|
|
4681
|
+
importance: 3,
|
|
4682
|
+
estimate: 0.97,
|
|
4683
|
+
rationale: "SafeAreaProvider and initialWindowMetrics expose live frame and inset values from the device-spec and keyboard sources. The compatibility facade does not export the upstream initialWindowSafeAreaInsets value, so direct imports of that public constant do not receive the native package value."
|
|
4684
|
+
},
|
|
4685
|
+
{
|
|
4686
|
+
id: "edge-aware-layout",
|
|
4687
|
+
usage: 3,
|
|
4688
|
+
importance: 3,
|
|
4689
|
+
estimate: 1,
|
|
4690
|
+
rationale: "SafeAreaView applies additive, maximum, and off edge modes to padding or margin while preserving flattened caller styles. The inspected edge and style path has no app-facing behavior gap."
|
|
4691
|
+
},
|
|
4692
|
+
{
|
|
4693
|
+
id: "hooks-contexts-and-hoc",
|
|
4694
|
+
usage: 3,
|
|
4695
|
+
importance: 2,
|
|
4696
|
+
estimate: 1,
|
|
4697
|
+
rationale: "useSafeAreaInsets, useSafeAreaFrame, SafeAreaConsumer, SafeAreaContext, useSafeArea, and withSafeAreaInsets expose the provider values through the expected context and component APIs. The inspected hook and HOC path has no app-facing behavior gap under React 19.2.3 ref semantics."
|
|
4698
|
+
},
|
|
4699
|
+
{
|
|
4700
|
+
id: "listener-and-nested-provider",
|
|
4701
|
+
usage: 1,
|
|
4702
|
+
importance: 2,
|
|
4703
|
+
estimate: 1,
|
|
4704
|
+
rationale: "Nested providers retain parent values and SafeAreaListener subscribes to device, keyboard, bar, and soft-input changes. The inspected listener and nested-provider path has no app-facing behavior gap."
|
|
4705
|
+
}
|
|
4706
|
+
],
|
|
4367
4707
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["react-native-safe-area-context"],
|
|
4368
4708
|
note: "live device/system-bar/ime metrics, edges/mode padding, hooks",
|
|
4369
4709
|
working: "SafeAreaProvider with live Android system-bar and IME-resized frame metrics, SafeAreaView (edges/mode padding/margin), useSafeAreaInsets, useSafeAreaFrame, SafeAreaInsetsContext, SafeAreaFrameContext, initialWindowMetrics, SafeAreaListener onInsetsChange, withSafeAreaInsets HOC",
|
|
4370
|
-
missing: "rotation-specific provider frame deltas"
|
|
4710
|
+
missing: "initialWindowSafeAreaInsets is not exported; rotation-specific provider frame deltas remain unassessed"
|
|
4371
4711
|
}
|
|
4372
4712
|
]
|
|
4373
4713
|
},
|
|
@@ -4378,11 +4718,55 @@ var init_registry = __esm({
|
|
|
4378
4718
|
versions: [
|
|
4379
4719
|
{
|
|
4380
4720
|
range: ">=13.0.0",
|
|
4381
|
-
...scoredCoverage("react-native-svg"
|
|
4721
|
+
...scoredCoverage("react-native-svg"),
|
|
4722
|
+
features: [
|
|
4723
|
+
{
|
|
4724
|
+
id: "shapes-and-transforms",
|
|
4725
|
+
usage: 3,
|
|
4726
|
+
importance: 3,
|
|
4727
|
+
estimate: 1,
|
|
4728
|
+
rationale: "Svg, Path, Circle, Rect, Line, Ellipse, Polygon, Polyline, G, Use, and Symbol render through the upstream JavaScript elements and registered CanvasKit host aliases, with viewBox scaling and shape transforms. The inspected common shape path has no app-facing behavior gap."
|
|
4729
|
+
},
|
|
4730
|
+
{
|
|
4731
|
+
id: "fills-strokes-and-gradients",
|
|
4732
|
+
usage: 3,
|
|
4733
|
+
importance: 2,
|
|
4734
|
+
estimate: 1,
|
|
4735
|
+
rationale: "Fill, stroke, opacity, dash arrays, currentColor, linear and radial gradients, coordinate spaces and gradient transforms use the implemented paint paths."
|
|
4736
|
+
},
|
|
4737
|
+
{
|
|
4738
|
+
id: "definitions-references-and-clipping",
|
|
4739
|
+
usage: 2,
|
|
4740
|
+
importance: 2,
|
|
4741
|
+
estimate: 0.85,
|
|
4742
|
+
rationale: "Defs, Use, Symbol, Mask, and ClipPath references are supported, while Pattern, Marker, and ForeignObject nodes are skipped by the CanvasKit renderer. Apps using those nodes do not see their referenced fill, marker geometry, or embedded native content."
|
|
4743
|
+
},
|
|
4744
|
+
{
|
|
4745
|
+
id: "text-and-text-paths",
|
|
4746
|
+
usage: 1,
|
|
4747
|
+
importance: 2,
|
|
4748
|
+
estimate: 0.85,
|
|
4749
|
+
rationale: "Text and TSpan render through the SVG host path. TextPath is represented as a host type but skipped by the renderer, so text that should follow a path is not visible along that path."
|
|
4750
|
+
},
|
|
4751
|
+
{
|
|
4752
|
+
id: "xml-and-document-helpers",
|
|
4753
|
+
usage: 1,
|
|
4754
|
+
importance: 1,
|
|
4755
|
+
estimate: 1,
|
|
4756
|
+
rationale: "SvgXml, SvgUri, SvgAst, SvgFromXml, SvgCss, parse, fetchText, and camelCase provide the installed package's document-loading and parsing workflow. The inspected helper path has no app-facing behavior gap."
|
|
4757
|
+
},
|
|
4758
|
+
{
|
|
4759
|
+
id: "filters-and-imperative-geometry",
|
|
4760
|
+
usage: 1,
|
|
4761
|
+
importance: 2,
|
|
4762
|
+
estimate: 0,
|
|
4763
|
+
rationale: "Filter hosts and native export, hit-testing, path-metric, bounding-box and matrix methods refuse the operation. These dedicated behaviors receive no implementation credit."
|
|
4764
|
+
}
|
|
4765
|
+
],
|
|
4382
4766
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["react-native-svg"],
|
|
4383
|
-
note: "
|
|
4767
|
+
note: "CanvasKit rendering for shapes, text, XML, gradients, references, masks, clipping, and images; native SVG filters and geometry queries are unsupported",
|
|
4384
4768
|
working: "Svg, Path, Circle, Rect, Line, Ellipse, Polygon, Polyline, G, Text, TSpan, Defs, LinearGradient and RadialGradient with objectBoundingBox/userSpaceOnUse coordinates, focal points and gradientTransform, Stop, Mask, ClipPath, Image, Use and Symbol references, SvgXml, SvgUri, SvgAst, SvgFromXml, SvgCss, parse, fetchText, camelCase, shape transforms, fill/stroke/opacity/dasharray, currentColor, viewBox scaling",
|
|
4385
|
-
missing: "SVG filter
|
|
4769
|
+
missing: "native SVG filter components and toDataURL, hit-testing, path-metric, bounding-box, and matrix methods refuse calls; Pattern, Marker, ForeignObject, and TextPath do not render"
|
|
4386
4770
|
}
|
|
4387
4771
|
]
|
|
4388
4772
|
},
|
|
@@ -4392,9 +4776,47 @@ var init_registry = __esm({
|
|
|
4392
4776
|
versions: [
|
|
4393
4777
|
{
|
|
4394
4778
|
range: ">=1.0.0",
|
|
4395
|
-
...scoredCoverage("@react-native-async-storage/async-storage"
|
|
4779
|
+
...scoredCoverage("@react-native-async-storage/async-storage"),
|
|
4780
|
+
features: [
|
|
4781
|
+
{
|
|
4782
|
+
id: "single-key-read-write",
|
|
4783
|
+
usage: 3,
|
|
4784
|
+
importance: 3,
|
|
4785
|
+
estimate: 1,
|
|
4786
|
+
rationale: "ordinary get, set, remove, clear, and persistence work through the tenant storage seam"
|
|
4787
|
+
},
|
|
4788
|
+
{
|
|
4789
|
+
id: "batched-operations",
|
|
4790
|
+
usage: 3,
|
|
4791
|
+
importance: 3,
|
|
4792
|
+
estimate: 0.92,
|
|
4793
|
+
rationale: "batch reads and writes work; multiGet returns an empty string for missing keys instead of null, estimated as 8% of batch workflows"
|
|
4794
|
+
},
|
|
4795
|
+
{
|
|
4796
|
+
id: "merge-json",
|
|
4797
|
+
usage: 2,
|
|
4798
|
+
importance: 2,
|
|
4799
|
+
estimate: 1,
|
|
4800
|
+
rationale: "JSON object merge semantics are implemented by the native seam"
|
|
4801
|
+
},
|
|
4802
|
+
{
|
|
4803
|
+
id: "persistence-and-callbacks",
|
|
4804
|
+
usage: 2,
|
|
4805
|
+
importance: 3,
|
|
4806
|
+
estimate: 1,
|
|
4807
|
+
rationale: "tenant-scoped persistence and callback/promise completion match the app-facing contract"
|
|
4808
|
+
},
|
|
4809
|
+
{
|
|
4810
|
+
id: "use-async-storage-hook",
|
|
4811
|
+
usage: 1,
|
|
4812
|
+
importance: 2,
|
|
4813
|
+
estimate: 1,
|
|
4814
|
+
rationale: "the upstream hook runs over the default storage object"
|
|
4815
|
+
}
|
|
4816
|
+
],
|
|
4396
4817
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["@react-native-async-storage/async-storage"],
|
|
4397
|
-
note: "native-seam only \u2014 upstream AsyncStorage JS runs from the bundle and resolves RNCAsyncStorage, which persists through tenant localStorage"
|
|
4818
|
+
note: "native-seam only \u2014 upstream AsyncStorage JS runs from the bundle and resolves RNCAsyncStorage, which persists through tenant localStorage",
|
|
4819
|
+
missing: "multiGet returns an empty string for absent keys instead of null; ordinary getItem returns null correctly"
|
|
4398
4820
|
}
|
|
4399
4821
|
]
|
|
4400
4822
|
},
|
|
@@ -4405,13 +4827,54 @@ var init_registry = __esm({
|
|
|
4405
4827
|
versions: [
|
|
4406
4828
|
{
|
|
4407
4829
|
range: ">=11.0.0",
|
|
4408
|
-
...scoredCoverage(
|
|
4409
|
-
|
|
4410
|
-
|
|
4411
|
-
|
|
4830
|
+
...scoredCoverage("react-native-webview"),
|
|
4831
|
+
features: [
|
|
4832
|
+
{
|
|
4833
|
+
id: "content-loading",
|
|
4834
|
+
usage: 3,
|
|
4835
|
+
importance: 3,
|
|
4836
|
+
estimate: 0.85,
|
|
4837
|
+
rationale: "HTML, base URL and compatible URI pages load. Cross-origin pages blocked by iframe or WebKit COEP restrictions account for an estimated 15% of loading workflows; session behavior is assessed separately."
|
|
4838
|
+
},
|
|
4839
|
+
{
|
|
4840
|
+
id: "lifecycle-messaging-injection",
|
|
4841
|
+
usage: 3,
|
|
4842
|
+
importance: 3,
|
|
4843
|
+
estimate: 0.84,
|
|
4844
|
+
rationale: "local page lifecycle, messaging, and injection work; arbitrary remote-frame scripting cannot cross origin"
|
|
4845
|
+
},
|
|
4846
|
+
{
|
|
4847
|
+
id: "navigation-controls",
|
|
4848
|
+
usage: 3,
|
|
4849
|
+
importance: 3,
|
|
4850
|
+
estimate: 0.62,
|
|
4851
|
+
rationale: "reload and injection work, while history, stop, interception, and failed-navigation behavior are incomplete"
|
|
4852
|
+
},
|
|
4853
|
+
{
|
|
4854
|
+
id: "layout-scroll-presentation",
|
|
4855
|
+
usage: 3,
|
|
4856
|
+
importance: 2,
|
|
4857
|
+
estimate: 1,
|
|
4858
|
+
rationale: "Layout, clipping, scrolling, loading UI and parked/live presentation use the implemented hosted surface."
|
|
4859
|
+
},
|
|
4860
|
+
{
|
|
4861
|
+
id: "request-session-props",
|
|
4862
|
+
usage: 2,
|
|
4863
|
+
importance: 2,
|
|
4864
|
+
estimate: 0.4,
|
|
4865
|
+
rationale: "headers, cache, incognito, user agent, and cross-origin cookie/session behavior differ from native"
|
|
4866
|
+
},
|
|
4867
|
+
{
|
|
4868
|
+
id: "media-file-integration",
|
|
4869
|
+
usage: 1,
|
|
4870
|
+
importance: 2,
|
|
4871
|
+
estimate: 0.45,
|
|
4872
|
+
rationale: "Browser file inputs and media remain browser-backed, but native inline/autoplay/fullscreen policy props are not forwarded to the iframe. Their missing control is estimated as 55% of this feature."
|
|
4873
|
+
}
|
|
4874
|
+
],
|
|
4412
4875
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["react-native-webview"],
|
|
4413
4876
|
strictCoverage: REACT_NATIVE_WEBVIEW_STRICT_COVERAGE,
|
|
4414
|
-
note: "native-seam only: the published package runs unchanged and routes RNCWebView through the tenant-to-shell hosted iframe surface.
|
|
4877
|
+
note: "native-seam only: the published package runs unchanged and routes RNCWebView through the tenant-to-shell hosted iframe surface. the implementation estimate uses reviewed feature weights; the separate equal-surface strict diagnostic includes the shared, iOS, and Android public prop and ref surface. paired native and SootSim runtime conformance covers local HTML, base URL, URI loading, load and navigation callbacks, both injection phases, two-way messaging, imperative URI reload and injection, content scrolling, parent translation, and onOpenWindow target delivery.",
|
|
4415
4878
|
working: "source.uri/source.html/source.baseUrl, Chromium cross-origin URI loading under the shell COEP, same-origin URI cookies, source.html persistent localStorage, document-start ReactNativeWebView bootstrap and injectedJavaScriptBeforeContentLoaded/injectedJavaScript on source.html, strict ReactNativeWebView.postMessage bridge envelope in both directions, onMessage synthetic event with navigation fields, onOpenWindow target delivery for source.html, successful onLoad/Start/End and onNavigationStateChange, ref.reload on URI pages, ref.injectJavaScript/postMessage, internal content scrolling, renderLoading, javaScriptEnabled sandbox, layout, inherited clipping and visibility, parked/live presentation",
|
|
4416
4879
|
missing: "Safari/WebKit cross-origin URI pages without COEP-compatible response headers remain permanently loading because WebKit ignores iframe credentialless; Chromium credentialless cross-origin URI frames send no credentials, including cookies set by their own origin, and use ephemeral storage; iframe pixels in canvas screenshots; script injection, ReactNativeWebView bootstrap, and onOpenWindow for remote pages, which get no bridge at all because a browser cannot script a cross-origin frame; cross-origin ref.goBack/goForward/stopLoading and truthful canGoBack/canGoForward values; failed HTTP/refused navigation callbacks (onError/onHttpError and renderError); onShouldStartLoadWithRequest, allowsBackForwardNavigationGestures, userAgent, dataDetectorTypes, cacheEnabled, incognito, scalesPageToFit, originWhitelist enforcement"
|
|
4417
4880
|
}
|
|
@@ -4485,11 +4948,48 @@ var init_registry = __esm({
|
|
|
4485
4948
|
versions: [
|
|
4486
4949
|
{
|
|
4487
4950
|
range: ">=9.0.0",
|
|
4488
|
-
...scoredCoverage("@react-native-community/netinfo"
|
|
4951
|
+
...scoredCoverage("@react-native-community/netinfo"),
|
|
4952
|
+
features: [
|
|
4953
|
+
{
|
|
4954
|
+
id: "status-observation",
|
|
4955
|
+
usage: 3,
|
|
4956
|
+
importance: 3,
|
|
4957
|
+
estimate: 0.9,
|
|
4958
|
+
rationale: "fetch, the hook, and browser events expose online and offline state, but listeners do not receive the upstream initial snapshot"
|
|
4959
|
+
},
|
|
4960
|
+
{
|
|
4961
|
+
id: "global-singleton",
|
|
4962
|
+
usage: 3,
|
|
4963
|
+
importance: 3,
|
|
4964
|
+
estimate: 0.7,
|
|
4965
|
+
rationale: "the facade supplies fetch and listeners but omits configure and refresh from the upstream singleton"
|
|
4966
|
+
},
|
|
4967
|
+
{
|
|
4968
|
+
id: "hooks",
|
|
4969
|
+
usage: 3,
|
|
4970
|
+
importance: 2,
|
|
4971
|
+
estimate: 0.55,
|
|
4972
|
+
rationale: "useNetInfo works, while useNetInfoInstance and configuration handling are absent"
|
|
4973
|
+
},
|
|
4974
|
+
{
|
|
4975
|
+
id: "state-fidelity",
|
|
4976
|
+
usage: 2,
|
|
4977
|
+
importance: 2,
|
|
4978
|
+
estimate: 0.55,
|
|
4979
|
+
rationale: "type is reduced to wifi or none and details is always null"
|
|
4980
|
+
},
|
|
4981
|
+
{
|
|
4982
|
+
id: "public-enums",
|
|
4983
|
+
usage: 1,
|
|
4984
|
+
importance: 1,
|
|
4985
|
+
estimate: 1,
|
|
4986
|
+
rationale: "The public runtime state-type enum is present; TypeScript-only exports do not require runtime implementations."
|
|
4987
|
+
}
|
|
4988
|
+
],
|
|
4489
4989
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["@react-native-community/netinfo"],
|
|
4490
4990
|
note: "navigator.onLine backed with online/offline event listeners",
|
|
4491
4991
|
working: "fetch, useNetInfo, addEventListener, NetInfoStateType",
|
|
4492
|
-
missing: 'details
|
|
4992
|
+
missing: 'configure, refresh, useNetInfoInstance, hook configuration, and initial listener notification are absent; details is always null and type is limited to "wifi" or "none"'
|
|
4493
4993
|
}
|
|
4494
4994
|
]
|
|
4495
4995
|
},
|
|
@@ -4500,11 +5000,48 @@ var init_registry = __esm({
|
|
|
4500
5000
|
versions: [
|
|
4501
5001
|
{
|
|
4502
5002
|
range: ">=1.0.0",
|
|
4503
|
-
...scoredCoverage("react-native-keyboard-controller"
|
|
5003
|
+
...scoredCoverage("react-native-keyboard-controller"),
|
|
5004
|
+
features: [
|
|
5005
|
+
{
|
|
5006
|
+
id: "keyboard-layout-avoidance",
|
|
5007
|
+
usage: 3,
|
|
5008
|
+
importance: 3,
|
|
5009
|
+
estimate: 1,
|
|
5010
|
+
rationale: "KeyboardAvoidingView, KeyboardStickyView, and KeyboardAwareScrollView are upstream JavaScript components and cover the primary keyboard-aware layout workflow through the shared keyboard and reanimated paths. The inspected layout path has no app-facing behavior gap."
|
|
5011
|
+
},
|
|
5012
|
+
{
|
|
5013
|
+
id: "keyboard-events-and-hooks",
|
|
5014
|
+
usage: 3,
|
|
5015
|
+
importance: 3,
|
|
5016
|
+
estimate: 1,
|
|
5017
|
+
rationale: "KeyboardProvider, animation hooks, focused-input hooks, keyboard lifecycle events, and resize events use the live SootSim keyboard source and worklet dispatch path. The inspected event and hook path has no app-facing behavior gap."
|
|
5018
|
+
},
|
|
5019
|
+
{
|
|
5020
|
+
id: "keyboard-controller-api",
|
|
5021
|
+
usage: 2,
|
|
5022
|
+
importance: 2,
|
|
5023
|
+
estimate: 1,
|
|
5024
|
+
rationale: "Dismiss, focus navigation, preload, visibility and state reads, input mode, and default mode have explicit controller paths. The inspected controller path has no app-facing behavior gap."
|
|
5025
|
+
},
|
|
5026
|
+
{
|
|
5027
|
+
id: "interactive-keyboard-gesture",
|
|
5028
|
+
usage: 1,
|
|
5029
|
+
importance: 2,
|
|
5030
|
+
estimate: 1,
|
|
5031
|
+
rationale: "KeyboardGestureArea recognizes drag, settling, cancellation, focus retention, and cleanup. The current binding also registers and unregisters textInputNativeID and offset with the keyboard runtime on iOS, so the inspected gesture path has no app-facing behavior gap."
|
|
5032
|
+
},
|
|
5033
|
+
{
|
|
5034
|
+
id: "keyboard-native-views-and-toolbar",
|
|
5035
|
+
usage: 1,
|
|
5036
|
+
importance: 2,
|
|
5037
|
+
estimate: 0,
|
|
5038
|
+
rationale: "Over-keyboard hosting, keyboard background effects, extender layout, clipping and native toolbar grouping are absent. Ordinary View wrappers do not implement these native accessory behaviors."
|
|
5039
|
+
}
|
|
5040
|
+
],
|
|
4504
5041
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["react-native-keyboard-controller"],
|
|
4505
5042
|
note: "native bindings stubbed (KeyboardControllerNative, KeyboardEvents, FocusedInputEvents, WindowDimensionsEvents, KeyboardControllerView + sibling native views); upstream pure-JS components, hooks, animated module, and KeyboardAvoidingView resolve from node_modules unchanged",
|
|
4506
5043
|
working: "every upstream JS export runs through reanimated worklets; Android KeyboardGestureArea drives the existing keyboard owner through drag progress, velocity/distance settling, cancellation, focus retention, and cleanup; supported exports include KeyboardProvider, KeyboardAvoidingView, KeyboardStickyView, KeyboardAwareScrollView, KeyboardToolbar, KeyboardGestureArea, useReanimatedKeyboardAnimation, useKeyboardAnimation, useKeyboardHandler, useGenericKeyboardHandler, useKeyboardController, useKeyboardState, useKeyboardContext, useReanimatedFocusedInput, useFocusedInputHandler, useResizeMode, useWindowDimensions, KeyboardEvents, FocusedInputEvents, WindowDimensionsEvents resize events, KeyboardController (dismiss/setFocusTo/isVisible/state/preload/setInputMode/setDefaultMode), KeyboardControllerView, OverKeyboardView, KeyboardBackgroundView, KeyboardExtender, ClippingScrollView, KeyboardToolbarGroupView, and AndroidSoftInputModes",
|
|
4507
|
-
missing: "
|
|
5044
|
+
missing: "OverKeyboardView, KeyboardBackgroundView, KeyboardExtender, ClippingScrollView, and KeyboardToolbarGroupView are passthrough views without their native platform effects"
|
|
4508
5045
|
}
|
|
4509
5046
|
]
|
|
4510
5047
|
},
|
|
@@ -4514,7 +5051,23 @@ var init_registry = __esm({
|
|
|
4514
5051
|
versions: [
|
|
4515
5052
|
{
|
|
4516
5053
|
range: ">=0.2.0",
|
|
4517
|
-
...scoredCoverage("@react-native-masked-view/masked-view"
|
|
5054
|
+
...scoredCoverage("@react-native-masked-view/masked-view"),
|
|
5055
|
+
features: [
|
|
5056
|
+
{
|
|
5057
|
+
id: "alpha-mask-compositing",
|
|
5058
|
+
usage: 3,
|
|
5059
|
+
importance: 3,
|
|
5060
|
+
estimate: 1,
|
|
5061
|
+
rationale: "the engine renders maskElement as an alpha mask with CanvasKit saveLayer and DstIn compositing"
|
|
5062
|
+
},
|
|
5063
|
+
{
|
|
5064
|
+
id: "view-props-and-fallback",
|
|
5065
|
+
usage: 2,
|
|
5066
|
+
importance: 2,
|
|
5067
|
+
estimate: 1,
|
|
5068
|
+
rationale: "children, styles, refs, accessibility, pointer events, and invalid-mask fallback preserve visible behavior"
|
|
5069
|
+
}
|
|
5070
|
+
],
|
|
4518
5071
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["@react-native-masked-view/masked-view"],
|
|
4519
5072
|
note: "engine-level masked-view node with canvaskit saveLayer + BlendMode.DstIn alpha compositing",
|
|
4520
5073
|
working: "MaskedView component renders sootsim-masked-view host element with __sootsimMaskSlot alpha-mask pipeline (saveLayer + DstIn in canvaskit-renderer), maskElement, children, style, pointerEvents, accessible, accessibilityLabel, nativeID, testID"
|
|
@@ -4566,7 +5119,37 @@ var init_registry = __esm({
|
|
|
4566
5119
|
versions: [
|
|
4567
5120
|
{
|
|
4568
5121
|
range: ">=0.1.0",
|
|
4569
|
-
...scoredCoverage("react-native-worklets"
|
|
5122
|
+
...scoredCoverage("react-native-worklets"),
|
|
5123
|
+
features: [
|
|
5124
|
+
{
|
|
5125
|
+
id: "thread-scheduling-bridges",
|
|
5126
|
+
usage: 3,
|
|
5127
|
+
importance: 3,
|
|
5128
|
+
estimate: 1,
|
|
5129
|
+
rationale: "RN and UI scheduling use the implemented local and shell queues; asynchronous transport alone does not establish an ordering defect."
|
|
5130
|
+
},
|
|
5131
|
+
{
|
|
5132
|
+
id: "named-runtime-execution",
|
|
5133
|
+
usage: 2,
|
|
5134
|
+
importance: 2,
|
|
5135
|
+
estimate: 0.88,
|
|
5136
|
+
rationale: "Named runtimes support creation and asynchronous execution. Custom queues, event-loop disabling, polling intervals and synchronous or id-based named-runtime calls are unavailable, estimated as 12% of this feature."
|
|
5137
|
+
},
|
|
5138
|
+
{
|
|
5139
|
+
id: "shareable-and-serializable-values",
|
|
5140
|
+
usage: 2,
|
|
5141
|
+
importance: 2,
|
|
5142
|
+
estimate: 0.95,
|
|
5143
|
+
rationale: "Shareable values, synchronizable values, workletization, and the public serializable registration surface support the common cross-runtime value workflow. Custom serializers are recorded by the facade but are not connected to a separate structured-clone bridge for named runtimes."
|
|
5144
|
+
},
|
|
5145
|
+
{
|
|
5146
|
+
id: "runtime-kinds-and-feature-flags",
|
|
5147
|
+
usage: 1,
|
|
5148
|
+
importance: 1,
|
|
5149
|
+
estimate: 0.95,
|
|
5150
|
+
rationale: "Runtime-kind guards and the UI runtime id work. Dynamic flag writes are ignored, including the installed EXAMPLE_DYNAMIC_FLAG contract; this is estimated as 5% of the feature."
|
|
5151
|
+
}
|
|
5152
|
+
],
|
|
4570
5153
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["react-native-worklets"],
|
|
4571
5154
|
note: "core RN\u2194UI thread bridging, isolated named Worker runtimes, runtime-kind guards, UI-runtime-id execution, shareable/synchronizable guards, custom serializable registration, and feature flag readers use SootSim worker runtimes.",
|
|
4572
5155
|
working: "createWorkletRuntime with isolated named Worker execution and lifecycle teardown, runOnRuntime/runOnRuntimeAsync/scheduleOnRuntime with scheduleOnRN callback return, runOnJS, runOnUI/Sync/Async, scheduleOnRN/UI, UI-runtime runOnRuntimeSyncWithId/scheduleOnRuntimeWithId, makeShareable, createShareable (3-arg form with hostDecorator), createSerializable, createSynchronizable, isShareable, isSynchronizable, isWorkletFunction, isShareableRef, isSerializableRef, makeShareableCloneRecursive/OnUIRecursive, executeOnUIRuntimeSync, callMicrotasks, WorkletsModule, RuntimeKind enum, getRuntimeKind, isRNRuntime, isUIRuntime, isWorkerRuntime, isWorkletRuntime, UIRuntimeId, getUIRuntimeHolder, getUISchedulerHolder, registerCustomSerializable, getStaticFeatureFlag, getDynamicFeatureFlag, setDynamicFeatureFlag, Worklets namespace",
|
|
@@ -5398,7 +5981,44 @@ var init_registry = __esm({
|
|
|
5398
5981
|
versions: [
|
|
5399
5982
|
{
|
|
5400
5983
|
range: ">=5.0.0",
|
|
5401
|
-
...scoredCoverage("@sentry/react-native"
|
|
5984
|
+
...scoredCoverage("@sentry/react-native"),
|
|
5985
|
+
features: [
|
|
5986
|
+
{
|
|
5987
|
+
id: "event-telemetry",
|
|
5988
|
+
usage: 3,
|
|
5989
|
+
importance: 3,
|
|
5990
|
+
estimate: 1,
|
|
5991
|
+
rationale: "event capture and initialization are load-safe; delivery is intentionally suppressed in the browser simulator"
|
|
5992
|
+
},
|
|
5993
|
+
{
|
|
5994
|
+
id: "scope-context-breadcrumbs",
|
|
5995
|
+
usage: 3,
|
|
5996
|
+
importance: 3,
|
|
5997
|
+
estimate: 1,
|
|
5998
|
+
rationale: "scope, context, tags, users, extras, and breadcrumbs retain their JavaScript behavior"
|
|
5999
|
+
},
|
|
6000
|
+
{
|
|
6001
|
+
id: "tracing-performance",
|
|
6002
|
+
usage: 2,
|
|
6003
|
+
importance: 3,
|
|
6004
|
+
estimate: 1,
|
|
6005
|
+
rationale: "JavaScript spans and timing integrations work, and native profiling absence is a permitted load-safe simulator result"
|
|
6006
|
+
},
|
|
6007
|
+
{
|
|
6008
|
+
id: "react-integrations",
|
|
6009
|
+
usage: 2,
|
|
6010
|
+
importance: 3,
|
|
6011
|
+
estimate: 1,
|
|
6012
|
+
rationale: "wrap, boundaries, and profiler integrations run through the browser-compatible React path"
|
|
6013
|
+
},
|
|
6014
|
+
{
|
|
6015
|
+
id: "native-observability",
|
|
6016
|
+
usage: 1,
|
|
6017
|
+
importance: 2,
|
|
6018
|
+
estimate: 1,
|
|
6019
|
+
rationale: "native crash, screenshot, replay, and device-observability calls are safe no-ops permitted by the browser simulator contract"
|
|
6020
|
+
}
|
|
6021
|
+
],
|
|
5402
6022
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["@sentry/react-native"],
|
|
5403
6023
|
note: "development noop \u2014 API surface is load-safe and no events are sent from sootsim",
|
|
5404
6024
|
working: "init, wrap, captureException/Message/Event, ErrorBoundary/withErrorBoundary, withScope/configureScope, all scope setters, startTransaction, startSpan/startInactiveSpan/continueTrace, metrics namespace, hub/client/transport shape, modern integration factories, Severity enum",
|
|
@@ -5763,7 +6383,44 @@ var init_registry = __esm({
|
|
|
5763
6383
|
versions: [
|
|
5764
6384
|
{
|
|
5765
6385
|
range: ">=9.1.0 <10.0.0",
|
|
5766
|
-
...scoredCoverage("@react-native-community/datetimepicker"
|
|
6386
|
+
...scoredCoverage("@react-native-community/datetimepicker"),
|
|
6387
|
+
features: [
|
|
6388
|
+
{
|
|
6389
|
+
id: "wheel-date-time-selection",
|
|
6390
|
+
usage: 3,
|
|
6391
|
+
importance: 3,
|
|
6392
|
+
estimate: 0.93,
|
|
6393
|
+
rationale: "date, time, datetime, bounds and selection events use the wheel control; non-wrapping day/year wheels and the narrower datetime range account for an estimated 7% of this feature"
|
|
6394
|
+
},
|
|
6395
|
+
{
|
|
6396
|
+
id: "locale-timezone-interval",
|
|
6397
|
+
usage: 2,
|
|
6398
|
+
importance: 3,
|
|
6399
|
+
estimate: 1,
|
|
6400
|
+
rationale: "locale, minute interval, fixed offsets, and named IANA zones are implemented by the spinner calendar conversion"
|
|
6401
|
+
},
|
|
6402
|
+
{
|
|
6403
|
+
id: "appearance-enabled-accessibility",
|
|
6404
|
+
usage: 2,
|
|
6405
|
+
importance: 2,
|
|
6406
|
+
estimate: 0.78,
|
|
6407
|
+
rationale: "theme, text color, disabled, and accessibility work, while accentColor and iOS display styles are approximated"
|
|
6408
|
+
},
|
|
6409
|
+
{
|
|
6410
|
+
id: "dismissal-and-legacy-callbacks",
|
|
6411
|
+
usage: 2,
|
|
6412
|
+
importance: 2,
|
|
6413
|
+
estimate: 0.55,
|
|
6414
|
+
rationale: "selection callbacks are adapted, but the seam drops onPickerDismiss; the missing dismissal workflow accounts for an estimated 45% of this callback group"
|
|
6415
|
+
},
|
|
6416
|
+
{
|
|
6417
|
+
id: "android-imperative-export",
|
|
6418
|
+
usage: 1,
|
|
6419
|
+
importance: 1,
|
|
6420
|
+
estimate: 1,
|
|
6421
|
+
rationale: "the iOS package contract intentionally exposes an unavailable warning-only Android helper"
|
|
6422
|
+
}
|
|
6423
|
+
],
|
|
5767
6424
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["@react-native-community/datetimepicker"],
|
|
5768
6425
|
note: "the real upstream package JS runs from the guest bundle. the granular onValueChange prop starts in 9.1.0; its controlled iOS wrapper resolves codegenNativeComponent('RNDateTimePicker') to the engine UIDatePicker wheel. paired native and SootSim proof covers fixed-offset and IANA-named date calendars. the pinned Fabric emitter omits utcOffset, so its Int32 field is observed as 0 on native and intentionally matches that value here.",
|
|
5769
6426
|
working: "real upstream DateTimePicker and exported constants, value, mode date/time/datetime, granular onValueChange event and Date, minimumDate, maximumDate, minuteInterval, locale, timeZoneOffsetInMinutes, timeZoneName for date-mode calendar selection, textColor, themeVariant, disabled",
|
|
@@ -6104,7 +6761,23 @@ var init_registry = __esm({
|
|
|
6104
6761
|
versions: [
|
|
6105
6762
|
{
|
|
6106
6763
|
range: ">=1.0.0",
|
|
6107
|
-
...scoredCoverage("react-native-get-random-values"
|
|
6764
|
+
...scoredCoverage("react-native-get-random-values"),
|
|
6765
|
+
features: [
|
|
6766
|
+
{
|
|
6767
|
+
id: "secure-rng-side-effect",
|
|
6768
|
+
usage: 3,
|
|
6769
|
+
importance: 3,
|
|
6770
|
+
estimate: 1,
|
|
6771
|
+
rationale: "the browser already provides crypto.getRandomValues, so importing the side-effect polyfill preserves the app contract"
|
|
6772
|
+
},
|
|
6773
|
+
{
|
|
6774
|
+
id: "load-safe-fallback",
|
|
6775
|
+
usage: 1,
|
|
6776
|
+
importance: 1,
|
|
6777
|
+
estimate: 1,
|
|
6778
|
+
rationale: "the hosted runtime has secure crypto and the shim does not replace it"
|
|
6779
|
+
}
|
|
6780
|
+
],
|
|
6108
6781
|
capabilityCoverage: CAPABILITY_INVENTORY_PACKAGE_COVERAGE["react-native-get-random-values"],
|
|
6109
6782
|
note: "side-effect polyfill \u2014 browser already has crypto.getRandomValues, noop is correct",
|
|
6110
6783
|
working: "polyfills globalThis.crypto.getRandomValues if absent (Math.random fallback)"
|
|
@@ -16340,6 +17013,36 @@ var init_registry = __esm({
|
|
|
16340
17013
|
]
|
|
16341
17014
|
}
|
|
16342
17015
|
};
|
|
17016
|
+
POLYFILL_REGISTRY = Object.fromEntries(
|
|
17017
|
+
Object.entries(POLYFILL_REGISTRY_INPUT).map(([name2, entry]) => [
|
|
17018
|
+
name2,
|
|
17019
|
+
{
|
|
17020
|
+
...entry,
|
|
17021
|
+
versions: entry.versions.map((version) => {
|
|
17022
|
+
let features = version.features;
|
|
17023
|
+
if (features === void 0) {
|
|
17024
|
+
const estimate = version.estimate ?? version.coverage;
|
|
17025
|
+
if (estimate == null)
|
|
17026
|
+
throw new Error(`${name2}@${version.range} needs an implementation estimate`);
|
|
17027
|
+
features = [
|
|
17028
|
+
{ id: "package", usage: 1, importance: 1, estimate, rationale: version.note }
|
|
17029
|
+
];
|
|
17030
|
+
} else if (version.estimate !== void 0 || version.coverageSource !== "measured" && version.coverage !== void 0) {
|
|
17031
|
+
throw new Error(
|
|
17032
|
+
`${name2}@${version.range} cannot declare both features and a scalar estimate`
|
|
17033
|
+
);
|
|
17034
|
+
}
|
|
17035
|
+
const score = calculateFeatureCompatibility(features);
|
|
17036
|
+
return {
|
|
17037
|
+
...version,
|
|
17038
|
+
features,
|
|
17039
|
+
coverage: version.coverageSource === "measured" ? version.coverage ?? null : score.estimate,
|
|
17040
|
+
...version.coverageSource === "measured" ? { estimate: score.estimate } : {}
|
|
17041
|
+
};
|
|
17042
|
+
})
|
|
17043
|
+
}
|
|
17044
|
+
])
|
|
17045
|
+
);
|
|
16343
17046
|
}
|
|
16344
17047
|
});
|
|
16345
17048
|
|
|
@@ -29158,6 +29861,7 @@ function describeVisibleSimCandidate(sims, currentId) {
|
|
|
29158
29861
|
return `${candidate.id}${tags.length ? ` [${tags.join(", ")}]` : ""}`;
|
|
29159
29862
|
}
|
|
29160
29863
|
async function checkSimHealth(bridge) {
|
|
29864
|
+
if (bridge.plane === "cloud") return { hidden: false, warned: false };
|
|
29161
29865
|
try {
|
|
29162
29866
|
const probe3 = await bridge.send({
|
|
29163
29867
|
type: "evaluate",
|