139 lines
2.4 KiB
TypeScript
139 lines
2.4 KiB
TypeScript
![]() |
import { merge } from "lodash-es";
|
||
|
import { BaseService, service } from "../service";
|
||
|
import { path2Obj } from "../utils";
|
||
|
import { config, isDev } from "/@/config";
|
||
|
import { eps } from "virtual:eps";
|
||
|
|
||
|
// 读取本地所有 service
|
||
|
const files = import.meta.glob("/service/**/*", {
|
||
|
eager: true,
|
||
|
});
|
||
|
|
||
|
// 数据集合
|
||
|
const services: any[] = [];
|
||
|
|
||
|
// 取值
|
||
|
for (const i in files) {
|
||
|
try {
|
||
|
// @ts-ignore
|
||
|
services.push(new files[i].default());
|
||
|
} catch (e) {
|
||
|
console.error(`[service] ${i} error: `, e);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// 更新事件
|
||
|
function onUpdate() {
|
||
|
// 设置 request 方法
|
||
|
function set(d: any) {
|
||
|
if (d.namespace) {
|
||
|
const a: any = new BaseService(d.namespace);
|
||
|
|
||
|
for (const i in d) {
|
||
|
const { path, method = "get" } = d[i];
|
||
|
|
||
|
if (path) {
|
||
|
a.request = a.request;
|
||
|
|
||
|
a[i] = function (data?: any) {
|
||
|
return this.request({
|
||
|
url: path,
|
||
|
method,
|
||
|
[method.toLocaleLowerCase() == "post" ? "data" : "params"]: data,
|
||
|
});
|
||
|
};
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (const i in a) {
|
||
|
d[i] = a[i];
|
||
|
}
|
||
|
} else {
|
||
|
for (const i in d) {
|
||
|
set(d[i]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// 遍历每一个方法
|
||
|
set(eps.service);
|
||
|
|
||
|
// 合并 eps
|
||
|
merge(service, eps.service);
|
||
|
|
||
|
// 合并[local]
|
||
|
merge(
|
||
|
service,
|
||
|
path2Obj(
|
||
|
services.map((e) => {
|
||
|
return {
|
||
|
path: (e.namespace || "").replace("app/", ""),
|
||
|
value: e,
|
||
|
};
|
||
|
}),
|
||
|
),
|
||
|
);
|
||
|
|
||
|
// 提示
|
||
|
if (isDev) {
|
||
|
console.log("[cool-eps] updated");
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export function createEps() {
|
||
|
// 更新 eps
|
||
|
onUpdate();
|
||
|
|
||
|
// #ifdef H5
|
||
|
// 开发环境下,生成本地 service 的类型描述文件
|
||
|
if (isDev && config.test.eps) {
|
||
|
const list = services.map((s) => {
|
||
|
const api = Array.from(
|
||
|
new Set([
|
||
|
...Object.getOwnPropertyNames(s.constructor.prototype),
|
||
|
"page",
|
||
|
"list",
|
||
|
"info",
|
||
|
"delete",
|
||
|
"update",
|
||
|
"add",
|
||
|
]),
|
||
|
)
|
||
|
.filter((e) => !["constructor", "namespace"].includes(e))
|
||
|
.map((e) => {
|
||
|
return {
|
||
|
path: `/${e}`,
|
||
|
};
|
||
|
});
|
||
|
|
||
|
return {
|
||
|
api,
|
||
|
module: s.namespace.split("/")[0],
|
||
|
name: s.constructor.name + "Entity",
|
||
|
prefix: `/app/${s.namespace}`,
|
||
|
};
|
||
|
});
|
||
|
|
||
|
service.request({
|
||
|
url: "/__cool_eps",
|
||
|
method: "POST",
|
||
|
proxy: false,
|
||
|
data: {
|
||
|
list,
|
||
|
},
|
||
|
});
|
||
|
}
|
||
|
// #endif
|
||
|
}
|
||
|
|
||
|
// 监听 vite 触发事件
|
||
|
if (import.meta.hot) {
|
||
|
import.meta.hot.on("eps-update", ({ service }) => {
|
||
|
if (service) {
|
||
|
eps.service = service;
|
||
|
}
|
||
|
|
||
|
onUpdate();
|
||
|
});
|
||
|
}
|