react-native-debug-toolkit 3.2.7 → 3.2.8

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.
@@ -1,4 +1,5 @@
1
1
  #import <Foundation/Foundation.h>
2
+ #import <React/RCTBridge.h>
2
3
  #import <React/RCTBundleManager.h>
3
4
  #import <React/RCTBridgeModule.h>
4
5
  #import <React/RCTBundleURLProvider.h>
@@ -17,6 +18,7 @@ static NSString *const DebugToolkitBundleRoot = @"index";
17
18
 
18
19
  RCT_EXPORT_MODULE(DebugToolkitDevConnect)
19
20
 
21
+ @synthesize bridge = _bridge;
20
22
  @synthesize bundleManager = _bundleManager;
21
23
 
22
24
  + (BOOL)requiresMainQueueSetup
@@ -29,84 +31,136 @@ RCT_EXPORT_MODULE(DebugToolkitDevConnect)
29
31
  return dispatch_get_main_queue();
30
32
  }
31
33
 
34
+ #pragma mark - Bundle Manager Resolution
35
+
36
+ - (RCTBundleManager *)resolveBundleManager
37
+ {
38
+ if (_bundleManager) {
39
+ return _bundleManager;
40
+ }
41
+ if (_bridge) {
42
+ return [_bridge moduleForClass:[RCTBundleManager class]];
43
+ }
44
+ return nil;
45
+ }
46
+
47
+ #pragma mark - Apply Bundle URL (multi-strategy)
48
+
49
+ - (BOOL)applyBundleURL:(NSURL *)bundleURL
50
+ {
51
+ RCTBundleManager *bm = [self resolveBundleManager];
52
+ if (bm) {
53
+ if (bundleURL) {
54
+ bm.bundleURL = bundleURL;
55
+ } else {
56
+ [bm resetBundleURL];
57
+ }
58
+ return YES;
59
+ }
60
+
61
+ if (bundleURL) {
62
+ RCTReloadCommandSetBundleURL(bundleURL);
63
+ return YES;
64
+ }
65
+
66
+ return NO;
67
+ }
68
+
69
+ #pragma mark - Exported Methods
70
+
32
71
  RCT_EXPORT_METHOD(getMetroHost:(RCTPromiseResolveBlock)resolve
33
72
  rejecter:(__unused RCTPromiseRejectBlock)reject)
34
73
  {
35
- NSString *host = [RCTBundleURLProvider sharedSettings].jsLocation;
36
- resolve(host ?: [NSNull null]);
74
+ @try {
75
+ NSString *host = [RCTBundleURLProvider sharedSettings].jsLocation;
76
+ resolve(host ?: [NSNull null]);
77
+ } @catch (NSException *exception) {
78
+ reject(@"native_error", exception.reason, nil);
79
+ }
37
80
  }
38
81
 
39
82
  RCT_EXPORT_METHOD(applyMetroHost:(NSString *)hostPort
40
83
  resolver:(RCTPromiseResolveBlock)resolve
41
84
  rejecter:(RCTPromiseRejectBlock)reject)
