@expo/metro-runtime 3.0.0 → 3.0.2

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 (219) hide show
  1. package/build/HMRClient.js +43 -15
  2. package/build/HMRClient.js.map +1 -1
  3. package/build/HMRClient.native.js +3 -1
  4. package/build/HMRClient.native.js.map +1 -1
  5. package/build/LoadingView.d.ts +6 -0
  6. package/build/LoadingView.d.ts.map +1 -1
  7. package/build/LoadingView.js +12 -4
  8. package/build/LoadingView.js.map +1 -1
  9. package/build/LoadingView.native.js +7 -2
  10. package/build/LoadingView.native.js.map +1 -1
  11. package/build/async-require/buildAsyncRequire.js +7 -3
  12. package/build/async-require/buildAsyncRequire.js.map +1 -1
  13. package/build/async-require/buildUrlForBundle.js +5 -1
  14. package/build/async-require/buildUrlForBundle.js.map +1 -1
  15. package/build/async-require/buildUrlForBundle.native.js +5 -1
  16. package/build/async-require/buildUrlForBundle.native.js.map +1 -1
  17. package/build/async-require/fetchAsync.d.ts +6 -0
  18. package/build/async-require/fetchAsync.d.ts.map +1 -1
  19. package/build/async-require/fetchAsync.js +6 -3
  20. package/build/async-require/fetchAsync.js.map +1 -1
  21. package/build/async-require/fetchAsync.native.js +13 -6
  22. package/build/async-require/fetchAsync.native.js.map +1 -1
  23. package/build/async-require/fetchThenEval.d.ts +1 -6
  24. package/build/async-require/fetchThenEval.d.ts.map +1 -1
  25. package/build/async-require/fetchThenEval.js +5 -31
  26. package/build/async-require/fetchThenEval.js.map +1 -1
  27. package/build/async-require/fetchThenEval.web.js +6 -2
  28. package/build/async-require/fetchThenEval.web.js.map +1 -1
  29. package/build/async-require/fetchThenEvalJs.d.ts +7 -0
  30. package/build/async-require/fetchThenEvalJs.d.ts.map +1 -0
  31. package/build/async-require/fetchThenEvalJs.js +36 -0
  32. package/build/async-require/fetchThenEvalJs.js.map +1 -0
  33. package/build/async-require/index.js +4 -2
  34. package/build/async-require/index.js.map +1 -1
  35. package/build/async-require/index.native.d.ts +7 -0
  36. package/build/async-require/index.native.d.ts.map +1 -0
  37. package/build/async-require/index.native.js +14 -0
  38. package/build/async-require/index.native.js.map +1 -0
  39. package/build/async-require/loadBundle.js +10 -6
  40. package/build/async-require/loadBundle.js.map +1 -1
  41. package/build/effects.d.ts +0 -1
  42. package/build/effects.js +7 -10
  43. package/build/effects.js.map +1 -1
  44. package/build/error-overlay/Data/LogBoxData.d.ts.map +1 -1
  45. package/build/error-overlay/Data/LogBoxData.js +82 -33
  46. package/build/error-overlay/Data/LogBoxData.js.map +1 -1
  47. package/build/error-overlay/Data/LogBoxLog.js +29 -2
  48. package/build/error-overlay/Data/LogBoxLog.js.map +1 -1
  49. package/build/error-overlay/Data/LogBoxSymbolication.js +12 -4
  50. package/build/error-overlay/Data/LogBoxSymbolication.js.map +1 -1
  51. package/build/error-overlay/Data/LogContext.js +17 -9
  52. package/build/error-overlay/Data/LogContext.js.map +1 -1
  53. package/build/error-overlay/Data/parseLogBoxLog.d.ts.map +1 -1
  54. package/build/error-overlay/Data/parseLogBoxLog.js +20 -11
  55. package/build/error-overlay/Data/parseLogBoxLog.js.map +1 -1
  56. package/build/error-overlay/ErrorOverlay.d.ts.map +1 -1
  57. package/build/error-overlay/ErrorOverlay.js +73 -41
  58. package/build/error-overlay/ErrorOverlay.js.map +1 -1
  59. package/build/error-overlay/LogBox.js +3 -1
  60. package/build/error-overlay/LogBox.js.map +1 -1
  61. package/build/error-overlay/LogBox.web.d.ts.map +1 -1
  62. package/build/error-overlay/LogBox.web.js +4 -3
  63. package/build/error-overlay/LogBox.web.js.map +1 -1
  64. package/build/error-overlay/UI/AnsiHighlight.js +15 -8
  65. package/build/error-overlay/UI/AnsiHighlight.js.map +1 -1
  66. package/build/error-overlay/UI/LogBoxButton.js +35 -8
  67. package/build/error-overlay/UI/LogBoxButton.js.map +1 -1
  68. package/build/error-overlay/UI/LogBoxMessage.js +13 -6
  69. package/build/error-overlay/UI/LogBoxMessage.js.map +1 -1
  70. package/build/error-overlay/UI/LogBoxStyle.js +31 -14
  71. package/build/error-overlay/UI/LogBoxStyle.js.map +1 -1
  72. package/build/error-overlay/UI/constants.js +5 -2
  73. package/build/error-overlay/UI/constants.js.map +1 -1
  74. package/build/error-overlay/formatProjectFilePath.js +7 -2
  75. package/build/error-overlay/formatProjectFilePath.js.map +1 -1
  76. package/build/error-overlay/index.d.ts.map +1 -1
  77. package/build/error-overlay/index.js +19 -9
  78. package/build/error-overlay/index.js.map +1 -1
  79. package/build/error-overlay/modules/ExceptionsManager/index.js +8 -3
  80. package/build/error-overlay/modules/ExceptionsManager/index.js.map +1 -1
  81. package/build/error-overlay/modules/ExceptionsManager/index.native.js +7 -2
  82. package/build/error-overlay/modules/ExceptionsManager/index.native.js.map +1 -1
  83. package/build/error-overlay/modules/NativeLogBox/index.js +10 -5
  84. package/build/error-overlay/modules/NativeLogBox/index.js.map +1 -1
  85. package/build/error-overlay/modules/NativeLogBox/index.native.js +7 -2
  86. package/build/error-overlay/modules/NativeLogBox/index.native.js.map +1 -1
  87. package/build/error-overlay/modules/openFileInEditor/index.js +3 -1
  88. package/build/error-overlay/modules/openFileInEditor/index.js.map +1 -1
  89. package/build/error-overlay/modules/openFileInEditor/index.native.js +7 -2
  90. package/build/error-overlay/modules/openFileInEditor/index.native.js.map +1 -1
  91. package/build/error-overlay/modules/parseErrorStack/index.d.ts.map +1 -1
  92. package/build/error-overlay/modules/parseErrorStack/index.js +10 -7
  93. package/build/error-overlay/modules/parseErrorStack/index.js.map +1 -1
  94. package/build/error-overlay/modules/parseErrorStack/parseHermesStack.js +8 -2
  95. package/build/error-overlay/modules/parseErrorStack/parseHermesStack.js.map +1 -1
  96. package/build/error-overlay/modules/stringifySafe/index.js +6 -2
  97. package/build/error-overlay/modules/stringifySafe/index.js.map +1 -1
  98. package/build/error-overlay/modules/symbolicateStackTrace/index.js +3 -1
  99. package/build/error-overlay/modules/symbolicateStackTrace/index.js.map +1 -1
  100. package/build/error-overlay/modules/symbolicateStackTrace/index.native.js +7 -2
  101. package/build/error-overlay/modules/symbolicateStackTrace/index.native.js.map +1 -1
  102. package/build/error-overlay/overlay/LogBoxInspectorCodeFrame.d.ts.map +1 -1
  103. package/build/error-overlay/overlay/LogBoxInspectorCodeFrame.js +52 -22
  104. package/build/error-overlay/overlay/LogBoxInspectorCodeFrame.js.map +1 -1
  105. package/build/error-overlay/overlay/LogBoxInspectorFooter.js +48 -18
  106. package/build/error-overlay/overlay/LogBoxInspectorFooter.js.map +1 -1
  107. package/build/error-overlay/overlay/LogBoxInspectorHeader.js +53 -23
  108. package/build/error-overlay/overlay/LogBoxInspectorHeader.js.map +1 -1
  109. package/build/error-overlay/overlay/LogBoxInspectorMessageHeader.js +43 -13
  110. package/build/error-overlay/overlay/LogBoxInspectorMessageHeader.js.map +1 -1
  111. package/build/error-overlay/overlay/LogBoxInspectorSection.js +39 -9
  112. package/build/error-overlay/overlay/LogBoxInspectorSection.js.map +1 -1
  113. package/build/error-overlay/overlay/LogBoxInspectorSourceMapStatus.js +41 -14
  114. package/build/error-overlay/overlay/LogBoxInspectorSourceMapStatus.js.map +1 -1
  115. package/build/error-overlay/overlay/LogBoxInspectorStackFrame.js +44 -14
  116. package/build/error-overlay/overlay/LogBoxInspectorStackFrame.js.map +1 -1
  117. package/build/error-overlay/overlay/LogBoxInspectorStackFrames.d.ts.map +1 -1
  118. package/build/error-overlay/overlay/LogBoxInspectorStackFrames.js +55 -24
  119. package/build/error-overlay/overlay/LogBoxInspectorStackFrames.js.map +1 -1
  120. package/build/error-overlay/toast/ErrorToast.d.ts.map +1 -1
  121. package/build/error-overlay/toast/ErrorToast.js +48 -21
  122. package/build/error-overlay/toast/ErrorToast.js.map +1 -1
  123. package/build/error-overlay/toast/ErrorToastContainer.js +9 -3
  124. package/build/error-overlay/toast/ErrorToastContainer.js.map +1 -1
  125. package/build/error-overlay/toast/ErrorToastContainer.web.d.ts.map +1 -1
  126. package/build/error-overlay/toast/ErrorToastContainer.web.js +49 -21
  127. package/build/error-overlay/toast/ErrorToastContainer.web.js.map +1 -1
  128. package/build/error-overlay/toast/ErrorToastMessage.js +37 -7
  129. package/build/error-overlay/toast/ErrorToastMessage.js.map +1 -1
  130. package/build/error-overlay/useRejectionHandler.js +16 -9
  131. package/build/error-overlay/useRejectionHandler.js.map +1 -1
  132. package/build/getDevServer.d.ts.map +1 -1
  133. package/build/getDevServer.js +10 -9
  134. package/build/getDevServer.js.map +1 -1
  135. package/build/getDevServer.native.js +7 -2
  136. package/build/getDevServer.native.js.map +1 -1
  137. package/build/index.d.ts +7 -0
  138. package/build/index.d.ts.map +1 -1
  139. package/build/index.js +12 -8
  140. package/build/index.js.map +1 -1
  141. package/build/location/Location.js +7 -2
  142. package/build/location/Location.js.map +1 -1
  143. package/build/location/Location.native.js +12 -4
  144. package/build/location/Location.native.js.map +1 -1
  145. package/build/location/install.native.js +16 -11
  146. package/build/location/install.native.js.map +1 -1
  147. package/build/setupHMR.js +28 -26
  148. package/build/setupHMR.js.map +1 -1
  149. package/build/symbolicate.js +25 -4
  150. package/build/symbolicate.js.map +1 -1
  151. package/package.json +5 -2
  152. package/src/HMRClient.native.ts +3 -0
  153. package/src/HMRClient.ts +316 -0
  154. package/src/LoadingView.native.ts +3 -0
  155. package/src/LoadingView.ts +24 -0
  156. package/src/__mocks__/LoadingView.ts +4 -0
  157. package/src/async-require/buildAsyncRequire.ts +34 -0
  158. package/src/async-require/buildUrlForBundle.native.ts +28 -0
  159. package/src/async-require/buildUrlForBundle.ts +18 -0
  160. package/src/async-require/fetchAsync.native.ts +72 -0
  161. package/src/async-require/fetchAsync.ts +19 -0
  162. package/src/async-require/fetchThenEval.ts +1 -0
  163. package/src/async-require/fetchThenEval.web.ts +70 -0
  164. package/src/async-require/fetchThenEvalJs.ts +39 -0
  165. package/src/async-require/index.native.ts +15 -0
  166. package/src/async-require/index.ts +10 -0
  167. package/src/async-require/loadBundle.ts +46 -0
  168. package/src/effects.native.ts +0 -0
  169. package/src/effects.ts +11 -0
  170. package/src/error-overlay/Data/LogBoxData.tsx +438 -0
  171. package/src/error-overlay/Data/LogBoxLog.ts +221 -0
  172. package/src/error-overlay/Data/LogBoxSymbolication.tsx +64 -0
  173. package/src/error-overlay/Data/LogContext.tsx +41 -0
  174. package/src/error-overlay/Data/parseLogBoxLog.tsx +342 -0
  175. package/src/error-overlay/ErrorOverlay.tsx +191 -0
  176. package/src/error-overlay/LogBox.ts +51 -0
  177. package/src/error-overlay/LogBox.web.ts +174 -0
  178. package/src/error-overlay/UI/AnsiHighlight.tsx +96 -0
  179. package/src/error-overlay/UI/LogBoxButton.tsx +63 -0
  180. package/src/error-overlay/UI/LogBoxMessage.tsx +73 -0
  181. package/src/error-overlay/UI/LogBoxStyle.ts +64 -0
  182. package/src/error-overlay/UI/constants.ts +7 -0
  183. package/src/error-overlay/formatProjectFilePath.ts +38 -0
  184. package/src/error-overlay/index.tsx +34 -0
  185. package/src/error-overlay/modules/ExceptionsManager/index.native.ts +4 -0
  186. package/src/error-overlay/modules/ExceptionsManager/index.ts +82 -0
  187. package/src/error-overlay/modules/NativeLogBox/index.native.ts +3 -0
  188. package/src/error-overlay/modules/NativeLogBox/index.tsx +27 -0
  189. package/src/error-overlay/modules/openFileInEditor/index.native.ts +3 -0
  190. package/src/error-overlay/modules/openFileInEditor/index.ts +16 -0
  191. package/src/error-overlay/modules/parseErrorStack/index.ts +26 -0
  192. package/src/error-overlay/modules/parseErrorStack/parseHermesStack.ts +3 -0
  193. package/src/error-overlay/modules/stringifySafe/index.ts +115 -0
  194. package/src/error-overlay/modules/symbolicateStackTrace/index.native.ts +3 -0
  195. package/src/error-overlay/modules/symbolicateStackTrace/index.ts +39 -0
  196. package/src/error-overlay/overlay/LogBoxInspectorCodeFrame.tsx +102 -0
  197. package/src/error-overlay/overlay/LogBoxInspectorFooter.tsx +111 -0
  198. package/src/error-overlay/overlay/LogBoxInspectorHeader.tsx +167 -0
  199. package/src/error-overlay/overlay/LogBoxInspectorMessageHeader.tsx +116 -0
  200. package/src/error-overlay/overlay/LogBoxInspectorSection.tsx +52 -0
  201. package/src/error-overlay/overlay/LogBoxInspectorSourceMapStatus.tsx +125 -0
  202. package/src/error-overlay/overlay/LogBoxInspectorStackFrame.tsx +89 -0
  203. package/src/error-overlay/overlay/LogBoxInspectorStackFrames.tsx +201 -0
  204. package/src/error-overlay/toast/ErrorToast.tsx +167 -0
  205. package/src/error-overlay/toast/ErrorToastContainer.tsx +9 -0
  206. package/src/error-overlay/toast/ErrorToastContainer.web.tsx +92 -0
  207. package/src/error-overlay/toast/ErrorToastMessage.tsx +28 -0
  208. package/src/error-overlay/useRejectionHandler.ts +61 -0
  209. package/src/getDevServer.native.ts +3 -0
  210. package/src/getDevServer.ts +34 -0
  211. package/src/index.ts +12 -0
  212. package/src/location/Location.native.ts +201 -0
  213. package/src/location/Location.ts +3 -0
  214. package/src/location/install.native.ts +90 -0
  215. package/src/location/install.ts +0 -0
  216. package/src/messageSocket.ts +25 -0
  217. package/src/setupFastRefresh.ts +30 -0
  218. package/src/setupHMR.ts +28 -0
  219. package/src/symbolicate.ts +6 -0
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Copyright (c) 650 Industries.
3
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ import React from 'react';
9
+ import { StyleSheet, Text, View } from 'react-native';
10
+
11
+ import * as LogBoxStyle from '../UI/LogBoxStyle';
12
+
13
+ type Props = {
14
+ heading: string;
15
+ children: React.ReactNode;
16
+ action?: any;
17
+ };
18
+
19
+ export function LogBoxInspectorSection(props: Props) {
20
+ return (
21
+ <View style={styles.section}>
22
+ <View style={styles.heading}>
23
+ <Text style={styles.headingText}>{props.heading}</Text>
24
+ {props.action}
25
+ </View>
26
+ <View style={styles.body}>{props.children}</View>
27
+ </View>
28
+ );
29
+ }
30
+
31
+ const styles = StyleSheet.create({
32
+ section: {
33
+ marginTop: 15,
34
+ },
35
+ heading: {
36
+ alignItems: 'center',
37
+ flexDirection: 'row',
38
+ paddingHorizontal: 12,
39
+ marginBottom: 10,
40
+ },
41
+ headingText: {
42
+ color: LogBoxStyle.getTextColor(1),
43
+ flex: 1,
44
+ fontSize: 18,
45
+ fontWeight: '600',
46
+ includeFontPadding: false,
47
+ lineHeight: 20,
48
+ },
49
+ body: {
50
+ paddingBottom: 10,
51
+ },
52
+ });
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Copyright (c) 650 Industries.
3
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ import React, { useEffect, useState } from 'react';
9
+ import { Animated, Easing, GestureResponderEvent, StyleSheet, Text } from 'react-native';
10
+
11
+ import { LogBoxButton } from '../UI/LogBoxButton';
12
+ import * as LogBoxStyle from '../UI/LogBoxStyle';
13
+
14
+ type Props = {
15
+ onPress?: ((event: GestureResponderEvent) => void) | null;
16
+ status: 'COMPLETE' | 'FAILED' | 'NONE' | 'PENDING';
17
+ };
18
+
19
+ export function LogBoxInspectorSourceMapStatus(props: Props) {
20
+ const [state, setState] = useState<{
21
+ animation: null | Animated.CompositeAnimation;
22
+ rotate: null | Animated.AnimatedInterpolation<string>;
23
+ }>({
24
+ animation: null,
25
+ rotate: null,
26
+ });
27
+
28
+ useEffect(() => {
29
+ if (props.status === 'PENDING') {
30
+ if (state.animation == null) {
31
+ const animated = new Animated.Value(0);
32
+ const animation = Animated.loop(
33
+ Animated.timing(animated, {
34
+ duration: 2000,
35
+ easing: Easing.linear,
36
+ toValue: 1,
37
+ useNativeDriver: true,
38
+ })
39
+ );
40
+ setState({
41
+ animation,
42
+ rotate: animated.interpolate({
43
+ inputRange: [0, 1],
44
+ outputRange: ['0deg', '360deg'],
45
+ }),
46
+ });
47
+ animation.start();
48
+ }
49
+ } else {
50
+ if (state.animation != null) {
51
+ state.animation.stop();
52
+ setState({
53
+ animation: null,
54
+ rotate: null,
55
+ });
56
+ }
57
+ }
58
+
59
+ return () => {
60
+ if (state.animation != null) {
61
+ state.animation.stop();
62
+ }
63
+ };
64
+ }, [props.status, state.animation]);
65
+
66
+ let image;
67
+ let color;
68
+ switch (props.status) {
69
+ case 'FAILED':
70
+ image = require('@expo/metro-runtime/assets/alert-triangle.png');
71
+ color = LogBoxStyle.getErrorColor(1);
72
+ break;
73
+ case 'PENDING':
74
+ image = require('@expo/metro-runtime/assets/loader.png');
75
+ color = LogBoxStyle.getWarningColor(1);
76
+ break;
77
+ }
78
+
79
+ if (props.status === 'COMPLETE' || image == null) {
80
+ return null;
81
+ }
82
+
83
+ return (
84
+ <LogBoxButton
85
+ backgroundColor={{
86
+ default: 'transparent',
87
+ pressed: LogBoxStyle.getBackgroundColor(1),
88
+ }}
89
+ hitSlop={{ bottom: 8, left: 8, right: 8, top: 8 }}
90
+ onPress={props.onPress}
91
+ style={styles.root}>
92
+ <Animated.Image
93
+ source={image}
94
+ tintColor={color ?? LogBoxStyle.getTextColor(0.4)}
95
+ style={[
96
+ styles.image,
97
+ state.rotate == null || props.status !== 'PENDING'
98
+ ? null
99
+ : { transform: [{ rotate: state.rotate }] },
100
+ ]}
101
+ />
102
+ <Text style={[styles.text, { color }]}>Source Map</Text>
103
+ </LogBoxButton>
104
+ );
105
+ }
106
+
107
+ const styles = StyleSheet.create({
108
+ root: {
109
+ alignItems: 'center',
110
+ borderRadius: 12,
111
+ flexDirection: 'row',
112
+ height: 24,
113
+ paddingHorizontal: 8,
114
+ },
115
+ image: {
116
+ height: 14,
117
+ width: 16,
118
+ marginEnd: 4,
119
+ },
120
+ text: {
121
+ fontSize: 12,
122
+ includeFontPadding: false,
123
+ lineHeight: 16,
124
+ },
125
+ });
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Copyright (c) 650 Industries.
3
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ import React from 'react';
9
+ import { GestureResponderEvent, StyleSheet, Text, View } from 'react-native';
10
+ import { StackFrame } from 'stacktrace-parser';
11
+
12
+ import { LogBoxButton } from '../UI/LogBoxButton';
13
+ import * as LogBoxStyle from '../UI/LogBoxStyle';
14
+ import { CODE_FONT } from '../UI/constants';
15
+ import { getStackFormattedLocation } from '../formatProjectFilePath';
16
+
17
+ declare const process: any;
18
+
19
+ type Props = {
20
+ frame: StackFrame & { collapse?: boolean };
21
+ onPress?: (event: GestureResponderEvent) => void;
22
+ };
23
+
24
+ export function LogBoxInspectorStackFrame(props: Props) {
25
+ const { frame, onPress } = props;
26
+ const location = getStackFormattedLocation(process.env.EXPO_PROJECT_ROOT, frame);
27
+ return (
28
+ <View style={styles.frameContainer}>
29
+ <LogBoxButton
30
+ backgroundColor={{
31
+ default: 'transparent',
32
+ pressed: onPress ? LogBoxStyle.getBackgroundColor(1) : 'transparent',
33
+ }}
34
+ onPress={onPress}
35
+ style={styles.frame}>
36
+ <Text style={[styles.name, frame.collapse === true && styles.dim]}>{frame.methodName}</Text>
37
+ <Text
38
+ ellipsizeMode="middle"
39
+ numberOfLines={1}
40
+ style={[styles.location, frame.collapse === true && styles.dim]}>
41
+ {location}
42
+ </Text>
43
+ </LogBoxButton>
44
+ </View>
45
+ );
46
+ }
47
+
48
+ const styles = StyleSheet.create({
49
+ frameContainer: {
50
+ flexDirection: 'row',
51
+ paddingHorizontal: 15,
52
+ },
53
+ frame: {
54
+ flex: 1,
55
+ paddingVertical: 4,
56
+ paddingHorizontal: 10,
57
+ borderRadius: 5,
58
+ },
59
+ lineLocation: {
60
+ flexDirection: 'row',
61
+ },
62
+ name: {
63
+ color: LogBoxStyle.getTextColor(1),
64
+ fontSize: 14,
65
+ includeFontPadding: false,
66
+ lineHeight: 18,
67
+ fontWeight: '400',
68
+ fontFamily: CODE_FONT,
69
+ },
70
+ location: {
71
+ color: LogBoxStyle.getTextColor(0.8),
72
+ fontSize: 12,
73
+ fontWeight: '300',
74
+ includeFontPadding: false,
75
+ lineHeight: 16,
76
+ paddingLeft: 10,
77
+ },
78
+ dim: {
79
+ color: LogBoxStyle.getTextColor(0.4),
80
+ fontWeight: '300',
81
+ },
82
+ line: {
83
+ color: LogBoxStyle.getTextColor(0.8),
84
+ fontSize: 12,
85
+ fontWeight: '300',
86
+ includeFontPadding: false,
87
+ lineHeight: 16,
88
+ },
89
+ });
@@ -0,0 +1,201 @@
1
+ /**
2
+ * Copyright (c) 650 Industries.
3
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ import React, { useState } from 'react';
9
+ import { StyleSheet, Text, View } from 'react-native';
10
+
11
+ import { LogBoxInspectorSection } from './LogBoxInspectorSection';
12
+ import { LogBoxInspectorSourceMapStatus } from './LogBoxInspectorSourceMapStatus';
13
+ import { LogBoxInspectorStackFrame } from './LogBoxInspectorStackFrame';
14
+ import type { StackType } from '../Data/LogBoxLog';
15
+ import type { Stack } from '../Data/LogBoxSymbolication';
16
+ import { useSelectedLog } from '../Data/LogContext';
17
+ import { LogBoxButton } from '../UI/LogBoxButton';
18
+ import * as LogBoxStyle from '../UI/LogBoxStyle';
19
+ import openFileInEditor from '../modules/openFileInEditor';
20
+
21
+ type Props = {
22
+ type: StackType;
23
+ onRetry: () => void;
24
+ };
25
+
26
+ export function getCollapseMessage(stackFrames: Stack, collapsed: boolean): string {
27
+ if (stackFrames.length === 0) {
28
+ return 'No frames to show';
29
+ }
30
+
31
+ const collapsedCount = stackFrames.reduce((count, { collapse }) => {
32
+ if (collapse === true) {
33
+ return count + 1;
34
+ }
35
+
36
+ return count;
37
+ }, 0);
38
+
39
+ if (collapsedCount === 0) {
40
+ return 'Showing all frames';
41
+ }
42
+
43
+ const framePlural = `frame${collapsedCount > 1 ? 's' : ''}`;
44
+ if (collapsedCount === stackFrames.length) {
45
+ return collapsed
46
+ ? `See${collapsedCount > 1 ? ' all ' : ' '}${collapsedCount} collapsed ${framePlural}`
47
+ : `Collapse${collapsedCount > 1 ? ' all ' : ' '}${collapsedCount} ${framePlural}`;
48
+ } else {
49
+ return collapsed
50
+ ? `See ${collapsedCount} more ${framePlural}`
51
+ : `Collapse ${collapsedCount} ${framePlural}`;
52
+ }
53
+ }
54
+
55
+ export function LogBoxInspectorStackFrames({ onRetry, type }: Props) {
56
+ const log = useSelectedLog();
57
+
58
+ const [collapsed, setCollapsed] = useState(() => {
59
+ // Only collapse frames initially if some frames are not collapsed.
60
+ return log.getAvailableStack(type)?.some(({ collapse }) => !collapse);
61
+ });
62
+
63
+ function getStackList() {
64
+ if (collapsed === true) {
65
+ return log.getAvailableStack(type)?.filter(({ collapse }) => !collapse);
66
+ } else {
67
+ return log.getAvailableStack(type);
68
+ }
69
+ }
70
+
71
+ if (log.getAvailableStack(type)?.length === 0) {
72
+ return null;
73
+ }
74
+
75
+ return (
76
+ <LogBoxInspectorSection
77
+ heading={type === 'component' ? 'Component Stack' : 'Call Stack'}
78
+ action={
79
+ <LogBoxInspectorSourceMapStatus
80
+ onPress={log.symbolicated[type].status === 'FAILED' ? onRetry : null}
81
+ status={log.symbolicated[type].status}
82
+ />
83
+ }>
84
+ {log.symbolicated[type].status !== 'COMPLETE' && (
85
+ <View style={stackStyles.hintBox}>
86
+ <Text style={stackStyles.hintText}>
87
+ This call stack is not symbolicated. Some features are unavailable such as viewing the
88
+ function name or tapping to open files.
89
+ </Text>
90
+ </View>
91
+ )}
92
+ <StackFrameList list={getStackList()!} status={log.symbolicated[type].status} />
93
+ <StackFrameFooter
94
+ onPress={() => setCollapsed(!collapsed)}
95
+ message={getCollapseMessage(log.getAvailableStack(type)!, !!collapsed)}
96
+ />
97
+ </LogBoxInspectorSection>
98
+ );
99
+ }
100
+
101
+ function StackFrameList({
102
+ list,
103
+ status,
104
+ }: {
105
+ list: Stack;
106
+ status: 'NONE' | 'PENDING' | 'COMPLETE' | 'FAILED';
107
+ }): any {
108
+ return list.map((frame, index) => {
109
+ const { file, lineNumber } = frame;
110
+ return (
111
+ <LogBoxInspectorStackFrame
112
+ key={index}
113
+ frame={frame}
114
+ onPress={
115
+ status === 'COMPLETE' && file != null && lineNumber != null
116
+ ? () => openFileInEditor(file, lineNumber)
117
+ : undefined
118
+ }
119
+ />
120
+ );
121
+ });
122
+ }
123
+
124
+ function StackFrameFooter({ message, onPress }: { message: string; onPress: () => void }) {
125
+ return (
126
+ <View style={stackStyles.collapseContainer}>
127
+ <LogBoxButton
128
+ backgroundColor={{
129
+ default: 'transparent',
130
+ pressed: LogBoxStyle.getBackgroundColor(1),
131
+ }}
132
+ onPress={onPress}
133
+ style={stackStyles.collapseButton}>
134
+ <Text style={stackStyles.collapse}>{message}</Text>
135
+ </LogBoxButton>
136
+ </View>
137
+ );
138
+ }
139
+
140
+ const stackStyles = StyleSheet.create({
141
+ section: {
142
+ marginTop: 15,
143
+ },
144
+ heading: {
145
+ alignItems: 'center',
146
+ flexDirection: 'row',
147
+ paddingHorizontal: 12,
148
+ marginBottom: 10,
149
+ },
150
+ headingText: {
151
+ color: LogBoxStyle.getTextColor(1),
152
+ flex: 1,
153
+ fontSize: 20,
154
+ fontWeight: '600',
155
+ includeFontPadding: false,
156
+ lineHeight: 20,
157
+ },
158
+ body: {
159
+ paddingBottom: 10,
160
+ },
161
+ bodyText: {
162
+ color: LogBoxStyle.getTextColor(1),
163
+ fontSize: 14,
164
+ includeFontPadding: false,
165
+ lineHeight: 18,
166
+ fontWeight: '500',
167
+ paddingHorizontal: 27,
168
+ },
169
+ hintText: {
170
+ color: LogBoxStyle.getTextColor(0.7),
171
+ fontSize: 13,
172
+ includeFontPadding: false,
173
+ lineHeight: 18,
174
+ fontWeight: '400',
175
+ marginHorizontal: 10,
176
+ },
177
+ hintBox: {
178
+ backgroundColor: LogBoxStyle.getBackgroundColor(),
179
+ marginHorizontal: 10,
180
+ paddingHorizontal: 5,
181
+ paddingVertical: 10,
182
+ borderRadius: 5,
183
+ marginBottom: 5,
184
+ },
185
+ collapseContainer: {
186
+ marginLeft: 15,
187
+ flexDirection: 'row',
188
+ },
189
+ collapseButton: {
190
+ borderRadius: 5,
191
+ },
192
+ collapse: {
193
+ color: LogBoxStyle.getTextColor(0.7),
194
+ fontSize: 12,
195
+ fontWeight: '300',
196
+ lineHeight: 20,
197
+ marginTop: 0,
198
+ paddingHorizontal: 10,
199
+ paddingVertical: 5,
200
+ },
201
+ });
@@ -0,0 +1,167 @@
1
+ /**
2
+ * Copyright (c) 650 Industries.
3
+ * Copyright (c) Meta Platforms, Inc. and affiliates.
4
+ *
5
+ * This source code is licensed under the MIT license found in the
6
+ * LICENSE file in the root directory of this source tree.
7
+ */
8
+ import React, { useEffect } from 'react';
9
+ import { Image, Pressable, StyleSheet, Text, View } from 'react-native';
10
+
11
+ import { ErrorToastMessage } from './ErrorToastMessage';
12
+ import * as LogBoxData from '../Data/LogBoxData';
13
+ import { LogBoxLog } from '../Data/LogBoxLog';
14
+ import * as LogBoxStyle from '../UI/LogBoxStyle';
15
+
16
+ type Props = {
17
+ log: LogBoxLog;
18
+ totalLogCount: number;
19
+ level: 'warn' | 'error';
20
+ onPressOpen: () => void;
21
+ onPressDismiss: () => void;
22
+ };
23
+
24
+ function useSymbolicatedLog(log: LogBoxLog) {
25
+ // Eagerly symbolicate so the stack is available when pressing to inspect.
26
+ useEffect(() => {
27
+ LogBoxData.symbolicateLogLazy('stack', log);
28
+ LogBoxData.symbolicateLogLazy('component', log);
29
+ }, [log]);
30
+ }
31
+
32
+ export function ErrorToast(props: Props) {
33
+ const { totalLogCount, level, log } = props;
34
+
35
+ useSymbolicatedLog(log);
36
+
37
+ return (
38
+ <View style={toastStyles.container}>
39
+ <Pressable style={{ flex: 1 }} onPress={props.onPressOpen}>
40
+ {({
41
+ /** @ts-expect-error: react-native types are broken. */
42
+ hovered,
43
+ pressed,
44
+ }) => (
45
+ <View
46
+ style={[
47
+ toastStyles.press,
48
+ {
49
+ // @ts-expect-error: web-only type
50
+ transitionDuration: '150ms',
51
+ backgroundColor: pressed
52
+ ? '#323232'
53
+ : hovered
54
+ ? '#111111'
55
+ : LogBoxStyle.getBackgroundColor(),
56
+ },
57
+ ]}>
58
+ <Count count={totalLogCount} level={level} />
59
+ <ErrorToastMessage message={log.message} />
60
+ <Dismiss onPress={props.onPressDismiss} />
61
+ </View>
62
+ )}
63
+ </Pressable>
64
+ </View>
65
+ );
66
+ }
67
+
68
+ function Count({ count, level }: { count: number; level: Props['level'] }) {
69
+ return (
70
+ <View style={[countStyles.inside, countStyles[level]]}>
71
+ <Text style={countStyles.text}>{count <= 1 ? '!' : count}</Text>
72
+ </View>
73
+ );
74
+ }
75
+
76
+ function Dismiss({ onPress }: { onPress: () => void }) {
77
+ return (
78
+ <Pressable
79
+ style={{
80
+ marginLeft: 5,
81
+ }}
82
+ hitSlop={{
83
+ top: 12,
84
+ right: 10,
85
+ bottom: 12,
86
+ left: 10,
87
+ }}
88
+ onPress={onPress}>
89
+ {({
90
+ /** @ts-expect-error: react-native types are broken. */
91
+ hovered,
92
+ pressed,
93
+ }) => (
94
+ <View
95
+ style={[dismissStyles.press, hovered && { opacity: 0.8 }, pressed && { opacity: 0.5 }]}>
96
+ <Image
97
+ source={require('@expo/metro-runtime/assets/close.png')}
98
+ style={dismissStyles.image}
99
+ />
100
+ </View>
101
+ )}
102
+ </Pressable>
103
+ );
104
+ }
105
+
106
+ const countStyles = StyleSheet.create({
107
+ warn: {
108
+ backgroundColor: LogBoxStyle.getWarningColor(1),
109
+ },
110
+ error: {
111
+ backgroundColor: LogBoxStyle.getErrorColor(1),
112
+ },
113
+ log: {
114
+ backgroundColor: LogBoxStyle.getLogColor(1),
115
+ },
116
+ inside: {
117
+ marginRight: 8,
118
+ minWidth: 22,
119
+ aspectRatio: 1,
120
+ paddingHorizontal: 4,
121
+ borderRadius: 11,
122
+ justifyContent: 'center',
123
+ alignItems: 'center',
124
+ },
125
+ text: {
126
+ color: LogBoxStyle.getTextColor(1),
127
+ fontSize: 14,
128
+ lineHeight: 18,
129
+ textAlign: 'center',
130
+ fontWeight: '600',
131
+ textShadow: `0px 0px 3px ${LogBoxStyle.getBackgroundColor(0.8)}`,
132
+ },
133
+ });
134
+
135
+ const dismissStyles = StyleSheet.create({
136
+ press: {
137
+ backgroundColor: '#323232',
138
+ height: 20,
139
+ width: 20,
140
+ borderRadius: 25,
141
+ alignItems: 'center',
142
+ justifyContent: 'center',
143
+ },
144
+ image: {
145
+ height: 8,
146
+ width: 8,
147
+ },
148
+ });
149
+
150
+ const toastStyles = StyleSheet.create({
151
+ container: {
152
+ height: 48,
153
+ justifyContent: 'center',
154
+ marginBottom: 4,
155
+ },
156
+ press: {
157
+ borderWidth: 1,
158
+ borderRadius: 8,
159
+ overflow: 'hidden',
160
+ flexDirection: 'row',
161
+ alignItems: 'center',
162
+ borderColor: '#323232',
163
+ backgroundColor: LogBoxStyle.getBackgroundColor(),
164
+ flex: 1,
165
+ paddingHorizontal: 12,
166
+ },
167
+ });
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+
3
+ export default function ErrorToastContainer({
4
+ children,
5
+ }: {
6
+ children: React.ReactNode;
7
+ }): React.ReactElement {
8
+ return <>{children}</>;
9
+ }