react-native-network-lens 0.0.0-stage → 0.1.0

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 (180) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +207 -2
  3. package/lib/module/backHandler.js +31 -0
  4. package/lib/module/backHandler.js.map +1 -0
  5. package/lib/module/components/BodyViewer.js +207 -0
  6. package/lib/module/components/BodyViewer.js.map +1 -0
  7. package/lib/module/components/CodeList.js +104 -0
  8. package/lib/module/components/CodeList.js.map +1 -0
  9. package/lib/module/components/JsonTree/JsonTreeView.js +206 -0
  10. package/lib/module/components/JsonTree/JsonTreeView.js.map +1 -0
  11. package/lib/module/components/JsonTree/model.js +194 -0
  12. package/lib/module/components/JsonTree/model.js.map +1 -0
  13. package/lib/module/components/NetworkLens.js +110 -0
  14. package/lib/module/components/NetworkLens.js.map +1 -0
  15. package/lib/module/components/NetworkLensOverlay.js +158 -0
  16. package/lib/module/components/NetworkLensOverlay.js.map +1 -0
  17. package/lib/module/components/RawTextView.js +119 -0
  18. package/lib/module/components/RawTextView.js.map +1 -0
  19. package/lib/module/components/RequestDetails/RequestDetails.js +251 -0
  20. package/lib/module/components/RequestDetails/RequestDetails.js.map +1 -0
  21. package/lib/module/components/RequestList/FilterBar.js +138 -0
  22. package/lib/module/components/RequestList/FilterBar.js.map +1 -0
  23. package/lib/module/components/RequestList/RequestList.js +163 -0
  24. package/lib/module/components/RequestList/RequestList.js.map +1 -0
  25. package/lib/module/components/RequestList/RequestRow.js +161 -0
  26. package/lib/module/components/RequestList/RequestRow.js.map +1 -0
  27. package/lib/module/components/RequestList/filters.js +57 -0
  28. package/lib/module/components/RequestList/filters.js.map +1 -0
  29. package/lib/module/components/ui/ActionSheet.js +94 -0
  30. package/lib/module/components/ui/ActionSheet.js.map +1 -0
  31. package/lib/module/components/ui/Button.js +90 -0
  32. package/lib/module/components/ui/Button.js.map +1 -0
  33. package/lib/module/components/ui/Pill.js +53 -0
  34. package/lib/module/components/ui/Pill.js.map +1 -0
  35. package/lib/module/components/ui/SearchInput.js +77 -0
  36. package/lib/module/components/ui/SearchInput.js.map +1 -0
  37. package/lib/module/components/ui/Section.js +147 -0
  38. package/lib/module/components/ui/Section.js.map +1 -0
  39. package/lib/module/components/ui/SegmentedControl.js +65 -0
  40. package/lib/module/components/ui/SegmentedControl.js.map +1 -0
  41. package/lib/module/components/ui/index.js +9 -0
  42. package/lib/module/components/ui/index.js.map +1 -0
  43. package/lib/module/core/Logger.js +230 -0
  44. package/lib/module/core/Logger.js.map +1 -0
  45. package/lib/module/core/NetworkRequest.js +155 -0
  46. package/lib/module/core/NetworkRequest.js.map +1 -0
  47. package/lib/module/core/XHRInterceptor.js +104 -0
  48. package/lib/module/core/XHRInterceptor.js.map +1 -0
  49. package/lib/module/core/har.js +72 -0
  50. package/lib/module/core/har.js.map +1 -0
  51. package/lib/module/core/loggerSingleton.js +12 -0
  52. package/lib/module/core/loggerSingleton.js.map +1 -0
  53. package/lib/module/hooks.js +42 -0
  54. package/lib/module/hooks.js.map +1 -0
  55. package/lib/module/index.js +34 -0
  56. package/lib/module/index.js.map +1 -0
  57. package/lib/module/package.json +1 -0
  58. package/lib/module/theme.js +136 -0
  59. package/lib/module/theme.js.map +1 -0
  60. package/lib/module/types.js +2 -0
  61. package/lib/module/types.js.map +1 -0
  62. package/lib/module/utils/body.js +179 -0
  63. package/lib/module/utils/body.js.map +1 -0
  64. package/lib/module/utils/debounce.js +18 -0
  65. package/lib/module/utils/debounce.js.map +1 -0
  66. package/lib/module/utils/format.js +45 -0
  67. package/lib/module/utils/format.js.map +1 -0
  68. package/lib/module/utils/logger.js +6 -0
  69. package/lib/module/utils/logger.js.map +1 -0
  70. package/lib/module/utils/search.js +70 -0
  71. package/lib/module/utils/search.js.map +1 -0
  72. package/lib/module/utils/url.js +50 -0
  73. package/lib/module/utils/url.js.map +1 -0
  74. package/lib/typescript/package.json +1 -0
  75. package/lib/typescript/src/backHandler.d.ts +15 -0
  76. package/lib/typescript/src/backHandler.d.ts.map +1 -0
  77. package/lib/typescript/src/components/BodyViewer.d.ts +16 -0
  78. package/lib/typescript/src/components/BodyViewer.d.ts.map +1 -0
  79. package/lib/typescript/src/components/CodeList.d.ts +21 -0
  80. package/lib/typescript/src/components/CodeList.d.ts.map +1 -0
  81. package/lib/typescript/src/components/JsonTree/JsonTreeView.d.ts +21 -0
  82. package/lib/typescript/src/components/JsonTree/JsonTreeView.d.ts.map +1 -0
  83. package/lib/typescript/src/components/JsonTree/model.d.ts +53 -0
  84. package/lib/typescript/src/components/JsonTree/model.d.ts.map +1 -0
  85. package/lib/typescript/src/components/NetworkLens.d.ts +31 -0
  86. package/lib/typescript/src/components/NetworkLens.d.ts.map +1 -0
  87. package/lib/typescript/src/components/NetworkLensOverlay.d.ts +32 -0
  88. package/lib/typescript/src/components/NetworkLensOverlay.d.ts.map +1 -0
  89. package/lib/typescript/src/components/RawTextView.d.ts +14 -0
  90. package/lib/typescript/src/components/RawTextView.d.ts.map +1 -0
  91. package/lib/typescript/src/components/RequestDetails/RequestDetails.d.ts +9 -0
  92. package/lib/typescript/src/components/RequestDetails/RequestDetails.d.ts.map +1 -0
  93. package/lib/typescript/src/components/RequestList/FilterBar.d.ts +12 -0
  94. package/lib/typescript/src/components/RequestList/FilterBar.d.ts.map +1 -0
  95. package/lib/typescript/src/components/RequestList/RequestList.d.ts +18 -0
  96. package/lib/typescript/src/components/RequestList/RequestList.d.ts.map +1 -0
  97. package/lib/typescript/src/components/RequestList/RequestRow.d.ts +11 -0
  98. package/lib/typescript/src/components/RequestList/RequestRow.d.ts.map +1 -0
  99. package/lib/typescript/src/components/RequestList/filters.d.ts +17 -0
  100. package/lib/typescript/src/components/RequestList/filters.d.ts.map +1 -0
  101. package/lib/typescript/src/components/ui/ActionSheet.d.ts +15 -0
  102. package/lib/typescript/src/components/ui/ActionSheet.d.ts.map +1 -0
  103. package/lib/typescript/src/components/ui/Button.d.ts +21 -0
  104. package/lib/typescript/src/components/ui/Button.d.ts.map +1 -0
  105. package/lib/typescript/src/components/ui/Pill.d.ts +11 -0
  106. package/lib/typescript/src/components/ui/Pill.d.ts.map +1 -0
  107. package/lib/typescript/src/components/ui/SearchInput.d.ts +17 -0
  108. package/lib/typescript/src/components/ui/SearchInput.d.ts.map +1 -0
  109. package/lib/typescript/src/components/ui/Section.d.ts +16 -0
  110. package/lib/typescript/src/components/ui/Section.d.ts.map +1 -0
  111. package/lib/typescript/src/components/ui/SegmentedControl.d.ts +14 -0
  112. package/lib/typescript/src/components/ui/SegmentedControl.d.ts.map +1 -0
  113. package/lib/typescript/src/components/ui/index.d.ts +7 -0
  114. package/lib/typescript/src/components/ui/index.d.ts.map +1 -0
  115. package/lib/typescript/src/core/Logger.d.ts +48 -0
  116. package/lib/typescript/src/core/Logger.d.ts.map +1 -0
  117. package/lib/typescript/src/core/NetworkRequest.d.ts +48 -0
  118. package/lib/typescript/src/core/NetworkRequest.d.ts.map +1 -0
  119. package/lib/typescript/src/core/XHRInterceptor.d.ts +29 -0
  120. package/lib/typescript/src/core/XHRInterceptor.d.ts.map +1 -0
  121. package/lib/typescript/src/core/har.d.ts +65 -0
  122. package/lib/typescript/src/core/har.d.ts.map +1 -0
  123. package/lib/typescript/src/core/loggerSingleton.d.ts +9 -0
  124. package/lib/typescript/src/core/loggerSingleton.d.ts.map +1 -0
  125. package/lib/typescript/src/hooks.d.ts +11 -0
  126. package/lib/typescript/src/hooks.d.ts.map +1 -0
  127. package/lib/typescript/src/index.d.ts +33 -0
  128. package/lib/typescript/src/index.d.ts.map +1 -0
  129. package/lib/typescript/src/theme.d.ts +49 -0
  130. package/lib/typescript/src/theme.d.ts.map +1 -0
  131. package/lib/typescript/src/types.d.ts +80 -0
  132. package/lib/typescript/src/types.d.ts.map +1 -0
  133. package/lib/typescript/src/utils/body.d.ts +19 -0
  134. package/lib/typescript/src/utils/body.d.ts.map +1 -0
  135. package/lib/typescript/src/utils/debounce.d.ts +4 -0
  136. package/lib/typescript/src/utils/debounce.d.ts.map +1 -0
  137. package/lib/typescript/src/utils/format.d.ts +7 -0
  138. package/lib/typescript/src/utils/format.d.ts.map +1 -0
  139. package/lib/typescript/src/utils/logger.d.ts +2 -0
  140. package/lib/typescript/src/utils/logger.d.ts.map +1 -0
  141. package/lib/typescript/src/utils/search.d.ts +17 -0
  142. package/lib/typescript/src/utils/search.d.ts.map +1 -0
  143. package/lib/typescript/src/utils/url.d.ts +15 -0
  144. package/lib/typescript/src/utils/url.d.ts.map +1 -0
  145. package/package.json +186 -4
  146. package/src/backHandler.ts +29 -0
  147. package/src/components/BodyViewer.tsx +240 -0
  148. package/src/components/CodeList.tsx +120 -0
  149. package/src/components/JsonTree/JsonTreeView.tsx +304 -0
  150. package/src/components/JsonTree/model.ts +264 -0
  151. package/src/components/NetworkLens.tsx +176 -0
  152. package/src/components/NetworkLensOverlay.tsx +187 -0
  153. package/src/components/RawTextView.tsx +163 -0
  154. package/src/components/RequestDetails/RequestDetails.tsx +313 -0
  155. package/src/components/RequestList/FilterBar.tsx +168 -0
  156. package/src/components/RequestList/RequestList.tsx +226 -0
  157. package/src/components/RequestList/RequestRow.tsx +150 -0
  158. package/src/components/RequestList/filters.ts +98 -0
  159. package/src/components/ui/ActionSheet.tsx +109 -0
  160. package/src/components/ui/Button.tsx +120 -0
  161. package/src/components/ui/Pill.tsx +53 -0
  162. package/src/components/ui/SearchInput.tsx +97 -0
  163. package/src/components/ui/Section.tsx +133 -0
  164. package/src/components/ui/SegmentedControl.tsx +79 -0
  165. package/src/components/ui/index.ts +6 -0
  166. package/src/core/Logger.ts +293 -0
  167. package/src/core/NetworkRequest.ts +216 -0
  168. package/src/core/XHRInterceptor.ts +179 -0
  169. package/src/core/har.ts +71 -0
  170. package/src/core/loggerSingleton.ts +14 -0
  171. package/src/hooks.ts +51 -0
  172. package/src/index.tsx +56 -0
  173. package/src/theme.ts +174 -0
  174. package/src/types.ts +83 -0
  175. package/src/utils/body.ts +194 -0
  176. package/src/utils/debounce.ts +18 -0
  177. package/src/utils/format.ts +50 -0
  178. package/src/utils/logger.ts +3 -0
  179. package/src/utils/search.ts +72 -0
  180. package/src/utils/url.ts +59 -0
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+
3
+ import { useEffect, useState, useSyncExternalStore } from 'react';
4
+ import logger from "./core/loggerSingleton.js";
5
+ /** Live list of captured requests, newest first. */
6
+ export const useNetworkRequests = () => useSyncExternalStore(logger.subscribe, logger.getSnapshot, logger.getSnapshot);
7
+ const getEnabled = () => logger.enabled;
8
+ const getPaused = () => logger.isPaused();
9
+ export const useLoggerEnabled = () => useSyncExternalStore(logger.subscribe, getEnabled, getEnabled);
10
+ export const useLoggerPaused = () => useSyncExternalStore(logger.subscribe, getPaused, getPaused);
11
+
12
+ /** Resolves a promise factory, re-running whenever `deps` change. */
13
+ export const useAsyncValue = (factory, deps) => {
14
+ const [state, setState] = useState({
15
+ value: undefined,
16
+ loading: true
17
+ });
18
+ useEffect(() => {
19
+ let cancelled = false;
20
+ setState(prev => prev.loading ? prev : {
21
+ ...prev,
22
+ loading: true
23
+ });
24
+ factory().then(value => {
25
+ if (!cancelled) setState({
26
+ value,
27
+ loading: false
28
+ });
29
+ }, () => {
30
+ if (!cancelled) setState({
31
+ value: undefined,
32
+ loading: false
33
+ });
34
+ });
35
+ return () => {
36
+ cancelled = true;
37
+ };
38
+ // eslint-disable-next-line react-hooks/exhaustive-deps
39
+ }, deps);
40
+ return state;
41
+ };
42
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["useEffect","useState","useSyncExternalStore","logger","useNetworkRequests","subscribe","getSnapshot","getEnabled","enabled","getPaused","isPaused","useLoggerEnabled","useLoggerPaused","useAsyncValue","factory","deps","state","setState","value","undefined","loading","cancelled","prev","then"],"sourceRoot":"../../src","sources":["hooks.ts"],"mappings":";;AAAA,SAASA,SAAS,EAAEC,QAAQ,EAAEC,oBAAoB,QAAQ,OAAO;AACjE,OAAOC,MAAM,MAAM,2BAAwB;AAG3C;AACA,OAAO,MAAMC,kBAAkB,GAAGA,CAAA,KAChCF,oBAAoB,CAClBC,MAAM,CAACE,SAAS,EAChBF,MAAM,CAACG,WAAW,EAClBH,MAAM,CAACG,WACT,CAAC;AAEH,MAAMC,UAAU,GAAGA,CAAA,KAAMJ,MAAM,CAACK,OAAO;AACvC,MAAMC,SAAS,GAAGA,CAAA,KAAMN,MAAM,CAACO,QAAQ,CAAC,CAAC;AAEzC,OAAO,MAAMC,gBAAgB,GAAGA,CAAA,KAC9BT,oBAAoB,CAACC,MAAM,CAACE,SAAS,EAAEE,UAAU,EAAEA,UAAU,CAAC;AAEhE,OAAO,MAAMK,eAAe,GAAGA,CAAA,KAC7BV,oBAAoB,CAACC,MAAM,CAACE,SAAS,EAAEI,SAAS,EAAEA,SAAS,CAAC;;AAE9D;AACA,OAAO,MAAMI,aAAa,GAAGA,CAC3BC,OAAyB,EACzBC,IAAwB,KACuB;EAC/C,MAAM,CAACC,KAAK,EAAEC,QAAQ,CAAC,GAAGhB,QAAQ,CAG/B;IACDiB,KAAK,EAAEC,SAAS;IAChBC,OAAO,EAAE;EACX,CAAC,CAAC;EACFpB,SAAS,CAAC,MAAM;IACd,IAAIqB,SAAS,GAAG,KAAK;IACrBJ,QAAQ,CAAEK,IAAI,IAAMA,IAAI,CAACF,OAAO,GAAGE,IAAI,GAAG;MAAE,GAAGA,IAAI;MAAEF,OAAO,EAAE;IAAK,CAAE,CAAC;IACtEN,OAAO,CAAC,CAAC,CAACS,IAAI,CACXL,KAAK,IAAK;MACT,IAAI,CAACG,SAAS,EAAEJ,QAAQ,CAAC;QAAEC,KAAK;QAAEE,OAAO,EAAE;MAAM,CAAC,CAAC;IACrD,CAAC,EACD,MAAM;MACJ,IAAI,CAACC,SAAS,EAAEJ,QAAQ,CAAC;QAAEC,KAAK,EAAEC,SAAS;QAAEC,OAAO,EAAE;MAAM,CAAC,CAAC;IAChE,CACF,CAAC;IACD,OAAO,MAAM;MACXC,SAAS,GAAG,IAAI;IAClB,CAAC;IACD;EACF,CAAC,EAAEN,IAAI,CAAC;EACR,OAAOC,KAAK;AACd,CAAC","ignoreList":[]}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ import logger from "./core/loggerSingleton.js";
4
+ export { default as NetworkLens, default } from "./components/NetworkLens.js";
5
+ export { default as NetworkLensOverlay } from "./components/NetworkLensOverlay.js";
6
+ export { default as JsonTreeView } from "./components/JsonTree/JsonTreeView.js";
7
+ export { default as NetworkRequest } from "./core/NetworkRequest.js";
8
+ export { createHar } from "./core/har.js";
9
+ export { getBackHandler } from "./backHandler.js";
10
+ export { useNetworkRequests, useLoggerEnabled, useLoggerPaused } from "./hooks.js";
11
+ export { lightTheme, darkTheme } from "./theme.js";
12
+ /**
13
+ * Start capturing requests. Call it once, as early as possible (e.g. in your
14
+ * `index.js`). Pass `enabled: false` to turn the whole thing into a no-op.
15
+ *
16
+ * ```ts
17
+ * startNetworkLogging({ enabled: __DEV__, maxRequests: 500 });
18
+ * ```
19
+ */
20
+ export const startNetworkLogging = options => logger.start(options);
21
+
22
+ /** Stop capturing, restore XMLHttpRequest and drop every captured request. */
23
+ export const stopNetworkLogging = () => logger.stop();
24
+
25
+ /** Whether requests are currently being captured. */
26
+ export const isNetworkLoggingEnabled = () => logger.enabled;
27
+
28
+ /** Snapshot of captured requests, newest first. */
29
+ export const getRequests = () => logger.getRequests();
30
+ export const clearRequests = () => logger.clear();
31
+
32
+ /** Pause or resume publishing new requests to the UI. Capturing continues while paused. */
33
+ export const setNetworkLoggingPaused = paused => logger.setPaused(paused);
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["logger","default","NetworkLens","NetworkLensOverlay","JsonTreeView","NetworkRequest","createHar","getBackHandler","useNetworkRequests","useLoggerEnabled","useLoggerPaused","lightTheme","darkTheme","startNetworkLogging","options","start","stopNetworkLogging","stop","isNetworkLoggingEnabled","enabled","getRequests","clearRequests","clear","setNetworkLoggingPaused","paused","setPaused"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,OAAOA,MAAM,MAAM,2BAAwB;AAG3C,SAASC,OAAO,IAAIC,WAAW,EAAED,OAAO,QAAQ,6BAA0B;AAK1E,SAASA,OAAO,IAAIE,kBAAkB,QAAQ,oCAAiC;AAE/E,SAASF,OAAO,IAAIG,YAAY,QAAQ,uCAAoC;AAG5E,SAASH,OAAO,IAAII,cAAc,QAAQ,0BAAuB;AACjE,SAASC,SAAS,QAAQ,eAAY;AACtC,SAASC,cAAc,QAAQ,kBAAe;AAC9C,SAASC,kBAAkB,EAAEC,gBAAgB,EAAEC,eAAe,QAAQ,YAAS;AAC/E,SAASC,UAAU,EAAEC,SAAS,QAAQ,YAAS;AAc/C;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,mBAAmB,GAAIC,OAA4B,IAC9Dd,MAAM,CAACe,KAAK,CAACD,OAAO,CAAC;;AAEvB;AACA,OAAO,MAAME,kBAAkB,GAAGA,CAAA,KAAYhB,MAAM,CAACiB,IAAI,CAAC,CAAC;;AAE3D;AACA,OAAO,MAAMC,uBAAuB,GAAGA,CAAA,KAAelB,MAAM,CAACmB,OAAO;;AAEpE;AACA,OAAO,MAAMC,WAAW,GAAGA,CAAA,KAAMpB,MAAM,CAACoB,WAAW,CAAC,CAAC;AAErD,OAAO,MAAMC,aAAa,GAAGA,CAAA,KAAYrB,MAAM,CAACsB,KAAK,CAAC,CAAC;;AAEvD;AACA,OAAO,MAAMC,uBAAuB,GAAIC,MAAe,IACrDxB,MAAM,CAACyB,SAAS,CAACD,MAAM,CAAC","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,136 @@
1
+ "use strict";
2
+
3
+ import { createContext, useContext } from 'react';
4
+ import { Platform, useColorScheme } from 'react-native';
5
+ const mono = Platform.select({
6
+ ios: 'Menlo',
7
+ android: 'monospace',
8
+ default: 'monospace'
9
+ });
10
+ export const lightTheme = {
11
+ colors: {
12
+ background: '#f2f3f5',
13
+ surface: '#ffffff',
14
+ surfaceAlt: '#eaecf0',
15
+ border: '#d9dce1',
16
+ text: '#161a21',
17
+ textMuted: '#6b7280',
18
+ primary: '#2563eb',
19
+ onPrimary: '#ffffff',
20
+ statusGood: '#15803d',
21
+ statusRedirect: '#0e7490',
22
+ statusWarning: '#c2410c',
23
+ statusBad: '#b91c1c',
24
+ statusPending: '#6b7280',
25
+ methodGet: '#2563eb',
26
+ methodPost: '#15803d',
27
+ methodPut: '#b45309',
28
+ methodPatch: '#7c3aed',
29
+ methodDelete: '#b91c1c',
30
+ methodOther: '#475569',
31
+ jsonKey: '#881391',
32
+ jsonString: '#c41a16',
33
+ jsonNumber: '#1c00cf',
34
+ jsonBoolean: '#0d22aa',
35
+ jsonNull: '#808080',
36
+ highlight: '#fde68a',
37
+ highlightActive: '#f59e0b',
38
+ onHighlight: '#1f2937'
39
+ },
40
+ fonts: {
41
+ mono: mono ?? 'monospace'
42
+ },
43
+ sizes: {
44
+ codeFontSize: 13,
45
+ codeLineHeight: 20
46
+ }
47
+ };
48
+ export const darkTheme = {
49
+ colors: {
50
+ background: '#0f1115',
51
+ surface: '#181b21',
52
+ surfaceAlt: '#22262e',
53
+ border: '#2d323c',
54
+ text: '#e6e8eb',
55
+ textMuted: '#9aa3af',
56
+ primary: '#60a5fa',
57
+ onPrimary: '#0b1220',
58
+ statusGood: '#4ade80',
59
+ statusRedirect: '#22d3ee',
60
+ statusWarning: '#fb923c',
61
+ statusBad: '#f87171',
62
+ statusPending: '#9aa3af',
63
+ methodGet: '#60a5fa',
64
+ methodPost: '#4ade80',
65
+ methodPut: '#fbbf24',
66
+ methodPatch: '#c084fc',
67
+ methodDelete: '#f87171',
68
+ methodOther: '#94a3b8',
69
+ jsonKey: '#e2a8ff',
70
+ jsonString: '#ff8a80',
71
+ jsonNumber: '#9ecbff',
72
+ jsonBoolean: '#9ecbff',
73
+ jsonNull: '#9aa3af',
74
+ highlight: '#5b4a12',
75
+ highlightActive: '#d97706',
76
+ onHighlight: '#fef3c7'
77
+ },
78
+ fonts: {
79
+ mono: mono ?? 'monospace'
80
+ },
81
+ sizes: {
82
+ codeFontSize: 13,
83
+ codeLineHeight: 20
84
+ }
85
+ };
86
+ export const ThemeContext = /*#__PURE__*/createContext('auto');
87
+ const merge = (base, override) => ({
88
+ colors: {
89
+ ...base.colors,
90
+ ...override.colors
91
+ },
92
+ fonts: {
93
+ ...base.fonts,
94
+ ...override.fonts
95
+ },
96
+ sizes: {
97
+ ...base.sizes,
98
+ ...override.sizes
99
+ }
100
+ });
101
+ export const resolveTheme = (input, systemScheme) => {
102
+ if (input === 'auto') return systemScheme === 'dark' ? darkTheme : lightTheme;
103
+ if (input === 'dark') return darkTheme;
104
+ if (input === 'light') return lightTheme;
105
+ return merge(systemScheme === 'dark' ? darkTheme : lightTheme, input);
106
+ };
107
+ export const useTheme = () => {
108
+ const input = useContext(ThemeContext);
109
+ const scheme = useColorScheme();
110
+ return resolveTheme(input, scheme === 'dark' ? 'dark' : 'light');
111
+ };
112
+ export const methodColor = (theme, method) => {
113
+ switch (method) {
114
+ case 'GET':
115
+ return theme.colors.methodGet;
116
+ case 'POST':
117
+ return theme.colors.methodPost;
118
+ case 'PUT':
119
+ return theme.colors.methodPut;
120
+ case 'PATCH':
121
+ return theme.colors.methodPatch;
122
+ case 'DELETE':
123
+ return theme.colors.methodDelete;
124
+ default:
125
+ return theme.colors.methodOther;
126
+ }
127
+ };
128
+ export const statusColor = (theme, status, failed = false) => {
129
+ if (failed) return theme.colors.statusBad;
130
+ if (status <= 0) return theme.colors.statusPending;
131
+ if (status < 300) return theme.colors.statusGood;
132
+ if (status < 400) return theme.colors.statusRedirect;
133
+ if (status < 500) return theme.colors.statusWarning;
134
+ return theme.colors.statusBad;
135
+ };
136
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createContext","useContext","Platform","useColorScheme","mono","select","ios","android","default","lightTheme","colors","background","surface","surfaceAlt","border","text","textMuted","primary","onPrimary","statusGood","statusRedirect","statusWarning","statusBad","statusPending","methodGet","methodPost","methodPut","methodPatch","methodDelete","methodOther","jsonKey","jsonString","jsonNumber","jsonBoolean","jsonNull","highlight","highlightActive","onHighlight","fonts","sizes","codeFontSize","codeLineHeight","darkTheme","ThemeContext","merge","base","override","resolveTheme","input","systemScheme","useTheme","scheme","methodColor","theme","method","statusColor","status","failed"],"sourceRoot":"../../src","sources":["theme.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,179 @@
1
+ "use strict";
2
+
3
+ import { byteLength } from "./format.js";
4
+ import { parseQueryString } from "./url.js";
5
+ const EMPTY = {
6
+ kind: 'empty',
7
+ text: ''
8
+ };
9
+ const isFormDataLike = value => !!value && typeof value === 'object' && Array.isArray(value._parts);
10
+ const formPartsToRecord = parts => {
11
+ const result = {};
12
+ for (const part of parts) {
13
+ if (!Array.isArray(part)) continue;
14
+ const [name, value] = part;
15
+ const key = String(name);
16
+ if (value && typeof value === 'object') {
17
+ const file = value;
18
+ result[key] = `[file${file.name ? ` ${file.name}` : ''}${file.type ? ` (${file.type})` : ''}]`;
19
+ } else {
20
+ result[key] = String(value);
21
+ }
22
+ }
23
+ return result;
24
+ };
25
+ const looksLikeUrlEncoded = (text, contentType) => {
26
+ if (contentType?.includes('application/x-www-form-urlencoded')) return true;
27
+ if (text.length > 10_000) return false;
28
+ if (/[\s{}[\]"]/.test(text)) return false;
29
+ return /^[^=&]+=[^&]*(&[^=&]+=[^&]*)*$/.test(text);
30
+ };
31
+ export const stringifyJson = value => {
32
+ try {
33
+ return JSON.stringify(value, null, 2) ?? '';
34
+ } catch {
35
+ return String(value);
36
+ }
37
+ };
38
+ export const tryParseJson = text => {
39
+ const trimmed = text.trim();
40
+ if (!trimmed) return {
41
+ ok: false
42
+ };
43
+ const first = trimmed[0];
44
+ if (first !== '{' && first !== '[' && first !== '"' && !/^[-\d tfn]/.test(first ?? '')) {
45
+ return {
46
+ ok: false
47
+ };
48
+ }
49
+ try {
50
+ return {
51
+ ok: true,
52
+ value: JSON.parse(trimmed)
53
+ };
54
+ } catch {
55
+ return {
56
+ ok: false
57
+ };
58
+ }
59
+ };
60
+ export const parseTextBody = (text, contentType) => {
61
+ if (!text) return EMPTY;
62
+ const json = tryParseJson(text);
63
+ if (json.ok && (typeof json.value === 'object' || Array.isArray(json.value))) {
64
+ return {
65
+ kind: 'json',
66
+ value: json.value,
67
+ text: stringifyJson(json.value)
68
+ };
69
+ }
70
+ if (looksLikeUrlEncoded(text, contentType)) {
71
+ const value = parseQueryString(text);
72
+ return {
73
+ kind: 'form',
74
+ value,
75
+ text: stringifyJson(value)
76
+ };
77
+ }
78
+ return {
79
+ kind: 'text',
80
+ text
81
+ };
82
+ };
83
+ const describeBinary = (value, mimeType) => {
84
+ let size = 0;
85
+ let label = 'binary';
86
+ if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
87
+ size = value.byteLength;
88
+ label = 'ArrayBuffer';
89
+ } else if (value && typeof value === 'object') {
90
+ const v = value;
91
+ size = v.size ?? v.byteLength ?? 0;
92
+ label = typeof v.size === 'number' ? 'Blob' : label;
93
+ mimeType = mimeType || v.type;
94
+ }
95
+ const text = `[${label}${mimeType ? ` ${mimeType}` : ''}${size ? `, ${size} bytes` : ''}]`;
96
+ return {
97
+ kind: 'binary',
98
+ text,
99
+ size,
100
+ mimeType
101
+ };
102
+ };
103
+
104
+ /**
105
+ * Normalises whatever was passed to `xhr.send()`.
106
+ */
107
+ export const parseRequestBody = (data, contentType) => {
108
+ if (data === null || data === undefined || data === '') return EMPTY;
109
+ if (typeof data === 'string') return parseTextBody(data, contentType);
110
+ if (isFormDataLike(data)) {
111
+ const value = formPartsToRecord(data._parts ?? []);
112
+ return {
113
+ kind: 'form',
114
+ value,
115
+ text: stringifyJson(value)
116
+ };
117
+ }
118
+ if (typeof data === 'object') {
119
+ if (typeof ArrayBuffer !== 'undefined' && (data instanceof ArrayBuffer || ArrayBuffer.isView(data))) {
120
+ return describeBinary(data, contentType);
121
+ }
122
+ if ('size' in data && 'type' in data) {
123
+ return describeBinary(data, contentType);
124
+ }
125
+ return {
126
+ kind: 'json',
127
+ value: data,
128
+ text: stringifyJson(data)
129
+ };
130
+ }
131
+ return parseTextBody(String(data), contentType);
132
+ };
133
+ const readBlobAsText = blob => new Promise((resolve, reject) => {
134
+ const Reader = globalThis.FileReader;
135
+ if (!Reader) {
136
+ reject(new Error('FileReader is not available'));
137
+ return;
138
+ }
139
+ const reader = new Reader();
140
+ reader.onload = () => resolve(String(reader.result ?? ''));
141
+ reader.onerror = () => reject(reader.error ?? new Error('Failed to read blob'));
142
+ try {
143
+ reader.readAsText(blob);
144
+ } catch (error) {
145
+ reject(error);
146
+ }
147
+ });
148
+ const TEXTUAL_MIME = /json|text|xml|javascript|x-www-form-urlencoded|graphql|html/i;
149
+
150
+ /**
151
+ * Normalises an XHR response. Blob responses are only decoded when they look textual.
152
+ */
153
+ export const parseResponseBody = async (response, responseType, contentType) => {
154
+ if (response === null || response === undefined || response === '') return EMPTY;
155
+ if (typeof response === 'string') return parseTextBody(response, contentType);
156
+ if (responseType === 'blob') {
157
+ const mime = contentType || response.type;
158
+ if (!mime || TEXTUAL_MIME.test(mime)) {
159
+ try {
160
+ const text = await readBlobAsText(response);
161
+ if (text) return parseTextBody(text, mime);
162
+ } catch {
163
+ // fall through to the binary description
164
+ }
165
+ }
166
+ return describeBinary(response, mime);
167
+ }
168
+ if (responseType === 'arraybuffer' || response instanceof ArrayBuffer) {
169
+ return describeBinary(response, contentType);
170
+ }
171
+ // responseType 'json' (or anything else that is already an object)
172
+ return {
173
+ kind: 'json',
174
+ value: response,
175
+ text: stringifyJson(response)
176
+ };
177
+ };
178
+ export const bodySize = body => body.kind === 'binary' ? body.size : byteLength(body.text);
179
+ //# sourceMappingURL=body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["byteLength","parseQueryString","EMPTY","kind","text","isFormDataLike","value","Array","isArray","_parts","formPartsToRecord","parts","result","part","name","key","String","file","type","looksLikeUrlEncoded","contentType","includes","length","test","stringifyJson","JSON","stringify","tryParseJson","trimmed","trim","ok","first","parse","parseTextBody","json","describeBinary","mimeType","size","label","ArrayBuffer","v","parseRequestBody","data","undefined","isView","readBlobAsText","blob","Promise","resolve","reject","Reader","globalThis","FileReader","Error","reader","onload","onerror","error","readAsText","TEXTUAL_MIME","parseResponseBody","response","responseType","mime","bodySize","body"],"sourceRoot":"../../../src","sources":["utils/body.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ export default function debounce(fn, wait) {
4
+ let timer;
5
+ const debounced = (...args) => {
6
+ if (timer) clearTimeout(timer);
7
+ timer = setTimeout(() => {
8
+ timer = undefined;
9
+ fn(...args);
10
+ }, wait);
11
+ };
12
+ debounced.cancel = () => {
13
+ if (timer) clearTimeout(timer);
14
+ timer = undefined;
15
+ };
16
+ return debounced;
17
+ }
18
+ //# sourceMappingURL=debounce.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["debounce","fn","wait","timer","debounced","args","clearTimeout","setTimeout","undefined","cancel"],"sourceRoot":"../../../src","sources":["utils/debounce.ts"],"mappings":";;AAAA,eAAe,SAASA,QAAQA,CAC9BC,EAAK,EACLC,IAAY,EACgB;EAC5B,IAAIC,KAAgD;EACpD,MAAMC,SAAS,GAAIA,CAAC,GAAGC,IAAmB,KAAK;IAC7C,IAAIF,KAAK,EAAEG,YAAY,CAACH,KAAK,CAAC;IAC9BA,KAAK,GAAGI,UAAU,CAAC,MAAM;MACvBJ,KAAK,GAAGK,SAAS;MACjBP,EAAE,CAAC,GAAGI,IAAI,CAAC;IACb,CAAC,EAAEH,IAAI,CAAC;EACV,CAAgC;EAChCE,SAAS,CAACK,MAAM,GAAG,MAAM;IACvB,IAAIN,KAAK,EAAEG,YAAY,CAACH,KAAK,CAAC;IAC9BA,KAAK,GAAGK,SAAS;EACnB,CAAC;EACD,OAAOJ,SAAS;AAClB","ignoreList":[]}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ export const formatBytes = bytes => {
4
+ if (!bytes || bytes < 0) return '';
5
+ if (bytes < 1024) return `${bytes} B`;
6
+ const units = ['KB', 'MB', 'GB'];
7
+ let value = bytes / 1024;
8
+ let unit = 0;
9
+ while (value >= 1024 && unit < units.length - 1) {
10
+ value /= 1024;
11
+ unit += 1;
12
+ }
13
+ return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[unit]}`;
14
+ };
15
+ export const formatDuration = ms => {
16
+ if (ms < 0) return '';
17
+ if (ms < 1000) return `${Math.round(ms)} ms`;
18
+ return `${(ms / 1000).toFixed(2)} s`;
19
+ };
20
+ const pad = num => `0${num}`.slice(-2);
21
+ export const formatTime = (time, withMillis = false) => {
22
+ if (!time) return '';
23
+ const date = new Date(time);
24
+ const base = `${pad(date.getHours())}:${pad(date.getMinutes())}:${pad(date.getSeconds())}`;
25
+ if (!withMillis) return base;
26
+ return `${base}.${`00${date.getMilliseconds()}`.slice(-3)}`;
27
+ };
28
+ export const formatDateTime = time => {
29
+ if (!time) return '';
30
+ return new Date(time).toISOString();
31
+ };
32
+
33
+ /** Approximate size of a string in bytes (UTF-8). */
34
+ export const byteLength = text => {
35
+ let bytes = 0;
36
+ for (let i = 0; i < text.length; i++) {
37
+ const code = text.charCodeAt(i);
38
+ if (code < 0x80) bytes += 1;else if (code < 0x800) bytes += 2;else if (code >= 0xd800 && code <= 0xdbff) {
39
+ bytes += 4;
40
+ i += 1;
41
+ } else bytes += 3;
42
+ }
43
+ return bytes;
44
+ };
45
+ //# sourceMappingURL=format.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["formatBytes","bytes","units","value","unit","length","toFixed","Math","round","formatDuration","ms","pad","num","slice","formatTime","time","withMillis","date","Date","base","getHours","getMinutes","getSeconds","getMilliseconds","formatDateTime","toISOString","byteLength","text","i","code","charCodeAt"],"sourceRoot":"../../../src","sources":["utils/format.ts"],"mappings":";;AAAA,OAAO,MAAMA,WAAW,GAAIC,KAAa,IAAa;EACpD,IAAI,CAACA,KAAK,IAAIA,KAAK,GAAG,CAAC,EAAE,OAAO,EAAE;EAClC,IAAIA,KAAK,GAAG,IAAI,EAAE,OAAO,GAAGA,KAAK,IAAI;EACrC,MAAMC,KAAK,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC;EAChC,IAAIC,KAAK,GAAGF,KAAK,GAAG,IAAI;EACxB,IAAIG,IAAI,GAAG,CAAC;EACZ,OAAOD,KAAK,IAAI,IAAI,IAAIC,IAAI,GAAGF,KAAK,CAACG,MAAM,GAAG,CAAC,EAAE;IAC/CF,KAAK,IAAI,IAAI;IACbC,IAAI,IAAI,CAAC;EACX;EACA,OAAO,GAAGD,KAAK,GAAG,EAAE,GAAGA,KAAK,CAACG,OAAO,CAAC,CAAC,CAAC,GAAGC,IAAI,CAACC,KAAK,CAACL,KAAK,CAAC,IAAID,KAAK,CAACE,IAAI,CAAC,EAAE;AAC9E,CAAC;AAED,OAAO,MAAMK,cAAc,GAAIC,EAAU,IAAa;EACpD,IAAIA,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE;EACrB,IAAIA,EAAE,GAAG,IAAI,EAAE,OAAO,GAAGH,IAAI,CAACC,KAAK,CAACE,EAAE,CAAC,KAAK;EAC5C,OAAO,GAAG,CAACA,EAAE,GAAG,IAAI,EAAEJ,OAAO,CAAC,CAAC,CAAC,IAAI;AACtC,CAAC;AAED,MAAMK,GAAG,GAAIC,GAAW,IAAK,IAAIA,GAAG,EAAE,CAACC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEhD,OAAO,MAAMC,UAAU,GAAGA,CAACC,IAAY,EAAEC,UAAU,GAAG,KAAK,KAAa;EACtE,IAAI,CAACD,IAAI,EAAE,OAAO,EAAE;EACpB,MAAME,IAAI,GAAG,IAAIC,IAAI,CAACH,IAAI,CAAC;EAC3B,MAAMI,IAAI,GAAG,GAAGR,GAAG,CAACM,IAAI,CAACG,QAAQ,CAAC,CAAC,CAAC,IAAIT,GAAG,CAACM,IAAI,CAACI,UAAU,CAAC,CAAC,CAAC,IAAIV,GAAG,CACnEM,IAAI,CAACK,UAAU,CAAC,CAClB,CAAC,EAAE;EACH,IAAI,CAACN,UAAU,EAAE,OAAOG,IAAI;EAC5B,OAAO,GAAGA,IAAI,IAAI,KAAKF,IAAI,CAACM,eAAe,CAAC,CAAC,EAAE,CAACV,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;AAC7D,CAAC;AAED,OAAO,MAAMW,cAAc,GAAIT,IAAY,IAAa;EACtD,IAAI,CAACA,IAAI,EAAE,OAAO,EAAE;EACpB,OAAO,IAAIG,IAAI,CAACH,IAAI,CAAC,CAACU,WAAW,CAAC,CAAC;AACrC,CAAC;;AAED;AACA,OAAO,MAAMC,UAAU,GAAIC,IAAY,IAAa;EAClD,IAAI1B,KAAK,GAAG,CAAC;EACb,KAAK,IAAI2B,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGD,IAAI,CAACtB,MAAM,EAAEuB,CAAC,EAAE,EAAE;IACpC,MAAMC,IAAI,GAAGF,IAAI,CAACG,UAAU,CAACF,CAAC,CAAC;IAC/B,IAAIC,IAAI,GAAG,IAAI,EAAE5B,KAAK,IAAI,CAAC,CAAC,KACvB,IAAI4B,IAAI,GAAG,KAAK,EAAE5B,KAAK,IAAI,CAAC,CAAC,KAC7B,IAAI4B,IAAI,IAAI,MAAM,IAAIA,IAAI,IAAI,MAAM,EAAE;MACzC5B,KAAK,IAAI,CAAC;MACV2B,CAAC,IAAI,CAAC;IACR,CAAC,MAAM3B,KAAK,IAAI,CAAC;EACnB;EACA,OAAOA,KAAK;AACd,CAAC","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ export const warn = message => {
4
+ console.warn(`[react-native-network-lens] ${message}`);
5
+ };
6
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["warn","message","console"],"sourceRoot":"../../../src","sources":["utils/logger.ts"],"mappings":";;AAAA,OAAO,MAAMA,IAAI,GAAIC,OAAe,IAAW;EAC7CC,OAAO,CAACF,IAAI,CAAC,+BAA+BC,OAAO,EAAE,CAAC;AACxD,CAAC","ignoreList":[]}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+
3
+ /** Finds every (case-insensitive) occurrence of `query` in `lines`. */
4
+ export const findLineMatches = (lines, query) => {
5
+ const needle = query.toLowerCase();
6
+ if (!needle) return [];
7
+ const matches = [];
8
+ lines.forEach((line, index) => {
9
+ const haystack = line.toLowerCase();
10
+ let from = 0;
11
+ while (from <= haystack.length - needle.length) {
12
+ const at = haystack.indexOf(needle, from);
13
+ if (at === -1) break;
14
+ matches.push({
15
+ line: index,
16
+ start: at,
17
+ end: at + needle.length
18
+ });
19
+ from = at + Math.max(needle.length, 1);
20
+ }
21
+ });
22
+ return matches;
23
+ };
24
+ /** Splits `text` into highlighted / plain segments for the given query. */
25
+ export const splitHighlights = (text, query) => {
26
+ const needle = query.toLowerCase();
27
+ if (!needle || !text) return [{
28
+ text,
29
+ highlighted: false
30
+ }];
31
+ const haystack = text.toLowerCase();
32
+ const segments = [];
33
+ let cursor = 0;
34
+ while (cursor < text.length) {
35
+ const at = haystack.indexOf(needle, cursor);
36
+ if (at === -1) break;
37
+ if (at > cursor) segments.push({
38
+ text: text.slice(cursor, at),
39
+ highlighted: false
40
+ });
41
+ segments.push({
42
+ text: text.slice(at, at + needle.length),
43
+ highlighted: true
44
+ });
45
+ cursor = at + needle.length;
46
+ }
47
+ if (cursor < text.length) segments.push({
48
+ text: text.slice(cursor),
49
+ highlighted: false
50
+ });
51
+ return segments;
52
+ };
53
+ export const MAX_LINE_CHARS = 2000;
54
+
55
+ /** Splits text into lines, hard-wrapping absurdly long ones so layout stays sane. */
56
+ export const toLines = text => {
57
+ const lines = text.split(/\r?\n/);
58
+ const result = [];
59
+ for (const line of lines) {
60
+ if (line.length <= MAX_LINE_CHARS) {
61
+ result.push(line);
62
+ continue;
63
+ }
64
+ for (let i = 0; i < line.length; i += MAX_LINE_CHARS) {
65
+ result.push(line.slice(i, i + MAX_LINE_CHARS));
66
+ }
67
+ }
68
+ return result;
69
+ };
70
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["findLineMatches","lines","query","needle","toLowerCase","matches","forEach","line","index","haystack","from","length","at","indexOf","push","start","end","Math","max","splitHighlights","text","highlighted","segments","cursor","slice","MAX_LINE_CHARS","toLines","split","result","i"],"sourceRoot":"../../../src","sources":["utils/search.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+
3
+ /**
4
+ * Tiny URL helpers that do not rely on the `URL` global, because React Native's
5
+ * implementation is incomplete (no `searchParams`, throws on relative urls).
6
+ */
7
+
8
+ export const extractHost = url => {
9
+ const match = /^[a-z][a-z0-9+.-]*:\/\/([^/?#]+)/i.exec(url);
10
+ return match?.[1] ?? '';
11
+ };
12
+ export const parseQueryString = search => {
13
+ const result = {};
14
+ const trimmed = search.replace(/^\?/, '');
15
+ if (!trimmed) return result;
16
+ for (const pair of trimmed.split('&')) {
17
+ if (!pair) continue;
18
+ const eq = pair.indexOf('=');
19
+ const rawKey = eq === -1 ? pair : pair.slice(0, eq);
20
+ const rawValue = eq === -1 ? '' : pair.slice(eq + 1);
21
+ const key = safeDecode(rawKey);
22
+ const value = safeDecode(rawValue);
23
+ // Keep duplicates readable: `a=1&a=2` -> `a: "1, 2"`
24
+ result[key] = key in result ? `${result[key]}, ${value}` : value;
25
+ }
26
+ return result;
27
+ };
28
+ export const safeDecode = value => {
29
+ try {
30
+ return decodeURIComponent(value.replace(/\+/g, ' '));
31
+ } catch {
32
+ return value;
33
+ }
34
+ };
35
+ export const parseUrl = url => {
36
+ const host = extractHost(url);
37
+ const afterHost = host ? url.slice(url.indexOf(host) + host.length) : url;
38
+ const hashIndex = afterHost.indexOf('#');
39
+ const withoutHash = hashIndex === -1 ? afterHost : afterHost.slice(0, hashIndex);
40
+ const qIndex = withoutHash.indexOf('?');
41
+ const path = (qIndex === -1 ? withoutHash : withoutHash.slice(0, qIndex)) || '/';
42
+ const search = qIndex === -1 ? '' : withoutHash.slice(qIndex + 1);
43
+ return {
44
+ host,
45
+ path,
46
+ query: parseQueryString(search),
47
+ hasQuery: search.length > 0
48
+ };
49
+ };
50
+ //# sourceMappingURL=url.js.map