expo-router 55.0.3 → 55.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/android/build.gradle +2 -2
  2. package/expo-module.config.json +1 -1
  3. package/ios/ExpoRouter.podspec +6 -0
  4. package/ios/LinkPreview/LinkPreviewNativeNavigation.swift +10 -14
  5. package/ios/LinkPreview/RNScreensTabCompat.swift +42 -0
  6. package/ios/Tests/RNScreensTabCompatTests.swift +218 -0
  7. package/local-maven-repo/expo/modules/router/expo.modules.router/{55.0.3/expo.modules.router-55.0.3.module → 55.0.4/expo.modules.router-55.0.4.module} +7 -7
  8. package/local-maven-repo/expo/modules/router/expo.modules.router/55.0.4/expo.modules.router-55.0.4.module.md5 +1 -0
  9. package/local-maven-repo/expo/modules/router/expo.modules.router/55.0.4/expo.modules.router-55.0.4.module.sha1 +1 -0
  10. package/local-maven-repo/expo/modules/router/expo.modules.router/55.0.4/expo.modules.router-55.0.4.module.sha256 +1 -0
  11. package/local-maven-repo/expo/modules/router/expo.modules.router/55.0.4/expo.modules.router-55.0.4.module.sha512 +1 -0
  12. package/local-maven-repo/expo/modules/router/expo.modules.router/{55.0.3/expo.modules.router-55.0.3.pom → 55.0.4/expo.modules.router-55.0.4.pom} +1 -1
  13. package/local-maven-repo/expo/modules/router/expo.modules.router/55.0.4/expo.modules.router-55.0.4.pom.md5 +1 -0
  14. package/local-maven-repo/expo/modules/router/expo.modules.router/55.0.4/expo.modules.router-55.0.4.pom.sha1 +1 -0
  15. package/local-maven-repo/expo/modules/router/expo.modules.router/55.0.4/expo.modules.router-55.0.4.pom.sha256 +1 -0
  16. package/local-maven-repo/expo/modules/router/expo.modules.router/55.0.4/expo.modules.router-55.0.4.pom.sha512 +1 -0
  17. package/local-maven-repo/expo/modules/router/expo.modules.router/maven-metadata.xml +4 -4
  18. package/local-maven-repo/expo/modules/router/expo.modules.router/maven-metadata.xml.md5 +1 -1
  19. package/local-maven-repo/expo/modules/router/expo.modules.router/maven-metadata.xml.sha1 +1 -1
  20. package/local-maven-repo/expo/modules/router/expo.modules.router/maven-metadata.xml.sha256 +1 -1
  21. package/local-maven-repo/expo/modules/router/expo.modules.router/maven-metadata.xml.sha512 +1 -1
  22. package/package.json +4 -4
  23. package/local-maven-repo/expo/modules/router/expo.modules.router/55.0.3/expo.modules.router-55.0.3.module.md5 +0 -1
  24. package/local-maven-repo/expo/modules/router/expo.modules.router/55.0.3/expo.modules.router-55.0.3.module.sha1 +0 -1
  25. package/local-maven-repo/expo/modules/router/expo.modules.router/55.0.3/expo.modules.router-55.0.3.module.sha256 +0 -1
  26. package/local-maven-repo/expo/modules/router/expo.modules.router/55.0.3/expo.modules.router-55.0.3.module.sha512 +0 -1
  27. package/local-maven-repo/expo/modules/router/expo.modules.router/55.0.3/expo.modules.router-55.0.3.pom.md5 +0 -1
  28. package/local-maven-repo/expo/modules/router/expo.modules.router/55.0.3/expo.modules.router-55.0.3.pom.sha1 +0 -1
  29. package/local-maven-repo/expo/modules/router/expo.modules.router/55.0.3/expo.modules.router-55.0.3.pom.sha256 +0 -1
  30. package/local-maven-repo/expo/modules/router/expo.modules.router/55.0.3/expo.modules.router-55.0.3.pom.sha512 +0 -1
  31. package/plugin/tsconfig.tsbuildinfo +0 -1
  32. /package/local-maven-repo/expo/modules/router/expo.modules.router/{55.0.3/expo.modules.router-55.0.3-sources.jar → 55.0.4/expo.modules.router-55.0.4-sources.jar} +0 -0
  33. /package/local-maven-repo/expo/modules/router/expo.modules.router/{55.0.3/expo.modules.router-55.0.3-sources.jar.md5 → 55.0.4/expo.modules.router-55.0.4-sources.jar.md5} +0 -0
  34. /package/local-maven-repo/expo/modules/router/expo.modules.router/{55.0.3/expo.modules.router-55.0.3-sources.jar.sha1 → 55.0.4/expo.modules.router-55.0.4-sources.jar.sha1} +0 -0
  35. /package/local-maven-repo/expo/modules/router/expo.modules.router/{55.0.3/expo.modules.router-55.0.3-sources.jar.sha256 → 55.0.4/expo.modules.router-55.0.4-sources.jar.sha256} +0 -0
  36. /package/local-maven-repo/expo/modules/router/expo.modules.router/{55.0.3/expo.modules.router-55.0.3-sources.jar.sha512 → 55.0.4/expo.modules.router-55.0.4-sources.jar.sha512} +0 -0
  37. /package/local-maven-repo/expo/modules/router/expo.modules.router/{55.0.3/expo.modules.router-55.0.3.aar → 55.0.4/expo.modules.router-55.0.4.aar} +0 -0
  38. /package/local-maven-repo/expo/modules/router/expo.modules.router/{55.0.3/expo.modules.router-55.0.3.aar.md5 → 55.0.4/expo.modules.router-55.0.4.aar.md5} +0 -0
  39. /package/local-maven-repo/expo/modules/router/expo.modules.router/{55.0.3/expo.modules.router-55.0.3.aar.sha1 → 55.0.4/expo.modules.router-55.0.4.aar.sha1} +0 -0
  40. /package/local-maven-repo/expo/modules/router/expo.modules.router/{55.0.3/expo.modules.router-55.0.3.aar.sha256 → 55.0.4/expo.modules.router-55.0.4.aar.sha256} +0 -0
  41. /package/local-maven-repo/expo/modules/router/expo.modules.router/{55.0.3/expo.modules.router-55.0.3.aar.sha512 → 55.0.4/expo.modules.router-55.0.4.aar.sha512} +0 -0
