@@ -29,6 +29,10 @@ export function tsAxiosGenerateCommonFile(generateContext) {
2929 {
3030 importCollector : new JavascriptImportCollector ( ) ,
3131 typeImportCollector : new JavascriptImportCollector ( true ) ,
32+ contents :
33+ generateContext . options . generators . router ?
34+ `// @ts-nocheck\n\n`
35+ : undefined ,
3236 } ,
3337 ) ;
3438
@@ -73,6 +77,61 @@ export function tsAxiosGenerateCommonFile(generateContext) {
7377}>;
7478` ,
7579 ) ;
80+
81+ if ( generateContext . options . generators . router ) {
82+ importCollector . destructure ( "@compas/stdlib" , "AppError" ) ;
83+ importCollector . destructure ( "@compas/stdlib" , "streamToBuffer" ) ;
84+
85+ fileWrite (
86+ file ,
87+ `/**
88+ * Adds an interceptor to the provided Axios instance, wrapping any error in an AppError.
89+ * This allows directly testing against an error key or property.
90+ */
91+ export function axiosInterceptErrorAndWrapWithAppError(axiosInstance: AxiosInstance) {
92+ axiosInstance.interceptors.response.use(undefined, async (error) => {
93+ // Validator error
94+ if (AppError.instanceOf(error)) {
95+ // If it is an AppError already, it most likely is thrown by the response
96+ // validators. So we rethrow it as is.
97+ throw error;
98+ }
99+
100+ if (typeof error?.response?.data?.pipe === "function") {
101+ const buffer = await streamToBuffer(error.response.data);
102+ try {
103+ error.response.data = JSON.parse(buffer.toString("utf-8"));
104+ } catch {
105+ // Unknown error
106+ throw new AppError(
107+ \`response.error\`,
108+ error.response?.status ?? 500,
109+ {
110+ message:
111+ "Could not decode the response body for further information.",
112+ },
113+ error,
114+ );
115+ }
116+ }
117+
118+ // Server AppError
119+ const { key, info } = error.response?.data ?? {};
120+ if (typeof key === "string" && !!info && typeof info === "object") {
121+ throw new AppError(key, error.response.status, info, error);
122+ }
123+
124+ // Unknown error
125+ throw new AppError(
126+ \`response.error\`,
127+ error.response?.status ?? 500,
128+ AppError.format(error),
129+ );
130+ });
131+ }
132+ ` ,
133+ ) ;
134+ }
76135}
77136
78137/**
0 commit comments