42
85
  {
43
- if (hostPort.length == 0) {
44
- reject(@"invalid_host", @"Metro host cannot be empty.", nil);
45
- return;
46
- }
86
+ @try {
87
+ if (hostPort.length == 0) {
88
+ reject(@"invalid_host", @"Metro host cannot be empty.", nil);
89
+ return;
90
+ }
47
91
 
48
- RCTBundleURLProvider *settings = [RCTBundleURLProvider sharedSettings];
49
- NSRange separator = [hostPort rangeOfString:@":" options:NSBackwardsSearch];
50
- NSString *host = separator.location == NSNotFound ? hostPort : [hostPort substringToIndex:separator.location];
51
- NSString *port = separator.location == NSNotFound ? @"" : [hostPort substringFromIndex:separator.location + 1];
92
+ RCTBundleURLProvider *settings = [RCTBundleURLProvider sharedSettings];
52
93
 
53
- if (host.length == 0 && port.length == 0) {
54
- [self resetMetroHost:resolve rejecter:reject];
55
- return;
56
- }
94
+ NSRange separator = [hostPort rangeOfString:@":" options:NSBackwardsSearch];
95
+ NSString *host = separator.location == NSNotFound
96
+ ? hostPort
97
+ : [hostPort substringToIndex:separator.location];
98
+ NSString *port = separator.location == NSNotFound
99
+ ? @""
100
+ : [hostPort substringFromIndex:separator.location + 1];
57
101
 
58
- NSNumberFormatter *formatter = [NSNumberFormatter new];
59
- formatter.numberStyle = NSNumberFormatterDecimalStyle;
60
- NSNumber *portNumber = [formatter numberFromString:port];
61
- if (portNumber == nil) {
62
- portNumber = [NSNumber numberWithInt:RCT_METRO_PORT];
63
- }
102
+ if (host.length == 0 && port.length == 0) {
103
+ [self resetMetroHost:resolve rejecter:reject];
104
+ return;
105
+ }
64
106
 
65
- NSString *normalizedHostPort = [NSString stringWithFormat:@"%@:%d", host, portNumber.intValue];
66
- settings.jsLocation = normalizedHostPort;
107
+ NSNumberFormatter *formatter = [NSNumberFormatter new];
108
+ formatter.numberStyle = NSNumberFormatterDecimalStyle;
109
+ NSNumber *portNumber = [formatter numberFromString:port];
110
+ if (portNumber == nil) {
111
+ portNumber = [NSNumber numberWithInt:RCT_METRO_PORT];
112
+ }
67
113
 
68
- if (DebugToolkitBundleRoot.length == 0) {
69
- if (_bundleManager) {
70
- [_bundleManager resetBundleURL];
114
+ NSString *normalizedHostPort = [NSString stringWithFormat:@"%@:%d", host, portNumber.intValue];
115
+
116
+ settings.jsLocation = normalizedHostPort;
117
+
118
+ NSURL *bundleURL = nil;
119
+ if (DebugToolkitBundleRoot.length > 0) {
120
+ bundleURL = [settings jsBundleURLForBundleRoot:DebugToolkitBundleRoot];
71
121
  }
72
- } else {
73
- NSURL *bundleURL = [settings jsBundleURLForBundleRoot:DebugToolkitBundleRoot];
74
- if (_bundleManager) {
75
- _bundleManager.bundleURL = bundleURL;
76
- } else {
77
- RCTReloadCommandSetBundleURL(bundleURL);
122
+
123
+ [self applyBundleURL:bundleURL];
124
+
125
+ NSMutableDictionary *result = [@{@"hostPort" : normalizedHostPort} mutableCopy];
126
+ RCTBundleManager *bm = [self resolveBundleManager];
127
+ if (bm && bm.bundleURL.absoluteString) {
128
+ result[@"bundleURL"] = bm.bundleURL.absoluteString;
78
129
  }
79
- }
80
130
 
81
- NSMutableDictionary *result = [@{@"hostPort" : normalizedHostPort} mutableCopy];
82
- if (_bundleManager && _bundleManager.bundleURL.absoluteString) {
83
- result[@"bundleURL"] = _bundleManager.bundleURL.absoluteString;
131
+ RCTTriggerReloadCommandListeners(@"Dev menu - apply changes");
132
+ resolve(result);
133
+ } @catch (NSException *exception) {
134
+ reject(@"native_error", exception.reason, nil);
84
135
  }
85
-
86
- RCTTriggerReloadCommandListeners(@"DevConnect - apply changes");
87
- resolve(result);
88
136
  }
89
137
 
90
138
  RCT_EXPORT_METHOD(resetMetroHost:(RCTPromiseResolveBlock)resolve
91
139
  rejecter:(__unused RCTPromiseRejectBlock)reject)
92
140
  {
93
- [[RCTBundleURLProvider sharedSettings] resetToDefaults];
94
- NSURL *bundleURL = [[RCTBundleURLProvider sharedSettings] jsBundleURLForFallbackExtension:nil];
95
- if (_bundleManager) {
96
- _bundleManager.bundleURL = bundleURL;
97
- } else {
98
- RCTReloadCommandSetBundleURL(bundleURL);
141
+ @try {
142
+ RCTBundleURLProvider *settings = [RCTBundleURLProvider sharedSettings];
143
+ [settings resetToDefaults];
144
+ NSURL *bundleURL = [settings jsBundleURLForFallbackExtension:nil];
145
+
146
+ [self applyBundleURL:bundleURL];
147
+ RCTTriggerReloadCommandListeners(@"Dev menu - reset to default");
148
+ resolve([NSNull null]);
149
+ } @catch (NSException *exception) {
150
+ reject(@"native_error", exception.reason, nil);
99
151
  }
100
- RCTTriggerReloadCommandListeners(@"DevConnect - reset to default");
101
- resolve([NSNull null]);
102
152
  }
103
153
 
104
154
  RCT_EXPORT_METHOD(getPreference:(NSString *)key
105
155
  resolver:(RCTPromiseResolveBlock)resolve
106
156
  rejecter:(__unused RCTPromiseRejectBlock)reject)
107
157
  {
108
- NSString *value = [[NSUserDefaults standardUserDefaults] stringForKey:key];
109
- resolve(value ?: [NSNull null]);
158
+ @try {
159
+ NSString *value = [[NSUserDefaults standardUserDefaults] stringForKey:key];
160
+ resolve(value ?: [NSNull null]);
161
+ } @catch (NSException *exception) {
162
+ reject(@"native_error", exception.reason, nil);
163
+ }
110
164
  }
111
165
 
112
166
  RCT_EXPORT_METHOD(setPreference:(NSString *)key
@@ -114,9 +168,13 @@ RCT_EXPORT_METHOD(setPreference:(NSString *)key
114
168
  resolver:(RCTPromiseResolveBlock)resolve
115
169
  rejecter:(__unused RCTPromiseRejectBlock)reject)
116
170
  {
117
- [[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
118
- [[NSUserDefaults standardUserDefaults] synchronize];
119
- resolve([NSNull null]);
171
+ @try {
172
+ [[NSUserDefaults standardUserDefaults] setObject:value forKey:key];
173
+ [[NSUserDefaults standardUserDefaults] synchronize];
174
+ resolve([NSNull null]);
175
+ } @catch (NSException *exception) {
176
+ reject(@"native_error", exception.reason, nil);
177
+ }
120
178
  }
121
179
 
122
180
  RCT_EXPORT_METHOD(isDebugBuild:(RCTPromiseResolveBlock)resolve
@@ -132,12 +190,27 @@ RCT_EXPORT_METHOD(isDebugBuild:(RCTPromiseResolveBlock)resolve
132
190
  RCT_EXPORT_METHOD(getLocalIp:(RCTPromiseResolveBlock)resolve
133
191
  rejecter:(__unused RCTPromiseRejectBlock)reject)
134
192
  {
135
- struct ifaddrs *interfaces = NULL;
136
- if (getifaddrs(&interfaces) == 0) {
137
- struct ifaddrs *iface = interfaces;
138
- while (iface != NULL) {
139
- if (iface->ifa_addr->sa_family == AF_INET && !(iface->ifa_flags & IFF_LOOPBACK)) {
140
- if (strcmp(iface->ifa_name, "en0") == 0) {
193
+ @try {
194
+ struct ifaddrs *interfaces = NULL;
195
+ if (getifaddrs(&interfaces) == 0) {
196
+ struct ifaddrs *iface = interfaces;
197
+ while (iface != NULL) {
198
+ if (iface->ifa_addr != NULL && iface->ifa_addr->sa_family == AF_INET && !(iface->ifa_flags & IFF_LOOPBACK)) {
199
+ if (strcmp(iface->ifa_name, "en0") == 0) {
200
+ char addrStr[INET_ADDRSTRLEN];
201
+ struct sockaddr_in *sin = (struct sockaddr_in *)iface->ifa_addr;
202
+ inet_ntop(AF_INET, &sin->sin_addr, addrStr, sizeof(addrStr));
203
+ NSString *ip = [NSString stringWithUTF8String:addrStr];
204
+ freeifaddrs(interfaces);
205
+ resolve(ip);
206
+ return;
207
+ }
208
+ }
209
+ iface = iface->ifa_next;
210
+ }
211
+ iface = interfaces;
212
+ while (iface != NULL) {
213
+ if (iface->ifa_addr != NULL && iface->ifa_addr->sa_family == AF_INET && !(iface->ifa_flags & IFF_LOOPBACK)) {
141
214
  char addrStr[INET_ADDRSTRLEN];
142
215
  struct sockaddr_in *sin = (struct sockaddr_in *)iface->ifa_addr;
143
216
  inet_ntop(AF_INET, &sin->sin_addr, addrStr, sizeof(addrStr));
@@ -146,25 +219,14 @@ RCT_EXPORT_METHOD(getLocalIp:(RCTPromiseResolveBlock)resolve
146
219
  resolve(ip);
147
220
  return;
148
221
  }
222
+ iface = iface->ifa_next;
149
223
  }
150
- iface = iface->ifa_next;
151
- }
152
- iface = interfaces;
153
- while (iface != NULL) {
154
- if (iface->ifa_addr->sa_family == AF_INET && !(iface->ifa_flags & IFF_LOOPBACK)) {
155
- char addrStr[INET_ADDRSTRLEN];
156
- struct sockaddr_in *sin = (struct sockaddr_in *)iface->ifa_addr;
157
- inet_ntop(AF_INET, &sin->sin_addr, addrStr, sizeof(addrStr));
158
- NSString *ip = [NSString stringWithUTF8String:addrStr];
159
- freeifaddrs(interfaces);
160
- resolve(ip);
161
- return;
162
- }
163
- iface = iface->ifa_next;
164
224
  }
225
+ freeifaddrs(interfaces);
226
+ resolve([NSNull null]);
227
+ } @catch (NSException *exception) {
228
+ reject(@"native_error", exception.reason, nil);
165
229
  }
166
- freeifaddrs(interfaces);
167
- resolve([NSNull null]);
168
230
  }
169
231
 
170
232
  @end
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-debug-toolkit",
3
- "version": "3.2.7",
3
+ "version": "3.2.8",
4
4
  "description": "A local-first React Native debug toolkit with Web Console, HTTP API, and MCP support for AI-readable app logs",
5
5
  "main": "lib/commonjs/index.js",
6
6
  "module": "lib/module/index.js",