@frostup/swr-request-generator
Version:
A tool for generating TypeScript code and interface from swagger by using SWR and axios as client.
54 lines (53 loc) • 3.42 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateResponseType = exports.generateHeader = exports.generateRequestArguments = exports.generateClientName = exports.generateFunctionName = exports.generateEnums = void 0;
const lodash_1 = require("lodash");
const specifications_1 = require("./specifications");
const constants_1 = require("../constants");
const formatters_1 = require("./formatters");
const generateEnums = (definitions, key) => {
if (lodash_1.isEmpty(definitions)) {
return "";
}
const enums = definitions[key];
const hasNumber = lodash_1.some(enums, (enumValue) => specifications_1.isNumber(enumValue));
const enumName = lodash_1.replace(key, constants_1.ENUM_SUFFIX, "");
return hasNumber
? `export type ${enumName} = ${enums.map((item) => JSON.stringify(item)).join("|")}`
: `export enum ${enumName} ${JSON.stringify(formatters_1.arrayToObject(enums)).replace(/:/gi, "=")}`;
};
exports.generateEnums = generateEnums;
const generateFunctionName = (method, operationId) => method === "get" ? `use${formatters_1.toCapitalCase(lodash_1.camelCase(operationId))}Request` : `${lodash_1.camelCase(operationId)}Request`;
exports.generateFunctionName = generateFunctionName;
const generateClientName = (method, responseType) => method === "get"
? `useRequest<${responseType || undefined}, IResponseError>`
: `client.request<${responseType || undefined}, AxiosResponse<${responseType || undefined}>>`;
exports.generateClientName = generateClientName;
// TODO: 1.refactor THeader logic to align with resolvedPath.xxxParams
// TODO: 2.add response type for download file
const generateRequestArguments = (resolvedPath) => {
const argumentTypes = !lodash_1.isEmpty(Object.assign(Object.assign({}, resolvedPath.TReq), resolvedPath.THeader))
? formatters_1.toTypes(Object.assign(Object.assign({}, resolvedPath.TReq), resolvedPath.THeader))
: undefined;
const requestParamList = lodash_1.compact([
...resolvedPath.pathParams,
...resolvedPath.queryParams,
...resolvedPath.bodyParams,
...resolvedPath.formDataParams,
...Object.keys(resolvedPath.THeader),
resolvedPath.requestBody,
]).map((param) => lodash_1.camelCase(param));
const requestParams = requestParamList.length === 0 ? "" : `{${requestParamList.join(",")}}:${argumentTypes}`;
return resolvedPath.method === "get"
? `${requestParams ? requestParams + ", " : ""}SWRConfig?: ISWRConfig<${resolvedPath.TResp || undefined}, IResponseError>, axiosConfig?: AxiosRequestConfig`
: `${requestParams ? requestParams + ", " : ""}axiosConfig?: AxiosRequestConfig`;
};
exports.generateRequestArguments = generateRequestArguments;
const generateHeader = (hasBody, contentTypes, operationId, header) => {
const result = lodash_1.reduce(header, (result, _, key) => result + `"${key}": ` + lodash_1.camelCase(key) + ", ", "");
const contentType = hasBody ? `"Content-Type": "${lodash_1.get(contentTypes, operationId !== null && operationId !== void 0 ? operationId : "", "application/json")}"` : "";
return `headers: { ${result}${contentType}},`;
};
exports.generateHeader = generateHeader;
const generateResponseType = (axiosHeaderConfig) => axiosHeaderConfig.includes('"Accept":') ? 'responseType: "blob",' : "";
exports.generateResponseType = generateResponseType;