新增插件配置与aspectService
This commit is contained in:
parent
1710ad9113
commit
8658fea0a3
|
|
@ -0,0 +1,29 @@
|
||||||
|
{
|
||||||
|
"projectDir": "./",
|
||||||
|
"checker": {
|
||||||
|
"onInvalidReturn": "warn",
|
||||||
|
"onInvalidDestructuring": "error",
|
||||||
|
"onNeedPromiseCheck": "error"
|
||||||
|
},
|
||||||
|
"trigger": {
|
||||||
|
"onReturnLiteral": "warn",
|
||||||
|
"onNoAsyncFn": "error",
|
||||||
|
"onNoAwaitContext": "error"
|
||||||
|
},
|
||||||
|
"i18n": {
|
||||||
|
"onMissingKey": "error",
|
||||||
|
"onKeyBlank": "warn",
|
||||||
|
"onParamError": "warn",
|
||||||
|
"onParamMissing": "error",
|
||||||
|
"onParamRedundant": "warn"
|
||||||
|
},
|
||||||
|
"oakComponent": {
|
||||||
|
"onInvalidEntity": "error",
|
||||||
|
"onInvalidIsList": "error",
|
||||||
|
"onMissingDataAttrs": "warn",
|
||||||
|
"onMissingMethods": "error"
|
||||||
|
},
|
||||||
|
"oakPath": {
|
||||||
|
"onInvalidPath": "error"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
import { BasicFeatures } from "../features";
|
||||||
|
import assert from "assert";
|
||||||
|
import { AspectDict as CommonAspectDict } from "oak-common-aspect/es/AspectDict";
|
||||||
|
import { AsyncContext } from "oak-domain/lib/store/AsyncRowStore";
|
||||||
|
import { EntityDict as BaseEntityDict } from "oak-domain/lib/base-app-domain";
|
||||||
|
|
||||||
|
type AspectDict<
|
||||||
|
ED extends BaseEntityDict,
|
||||||
|
BCT extends AsyncContext<ED>
|
||||||
|
> = Record<string, (params: any, context: BCT) => Promise<any>>;
|
||||||
|
|
||||||
|
type TransformAspectDict<
|
||||||
|
T extends AspectDict<ED, BCT>,
|
||||||
|
ED extends BaseEntityDict,
|
||||||
|
BCT extends AsyncContext<ED>
|
||||||
|
> = {
|
||||||
|
[K in keyof T]: T[K] extends (params: infer P, context: BCT) => infer R
|
||||||
|
? R extends Promise<unknown>
|
||||||
|
? (params: P) => R
|
||||||
|
: never
|
||||||
|
: never;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type AspectDictTrans<
|
||||||
|
ED extends BaseEntityDict,
|
||||||
|
AD extends AspectDict<ED, BCT>,
|
||||||
|
BCT extends AsyncContext<ED>
|
||||||
|
> = TransformAspectDict<AD & CommonAspectDict<ED>, ED, BCT>;
|
||||||
|
|
||||||
|
export const createService = <
|
||||||
|
ED extends BaseEntityDict,
|
||||||
|
AD extends AspectDict<ED, any>
|
||||||
|
>(
|
||||||
|
cache: BasicFeatures<ED>["cache"]
|
||||||
|
) => {
|
||||||
|
return new Proxy({} as Record<string, Function>, {
|
||||||
|
get: (target, prop) => {
|
||||||
|
assert(
|
||||||
|
typeof prop === "string",
|
||||||
|
"Aspect service name must be a string"
|
||||||
|
);
|
||||||
|
if (process.env.NODE_ENV === "development") {
|
||||||
|
const service = target[prop];
|
||||||
|
if (typeof service !== "function") {
|
||||||
|
console.log(
|
||||||
|
"Calling a aspect which is not in this Project:",
|
||||||
|
prop
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (params: unknown) => {
|
||||||
|
const paramsCopy = structuredClone(params);
|
||||||
|
if (process.env.NODE_ENV === "development") {
|
||||||
|
console.log("Aspect call:", prop, paramsCopy);
|
||||||
|
}
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
cache
|
||||||
|
.exec(prop, paramsCopy)
|
||||||
|
.then((res) => {
|
||||||
|
resolve(res.result);
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
reject(err);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
},
|
||||||
|
// 禁止任何set
|
||||||
|
set: () => {
|
||||||
|
throw new Error("Aspect service is readonly");
|
||||||
|
},
|
||||||
|
}) as unknown as AspectDictTrans<ED, AD, any>;
|
||||||
|
};
|
||||||
Loading…
Reference in New Issue