api-types-automatic-converter

0.7.1 • Public • Published

API-types-automatic-converter

代理 API,自动将请求参数和返回数据转为 ts。使用返回数据自动创建 json、json-schema,当给请求头添加 mock-response 时,将会把保存的 json 作为返回数据,进而实现 mock 的功能。开发此功能使用了Typescript作为静态检查工具。用 esmodule 编码,但最终编译为 commonjs 的模块。

类型检查

用 tsc 编译 ts 并会检查类型,使用的 tsconfig.json 的配置;eslint 用的是.eslintrc.js,只会检查代码结构和样式

原理

  1. 启动一个处于在前端和后端的中间服务器,通过反向代理让请求从该服务器过,从而劫持请求和响应做自动转换的功能。
  2. 支持自定义 differ() 来更新文件;默认是强制更新文件,以最新的 ts 替换原来的,也可以设置为 append,则会把最新 ts 命名为 xxxLatest 的追加到后面;
  3. 【请求参数】和【返回数据】都通过 differ() 的返回来决定是否更新,两者的参数略有不同。【请求参数】通过 differ() 判断时没有 schema 和 oldData。所以通过判断这两 个参数可以分别判断【请求参数】和【返回数据】是否更新。

原理

更新策略

覆盖或追加,见配置的 updateStrategy

更新策略

公司私有 npm 仓库发布地址

https://internal-nexus.haochang.tv/repository/npm-hc/

公司私有 npm 仓库下载地址

https://internal-nexus.haochang.tv/repository/npm/

开始使用

命令 说明 参数 说明
npm i --save-dev api-types-automatic-converter 安装
api-convert-cli init 生成配置文件 ts js 可以这样使用:api-convert-cli init js ;不输参数默认是生成 ts 的配置文件
api-convert-cli start 启动服务

根据不同项目,修改已有的代理文件。如果是 Angular,则需要将 proxy.conf.json 中的 target 地址改为 http://localhost:5800

npm -g i api-types-automatic-converter // 全局安装
cd [project dir] // 进入项目目录
api-convert-cli init // 执行初始化命令,将会在根目录生成一个配置文件,见‘配置说明’
api-convert-cli start // 修改配置文件后启动,将在本地启动一个服务,若端口设置为5800,那么该服务的地址就是 http://localhost:5800

或者在 package.json 配置脚本命令

"scripts": {
 "api-types": "node ./node_modules/api-types-automatic-converter/dist/main.js start",
}

配置说明

配置中的 proxy 其实就是 http-proxy-middleware 的配置,但 onProxyReq 和 onProxyRes 是无效的,该库就是通过 它们来劫持的 API

  1. js 版
function differ(params) {
	const Ajv = require('ajv');

	const { data, schema } = params;
	const ajv = new Ajv();

	if (schema && data) {
		const validate = ajv.compile(schema);
		const valid = validate(data);

		if (valid) {
			return false;
		}
	}

	return true;
}
module.exports = {
	differ,
	updateStrategy: 'cover', // 'cover' | 'append'
	proxy: { target: 'https://jsonplaceholder.typicode.com', pathRewrite: { '^/api': '' }, changeOrigin: true, secure: false },
	port: 5800,
	filePath: { json: './sample/assets/api-json', types: './sample/src/api-types' },
	ignore: { methods: ['delete', 'options'], reqContentTypes: [], resContentTypes: ['application/octet-stream'] },
};
  1. ts 版,建议使用这版
import { DifferParams, APIConverterConfig } from 'api-types-automatic-converter';

function differ(params: DifferParams): boolean {
	const { data, oldData, typeContent, oldTypeContent, schema } = params;
	if (!Object.keys(data as any).length) {
		return false;
	}

	// 请求参数变多了
	if (!schema && oldTypeContent && typeContent.length > oldTypeContent.length) {
		return true;
	}

	// 响应的数据结构变化了
	if (schema && data) {
		const tmp: any = data;
		const Ajv = require('ajv');
		const ajv = new Ajv(); // options can be passed, e.g. {allErrors: true}
		const validate = ajv.compile(schema);
		const valid = validate(data);
		if (!valid && Object.keys(tmp.data).length) {
			console.log(validate.errors);
			return true;
		}
	}

	return false;
}
module.exports = {
	differ,
	proxy: { target: 'https://jsonplaceholder.typicode.com', pathRewrite: { '^/api': '' }, changeOrigin: true, secure: false },
	updateStrategy: 'cover',
	port: 5800,
	filePath: { json: './sample/assets/api-json', types: './sample/src/api-types' },
	ignore: { urls: [], methods: ['delete', 'options'], reqContentTypes: [], resContentTypes: ['application/octet-stream'] },
} as APIConverterConfig;

TODO

  1. [x]分离函数,声明类型
  2. [x]支持传入配置
  3. [x]配置支持 ts
  4. []对接 json-server

Package Sidebar

Install

npm i api-types-automatic-converter

Weekly Downloads

4

Version

0.7.1

License

MIT

Unpacked Size

255 kB

Total Files

56

Last publish

Collaborators

  • wuyang1023