@feathersjs/schema 5.0.0-pre.31 → 5.0.0-pre.33
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/CHANGELOG.md +11 -0
- package/lib/hooks/resolve.d.ts +12 -13
- package/lib/hooks/resolve.js +43 -33
- package/lib/hooks/resolve.js.map +1 -1
- package/lib/resolver.d.ts +2 -1
- package/lib/resolver.js +5 -1
- package/lib/resolver.js.map +1 -1
- package/package.json +8 -8
- package/src/hooks/resolve.ts +60 -47
- package/src/resolver.ts +11 -3
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,17 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [5.0.0-pre.33](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.32...v5.0.0-pre.33) (2022-11-08)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @feathersjs/schema
|
|
9
|
+
|
|
10
|
+
# [5.0.0-pre.32](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.31...v5.0.0-pre.32) (2022-10-26)
|
|
11
|
+
|
|
12
|
+
### Bug Fixes
|
|
13
|
+
|
|
14
|
+
- **schema:** Improve resolver performance ([#2822](https://github.com/feathersjs/feathers/issues/2822)) ([5fa900f](https://github.com/feathersjs/feathers/commit/5fa900f90d55859332c90283dddddab26ae3759c))
|
|
15
|
+
- **schema:** Use the same options for resolveData hook ([#2833](https://github.com/feathersjs/feathers/issues/2833)) ([ed3b050](https://github.com/feathersjs/feathers/commit/ed3b05051db6886729d4824825ca8f00c2459af7))
|
|
16
|
+
|
|
6
17
|
# [5.0.0-pre.31](https://github.com/feathersjs/feathers/compare/v5.0.0-pre.30...v5.0.0-pre.31) (2022-10-12)
|
|
7
18
|
|
|
8
19
|
### Features
|
package/lib/hooks/resolve.d.ts
CHANGED
|
@@ -1,22 +1,21 @@
|
|
|
1
1
|
import { HookContext, NextFunction } from '@feathersjs/feathers';
|
|
2
2
|
import { Resolver } from '../resolver';
|
|
3
3
|
export declare type ResolverSetting<H extends HookContext> = Resolver<any, H> | Resolver<any, H>[];
|
|
4
|
-
export declare
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
export declare const resolveQuery: <T, H extends HookContext<import("@feathersjs/feathers").Application<any, any>, any>>(...resolvers: Resolver<T, H>[]) => (context: H, next?: NextFunction) => Promise<any>;
|
|
5
|
+
export declare const resolveData: <T, H extends HookContext<import("@feathersjs/feathers").Application<any, any>, any>>(...resolvers: Resolver<T, H>[]) => (context: H, next?: NextFunction) => Promise<any>;
|
|
6
|
+
export declare const resolveResult: <T, H extends HookContext<import("@feathersjs/feathers").Application<any, any>, any>>(...resolvers: Resolver<T, H>[]) => (context: H, next?: NextFunction) => Promise<void>;
|
|
7
|
+
export declare const DISPATCH: unique symbol;
|
|
8
|
+
export declare const getDispatch: (value: any, fallback?: any) => any;
|
|
9
|
+
export declare const resolveDispatch: <T, H extends HookContext<import("@feathersjs/feathers").Application<any, any>, any>>(...resolvers: Resolver<T, H>[]) => (context: H, next?: NextFunction) => Promise<void>;
|
|
10
|
+
export declare const resolveExternal: <T, H extends HookContext<import("@feathersjs/feathers").Application<any, any>, any>>(...resolvers: Resolver<T, H>[]) => (context: H, next?: NextFunction) => Promise<void>;
|
|
9
11
|
export declare type ResolveAllSettings<H extends HookContext> = {
|
|
10
|
-
data?:
|
|
12
|
+
data?: {
|
|
13
|
+
create: Resolver<any, H>;
|
|
14
|
+
patch: Resolver<any, H>;
|
|
15
|
+
update: Resolver<any, H>;
|
|
16
|
+
};
|
|
11
17
|
query?: Resolver<any, H>;
|
|
12
18
|
result?: Resolver<any, H>;
|
|
13
19
|
dispatch?: Resolver<any, H>;
|
|
14
20
|
};
|
|
15
|
-
export declare const DISPATCH: unique symbol;
|
|
16
|
-
export declare const getDispatch: (value: any) => any;
|
|
17
|
-
export declare const resolveQuery: <T, H extends HookContext<import("@feathersjs/feathers").Application<any, any>, any>>(...resolvers: Resolver<T, H>[]) => (context: H, next?: NextFunction) => Promise<any>;
|
|
18
|
-
export declare const resolveData: <H extends HookContext<import("@feathersjs/feathers").Application<any, any>, any>>(settings: DataResolvers<H> | Resolver<any, H>) => (context: H, next?: NextFunction) => Promise<any>;
|
|
19
|
-
export declare const resolveResult: <T, H extends HookContext<import("@feathersjs/feathers").Application<any, any>, any>>(...resolvers: Resolver<T, H>[]) => (context: H, next?: NextFunction) => Promise<void>;
|
|
20
|
-
export declare const resolveDispatch: <T, H extends HookContext<import("@feathersjs/feathers").Application<any, any>, any>>(...resolvers: Resolver<T, H>[]) => (context: H, next?: NextFunction) => Promise<void>;
|
|
21
|
-
export declare const resolveExternal: <T, H extends HookContext<import("@feathersjs/feathers").Application<any, any>, any>>(...resolvers: Resolver<T, H>[]) => (context: H, next?: NextFunction) => Promise<void>;
|
|
22
21
|
export declare const resolveAll: <H extends HookContext<import("@feathersjs/feathers").Application<any, any>, any>>(map: ResolveAllSettings<H>) => (this: any, context: H, next?: import("@feathersjs/hooks").AsyncMiddleware<H>) => Promise<any>;
|
package/lib/hooks/resolve.js
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.resolveAll = exports.resolveExternal = exports.resolveDispatch = exports.
|
|
3
|
+
exports.resolveAll = exports.resolveExternal = exports.resolveDispatch = exports.getDispatch = exports.DISPATCH = exports.resolveResult = exports.resolveData = exports.resolveQuery = void 0;
|
|
4
4
|
const hooks_1 = require("@feathersjs/hooks");
|
|
5
|
-
const resolver_1 = require("../resolver");
|
|
6
5
|
const getContext = (context) => {
|
|
7
6
|
return Object.freeze({
|
|
8
7
|
...context,
|
|
@@ -26,9 +25,6 @@ const runResolvers = async (resolvers, data, ctx, status) => {
|
|
|
26
25
|
}
|
|
27
26
|
return current;
|
|
28
27
|
};
|
|
29
|
-
exports.DISPATCH = Symbol('@feathersjs/schema/dispatch');
|
|
30
|
-
const getDispatch = (value) => typeof value === 'object' && value !== null && value[exports.DISPATCH] !== undefined ? value[exports.DISPATCH] : value;
|
|
31
|
-
exports.getDispatch = getDispatch;
|
|
32
28
|
const resolveQuery = (...resolvers) => async (context, next) => {
|
|
33
29
|
var _a;
|
|
34
30
|
const ctx = getContext(context);
|
|
@@ -43,9 +39,8 @@ const resolveQuery = (...resolvers) => async (context, next) => {
|
|
|
43
39
|
}
|
|
44
40
|
};
|
|
45
41
|
exports.resolveQuery = resolveQuery;
|
|
46
|
-
const resolveData = (
|
|
47
|
-
if (context.
|
|
48
|
-
const resolvers = settings instanceof resolver_1.Resolver ? [settings] : [settings[context.method]];
|
|
42
|
+
const resolveData = (...resolvers) => async (context, next) => {
|
|
43
|
+
if (context.data !== undefined) {
|
|
49
44
|
const ctx = getContext(context);
|
|
50
45
|
const data = context.data;
|
|
51
46
|
const status = {
|
|
@@ -93,38 +88,48 @@ const resolveResult = (...resolvers) => async (context, next) => {
|
|
|
93
88
|
}
|
|
94
89
|
};
|
|
95
90
|
exports.resolveResult = resolveResult;
|
|
91
|
+
exports.DISPATCH = Symbol('@feathersjs/schema/dispatch');
|
|
92
|
+
const getDispatch = (value, fallback = value) => typeof value === 'object' && value !== null && value[exports.DISPATCH] !== undefined ? value[exports.DISPATCH] : fallback;
|
|
93
|
+
exports.getDispatch = getDispatch;
|
|
96
94
|
const resolveDispatch = (...resolvers) => async (context, next) => {
|
|
97
95
|
if (typeof next === 'function') {
|
|
98
96
|
await next();
|
|
99
97
|
}
|
|
100
98
|
const ctx = getContext(context);
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
data
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
99
|
+
const existingDispatch = (0, exports.getDispatch)(context.result, null);
|
|
100
|
+
if (existingDispatch !== null) {
|
|
101
|
+
context.dispatch = existingDispatch;
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
const status = context.params.resolve;
|
|
105
|
+
const { isPaginated, data } = getData(context);
|
|
106
|
+
const resolveAndGetDispatch = async (current) => {
|
|
107
|
+
const resolved = await runResolvers(resolvers, current, ctx, status);
|
|
108
|
+
return Object.keys(resolved).reduce((res, key) => {
|
|
109
|
+
res[key] = (0, exports.getDispatch)(resolved[key]);
|
|
110
|
+
return res;
|
|
111
|
+
}, {});
|
|
112
|
+
};
|
|
113
|
+
const result = await (Array.isArray(data)
|
|
114
|
+
? Promise.all(data.map(resolveAndGetDispatch))
|
|
115
|
+
: resolveAndGetDispatch(data));
|
|
116
|
+
const dispatch = isPaginated
|
|
117
|
+
? {
|
|
118
|
+
...context.result,
|
|
119
|
+
data: result
|
|
120
|
+
}
|
|
121
|
+
: result;
|
|
122
|
+
context.dispatch = dispatch;
|
|
123
|
+
Object.defineProperty(context.result, exports.DISPATCH, {
|
|
124
|
+
value: dispatch,
|
|
125
|
+
enumerable: false,
|
|
126
|
+
configurable: false
|
|
127
|
+
});
|
|
128
|
+
}
|
|
125
129
|
};
|
|
126
130
|
exports.resolveDispatch = resolveDispatch;
|
|
127
131
|
exports.resolveExternal = exports.resolveDispatch;
|
|
132
|
+
const dataMethods = ['create', 'update', 'patch'];
|
|
128
133
|
const resolveAll = (map) => {
|
|
129
134
|
const middleware = [];
|
|
130
135
|
middleware.push((0, exports.resolveDispatch)(map.dispatch));
|
|
@@ -135,7 +140,12 @@ const resolveAll = (map) => {
|
|
|
135
140
|
middleware.push((0, exports.resolveQuery)(map.query));
|
|
136
141
|
}
|
|
137
142
|
if (map.data) {
|
|
138
|
-
|
|
143
|
+
dataMethods.forEach((name) => {
|
|
144
|
+
if (map.data[name]) {
|
|
145
|
+
const resolver = (0, exports.resolveData)(map.data[name]);
|
|
146
|
+
middleware.push(async (context, next) => context.method === name ? resolver(context, next) : next());
|
|
147
|
+
}
|
|
148
|
+
});
|
|
139
149
|
}
|
|
140
150
|
return (0, hooks_1.compose)(middleware);
|
|
141
151
|
};
|
package/lib/hooks/resolve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/hooks/resolve.ts"],"names":[],"mappings":";;;AACA,6CAA2C;
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../../src/hooks/resolve.ts"],"names":[],"mappings":"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"}
|
package/lib/resolver.d.ts
CHANGED
|
@@ -23,12 +23,13 @@ export interface ResolverConfig<T, C> {
|
|
|
23
23
|
export interface ResolverStatus<T, C> {
|
|
24
24
|
path: string[];
|
|
25
25
|
originalContext?: C;
|
|
26
|
-
properties?:
|
|
26
|
+
properties?: (keyof T)[];
|
|
27
27
|
stack: PropertyResolver<T, any, C>[];
|
|
28
28
|
}
|
|
29
29
|
export declare class Resolver<T, C> {
|
|
30
30
|
options: ResolverConfig<T, C>;
|
|
31
31
|
readonly _type: T;
|
|
32
|
+
protected propertyNames: string[];
|
|
32
33
|
constructor(options: ResolverConfig<T, C>);
|
|
33
34
|
/**
|
|
34
35
|
* Resolve a single property
|
package/lib/resolver.js
CHANGED
|
@@ -5,6 +5,7 @@ const errors_1 = require("@feathersjs/errors");
|
|
|
5
5
|
class Resolver {
|
|
6
6
|
constructor(options) {
|
|
7
7
|
this.options = options;
|
|
8
|
+
this.propertyNames = Object.keys(options.properties);
|
|
8
9
|
}
|
|
9
10
|
/**
|
|
10
11
|
* Resolve a single property
|
|
@@ -40,11 +41,14 @@ class Resolver {
|
|
|
40
41
|
async resolve(_data, context, status) {
|
|
41
42
|
const { properties: resolvers, schema, validate } = this.options;
|
|
42
43
|
const payload = await this.convert(_data, context, status);
|
|
44
|
+
if (!Array.isArray(status === null || status === void 0 ? void 0 : status.properties) && this.propertyNames.length === 0) {
|
|
45
|
+
return payload;
|
|
46
|
+
}
|
|
43
47
|
const data = schema && validate === 'before' ? await schema.validate(payload) : payload;
|
|
44
48
|
const propertyList = (Array.isArray(status === null || status === void 0 ? void 0 : status.properties)
|
|
45
49
|
? status === null || status === void 0 ? void 0 : status.properties
|
|
46
50
|
: // By default get all data and resolver keys but remove duplicates
|
|
47
|
-
[...new Set(Object.keys(data).concat(
|
|
51
|
+
[...new Set(Object.keys(data).concat(this.propertyNames))]);
|
|
48
52
|
const result = {};
|
|
49
53
|
const errors = {};
|
|
50
54
|
let hasErrors = false;
|
package/lib/resolver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":";;;AAAA,+CAA+C;AA4C/C,MAAa,QAAQ;
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@feathersjs/schema",
|
|
3
3
|
"description": "A common data schema definition format",
|
|
4
|
-
"version": "5.0.0-pre.
|
|
4
|
+
"version": "5.0.0-pre.33",
|
|
5
5
|
"homepage": "https://feathersjs.com",
|
|
6
6
|
"main": "lib/",
|
|
7
7
|
"types": "lib/",
|
|
@@ -54,9 +54,9 @@
|
|
|
54
54
|
"access": "public"
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
|
-
"@feathersjs/commons": "^5.0.0-pre.
|
|
58
|
-
"@feathersjs/errors": "^5.0.0-pre.
|
|
59
|
-
"@feathersjs/feathers": "^5.0.0-pre.
|
|
57
|
+
"@feathersjs/commons": "^5.0.0-pre.33",
|
|
58
|
+
"@feathersjs/errors": "^5.0.0-pre.33",
|
|
59
|
+
"@feathersjs/feathers": "^5.0.0-pre.33",
|
|
60
60
|
"@feathersjs/hooks": "^0.7.5",
|
|
61
61
|
"@types/json-schema": "^7.0.11",
|
|
62
62
|
"ajv": "^8.11.0",
|
|
@@ -64,13 +64,13 @@
|
|
|
64
64
|
"json-schema-to-ts": "^2.5.5"
|
|
65
65
|
},
|
|
66
66
|
"devDependencies": {
|
|
67
|
-
"@feathersjs/memory": "^5.0.0-pre.
|
|
67
|
+
"@feathersjs/memory": "^5.0.0-pre.33",
|
|
68
68
|
"@types/mocha": "^10.0.0",
|
|
69
|
-
"@types/node": "^18.
|
|
69
|
+
"@types/node": "^18.11.9",
|
|
70
70
|
"ajv-formats": "^2.1.1",
|
|
71
|
-
"mocha": "^10.
|
|
71
|
+
"mocha": "^10.1.0",
|
|
72
72
|
"shx": "^0.3.4",
|
|
73
73
|
"typescript": "^4.8.4"
|
|
74
74
|
},
|
|
75
|
-
"gitHead": "
|
|
75
|
+
"gitHead": "89f516bcb1457e23a02c6212e9cd8bacc4d267d4"
|
|
76
76
|
}
|
package/src/hooks/resolve.ts
CHANGED
|
@@ -38,24 +38,6 @@ const runResolvers = async <T, H extends HookContext>(
|
|
|
38
38
|
|
|
39
39
|
export type ResolverSetting<H extends HookContext> = Resolver<any, H> | Resolver<any, H>[]
|
|
40
40
|
|
|
41
|
-
export type DataResolvers<H extends HookContext> = {
|
|
42
|
-
create: Resolver<any, H>
|
|
43
|
-
patch: Resolver<any, H>
|
|
44
|
-
update: Resolver<any, H>
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export type ResolveAllSettings<H extends HookContext> = {
|
|
48
|
-
data?: DataResolvers<H>
|
|
49
|
-
query?: Resolver<any, H>
|
|
50
|
-
result?: Resolver<any, H>
|
|
51
|
-
dispatch?: Resolver<any, H>
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
export const DISPATCH = Symbol('@feathersjs/schema/dispatch')
|
|
55
|
-
|
|
56
|
-
export const getDispatch = (value: any) =>
|
|
57
|
-
typeof value === 'object' && value !== null && value[DISPATCH] !== undefined ? value[DISPATCH] : value
|
|
58
|
-
|
|
59
41
|
export const resolveQuery =
|
|
60
42
|
<T, H extends HookContext>(...resolvers: Resolver<T, H>[]) =>
|
|
61
43
|
async (context: H, next?: NextFunction) => {
|
|
@@ -74,10 +56,9 @@ export const resolveQuery =
|
|
|
74
56
|
}
|
|
75
57
|
|
|
76
58
|
export const resolveData =
|
|
77
|
-
<H extends HookContext>(
|
|
59
|
+
<T, H extends HookContext>(...resolvers: Resolver<T, H>[]) =>
|
|
78
60
|
async (context: H, next?: NextFunction) => {
|
|
79
|
-
if (context.
|
|
80
|
-
const resolvers = settings instanceof Resolver ? [settings] : [settings[context.method]]
|
|
61
|
+
if (context.data !== undefined) {
|
|
81
62
|
const ctx = getContext(context)
|
|
82
63
|
const data = context.data
|
|
83
64
|
|
|
@@ -132,6 +113,11 @@ export const resolveResult =
|
|
|
132
113
|
}
|
|
133
114
|
}
|
|
134
115
|
|
|
116
|
+
export const DISPATCH = Symbol('@feathersjs/schema/dispatch')
|
|
117
|
+
|
|
118
|
+
export const getDispatch = (value: any, fallback = value) =>
|
|
119
|
+
typeof value === 'object' && value !== null && value[DISPATCH] !== undefined ? value[DISPATCH] : fallback
|
|
120
|
+
|
|
135
121
|
export const resolveDispatch =
|
|
136
122
|
<T, H extends HookContext>(...resolvers: Resolver<T, H>[]) =>
|
|
137
123
|
async (context: H, next?: NextFunction) => {
|
|
@@ -140,38 +126,57 @@ export const resolveDispatch =
|
|
|
140
126
|
}
|
|
141
127
|
|
|
142
128
|
const ctx = getContext(context)
|
|
143
|
-
const
|
|
144
|
-
const { isPaginated, data } = getData(context)
|
|
145
|
-
const resolveAndGetDispatch = async (current: any) => {
|
|
146
|
-
const resolved: any = await runResolvers(resolvers, current, ctx, status)
|
|
129
|
+
const existingDispatch = getDispatch(context.result, null)
|
|
147
130
|
|
|
148
|
-
|
|
149
|
-
|
|
131
|
+
if (existingDispatch !== null) {
|
|
132
|
+
context.dispatch = existingDispatch
|
|
133
|
+
} else {
|
|
134
|
+
const status = context.params.resolve
|
|
135
|
+
const { isPaginated, data } = getData(context)
|
|
136
|
+
const resolveAndGetDispatch = async (current: any) => {
|
|
137
|
+
const resolved: any = await runResolvers(resolvers, current, ctx, status)
|
|
150
138
|
|
|
151
|
-
return res
|
|
152
|
-
|
|
153
|
-
}
|
|
139
|
+
return Object.keys(resolved).reduce((res, key) => {
|
|
140
|
+
res[key] = getDispatch(resolved[key])
|
|
154
141
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
142
|
+
return res
|
|
143
|
+
}, {} as any)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
const result = await (Array.isArray(data)
|
|
147
|
+
? Promise.all(data.map(resolveAndGetDispatch))
|
|
148
|
+
: resolveAndGetDispatch(data))
|
|
149
|
+
const dispatch = isPaginated
|
|
150
|
+
? {
|
|
151
|
+
...context.result,
|
|
152
|
+
data: result
|
|
153
|
+
}
|
|
154
|
+
: result
|
|
155
|
+
|
|
156
|
+
context.dispatch = dispatch
|
|
157
|
+
Object.defineProperty(context.result, DISPATCH, {
|
|
158
|
+
value: dispatch,
|
|
159
|
+
enumerable: false,
|
|
160
|
+
configurable: false
|
|
161
|
+
})
|
|
162
|
+
}
|
|
171
163
|
}
|
|
172
164
|
|
|
173
165
|
export const resolveExternal = resolveDispatch
|
|
174
166
|
|
|
167
|
+
export type ResolveAllSettings<H extends HookContext> = {
|
|
168
|
+
data?: {
|
|
169
|
+
create: Resolver<any, H>
|
|
170
|
+
patch: Resolver<any, H>
|
|
171
|
+
update: Resolver<any, H>
|
|
172
|
+
}
|
|
173
|
+
query?: Resolver<any, H>
|
|
174
|
+
result?: Resolver<any, H>
|
|
175
|
+
dispatch?: Resolver<any, H>
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
const dataMethods = ['create', 'update', 'patch'] as const
|
|
179
|
+
|
|
175
180
|
export const resolveAll = <H extends HookContext>(map: ResolveAllSettings<H>) => {
|
|
176
181
|
const middleware = []
|
|
177
182
|
|
|
@@ -186,7 +191,15 @@ export const resolveAll = <H extends HookContext>(map: ResolveAllSettings<H>) =>
|
|
|
186
191
|
}
|
|
187
192
|
|
|
188
193
|
if (map.data) {
|
|
189
|
-
|
|
194
|
+
dataMethods.forEach((name) => {
|
|
195
|
+
if (map.data[name]) {
|
|
196
|
+
const resolver = resolveData(map.data[name])
|
|
197
|
+
|
|
198
|
+
middleware.push(async (context: H, next: NextFunction) =>
|
|
199
|
+
context.method === name ? resolver(context, next) : next()
|
|
200
|
+
)
|
|
201
|
+
}
|
|
202
|
+
})
|
|
190
203
|
}
|
|
191
204
|
|
|
192
205
|
return compose(middleware)
|
package/src/resolver.ts
CHANGED
|
@@ -38,14 +38,17 @@ export interface ResolverConfig<T, C> {
|
|
|
38
38
|
export interface ResolverStatus<T, C> {
|
|
39
39
|
path: string[]
|
|
40
40
|
originalContext?: C
|
|
41
|
-
properties?:
|
|
41
|
+
properties?: (keyof T)[]
|
|
42
42
|
stack: PropertyResolver<T, any, C>[]
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
export class Resolver<T, C> {
|
|
46
46
|
readonly _type!: T
|
|
47
|
+
protected propertyNames: string[]
|
|
47
48
|
|
|
48
|
-
constructor(public options: ResolverConfig<T, C>) {
|
|
49
|
+
constructor(public options: ResolverConfig<T, C>) {
|
|
50
|
+
this.propertyNames = Object.keys(options.properties)
|
|
51
|
+
}
|
|
49
52
|
|
|
50
53
|
/**
|
|
51
54
|
* Resolve a single property
|
|
@@ -93,12 +96,17 @@ export class Resolver<T, C> {
|
|
|
93
96
|
async resolve<D>(_data: D, context: C, status?: Partial<ResolverStatus<T, C>>): Promise<T> {
|
|
94
97
|
const { properties: resolvers, schema, validate } = this.options
|
|
95
98
|
const payload = await this.convert(_data, context, status)
|
|
99
|
+
|
|
100
|
+
if (!Array.isArray(status?.properties) && this.propertyNames.length === 0) {
|
|
101
|
+
return payload as T
|
|
102
|
+
}
|
|
103
|
+
|
|
96
104
|
const data = schema && validate === 'before' ? await schema.validate(payload) : payload
|
|
97
105
|
const propertyList = (
|
|
98
106
|
Array.isArray(status?.properties)
|
|
99
107
|
? status?.properties
|
|
100
108
|
: // By default get all data and resolver keys but remove duplicates
|
|
101
|
-
[...new Set(Object.keys(data).concat(
|
|
109
|
+
[...new Set(Object.keys(data).concat(this.propertyNames))]
|
|
102
110
|
) as (keyof T)[]
|
|
103
111
|
|
|
104
112
|
const result: any = {}
|