automated_uniapp/cool/bootstrap/eps.ts

139 lines
2.4 KiB
TypeScript
Raw Normal View History

2025-01-09 16:16:11 +08:00
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();
});
}