import { JSONSchema4 , JSONSchema4TypeName } from 'json-schema' ; import { LiteralUnion , OmitStrict , OneOrMore } from 'vtils/types' ; import { ParsedPath } from 'path' ; export interface ChangeCase { example camelCase : ( value : string ) => string ; example constantCase : ( value : string ) => string ; example dotCase : ( value : string ) => string ; example headerCase : ( value : string ) => string ; example lowerCase : ( value : string ) => string ; example lowerCaseFirst : ( value : string ) => string ; example paramCase : ( value : string ) => string ; example pascalCase : ( value : string ) => string ; example pathCase : ( value : string ) => string ; example sentenceCase : ( value : string ) => string ; example snakeCase : ( value : string ) => string ; example swapCase : ( value : string ) => string ; example titleCase : ( value : string ) => string ; example upperCase : ( value : string ) => string ; example upperCaseFirst : ( value : string ) => string ; } /** 请求方式 */ export enum Method { GET = 'GET' , POST = 'POST' , PUT = 'PUT' , DELETE = 'DELETE' , HEAD = 'HEAD' , OPTIONS = 'OPTIONS' , PATCH = 'PATCH' } /** 是否必需 */ export enum Required { /** 不必需 */ false = '0' , /** 必需 */ true = '1' } /** 请求数据类型 */ export enum RequestBodyType { /** 查询字符串 */ query = 'query' , /** 表单 */ form = 'form' , /** JSON */ json = 'json' , /** 纯文本 */ text = 'text' , /** 文件 */ file = 'file' , /** 原始数据 */ raw = 'raw' , /** 无请求数据 */ none = 'none' } /** 请求路径参数类型 */ export enum RequestParamType { /** 字符串 */ string = 'string' , /** 数字 */ number = 'number' } /** 请求查询参数类型 */ export enum RequestQueryType { /** 字符串 */ string = 'string' , /** 数字 */ number = 'number' } /** 请求表单条目类型 */ export enum RequestFormItemType { /** 纯文本 */ text = 'text' , /** 文件 */ file = 'file' } /** 返回数据类型 */ export enum ResponseBodyType { /** JSON */ json = 'json' , /** 纯文本 */ text = 'text' , /** XML */ xml = 'xml' , /** 原始数据 */ raw = 'raw' } /** 接口定义 */ export interface Interface { /** 接口 ID */ _id : number ; /** 所属分类信息（由 YTT 自行实现） */ _category : OmitStrict < Category , 'list' > ; /** 所属项目信息（由 YTT 自行实现） */ _project : Project ; /** 接口在 YApi 上的地址（由 YTT 自行实现） */ _url : string ; /** 接口名称 */ title : string ; /** 状态 */ status : LiteralUnion < 'done' | 'undone' , string > ; /** 接口备注 */ markdown : string ; /** 请求路径 */ path : string ; /** 请求方式，HEAD、OPTIONS 处理与 GET 相似，其余处理与 POST 相似 */ method : Method ; /** 所属项目 id */ project_id : number ; /** 所属分类 id */ catid : number ; /** 标签列表 */ tag : string [ ] ; /** 请求头 */ req_headers : Array < { /** 名称 */ name : string ; /** 值 */ value : string ; /** 备注 */ desc : string ; /** 示例 */ example : string ; /** 是否必需 */ required : Required ; } > ; /** 路径参数 */ req_params : Array < { /** 名称 */ name : string ; /** 备注 */ desc : string ; /** 示例 */ example : string ; /** 类型（YApi-X） */ type ? : RequestParamType ; } > ; /** 仅 GET：请求串 */ req_query : Array < { /** 名称 */ name : string ; /** 备注 */ desc : string ; /** 示例 */ example : string ; /** 是否必需 */ required : Required ; /** 类型（YApi-X） */ type ? : RequestQueryType ; } > ; /** 仅 POST：请求内容类型。为 text, file, raw 时不必特殊处理。 */ req_body_type : RequestBodyType ; /** `req_body_type = json` 时是否为 json schema */ req_body_is_json_schema : boolean ; /** `req_body_type = form` 时的请求内容 */ req_body_form : Array < { /** 名称 */ name : string ; /** 类型 */ type : RequestFormItemType ; /** 备注 */ desc : string ; /** 示例 */ example : string ; /** 是否必需 */ required : Required ; } > ; /** `req_body_type = json` 时的请求内容 */ req_body_other : string ; /** 返回数据类型 */ res_body_type : ResponseBodyType ; /** `res_body_type = json` 时是否为 json schema */ res_body_is_json_schema : boolean ; /** 返回数据 */ res_body : string ; /** 创建时间（unix时间戳） */ add_time : number ; /** 更新时间（unix时间戳） */ up_time : number ; /** 创建人 ID */ uid : number ; [ key ] : any ; } /** 扩展接口定义 */ export interface ExtendedInterface extends Interface { parsedPath : ParsedPath ; } /** 接口列表 */ export type InterfaceList = Interface [ ] ; /** 分类信息 */ export interface Category { /** ID */ _id : number ; /** 分类在 YApi 上的地址（由 YTT 自行实现） */ _url : string ; /** 分类名称 */ name : string ; /** 分类备注 */ desc : string ; /** 分类接口列表 */ list : InterfaceList ; /** 创建时间（unix时间戳） */ add_time : number ; /** 更新时间（unix时间戳） */ up_time : number ; } /** 分类列表，对应数据导出的 json 内容 */ export type CategoryList = Category [ ] ; /** 项目信息 */ export interface Project { /** ID */ _id : number ; /** 项目在 YApi 上的地址（由 YTT 自行实现） */ _url : string ; /** 名称 */ name : string ; /** 描述 */ desc : string ; /** 基本路径 */ basepath : string ; /** 标签 */ tag : string [ ] ; /** 环境配置 */ env : Array < { /** 环境名称 */ name : string ; /** 环境域名 */ domain : string ; } > ; } /** 支持生成 React Hooks 代码的相关配置 */ export interface ReactHooksConfig { /**
     * 是否开启该项功能。
     */ enabled : boolean ; default example requestHookMakerFilePath ? : string ; default param interfaceInfo param changeCase returns getRequestHookName ? ( interfaceInfo , changeCase ) : string ; } /** 支持生成 JSON Schema 的相关配置 */ export interface JsonSchemaConfig { /**
     * 是否开启该项功能。
     */ enabled : boolean ; default requestData ? : boolean ; default responseData ? : boolean ; } /** 支持生成注释的相关配置 */ export interface CommentConfig { default enabled ? : boolean ; default title ? : boolean ; default category ? : boolean ; default tag ? : boolean ; default requestHeader ? : boolean ; default updateTime ? : boolean ; default link ? : boolean ; /**
     * 额外的注释标签。生成的内容形如：`@{name} {value}`。
     */ extraTags ? : ( interfaceInfo : ExtendedInterface ) => Array < { /**
         * 标签名。
         */ name : string ; /**
         * 标签值。
         */ value : string ; default position ? : 'start' | 'end' ; } > ; } /**
 * 共享的配置。
 */ export interface SharedConfig { default target ? : 'typescript' | 'javascript' ; default typesOnly ? : boolean ; example devEnvName ? : string ; example prodEnvName ? : string ; example outputFilePath ? : string | ( ( interfaceInfo : Interface , changeCase : ChangeCase ) => string ) ; default example requestFunctionFilePath ? : string ; example dataKey ? : OneOrMore < string > ; /**
     * 支持生成 React Hooks 代码的相关配置。
     */ reactHooks ? : ReactHooksConfig ; /**
     * 支持生成 JSON Schema 的相关配置。
     */ jsonSchema ? : JsonSchemaConfig ; /**
     * 支持生成注释的相关配置。
     */ comment ? : CommentConfig ; /**
     * 将自定义类型转为 JSONSchema 类型的映射表，自定义类型名称大小写不敏感。
     */ customTypeMapping ? : Record < string , JSONSchema4TypeName > ; param interfaceInfo param changeCase returns setRequestFunctionExtraInfo ? ( interfaceInfo , changeCase ) : Record < string , any > ; example preproccessInterface ? ( interfaceInfo , changeCase ) : Interface | false ; default param interfaceInfo param changeCase returns getRequestFunctionName ? ( interfaceInfo , changeCase ) : string ; default param interfaceInfo param changeCase returns getRequestDataTypeName ? ( interfaceInfo , changeCase ) : string ; default param interfaceInfo param changeCase returns getResponseDataTypeName ? ( interfaceInfo , changeCase ) : string ; } /**
 * 分类的配置。
 */ export interface CategoryConfig extends SharedConfig { example id : number | number [ ] ; } /**
 * 项目的配置。
 */ export interface ProjectConfig extends SharedConfig { example token : string | string [ ] ; /**
     * 分类列表。
     */ categories : CategoryConfig [ ] ; } /**
 * 服务器的配置。
 */ export interface ServerConfig extends SharedConfig { example serverUrl : string ; default serverType ? : 'yapi' | 'swagger' ; /**
     * 项目列表。
     */ projects : ProjectConfig [ ] ; } /** 混合的配置。 */ export type SyntheticalConfig = Partial < ServerConfig & ServerConfig [ 'projects' ] [ 0 ] & ServerConfig [ 'projects' ] [ 0 ] [ 'categories' ] [ 0 ] & { mockUrl : string ; devUrl : string ; prodUrl : string ; } > ; /** 配置。 */ export type Config = ServerConfig | ServerConfig [ ] ; /**
 * 请求配置。
 */ export interface RequestConfig < MockUrl extends string = string , DevUrl extends string = string , ProdUrl extends string = string , Path extends string = string , DataKey extends OneOrMore < string > | undefined = OneOrMore < string > | undefined , ParamName extends string = string , QueryName extends string = string , RequestDataOptional extends boolean = boolean > { /** 接口 Mock 地址，结尾无 `/` */ mockUrl : MockUrl ; /** 接口测试环境地址，结尾无 `/` */ devUrl : DevUrl ; /** 接口生产环境地址，结尾无 `/` */ prodUrl : ProdUrl ; /** 接口路径，以 `/` 开头 */ path : Path ; /** 请求方法 */ method : Method ; /** 请求头，除了 Content-Type 的所有头 */ requestHeaders : Record < string , string > ; /** 请求数据类型 */ requestBodyType : RequestBodyType ; /** 返回数据类型 */ responseBodyType : ResponseBodyType ; /** 数据所在键 */ dataKey : DataKey ; /** 路径参数的名称列表 */ paramNames : ParamName [ ] ; /** 查询参数的名称列表 */ queryNames : QueryName [ ] ; /** 请求数据是否可选 */ requestDataOptional : RequestDataOptional ; /** 请求数据的 JSON Schema (仅开启了 JSON Schema 生成时生效) */ requestDataJsonSchema : JSONSchema4 ; /** 返回数据的 JSON Schema (仅开启了 JSON Schema 生成时生效) */ responseDataJsonSchema : JSONSchema4 ; /** 请求函数名称 */ requestFunctionName : string ; /** 额外信息 */ extraInfo : Record < string , any > ; } /**
 * 请求参数。
 */ export interface RequestFunctionParams extends RequestConfig { /** 原始数据 */ rawData : Record < string , any > ; /** 请求数据，不含文件数据 */ data : Record < string , any > ; /** 是否有文件数据 */ hasFileData : boolean ; /** 请求文件数据 */ fileData : Record < string , any > ; /** 所有请求数据，包括 data、fileData */ allData : Record < string , any > ; /** 获取全部请求数据（包含文件）的 FormData 实例 */ getFormData : ( ) => FormData ; } /** 请求函数的额外参数 */ export type RequestFunctionRestArgs < T extends Function > = T extends ( payload : any , ... args : infer R ) => any ? R : never ; /** 属性定义 */ export interface PropDefinition { /** 属性名称 */ name : string ; /** 是否必需 */ required : boolean ; /** 类型 */ type : JSONSchema4 [ 'type' ] ; /** 注释 */ comment : string ; } /** 属性定义列表 */ export type PropDefinitions = PropDefinition [ ] ;