react-native-xenon 0.2.1 → 0.4.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.
- package/README.md +21 -3
- package/lib/commonjs/assets/icons/bug.png +0 -0
- package/lib/commonjs/contexts/MainContext.js.map +1 -1
- package/lib/commonjs/contexts/index.js +1 -1
- package/lib/commonjs/core/constants.js.map +1 -0
- package/lib/commonjs/core/data.js +10 -0
- package/lib/commonjs/core/data.js.map +1 -0
- package/lib/commonjs/core/global.d.js.map +1 -0
- package/lib/commonjs/{utils.js → core/utils.js} +24 -1
- package/lib/commonjs/core/utils.js.map +1 -0
- package/lib/commonjs/hooks/index.js +2 -9
- package/lib/commonjs/hooks/index.js.map +1 -1
- package/lib/commonjs/hooks/useConsoleInterceptor.js +9 -6
- package/lib/commonjs/hooks/useConsoleInterceptor.js.map +1 -1
- package/lib/commonjs/hooks/useNetworkInterceptor.js +21 -16
- package/lib/commonjs/hooks/useNetworkInterceptor.js.map +1 -1
- package/lib/commonjs/index.js +1 -1
- package/lib/commonjs/interceptors/ConsoleInterceptor.js +12 -17
- package/lib/commonjs/interceptors/ConsoleInterceptor.js.map +1 -1
- package/lib/commonjs/interceptors/FetchInterceptor.js +15 -20
- package/lib/commonjs/interceptors/FetchInterceptor.js.map +1 -1
- package/lib/commonjs/interceptors/HttpInterceptor.js +8 -47
- package/lib/commonjs/interceptors/HttpInterceptor.js.map +1 -1
- package/lib/commonjs/interceptors/Interceptor.js +9 -3
- package/lib/commonjs/interceptors/Interceptor.js.map +1 -1
- package/lib/commonjs/interceptors/NetworkInterceptor.js +15 -2
- package/lib/commonjs/interceptors/NetworkInterceptor.js.map +1 -1
- package/lib/commonjs/interceptors/WebSocketInterceptor.js +28 -77
- package/lib/commonjs/interceptors/WebSocketInterceptor.js.map +1 -1
- package/lib/commonjs/interceptors/XHRInterceptor.js +13 -18
- package/lib/commonjs/interceptors/XHRInterceptor.js.map +1 -1
- package/lib/commonjs/interceptors/index.js +4 -4
- package/lib/commonjs/theme/colors.js.map +1 -0
- package/lib/commonjs/theme/icons.js +15 -0
- package/lib/commonjs/theme/icons.js.map +1 -0
- package/lib/commonjs/types/common.js.map +1 -1
- package/lib/commonjs/types/index.js +4 -4
- package/lib/commonjs/ui/Xenon.js +78 -64
- package/lib/commonjs/ui/Xenon.js.map +1 -1
- package/lib/commonjs/ui/components/bubble/Bubble.js +89 -57
- package/lib/commonjs/ui/components/bubble/Bubble.js.map +1 -1
- package/lib/commonjs/ui/components/details/DetailsViewer.js +9 -14
- package/lib/commonjs/ui/components/details/DetailsViewer.js.map +1 -1
- package/lib/commonjs/ui/components/details/LogMessageDetails.js +2 -2
- package/lib/commonjs/ui/components/details/LogMessageDetails.js.map +1 -1
- package/lib/commonjs/ui/components/details/NetworkRequestDetails.js +26 -11
- package/lib/commonjs/ui/components/details/NetworkRequestDetails.js.map +1 -1
- package/lib/commonjs/ui/components/headers/DebuggerHeader.js +42 -22
- package/lib/commonjs/ui/components/headers/DebuggerHeader.js.map +1 -1
- package/lib/commonjs/ui/components/headers/NetworkPanelHeader.js +2 -2
- package/lib/commonjs/ui/components/headers/NetworkPanelHeader.js.map +1 -1
- package/lib/commonjs/ui/components/headers/NetworkRequestDetailsHeader.js +1 -2
- package/lib/commonjs/ui/components/headers/NetworkRequestDetailsHeader.js.map +1 -1
- package/lib/commonjs/ui/components/index.js +5 -5
- package/lib/commonjs/ui/components/items/ConsolePanelItem.js +2 -2
- package/lib/commonjs/ui/components/items/ConsolePanelItem.js.map +1 -1
- package/lib/commonjs/ui/components/items/DebuggerHeaderItem.js +4 -2
- package/lib/commonjs/ui/components/items/DebuggerHeaderItem.js.map +1 -1
- package/lib/commonjs/ui/components/items/NetworkPanelItem.js +2 -2
- package/lib/commonjs/ui/components/items/NetworkPanelItem.js.map +1 -1
- package/lib/commonjs/ui/components/items/NetworkRequestDetailsHeaderItem.js +2 -3
- package/lib/commonjs/ui/components/items/NetworkRequestDetailsHeaderItem.js.map +1 -1
- package/lib/commonjs/ui/components/items/NetworkRequestDetailsItem.js +7 -6
- package/lib/commonjs/ui/components/items/NetworkRequestDetailsItem.js.map +1 -1
- package/lib/commonjs/ui/components/panels/ConsolePanel.js +21 -23
- package/lib/commonjs/ui/components/panels/ConsolePanel.js.map +1 -1
- package/lib/commonjs/ui/components/panels/NetworkPanel.js +30 -33
- package/lib/commonjs/ui/components/panels/NetworkPanel.js.map +1 -1
- package/lib/module/assets/icons/bug.png +0 -0
- package/lib/module/contexts/MainContext.js +7 -3
- package/lib/module/contexts/MainContext.js.map +1 -1
- package/lib/module/contexts/index.js +11 -1
- package/lib/module/contexts/index.js.map +1 -1
- package/lib/module/core/constants.js +8 -0
- package/lib/module/core/constants.js.map +1 -0
- package/lib/module/core/data.js +10 -0
- package/lib/module/core/data.js.map +1 -0
- package/lib/module/core/global.d.js.map +1 -0
- package/lib/module/core/utils.js +71 -0
- package/lib/module/core/utils.js.map +1 -0
- package/lib/module/hooks/index.js +18 -3
- package/lib/module/hooks/index.js.map +1 -1
- package/lib/module/hooks/useConsoleInterceptor.js +21 -14
- package/lib/module/hooks/useConsoleInterceptor.js.map +1 -1
- package/lib/module/hooks/useNetworkInterceptor.js +38 -29
- package/lib/module/hooks/useNetworkInterceptor.js.map +1 -1
- package/lib/module/index.js +11 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/interceptors/ConsoleInterceptor.js +16 -14
- package/lib/module/interceptors/ConsoleInterceptor.js.map +1 -1
- package/lib/module/interceptors/FetchInterceptor.js +23 -22
- package/lib/module/interceptors/FetchInterceptor.js.map +1 -1
- package/lib/module/interceptors/HttpInterceptor.js +14 -48
- package/lib/module/interceptors/HttpInterceptor.js.map +1 -1
- package/lib/module/interceptors/Interceptor.js +13 -2
- package/lib/module/interceptors/Interceptor.js.map +1 -1
- package/lib/module/interceptors/NetworkInterceptor.js +21 -2
- package/lib/module/interceptors/NetworkInterceptor.js.map +1 -1
- package/lib/module/interceptors/WebSocketInterceptor.js +48 -91
- package/lib/module/interceptors/WebSocketInterceptor.js.map +1 -1
- package/lib/module/interceptors/XHRInterceptor.js +19 -18
- package/lib/module/interceptors/XHRInterceptor.js.map +1 -1
- package/lib/module/interceptors/index.js +32 -4
- package/lib/module/interceptors/index.js.map +1 -1
- package/lib/module/theme/colors.js +14 -0
- package/lib/module/theme/colors.js.map +1 -0
- package/lib/module/theme/icons.js +15 -0
- package/lib/module/theme/icons.js.map +1 -0
- package/lib/module/types/common.js +6 -2
- package/lib/module/types/common.js.map +1 -1
- package/lib/module/types/http.js +3 -1
- package/lib/module/types/index.js +47 -4
- package/lib/module/types/index.js.map +1 -1
- package/lib/module/types/websocket.js +3 -1
- package/lib/module/ui/Xenon.js +97 -78
- package/lib/module/ui/Xenon.js.map +1 -1
- package/lib/module/ui/components/bubble/Bubble.js +100 -63
- package/lib/module/ui/components/bubble/Bubble.js.map +1 -1
- package/lib/module/ui/components/details/DetailsViewer.js +18 -18
- package/lib/module/ui/components/details/DetailsViewer.js.map +1 -1
- package/lib/module/ui/components/details/LogMessageDetails.js +15 -10
- package/lib/module/ui/components/details/LogMessageDetails.js.map +1 -1
- package/lib/module/ui/components/details/NetworkRequestDetails.js +66 -46
- package/lib/module/ui/components/details/NetworkRequestDetails.js.map +1 -1
- package/lib/module/ui/components/headers/DebuggerHeader.js +68 -43
- package/lib/module/ui/components/headers/DebuggerHeader.js.map +1 -1
- package/lib/module/ui/components/headers/NetworkPanelHeader.js +26 -21
- package/lib/module/ui/components/headers/NetworkPanelHeader.js.map +1 -1
- package/lib/module/ui/components/headers/NetworkRequestDetailsHeader.js +14 -10
- package/lib/module/ui/components/headers/NetworkRequestDetailsHeader.js.map +1 -1
- package/lib/module/ui/components/index.js +39 -5
- package/lib/module/ui/components/index.js.map +1 -1
- package/lib/module/ui/components/items/ConsolePanelItem.js +15 -10
- package/lib/module/ui/components/items/ConsolePanelItem.js.map +1 -1
- package/lib/module/ui/components/items/DebuggerHeaderItem.js +20 -13
- package/lib/module/ui/components/items/DebuggerHeaderItem.js.map +1 -1
- package/lib/module/ui/components/items/NetworkPanelItem.js +28 -23
- package/lib/module/ui/components/items/NetworkPanelItem.js.map +1 -1
- package/lib/module/ui/components/items/NetworkRequestDetailsHeaderItem.js +15 -11
- package/lib/module/ui/components/items/NetworkRequestDetailsHeaderItem.js.map +1 -1
- package/lib/module/ui/components/items/NetworkRequestDetailsItem.js +21 -15
- package/lib/module/ui/components/items/NetworkRequestDetailsItem.js.map +1 -1
- package/lib/module/ui/components/panels/ConsolePanel.js +35 -32
- package/lib/module/ui/components/panels/ConsolePanel.js.map +1 -1
- package/lib/module/ui/components/panels/NetworkPanel.js +43 -41
- package/lib/module/ui/components/panels/NetworkPanel.js.map +1 -1
- package/lib/typescript/commonjs/src/contexts/MainContext.d.ts +5 -17
- package/lib/typescript/commonjs/src/contexts/MainContext.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/core/constants.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/core/data.d.ts +10 -0
- package/lib/typescript/commonjs/src/core/data.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/{utils.d.ts → core/utils.d.ts} +10 -1
- package/lib/typescript/commonjs/src/core/utils.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/hooks/index.d.ts +0 -1
- package/lib/typescript/commonjs/src/hooks/index.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/hooks/useConsoleInterceptor.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/hooks/useNetworkInterceptor.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/interceptors/ConsoleInterceptor.d.ts +3 -5
- package/lib/typescript/commonjs/src/interceptors/ConsoleInterceptor.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/interceptors/FetchInterceptor.d.ts +0 -2
- package/lib/typescript/commonjs/src/interceptors/FetchInterceptor.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/interceptors/HttpInterceptor.d.ts +3 -20
- package/lib/typescript/commonjs/src/interceptors/HttpInterceptor.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/interceptors/Interceptor.d.ts +3 -1
- package/lib/typescript/commonjs/src/interceptors/Interceptor.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/interceptors/NetworkInterceptor.d.ts +7 -3
- package/lib/typescript/commonjs/src/interceptors/NetworkInterceptor.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/interceptors/WebSocketInterceptor.d.ts +4 -25
- package/lib/typescript/commonjs/src/interceptors/WebSocketInterceptor.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/interceptors/XHRInterceptor.d.ts +0 -2
- package/lib/typescript/commonjs/src/interceptors/XHRInterceptor.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/theme/colors.d.ts.map +1 -0
- package/lib/typescript/{module/src → commonjs/src/theme}/icons.d.ts +1 -1
- package/lib/typescript/commonjs/src/theme/icons.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/types/common.d.ts +6 -4
- package/lib/typescript/commonjs/src/types/common.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/types/console.d.ts +3 -0
- package/lib/typescript/commonjs/src/types/console.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/types/http.d.ts +7 -5
- package/lib/typescript/commonjs/src/types/http.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/types/websocket.d.ts +9 -7
- package/lib/typescript/commonjs/src/types/websocket.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ui/Xenon.d.ts +2 -0
- package/lib/typescript/commonjs/src/ui/Xenon.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ui/components/bubble/Bubble.d.ts +4 -1
- package/lib/typescript/commonjs/src/ui/components/bubble/Bubble.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ui/components/details/DetailsViewer.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ui/components/details/NetworkRequestDetails.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ui/components/headers/DebuggerHeader.d.ts +5 -1
- package/lib/typescript/commonjs/src/ui/components/headers/DebuggerHeader.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ui/components/headers/NetworkRequestDetailsHeader.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ui/components/items/NetworkRequestDetailsHeaderItem.d.ts +1 -3
- package/lib/typescript/commonjs/src/ui/components/items/NetworkRequestDetailsHeaderItem.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ui/components/items/NetworkRequestDetailsItem.d.ts +3 -3
- package/lib/typescript/commonjs/src/ui/components/items/NetworkRequestDetailsItem.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ui/components/panels/ConsolePanel.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/ui/components/panels/NetworkPanel.d.ts.map +1 -1
- package/lib/typescript/module/src/contexts/MainContext.d.ts +5 -17
- package/lib/typescript/module/src/contexts/MainContext.d.ts.map +1 -1
- package/lib/typescript/module/src/core/constants.d.ts.map +1 -0
- package/lib/typescript/module/src/core/data.d.ts +10 -0
- package/lib/typescript/module/src/core/data.d.ts.map +1 -0
- package/lib/typescript/module/src/{utils.d.ts → core/utils.d.ts} +10 -1
- package/lib/typescript/module/src/core/utils.d.ts.map +1 -0
- package/lib/typescript/module/src/hooks/index.d.ts +0 -1
- package/lib/typescript/module/src/hooks/index.d.ts.map +1 -1
- package/lib/typescript/module/src/hooks/useConsoleInterceptor.d.ts.map +1 -1
- package/lib/typescript/module/src/hooks/useNetworkInterceptor.d.ts.map +1 -1
- package/lib/typescript/module/src/interceptors/ConsoleInterceptor.d.ts +3 -5
- package/lib/typescript/module/src/interceptors/ConsoleInterceptor.d.ts.map +1 -1
- package/lib/typescript/module/src/interceptors/FetchInterceptor.d.ts +0 -2
- package/lib/typescript/module/src/interceptors/FetchInterceptor.d.ts.map +1 -1
- package/lib/typescript/module/src/interceptors/HttpInterceptor.d.ts +3 -20
- package/lib/typescript/module/src/interceptors/HttpInterceptor.d.ts.map +1 -1
- package/lib/typescript/module/src/interceptors/Interceptor.d.ts +3 -1
- package/lib/typescript/module/src/interceptors/Interceptor.d.ts.map +1 -1
- package/lib/typescript/module/src/interceptors/NetworkInterceptor.d.ts +7 -3
- package/lib/typescript/module/src/interceptors/NetworkInterceptor.d.ts.map +1 -1
- package/lib/typescript/module/src/interceptors/WebSocketInterceptor.d.ts +4 -25
- package/lib/typescript/module/src/interceptors/WebSocketInterceptor.d.ts.map +1 -1
- package/lib/typescript/module/src/interceptors/XHRInterceptor.d.ts +0 -2
- package/lib/typescript/module/src/interceptors/XHRInterceptor.d.ts.map +1 -1
- package/lib/typescript/module/src/theme/colors.d.ts.map +1 -0
- package/lib/typescript/{commonjs/src → module/src/theme}/icons.d.ts +1 -1
- package/lib/typescript/module/src/theme/icons.d.ts.map +1 -0
- package/lib/typescript/module/src/types/common.d.ts +6 -4
- package/lib/typescript/module/src/types/common.d.ts.map +1 -1
- package/lib/typescript/module/src/types/console.d.ts +3 -0
- package/lib/typescript/module/src/types/console.d.ts.map +1 -1
- package/lib/typescript/module/src/types/http.d.ts +7 -5
- package/lib/typescript/module/src/types/http.d.ts.map +1 -1
- package/lib/typescript/module/src/types/websocket.d.ts +9 -7
- package/lib/typescript/module/src/types/websocket.d.ts.map +1 -1
- package/lib/typescript/module/src/ui/Xenon.d.ts +2 -0
- package/lib/typescript/module/src/ui/Xenon.d.ts.map +1 -1
- package/lib/typescript/module/src/ui/components/bubble/Bubble.d.ts +4 -1
- package/lib/typescript/module/src/ui/components/bubble/Bubble.d.ts.map +1 -1
- package/lib/typescript/module/src/ui/components/details/DetailsViewer.d.ts.map +1 -1
- package/lib/typescript/module/src/ui/components/details/NetworkRequestDetails.d.ts.map +1 -1
- package/lib/typescript/module/src/ui/components/headers/DebuggerHeader.d.ts +5 -1
- package/lib/typescript/module/src/ui/components/headers/DebuggerHeader.d.ts.map +1 -1
- package/lib/typescript/module/src/ui/components/headers/NetworkRequestDetailsHeader.d.ts.map +1 -1
- package/lib/typescript/module/src/ui/components/items/NetworkRequestDetailsHeaderItem.d.ts +1 -3
- package/lib/typescript/module/src/ui/components/items/NetworkRequestDetailsHeaderItem.d.ts.map +1 -1
- package/lib/typescript/module/src/ui/components/items/NetworkRequestDetailsItem.d.ts +3 -3
- package/lib/typescript/module/src/ui/components/items/NetworkRequestDetailsItem.d.ts.map +1 -1
- package/lib/typescript/module/src/ui/components/panels/ConsolePanel.d.ts.map +1 -1
- package/lib/typescript/module/src/ui/components/panels/NetworkPanel.d.ts.map +1 -1
- package/package.json +12 -6
- package/src/assets/icons/bug.png +0 -0
- package/src/contexts/MainContext.ts +6 -25
- package/src/core/data.ts +12 -0
- package/src/{utils.ts → core/utils.ts} +27 -1
- package/src/hooks/index.ts +0 -1
- package/src/hooks/useConsoleInterceptor.ts +10 -7
- package/src/hooks/useNetworkInterceptor.ts +52 -55
- package/src/interceptors/ConsoleInterceptor.ts +11 -15
- package/src/interceptors/FetchInterceptor.ts +17 -18
- package/src/interceptors/HttpInterceptor.ts +9 -62
- package/src/interceptors/Interceptor.ts +11 -1
- package/src/interceptors/NetworkInterceptor.ts +18 -3
- package/src/interceptors/WebSocketInterceptor.ts +28 -95
- package/src/interceptors/XHRInterceptor.ts +11 -15
- package/src/theme/icons.ts +9 -0
- package/src/types/common.ts +8 -8
- package/src/types/console.ts +4 -0
- package/src/types/http.ts +24 -28
- package/src/types/websocket.ts +16 -26
- package/src/ui/Xenon.tsx +89 -78
- package/src/ui/components/bubble/Bubble.tsx +98 -62
- package/src/ui/components/details/DetailsViewer.tsx +6 -9
- package/src/ui/components/details/LogMessageDetails.tsx +2 -2
- package/src/ui/components/details/NetworkRequestDetails.tsx +26 -9
- package/src/ui/components/headers/DebuggerHeader.tsx +46 -24
- package/src/ui/components/headers/NetworkPanelHeader.tsx +2 -2
- package/src/ui/components/headers/NetworkRequestDetailsHeader.tsx +0 -1
- package/src/ui/components/items/ConsolePanelItem.tsx +2 -2
- package/src/ui/components/items/DebuggerHeaderItem.tsx +3 -1
- package/src/ui/components/items/NetworkPanelItem.tsx +2 -2
- package/src/ui/components/items/NetworkRequestDetailsHeaderItem.tsx +1 -5
- package/src/ui/components/items/NetworkRequestDetailsItem.tsx +7 -7
- package/src/ui/components/panels/ConsolePanel.tsx +19 -22
- package/src/ui/components/panels/NetworkPanel.tsx +31 -35
- package/lib/commonjs/assets/icons/code.png +0 -0
- package/lib/commonjs/colors.js.map +0 -1
- package/lib/commonjs/constants.js.map +0 -1
- package/lib/commonjs/global.d.js.map +0 -1
- package/lib/commonjs/hooks/useScrollToBottom.js +0 -23
- package/lib/commonjs/hooks/useScrollToBottom.js.map +0 -1
- package/lib/commonjs/icons.js +0 -15
- package/lib/commonjs/icons.js.map +0 -1
- package/lib/commonjs/utils.js.map +0 -1
- package/lib/module/assets/icons/code.png +0 -0
- package/lib/module/colors.js +0 -10
- package/lib/module/colors.js.map +0 -1
- package/lib/module/constants.js +0 -4
- package/lib/module/constants.js.map +0 -1
- package/lib/module/global.d.js.map +0 -1
- package/lib/module/hooks/useScrollToBottom.js +0 -19
- package/lib/module/hooks/useScrollToBottom.js.map +0 -1
- package/lib/module/icons.js +0 -11
- package/lib/module/icons.js.map +0 -1
- package/lib/module/utils.js +0 -36
- package/lib/module/utils.js.map +0 -1
- package/lib/typescript/commonjs/src/colors.d.ts.map +0 -1
- package/lib/typescript/commonjs/src/constants.d.ts.map +0 -1
- package/lib/typescript/commonjs/src/hooks/useScrollToBottom.d.ts +0 -3
- package/lib/typescript/commonjs/src/hooks/useScrollToBottom.d.ts.map +0 -1
- package/lib/typescript/commonjs/src/icons.d.ts.map +0 -1
- package/lib/typescript/commonjs/src/utils.d.ts.map +0 -1
- package/lib/typescript/module/src/colors.d.ts.map +0 -1
- package/lib/typescript/module/src/constants.d.ts.map +0 -1
- package/lib/typescript/module/src/hooks/useScrollToBottom.d.ts +0 -3
- package/lib/typescript/module/src/hooks/useScrollToBottom.d.ts.map +0 -1
- package/lib/typescript/module/src/icons.d.ts.map +0 -1
- package/lib/typescript/module/src/utils.d.ts.map +0 -1
- package/src/assets/icons/code.png +0 -0
- package/src/hooks/useScrollToBottom.ts +0 -23
- package/src/icons.ts +0 -9
- /package/lib/commonjs/{constants.js → core/constants.js} +0 -0
- /package/lib/commonjs/{global.d.js → core/global.d.js} +0 -0
- /package/lib/commonjs/{colors.js → theme/colors.js} +0 -0
- /package/lib/module/{global.d.js → core/global.d.js} +0 -0
- /package/lib/typescript/commonjs/src/{constants.d.ts → core/constants.d.ts} +0 -0
- /package/lib/typescript/commonjs/src/{colors.d.ts → theme/colors.d.ts} +0 -0
- /package/lib/typescript/module/src/{constants.d.ts → core/constants.d.ts} +0 -0
- /package/lib/typescript/module/src/{colors.d.ts → theme/colors.d.ts} +0 -0
- /package/src/{constants.ts → core/constants.ts} +0 -0
- /package/src/{global.d.ts → core/global.d.ts} +0 -0
- /package/src/{colors.ts → theme/colors.ts} +0 -0
@@ -1,26 +1,16 @@
|
|
1
1
|
import { useCallback, useEffect, useState } from 'react';
|
2
2
|
import { useImmer } from 'use-immer';
|
3
|
-
import { NETWORK_REQUEST_HEADER } from '../constants';
|
3
|
+
import { NETWORK_REQUEST_HEADER } from '../core/constants';
|
4
4
|
import { FetchInterceptor, WebSocketInterceptor, XHRInterceptor } from '../interceptors';
|
5
5
|
import {
|
6
6
|
NetworkType,
|
7
|
-
type
|
8
|
-
type HttpOpenCallback,
|
7
|
+
type HttpHandlers,
|
9
8
|
type HttpRequest,
|
10
|
-
type HttpRequestHeaderCallback,
|
11
|
-
type HttpResponseCallback,
|
12
|
-
type HttpSendCallback,
|
13
9
|
type ID,
|
14
|
-
type
|
15
|
-
type WebSocketConnectCallback,
|
16
|
-
type WebSocketOnCloseCallback,
|
17
|
-
type WebSocketOnErrorCallback,
|
18
|
-
type WebSocketOnMessageCallback,
|
19
|
-
type WebSocketOnOpenCallback,
|
10
|
+
type WebSocketHandlers,
|
20
11
|
type WebSocketRequest,
|
21
|
-
type WebSocketSendCallback,
|
22
12
|
} from '../types';
|
23
|
-
import { keyValueToString } from '../utils';
|
13
|
+
import { keyValueToString } from '../core/utils';
|
24
14
|
|
25
15
|
interface NetworkInterceptorParams {
|
26
16
|
autoEnabled: boolean;
|
@@ -30,22 +20,26 @@ type NetworkRequests<T> = Map<NonNullable<ID>, T>;
|
|
30
20
|
|
31
21
|
const initRequests = new Map<NonNullable<ID>, HttpRequest & WebSocketRequest>();
|
32
22
|
|
23
|
+
const xhrInterceptor = new XHRInterceptor();
|
24
|
+
const fetchInterceptor = new FetchInterceptor();
|
25
|
+
const webSocketInterceptor = new WebSocketInterceptor();
|
26
|
+
|
33
27
|
export default function useNetworkInterceptor({ autoEnabled }: NetworkInterceptorParams) {
|
34
28
|
const [isInterceptorEnabled, setIsInterceptorEnabled] = useState(autoEnabled);
|
35
29
|
|
36
30
|
const [networkRequests, setNetworkRequests] = useImmer(initRequests);
|
37
31
|
|
38
32
|
const isEnabled = () =>
|
39
|
-
|
40
|
-
|
41
|
-
|
33
|
+
xhrInterceptor.isInterceptorEnabled &&
|
34
|
+
fetchInterceptor.isInterceptorEnabled &&
|
35
|
+
webSocketInterceptor.isInterceptorEnabled;
|
42
36
|
|
43
37
|
const clearAllNetworkRequests = () => {
|
44
38
|
setNetworkRequests(initRequests);
|
45
39
|
};
|
46
40
|
|
47
41
|
const enableHttpInterceptions = useCallback(() => {
|
48
|
-
const openCallback:
|
42
|
+
const openCallback: HttpHandlers['open'] = (id, type, method, url) => {
|
49
43
|
if (!id) return;
|
50
44
|
|
51
45
|
setNetworkRequests((draft: NetworkRequests<HttpRequest>) => {
|
@@ -53,7 +47,7 @@ export default function useNetworkInterceptor({ autoEnabled }: NetworkIntercepto
|
|
53
47
|
});
|
54
48
|
};
|
55
49
|
|
56
|
-
const requestHeaderCallback:
|
50
|
+
const requestHeaderCallback: HttpHandlers['requestHeader'] = (id, header, value) => {
|
57
51
|
if (!id) return;
|
58
52
|
|
59
53
|
setNetworkRequests((draft: NetworkRequests<HttpRequest>) => {
|
@@ -81,7 +75,7 @@ export default function useNetworkInterceptor({ autoEnabled }: NetworkIntercepto
|
|
81
75
|
});
|
82
76
|
};
|
83
77
|
|
84
|
-
const sendCallback:
|
78
|
+
const sendCallback: HttpHandlers['send'] = (id, data) => {
|
85
79
|
if (!id) return;
|
86
80
|
|
87
81
|
setNetworkRequests((draft: NetworkRequests<HttpRequest>) => {
|
@@ -91,7 +85,7 @@ export default function useNetworkInterceptor({ autoEnabled }: NetworkIntercepto
|
|
91
85
|
});
|
92
86
|
};
|
93
87
|
|
94
|
-
const headerReceivedCallback:
|
88
|
+
const headerReceivedCallback: HttpHandlers['headerReceived'] = (
|
95
89
|
id,
|
96
90
|
responseContentType,
|
97
91
|
responseSize,
|
@@ -108,7 +102,7 @@ export default function useNetworkInterceptor({ autoEnabled }: NetworkIntercepto
|
|
108
102
|
});
|
109
103
|
};
|
110
104
|
|
111
|
-
const responseCallback:
|
105
|
+
const responseCallback: HttpHandlers['response'] = (
|
112
106
|
id,
|
113
107
|
status,
|
114
108
|
timeout,
|
@@ -131,25 +125,25 @@ export default function useNetworkInterceptor({ autoEnabled }: NetworkIntercepto
|
|
131
125
|
});
|
132
126
|
};
|
133
127
|
|
134
|
-
|
135
|
-
.
|
136
|
-
.
|
137
|
-
.
|
138
|
-
.
|
139
|
-
.
|
128
|
+
xhrInterceptor
|
129
|
+
.set('open', openCallback)
|
130
|
+
.set('requestHeader', requestHeaderCallback)
|
131
|
+
.set('send', sendCallback)
|
132
|
+
.set('headerReceived', headerReceivedCallback)
|
133
|
+
.set('response', responseCallback)
|
140
134
|
.enableInterception();
|
141
135
|
|
142
|
-
|
143
|
-
.
|
144
|
-
.
|
145
|
-
.
|
146
|
-
.
|
147
|
-
.
|
136
|
+
fetchInterceptor
|
137
|
+
.set('open', openCallback)
|
138
|
+
.set('requestHeader', requestHeaderCallback)
|
139
|
+
.set('send', sendCallback)
|
140
|
+
.set('headerReceived', headerReceivedCallback)
|
141
|
+
.set('response', responseCallback)
|
148
142
|
.enableInterception();
|
149
143
|
}, [setNetworkRequests]);
|
150
144
|
|
151
145
|
const enableWebSocketInterception = useCallback(() => {
|
152
|
-
const connectCallback:
|
146
|
+
const connectCallback: WebSocketHandlers['connect'] = (url, protocols, options, socketId) => {
|
153
147
|
if (typeof socketId !== 'number') return;
|
154
148
|
|
155
149
|
setNetworkRequests((draft: NetworkRequests<WebSocketRequest>) => {
|
@@ -162,7 +156,7 @@ export default function useNetworkInterceptor({ autoEnabled }: NetworkIntercepto
|
|
162
156
|
});
|
163
157
|
};
|
164
158
|
|
165
|
-
const sendCallback:
|
159
|
+
const sendCallback: WebSocketHandlers['send'] = (data, socketId) => {
|
166
160
|
if (typeof socketId !== 'number') return;
|
167
161
|
|
168
162
|
setNetworkRequests((draft: NetworkRequests<WebSocketRequest>) => {
|
@@ -173,7 +167,7 @@ export default function useNetworkInterceptor({ autoEnabled }: NetworkIntercepto
|
|
173
167
|
});
|
174
168
|
};
|
175
169
|
|
176
|
-
const closeCallback:
|
170
|
+
const closeCallback: WebSocketHandlers['close'] = (code, reason, socketId) => {
|
177
171
|
if (typeof socketId !== 'number') return;
|
178
172
|
|
179
173
|
setNetworkRequests((draft: NetworkRequests<WebSocketRequest>) => {
|
@@ -184,7 +178,7 @@ export default function useNetworkInterceptor({ autoEnabled }: NetworkIntercepto
|
|
184
178
|
});
|
185
179
|
};
|
186
180
|
|
187
|
-
const onOpenCallback:
|
181
|
+
const onOpenCallback: WebSocketHandlers['onOpen'] = (socketId, duration) => {
|
188
182
|
if (typeof socketId !== 'number') return;
|
189
183
|
|
190
184
|
setNetworkRequests((draft: NetworkRequests<WebSocketRequest>) => {
|
@@ -194,7 +188,7 @@ export default function useNetworkInterceptor({ autoEnabled }: NetworkIntercepto
|
|
194
188
|
});
|
195
189
|
};
|
196
190
|
|
197
|
-
const onMessageCallback:
|
191
|
+
const onMessageCallback: WebSocketHandlers['onMessage'] = (socketId, message) => {
|
198
192
|
if (typeof socketId !== 'number') return;
|
199
193
|
|
200
194
|
setNetworkRequests((draft: NetworkRequests<WebSocketRequest>) => {
|
@@ -205,7 +199,7 @@ export default function useNetworkInterceptor({ autoEnabled }: NetworkIntercepto
|
|
205
199
|
});
|
206
200
|
};
|
207
201
|
|
208
|
-
const onErrorCallback:
|
202
|
+
const onErrorCallback: WebSocketHandlers['onError'] = (socketId, data) => {
|
209
203
|
if (typeof socketId !== 'number') return;
|
210
204
|
|
211
205
|
setNetworkRequests((draft: NetworkRequests<WebSocketRequest>) => {
|
@@ -215,7 +209,7 @@ export default function useNetworkInterceptor({ autoEnabled }: NetworkIntercepto
|
|
215
209
|
});
|
216
210
|
};
|
217
211
|
|
218
|
-
const onCloseCallback:
|
212
|
+
const onCloseCallback: WebSocketHandlers['onClose'] = (socketId, data) => {
|
219
213
|
if (typeof socketId !== 'number') return;
|
220
214
|
|
221
215
|
setNetworkRequests((draft: NetworkRequests<WebSocketRequest>) => {
|
@@ -225,14 +219,14 @@ export default function useNetworkInterceptor({ autoEnabled }: NetworkIntercepto
|
|
225
219
|
});
|
226
220
|
};
|
227
221
|
|
228
|
-
|
229
|
-
.
|
230
|
-
.
|
231
|
-
.
|
232
|
-
.
|
233
|
-
.
|
234
|
-
.
|
235
|
-
.
|
222
|
+
webSocketInterceptor
|
223
|
+
.set('connect', connectCallback)
|
224
|
+
.set('send', sendCallback)
|
225
|
+
.set('close', closeCallback)
|
226
|
+
.set('onOpen', onOpenCallback)
|
227
|
+
.set('onMessage', onMessageCallback)
|
228
|
+
.set('onError', onErrorCallback)
|
229
|
+
.set('onClose', onCloseCallback)
|
236
230
|
.enableInterception();
|
237
231
|
}, [setNetworkRequests]);
|
238
232
|
|
@@ -241,22 +235,25 @@ export default function useNetworkInterceptor({ autoEnabled }: NetworkIntercepto
|
|
241
235
|
|
242
236
|
enableHttpInterceptions();
|
243
237
|
enableWebSocketInterception();
|
238
|
+
|
244
239
|
setIsInterceptorEnabled(true);
|
245
240
|
}, [enableHttpInterceptions, enableWebSocketInterception]);
|
246
241
|
|
247
242
|
const disableInterception = useCallback(() => {
|
248
243
|
if (!isEnabled()) return;
|
249
244
|
|
250
|
-
|
251
|
-
|
252
|
-
|
245
|
+
xhrInterceptor.disableInterception();
|
246
|
+
fetchInterceptor.disableInterception();
|
247
|
+
webSocketInterceptor.disableInterception();
|
248
|
+
|
253
249
|
setIsInterceptorEnabled(false);
|
254
250
|
}, []);
|
255
251
|
|
256
252
|
useEffect(() => {
|
257
|
-
if (autoEnabled)
|
258
|
-
|
259
|
-
|
253
|
+
if (autoEnabled) {
|
254
|
+
enableInterception();
|
255
|
+
return disableInterception;
|
256
|
+
}
|
260
257
|
}, [autoEnabled, disableInterception, enableInterception]);
|
261
258
|
|
262
259
|
return {
|
@@ -1,4 +1,6 @@
|
|
1
1
|
/* eslint-disable no-console */
|
2
|
+
import type { ConsoleHandlers } from '../types';
|
3
|
+
import { frozen, singleton } from '../core/utils';
|
2
4
|
import Interceptor from './Interceptor';
|
3
5
|
|
4
6
|
const originalConsoleError = console.error;
|
@@ -12,24 +14,17 @@ const originalConsoleGroupCollapsed = console.groupCollapsed;
|
|
12
14
|
const originalConsoleGroupEnd = console.groupEnd;
|
13
15
|
const originalConsoleGroup = console.group;
|
14
16
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
}
|
21
|
-
|
22
|
-
private callback: ((type: string, args: any[]) => void) | null = null;
|
23
|
-
|
24
|
-
setCallback(callback: typeof this.callback) {
|
25
|
-
this.callback = callback;
|
26
|
-
return this;
|
27
|
-
}
|
17
|
+
@singleton
|
18
|
+
export default class ConsoleInterceptor extends Interceptor<ConsoleHandlers> {
|
19
|
+
protected readonly handlers: ConsoleHandlers = {
|
20
|
+
callback: null,
|
21
|
+
};
|
28
22
|
|
23
|
+
@frozen
|
29
24
|
enableInterception(): void {
|
30
25
|
if (this.isInterceptorEnabled) return;
|
31
26
|
|
32
|
-
const callback = this.callback
|
27
|
+
const callback = this.handlers.callback;
|
33
28
|
|
34
29
|
console.error = function (...args) {
|
35
30
|
callback?.('error', args);
|
@@ -94,6 +89,7 @@ export default class ConsoleInterceptor extends Interceptor {
|
|
94
89
|
this.isInterceptorEnabled = true;
|
95
90
|
}
|
96
91
|
|
92
|
+
@frozen
|
97
93
|
disableInterception(): void {
|
98
94
|
if (!this.isInterceptorEnabled) return;
|
99
95
|
|
@@ -110,6 +106,6 @@ export default class ConsoleInterceptor extends Interceptor {
|
|
110
106
|
console.groupEnd = originalConsoleGroupEnd;
|
111
107
|
console.group = originalConsoleGroup;
|
112
108
|
|
113
|
-
this.callback = null;
|
109
|
+
this.handlers.callback = null;
|
114
110
|
}
|
115
111
|
}
|
@@ -1,17 +1,19 @@
|
|
1
|
-
import { NETWORK_REQUEST_HEADER } from '../constants';
|
1
|
+
import { NETWORK_REQUEST_HEADER } from '../core/constants';
|
2
|
+
import {
|
3
|
+
formatRequestMethod,
|
4
|
+
frozen,
|
5
|
+
getHttpInterceptorId,
|
6
|
+
keyValueToString,
|
7
|
+
singleton,
|
8
|
+
} from '../core/utils';
|
2
9
|
import { NetworkType } from '../types';
|
3
|
-
import { formatRequestMethod, getHttpInterceptorId, keyValueToString } from '../utils';
|
4
10
|
import HttpInterceptor from './HttpInterceptor';
|
5
11
|
|
6
12
|
const originalFetch = global.fetch;
|
7
13
|
|
14
|
+
@singleton
|
8
15
|
export default class FetchInterceptor extends HttpInterceptor {
|
9
|
-
|
10
|
-
|
11
|
-
private constructor() {
|
12
|
-
super();
|
13
|
-
}
|
14
|
-
|
16
|
+
@frozen
|
15
17
|
enableInterception() {
|
16
18
|
if (this.isInterceptorEnabled) return;
|
17
19
|
|
@@ -36,7 +38,6 @@ export default class FetchInterceptor extends HttpInterceptor {
|
|
36
38
|
const method = formatRequestMethod(init?.method);
|
37
39
|
|
38
40
|
let url: string;
|
39
|
-
|
40
41
|
switch (true) {
|
41
42
|
case input instanceof Request:
|
42
43
|
url = input.url;
|
@@ -76,13 +77,13 @@ export default class FetchInterceptor extends HttpInterceptor {
|
|
76
77
|
//#endregion
|
77
78
|
|
78
79
|
//#region send
|
79
|
-
const
|
80
|
+
const startTime = Date.now();
|
80
81
|
sendCallback?.(interceptionId, init?.body ?? null);
|
81
82
|
//#endregion
|
82
83
|
|
83
84
|
const response = await originalFetch.call(this, input, requestInit);
|
84
85
|
|
85
|
-
const
|
86
|
+
const endTime = Date.now();
|
86
87
|
const clonedResponse = response.clone();
|
87
88
|
const clonedResponseHeaders = clonedResponse.headers;
|
88
89
|
|
@@ -90,13 +91,10 @@ export default class FetchInterceptor extends HttpInterceptor {
|
|
90
91
|
const contentTypeString = clonedResponseHeaders.get('Content-Type');
|
91
92
|
const contentLengthString = clonedResponseHeaders.get('Content-Length');
|
92
93
|
|
93
|
-
|
94
|
-
|
95
|
-
let responseHeaders: string = '';
|
96
|
-
|
97
|
-
if (contentTypeString) responseContentType = contentTypeString.split(';')[0];
|
94
|
+
const responseContentType = contentTypeString ? contentTypeString.split(';')[0] : undefined;
|
95
|
+
const responseSize = contentLengthString ? parseInt(contentLengthString, 10) : undefined;
|
98
96
|
|
99
|
-
|
97
|
+
let responseHeaders: string = '';
|
100
98
|
|
101
99
|
for (const [headerKey, headerValue] of clonedResponseHeaders.entries()) {
|
102
100
|
responseHeaders += keyValueToString(headerKey, headerValue);
|
@@ -107,7 +105,7 @@ export default class FetchInterceptor extends HttpInterceptor {
|
|
107
105
|
|
108
106
|
//#region response
|
109
107
|
const responseBody: string | null = await clonedResponse.text().catch(() => null);
|
110
|
-
const duration =
|
108
|
+
const duration = endTime - startTime;
|
111
109
|
|
112
110
|
responseCallback?.(
|
113
111
|
interceptionId,
|
@@ -126,6 +124,7 @@ export default class FetchInterceptor extends HttpInterceptor {
|
|
126
124
|
this.isInterceptorEnabled = true;
|
127
125
|
}
|
128
126
|
|
127
|
+
@frozen
|
129
128
|
disableInterception() {
|
130
129
|
if (!this.isInterceptorEnabled) return;
|
131
130
|
|
@@ -1,65 +1,12 @@
|
|
1
|
-
import type {
|
2
|
-
HttpHeaderReceivedCallback,
|
3
|
-
HttpOpenCallback,
|
4
|
-
HttpRequestHeaderCallback,
|
5
|
-
HttpResponseCallback,
|
6
|
-
HttpSendCallback,
|
7
|
-
} from '../types';
|
1
|
+
import type { HttpHandlers } from '../types';
|
8
2
|
import { NetworkInterceptor } from './NetworkInterceptor';
|
9
3
|
|
10
|
-
export default abstract class HttpInterceptor extends NetworkInterceptor {
|
11
|
-
protected
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
this.openCallback = callback;
|
19
|
-
return this;
|
20
|
-
}
|
21
|
-
|
22
|
-
setRequestHeaderCallback(callback: typeof this.requestHeaderCallback) {
|
23
|
-
this.requestHeaderCallback = callback;
|
24
|
-
return this;
|
25
|
-
}
|
26
|
-
|
27
|
-
setSendCallback(callback: typeof this.sendCallback) {
|
28
|
-
this.sendCallback = callback;
|
29
|
-
return this;
|
30
|
-
}
|
31
|
-
|
32
|
-
setHeaderReceivedCallback(callback: typeof this.headerReceivedCallback) {
|
33
|
-
this.headerReceivedCallback = callback;
|
34
|
-
return this;
|
35
|
-
}
|
36
|
-
|
37
|
-
setResponseCallback(callback: typeof this.responseCallback) {
|
38
|
-
this.responseCallback = callback;
|
39
|
-
return this;
|
40
|
-
}
|
41
|
-
|
42
|
-
protected getCallbacks() {
|
43
|
-
const openCallback = this.openCallback?.bind(this);
|
44
|
-
const requestHeaderCallback = this.requestHeaderCallback?.bind(this);
|
45
|
-
const sendCallback = this.sendCallback?.bind(this);
|
46
|
-
const headerReceivedCallback = this.headerReceivedCallback?.bind(this);
|
47
|
-
const responseCallback = this.responseCallback?.bind(this);
|
48
|
-
|
49
|
-
return {
|
50
|
-
openCallback,
|
51
|
-
requestHeaderCallback,
|
52
|
-
sendCallback,
|
53
|
-
headerReceivedCallback,
|
54
|
-
responseCallback,
|
55
|
-
};
|
56
|
-
}
|
57
|
-
|
58
|
-
protected clearCallbacks(): void {
|
59
|
-
this.openCallback = null;
|
60
|
-
this.requestHeaderCallback = null;
|
61
|
-
this.sendCallback = null;
|
62
|
-
this.headerReceivedCallback = null;
|
63
|
-
this.responseCallback = null;
|
64
|
-
}
|
4
|
+
export default abstract class HttpInterceptor extends NetworkInterceptor<HttpHandlers> {
|
5
|
+
protected handlers: HttpHandlers = {
|
6
|
+
open: null,
|
7
|
+
requestHeader: null,
|
8
|
+
send: null,
|
9
|
+
headerReceived: null,
|
10
|
+
response: null,
|
11
|
+
};
|
65
12
|
}
|
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
import { frozen } from '../core/utils';
|
2
|
+
|
3
|
+
export default abstract class Interceptor<T extends Object> {
|
2
4
|
#isInterceptorEnabled = false;
|
3
5
|
|
4
6
|
get isInterceptorEnabled() {
|
@@ -9,6 +11,14 @@ export default abstract class Interceptor {
|
|
9
11
|
this.#isInterceptorEnabled = value;
|
10
12
|
}
|
11
13
|
|
14
|
+
protected abstract handlers: T;
|
15
|
+
|
16
|
+
@frozen
|
17
|
+
set<K extends keyof T>(key: K, handler: T[K]) {
|
18
|
+
this.handlers[key] ??= handler;
|
19
|
+
return this;
|
20
|
+
}
|
21
|
+
|
12
22
|
abstract enableInterception(): void;
|
13
23
|
abstract disableInterception(): void;
|
14
24
|
}
|
@@ -1,6 +1,21 @@
|
|
1
1
|
import Interceptor from './Interceptor';
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
type Callbacks<T> = { [K in keyof T as `${string & K}Callback`]: T[K] };
|
4
|
+
|
5
|
+
export abstract class NetworkInterceptor<T extends Object> extends Interceptor<T> {
|
6
|
+
protected getCallbacks(): Callbacks<T> {
|
7
|
+
const callbacks = {} as Callbacks<T>;
|
8
|
+
|
9
|
+
for (const key in this.handlers) {
|
10
|
+
(callbacks as any)[`${key}Callback`] = this.handlers[key as keyof T];
|
11
|
+
}
|
12
|
+
|
13
|
+
return callbacks;
|
14
|
+
}
|
15
|
+
|
16
|
+
protected clearCallbacks(): void {
|
17
|
+
for (const key in this.handlers) {
|
18
|
+
(this.handlers as any)[key] = null;
|
19
|
+
}
|
20
|
+
}
|
6
21
|
}
|