@odit/swagger-axios-codegen
Advanced tools
Comparing version 0.15.0 to 1.0.0
@@ -0,0 +0,0 @@ import { IRequestMethod } from './swaggerInterfaces'; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
//# sourceMappingURL=baseInterfaces.js.map |
@@ -1,3 +0,3 @@ | ||
import { IDefinitionProperties, IDefinitionProperty } from "../swaggerInterfaces"; | ||
import { IClassDef } from "../baseInterfaces"; | ||
import { IDefinitionProperties, IDefinitionProperty } from '../swaggerInterfaces'; | ||
import { IClassDef } from '../baseInterfaces'; | ||
/** | ||
@@ -4,0 +4,0 @@ * 生成类定义 |
"use strict"; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.createDefinitionClass = void 0; | ||
const propTrueType_1 = require("./propTrueType"); | ||
const pascalcase_1 = __importDefault(require("pascalcase")); | ||
const scule_1 = require("scule"); | ||
const utils_1 = require("../utils"); | ||
@@ -27,5 +24,6 @@ /** | ||
if (isEnum) { | ||
let enumName = `Enum${className}${(0, pascalcase_1.default)(k)}`; | ||
let enumName = `Enum${className}${(0, scule_1.pascalCase)(k)}`; | ||
enums.push({ | ||
name: enumName, text: `export enum ${enumName}{ | ||
name: enumName, | ||
text: `export enum ${enumName}{ | ||
${propType} | ||
@@ -38,5 +36,6 @@ }` | ||
if (isType) { | ||
let typeName = `I${className}${(0, pascalcase_1.default)(k)}`; | ||
let typeName = `I${className}${(0, scule_1.pascalCase)(k)}`; | ||
enums.push({ | ||
name: typeName, text: `type ${typeName} = ${propType};` | ||
name: typeName, | ||
text: `type ${typeName} = ${propType};` | ||
}); | ||
@@ -47,3 +46,3 @@ propType = isArray ? typeName + '[]' : typeName; | ||
if (isUnionType) { | ||
let typeName = `All${(0, pascalcase_1.default)(k)}Types`; | ||
let typeName = `All${(0, scule_1.pascalCase)(k)}Types`; | ||
let types = propType.split(','); | ||
@@ -59,3 +58,3 @@ enums.push({ | ||
if (isCombinedType) { | ||
let typeName = `Combined${(0, pascalcase_1.default)(k)}Types`; | ||
let typeName = `Combined${(0, scule_1.pascalCase)(k)}Types`; | ||
let types = propType.split(','); | ||
@@ -76,3 +75,11 @@ enums.push({ | ||
// propsStr += classPropsTemplate(k, propType, v.description) | ||
model.props.push({ name: k, type: propType, format: v.format, desc: (_a = v.description) === null || _a === void 0 ? void 0 : _a.replace(/\//g, '\\/'), isType, isEnum, validationModel }); | ||
model.props.push({ | ||
name: k, | ||
type: propType, | ||
format: v.format, | ||
desc: (_a = v.description) === null || _a === void 0 ? void 0 : _a.replace(/\//g, '\\/'), | ||
isType, | ||
isEnum, | ||
validationModel | ||
}); | ||
} | ||
@@ -82,8 +89,8 @@ if (additionalProperties !== undefined) { | ||
switch (typeof additionalProperties) { | ||
case "boolean": | ||
case 'boolean': | ||
if (additionalProperties === false) { | ||
break; | ||
} | ||
definition = { type: "object" }; | ||
case "object": | ||
definition = { type: 'object' }; | ||
case 'object': | ||
default: | ||
@@ -95,3 +102,3 @@ let { propType, isEnum, isArray, isType, ref, isUnionType, isCombinedType } = (0, propTrueType_1.propTrueType)(definition); | ||
model.props.push({ | ||
name: "[additionalProperties: string]", | ||
name: '[additionalProperties: string]', | ||
type: propType, | ||
@@ -98,0 +105,0 @@ format: definition.format, |
@@ -1,2 +0,2 @@ | ||
import { IEnumDef } from "../baseInterfaces"; | ||
import { IEnumDef } from '../baseInterfaces'; | ||
/** | ||
@@ -3,0 +3,0 @@ * 生成类定义 |
@@ -12,7 +12,3 @@ "use strict"; | ||
const result = type === 'string' | ||
? enumArray | ||
.map(item => isNaN(item) | ||
? `'${item}'='${item}'` | ||
: `'KEY_${item}'='${item}'`) | ||
.join(',') | ||
? enumArray.map((item) => (isNaN(item) ? `'${item}'='${item}'` : `'KEY_${item}'='${item}'`)).join(',') | ||
: enumArray.join('|'); | ||
@@ -19,0 +15,0 @@ return { name: className, enumProps: result, type: type }; |
@@ -0,0 +0,0 @@ import { IComponents } from '../swaggerInterfaces'; |
@@ -37,3 +37,3 @@ "use strict"; | ||
// console.log('createDefinitionClass', enums) | ||
enums.forEach(item => { | ||
enums.forEach((item) => { | ||
// definitionModels[item.name] = { | ||
@@ -40,0 +40,0 @@ // value: item.text |
@@ -1,2 +0,2 @@ | ||
import { IDefinitionProperty } from "../swaggerInterfaces"; | ||
import { IDefinitionProperty } from '../swaggerInterfaces'; | ||
export declare function propTrueType(v: IDefinitionProperty): { | ||
@@ -3,0 +3,0 @@ propType: string; |
@@ -29,15 +29,19 @@ "use strict"; | ||
else { | ||
if (v.type === "array" && v.items.oneOf && v.items.oneOf.length > 0) { | ||
if (v.type === 'array' && v.items.oneOf && v.items.oneOf.length > 0) { | ||
result.isUnionType = true; | ||
result.propType = v.items.oneOf.map((type) => { | ||
result.propType = v.items.oneOf | ||
.map((type) => { | ||
return (0, utils_1.refClassName)(type.$ref); | ||
}).join(','); | ||
}) | ||
.join(','); | ||
} | ||
else if (v.type === "array" && v.items.allOf && v.items.allOf.length > 0) { | ||
else if (v.type === 'array' && v.items.allOf && v.items.allOf.length > 0) { | ||
result.isCombinedType = true; | ||
result.propType = v.items.allOf.map((type) => { | ||
result.propType = v.items.allOf | ||
.map((type) => { | ||
return (0, utils_1.refClassName)(type.$ref); | ||
}).join(','); | ||
}) | ||
.join(','); | ||
} | ||
else if (v.items.type === "array") { | ||
else if (v.items.type === 'array') { | ||
const currentResult = propTrueType(v.items); | ||
@@ -60,5 +64,3 @@ result = Object.assign(Object.assign({}, result), currentResult); | ||
result.propType = getEnums(v.enum) | ||
.map(item => isNaN(item) | ||
? `'${item}'='${item}'` | ||
: `'KEY_${item}'='${item}'`) | ||
.map((item) => (isNaN(item) ? `'${item}'='${item}'` : `'KEY_${item}'='${item}'`)) | ||
.join(','); | ||
@@ -68,15 +70,24 @@ } | ||
result.isType = true; | ||
result.propType = v.type === 'string' ? getEnums(v.enum).map(item => `'${item}'`).join('|') : v.enum.join('|'); | ||
result.propType = | ||
v.type === 'string' | ||
? getEnums(v.enum) | ||
.map((item) => `'${item}'`) | ||
.join('|') | ||
: v.enum.join('|'); | ||
} | ||
else if (v.oneOf && v.oneOf.length > 0) { | ||
result.isUnionType = true; | ||
result.propType = v.oneOf.map((type) => { | ||
result.propType = v.oneOf | ||
.map((type) => { | ||
return (0, utils_1.refClassName)(type.$ref); | ||
}).join(','); | ||
}) | ||
.join(','); | ||
} | ||
else if (v.allOf && v.allOf) { | ||
result.isCombinedType = true; | ||
result.propType = v.allOf.map((type) => { | ||
result.propType = v.allOf | ||
.map((type) => { | ||
return (0, utils_1.refClassName)(type.$ref); | ||
}).join(','); | ||
}) | ||
.join(','); | ||
} | ||
@@ -83,0 +94,0 @@ // 基本类型 |
"use strict"; | ||
//# sourceMappingURL=consts.js.map |
@@ -1,3 +0,3 @@ | ||
import { IDefinitionProperties } from "../swaggerInterfaces"; | ||
import { IClassDef } from "../baseInterfaces"; | ||
import { IDefinitionProperties } from '../swaggerInterfaces'; | ||
import { IClassDef } from '../baseInterfaces'; | ||
/** | ||
@@ -4,0 +4,0 @@ * 生成类定义 |
"use strict"; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.createDefinitionClass = void 0; | ||
const propTrueType_1 = require("./propTrueType"); | ||
const pascalcase_1 = __importDefault(require("pascalcase")); | ||
const scule_1 = require("scule"); | ||
const utils_1 = require("../utils"); | ||
@@ -27,5 +24,6 @@ /** | ||
if (isEnum) { | ||
let enumName = `Enum${className}${(0, pascalcase_1.default)(k)}`; | ||
let enumName = `Enum${className}${(0, scule_1.pascalCase)(k)}`; | ||
enums.push({ | ||
name: enumName, text: `export enum ${enumName}{ | ||
name: enumName, | ||
text: `export enum ${enumName}{ | ||
${propType} | ||
@@ -38,5 +36,6 @@ }` | ||
if (isType) { | ||
let typeName = `I${className}${(0, pascalcase_1.default)(k)}`; | ||
let typeName = `I${className}${(0, scule_1.pascalCase)(k)}`; | ||
enums.push({ | ||
name: typeName, text: `type ${typeName} = ${propType};` | ||
name: typeName, | ||
text: `type ${typeName} = ${propType};` | ||
}); | ||
@@ -52,3 +51,11 @@ propType = isArray ? typeName + '[]' : typeName; | ||
// propsStr += classPropsTemplate(k, propType, v.description) | ||
model.props.push({ name: k, type: propType, format: v.format, desc: (_a = v.description) === null || _a === void 0 ? void 0 : _a.replace(/\//g, '\/'), isType, isEnum, validationModel }); | ||
model.props.push({ | ||
name: k, | ||
type: propType, | ||
format: v.format, | ||
desc: (_a = v.description) === null || _a === void 0 ? void 0 : _a.replace(/\//g, '/'), | ||
isType, | ||
isEnum, | ||
validationModel | ||
}); | ||
} | ||
@@ -55,0 +62,0 @@ // : classTemplate(className, propsStr, constructorStr) |
@@ -1,2 +0,2 @@ | ||
import { IEnumDef } from "../baseInterfaces"; | ||
import { IEnumDef } from '../baseInterfaces'; | ||
/** | ||
@@ -3,0 +3,0 @@ * 生成类定义 |
@@ -12,7 +12,3 @@ "use strict"; | ||
const result = type === 'string' | ||
? enumArray | ||
.map(item => isNaN(item) | ||
? `'${item}'='${item}'` | ||
: `'KEY_${item}'='${item}'`) | ||
.join(',') | ||
? enumArray.map((item) => (isNaN(item) ? `'${item}'='${item}'` : `'KEY_${item}'='${item}'`)).join(',') | ||
: enumArray.join('|'); | ||
@@ -19,0 +15,0 @@ return { name: className, enumProps: result, type: type }; |
@@ -0,0 +0,0 @@ import { IDefinitions } from '../swaggerInterfaces'; |
@@ -33,3 +33,3 @@ "use strict"; | ||
// console.log('createDefinitionClass', enums) | ||
enums.forEach(item => { | ||
enums.forEach((item) => { | ||
// definitionModels[item.name] = { | ||
@@ -36,0 +36,0 @@ // value: item.text |
@@ -1,2 +0,2 @@ | ||
import { IDefinitionProperty } from "../swaggerInterfaces"; | ||
import { IDefinitionProperty } from '../swaggerInterfaces'; | ||
export declare function propTrueType(v: IDefinitionProperty): { | ||
@@ -3,0 +3,0 @@ propType: string; |
@@ -27,3 +27,3 @@ "use strict"; | ||
else { | ||
if (v.items.type === "array") { | ||
if (v.items.type === 'array') { | ||
const currentResult = propTrueType(v.items); | ||
@@ -46,5 +46,3 @@ result = Object.assign(Object.assign({}, result), currentResult); | ||
result.propType = getEnums(v.enum) | ||
.map(item => isNaN(item) | ||
? `'${item}'='${item}'` | ||
: `'KEY_${item}'='${item}'`) | ||
.map((item) => (isNaN(item) ? `'${item}'='${item}'` : `'KEY_${item}'='${item}'`)) | ||
.join(','); | ||
@@ -54,3 +52,8 @@ } | ||
result.isType = true; | ||
result.propType = v.type === 'string' ? getEnums(v.enum).map(item => `'${item}'`).join('|') : v.enum.join('|'); | ||
result.propType = | ||
v.type === 'string' | ||
? getEnums(v.enum) | ||
.map((item) => `'${item}'`) | ||
.join('|') | ||
: v.enum.join('|'); | ||
} | ||
@@ -57,0 +60,0 @@ // 基本类型 |
import { ISwaggerOptions } from './baseInterfaces'; | ||
/** main */ | ||
export declare function codegen(params: ISwaggerOptions): Promise<void>; |
export {}; |
@@ -32,194 +32,2 @@ "use strict"; | ||
const prettier_1 = __importDefault(require("prettier")); | ||
const pascalcase_1 = __importDefault(require("pascalcase")); | ||
const multimatch_1 = __importDefault(require("multimatch")); | ||
const template_1 = require("./templates/template"); | ||
const utils_1 = require("./utils"); | ||
// last include codegen | ||
function codegenInclude(apiSource, options, requestClass, models, enums) { | ||
let requestClasses = Object.entries(requestClass); | ||
// 接口过滤入口 | ||
let reqSource = ''; | ||
let defSource = ''; | ||
let allModel = Object.values(models); | ||
// console.log(allModel) | ||
let allEnum = Object.values(enums); | ||
let allImport = []; | ||
// 处理接口 | ||
options.include.forEach(item => { | ||
let includeClassName = ''; | ||
let includeRequests = null; | ||
if (Object.prototype.toString.call(item) === '[object String]') { | ||
includeClassName = item; | ||
} | ||
else { | ||
for (let k of Object.keys(item)) { | ||
includeClassName = k; | ||
includeRequests = item[k]; | ||
} | ||
} | ||
for (let [className, requests] of requestClasses) { | ||
if ((0, pascalcase_1.default)(includeClassName) !== className) | ||
continue; | ||
let text = ''; | ||
for (let req of requests) { | ||
const reqName = options.methodNameMode == 'operationId' ? req.operationId : req.name; | ||
if (includeRequests) { | ||
if (includeRequests.includes(reqName)) { | ||
text += (0, template_1.requestTemplate)(reqName, req.requestSchema, options); | ||
// generate ref definition model | ||
let imports = (0, utils_1.findDeepRefs)(req.requestSchema.parsedParameters.imports, allModel, allEnum); | ||
allImport = allImport.concat(imports); | ||
} | ||
} | ||
else { | ||
text += (0, template_1.requestTemplate)(reqName, req.requestSchema, options); | ||
let imports = (0, utils_1.findDeepRefs)(req.requestSchema.parsedParameters.imports, allModel, allEnum); | ||
allImport = allImport.concat(imports); | ||
} | ||
} | ||
text = (0, template_1.serviceTemplate)(className + options.serviceNameSuffix, text); | ||
reqSource += text; | ||
} | ||
}); | ||
// 处理类和枚举 | ||
allModel.forEach(item => { | ||
if (allImport.includes(item.name)) { | ||
const text = options.modelMode === 'interface' | ||
? (0, template_1.interfaceTemplate)(item.value.name, item.value.props, [], options.strictNullChecks) | ||
: (0, template_1.classTemplate)(item.value.name, item.value.props, [], options.strictNullChecks, options.useClassTransformer, options.generateValidationModel); | ||
defSource += text; | ||
} | ||
}); | ||
allEnum.forEach(item => { | ||
if (allImport.includes(item.name)) { | ||
let text = ''; | ||
if (item.value) { | ||
if (item.value.type == 'string') { | ||
text = (0, template_1.enumTemplate)(item.value.name, item.value.enumProps, options.enumNamePrefix); | ||
} | ||
else { | ||
text = (0, template_1.typeTemplate)(item.value.name, item.value.enumProps, options.enumNamePrefix); | ||
} | ||
} | ||
else { | ||
text = item.content || ''; | ||
} | ||
defSource += text; | ||
} | ||
}); | ||
apiSource += reqSource + defSource; | ||
writeFile(options.outputDir || '', options.fileName || '', format(apiSource, options)); | ||
} | ||
/** current multimatch codegen */ | ||
function codegenMultimatchInclude(apiSource, options, requestClass, models, enums) { | ||
let requestClasses = Object.entries(requestClass); | ||
// 接口过滤入口 | ||
let reqSource = ''; | ||
let defSource = ''; | ||
let allModel = Object.values(models); | ||
// console.log(allModel) | ||
let allEnum = Object.values(enums); | ||
let allImport = []; | ||
// #region 处理匹配集合 | ||
const sourceClassNames = requestClasses.map(v => { | ||
const className = v[0]; | ||
return className; | ||
}); | ||
const includeRules = {}; | ||
options.include.forEach(classNameFilter => { | ||
// *,?,**,{},!, | ||
// NOTICE: 目前要求 className 严格按照pascalcase书写 | ||
if (typeof classNameFilter === 'string') { | ||
if (includeRules[classNameFilter] === undefined) { | ||
includeRules[classNameFilter] = new Set(); | ||
} | ||
includeRules[classNameFilter].add('*'); | ||
} | ||
else { | ||
Object.keys(classNameFilter).forEach(key => { | ||
if (includeRules[key] === undefined) { | ||
includeRules[key] = new Set(); | ||
} | ||
classNameFilter[key].forEach(requestFilter => includeRules[key].add(requestFilter)); | ||
}); | ||
} | ||
}); | ||
// console.log('rules', includeRules) | ||
const matchedClassNames = (0, multimatch_1.default)(sourceClassNames, Object.keys(includeRules)); | ||
// console.log('sourceClassNames', sourceClassNames) | ||
// console.log('matchedClassNames', matchedClassNames) | ||
// {tagNames:[...requestFilters]} | ||
const requiredClassNameMap = {}; | ||
Object.keys(includeRules).forEach(classNameFilter => { | ||
// matched tagnames | ||
const requiredClassNames = (0, multimatch_1.default)(matchedClassNames, classNameFilter); | ||
requiredClassNames.forEach(className => { | ||
if (requiredClassNameMap[className] === undefined) { | ||
requiredClassNameMap[className] = new Set(); | ||
} | ||
includeRules[classNameFilter].forEach(requestFilter => requiredClassNameMap[className].add(requestFilter)); | ||
}); | ||
}); | ||
// console.log('className->requestRules', requiredClassNameMap) | ||
// #endregion | ||
// 处理接口 | ||
requestClasses.forEach(([className, requests]) => { | ||
const includeRequestsFilters = requiredClassNameMap[className]; | ||
if (includeRequestsFilters) { | ||
let text = ''; | ||
const requestKeyMap = {}; | ||
const requestKeys = requests.map(v => { | ||
const reqName = options.methodNameMode == 'operationId' ? v.operationId : v.name; | ||
requestKeyMap[reqName] = v; | ||
return reqName; | ||
}); | ||
const requsetRules = Array.from(includeRequestsFilters); | ||
const requiredRequestKeys = (0, multimatch_1.default)(requestKeys, Array.from(requsetRules)); | ||
// console.log(`${className}-methods-requsetRules`, requsetRules) | ||
// console.log(`${className}-methods-all`, requestKeys) | ||
// console.log(`${className}-methods-matched`, requiredRequestKeys) | ||
requiredRequestKeys.forEach(reqName => { | ||
const req = requestKeyMap[reqName]; | ||
text += (0, template_1.requestTemplate)(reqName, req.requestSchema, options); | ||
// generate ref definition model | ||
// console.log(`${reqName}-imports`, req.requestSchema.parsedParameters.imports) | ||
let imports = (0, utils_1.findDeepRefs)(req.requestSchema.parsedParameters.imports, allModel, allEnum); | ||
allImport = allImport.concat(imports); | ||
}); | ||
text = (0, template_1.serviceTemplate)(className + options.serviceNameSuffix, text); | ||
apiSource += text; | ||
} | ||
}); | ||
// console.log(`allModel`, Object.keys(models)) | ||
// console.log(`allImport`, allImport) | ||
// console.log(`allEnum`, Object.keys(enums)) | ||
// 处理类和枚举 | ||
allModel.forEach(item => { | ||
if (allImport.includes(item.name)) { | ||
const text = options.modelMode === 'interface' | ||
? (0, template_1.interfaceTemplate)(item.value.name, item.value.props, [], options.strictNullChecks) | ||
: (0, template_1.classTemplate)(item.value.name, item.value.props, [], options.strictNullChecks, options.useClassTransformer, options.generateValidationModel); | ||
defSource += text; | ||
} | ||
}); | ||
allEnum.forEach(item => { | ||
if (allImport.includes(item.name)) { | ||
let text = ''; | ||
if (item.value) { | ||
if (item.value.type == 'string') { | ||
text = (0, template_1.enumTemplate)(item.value.name, item.value.enumProps, options.enumNamePrefix); | ||
} | ||
else { | ||
text = (0, template_1.typeTemplate)(item.value.name, item.value.enumProps, options.enumNamePrefix); | ||
} | ||
} | ||
else { | ||
text = item.content || ''; | ||
} | ||
defSource += text; | ||
} | ||
}); | ||
apiSource += reqSource + defSource; | ||
writeFile(options.outputDir || '', options.fileName || '', format(apiSource, options)); | ||
} | ||
function writeFile(fileDir, name, data) { | ||
@@ -226,0 +34,0 @@ if (!fs.existsSync(fileDir)) { |
@@ -41,6 +41,4 @@ "use strict"; | ||
const path = __importStar(require("path")); | ||
const prettier_1 = __importDefault(require("prettier")); | ||
const prettier = __importStar(require("prettier")); | ||
const axios_1 = __importDefault(require("axios")); | ||
const pascalcase_1 = __importDefault(require("pascalcase")); | ||
const multimatch_1 = __importDefault(require("multimatch")); | ||
const template_1 = require("./templates/template"); | ||
@@ -99,3 +97,3 @@ const serviceHeader_1 = require("./templates/serviceHeader"); | ||
if (options.sharedServiceOptions) { | ||
writeFile(options.outputDir || '', 'serviceOptions.ts' || '', format(serviceHeaderSource, options)); | ||
writeFile(options.outputDir || '', 'serviceOptions.ts' || '', yield format(serviceHeaderSource, options)); | ||
apiSource += `import { IRequestOptions, IRequestConfig, getConfigs, axios } from "./serviceOptions";`; | ||
@@ -116,4 +114,4 @@ } | ||
paths = {}; | ||
Object.keys(swaggerSource.paths).forEach(path => { | ||
if (options.urlFilters.some(urlFilter => urlFilter.indexOf(path) > -1)) { | ||
Object.keys(swaggerSource.paths).forEach((path) => { | ||
if (options.urlFilters.some((urlFilter) => urlFilter.indexOf(path) > -1)) { | ||
paths[path] = swaggerSource.paths[path]; | ||
@@ -133,6 +131,6 @@ } | ||
// if (true) { | ||
Object.entries((0, requestCodegen_1.requestCodegen)(swaggerSource.paths, isV3, options)).forEach(([className, requests]) => { | ||
Object.entries((0, requestCodegen_1.requestCodegen)(swaggerSource.paths, isV3, options)).forEach(([className, requests]) => __awaiter(this, void 0, void 0, function* () { | ||
let text = ''; | ||
let allImport = []; | ||
requests.forEach(req => { | ||
requests.forEach((req) => { | ||
const reqName = options.methodNameMode == 'operationId' ? req.operationId : req.name; | ||
@@ -156,6 +154,6 @@ if ('register' === reqName) { | ||
text = (0, template_1.serviceTemplate)(className + options.serviceNameSuffix, text, uniqueImports); | ||
writeFile(options.outputDir || '', className + 'Service.ts', format(text, options)); | ||
}); | ||
writeFile(options.outputDir || '', className + 'Service.ts', yield format(text, options)); | ||
})); | ||
let defsString = ''; | ||
Object.values(models).forEach(item => { | ||
Object.values(models).forEach((item) => { | ||
const text = params.modelMode === 'interface' | ||
@@ -168,3 +166,3 @@ ? (0, template_1.interfaceTemplate)(item.value.name, item.value.props, [], params.strictNullChecks) | ||
}); | ||
Object.values(enums).forEach(item => { | ||
Object.values(enums).forEach((item) => { | ||
// const text = item.value ? enumTemplate(item.value.name, item.value.enumProps, 'Enum') : item.content || '' | ||
@@ -186,9 +184,4 @@ let text = ''; | ||
defsString = apiSource + defsString; | ||
writeFile(options.outputDir || '', 'index.defs.ts', format(defsString, options)); | ||
writeFile(options.outputDir || '', 'index.defs.ts', yield format(defsString, options)); | ||
} | ||
else if (options.include && options.include.length > 0) { | ||
// TODO: use filter plugin | ||
// codegenInclude(apiSource, options, requestClass, models, enums) | ||
codegenMultimatchInclude(apiSource, options, requestClass, models, enums); | ||
} | ||
else { | ||
@@ -209,234 +202,47 @@ codegenAll(apiSource, options, requestClass, models, enums); | ||
function codegenAll(apiSource, options, requestClass, models, enums) { | ||
let requestClasses = Object.entries(requestClass); | ||
// 常规入口 | ||
try { | ||
// 处理接口 | ||
requestClasses.forEach(([className, requests]) => { | ||
let text = ''; | ||
requests.forEach(req => { | ||
const reqName = options.methodNameMode == 'operationId' ? req.operationId : req.name; | ||
text += (0, template_1.requestTemplate)(reqName, req.requestSchema, options); | ||
return __awaiter(this, void 0, void 0, function* () { | ||
let requestClasses = Object.entries(requestClass); | ||
// 常规入口 | ||
try { | ||
// 处理接口 | ||
requestClasses.forEach(([className, requests]) => { | ||
let text = ''; | ||
requests.forEach((req) => { | ||
const reqName = options.methodNameMode == 'operationId' ? req.operationId : req.name; | ||
text += (0, template_1.requestTemplate)(reqName, req.requestSchema, options); | ||
}); | ||
text = (0, template_1.serviceTemplate)(className + options.serviceNameSuffix, text); | ||
apiSource += text; | ||
}); | ||
text = (0, template_1.serviceTemplate)(className + options.serviceNameSuffix, text); | ||
apiSource += text; | ||
}); | ||
// 处理类和枚举 | ||
Object.values(models).forEach(item => { | ||
const text = options.modelMode === 'interface' | ||
? (0, template_1.interfaceTemplate)(item.value.name, item.value.props, [], options.strictNullChecks) | ||
: (0, template_1.classTemplate)(item.value.name, item.value.props, [], options.strictNullChecks, options.useClassTransformer, options.generateValidationModel); | ||
apiSource += text; | ||
}); | ||
Object.values(enums).forEach(item => { | ||
let text = ''; | ||
if (item.value) { | ||
if (item.value.type == 'string') { | ||
text = (0, template_1.enumTemplate)(item.value.name, item.value.enumProps, options.enumNamePrefix); | ||
} | ||
else { | ||
text = (0, template_1.typeTemplate)(item.value.name, item.value.enumProps, options.enumNamePrefix); | ||
} | ||
} | ||
else { | ||
text = item.content || ''; | ||
} | ||
apiSource += text; | ||
}); | ||
// console.log(disableLint()); | ||
apiSource = (0, serviceHeader_1.disableLint)() + apiSource; | ||
writeFile(options.outputDir || '', options.fileName || '', format(apiSource, options)); | ||
} | ||
catch (error) { | ||
console.log('error', error); | ||
throw error; | ||
} | ||
} | ||
// last include codegen | ||
function codegenInclude(apiSource, options, requestClass, models, enums) { | ||
let requestClasses = Object.entries(requestClass); | ||
// 接口过滤入口 | ||
let reqSource = ''; | ||
let defSource = ''; | ||
let allModel = Object.values(models); | ||
// console.log(allModel) | ||
let allEnum = Object.values(enums); | ||
let allImport = []; | ||
// 处理接口 | ||
options.include.forEach(item => { | ||
let includeClassName = ''; | ||
let includeRequests = null; | ||
if (Object.prototype.toString.call(item) === '[object String]') { | ||
includeClassName = item; | ||
} | ||
else { | ||
for (let k of Object.keys(item)) { | ||
includeClassName = k; | ||
includeRequests = item[k]; | ||
} | ||
} | ||
for (let [className, requests] of requestClasses) { | ||
if ((0, pascalcase_1.default)(includeClassName) !== className) | ||
continue; | ||
let text = ''; | ||
for (let req of requests) { | ||
const reqName = options.methodNameMode == 'operationId' ? req.operationId : req.name; | ||
if (includeRequests) { | ||
if (includeRequests.includes(reqName)) { | ||
text += (0, template_1.requestTemplate)(reqName, req.requestSchema, options); | ||
// generate ref definition model | ||
let imports = (0, utils_1.findDeepRefs)(req.requestSchema.parsedParameters.imports, allModel, allEnum); | ||
allImport = allImport.concat(imports); | ||
// 处理类和枚举 | ||
Object.values(models).forEach((item) => { | ||
const text = options.modelMode === 'interface' | ||
? (0, template_1.interfaceTemplate)(item.value.name, item.value.props, [], options.strictNullChecks) | ||
: (0, template_1.classTemplate)(item.value.name, item.value.props, [], options.strictNullChecks, options.useClassTransformer, options.generateValidationModel); | ||
apiSource += text; | ||
}); | ||
Object.values(enums).forEach((item) => { | ||
let text = ''; | ||
if (item.value) { | ||
if (item.value.type == 'string') { | ||
text = (0, template_1.enumTemplate)(item.value.name, item.value.enumProps, options.enumNamePrefix); | ||
} | ||
else { | ||
text = (0, template_1.typeTemplate)(item.value.name, item.value.enumProps, options.enumNamePrefix); | ||
} | ||
} | ||
else { | ||
text += (0, template_1.requestTemplate)(reqName, req.requestSchema, options); | ||
let imports = (0, utils_1.findDeepRefs)(req.requestSchema.parsedParameters.imports, allModel, allEnum); | ||
allImport = allImport.concat(imports); | ||
text = item.content || ''; | ||
} | ||
} | ||
text = (0, template_1.serviceTemplate)(className + options.serviceNameSuffix, text); | ||
reqSource += text; | ||
} | ||
}); | ||
// 处理类和枚举 | ||
allModel.forEach(item => { | ||
if (allImport.includes(item.name) || options.includeTypes.includes(item.name)) { | ||
const text = options.modelMode === 'interface' | ||
? (0, template_1.interfaceTemplate)(item.value.name, item.value.props, [], options.strictNullChecks) | ||
: (0, template_1.classTemplate)(item.value.name, item.value.props, [], options.strictNullChecks, options.useClassTransformer, options.generateValidationModel); | ||
defSource += text; | ||
} | ||
}); | ||
allEnum.forEach(item => { | ||
if (allImport.includes(item.name) || options.includeTypes.includes(item.name)) { | ||
let text = ''; | ||
if (item.value) { | ||
if (item.value.type == 'string') { | ||
text = (0, template_1.enumTemplate)(item.value.name, item.value.enumProps, options.enumNamePrefix); | ||
} | ||
else { | ||
text = (0, template_1.typeTemplate)(item.value.name, item.value.enumProps, options.enumNamePrefix); | ||
} | ||
} | ||
else { | ||
text = item.content || ''; | ||
} | ||
defSource += text; | ||
} | ||
}); | ||
apiSource += reqSource + defSource; | ||
writeFile(options.outputDir || '', options.fileName || '', format(apiSource, options)); | ||
} | ||
/** current multimatch codegen */ | ||
function codegenMultimatchInclude(apiSource, options, requestClass, models, enums) { | ||
let requestClasses = Object.entries(requestClass); | ||
// 接口过滤入口 | ||
let reqSource = ''; | ||
let defSource = ''; | ||
let allModel = Object.values(models); | ||
// console.log(allModel) | ||
let allEnum = Object.values(enums); | ||
let allImport = []; | ||
// #region 处理匹配集合 | ||
const sourceClassNames = requestClasses.map(v => { | ||
const className = v[0]; | ||
return className; | ||
}); | ||
const includeRules = {}; | ||
options.include.forEach(classNameFilter => { | ||
// *,?,**,{},!, | ||
// NOTICE: 目前要求 className 严格按照pascalcase书写 | ||
if (typeof classNameFilter === 'string') { | ||
if (includeRules[classNameFilter] === undefined) { | ||
includeRules[classNameFilter] = new Set(); | ||
} | ||
includeRules[classNameFilter].add('*'); | ||
} | ||
else { | ||
Object.keys(classNameFilter).forEach(key => { | ||
if (includeRules[key] === undefined) { | ||
includeRules[key] = new Set(); | ||
} | ||
classNameFilter[key].forEach(requestFilter => includeRules[key].add(requestFilter)); | ||
apiSource += text; | ||
}); | ||
// console.log(disableLint()); | ||
apiSource = (0, serviceHeader_1.disableLint)() + apiSource; | ||
writeFile(options.outputDir || '', options.fileName || '', yield format(apiSource, options)); | ||
} | ||
}); | ||
// console.log('rules', includeRules) | ||
const matchedClassNames = (0, multimatch_1.default)(sourceClassNames, Object.keys(includeRules)); | ||
// console.log('sourceClassNames', sourceClassNames) | ||
// console.log('matchedClassNames', matchedClassNames) | ||
// {tagNames:[...requestFilters]} | ||
const requiredClassNameMap = {}; | ||
Object.keys(includeRules).forEach(classNameFilter => { | ||
// matched tagnames | ||
const requiredClassNames = (0, multimatch_1.default)(matchedClassNames, classNameFilter); | ||
requiredClassNames.forEach(className => { | ||
if (requiredClassNameMap[className] === undefined) { | ||
requiredClassNameMap[className] = new Set(); | ||
} | ||
includeRules[classNameFilter].forEach(requestFilter => requiredClassNameMap[className].add(requestFilter)); | ||
}); | ||
}); | ||
// console.log('className->requestRules', requiredClassNameMap) | ||
// #endregion | ||
// 处理接口 | ||
requestClasses.forEach(([className, requests]) => { | ||
const includeRequestsFilters = requiredClassNameMap[className]; | ||
if (includeRequestsFilters) { | ||
let text = ''; | ||
const requestKeyMap = {}; | ||
const requestKeys = requests.map(v => { | ||
const reqName = options.methodNameMode == 'operationId' ? v.operationId : v.name; | ||
requestKeyMap[reqName] = v; | ||
return reqName; | ||
}); | ||
const requsetRules = Array.from(includeRequestsFilters); | ||
const requiredRequestKeys = (0, multimatch_1.default)(requestKeys, Array.from(requsetRules)); | ||
// console.log(`${className}-methods-requsetRules`, requsetRules) | ||
// console.log(`${className}-methods-all`, requestKeys) | ||
// console.log(`${className}-methods-matched`, requiredRequestKeys) | ||
requiredRequestKeys.forEach(reqName => { | ||
const req = requestKeyMap[reqName]; | ||
text += (0, template_1.requestTemplate)(reqName, req.requestSchema, options); | ||
// generate ref definition model | ||
// console.log(`${reqName}-imports`, req.requestSchema.parsedParameters.imports) | ||
let imports = (0, utils_1.findDeepRefs)(req.requestSchema.parsedParameters.imports, allModel, allEnum); | ||
allImport = allImport.concat(imports); | ||
}); | ||
text = (0, template_1.serviceTemplate)(className + options.serviceNameSuffix, text); | ||
apiSource += text; | ||
catch (error) { | ||
console.log('error', error); | ||
throw error; | ||
} | ||
}); | ||
// console.log(`allModel`, Object.keys(models)) | ||
// console.log(`allImport`, allImport) | ||
// console.log(`allEnum`, Object.keys(enums)) | ||
// 处理类和枚举 | ||
allModel.forEach(item => { | ||
if (allImport.includes(item.name) || options.includeTypes.includes(item.name)) { | ||
const text = options.modelMode === 'interface' | ||
? (0, template_1.interfaceTemplate)(item.value.name, item.value.props, [], options.strictNullChecks) | ||
: (0, template_1.classTemplate)(item.value.name, item.value.props, [], options.strictNullChecks, options.useClassTransformer, options.generateValidationModel); | ||
defSource += text; | ||
} | ||
}); | ||
allEnum.forEach(item => { | ||
if (allImport.includes(item.name) || options.includeTypes.includes(item.name)) { | ||
let text = ''; | ||
if (item.value) { | ||
if (item.value.type == 'string') { | ||
text = (0, template_1.enumTemplate)(item.value.name, item.value.enumProps, options.enumNamePrefix); | ||
} | ||
else { | ||
text = (0, template_1.typeTemplate)(item.value.name, item.value.enumProps, options.enumNamePrefix); | ||
} | ||
} | ||
else { | ||
text = item.content || ''; | ||
} | ||
defSource += text; | ||
} | ||
}); | ||
apiSource = (0, serviceHeader_1.disableLint)() + apiSource; | ||
apiSource += reqSource + defSource; | ||
writeFile(options.outputDir || '', options.fileName || '', format(apiSource, options)); | ||
} | ||
@@ -452,18 +258,20 @@ function writeFile(fileDir, name, data) { | ||
function format(text, options) { | ||
if (options.format) { | ||
// console.log('use custom formatter') | ||
return options.format(text); | ||
} | ||
// console.log('use default formatter') | ||
return prettier_1.default.format(text, { | ||
printWidth: 120, | ||
tabWidth: 2, | ||
parser: 'typescript', | ||
trailingComma: 'none', | ||
jsxBracketSameLine: false, | ||
semi: true, | ||
singleQuote: true | ||
return __awaiter(this, void 0, void 0, function* () { | ||
if (options.format) { | ||
// console.log('use custom formatter') | ||
return options.format(text); | ||
} | ||
// console.log('use default formatter') | ||
return yield prettier.format(text, { | ||
printWidth: 120, | ||
tabWidth: 2, | ||
parser: 'typescript', | ||
trailingComma: 'none', | ||
jsxBracketSameLine: false, | ||
semi: true, | ||
singleQuote: true | ||
}); | ||
// return text | ||
}); | ||
// return text | ||
} | ||
//# sourceMappingURL=index.js.map |
import { IRequestMethod } from '../swaggerInterfaces'; | ||
export declare function getContentType(reqProps: IRequestMethod, isV3: boolean): "multipart/form-data" | "application/json"; |
@@ -0,0 +0,0 @@ "use strict"; |
@@ -1,2 +0,2 @@ | ||
import { IRequestBody } from "../swaggerInterfaces"; | ||
import { IRequestBody } from '../swaggerInterfaces'; | ||
export declare function getRequestBody(requestBody: IRequestBody): { | ||
@@ -3,0 +3,0 @@ imports: string[]; |
@@ -13,3 +13,3 @@ "use strict"; | ||
// 默认去application/json的定义,如果取不到则直接取第一个 | ||
let reqBody = requestBody.content["application/json"]; | ||
let reqBody = requestBody.content['application/json']; | ||
// console.log("reqBody 1:", !reqBody); | ||
@@ -36,6 +36,6 @@ if (!reqBody) { | ||
else if (reqBody.schema.oneOf) { | ||
bodyType = reqBody.schema.oneOf.reduce((p, c) => `${p} | ${(0, utils_1.refClassName)(c.$ref)}`, "").substring(3); | ||
bodyType = reqBody.schema.oneOf.reduce((p, c) => `${p} | ${(0, utils_1.refClassName)(c.$ref)}`, '').substring(3); | ||
} | ||
else if (reqBody.schema.anyOf) { | ||
bodyType = reqBody.schema.anyOf.reduce((p, c) => `${p} | ${(0, utils_1.refClassName)(c.$ref)}`, "").substring(3); | ||
bodyType = reqBody.schema.anyOf.reduce((p, c) => `${p} | ${(0, utils_1.refClassName)(c.$ref)}`, '').substring(3); | ||
} | ||
@@ -42,0 +42,0 @@ if (bodyType) { |
@@ -0,0 +0,0 @@ import { IParameter } from '../swaggerInterfaces'; |
"use strict"; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.getRequestParameters = void 0; | ||
const utils_1 = require("../utils"); | ||
const camelcase_1 = __importDefault(require("camelcase")); | ||
const scule_1 = require("scule"); | ||
/** | ||
@@ -16,8 +13,8 @@ * 参数去重 | ||
const uniqParams = {}; | ||
params.forEach(v => { | ||
params.forEach((v) => { | ||
// _${v.in} | ||
// TODO:同名但是v.in= query |path |body 的情况同时出现如何处理?分出不同的request参数? | ||
if ('$ref' in v && !('name' in v)) { | ||
v.name = (0, utils_1.refClassName)(v.$ref); | ||
} | ||
// if ('$ref' in v && !('name' in v)) { | ||
// v.name = refClassName(v.$ref) | ||
// } | ||
if (!v.name.includes('[0]')) { | ||
@@ -43,4 +40,4 @@ //DTO class中存在List<T>时会出现这种参数 (list[0].prop) | ||
let imports = []; | ||
let moreBodyParams = params.filter(item => item.in === 'body').length > 1; | ||
params.forEach(p => { | ||
let moreBodyParams = params.filter((item) => item.in === 'body').length > 1; | ||
params.forEach((p) => { | ||
// 根据设置跳过请求头中的参数 | ||
@@ -78,3 +75,3 @@ if (!useHeaderParameters && p.in === 'header') | ||
} | ||
const paramName = (0, camelcase_1.default)(p.name); | ||
const paramName = (0, scule_1.camelCase)(p.name); | ||
requestParameters += ` | ||
@@ -81,0 +78,0 @@ /** ${p.description || ''} */ |
@@ -0,0 +0,0 @@ import { IRequestMethod } from '../swaggerInterfaces'; |
@@ -13,3 +13,3 @@ "use strict"; | ||
// 提取Schema | ||
const successStatusCode = Object.keys(reqProps.responses).find(statusCode => statusCode.match(/20[0-4]$/)); | ||
const successStatusCode = Object.keys(reqProps.responses).find((statusCode) => statusCode.match(/20[0-4]$/)); | ||
if (!successStatusCode) { | ||
@@ -44,6 +44,6 @@ return { responseType: result, isRef }; | ||
else if (resSchema.items.oneOf) { | ||
result = resSchema.items.oneOf.reduce((p, c) => `${p} | ${(0, utils_1.refClassName)(c.$ref)} []`, "").substring(3); | ||
result = resSchema.items.oneOf.reduce((p, c) => `${p} | ${(0, utils_1.refClassName)(c.$ref)} []`, '').substring(3); | ||
} | ||
else if (resSchema.items.anyOf) { | ||
result = resSchema.items.anyOf.reduce((p, c) => `${p} | ${(0, utils_1.refClassName)(c.$ref)} []`, "").substring(3); | ||
result = resSchema.items.anyOf.reduce((p, c) => `${p} | ${(0, utils_1.refClassName)(c.$ref)} []`, '').substring(3); | ||
} | ||
@@ -61,6 +61,6 @@ else { | ||
else if (resSchema.oneOf) { | ||
result = resSchema.oneOf.reduce((p, c) => `${p} | ${(0, utils_1.refClassName)(c.$ref)}`, "").substring(3); | ||
result = resSchema.oneOf.reduce((p, c) => `${p} | ${(0, utils_1.refClassName)(c.$ref)}`, '').substring(3); | ||
} | ||
else if (resSchema.anyOf) { | ||
result = resSchema.anyOf.reduce((p, c) => `${p} | ${(0, utils_1.refClassName)(c.$ref)}`, "").substring(3); | ||
result = resSchema.anyOf.reduce((p, c) => `${p} | ${(0, utils_1.refClassName)(c.$ref)}`, '').substring(3); | ||
} | ||
@@ -67,0 +67,0 @@ else { |
@@ -0,0 +0,0 @@ import { IPaths } from '../swaggerInterfaces'; |
"use strict"; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
@@ -10,3 +7,3 @@ exports.requestCodegen = void 0; | ||
const getResponseType_1 = require("./getResponseType"); | ||
const camelcase_1 = __importDefault(require("camelcase")); | ||
const scule_1 = require("scule"); | ||
const getRequestBody_1 = require("./getRequestBody"); | ||
@@ -40,3 +37,3 @@ const getContentType_1 = require("./getContentType"); | ||
continue; | ||
const className = (0, camelcase_1.default)((0, utils_1.RemoveSpecialCharacters)(reqProps.tags[0]), { pascalCase: true }); | ||
const className = (0, scule_1.pascalCase)((0, utils_1.RemoveSpecialCharacters)(reqProps.tags[0])); | ||
if (className === '') | ||
@@ -94,5 +91,5 @@ continue; | ||
// TODO 待优化,目前简单处理同名方法 | ||
let uniqueMethodName = (0, camelcase_1.default)(methodName); | ||
let uniqueMethodName = (0, scule_1.camelCase)(methodName); | ||
var uniqueMethodNameReg = new RegExp(`^${uniqueMethodName}[0-9]*$`); | ||
const methodCount = requestClasses[className].filter(item => uniqueMethodName === item.name || uniqueMethodNameReg.test(item.name)).length; | ||
const methodCount = requestClasses[className].filter((item) => uniqueMethodName === item.name || uniqueMethodNameReg.test(item.name)).length; | ||
// console.log(uniqueMethodName, methodCount) | ||
@@ -99,0 +96,0 @@ if (methodCount >= 1) { |
import { ISchema, IParameter } from '../swaggerInterfaces'; | ||
export declare function mapFormDataToV2(schema: ISchema): IParameter[]; |
@@ -15,3 +15,3 @@ "use strict"; | ||
} | ||
return Object.keys(properties).map(p => ({ | ||
return Object.keys(properties).map((p) => ({ | ||
in: 'formData', | ||
@@ -18,0 +18,0 @@ name: p, |
@@ -40,8 +40,8 @@ export interface ISwaggerSource { | ||
export interface IResponseSchema { | ||
'$ref': string; | ||
'oneOf': IResponseSchema[]; | ||
'anyOf': IResponseSchema[]; | ||
'type'?: string; | ||
'items'?: IParameterItems; | ||
'format'?: string; | ||
$ref: string; | ||
oneOf: IResponseSchema[]; | ||
anyOf: IResponseSchema[]; | ||
type?: string; | ||
items?: IParameterItems; | ||
format?: string; | ||
} | ||
@@ -55,3 +55,3 @@ export interface IRequestBody { | ||
} | ||
export declare type IParameterIn = 'path' | 'formData' | 'query' | 'body' | 'header'; | ||
export type IParameterIn = 'path' | 'formData' | 'query' | 'body' | 'header'; | ||
export interface IParameter { | ||
@@ -113,9 +113,9 @@ in: IParameterIn; | ||
export interface ISchema { | ||
'$ref': string; | ||
'oneOf': ISchema[]; | ||
'anyOf': ISchema[]; | ||
'type'?: string; | ||
'items'?: IParameterItems; | ||
'format'?: string; | ||
'properties'?: { | ||
$ref: string; | ||
oneOf: ISchema[]; | ||
anyOf: ISchema[]; | ||
type?: string; | ||
items?: IParameterItems; | ||
format?: string; | ||
properties?: { | ||
[key: string]: IParameterItems; | ||
@@ -122,0 +122,0 @@ }; |
@@ -0,0 +0,0 @@ "use strict"; |
export declare function universalGenericTypeDefinition(): string; | ||
export declare function abpGenericTypeDefinition(): string; |
@@ -0,0 +0,0 @@ "use strict"; |
@@ -1,2 +0,2 @@ | ||
import { ISwaggerOptions } from "../baseInterfaces"; | ||
import { ISwaggerOptions } from '../baseInterfaces'; | ||
export declare function serviceHeader(options: ISwaggerOptions): string; | ||
@@ -3,0 +3,0 @@ export declare function disableLint(): string; |
@@ -33,4 +33,5 @@ "use strict"; | ||
? `import { Expose, Transform, Type, plainToClass } from 'class-transformer'; | ||
` : ''; | ||
return `/** Generate by swagger-axios-codegen */ | ||
` | ||
: ''; | ||
return `/** generated by @odit/swagger-axios-codegen */ | ||
/* eslint-disable */ | ||
@@ -67,3 +68,3 @@ // @ts-nocheck | ||
function disableLint() { | ||
return `/** Generate by swagger-axios-codegen */ | ||
return `/** generated by @odit/swagger-axios-codegen */ | ||
// @ts-nocheck | ||
@@ -76,3 +77,3 @@ /* eslint-disable */ | ||
function customerServiceHeader(options) { | ||
return `/** Generate by swagger-axios-codegen */ | ||
return `/** generated by @odit/swagger-axios-codegen */ | ||
// @ts-nocheck | ||
@@ -79,0 +80,0 @@ /* eslint-disable */ |
@@ -0,0 +0,0 @@ import { IPropDef } from '../baseInterfaces'; |
"use strict"; | ||
var __importDefault = (this && this.__importDefault) || function (mod) { | ||
return (mod && mod.__esModule) ? mod : { "default": mod }; | ||
}; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.serviceTemplate = exports.requestTemplate = exports.typeTemplate = exports.enumTemplate = exports.classConstructorTemplate = exports.classTransformTemplate = exports.classValidationModelTemplate = exports.propValidationModelTemplate = exports.classPropsTemplate = exports.classTemplate = exports.interfaceTemplate = void 0; | ||
const camelcase_1 = __importDefault(require("camelcase")); | ||
const scule_1 = require("scule"); | ||
const utils_1 = require("../utils"); | ||
const baseTypes = ['string', 'number', 'object', 'boolean', 'any']; | ||
const isAdditionalProperties = (x) => x === "[additionalProperties: string]"; | ||
const isAdditionalProperties = (x) => x === '[additionalProperties: string]'; | ||
const isNotAdditionalProperties = (x) => !isAdditionalProperties(x); | ||
@@ -20,3 +17,3 @@ /** 类模板 */ | ||
const importString = imports | ||
.map(imp => { | ||
.map((imp) => { | ||
return `import { ${imp} } from '../definitions/${imp}'\n`; | ||
@@ -30,6 +27,8 @@ }) | ||
${props.map(p => { | ||
${props | ||
.map((p) => { | ||
var _a; | ||
return classPropsTemplate(p.name, p.type, p.format, p.desc, (!strictNullChecks || !((_a = p.validationModel) === null || _a === void 0 ? void 0 : _a.required)) && !isAdditionalProperties(p.name), false, false); | ||
}).join('')} | ||
}) | ||
.join('')} | ||
} | ||
@@ -42,3 +41,3 @@ `; | ||
// 所有的引用 | ||
const mappedImports = imports.map(imp => { | ||
const mappedImports = imports.map((imp) => { | ||
return `import { ${imp} } from '../definitions/${imp}'\n`; | ||
@@ -56,3 +55,3 @@ }); | ||
${props | ||
.map(p => { | ||
.map((p) => { | ||
var _a; | ||
@@ -64,3 +63,3 @@ return classPropsTemplate(p.name, p.type, p.format, p.desc, !strictNullChecks || !((_a = p.validationModel) === null || _a === void 0 ? void 0 : _a.required), useClassTransformer, p.isEnum || p.isType); | ||
constructor(data: (undefined | any) = {}){ | ||
${props.map(p => classConstructorTemplate(p.name)).join('')} | ||
${props.map((p) => classConstructorTemplate(p.name)).join('')} | ||
} | ||
@@ -115,4 +114,4 @@ ${generateValidationModel ? classValidationModelTemplate(props) : ''} | ||
${props | ||
.filter(p => p.validationModel !== null) | ||
.map(p => propValidationModelTemplate(p.name, p.validationModel)) | ||
.filter((p) => p.validationModel !== null) | ||
.map((p) => propValidationModelTemplate(p.name, p.validationModel)) | ||
.join(',\n')} | ||
@@ -168,3 +167,3 @@ } | ||
*/ | ||
${options.useStaticMethod ? 'static' : ''} ${(0, camelcase_1.default)(name)}(${parameters}options:IRequestOptions={}):Promise<${responseType}> { | ||
${options.useStaticMethod ? 'static' : ''} ${(0, scule_1.camelCase)(name)}(${parameters}options:IRequestOptions={}):Promise<${responseType}> { | ||
return new Promise((resolve, reject) => { | ||
@@ -179,3 +178,2 @@ let url = basePath+'${path}' | ||
${requestBodyString(method, parsedParameters, bodyParameter, requestBody, contentType, formData)} | ||
@@ -190,6 +188,6 @@ | ||
if (method !== 'get') { | ||
// support for ios13 (get method does not have body) | ||
return ` | ||
let data = ${parsedParameters && bodyParameter && bodyParameter.length > 0 | ||
? | ||
bodyParameter | ||
? bodyParameter | ||
: !!requestBody | ||
@@ -201,3 +199,3 @@ ? 'params.body' | ||
} | ||
return '/** 适配ios13,get请求不允许带body */'; | ||
return ''; | ||
} | ||
@@ -204,0 +202,0 @@ /** serviceTemplate */ |
@@ -0,0 +0,0 @@ import { IDefinitionClass, IDefinitionEnum } from './baseInterfaces'; |
@@ -14,3 +14,3 @@ "use strict"; | ||
exports.isGenerics = isGenerics; | ||
const isDefinedGenericTypes = (x) => definedGenericTypes.some(i => i === x); | ||
const isDefinedGenericTypes = (x) => definedGenericTypes.some((i) => i === x); | ||
exports.isDefinedGenericTypes = isDefinedGenericTypes; | ||
@@ -46,5 +46,6 @@ function setDefinedGenericTypes(types = []) { | ||
if ((0, exports.isDefinedGenericTypes)(interfaceClassName)) { | ||
str = interfaceClassName === 'IDictionary' || interfaceClassName === 'Dictionary' | ||
? `${interfaceClassName}<object>` | ||
: `${interfaceClassName}<${refClassName(TClassName)}>`; | ||
str = | ||
interfaceClassName === 'IDictionary' || interfaceClassName === 'Dictionary' | ||
? `${interfaceClassName}<object>` | ||
: `${interfaceClassName}<${refClassName(TClassName)}>`; | ||
} | ||
@@ -195,5 +196,5 @@ else { | ||
let ref = null; | ||
ref = allDefinition.find(item => modelName === item.name); | ||
ref = allDefinition.find((item) => modelName === item.name); | ||
if (ref == null) | ||
ref = allDefinition.find(item => modelName.startsWith(item.name)); | ||
ref = allDefinition.find((item) => modelName.startsWith(item.name)); | ||
// if (modelNames.includes('AuthUserStationDto[]')) { | ||
@@ -227,3 +228,3 @@ // console.log('ref', JSON.stringify(ref)); | ||
else { | ||
ref = allEnums.find(item => modelNames.some((modelName) => modelName.startsWith(item.name))); | ||
ref = allEnums.find((item) => modelNames.some((modelName) => modelName.startsWith(item.name))); | ||
if (ref) { | ||
@@ -230,0 +231,0 @@ result.push(ref.name); |
{ | ||
"name": "@odit/swagger-axios-codegen", | ||
"version": "0.15.0", | ||
"version": "1.0.0", | ||
"main": "./dist/index", | ||
"typings": "./dist/", | ||
"authors": [ | ||
"ODIT.Services <info@odit.services>", | ||
"Nicolai Ort <info@nicolai-ort.com>", | ||
"Manwei Leung <mic.liangwenwei@foxmail.com>" | ||
"ODIT.Services <info@odit.services>" | ||
], | ||
@@ -24,15 +22,10 @@ "license": "MIT", | ||
"dependencies": { | ||
"axios": "^0.21.2", | ||
"camelcase": "^5.0.0", | ||
"multimatch": "^4.0.0", | ||
"pascalcase": "^0.1.1", | ||
"prettier": "^1.15.2", | ||
"structured-log": "^0.2.0" | ||
"axios": "^1.5.0", | ||
"prettier": "^3.0.3" | ||
}, | ||
"devDependencies": { | ||
"@types/node": "^12.7.2", | ||
"@types/prettier": "^1.12.2", | ||
"rimraf": "^3.0.2", | ||
"tslint": "^5.10.0", | ||
"typescript": "^4.4.4" | ||
"@types/node": "^20.6.2", | ||
"rimraf": "^5.0.1", | ||
"scule": "^1.0.0", | ||
"typescript": "^5.2.2" | ||
}, | ||
@@ -42,3 +35,3 @@ "scripts": { | ||
"prestart": "npm run build", | ||
"precommit": "prettier --write --config .prettierrc ./src/*.ts", | ||
"precommit": "prettier --write ./src/**/*.ts", | ||
"start": "node ./dist/index", | ||
@@ -45,0 +38,0 @@ "watch": "tsc --watch -p ./src ", |
221
README.md
@@ -1,33 +0,10 @@ | ||
# swagger-axios-codegen | ||
A swagger client uses axios and typescript | ||
# @odit/swagger-axios-codegen | ||
A swagger client using axios and typescript | ||
[![GitHub Workflow Status](https://img.shields.io/github/workflow/status/manweill/swagger-axios-codegen/NodeCI)](https://img.shields.io/github/workflow/status/manweill/swagger-axios-codegen/NodeCI) | ||
[![NpmVersion](https://img.shields.io/npm/v/swagger-axios-codegen.svg)](https://www.npmjs.com/package/swagger-axios-codegen) | ||
[![npm](https://img.shields.io/npm/dm/swagger-axios-codegen.svg)](https://www.npmjs.com/package/swagger-axios-codegen) | ||
[![open issues](https://img.shields.io/github/issues-raw/manweill/swagger-axios-codegen.svg)](https://img.shields.io/github/issues-raw/manweill/swagger-axios-codegen.svg) | ||
require node > v8.0.0 | ||
it will always resolve `axios.response.data` or reject `axios.error` with Promise | ||
support other similar to `axios` library, for example [Fly.js](https://github.com/wendux/fly), required setting `ISwaggerOptions.useCustomerRequestInstance = true` | ||
the es6 version is generated by calling typescript | ||
Welcome PRs and commit issue | ||
By the way. you can support this repo via Star star sta st s... ⭐️ ⭐️ ⭐️ ⭐️ ⭐️ | ||
## [Example](./example) | ||
## [ChangeLog](./CHANGELOG.md) | ||
## [Contributing](./CONTRIBUTING.md) | ||
## Get Started | ||
``` | ||
yarn add swagger-axios-codegen | ||
pnpm i -D @odit/swagger-axios-codegen | ||
``` | ||
@@ -101,3 +78,3 @@ | ||
const { codegen } = require('swagger-axios-codegen') | ||
const { codegen } = require('@odit/swagger-axios-codegen') | ||
codegen({ | ||
@@ -114,3 +91,3 @@ methodNameMode: 'operationId', | ||
const { codegen } = require('swagger-axios-codegen') | ||
const { codegen } = require('@odit/swagger-axios-codegen') | ||
codegen({ | ||
@@ -172,189 +149,1 @@ methodNameMode: 'operationId', | ||
``` | ||
### use other library | ||
```js | ||
import YourLib from '<Your lib>' | ||
import { serviceOptions } from './service' | ||
serviceOptions.axios = YourLib | ||
``` | ||
### filter service and method | ||
fliter by [multimatch](https://github.com/sindresorhus/multimatch) using 'include' setting | ||
```js | ||
codegen({ | ||
methodNameMode: 'path', | ||
source: require('../swagger.json'), | ||
outputDir: './swagger/services', | ||
include: [ | ||
'*', | ||
// 'Products*', | ||
'!Products', | ||
{ 'User': ['*', '!history'] }, | ||
] | ||
}) | ||
``` | ||
If you are using special characters in your service name (which is the first tag) you must assume they have been escaped. | ||
For example the service names are `MyApp.FirstModule.Products`, `MyApp.FirstModule.Customers`, `MyApp.SecondModule.Orders`: | ||
```json | ||
// API | ||
"paths": { | ||
"/Products/Get": { | ||
"post": { | ||
"tags": [ | ||
"MyApp.FirstModule.Products" | ||
], | ||
"operationId": "Get", | ||
``` | ||
```js | ||
// Codegen config | ||
codegen({ | ||
methodNameMode: 'path', | ||
source: require('../swagger.json'), | ||
outputDir: './swagger/services', | ||
include: ['MyAppFirstModule*'] // Only Products and Customers will be included. As you can see dots are escaped being contract names. | ||
}) | ||
``` | ||
### use class transformer to transform results | ||
This is helpful if you want to transform dates to real date | ||
objects. Swagger can define string formats for different types. Two if these formats are `date` and `date-time` | ||
If a `class-transformer` is enabled and a format is set on a string, the result string will be transformed to a `Date` instance | ||
// swagger.json | ||
```json | ||
{ | ||
"ObjectWithDate": { | ||
"type": "object", | ||
"properties": { | ||
"date": { | ||
"type": "string", | ||
"format": "date-time" | ||
} | ||
} | ||
} | ||
} | ||
``` | ||
```js | ||
const { codegen } = require('swagger-axios-codegen') | ||
codegen({ | ||
methodNameMode: 'operationId', | ||
source:require('./swagger.json'), | ||
useClassTransformer: true, | ||
}) | ||
``` | ||
Resulting class: | ||
```ts | ||
export class ObjectWithDate { | ||
@Expose() | ||
@Type(() => Date) | ||
public date: Date; | ||
} | ||
``` | ||
The service method will transform the json response and return an instance of this class | ||
### use validation model | ||
```js | ||
codegen({ | ||
... | ||
modelMode: 'class', | ||
generateValidationModel: true | ||
}); | ||
``` | ||
The option above among with class model mode allows to render the model validation rules. The result of this will be as follows: | ||
```js | ||
export class FooFormVm { | ||
'name'?: string; | ||
'description'?: string; | ||
constructor(data: undefined | any = {}) { | ||
this['name'] = data['name']; | ||
this['description'] = data['description']; | ||
} | ||
public static validationModel = { | ||
name: { required: true, maxLength: 50 }, | ||
description: { maxLength: 250 }, | ||
}; | ||
} | ||
``` | ||
So you can use the validation model in your application: | ||
```js | ||
function isRequired(vm: any, fieldName: string): boolean { | ||
return (vm && vm[fieldName] && vm[fieldName].required === true); | ||
} | ||
function maxLength(vm: any, fieldName: string): number { | ||
return (vm && vm[fieldName] && vm[fieldName].maxLength ? vm[fieldName].maxLength : 4000); | ||
} | ||
``` | ||
Now you can use the functions | ||
```js | ||
var required = isRequired(FooFormVm.validationModel, 'name'); | ||
var maxLength = maxLength(FooFormVm.validationModel, 'description'); | ||
``` | ||
At the moment there are only two rules are supported - `required` and `maxLength`. | ||
## Some Solution | ||
### 1.Reference parameters | ||
see in [#53](https://github.com/Manweill/swagger-axios-codegen/issues/53), use package [json-schema-ref-parser](https://github.com/APIDevTools/json-schema-ref-parser) | ||
### 2.With `Microservice Gateway` | ||
```js | ||
const {codegen} = require('swagger-axios-codegen') | ||
const axios = require('axios') | ||
// host 地址 | ||
const host = 'http://your-host-name' | ||
// | ||
const modules = [ | ||
... | ||
] | ||
axios.get(`${host}/swagger-resources`).then(async ({data}) => { | ||
console.warn('code', host) | ||
for (let n of data) { | ||
if (modules.includes(n.name)) { | ||
try { | ||
await codegen({ | ||
remoteUrl: `${host}${n.url}`, | ||
methodNameMode: 'operationId', | ||
modelMode: 'interface', | ||
strictNullChecks: false, | ||
outputDir: './services', | ||
fileName: `${n.name}.ts`, | ||
sharedServiceOptions: true, | ||
extendDefinitionFile: './customerDefinition.ts', | ||
}) | ||
} catch (e) { | ||
console.log(`${n.name} service error`, e.message) | ||
} | ||
} | ||
} | ||
}) | ||
``` | ||
{ | ||
"compileOnSave": true, | ||
"exclude": [ | ||
"./dist", | ||
"./example", | ||
"./test" | ||
], | ||
"include": [ | ||
"./typings", | ||
"./src" | ||
], | ||
"exclude": ["./dist", "./example", "./test"], | ||
"include": ["./typings", "./src"], | ||
"compilerOptions": { | ||
/* Basic Options */ | ||
"target": "ES2016", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */ | ||
"module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ | ||
"lib": [ | ||
"esnext" | ||
], /* Specify library files to be included in the compilation. */ | ||
"target": "ESNext" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017','ES2018' or 'ESNEXT'. */, | ||
"module": "ESNext" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */, | ||
"lib": ["esnext"] /* Specify library files to be included in the compilation. */, | ||
// "allowJs": true, /* Allow javascript files to be compiled. */ | ||
// "checkJs": true, /* Report errors in .js files. */ | ||
// "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ | ||
"declaration": true, /* Generates corresponding '.d.ts' file. */ | ||
"sourceMap": true, /* Generates corresponding '.map' file. */ | ||
"declaration": true /* Generates corresponding '.d.ts' file. */, | ||
"sourceMap": true /* Generates corresponding '.map' file. */, | ||
// "outFile": "@/", /* Concatenate and emit output to single file. */ | ||
"outDir": "./dist", /* Redirect output structure to the directory. */ | ||
"outDir": "./dist" /* Redirect output structure to the directory. */, | ||
//"rootDir": "/", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ | ||
@@ -33,5 +24,5 @@ // "removeComments": true, /* Do not emit comments to output. */ | ||
/* Strict Type-Checking Options */ | ||
"strict": true, /* Enable all strict type-checking options. */ | ||
"strict": true /* Enable all strict type-checking options. */, | ||
// "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ | ||
"strictNullChecks": false, /* Enable strict null checks. */ | ||
"strictNullChecks": false /* Enable strict null checks. */, | ||
// "strictFunctionTypes": true, /* Enable strict checking of function types. */ | ||
@@ -47,9 +38,7 @@ // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ | ||
/* Module Resolution Options */ | ||
"moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ | ||
"baseUrl": ".", /* Base directory to resolve non-absolute module names. */ | ||
"moduleResolution": "node" /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */, | ||
"baseUrl": "." /* Base directory to resolve non-absolute module names. */, | ||
"paths": { | ||
"@/*": [ | ||
"./src/*" | ||
], | ||
}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ | ||
"@/*": ["./src/*"] | ||
} /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */, | ||
// "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ | ||
@@ -59,3 +48,3 @@ // "typeRoots": [], /* List of folders to include type definitions from. */ | ||
// "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ | ||
"esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ | ||
"esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ | ||
// "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ | ||
@@ -71,2 +60,2 @@ /* Source Map Options */ | ||
} | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
2
4
1
0
151408
73
2349
147
+ Addedasynckit@0.4.0(transitive)
+ Addedaxios@1.7.9(transitive)
+ Addedcombined-stream@1.0.8(transitive)
+ Addeddelayed-stream@1.0.0(transitive)
+ Addedform-data@4.0.1(transitive)
+ Addedmime-db@1.52.0(transitive)
+ Addedmime-types@2.1.35(transitive)
+ Addedprettier@3.4.2(transitive)
+ Addedproxy-from-env@1.1.0(transitive)
- Removedcamelcase@^5.0.0
- Removedmultimatch@^4.0.0
- Removedpascalcase@^0.1.1
- Removedstructured-log@^0.2.0
- Removed@types/minimatch@3.0.5(transitive)
- Removedarray-differ@3.0.0(transitive)
- Removedarray-union@2.1.0(transitive)
- Removedarrify@2.0.1(transitive)
- Removedaxios@0.21.4(transitive)
- Removedbalanced-match@1.0.2(transitive)
- Removedbrace-expansion@1.1.11(transitive)
- Removedcamelcase@5.3.1(transitive)
- Removedconcat-map@0.0.1(transitive)
- Removedminimatch@3.1.2(transitive)
- Removedmultimatch@4.0.0(transitive)
- Removedpascalcase@0.1.1(transitive)
- Removedprettier@1.19.1(transitive)
- Removedstructured-log@0.2.0(transitive)
Updatedaxios@^1.5.0
Updatedprettier@^3.0.3