@@ -4,13 +4,13 @@ plugins {
4
4
  }
5
5
 
6
6
  group = 'expo.modules.router'
7
- version = '55.0.3'
7
+ version = '55.0.4'
8
8
 
9
9
  android {
10
10
  namespace "expo.modules.router"
11
11
  defaultConfig {
12
12
  versionCode 1
13
- versionName "55.0.3"
13
+ versionName "55.0.4"
14
14
  }
15
15
  lintOptions {
16
16
  abortOnError false
@@ -9,7 +9,7 @@
9
9
  "publication": {
10
10
  "groupId": "expo.modules.router",
11
11
  "artifactId": "expo.modules.router",
12
- "version": "55.0.3",
12
+ "version": "55.0.4",
13
13
  "repository": "local-maven-repo"
14
14
  }
15
15
  }
@@ -36,10 +36,16 @@ Pod::Spec.new do |s|
36
36
  'OTHER_SWIFT_FLAGS' => "$(inherited) #{compiler_flags}",
37
37
  }
38
38
 
39
+ s.exclude_files = 'Tests/**/*'
40
+
39
41
  if !$ExpoUseSources&.include?(package['name']) && ENV['EXPO_USE_SOURCE'].to_i == 0 && File.exist?("#{s.name}.xcframework") && Gem::Version.new(Pod::VERSION) >= Gem::Version.new('1.10.0')
40
42
  s.source_files = "**/*.h"
41
43
  s.vendored_frameworks = "#{s.name}.xcframework"
42
44
  else
43
45
  s.source_files = "**/*.{h,m,swift,mm,cpp}"
44
46
  end
47
+
48
+ s.test_spec 'Tests' do |test_spec|
49
+ test_spec.source_files = 'Tests/**/*.{m,swift}'
50
+ end
45
51
  end
