@povio/openapi-codegen-cli 2.0.2 → 2.0.3-rc.2
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/dist/acl.d.ts +4 -4
- package/dist/acl.mjs +8 -0
- package/dist/commands/check.command.d.ts +1 -1
- package/dist/commands/check.d.ts +1 -1
- package/dist/commands/generate.command.d.ts +1 -1
- package/dist/commands/generate.d.ts +1 -1
- package/dist/generator.d.ts +3 -3
- package/dist/generators/checkOpenAPIDoc.d.ts +3 -3
- package/dist/generators/const/acl.const.d.ts +1 -1
- package/dist/generators/const/deps.const.d.ts +1 -1
- package/dist/generators/const/endpoints.const.d.ts +1 -1
- package/dist/generators/const/openapi.const.d.ts +1 -1
- package/dist/generators/const/options.const.d.ts +1 -1
- package/dist/generators/const/queries.const.d.ts +1 -1
- package/dist/generators/const/validation.const.d.ts +1 -1
- package/dist/generators/const/zod.const.d.ts +1 -1
- package/dist/generators/core/SchemaResolver.class.d.ts +6 -6
- package/dist/generators/core/endpoints/getEndpointAcl.d.ts +3 -3
- package/dist/generators/core/endpoints/getEndpointBody.d.ts +3 -3
- package/dist/generators/core/endpoints/getEndpointParameter.d.ts +4 -4
- package/dist/generators/core/endpoints/getEndpointsFromOpenAPIDoc.d.ts +2 -2
- package/dist/generators/core/getDataFromOpenAPIDoc.d.ts +4 -4
- package/dist/generators/core/getMetadataFromOpenAPIDoc.d.ts +3 -3
- package/dist/generators/core/openapi/getOpenAPISchemaComplexity.d.ts +1 -1
- package/dist/generators/core/openapi/getOpenAPISchemaDependencyGraph.d.ts +1 -1
- package/dist/generators/core/openapi/getSchemaRefObjs.d.ts +2 -2
- package/dist/generators/core/openapi/iterateSchema.d.ts +1 -1
- package/dist/generators/core/resolveConfig.d.ts +1 -1
- package/dist/generators/core/zod/ZodSchema.class.d.ts +4 -4
- package/dist/generators/core/zod/enumExtraction/resolveExtractedEnumZodSchemaNames.d.ts +1 -1
- package/dist/generators/core/zod/enumExtraction/resolveExtractedEnumZodSchemaTags.d.ts +1 -1
- package/dist/generators/core/zod/enumExtraction/updateExtractedEnumZodSchemaData.d.ts +2 -2
- package/dist/generators/core/zod/getZodChain.d.ts +3 -3
- package/dist/generators/core/zod/getZodSchema.d.ts +3 -3
- package/dist/generators/core/zod/getZodSchemaRefs.d.ts +2 -2
- package/dist/generators/core/zod/getZodSchemasFromOpenAPIDoc.d.ts +1 -1
- package/dist/generators/core/zod/resolveZodSchemaName.d.ts +3 -3
- package/dist/generators/core/zod/sortZodSchemasByTopology.d.ts +1 -1
- package/dist/generators/generate/generateAcl.d.ts +1 -1
- package/dist/generators/generate/generateAclCheck.d.ts +1 -1
- package/dist/generators/generate/generateAppRestClient.d.ts +1 -1
- package/dist/generators/generate/generateConfigs.d.ts +1 -1
- package/dist/generators/generate/generateEndpoints.d.ts +1 -1
- package/dist/generators/generate/generateModels.d.ts +1 -1
- package/dist/generators/generate/generateQueries.d.ts +1 -1
- package/dist/generators/generate/generateQueryModules.d.ts +1 -1
- package/dist/generators/generate/generateZodExtended.d.ts +1 -1
- package/dist/generators/generateCodeFromOpenAPIDoc.d.ts +3 -3
- package/dist/generators/types/config.d.ts +1 -1
- package/dist/generators/types/endpoint.d.ts +2 -2
- package/dist/generators/types/generate.d.ts +3 -3
- package/dist/generators/types/metadata.d.ts +2 -2
- package/dist/generators/types/openapi.d.ts +1 -1
- package/dist/generators/types/options.d.ts +1 -1
- package/dist/generators/utils/endpoint.utils.d.ts +2 -2
- package/dist/generators/utils/file.utils.d.ts +1 -1
- package/dist/generators/utils/generate/generate.acl.utils.d.ts +4 -4
- package/dist/generators/utils/generate/generate.configs.utils.d.ts +5 -5
- package/dist/generators/utils/generate/generate.endpoints.utils.d.ts +7 -7
- package/dist/generators/utils/generate/generate.imports.utils.d.ts +4 -4
- package/dist/generators/utils/generate/generate.openapi.utils.d.ts +1 -1
- package/dist/generators/utils/generate/generate.query.utils.d.ts +2 -2
- package/dist/generators/utils/generate/generate.utils.d.ts +2 -2
- package/dist/generators/utils/generate/generate.zod.utils.d.ts +4 -4
- package/dist/generators/utils/generate-files.utils.d.ts +2 -2
- package/dist/generators/utils/hbs/hbs-template.utils.d.ts +1 -1
- package/dist/generators/utils/hbs/hbs.acl.utils.d.ts +1 -1
- package/dist/generators/utils/hbs/hbs.endpoints.utils.d.ts +1 -1
- package/dist/generators/utils/hbs/hbs.partials.utils.d.ts +1 -1
- package/dist/generators/utils/hbs/hbs.query.utils.d.ts +1 -1
- package/dist/generators/utils/hbs/hbs.zod.utils.d.ts +1 -1
- package/dist/generators/utils/namespace.utils.d.ts +2 -2
- package/dist/generators/utils/object.utils.d.ts +2 -2
- package/dist/generators/utils/openapi-schema.utils.d.ts +1 -1
- package/dist/generators/utils/openapi.utils.d.ts +2 -2
- package/dist/generators/utils/operation.utils.d.ts +3 -3
- package/dist/generators/utils/query.utils.d.ts +3 -3
- package/dist/generators/utils/sort.utils.d.ts +1 -1
- package/dist/generators/utils/tag.utils.d.ts +3 -3
- package/dist/generators/utils/ts.utils.d.ts +4 -4
- package/dist/generators/utils/validation.utils.d.ts +4 -4
- package/dist/helpers/config.helper.d.ts +1 -1
- package/dist/helpers/yargs.helper.d.ts +1 -2
- package/dist/index.d.ts +14 -16
- package/dist/index.mjs +23 -0
- package/dist/lib/acl/AclGuard.d.ts +3 -3
- package/dist/lib/acl/AclGuard.mjs +14 -0
- package/dist/lib/acl/Can.d.ts +3 -3
- package/dist/lib/acl/Can.mjs +11 -0
- package/dist/lib/acl/ability.context.d.ts +4 -4
- package/dist/lib/acl/ability.context.mjs +37 -0
- package/dist/lib/acl/appAbility.types.d.ts +1 -1
- package/dist/lib/assets/locales/en/translation.json.mjs +8 -0
- package/dist/lib/assets/locales/sl/translation.json.mjs +8 -0
- package/dist/lib/auth/AuthGuard.d.ts +2 -2
- package/dist/lib/auth/AuthGuard.mjs +26 -0
- package/dist/lib/auth/auth.context.d.ts +1 -1
- package/dist/lib/auth/auth.context.mjs +41 -0
- package/dist/lib/config/i18n.d.ts +1 -1
- package/dist/lib/config/i18n.mjs +31 -0
- package/dist/lib/config/queryConfig.context.mjs +17 -0
- package/dist/lib/config/router.context.d.ts +1 -1
- package/dist/lib/config/router.context.mjs +20 -0
- package/dist/lib/react-query.types.d.ts +2 -2
- package/dist/lib/rest/error-handling.d.ts +1 -1
- package/dist/lib/rest/error-handling.mjs +129 -0
- package/dist/lib/rest/rest-client.d.ts +4 -4
- package/dist/lib/rest/rest-client.mjs +62 -0
- package/dist/lib/rest/rest-client.types.d.ts +4 -4
- package/dist/lib/rest/rest-interceptor.d.ts +1 -1
- package/dist/lib/rest/rest-interceptor.mjs +21 -0
- package/dist/lib/rest/rest.utils.d.ts +1 -1
- package/dist/lib/rest/rest.utils.mjs +51 -0
- package/dist/sh.js +178 -182
- package/package.json +12 -9
- package/dist/acl.js +0 -1
- package/dist/helpers/chalk.helper.d.ts +0 -1
- package/dist/index.js +0 -3
- package/dist/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { isAxiosError, isCancel } from "axios";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { defaultT } from "../config/i18n.mjs";
|
|
4
|
+
import { RestUtils } from "./rest.utils.mjs";
|
|
5
|
+
class ApplicationException extends Error {
|
|
6
|
+
code;
|
|
7
|
+
serverMessage = null;
|
|
8
|
+
constructor(message, code, serverMessage) {
|
|
9
|
+
super(message);
|
|
10
|
+
this.code = code;
|
|
11
|
+
this.serverMessage = serverMessage;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
class ErrorHandler {
|
|
15
|
+
entries = [];
|
|
16
|
+
t;
|
|
17
|
+
onRethrowError;
|
|
18
|
+
constructor({ entries, t = defaultT, onRethrowError }) {
|
|
19
|
+
this.t = t;
|
|
20
|
+
this.onRethrowError = onRethrowError;
|
|
21
|
+
const dataValidationError = {
|
|
22
|
+
code: "DATA_VALIDATION_ERROR",
|
|
23
|
+
condition: (e) => {
|
|
24
|
+
return e instanceof z.ZodError;
|
|
25
|
+
},
|
|
26
|
+
getMessage: () => this.t("openapi.sharedErrors.dataValidation")
|
|
27
|
+
};
|
|
28
|
+
const internalError = {
|
|
29
|
+
code: "INTERNAL_ERROR",
|
|
30
|
+
condition: (e) => {
|
|
31
|
+
if (isAxiosError(e)) {
|
|
32
|
+
return e.response?.status != null && e.response.status >= 500 && e.response.status < 600;
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
},
|
|
36
|
+
getMessage: () => this.t("openapi.sharedErrors.internalError")
|
|
37
|
+
};
|
|
38
|
+
const networkError = {
|
|
39
|
+
code: "NETWORK_ERROR",
|
|
40
|
+
condition: (e) => {
|
|
41
|
+
if (isAxiosError(e)) {
|
|
42
|
+
return e.code === "ERR_NETWORK";
|
|
43
|
+
}
|
|
44
|
+
return false;
|
|
45
|
+
},
|
|
46
|
+
getMessage: () => this.t("openapi.sharedErrors.networkError")
|
|
47
|
+
};
|
|
48
|
+
const canceledError = {
|
|
49
|
+
code: "CANCELED_ERROR",
|
|
50
|
+
condition: (e) => {
|
|
51
|
+
if (isCancel(e)) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
if (isAxiosError(e) && e.code === "ECONNABORTED") {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
return false;
|
|
58
|
+
},
|
|
59
|
+
getMessage: () => this.t("openapi.sharedErrors.canceledError")
|
|
60
|
+
};
|
|
61
|
+
const unknownError = {
|
|
62
|
+
code: "UNKNOWN_ERROR",
|
|
63
|
+
condition: () => true,
|
|
64
|
+
getMessage: (_, e) => {
|
|
65
|
+
const code = RestUtils.extractServerResponseCode(e);
|
|
66
|
+
const serverMessage = RestUtils.extractServerErrorMessage(e);
|
|
67
|
+
if (code) {
|
|
68
|
+
let message = `Unknown error, message from server: ${code}`;
|
|
69
|
+
if (serverMessage) {
|
|
70
|
+
message += ` ${serverMessage}`;
|
|
71
|
+
}
|
|
72
|
+
return message;
|
|
73
|
+
}
|
|
74
|
+
return this.t("openapi.sharedErrors.unknownError");
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
this.entries = [...entries, dataValidationError, internalError, networkError, canceledError, unknownError];
|
|
78
|
+
}
|
|
79
|
+
matchesEntry(error, entry, code) {
|
|
80
|
+
if (entry.condition) {
|
|
81
|
+
return entry.condition(error);
|
|
82
|
+
}
|
|
83
|
+
return code === entry.code;
|
|
84
|
+
}
|
|
85
|
+
setTranslateFunction(t) {
|
|
86
|
+
this.t = t;
|
|
87
|
+
}
|
|
88
|
+
rethrowError(error) {
|
|
89
|
+
const code = RestUtils.extractServerResponseCode(error);
|
|
90
|
+
const errorEntry = this.entries.find((entry) => this.matchesEntry(error, entry, code));
|
|
91
|
+
const serverMessage = RestUtils.extractServerErrorMessage(error);
|
|
92
|
+
const exception = new ApplicationException(errorEntry.getMessage(this.t, error), errorEntry.code, serverMessage);
|
|
93
|
+
this.onRethrowError?.(error, exception);
|
|
94
|
+
throw exception;
|
|
95
|
+
}
|
|
96
|
+
getError(error) {
|
|
97
|
+
if (error instanceof ApplicationException) {
|
|
98
|
+
return error;
|
|
99
|
+
}
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
getErrorCode(error) {
|
|
103
|
+
if (error instanceof ApplicationException) {
|
|
104
|
+
return error.code;
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
static getErrorMessage(error, fallbackToUnknown = true) {
|
|
109
|
+
if (typeof error === "string") {
|
|
110
|
+
return error;
|
|
111
|
+
}
|
|
112
|
+
if (error instanceof Error) {
|
|
113
|
+
return error.message;
|
|
114
|
+
}
|
|
115
|
+
if (error instanceof ApplicationException) {
|
|
116
|
+
return error.message;
|
|
117
|
+
}
|
|
118
|
+
if (fallbackToUnknown) {
|
|
119
|
+
return defaultT("openapi.sharedErrors.unknownError");
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
const SharedErrorHandler = new ErrorHandler({ entries: [] });
|
|
125
|
+
export {
|
|
126
|
+
ApplicationException,
|
|
127
|
+
ErrorHandler,
|
|
128
|
+
SharedErrorHandler
|
|
129
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { AxiosRequestConfig, CreateAxiosDefaults } from
|
|
2
|
-
import { ErrorHandler, GeneralErrorCodes } from
|
|
3
|
-
import { RestClient as IRestClient, RequestConfig, RequestInfo, Response } from
|
|
4
|
-
import { RestInterceptor } from
|
|
1
|
+
import { AxiosRequestConfig, CreateAxiosDefaults } from 'axios';
|
|
2
|
+
import { ErrorHandler, GeneralErrorCodes } from './error-handling';
|
|
3
|
+
import { RestClient as IRestClient, RequestConfig, RequestInfo, Response } from './rest-client.types';
|
|
4
|
+
import { RestInterceptor } from './rest-interceptor';
|
|
5
5
|
export declare class RestClient implements IRestClient {
|
|
6
6
|
private readonly client;
|
|
7
7
|
private readonly errorHandler;
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { SharedErrorHandler } from "./error-handling.mjs";
|
|
4
|
+
class RestClient {
|
|
5
|
+
client;
|
|
6
|
+
errorHandler;
|
|
7
|
+
constructor({
|
|
8
|
+
config,
|
|
9
|
+
interceptors,
|
|
10
|
+
errorHandler
|
|
11
|
+
} = {}) {
|
|
12
|
+
this.client = axios.create(config);
|
|
13
|
+
this.errorHandler = errorHandler ?? SharedErrorHandler;
|
|
14
|
+
this.attachInterceptors(interceptors);
|
|
15
|
+
}
|
|
16
|
+
attachInterceptors(interceptors, ...args) {
|
|
17
|
+
if (interceptors != null) {
|
|
18
|
+
interceptors.forEach((interceptor) => this.attachInterceptor(interceptor, ...args));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
attachInterceptor(interceptor, ...args) {
|
|
22
|
+
interceptor.addInterceptor(this.client, ...args);
|
|
23
|
+
}
|
|
24
|
+
ejectInterceptor(interceptor) {
|
|
25
|
+
interceptor.removeInterceptor(this.client);
|
|
26
|
+
}
|
|
27
|
+
async get(requestInfo, url, requestConfig) {
|
|
28
|
+
return this.makeRequest(requestInfo, { ...requestConfig, method: "get", url });
|
|
29
|
+
}
|
|
30
|
+
async post(requestInfo, url, data, requestConfig) {
|
|
31
|
+
return this.makeRequest(requestInfo, { ...requestConfig, method: "post", url, data });
|
|
32
|
+
}
|
|
33
|
+
async patch(requestInfo, url, data, requestConfig) {
|
|
34
|
+
return this.makeRequest(requestInfo, { ...requestConfig, method: "patch", url, data });
|
|
35
|
+
}
|
|
36
|
+
async put(requestInfo, url, data, requestConfig) {
|
|
37
|
+
return this.makeRequest(requestInfo, { ...requestConfig, method: "put", url, data });
|
|
38
|
+
}
|
|
39
|
+
async delete(requestInfo, url, data, requestConfig) {
|
|
40
|
+
return this.makeRequest(requestInfo, { ...requestConfig, method: "delete", url, data });
|
|
41
|
+
}
|
|
42
|
+
async makeRequest(requestInfo, requestConfig) {
|
|
43
|
+
const errorStack = new Error().stack;
|
|
44
|
+
try {
|
|
45
|
+
const { rawResponse, ...config } = requestConfig;
|
|
46
|
+
const res = await this.client(config);
|
|
47
|
+
const resData = requestInfo.resSchema.parse(res.data);
|
|
48
|
+
return rawResponse ? { ...res, data: resData } : resData;
|
|
49
|
+
} catch (error) {
|
|
50
|
+
if (error instanceof z.ZodError) {
|
|
51
|
+
error.name = "BE Response schema mismatch - ZodError";
|
|
52
|
+
error.stack = [error.stack, ...errorStack?.split("\n").slice(2) ?? []].join("\n");
|
|
53
|
+
}
|
|
54
|
+
const errorHandler = requestInfo.errorHandler ?? this.errorHandler;
|
|
55
|
+
errorHandler.rethrowError(error);
|
|
56
|
+
throw error;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
RestClient
|
|
62
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { AxiosRequestConfig, AxiosResponse } from
|
|
2
|
-
import { z } from
|
|
3
|
-
import { ErrorHandler } from
|
|
4
|
-
import { RestInterceptor } from
|
|
1
|
+
import { AxiosRequestConfig, AxiosResponse } from 'axios';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { ErrorHandler } from './error-handling';
|
|
4
|
+
import { RestInterceptor } from './rest-interceptor';
|
|
5
5
|
export type GeneralErrorCodes = string;
|
|
6
6
|
export interface RequestInfo<ZOutput, ECodes extends string> {
|
|
7
7
|
resSchema: z.ZodType<ZOutput>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
class RestInterceptor {
|
|
2
|
+
constructor(applyInterceptor) {
|
|
3
|
+
this.applyInterceptor = applyInterceptor;
|
|
4
|
+
}
|
|
5
|
+
interceptorIdMap = [];
|
|
6
|
+
addInterceptor(client, ...args) {
|
|
7
|
+
this.removeInterceptor(client);
|
|
8
|
+
const interceptorId = this.applyInterceptor(client, ...args);
|
|
9
|
+
this.interceptorIdMap.push({ client, interceptorId });
|
|
10
|
+
}
|
|
11
|
+
removeInterceptor(client) {
|
|
12
|
+
const interceptorId = this.interceptorIdMap.find((i) => i.client === client)?.interceptorId;
|
|
13
|
+
if (interceptorId != null) {
|
|
14
|
+
client.interceptors.request.eject(interceptorId);
|
|
15
|
+
this.interceptorIdMap = this.interceptorIdMap.filter((i) => i.client !== client);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export {
|
|
20
|
+
RestInterceptor
|
|
21
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AxiosError, AxiosResponseHeaders } from
|
|
1
|
+
import { AxiosError, AxiosResponseHeaders } from 'axios';
|
|
2
2
|
export declare namespace RestUtils {
|
|
3
3
|
const extractServerResponseCode: (e: unknown) => string | null;
|
|
4
4
|
const doesServerErrorMessageContain: (e: AxiosError, text: string) => boolean;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { isAxiosError } from "axios";
|
|
3
|
+
var RestUtils;
|
|
4
|
+
((RestUtils2) => {
|
|
5
|
+
RestUtils2.extractServerResponseCode = (e) => {
|
|
6
|
+
if (e instanceof z.ZodError) {
|
|
7
|
+
return "validation-exception";
|
|
8
|
+
}
|
|
9
|
+
if (!isAxiosError(e)) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
if (!e.response) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
const data = e.response.data;
|
|
16
|
+
if (typeof data?.code === "string") {
|
|
17
|
+
return data.code;
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
|
+
};
|
|
21
|
+
RestUtils2.doesServerErrorMessageContain = (e, text) => {
|
|
22
|
+
const message = (0, RestUtils2.extractServerErrorMessage)(e);
|
|
23
|
+
if (message === null || message === void 0) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
return message.toLowerCase().includes(text.toLowerCase());
|
|
27
|
+
};
|
|
28
|
+
RestUtils2.extractServerErrorMessage = (e) => {
|
|
29
|
+
if (e instanceof z.ZodError) {
|
|
30
|
+
return e.message;
|
|
31
|
+
}
|
|
32
|
+
if (!isAxiosError(e)) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
if (!e.response) {
|
|
36
|
+
return null;
|
|
37
|
+
}
|
|
38
|
+
const data = e.response.data;
|
|
39
|
+
if (typeof data?.message === "string") {
|
|
40
|
+
return data.message;
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
};
|
|
44
|
+
RestUtils2.extractContentDispositionFilename = (headers) => {
|
|
45
|
+
const contentDisposition = headers["content-disposition"];
|
|
46
|
+
return contentDisposition ? /filename=["']?([^"';]+)/i.exec(contentDisposition)?.[1] : void 0;
|
|
47
|
+
};
|
|
48
|
+
})(RestUtils || (RestUtils = {}));
|
|
49
|
+
export {
|
|
50
|
+
RestUtils
|
|
51
|
+
};
|