@akanjs/server 0.0.99 → 0.0.100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +21 -1
- package/index.mjs +1 -0
- package/package.json +4 -4
- package/src/boot.js +94 -84
- package/src/boot.mjs +190 -0
- package/src/controller.js +63 -70
- package/src/controller.mjs +109 -0
- package/src/gql.js +64 -35
- package/src/gql.mjs +123 -0
- package/src/index.js +39 -10
- package/src/index.mjs +10 -0
- package/src/module.js +103 -77
- package/src/module.mjs +229 -0
- package/src/processor.js +41 -22
- package/src/processor.mjs +73 -0
- package/src/resolver.js +76 -49
- package/src/resolver.mjs +118 -0
- package/src/schema.js +78 -54
- package/src/{schema.cjs → schema.mjs} +54 -78
- package/src/searchDaemon.js +45 -29
- package/src/{searchDaemon.cjs → searchDaemon.mjs} +29 -45
- package/src/types.js +15 -0
- package/src/types.mjs +0 -0
- package/src/websocket.js +55 -33
- package/src/websocket.mjs +124 -0
- package/index.cjs +0 -21
- package/src/boot.cjs +0 -200
- package/src/controller.cjs +0 -102
- package/src/gql.cjs +0 -152
- package/src/index.cjs +0 -39
- package/src/module.cjs +0 -255
- package/src/processor.cjs +0 -92
- package/src/resolver.cjs +0 -145
- package/src/types.cjs +0 -15
- package/src/websocket.cjs +0 -146
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { lowerlize } from "@akanjs/common";
|
|
2
|
+
import { isServiceEnabled } from "@akanjs/service";
|
|
3
|
+
import {
|
|
4
|
+
deserializeArg,
|
|
5
|
+
getArgMetas,
|
|
6
|
+
getGqlMetas,
|
|
7
|
+
getSigMeta
|
|
8
|
+
} from "@akanjs/signal";
|
|
9
|
+
import { Process, Processor } from "@nestjs/bull";
|
|
10
|
+
import { Inject } from "@nestjs/common";
|
|
11
|
+
const convertProcessFunction = (gqlMeta, argMetas, internalArgMetas, fn) => {
|
|
12
|
+
return async function(job, done) {
|
|
13
|
+
const args = [];
|
|
14
|
+
argMetas.forEach((argMeta) => {
|
|
15
|
+
if (argMeta.type === "Msg")
|
|
16
|
+
args[argMeta.idx] = deserializeArg(argMeta, job.data[argMeta.idx]);
|
|
17
|
+
else
|
|
18
|
+
throw new Error(`Invalid ArgMeta Type ${argMeta.type}`);
|
|
19
|
+
});
|
|
20
|
+
internalArgMetas.forEach((internalArgMeta) => {
|
|
21
|
+
if (internalArgMeta.type === "Job")
|
|
22
|
+
args[internalArgMeta.idx] = job;
|
|
23
|
+
else
|
|
24
|
+
throw new Error(`Invalid InternalArgMeta Type ${internalArgMeta.type}`);
|
|
25
|
+
});
|
|
26
|
+
this.logger?.log(`Process-${gqlMeta.key} started`);
|
|
27
|
+
const result = await fn.apply(this, args);
|
|
28
|
+
this.logger?.log(`Process-${gqlMeta.key} finished`);
|
|
29
|
+
done(null, result);
|
|
30
|
+
};
|
|
31
|
+
};
|
|
32
|
+
const processorOf = (sigRef, allSrvs) => {
|
|
33
|
+
const sigMeta = getSigMeta(sigRef);
|
|
34
|
+
const serverMode = process.env.SERVER_MODE ?? "federation";
|
|
35
|
+
const gqlMetas = getGqlMetas(sigRef).filter((gqlMeta) => gqlMeta.type === "Process").filter(
|
|
36
|
+
(gqlMeta) => gqlMeta.signalOption.serverType === "all" || serverMode === "all" || gqlMeta.signalOption.serverType === serverMode
|
|
37
|
+
);
|
|
38
|
+
class QueueProcessor {
|
|
39
|
+
}
|
|
40
|
+
Object.keys(allSrvs).forEach((srv) => {
|
|
41
|
+
if (!isServiceEnabled(allSrvs[srv]))
|
|
42
|
+
return;
|
|
43
|
+
Inject(allSrvs[srv])(QueueProcessor.prototype, lowerlize(srv));
|
|
44
|
+
});
|
|
45
|
+
for (const gqlMeta of gqlMetas) {
|
|
46
|
+
const [argMetas, internalArgMetas] = getArgMetas(sigRef, gqlMeta.key);
|
|
47
|
+
const descriptor = { ...Object.getOwnPropertyDescriptor(sigRef.prototype, gqlMeta.key) ?? {} };
|
|
48
|
+
descriptor.value = convertProcessFunction(
|
|
49
|
+
gqlMeta,
|
|
50
|
+
argMetas,
|
|
51
|
+
internalArgMetas,
|
|
52
|
+
descriptor.value
|
|
53
|
+
);
|
|
54
|
+
Object.defineProperty(QueueProcessor.prototype, gqlMeta.key, descriptor);
|
|
55
|
+
Process(gqlMeta.key)(QueueProcessor.prototype, gqlMeta.key, descriptor);
|
|
56
|
+
}
|
|
57
|
+
Processor(sigMeta.refName)(QueueProcessor);
|
|
58
|
+
return QueueProcessor;
|
|
59
|
+
};
|
|
60
|
+
const queueOf = (sigRef, queue) => {
|
|
61
|
+
const sigMeta = getSigMeta(sigRef);
|
|
62
|
+
const gqlMetas = getGqlMetas(sigRef).filter((gqlMeta) => gqlMeta.type === "Process");
|
|
63
|
+
for (const gqlMeta of gqlMetas) {
|
|
64
|
+
if (queue[gqlMeta.key])
|
|
65
|
+
throw new Error(`Queue already has ${gqlMeta.key} in ${sigMeta.refName}`);
|
|
66
|
+
queue[gqlMeta.key] = (...args) => queue.add(gqlMeta.key, args);
|
|
67
|
+
}
|
|
68
|
+
return queue;
|
|
69
|
+
};
|
|
70
|
+
export {
|
|
71
|
+
processorOf,
|
|
72
|
+
queueOf
|
|
73
|
+
};
|
package/src/resolver.js
CHANGED
|
@@ -1,61 +1,87 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
1
|
+
var __create = Object.create;
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
6
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
7
|
+
var __export = (target, all) => {
|
|
8
|
+
for (var name in all)
|
|
9
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
|
+
};
|
|
11
|
+
var __copyProps = (to, from, except, desc) => {
|
|
12
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
13
|
+
for (let key of __getOwnPropNames(from))
|
|
14
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
15
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
16
|
+
}
|
|
17
|
+
return to;
|
|
18
|
+
};
|
|
19
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
var resolver_exports = {};
|
|
29
|
+
__export(resolver_exports, {
|
|
30
|
+
resolverOf: () => resolverOf
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(resolver_exports);
|
|
33
|
+
var import_base = require("@akanjs/base");
|
|
34
|
+
var import_common = require("@akanjs/common");
|
|
35
|
+
var import_constant = require("@akanjs/constant");
|
|
36
|
+
var import_nest = require("@akanjs/nest");
|
|
37
|
+
var import_service = require("@akanjs/service");
|
|
38
|
+
var import_signal = require("@akanjs/signal");
|
|
39
|
+
var import_common2 = require("@nestjs/common");
|
|
40
|
+
var Nest = __toESM(require("@nestjs/graphql"));
|
|
41
|
+
var import_graphql_type_json = __toESM(require("graphql-type-json"));
|
|
42
|
+
var import_graphql_upload = require("graphql-upload");
|
|
43
|
+
var import_gql = require("./gql");
|
|
18
44
|
const scalarNestReturnMap = /* @__PURE__ */ new Map([
|
|
19
|
-
[Upload, GraphQLUpload],
|
|
20
|
-
[ID, Nest.ID],
|
|
21
|
-
[Int, Nest.Int],
|
|
22
|
-
[Float, Nest.Float],
|
|
23
|
-
[JSON,
|
|
45
|
+
[import_base.Upload, import_graphql_upload.GraphQLUpload],
|
|
46
|
+
[import_base.ID, Nest.ID],
|
|
47
|
+
[import_base.Int, Nest.Int],
|
|
48
|
+
[import_base.Float, Nest.Float],
|
|
49
|
+
[import_base.JSON, import_graphql_type_json.default],
|
|
24
50
|
[Boolean, Boolean],
|
|
25
51
|
[Date, Date],
|
|
26
52
|
[String, String],
|
|
27
|
-
[Map,
|
|
53
|
+
[Map, import_graphql_type_json.default]
|
|
28
54
|
]);
|
|
29
55
|
const getNestReturn = (returns, type = "object") => {
|
|
30
|
-
const [model, arrDepth] = getNonArrayModel(returns());
|
|
31
|
-
const modelRef = scalarNestReturnMap.get(model) ?? (type === "object" ? generateGql(model) : generateGqlInput(model));
|
|
32
|
-
return () => arraiedModel(modelRef, arrDepth);
|
|
56
|
+
const [model, arrDepth] = (0, import_base.getNonArrayModel)(returns());
|
|
57
|
+
const modelRef = scalarNestReturnMap.get(model) ?? (type === "object" ? (0, import_gql.generateGql)(model) : (0, import_gql.generateGqlInput)(model));
|
|
58
|
+
return () => (0, import_base.arraiedModel)(modelRef, arrDepth);
|
|
33
59
|
};
|
|
34
60
|
const internalArgMap = {
|
|
35
61
|
Parent: Nest.Parent,
|
|
36
|
-
Account,
|
|
37
|
-
UserIp,
|
|
38
|
-
Access,
|
|
39
|
-
Self,
|
|
40
|
-
Me,
|
|
41
|
-
Req,
|
|
42
|
-
Res
|
|
62
|
+
Account: import_nest.Account,
|
|
63
|
+
UserIp: import_nest.UserIp,
|
|
64
|
+
Access: import_nest.Access,
|
|
65
|
+
Self: import_nest.Self,
|
|
66
|
+
Me: import_nest.Me,
|
|
67
|
+
Req: import_nest.Req,
|
|
68
|
+
Res: import_nest.Res
|
|
43
69
|
};
|
|
44
70
|
const resolverOf = (sigRef, allSrvs) => {
|
|
45
|
-
const Rsv = copySignal(sigRef);
|
|
46
|
-
const sigMeta = getSigMeta(Rsv);
|
|
47
|
-
const gqlMetas = getGqlMetas(Rsv);
|
|
71
|
+
const Rsv = (0, import_signal.copySignal)(sigRef);
|
|
72
|
+
const sigMeta = (0, import_signal.getSigMeta)(Rsv);
|
|
73
|
+
const gqlMetas = (0, import_signal.getGqlMetas)(Rsv);
|
|
48
74
|
Object.keys(allSrvs).forEach((srv) => {
|
|
49
|
-
if (!isServiceEnabled(allSrvs[srv]))
|
|
75
|
+
if (!(0, import_service.isServiceEnabled)(allSrvs[srv]))
|
|
50
76
|
return;
|
|
51
|
-
Inject(allSrvs[srv])(Rsv.prototype, lowerlize(srv));
|
|
77
|
+
(0, import_common2.Inject)(allSrvs[srv])(Rsv.prototype, (0, import_common.lowerlize)(srv));
|
|
52
78
|
});
|
|
53
79
|
for (const gqlMeta of gqlMetas) {
|
|
54
80
|
if (gqlMeta.guards.some((guard) => guard === "None") || gqlMeta.signalOption.onlyFor === "restapi" || !["Query", "Mutation"].includes(gqlMeta.type))
|
|
55
81
|
continue;
|
|
56
82
|
else if (gqlMeta.signalOption.sso)
|
|
57
83
|
continue;
|
|
58
|
-
const [argMetas, internalArgMetas] = getArgMetas(Rsv, gqlMeta.key);
|
|
84
|
+
const [argMetas, internalArgMetas] = (0, import_signal.getArgMetas)(Rsv, gqlMeta.key);
|
|
59
85
|
const descriptor = Object.getOwnPropertyDescriptor(Rsv.prototype, gqlMeta.key) ?? {};
|
|
60
86
|
for (const argMeta of argMetas) {
|
|
61
87
|
Nest.Args({
|
|
@@ -68,27 +94,27 @@ const resolverOf = (sigRef, allSrvs) => {
|
|
|
68
94
|
const decorate = internalArgMap[internalArgMeta.type];
|
|
69
95
|
decorate(internalArgMeta.option ?? {})(Rsv.prototype, gqlMeta.key, internalArgMeta.idx);
|
|
70
96
|
}
|
|
71
|
-
UseGuards(...gqlMeta.guards.map((guard) => guards[guard]))(Rsv.prototype, gqlMeta.key, descriptor);
|
|
97
|
+
(0, import_common2.UseGuards)(...gqlMeta.guards.map((guard) => import_nest.guards[guard]))(Rsv.prototype, gqlMeta.key, descriptor);
|
|
72
98
|
if (gqlMeta.type === "Query")
|
|
73
99
|
Nest.Query(getNestReturn(gqlMeta.returns), gqlMeta.signalOption)(Rsv.prototype, gqlMeta.key, descriptor);
|
|
74
100
|
else if (gqlMeta.type === "Mutation")
|
|
75
101
|
Nest.Mutation(getNestReturn(gqlMeta.returns), gqlMeta.signalOption)(Rsv.prototype, gqlMeta.key, descriptor);
|
|
76
102
|
}
|
|
77
|
-
const resolveFieldMetas = getResolveFieldMetas(Rsv);
|
|
103
|
+
const resolveFieldMetas = (0, import_signal.getResolveFieldMetas)(Rsv);
|
|
78
104
|
if (sigMeta.returns) {
|
|
79
105
|
const modelRef = sigMeta.returns();
|
|
80
|
-
const fieldMetas = getFieldMetas(modelRef);
|
|
106
|
+
const fieldMetas = (0, import_constant.getFieldMetas)(modelRef);
|
|
81
107
|
fieldMetas.filter((fieldMeta) => fieldMeta.isClass && !fieldMeta.isScalar).forEach((fieldMeta) => {
|
|
82
|
-
const classMeta = getClassMeta(fieldMeta.modelRef);
|
|
83
|
-
const modelName = lowerlize(classMeta.type === "light" ? classMeta.refName.slice(5) : classMeta.refName);
|
|
84
|
-
const className = capitalize(modelName);
|
|
108
|
+
const classMeta = (0, import_constant.getClassMeta)(fieldMeta.modelRef);
|
|
109
|
+
const modelName = (0, import_common.lowerlize)(classMeta.type === "light" ? classMeta.refName.slice(5) : classMeta.refName);
|
|
110
|
+
const className = (0, import_common.capitalize)(modelName);
|
|
85
111
|
const serviceName = `${modelName}Service`;
|
|
86
112
|
Rsv.prototype[fieldMeta.key] = async function(parent) {
|
|
87
113
|
const service = this[serviceName];
|
|
88
114
|
return fieldMeta.arrDepth ? await service[`load${className}Many`](parent[fieldMeta.key]) : await service[`load${className}`](parent[fieldMeta.key]);
|
|
89
115
|
};
|
|
90
116
|
Nest.Parent()(Rsv.prototype, fieldMeta.key, 0);
|
|
91
|
-
Nest.ResolveField(getNestReturn(() => arraiedModel(fieldMeta.modelRef, fieldMeta.arrDepth)))(
|
|
117
|
+
Nest.ResolveField(getNestReturn(() => (0, import_base.arraiedModel)(fieldMeta.modelRef, fieldMeta.arrDepth)))(
|
|
92
118
|
Rsv.prototype,
|
|
93
119
|
fieldMeta.key,
|
|
94
120
|
Object.getOwnPropertyDescriptor(Rsv.prototype, fieldMeta.key) ?? {}
|
|
@@ -96,7 +122,7 @@ const resolverOf = (sigRef, allSrvs) => {
|
|
|
96
122
|
});
|
|
97
123
|
}
|
|
98
124
|
for (const resolveFieldMeta of resolveFieldMetas) {
|
|
99
|
-
const [, internalArgMetas] = getArgMetas(Rsv, resolveFieldMeta.key);
|
|
125
|
+
const [, internalArgMetas] = (0, import_signal.getArgMetas)(Rsv, resolveFieldMeta.key);
|
|
100
126
|
for (const internalArgMeta of internalArgMetas) {
|
|
101
127
|
const decorate = internalArgMap[internalArgMeta.type];
|
|
102
128
|
decorate(internalArgMeta.option ?? {})(Rsv.prototype, resolveFieldMeta.key, internalArgMeta.idx);
|
|
@@ -113,6 +139,7 @@ const resolverOf = (sigRef, allSrvs) => {
|
|
|
113
139
|
Nest.Resolver()(Rsv);
|
|
114
140
|
return Rsv;
|
|
115
141
|
};
|
|
116
|
-
export
|
|
142
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
143
|
+
0 && (module.exports = {
|
|
117
144
|
resolverOf
|
|
118
|
-
};
|
|
145
|
+
});
|
package/src/resolver.mjs
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { arraiedModel, Float, getNonArrayModel, ID, Int, JSON, Upload } from "@akanjs/base";
|
|
2
|
+
import { capitalize, lowerlize } from "@akanjs/common";
|
|
3
|
+
import { getClassMeta, getFieldMetas } from "@akanjs/constant";
|
|
4
|
+
import { Access, Account, guards, Me, Req, Res, Self, UserIp } from "@akanjs/nest";
|
|
5
|
+
import { isServiceEnabled } from "@akanjs/service";
|
|
6
|
+
import {
|
|
7
|
+
copySignal,
|
|
8
|
+
getArgMetas,
|
|
9
|
+
getGqlMetas,
|
|
10
|
+
getResolveFieldMetas,
|
|
11
|
+
getSigMeta
|
|
12
|
+
} from "@akanjs/signal";
|
|
13
|
+
import { Inject, UseGuards } from "@nestjs/common";
|
|
14
|
+
import * as Nest from "@nestjs/graphql";
|
|
15
|
+
import GraphQLJson from "graphql-type-json";
|
|
16
|
+
import { GraphQLUpload } from "graphql-upload";
|
|
17
|
+
import { generateGql, generateGqlInput } from "./gql";
|
|
18
|
+
const scalarNestReturnMap = /* @__PURE__ */ new Map([
|
|
19
|
+
[Upload, GraphQLUpload],
|
|
20
|
+
[ID, Nest.ID],
|
|
21
|
+
[Int, Nest.Int],
|
|
22
|
+
[Float, Nest.Float],
|
|
23
|
+
[JSON, GraphQLJson],
|
|
24
|
+
[Boolean, Boolean],
|
|
25
|
+
[Date, Date],
|
|
26
|
+
[String, String],
|
|
27
|
+
[Map, GraphQLJson]
|
|
28
|
+
]);
|
|
29
|
+
const getNestReturn = (returns, type = "object") => {
|
|
30
|
+
const [model, arrDepth] = getNonArrayModel(returns());
|
|
31
|
+
const modelRef = scalarNestReturnMap.get(model) ?? (type === "object" ? generateGql(model) : generateGqlInput(model));
|
|
32
|
+
return () => arraiedModel(modelRef, arrDepth);
|
|
33
|
+
};
|
|
34
|
+
const internalArgMap = {
|
|
35
|
+
Parent: Nest.Parent,
|
|
36
|
+
Account,
|
|
37
|
+
UserIp,
|
|
38
|
+
Access,
|
|
39
|
+
Self,
|
|
40
|
+
Me,
|
|
41
|
+
Req,
|
|
42
|
+
Res
|
|
43
|
+
};
|
|
44
|
+
const resolverOf = (sigRef, allSrvs) => {
|
|
45
|
+
const Rsv = copySignal(sigRef);
|
|
46
|
+
const sigMeta = getSigMeta(Rsv);
|
|
47
|
+
const gqlMetas = getGqlMetas(Rsv);
|
|
48
|
+
Object.keys(allSrvs).forEach((srv) => {
|
|
49
|
+
if (!isServiceEnabled(allSrvs[srv]))
|
|
50
|
+
return;
|
|
51
|
+
Inject(allSrvs[srv])(Rsv.prototype, lowerlize(srv));
|
|
52
|
+
});
|
|
53
|
+
for (const gqlMeta of gqlMetas) {
|
|
54
|
+
if (gqlMeta.guards.some((guard) => guard === "None") || gqlMeta.signalOption.onlyFor === "restapi" || !["Query", "Mutation"].includes(gqlMeta.type))
|
|
55
|
+
continue;
|
|
56
|
+
else if (gqlMeta.signalOption.sso)
|
|
57
|
+
continue;
|
|
58
|
+
const [argMetas, internalArgMetas] = getArgMetas(Rsv, gqlMeta.key);
|
|
59
|
+
const descriptor = Object.getOwnPropertyDescriptor(Rsv.prototype, gqlMeta.key) ?? {};
|
|
60
|
+
for (const argMeta of argMetas) {
|
|
61
|
+
Nest.Args({
|
|
62
|
+
name: argMeta.name,
|
|
63
|
+
type: getNestReturn(argMeta.returns, "input"),
|
|
64
|
+
...argMeta.argsOption
|
|
65
|
+
})(Rsv.prototype, gqlMeta.key, argMeta.idx);
|
|
66
|
+
}
|
|
67
|
+
for (const internalArgMeta of internalArgMetas) {
|
|
68
|
+
const decorate = internalArgMap[internalArgMeta.type];
|
|
69
|
+
decorate(internalArgMeta.option ?? {})(Rsv.prototype, gqlMeta.key, internalArgMeta.idx);
|
|
70
|
+
}
|
|
71
|
+
UseGuards(...gqlMeta.guards.map((guard) => guards[guard]))(Rsv.prototype, gqlMeta.key, descriptor);
|
|
72
|
+
if (gqlMeta.type === "Query")
|
|
73
|
+
Nest.Query(getNestReturn(gqlMeta.returns), gqlMeta.signalOption)(Rsv.prototype, gqlMeta.key, descriptor);
|
|
74
|
+
else if (gqlMeta.type === "Mutation")
|
|
75
|
+
Nest.Mutation(getNestReturn(gqlMeta.returns), gqlMeta.signalOption)(Rsv.prototype, gqlMeta.key, descriptor);
|
|
76
|
+
}
|
|
77
|
+
const resolveFieldMetas = getResolveFieldMetas(Rsv);
|
|
78
|
+
if (sigMeta.returns) {
|
|
79
|
+
const modelRef = sigMeta.returns();
|
|
80
|
+
const fieldMetas = getFieldMetas(modelRef);
|
|
81
|
+
fieldMetas.filter((fieldMeta) => fieldMeta.isClass && !fieldMeta.isScalar).forEach((fieldMeta) => {
|
|
82
|
+
const classMeta = getClassMeta(fieldMeta.modelRef);
|
|
83
|
+
const modelName = lowerlize(classMeta.type === "light" ? classMeta.refName.slice(5) : classMeta.refName);
|
|
84
|
+
const className = capitalize(modelName);
|
|
85
|
+
const serviceName = `${modelName}Service`;
|
|
86
|
+
Rsv.prototype[fieldMeta.key] = async function(parent) {
|
|
87
|
+
const service = this[serviceName];
|
|
88
|
+
return fieldMeta.arrDepth ? await service[`load${className}Many`](parent[fieldMeta.key]) : await service[`load${className}`](parent[fieldMeta.key]);
|
|
89
|
+
};
|
|
90
|
+
Nest.Parent()(Rsv.prototype, fieldMeta.key, 0);
|
|
91
|
+
Nest.ResolveField(getNestReturn(() => arraiedModel(fieldMeta.modelRef, fieldMeta.arrDepth)))(
|
|
92
|
+
Rsv.prototype,
|
|
93
|
+
fieldMeta.key,
|
|
94
|
+
Object.getOwnPropertyDescriptor(Rsv.prototype, fieldMeta.key) ?? {}
|
|
95
|
+
);
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
for (const resolveFieldMeta of resolveFieldMetas) {
|
|
99
|
+
const [, internalArgMetas] = getArgMetas(Rsv, resolveFieldMeta.key);
|
|
100
|
+
for (const internalArgMeta of internalArgMetas) {
|
|
101
|
+
const decorate = internalArgMap[internalArgMeta.type];
|
|
102
|
+
decorate(internalArgMeta.option ?? {})(Rsv.prototype, resolveFieldMeta.key, internalArgMeta.idx);
|
|
103
|
+
}
|
|
104
|
+
Nest.ResolveField(getNestReturn(resolveFieldMeta.returns))(
|
|
105
|
+
Rsv.prototype,
|
|
106
|
+
resolveFieldMeta.key,
|
|
107
|
+
Object.getOwnPropertyDescriptor(Rsv.prototype, resolveFieldMeta.key) ?? {}
|
|
108
|
+
);
|
|
109
|
+
}
|
|
110
|
+
if (sigMeta.returns)
|
|
111
|
+
Nest.Resolver(getNestReturn(sigMeta.returns))(Rsv);
|
|
112
|
+
else
|
|
113
|
+
Nest.Resolver()(Rsv);
|
|
114
|
+
return Rsv;
|
|
115
|
+
};
|
|
116
|
+
export {
|
|
117
|
+
resolverOf
|
|
118
|
+
};
|
package/src/schema.js
CHANGED
|
@@ -1,19 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
5
|
+
var __export = (target, all) => {
|
|
6
|
+
for (var name in all)
|
|
7
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
8
|
+
};
|
|
9
|
+
var __copyProps = (to, from, except, desc) => {
|
|
10
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
11
|
+
for (let key of __getOwnPropNames(from))
|
|
12
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
13
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
14
|
+
}
|
|
15
|
+
return to;
|
|
16
|
+
};
|
|
17
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
18
|
+
var schema_exports = {};
|
|
19
|
+
__export(schema_exports, {
|
|
20
|
+
addSchema: () => addSchema,
|
|
21
|
+
schemaOf: () => schemaOf
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(schema_exports);
|
|
24
|
+
var import_base = require("@akanjs/base");
|
|
25
|
+
var import_common = require("@akanjs/common");
|
|
26
|
+
var import_constant = require("@akanjs/constant");
|
|
27
|
+
var import_document = require("@akanjs/document");
|
|
28
|
+
var import_signal = require("@akanjs/signal");
|
|
29
|
+
var import_mongoose = require("mongoose");
|
|
30
|
+
var import__ = require(".");
|
|
8
31
|
class ScalarSchemaStorage {
|
|
9
32
|
}
|
|
10
33
|
class SchemaStorage {
|
|
11
34
|
}
|
|
12
35
|
const scalarMongoTypeMap = /* @__PURE__ */ new Map([
|
|
13
|
-
[ID, ObjectId],
|
|
14
|
-
[Int, Number],
|
|
15
|
-
[Float, Number],
|
|
16
|
-
[JSON, Schema.Types.Mixed],
|
|
36
|
+
[import_base.ID, import_document.ObjectId],
|
|
37
|
+
[import_base.Int, Number],
|
|
38
|
+
[import_base.Float, Number],
|
|
39
|
+
[import_base.JSON, import_mongoose.Schema.Types.Mixed],
|
|
17
40
|
[Map, Map],
|
|
18
41
|
[String, String],
|
|
19
42
|
[Boolean, Boolean],
|
|
@@ -22,13 +45,13 @@ const scalarMongoTypeMap = /* @__PURE__ */ new Map([
|
|
|
22
45
|
const applyMongoProp = (schemaProps, fieldMeta) => {
|
|
23
46
|
if (["id", "createdAt", "updatedAt"].includes(fieldMeta.key) || fieldMeta.fieldType === "resolve")
|
|
24
47
|
return;
|
|
25
|
-
const type = fieldMeta.isClass ? fieldMeta.isScalar ? createSchema(fieldMeta.modelRef) : ObjectId : scalarMongoTypeMap.get(fieldMeta.modelRef) ?? fieldMeta.modelRef;
|
|
48
|
+
const type = fieldMeta.isClass ? fieldMeta.isScalar ? createSchema(fieldMeta.modelRef) : import_document.ObjectId : scalarMongoTypeMap.get(fieldMeta.modelRef) ?? fieldMeta.modelRef;
|
|
26
49
|
let prop = {};
|
|
27
50
|
if (fieldMeta.optArrDepth) {
|
|
28
51
|
prop.type = type;
|
|
29
52
|
prop.required = true;
|
|
30
53
|
if (fieldMeta.isClass && !fieldMeta.refPath)
|
|
31
|
-
prop.ref = getClassMeta(fieldMeta.modelRef).refName;
|
|
54
|
+
prop.ref = (0, import_constant.getClassMeta)(fieldMeta.modelRef).refName;
|
|
32
55
|
if (fieldMeta.refPath)
|
|
33
56
|
prop.refPath = fieldMeta.refPath;
|
|
34
57
|
if (typeof fieldMeta.min === "number")
|
|
@@ -43,20 +66,20 @@ const applyMongoProp = (schemaProps, fieldMeta) => {
|
|
|
43
66
|
prop.maxlength = fieldMeta.maxlength;
|
|
44
67
|
if (fieldMeta.validate) {
|
|
45
68
|
prop.validate = function(value) {
|
|
46
|
-
return fieldMeta.validate?.(fieldMeta.name === "Date" && !!value ? dayjs() : value, this) ?? true;
|
|
69
|
+
return fieldMeta.validate?.(fieldMeta.name === "Date" && !!value ? (0, import_base.dayjs)() : value, this) ?? true;
|
|
47
70
|
};
|
|
48
71
|
}
|
|
49
|
-
prop = { type: arraiedModel(prop, fieldMeta.optArrDepth), default: [], required: true };
|
|
72
|
+
prop = { type: (0, import_base.arraiedModel)(prop, fieldMeta.optArrDepth), default: [], required: true };
|
|
50
73
|
if (fieldMeta.modelRef.prototype === Date.prototype) {
|
|
51
|
-
prop.get = (dates) => dates.map((date) => dayjs(date));
|
|
74
|
+
prop.get = (dates) => dates.map((date) => (0, import_base.dayjs)(date));
|
|
52
75
|
prop.set = (days) => days.map((day) => day.toDate());
|
|
53
76
|
}
|
|
54
|
-
if (fieldMeta.isClass && !fieldMeta.isScalar || fieldMeta.modelRef.prototype === ID.prototype) {
|
|
77
|
+
if (fieldMeta.isClass && !fieldMeta.isScalar || fieldMeta.modelRef.prototype === import_base.ID.prototype) {
|
|
55
78
|
prop.get = (ids) => ids.map((id) => id.toString());
|
|
56
|
-
prop.set = (ids) => ids.map((id) => new Types.ObjectId(id));
|
|
79
|
+
prop.set = (ids) => ids.map((id) => new import_mongoose.Types.ObjectId(id));
|
|
57
80
|
}
|
|
58
81
|
} else {
|
|
59
|
-
prop.type = arraiedModel(type, fieldMeta.arrDepth);
|
|
82
|
+
prop.type = (0, import_base.arraiedModel)(type, fieldMeta.arrDepth);
|
|
60
83
|
prop.required = !fieldMeta.nullable;
|
|
61
84
|
if (fieldMeta.isMap) {
|
|
62
85
|
prop.of = scalarMongoTypeMap.get(fieldMeta.of) ?? createSchema(fieldMeta.of);
|
|
@@ -67,15 +90,15 @@ const applyMongoProp = (schemaProps, fieldMeta) => {
|
|
|
67
90
|
if (typeof fieldMeta.default === "function")
|
|
68
91
|
prop.default = function() {
|
|
69
92
|
const def = fieldMeta.default(this);
|
|
70
|
-
return isDayjs(def) ? def.toDate() : def;
|
|
93
|
+
return (0, import_common.isDayjs)(def) ? def.toDate() : def;
|
|
71
94
|
};
|
|
72
95
|
else
|
|
73
|
-
prop.default = isDayjs(fieldMeta.default) ? fieldMeta.default.toDate() : fieldMeta.default instanceof Enum ? [...fieldMeta.default.values] : fieldMeta.default;
|
|
96
|
+
prop.default = (0, import_common.isDayjs)(fieldMeta.default) ? fieldMeta.default.toDate() : fieldMeta.default instanceof import_base.Enum ? [...fieldMeta.default.values] : fieldMeta.default;
|
|
74
97
|
}
|
|
75
98
|
if (typeof fieldMeta.immutable !== "undefined")
|
|
76
99
|
prop.immutable = fieldMeta.immutable;
|
|
77
100
|
if (fieldMeta.isClass && !fieldMeta.refPath)
|
|
78
|
-
prop.ref = getClassMeta(fieldMeta.modelRef).refName;
|
|
101
|
+
prop.ref = (0, import_constant.getClassMeta)(fieldMeta.modelRef).refName;
|
|
79
102
|
if (fieldMeta.refPath)
|
|
80
103
|
prop.refPath = fieldMeta.refPath;
|
|
81
104
|
if (typeof fieldMeta.min === "number")
|
|
@@ -95,60 +118,60 @@ const applyMongoProp = (schemaProps, fieldMeta) => {
|
|
|
95
118
|
prop.set = (v) => v === null ? void 0 : v;
|
|
96
119
|
}
|
|
97
120
|
if (fieldMeta.modelRef.prototype === Date.prototype) {
|
|
98
|
-
prop.get = (date) => date ? dayjs(date) : void 0;
|
|
99
|
-
prop.set = (day) => day ? dayjs(day).toDate() : void 0;
|
|
121
|
+
prop.get = (date) => date ? (0, import_base.dayjs)(date) : void 0;
|
|
122
|
+
prop.set = (day) => day ? (0, import_base.dayjs)(day).toDate() : void 0;
|
|
100
123
|
}
|
|
101
|
-
if (fieldMeta.isClass && !fieldMeta.isScalar || fieldMeta.modelRef.prototype === ID.prototype) {
|
|
124
|
+
if (fieldMeta.isClass && !fieldMeta.isScalar || fieldMeta.modelRef.prototype === import_base.ID.prototype) {
|
|
102
125
|
prop.get = (id) => id ? id.toString() : void 0;
|
|
103
|
-
prop.set = (id) => id ? new Types.ObjectId(id) : void 0;
|
|
126
|
+
prop.set = (id) => id ? new import_mongoose.Types.ObjectId(id) : void 0;
|
|
104
127
|
}
|
|
105
128
|
if (fieldMeta.isClass && fieldMeta.isScalar && fieldMeta.default === null && !fieldMeta.nullable) {
|
|
106
|
-
prop.default = makeDefault(fieldMeta.modelRef);
|
|
129
|
+
prop.default = (0, import_signal.makeDefault)(fieldMeta.modelRef);
|
|
107
130
|
}
|
|
108
131
|
if (fieldMeta.validate) {
|
|
109
132
|
prop.validate = function(value) {
|
|
110
|
-
return fieldMeta.validate?.(fieldMeta.name === "Date" && !!value ? dayjs() : value, this) ?? true;
|
|
133
|
+
return fieldMeta.validate?.(fieldMeta.name === "Date" && !!value ? (0, import_base.dayjs)() : value, this) ?? true;
|
|
111
134
|
};
|
|
112
135
|
}
|
|
113
136
|
}
|
|
114
137
|
schemaProps[fieldMeta.key] = prop;
|
|
115
138
|
};
|
|
116
139
|
const createSchema = (modelRef) => {
|
|
117
|
-
const classMeta = getClassMeta(modelRef);
|
|
140
|
+
const classMeta = (0, import_constant.getClassMeta)(modelRef);
|
|
118
141
|
const schemaMeta = Reflect.getMetadata(classMeta.refName, ScalarSchemaStorage.prototype);
|
|
119
142
|
if (schemaMeta)
|
|
120
143
|
return schemaMeta;
|
|
121
|
-
const fieldMetas = getFieldMetas(modelRef);
|
|
144
|
+
const fieldMetas = (0, import_constant.getFieldMetas)(modelRef);
|
|
122
145
|
const schemaProps = {};
|
|
123
146
|
fieldMetas.forEach((fieldMeta) => {
|
|
124
147
|
applyMongoProp(schemaProps, fieldMeta);
|
|
125
148
|
});
|
|
126
|
-
const schema = new Schema(schemaProps);
|
|
149
|
+
const schema = new import_mongoose.Schema(schemaProps);
|
|
127
150
|
Reflect.defineMetadata(classMeta.refName, schema, ScalarSchemaStorage.prototype);
|
|
128
151
|
return schema;
|
|
129
152
|
};
|
|
130
153
|
const schemaOf = (modelRef, docRef, middleware) => {
|
|
131
|
-
const classMeta = getClassMeta(docRef);
|
|
154
|
+
const classMeta = (0, import_constant.getClassMeta)(docRef);
|
|
132
155
|
const schemaMeta = Reflect.getMetadata(classMeta.refName, SchemaStorage.prototype);
|
|
133
156
|
if (schemaMeta)
|
|
134
157
|
return schemaMeta;
|
|
135
|
-
const fieldMetas = getFieldMetas(docRef);
|
|
158
|
+
const fieldMetas = (0, import_constant.getFieldMetas)(docRef);
|
|
136
159
|
const schemaProps = {
|
|
137
160
|
createdAt: {
|
|
138
161
|
type: Date,
|
|
139
|
-
get: (date) => date ? dayjs(date) : date,
|
|
140
|
-
set: (day) => day ? dayjs(day).toDate() : day
|
|
162
|
+
get: (date) => date ? (0, import_base.dayjs)(date) : date,
|
|
163
|
+
set: (day) => day ? (0, import_base.dayjs)(day).toDate() : day
|
|
141
164
|
},
|
|
142
165
|
updatedAt: {
|
|
143
166
|
type: Date,
|
|
144
|
-
get: (date) => date ? dayjs(date) : date,
|
|
145
|
-
set: (day) => day ? dayjs(day).toDate() : day
|
|
167
|
+
get: (date) => date ? (0, import_base.dayjs)(date) : date,
|
|
168
|
+
set: (day) => day ? (0, import_base.dayjs)(day).toDate() : day
|
|
146
169
|
}
|
|
147
170
|
};
|
|
148
171
|
fieldMetas.forEach((fieldMeta) => {
|
|
149
172
|
applyMongoProp(schemaProps, fieldMeta);
|
|
150
173
|
});
|
|
151
|
-
const schema = new Schema(schemaProps, getDefaultSchemaOptions());
|
|
174
|
+
const schema = new import_mongoose.Schema(schemaProps, (0, import_document.getDefaultSchemaOptions)());
|
|
152
175
|
schema.methods.refresh = async function() {
|
|
153
176
|
Object.assign(this, await this.constructor.findById(this._id));
|
|
154
177
|
return this;
|
|
@@ -173,36 +196,36 @@ const schemaOf = (modelRef, docRef, middleware) => {
|
|
|
173
196
|
return schema;
|
|
174
197
|
};
|
|
175
198
|
const addSchema = (modelRef, docRef, inputRef, middleware) => {
|
|
176
|
-
const originDocClassMeta = getClassMeta(docRef);
|
|
177
|
-
const originInputClassMeta = getClassMeta(inputRef);
|
|
178
|
-
const originDoc = getFullModelRef(originDocClassMeta.refName);
|
|
179
|
-
const originInput = getInputModelRef(originInputClassMeta.refName);
|
|
180
|
-
const classMeta = getClassMeta(docRef);
|
|
199
|
+
const originDocClassMeta = (0, import_constant.getClassMeta)(docRef);
|
|
200
|
+
const originInputClassMeta = (0, import_constant.getClassMeta)(inputRef);
|
|
201
|
+
const originDoc = (0, import_constant.getFullModelRef)(originDocClassMeta.refName);
|
|
202
|
+
const originInput = (0, import_constant.getInputModelRef)(originInputClassMeta.refName);
|
|
203
|
+
const classMeta = (0, import_constant.getClassMeta)(docRef);
|
|
181
204
|
const modelSchema = Reflect.getMetadata(classMeta.refName, SchemaStorage.prototype);
|
|
182
205
|
if (!modelSchema)
|
|
183
206
|
throw new Error(`Schema of ${classMeta.refName} not found`);
|
|
184
|
-
const fieldMetas = getFieldMetas(docRef);
|
|
207
|
+
const fieldMetas = (0, import_constant.getFieldMetas)(docRef);
|
|
185
208
|
const schemaProps = {
|
|
186
209
|
createdAt: {
|
|
187
210
|
type: Date,
|
|
188
|
-
get: (date) => date ? dayjs(date) : date,
|
|
189
|
-
set: (day) => day ? dayjs(day).toDate() : day
|
|
211
|
+
get: (date) => date ? (0, import_base.dayjs)(date) : date,
|
|
212
|
+
set: (day) => day ? (0, import_base.dayjs)(day).toDate() : day
|
|
190
213
|
},
|
|
191
214
|
updatedAt: {
|
|
192
215
|
type: Date,
|
|
193
|
-
get: (date) => date ? dayjs(date) : date,
|
|
194
|
-
set: (day) => day ? dayjs(day).toDate() : day
|
|
216
|
+
get: (date) => date ? (0, import_base.dayjs)(date) : date,
|
|
217
|
+
set: (day) => day ? (0, import_base.dayjs)(day).toDate() : day
|
|
195
218
|
}
|
|
196
219
|
};
|
|
197
220
|
fieldMetas.forEach((fieldMeta) => {
|
|
198
221
|
applyMongoProp(schemaProps, fieldMeta);
|
|
199
|
-
applyNestField(originDoc, fieldMeta);
|
|
222
|
+
(0, import__.applyNestField)(originDoc, fieldMeta);
|
|
200
223
|
});
|
|
201
|
-
const inputFieldMetas = getFieldMetas(inputRef);
|
|
224
|
+
const inputFieldMetas = (0, import_constant.getFieldMetas)(inputRef);
|
|
202
225
|
inputFieldMetas.forEach((fieldMeta) => {
|
|
203
|
-
applyNestField(originInput, fieldMeta, "input");
|
|
226
|
+
(0, import__.applyNestField)(originInput, fieldMeta, "input");
|
|
204
227
|
});
|
|
205
|
-
const schema = new Schema(schemaProps, getDefaultSchemaOptions());
|
|
228
|
+
const schema = new import_mongoose.Schema(schemaProps, (0, import_document.getDefaultSchemaOptions)());
|
|
206
229
|
modelSchema.add(schema);
|
|
207
230
|
Object.getOwnPropertyNames(docRef.prototype).forEach((name) => {
|
|
208
231
|
if (name === "constructor")
|
|
@@ -213,7 +236,8 @@ const addSchema = (modelRef, docRef, inputRef, middleware) => {
|
|
|
213
236
|
onSchema?.(modelSchema);
|
|
214
237
|
return modelSchema;
|
|
215
238
|
};
|
|
216
|
-
export
|
|
239
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
240
|
+
0 && (module.exports = {
|
|
217
241
|
addSchema,
|
|
218
242
|
schemaOf
|
|
219
|
-
};
|
|
243
|
+
});
|