@@ -48,12 +48,12 @@ internal class LinkPreviewNativeNavigation {
48
48
  guard let stackOrTabView else {
49
49
  return
50
50
  }
51
- if let tabView = stackOrTabView as? RNSBottomTabsScreenComponentView {
51
+ if RNScreensTabCompat.isTabScreen(stackOrTabView) {
52
52
  let newTabKeys = tabPath?.path.map { $0.newTabKey } ?? []
53
53
  // The order is important here. findStackViewWithScreenIdInSubViews must be called
54
54
  // even if screenId is nil to compute the tabChangeCommands.
55
55
  if let stackView = findStackViewWithScreenIdInSubViews(
56
- screenId: screenId, tabKeys: newTabKeys, rootView: tabView), let screenId {
56
+ screenId: screenId, tabKeys: newTabKeys, rootView: stackOrTabView), let screenId {
57
57
  setPreloadedView(stackView: stackView, screenId: screenId)
58
58
  }
59
59
  } else if let stackView = stackOrTabView as? RNSScreenStackView, let screenId {
@@ -150,8 +150,7 @@ internal class LinkPreviewNativeNavigation {
150
150
  if let result =
151
151
  enumeratedViews
152
152
  .first(where: { _, view in
153
- guard let tabView = view as? RNSBottomTabsScreenComponentView, let tabKey = tabView.tabKey
154
- else {
153
+ guard let tabKey = RNScreensTabCompat.tabKey(from: view) else {
155
154
  return false
156
155
  }
157
156
  return tabKeys.contains(tabKey)
@@ -162,13 +161,10 @@ internal class LinkPreviewNativeNavigation {
162
161
  }
163
162
 
164
163
  private func getTabBarControllerFromTabView(view: UIView) -> UITabBarController? {
165
- if let tabScreenView = view as? RNSBottomTabsScreenComponentView {
166
- return tabScreenView.reactViewController()?.tabBarController as? UITabBarController
164
+ if let tabBarController = RNScreensTabCompat.tabBarController(fromTabScreen: view) {
165
+ return tabBarController
167
166
  }
168
- if let tabHostView = view as? RNSBottomTabsHostComponentView {
169
- return tabHostView.controller as? UITabBarController
170
- }
171
- return nil
167
+ return RNScreensTabCompat.tabBarController(fromTabHost: view)
172
168
  }
173
169
 
174
170
  private func findStackViewWithScreenIdOrTabBarController(
@@ -182,10 +178,10 @@ internal class LinkPreviewNativeNavigation {
182
178
  if view.screenIds.contains(screenId) {
183
179
  return view
184
180
  }
185
- } else if let tabView = nextResponder as? RNSBottomTabsScreenComponentView {
186
- if let tabKey = tabView.tabKey, tabKeys.contains(tabKey) {
187
- return tabView
188
- }
181
+ } else if let nextView = nextResponder as? UIView,
182
+ let tabKey = RNScreensTabCompat.tabKey(from: nextView),
183
+ tabKeys.contains(tabKey) {
184
+ return nextView
189
185
  }
190
186
  currentResponder = nextResponder
191
187
  }
@@ -0,0 +1,42 @@
1
+ import UIKit
2
+
3
+ /// Instead of casting to concrete class names (which break on renames),
4
+ /// we detect tab views by checking `responds(to:)` for expected selectors
5
+ /// and read properties via KVC.
6
+ enum RNScreensTabCompat {
7
+ private static let tabKeyName = "tabKey"
8
+ private static let controllerName = "controller"
9
+ private static let reactViewControllerName = "reactViewController"
10
+
11
+ private static let tabKeySelector = NSSelectorFromString(tabKeyName)
12
+ private static let controllerSelector = NSSelectorFromString(controllerName)
13
+ private static let reactViewControllerSelector = NSSelectorFromString(reactViewControllerName)
14
+
15
+ // MARK: - Type check
16
+
17
+ /// A view is a tab screen if it has a `tabKey` property — specific to RNScreens tab views.
18
+ static func isTabScreen(_ view: UIView) -> Bool {
19
+ view.responds(to: tabKeySelector)
20
+ }
21
+
22
+ // MARK: - Property access via KVC
23
+
24
+ static func tabKey(from view: UIView) -> String? {
25
+ guard view.responds(to: tabKeySelector) else { return nil }
26
+ return view.value(forKey: tabKeyName) as? String
27
+ }
28
+
29
+ /// Calls `reactViewController()` dynamically via `perform(_:)`, then returns `.tabBarController`.
30
+ static func tabBarController(fromTabScreen view: UIView) -> UITabBarController? {
31
+ guard isTabScreen(view),
32
+ view.responds(to: reactViewControllerSelector)
33
+ else { return nil }
34
+ let vc = view.perform(reactViewControllerSelector)?.takeUnretainedValue() as? UIViewController
35
+ return vc?.tabBarController
36
+ }
37
+
38
+ static func tabBarController(fromTabHost view: UIView) -> UITabBarController? {
39
+ guard view.responds(to: controllerSelector) else { return nil }
40
+ return view.value(forKey: controllerName) as? UITabBarController
41
+ }
42
+ }
@@ -0,0 +1,218 @@
1
+ import Testing
2
+ import UIKit
3
+
4
+ @testable import ExpoRouter
5
+
6
+ // MARK: - Mock views
7
+
8
+ /// Mock tab screen: has @objc tabKey property, mimicking RNScreens tab screen views.
9
+ private class MockTabScreenView: UIView {
10
+ @objc var tabKey: String?
11
+ }
12
+
13
+ /// Mock tab host: has @objc controller property, mimicking RNScreens tab host views.
14
+ private class MockTabHostView: UIView {
15
+ @objc var controller: UIViewController?
16
+ }
17
+
18
+ /// Mock tab host with a non-UIViewController controller property.
19
+ private class MockTabHostWithBadController: UIView {
20
+ @objc var controller: NSObject? = NSObject()
21
+ }
22
+
23
+ /// Mock view with a reactViewController() method that returns a UIViewController.
24
+ private class MockTabScreenWithReactVC: UIView {
25
+ @objc var tabKey: String?
26
+ private var _reactViewController: UIViewController?
27
+
28
+ func configure(reactViewController: UIViewController) {
29
+ _reactViewController = reactViewController
30
+ }
31
+
32
+ @objc override func reactViewController() -> UIViewController? {
33
+ return _reactViewController
34
+ }
35
+ }
36
+
37
+ // MARK: - Unit tests
38
+
39
+ @Suite("RNScreensTabCompat unit tests")
40
+ struct RNScreensTabCompatUnitTests {
41
+
42
+ @Suite("isTabScreen")
43
+ struct IsTabScreen {
44
+ @Test
45
+ func `detects mock tab screen`() {
46
+ let tabScreen = MockTabScreenView()
47
+ #expect(RNScreensTabCompat.isTabScreen(tabScreen))
48
+ }
49
+
50
+ @Test
51
+ func `rejects plain UIView`() {
52
+ let plainView = UIView()
53
+ #expect(!RNScreensTabCompat.isTabScreen(plainView))
54
+ }
55
+
56
+ @Test
57
+ func `rejects mock tab host`() {
58
+ let tabHost = MockTabHostView()
59
+ #expect(!RNScreensTabCompat.isTabScreen(tabHost))
60
+ }
61
+ }
62
+
63
+ @Suite("tabKey")
64
+ struct TabKey {
65
+ @Test
66
+ func `reads value`() {
67
+ let tabScreen = MockTabScreenView()
68
+ tabScreen.tabKey = "home"
69
+ #expect(RNScreensTabCompat.tabKey(from: tabScreen) == "home")
70
+ }
71
+
72
+ @Test
73
+ func `returns nil for nil tab key`() {
74
+ let tabScreen = MockTabScreenView()
75
+ tabScreen.tabKey = nil
76
+ #expect(RNScreensTabCompat.tabKey(from: tabScreen) == nil)
77
+ }
78
+
79
+ @Test
80
+ func `returns nil for plain UIView`() {
81
+ let plainView = UIView()
82
+ #expect(RNScreensTabCompat.tabKey(from: plainView) == nil)
83
+ }
84
+ }
85
+
86
+ @Suite("tabBarController(fromTabHost:)")
87
+ struct TabBarControllerFromTabHost {
88
+ @Test
89
+ func `returns tab bar controller`() {
90
+ let tabHost = MockTabHostView()
91
+ let tabBarController = UITabBarController()
92
+ tabHost.controller = tabBarController
93
+ #expect(RNScreensTabCompat.tabBarController(fromTabHost: tabHost) === tabBarController)
94
+ }
95
+
96
+ @Test
97
+ func `returns nil for non-tab bar controller`() {
98
+ let tabHost = MockTabHostView()
99
+ tabHost.controller = UIViewController()
100
+ #expect(RNScreensTabCompat.tabBarController(fromTabHost: tabHost) == nil)
101
+ }
102
+
103
+ @Test
104
+ func `returns nil for nil controller`() {
105
+ let tabHost = MockTabHostView()
106
+ tabHost.controller = nil
107
+ #expect(RNScreensTabCompat.tabBarController(fromTabHost: tabHost) == nil)
108
+ }
109
+
110
+ @Test
111
+ func `returns nil for non-UIViewController type`() {
112
+ let tabHost = MockTabHostWithBadController()
113
+ #expect(RNScreensTabCompat.tabBarController(fromTabHost: tabHost) == nil)
114
+ }
115
+
116
+ @Test
117
+ func `returns nil for plain UIView`() {
118
+ let plainView = UIView()
119
+ #expect(RNScreensTabCompat.tabBarController(fromTabHost: plainView) == nil)
120
+ }
121
+ }
122
+
123
+ @Suite("tabBarController(fromTabScreen:)")
124
+ struct TabBarControllerFromTabScreen {
125
+ @Test
126
+ func `returns tab bar controller via reactViewController`() {
127
+ let tabBarController = UITabBarController()
128
+ let childVC = UIViewController()
129
+ tabBarController.viewControllers = [childVC]
130
+
131
+ let mockView = MockTabScreenWithReactVC()
132
+ mockView.tabKey = "tab1"
133
+ mockView.configure(reactViewController: childVC)
134
+ childVC.view.addSubview(mockView)
135
+
136
+ let result = RNScreensTabCompat.tabBarController(fromTabScreen: mockView)
137
+ #expect(result === tabBarController)
138
+ }
139
+
140
+ @Test
141
+ func `returns nil when reactViewController returns nil`() {
142
+ let mockView = MockTabScreenWithReactVC()
143
+ mockView.tabKey = "tab1"
144
+ // Don't configure — reactViewController() returns nil
145
+ #expect(RNScreensTabCompat.tabBarController(fromTabScreen: mockView) == nil)
146
+ }
147
+
148
+ @Test
149
+ func `returns nil when no reactViewController method`() {
150
+ // MockTabScreenView has tabKey but no reactViewController() method
151
+ let mockView = MockTabScreenView()
152
+ mockView.tabKey = "tab1"
153
+ #expect(RNScreensTabCompat.tabBarController(fromTabScreen: mockView) == nil)
154
+ }
155
+
156
+ @Test
157
+ func `returns nil for plain UIView`() {
158
+ let plainView = UIView()
159
+ #expect(RNScreensTabCompat.tabBarController(fromTabScreen: plainView) == nil)
160
+ }
161
+
162
+ @Test
163
+ func `returns nil when not in tab bar controller`() {
164
+ let navController = UINavigationController()
165
+ let childVC = UIViewController()
166
+ navController.viewControllers = [childVC]
167
+
168
+ let mockView = MockTabScreenWithReactVC()
169
+ mockView.tabKey = "tab1"
170
+ mockView.configure(reactViewController: childVC)
171
+ childVC.view.addSubview(mockView)
172
+
173
+ #expect(RNScreensTabCompat.tabBarController(fromTabScreen: mockView) == nil)
174
+ }
175
+ }
176
+ }
177
+
178
+ // MARK: - Integration tests (RNScreens API contract)
179
+
180
+ @Suite("RNScreens API contract")
181
+ struct RNScreensAPIContractTests {
182
+
183
+ @Test
184
+ func `tab screen class responds to tabKey`() throws {
185
+ let cls = NSClassFromString("RNSTabsScreenComponentView")
186
+ ?? NSClassFromString("RNSBottomTabsScreenComponentView")
187
+ guard let cls else {
188
+ Issue.record("No tab screen class found — neither RNSTabsScreenComponentView nor RNSBottomTabsScreenComponentView")
189
+ return
190
+ }
191
+ let view = try #require((cls as? UIView.Type)?.init(), "Failed to instantiate tab screen class")
192
+ #expect(view.responds(to: NSSelectorFromString("tabKey")))
193
+ }
194
+
195
+ @Test
196
+ func `tab host class responds to controller`() throws {
197
+ let cls = NSClassFromString("RNSTabsHostComponentView")
198
+ ?? NSClassFromString("RNSBottomTabsHostComponentView")
199
+ guard let cls else {
200
+ Issue.record("No tab host class found — neither RNSTabsHostComponentView nor RNSBottomTabsHostComponentView")
201
+ return
202
+ }
203
+ let view = try #require((cls as? UIView.Type)?.init(), "Failed to instantiate tab host class")
204
+ #expect(view.responds(to: NSSelectorFromString("controller")))
205
+ }
206
+
207
+ @Test
208
+ func `tab screen class responds to reactViewController`() throws {
209
+ let cls = NSClassFromString("RNSTabsScreenComponentView")
210
+ ?? NSClassFromString("RNSBottomTabsScreenComponentView")
211
+ guard let cls else {
212
+ Issue.record("No tab screen class found")
213
+ return
214
+ }
215
+ let view = try #require((cls as? UIView.Type)?.init(), "Failed to instantiate tab screen class")
216
+ #expect(view.responds(to: NSSelectorFromString("reactViewController")))
217
+ }
218
+ }
@@ -3,7 +3,7 @@
3
3
  "component": {
4
4
  "group": "expo.modules.router",
5
5
  "module": "expo.modules.router",
6
- "version": "55.0.3",
6
+ "version": "55.0.4",
7
7
  "attributes": {
8
8
  "org.gradle.status": "release"
9
9
  }
@@ -24,8 +24,8 @@
24
24
  },
25
25
  "files": [
26
26
  {
27
- "name": "expo.modules.router-55.0.3.aar",
28
- "url": "expo.modules.router-55.0.3.aar",
27
+ "name": "expo.modules.router-55.0.4.aar",
28
+ "url": "expo.modules.router-55.0.4.aar",
29
29
  "size": 13684,
30
30
  "sha512": "096e87bdf28a3c152ae7522330d6395eb967a309de7a888cc9e2654bbed45dc52d89fc7153bda0870732d72a1d938c0508be24b0b213c592e4dd61e3b105f1f2",
31
31
  "sha256": "3bdd36a13fbff4fb9fa0e431e2f71ab69c3d52d2fd72e9dad006249c6d447dcb",
@@ -60,8 +60,8 @@
60
60
  ],
61
61
  "files": [
62
62
  {
63
- "name": "expo.modules.router-55.0.3.aar",
64
- "url": "expo.modules.router-55.0.3.aar",
63
+ "name": "expo.modules.router-55.0.4.aar",
64
+ "url": "expo.modules.router-55.0.4.aar",
65
65
  "size": 13684,
66
66
  "sha512": "096e87bdf28a3c152ae7522330d6395eb967a309de7a888cc9e2654bbed45dc52d89fc7153bda0870732d72a1d938c0508be24b0b213c592e4dd61e3b105f1f2",
67
67
  "sha256": "3bdd36a13fbff4fb9fa0e431e2f71ab69c3d52d2fd72e9dad006249c6d447dcb",
@@ -80,8 +80,8 @@
80
80
  },
81
81
  "files": [
82
82
  {
83
- "name": "expo.modules.router-55.0.3-sources.jar",
84
- "url": "expo.modules.router-55.0.3-sources.jar",
83
+ "name": "expo.modules.router-55.0.4-sources.jar",
84
+ "url": "expo.modules.router-55.0.4-sources.jar",
85
85
  "size": 2326,
86
86
  "sha512": "a1a1537b57bc0d66efbf2bdfd5f514684400b9598e549eaf53c528d1bf32ff42b7826e74fb6e115f8ec0490b9e06ffbb3c3efe9f2f703652c13291ef82b0fa03",
87
87
  "sha256": "2add0f802e663eb9b5f90e086dca0e0e337a1442e15fb372a05945e01ee0d289",
@@ -0,0 +1 @@
1
+ 4c93d299d67f15be595a30acad1fabb81eae91a46482905bdb7c9b17413bde3d
@@ -0,0 +1 @@
1
+ 753a12d23875429f58c10d06635e2b14163efbc4688d9170856d797bdcdb740e3ff2cb5fa47f284c9dbc3790eda1db9630a1a5666e31a16f590b1685a3d20069
@@ -9,7 +9,7 @@
9
9
  <modelVersion>4.0.0</modelVersion>
10
10
  <groupId>expo.modules.router</groupId>
11
11
  <artifactId>expo.modules.router</artifactId>
12
- <version>55.0.3</version>
12
+ <version>55.0.4</version>
13
13
  <packaging>aar</packaging>
14
14
  <name>expo.modules.router</name>
15
15
  <url>https://github.com/expo/expo</url>
@@ -0,0 +1 @@
1
+ d9eb6b521e8b1ce783fb679caf5bbae203e18a2d18e57489f5e2cf0681d45348
@@ -0,0 +1 @@
1
+ 9df1959265f7c2e7bd5b13c47c4fed04443d49e69d95783dd6fc42394537e6ea94ba189c406f7f8e8bdb9d748e6e4d884b028c5bcab9695bcaa27f166569d34e
@@ -3,11 +3,11 @@
3
3
  <groupId>expo.modules.router</groupId>
4
4
  <artifactId>expo.modules.router</artifactId>
5
5
  <versioning>
6
- <latest>55.0.3</latest>
7
- <release>55.0.3</release>
6
+ <latest>55.0.4</latest>
7
+ <release>55.0.4</release>
8
8
  <versions>
9
- <version>55.0.3</version>
9
+ <version>55.0.4</version>
10
10
  </versions>
11
- <lastUpdated>20260226223009</lastUpdated>
11
+ <lastUpdated>20260305092617</lastUpdated>
12
12
  </versioning>
13
13
  </metadata>
@@ -1 +1 @@
1
- 33890813af54076e08f5b09a86c51921
1
+ 4496827117cd08e8419ca36d630e4cc6
@@ -1 +1 @@
1
- 82b58ca11e3bddae259556d8a2e863da65b086e2
1
+ 515ffef5b9101c880d698789aa98f91732b50193
@@ -1 +1 @@
1
- 5cb61d47baa4af00e9b601c4e4e66691a640d22458791a26e2aa6ffa4da338db
1
+ 0572e3c0a82989400498bcd939927134a7509d3d2c18a37a9a15b57f444ef6a0
@@ -1 +1 @@
1
- a069464ad1b206977dd9abeead380c7bd77577585b4d6838fcb5b1ee82f13602d40351e4055ed501cb138d5e70f98c830599205238da6fdd3fb3581c90d5d699
1
+ ffe8321b14985146d579691e0251330102ab7ae3542a39187b40ff60c7564b3a0c5e4fdad8f9326d100f077d75019b693a2f75bebf8542a0e7d6c35c15691249
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "expo-router",
3
- "version": "55.0.3",
3
+ "version": "55.0.4",
4
4
  "description": "Expo Router is a file-based router for React Native and web applications.",
5
5
  "author": "650 Industries, Inc.",
6
6
  "license": "MIT",
@@ -144,9 +144,9 @@
144
144
  "debug": "^4.3.4",
145
145
  "escape-string-regexp": "^4.0.0",
146
146
  "expo-glass-effect": "^55.0.7",
147
- "expo-image": "^55.0.5",
147
+ "expo-image": "^55.0.6",
148
148
  "expo-server": "^55.0.6",
149
- "expo-symbols": "^55.0.4",
149
+ "expo-symbols": "^55.0.5",
150
150
  "fast-deep-equal": "^3.1.3",
151
151
  "invariant": "^2.2.4",
152
152
  "nanoid": "^3.3.8",
@@ -160,5 +160,5 @@
160
160
  "use-latest-callback": "^0.2.1",
161
161
  "vaul": "^1.1.2"
162
162
  },
163
- "gitHead": "413b0450434d3e456eb391eca792ee9ac1e1efec"
163
+ "gitHead": "756404b0eb18d441b54c7136b4142349193f554b"
164
164
  }
@@ -1 +0,0 @@
1
- 3409f52bea4c41fddd03ab99a0ecefc0fc9e2aa4c89fa17c84c23f823fe00f37
@@ -1 +0,0 @@
1
- 3d212a0d2fac1a63ab3ac17b1ebae05e95d4c4e6a7281dc90e7aa7755082ba0534bd746fc69e8e7a1bdd0f7c92e6c55f3e5342694d6151d8d7f060983bc22d9b
@@ -1 +0,0 @@
1
- 18b1a4968d3848c5b29a13f8a5f3c02d52cebf864d04a6fff475252e8b1d2ca9
@@ -1 +0,0 @@
1
- ed74b55712827d3be2b41bee0400f652a18b21b20b2fe35c562de840d32c2807f8bbe4a30b293260a7ba4b5b3c2a944638bc9049244eb6a36f7fff4d7243a1ee
@@ -1 +0,0 @@
1
- {"root":["./src/index.ts"],"version":"5.8.3"}