react-native-navigation 8.8.6-snapshot.2569 → 8.8.6-snapshot.2581
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/android/src/main/java/com/reactnativenavigation/views/stack/topbar/titlebar/TitleBarReactButtonView.java +27 -11
- package/android/src/test/java/com/reactnativenavigation/views/TitleAndButtonsContainerTest.kt +15 -1
- package/android/src/test/java/com/reactnativenavigation/views/TitleBarReactButtonViewTest.java +135 -0
- package/ios/ARCHITECTURE.md +5 -0
- package/ios/RNNAppDelegate.h +16 -0
- package/ios/RNNAppDelegate.mm +73 -0
- package/lib/module/ARCHITECTURE.md +30 -0
- package/lib/module/Navigation.js +34 -1
- package/lib/module/Navigation.js.map +1 -1
- package/lib/module/NavigationDelegate.js +21 -0
- package/lib/module/NavigationDelegate.js.map +1 -1
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/linking/DeferredLinkQueue.js +52 -0
- package/lib/module/linking/DeferredLinkQueue.js.map +1 -0
- package/lib/module/linking/DeferredLinkQueue.test.js +54 -0
- package/lib/module/linking/DeferredLinkQueue.test.js.map +1 -0
- package/lib/module/linking/LinkingHandler.js +139 -0
- package/lib/module/linking/LinkingHandler.js.map +1 -0
- package/lib/module/linking/LinkingHandler.test.js +384 -0
- package/lib/module/linking/LinkingHandler.test.js.map +1 -0
- package/lib/module/linking/ModalLayoutBuilder.js +56 -0
- package/lib/module/linking/ModalLayoutBuilder.js.map +1 -0
- package/lib/module/linking/ModalLayoutBuilder.test.js +154 -0
- package/lib/module/linking/ModalLayoutBuilder.test.js.map +1 -0
- package/lib/module/linking/RouteMatcher.js +104 -0
- package/lib/module/linking/RouteMatcher.js.map +1 -0
- package/lib/module/linking/RouteMatcher.test.js +164 -0
- package/lib/module/linking/RouteMatcher.test.js.map +1 -0
- package/lib/module/linking/URLParser.js +56 -0
- package/lib/module/linking/URLParser.js.map +1 -0
- package/lib/module/linking/URLParser.test.js +100 -0
- package/lib/module/linking/URLParser.test.js.map +1 -0
- package/lib/module/linking/types.js +4 -0
- package/lib/module/linking/types.js.map +1 -0
- package/lib/typescript/Navigation.d.ts +22 -0
- package/lib/typescript/Navigation.d.ts.map +1 -1
- package/lib/typescript/NavigationDelegate.d.ts +13 -0
- package/lib/typescript/NavigationDelegate.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +1 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/linking/DeferredLinkQueue.d.ts +26 -0
- package/lib/typescript/linking/DeferredLinkQueue.d.ts.map +1 -0
- package/lib/typescript/linking/DeferredLinkQueue.test.d.ts +2 -0
- package/lib/typescript/linking/DeferredLinkQueue.test.d.ts.map +1 -0
- package/lib/typescript/linking/LinkingHandler.d.ts +71 -0
- package/lib/typescript/linking/LinkingHandler.d.ts.map +1 -0
- package/lib/typescript/linking/LinkingHandler.test.d.ts +2 -0
- package/lib/typescript/linking/LinkingHandler.test.d.ts.map +1 -0
- package/lib/typescript/linking/ModalLayoutBuilder.d.ts +21 -0
- package/lib/typescript/linking/ModalLayoutBuilder.d.ts.map +1 -0
- package/lib/typescript/linking/ModalLayoutBuilder.test.d.ts +2 -0
- package/lib/typescript/linking/ModalLayoutBuilder.test.d.ts.map +1 -0
- package/lib/typescript/linking/RouteMatcher.d.ts +23 -0
- package/lib/typescript/linking/RouteMatcher.d.ts.map +1 -0
- package/lib/typescript/linking/RouteMatcher.test.d.ts +2 -0
- package/lib/typescript/linking/RouteMatcher.test.d.ts.map +1 -0
- package/lib/typescript/linking/URLParser.d.ts +16 -0
- package/lib/typescript/linking/URLParser.d.ts.map +1 -0
- package/lib/typescript/linking/URLParser.test.d.ts +2 -0
- package/lib/typescript/linking/URLParser.test.d.ts.map +1 -0
- package/lib/typescript/linking/types.d.ts +107 -0
- package/lib/typescript/linking/types.d.ts.map +1 -0
- package/package.json +1 -1
- package/src/ARCHITECTURE.md +30 -0
- package/src/Navigation.ts +36 -1
- package/src/NavigationDelegate.ts +22 -0
- package/src/index.ts +1 -0
- package/src/linking/DeferredLinkQueue.test.ts +60 -0
- package/src/linking/DeferredLinkQueue.ts +55 -0
- package/src/linking/LinkingHandler.test.ts +332 -0
- package/src/linking/LinkingHandler.ts +169 -0
- package/src/linking/ModalLayoutBuilder.test.ts +105 -0
- package/src/linking/ModalLayoutBuilder.ts +60 -0
- package/src/linking/RouteMatcher.test.ts +128 -0
- package/src/linking/RouteMatcher.ts +126 -0
- package/src/linking/URLParser.test.ts +105 -0
- package/src/linking/URLParser.ts +62 -0
- package/src/linking/types.ts +115 -0
|
@@ -5,11 +5,11 @@ import android.content.Context;
|
|
|
5
5
|
import android.util.TypedValue;
|
|
6
6
|
import android.view.View;
|
|
7
7
|
|
|
8
|
-
import com.facebook.react.ReactInstanceManager;
|
|
9
8
|
import com.reactnativenavigation.options.ComponentOptions;
|
|
10
9
|
import com.reactnativenavigation.options.params.Number;
|
|
11
10
|
import com.reactnativenavigation.react.ReactView;
|
|
12
11
|
|
|
12
|
+
import static android.view.View.MeasureSpec.AT_MOST;
|
|
13
13
|
import static android.view.View.MeasureSpec.EXACTLY;
|
|
14
14
|
import static android.view.View.MeasureSpec.makeMeasureSpec;
|
|
15
15
|
import static com.reactnativenavigation.utils.UiUtils.dpToPx;
|
|
@@ -25,28 +25,44 @@ public class TitleBarReactButtonView extends ReactView {
|
|
|
25
25
|
|
|
26
26
|
@Override
|
|
27
27
|
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
28
|
-
|
|
29
|
-
//This is a workaround, ReactNative throws exception when views have ids, On android MenuItems
|
|
28
|
+
// This is a workaround, ReactNative throws exception when views have ids, On android MenuItems
|
|
30
29
|
// With ActionViews like this got an id, see #7253
|
|
31
30
|
if (!this.isAttachedToWindow()) {
|
|
32
31
|
this.setId(View.NO_ID);
|
|
33
32
|
}
|
|
34
33
|
|
|
35
|
-
super.onMeasure(
|
|
34
|
+
super.onMeasure(
|
|
35
|
+
createWidthSpec(widthMeasureSpec, component.width),
|
|
36
|
+
createHeightSpec(heightMeasureSpec, component.height)
|
|
37
|
+
);
|
|
36
38
|
}
|
|
37
39
|
|
|
38
|
-
private int
|
|
40
|
+
private int createWidthSpec(int measureSpec, Number dimension) {
|
|
41
|
+
return createSpec(measureSpec, dimension, Math.max(getResources().getDisplayMetrics().widthPixels, 1));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private int createHeightSpec(int measureSpec, Number dimension) {
|
|
45
|
+
if (dimension.hasValue()) {
|
|
46
|
+
return createExactSpec(dimension);
|
|
47
|
+
}
|
|
48
|
+
return makeMeasureSpec(Math.max(resolveActionBarSize(), 1), EXACTLY);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private int createSpec(int measureSpec, Number dimension, int fallbackSize) {
|
|
39
52
|
if (dimension.hasValue()) {
|
|
40
|
-
return
|
|
53
|
+
return createExactSpec(dimension);
|
|
41
54
|
} else {
|
|
42
|
-
//
|
|
43
|
-
//
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
return makeMeasureSpec(resolveActionBarSize(), EXACTLY);
|
|
55
|
+
// Use bounded wrap-content width to avoid RN/Yoga RTL padding issues caused by
|
|
56
|
+
// UNSPECIFIED, without forcing every custom button to actionBarSize width.
|
|
57
|
+
int availableSize = MeasureSpec.getSize(measureSpec);
|
|
58
|
+
return makeMeasureSpec(availableSize > 0 ? availableSize : fallbackSize, AT_MOST);
|
|
47
59
|
}
|
|
48
60
|
}
|
|
49
61
|
|
|
62
|
+
private int createExactSpec(Number dimension) {
|
|
63
|
+
return makeMeasureSpec(MeasureSpec.getSize(dpToPx(getContext(), dimension.get())), EXACTLY);
|
|
64
|
+
}
|
|
65
|
+
|
|
50
66
|
private int resolveActionBarSize() {
|
|
51
67
|
TypedValue tv = new TypedValue();
|
|
52
68
|
if (getContext().getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
|
package/android/src/test/java/com/reactnativenavigation/views/TitleAndButtonsContainerTest.kt
CHANGED
|
@@ -294,6 +294,20 @@ class TitleAndButtonsContainerTest : BaseTest() {
|
|
|
294
294
|
assertThat(uut.getTitleComponent().right).isEqualTo(UUT_WIDTH - rightBarWidth - DEFAULT_LEFT_MARGIN_PX)
|
|
295
295
|
}
|
|
296
296
|
|
|
297
|
+
@Test
|
|
298
|
+
fun `Component - title width shrinks by measured right buttons only`() {
|
|
299
|
+
val rightButtonsWidth = 48
|
|
300
|
+
setup(
|
|
301
|
+
rightBarWidth = rightButtonsWidth,
|
|
302
|
+
componentWidth = UUT_WIDTH,
|
|
303
|
+
alignment = Alignment.Default
|
|
304
|
+
)
|
|
305
|
+
|
|
306
|
+
idleMainLooper()
|
|
307
|
+
assertThat(uut.getTitleComponent().left).isEqualTo(DEFAULT_LEFT_MARGIN_PX)
|
|
308
|
+
assertThat(uut.getTitleComponent().right).isEqualTo(UUT_WIDTH - rightButtonsWidth - DEFAULT_LEFT_MARGIN_PX)
|
|
309
|
+
}
|
|
310
|
+
|
|
297
311
|
@Test
|
|
298
312
|
fun `Component - should place title between the toolbars`() {
|
|
299
313
|
val leftBarWidth = 50
|
|
@@ -475,4 +489,4 @@ class TitleAndButtonsContainerTest : BaseTest() {
|
|
|
475
489
|
}
|
|
476
490
|
|
|
477
491
|
private fun getTitleSubtitleView() = (uut.getTitleComponent() as TitleSubTitleLayout)
|
|
478
|
-
}
|
|
492
|
+
}
|
package/android/src/test/java/com/reactnativenavigation/views/TitleBarReactButtonViewTest.java
ADDED
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
package com.reactnativenavigation.views;
|
|
2
|
+
|
|
3
|
+
import static android.view.View.MeasureSpec.AT_MOST;
|
|
4
|
+
import static android.view.View.MeasureSpec.EXACTLY;
|
|
5
|
+
import static android.view.View.MeasureSpec.getMode;
|
|
6
|
+
import static android.view.View.MeasureSpec.getSize;
|
|
7
|
+
import static android.view.View.MeasureSpec.makeMeasureSpec;
|
|
8
|
+
import static org.assertj.core.api.Java6Assertions.assertThat;
|
|
9
|
+
|
|
10
|
+
import android.app.Activity;
|
|
11
|
+
import android.util.TypedValue;
|
|
12
|
+
import android.view.View;
|
|
13
|
+
import android.view.ViewGroup;
|
|
14
|
+
|
|
15
|
+
import com.reactnativenavigation.BaseTest;
|
|
16
|
+
import com.reactnativenavigation.options.ComponentOptions;
|
|
17
|
+
import com.reactnativenavigation.options.params.Number;
|
|
18
|
+
import com.reactnativenavigation.options.params.Text;
|
|
19
|
+
import com.reactnativenavigation.utils.UiUtils;
|
|
20
|
+
import com.reactnativenavigation.views.stack.topbar.titlebar.TitleBarReactButtonView;
|
|
21
|
+
|
|
22
|
+
import org.junit.Test;
|
|
23
|
+
|
|
24
|
+
public class TitleBarReactButtonViewTest extends BaseTest {
|
|
25
|
+
private static final int PARENT_WIDTH = 200;
|
|
26
|
+
private static final int PARENT_HEIGHT = 100;
|
|
27
|
+
private static final int CHILD_WIDTH = 24;
|
|
28
|
+
private static final int CHILD_HEIGHT = 16;
|
|
29
|
+
|
|
30
|
+
@Test
|
|
31
|
+
public void missingDimensionsMeasureToContentWithinParentBounds() {
|
|
32
|
+
Activity activity = newActivity();
|
|
33
|
+
TitleBarReactButtonView uut = createView(activity, new ComponentOptions());
|
|
34
|
+
uut.addView(new FixedSizeView(activity), new ViewGroup.LayoutParams(CHILD_WIDTH, CHILD_HEIGHT));
|
|
35
|
+
|
|
36
|
+
uut.measure(makeMeasureSpec(PARENT_WIDTH, AT_MOST), makeMeasureSpec(PARENT_HEIGHT, AT_MOST));
|
|
37
|
+
|
|
38
|
+
assertThat(uut.getMeasuredWidth()).isEqualTo(CHILD_WIDTH);
|
|
39
|
+
assertThat(uut.getMeasuredHeight()).isEqualTo(resolveActionBarSize(activity));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@Test
|
|
43
|
+
public void explicitDimensionsMeasureExactly() {
|
|
44
|
+
Activity activity = newActivity();
|
|
45
|
+
ComponentOptions component = new ComponentOptions();
|
|
46
|
+
component.width = new Number(72);
|
|
47
|
+
component.height = new Number(32);
|
|
48
|
+
TitleBarReactButtonView uut = createView(activity, component);
|
|
49
|
+
uut.addView(new FixedSizeView(activity), new ViewGroup.LayoutParams(CHILD_WIDTH, CHILD_HEIGHT));
|
|
50
|
+
|
|
51
|
+
uut.measure(makeMeasureSpec(PARENT_WIDTH, AT_MOST), makeMeasureSpec(PARENT_HEIGHT, AT_MOST));
|
|
52
|
+
|
|
53
|
+
assertThat(uut.getMeasuredWidth()).isEqualTo(UiUtils.dpToPx(activity, 72));
|
|
54
|
+
assertThat(uut.getMeasuredHeight()).isEqualTo(UiUtils.dpToPx(activity, 32));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@Test
|
|
58
|
+
public void zeroParentWidthFallbacksToBoundedAtMostSpecAndHeightUsesActionBarSize() {
|
|
59
|
+
Activity activity = newActivity();
|
|
60
|
+
TitleBarReactButtonView uut = createView(activity, new ComponentOptions());
|
|
61
|
+
RecordingView child = new RecordingView(activity);
|
|
62
|
+
uut.addView(child, new ViewGroup.LayoutParams(
|
|
63
|
+
ViewGroup.LayoutParams.MATCH_PARENT,
|
|
64
|
+
ViewGroup.LayoutParams.MATCH_PARENT
|
|
65
|
+
));
|
|
66
|
+
|
|
67
|
+
uut.measure(makeMeasureSpec(0, AT_MOST), makeMeasureSpec(0, AT_MOST));
|
|
68
|
+
|
|
69
|
+
assertThat(getMode(child.lastWidthMeasureSpec)).isEqualTo(AT_MOST);
|
|
70
|
+
assertThat(getSize(child.lastWidthMeasureSpec))
|
|
71
|
+
.isEqualTo(Math.max(activity.getResources().getDisplayMetrics().widthPixels, 1));
|
|
72
|
+
assertThat(getMode(child.lastHeightMeasureSpec)).isEqualTo(EXACTLY);
|
|
73
|
+
assertThat(getSize(child.lastHeightMeasureSpec)).isEqualTo(Math.max(resolveActionBarSize(activity), 1));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@Test
|
|
77
|
+
public void rtlMissingDimensionsUseBoundedSpecs() {
|
|
78
|
+
Activity activity = newActivity();
|
|
79
|
+
TitleBarReactButtonView uut = createView(activity, new ComponentOptions());
|
|
80
|
+
RecordingView child = new RecordingView(activity);
|
|
81
|
+
uut.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
|
|
82
|
+
uut.addView(child, new ViewGroup.LayoutParams(
|
|
83
|
+
ViewGroup.LayoutParams.MATCH_PARENT,
|
|
84
|
+
ViewGroup.LayoutParams.MATCH_PARENT
|
|
85
|
+
));
|
|
86
|
+
|
|
87
|
+
uut.measure(makeMeasureSpec(PARENT_WIDTH, AT_MOST), makeMeasureSpec(PARENT_HEIGHT, AT_MOST));
|
|
88
|
+
|
|
89
|
+
assertThat(getMode(child.lastWidthMeasureSpec)).isEqualTo(AT_MOST);
|
|
90
|
+
assertThat(getSize(child.lastWidthMeasureSpec)).isEqualTo(PARENT_WIDTH);
|
|
91
|
+
assertThat(getMode(child.lastHeightMeasureSpec)).isEqualTo(EXACTLY);
|
|
92
|
+
assertThat(getSize(child.lastHeightMeasureSpec)).isEqualTo(resolveActionBarSize(activity));
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private TitleBarReactButtonView createView(Activity activity, ComponentOptions component) {
|
|
96
|
+
component.name = new Text("ButtonComponent");
|
|
97
|
+
component.componentId = new Text("ButtonComponentId");
|
|
98
|
+
return new TitleBarReactButtonView(activity, component);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private int resolveActionBarSize(Activity activity) {
|
|
102
|
+
TypedValue tv = new TypedValue();
|
|
103
|
+
if (activity.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true)) {
|
|
104
|
+
return TypedValue.complexToDimensionPixelSize(tv.data, activity.getResources().getDisplayMetrics());
|
|
105
|
+
}
|
|
106
|
+
return UiUtils.dpToPx(activity, 48);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
private static class FixedSizeView extends View {
|
|
110
|
+
FixedSizeView(Activity activity) {
|
|
111
|
+
super(activity);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
@Override
|
|
115
|
+
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
116
|
+
setMeasuredDimension(CHILD_WIDTH, CHILD_HEIGHT);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
private static class RecordingView extends View {
|
|
121
|
+
int lastWidthMeasureSpec;
|
|
122
|
+
int lastHeightMeasureSpec;
|
|
123
|
+
|
|
124
|
+
RecordingView(Activity activity) {
|
|
125
|
+
super(activity);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
@Override
|
|
129
|
+
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
|
130
|
+
lastWidthMeasureSpec = widthMeasureSpec;
|
|
131
|
+
lastHeightMeasureSpec = heightMeasureSpec;
|
|
132
|
+
setMeasuredDimension(getSize(widthMeasureSpec), getSize(heightMeasureSpec));
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
package/ios/ARCHITECTURE.md
CHANGED
|
@@ -28,6 +28,11 @@ Base class that user's AppDelegate must extend. Handles React Native and navigat
|
|
|
28
28
|
- Creates `RCTRootViewFactory` and `ReactHost`
|
|
29
29
|
- Calls `[ReactNativeNavigation bootstrapWithHost:]` to initialize navigation
|
|
30
30
|
- Handles RN version differences (0.77, 0.78, 0.79+) via compile-time macros
|
|
31
|
+
- **Deep linking plumbing**:
|
|
32
|
+
- Implements `application:openURL:options:` and `application:continueUserActivity:restorationHandler:`; both call `-dispatchDeepLinkURL:`.
|
|
33
|
+
- `-dispatchDeepLinkURL:` posts `RCTOpenURLNotification` directly if the React runtime is ready, otherwise enqueues the URL.
|
|
34
|
+
- Observes `RCTContentDidAppearNotification` (the Fabric/bridgeless signal) to flush the queue. This solves the cold-start race where URLs (push notifications, OS link launches) arrive before `RCTLinkingManager` is listening.
|
|
35
|
+
- Subclasses can call `-dispatchDeepLinkURL:` manually from notification delegates or any other URL source; the queueing behavior is reused automatically.
|
|
31
36
|
|
|
32
37
|
### ReactNativeNavigation Bootstrap
|
|
33
38
|
**File**: `ReactNativeNavigation.h/mm`
|
package/ios/RNNAppDelegate.h
CHANGED
|
@@ -56,4 +56,20 @@
|
|
|
56
56
|
@property(nonatomic) BOOL bridgelessEnabled;
|
|
57
57
|
#endif
|
|
58
58
|
|
|
59
|
+
/**
|
|
60
|
+
* Dispatch a deep link URL through React Native's Linking module so JS
|
|
61
|
+
* subscribers (including RNN's built-in deep linking framework) receive it.
|
|
62
|
+
*
|
|
63
|
+
* Safe to call before the JS bridge is ready: URLs that arrive early
|
|
64
|
+
* (e.g. cold-start notification taps) are queued natively and flushed
|
|
65
|
+
* automatically once Fabric/React content first appears.
|
|
66
|
+
*
|
|
67
|
+
* Custom-scheme and universal-link openings dispatched by the OS are
|
|
68
|
+
* forwarded through this method automatically; call it manually only
|
|
69
|
+
* when your app receives a deep link from a source RNN can't intercept
|
|
70
|
+
* (e.g. a custom `UNUserNotificationCenterDelegate`, a third-party push
|
|
71
|
+
* SDK callback, etc.).
|
|
72
|
+
*/
|
|
73
|
+
- (void)dispatchDeepLinkURL:(NSURL *)url;
|
|
74
|
+
|
|
59
75
|
@end
|
package/ios/RNNAppDelegate.mm
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
#import <React/RCTCxxBridgeDelegate.h>
|
|
9
9
|
#endif
|
|
10
10
|
#import <React/RCTLegacyViewManagerInteropComponentView.h>
|
|
11
|
+
#import <React/RCTLinkingManager.h>
|
|
12
|
+
#import <React/RCTRootView.h>
|
|
11
13
|
#import <React/RCTSurfacePresenter.h>
|
|
12
14
|
#if __has_include(<React/RCTSurfacePresenterStub.h>)
|
|
13
15
|
#import <React/RCTSurfacePresenterStub.h>
|
|
@@ -36,6 +38,13 @@
|
|
|
36
38
|
|
|
37
39
|
#import <React/RCTComponentViewFactory.h>
|
|
38
40
|
|
|
41
|
+
// Deep-link URLs that arrive (openURL, universal link, or external dispatch)
|
|
42
|
+
// before the React runtime is ready are queued here and flushed when Fabric
|
|
43
|
+
// posts `RCTContentDidAppearNotification` — by which point
|
|
44
|
+
// `RCTLinkingManager` is instantiated and JS subscribers are listening.
|
|
45
|
+
static NSMutableArray<NSURL *> *gRNNPendingDeepLinkURLs = nil;
|
|
46
|
+
static BOOL gRNNReactRuntimeReady = NO;
|
|
47
|
+
|
|
39
48
|
|
|
40
49
|
static NSString *const kRNConcurrentRoot = @"concurrentRoot";
|
|
41
50
|
|
|
@@ -92,9 +101,73 @@ didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
|
|
|
92
101
|
[ReactNativeNavigation bootstrapWithHost:self.reactNativeFactory.rootViewFactory.reactHost];
|
|
93
102
|
#endif
|
|
94
103
|
|
|
104
|
+
[self rnn_installDeepLinkObservers];
|
|
105
|
+
|
|
95
106
|
return YES;
|
|
96
107
|
}
|
|
97
108
|
|
|
109
|
+
#pragma mark - Deep linking
|
|
110
|
+
|
|
111
|
+
// Forward OS-delivered custom-scheme URLs to React Native's Linking module.
|
|
112
|
+
- (BOOL)application:(UIApplication *)application
|
|
113
|
+
openURL:(NSURL *)url
|
|
114
|
+
options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
|
|
115
|
+
[self dispatchDeepLinkURL:url];
|
|
116
|
+
return YES;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Forward universal links (associated domains) to React Native's Linking
|
|
120
|
+
// module by extracting the underlying https URL and routing it through the
|
|
121
|
+
// same pre-bridge queue as everything else.
|
|
122
|
+
- (BOOL)application:(UIApplication *)application
|
|
123
|
+
continueUserActivity:(NSUserActivity *)userActivity
|
|
124
|
+
restorationHandler:
|
|
125
|
+
(void (^)(NSArray<id<UIUserActivityRestoring>> *_Nullable))restorationHandler {
|
|
126
|
+
if ([userActivity.activityType isEqualToString:NSUserActivityTypeBrowsingWeb]) {
|
|
127
|
+
[self dispatchDeepLinkURL:userActivity.webpageURL];
|
|
128
|
+
return YES;
|
|
129
|
+
}
|
|
130
|
+
return NO;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
- (void)dispatchDeepLinkURL:(NSURL *)url {
|
|
134
|
+
if (url == nil) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
if (gRNNReactRuntimeReady) {
|
|
138
|
+
[RCTLinkingManager application:[UIApplication sharedApplication]
|
|
139
|
+
openURL:url
|
|
140
|
+
options:@{}];
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (gRNNPendingDeepLinkURLs == nil) {
|
|
144
|
+
gRNNPendingDeepLinkURLs = [NSMutableArray array];
|
|
145
|
+
}
|
|
146
|
+
[gRNNPendingDeepLinkURLs addObject:url];
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
- (void)rnn_installDeepLinkObservers {
|
|
150
|
+
// `RCTContentDidAppearNotification` is posted by Fabric's root view
|
|
151
|
+
// once content has rendered. RNN forces bridgeless/new-arch, so the
|
|
152
|
+
// legacy `RCTJavaScriptDidLoadNotification` never fires; we rely on
|
|
153
|
+
// this Fabric signal exclusively.
|
|
154
|
+
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
155
|
+
selector:@selector(rnn_handleReactRuntimeReady:)
|
|
156
|
+
name:RCTContentDidAppearNotification
|
|
157
|
+
object:nil];
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
- (void)rnn_handleReactRuntimeReady:(NSNotification *)notification {
|
|
161
|
+
gRNNReactRuntimeReady = YES;
|
|
162
|
+
NSArray<NSURL *> *pending = [gRNNPendingDeepLinkURLs copy];
|
|
163
|
+
[gRNNPendingDeepLinkURLs removeAllObjects];
|
|
164
|
+
for (NSURL *url in pending) {
|
|
165
|
+
[RCTLinkingManager application:[UIApplication sharedApplication]
|
|
166
|
+
openURL:url
|
|
167
|
+
options:@{}];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
98
171
|
|
|
99
172
|
#if !RNN_RN_VERSION_79_OR_NEWER
|
|
100
173
|
- (NSURL *)sourceURLForBridge:(RCTBridge *)bridge {
|
|
@@ -18,6 +18,7 @@ src/
|
|
|
18
18
|
├── components/ # React component management
|
|
19
19
|
├── events/ # Event system
|
|
20
20
|
├── interfaces/ # TypeScript type definitions
|
|
21
|
+
├── linking/ # Deep-linking framework (URL → command)
|
|
21
22
|
└── processors/ # Extensibility hooks
|
|
22
23
|
```
|
|
23
24
|
|
|
@@ -207,6 +208,35 @@ Notifies listeners of command lifecycle (start, complete).
|
|
|
207
208
|
| `RNN.PreviewCompleted` | 3D Touch preview completed |
|
|
208
209
|
| `RNN.CommandCompleted` | Navigation command finished |
|
|
209
210
|
|
|
211
|
+
## Linking Layer
|
|
212
|
+
|
|
213
|
+
Implements URL-to-screen routing on top of the standard command pipeline. The whole feature is JS-only; it consumes URLs from RN's `Linking` module and dispatches `showModal` (or a user-supplied command) when a match is found.
|
|
214
|
+
|
|
215
|
+
**Public surface** (proxied through `NavigationDelegate`):
|
|
216
|
+
- `Navigation.setLinking(config)` — configure prefixes, screen map, and customization hooks
|
|
217
|
+
- `Navigation.handleDeepLink(url)` — manually feed a URL (push notifications, branch.io, App Clips)
|
|
218
|
+
- `Navigation.setLinkingReady(ready)` — user-controlled gate for deferred deep links
|
|
219
|
+
|
|
220
|
+
**Internal modules** (`src/linking/`):
|
|
221
|
+
|
|
222
|
+
| File | Purpose |
|
|
223
|
+
|------|---------|
|
|
224
|
+
| `LinkingHandler.ts` | Orchestrator. Subscribes to `Linking.url`/`getInitialURL`, drives the queue, dispatches matches. Instantiated by `NavigationRoot`. |
|
|
225
|
+
| `URLParser.ts` | Strips prefix (longest match), removes fragment, decodes path segments + query params. |
|
|
226
|
+
| `RouteMatcher.ts` | Compiles `ScreensConfig` into a `RouteNode` tree; matches paths to screen chains with parameter extraction. |
|
|
227
|
+
| `DeferredLinkQueue.ts` | FIFO queue. Holds URLs until both gates open (root-ready + user-ready). |
|
|
228
|
+
| `ModalLayoutBuilder.ts` | Default presentation: wraps the matched chain in a `stack`, merges params into `passProps`, filters React-reserved keys (`ref`, `key`). |
|
|
229
|
+
| `types.ts` | Public types: `LinkingConfig`, `RouteMatch`, `ScreensConfig`, etc. (re-exported via `src/index.ts`). |
|
|
230
|
+
|
|
231
|
+
**Readiness gates** — a URL is dispatched only when both are true:
|
|
232
|
+
1. **Root-ready** (automatic): the first `Navigation.setRoot()` has resolved. `NavigationRoot.setRoot` calls `linkingHandler.setRootReady()` after the promise resolves.
|
|
233
|
+
2. **User-ready** (optional): `config.isReady()` returns `true`, or `setLinkingReady(true)` was called.
|
|
234
|
+
|
|
235
|
+
**Resolution priority** when a match is found:
|
|
236
|
+
1. `config.onLink(match)` — full escape hatch, RNN does nothing else
|
|
237
|
+
2. `config.getModal(match)` — custom modal layout
|
|
238
|
+
3. Default `ModalLayoutBuilder` output
|
|
239
|
+
|
|
210
240
|
## Processors Layer
|
|
211
241
|
|
|
212
242
|
### OptionProcessorsStore
|
package/lib/module/Navigation.js
CHANGED
|
@@ -21,6 +21,7 @@ import { Deprecations } from "./commands/Deprecations.js";
|
|
|
21
21
|
import { LayoutProcessor } from "./processors/LayoutProcessor.js";
|
|
22
22
|
import { LayoutProcessorsStore } from "./processors/LayoutProcessorsStore.js";
|
|
23
23
|
import { OptionsCrawler } from "./commands/OptionsCrawler.js";
|
|
24
|
+
import { LinkingHandler } from "./linking/LinkingHandler.js";
|
|
24
25
|
export class NavigationRoot {
|
|
25
26
|
TouchablePreview = TouchablePreview;
|
|
26
27
|
constructor(nativeCommandsSender, nativeEventsReceiver, appRegistryService) {
|
|
@@ -42,6 +43,7 @@ export class NavigationRoot {
|
|
|
42
43
|
this.optionsCrawler = new OptionsCrawler(this.store, this.uniqueIdProvider);
|
|
43
44
|
this.commands = new Commands(this.store, this.nativeCommandsSender, this.layoutTreeParser, this.layoutTreeCrawler, this.commandsObserver, this.uniqueIdProvider, optionsProcessor, layoutProcessor, this.optionsCrawler);
|
|
44
45
|
this.eventsRegistry = new EventsRegistry(this.nativeEventsReceiver, this.commandsObserver, this.componentEventsObserver);
|
|
46
|
+
this.linkingHandler = new LinkingHandler(layout => this.commands.showModal(layout));
|
|
45
47
|
this.componentEventsObserver.registerOnceForAllComponentEvents();
|
|
46
48
|
}
|
|
47
49
|
|
|
@@ -84,7 +86,9 @@ export class NavigationRoot {
|
|
|
84
86
|
* Reset the app to a new layout
|
|
85
87
|
*/
|
|
86
88
|
setRoot(layout) {
|
|
87
|
-
|
|
89
|
+
const result = this.commands.setRoot(layout);
|
|
90
|
+
result.then(() => this.linkingHandler.setRootReady()).catch(() => {});
|
|
91
|
+
return result;
|
|
88
92
|
}
|
|
89
93
|
|
|
90
94
|
/**
|
|
@@ -193,6 +197,35 @@ export class NavigationRoot {
|
|
|
193
197
|
return this.commands.getLaunchArgs();
|
|
194
198
|
}
|
|
195
199
|
|
|
200
|
+
/**
|
|
201
|
+
* Configure deep link handling. Maps URL prefixes and path patterns to
|
|
202
|
+
* RNN components. By default each matched link is presented as a modal
|
|
203
|
+
* (wrapped in a stack so a topBar close button can be configured); supply
|
|
204
|
+
* `getModal` to customize the modal layout or `onLink` to bypass the
|
|
205
|
+
* default behavior entirely.
|
|
206
|
+
*/
|
|
207
|
+
setLinking(config) {
|
|
208
|
+
this.linkingHandler.configure(config);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Manually run a URL through the deep link pipeline as if it had been
|
|
213
|
+
* delivered by the OS. Useful for URLs received from push notifications
|
|
214
|
+
* or other non-`Linking` sources.
|
|
215
|
+
*/
|
|
216
|
+
handleDeepLink(url) {
|
|
217
|
+
this.linkingHandler.handleURL(url);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Signal that the app is ready to process deep links (e.g. after the
|
|
222
|
+
* user has authenticated). When set to `true`, any links that were
|
|
223
|
+
* queued while not ready are replayed in order.
|
|
224
|
+
*/
|
|
225
|
+
setLinkingReady(ready) {
|
|
226
|
+
this.linkingHandler.setLinkingReady(ready);
|
|
227
|
+
}
|
|
228
|
+
|
|
196
229
|
/**
|
|
197
230
|
* Obtain the events registry instance
|
|
198
231
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["isArray","UniqueIdProvider","Store","OptionProcessorsStore","ComponentRegistry","Commands","LayoutTreeParser","LayoutTreeCrawler","EventsRegistry","CommandsObserver","Constants","ComponentEventsObserver","TouchablePreview","ComponentWrapper","OptionsProcessor","ColorService","AssetService","Deprecations","LayoutProcessor","LayoutProcessorsStore","OptionsCrawler","NavigationRoot","constructor","nativeCommandsSender","nativeEventsReceiver","appRegistryService","componentWrapper","store","optionProcessorsStore","layoutProcessorsStore","uniqueIdProvider","componentEventsObserver","componentRegistry","layoutTreeParser","optionsProcessor","layoutProcessor","layoutTreeCrawler","commandsObserver","optionsCrawler","commands","eventsRegistry","registerOnceForAllComponentEvents","registerComponent","componentName","componentProvider","concreteComponentProvider","addOptionProcessor","optionPath","processor","addProcessor","addLayoutProcessor","setLazyComponentRegistrator","lazyRegistratorFn","registerComponentWithRedux","getComponentClassFunc","ReduxProvider","reduxStore","console","warn","undefined","setRoot","
|
|
1
|
+
{"version":3,"names":["isArray","UniqueIdProvider","Store","OptionProcessorsStore","ComponentRegistry","Commands","LayoutTreeParser","LayoutTreeCrawler","EventsRegistry","CommandsObserver","Constants","ComponentEventsObserver","TouchablePreview","ComponentWrapper","OptionsProcessor","ColorService","AssetService","Deprecations","LayoutProcessor","LayoutProcessorsStore","OptionsCrawler","LinkingHandler","NavigationRoot","constructor","nativeCommandsSender","nativeEventsReceiver","appRegistryService","componentWrapper","store","optionProcessorsStore","layoutProcessorsStore","uniqueIdProvider","componentEventsObserver","componentRegistry","layoutTreeParser","optionsProcessor","layoutProcessor","layoutTreeCrawler","commandsObserver","optionsCrawler","commands","eventsRegistry","linkingHandler","layout","showModal","registerOnceForAllComponentEvents","registerComponent","componentName","componentProvider","concreteComponentProvider","addOptionProcessor","optionPath","processor","addProcessor","addLayoutProcessor","setLazyComponentRegistrator","lazyRegistratorFn","registerComponentWithRedux","getComponentClassFunc","ReduxProvider","reduxStore","console","warn","undefined","setRoot","result","then","setRootReady","catch","setDefaultOptions","options","mergeOptions","componentId","updateProps","props","callback","dismissModal","dismissAllModals","push","pop","popTo","popToRoot","setStackRoot","children","showOverlay","dismissOverlay","dismissAllOverlays","getLaunchArgs","setLinking","config","configure","handleDeepLink","url","handleURL","setLinkingReady","ready","events","constants","get","constantsSync","getSync"],"sourceRoot":"../../src","sources":["Navigation.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -158,6 +158,27 @@ export class NavigationDelegate {
|
|
|
158
158
|
return this.concreteNavigation.getLaunchArgs();
|
|
159
159
|
}
|
|
160
160
|
|
|
161
|
+
/**
|
|
162
|
+
* Configure deep link handling.
|
|
163
|
+
*/
|
|
164
|
+
setLinking(config) {
|
|
165
|
+
this.concreteNavigation.setLinking(config);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Manually feed a URL into the deep link pipeline.
|
|
170
|
+
*/
|
|
171
|
+
handleDeepLink(url) {
|
|
172
|
+
this.concreteNavigation.handleDeepLink(url);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Signal readiness to process deep links. Flushes any queued links.
|
|
177
|
+
*/
|
|
178
|
+
setLinkingReady(ready) {
|
|
179
|
+
this.concreteNavigation.setLinkingReady(ready);
|
|
180
|
+
}
|
|
181
|
+
|
|
161
182
|
/**
|
|
162
183
|
* Obtain the events registry instance
|
|
163
184
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NavigationRoot","NativeCommandsSender","NativeEventsReceiver","AppRegistryService","NavigationDelegate","constructor","concreteNavigation","createConcreteNavigation","nativeCommandsSender","nativeEventsReceiver","appRegistryService","registerComponent","componentName","componentProvider","concreteComponentProvider","addOptionProcessor","optionPath","processor","addLayoutProcessor","setLazyComponentRegistrator","lazyRegistratorFn","registerComponentWithRedux","getComponentClassFunc","ReduxProvider","reduxStore","setRoot","layout","setDefaultOptions","options","mergeOptions","componentId","updateProps","props","callback","showModal","dismissModal","dismissAllModals","push","pop","popTo","popToRoot","setStackRoot","showOverlay","dismissOverlay","dismissAllOverlays","getLaunchArgs","events","constants","constantsSync","TouchablePreview","mockNativeComponents","mockedNativeCommandsSender","mockedNativeEventsReceiver","mockedAppRegistryService","mock","store"],"sourceRoot":"../../src","sources":["NavigationDelegate.ts"],"mappings":";;AAQA,SAASA,cAAc,QAAQ,iBAAc;AAC7C,SAASC,oBAAoB,QAAQ,oCAAiC;AACtE,SAASC,oBAAoB,QAAQ,oCAAiC;AACtE,SAASC,kBAAkB,QAAQ,kCAA+B;
|
|
1
|
+
{"version":3,"names":["NavigationRoot","NativeCommandsSender","NativeEventsReceiver","AppRegistryService","NavigationDelegate","constructor","concreteNavigation","createConcreteNavigation","nativeCommandsSender","nativeEventsReceiver","appRegistryService","registerComponent","componentName","componentProvider","concreteComponentProvider","addOptionProcessor","optionPath","processor","addLayoutProcessor","setLazyComponentRegistrator","lazyRegistratorFn","registerComponentWithRedux","getComponentClassFunc","ReduxProvider","reduxStore","setRoot","layout","setDefaultOptions","options","mergeOptions","componentId","updateProps","props","callback","showModal","dismissModal","dismissAllModals","push","pop","popTo","popToRoot","setStackRoot","showOverlay","dismissOverlay","dismissAllOverlays","getLaunchArgs","setLinking","config","handleDeepLink","url","setLinkingReady","ready","events","constants","constantsSync","TouchablePreview","mockNativeComponents","mockedNativeCommandsSender","mockedNativeEventsReceiver","mockedAppRegistryService","mock","store"],"sourceRoot":"../../src","sources":["NavigationDelegate.ts"],"mappings":"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","ignoreList":[]}
|
package/lib/module/index.js
CHANGED
|
@@ -18,4 +18,5 @@ export * from "./interfaces/NavigationFunctionComponent.js";
|
|
|
18
18
|
export * from "./interfaces/CommandName.js";
|
|
19
19
|
export * from "./interfaces/Processors.js";
|
|
20
20
|
export * from "./interfaces/ProcessorSubscription.js";
|
|
21
|
+
export * from "./linking/types.js";
|
|
21
22
|
//# sourceMappingURL=index.js.map
|
package/lib/module/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["NavigationDelegate","navigationDelegate","Navigation"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,kBAAkB,QAAQ,yBAAsB;AACzD,MAAMC,kBAAkB,GAAG,IAAID,kBAAkB,CAAC,CAAC;AACnD,OAAO,MAAME,UAAU,GAAGD,kBAAkB;AAC5C,cAAc,uBAAoB;AAClC,cAAc,4BAAyB;AACvC,cAAc,yBAAsB;AACpC,cAAc,iCAA8B;AAC5C,cAAc,wBAAqB;AACnC,cAAc,mCAAgC;AAC9C,cAAc,wBAAqB;AACnC,cAAc,yBAAsB;AACpC,cAAc,qCAAkC;AAChD,cAAc,0CAAuC;AACrD,cAAc,6CAA0C;AACxD,cAAc,6CAA0C;AACxD,cAAc,6BAA0B;AACxC,cAAc,4BAAyB;AACvC,cAAc,uCAAoC","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["NavigationDelegate","navigationDelegate","Navigation"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;AAAA,SAASA,kBAAkB,QAAQ,yBAAsB;AACzD,MAAMC,kBAAkB,GAAG,IAAID,kBAAkB,CAAC,CAAC;AACnD,OAAO,MAAME,UAAU,GAAGD,kBAAkB;AAC5C,cAAc,uBAAoB;AAClC,cAAc,4BAAyB;AACvC,cAAc,yBAAsB;AACpC,cAAc,iCAA8B;AAC5C,cAAc,wBAAqB;AACnC,cAAc,mCAAgC;AAC9C,cAAc,wBAAqB;AACnC,cAAc,yBAAsB;AACpC,cAAc,qCAAkC;AAChD,cAAc,0CAAuC;AACrD,cAAc,6CAA0C;AACxD,cAAc,6CAA0C;AACxD,cAAc,6BAA0B;AACxC,cAAc,4BAAyB;AACvC,cAAc,uCAAoC;AAClD,cAAc,oBAAiB","ignoreList":[]}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Holds URLs while the linking pipeline is not ready and replays them in
|
|
5
|
+
* order once it becomes ready.
|
|
6
|
+
*
|
|
7
|
+
* Readiness is set by the owning `LinkingHandler` and reflects the combined
|
|
8
|
+
* state of:
|
|
9
|
+
* - whether the first `setRoot` has resolved (so a modal can be presented),
|
|
10
|
+
* - whether the user-supplied `isReady` predicate (if any) returns `true`.
|
|
11
|
+
*/
|
|
12
|
+
export class DeferredLinkQueue {
|
|
13
|
+
queue = [];
|
|
14
|
+
ready = false;
|
|
15
|
+
flushCallback = null;
|
|
16
|
+
setFlushCallback(callback) {
|
|
17
|
+
this.flushCallback = callback;
|
|
18
|
+
}
|
|
19
|
+
setReady(ready) {
|
|
20
|
+
const becameReady = !this.ready && ready;
|
|
21
|
+
this.ready = ready;
|
|
22
|
+
if (becameReady) {
|
|
23
|
+
this.flush();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
isReady() {
|
|
27
|
+
return this.ready;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Enqueue a URL for later processing. Should only be called when the
|
|
32
|
+
* queue is not ready; the handler decides when to enqueue vs process.
|
|
33
|
+
*/
|
|
34
|
+
enqueue(url) {
|
|
35
|
+
this.queue.push(url);
|
|
36
|
+
}
|
|
37
|
+
flush() {
|
|
38
|
+
if (!this.flushCallback) return;
|
|
39
|
+
const pending = [...this.queue];
|
|
40
|
+
this.queue = [];
|
|
41
|
+
for (const url of pending) {
|
|
42
|
+
this.flushCallback(url);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
clear() {
|
|
46
|
+
this.queue = [];
|
|
47
|
+
}
|
|
48
|
+
pending() {
|
|
49
|
+
return [...this.queue];
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=DeferredLinkQueue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["DeferredLinkQueue","queue","ready","flushCallback","setFlushCallback","callback","setReady","becameReady","flush","isReady","enqueue","url","push","pending","clear"],"sourceRoot":"../../../src","sources":["linking/DeferredLinkQueue.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMA,iBAAiB,CAAC;EACrBC,KAAK,GAAa,EAAE;EACpBC,KAAK,GAAG,KAAK;EACbC,aAAa,GAAmC,IAAI;EAErDC,gBAAgBA,CAACC,QAA+B,EAAQ;IAC7D,IAAI,CAACF,aAAa,GAAGE,QAAQ;EAC/B;EAEOC,QAAQA,CAACJ,KAAc,EAAQ;IACpC,MAAMK,WAAW,GAAG,CAAC,IAAI,CAACL,KAAK,IAAIA,KAAK;IACxC,IAAI,CAACA,KAAK,GAAGA,KAAK;IAClB,IAAIK,WAAW,EAAE;MACf,IAAI,CAACC,KAAK,CAAC,CAAC;IACd;EACF;EAEOC,OAAOA,CAAA,EAAY;IACxB,OAAO,IAAI,CAACP,KAAK;EACnB;;EAEA;AACF;AACA;AACA;EACSQ,OAAOA,CAACC,GAAW,EAAQ;IAChC,IAAI,CAACV,KAAK,CAACW,IAAI,CAACD,GAAG,CAAC;EACtB;EAEOH,KAAKA,CAAA,EAAS;IACnB,IAAI,CAAC,IAAI,CAACL,aAAa,EAAE;IACzB,MAAMU,OAAO,GAAG,CAAC,GAAG,IAAI,CAACZ,KAAK,CAAC;IAC/B,IAAI,CAACA,KAAK,GAAG,EAAE;IACf,KAAK,MAAMU,GAAG,IAAIE,OAAO,EAAE;MACzB,IAAI,CAACV,aAAa,CAACQ,GAAG,CAAC;IACzB;EACF;EAEOG,KAAKA,CAAA,EAAS;IACnB,IAAI,CAACb,KAAK,GAAG,EAAE;EACjB;EAEOY,OAAOA,CAAA,EAAa;IACzB,OAAO,CAAC,GAAG,IAAI,CAACZ,KAAK,CAAC;EACxB;AACF","ignoreList":[]}
|