react-native-network-lens 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +20 -0
- package/README.md +208 -2
- package/lib/module/backHandler.js +31 -0
- package/lib/module/backHandler.js.map +1 -0
- package/lib/module/components/BodyViewer.js +213 -0
- package/lib/module/components/BodyViewer.js.map +1 -0
- package/lib/module/components/CodeList.js +104 -0
- package/lib/module/components/CodeList.js.map +1 -0
- package/lib/module/components/JsonTree/JsonTreeView.js +206 -0
- package/lib/module/components/JsonTree/JsonTreeView.js.map +1 -0
- package/lib/module/components/JsonTree/model.js +196 -0
- package/lib/module/components/JsonTree/model.js.map +1 -0
- package/lib/module/components/NetworkLens.js +110 -0
- package/lib/module/components/NetworkLens.js.map +1 -0
- package/lib/module/components/NetworkLensOverlay.js +158 -0
- package/lib/module/components/NetworkLensOverlay.js.map +1 -0
- package/lib/module/components/RawTextView.js +119 -0
- package/lib/module/components/RawTextView.js.map +1 -0
- package/lib/module/components/RequestDetails/RequestDetails.js +256 -0
- package/lib/module/components/RequestDetails/RequestDetails.js.map +1 -0
- package/lib/module/components/RequestList/FilterBar.js +138 -0
- package/lib/module/components/RequestList/FilterBar.js.map +1 -0
- package/lib/module/components/RequestList/RequestList.js +163 -0
- package/lib/module/components/RequestList/RequestList.js.map +1 -0
- package/lib/module/components/RequestList/RequestRow.js +161 -0
- package/lib/module/components/RequestList/RequestRow.js.map +1 -0
- package/lib/module/components/RequestList/filters.js +57 -0
- package/lib/module/components/RequestList/filters.js.map +1 -0
- package/lib/module/components/ui/ActionSheet.js +94 -0
- package/lib/module/components/ui/ActionSheet.js.map +1 -0
- package/lib/module/components/ui/Button.js +104 -0
- package/lib/module/components/ui/Button.js.map +1 -0
- package/lib/module/components/ui/Pill.js +53 -0
- package/lib/module/components/ui/Pill.js.map +1 -0
- package/lib/module/components/ui/SearchInput.js +77 -0
- package/lib/module/components/ui/SearchInput.js.map +1 -0
- package/lib/module/components/ui/Section.js +147 -0
- package/lib/module/components/ui/Section.js.map +1 -0
- package/lib/module/components/ui/SegmentedControl.js +65 -0
- package/lib/module/components/ui/SegmentedControl.js.map +1 -0
- package/lib/module/components/ui/index.js +9 -0
- package/lib/module/components/ui/index.js.map +1 -0
- package/lib/module/core/Logger.js +230 -0
- package/lib/module/core/Logger.js.map +1 -0
- package/lib/module/core/NetworkRequest.js +155 -0
- package/lib/module/core/NetworkRequest.js.map +1 -0
- package/lib/module/core/XHRInterceptor.js +104 -0
- package/lib/module/core/XHRInterceptor.js.map +1 -0
- package/lib/module/core/har.js +72 -0
- package/lib/module/core/har.js.map +1 -0
- package/lib/module/core/loggerSingleton.js +12 -0
- package/lib/module/core/loggerSingleton.js.map +1 -0
- package/lib/module/hooks.js +42 -0
- package/lib/module/hooks.js.map +1 -0
- package/lib/module/index.js +34 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/theme.js +136 -0
- package/lib/module/theme.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils/body.js +179 -0
- package/lib/module/utils/body.js.map +1 -0
- package/lib/module/utils/debounce.js +18 -0
- package/lib/module/utils/debounce.js.map +1 -0
- package/lib/module/utils/format.js +45 -0
- package/lib/module/utils/format.js.map +1 -0
- package/lib/module/utils/logger.js +6 -0
- package/lib/module/utils/logger.js.map +1 -0
- package/lib/module/utils/search.js +70 -0
- package/lib/module/utils/search.js.map +1 -0
- package/lib/module/utils/url.js +50 -0
- package/lib/module/utils/url.js.map +1 -0
- package/lib/typescript/package.json +1 -0
- package/lib/typescript/src/backHandler.d.ts +15 -0
- package/lib/typescript/src/backHandler.d.ts.map +1 -0
- package/lib/typescript/src/components/BodyViewer.d.ts +16 -0
- package/lib/typescript/src/components/BodyViewer.d.ts.map +1 -0
- package/lib/typescript/src/components/CodeList.d.ts +21 -0
- package/lib/typescript/src/components/CodeList.d.ts.map +1 -0
- package/lib/typescript/src/components/JsonTree/JsonTreeView.d.ts +21 -0
- package/lib/typescript/src/components/JsonTree/JsonTreeView.d.ts.map +1 -0
- package/lib/typescript/src/components/JsonTree/model.d.ts +53 -0
- package/lib/typescript/src/components/JsonTree/model.d.ts.map +1 -0
- package/lib/typescript/src/components/NetworkLens.d.ts +31 -0
- package/lib/typescript/src/components/NetworkLens.d.ts.map +1 -0
- package/lib/typescript/src/components/NetworkLensOverlay.d.ts +32 -0
- package/lib/typescript/src/components/NetworkLensOverlay.d.ts.map +1 -0
- package/lib/typescript/src/components/RawTextView.d.ts +14 -0
- package/lib/typescript/src/components/RawTextView.d.ts.map +1 -0
- package/lib/typescript/src/components/RequestDetails/RequestDetails.d.ts +9 -0
- package/lib/typescript/src/components/RequestDetails/RequestDetails.d.ts.map +1 -0
- package/lib/typescript/src/components/RequestList/FilterBar.d.ts +12 -0
- package/lib/typescript/src/components/RequestList/FilterBar.d.ts.map +1 -0
- package/lib/typescript/src/components/RequestList/RequestList.d.ts +18 -0
- package/lib/typescript/src/components/RequestList/RequestList.d.ts.map +1 -0
- package/lib/typescript/src/components/RequestList/RequestRow.d.ts +11 -0
- package/lib/typescript/src/components/RequestList/RequestRow.d.ts.map +1 -0
- package/lib/typescript/src/components/RequestList/filters.d.ts +17 -0
- package/lib/typescript/src/components/RequestList/filters.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/ActionSheet.d.ts +15 -0
- package/lib/typescript/src/components/ui/ActionSheet.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Button.d.ts +21 -0
- package/lib/typescript/src/components/ui/Button.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Pill.d.ts +11 -0
- package/lib/typescript/src/components/ui/Pill.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/SearchInput.d.ts +17 -0
- package/lib/typescript/src/components/ui/SearchInput.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/Section.d.ts +16 -0
- package/lib/typescript/src/components/ui/Section.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/SegmentedControl.d.ts +14 -0
- package/lib/typescript/src/components/ui/SegmentedControl.d.ts.map +1 -0
- package/lib/typescript/src/components/ui/index.d.ts +7 -0
- package/lib/typescript/src/components/ui/index.d.ts.map +1 -0
- package/lib/typescript/src/core/Logger.d.ts +48 -0
- package/lib/typescript/src/core/Logger.d.ts.map +1 -0
- package/lib/typescript/src/core/NetworkRequest.d.ts +48 -0
- package/lib/typescript/src/core/NetworkRequest.d.ts.map +1 -0
- package/lib/typescript/src/core/XHRInterceptor.d.ts +29 -0
- package/lib/typescript/src/core/XHRInterceptor.d.ts.map +1 -0
- package/lib/typescript/src/core/har.d.ts +65 -0
- package/lib/typescript/src/core/har.d.ts.map +1 -0
- package/lib/typescript/src/core/loggerSingleton.d.ts +9 -0
- package/lib/typescript/src/core/loggerSingleton.d.ts.map +1 -0
- package/lib/typescript/src/hooks.d.ts +11 -0
- package/lib/typescript/src/hooks.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +33 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/theme.d.ts +49 -0
- package/lib/typescript/src/theme.d.ts.map +1 -0
- package/lib/typescript/src/types.d.ts +80 -0
- package/lib/typescript/src/types.d.ts.map +1 -0
- package/lib/typescript/src/utils/body.d.ts +19 -0
- package/lib/typescript/src/utils/body.d.ts.map +1 -0
- package/lib/typescript/src/utils/debounce.d.ts +4 -0
- package/lib/typescript/src/utils/debounce.d.ts.map +1 -0
- package/lib/typescript/src/utils/format.d.ts +7 -0
- package/lib/typescript/src/utils/format.d.ts.map +1 -0
- package/lib/typescript/src/utils/logger.d.ts +2 -0
- package/lib/typescript/src/utils/logger.d.ts.map +1 -0
- package/lib/typescript/src/utils/search.d.ts +17 -0
- package/lib/typescript/src/utils/search.d.ts.map +1 -0
- package/lib/typescript/src/utils/url.d.ts +15 -0
- package/lib/typescript/src/utils/url.d.ts.map +1 -0
- package/package.json +186 -4
- package/src/backHandler.ts +29 -0
- package/src/components/BodyViewer.tsx +250 -0
- package/src/components/CodeList.tsx +120 -0
- package/src/components/JsonTree/JsonTreeView.tsx +304 -0
- package/src/components/JsonTree/model.ts +266 -0
- package/src/components/NetworkLens.tsx +176 -0
- package/src/components/NetworkLensOverlay.tsx +187 -0
- package/src/components/RawTextView.tsx +163 -0
- package/src/components/RequestDetails/RequestDetails.tsx +315 -0
- package/src/components/RequestList/FilterBar.tsx +168 -0
- package/src/components/RequestList/RequestList.tsx +226 -0
- package/src/components/RequestList/RequestRow.tsx +150 -0
- package/src/components/RequestList/filters.ts +98 -0
- package/src/components/ui/ActionSheet.tsx +109 -0
- package/src/components/ui/Button.tsx +124 -0
- package/src/components/ui/Pill.tsx +53 -0
- package/src/components/ui/SearchInput.tsx +97 -0
- package/src/components/ui/Section.tsx +133 -0
- package/src/components/ui/SegmentedControl.tsx +79 -0
- package/src/components/ui/index.ts +6 -0
- package/src/core/Logger.ts +293 -0
- package/src/core/NetworkRequest.ts +216 -0
- package/src/core/XHRInterceptor.ts +179 -0
- package/src/core/har.ts +71 -0
- package/src/core/loggerSingleton.ts +14 -0
- package/src/hooks.ts +51 -0
- package/src/index.tsx +56 -0
- package/src/theme.ts +174 -0
- package/src/types.ts +83 -0
- package/src/utils/body.ts +194 -0
- package/src/utils/debounce.ts +18 -0
- package/src/utils/format.ts +50 -0
- package/src/utils/logger.ts +3 -0
- package/src/utils/search.ts +72 -0
- 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 @@
|
|
|
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 @@
|
|
|
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
|