11import type { AxiosError , AxiosResponse } from 'axios' ;
22
3- import type { NetworkError } from '../types/api/error' ;
3+ import type { IResponseError , NetworkError } from '../types/api/error' ;
4+ import type { TIssueMessage } from '../types/api/operations' ;
5+ import type { IssueMessage } from '../types/api/query' ;
6+
7+ export function isResponseError ( error : unknown ) : error is IResponseError {
8+ if ( ! error || typeof error !== 'object' ) {
9+ return false ;
10+ }
11+ const hasData = 'data' in error ;
12+ const hasStatus = 'status' in error && typeof error . status === 'number' ;
13+ const hasStatusText = 'statusText' in error && typeof error . statusText === 'string' ;
14+ const isCancelled = 'isCancelled' in error && typeof error . isCancelled === 'boolean' ;
15+
16+ return hasData || hasStatus || hasStatusText || isCancelled ;
17+ }
418
519export const isNetworkError = ( error : unknown ) : error is NetworkError => {
620 return Boolean (
@@ -26,24 +40,40 @@ export function isAxiosError(error: unknown): error is AxiosErrorObject {
2640 ) ;
2741}
2842
29- export function isAccessError ( error : unknown ) : error is { status : number } {
30- return Boolean (
31- error &&
32- typeof error === 'object' &&
33- 'status' in error &&
34- ( error . status === 403 || error . status === 401 ) ,
35- ) ;
43+ export function isAccessError ( error : unknown ) : error is IResponseError {
44+ return Boolean ( isResponseError ( error ) && ( error . status === 403 || error . status === 401 ) ) ;
3645}
3746
3847export function isRedirectToAuth ( error : unknown ) : error is { status : 401 ; data : { authUrl : string } } {
3948 return Boolean (
4049 isAccessError ( error ) &&
4150 error . status === 401 &&
42- 'data' in error &&
4351 error . data &&
4452 typeof error . data === 'object' &&
4553 'authUrl' in error . data &&
4654 error . data . authUrl &&
4755 typeof error . data . authUrl === 'string' ,
4856 ) ;
4957}
58+
59+ export function isResponseErrorWithIssues (
60+ error : unknown ,
61+ ) : error is IResponseError < TIssueMessage | IssueMessage > {
62+ return Boolean (
63+ isResponseError ( error ) &&
64+ error . data &&
65+ typeof error . data === 'object' &&
66+ 'issues' in error . data &&
67+ isIssuesArray ( error . data . issues ) ,
68+ ) ;
69+ }
70+
71+ export function isIssuesArray ( arr : unknown ) : arr is TIssueMessage [ ] {
72+ return Boolean ( Array . isArray ( arr ) && arr . length && arr . every ( isIssueMessage ) ) ;
73+ }
74+
75+ export function isIssueMessage ( obj : unknown ) : obj is TIssueMessage {
76+ return Boolean (
77+ obj && typeof obj === 'object' && 'message' in obj && typeof obj . message === 'string' ,
78+ ) ;
79+ }
0 commit comments