1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | exports.generateHook = void 0;
|
4 | const utils_1 = require("./utils");
|
5 | const strings_1 = require("./strings");
|
6 | const jsdoc_1 = require("./utilities/jsdoc");
|
7 | const allowedPageParametersNames = ["page", "pageno", "pagenumber"];
|
8 | function generateHook(apis, types, config) {
|
9 | var _a, _b;
|
10 | let code = strings_1.getHooksImports({
|
11 | hasInfinity: !!((_a = config.useInfiniteQuery) === null || _a === void 0 ? void 0 : _a.length),
|
12 | });
|
13 | try {
|
14 | apis = apis.sort(({ serviceName }, { serviceName: _serviceName }) => utils_1.isAscending(serviceName, _serviceName));
|
15 | const apisCode = apis.reduce((prev, { summary, deprecated, serviceName, queryParamsTypeName, pathParams, requestBody, headerParams, isQueryParamsNullable, isHeaderParamsNullable, responses, method, queryParameters, }) => {
|
16 | var _a, _b, _c;
|
17 | const hookName = `use${utils_1.toPascalCase(serviceName)}`;
|
18 | const hasPaging = (_a = config.useInfiniteQuery) === null || _a === void 0 ? void 0 : _a.find((name) => name.toLowerCase() === serviceName.toLowerCase() ||
|
19 | name.toLowerCase() === hookName.toLowerCase());
|
20 | const isGet = hasPaging ||
|
21 | method === "get" ||
|
22 | ((_b = config.useQuery) === null || _b === void 0 ? void 0 : _b.find((name) => name.toLowerCase() === serviceName.toLowerCase() ||
|
23 | name.toLowerCase() === hookName.toLowerCase()));
|
24 | const getParamsString = (override) => ` ${pathParams.length ? `${pathParams.map(({ name }) => name)},` : ""}
|
25 | ${requestBody ? "requestBody," : ""}
|
26 | ${queryParamsTypeName
|
27 | ? hasPaging && override
|
28 | ? `{
|
29 | ..._param,
|
30 | ...queryParams,
|
31 | },`
|
32 | : "queryParams,"
|
33 | : ""}
|
34 | ${headerParams ? "headerParams," : ""}`;
|
35 | const TData = `${responses ? utils_1.getTsType(responses, config) : "any"}`;
|
36 | const TQueryFnData = `SwaggerResponse<${TData}>`;
|
37 | const TError = "RequestError | Error";
|
38 | const getQueryParamName = (name, nullable = isQueryParamsNullable, isPartial) => queryParamsTypeName
|
39 | ? `${utils_1.getParamString(name, !nullable, queryParamsTypeName, undefined, isPartial)},`
|
40 | : "";
|
41 | const TVariables = `${
|
42 | /** Path parameters */
|
43 | pathParams
|
44 | .map(({ name, required, schema, description }) => utils_1.getDefineParam(name, required, schema, config, description))
|
45 | .join(",")}${pathParams.length > 0 ? "," : ""}${
|
46 | /** Request Body */
|
47 | requestBody
|
48 | ? `${utils_1.getDefineParam("requestBody", true, requestBody, config)},`
|
49 | : ""}${
|
50 | /** Query parameters */
|
51 | getQueryParamName("queryParams")}${
|
52 | /** Header parameters */
|
53 | headerParams
|
54 | ? `${utils_1.getParamString("headerParams", !isHeaderParamsNullable, headerParams)},`
|
55 | : ""}`;
|
56 | const deps = `[${serviceName}.key,${pathParams.length ? `${pathParams.map(({ name }) => name)},` : ""}
|
57 | ${requestBody ? "requestBody," : ""}
|
58 | ${queryParamsTypeName ? "queryParams," : ""}
|
59 | ${headerParams ? "headerParams," : ""}]`;
|
60 | let result = prev +
|
61 | `
|
62 | ${jsdoc_1.getJsdoc({
|
63 | description: summary,
|
64 | deprecated: deprecated ? strings_1.DEPRECATED_WARM_MESSAGE : undefined,
|
65 | })}`;
|
66 | result += `export const ${hookName} =`;
|
67 | if (!isGet) {
|
68 | result += `<TExtra>`;
|
69 | }
|
70 | const params = [
|
71 | `${isGet ? TVariables : ""}`,
|
72 | `options?:${hasPaging
|
73 | ? `UseInfiniteQueryOptions<${TQueryFnData}, ${TError}>`
|
74 | : isGet
|
75 | ? `InternalUseQueryOptions<${TData}>`
|
76 | : `${TVariables
|
77 | ? `InternalUseMutationOptions<${TData}, {${TVariables}}, TExtra>`
|
78 | : `InternalUseMutationOptionsVoid<${TData}, TExtra>`}`},`,
|
79 | `${isGet ? `configOverride?:AxiosRequestConfig` : ""}`,
|
80 | ];
|
81 | result += ` (
|
82 | ${params.join("")}
|
83 | ) => {`;
|
84 | if (isGet) {
|
85 | result += `
|
86 | const { key, fun } = ${hookName}.info(${getParamsString()} configOverride);
|
87 | `;
|
88 | if (hasPaging) {
|
89 | result += `const {
|
90 | data: { pages } = {},
|
91 | data,
|
92 | ...rest
|
93 | } = useInfiniteQuery(
|
94 | key,
|
95 | ({ pageParam = 1 }) =>
|
96 | fun({
|
97 | ${(_c = queryParameters.find(({ name }) => allowedPageParametersNames.includes(name.toLowerCase()))) === null || _c === void 0 ? void 0 : _c.name}:pageParam,
|
98 | }),
|
99 | {
|
100 | getNextPageParam: (_lastPage, allPages) => allPages.length + 1,
|
101 | ...(options as any),
|
102 | },
|
103 | );
|
104 |
|
105 | const list = useMemo(() => paginationFlattenData(pages), [pages]);
|
106 | const total = getTotal(pages);
|
107 |
|
108 | const hasMore = useHasMore(pages, list, queryParams);
|
109 |
|
110 | return {...rest, data, list, hasMore, total}
|
111 | `;
|
112 | }
|
113 | else {
|
114 | result += `return useQuery(
|
115 | key,
|
116 | fun,
|
117 | options
|
118 | )`;
|
119 | }
|
120 | }
|
121 | else {
|
122 | result += `return useMutation((_o)=>{
|
123 | const {${getParamsString()} configOverride } = _o || {};
|
124 |
|
125 | return ${serviceName}(
|
126 | ${getParamsString()} configOverride,
|
127 | )
|
128 | },
|
129 | options
|
130 | )`;
|
131 | }
|
132 | result += `
|
133 | }
|
134 | `;
|
135 | if (isGet) {
|
136 | result += `${hookName}.info = (${params
|
137 | .filter((param) => !param.startsWith("options?:"))
|
138 | .join("")}) => {
|
139 | return {
|
140 | key: ${deps} as QueryKey,
|
141 | fun: (${hasPaging ? getQueryParamName("_param", true, true) : ""}) =>
|
142 | ${serviceName}(
|
143 | ${getParamsString(true)}
|
144 | configOverride
|
145 | ),
|
146 | };
|
147 | };`;
|
148 | result += `${hookName}.prefetch = (
|
149 | client: QueryClient,
|
150 | ${params.join("")}) => {
|
151 | const { key, fun } = ${hookName}.info(${getParamsString()} configOverride);
|
152 |
|
153 | return client.getQueryData(key)
|
154 | ? Promise.resolve()
|
155 | : client.prefetchQuery(
|
156 | key,
|
157 | ()=>fun(),
|
158 | options
|
159 | );
|
160 | }`;
|
161 | }
|
162 | return result;
|
163 | }, "");
|
164 | code +=
|
165 | types
|
166 | .sort(({ name }, { name: _name }) => utils_1.isAscending(name, _name))
|
167 | .reduce((prev, { name: _name }) => {
|
168 | const name = utils_1.getSchemaName(_name);
|
169 | if (!utils_1.isMatchWholeWord(apisCode, name)) {
|
170 | return prev;
|
171 | }
|
172 | return prev + ` ${name},`;
|
173 | }, "import {") + '} from "./types"\n';
|
174 | code += strings_1.getHooksFunctions({
|
175 | hasInfinity: !!((_b = config.useInfiniteQuery) === null || _b === void 0 ? void 0 : _b.length),
|
176 | });
|
177 | code +=
|
178 | apis.reduce((prev, { serviceName }) => {
|
179 | return prev + ` ${serviceName},`;
|
180 | }, "import {") + '} from "./services"\n';
|
181 | code += `
|
182 | type InternalMutationDefaultParams<TExtra> = {_extraVariables?:TExtra, configOverride?:AxiosRequestConfig}
|
183 | type InternalUseQueryOptions<TData> = UseQueryOptions<SwaggerResponse<TData>,RequestError | Error>;
|
184 |
|
185 | type InternalUseMutationOptions<TData, TRequest, TExtra> = UseMutationOptions<
|
186 | SwaggerResponse<TData>,
|
187 | RequestError | Error,
|
188 | TRequest & InternalMutationDefaultParams<TExtra>
|
189 | >;
|
190 |
|
191 | type InternalUseMutationOptionsVoid<
|
192 | TData,
|
193 | TExtra
|
194 | > = UseMutationOptions<
|
195 | SwaggerResponse<TData>,
|
196 | RequestError | Error,
|
197 | InternalMutationDefaultParams<TExtra> | void
|
198 | >;
|
199 | `;
|
200 | code += apisCode;
|
201 | return code;
|
202 | }
|
203 | catch (error) {
|
204 | console.error(error);
|
205 | return "";
|
206 | }
|
207 | }
|
208 | exports.generateHook = generateHook;
|
209 |
|
\ | No newline at end of file |